//---------------------------------------------------------------------------- PX2::Movable *SceneBuilder::BuildMesh(INode *maxNode, PX2::Node *relatParentOrEqualNode) { // 将Max的三角形网格数据转换到一个或者更多的等价的Phoenix2三角形网格。 // // maxNode: // Max场景图中的Mesh节点。 // relatParentOrEqualNode: // 在Phoenix2场景图系统中最新创建的父亲节点。 // 返回在Phoenix2场景中指向新的孩子节点的指针,这个指针直接指向TriMesh物体; // 或者是一个“link”节点,“link”的多个孩子TriMesh代表Max中的多个孩子mesh。 bool needDel = false; TriObject *triObject = GetTriObject(maxNode, &needDel); if (!triObject) { return 0; } Mesh *maxMesh = &triObject->GetMesh(); Mtl *mtl = maxNode->GetMtl(); int mtlIndex = mMtls.GetIndex(mtl); // 判断这个Max的几何图形节点是否有“子几何图形节点”,如果有子几何图形节点 // isEqualNode为真,反之为假。 // 如果名称相等,就不是relatParentOrEqualNode了,而是equalNode PX2::Movable *link = 0; bool isEqualNode = (relatParentOrEqualNode->GetName().length()>0 && strcmp(maxNode->GetName(), relatParentOrEqualNode->GetName().c_str()) == 0); // maxName char *maxName = maxNode->GetName(); // 如果只需要一个Phoenix的Mesh表示Max的Mesh,直接将Phoenix的Mesh链接到 // Phoenix的场景图中;否则,创建一个"link"节点,将按照材质分割的子Mesh // 放在"link"下。 int i; std::vector<UniMaterialMesh*> uMeshs; SplitGeometry(maxMesh, mtlIndex, uMeshs); if ((int)uMeshs.size() > 1) { if (!isEqualNode) { link = BuildNode(maxNode, relatParentOrEqualNode); } else { link = relatParentOrEqualNode; } assertion(link->IsDerived(PX2::Node::TYPE), "link must be a Node."); for (i=0; i<(int)uMeshs.size(); i++) { PX2::TriMesh *triMesh = uMeshs[i]->ToTriMesh(); if (triMesh) { char meshNumber[6]; sprintf_s(meshNumber, 6, "_%d", i+1); size_t size = strlen(maxName) + strlen(meshNumber) + 1; char *tdName = new1<char>((int)size); strcpy_s(tdName, size, maxName); strcat_s(tdName, size, meshNumber); triMesh->SetName(tdName); delete1(tdName); ((PX2::Node*)link)->AttachChild(triMesh); } } } else if ((int)uMeshs.size() == 1) { PX2::TriMesh *triMesh = uMeshs[0]->ToTriMesh(); if (triMesh) { if (!isEqualNode) { triMesh->SetName(maxName); triMesh->LocalTransform = GetLocalTransform(maxNode, mTimeStart); } else { size_t size = strlen(maxName) + 3; char *tdName = new1<char>((int)size); strcpy_s(tdName, size, maxName); strcat_s(tdName, size, "_1"); triMesh->SetName(tdName); delete1(tdName); } assertion(relatParentOrEqualNode->IsDerived(PX2::Node::TYPE), "relatParentOrEqualNode must be a Node."); relatParentOrEqualNode->AttachChild(triMesh); link = triMesh; } } for (i=0; i<(int)uMeshs.size(); i++) { delete0(uMeshs[i]); } if (needDel) { delete0(triObject); } return link; }