#include "Ogre.h" #include "OgreEffectWrapper.h" EffectWrapper::EffectWrapper(){ numberOfCurrentTechnique=-1; numberOfCurrentPass=-1; fragmentProgramParams=false; vertexProgramParams=false; shadowCasterParams=false; shadowReceiverParams=false; canSetNewTechnique=true; this->material.setNull(); } EffectWrapper::EffectWrapper(Material* material){ numberOfCurrentTechnique=-1; numberOfCurrentPass=-1; fragmentProgramParams=false; vertexProgramParams=false; shadowCasterParams=false; shadowReceiverParams=false; canSetNewTechnique=true; this->material.bind(material); } EffectWrapper::~EffectWrapper(){ } //D3D Effect framework style. bool EffectWrapper::SetFloat(const String& name, float value){ if(validateSet()){ return false; } if(vertexProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getVertexProgramParameters()->setNamedConstant(name,value); } if(fragmentProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getFragmentProgramParameters()->setNamedConstant(name,value); } if(shadowCasterParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowCasterVertexProgramParameters()->setNamedConstant(name,value); } if(shadowReceiverParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowReceiverVertexProgramParameters()->setNamedConstant(name,value); } return true; } bool EffectWrapper::SetFloatArray(const String& name,const float* value, size_t count){ if(validateSet()){ return false; } if(vertexProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getVertexProgramParameters()->setNamedConstant(name,value,count); } if(fragmentProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getFragmentProgramParameters()->setNamedConstant(name,value,count); } if(shadowCasterParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowCasterVertexProgramParameters()->setNamedConstant(name,value,count); } if(shadowReceiverParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowReceiverVertexProgramParameters()->setNamedConstant(name,value,count); } return true; } bool EffectWrapper::SetInt(const String& name, int value){ if(validateSet()){ return false; } if(vertexProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getVertexProgramParameters()->setNamedConstant(name,value); } if(fragmentProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getFragmentProgramParameters()->setNamedConstant(name,value); } if(shadowCasterParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowCasterVertexProgramParameters()->setNamedConstant(name,value); } if(shadowReceiverParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowReceiverVertexProgramParameters()->setNamedConstant(name,value); } return true; } bool EffectWrapper::SetIntArray(const String& name,const int* value, size_t count){ if(validateSet()){ return false; } if(vertexProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getVertexProgramParameters()->setNamedConstant(name,value,count); } if(fragmentProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getFragmentProgramParameters()->setNamedConstant(name,value,count); } if(shadowCasterParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowCasterVertexProgramParameters()->setNamedConstant(name,value,count); } if(shadowReceiverParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowReceiverVertexProgramParameters()->setNamedConstant(name,value,count); } return true; } bool EffectWrapper::SetDoubleArray(const String& name, double* value, size_t count){ if(validateSet()){ return false; } if(vertexProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getVertexProgramParameters()->setNamedConstant(name,value,count); } if(fragmentProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getFragmentProgramParameters()->setNamedConstant(name,value,count); } if(shadowCasterParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowCasterVertexProgramParameters()->setNamedConstant(name,value,count); } if(shadowReceiverParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowReceiverVertexProgramParameters()->setNamedConstant(name,value,count); } return true; } bool EffectWrapper::SetMatrix(const String& name, Matrix4& value){ if(validateSet()){ return false; } if(vertexProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getVertexProgramParameters()->setNamedConstant(name,value); } if(fragmentProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getFragmentProgramParameters()->setNamedConstant(name,value); } if(shadowCasterParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowCasterVertexProgramParameters()->setNamedConstant(name,value); } if(shadowReceiverParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowReceiverVertexProgramParameters()->setNamedConstant(name,value); } return true; } bool EffectWrapper::SetMatrixArray(const String& name, Matrix4* value, size_t numEntries){ if(validateSet()){ return false; } if(vertexProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getVertexProgramParameters()->setNamedConstant(name,value,numEntries); } if(fragmentProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getFragmentProgramParameters()->setNamedConstant(name,value,numEntries); } if(shadowCasterParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowCasterVertexProgramParameters()->setNamedConstant(name,value,numEntries); } if(shadowReceiverParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowReceiverVertexProgramParameters()->setNamedConstant(name,value,numEntries); } return true; } bool EffectWrapper::SetMatrixTranspose(const String& name, Matrix4& value){ if(validateSet()){ return false; } Matrix4 transposeValue=value; transposeValue.transpose(); if(vertexProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getVertexProgramParameters()->setNamedConstant(name,transposeValue); } if(fragmentProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getFragmentProgramParameters()->setNamedConstant(name,transposeValue); } if(shadowCasterParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowCasterVertexProgramParameters()->setNamedConstant(name,transposeValue); } if(shadowReceiverParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowReceiverVertexProgramParameters()->setNamedConstant(name,transposeValue); } return true; } bool EffectWrapper::SetMatrixTransposeArray(const String& name, Matrix4* value, size_t numEntries){ if(validateSet()){ return false; } Matrix4* transposeValues=new Matrix4[numEntries]; for(unsigned int i=0;igetTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getVertexProgramParameters()->setNamedConstant(name,transposeValues,numEntries); } if(fragmentProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getFragmentProgramParameters()->setNamedConstant(name,transposeValues,numEntries); } if(shadowCasterParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowCasterVertexProgramParameters()->setNamedConstant(name,transposeValues,numEntries); } if(shadowReceiverParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowReceiverVertexProgramParameters()->setNamedConstant(name,transposeValues,numEntries); } delete[] transposeValues; return true; } bool EffectWrapper::SetTexture(int textureUnit,const String& textureName){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->createTextureUnitState()->setTextureName(textureName); return(true); } //Ogre style. bool EffectWrapper::SetVector4(const String& name,const Vector4 &vec){ if(validateSet()){ return false; } if(vertexProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getVertexProgramParameters()->setNamedConstant(name,vec); } if(fragmentProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getFragmentProgramParameters()->setNamedConstant(name,vec); } if(shadowCasterParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowCasterVertexProgramParameters()->setNamedConstant(name,vec); } if(shadowReceiverParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowReceiverVertexProgramParameters()->setNamedConstant(name,vec); } return true; } bool EffectWrapper::SetVector3(const String& name,const Vector3 &vec){ if(validateSet()){ return false; } if(vertexProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getVertexProgramParameters()->setNamedConstant(name,vec); } if(fragmentProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getFragmentProgramParameters()->setNamedConstant(name,vec); } if(shadowCasterParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowCasterVertexProgramParameters()->setNamedConstant(name,vec); } if(shadowReceiverParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowReceiverVertexProgramParameters()->setNamedConstant(name,vec); } return(true); } bool EffectWrapper::SetReal(const String& name, Real value){ if(validateSet()){ return false; } if(vertexProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getVertexProgramParameters()->setNamedConstant(name,value); } if(fragmentProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getFragmentProgramParameters()->setNamedConstant(name,value); } if(shadowCasterParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowCasterVertexProgramParameters()->setNamedConstant(name,value); } if(shadowReceiverParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowReceiverVertexProgramParameters()->setNamedConstant(name,value); } return(true); } bool EffectWrapper::SetColourValue(const String& name, const ColourValue &colour){ if(validateSet()){ return false; } if(vertexProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getVertexProgramParameters()->setNamedConstant(name,colour); } if(fragmentProgramParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getFragmentProgramParameters()->setNamedConstant(name,colour); } if(shadowCasterParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowCasterVertexProgramParameters()->setNamedConstant(name,colour); } if(shadowReceiverParams){ material->getTechnique(numberOfCurrentTechnique)->getPass(numberOfCurrentPass)->getShadowReceiverVertexProgramParameters()->setNamedConstant(name,colour); } return(true); } bool EffectWrapper::SetTechniqueToUse(int numberOfTechnique){ if(canSetNewTechnique){ if(GetNumTechniques()>numberOfTechnique){ this->numberOfCurrentTechnique=numberOfTechnique; return true; } else{ return false; } } return false; } MaterialPtr& EffectWrapper::getMaterial(){ return material; }