[SOLVED]Setting a constant in every GLSL fragment program

Problems building or running the engine, queries about how to use features etc.
Post Reply
User avatar
paul424
Gnome
Posts: 314
Joined: Thu May 24, 2012 7:16 pm
x 13

[SOLVED]Setting a constant in every GLSL fragment program

Post by paul424 »

Ogre Version: : 1 12 10:
Operating System: :OpenSUse Tumbleweed :
Render System: :OpenGL3+:
HI, long time no see !
I try to make the dynamic shadows optional for OpenDungeons.
I came up with the following code :

Code: Select all

        // donno if the below should be here -- paul424 :
        auto myIter = Ogre::MaterialManager::getSingleton().getResourceIterator();
        while(myIter.hasMoreElements())
        {
            auto myPointer = myIter.peekNextValue();
            Ogre::SharedPtr<Ogre::Material> myCastPointer = std::dynamic_pointer_cast<Ogre::Material> (myPointer);
            Ogre::Technique* technique;
            technique = myCastPointer->getTechnique(0);
            technique->getPass(technique->getNumPasses() - 1)->getFragmentProgramParameters()->setNamedConstant("shadowingEnabled",true) ;
            myIter.getNext();
        }  
I end up with exception :

Code: Select all

#2  0x00007ffff720c706 in Ogre::ExceptionFactory::throwException (code=code@entry=Ogre::Exception::ERR_INVALIDPARAMS, 
desc="This pass does not have this program type assigned!", 
src="getGpuProgramParameters", file=file@entry=0x7ffff74909b0 "/home/tom/Downloads/ogre-1.12.10/OgreMain/src/OgrePass.cpp", line=line@entry=1302)
    at /home/tom/Downloads/ogre-1.12.10/OgreMain/include/OgreException.h:281
Is this because not every fragment program ( some are still generated by RTSSystem) have the uniform bool shadowingEnabled constant ?
Or some materials don't have a proper fragment program at all ?
please explain :) ....
Last edited by paul424 on Sun Jun 27, 2021 11:52 am, edited 1 time in total.
User avatar
paul424
Gnome
Posts: 314
Joined: Thu May 24, 2012 7:16 pm
x 13

Re: Setting a constant in every GLSL fragment program

Post by paul424 »

I am answering my own questions; the above cannot be done without a few checks :

Code: Select all

        // donno if the below should be here -- paul424 :
        auto myIter = Ogre::MaterialManager::getSingleton().getResourceIterator();
        while(myIter.hasMoreElements())
        {
            auto myPointer = myIter.peekNextValue();
            Ogre::SharedPtr<Ogre::Material> myCastPointer = std::dynamic_pointer_cast<Ogre::Material> (myPointer);
            Ogre::Technique* technique;
            technique = myCastPointer->getTechnique(0);

            if( technique->getPass(technique->getNumPasses() - 1)->hasFragmentProgram())
            {
                if(technique->getPass(technique->getNumPasses() - 1)->getFragmentProgramParameters()->hasNamedParameters())
                {
                    const Ogre::GpuNamedConstants& gnc = technique->getPass(technique->getNumPasses() - 1)->getFragmentProgramParameters()->getConstantDefinitions();
                    auto it = gnc.map.find("shadowingEnabled");
                    if(it!=  gnc.map.end())
                        technique->getPass(technique->getNumPasses() - 1)->getFragmentProgramParameters()->setNamedConstant("shadowingEnabled",true);
                }
            }
            myIter.getNext();
        } 
Post Reply