예제 #1
0
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;
}