<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <HTML> <HEAD> <TITLE>nevrax.org : docs</TITLE> <LINK REL=stylesheet TYPE="text/css" HREF="/inc/css/nevrax.css"> <link href="doxygen.css" rel="stylesheet" type="text/css"> </HEAD> <BODY MARGINHEIGHT="0" MARGINWIDTH="0"> <!-- uplinks --> <TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0> <TR> <TD WIDTH=16><IMG SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> <TD WIDTH=140 BGCOLOR=#dddddd><IMG SRC="/inc/img/pixel.gif" WIDTH="140" HEIGHT="16" BORDER=0 ALT=""></TD> <TD WIDTH=16><IMG SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> <TD><IMG width=6 height=14 SRC="/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF='/'><b>Home</B></FONT></A> </TD> <TD><IMG width=6 height=14 SRC="/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF='/'><b>nevrax.com</B></FONT></A> </TD> </TR> </TABLE> <!-- banner Nevrax --> <TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%> <TR><TD BGCOLOR="#000000" BACKGROUND="/inc/img/black_banner.jpg"><A HREF=""><IMG SRC="/inc/img/nevrax.gif" WIDTH="170" HEIGHT="45" BORDER=0 ALT="Nevrax" ></A></TD></TR> </TABLE> <!-- main table --> <TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 height=100%> <TR> <TD WIDTH=16><IMG SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="10" BORDER=0 ALT=""></TD> <TD WIDTH=140 BGCOLOR=#dddddd VALIGN=TOP ALIGN=middle><IMG SRC="/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> <!------ Begin Box ------> <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=black><TR><TD><TABLE border=0 cellspacing=2 cellpadding=0 width=120><tr><TD ALIGN=middle bgcolor=black> <FONT COLOR=white FACE="sans-serif"><B>Nevrax.org</B></FONT></TD></TR><tr><td colspan=2 bgcolor=#FFFFFF> <TABLE cellspacing=0 cellpadding=1 border=0> <tr><td ALIGN=middle><a class='linkbox' href="/news/" TITLE="Rubrique news"><img width=13 height=15 hspace=5 border=0 src=/inc/img/picto-news.gif ALT=#></A></td><td><a class='linkbox' href="/news/" TITLE="News">News</a></td></tr> <tr><td ALIGN=middle><a class='linkbox' href="/mail/" TITLE="Rubrique mail"><img width=15 height=11 hspace=5 border=0 src=/inc/img/picto-mail.gif ALT=#></A></td><td><a class='linkbox' href="/mail/" TITLE="Mailing list archive">Mailing-list</a></td></tr> <tr><td ALIGN=middle><a class='linkbox' href="/docs/" TITLE="Rubrique docs"><img width=14 height=16 hspace=5 border=0 src=/inc/img/picto-docs.gif ALT=#></A></td><td><a class='linkbox' href="/docs/" TITLE="Documentation">Documentation</a></td></tr> <tr><td ALIGN=middle><a class='linkbox' href="/cvs/" TITLE="Rubrique cvs"><img width=13 height=17 hspace=5 border=0 src=/inc/img/picto-cvs.gif ALT=#></A></td><td><a class='linkbox' href="/cvs/" TITLE="CVS Web">CVS</a></td></tr> <tr><td ALIGN=middle><a class='linkbox' href="/bugs/" TITLE="Rubrique bugs"><img width=20 height=16 hspace=5 border=0 src=/inc/img/picto-bugs.gif ALT=#></A></td><td><a class='linkbox' href="/bugs/" TITLE="Bugtracking">Bugs</a></td></tr> <tr><td ALIGN=middle><a class='linkbox' href="/GPL.php3" TITLE="Rubrique license"><img width=18 height=12 hspace=5 border=0 src=/inc/img/picto-gpl.gif ALT=#></A></td><td><a class='linkbox' href="/GPL.php3" TITLE="License">License</a></td></tr> </TABLE> </TD></TR></TABLE></TD></TR></TABLE> <!------ End Box ------> </TD> <TD WIDTH=15><IMG SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> <TD ALIGN=left valign=top><IMG SRC="/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> <!-- title --> <TABLE background="/inc/img/redline.gif" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td> <A HREF="/docs/"><img src="/inc/img/t_docs.gif" ALT="Docs" HEIGHT=20 BORDER=0></A> </td><td><IMG SRC="/inc/img/pixel.gif" WIDTH="1" HEIGHT="1" BORDER=0 ALT=""> </td></tr></table> <!-- block --> <TABLE bgcolor="#dddddd" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td width=1% valign=middle><img width=6 height=14 hspace=2 vspace=2 src="/inc/img/reddots.gif"></TD> <TD><B>Documentation</B></TD> <TD ALIGN=RIGHT> </td> </tr></table> <!-- Generated by Doxygen 1.2.14 --> <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> <a class="qindexRef" doxygen="_cgi:/cgi-bin/nel-search.cgi" href="/cgi-bin/nel-search.cgi">Search</a> </center> <hr><h1>patch_vegetable.cpp</h1><a href="patch__vegetable_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 00007 <font class="comment">/* Copyright, 2001 Nevrax Ltd.</font> 00008 <font class="comment"> *</font> 00009 <font class="comment"> * This file is part of NEVRAX NEL.</font> 00010 <font class="comment"> * NEVRAX NEL is free software; you can redistribute it and/or modify</font> 00011 <font class="comment"> * it under the terms of the GNU General Public License as published by</font> 00012 <font class="comment"> * the Free Software Foundation; either version 2, or (at your option)</font> 00013 <font class="comment"> * any later version.</font> 00014 <font class="comment"></font> 00015 <font class="comment"> * NEVRAX NEL is distributed in the hope that it will be useful, but</font> 00016 <font class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</font> 00017 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</font> 00018 <font class="comment"> * General Public License for more details.</font> 00019 <font class="comment"></font> 00020 <font class="comment"> * You should have received a copy of the GNU General Public License</font> 00021 <font class="comment"> * along with NEVRAX NEL; see the file COPYING. If not, write to the</font> 00022 <font class="comment"> * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,</font> 00023 <font class="comment"> * MA 02111-1307, USA.</font> 00024 <font class="comment"> */</font> 00025 00026 <font class="preprocessor">#include "<a class="code" href="std3d_8h.html">std3d.h</a>"</font> 00027 00028 00029 <font class="preprocessor">#include "<a class="code" href="patch_8h.html">3d/patch.h</a>"</font> 00030 <font class="preprocessor">#include "<a class="code" href="vegetable_8h.html">3d/vegetable.h</a>"</font> 00031 <font class="preprocessor">#include "<a class="code" href="vegetable__manager_8h.html">3d/vegetable_manager.h</a>"</font> 00032 <font class="preprocessor">#include "<a class="code" href="landscape__vegetable__block_8h.html">3d/landscape_vegetable_block.h</a>"</font> 00033 <font class="preprocessor">#include "<a class="code" href="landscape_8h.html">3d/landscape.h</a>"</font> 00034 <font class="preprocessor">#include "<a class="code" href="vector_8h.html">nel/misc/vector.h</a>"</font> 00035 <font class="preprocessor">#include "<a class="code" href="common_8h.html">nel/misc/common.h</a>"</font> 00036 <font class="preprocessor">#include "<a class="code" href="fast__floor_8h.html">3d/fast_floor.h</a>"</font> 00037 <font class="preprocessor">#include "<a class="code" href="tile__vegetable__desc_8h.html">3d/tile_vegetable_desc.h</a>"</font> 00038 <font class="preprocessor">#include "<a class="code" href="vegetable__light__ex_8h.html">3d/vegetable_light_ex.h</a>"</font> 00039 <font class="preprocessor">#include "<a class="code" href="patchdlm__context_8h.html">3d/patchdlm_context.h</a>"</font> 00040 00041 00042 <font class="keyword">using</font> <font class="keyword">namespace </font>std; 00043 <font class="keyword">using</font> <font class="keyword">namespace </font>NLMISC; 00044 00045 <font class="keyword">namespace </font>NL3D 00046 { 00047 00048 00049 <font class="comment">// ***************************************************************************</font> <a name="l00050"></a><a class="code" href="classNL3D_1_1CPatch.html#z686_2">00050</a> <font class="keywordtype">void</font> CPatch::generateTileVegetable(CVegetableInstanceGroup *vegetIg, uint distType, uint ts, uint tt, 00051 CLandscapeVegetableBlockCreateContext &vbCreateCtx) 00052 { 00053 uint i; 00054 00055 <font class="comment">// Get tile infos for vegetable</font> 00056 <font class="comment">// =========================</font> 00057 00058 <font class="comment">// Get the state for this vegetable tile</font> 00059 CTileElement::TVegetableInfo vegetWaterState= <a class="code" href="classNL3D_1_1CPatch.html#m4">Tiles</a>[tt * <a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a> + ts].getVegetableState(); 00060 <font class="comment">// If vegetable disabled, skip!</font> 00061 <font class="keywordflow">if</font>(vegetWaterState == CTileElement::VegetableDisabled) 00062 <font class="keywordflow">return</font>; 00063 00064 <font class="comment">// get the tileId under this tile (<=> the tile material)</font> 00065 uint tileId= <a class="code" href="classNL3D_1_1CPatch.html#m4">Tiles</a>[tt * <a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a> + ts].Tile[0]; 00066 00067 <font class="comment">// get list of vegetable for this tile, and for hist distanceType category.</font> 00068 <font class="keyword">const</font> CTileVegetableDesc &tileVegetDesc= <a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->getTileVegetableDesc(tileId); 00069 <font class="keyword">const</font> std::vector<CVegetable> &vegetableList= tileVegetDesc.getVegetableList(distType); 00070 uint distAddSeed= tileVegetDesc.getVegetableSeed(distType); 00071 uint numVegetable= vegetableList.size(); 00072 00073 <font class="comment">// If no vegetables at all, skip.</font> 00074 <font class="keywordflow">if</font>(numVegetable==0) 00075 <font class="keywordflow">return</font>; 00076 00077 <font class="comment">// compute approximate tile position and normal: get the middle</font> 00078 <font class="keywordtype">float</font> tileU= (ts + 0.5f) / (float)<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>; 00079 <font class="keywordtype">float</font> tileV= (tt + 0.5f) / (float)<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>; 00080 CBezierPatch *bpatch= <a class="code" href="classNL3D_1_1CPatch.html#a45">unpackIntoCache</a>(); 00081 <font class="comment">// Get approximate position for the tile (usefull for noise). NB: eval() is faster than computeVertex().</font> 00082 CVector tilePos= bpatch->eval(tileU, tileV); 00083 <font class="comment">// Get also the normal used for all instances on this tile (not precise, </font> 00084 <font class="comment">// don't take noise into account, but faster).</font> 00085 CVector tileNormal= bpatch->evalNormal(tileU, tileV); 00086 00087 <font class="comment">// Compute also position on middle of 4 edges of this tile, for generateGroupBiLinear().</font> 00088 CVector tilePosBiLinear[4]; 00089 <font class="keywordtype">float</font> OOos= 1.0f / <a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>; 00090 <font class="keywordtype">float</font> OOot= 1.0f / <a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>; 00091 tilePosBiLinear[0]= bpatch->eval( (ts + 0.0f) * OOos, (tt + 0.5f) * OOot); 00092 tilePosBiLinear[1]= bpatch->eval( (ts + 1.0f) * OOos, (tt + 0.5f) * OOot); 00093 tilePosBiLinear[2]= bpatch->eval( (ts + 0.5f) * OOos, (tt + 0.0f) * OOot); 00094 tilePosBiLinear[3]= bpatch->eval( (ts + 0.5f) * OOos, (tt + 1.0f) * OOot); 00095 00096 00097 <font class="comment">// compute a rotation matrix with the normal</font> 00098 CMatrix matInstance; 00099 matInstance.setRot(CVector::I, CVector::J, tileNormal); 00100 <font class="comment">// must normalize the matrix. use the vector which is the most orthogonal to tileNormal</font> 00101 <font class="comment">// If tileNormal is much more a J vector, then use plane (I,tileNormal), and vice-versa</font> 00102 <font class="keywordflow">if</font>(fabs(tileNormal.y) > fabs(tileNormal.x)) 00103 matInstance.normalize(CMatrix::ZXY); 00104 <font class="keywordflow">else</font> 00105 matInstance.normalize(CMatrix::ZYX); 00106 00107 00108 <font class="comment">// prepare color / lighting</font> 00109 <font class="comment">// =========================</font> 00110 00111 <font class="comment">// say that ambient never change. VegetableManager handle the ambient and diffuse itself (for precomputeLighting)</font> 00112 CRGBAF ambientF= CRGBAF(1,1,1,1); 00113 00114 <font class="comment">// Compute the tileLightmap (not modified by tileColor).</font> 00115 <font class="keyword">static</font> uint8 tileLumelmap[<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a> * <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>]; 00116 <a class="code" href="classNL3D_1_1CPatch.html#z686_3">getTileLumelmapPrecomputed</a>(ts, tt, tileLumelmap, <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>); 00117 <font class="comment">// compute diffuse color by substracting from ambient.</font> 00118 CRGBAF diffuseColorF[<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a> * <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>]; 00119 <font class="comment">// TODO_VEGET_OPTIM: optimize this.</font> 00120 <font class="comment">// For all lumel of this tile.</font> 00121 <font class="keywordflow">for</font>(i= 0; i<<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; i++) 00122 { 00123 <font class="comment">// mul by 2, because shade is done twice here: by vertex, and by landscape.</font> 00124 sint tileLumel= 2*tileLumelmap[i]; 00125 tileLumel= <a class="code" href="bit__set_8cpp.html#a0">min</a>(tileLumel, 255); 00126 <font class="keywordtype">float</font> tlf= tileLumel / 255.f; 00127 diffuseColorF[i].R= tlf; 00128 diffuseColorF[i].G= tlf; 00129 diffuseColorF[i].B= tlf; 00130 diffuseColorF[i].A= 1; 00131 } 00132 00133 <font class="comment">// Compute The CVegetableLightEx, adding pointLight effect to vegetation</font> 00134 <font class="comment">// First get pointLight at this tiles.</font> 00135 <font class="keyword">static</font> vector<CPointLightInfluence> lightList; 00136 lightList.clear(); 00137 <a class="code" href="classNL3D_1_1CPatch.html#z671_1">appendTileLightInfluences</a>( CUV(tileU, tileV), lightList); 00138 <font class="comment">// for each light, modulate the factor of influence</font> 00139 <font class="keywordflow">for</font>(i=0; i<lightList.size();i++) 00140 { 00141 CPointLight *pl= lightList[i].PointLight; 00142 <font class="comment">// compute the attenuation to the pos of the tile</font> 00143 <font class="keywordtype">float</font> att= pl->computeLinearAttenuation(tilePos); 00144 <font class="comment">// modulate the influence with this factor</font> 00145 lightList[i].BkupInfluence= lightList[i].Influence; 00146 lightList[i].Influence*= att; 00147 } 00148 <font class="comment">// sort the light by influence</font> 00149 sort(lightList.begin(), lightList.end()); 00150 <font class="comment">// Setup the vegetLex directly in the ig. </font> 00151 CVegetableLightEx &vegetLex= vegetIg->VegetableLightEx; 00152 <font class="comment">// take only 2 first, computing direction to tilePos and computing attenuation.</font> 00153 vegetLex.NumLights= <a class="code" href="bit__set_8cpp.html#a0">min</a>((uint)CVegetableLightEx::MaxNumLight, lightList.size()); 00154 <font class="keywordflow">for</font>(i=0;i<vegetLex.NumLights;i++) 00155 { 00156 CPointLight *pl= lightList[i].PointLight; 00157 <font class="comment">// copy to vegetLex.</font> 00158 vegetLex.PointLight[i]= pl; 00159 <font class="comment">// get the attenuation</font> 00160 vegetLex.PointLightFactor[i]= (uint)(256* lightList[i].Influence); 00161 <font class="comment">// Setup the direction from pointLight.</font> 00162 vegetLex.Direction[i]= tilePos - pl->getPosition(); 00163 vegetLex.Direction[i].normalize(); 00164 } 00165 <font class="comment">// compute now the current colors of the vegetLex.</font> 00166 vegetLex.computeCurrentColors(); 00167 00168 00169 <font class="comment">// Compute Dynamic Lightmap UV for this tile.</font> 00170 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>); 00171 CUV dlmUV; 00172 <font class="comment">// get coordinate in 0..1 in texture.</font> 00173 dlmUV.U= <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->DLMUBias + <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->DLMUScale * tileU; 00174 dlmUV.V= <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->DLMVBias + <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->DLMVScale * tileV; 00175 <font class="comment">// get coordinate in 0..255.</font> 00176 CVegetableUV8 dlmUV8; 00177 dlmUV8.U= (uint8)<a class="code" href="namespaceNL3D.html#a362">OptFastFloor</a>(dlmUV.U * 255 + 0.5f); 00178 dlmUV8.V= (uint8)<a class="code" href="namespaceNL3D.html#a362">OptFastFloor</a>(dlmUV.V * 255 + 0.5f); 00179 <font class="comment">// bound them, ensuring 8Bits UV "uncompressed" by driver are in the lightmap area.</font> 00180 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(dlmUV8.U, <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->MinU8, <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->MaxU8); 00181 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(dlmUV8.V, <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->MinV8, <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->MaxV8); 00182 00183 00184 <font class="comment">// for all vegetable of this list, generate instances.</font> 00185 <font class="comment">// =========================</font> 00186 00187 <font class="comment">// Get an array for each vegetable (static for speed).</font> 00188 <font class="keyword">typedef</font> std::vector<NLMISC::CVector2f> TPositionVector; 00189 <font class="keyword">static</font> std::vector<TPositionVector> instanceUVArray; 00190 <font class="comment">// realloc if necessary.</font> 00191 <font class="keywordflow">if</font>(instanceUVArray.size() < numVegetable) 00192 { 00193 <font class="comment">// clean.</font> 00194 <a class="code" href="namespaceNLMISC.html#a222">contReset</a>(instanceUVArray); 00195 <font class="comment">// realloc.</font> 00196 instanceUVArray.resize(numVegetable); 00197 } 00198 00199 <font class="comment">// First, for each vegetable, generate the number of instance to create, and their relative position.</font> 00200 <font class="keywordflow">for</font>(i= 0; i<numVegetable; i++) 00201 { 00202 <font class="comment">// get the vegetable</font> 00203 <font class="keyword">const</font> CVegetable &veget= vegetableList[i]; 00204 00205 <font class="comment">// generate instance for this vegetable.</font> 00206 veget.generateGroupBiLinear(tilePos, tilePosBiLinear, tileNormal, <a class="code" href="landscape__def_8h.html#a11">NL3D_PATCH_TILE_AREA</a>, i + distAddSeed, instanceUVArray[i]); 00207 } 00208 00209 <font class="comment">// Then, now that we kno how many instance to generate for each vegetable, reserve space.</font> 00210 CVegetableInstanceGroupReserve vegetIgReserve; 00211 <font class="keywordflow">for</font>(i= 0; i<numVegetable; i++) 00212 { 00213 <font class="comment">// get the vegetable</font> 00214 <font class="keyword">const</font> CVegetable &veget= vegetableList[i]; 00215 00216 <font class="comment">// reseve instance space for this vegetable.</font> 00217 <font class="comment">// instanceUVArray[i].size() is the number of instances to create.</font> 00218 veget.reserveIgAddInstances(vegetIgReserve, (CVegetable::TVegetableWater)vegetWaterState, instanceUVArray[i].<a class="code" href="cf__lexical_8cpp.html#a94">size</a>()); 00219 } 00220 <font class="comment">// actual reseve memory of the ig.</font> 00221 <a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->_VegetableManager->reserveIgCompile(vegetIg, vegetIgReserve); 00222 00223 00224 <font class="comment">// generate the instances for all the vegetables.</font> 00225 <font class="keywordflow">for</font>(i= 0; i<numVegetable; i++) 00226 { 00227 <font class="comment">// get the vegetable</font> 00228 <font class="keyword">const</font> CVegetable &veget= vegetableList[i]; 00229 00230 <font class="comment">// get the relatives position of the instances</font> 00231 std::vector<CVector2f> &instanceUV= instanceUVArray[i]; 00232 00233 <font class="comment">// For all instance, generate the real instances.</font> 00234 <font class="keywordflow">for</font>(uint j=0; j<instanceUV.size(); j++) 00235 { 00236 <font class="comment">// generate the position in world Space.</font> 00237 <font class="comment">// instanceUV is in [0..1] interval, which maps to a tile, so explode to the patch</font> 00238 CVector instancePos; 00239 vbCreateCtx.eval(ts, tt, instanceUV[j].<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, instanceUV[j].<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, instancePos); 00240 <font class="comment">// NB: use same normal for rotation for all instances in a same tile.</font> 00241 matInstance.setPos( instancePos ); 00242 00243 <font class="comment">// peek color into the lightmap.</font> 00244 sint lumelS= <a class="code" href="namespaceNL3D.html#a362">OptFastFloor</a>(instanceUV[j].<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a> * <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>); 00245 sint lumelT= <a class="code" href="namespaceNL3D.html#a362">OptFastFloor</a>(instanceUV[j].<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a> * <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>); 00246 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(lumelS, 0, <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1); 00247 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(lumelT, 0, <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1); 00248 00249 <font class="comment">// generate the instance of the vegetable</font> 00250 veget.generateInstance(vegetIg, matInstance, ambientF, 00251 diffuseColorF[ (lumelT<<<a class="code" href="patch_8h.html#a6">NL_LUMEL_BY_TILE_SHIFT</a>) + lumelS ], 00252 (distType+1) * <a class="code" href="vegetable__def_8h.html#a8">NL3D_VEGETABLE_BLOCK_ELTDIST</a>, (CVegetable::TVegetableWater)vegetWaterState, dlmUV8); 00253 } 00254 } 00255 } 00256 00257 00258 <font class="comment">// ***************************************************************************</font> <a name="l00259"></a><a class="code" href="classNL3D_1_1CPatch.html#z674_1">00259</a> <font class="keywordtype">void</font> CPatch::recreateAllVegetableIgs() 00260 { 00261 <font class="comment">// For all TessBlocks, try to release their VegetableBlock</font> 00262 <font class="keywordflow">for</font>(uint numtb=0; numtb<<a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>.size(); numtb++) 00263 { 00264 <font class="comment">// if the vegetableBlock is deleted, and if there is at least one Material in the tessBlock, and if possible</font> 00265 <font class="keywordflow">if</font>( <a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>[numtb].VegetableBlock==NULL && <a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>[numtb].TileMaterialRefCount>0 00266 && <a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->isVegetableActive()) 00267 { 00268 <font class="comment">// compute tessBlock coordinate</font> 00269 uint tbWidth= <a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>>>1; 00270 uint ts= numtb&(tbWidth-1); 00271 uint tt= numtb/tbWidth; 00272 <font class="comment">// crate the vegetable with tilecooridante (ie tessBlock coord *2);</font> 00273 <a class="code" href="classNL3D_1_1CPatch.html#z686_0">createVegetableBlock</a>(numtb, ts*2, tt*2); 00274 } 00275 } 00276 00277 } 00278 00279 00280 <font class="comment">// ***************************************************************************</font> <a name="l00281"></a><a class="code" href="classNL3D_1_1CPatch.html#z674_0">00281</a> <font class="keywordtype">void</font> CPatch::deleteAllVegetableIgs() 00282 { 00283 <font class="comment">// For all TessBlocks, try to release their VegetableBlock</font> 00284 <font class="keywordflow">for</font>(uint i=0; i<<a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>.size(); i++) 00285 { 00286 <a class="code" href="classNL3D_1_1CPatch.html#z686_1">releaseVegetableBlock</a>(i); 00287 } 00288 00289 } 00290 00291 00292 <font class="comment">// ***************************************************************************</font> <a name="l00293"></a><a class="code" href="classNL3D_1_1CPatch.html#z686_0">00293</a> <font class="keywordtype">void</font> CPatch::createVegetableBlock(uint numTb, uint ts, uint tt) 00294 { 00295 <font class="comment">// TessBlock width</font> 00296 uint tbWidth= <a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a> >> 1; 00297 <font class="comment">// clipBlock width</font> 00298 uint nTbPerCb= <a class="code" href="patch_8h.html#a13">NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK</a>; 00299 uint cbWidth= (tbWidth + nTbPerCb-1) >> <a class="code" href="patch_8h.html#a12">NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK_SHIFT</a>; 00300 00301 <font class="comment">// compute tessBlock coordinate.</font> 00302 uint tbs ,tbt; 00303 tbs= ts >> 1; 00304 tbt= tt >> 1; 00305 <font class="comment">// compute clipBlock coordinate.</font> 00306 uint cbs,cbt; 00307 cbs= tbs >> <a class="code" href="patch_8h.html#a12">NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK_SHIFT</a>; 00308 cbt= tbt >> <a class="code" href="patch_8h.html#a12">NL3D_PATCH_VEGETABLE_NUM_TESSBLOCK_PER_CLIPBLOCK_SHIFT</a>; 00309 00310 <font class="comment">// create the vegetable block.</font> 00311 <a class="code" href="classNL3D_1_1CPatch.html#l2">CLandscapeVegetableBlock</a> *vegetBlock= <font class="keyword">new</font> <a class="code" href="classNL3D_1_1CPatch.html#l2">CLandscapeVegetableBlock</a>; 00312 <font class="comment">// Init / append to list.</font> 00313 <font class="comment">// compute center of the vegetableBlock (approx).</font> 00314 CBezierPatch *bpatch= <a class="code" href="classNL3D_1_1CPatch.html#a45">unpackIntoCache</a>(); 00315 CVector center= bpatch->eval( (<font class="keywordtype">float</font>)(tbs*2+1)/<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>, (<font class="keywordtype">float</font>)(tbt*2+1)/<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a> ); 00316 <font class="comment">// Lower-Left tile is (tbs*2, tbt*2)</font> 00317 vegetBlock->init(center, <a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->_VegetableManager, <a class="code" href="classNL3D_1_1CPatch.html#z679_0">VegetableClipBlocks</a>[cbt *cbWidth + cbs], <font class="keyword">this</font>, tbs*2, tbt*2, <a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->_VegetableBlockList); 00318 00319 <font class="comment">// set in the tessBlock</font> 00320 <a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>[numTb].VegetableBlock= vegetBlock; 00321 } 00322 00323 00324 <font class="comment">// ***************************************************************************</font> <a name="l00325"></a><a class="code" href="classNL3D_1_1CPatch.html#z686_1">00325</a> <font class="keywordtype">void</font> CPatch::releaseVegetableBlock(uint numTb) 00326 { 00327 <font class="comment">// if exist, must delete the VegetableBlock.</font> 00328 <font class="keywordflow">if</font>(<a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>[numTb].VegetableBlock) 00329 { 00330 <font class="comment">// delete Igs, and remove from list.</font> 00331 <a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>[numTb].VegetableBlock->release(<a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->_VegetableManager, <a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->_VegetableBlockList); 00332 <font class="comment">// delete.</font> 00333 <font class="keyword">delete</font> <a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>[numTb].VegetableBlock; 00334 <a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>[numTb].VegetableBlock= NULL; 00335 } 00336 } 00337 00338 00339 00340 00341 00342 } <font class="comment">// NL3D</font> </pre></div> <!-- footer --> <BR><FONT Size=+5> </FONT> </TD> <TD WIDTH=15><IMG SRC=/inc/img/pixel.gif WIDTH=15 HEIGHT=15 BORDER=0 ALT=""></TD> </TR> </TABLE> </BODY> </HTML>