AEResult Skeleton::Load() { std::lock_guard<std::mutex> lock(m_GameResourceMutex); AEAssert(!m_FileName.empty()); if(m_FileName.empty()) { return AEResult::EmptyFilename; } ///////////////////////////////////////////// //Clean Up memory before loading File CleanUp(); AEResult ret = AEResult::Ok; ///////////////////////////////////////////// //Start reading file std::ifstream skeletonFile; skeletonFile.open(m_FileName, std::ios::binary | std::ios::in); if(!skeletonFile.is_open()) { AETODO("add log"); return AEResult::OpenFileFail; } char* tempPtr = nullptr; uint32_t sizeToRead = 0; ///////////////////////////////////////////// //Verify Header bool verifyHeader = AEGameContentHelpers::ReadFileHeaderAndVerify(skeletonFile, AE_CT_AE3DS_FILE_HEADER, AE_CT_AE3DS_FILE_VERSION_MAYOR, AE_CT_AE3DS_FILE_VERSION_MINOR, AE_CT_AE3DS_FILE_VERSION_REVISON); if(!verifyHeader) { AETODO("Add log"); return AEResult::InvalidFileHeader; } ///////////////////////////////////////////// //Read Number of Bones uint32_t numBones = 0; tempPtr = reinterpret_cast<char*>(&numBones); sizeToRead = sizeof(uint32_t); skeletonFile.read(tempPtr, sizeToRead); ///////////////////////////////////////////// //Read Bones for(uint32_t i = 0; i < numBones; ++i) { Bone* bone = new Bone(); glm::mat4 tempMat = AEMathHelpers::Mat4Identity; int32_t tempInt32 = 0; ///////////////////////////////////////////// //Write name of Bone and size of Name bone->SetName(AEGameContentHelpers::ReadString(skeletonFile)); ///////////////////////////////////////////// //Read Bone Matrices sizeToRead = sizeof(glm::mat4); tempPtr = reinterpret_cast<char*>(&tempMat); //Local Matrix skeletonFile.read(tempPtr, sizeToRead); bone->SetLocalMatrix(tempMat); //World Matrix skeletonFile.read(tempPtr, sizeToRead); bone->SetWorldMatrix(tempMat); //Off Set Matrix skeletonFile.read(tempPtr, sizeToRead); bone->SetOffSetMatrix(tempMat); ///////////////////////////////////////////// //Read Bone Indices tempPtr = reinterpret_cast<char*>(&tempInt32); sizeToRead = sizeof(int32_t); //Parent Index skeletonFile.read(tempPtr, sizeToRead); bone->SetParentIndex(tempInt32); //Bone Index skeletonFile.read(tempPtr, sizeToRead); bone->SetIndex(tempInt32); ///////////////////////////////////////////// //Add Bone to Skeleton m_BoneHierarchy.push_back(bone); } ///////////////////////////////////////////// //Read Footer bool verifyFooter = AEGameContentHelpers::ReadFileFooterAndVerify(skeletonFile, AE_CT_AE3DS_FILE_FOOTER); if(!verifyFooter) { AETODO("Add Warning log"); } ///////////////////////////////////////////// //Finish skeletonFile.close(); return AEResult::Ok; }