bool HesperisPolygonalMeshIO::CreateMeshData(APolygonalMesh * data, const MDagPath & path) { MGlobal::displayInfo(MString("todo poly mesh write ")+path.fullPathName()); MStatus stat; MFnMesh fmesh(path.node(), &stat); if(!stat) { MGlobal::displayInfo(MString(" not a mesh ") + path.fullPathName()); return false; } unsigned np = fmesh.numVertices(); unsigned nf = fmesh.numPolygons(); unsigned ni = fmesh.numFaceVertices(); data->create(np, ni, nf); Vector3F * pnts = data->points(); unsigned * inds = data->indices(); unsigned * cnts = data->faceCounts(); MPointArray ps; MPoint wp; MMatrix worldTm; worldTm = GetWorldTransform(path); fmesh.getPoints(ps, MSpace::kObject); unsigned i = 0; for(;i<np;i++) { wp = ps[i] * worldTm; pnts[i].set((float)wp.x, (float)wp.y, (float)wp.z); } unsigned j; unsigned acc = 0; MIntArray vertices; MItMeshPolygon faceIt(path); for(i=0; !faceIt.isDone(); faceIt.next(), i++) { cnts[i] = faceIt.polygonVertexCount(); faceIt.getVertices(vertices); for(j = 0; j < vertices.length(); j++) { inds[acc] = vertices[j]; acc++; } } data->computeFaceDrift(); return true; }
bool SargassoNode::updateShape(const MObject & m) { MStatus stat; MFnMesh fmesh(m, &stat); if(!stat) { MGlobal::displayInfo("val is not mesh"); return false; } MPointArray ps; fmesh.getPoints(ps, MSpace::kWorld); const unsigned n = m_mesh->numPoints(); Vector3F * p = m_mesh->points(); unsigned i=0; for(;i<n;i++) p[i].set(ps[i].x, ps[i].y, ps[i].z); m_diff->computeQ(m_mesh); // MGlobal::displayInfo("update mesh"); return true; }
bool HesperisIO::CreateMeshGroup(const MDagPathArray & paths, ATriangleMeshGroup * dst) { MStatus stat; unsigned i, j; int numPnts = 0; unsigned numNodes = 0; unsigned numTris = 0; // MGlobal::displayInfo(" hesperis check meshes"); MIntArray triangleCounts, triangleVertices; MPointArray ps; MPoint wp; MMatrix worldTm; const unsigned n = paths.length(); for(i=0; i<n; i++) { MFnMesh fmesh(paths[i].node(), &stat); if(!stat) continue; numNodes++; numPnts += fmesh.numVertices(); fmesh.getTriangles(triangleCounts, triangleVertices); numTris += triangleVertices.length() / 3; } if(numNodes < 1 || numTris < 1) { MGlobal::displayInfo(" insufficient mesh data"); return false; } //MGlobal::displayInfo(MString(" mesh count: ") + numNodes + // MString(" vertex count: ") + numPnts + // MString(" triangle count: ") + numTris); dst->create(numPnts, numTris, numNodes); Vector3F * pnts = dst->points(); unsigned * inds = dst->indices(); unsigned * pntDrift = dst->pointDrifts(); unsigned * indDrift = dst->indexDrifts(); unsigned pDrift = 0; unsigned iDrift = 0; unsigned iNode = 0; for(i=0; i<n; i++) { MFnMesh fmesh(paths[i].node(), &stat); if(!stat) continue; //MGlobal::displayInfo(fmesh.name()); //MGlobal::displayInfo(MString("p drift ")+pDrift+ // MString("i drift ")+iDrift); worldTm = AHelper::GetWorldTransformMatrix(paths[i]); fmesh.getPoints(ps, MSpace::kObject); fmesh.getTriangles(triangleCounts, triangleVertices); for(j=0; j<fmesh.numVertices(); j++) { wp = ps[j] * worldTm - GlobalReferencePoint; pnts[pDrift + j].set((float)wp.x, (float)wp.y, (float)wp.z); } for(j=0; j<triangleVertices.length(); j++) inds[iDrift + j] = pDrift + triangleVertices[j]; pntDrift[iNode] = pDrift; indDrift[iNode] = iDrift; pDrift += fmesh.numVertices(); iDrift += triangleVertices.length(); iNode++; } return true; }
bool SargassoNode::creatRestShape(const MObject & m) { MStatus stat; MFnMesh fmesh(m, &stat); if(!stat) { MGlobal::displayInfo("val is not mesh"); return false; } MObject thisObj = thisMObject(); MPlug pnv(thisObj, atargetNv); const int restNv = pnv.asInt(); if(restNv != fmesh.numVertices()) { MGlobal::displayInfo("target nv not match"); return false; } MPlug pntriv(thisObj, atargetNt); const int restNtriv = pntriv.asInt(); MIntArray triangleCounts, triangleVertices; fmesh.getTriangles(triangleCounts, triangleVertices); if(restNtriv != triangleVertices.length()) { MGlobal::displayInfo("target ntri not match"); return false; } m_mesh->create(restNv, restNtriv/3); MPlug prestp(thisObj, atargetRestP); MObject orestp; prestp.getValue(orestp); MFnPointArrayData frestp(orestp); MPointArray restPArray = frestp.array(); if(restPArray.length() != restNv) { MGlobal::displayInfo("cached target nv not match"); return false; } Vector3F * p = m_mesh->points(); unsigned i=0; for(;i<restNv;i++) p[i].set(restPArray[i].x, restPArray[i].y, restPArray[i].z); MPlug presttri(thisObj, atargetTri); MObject oresttri; presttri.getValue(oresttri); MFnIntArrayData fresttri(oresttri); MIntArray restTriArray = fresttri.array(); if(restTriArray.length() != restNtriv) { MGlobal::displayInfo("cached target ntri not match"); return false; } unsigned * ind = m_mesh->indices(); for(i=0;i<restNtriv;i++) ind[i] = restTriArray[i]; const BoundingBox box = ((AGenericMesh *)m_mesh)->calculateBBox(); AHelper::Info<BoundingBox>("target mesh box", box); m_diff = new TriangleDifference(m_mesh); MPlug ptargetbind(thisObj, atargetBind); MObject otargetbind; ptargetbind.getValue(otargetbind); MFnIntArrayData ftargetbind(otargetbind); MIntArray targetBindArray = ftargetbind.array(); const unsigned nbind = targetBindArray.length(); AHelper::Info<unsigned>("n binded triangles", nbind); std::vector<unsigned> vbind; for(i=0;i<nbind;i++) vbind.push_back(targetBindArray[i]); m_diff->requireQ(vbind); vbind.clear(); MPlug pobjLocal(thisObj, aobjLocal); MObject oobjLocal; pobjLocal.getValue(oobjLocal); MFnVectorArrayData fobjLocal(oobjLocal); MVectorArray localPArray = fobjLocal.array(); m_numObjects = localPArray.length(); AHelper::Info<unsigned>("n constrained objects", m_numObjects); m_localP->create(m_numObjects * 12); Vector3F * lp = localP(); for(i=0;i<m_numObjects;i++) lp[i].set(localPArray[i].x, localPArray[i].y, localPArray[i].z); m_triId->create(m_numObjects * 4); MPlug pobjtri(thisObj, aobjTri); MObject oobjtri; pobjtri.getValue(oobjtri); MFnIntArrayData fobjtri(oobjtri); MIntArray objtriArray = fobjtri.array(); unsigned * tri = objectTriangleInd(); for(i=0;i<m_numObjects;i++) tri[i] = objtriArray[i]; return true; }