Browse Source

animate normals in blendshapes too

David Rose 13 years ago
parent
commit
15b55b2183

+ 25 - 0
panda/src/egg/eggVertex.I

@@ -377,6 +377,31 @@ get_external_index() const {
   return _external_index;
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: EggVertex::set_external_index2
+//       Access: Published
+//  Description: Similar to set_external_index(), but this is a
+//               different number which may be used for a different
+//               purpose by the calling code.  The egg library does
+//               not assign any meaning to this number or use it in
+//               any way.
+////////////////////////////////////////////////////////////////////
+INLINE void EggVertex::
+set_external_index2(int external_index2) {
+  _external_index2 = external_index2;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: EggVertex::get_external_index2
+//       Access: Published
+//  Description: Returns the number set by set_external_index2().  See
+//               set_external_index2().
+////////////////////////////////////////////////////////////////////
+INLINE int EggVertex::
+get_external_index2() const {
+  return _external_index2;
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: EggVertex::sorts_less_than
 //       Access: Published

+ 6 - 0
panda/src/egg/eggVertex.cxx

@@ -41,6 +41,7 @@ EggVertex() {
   _forward_reference = false;
   _index = -1;
   _external_index = -1;
+  _external_index2 = -1;
   set_pos(LPoint3d(0.0, 0.0, 0.0));
   test_pref_integrity();
   test_gref_integrity();
@@ -57,6 +58,7 @@ EggVertex(const EggVertex &copy)
   : EggObject(copy), EggAttributes(copy),
     _dxyzs(copy._dxyzs),
     _external_index(copy._external_index),
+    _external_index2(copy._external_index2),
     _pos(copy._pos),
     _num_dimensions(copy._num_dimensions),
     _uv_map(copy._uv_map),
@@ -82,6 +84,7 @@ operator = (const EggVertex &copy) {
   EggAttributes::operator = (copy);
   _dxyzs = copy._dxyzs;
   _external_index = copy._external_index;
+  _external_index2 = copy._external_index2;
   _pos = copy._pos;
   _num_dimensions = copy._num_dimensions;
   _uv_map = copy._uv_map;
@@ -506,6 +509,9 @@ compare_to(const EggVertex &other) const {
   if (_external_index != other._external_index) {
     return (int)_external_index - (int)other._external_index;
   }
+  if (_external_index2 != other._external_index2) {
+    return (int)_external_index2 - (int)other._external_index2;
+  }
   if (_num_dimensions != other._num_dimensions) {
     return (int)_num_dimensions - (int)other._num_dimensions;
   }

+ 3 - 1
panda/src/egg/eggVertex.h

@@ -123,6 +123,8 @@ PUBLISHED:
 
   INLINE void set_external_index(int external_index);
   INLINE int get_external_index() const;
+  INLINE void set_external_index2(int external_index2);
+  INLINE int get_external_index2() const;
 
   void write(ostream &out, int indent_level) const;
   INLINE bool sorts_less_than(const EggVertex &other) const;
@@ -166,7 +168,7 @@ private:
   EggVertexPool *_pool;
   bool _forward_reference;
   int _index;
-  int _external_index;
+  int _external_index, _external_index2;
   LPoint4d _pos;
   short _num_dimensions;
   GroupRef _gref;

+ 25 - 0
pandatool/src/mayaegg/mayaToEggConverter.cxx

@@ -2032,6 +2032,7 @@ make_polyset(MayaNodeDesc *node_desc, const MDagPath &dag_path,
       }
 
       vert.set_external_index(pi.vertexIndex(i, &status));
+      vert.set_external_index2(pi.normalIndex(i, &status));
 
       egg_poly->add_vertex(vpool->create_unique_vertex(vert));
     }
@@ -2169,6 +2170,30 @@ make_polyset(MayaNodeDesc *node_desc, const MDagPath &dag_path,
               }
             }
           }
+
+          MFloatVectorArray norms;
+          status = blend_mesh.getNormals(norms, MSpace::kWorld);
+          if (!status) {
+            status.perror("MFnMesh::getNormals");
+          } else {
+            int num_norms = (int)norms.length();
+            EggVertexPool::iterator vi;
+            for (vi = vpool->begin(); vi != vpool->end(); ++vi) {
+              EggVertex *vert = (*vi);
+              int maya_vi = vert->get_external_index2();
+              nassertv(maya_vi >= 0 && maya_vi < num_norms);
+              
+              const MFloatVector &m = norms[maya_vi];
+              LVector3d m3d(m[0], m[1], m[2]);
+              m3d = m3d * vertex_frame_inv;
+              
+              LNormald delta = m3d - vert->get_normal();
+              if (!delta.almost_equal(LVector3d::zero())) {
+                EggMorphNormal dnormal(blend_desc->get_name(), delta);
+                vert->_dnormals.insert(dnormal);
+              }
+            }
+          }
         }
       }