- Timestamp:
- 04/27/06 09:24:44 (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/Lib/Illum/IllumModule/OgreIllumModule/src/OgreIlluminationManager.cpp
r790 r836 2 2 #include "OgreParticleSystemRenderer.h" 3 3 #include "OgreBillboardParticleRenderer.h" 4 #include "SpriteParticleRenderer.h" 4 5 5 6 … … 78 79 visitor = new VisibleFinderVisitor(&visibleObjects); 79 80 maxRad = 400; 81 82 //register rendertechnique factories 83 OgreColorCubeMapRenderTechniqueFactory* colorcube = new OgreColorCubeMapRenderTechniqueFactory(); 84 addRenderTechniqueFactory(colorcube); 85 OgreDistanceCubeMapRenderTechniqueFactory* distcube = new OgreDistanceCubeMapRenderTechniqueFactory(); 86 addRenderTechniqueFactory(distcube); 87 OgreConvoledCubeMapRenderTechniqueFactory* convcube = new OgreConvoledCubeMapRenderTechniqueFactory(); 88 addRenderTechniqueFactory(convcube); 89 OgreCausticCasterRenderTechniqueFactory* caucast = new OgreCausticCasterRenderTechniqueFactory(); 90 addRenderTechniqueFactory(caucast); 91 OgreCausticRecieverRenderTechniqueFactory* caurec = new OgreCausticRecieverRenderTechniqueFactory(); 92 addRenderTechniqueFactory(caurec); 93 OgreDepthShadowRecieverRenderTechniqueFactory* dsrec = new OgreDepthShadowRecieverRenderTechniqueFactory(); 94 addRenderTechniqueFactory(dsrec); 95 OgreSBBRenderTechniqueFactory* sbb = new OgreSBBRenderTechniqueFactory(); 96 addRenderTechniqueFactory(sbb); 80 97 } 81 98 … … 119 136 } 120 137 138 BillboardSet* OgreIlluminationManager::findRenderableInParticleSystem(ParticleSystem* system) 139 { 140 ParticleSystemRenderer* renderer = system->getRenderer(); 141 142 const String rendererType = renderer->getType(); 143 if(rendererType == "billboard") 144 { 145 BillboardSet* bbSet = ((BillboardParticleRenderer*) renderer)->getBillboardSet(); 146 return bbSet; 147 } 148 149 if(rendererType == "sprite") 150 { 151 BillboardSet* bbSet = ((SpriteParticleRenderer*) renderer)->getSpriteSet(); 152 return bbSet; 153 } 154 155 OGRE_EXCEPT(0, "Unsupported particle renderable type", "OgreIlluminationManager::findRenderableInParticleSystem"); 156 157 return NULL; 158 } 159 160 161 void OgreIlluminationManager::initTechniques() 162 { 163 { 164 //Entities 165 SceneManager::MovableObjectIterator it = Root::getSingleton()._getCurrentSceneManager() 166 ->getMovableObjectIterator("Entity"); 167 while(it.hasMoreElements()) 168 { 169 MovableObject* o = it.getNext(); 170 Entity* e = (Entity*) o; 171 172 OgreSharedRuns* sharedruns = 0; 173 174 for(unsigned int s = 0; s < e->getNumSubEntities(); s++) 175 { 176 SubEntity* sube = e->getSubEntity(s); 177 178 Material* mat = sube->getMaterial().getPointer(); 179 180 OgreRenderable* rend = 0; 181 OgreTechniqueGroup* group = 0; 182 183 for(unsigned int t = 0 ; t < mat->getNumTechniques() ; t++) 184 { 185 Technique* tech = mat->getTechnique(t); 186 187 for(unsigned int p = 0; p< tech->getNumPasses(); p++) 188 { 189 Pass* pass = tech->getPass(p); 190 191 std::vector<IllumTechniqueParams*>& techniques = pass->getIllumTechniques(); 192 std::vector<IllumTechniqueParams*>::iterator i = techniques.begin(); 193 std::vector<IllumTechniqueParams*>::iterator iend = techniques.end(); 194 195 while( i != iend) 196 { 197 IllumTechniqueParams* params = *i; 198 199 if(rend == 0) 200 { 201 rend = new OgreRenderable(e, s); 202 group = new OgreTechniqueGroup(); 203 sube->setRenderTechniqueGroup(group); 204 205 if( sharedruns == 0) 206 { 207 sharedruns = new OgreSharedRuns(); 208 addSharedRuns(sharedruns); 209 } 210 211 group->addSharedRun(sharedruns); 212 sharedruns->addRenderable(rend); 213 sharedruns->updateBounds(); 214 } 215 216 createTechnique(params, pass, rend, sharedruns); 217 218 i++; 219 } 220 } 221 } 222 } 223 224 } 225 } 226 { 227 //ParticleSystems 228 SceneManager::MovableObjectIterator it = Root::getSingleton()._getCurrentSceneManager() 229 ->getMovableObjectIterator("ParticleSystem"); 230 while(it.hasMoreElements()) 231 { 232 MovableObject* o = it.getNext(); 233 ParticleSystem* psys = (ParticleSystem*) o; 234 235 BillboardSet* bbset = findRenderableInParticleSystem(psys); 236 237 OgreTechniqueGroup* group = 0; 238 OgreSharedRuns* sharedruns = 0; 239 OgreRenderable* rend = 0; 240 241 String matName = psys->getMaterialName(); 242 Material* mat = (Material*) MaterialManager::getSingleton().getByName(matName).getPointer(); 243 244 for(unsigned int t = 0 ; t < mat->getNumTechniques() ; t++) 245 { 246 Technique* tech = mat->getTechnique(t); 247 248 for(unsigned int p = 0; p< tech->getNumPasses(); p++) 249 { 250 Pass* pass = tech->getPass(p); 251 252 std::vector<IllumTechniqueParams*>& techniques = pass->getIllumTechniques(); 253 std::vector<IllumTechniqueParams*>::iterator i = techniques.begin(); 254 std::vector<IllumTechniqueParams*>::iterator iend = techniques.end(); 255 256 257 while( i != iend) 258 { 259 IllumTechniqueParams* params = *i; 260 261 if(rend == 0) 262 { 263 rend = new OgreRenderable(bbset); 264 group = new OgreTechniqueGroup(); 265 bbset->setRenderTechniqueGroup(group); 266 267 if( sharedruns == 0) 268 { 269 sharedruns = new OgreSharedRuns(); 270 addSharedRuns(sharedruns); 271 } 272 273 group->addSharedRun(sharedruns); 274 sharedruns->addRenderable(rend); 275 sharedruns->updateBounds(); 276 } 277 278 createTechnique(params, pass, rend, sharedruns); 279 280 i++; 281 } 282 } 283 } 284 285 286 } 287 } 288 } 289 290 void OgreIlluminationManager::createTechnique(IllumTechniqueParams* params, Pass* pass, OgreRenderable* rend, OgreSharedRuns* sRuns) 291 { 292 std::list<RenderTechniqueFactory*>::iterator it = techniqueFactories.begin(); 293 std::list<RenderTechniqueFactory*>::iterator itend = techniqueFactories.end(); 294 295 OgreTechniqueGroup* group = (OgreTechniqueGroup*) rend->getRenderable()->getRenderTechniqueGroup(); 296 297 298 while(it != itend) 299 { 300 RenderTechniqueFactory* factory = *it; 301 302 303 if(factory->isType(params->getTypeName())) 304 { 305 306 RenderTechnique* newTechnique = factory->createInstance(params, 307 pass, 308 rend, 309 group ); 310 311 group->addRenderTechnique(newTechnique); 312 313 } 314 315 it++; 316 } 317 } 318 121 319 void OgreIlluminationManager::update(unsigned long frameNumber, RenderTarget* rt) 122 320 { … … 141 339 fillVisibleList(rq); 142 340 143 //int l = visibleObjects.size(); //debug341 int l = visibleObjects.size(); //debug 144 342 145 343 joinSharedRuns(); 146 344 147 //int ll = sharedRunRoots.size(); //debug345 int ll = sharedRunRoots.size(); //debug 148 346 149 347 //update precomputings
Note: See TracChangeset
for help on using the changeset viewer.