Beispiel #1
0
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();
	}*/
}