add skeleton and mesh to node containing the mesh

pull/1026/head
Angelo Scandaliato 2016-10-08 15:34:00 -07:00
parent 57b9232075
commit 71de606770
1 changed files with 36 additions and 13 deletions

View File

@ -152,7 +152,10 @@ glTFExporter::glTFExporter(const char* filename, IOSystem* pIOSystem, const aiSc
} }
} }
/*
* Copy a 4x4 matrix from struct aiMatrix to typedef mat4.
* Also converts from row-major to column-major storage.
*/
static void CopyValue(const aiMatrix4x4& v, glTF::mat4& o) static void CopyValue(const aiMatrix4x4& v, glTF::mat4& o)
{ {
o[ 0] = v.a1; o[ 1] = v.b1; o[ 2] = v.c1; o[ 3] = v.d1; o[ 0] = v.a1; o[ 1] = v.b1; o[ 2] = v.c1; o[ 3] = v.d1;
@ -364,6 +367,28 @@ void glTFExporter::ExportMaterials()
} }
} }
/*
* Search through node hierarchy and find the node containing the given meshID.
* Returns true on success, and false otherwise.
*/
bool FindMeshNode(Ref<Node>& nodeIn, Ref<Node>& meshNode, std::string meshID)
{
for (unsigned int i = 0; i < nodeIn->meshes.size(); ++i) {
if (meshID.compare(nodeIn->meshes[i]->id) == 0) {
meshNode = nodeIn;
return true;
}
}
for (unsigned int i = 0; i < nodeIn->children.size(); ++i) {
if(FindMeshNode(nodeIn->children[i], meshNode, meshID)) {
return true;
}
}
return false;
}
void ExportSkin(Asset& mAsset, const aiMesh* aim, Ref<Mesh>& meshRef, Ref<Buffer>& bufferRef) void ExportSkin(Asset& mAsset, const aiMesh* aim, Ref<Mesh>& meshRef, Ref<Buffer>& bufferRef)
{ {
std::string skinName = aim->mName.C_Str(); std::string skinName = aim->mName.C_Str();
@ -373,7 +398,6 @@ void ExportSkin(Asset& mAsset, const aiMesh* aim, Ref<Mesh>& meshRef, Ref<Buffer
mat4* inverseBindMatricesData = new mat4[aim->mNumBones]; mat4* inverseBindMatricesData = new mat4[aim->mNumBones];
//-------------------------------------------------------
// Store the vertex joint and weight data. // Store the vertex joint and weight data.
vec4* vertexJointData = new vec4[aim->mNumVertices]; vec4* vertexJointData = new vec4[aim->mNumVertices];
vec4* vertexWeightData = new vec4[aim->mNumVertices]; vec4* vertexWeightData = new vec4[aim->mNumVertices];
@ -427,13 +451,13 @@ void ExportSkin(Asset& mAsset, const aiMesh* aim, Ref<Mesh>& meshRef, Ref<Buffer
if (vertexWeightAccessor) p.attributes.weight.push_back(vertexWeightAccessor); if (vertexWeightAccessor) p.attributes.weight.push_back(vertexWeightAccessor);
// Create the skinned mesh instance node. // Find node that contains this mesh and add "skeletons" and "skin" attributes to that node.
Ref<Node> node = mAsset.nodes.Create(mAsset.FindUniqueID(skinName, "node")); Ref<Node> rootNode = mAsset.nodes.Get(unsigned(0));
// Ref<Node> node = mAsset.nodes.Get(aim->mBones[0]->mName.C_Str()); Ref<Node> meshNode;
node->meshes.push_back(meshRef); FindMeshNode(rootNode, meshNode, meshRef->id);
node->name = node->id;
node->skeletons.push_back(mAsset.nodes.Get(aim->mBones[0]->mName.C_Str())); meshNode->skeletons.push_back(mAsset.nodes.Get(aim->mBones[0]->mName.C_Str()));
node->skin = skinRef; meshNode->skin = skinRef;
} }
void glTFExporter::ExportMeshes() void glTFExporter::ExportMeshes()
@ -558,10 +582,9 @@ void glTFExporter::ExportMeshes()
} }
/*************** Skins ****************/ /*************** Skins ****************/
///TODO: Fix skinning animation if(aim->HasBones()) {
// if(aim->HasBones()) { ExportSkin(*mAsset, aim, m, b);
// ExportSkin(*mAsset, aim, m, b); }
// }
/****************** Compression ******************/ /****************** Compression ******************/
///TODO: animation: weights, joints. ///TODO: animation: weights, joints.