support polygon morphs

This commit is contained in:
David Rose 2004-02-26 23:00:29 +00:00
parent 9f57cfa1b2
commit 193984d955
2 changed files with 74 additions and 18 deletions

View File

@ -762,7 +762,7 @@ process_model_node(MayaNodeDesc *node_desc) {
<< "Error in node " << path << ":\n"
<< " it appears to have a polygon mesh, but does not.\n";
} else {
make_polyset(dag_path, mesh, egg_group);
make_polyset(node_desc, dag_path, mesh, egg_group);
}
}
@ -1026,7 +1026,7 @@ make_nurbs_surface(MayaNodeDesc *node_desc, const MDagPath &dag_path,
status.perror("MFnMesh constructor");
return;
}
make_polyset(polyset_path, polyset_fn, egg_group, shader);
make_polyset(node_desc, polyset_path, polyset_fn, egg_group, shader);
// Now remove the polyset we created.
MFnDagNode parent_node(polyset_parent, &status);
@ -1459,8 +1459,9 @@ make_nurbs_curve(const MDagPath &, const MFnNurbsCurve &curve,
// group.
////////////////////////////////////////////////////////////////////
void MayaToEggConverter::
make_polyset(const MDagPath &dag_path, const MFnMesh &mesh,
EggGroup *egg_group, MayaShader *default_shader) {
make_polyset(MayaNodeDesc *node_desc, const MDagPath &dag_path,
const MFnMesh &mesh, EggGroup *egg_group,
MayaShader *default_shader) {
MStatus status;
string name = mesh.name().asChar();
@ -1621,7 +1622,7 @@ make_polyset(const MDagPath &dag_path, const MFnMesh &mesh,
EggVertex vert;
MPoint p = pi.point(i, MSpace::kWorld);
LPoint3d p3d(p[0], p[1], p[2]);
LPoint3d p3d(p[0] / p[3], p[1] / p[3], p[2] / p[3]);
p3d = p3d * vertex_frame_inv;
vert.set_pos(p3d);
@ -1704,16 +1705,6 @@ make_polyset(const MDagPath &dag_path, const MFnMesh &mesh,
pi.next();
}
// TODO: We also need to compute the vertex morphs for the polyset,
// based on whatever blend shapes may be present. This should be
// similar to the code in make_nurbs_surface(), except that since we
// don't have a one-to-one relationship of egg vertices to Maya
// vertices, we probably have to get the morphs down here, after we
// have added all of the egg vertices. I'll be happy to make this
// work as soon as someone gives me a sample Maya file that
// demonstrates blend shapes with polygon meshes.
// Now that we've added all the polygons (and created all the
// vertices), go back through the vertex pool and set up the
// appropriate joint membership for each of the vertices.
@ -1751,6 +1742,72 @@ make_polyset(const MDagPath &dag_path, const MFnMesh &mesh,
}
}
}
// We also need to compute the vertex morphs for the polyset, based
// on whatever blend shapes may be present. This is similar to the
// code in make_nurbs_surface(), except that since we don't have a
// one-to-one relationship of egg vertices to Maya vertices, we have
// to get the morphs down here, after we have added all of the egg
// vertices.
if (_animation_convert == AC_model) {
int num_orig_mesh_verts = mesh.numVertices();
int num_sliders = node_desc->get_num_blend_descs();
for (int i = 0; i < num_sliders; i++) {
MayaBlendDesc *blend_desc = node_desc->get_blend_desc(i);
// Temporarily push the slider up to 1.0 so we can see what the
// surface looks like at that value.
blend_desc->set_slider(1.0);
// We have to get the mesh object from the dag again after
// fiddling with the slider.
MFnMesh blend_mesh(dag_path, &status);
if (!status) {
mayaegg_cat.warning()
<< name << " no longer has a mesh after applying "
<< blend_desc->get_name() << "\n";
} else {
if (blend_mesh.numVertices() != num_orig_mesh_verts) {
mayaegg_cat.warning()
<< "Ignoring " << blend_desc->get_name() << " for "
<< name << "; blend shape has " << blend_mesh.numVertices()
<< " vertices while original shape has "
<< num_orig_mesh_verts << ".\n";
} else {
MPointArray verts;
status = blend_mesh.getPoints(verts, MSpace::kWorld);
if (!status) {
status.perror("MFnMesh::getPoints");
} else {
int num_verts = (int)verts.length();
EggVertexPool::iterator vi;
for (vi = vpool->begin(); vi != vpool->end(); ++vi) {
EggVertex *vert = (*vi);
int maya_vi = vert->get_external_index();
nassertv(maya_vi >= 0 && maya_vi < num_verts);
const MPoint &m = verts[maya_vi];
LPoint3d m3d(m[0] / m[3], m[1] / m[3], m[2] / m[3]);
m3d = m3d * vertex_frame_inv;
LVector3d delta = m3d - vert->get_pos3();
if (!delta.almost_equal(LVector3d::zero())) {
EggMorphVertex dxyz(blend_desc->get_name(), delta);
vert->_dxyzs.insert(dxyz);
}
}
}
}
}
blend_desc->set_slider(0.0);
}
}
}
////////////////////////////////////////////////////////////////////

View File

@ -115,9 +115,8 @@ private:
void make_nurbs_curve(const MDagPath &dag_path,
const MFnNurbsCurve &curve,
EggGroup *group);
void make_polyset(const MDagPath &dag_path,
const MFnMesh &mesh,
EggGroup *egg_group,
void make_polyset(MayaNodeDesc *node_desc, const MDagPath &dag_path,
const MFnMesh &mesh, EggGroup *egg_group,
MayaShader *default_shader = NULL);
void make_locator(const MDagPath &dag_path, const MFnDagNode &dag_node,
EggGroup *egg_group);