INode* plDistribComponent_old::IMakeOne(plDistribInstTab& nodes) { if( !nodes.Count() ) return nil; int iStartNode = 0; NameMaker *nn = GetCOREInterface()->NewNameMaker(); while( iStartNode < nodes.Count() ) { TriObject* triObj = CreateNewTriObject(); Mesh* outMesh = &triObj->mesh; *outMesh = *nodes[iStartNode].fMesh; INode *outNode = GetCOREInterface()->CreateObjectNode(triObj); Matrix3 l2w = nodes[0].fObjectTM; Matrix3 w2l = Inverse(l2w); MeshDelta meshDelta(*outMesh); int i; for( i = iStartNode; i < nodes.Count(); i++ ) { Mesh* nextMesh = nodes[i].fMesh; Matrix3 relativeTransform = nodes[i].fObjectTM * w2l; meshDelta.AttachMesh(*outMesh, *nextMesh, relativeTransform, 0); meshDelta.Apply(*outMesh); const int kFaceCutoff = 1000; if( outMesh->getNumFaces() > kFaceCutoff ) break; } iStartNode = i; outNode->SetNodeTM(TimeValue(0), l2w); outNode->CopyProperties(nodes[0].fNode); outNode->SetMtl(nodes[0].fNode->GetMtl()); outNode->SetObjOffsetPos(Point3(0,0,0)); Quat identQuat; identQuat.Identity(); outNode->SetObjOffsetRot(identQuat); outNode->SetObjOffsetScale(ScaleValue(Point3(1.f, 1.f, 1.f))); TSTR outName(TSTR("Preview")); nn->MakeUniqueName(outName); outNode->SetName(outName); fCompPB->Append(kReplicants, 1, &outNode); } return nil; }
BOOL plDistributor::IDuplicate2Sided(plMaxNode* node, Mesh* mesh) const { Mtl* mtl = node->GetMtl(); BitArray faces(mesh->getNumFaces()); int num2Sided = 0; int origNumFaces = mesh->getNumFaces(); int i; for( i = 0; i < mesh->getNumFaces(); i++ ) { if( hsMaterialConverter::IsTwoSided(mtl, mesh->faces[i].getMatID()) ) { num2Sided++; faces.Set(i); } } if( !num2Sided ) return false; MeshDelta meshDelta(*mesh); meshDelta.CloneFaces(*mesh, faces); meshDelta.Apply(*mesh); BitArray verts(mesh->getNumVerts()); verts.SetAll(); const float kWeldThresh = 0.1f; meshDelta.WeldByThreshold(*mesh, verts, kWeldThresh); meshDelta.Apply(*mesh); hsAssert(origNumFaces + num2Sided == mesh->getNumFaces(), "Whoa, lost or gained, unexpected"); for( i = origNumFaces; i < mesh->getNumFaces(); i++ ) { meshDelta.FlipNormal(*mesh, i); } meshDelta.Apply(*mesh); return true; }