<html> <head> <title>OgreTerrainRenderable.cpp Source File - OGRE Documentation</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link type="text/css" rel="stylesheet" href="style.css"> </head> <body> <!-- Generated by Doxygen 1.2.16 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="namespacemembers.html">Namespace Members</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>OgreTerrainRenderable.cpp</h1><a href="OgreTerrainRenderable_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <font class="comment">/***************************************************************************</font> 00002 <font class="comment">terrainrenderable.cpp - description</font> 00003 <font class="comment">-------------------</font> 00004 <font class="comment">begin : Sat Oct 5 2002</font> 00005 <font class="comment">copyright : (C) 2002 by Jon Anderson</font> 00006 <font class="comment">email : janders@users.sf.net</font> 00007 <font class="comment">***************************************************************************/</font> 00008 00009 <font class="comment">/***************************************************************************</font> 00010 <font class="comment">* *</font> 00011 <font class="comment">* This program is free software; you can redistribute it and/or modify *</font> 00012 <font class="comment">* it under the terms of the GNU Lesser General Public License as published by *</font> 00013 <font class="comment">* the Free Software Foundation; either version 2 of the License, or *</font> 00014 <font class="comment">* (at your option) any later version. *</font> 00015 <font class="comment">* *</font> 00016 <font class="comment">***************************************************************************/</font> 00017 00018 <font class="preprocessor">#include "<a class="code" href="OgreTerrainRenderable_8h.html">OgreTerrainRenderable.h</a>"</font> 00019 <font class="preprocessor">#include <<a class="code" href="OgreSceneNode_8h.html">OgreSceneNode.h</a>></font> 00020 <font class="preprocessor">#include <<a class="code" href="OgreRenderQueue_8h.html">OgreRenderQueue.h</a>></font> 00021 <font class="preprocessor">#include <<a class="code" href="OgreRenderOperation_8h.html">OgreRenderOperation.h</a>></font> 00022 <font class="preprocessor">#include <<a class="code" href="OgreCamera_8h.html">OgreCamera.h</a>></font> 00023 <font class="preprocessor">#include <<a class="code" href="OgreRoot_8h.html">OgreRoot.h</a>></font> 00024 00025 00026 <font class="keyword">namespace </font>Ogre 00027 { <a name="l00028"></a><a class="code" href="OgreTerrainRenderable_8cpp.html#a0">00028</a> <font class="preprocessor">#define POSITION_BINDING 0</font> <a name="l00029"></a><a class="code" href="OgreTerrainRenderable_8cpp.html#a1">00029</a> <font class="preprocessor"></font><font class="preprocessor">#define NORMAL_BINDING 1</font> <a name="l00030"></a><a class="code" href="OgreTerrainRenderable_8cpp.html#a2">00030</a> <font class="preprocessor"></font><font class="preprocessor">#define TEXCOORD_BINDING 2</font> <a name="l00031"></a><a class="code" href="OgreTerrainRenderable_8cpp.html#a3">00031</a> <font class="preprocessor"></font><font class="preprocessor">#define COLOUR_BINDING 3</font> 00032 <font class="preprocessor"></font> <a name="l00033"></a><a class="code" href="namespaceOgre.html#a484">00033</a> <a class="code" href="classOgre_1_1TerrainBufferCache.html">TerrainBufferCache</a> <a class="code" href="namespaceOgre.html#a484">gIndexCache</a>; 00034 <a name="l00035"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablep0">00035</a> size_t TerrainRenderable::mRenderedTris = 0; 00036 <a name="l00037"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableq0">00037</a> <a class="code" href="classOgre_1_1String.html">String</a> TerrainRenderable::mType = <font class="stringliteral">"TerrainMipMap"</font>; 00038 <a name="l00039"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableq1">00039</a> <a class="code" href="namespaceOgre.html#a473">LevelArray</a> TerrainRenderable::mLevelIndex; <a name="l00040"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableq2">00040</a> <font class="keywordtype">bool</font> TerrainRenderable::mLevelInit = <font class="keyword">false</font>; 00041 <a name="l00042"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea0">00042</a> TerrainRenderable::TerrainRenderable() 00043 : mTerrain(0) 00044 { 00045 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen22">mForcedRenderLevel</a> = -1; 00046 00047 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen3">mMinLevelDistSqr</a> = 0; 00048 00049 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen13">mInit</a> = <font class="keyword">false</font>; 00050 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen12">mRenderLevelChanged</a> = <font class="keyword">true</font>; 00051 00052 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen20">mColored</a> = <font class="keyword">false</font>; 00053 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen21">mLit</a> = <font class="keyword">false</font>; 00054 00055 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> i = 0; i < 4; i++ ) 00056 { 00057 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ i ] = 0; 00058 } 00059 00060 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb5">_initLevelIndexes</a>(); 00061 00062 } 00063 <a name="l00064"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea1">00064</a> TerrainRenderable::~TerrainRenderable() 00065 { 00066 00067 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea2">deleteGeometry</a>(); 00068 } 00069 <a name="l00070"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea2">00070</a> <font class="keywordtype">void</font> TerrainRenderable::deleteGeometry() 00071 { 00072 <font class="keywordflow">if</font>(mTerrain) 00073 <font class="keyword">delete</font> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a>; 00074 00075 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen3">mMinLevelDistSqr</a> != 0 ) 00076 <font class="keyword">delete</font> [] <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen3">mMinLevelDistSqr</a>; 00077 } 00078 <a name="l00079"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea3">00079</a> <font class="keywordtype">void</font> TerrainRenderable::init( <a class="code" href="classOgre_1_1TerrainOptions.html">TerrainOptions</a> &options ) 00080 { 00081 <font class="comment">//ensure that the size works</font> 00082 <font class="keywordflow">if</font> ( ! <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb6">_checkSize</a>( options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm1">size</a> ) ) 00083 { 00084 printf( <font class="stringliteral">"Terrain block must size: 2^n+1 ( it's %d )\n"</font>, options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm1">size</a> ); 00085 <font class="keywordflow">return</font> ; 00086 } 00087 00088 <font class="keywordflow">if</font> ( options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm5">max_mipmap</a> != 0 ) 00089 { 00090 <font class="keywordtype">int</font> i = ( int ) 1 << ( options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm5">max_mipmap</a> - 1 ) ; 00091 00092 <font class="keywordflow">if</font> ( ( i + 1 ) > options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm1">size</a> ) 00093 { 00094 printf( <font class="stringliteral">"Invalid maximum mipmap specifed, must be n, such that 2^(n-1)+1 < options.size \n"</font> ); 00095 <font class="keywordflow">return</font> ; 00096 } 00097 } 00098 00099 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea2">deleteGeometry</a>(); 00100 00101 <font class="comment">//calculate min and max heights;</font> 00102 <a class="code" href="namespaceOgre.html#a349">Real</a> min = 256000, max = 0; 00103 00104 <font class="comment">/* Initialize the variables */</font> 00105 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen21">mLit</a> = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm14">lit</a>; 00106 00107 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen20">mColored</a> = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm15">colored</a>; 00108 00109 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen14">mNearPlane</a> = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm10">near_plane</a>; 00110 00111 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen15">mMaxPixelError</a> = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm9">max_pixel_error</a>; 00112 00113 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen16">mVertResolution</a> = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm11">vert_res</a>; 00114 00115 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen17">mTopCoord</a> = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm13">top_coord</a>; 00116 00117 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm1">size</a>; 00118 00119 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen9">mWorldSize</a> = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm2">world_size</a>; 00120 00121 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen1">mNumMipMaps</a> = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm5">max_mipmap</a>; 00122 00123 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a> = <font class="keyword">new</font> <a class="code" href="classOgre_1_1VertexData.html">VertexData</a>; 00124 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a>-><a class="code" href="classOgre_1_1VertexData.html#Ogre_1_1VertexDatam2">vertexStart</a> = 0; 00125 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a>-><a class="code" href="classOgre_1_1VertexData.html#Ogre_1_1VertexDatam3">vertexCount</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> * <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a>; 00126 00127 <a class="code" href="classOgre_1_1VertexDeclaration.html">VertexDeclaration</a>* decl = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a>-><a class="code" href="classOgre_1_1VertexData.html#Ogre_1_1VertexDatam0">vertexDeclaration</a>; 00128 <a class="code" href="classOgre_1_1VertexBufferBinding.html">VertexBufferBinding</a>* bind = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a>-><a class="code" href="classOgre_1_1VertexData.html#Ogre_1_1VertexDatam1">vertexBufferBinding</a>; 00129 00130 <font class="comment">// positions</font> 00131 size_t offset = 0; 00132 decl-><a class="code" href="classOgre_1_1VertexDeclaration.html#Ogre_1_1VertexDeclarationa3">addElement</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a0">POSITION_BINDING</a>, 0, <a class="code" href="namespaceOgre.html#a631a154">VET_FLOAT3</a>, <a class="code" href="namespaceOgre.html#a630a143">VES_POSITION</a>); 00133 decl-><a class="code" href="classOgre_1_1VertexDeclaration.html#Ogre_1_1VertexDeclarationa3">addElement</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a1">NORMAL_BINDING</a>, 0, <a class="code" href="namespaceOgre.html#a631a154">VET_FLOAT3</a>, <a class="code" href="namespaceOgre.html#a630a144">VES_NORMAL</a>); 00134 <font class="comment">// texture coord sets</font> 00135 decl-><a class="code" href="classOgre_1_1VertexDeclaration.html#Ogre_1_1VertexDeclarationa3">addElement</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a2">TEXCOORD_BINDING</a>, offset, <a class="code" href="namespaceOgre.html#a631a153">VET_FLOAT2</a>, <a class="code" href="namespaceOgre.html#a630a149">VES_TEXTURE_COORDINATES</a>, 0); 00136 offset += VertexElement::getTypeSize(<a class="code" href="namespaceOgre.html#a631a153">VET_FLOAT2</a>); 00137 decl-><a class="code" href="classOgre_1_1VertexDeclaration.html#Ogre_1_1VertexDeclarationa3">addElement</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a2">TEXCOORD_BINDING</a>, offset, <a class="code" href="namespaceOgre.html#a631a153">VET_FLOAT2</a>, <a class="code" href="namespaceOgre.html#a630a149">VES_TEXTURE_COORDINATES</a>, 1); 00138 offset += VertexElement::getTypeSize(<a class="code" href="namespaceOgre.html#a631a153">VET_FLOAT2</a>); 00139 decl-><a class="code" href="classOgre_1_1VertexDeclaration.html#Ogre_1_1VertexDeclarationa3">addElement</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a3">COLOUR_BINDING</a>, 0, <a class="code" href="namespaceOgre.html#a631a156">VET_COLOUR</a>, <a class="code" href="namespaceOgre.html#a630a147">VES_DIFFUSE</a>); 00140 00141 <a class="code" href="classOgre_1_1HardwareVertexBufferSharedPtr.html">HardwareVertexBufferSharedPtr</a> vbuf = 00142 HardwareBufferManager::getSingleton().createVertexBuffer( 00143 decl-><a class="code" href="classOgre_1_1VertexDeclaration.html#Ogre_1_1VertexDeclarationa9">getVertexSize</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a0">POSITION_BINDING</a>), 00144 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a>-><a class="code" href="classOgre_1_1VertexData.html#Ogre_1_1VertexDatam3">vertexCount</a>, 00145 HardwareBuffer::HBU_STATIC_WRITE_ONLY, <font class="keyword">true</font>); 00146 00147 bind-><a class="code" href="classOgre_1_1VertexBufferBinding.html#Ogre_1_1VertexBufferBindinga2">setBinding</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a0">POSITION_BINDING</a>, vbuf); 00148 00149 vbuf = 00150 HardwareBufferManager::getSingleton().createVertexBuffer( 00151 decl-><a class="code" href="classOgre_1_1VertexDeclaration.html#Ogre_1_1VertexDeclarationa9">getVertexSize</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a1">NORMAL_BINDING</a>), 00152 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a>-><a class="code" href="classOgre_1_1VertexData.html#Ogre_1_1VertexDatam3">vertexCount</a>, 00153 HardwareBuffer::HBU_STATIC_WRITE_ONLY); 00154 00155 bind-><a class="code" href="classOgre_1_1VertexBufferBinding.html#Ogre_1_1VertexBufferBindinga2">setBinding</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a1">NORMAL_BINDING</a>, vbuf); 00156 00157 vbuf = 00158 HardwareBufferManager::getSingleton().createVertexBuffer( 00159 offset, 00160 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a>-><a class="code" href="classOgre_1_1VertexData.html#Ogre_1_1VertexDatam3">vertexCount</a>, 00161 HardwareBuffer::HBU_STATIC_WRITE_ONLY); 00162 00163 bind-><a class="code" href="classOgre_1_1VertexBufferBinding.html#Ogre_1_1VertexBufferBindinga2">setBinding</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a2">TEXCOORD_BINDING</a>, vbuf); 00164 00165 vbuf = 00166 HardwareBufferManager::getSingleton().createVertexBuffer( 00167 decl-><a class="code" href="classOgre_1_1VertexDeclaration.html#Ogre_1_1VertexDeclarationa9">getVertexSize</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a3">COLOUR_BINDING</a>), 00168 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a>-><a class="code" href="classOgre_1_1VertexData.html#Ogre_1_1VertexDatam3">vertexCount</a>, 00169 HardwareBuffer::HBU_STATIC_WRITE_ONLY); 00170 00171 bind-><a class="code" href="classOgre_1_1VertexBufferBinding.html#Ogre_1_1VertexBufferBindinga2">setBinding</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a3">COLOUR_BINDING</a>, vbuf); 00172 00173 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen13">mInit</a> = <font class="keyword">true</font>; 00174 00175 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> = 1; 00176 00177 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen3">mMinLevelDistSqr</a> = <font class="keyword">new</font> <a class="code" href="namespaceOgre.html#a349">Real</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen1">mNumMipMaps</a> ]; 00178 00179 00180 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen7">mScale</a>.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm6">scalex</a>; 00181 00182 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen7">mScale</a>.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m1">y</a> = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm7">scaley</a>; 00183 00184 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen7">mScale</a>.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm8">scalez</a>; 00185 00186 00187 <a class="code" href="namespaceOgre.html#a53">RGBA</a>* pCol = static_cast<RGBA*>( vbuf->lock(HardwareBuffer::HBL_DISCARD) ); 00188 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> i = 0; i < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a>*<a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a>; i++ ) 00189 { 00190 *pCol++ = 0xFFFFFFFF; 00191 } 00192 vbuf->unlock(); 00193 00194 <font class="keywordtype">int</font> endx = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm3">startx</a> + options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm1">size</a>; 00195 00196 <font class="keywordtype">int</font> endz = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm4">startz</a> + options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm1">size</a>; 00197 00198 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> left, down, here; 00199 00200 vbuf = bind-><a class="code" href="classOgre_1_1VertexBufferBinding.html#Ogre_1_1VertexBufferBindinga6">getBuffer</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a0">POSITION_BINDING</a>); 00201 00202 <a class="code" href="namespaceOgre.html#a349">Real</a>* pPos = static_cast<Real*>(vbuf->lock(HardwareBuffer::HBL_DISCARD)); 00203 00204 <a class="code" href="classOgre_1_1HardwareVertexBufferSharedPtr.html">HardwareVertexBufferSharedPtr</a> vtexbuf = bind-><a class="code" href="classOgre_1_1VertexBufferBinding.html#Ogre_1_1VertexBufferBindinga6">getBuffer</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a2">TEXCOORD_BINDING</a>); 00205 00206 <a class="code" href="namespaceOgre.html#a349">Real</a>* pTex = static_cast<Real*>(vtexbuf->lock(HardwareBuffer::HBL_DISCARD)); 00207 00208 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> j = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm4">startz</a>; j < endz; j++ ) 00209 { 00210 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> i = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm3">startx</a>; i < endx; i++ ) 00211 { 00212 <a class="code" href="namespaceOgre.html#a349">Real</a> height = options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsa1">_worldheight</a>( i, j ) * options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm7">scaley</a>; 00213 00214 *pPos++ = ( Real ) i * options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm6">scalex</a>; <font class="comment">//x</font> 00215 *pPos++ = height; <font class="comment">//y</font> 00216 *pPos++ = ( Real ) j * options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm8">scalez</a>; <font class="comment">//z</font> 00217 00218 *pTex++ = ( Real ) i / ( Real ) options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm2">world_size</a> ; 00219 *pTex++ = ( Real ) ( Real ) j / ( Real ) options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm2">world_size</a>; 00220 00221 *pTex++ = ( ( Real ) i / ( Real ) <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> ) * options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm12">detail_tile</a>; 00222 *pTex++ = ( ( Real ) ( Real ) j / ( Real ) <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> ) * options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm12">detail_tile</a>; 00223 00224 <font class="keywordflow">if</font> ( height < min ) 00225 min = ( Real ) height; 00226 00227 <font class="keywordflow">if</font> ( height > max ) 00228 max = ( Real ) height; 00229 } 00230 } 00231 00232 vtexbuf->unlock(); 00233 vbuf->unlock(); 00234 00235 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen5">mBounds</a>.<a class="code" href="classOgre_1_1AxisAlignedBox.html#Ogre_1_1AxisAlignedBoxa9">setExtents</a>( ( <a class="code" href="namespaceOgre.html#a349">Real</a> ) options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm3">startx</a> * options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm6">scalex</a>, min, ( <a class="code" href="namespaceOgre.html#a349">Real</a> ) options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm4">startz</a> * options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm8">scalez</a>, 00236 ( <a class="code" href="namespaceOgre.html#a349">Real</a> ) ( endx - 1 ) * options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm6">scalex</a>, max, ( <a class="code" href="namespaceOgre.html#a349">Real</a> ) ( endz - 1 ) * options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm8">scalez</a> ); 00237 00238 00239 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen6">mCenter</a> = <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>( ( options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm3">startx</a> * options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm6">scalex</a> + endx - 1 ) / 2, 00240 ( min + max ) / 2, 00241 ( options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm4">startz</a> * options.<a class="code" href="classOgre_1_1TerrainOptions.html#Ogre_1_1TerrainOptionsm8">scalez</a> + endz - 1 ) / 2 ); 00242 00243 00244 <a class="code" href="namespaceOgre.html#a349">Real</a> C = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb8">_calculateCFactor</a>(); 00245 00246 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb7">_calculateMinLevelDist2</a>( C ); 00247 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea25">_calculateNormals</a>(); 00248 00249 } 00250 <a name="l00251"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea18">00251</a> <font class="keywordtype">void</font> TerrainRenderable::_getNormalAt( <font class="keywordtype">float</font> x, <font class="keywordtype">float</font> z, <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> * result ) 00252 { 00253 00254 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> here, left, down; 00255 here.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> = x; 00256 here.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m1">y</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea19">getHeightAt</a>( x, z ); 00257 here.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> = z; 00258 00259 left.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> = x - 1; 00260 left.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m1">y</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea19">getHeightAt</a>( x - 1, z ); 00261 left.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> = z; 00262 00263 down.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> = x; 00264 down.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m1">y</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea19">getHeightAt</a>( x, z + 1 ); 00265 down.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> = z + 1; 00266 00267 left = left - here; 00268 00269 down = down - here; 00270 00271 left.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3a24">normalise</a>(); 00272 down.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3a24">normalise</a>(); 00273 00274 *result = left.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3a25">crossProduct</a>( down ); 00275 result -> normalise(); 00276 00277 <font class="comment">// result->x = - result->x;</font> 00278 <font class="comment">// result->y = - result->y;</font> 00279 <font class="comment">// result->z = - result->z;</font> 00280 } 00281 <a name="l00282"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea25">00282</a> <font class="keywordtype">void</font> TerrainRenderable::_calculateNormals() 00283 { 00284 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> norm; 00285 00286 <a class="code" href="classOgre_1_1HardwareVertexBufferSharedPtr.html">HardwareVertexBufferSharedPtr</a> vbuf = 00287 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a>-><a class="code" href="classOgre_1_1VertexData.html#Ogre_1_1VertexDatam1">vertexBufferBinding</a>-><a class="code" href="classOgre_1_1VertexBufferBinding.html#Ogre_1_1VertexBufferBindinga6">getBuffer</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a1">NORMAL_BINDING</a>); 00288 <a class="code" href="namespaceOgre.html#a349">Real</a>* pNorm = static_cast<Real*>( vbuf->lock(HardwareBuffer::HBL_DISCARD) ); 00289 00290 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> j = 0; j < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a>; j++ ) 00291 { 00292 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> i = 0; i < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a>; i++ ) 00293 { 00294 00295 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea18">_getNormalAt</a>( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( i, j, 0 ), <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( i, j, 2 ), &norm ); 00296 00297 <font class="comment">// printf( "Normal = %5f,%5f,%5f\n", norm.x, norm.y, norm.z );</font> 00298 00299 *pNorm++ = norm.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a>; 00300 *pNorm++ = norm.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m1">y</a>; 00301 *pNorm++ = norm.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a>; 00302 } 00303 00304 } 00305 vbuf->unlock(); 00306 } 00307 <a name="l00308"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea7">00308</a> <font class="keywordtype">void</font> TerrainRenderable::_notifyCurrentCamera( <a class="code" href="classOgre_1_1Camera.html">Camera</a>* cam ) 00309 { 00310 00311 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen22">mForcedRenderLevel</a> >= 0 ) 00312 { 00313 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen22">mForcedRenderLevel</a>; 00314 <font class="keywordflow">return</font> ; 00315 } 00316 00317 00318 <font class="keywordtype">int</font> old_level = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a>; 00319 00320 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> cpos = cam -> getPosition(); 00321 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> diff = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen6">mCenter</a> - cpos; 00322 00323 <a class="code" href="namespaceOgre.html#a349">Real</a> L = diff.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3a22">squaredLength</a>(); 00324 00325 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen19">current_L</a> = L; 00326 00327 00328 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> = -1; 00329 00330 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> i = 0; i < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen1">mNumMipMaps</a>; i++ ) 00331 { 00332 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen3">mMinLevelDistSqr</a>[ i ] > L ) 00333 { 00334 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> = i - 1; 00335 <font class="keywordflow">break</font>; 00336 } 00337 } 00338 00339 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> < 0 ) 00340 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen1">mNumMipMaps</a> - 1; 00341 00342 00343 <font class="comment">// mRenderLevel = 4;</font> 00344 00345 } 00346 <a name="l00347"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea8">00347</a> <font class="keywordtype">void</font> TerrainRenderable::_updateRenderQueue( <a class="code" href="classOgre_1_1RenderQueue.html">RenderQueue</a>* queue ) 00348 { 00349 queue-><a class="code" href="classOgre_1_1RenderQueue.html#Ogre_1_1RenderQueuea3">addRenderable</a>( <font class="keyword">this</font> ); 00350 } 00351 <a name="l00352"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea9">00352</a> <font class="keywordtype">void</font> TerrainRenderable::getRenderOperation( <a class="code" href="classOgre_1_1RenderOperation.html">RenderOperation</a>& op ) 00353 { 00354 <font class="comment">//setup indexes for vertices and uvs...</font> 00355 00356 <font class="keywordflow">if</font> ( !<a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen13">mInit</a> ) 00357 { 00358 printf( <font class="stringliteral">"Uninitialized\n"</font> ); 00359 <font class="keywordflow">return</font> ; 00360 } 00361 00362 <font class="comment">/*</font> 00363 <font class="comment"> int j=0;</font> 00364 <font class="comment"> for( j=0; j<mSize; j+= (mRenderLevel*2) ) //depth</font> 00365 <font class="comment"> {</font> 00366 <font class="comment"> int i=0;</font> 00367 <font class="comment"> if( j != 0 )</font> 00368 <font class="comment"> {</font> 00369 <font class="comment"> //two degenerate tris to turn the corner...</font> 00370 <font class="comment"> pIndexes[nupIndexes] = _index(i, j+mRenderLevel ); nupIndexes++;</font> 00371 <font class="comment"> pIndexes[numIndexes] = _index(i, j+mRenderLevel ); numIndexes++;</font> 00372 <font class="comment">}</font> 00373 <font class="comment"></font> 00374 <font class="comment"> //forward strip...</font> 00375 <font class="comment"> for( i=0; i<mSize; i+= mRenderLevel ) //accross</font> 00376 <font class="comment"> {</font> 00377 <font class="comment"> pIndexes[numIndexes] = _index(i, j ); numIndexes++;</font> 00378 <font class="comment"> pIndexes[numIndexes] = _index(i, j+mRenderLevel ); numIndexes++;</font> 00379 <font class="comment">}</font> 00380 <font class="comment"> i -= mRenderLevel; //backtrack...</font> 00381 <font class="comment"></font> 00382 <font class="comment"></font> 00383 <font class="comment"> //degenerate tris to turn the corner...</font> 00384 <font class="comment"></font> 00385 <font class="comment"> pIndexes[numIndexes] = _index(i, j+mRenderLevel ); numIndexes++;</font> 00386 <font class="comment"> pIndexes[numIndexes] = _index(i, j+mRenderLevel ); numIndexes++;</font> 00387 <font class="comment"></font> 00388 <font class="comment"> //back strip</font> 00389 <font class="comment"> for( i = mSize-mRenderLevel; i>=0; i-=mRenderLevel )</font> 00390 <font class="comment"> {</font> 00391 <font class="comment"> pIndexes[numIndexes] = _index(i, j+mRenderLevel ); numIndexes++;</font> 00392 <font class="comment"> pIndexes[numIndexes] = _index(i, j ); numIndexes++;</font> 00393 <font class="comment">}</font> 00394 <font class="comment"></font> 00395 <font class="comment">}</font> 00396 <font class="comment"> */</font> 00397 00398 <font class="keywordtype">int</font> east = 0, west = 0, north = 0, south = 0; 00399 00400 <font class="keywordtype">int</font> step = 1 << <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a>; 00401 00402 <font class="keywordtype">int</font> index_array = 0; 00403 00404 <font class="keywordtype">int</font> numIndexes = 0; 00405 00406 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables2">EAST</a> ] != 0 && <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables2">EAST</a> ] -> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> > <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> ) 00407 { 00408 east = step; index_array |= <a class="code" href="OgreTerrainRenderable_8h.html#a3">TILE_EAST</a>; 00409 } 00410 00411 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables3">WEST</a> ] != 0 && <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables3">WEST</a> ] -> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> > <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> ) 00412 { 00413 west = step; index_array |= <a class="code" href="OgreTerrainRenderable_8h.html#a2">TILE_WEST</a>; 00414 } 00415 00416 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables0">NORTH</a> ] != 0 && <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables0">NORTH</a> ] -> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> > <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> ) 00417 { 00418 north = step; index_array |= <a class="code" href="OgreTerrainRenderable_8h.html#a0">TILE_NORTH</a>; 00419 } 00420 00421 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables1">SOUTH</a> ] != 0 && <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables1">SOUTH</a> ] -> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> > <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> ) 00422 { 00423 south = step; index_array |= <a class="code" href="OgreTerrainRenderable_8h.html#a1">TILE_SOUTH</a>; 00424 } 00425 00426 <a class="code" href="classOgre_1_1IndexData.html">IndexData</a>* indexData = 0; 00427 00428 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableq1">mLevelIndex</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> ][ index_array ] != 0 ) 00429 { 00430 indexData = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableq1">mLevelIndex</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> ][ index_array ]; 00431 } 00432 <font class="keywordflow">else</font> 00433 { 00434 <font class="keywordtype">int</font> new_length = ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> / step ) * ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> / step ) * 2 * 2 * 2 ; 00435 <font class="comment">//this is the maximum for a level. It wastes a little, but shouldn't be a problem.</font> 00436 00437 indexData = <font class="keyword">new</font> <a class="code" href="classOgre_1_1IndexData.html">IndexData</a>; 00438 indexData-><a class="code" href="classOgre_1_1IndexData.html#Ogre_1_1IndexDatam0">indexBuffer</a> = 00439 HardwareBufferManager::getSingleton().createIndexBuffer( 00440 HardwareIndexBuffer::IT_16BIT, 00441 new_length, HardwareBuffer::HBU_STATIC_WRITE_ONLY);<font class="comment">//, false);</font> 00442 00443 gIndexCache.<a class="code" href="classOgre_1_1TerrainBufferCache.html#Ogre_1_1TerrainBufferCachem0">mCache</a>.push_back( indexData ); 00444 00445 numIndexes = 0; 00446 00447 <font class="keywordtype">unsigned</font> <font class="keywordtype">short</font>* pIdx = static_cast<unsigned short*>( 00448 indexData-><a class="code" href="classOgre_1_1IndexData.html#Ogre_1_1IndexDatam0">indexBuffer</a>->lock(0, 00449 indexData-><a class="code" href="classOgre_1_1IndexData.html#Ogre_1_1IndexDatam0">indexBuffer</a>->getSizeInBytes(), 00450 HardwareBuffer::HBL_DISCARD)); 00451 00452 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> j = north; j < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1 - south; j += step ) 00453 { 00454 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> i = west; i < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1 - east; i += step ) 00455 { 00456 <font class="comment">//triangles</font> 00457 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( i, j ); numIndexes++; 00458 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( i, j + step ); numIndexes++; 00459 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( i + step, j ); numIndexes++; 00460 00461 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( i, j + step ); numIndexes++; 00462 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( i + step, j + step ); numIndexes++; 00463 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( i + step, j ); numIndexes++; 00464 } 00465 } 00466 00467 <font class="keywordtype">int</font> substep = step << 1; 00468 00469 <font class="keywordflow">if</font> ( west > 0 ) 00470 { 00471 00472 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> j = 0; j < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1; j += substep ) 00473 { 00474 <font class="comment">//skip the first bit of the corner if the north side is a different level as well.</font> 00475 <font class="keywordflow">if</font> ( j > 0 || north == 0 ) 00476 { 00477 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( 0, j ); numIndexes++; 00478 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( step, j + step ); numIndexes++; 00479 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( step, j ); numIndexes++; 00480 } 00481 00482 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( step, j + step ); numIndexes++; 00483 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( 0, j ); numIndexes++; 00484 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( 0, j + step + step ); numIndexes++; 00485 00486 <font class="keywordflow">if</font> ( j < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1 - substep || south == 0 ) 00487 { 00488 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( step, j + step ); numIndexes++; 00489 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( 0, j + step + step ); numIndexes++; 00490 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( step, j + step + step ); numIndexes++; 00491 } 00492 } 00493 } 00494 00495 <font class="keywordflow">if</font> ( east > 0 ) 00496 { 00497 <font class="keywordtype">int</font> x = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1; 00498 00499 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> j = 0; j < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1; j += substep ) 00500 { 00501 <font class="comment">//skip the first bit of the corner if the north side is a different level as well.</font> 00502 <font class="keywordflow">if</font> ( j > 0 || north == 0 ) 00503 { 00504 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( x, j ); numIndexes++; 00505 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( x - step, j ); numIndexes++; 00506 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( x - step, j + step ); numIndexes++; 00507 } 00508 00509 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( x, j ); numIndexes++; 00510 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( x - step, j + step ); numIndexes++; 00511 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( x, j + step + step ); numIndexes++; 00512 00513 <font class="keywordflow">if</font> ( j < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1 - substep || south == 0 ) 00514 { 00515 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( x, j + step + step ); numIndexes++; 00516 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( x - step, j + step ); numIndexes++; 00517 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( x - step, j + step + step ); numIndexes++; 00518 } 00519 } 00520 } 00521 00522 <font class="keywordflow">if</font> ( south > 0 ) 00523 { 00524 <font class="keywordtype">int</font> x = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1; 00525 00526 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> j = 0; j < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1; j += substep ) 00527 { 00528 <font class="comment">//skip the first bit of the corner if the north side is a different level as well.</font> 00529 <font class="keywordflow">if</font> ( j > 0 || west == 0 ) 00530 { 00531 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j, x - step ); numIndexes++; 00532 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j, x ); numIndexes++; 00533 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j + step, x - step ); numIndexes++; 00534 } 00535 00536 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j + step, x - step ); numIndexes++; 00537 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j, x ); numIndexes++; 00538 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j + step + step, x ); numIndexes++; 00539 00540 <font class="keywordflow">if</font> ( j < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1 - substep || east == 0 ) 00541 { 00542 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j + step, x - step ); numIndexes++; 00543 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j + step + step, x ); numIndexes++; 00544 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j + step + step, x - step ); numIndexes++; 00545 } 00546 } 00547 00548 } 00549 00550 <font class="keywordflow">if</font> ( north > 0 ) 00551 { 00552 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> j = 0; j < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1; j += substep ) 00553 { 00554 <font class="comment">//skip the first bit of the corner if the north side is a different level as well.</font> 00555 <font class="keywordflow">if</font> ( j > 0 || west == 0 ) 00556 { 00557 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j, 0 ); numIndexes++; 00558 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j, step ); numIndexes++; 00559 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j + step, step ); numIndexes++; 00560 } 00561 00562 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j, 0 ); numIndexes++; 00563 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j + step, step ); numIndexes++; 00564 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j + step + step, 0 ); numIndexes++; 00565 00566 <font class="keywordflow">if</font> ( j < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1 - substep || east == 0 ) 00567 { 00568 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j + step + step, 0 ); numIndexes++; 00569 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j + step, step ); numIndexes++; 00570 *pIdx++ = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( j + step + step, step ); numIndexes++; 00571 } 00572 } 00573 00574 } 00575 00576 indexData-><a class="code" href="classOgre_1_1IndexData.html#Ogre_1_1IndexDatam0">indexBuffer</a>->unlock(); 00577 indexData-><a class="code" href="classOgre_1_1IndexData.html#Ogre_1_1IndexDatam2">indexCount</a> = numIndexes; 00578 indexData-><a class="code" href="classOgre_1_1IndexData.html#Ogre_1_1IndexDatam1">indexStart</a> = 0; 00579 00580 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableq1">mLevelIndex</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> ][ index_array ] = indexData; 00581 } 00582 00583 op.<a class="code" href="classOgre_1_1RenderOperation.html#Ogre_1_1RenderOperationm2">useIndexes</a> = <font class="keyword">true</font>; 00584 op.<a class="code" href="classOgre_1_1RenderOperation.html#Ogre_1_1RenderOperationm1">operationType</a> = RenderOperation::OT_TRIANGLE_LIST; 00585 op.<a class="code" href="classOgre_1_1RenderOperation.html#Ogre_1_1RenderOperationm0">vertexData</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a>; 00586 op.<a class="code" href="classOgre_1_1RenderOperation.html#Ogre_1_1RenderOperationm3">indexData</a> = indexData; 00587 00588 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablep0">mRenderedTris</a> += ( indexData-><a class="code" href="classOgre_1_1IndexData.html#Ogre_1_1IndexDatam2">indexCount</a> / 3 ); 00589 00590 00591 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen12">mRenderLevelChanged</a> = <font class="keyword">false</font>; 00592 00593 } 00594 <a name="l00595"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea11">00595</a> <font class="keywordtype">void</font> TerrainRenderable::getWorldTransforms( <a class="code" href="classOgre_1_1Matrix4.html">Matrix4</a>* xform )<font class="keyword"> const</font> 00596 <font class="keyword"></font>{ 00597 *xform = <a class="code" href="classOgre_1_1MovableObject.html#Ogre_1_1WireBoundingBoxn9">mParentNode</a>-><a class="code" href="classOgre_1_1Node.html#Ogre_1_1TagPointa59">_getFullTransform</a>(); 00598 } 00599 <a name="l00600"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea12">00600</a> <font class="keyword">const</font> <a class="code" href="classOgre_1_1Quaternion.html">Quaternion</a>& TerrainRenderable::getWorldOrientation(<font class="keywordtype">void</font>)<font class="keyword"> const</font> 00601 <font class="keyword"></font>{ 00602 <font class="keywordflow">return</font> <a class="code" href="classOgre_1_1MovableObject.html#Ogre_1_1WireBoundingBoxn9">mParentNode</a>-><a class="code" href="classOgre_1_1Node.html#Ogre_1_1TagPointa56">_getDerivedOrientation</a>(); 00603 } <a name="l00604"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea13">00604</a> <font class="keyword">const</font> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>& TerrainRenderable::getWorldPosition(<font class="keywordtype">void</font>)<font class="keyword"> const</font> 00605 <font class="keyword"></font>{ 00606 <font class="keywordflow">return</font> <a class="code" href="classOgre_1_1MovableObject.html#Ogre_1_1WireBoundingBoxn9">mParentNode</a>-><a class="code" href="classOgre_1_1Node.html#Ogre_1_1TagPointa57">_getDerivedPosition</a>(); 00607 } 00608 <a name="l00609"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb6">00609</a> <font class="keywordtype">bool</font> TerrainRenderable::_checkSize( <font class="keywordtype">int</font> n ) 00610 { 00611 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> i = 0; i < 10; i++ ) 00612 { 00613 <font class="keywordflow">if</font> ( ( ( 1 << i ) + 1 ) == n ) 00614 <font class="keywordflow">return</font> <font class="keyword">true</font>; 00615 } 00616 00617 <font class="keywordflow">return</font> <font class="keyword">false</font>; 00618 } 00619 00620 <a name="l00621"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb7">00621</a> <font class="keywordtype">void</font> TerrainRenderable::_calculateMinLevelDist2( <a class="code" href="namespaceOgre.html#a349">Real</a> C ) 00622 { 00623 <font class="comment">//level 0 has no delta.</font> 00624 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen3">mMinLevelDistSqr</a>[ 0 ] = 0; 00625 00626 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> level = 1; level < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen1">mNumMipMaps</a>; level++ ) 00627 { 00628 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen3">mMinLevelDistSqr</a>[ level ] = 0; 00629 00630 <font class="keywordtype">int</font> step = 1 << level; 00631 00632 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> j = 0; j < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - step; j += step ) 00633 { 00634 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> i = 0; i < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - step; i += step ) 00635 { 00636 <font class="comment">//check each height inbetween the steps.</font> 00637 <a class="code" href="namespaceOgre.html#a349">Real</a> h1 = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( i, j, 1 ); 00638 <a class="code" href="namespaceOgre.html#a349">Real</a> h2 = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( i + step, j, 1 ); 00639 <a class="code" href="namespaceOgre.html#a349">Real</a> h3 = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( i + step, j + step, 1 ); 00640 <a class="code" href="namespaceOgre.html#a349">Real</a> h4 = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( i, j + step, 1 ); 00641 00642 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> z = 1; z < step; z++ ) 00643 { 00644 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> x = 1; x < step; x++ ) 00645 { 00646 00647 <a class="code" href="namespaceOgre.html#a349">Real</a> zpct = z / step; 00648 <a class="code" href="namespaceOgre.html#a349">Real</a> xpct = x / step; 00649 00650 <font class="comment">//interpolated height</font> 00651 <font class="keywordtype">float</font> top = h3 * ( 1.0f - xpct ) + xpct * h4; 00652 <font class="keywordtype">float</font> bottom = h1 * ( 1.0f - xpct ) + xpct * h2; 00653 00654 <a class="code" href="namespaceOgre.html#a349">Real</a> interp_h = top * ( 1.0f - zpct ) + zpct * bottom; 00655 00656 <a class="code" href="namespaceOgre.html#a349">Real</a> actual_h = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( i + x, j + z, 1 ); 00657 <a class="code" href="namespaceOgre.html#a349">Real</a> delta = fabs( interp_h - actual_h ); 00658 00659 <a class="code" href="namespaceOgre.html#a349">Real</a> D2 = delta * delta * C * C; 00660 00661 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen3">mMinLevelDistSqr</a>[ level ] < D2 ) 00662 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen3">mMinLevelDistSqr</a>[ level ] = D2; 00663 } 00664 00665 } 00666 } 00667 } 00668 00669 } 00670 00671 <font class="comment">//make sure the levels are increasing...</font> 00672 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> i = 1; i < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen1">mNumMipMaps</a>; i++ ) 00673 { 00674 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen3">mMinLevelDistSqr</a>[ i ] < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen3">mMinLevelDistSqr</a>[ i - 1 ] ) 00675 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen3">mMinLevelDistSqr</a>[ i ] = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen3">mMinLevelDistSqr</a>[ i - 1 ] + 1; 00676 } 00677 00678 } 00679 <a name="l00680"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb5">00680</a> <font class="keywordtype">void</font> TerrainRenderable::_initLevelIndexes() 00681 { 00682 <font class="keywordflow">if</font> ( mLevelInit ) 00683 <font class="keywordflow">return</font> ; 00684 00685 00686 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableq1">mLevelIndex</a>.size() == 0 ) 00687 { 00688 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> i = 0; i < 16; i++ ) 00689 { 00690 00691 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableq1">mLevelIndex</a>.push_back( <a class="code" href="namespaceOgre.html#a472">IndexArray</a>() ); 00692 00693 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> j = 0; j < 16; j++ ) 00694 { 00695 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableq1">mLevelIndex</a>[ i ].push_back( 0 ); 00696 } 00697 00698 } 00699 00700 00701 } 00702 00703 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableq2">mLevelInit</a> = <font class="keyword">true</font>; 00704 } 00705 <a name="l00706"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb4">00706</a> <font class="keywordtype">void</font> TerrainRenderable::_adjustRenderLevel( <font class="keywordtype">int</font> i ) 00707 { 00708 00709 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> = i; 00710 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea24">_alignNeighbors</a>(); 00711 00712 } 00713 <a name="l00714"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea24">00714</a> <font class="keywordtype">void</font> TerrainRenderable::_alignNeighbors() 00715 { 00716 00717 <font class="comment">//ensure that there aren't any gaps...</font> 00718 00719 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> i = 0; i < 4;i++ ) 00720 { 00721 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ i ] != 0 && <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ i ] -><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> + 1 < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> ) 00722 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ i ] -> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb4">_adjustRenderLevel</a>( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen2">mRenderLevel</a> - 1 ); 00723 } 00724 00725 <font class="comment">/*</font> 00726 <font class="comment"></font> 00727 <font class="comment"> //always go up, rather than down...</font> 00728 <font class="comment"> if ( mNeighbors[ EAST ] != 0 && mNeighbors[ EAST ] ->mRenderLevel + 1 < mRenderLevel )</font> 00729 <font class="comment"> mNeighbors[ EAST ] -> _adjustRenderLevel( mRenderLevel - 1 );</font> 00730 <font class="comment"></font> 00731 <font class="comment"> if ( mNeighbors[ SOUTH ] != 0 && mNeighbors[ SOUTH ] ->mRenderLevel + 1 < mRenderLevel )</font> 00732 <font class="comment"> mNeighbors[ SOUTH ] -> _adjustRenderLevel( mRenderLevel - 1 );</font> 00733 <font class="comment"> */</font> 00734 } 00735 <a name="l00736"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb8">00736</a> <a class="code" href="namespaceOgre.html#a349">Real</a> TerrainRenderable::_calculateCFactor() 00737 { 00738 <a class="code" href="namespaceOgre.html#a349">Real</a> A, T; 00739 00740 A = ( Real ) <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen14">mNearPlane</a> / fabs( ( <a class="code" href="namespaceOgre.html#a349">Real</a> ) <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen17">mTopCoord</a> ); 00741 00742 T = 2 * ( Real ) <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen15">mMaxPixelError</a> / ( Real ) <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen16">mVertResolution</a>; 00743 00744 <font class="keywordflow">return</font> A / T; 00745 } 00746 <a name="l00747"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea19">00747</a> <font class="keywordtype">float</font> TerrainRenderable::getHeightAt( <font class="keywordtype">float</font> x, <font class="keywordtype">float</font> z ) 00748 { 00749 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> start; 00750 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> end; 00751 00752 start.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( 0, 0, 0 ); 00753 start.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m1">y</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( 0, 0, 1 ); 00754 start.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( 0, 0, 2 ); 00755 00756 end.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1, <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1, 0 ); 00757 end.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m1">y</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1, <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1, 1 ); 00758 end.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1, <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1, 2 ); 00759 00760 <font class="comment">/* Safety catch, if the point asked for is outside</font> 00761 <font class="comment"> * of this tile, it will ask the appropriate tile</font> 00762 <font class="comment"> */</font> 00763 00764 <font class="keywordflow">if</font> ( x < start.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> ) 00765 { 00766 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables3">WEST</a> ] != 0 ) 00767 <font class="keywordflow">return</font> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables3">WEST</a> ] ->getHeightAt( x, z ); 00768 <font class="keywordflow">else</font> 00769 x = start.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a>; 00770 } 00771 00772 <font class="keywordflow">if</font> ( x > end.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> ) 00773 { 00774 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables2">EAST</a> ] != 0 ) 00775 <font class="keywordflow">return</font> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables2">EAST</a> ] ->getHeightAt( x, z ); 00776 <font class="keywordflow">else</font> 00777 x = end.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a>; 00778 } 00779 00780 <font class="keywordflow">if</font> ( z < start.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> ) 00781 { 00782 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables0">NORTH</a> ] != 0 ) 00783 <font class="keywordflow">return</font> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables0">NORTH</a> ] ->getHeightAt( x, z ); 00784 <font class="keywordflow">else</font> 00785 z = start.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a>; 00786 } 00787 00788 <font class="keywordflow">if</font> ( z > end.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> ) 00789 { 00790 <font class="keywordflow">if</font> ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables1">SOUTH</a> ] != 0 ) 00791 <font class="keywordflow">return</font> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables1">SOUTH</a> ] ->getHeightAt( x, z ); 00792 <font class="keywordflow">else</font> 00793 z = end.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a>; 00794 } 00795 00796 00797 00798 <font class="keywordtype">float</font> x_pct = ( x - start.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> ) / ( end.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> - start.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> ); 00799 <font class="keywordtype">float</font> z_pct = ( z - start.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> ) / ( end.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> - start.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> ); 00800 00801 <font class="keywordtype">float</font> x_pt = x_pct * ( float ) ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1 ); 00802 <font class="keywordtype">float</font> z_pt = z_pct * ( float ) ( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a> - 1 ); 00803 00804 <font class="keywordtype">int</font> x_index = ( int ) x_pt; 00805 <font class="keywordtype">int</font> z_index = ( int ) z_pt; 00806 00807 x_pct = x_pt - x_index; 00808 z_pct = z_pt - z_index; 00809 00810 <font class="comment">//bilinear interpolate to find the height.</font> 00811 00812 <font class="keywordtype">float</font> t1 = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( x_index, z_index, 1 ); 00813 <font class="keywordtype">float</font> t2 = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( x_index + 1, z_index, 1 ); 00814 <font class="keywordtype">float</font> b1 = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( x_index, z_index + 1, 1 ); 00815 <font class="keywordtype">float</font> b2 = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( x_index + 1, z_index + 1, 1 ); 00816 00817 <font class="keywordtype">float</font> midpoint = (b1 + t2) / 2.0; 00818 00819 <font class="keywordflow">if</font> (x_pct + z_pct <= 1) { 00820 b2 = midpoint + (midpoint - t1); 00821 } <font class="keywordflow">else</font> { 00822 t1 = midpoint + (midpoint - b2); 00823 } 00824 00825 <font class="keywordtype">float</font> t = ( t1 * ( 1 - x_pct ) ) + ( t2 * ( x_pct ) ); 00826 <font class="keywordtype">float</font> b = ( b1 * ( 1 - x_pct ) ) + ( b2 * ( x_pct ) ); 00827 00828 <font class="keywordtype">float</font> h = ( t * ( 1 - z_pct ) ) + ( b * ( z_pct ) ); 00829 00830 <font class="keywordflow">return</font> h; 00831 } 00832 <a name="l00833"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea20">00833</a> <font class="keywordtype">bool</font> TerrainRenderable::intersectSegment( <font class="keyword">const</font> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> & start, <font class="keyword">const</font> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> & end, <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> * result ) 00834 { 00835 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> dir = end - start; 00836 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> ray = start; 00837 00838 <font class="comment">//special case...</font> 00839 <font class="keywordflow">if</font> ( dir.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> == 0 && dir.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> == 0 ) 00840 { 00841 <font class="keywordflow">if</font> ( ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m1">y</a> <= <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea19">getHeightAt</a>( ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a>, ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> ) ) 00842 { 00843 <font class="keywordflow">if</font> ( result != 0 ) 00844 * result = start; 00845 00846 <font class="keywordflow">return</font> <font class="keyword">true</font>; 00847 } 00848 } 00849 00850 dir.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3a24">normalise</a>(); 00851 00852 <font class="comment">//dir.x *= mScale.x;</font> 00853 <font class="comment">//dir.y *= mScale.y;</font> 00854 <font class="comment">//dir.z *= mScale.z;</font> 00855 00856 <font class="keyword">const</font> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> * corners = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea6">getBoundingBox</a>().<a class="code" href="classOgre_1_1AxisAlignedBox.html#Ogre_1_1AxisAlignedBoxa11">getAllCorners</a>(); 00857 00858 <font class="comment">//start with the next one...</font> 00859 ray += dir; 00860 00861 00862 <font class="keywordflow">while</font> ( ! ( ( ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> < corners[ 0 ].<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> ) || 00863 ( ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> > corners[ 4 ].<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> ) || 00864 ( ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> < corners[ 0 ].<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> ) || 00865 ( ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> > corners[ 4 ].<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> ) ) ) 00866 { 00867 00868 00869 <font class="keywordtype">float</font> h = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea19">getHeightAt</a>( ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a>, ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> ); 00870 00871 <font class="keywordflow">if</font> ( ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m1">y</a> <= h ) 00872 { 00873 <font class="keywordflow">if</font> ( result != 0 ) 00874 * result = ray; 00875 00876 <font class="keywordflow">return</font> <font class="keyword">true</font>; 00877 } 00878 00879 <font class="keywordflow">else</font> 00880 { 00881 ray += dir; 00882 } 00883 00884 } 00885 00886 <font class="keywordflow">if</font> ( ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> < corners[ 0 ].<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> && <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables3">WEST</a> ] != 0 ) 00887 <font class="keywordflow">return</font> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables3">WEST</a> ] ->intersectSegment( ray, end, result ); 00888 <font class="keywordflow">else</font> <font class="keywordflow">if</font> ( ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> < corners[ 0 ].<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> && <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables0">NORTH</a> ] != 0 ) 00889 <font class="keywordflow">return</font> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables0">NORTH</a> ] ->intersectSegment( ray, end, result ); 00890 <font class="keywordflow">else</font> <font class="keywordflow">if</font> ( ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> > corners[ 4 ].<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> && <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables2">EAST</a> ] != 0 ) 00891 <font class="keywordflow">return</font> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables2">EAST</a> ] ->intersectSegment( ray, end, result ); 00892 <font class="keywordflow">else</font> <font class="keywordflow">if</font> ( ray.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> > corners[ 4 ].<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> && <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables1">SOUTH</a> ] != 0 ) 00893 <font class="keywordflow">return</font> <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen4">mNeighbors</a>[ <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderables5Ogre_1_1TerrainRenderables1">SOUTH</a> ] ->intersectSegment( ray, end, result ); 00894 <font class="keywordflow">else</font> 00895 { 00896 <font class="keywordflow">if</font> ( result != 0 ) 00897 * result = <a class="code" href="classOgre_1_1Vector3.html">Vector3</a>( -1, -1, -1 ); 00898 00899 <font class="keywordflow">return</font> <font class="keyword">false</font>; 00900 } 00901 } 00902 <a name="l00903"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea26">00903</a> <font class="keywordtype">void</font> TerrainRenderable::_generateVertexLighting( <font class="keyword">const</font> <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> &sun, <a class="code" href="classOgre_1_1ColourValue.html">ColourValue</a> ambient ) 00904 { 00905 <font class="keywordflow">if</font> ( !<a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen20">mColored</a> ) 00906 { 00907 printf( <font class="stringliteral">"Can't generate terrain vertex lighting with out vertex colors enabled.\n"</font> ); 00908 <font class="keywordflow">return</font> ; 00909 } 00910 00911 00912 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> pt; 00913 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> normal; 00914 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> light; 00915 00916 <font class="comment">//for each point in the terrain, see if it's in the line of sight for the sun.</font> 00917 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> i = 0; i < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a>; i++ ) 00918 { 00919 <font class="keywordflow">for</font> ( <font class="keywordtype">int</font> j = 0; j < <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen8">mSize</a>; j++ ) 00920 { 00921 <font class="comment">// printf( "Checking %f,%f,%f ", pt.x, pt.y, pt.z );</font> 00922 pt.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m0">x</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( i, j, 0 ); 00923 pt.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m1">y</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( i, j, 1 ); 00924 pt.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3m2">z</a> = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( i, j, 2 ); 00925 00926 light = sun - pt; 00927 00928 light.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3a24">normalise</a>(); 00929 00930 <font class="keywordflow">if</font> ( ! <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea20">intersectSegment</a>( pt, sun, 0 ) ) 00931 { 00932 <font class="comment">//</font> 00933 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea18">_getNormalAt</a>( <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( i, j, 0 ), <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb1">_vertex</a>( i, j, 2 ), &normal ); 00934 00935 <font class="keywordtype">float</font> l = light.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3a23">dotProduct</a>( normal ); 00936 00937 <a class="code" href="classOgre_1_1ColourValue.html">ColourValue</a> v; 00938 v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem0">r</a> = ambient.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem0">r</a> + l; 00939 v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem1">g</a> = ambient.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem1">g</a> + l; 00940 v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem2">b</a> = ambient.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem2">b</a> + l; 00941 00942 <font class="keywordflow">if</font> ( v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem0">r</a> > 1 ) v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem0">r</a> = 1; 00943 00944 <font class="keywordflow">if</font> ( v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem1">g</a> > 1 ) v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem1">g</a> = 1; 00945 00946 <font class="keywordflow">if</font> ( v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem2">b</a> > 1 ) v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem2">b</a> = 1; 00947 00948 <font class="keywordflow">if</font> ( v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem0">r</a> < 0 ) v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem0">r</a> = 0; 00949 00950 <font class="keywordflow">if</font> ( v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem1">g</a> < 0 ) v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem1">g</a> = 0; 00951 00952 <font class="keywordflow">if</font> ( v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem2">b</a> < 0 ) v.<a class="code" href="classOgre_1_1ColourValue.html#Ogre_1_1ColourValuem2">b</a> = 0; 00953 00954 <a class="code" href="namespaceOgre.html#a53">RGBA</a> colour; 00955 Root::getSingleton().convertColourValue( v, &colour ); 00956 <a class="code" href="classOgre_1_1HardwareVertexBufferSharedPtr.html">HardwareVertexBufferSharedPtr</a> vbuf = 00957 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a>-><a class="code" href="classOgre_1_1VertexData.html#Ogre_1_1VertexDatam1">vertexBufferBinding</a>-><a class="code" href="classOgre_1_1VertexBufferBinding.html#Ogre_1_1VertexBufferBindinga6">getBuffer</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a3">COLOUR_BINDING</a>); 00958 vbuf->writeData(<a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( i, j ) * <font class="keyword">sizeof</font>(<a class="code" href="namespaceOgre.html#a53">RGBA</a>), <font class="keyword">sizeof</font>(<a class="code" href="namespaceOgre.html#a53">RGBA</a>), &colour); 00959 } 00960 00961 <font class="keywordflow">else</font> 00962 { 00963 <a class="code" href="namespaceOgre.html#a53">RGBA</a> colour; 00964 Root::getSingleton().convertColourValue( ambient, &colour ); 00965 00966 <a class="code" href="classOgre_1_1HardwareVertexBufferSharedPtr.html">HardwareVertexBufferSharedPtr</a> vbuf = 00967 <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen0">mTerrain</a>-><a class="code" href="classOgre_1_1VertexData.html#Ogre_1_1VertexDatam1">vertexBufferBinding</a>-><a class="code" href="classOgre_1_1VertexBufferBinding.html#Ogre_1_1VertexBufferBindinga6">getBuffer</a>(<a class="code" href="OgreTerrainRenderable_8cpp.html#a3">COLOUR_BINDING</a>); 00968 vbuf->writeData(<a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderableb0">_index</a>( i, j ) * <font class="keyword">sizeof</font>(<a class="code" href="namespaceOgre.html#a53">RGBA</a>), <font class="keyword">sizeof</font>(<a class="code" href="namespaceOgre.html#a53">RGBA</a>), &colour); 00969 } 00970 00971 } 00972 00973 } 00974 00975 printf( <font class="stringliteral">"."</font> ); 00976 } 00977 <font class="comment">//-----------------------------------------------------------------------</font> <a name="l00978"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea27">00978</a> <a class="code" href="namespaceOgre.html#a349">Real</a> TerrainRenderable::getSquaredViewDepth(<font class="keyword">const</font> <a class="code" href="classOgre_1_1Camera.html">Camera</a>* cam)<font class="keyword"> const</font> 00979 <font class="keyword"></font>{ 00980 <a class="code" href="classOgre_1_1Vector3.html">Vector3</a> diff = <a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablen6">mCenter</a> - cam-><a class="code" href="classOgre_1_1Camera.html#Ogre_1_1OctreeCameraa54">getDerivedPosition</a>(); 00981 <font class="comment">// Use squared length to avoid square root</font> 00982 <font class="keywordflow">return</font> diff.<a class="code" href="classOgre_1_1Vector3.html#Ogre_1_1Vector3a22">squaredLength</a>(); 00983 } 00984 00985 <font class="comment">//-----------------------------------------------------------------------</font> <a name="l00986"></a><a class="code" href="classOgre_1_1TerrainRenderable.html#Ogre_1_1TerrainRenderablea29">00986</a> <font class="keyword">const</font> <a class="code" href="namespaceOgre.html#a56">LightList</a>& TerrainRenderable::getLights(<font class="keywordtype">void</font>)<font class="keyword"> const</font> 00987 <font class="keyword"></font>{ 00988 <font class="keywordflow">return</font> <a class="code" href="classOgre_1_1MovableObject.html#Ogre_1_1WireBoundingBoxn9">mParentNode</a>-><a class="code" href="classOgre_1_1Node.html#Ogre_1_1Nodea59">getLights</a>(); 00989 } 00990 00991 } <font class="comment">//namespace</font> </pre></div><p> Copyright © 2002-2003 by The OGRE Team<br /> Last modified Wed Jan 21 00:10:29 2004 </p> </body> </html>