//----------------------------------------------------------------------- void RenderQueue::addRenderable(Renderable* pRend, uint8 groupID, ushort priority) { // Find group RenderQueueGroup* pGroup = getQueueGroup(groupID); Technique* pTech; // tell material it's been used if (!pRend->getMaterial().isNull()) pRend->getMaterial()->touch(); // Check material & technique supplied (the former since the default implementation // of getTechnique is based on it for backwards compatibility if(pRend->getMaterial().isNull() || !(pTech = pRend->getTechnique())) { // Use default base white MaterialPtr baseWhite = MaterialManager::getSingleton().getByName("BaseWhite"); pTech = baseWhite->getTechnique(0); } if (mRenderableListener) { // Allow listener to override technique and to abort if (!mRenderableListener->renderableQueued(pRend, groupID, priority, &pTech, this)) return; // rejected // tell material it's been used (incase changed) pTech->getParent()->touch(); } pGroup->addRenderable(pRend, pTech, priority); }
void visit(Renderable* rend, ushort lodIndex, bool isDebug, Any* pAny = 0) { Technique* tech = rend->getTechnique(); bool techReceivesShadows = tech && tech->getParent()->getReceiveShadows(); anyReceiveShadows = anyReceiveShadows || techReceivesShadows || !tech; }
//----------------------------------------------------------------------- void RenderQueue::addRenderable(Renderable* pRend, uint8 groupID, ushort priority) { // Find group RenderQueueGroup* pGroup = getQueueGroup(groupID); Technique* pTech; // tell material it's been used if (pRend->getMaterial()) pRend->getMaterial()->touch(); // Check material & technique supplied (the former since the default implementation // of getTechnique is based on it for backwards compatibility if(!pRend->getMaterial() || !pRend->getTechnique()) { // Use default base white, with lighting only if vertices has normals RenderOperation op; pRend->getRenderOperation(op); bool useLighting = (NULL != op.vertexData->vertexDeclaration->findElementBySemantic(VES_NORMAL)); MaterialPtr defaultMat = MaterialManager::getSingleton().getDefaultMaterial(useLighting); defaultMat->load(); pTech = defaultMat->getBestTechnique(); } else pTech = pRend->getTechnique(); if (mRenderableListener) { // Allow listener to override technique and to abort if (!mRenderableListener->renderableQueued(pRend, groupID, priority, &pTech, this)) return; // rejected // tell material it's been used (incase changed) pTech->getParent()->touch(); } pGroup->addRenderable(pRend, pTech, priority); }
/* note: we can know the texture unit index by getting parent then finding it in the list of children */ void SGScriptTranslator::translateTextureUnit(ScriptCompiler* compiler, const AbstractNodePtr &node) { ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get()); TextureUnitState* texState = any_cast<TextureUnitState*>(obj->parent->context); Pass* pass = texState->getParent(); Technique* technique = pass->getParent(); Material* material = technique->getParent(); ShaderGenerator* shaderGenerator = ShaderGenerator::getSingletonPtr(); String dstTechniqueSchemeName = obj->name; bool techniqueCreated; // Make sure the scheme name is valid - use default if none exists. if (dstTechniqueSchemeName.empty()) dstTechniqueSchemeName = ShaderGenerator::DEFAULT_SCHEME_NAME; //check if technique already created techniqueCreated = shaderGenerator->hasShaderBasedTechnique(material->getName(), material->getGroup(), technique->getSchemeName(), dstTechniqueSchemeName); if (techniqueCreated == false) { // Create the shader based technique. techniqueCreated = shaderGenerator->createShaderBasedTechnique(material->getName(), material->getGroup(), technique->getSchemeName(), dstTechniqueSchemeName, shaderGenerator->getCreateShaderOverProgrammablePass()); } // Case technique successfully created. if (techniqueCreated) { //Attempt to get the render state which might have been created by the pass parsing mGeneratedRenderState = shaderGenerator->getRenderState(dstTechniqueSchemeName, material->getName(), material->getGroup(), pass->getIndex()); // Go over all the render state properties. for(AbstractNodeList::iterator i = obj->children.begin(); i != obj->children.end(); ++i) { if((*i)->type == ANT_PROPERTY) { PropertyAbstractNode *prop = static_cast<PropertyAbstractNode*>((*i).get()); SubRenderState* subRenderState = ShaderGenerator::getSingleton().createSubRenderState(compiler, prop, texState, this); if (subRenderState) { addSubRenderState(subRenderState, dstTechniqueSchemeName, material->getName(), material->getGroup(), pass->getIndex()); } } else { processNode(compiler, *i); } } mGeneratedRenderState = NULL; } }
//----------------------------------------------------------------------------- void SGScriptTranslator::translatePass(ScriptCompiler* compiler, const AbstractNodePtr &node) { ObjectAbstractNode *obj = static_cast<ObjectAbstractNode*>(node.get()); Pass* pass = any_cast<Pass*>(obj->parent->context); Technique* technique = pass->getParent(); Material* material = technique->getParent(); ShaderGenerator* shaderGenerator = ShaderGenerator::getSingletonPtr(); String dstTechniqueSchemeName = obj->name; bool techniqueCreated; // Make sure the scheme name is valid - use default if none exists. if (dstTechniqueSchemeName.empty()) dstTechniqueSchemeName = ShaderGenerator::DEFAULT_SCHEME_NAME; // Create the shader based technique. techniqueCreated = shaderGenerator->createShaderBasedTechnique(material->getName(), material->getGroup(), technique->getSchemeName(), dstTechniqueSchemeName, shaderGenerator->getCreateShaderOverProgrammablePass()); // Case technique successfully created. if (techniqueCreated) { // Go over all the render state properties. for(AbstractNodeList::iterator i = obj->children.begin(); i != obj->children.end(); ++i) { if((*i)->type == ANT_PROPERTY) { PropertyAbstractNode *prop = static_cast<PropertyAbstractNode*>((*i).get()); // Handle light count property. if (prop->name == "light_count") { if (prop->values.size() != 3) { compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line); } else { int lightCount[3]; if (false == SGScriptTranslator::getInts(prop->values.begin(), prop->values.end(), lightCount, 3)) { compiler->addError(ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line); } else { shaderGenerator->createScheme(dstTechniqueSchemeName); RenderState* renderState = shaderGenerator->getRenderState(dstTechniqueSchemeName, material->getName(), material->getGroup(), pass->getIndex()); renderState->setLightCount(lightCount); renderState->setLightCountAutoUpdate(false); } } } // Handle the rest of the custom properties. else { SubRenderState* subRenderState = ShaderGenerator::getSingleton().createSubRenderState(compiler, prop, pass, this); if (subRenderState) { addSubRenderState(subRenderState, dstTechniqueSchemeName, material->getName(), material->getGroup(), pass->getIndex()); } } } else { processNode(compiler, *i); } } mGeneratedRenderState = NULL; } }