void QRenderPass::copy(const QNode *ref)
{
    QNode::copy(ref);
    const QRenderPass *other = static_cast<const QRenderPass*>(ref);
    d_func()->m_shader = qobject_cast<QShaderProgram *>(QNode::clone(other->d_func()->m_shader));

    Q_FOREACH (QAnnotation *crit, other->d_func()->m_annotationList)
        addAnnotation(qobject_cast<QAnnotation *>(QNode::clone(crit)));
    Q_FOREACH (QParameterMapping *binding, other->d_func()->m_bindings)
        addBinding(qobject_cast<QParameterMapping *>(QNode::clone(binding)));
    Q_FOREACH (QRenderState *renderState, other->d_func()->m_renderStates)
        addRenderState(qobject_cast<QRenderState *>(QNode::clone(renderState)));
}
Example #2
0
File: Mz.cpp Project: cpzhang/zen
void Mz::saveMaterial( const std::string& fileName )
{
	Material::initRenderStateDefault();
	std::string parentPath/* = FileSystem::getParent*/(fileName);
	std::string parentPathOld = FileSystem::getParent(mzFileName_);
	for (size_t i = 0; i != mMaterials.size(); ++i)
	{
		sMat& s = mMaterials[i];
		std::string path = fileName + "\\" + s.mName + ".material";
		std::string imagePathOld = parentPathOld + "\\" + s.mTextureName;
		std::string imagePathNew = parentPath + "\\" + s.mTextureName;
		FileSystem::createFolder(imagePathNew);
		CopyFile(imagePathOld.c_str(), imagePathNew.c_str(), false);
		//============================================================================
		tinyxml2::XMLDocument doc;
		// 
		tinyxml2::XMLDeclaration* dec = doc.NewDeclaration("xml version=\"1.0\"");
		doc.LinkEndChild(dec);
		//
		tinyxml2::XMLElement* ele = doc.NewElement("material");
		ele->SetAttribute("name", s.mName.c_str());
		{
			tinyxml2::XMLElement* a = doc.NewElement("Fx");
			a->SetAttribute("file", "shader/aPTSkin.fx");
			ele->LinkEndChild(a);
		}
		{
			tinyxml2::XMLElement* a = doc.NewElement("Texture");
			a->SetAttribute("name", "g_Texture0");
			std::string fileName;//("image");
			//fileName += "\\";
			fileName = s.mTextureName;
			a->SetAttribute("file", fileName.c_str());
			ele->LinkEndChild(a);
		}
		//保存非默认值,首先过滤
		addRenderState(doc, ele, D3DRS_ZENABLE, s.mZEnable);
		addRenderState(doc, ele, D3DRS_ZWRITEENABLE, s.mZWriteEnable);
		addRenderState(doc, ele, D3DRS_ALPHATESTENABLE, s.mAlphaTestEnable);
		addRenderState(doc, ele, D3DRS_CULLMODE, s.mCullMode);
		addRenderState(doc, ele, D3DRS_ALPHAREF, s.mAlphaRef);
		if (s.mAlphaTestEnable)
		{
			addRenderState(doc, ele, D3DRS_ALPHAREF, s.mAlphaRef);
			addRenderState(doc, ele, D3DRS_ALPHAFUNC, s.mCmpFunc);
		}
		if (s.mSrcBlend == D3DBLEND_ONE && s.mDestBlend == D3DBLEND_ZERO)
		{
			addRenderState(doc, ele, D3DRS_ALPHABLENDENABLE, false);
		}
		else
		{
			addRenderState(doc, ele, D3DRS_ALPHABLENDENABLE, true);
			addRenderState(doc, ele, D3DRS_SRCBLEND, s.mSrcBlend);
			addRenderState(doc, ele, D3DRS_DESTBLEND, s.mDestBlend);
		}
		//TextureStageState
		if (mVersion >= 30)
		{
			if (mUseVertexColor)
			{
				addTextureStageState(doc, ele, 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
				addTextureStageState(doc, ele, 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
				addTextureStageState(doc, ele, 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );

				addTextureStageState(doc, ele, 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
				addTextureStageState(doc, ele, 0, D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
				addTextureStageState(doc, ele, 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);

				addTextureStageState(doc, ele, 1, D3DTSS_COLOROP, D3DTOP_MODULATE);
				addTextureStageState(doc, ele, 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
				addTextureStageState(doc, ele, 1, D3DTSS_COLORARG2, D3DTA_TFACTOR );

				addTextureStageState(doc, ele, 1, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
				addTextureStageState(doc, ele, 1, D3DTSS_ALPHAARG1,D3DTA_CURRENT );
				addTextureStageState(doc, ele, 1, D3DTSS_ALPHAARG2, D3DTA_TFACTOR );

				addTextureStageState(doc, ele, 1, D3DTSS_TEXCOORDINDEX, 1);		//默认值为1
			}
			else
			{
				addTextureStageState(doc, ele, 0, D3DTSS_ALPHAOP,	D3DTOP_MODULATE);
				addTextureStageState(doc, ele, 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
				addTextureStageState(doc, ele, 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);

				addTextureStageState(doc, ele, 0, D3DTSS_COLOROP,	D3DTOP_MODULATE);
				addTextureStageState(doc, ele, 0, D3DTSS_COLORARG1,D3DTA_TEXTURE);
				addTextureStageState(doc, ele, 0, D3DTSS_COLORARG2,D3DTA_TFACTOR);
			}
		}
		else
		{
			if (mUseVertexColor)
			{
				addTextureStageState(doc, ele, 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
				addTextureStageState(doc, ele, 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
				addTextureStageState(doc, ele, 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );

				addTextureStageState(doc, ele, 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
				addTextureStageState(doc, ele, 0, D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
				addTextureStageState(doc, ele, 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);

				addTextureStageState(doc, ele, 1, D3DTSS_COLOROP, D3DTOP_MODULATE);
				addTextureStageState(doc, ele, 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
				addTextureStageState(doc, ele, 1, D3DTSS_COLORARG2, D3DTA_TFACTOR );

				addTextureStageState(doc, ele, 1, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
				addTextureStageState(doc, ele, 1, D3DTSS_ALPHAARG1,D3DTA_CURRENT );
				addTextureStageState(doc, ele, 1, D3DTSS_ALPHAARG2, D3DTA_TFACTOR );

				addTextureStageState(doc, ele, 1, D3DTSS_TEXCOORDINDEX, 1);		//默认值为1
			}
			else
			{
				addTextureStageState(doc, ele, 0, D3DTSS_ALPHAOP,	D3DTOP_MODULATE);
				addTextureStageState(doc, ele, 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
				addTextureStageState(doc, ele, 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);

				addTextureStageState(doc, ele, 0, D3DTSS_COLOROP,	D3DTOP_MODULATE);
				addTextureStageState(doc, ele, 0, D3DTSS_COLORARG1,D3DTA_TEXTURE);
				addTextureStageState(doc, ele, 0, D3DTSS_COLORARG2,D3DTA_TFACTOR);
			}
		}
		// 
		if (s.mFlowU || s.mScale || s.mRotate || s.mRows > 1 || s.mCols > 1)
		{
			//addTextureStageState(doc, ele, 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
		}
		doc.LinkEndChild(ele);
		//
		addKeyFrame<float>(doc, ele, "Alpha", s.mAlphaKFs);
		addKeyFrame<Vector3>(doc, ele, "Color", s.mColorKFs);
		if (s.mFlowU)
		{
			addKeyFrame<float>(doc, ele, "FlowU", s.mFlowUKFs);
		}
		if (s.mFlowV)
		{
			addKeyFrame<float>(doc, ele, "FlowV", s.mFlowVKFs);
		}
		if (s.mRotate)
		{
			addKeyFrame<float>(doc, ele, "Angle", s.mRotationKFs);
		}
		//addKeyFrame<Vector3>(doc, ele, "Scale", s.mScaleKFs);
		if (s.mRows > 1 || s.mCols > 1)
		{
			tinyxml2::XMLElement* a = doc.NewElement("UVSequence");
			a->SetAttribute("Rows", s.mRows);
			a->SetAttribute("Cols", s.mCols);
			a->SetAttribute("Interval", s.mChangeInterval);
			a->SetAttribute("Style", s.mChangeStyle);
			ele->LinkEndChild(a);
		}

		//
		doc.SaveFile(path.c_str());
	}
}