feat: lecture obj (triangle seulement)

This commit is contained in:
StratiX0 2024-04-26 14:13:29 +02:00
parent 3bb1f095c1
commit 394dda14a5
4 changed files with 149 additions and 0 deletions

View File

@ -248,6 +248,24 @@
<ItemGroup>
<ResourceCompile Include="resources.rc" />
</ItemGroup>
<ItemGroup>
<CopyFileToFolders Include="isosphere.obj">
<FileType>Document</FileType>
</CopyFileToFolders>
<CopyFileToFolders Include="monke.obj">
<FileType>Document</FileType>
</CopyFileToFolders>
</ItemGroup>
<ItemGroup>
<CopyFileToFolders Include="cone.obj">
<FileType>Document</FileType>
</CopyFileToFolders>
</ItemGroup>
<ItemGroup>
<CopyFileToFolders Include="vaisseau.obj">
<FileType>Document</FileType>
</CopyFileToFolders>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>

View File

@ -493,5 +493,17 @@
<CopyFileToFolders Include="water.txt">
<Filter>Assets</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="monke.obj">
<Filter>Assets</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="isosphere.obj">
<Filter>Assets</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="cone.obj">
<Filter>Assets</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="vaisseau.obj">
<Filter>Assets</Filter>
</CopyFileToFolders>
</ItemGroup>
</Project>

View File

@ -273,6 +273,123 @@ bool ModelClass::LoadModel(char* filename)
{
Logger::Get().Log("Loading model: " + std::string(filename), __FILE__, __LINE__);
std::string fileStr(filename);
std::string extension = fileStr.substr(fileStr.find_last_of(".") + 1);
if (extension == "obj")
{
// Load .obj file
return LoadObjModel(filename);
}
else if (extension == "txt")
{
// Load .txt file
return LoadTxtModel(filename);
}
else
{
Logger::Get().Log("Unsupported file format", __FILE__, __LINE__, Logger::LogLevel::Error);
return false;
}
}
bool ModelClass::LoadObjModel(char* filename)
{
Logger::Get().Log("Loading model", __FILE__, __LINE__);
std::string line;
std::ifstream fin(filename);
// If it could not open the file then exit.
if (!fin)
{
Logger::Get().Log("Failed to open model file", __FILE__, __LINE__, Logger::LogLevel::Error);
return false;
}
std::vector<XMFLOAT3> temp_positions;
std::vector<XMFLOAT2> temp_texcoords;
std::vector<XMFLOAT3> temp_normals;
std::vector<ModelType> temp_model;
// Read the file line by line.
while (std::getline(fin, line))
{
std::istringstream iss(line);
std::string type;
iss >> type;
if (type == "v") // Vertex position
{
XMFLOAT3 pos;
iss >> pos.x >> pos.y >> pos.z;
temp_positions.push_back(pos);
}
else if (type == "vt") // Texture coordinate
{
XMFLOAT2 tex;
iss >> tex.x >> tex.y;
temp_texcoords.push_back(tex);
}
else if (type == "vn") // Vertex normal
{
XMFLOAT3 norm;
iss >> norm.x >> norm.y >> norm.z;
temp_normals.push_back(norm);
}
else if (type == "f") // Face
{
int posIndex[3], texIndex[3], normIndex[3];
char slash; // To skip the slashes '/' in the .obj file format
for (int i = 0; i < 3; i++) // Each face in .obj format has 3 vertices
{
iss >> posIndex[i] >> slash >> texIndex[i] >> slash >> normIndex[i];
// Handle negative indices
if (posIndex[i] < 0) posIndex[i] += temp_positions.size() + 1;
if (texIndex[i] < 0) texIndex[i] += temp_texcoords.size() + 1;
if (normIndex[i] < 0) normIndex[i] += temp_normals.size() + 1;
}
// .obj indices start from 1, not 0
for (int i = 0; i < 3; i++)
{
ModelType vertex;
vertex.x = temp_positions[posIndex[i] - 1].x;
vertex.y = temp_positions[posIndex[i] - 1].y;
vertex.z = temp_positions[posIndex[i] - 1].z;
vertex.tu = temp_texcoords[texIndex[i] - 1].x;
vertex.tv = temp_texcoords[texIndex[i] - 1].y;
vertex.nx = temp_normals[normIndex[i] - 1].x;
vertex.ny = temp_normals[normIndex[i] - 1].y;
vertex.nz = temp_normals[normIndex[i] - 1].z;
temp_model.push_back(vertex);
}
}
}
m_vertexCount = temp_model.size();
m_indexCount = temp_model.size();
// Create the model using the vertex count that was read in.
m_model = new ModelType[m_vertexCount];
for (int i = 0; i < m_vertexCount; i++)
{
m_model[i] = temp_model[i];
}
fin.close();
Logger::Get().Log("Model loaded", __FILE__, __LINE__);
return true;
}
bool ModelClass::LoadTxtModel(char* filename)
{
Logger::Get().Log("Loading model", __FILE__, __LINE__);
ifstream fin;
char input;
int i;

View File

@ -98,6 +98,8 @@ private:
void ReleaseTextures();
bool LoadModel(char*);
bool LoadObjModel(char*);
bool LoadTxtModel(char*);
void ReleaseModel();
void CalculateModelVectors();