mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
Now loads joints (but not skin clusters)
This commit is contained in:
parent
68029e1ef5
commit
1c40af594f
@ -56,6 +56,9 @@
|
|||||||
#include <maya/MDagPath.h>
|
#include <maya/MDagPath.h>
|
||||||
#include <maya/MFnSingleIndexedComponent.h>
|
#include <maya/MFnSingleIndexedComponent.h>
|
||||||
#include <maya/MPlugArray.h>
|
#include <maya/MPlugArray.h>
|
||||||
|
#include <maya/MMatrix.h>
|
||||||
|
#include <maya/MTransformationMatrix.h>
|
||||||
|
#include <maya/MFnIkJoint.h>
|
||||||
#include "post_maya_include.h"
|
#include "post_maya_include.h"
|
||||||
|
|
||||||
#include "mayaEggLoader.h"
|
#include "mayaEggLoader.h"
|
||||||
@ -112,14 +115,28 @@ MFloatPoint ConvertCoordSys(CoordinateSystem sys, LVector3d vec)
|
|||||||
class MayaEggTex
|
class MayaEggTex
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
string _name;
|
||||||
string _path;
|
string _path;
|
||||||
MObject _file_texture;
|
MObject _file_texture;
|
||||||
MObject _shader;
|
MObject _shader;
|
||||||
MObject _shading_group;
|
MObject _shading_group;
|
||||||
|
|
||||||
MFnSingleIndexedComponent _component;
|
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)
|
MayaEggTex *MayaEggLoader::GetTex(const string &name, const string &fn)
|
||||||
{
|
{
|
||||||
if (_tex_tab.count(fn))
|
if (_tex_tab.count(fn))
|
||||||
@ -129,33 +146,41 @@ MayaEggTex *MayaEggLoader::GetTex(const string &name, const string &fn)
|
|||||||
MFnLambertShader shader;
|
MFnLambertShader shader;
|
||||||
MFnDependencyNode filetex;
|
MFnDependencyNode filetex;
|
||||||
MFnSet sgroup;
|
MFnSet sgroup;
|
||||||
MPlugArray oldplugs;
|
|
||||||
MDGModifier dgmod;
|
|
||||||
|
|
||||||
shader.create(true,&status);
|
if (fn=="") {
|
||||||
shader.setName(MString(name.c_str())+"Shader");
|
MSelectionList selection;
|
||||||
sgroup.create(MSelectionList(), MFnSet::kRenderableOnly, &status);
|
MObject initGroup;
|
||||||
sgroup.setName(MString(name.c_str()));
|
selection.clear();
|
||||||
MPlug surfplug = sgroup.findPlug("surfaceShader");
|
MGlobal::getSelectionListByName("initialShadingGroup",selection);
|
||||||
if (surfplug.connectedTo(oldplugs,true,false)) {
|
selection.getDependNode(0, initGroup);
|
||||||
for (int i=0; i<oldplugs.length(); i++) {
|
sgroup.setObject(initGroup);
|
||||||
MPlug src = oldplugs[i];
|
} else {
|
||||||
status = dgmod.disconnect(src, surfplug);
|
MPlugArray oldplugs;
|
||||||
if (status != MStatus::kSuccess) status.perror("Disconnecting old shader");
|
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;
|
MayaEggTex *res = new MayaEggTex;
|
||||||
|
res->_name = name;
|
||||||
res->_path = fn;
|
res->_path = fn;
|
||||||
res->_file_texture = filetex.object();
|
res->_file_texture = filetex.object();
|
||||||
res->_shader = shader.object();
|
res->_shader = shader.object();
|
||||||
@ -178,10 +203,9 @@ public:
|
|||||||
LVector3d _endpos;
|
LVector3d _endpos;
|
||||||
LVector3d _perp;
|
LVector3d _perp;
|
||||||
double _thickness;
|
double _thickness;
|
||||||
// bool _inskin;
|
MObject _joint;
|
||||||
// SimpleObject2 *_bone;
|
MMatrix _joint_abs;
|
||||||
// INode *_node;
|
EggGroup *_egg_joint;
|
||||||
EggGroup *_egg_joint;
|
|
||||||
MayaEggJoint *_parent;
|
MayaEggJoint *_parent;
|
||||||
vector <MayaEggJoint *> _children;
|
vector <MayaEggJoint *> _children;
|
||||||
|
|
||||||
@ -193,8 +217,16 @@ public:
|
|||||||
MayaEggJoint *ChooseBestChild(LVector3d dir);
|
MayaEggJoint *ChooseBestChild(LVector3d dir);
|
||||||
void ChooseEndPos(double thickness);
|
void ChooseEndPos(double thickness);
|
||||||
void CreateMayaBone(CoordinateSystem sys);
|
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)
|
MayaEggJoint *MayaEggLoader::FindJoint(EggGroup *joint)
|
||||||
{
|
{
|
||||||
if (joint==0) return 0;
|
if (joint==0) return 0;
|
||||||
@ -214,11 +246,9 @@ MayaEggJoint *MayaEggLoader::MakeJoint(EggGroup *joint, EggGroup *context)
|
|||||||
result->_endpos = LVector3d(0,0,0);
|
result->_endpos = LVector3d(0,0,0);
|
||||||
result->_perp = LVector3d(0,0,0);
|
result->_perp = LVector3d(0,0,0);
|
||||||
result->_thickness = 0.0;
|
result->_thickness = 0.0;
|
||||||
// result->_inskin = false;
|
|
||||||
// result->_bone = 0;
|
|
||||||
// result->_node = 0;
|
|
||||||
result->_egg_joint = joint;
|
result->_egg_joint = joint;
|
||||||
result->_parent = parent;
|
result->_parent = parent;
|
||||||
|
result->_joint = MObject::kNullObj;
|
||||||
if (parent) parent->_children.push_back(result);
|
if (parent) parent->_children.push_back(result);
|
||||||
_joint_tab[joint] = result;
|
_joint_tab[joint] = result;
|
||||||
return result;
|
return result;
|
||||||
@ -286,42 +316,27 @@ void MayaEggJoint::ChooseEndPos(double thickness)
|
|||||||
|
|
||||||
void MayaEggJoint::CreateMayaBone(CoordinateSystem sys)
|
void MayaEggJoint::CreateMayaBone(CoordinateSystem sys)
|
||||||
{
|
{
|
||||||
// Point3 xv(ConvertCoordSys(sys, GetXV()));
|
MFloatPoint xv(ConvertCoordSys(sys, GetXV()));
|
||||||
// Point3 yv(ConvertCoordSys(sys, GetYV()));
|
MFloatPoint yv(ConvertCoordSys(sys, GetYV()));
|
||||||
// Point3 zv(ConvertCoordSys(sys, GetZV()));
|
MFloatPoint zv(ConvertCoordSys(sys, GetZV()));
|
||||||
// Point3 pos(ConvertCoordSys(sys, GetPos()));
|
MFloatPoint pos(ConvertCoordSys(sys, GetPos()));
|
||||||
// Point3 endpos(ConvertCoordSys(sys, _endpos));
|
MFloatPoint endpos(ConvertCoordSys(sys, _endpos));
|
||||||
// Point3 tzv(ConvertCoordSys(sys, _perp));
|
MFloatPoint tzv(ConvertCoordSys(sys, _perp));
|
||||||
//
|
|
||||||
// Point3 fwd = endpos - pos;
|
double m[4][4];
|
||||||
// double len = fwd.Length();
|
m[0][0]=xv.x; m[0][1]=xv.y; m[0][2]=xv.z; m[0][3]=0;
|
||||||
// Point3 txv = fwd * ((float)(1.0/len));
|
m[1][0]=yv.x; m[1][1]=yv.y; m[1][2]=yv.z; m[1][3]=0;
|
||||||
// Point3 tyv = tzv ^ txv;
|
m[2][0]=zv.x; m[2][1]=zv.y; m[2][2]=zv.z; m[2][3]=0;
|
||||||
// Point3 row1 = Point3(txv % xv, txv % yv, txv % zv);
|
m[3][0]=pos.x; m[3][1]=pos.y; m[3][2]=pos.z; m[3][3]=1;
|
||||||
// Point3 row2 = Point3(tyv % xv, tyv % yv, tyv % zv);
|
MMatrix trans(m);
|
||||||
// Point3 row3 = Point3(tzv % xv, tzv % yv, tzv % zv);
|
_joint_abs = trans;
|
||||||
// Matrix3 oomat(row1,row2,row3,Point3(0,0,0));
|
if (_parent) trans = trans * _parent->_joint_abs.inverse();
|
||||||
// Quat ooquat(oomat);
|
MTransformationMatrix mtm(trans);
|
||||||
// _bone = (SimpleObject2*)CreateInstance(GEOMOBJECT_CLASS_ID, BONE_OBJ_CLASSID);
|
MFnIkJoint ikj;
|
||||||
// _node = GetCOREInterface()->CreateObjectNode(_bone);
|
if (_parent) ikj.create(_parent->_joint);
|
||||||
// _node->SetNodeTM(0, Matrix3(xv, yv, zv, pos));
|
else ikj.create();
|
||||||
// IParamBlock2 *blk = _bone->pblock2;
|
ikj.set(mtm);
|
||||||
// for (int i=0; i<blk->NumParams(); i++) {
|
_joint = ikj.object();
|
||||||
// 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);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -378,7 +393,7 @@ class MayaEggMesh
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
string _name;
|
EggVertexPool *_pool;
|
||||||
MFloatPointArray _vertexArray;
|
MFloatPointArray _vertexArray;
|
||||||
MIntArray _polygonCounts;
|
MIntArray _polygonCounts;
|
||||||
MIntArray _polygonConnects;
|
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);
|
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);
|
EggGroup *GetControlJoint(void);
|
||||||
void ConnectTextures(void);
|
void ConnectTextures(void);
|
||||||
|
void AssignNames(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CTRLJOINT_DEFORM ((EggGroup*)((char*)(-1)))
|
#define CTRLJOINT_DEFORM ((EggGroup*)((char*)(-1)))
|
||||||
@ -462,16 +478,24 @@ int MayaEggMesh::GetCVert(Colorf col)
|
|||||||
return 0;
|
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 *MayaEggLoader::GetMesh(EggVertexPool *pool)
|
||||||
{
|
{
|
||||||
MayaEggMesh *result = _mesh_tab[pool];
|
MayaEggMesh *result = _mesh_tab[pool];
|
||||||
if (result == 0) {
|
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 = new MayaEggMesh;
|
||||||
result->_name = name;
|
result->_pool = pool;
|
||||||
result->_vert_count = 0;
|
result->_vert_count = 0;
|
||||||
result->_tvert_count = 0;
|
result->_tvert_count = 0;
|
||||||
result->_cvert_count = 0;
|
result->_cvert_count = 0;
|
||||||
@ -686,16 +710,12 @@ bool MayaEggLoader::ConvertEggData(EggData *data, bool merge, bool model, bool a
|
|||||||
MFnMesh mfn;
|
MFnMesh mfn;
|
||||||
MString cset;
|
MString cset;
|
||||||
|
|
||||||
mfn.setName(mesh->_name.c_str());
|
|
||||||
mesh->_transNode = mfn.create(mesh->_vert_count, mesh->_face_count,
|
mesh->_transNode = mfn.create(mesh->_vert_count, mesh->_face_count,
|
||||||
mesh->_vertexArray, mesh->_polygonCounts, mesh->_polygonConnects,
|
mesh->_vertexArray, mesh->_polygonCounts, mesh->_polygonConnects,
|
||||||
mesh->_uarray, mesh->_varray,
|
mesh->_uarray, mesh->_varray,
|
||||||
MObject::kNullObj, &status);
|
MObject::kNullObj, &status);
|
||||||
mesh->_shapeNode = mfn.object();
|
mesh->_shapeNode = mfn.object();
|
||||||
MFnDependencyNode mdn(mesh->_transNode);
|
|
||||||
mfn.getPath(mesh->_shape_dag_path);
|
mfn.getPath(mesh->_shape_dag_path);
|
||||||
mfn.setName(MString(mesh->_name.c_str())+"Shape");
|
|
||||||
mdn.setName(MString(mesh->_name.c_str()));
|
|
||||||
mesh->ConnectTextures();
|
mesh->ConnectTextures();
|
||||||
mfn.getCurrentUVSetName(cset);
|
mfn.getCurrentUVSetName(cset);
|
||||||
mfn.assignUVs(mesh->_polygonCounts, mesh->_uvIds, &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);
|
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 (ci = _mesh_tab.begin(); ci != _mesh_tab.end(); ++ci) delete *ci;
|
||||||
for (ji = _joint_tab.begin(); ji != _joint_tab.end(); ++ji) delete *ji;
|
for (ji = _joint_tab.begin(); ji != _joint_tab.end(); ++ji) delete *ji;
|
||||||
for (ti = _tex_tab.begin(); ti != _tex_tab.end(); ++ti) delete *ti;
|
for (ti = _tex_tab.begin(); ti != _tex_tab.end(); ++ti) delete *ti;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user