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))); }
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()); } }