//----------------------------------------------------------------------------- UniformParameterPtr Program::resolveParameter(GpuConstantType type, int index, uint16 variability, const String& suggestedName, size_t size) { UniformParameterPtr param; if (index == -1) { index = 0; // Find the next available index of the target type. UniformParameterIterator it; for (it = mParameters.begin(); it != mParameters.end(); ++it) { if ((*it)->getType() == type && (*it)->isAutoConstantParameter() == false) { index++; } } } else { // Check if parameter already exists. param = getParameterByType(type, index); if (param.get() != NULL) { return param; } } // Create new parameter. param = ParameterFactory::createUniform(type, index, variability, suggestedName, size); addParameter(param); return param; }
//----------------------------------------------------------------------------- UniformParameterPtr Program::resolveAutoParameterInt(GpuProgramParameters::AutoConstantType autoType, GpuConstantType type, size_t data, size_t size) { UniformParameterPtr param; // Check if parameter already exists. param = getParameterByAutoType(autoType); if (param.get() != NULL) { if (param->isAutoConstantIntParameter() && param->getAutoConstantIntData() == data) { param->setSize(std::max(size, param->getSize())); return param; } } // Create new parameter. param = UniformParameterPtr(OGRE_NEW UniformParameter(autoType, data, size, type)); addParameter(param); return param; }
//----------------------------------------------------------------------- bool FFPTransform::createCpuSubPrograms(ProgramSet* programSet) { Program* vsProgram = programSet->getCpuVertexProgram(); // Resolve World View Projection Matrix. UniformParameterPtr wvpMatrix = vsProgram->resolveAutoParameterInt(GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX, 0); if (wvpMatrix.get() == NULL) return false; Function* vsEntry = vsProgram->getEntryPointFunction(); assert(vsEntry != NULL); // Resolve input position parameter. ParameterPtr positionIn = vsEntry->resolveInputParameter(Parameter::SPS_POSITION, 0, Parameter::SPC_POSITION_OBJECT_SPACE, GCT_FLOAT4); if (positionIn.get() == NULL) return false; // Resolve output position parameter. ParameterPtr positionOut = vsEntry->resolveOutputParameter(Parameter::SPS_POSITION, 0, Parameter::SPC_POSITION_PROJECTIVE_SPACE, GCT_FLOAT4); if (positionOut.get() == NULL) return false; // Add dependency. vsProgram->addDependency(FFP_LIB_TRANSFORM); FunctionInvocation* transformFunc = OGRE_NEW FunctionInvocation(FFP_FUNC_TRANSFORM, FFP_VS_TRANSFORM, 0); transformFunc->pushOperand(wvpMatrix, Operand::OPS_IN); transformFunc->pushOperand(positionIn, Operand::OPS_IN); transformFunc->pushOperand(positionOut, Operand::OPS_OUT); vsEntry->addAtomInstace(transformFunc); return true; }