AEResult Mesh::Load() { AEAssert(m_GraphicDevice != nullptr); if(m_GraphicDevice == nullptr) { return AEResult::GraphicDeviceNull; } 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(); ///////////////////////////////////////////// //Start reading file std::ifstream meshFile; meshFile.open(m_FileName, std::ios::binary | std::ios::in); if(!meshFile.is_open()) { AETODO("add log"); return AEResult::OpenFileFail; } char* tempPtr = nullptr; uint32_t tempUInt32 = 0; int32_t tempInt32 = 0; uint32_t sizeToRead = 0; ///////////////////////////////////////////// //Verify Header bool verifyHeader = AEGameContentHelpers::ReadFileHeaderAndVerify(meshFile, AE_CT_AE3DM_FILE_HEADER, AE_CT_AE3DM_FILE_VERSION_MAYOR, AE_CT_AE3DM_FILE_VERSION_MINOR, AE_CT_AE3DM_FILE_VERSION_REVISON); if(!verifyHeader) { AETODO("Add log"); return AEResult::InvalidFileHeader; } ///////////////////////////////////////////// //Get Name of Mesh this->SetFileNameWithoutLock(AEGameContentHelpers::ReadString(meshFile)); ///////////////////////////////////////////// //Read Number of Mesh Parts uint32_t numMeshesParts = 0; tempPtr = reinterpret_cast<char*>(&numMeshesParts); sizeToRead = sizeof(uint32_t); meshFile.read(tempPtr, sizeToRead); ///////////////////////////////////////////// //Load Mesh Parts for (uint32_t i = 0; i < numMeshesParts; ++i) { ///////////////////////////////////////////// //Read Index Type AETODO("To change to 16 or 32"); IndexBufferType idxType = IndexBufferType::Index16; tempPtr = reinterpret_cast<char*>(&idxType); sizeToRead = sizeof(uint32_t); meshFile.read(tempPtr, sizeToRead); ///////////////////////////////////////////// //Read size of Index Buffer AETODO("add error when vtx or idx size is 0"); uint32_t idxBufSize = 0; tempPtr = reinterpret_cast<char*>(&idxBufSize); sizeToRead = sizeof(uint32_t); meshFile.read(tempPtr, sizeToRead); ///////////////////////////////////////////// //Read Index Buffer uint16_t* idxBuf = new uint16_t[idxBufSize]; ZeroMemory(idxBuf, sizeof(uint16_t) * idxBufSize); tempPtr = reinterpret_cast<char*>(idxBuf); sizeToRead = sizeof(uint16_t) * idxBufSize; meshFile.read(tempPtr, sizeToRead); ///////////////////////////////////////////// //Read Vertex Buffer Type VertexType vtxType = VertexType::VtxNone; tempPtr = reinterpret_cast<char*>(&vtxType); sizeToRead = sizeof(uint32_t); meshFile.read(tempPtr, sizeToRead); if(!AEImporterHelpers::IsVertexTypeValid(vtxType)) { AETODO("add log"); CleanUp(); DeleteMemArr(idxBuf); return AEResult::Fail; } ///////////////////////////////////////////// //Read size of Vertex Buffer uint32_t vtxBufSize = 0; tempPtr = reinterpret_cast<char*>(&vtxBufSize); sizeToRead = sizeof(uint32_t); meshFile.read(tempPtr, sizeToRead); ///////////////////////////////////////////// //Read Vertex Buffer uint32_t sizeOfVertex = AEVertexHelper::GetVertexSizeByType(vtxType); uint8_t* vtxBuffer = new uint8_t[sizeOfVertex * vtxBufSize]; ZeroMemory(vtxBuffer, sizeOfVertex * vtxBufSize); tempPtr = reinterpret_cast<char*>(vtxBuffer); sizeToRead = sizeOfVertex * vtxBufSize; meshFile.read(tempPtr, sizeToRead); ///////////////////////////////////////////// //Create Vertex Buffer and Index Buffer Objects //Vertex Buffer IVertexBuffer* vertexBuffer = nullptr; AEResult ret = AEImporterHelpers::BuildVertexBuffer(m_GraphicDevice, &vertexBuffer, vtxType, vtxBuffer, vtxBufSize); if(ret != AEResult::Ok) { AETODO("add log"); CleanUp(); DeleteMemArr(idxBuf); DeleteMem(vtxBuffer); return ret; } //Index Buffer IndexBuffer* indexBuffer = new IndexBuffer(m_GraphicDevice); indexBuffer->CopyToIndexBuffer(idxBuf, idxBufSize); indexBuffer->BuildIndexBuffer(); ///////////////////////////////////////////// //Add variables to Mesh Part MeshPart* meshPart = new MeshPart(); meshPart->SetIndexBuffer(indexBuffer); meshPart->SetVertexBuffer(vertexBuffer); m_MeshPartVector.push_back(meshPart); ///////////////////////////////////////////// //Erase temp Buffer DeleteMemArr(idxBuf); DeleteMem(vtxBuffer); } ///////////////////////////////////////////// //Read Bounding Shapes tempPtr = reinterpret_cast<char*>(&m_BoundingBox.m_MinPos); sizeToRead = sizeof(glm::vec3); meshFile.read(tempPtr, sizeToRead); tempPtr = reinterpret_cast<char*>(&m_BoundingBox.m_MaxPos); sizeToRead = sizeof(glm::vec3); meshFile.read(tempPtr, sizeToRead); tempPtr = reinterpret_cast<char*>(&m_BoundingSphere.m_Radius); sizeToRead = sizeof(float); meshFile.read(tempPtr, sizeToRead); ///////////////////////////////////////////// //Read Footer bool verifyFooter = AEGameContentHelpers::ReadFileFooterAndVerify(meshFile, AE_CT_AE3DM_FILE_FOOTER); if(!verifyFooter) { AETODO("Add Warning log"); } ///////////////////////////////////////////// //Finish meshFile.close(); return AEResult::Ok; }