//---------------------------------------------------------------------------- TriMesh *UniMaterialMesh::ToTriMesh() { if (mVertexMapQuantity == 0) return 0; // VertexBuffer VertexFormat *vFormat = new0 VertexFormat(); vFormat->Add(VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0); if (mNormalMap) { vFormat->Add(VertexFormat::AU_NORMAL, VertexFormat::AT_FLOAT3, 0); } if (mExportTargentBinormal) { vFormat->Add(VertexFormat::AU_TANGENT, VertexFormat::AT_FLOAT3, 0); vFormat->Add(VertexFormat::AU_BINORMAL, VertexFormat::AT_FLOAT3, 0); } if (mExportColor) { vFormat->Add(VertexFormat::AU_COLOR, VertexFormat::AT_FLOAT4, 0); } if (mTextureCoordMap) { if (1 == mNumTexcoordToExport) { vFormat->Add(VertexFormat::AU_TEXCOORD, VertexFormat::AT_FLOAT2, 0); } else if (2 == mNumTexcoordToExport) { vFormat->Add(VertexFormat::AU_TEXCOORD, VertexFormat::AT_FLOAT2, 0); vFormat->Add(VertexFormat::AU_TEXCOORD, VertexFormat::AT_FLOAT2, 1); } } if (mExportSkin) { vFormat->Add(VertexFormat::AU_TEXCOORD, VertexFormat::AT_FLOAT4, 1); vFormat->Add(VertexFormat::AU_TEXCOORD, VertexFormat::AT_FLOAT4, 2); } vFormat->Create(); PX2::VertexBuffer *vBuffer = new0 PX2::VertexBuffer(mVertexMapQuantity, vFormat->GetStride()); VertexBufferAccessor vBA(vFormat, vBuffer); for (int i=0; i<mVertexMapQuantity; i++) { vBA.Position<Float3>(i) = mVertexMap[i]; if (mNormalMap) { vBA.Normal<Float3>(i) = mNormalMap[i]; } if (mColorMap) { vBA.Color<Float4>(0, i) = Float4(mColorMap[i][0], mColorMap[i][1], mColorMap[i][2], mColorMap[i][3]); } else { if (mExportColor) vBA.Color<Float4>(0, i) = Float4::WHITE; } if (mAlphaMap) { vBA.Color<Float4>(0, i) = Float4(mColorMap[i][0], mColorMap[i][1], mColorMap[i][2], mAlphaMap[i]); } if (mTextureCoordMap) { if (mNumTexcoordToExport == 1) { vBA.TCoord<Float2>(0, i) = Float2(mTextureCoordMap[i][0], 1.0f-mTextureCoordMap[i][1]); } else if (mNumTexcoordToExport == 2) { Float2 texCoord0 = Float2(mTextureCoordMap[i][0], 1.0f-mTextureCoordMap[i][1]); vBA.TCoord<Float2>(0, i) = texCoord0; if (mTextureCoordMap1) { vBA.TCoord<Float2>(1, i) = Float2(mTextureCoordMap1[i][0], 1.0f-mTextureCoordMap1[i][1]); } else { vBA.TCoord<Float2>(1, i) = texCoord0; } } } } // IndexBuffer IndexBuffer *iBuffer = new0 IndexBuffer(3*mFQuantity, 2); unsigned short *iData = (unsigned short*)iBuffer->GetData(); for (int i=0; i<(int)3*mFQuantity; i++) { iData[i] = (unsigned short)mVFace[i]; } // 创建Mesh TriMesh *triMesh = new0 TriMesh(vFormat, vBuffer, iBuffer); triMesh->UpdateModelSpace(Renderable::GU_MODEL_BOUND_ONLY); if (mExportTargentBinormal) { triMesh->UpdateModelSpace(Renderable::GU_USE_GEOMETRY); } MaterialInstance *mi = 0; mi = mMaterialInstance; triMesh->SetMaterialInstance(mi); triMesh->SetShine(mShine); return triMesh; }