feat: lecture obj (triangle seulement)
This commit is contained in:
parent
3bb1f095c1
commit
394dda14a5
@ -248,6 +248,24 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="resources.rc" />
|
<ResourceCompile Include="resources.rc" />
|
||||||
</ItemGroup>
|
</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">
|
<PropertyGroup Label="Globals">
|
||||||
<VCProjectVersion>17.0</VCProjectVersion>
|
<VCProjectVersion>17.0</VCProjectVersion>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
@ -493,5 +493,17 @@
|
|||||||
<CopyFileToFolders Include="water.txt">
|
<CopyFileToFolders Include="water.txt">
|
||||||
<Filter>Assets</Filter>
|
<Filter>Assets</Filter>
|
||||||
</CopyFileToFolders>
|
</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>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@ -273,6 +273,123 @@ bool ModelClass::LoadModel(char* filename)
|
|||||||
{
|
{
|
||||||
Logger::Get().Log("Loading model: " + std::string(filename), __FILE__, __LINE__);
|
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;
|
ifstream fin;
|
||||||
char input;
|
char input;
|
||||||
int i;
|
int i;
|
||||||
|
@ -98,6 +98,8 @@ private:
|
|||||||
void ReleaseTextures();
|
void ReleaseTextures();
|
||||||
|
|
||||||
bool LoadModel(char*);
|
bool LoadModel(char*);
|
||||||
|
bool LoadObjModel(char*);
|
||||||
|
bool LoadTxtModel(char*);
|
||||||
void ReleaseModel();
|
void ReleaseModel();
|
||||||
|
|
||||||
void CalculateModelVectors();
|
void CalculateModelVectors();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user