This commit is contained in:
songchengjiang 2014-10-21 14:32:32 +08:00
commit a839cc3ae7
2 changed files with 119 additions and 86 deletions

View File

@ -354,11 +354,11 @@ bool Bundle3D::loadAnimationData(const std::string& id, Animation3DData* animati
if (_isBinary)
{
return loadAnimationDataBinary(animationdata);
return loadAnimationDataBinary(id,animationdata);
}
else
{
return loadAnimationDataJson(animationdata);
return loadAnimationDataJson(id,animationdata);
}
}
@ -1189,7 +1189,7 @@ bool Bundle3D::loadMaterialDataJson_0_2(MaterialDatas& materialdatas)
return true;
}
bool Bundle3D::loadAnimationDataJson(Animation3DData* animationdata)
bool Bundle3D::loadAnimationDataJson(const std::string& id, Animation3DData* animationdata)
{
std::string anim = "";
if (_version == "1.2" || _version == "0.2")
@ -1198,11 +1198,26 @@ bool Bundle3D::loadAnimationDataJson(Animation3DData* animationdata)
anim = ANIMATIONS;
if (!_jsonReader.HasMember(anim.c_str())) return false;
int the_index = -1;
const rapidjson::Value& animation_data_array = _jsonReader[anim.c_str()];
if (animation_data_array.Size()==0) return false;
const rapidjson::Value& animation_data_array_val_0 = animation_data_array[(rapidjson::SizeType)0];
if(!id.empty())
{
for(int i=0 ;i<animation_data_array.Size();i++)
{
if(animation_data_array[i][ID].GetString() ==id )
{
the_index = i;
}
}
if(the_index < 0) return false;
}else{
the_index = 0;
}
const rapidjson::Value& animation_data_array_val_0 = animation_data_array[(rapidjson::SizeType)the_index];
animationdata->_totalTime = animation_data_array_val_0[LENGTH].GetDouble();
@ -1609,11 +1624,11 @@ bool Bundle3D::loadMaterialDataBinary(MaterialData* materialdata)
return true;
}
bool Bundle3D::loadAnimationDataBinary(Animation3DData* animationdata)
bool Bundle3D::loadAnimationDataBinary(const std::string& id, Animation3DData* animationdata)
{
if (!seekToFirstType(BUNDLE_TYPE_ANIMATIONS))
return false;
unsigned int animNum=0;
unsigned int animNum = 1;
if( _version == "0.3"|| _version == "0.4")
{
if (!_binaryReader.read(&animNum))
@ -1622,7 +1637,12 @@ bool Bundle3D::loadAnimationDataBinary(Animation3DData* animationdata)
return false;
}
}
std::string id = _binaryReader.readString();
bool has_found =false;
for(unsigned int k = 0; k < animNum ; k++ )
{
animationdata->resetData();
std::string animId = _binaryReader.readString();
if (!_binaryReader.read(&animationdata->_totalTime))
{
@ -1718,10 +1738,23 @@ bool Bundle3D::loadAnimationDataBinary(Animation3DData* animationdata)
animationdata->_translationKeys[boneName].push_back(Animation3DData::Vec3Key(keytime, position));
}
}
}
if( id == animId || id.empty())
{
has_found = true;
break;
}
}
if(!has_found)
{
animationdata->resetData();
return false;
}
return true;
}
bool Bundle3D::loadNodesJson(NodeDatas& nodedatas)
{
if (!_jsonReader.HasMember(NODES)) return false;

View File

@ -114,7 +114,7 @@ protected:
bool loadMaterialDataJson(MaterialData* materialdata){return true;}
bool loadMaterialDataJson_0_1(MaterialData* materialdata){return true;}
bool loadMaterialDataJson_0_2(MaterialData* materialdata){return true;}
bool loadAnimationDataJson(Animation3DData* animationdata);
bool loadAnimationDataJson(const std::string& id,Animation3DData* animationdata);
/**
* load data in binary
* @param path The c3b file path
@ -145,7 +145,7 @@ protected:
* load animation data in binary
* @param animationdata The animation data pointer
*/
bool loadAnimationDataBinary(Animation3DData* animationdata);
bool loadAnimationDataBinary(const std::string& id,Animation3DData* animationdata);
bool checkIsBone(const std::string& name);