Ignore:
Timestamp:
04/27/06 09:24:44 (18 years ago)
Author:
szirmay
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Illum/IllumModule/OgreIllumModule/src/OgreIlluminationManager.cpp

    r790 r836  
    22#include "OgreParticleSystemRenderer.h" 
    33#include "OgreBillboardParticleRenderer.h" 
     4#include "SpriteParticleRenderer.h" 
    45  
    56 
     
    7879        visitor = new VisibleFinderVisitor(&visibleObjects); 
    7980        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); 
    8097} 
    8198 
     
    119136} 
    120137 
     138BillboardSet* 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 
     161void 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 
     290void 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 
    121319void OgreIlluminationManager::update(unsigned long frameNumber, RenderTarget* rt) 
    122320{ 
     
    141339                fillVisibleList(rq);     
    142340 
    143                 //int l = visibleObjects.size(); //debug 
     341                int l = visibleObjects.size(); //debug 
    144342                 
    145343                joinSharedRuns(); 
    146344 
    147                 //int ll = sharedRunRoots.size(); //debug 
     345                int ll = sharedRunRoots.size(); //debug 
    148346 
    149347                //update precomputings                           
Note: See TracChangeset for help on using the changeset viewer.