The engine can now import models with textures but bugs.

More complex models have a bug where the same textures are potentially
being loaded too many times.
This commit is contained in:
Warwick 2022-05-31 14:43:44 +01:00
parent a33ff9d029
commit 18a785613d
3 changed files with 88 additions and 73 deletions

View file

@ -55,6 +55,8 @@ void Mesh::draw(ShaderLoader &shader) {
shader.setFloat(("material." + name + number).c_str(), i); shader.setFloat(("material." + name + number).c_str(), i);
glBindTexture(GL_TEXTURE_2D, textures[i].id); glBindTexture(GL_TEXTURE_2D, textures[i].id);
error.log(std::to_string(textures[i].id));
error.log(std::to_string(GL_TEXTURE0 + i));
} }
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);

View file

@ -130,8 +130,19 @@ unsigned int Model::loadTextureFromFile(std::string file,
if (image == nullptr) { if (image == nullptr) {
error.crash("SDL2_image was unable to load a texture", IMG_GetError()); error.crash("SDL2_image was unable to load a texture", IMG_GetError());
} }
// Generate the texture and put its reference id in the texture variable // Generate the texture and put its reference id in the texture variable
glGenTextures(1, &texture); glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
// set some textue defaults
float borderColor[] = {1.0f, 1.0f, 0.0f, 1.0f};
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_LINEAR);
// Handle different SDL Surface data types // Handle different SDL Surface data types
int mode = GL_RGB; int mode = GL_RGB;
@ -148,5 +159,6 @@ unsigned int Model::loadTextureFromFile(std::string file,
SDL_FreeSurface(image); SDL_FreeSurface(image);
image = nullptr; image = nullptr;
error.log("loaded texture: " + std::to_string(texture));
return texture; return texture;
} }

View file

@ -77,30 +77,30 @@ int main(int argc, char **argv) {
ROOT_DIR "data/shaders/fragment.glsl"); ROOT_DIR "data/shaders/fragment.glsl");
// Load texture image // Load texture image
SDL_Surface *image = IMG_Load(ROOT_DIR "data/container.jpg"); // SDL_Surface *image = IMG_Load(ROOT_DIR "data/container.jpg");
if (image == nullptr) { // if (image == nullptr) {
error.crash("SDL2_image was unable to load a texture", IMG_GetError()); // error.crash("SDL2_image was unable to load a texture", IMG_GetError());
} //}
// create and bind texture object // create and bind texture object
unsigned int texture; // unsigned int texture;
glGenTextures(1, &texture); // glGenTextures(1, &texture);
// glBindTexture(GL_TEXTURE_2D, texture); //// glBindTexture(GL_TEXTURE_2D, texture);
// Handle different SDL Surface data types //// Handle different SDL Surface data types
int mode = GL_RGB; // int mode = GL_RGB;
if (image->format->BytesPerPixel == 4) { // if (image->format->BytesPerPixel == 4) {
mode = GL_RGBA; // mode = GL_RGBA;
} //}
// Generate texture and mipmap from image //// Generate texture and mipmap from image
glTexImage2D(GL_TEXTURE_2D, 0, mode, image->w, image->h, 0, mode, // glTexImage2D(GL_TEXTURE_2D, 0, mode, image->w, image->h, 0, mode,
GL_UNSIGNED_BYTE, image->pixels); // GL_UNSIGNED_BYTE, image->pixels);
glGenerateMipmap(GL_TEXTURE_2D); // glGenerateMipmap(GL_TEXTURE_2D);
// remove image surface now it's no longer needed to create texture // remove image surface now it's no longer needed to create texture
SDL_FreeSurface(image); // SDL_FreeSurface(image);
image = nullptr; // image = nullptr;
// Generate Mesh // Generate Mesh
// Define some useful structures to be used in the mesh object // Define some useful structures to be used in the mesh object
@ -121,70 +121,70 @@ int main(int argc, char **argv) {
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f // top left -0.5f, 0.5f, 0.0f, 0.0f, 1.0f // top left
}; };
unsigned int indices[] = { // unsigned int indices[] = {
0, 1, 3, // First triangle // 0, 1, 3, // First triangle
1, 2, 3 // Second triangle // 1, 2, 3 // Second triangle
}; //};
std::vector<Vertex> mvertices; // std::vector<Vertex> mvertices;
Vertex vertex; // Vertex vertex;
vertex.Position = glm::vec3(0.5f, 0.5f, 0.0f); // vertex.Position = glm::vec3(0.5f, 0.5f, 0.0f);
vertex.Normal = glm::vec3(); // vertex.Normal = glm::vec3();
vertex.TexCoords = glm::vec2(1.0f, 1.0f); // vertex.TexCoords = glm::vec2(1.0f, 1.0f);
mvertices.push_back(vertex); // mvertices.push_back(vertex);
vertex.Position = glm::vec3(0.5f, -0.5f, 0.0f); // vertex.Position = glm::vec3(0.5f, -0.5f, 0.0f);
vertex.Normal = glm::vec3(); // vertex.Normal = glm::vec3();
vertex.TexCoords = glm::vec2(1.0f, 0.0f); // vertex.TexCoords = glm::vec2(1.0f, 0.0f);
mvertices.push_back(vertex); // mvertices.push_back(vertex);
vertex.Position = glm::vec3(-0.5f, -0.5f, 0.0f); // vertex.Position = glm::vec3(-0.5f, -0.5f, 0.0f);
vertex.Normal = glm::vec3(); // vertex.Normal = glm::vec3();
vertex.TexCoords = glm::vec2(0.0f, 0.0f); // vertex.TexCoords = glm::vec2(0.0f, 0.0f);
mvertices.push_back(vertex); // mvertices.push_back(vertex);
vertex.Position = glm::vec3(-0.5f, 0.5f, 0.0f); // vertex.Position = glm::vec3(-0.5f, 0.5f, 0.0f);
vertex.Normal = glm::vec3(); // vertex.Normal = glm::vec3();
vertex.TexCoords = glm::vec2(0.0f, 1.0f); // vertex.TexCoords = glm::vec2(0.0f, 1.0f);
mvertices.push_back(vertex); // mvertices.push_back(vertex);
std::vector<unsigned int> mindices{ // std::vector<unsigned int> mindices{
0, 3, 1, // First triangle // 0, 3, 1, // First triangle
1, 3, 2 // Second triangle // 1, 3, 2 // Second triangle
}; //};
std::vector<Texture> mtextures; // std::vector<Texture> mtextures;
Texture mtexture; // Texture mtexture;
mtexture.id = texture; // mtexture.id = texture;
mtexture.type = "texture_diffuse"; // mtexture.type = "texture_diffuse";
Mesh mesh(mvertices, mindices, mtextures); // Mesh mesh(mvertices, mindices, mtextures);
std::vector<Vertex> mvertices2; // std::vector<Vertex> mvertices2;
vertex.Position = glm::vec3(0.5f, 0.5f, 1.0f); // vertex.Position = glm::vec3(0.5f, 0.5f, 1.0f);
vertex.Normal = glm::vec3(); // vertex.Normal = glm::vec3();
vertex.TexCoords = glm::vec2(1.0f, 1.0f); // vertex.TexCoords = glm::vec2(1.0f, 1.0f);
mvertices2.push_back(vertex); // mvertices2.push_back(vertex);
vertex.Position = glm::vec3(0.5f, -0.5f, 1.0f); // vertex.Position = glm::vec3(0.5f, -0.5f, 1.0f);
vertex.Normal = glm::vec3(); // vertex.Normal = glm::vec3();
vertex.TexCoords = glm::vec2(1.0f, 0.0f); // vertex.TexCoords = glm::vec2(1.0f, 0.0f);
mvertices2.push_back(vertex); // mvertices2.push_back(vertex);
vertex.Position = glm::vec3(-0.5f, -0.5f, 1.0f); // vertex.Position = glm::vec3(-0.5f, -0.5f, 1.0f);
vertex.Normal = glm::vec3(); // vertex.Normal = glm::vec3();
vertex.TexCoords = glm::vec2(0.0f, 0.0f); // vertex.TexCoords = glm::vec2(0.0f, 0.0f);
mvertices2.push_back(vertex); // mvertices2.push_back(vertex);
vertex.Position = glm::vec3(-0.5f, 0.5f, 1.0f); // vertex.Position = glm::vec3(-0.5f, 0.5f, 1.0f);
vertex.Normal = glm::vec3(); // vertex.Normal = glm::vec3();
vertex.TexCoords = glm::vec2(0.0f, 1.0f); // vertex.TexCoords = glm::vec2(0.0f, 1.0f);
mvertices2.push_back(vertex); // mvertices2.push_back(vertex);
Mesh mesh2(mvertices2, mindices, mtextures); // Mesh mesh2(mvertices2, mindices, mtextures);
std::vector<Mesh> modelMeshes; // std::vector<Mesh> modelMeshes;
modelMeshes.push_back(mesh); // modelMeshes.push_back(mesh);
modelMeshes.push_back(mesh2); // modelMeshes.push_back(mesh2);
Model model(modelMeshes); // Model model(modelMeshes);
Model model2(mesh); // Model model2(mesh);
model.translate(glm::vec3(1.0f, 0.0f, 0.0f)); // model.translate(glm::vec3(1.0f, 0.0f, 0.0f));
// Model backpack(ROOT_DIR "data/models/backpack/backpack.obj"); // Model backpack(ROOT_DIR "data/models/backpack/backpack.obj");
Model cube(ROOT_DIR "data/models/cube/cube.obj"); Model cube(ROOT_DIR "data/models/cube/cube.obj");
@ -231,6 +231,7 @@ int main(int argc, char **argv) {
// model2.draw(shader); // model2.draw(shader);
// model.draw(shader); // model.draw(shader);
cube.draw(shader); cube.draw(shader);
// backpack.draw(shader);
// Finally render everything // Finally render everything
shader.use(); shader.use();