#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. |
1.3.6