Ignore:
Timestamp:
09/11/06 15:30:44 (18 years ago)
Author:
szirmay
Message:
 
Location:
GTP/trunk/Lib/Illum/IllumModule/OgreIllumModule/src
Files:
2 edited

Legend:

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

    r1062 r1330  
    1414                                                                                                                bool useOwnMaterial, 
    1515                                                                                                                String impostorMaterialName, 
     16                                                                                                                bool useVParam, 
     17                                                                                                                String VParamRadius, 
     18                                                                                                                bool useFParam, 
     19                                                                                                                String FParamRadius, 
    1620                                                                                                                Pass* pass, 
    1721                                                                                                                OgreRenderable* parentRenderable, 
     
    2529        this->impostorMaterialName = impostorMaterialName; 
    2630        this->useOwnMaterial = useOwnMaterial; 
     31        this->VParamRadius = VParamRadius; 
     32        this->FParamRadius = FParamRadius; 
     33        this->useVParam = useVParam; 
     34        this->useFParam = useFParam; 
    2735         
    2836        //create the Particle system 
     
    3644                sharedRuns->addRun(ILLUMRUN_HPP_IMPOSTOR, createChildPSysRenderingRun());        
    3745 
     46        ((OgreChildPSystemRenderingRun*) sharedRuns->getRun(ILLUMRUN_HPP_IMPOSTOR)->asOgreRenderingRun())->setNode(node); 
    3847        impostorChanged(sharedRuns->getRun(ILLUMRUN_HPP_IMPOSTOR)); 
    3948} 
     
    6574} 
    6675 
     76void OgreHierarchicalParticleSystemTechnique::update(unsigned long frameNum) 
     77{ 
     78        HierarchicalParticleSystemTechnique::update(frameNum); 
     79 
     80        OgreChildPSystemRenderingRun* r = (OgreChildPSystemRenderingRun*)  
     81                                                                                        sharedRuns->getRun(ILLUMRUN_HPP_IMPOSTOR)->asOgreRenderingRun(); 
     82        float radius = r->getSmallSysRadius(); 
     83        if(useVParam) 
     84                pass->getVertexProgramParameters()->setNamedConstant(VParamRadius, radius); 
     85        if(useFParam) 
     86                pass->getFragmentProgramParameters()->setNamedConstant(FParamRadius, radius); 
     87} 
     88 
    6789///Technique Parsers 
    6890namespace HPSParsers 
     
    129151                f->childPSysScriptName = params; 
    130152        } 
     153        void parseVparamRadius(String& params, RenderTechniqueFactory* factory) 
     154        { 
     155                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory; 
     156                f->VParamRadius = params; 
     157        } 
     158        void parseFparamRadius(String& params, RenderTechniqueFactory* factory) 
     159        { 
     160                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory; 
     161                f->FParamRadius = params; 
     162        } 
    131163 
    132164         
     
    148180        this->attributeParsers.insert(AttribParserList::value_type("particle_script", (ILLUM_ATTRIBUTE_PARSER) parseScriptName)); 
    149181        this->attributeParsers.insert(AttribParserList::value_type("material", (ILLUM_ATTRIBUTE_PARSER) parseMaterialName)); 
     182        this->attributeParsers.insert(AttribParserList::value_type("vparam_radius", (ILLUM_ATTRIBUTE_PARSER) parseFparamRadius)); 
     183        this->attributeParsers.insert(AttribParserList::value_type("fparam_radius", (ILLUM_ATTRIBUTE_PARSER) parseVparamRadius)); 
    150184         
    151185} 
     
    165199        impostorMaterialName = ""; 
    166200        childPSysScriptName = ""; 
    167         bool useOwnMaterial = true; 
     201        useOwnMaterial = true; 
     202        VParamRadius = ""; 
     203        FParamRadius = ""; 
     204        useVParam = false; 
     205        useFParam = false; 
    168206 
    169207        parseParams(params); 
     
    179217                                                                                                useOwnMaterial, 
    180218                                                                                                impostorMaterialName, 
     219                                                                                                useVParam, 
     220                                                                                                VParamRadius, 
     221                                                                                                useFParam, 
     222                                                                                                FParamRadius, 
    181223                                                                                                pass, 
    182224                                                                                                parentRenderable, 
  • GTP/trunk/Lib/Illum/IllumModule/OgreIllumModule/src/RenderingRuns/OgreChildParticlesystemRenderingRun.cpp

    r1062 r1330  
    4747         RenderTarget* rt = hpb->getRenderTarget(); 
    4848         Viewport* v = rt->addViewport(impostorCamera); 
    49          v->setBackgroundColour(ColourValue(0,1,0,0)); 
     49         //Viewport* v = rt->addViewport(OgreIlluminationManager::getSingleton().getMainCamera()); 
     50         v->setBackgroundColour(ColourValue(0,0,0,0)); 
    5051         v->setOverlaysEnabled(false); 
    5152         rt->setAutoUpdated(false); 
     
    6263 
    6364        sharedRuns->getRoot()->updateBounds(); 
    64         Sphere boundSphere = ((OgreSharedRuns*)sharedRuns->getRoot(ILLUMRUN_HPP_IMPOSTOR))->getBoundingSphere(); 
     65        Vector3 center = sharedRuns->getRootPosition(ILLUMRUN_HPP_IMPOSTOR); 
    6566        Camera* mainCam = OgreIlluminationManager::getSingleton().getMainCamera(); 
    6667        impostorCamera->setPosition(mainCam->getPosition()); 
    67         Vector3 dir = boundSphere.getCenter() - mainCam->getPosition(); 
    68         float r = boundSphere.getRadius(); 
    69         r = 200; 
     68         
     69        psysNode->setPosition(center); 
     70        ParticleSystem* psys = Root::getSingleton()._getCurrentSceneManager()->getParticleSystem(childParticleSystemName); 
     71        psys->_notifyCurrentCamera(impostorCamera); 
     72         
     73        psysNode->_updateBounds(); 
     74        AxisAlignedBox bb = psysNode->_getWorldAABB();   
     75         
     76        float r = (bb.getMaximum() - bb.getMinimum()).length() / 2.0; 
     77        sysRad = r; 
     78        center = bb.getCenter(); 
     79        Vector3 dir = center - mainCam->getPosition(); 
    7080        float d = dir.normalise(); 
    71         impostorCamera->setDirection(dir); 
     81         
     82        if (d <= r * 1.2)//too close 
     83        { 
     84                d = r * 1.2; 
     85                impostorCamera->setPosition(center - dir * d); 
     86        } 
    7287 
     88    impostorCamera->setDirection(dir); 
     89 
     90        //r = 200; 
     91         
    7392        if(perspectiveRendering) 
    7493        { 
     
    7695                impostorCamera->setAspectRatio(1.0); 
    7796                Radian a = Math::ASin(r / d) * 2.0; 
    78                 impostorCamera->setFOVy(/*a*/ Radian(Degree(90))); 
    79                 impostorCamera->setNearClipDistance(/*std::max(0.01f, d - r)*/0.1); 
    80                 impostorCamera->setFarClipDistance(/*r + d*/1000);               
     97                impostorCamera->setFOVy( a ); 
     98                impostorCamera->setNearClipDistance(d - r); 
     99                impostorCamera->setFarClipDistance(d + r);               
    81100        } 
    82101        else 
    83102        { 
    84                 impostorCamera->setPosition(boundSphere.getCenter()); 
     103                impostorCamera->setPosition(center); 
    85104                impostorCamera->setProjectionType(PT_ORTHOGRAPHIC); 
    86105                Matrix4 m; 
    87106                m = Matrix4::IDENTITY; 
    88                 float scale = 1.0 / boundSphere.getRadius(); 
     107                float scale = 1.0 / r; 
    89108                m.setScale(Vector3(scale, scale, scale)); 
    90109                impostorCamera->setCustomProjectionMatrix(true, m); 
    91110        }        
    92111 
    93         ParticleSystem* psys = Root::getSingleton()._getCurrentSceneManager()->getParticleSystem(childParticleSystemName); 
    94         psys->getParentSceneNode()->setPosition(boundSphere.getCenter()); 
    95         psys->_notifyCurrentCamera(impostorCamera); 
     112        // 
    96113        psys->_updateRenderQueue(rq); 
    97114         
     
    100117         
    101118        RenderTarget* rt = impostorTexture->getBuffer().getPointer()->getRenderTarget(); 
    102           
     119        sm->setFindVisibleObjects(false); 
    103120        rt->update();    
     121        sm->setFindVisibleObjects(true); 
    104122         
    105123         
     
    109127        //filename.append(StringConverter::toString(framecount)); 
    110128        filename.append(".dds"); 
    111         rt->writeContentsToFile(filename); 
     129        //rt->writeContentsToFile(filename); 
    112130        framecount++;    
    113131         
Note: See TracChangeset for help on using the changeset viewer.