void SceneEntityInstance::applySceneMesh(ObjectEntry *entry, SceneMesh *sceneMesh) { if(!entry) { return; } ObjectEntry *materialName =(*entry)["material"]; if(materialName) { sceneMesh->setMaterialByName(materialName->stringVal, topLevelResourcePool); if(sceneMesh->getMaterial()) { ObjectEntry *optionsEntry =(*entry)["shader_options"]; if(optionsEntry) { for(int i=0; i < optionsEntry->length; i++) { ObjectEntry *shaderEntry =(*optionsEntry)[i]; if(shaderEntry) { // parse in texture bindings ObjectEntry *texturesEntry =(*shaderEntry)["textures"]; if(texturesEntry) { for(int j=0; j < texturesEntry->length; j++) { ObjectEntry *textureEntry =(*texturesEntry)[j]; if(textureEntry) { ObjectEntry *nameEntry = (*textureEntry)["name"]; if(nameEntry && textureEntry->stringVal != "") { if(textureEntry->name == "cubemap") { Cubemap *cubemap; cubemap = (Cubemap*)topLevelResourcePool->getResource(Resource::RESOURCE_CUBEMAP, textureEntry->stringVal); if(cubemap) { sceneMesh->getLocalShaderOptions()->addCubemap(nameEntry->stringVal, cubemap); } } else { sceneMesh->getLocalShaderOptions()->addTexture(nameEntry->stringVal, CoreServices::getInstance()->getMaterialManager()->createTextureFromFile(textureEntry->stringVal)); } } } } } ObjectEntry *paramsEntry =(*shaderEntry)["params"]; if(paramsEntry) { for(int j=0; j < paramsEntry->length; j++) { ObjectEntry *paramEntry =(*paramsEntry)[j]; if(paramEntry) { ObjectEntry *nameEntry = (*paramEntry)["name"]; ObjectEntry *valueEntry = (*paramEntry)["value"]; if(nameEntry && valueEntry) { Shader *materialShader = sceneMesh->getMaterial()->getShader(i); if(materialShader) { int type = materialShader->getExpectedParamType(nameEntry->stringVal); LocalShaderParam *param = sceneMesh->getLocalShaderOptions()->addParam(type, nameEntry->stringVal); if(param) { param->setParamValueFromString(type, valueEntry->stringVal); } } } } } } } } } } } }
Material *MaterialManager::materialFromXMLNode(ResourcePool *resourcePool, TiXmlNode *node) { TiXmlElement *nodeElement = node->ToElement(); if (!nodeElement) return NULL; // Skip comment nodes String mname = nodeElement->Attribute("name"); TiXmlNode* pChild, *pChild2,*pChild3; Shader *materialShader; ShaderBinding *newShaderBinding; vector<Shader*> materialShaders; vector<ShaderBinding*> newShaderBindings; vector<ShaderRenderTarget*> renderTargets; Material *newMaterial = new Material(mname); newMaterial->setResourceName(mname); if(nodeElement->Attribute("screen")) { if(String(nodeElement->Attribute("screen")) == "true") { newMaterial->screenMaterial = true; } } if(nodeElement->Attribute("wireframe")) { newMaterial->wireframe = String(nodeElement->Attribute("wireframe")) == "true"; } if(nodeElement->Attribute("blendingMode")) { newMaterial->blendingMode = atoi(nodeElement->Attribute("blendingMode")); } for (pChild3 = node->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) { TiXmlElement *pChild3Element = pChild3->ToElement(); if (!pChild3Element) continue; // Skip comment nodes if(strcmp(pChild3->Value(), "rendertargets") == 0) { if(pChild3Element->Attribute("type")) { if(strcmp(pChild3Element->Attribute("type"), "rgba_fp16") == 0) { newMaterial->fp16RenderTargets = true; } } for (pChild = pChild3->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) { TiXmlElement *pChildElement = pChild->ToElement(); if (!pChildElement) continue; // Skip comment nodes if(strcmp(pChild->Value(), "rendertarget") == 0) { ShaderRenderTarget *newTarget = new ShaderRenderTarget; newTarget->id = pChildElement->Attribute("id"); newTarget->width = CoreServices::getInstance()->getRenderer()->getXRes(); newTarget->height = CoreServices::getInstance()->getRenderer()->getYRes(); newTarget->sizeMode = ShaderRenderTarget::SIZE_MODE_PIXELS; if(pChildElement->Attribute("width") && pChildElement->Attribute("height")) { newTarget->width = atof(pChildElement->Attribute("width")); newTarget->height = atof(pChildElement->Attribute("height")); if(pChildElement->Attribute("sizeMode")) { if(strcmp(pChildElement->Attribute("sizeMode"), "normalized") == 0) { newTarget->sizeMode = ShaderRenderTarget::SIZE_MODE_NORMALIZED; if(newTarget->width > 1.0f) newTarget->width = 1.0f; if(newTarget->height > 1.0f) newTarget->height = 1.0f; } } } newTarget->normalizedWidth = -1; newTarget->normalizedHeight = -1; newMaterial->recreateRenderTarget(newTarget); renderTargets.push_back(newTarget); } } } } for (pChild3 = node->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) { TiXmlElement *pChild3Element = pChild3->ToElement(); if (!pChild3Element) continue; // Skip comment nodes if(strcmp(pChild3->Value(), "shader") == 0) { materialShader = setShaderFromXMLNode(resourcePool, pChild3); if(materialShader) { newShaderBinding = materialShader->createBinding(); materialShaders.push_back(materialShader); newShaderBindings.push_back(newShaderBinding); for (pChild = pChild3->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) { TiXmlElement *pChildElement = pChild->ToElement(); if (!pChildElement) continue; // Skip comment nodes if(strcmp(pChild->Value(), "params") == 0) { for (pChild2 = pChild->FirstChild(); pChild2 != 0; pChild2 = pChild2->NextSibling()) { TiXmlElement *pChild2Element = pChild2->ToElement(); if (!pChild2Element) continue; // Skip comment nodes if(strcmp(pChild2->Value(), "param") == 0){ String pname = pChild2Element->Attribute("name"); if(!CoreServices::getInstance()->getRenderer()->getDataPointerForName(pname)) { String pvalue = pChild2Element->Attribute("value"); int type = materialShader->getExpectedParamType(pname); LocalShaderParam *param = newShaderBinding->addParam(type, pname); if(param) { param->setParamValueFromString(type, pvalue); } } } } } if(strcmp(pChild->Value(), "targettextures") == 0) { for (pChild2 = pChild->FirstChild(); pChild2 != 0; pChild2 = pChild2->NextSibling()) { TiXmlElement *pChild2Element = pChild2->ToElement(); if (!pChild2Element) continue; // Skip comment nodes if(strcmp(pChild2->Value(), "targettexture") == 0){ RenderTargetBinding* newBinding = new RenderTargetBinding; newBinding->id = pChild2Element->Attribute("id"); newBinding->name = ""; if(pChild2Element->Attribute("name")) { newBinding->name = pChild2Element->Attribute("name"); } String mode = pChild2Element->Attribute("mode"); if(strcmp(mode.c_str(), "in") == 0) { newBinding->mode = RenderTargetBinding::MODE_IN; } else if(strcmp(mode.c_str(), "color") == 0) { newBinding->mode = RenderTargetBinding::MODE_COLOR; } else if(strcmp(mode.c_str(), "depth") == 0) { newBinding->mode = RenderTargetBinding::MODE_DEPTH; } else { newBinding->mode = RenderTargetBinding::MODE_OUT; } newShaderBinding->addRenderTargetBinding(newBinding); for(int l=0; l < renderTargets.size(); l++) { if(renderTargets[l]->id == newBinding->id) { printf("Assigning texture to %s\n", newBinding->id.c_str()); newBinding->texture = renderTargets[l]->texture; } } if(newBinding->mode == RenderTargetBinding::MODE_IN) { newShaderBinding->addTexture(newBinding->name, newBinding->texture); } } } } if(strcmp(pChild->Value(), "textures") == 0) { for (pChild2 = pChild->FirstChild(); pChild2 != 0; pChild2 = pChild2->NextSibling()) { TiXmlElement *pChild2Element = pChild2->ToElement(); if (!pChild2Element) continue; // Skip comment nodes if(strcmp(pChild2->Value(), "texture") == 0){ String tname = ""; if(pChild2Element->Attribute("name")) { tname = pChild2Element->Attribute("name"); } Texture *texture = CoreServices::getInstance()->getMaterialManager()->createTextureFromFile(pChild2Element->GetText()); newShaderBinding->addTexture(tname,texture); // newShaderBinding->addTexture(tname, (Texture*)CoreServices::getInstance()->getResourceManager()->getResource(Resource::RESOURCE_TEXTURE, pChild2Element->GetText())); } if(strcmp(pChild2->Value(), "cubemap") == 0){ String tname = ""; if(pChild2Element->Attribute("name")) { tname = pChild2Element->Attribute("name"); } newShaderBinding->addCubemap(tname, (Cubemap*)resourcePool->getResource(Resource::RESOURCE_CUBEMAP, pChild2Element->GetText())); } } } } } } } for(int i=0; i< materialShaders.size(); i++) { newMaterial->addShader(materialShaders[i],newShaderBindings[i]); } for(int i=0; i< renderTargets.size(); i++) { newMaterial->addShaderRenderTarget(renderTargets[i]); } return newMaterial; }