#include <meshvp_wind_tree.h>
Inheritance diagram for NL3D::CMeshVPWindTree:
Nevrax France
Definition at line 44 of file meshvp_wind_tree.h.
Public Types | |
enum | { HrcDepth = 3 } |
Public Member Functions | |
CMeshVPWindTree () | |
Constructor. | |
virtual std::string | getClassName ()=0 |
virtual float | getMaxVertexMove () |
const sint & | getRefCount () const |
virtual bool | needTangentSpace () const |
NLMISC_DECLARE_CLASS (CMeshVPWindTree) | |
virtual void | serial (NLMISC::IStream &f) throw (NLMISC::EStream) |
virtual | ~CMeshVPWindTree () |
IMeshVertexProgram implementation | |
virtual bool | begin (IDriver *drv, CScene *scene, CMeshBaseInstance *mbi, const NLMISC::CMatrix &invertedModelMat, const NLMISC::CVector &) |
Setup Wind constants, Light constants, and activate the VP. | |
virtual void | end (IDriver *drv) |
disable the VertexProgram. | |
virtual void | initInstance (CMeshBaseInstance *mbi) |
Setup a rand phase for wind in mbi. | |
virtual void | setupForMaterial (const CMaterial &mat, IDriver *drv, CScene *scene, IVertexBufferHard *vb) |
Setup Wind constants, Light constants, and activate the VP. | |
virtual void | setupForMaterial (const CMaterial &mat, IDriver *drv, CScene *scene, CVertexBuffer *vb) |
Setup Wind constants, Light constants, and activate the VP. | |
MBR support For WindTree | |
virtual void | beginMBRInstance (IDriver *drv, CScene *scene, CMeshBaseInstance *mbi, const NLMISC::CMatrix &invertedModelMat) |
virtual void | beginMBRMesh (IDriver *drv, CScene *scene) |
virtual void | endMBRMesh (IDriver *drv) |
virtual bool | isMBRVpOk (IDriver *drv) const |
virtual bool | supportMeshBlockRendering () const |
Data Fields | |
sint | crefs |
CPtrInfo * | pinfo |
WindTree Parameters; | |
float | Bias [HrcDepth] |
Bias result of the cosinus: f= cos(time)+bias. | |
float | Frequency [HrcDepth] |
Frequency of the wind for 3 Hierachy levels. | |
float | FrequencyWindFactor [HrcDepth] |
Additional frequency, multiplied by the globalWindPower. | |
float | PowerXY [HrcDepth] |
Power of the wind on XY. Mul by globalWindPower. | |
float | PowerZ [HrcDepth] |
Power of the wind on Z. Mul by globalWindPower. | |
bool | SpecularLighting |
true if want Specular Lighting. | |
Static Public Attributes | |
CPtrInfo | NullPtrInfo |
Private Types | |
enum | { NumVp = 16 } |
Private Member Functions | |
void | setupLighting (CScene *scene, CMeshBaseInstance *mbi, const NLMISC::CMatrix &invertedModelMat) |
void | setupPerInstanceConstants (IDriver *driver, CScene *scene, CMeshBaseInstance *mbi, const NLMISC::CMatrix &invertedModelMat) |
void | setupPerMesh (IDriver *driver, CScene *scene) |
Static Private Member Functions | |
float | speedCos (float angle) |
Private Attributes | |
float | _CurrentTime [HrcDepth] |
uint | _LastMBRIdVP |
double | _LastSceneTime |
CVector | _MaxDeltaPos [HrcDepth] |
float | _MaxVertexMove |
Static Private Attributes | |
std::auto_ptr< CVertexProgram > | _VertexProgram [NumVp] |
Friends | |
struct | CPtrInfo |
|
Definition at line 49 of file meshvp_wind_tree.h.
00049 {HrcDepth= 3}; |
|
Definition at line 125 of file meshvp_wind_tree.h.
00125 { NumVp = 16}; |
|
Constructor.
Definition at line 100 of file meshvp_wind_tree.cpp. References _CurrentTime, _LastSceneTime, _MaxVertexMove, FrequencyWindFactor, HrcDepth, PowerXY, PowerZ, and uint.
00101 { 00102 for(uint i=0; i<HrcDepth; i++) 00103 { 00104 Frequency[i]= 1; 00105 FrequencyWindFactor[i]= 0; 00106 PowerXY[i]= 0; 00107 PowerZ[i]= 0; 00108 Bias[i]= 0; 00109 // Init currentTime. 00110 _CurrentTime[i]= 0; 00111 } 00112 SpecularLighting= false; 00113 00114 _LastSceneTime= 0; 00115 _MaxVertexMove= 0; 00116 } |
|
Definition at line 120 of file meshvp_wind_tree.cpp.
00121 { 00122 } |
|
Setup Wind constants, Light constants, and activate the VP.
Implements NL3D::IMeshVertexProgram. Definition at line 297 of file meshvp_wind_tree.cpp. References NL3D::IDriver::activeVertexProgram(), NLMISC::clamp(), NL3D::CRenderTrav::getNumVPLights(), NL3D::CScene::getRenderTrav(), NL3D::IDriver::isForceNormalize(), NL3D::IDriver::isVertexProgramEmulated(), NL3D::IDriver::isVertexProgramSupported(), nlassert, setupPerInstanceConstants(), setupPerMesh(), sint, and uint.
00298 { 00299 if (!(driver->isVertexProgramSupported() && !driver->isVertexProgramEmulated())) return false; 00300 00301 00302 // precompute mesh 00303 setupPerMesh(driver, scene); 00304 00305 // Setup instance constants 00306 setupPerInstanceConstants(driver, scene, mbi, invertedModelMat); 00307 00308 // Activate the good VertexProgram 00309 //=============== 00310 00311 // Get how many pointLights are setuped now. 00312 nlassert(scene != NULL); 00313 CRenderTrav *renderTrav= &scene->getRenderTrav(); 00314 sint numPls= renderTrav->getNumVPLights()-1; 00315 clamp(numPls, 0, CRenderTrav::MaxVPLight-1); 00316 00317 // Enable normalize only if requested by user. Because lighting don't manage correct "scale lighting" 00318 uint idVP= (SpecularLighting?2:0) + (driver->isForceNormalize()?1:0) ; 00319 // correct VP id for correct unmber of pls. 00320 idVP= numPls*4 + idVP; 00321 00322 // activate VP. 00323 driver->activeVertexProgram(_VertexProgram[idVP].get()); 00324 00325 00326 return true; 00327 } |
|
Reimplemented from NL3D::IMeshVertexProgram. Definition at line 407 of file meshvp_wind_tree.cpp. References _LastMBRIdVP, NL3D::IDriver::activeVertexProgram(), NLMISC::clamp(), NL3D::CRenderTrav::getNumVPLights(), NL3D::CScene::getRenderTrav(), NL3D::IDriver::isForceNormalize(), nlassert, setupPerInstanceConstants(), sint, and uint.
00408 { 00409 // setup first constants for this instance 00410 setupPerInstanceConstants(driver, scene, mbi, invertedModelMat); 00411 00412 // Get how many pointLights are setuped now. 00413 nlassert(scene != NULL); 00414 CRenderTrav *renderTrav= &scene->getRenderTrav(); 00415 sint numPls= renderTrav->getNumVPLights()-1; 00416 clamp(numPls, 0, CRenderTrav::MaxVPLight-1); 00417 00418 // Enable normalize only if requested by user. Because lighting don't manage correct "scale lighting" 00419 uint idVP= (SpecularLighting?2:0) + (driver->isForceNormalize()?1:0) ; 00420 // correct VP id for correct number of pls. 00421 idVP= numPls*4 + idVP; 00422 00423 // re-activate VP if idVP different from last setup 00424 if( idVP!=_LastMBRIdVP ) 00425 { 00426 _LastMBRIdVP= idVP; 00427 driver->activeVertexProgram(_VertexProgram[_LastMBRIdVP].get()); 00428 } 00429 } |
|
Reimplemented from NL3D::IMeshVertexProgram. Definition at line 392 of file meshvp_wind_tree.cpp. References _LastMBRIdVP, NL3D::IDriver::activeVertexProgram(), and setupPerMesh().
00393 { 00394 // precompute mesh 00395 setupPerMesh(driver, scene); 00396 00397 /* Since need a VertexProgram Activation before activeVBHard, activate a default one 00398 bet the common one will be "NoPointLight, NoSpecular, No ForceNormalize" => 0. 00399 */ 00400 _LastMBRIdVP= 0; 00401 00402 // activate VP. 00403 driver->activeVertexProgram(_VertexProgram[_LastMBRIdVP].get()); 00404 } |
|
disable the VertexProgram.
Implements NL3D::IMeshVertexProgram. Definition at line 330 of file meshvp_wind_tree.cpp. References NL3D::IDriver::activeVertexProgram().
00331 {
00332 // Disable the VertexProgram
00333 driver->activeVertexProgram(NULL);
00334 }
|
|
Reimplemented from NL3D::IMeshVertexProgram. Definition at line 432 of file meshvp_wind_tree.cpp. References NL3D::IDriver::activeVertexProgram().
00433 {
00434 // Disable the VertexProgram
00435 driver->activeVertexProgram(NULL);
00436 }
|
|
Implemented in NLAIAGENT::CNumericIndex, NLAIC::IPointerGestion, NLAIC::CIdentType, and CAutomataDesc. Referenced by NLMISC::CClassRegistry::checkObject(), and NL3D::GetTextureSize(). |
|
This return the (over-evaluated) max delta the VertexProgram apply to vertex (in world basis) NB: This method call is relevant only after begin() or beginMBRInstance() Reimplemented from NL3D::IMeshVertexProgram. Definition at line 439 of file meshvp_wind_tree.cpp. References _MaxVertexMove.
00440 { 00441 return _MaxVertexMove; 00442 } |
|
Definition at line 70 of file smart_ptr.h. References NLMISC::CRefCount::crefs, and sint.
00071 { 00072 return crefs; 00073 } |
|
Setup a rand phase for wind in mbi.
Implements NL3D::IMeshVertexProgram. Definition at line 144 of file meshvp_wind_tree.cpp. References NL3D::CMeshBaseInstance::_VPWindTreePhase, NLMISC::frand(), HrcDepth, nlassert, uint, NL3D::VPLightConstantStart, NL3D::WindTreeVPCodeEnd, and NL3D::WindTreeVPCodeWave.
00145 { 00146 // init the vertexProgram code. 00147 static bool vpCreated= false; 00148 if(!vpCreated) 00149 { 00150 vpCreated= true; 00151 // All vpcode and begin() written for HrcDepth==3 00152 nlassert(HrcDepth==3); 00153 00154 // combine fragments. 00155 string vpCode; 00156 00157 // For all possible VP. 00158 for(uint i=0;i<NumVp;i++) 00159 { 00160 // setup of the VPLight fragment 00161 uint numPls= i/4; 00162 bool normalize= (i&1)!=0; 00163 bool specular= (i&2)!=0; 00164 00165 // combine fragments 00166 vpCode= string(WindTreeVPCodeWave) 00167 + CRenderTrav::getLightVPFragment(numPls, VPLightConstantStart, specular, normalize) 00168 + WindTreeVPCodeEnd; 00169 _VertexProgram[i]= std::auto_ptr<CVertexProgram>(new CVertexProgram(vpCode.c_str())); 00170 } 00171 } 00172 00173 // init a random phase. 00174 mbi->_VPWindTreePhase= frand(1); 00175 } |
|
Reimplemented from NL3D::IMeshVertexProgram. Definition at line 386 of file meshvp_wind_tree.cpp. References NL3D::IDriver::isVertexProgramEmulated(), and NL3D::IDriver::isVertexProgramSupported().
00387 {
00388 return driver->isVertexProgramSupported() && !driver->isVertexProgramEmulated();
00389 }
|
|
Reimplemented in NL3D::CMeshVPPerPixelLight. Definition at line 106 of file mesh_vertex_program.h.
00106 { return false; } |
|
|
|
Implements NLMISC::IStreamable. Definition at line 126 of file meshvp_wind_tree.cpp. References nlassert, and uint.
00127 { 00128 (void)f.serialVersion(0); 00129 00130 nlassert(HrcDepth==3); 00131 for(uint i=0; i<HrcDepth; i++) 00132 { 00133 f.serial(Frequency[i]); 00134 f.serial(FrequencyWindFactor[i]); 00135 f.serial(PowerXY[i]); 00136 f.serial(PowerZ[i]); 00137 f.serial(Bias[i]); 00138 } 00139 f.serial(SpecularLighting); 00140 } |
|
Setup Wind constants, Light constants, and activate the VP.
Implements NL3D::IMeshVertexProgram. Definition at line 354 of file meshvp_wind_tree.cpp. References NL3D::SetupForMaterial().
00358 { 00359 SetupForMaterial(mat, scene); 00360 } |
|
Setup Wind constants, Light constants, and activate the VP.
Implements NL3D::IMeshVertexProgram. Definition at line 345 of file meshvp_wind_tree.cpp. References NL3D::SetupForMaterial().
00349 { 00350 SetupForMaterial(mat, scene); 00351 } |
|
Definition at line 363 of file meshvp_wind_tree.cpp. References NL3D::CRenderTrav::beginVPLightSetup(), NL3D::CScene::getRenderTrav(), nlassert, and NL3D::VPLightConstantStart. Referenced by setupPerInstanceConstants().
00364 { 00365 nlassert(scene != NULL); 00366 CRenderTrav *renderTrav= &scene->getRenderTrav(); 00367 // setup cte for lighting 00368 renderTrav->beginVPLightSetup(VPLightConstantStart, SpecularLighting, invertedModelMat); 00369 } |
|
Definition at line 228 of file meshvp_wind_tree.cpp. References _CurrentTime, _MaxDeltaPos, NL3D::CMeshBaseInstance::_VPWindTreePhase, NL3D::CTransform::getWorldMatrix(), HrcDepth, NLMISC::CMatrix::invert(), NLMISC::CMatrix::mulVector(), NL3D::IDriver::setConstant(), NL3D::IDriver::setConstantMatrix(), NLMISC::CMatrix::setRot(), setupLighting(), speedCos(), and uint. Referenced by begin(), and beginMBRInstance().
00229 { 00230 // get instance info 00231 float instancePhase= mbi->_VPWindTreePhase; 00232 00233 00234 // maxDeltaPos in ObjectSpace. So same world Wind direction is applied to all objects 00235 static CMatrix invWorldMatrix; 00236 // Keep only rotation part. (just need it and faster invert) 00237 invWorldMatrix.setRot(mbi->getWorldMatrix()); 00238 invWorldMatrix.invert(); 00239 static CVector maxDeltaPosOS[HrcDepth]; 00240 for(uint i=0; i<HrcDepth; i++) 00241 { 00242 maxDeltaPosOS[i]= invWorldMatrix.mulVector(_MaxDeltaPos[i]); 00243 } 00244 00245 00246 // Setup lighting and lighting constants 00247 setupLighting(scene, mbi, invertedModelMat); 00248 00249 // c[0..3] take the ModelViewProjection Matrix. After setupModelMatrix(); 00250 driver->setConstantMatrix(0, IDriver::ModelViewProjection, IDriver::Identity); 00251 // c[4..7] take the ModelView Matrix. After setupModelMatrix(); 00252 driver->setConstantMatrix(4, IDriver::ModelView, IDriver::Identity); 00253 00254 00255 // c[15] take Wind of level 0. 00256 float f; 00257 f= _CurrentTime[0] + instancePhase; 00258 f= speedCos(f) + Bias[0]; 00259 driver->setConstant(15, maxDeltaPosOS[0]*f ); 00260 00261 00262 // c[16-19] take Wind of level 1. 00263 // Unrolled. 00264 float instTime1= _CurrentTime[1] + instancePhase; 00265 // phase 0. 00266 f= speedCos( instTime1+0 ) + Bias[1]; 00267 driver->setConstant(16+0, maxDeltaPosOS[1]*f); 00268 // phase 1. 00269 f= speedCos( instTime1+0.25f ) + Bias[1]; 00270 driver->setConstant(16+1, maxDeltaPosOS[1]*f); 00271 // phase 2. 00272 f= speedCos( instTime1+0.50f ) + Bias[1]; 00273 driver->setConstant(16+2, maxDeltaPosOS[1]*f); 00274 // phase 3. 00275 f= speedCos( instTime1+0.75f ) + Bias[1]; 00276 driver->setConstant(16+3, maxDeltaPosOS[1]*f); 00277 00278 00279 // c[20, 23] take Wind of level 2. 00280 // Unrolled. 00281 float instTime2= _CurrentTime[2] + instancePhase; 00282 // phase 0. 00283 f= speedCos( instTime2+0 ) + Bias[2]; 00284 driver->setConstant(20+0, maxDeltaPosOS[2]*f); 00285 // phase 1. 00286 f= speedCos( instTime2+0.25f ) + Bias[2]; 00287 driver->setConstant(20+1, maxDeltaPosOS[2]*f); 00288 // phase 2. 00289 f= speedCos( instTime2+0.50f ) + Bias[2]; 00290 driver->setConstant(20+2, maxDeltaPosOS[2]*f); 00291 // phase 3. 00292 f= speedCos( instTime2+0.75f ) + Bias[2]; 00293 driver->setConstant(20+3, maxDeltaPosOS[2]*f); 00294 } |
|
Definition at line 178 of file meshvp_wind_tree.cpp. References _CurrentTime, _LastSceneTime, _MaxDeltaPos, _MaxVertexMove, FrequencyWindFactor, NL3D::CScene::getCurrentTime(), NL3D::CScene::getGlobalWindDirection(), NL3D::CScene::getGlobalWindPower(), HrcDepth, NLMISC::CVector::norm(), PowerXY, PowerZ, NL3D::IDriver::setConstant(), uint, and NLMISC::CVector::z. Referenced by begin(), and beginMBRMesh().
00179 { 00180 // process current times and current power. Only one time per render() and per CMeshVPWindTree. 00181 if(scene->getCurrentTime() != _LastSceneTime) 00182 { 00183 // Get info from scene 00184 float windPower= scene->getGlobalWindPower(); 00185 00186 float dt= (float)(scene->getCurrentTime() - _LastSceneTime); 00187 _LastSceneTime= scene->getCurrentTime(); 00188 00189 // Update each boneLevel time according to frequency. 00190 uint i; 00191 for(i=0; i<HrcDepth; i++) 00192 { 00193 _CurrentTime[i]+= dt*(Frequency[i] + FrequencyWindFactor[i]*windPower); 00194 // get it between 0 and 1. Important for float precision problems. 00195 _CurrentTime[i]= (float)fmod(_CurrentTime[i], 1); 00196 } 00197 00198 // Update each boneLevel maximum amplitude vector. 00199 for(i=0; i<HrcDepth; i++) 00200 { 00201 _MaxDeltaPos[i]= scene->getGlobalWindDirection() * PowerXY[i] * windPower; 00202 _MaxDeltaPos[i].z= PowerZ[i] * windPower; 00203 } 00204 00205 /* Update the Max amplitude distance 00206 in world space, since maxdeltaPos are applied in world space, see setupPerInstanceConstants() 00207 */ 00208 _MaxVertexMove= 0; 00209 for(i=0; i<HrcDepth; i++) 00210 { 00211 _MaxVertexMove+= _MaxDeltaPos[i].norm(); 00212 } 00213 } 00214 00215 // Setup common constants for each instances. 00216 // c[8] take usefull constants. 00217 static float ct8[4]= {0, 1, 0.5f, 2}; 00218 driver->setConstant(8, 1, ct8); 00219 // c[9] take other usefull constants. 00220 static float ct9[4]= {3.f, 0.f, -1.f, -2.f}; 00221 driver->setConstant(9, 1, ct9); 00222 // c[10] take Number of phase (4) for level2 and 3. -0.01 to avoid int value == 4. 00223 static float ct10[4]= {4-0.01f, 0, 0, 0}; 00224 driver->setConstant(10, 1, ct10); 00225 } |
|
Definition at line 92 of file meshvp_wind_tree.cpp. References NLMISC::Pi. Referenced by setupPerInstanceConstants().
00093 { 00094 // \todo yoyo TODO_OPTIM 00095 return cosf(angle * 2*(float)Pi); 00096 } |
|
Reimplemented from NL3D::IMeshVertexProgram. Definition at line 380 of file meshvp_wind_tree.cpp.
00381 { 00382 return true; 00383 } |
|
Definition at line 67 of file smart_ptr.h. |
|
Definition at line 133 of file meshvp_wind_tree.h. Referenced by CMeshVPWindTree(), setupPerInstanceConstants(), and setupPerMesh(). |
|
Definition at line 141 of file meshvp_wind_tree.h. Referenced by beginMBRInstance(), and beginMBRMesh(). |
|
Definition at line 134 of file meshvp_wind_tree.h. Referenced by CMeshVPWindTree(), and setupPerMesh(). |
|
Definition at line 137 of file meshvp_wind_tree.h. Referenced by setupPerInstanceConstants(), and setupPerMesh(). |
|
Definition at line 138 of file meshvp_wind_tree.h. Referenced by CMeshVPWindTree(), getMaxVertexMove(), and setupPerMesh(). |
|
The 16 versions: Specular or not (0 or 2), + normalize normal or not (0 or 1). All multiplied by 4, because support from 0 to 3 pointLights activated. (0.., 4.., 8.., 12..) Definition at line 51 of file meshvp_wind_tree.cpp. |
|
Bias result of the cosinus: f= cos(time)+bias.
Definition at line 63 of file meshvp_wind_tree.h. |
|
Definition at line 79 of file smart_ptr.h. Referenced by NLMISC::CRefCount::CRefCount(), NLMISC::CRefCount::getRefCount(), and NLMISC::CRefCount::~CRefCount(). |
|
Frequency of the wind for 3 Hierachy levels.
Definition at line 55 of file meshvp_wind_tree.h. |
|
Additional frequency, multiplied by the globalWindPower.
Definition at line 57 of file meshvp_wind_tree.h. Referenced by CMeshVPWindTree(), and setupPerMesh(). |
|
Referenced by NLMISC::CRefCount::CRefCount(). |
|
Definition at line 80 of file smart_ptr.h. Referenced by NLMISC::CRefCount::CRefCount(), and NLMISC::CRefCount::~CRefCount(). |
|
Power of the wind on XY. Mul by globalWindPower.
Definition at line 59 of file meshvp_wind_tree.h. Referenced by CMeshVPWindTree(), and setupPerMesh(). |
|
Power of the wind on Z. Mul by globalWindPower.
Definition at line 61 of file meshvp_wind_tree.h. Referenced by CMeshVPWindTree(), and setupPerMesh(). |
|
true if want Specular Lighting.
Definition at line 66 of file meshvp_wind_tree.h. |