NS_CC_BEGIN void getChildMap(std::map<int, std::vector<int> >& map, SkinData* skinData, const rapidjson::Value& val) { if (!skinData) return; if (!val.HasMember("children")) return; std::string parent_name = val["id"].GetString(); int parent_name_index = skinData->getBoneNameIndex(parent_name); const rapidjson::Value& children = val["children"]; for (rapidjson::SizeType i = 0; i < children.Size(); i++) { const rapidjson::Value& child = children[i]; std::string child_name = child["id"].GetString(); int child_name_index = skinData->getBoneNameIndex(child_name); if (child_name_index >= 0) { map[parent_name_index].push_back(child_name_index); getChildMap(map, skinData, child); } } }
NS_CC_BEGIN void getChildMap(std::map<int, std::vector<int> >& map, SkinData* skinData, const rapidjson::Value& val) { if (!skinData) return; // get transform matrix Mat4 transform; const rapidjson::Value& parent_tranform = val[SKINDATA_TRANSFORM]; for (rapidjson::SizeType j = 0; j < parent_tranform.Size(); j++) { transform.m[j] = parent_tranform[j].GetDouble(); } // set origin matrices std::string parent_name = val[ID].GetString(); int parent_name_index = skinData->getSkinBoneNameIndex(parent_name); if (parent_name_index < 0) { skinData->addNodeBoneNames(parent_name); skinData->nodeBoneOriginMatrices.push_back(transform); parent_name_index = skinData->getBoneNameIndex(parent_name); } else if (parent_name_index < skinData->skinBoneNames.size()) { skinData->skinBoneOriginMatrices[parent_name_index] = (transform); } // set root bone index if(skinData->rootBoneIndex < 0) skinData->rootBoneIndex = parent_name_index; if (!val.HasMember(SKINDATA_CHILDREN)) return; const rapidjson::Value& children = val[SKINDATA_CHILDREN]; for (rapidjson::SizeType i = 0; i < children.Size(); i++) { // get child bone name const rapidjson::Value& child = children[i]; std::string child_name = child[ID].GetString(); int child_name_index = skinData->getSkinBoneNameIndex(child_name); if (child_name_index < 0) { skinData->addNodeBoneNames(child_name); child_name_index = skinData->getBoneNameIndex(child_name); } map[parent_name_index].push_back(child_name_index); getChildMap(map, skinData, child); } }
bool Bundle3D::loadSkinDataJson(SkinData* skindata) { if (!_jsonReader.HasMember(SKINDATA_SKIN )) return false; skindata->resetData(); const rapidjson::Value& skin_data_array = _jsonReader[SKINDATA_SKIN ]; assert(skin_data_array.IsArray()); const rapidjson::Value& skin_data_array_val_0 = skin_data_array[(rapidjson::SizeType)0]; if (!skin_data_array_val_0.HasMember(SKINDATA_BONES)) return false; const rapidjson::Value& skin_data_bones = skin_data_array_val_0[SKINDATA_BONES]; for (rapidjson::SizeType i = 0; i < skin_data_bones.Size(); i++) { const rapidjson::Value& skin_data_bone = skin_data_bones[i]; std::string name = skin_data_bone[SKINDATA_NODE].GetString(); skindata->addSkinBoneNames(name); Mat4 mat_bind_pos; const rapidjson::Value& bind_pos = skin_data_bone[SKINDATA_BINDSHAPE]; for (rapidjson::SizeType j = 0; j < bind_pos.Size(); j++) { mat_bind_pos.m[j] = bind_pos[j].GetDouble(); } skindata->inverseBindPoseMatrices.push_back(mat_bind_pos); } // set root bone infomation const rapidjson::Value& skin_data_1 = skin_data_array[1]; // parent and child relationship map skindata->skinBoneOriginMatrices.resize(skindata->skinBoneNames.size()); //skindata->nodeBoneOriginMatrices.resize(skindata->nodeBoneNames.size()); getChildMap(skindata->boneChild, skindata, skin_data_1); return true; }
bool Bundle3D::loadSkinData(const std::string& id, SkinData* skindata) { if (!_document.HasMember("skin")) return false; skindata->resetData(); const rapidjson::Value& skin_data_array = _document["skin"]; assert(skin_data_array.IsArray()); const rapidjson::Value& skin_data_array_val_0 = skin_data_array[(rapidjson::SizeType)0]; if (!skin_data_array_val_0.HasMember("bones")) return false; const rapidjson::Value& skin_data_bones = skin_data_array_val_0["bones"]; for (rapidjson::SizeType i = 0; i < skin_data_bones.Size(); i++) { const rapidjson::Value& skin_data_bone = skin_data_bones[i]; std::string name = skin_data_bone["node"].GetString(); skindata->boneNames.push_back(name); Mat4 mat_bind_pos; const rapidjson::Value& bind_pos = skin_data_bone["bindshape"]; for (rapidjson::SizeType j = 0; j < bind_pos.Size(); j++) { mat_bind_pos.m[j] = bind_pos[j].GetDouble(); } skindata->inverseBindPoseMatrices.push_back(mat_bind_pos); } const rapidjson::Value& skin_data_1 = skin_data_array[1]; const rapidjson::Value& bone_array_0 = skin_data_1["children"][(rapidjson::SizeType)0]; skindata->rootBoneIndex = skindata->getBoneNameIndex(bone_array_0["id"].GetString()); getChildMap(skindata->boneChild, skindata, bone_array_0); return true; }