Exemplo n.º 1
0
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);
        }
    }
}
Exemplo n.º 2
0
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);

    }
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}