From 1c40af594fba25b763cab0220d12c2dba7161804 Mon Sep 17 00:00:00 2001 From: Josh Yelon Date: Mon, 1 Aug 2005 19:06:26 +0000 Subject: [PATCH] Now loads joints (but not skin clusters) --- pandatool/src/mayaeggimport/mayaEggLoader.cxx | 174 ++++++++++-------- 1 file changed, 99 insertions(+), 75 deletions(-) diff --git a/pandatool/src/mayaeggimport/mayaEggLoader.cxx b/pandatool/src/mayaeggimport/mayaEggLoader.cxx index 9f05bbcc9f..c088855a30 100755 --- a/pandatool/src/mayaeggimport/mayaEggLoader.cxx +++ b/pandatool/src/mayaeggimport/mayaEggLoader.cxx @@ -56,6 +56,9 @@ #include #include #include +#include +#include +#include #include "post_maya_include.h" #include "mayaEggLoader.h" @@ -112,14 +115,28 @@ MFloatPoint ConvertCoordSys(CoordinateSystem sys, LVector3d vec) class MayaEggTex { public: + string _name; string _path; MObject _file_texture; MObject _shader; MObject _shading_group; MFnSingleIndexedComponent _component; + void AssignNames(void); }; +void MayaEggTex::AssignNames(void) +{ + if (_name == "") return; + MFnDependencyNode shader(_shader); + MFnDependencyNode sgroup(_shading_group); + MFnDependencyNode filetex(_file_texture); + shader.setName(MString(_name.c_str())+"Shader"); + sgroup.setName(MString(_name.c_str())); + if (_file_texture != MObject::kNullObj) + filetex.setName(MString(_name.c_str())+"File"); +} + MayaEggTex *MayaEggLoader::GetTex(const string &name, const string &fn) { if (_tex_tab.count(fn)) @@ -129,33 +146,41 @@ MayaEggTex *MayaEggLoader::GetTex(const string &name, const string &fn) MFnLambertShader shader; MFnDependencyNode filetex; MFnSet sgroup; - MPlugArray oldplugs; - MDGModifier dgmod; - shader.create(true,&status); - shader.setName(MString(name.c_str())+"Shader"); - sgroup.create(MSelectionList(), MFnSet::kRenderableOnly, &status); - sgroup.setName(MString(name.c_str())); - MPlug surfplug = sgroup.findPlug("surfaceShader"); - if (surfplug.connectedTo(oldplugs,true,false)) { - for (int i=0; i_name = name; res->_path = fn; res->_file_texture = filetex.object(); res->_shader = shader.object(); @@ -178,10 +203,9 @@ public: LVector3d _endpos; LVector3d _perp; double _thickness; - // bool _inskin; - // SimpleObject2 *_bone; - // INode *_node; - EggGroup *_egg_joint; + MObject _joint; + MMatrix _joint_abs; + EggGroup *_egg_joint; MayaEggJoint *_parent; vector _children; @@ -193,8 +217,16 @@ public: MayaEggJoint *ChooseBestChild(LVector3d dir); void ChooseEndPos(double thickness); void CreateMayaBone(CoordinateSystem sys); + void AssignNames(void); }; +void MayaEggJoint::AssignNames(void) +{ + string name = _egg_joint->get_name(); + MFnDependencyNode joint(_joint); + joint.setName(name.c_str()); +} + MayaEggJoint *MayaEggLoader::FindJoint(EggGroup *joint) { if (joint==0) return 0; @@ -214,11 +246,9 @@ MayaEggJoint *MayaEggLoader::MakeJoint(EggGroup *joint, EggGroup *context) result->_endpos = LVector3d(0,0,0); result->_perp = LVector3d(0,0,0); result->_thickness = 0.0; - // result->_inskin = false; - // result->_bone = 0; - // result->_node = 0; result->_egg_joint = joint; result->_parent = parent; + result->_joint = MObject::kNullObj; if (parent) parent->_children.push_back(result); _joint_tab[joint] = result; return result; @@ -286,42 +316,27 @@ void MayaEggJoint::ChooseEndPos(double thickness) void MayaEggJoint::CreateMayaBone(CoordinateSystem sys) { - // Point3 xv(ConvertCoordSys(sys, GetXV())); - // Point3 yv(ConvertCoordSys(sys, GetYV())); - // Point3 zv(ConvertCoordSys(sys, GetZV())); - // Point3 pos(ConvertCoordSys(sys, GetPos())); - // Point3 endpos(ConvertCoordSys(sys, _endpos)); - // Point3 tzv(ConvertCoordSys(sys, _perp)); - // - // Point3 fwd = endpos - pos; - // double len = fwd.Length(); - // Point3 txv = fwd * ((float)(1.0/len)); - // Point3 tyv = tzv ^ txv; - // Point3 row1 = Point3(txv % xv, txv % yv, txv % zv); - // Point3 row2 = Point3(tyv % xv, tyv % yv, tyv % zv); - // Point3 row3 = Point3(tzv % xv, tzv % yv, tzv % zv); - // Matrix3 oomat(row1,row2,row3,Point3(0,0,0)); - // Quat ooquat(oomat); - // _bone = (SimpleObject2*)CreateInstance(GEOMOBJECT_CLASS_ID, BONE_OBJ_CLASSID); - // _node = GetCOREInterface()->CreateObjectNode(_bone); - // _node->SetNodeTM(0, Matrix3(xv, yv, zv, pos)); - // IParamBlock2 *blk = _bone->pblock2; - // for (int i=0; iNumParams(); i++) { - // TSTR n = blk->GetLocalName(i); - // if (strcmp(n, "Length")==0) blk->SetValue(i,0,(float)len); - // else if (strcmp(n, "Width")==0) blk->SetValue(i,0,(float)_thickness); - // else if (strcmp(n, "Height")==0) blk->SetValue(i,0,(float)_thickness); - // } - // Point3 boneColor = GetUIColor(COLOR_BONES); - // _node->SetWireColor(RGB(int(boneColor.x*255.0f), int(boneColor.y*255.0f), int(boneColor.z*255.0f) )); - // _node->SetBoneNodeOnOff(TRUE, 0); - // _node->SetRenderable(FALSE); - // _node->SetName((TCHAR*)(_egg_joint->get_name().c_str())); - // _node->SetObjOffsetRot(ooquat); - // if (_parent) { - // _node->Detach(0, 1); - // _parent->_node->AttachChild(_node, 1); - // } + MFloatPoint xv(ConvertCoordSys(sys, GetXV())); + MFloatPoint yv(ConvertCoordSys(sys, GetYV())); + MFloatPoint zv(ConvertCoordSys(sys, GetZV())); + MFloatPoint pos(ConvertCoordSys(sys, GetPos())); + MFloatPoint endpos(ConvertCoordSys(sys, _endpos)); + MFloatPoint tzv(ConvertCoordSys(sys, _perp)); + + double m[4][4]; + m[0][0]=xv.x; m[0][1]=xv.y; m[0][2]=xv.z; m[0][3]=0; + m[1][0]=yv.x; m[1][1]=yv.y; m[1][2]=yv.z; m[1][3]=0; + m[2][0]=zv.x; m[2][1]=zv.y; m[2][2]=zv.z; m[2][3]=0; + m[3][0]=pos.x; m[3][1]=pos.y; m[3][2]=pos.z; m[3][3]=1; + MMatrix trans(m); + _joint_abs = trans; + if (_parent) trans = trans * _parent->_joint_abs.inverse(); + MTransformationMatrix mtm(trans); + MFnIkJoint ikj; + if (_parent) ikj.create(_parent->_joint); + else ikj.create(); + ikj.set(mtm); + _joint = ikj.object(); } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -378,7 +393,7 @@ class MayaEggMesh { public: - string _name; + EggVertexPool *_pool; MFloatPointArray _vertexArray; MIntArray _polygonCounts; MIntArray _polygonConnects; @@ -404,6 +419,7 @@ public: int AddFace(int v0, int v1, int v2, int tv0, int tv1, int tv2, int cv0, int cv1, int cv2, MayaEggTex *tex); EggGroup *GetControlJoint(void); void ConnectTextures(void); + void AssignNames(void); }; #define CTRLJOINT_DEFORM ((EggGroup*)((char*)(-1))) @@ -462,16 +478,24 @@ int MayaEggMesh::GetCVert(Colorf col) return 0; } +void MayaEggMesh::AssignNames(void) +{ + string name = _pool->get_name(); + int nsize = name.size(); + if ((nsize > 6) && (name.rfind(".verts")==(nsize-6))) + name.resize(nsize-6); + MFnDependencyNode dnshape(_shapeNode); + MFnDependencyNode dntrans(_transNode); + dnshape.setName(MString(name.c_str())+"Shape"); + dntrans.setName(MString(name.c_str())); +} + MayaEggMesh *MayaEggLoader::GetMesh(EggVertexPool *pool) { MayaEggMesh *result = _mesh_tab[pool]; if (result == 0) { - string name = pool->get_name(); - int nsize = name.size(); - if ((nsize > 6) && (name.rfind(".verts")==(nsize-6))) - name.resize(nsize-6); result = new MayaEggMesh; - result->_name = name; + result->_pool = pool; result->_vert_count = 0; result->_tvert_count = 0; result->_cvert_count = 0; @@ -686,16 +710,12 @@ bool MayaEggLoader::ConvertEggData(EggData *data, bool merge, bool model, bool a MFnMesh mfn; MString cset; - mfn.setName(mesh->_name.c_str()); mesh->_transNode = mfn.create(mesh->_vert_count, mesh->_face_count, mesh->_vertexArray, mesh->_polygonCounts, mesh->_polygonConnects, mesh->_uarray, mesh->_varray, MObject::kNullObj, &status); mesh->_shapeNode = mfn.object(); - MFnDependencyNode mdn(mesh->_transNode); mfn.getPath(mesh->_shape_dag_path); - mfn.setName(MString(mesh->_name.c_str())+"Shape"); - mdn.setName(MString(mesh->_name.c_str())); mesh->ConnectTextures(); mfn.getCurrentUVSetName(cset); mfn.assignUVs(mesh->_polygonCounts, mesh->_uvIds, &cset); @@ -719,6 +739,10 @@ bool MayaEggLoader::ConvertEggData(EggData *data, bool merge, bool model, bool a if (joint) CreateSkinModifier(mesh); } + for (ci = _mesh_tab.begin(); ci != _mesh_tab.end(); ++ci) (*ci)->AssignNames(); + for (ji = _joint_tab.begin(); ji != _joint_tab.end(); ++ji) (*ji)->AssignNames(); + for (ti = _tex_tab.begin(); ti != _tex_tab.end(); ++ti) (*ti)->AssignNames(); + for (ci = _mesh_tab.begin(); ci != _mesh_tab.end(); ++ci) delete *ci; for (ji = _joint_tab.begin(); ji != _joint_tab.end(); ++ji) delete *ji; for (ti = _tex_tab.begin(); ti != _tex_tab.end(); ++ti) delete *ti;