void Material::Configure(PersistentData& storageData) { mUseRenderTarget = false; mDiffuse = storageData.GetColorChild("Diffuse"); mSpecular = storageData.GetColorChild("Specular"); mAmbient = storageData.GetColorChild("Ambient"); mEmissive = storageData.GetColorChild("Emissive"); mColorMask = storageData.GetColorChild("ColorMask"); if(mColorMask != IvColor::white) { mUseColorMask = true; } mZWrite = !storageData.GetPropertyB("DisableZWrite"); mZTest = !storageData.GetPropertyB("DisableZTest"); PersistentData* texturesParent = storageData.GetNodeFromPath("Textures"); if(texturesParent != NULL) { ClearTextures(); std::list<PersistentData*> textures; texturesParent->GetNodesFromPath("Texture",textures); std::list<PersistentData*>::iterator txtIt = textures.begin(); while(txtIt != textures.end()) { PersistentData* txNode = *txtIt; ////////////////////////// mRenderTargetTag = txNode->GetProperty("UseRenderTarget"); if(mRenderTargetTag.empty() == false) { RenderTarget* rt = (RenderTarget*)Game::GetInstance().GetTaggedObject(mRenderTargetTag); if(rt != NULL) { mUseRenderTarget = true; AddTexture(rt->GetTextureID()); } else { printf("ERROR: Material '%s' wants to use non-existent render target: %s\n",mName.c_str(),mRenderTargetTag.c_str()); } } else { std::string imagename = txNode->GetProperty("ImageName"); bool delayLoad = txNode->GetPropertyB("DelayLoad"); GameID texID = RendererObjectFactory::CreateTexture(imagename.c_str(),imagename.c_str(),delayLoad); AddTexture(texID); } ////////////////////////// ++txtIt; } } PersistentData* tmParent = storageData.GetNodeFromPath("TextureMatrices"); if(tmParent != NULL) { std::list<PersistentData*> textureMatrices; tmParent->GetNodesFromPath("TextureMatrix",textureMatrices); IvVector3 pos, scale, rot; int idx = 0; std::list<PersistentData*>::iterator tmNodeIt = textureMatrices.begin(); while(tmNodeIt != textureMatrices.end()) { PersistentData* tmNode =*tmNodeIt; if(tmNode != NULL){ //mUseTextureMatrix = true; if(tmNode->GetNodeFromPath("Position") != NULL) { pos = tmNode->GetVector3Child("Position"); TranslateTextureMatrix(pos,idx); } if(storageData.GetNodeFromPath("Rotation") != NULL) { rot = tmNode->GetVector3Child("Rotation"); RotateTextureMatrix(rot.x,rot.y,rot.z,idx); } if(tmNode->GetNodeFromPath("Scale") != NULL) { scale = tmNode->GetVector3Child("Scale"); ScaleTextureMatrix(scale,idx); } } ++idx; ++tmNodeIt; } } PersistentData* tc = storageData.GetNodeFromPath("TextureCombiners"); if(tc != NULL) { ConfigureCombiners(*tc); } std::string blendFunc; Renderer& rend = Game::GetInstance().GetRenderer(); PersistentData* blend = storageData.GetNodeFromPath("Blend"); mBlend = blend->GetPropertyB("Enabled"); blendFunc = blend->GetProperty("FuncA"); mBlendFuncA = rend.GetEnumForString(blendFunc); blendFunc = blend->GetProperty("FuncB"); mBlendFuncB = rend.GetEnumForString(blendFunc); std::string alphaFunc; PersistentData* alphaTest = storageData.GetNodeFromPath("AlphaTest"); if(alphaTest != NULL) { mUseAlphaTest = alphaTest->GetPropertyB("Enabled"); mAlphaFuncTestValue = alphaTest->GetPropertyF("value"); alphaFunc = alphaTest->GetProperty("Func"); mAlphaFunc = rend.GetEnumForString(alphaFunc); } /* //Causes Crash on 3.0 Release but not 3.0 debug PersistentData* shaderInfo = storageData.GetNodeFromPath("Shaders"); if(shaderInfo != NULL) { mVertexShaderPath = shaderInfo->GetProperty("vertex"); mFragmentShaderPath = shaderInfo->GetProperty("fragment"); SetupShaders(); }*/ }