Now loads joints (but not skin clusters)

This commit is contained in:
Josh Yelon 2005-08-01 19:06:26 +00:00
parent 68029e1ef5
commit 1c40af594f

View File

@ -56,6 +56,9 @@
#include <maya/MDagPath.h>
#include <maya/MFnSingleIndexedComponent.h>
#include <maya/MPlugArray.h>
#include <maya/MMatrix.h>
#include <maya/MTransformationMatrix.h>
#include <maya/MFnIkJoint.h>
#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<oldplugs.length(); i++) {
MPlug src = oldplugs[i];
status = dgmod.disconnect(src, surfplug);
if (status != MStatus::kSuccess) status.perror("Disconnecting old shader");
if (fn=="") {
MSelectionList selection;
MObject initGroup;
selection.clear();
MGlobal::getSelectionListByName("initialShadingGroup",selection);
selection.getDependNode(0, initGroup);
sgroup.setObject(initGroup);
} else {
MPlugArray oldplugs;
MDGModifier dgmod;
shader.create(true,&status);
sgroup.create(MSelectionList(), MFnSet::kRenderableOnly, &status);
MPlug surfplug = sgroup.findPlug("surfaceShader");
if (surfplug.connectedTo(oldplugs,true,false)) {
for (unsigned int i=0; i<oldplugs.length(); i++) {
MPlug src = oldplugs[i];
status = dgmod.disconnect(src, surfplug);
if (status != MStatus::kSuccess) status.perror("Disconnecting old shader");
}
}
status = dgmod.connect(shader.findPlug("outColor"),surfplug);
if (status != MStatus::kSuccess) status.perror("Connecting shader");
if (fn != "") {
filetex.create("file",&status);
filetex.findPlug("fileTextureName").setValue(MString(fn.c_str()));
dgmod.connect(filetex.findPlug("outColor"),shader.findPlug("color"));
}
status = dgmod.doIt();
if (status != MStatus::kSuccess) status.perror("DGMod doIt");
}
status = dgmod.connect(shader.findPlug("outColor"),surfplug);
if (status != MStatus::kSuccess) status.perror("Connecting shader");
if (fn != "") {
filetex.create("file",&status);
filetex.setName(MString(name.c_str())+"File");
filetex.findPlug("fileTextureName").setValue(MString(fn.c_str()));
dgmod.connect(filetex.findPlug("outColor"),shader.findPlug("color"));
}
status = dgmod.doIt();
if (status != MStatus::kSuccess) status.perror("DGMod doIt");
MayaEggTex *res = new MayaEggTex;
res->_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 <MayaEggJoint *> _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; i<blk->NumParams(); 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;