Definition at line 65 of file ps_shockwave.cpp.
Static Public Member Functions | |
template<class T> void | drawShockWave (T posIt, CPSShockWave &s, uint size, uint32 srcStep) |
|
Definition at line 69 of file ps_shockwave.cpp. References NL3D::IDriver::activeVertexBuffer(), CHECK_VERTEX_BUFFER, NL3D::CVertexBuffer::getVertexCoordPointer(), NL3D::CVertexBuffer::getVertexSize(), min, nlassert, PARTICLES_CHECK_MEM, NL3D::IDriver::render(), s, NL3D::CPrimitiveBlock::setNumQuad(), NL3D::ShockWaveBufSize, sint32, size, uint, uint32, uint8, NL3D::CPlaneBasis::X, and NL3D::CPlaneBasis::Y.
00070 { 00071 PARTICLES_CHECK_MEM; 00072 nlassert(s._Owner); 00073 00074 // get / build the vertex buffer and the primitive block 00075 CVertexBuffer *vb; 00076 CPrimitiveBlock *pb; 00077 s.getVBnPB(vb, pb); 00078 00079 const uint32 vSize = vb->getVertexSize(); 00080 IDriver *driver = s.getDriver(); 00081 s._Owner->incrementNbDrawnParticles(size); // for benchmark purpose 00082 s.setupDriverModelMatrix(); 00083 const uint numShockWaveToDealWith = std::min(ShockWaveBufSize, s.getNumShockWavesInVB()); 00084 driver->activeVertexBuffer(*vb); 00085 00086 static CPlaneBasis planeBasis[ShockWaveBufSize]; 00087 float sizes[ShockWaveBufSize]; 00088 float angles[ShockWaveBufSize]; 00089 00090 uint leftToDo = size, toProcess; 00091 T endIt; 00092 uint8 *currVertex; 00093 uint k ; 00094 00095 const float angleStep = 256.f / s._NbSeg; 00096 float currAngle; 00097 00098 CPlaneBasis *ptCurrBasis; 00099 uint32 ptCurrBasisIncrement = s._PlaneBasisScheme ? 1 : 0; 00100 00101 float *ptCurrSize; 00102 uint32 ptCurrSizeIncrement = s._SizeScheme ? 1 : 0; 00103 00104 float *ptCurrAngle; 00105 uint32 ptCurrAngleIncrement = s._Angle2DScheme ? 1 : 0; 00106 00107 CVector radVect, innerVect; 00108 float radiusRatio; 00109 00110 do 00111 { 00112 currVertex = (uint8 *) vb->getVertexCoordPointer(); 00113 toProcess = leftToDo > numShockWaveToDealWith ? numShockWaveToDealWith : leftToDo; 00114 endIt = posIt + toProcess; 00115 if (s._SizeScheme) 00116 { 00117 ptCurrSize = (float *) (s._SizeScheme->make(s._Owner, size - leftToDo, (void *) sizes, sizeof(float), toProcess, true, srcStep)); 00118 } 00119 else 00120 { 00121 ptCurrSize = &s._ParticleSize; 00122 } 00123 00124 if (s._PlaneBasisScheme) 00125 { 00126 ptCurrBasis = (CPlaneBasis *) (s._PlaneBasisScheme->make(s._Owner, size - leftToDo, (void *) planeBasis, sizeof(CPlaneBasis), toProcess, true, srcStep)); 00127 } 00128 else 00129 { 00130 ptCurrBasis = &s._PlaneBasis; 00131 } 00132 00133 if (s._Angle2DScheme) 00134 { 00135 ptCurrAngle = (float *) (s._Angle2DScheme->make(s._Owner, size - leftToDo, (void *) angles, sizeof(float), toProcess, true, srcStep)); 00136 } 00137 else 00138 { 00139 ptCurrAngle = &s._Angle2D; 00140 } 00141 00142 00143 s.updateVbColNUVForRender(size - leftToDo, toProcess, srcStep, *vb); 00144 do 00145 { 00146 currAngle = *ptCurrAngle; 00147 if (fabsf(*ptCurrSize) > 10E-6) 00148 { 00149 radiusRatio = (*ptCurrSize - s._RadiusCut) / *ptCurrSize; 00150 } 00151 else 00152 { 00153 radiusRatio = 0.f; 00154 } 00155 00156 for (k = 0; k <= s._NbSeg; ++k) 00157 { 00158 radVect = *ptCurrSize * (CPSUtil::getCos((sint32) currAngle) * ptCurrBasis->X + CPSUtil::getSin((sint32) currAngle) * ptCurrBasis->Y); 00159 innerVect = radiusRatio * radVect; 00160 CHECK_VERTEX_BUFFER(*vb, currVertex); 00161 * (CVector *) currVertex = *posIt + radVect; 00162 currVertex += vSize; 00163 CHECK_VERTEX_BUFFER(*vb, currVertex); 00164 * (CVector *) currVertex = *posIt + innerVect; 00165 currVertex += vSize; 00166 currAngle += angleStep; 00167 } 00168 00169 ++posIt; 00170 ptCurrBasis += ptCurrBasisIncrement; 00171 ptCurrSize += ptCurrSizeIncrement; 00172 ptCurrAngle += ptCurrAngleIncrement; 00173 } 00174 while (posIt != endIt); 00175 00176 pb->setNumQuad(toProcess * s._NbSeg); 00177 driver->render(*pb, s._Mat); 00178 leftToDo -= toProcess; 00179 } 00180 while (leftToDo); 00181 PARTICLES_CHECK_MEM; 00182 } |