22 #include "MASkitDatabase.hpp" 24 #include "MAMotionSkit.hpp" 27 #include <MCBinaryData.hpp> 29 #include <MCZipper.hpp> 31 #include <boost/scoped_ptr.hpp> 40 static std::string SkitDatabaseID =
"SkitDatabase";
47 MC_WARNING(
"Cannot add a skit. Empty pointer.");
50 if (GetSkit(skit->GetName()).
get())
52 MC_WARNING(
"Cannot add a skit (%s). An other skit with the same name is already in the database.",
53 skit->GetName().c_str());
56 Skits.push_back(skit);
65 return MA::SkitSPtr();
67 for (
auto& skit : Skits)
70 if (skit->GetName() == name)
75 return MA::SkitSPtr();
86 if (mirrored_name.empty())
88 MC_WARNING(
"Noname mirrored skit cannot be created.");
91 if (GetSkit(mirrored_name).
get())
93 MC_WARNING(
"Cannot add a new mirrored skit (%s) because it is already in the database.",
94 mirrored_name.c_str());
97 MA::SkitSPtr Skit(GetSkit(name));
101 MC_WARNING(
"Cannot find the skit (%s) to be mirrored.", name.c_str());
104 MA::SkitSPtr NewSkit(Skit->CloneMirrored(mirrored_name));
117 for (
auto iter = Skits.begin(); iter != Skits.end(); ++iter)
119 if ((*iter)->GetName() == name)
125 MC_WARNING(
"Cannot remove a non-existing skit (%s)", name.c_str());
131 MirrorSkit(
"turn_right",
"turn_left");
132 MirrorSkit(
"lie_exercise1",
"lie_exercise1_reverse");
133 MirrorSkit(
"lie_exercise2",
"lie_exercise2_reverse");
134 MirrorSkit(
"lie_exercise3",
"lie_exercise3_reverse");
135 MirrorSkit(
"stand_fart1",
"stand_fart1_reverse");
136 MirrorSkit(
"stand_fart2",
"stand_fart2_reverse");
142 int OverallDataSize = 0;
145 for (
unsigned int i = 0; i < skits.size(); ++i)
153 OverallDataSize += skits[i]->GetSize();
155 int FinalDataSize = SkitDatabaseID.size()+OverallDataSize+skits.size()*4;
156 MC::BinaryDataSPtr FinalData(
new MCBinaryData(FinalDataSize));
158 FinalData->AddString(SkitDatabaseID);
159 for (
unsigned int i = 0; i < skits.size(); ++i)
164 FinalData->AddInt32(skits[i]->GetSize());
172 return CompressedData->SaveToFile(file_name);
181 if (!FileData->LoadFromFile(file_name))
186 if (UncompressedData->GetString(SkitDatabaseID.size()) != SkitDatabaseID)
192 while (!UncompressedData->IsPositionAtEnd())
194 int SliceSize = UncompressedData->GetInt32();
196 if (SliceSize < 0 || SliceSize > UncompressedData->GetSize()-UncompressedData->GetPosition())
201 MC::BinaryDataSPtr SkitData(
new MCBinaryData(SliceSize));
203 UncompressedData->WriteData(*SkitData, SliceSize);
204 SkitData->ResetPosition();
void AddSkit(MA::SkitSPtr skit)
Add a skit.
#define MC_WARNING(...)
Warning macro.
void RemoveSkit(const std::string &name)
Remove a skit.
static bool SaveToFile(const std::string &file_name, const MA::BinaryDataSPtrList &skits)
Assembly a database file.
bool WriteData(MCBinaryData &target, int capacity=-1)
Write data into a target instance.
void SetPosition(unsigned int position)
Set the cursor position.
MA::SkitSPtr GetSkit(const std::string &name)
Get a skit.
void CreateMirroredSkits()
Create mirrored skits (left and right leg joints are swapped)
static void DecompressZlib(const MCBinaryData &input_buffer, MCBinaryData &output_buffer)
Decompress data with zlib algorithm.
static MASkit * DecodeAibData(const MCBinaryData &binary_data)
Load a skit from binary data.
static MASkitDatabase * LoadFromFile(const std::string &file_name)
Load skit database from file.
A wrapper class to cover boost::thread_specific_ptr/folly::ThreadLocal API on certain targets...
static void CompressZlib(const MCBinaryData &input_buffer, MCBinaryData &output_buffer, MC::CompressionLevelsType compression_level)
Compress data with zlib algorithm.
void MirrorSkit(const std::string &name, const std::string &mirrored_name)
Mirror a skit.
int GetPosition() const
Get the current position in the binary data.
int GetSize() const
Get binary data size.