From d655b52aa2d389dd8b99a046f760d9d81a189cc0 Mon Sep 17 00:00:00 2001 From: Dane Johnson Date: Wed, 20 Jan 2021 14:54:54 -0600 Subject: [PATCH] Can add models with multiple textures --- core/Ball.cpp | 4 +++ core/Mesh.cpp | 65 ++++++++++++++++++++++++------------ core/Mesh.h | 36 ++++++++++++++------ core/Shaders/FlatShader.cpp | 4 --- core/Shaders/FlatShader.h | 7 +++- core/couch.cpp | 15 +-------- demo/main.lua | 30 ++++++++++++----- demo/railing.png | Bin 0 -> 17152 bytes scripting/couch.i | 15 +++++++-- 9 files changed, 115 insertions(+), 61 deletions(-) create mode 100644 demo/railing.png diff --git a/core/Ball.cpp b/core/Ball.cpp index 05ce039..abf78c0 100644 --- a/core/Ball.cpp +++ b/core/Ball.cpp @@ -1,6 +1,8 @@ #include "Ball.h" Ball::Ball() { + IndexList indices; + VertexList vertices; // It's a cube really // Front vertices.push_back(Vertex(1.0f, 1.0f, 1.0f, 0.0f, 1.0f)); @@ -31,5 +33,7 @@ Ball::Ball() { // Right side indices.push_back(Index(2, 3, 7)); indices.push_back(Index(2, 6, 7)); + + submeshes.push_back(new SubMesh(vertices, indices)); } diff --git a/core/Mesh.cpp b/core/Mesh.cpp index 8891d01..4dcb830 100644 --- a/core/Mesh.cpp +++ b/core/Mesh.cpp @@ -1,21 +1,15 @@ #include "Mesh.h" -Mesh::Mesh() { +SubMesh::SubMesh() { material = new Material(); } -Mesh::~Mesh() { - if (material) { - delete material; - } -} - -Mesh::Mesh(VertexList vertices, IndexList indices) { +SubMesh::SubMesh(VertexList vertices, IndexList indices) { this->vertices = vertices; this->indices = indices; } -void Mesh::SetupMesh() { +void SubMesh::SetupSubMesh() { glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glGenBuffers(1, &EBO); @@ -40,6 +34,32 @@ void Mesh::SetupMesh() { glBindVertexArray(0); } +void SubMesh::Draw(Shader *shader) { + shader->UpdateColor(material->usesColor, material->color); + shader->UpdateTex(material->usesTex, material->tex); + glBindVertexArray(VAO); + glDrawElements(GL_TRIANGLES, indices.size() * 3, GL_UNSIGNED_INT, 0); + glBindVertexArray(0); +} + +Mesh::Mesh() {} + +Mesh::~Mesh() { + for (SubMesh *sub : submeshes) { + delete sub; + } +} + +void Mesh::SetupMesh() { + for (SubMesh *sub : submeshes) { + sub->SetupSubMesh(); + } +} + +void Mesh::SetMaterial(int submesh, Material *material) { + submeshes[submesh]->material = material; +} + Mesh* Mesh::FromFile(const char *filename) { // HOCUS: https://assimp-docs.readthedocs.io/en/latest/usage/use_the_lib.html Assimp::Importer importer; @@ -56,31 +76,34 @@ Mesh* Mesh::FromFile(const char *filename) { } aiNode *root = scene->mRootNode; - aiMesh *mesh_to_import = scene->mMeshes[root->mMeshes[0]]; + Mesh *my_mesh = new Mesh(); + for (int i = 0; i < root->mNumMeshes; i++) { + aiMesh *mesh_to_import = scene->mMeshes[root->mMeshes[i]]; + my_mesh->submeshes.push_back(aiMesh2SubMesh(mesh_to_import)); + } - return aiMesh2Mesh(mesh_to_import); + return my_mesh; } -Mesh *Mesh::aiMesh2Mesh(aiMesh *aimesh){ - Mesh *mymesh = new Mesh(); +SubMesh *Mesh::aiMesh2SubMesh(aiMesh *aimesh){ + SubMesh *sub = new SubMesh(); for (int i = 0; i < aimesh->mNumVertices; i++) { aiVector3D aiPosition = aimesh->mVertices[i]; aiVector3D aiUV = aimesh->mTextureCoords[0][i]; // TODO get ALL texture coords Vertex vertex(aiPosition.x, aiPosition.y, aiPosition.z, aiUV.x, aiUV.y); - mymesh->vertices.push_back(vertex); + sub->vertices.push_back(vertex); } for (int i = 0; i < aimesh->mNumFaces; i++) { // We're importing triangulated meshes, so each face is three indices unsigned int *face = aimesh->mFaces[i].mIndices; Index index(face[0], face[1], face[2]); - mymesh->indices.push_back(index); + sub->indices.push_back(index); } - return mymesh; + return sub; } - -void Mesh::Draw() { - glBindVertexArray(VAO); - glDrawElements(GL_TRIANGLES, indices.size() * 3, GL_UNSIGNED_INT, 0); - glBindVertexArray(0); +void Mesh::Draw(Shader *shader) { + for (SubMesh *sub : submeshes) { + sub->Draw(shader); + } } diff --git a/core/Mesh.h b/core/Mesh.h index 4353926..f045f55 100644 --- a/core/Mesh.h +++ b/core/Mesh.h @@ -2,8 +2,9 @@ #define MESH_H #include +#include -// Thirdpart includes +// Thirdparty includes #include #include #include @@ -15,21 +16,36 @@ #include "Index.h" #include "Material.h" -class Mesh : public Spatial { +#include "Shaders/Shader.h" + +class SubMesh { public: + SubMesh(); + SubMesh(VertexList vertices, IndexList indices); VertexList vertices; IndexList indices; Material *material; - Mesh(); - ~Mesh(); - Mesh(VertexList vertices, IndexList indices); - static Mesh *FromFile(const char *filename); - virtual bool IsDrawable() const {return true;} - virtual void Draw(); - virtual void SetupMesh(); + void SetupSubMesh(); + void Draw(Shader *shader); private: Id VAO, VBO, EBO; - static Mesh *aiMesh2Mesh(aiMesh *mesh); +}; + +typedef std::vector SubMeshList; + +class Mesh : public Spatial { +public: + Mesh(); + ~Mesh(); + void SetMaterial(int submesh, Material *material); + static Mesh *FromFile(const char *filename); + virtual bool IsDrawable() const {return true;} + virtual void Draw(Shader *shader); + virtual void SetupMesh(); +protected: + SubMeshList submeshes; +private: + static SubMesh *aiMesh2SubMesh(aiMesh *mesh); }; typedef std::list MeshList; diff --git a/core/Shaders/FlatShader.cpp b/core/Shaders/FlatShader.cpp index 70e4f57..1030b87 100644 --- a/core/Shaders/FlatShader.cpp +++ b/core/Shaders/FlatShader.cpp @@ -3,7 +3,3 @@ #include "flat.frag.h" FlatShader::FlatShader() : Shader(flat_vert, flat_frag) {} - -void FlatShader::UpdateColor(Vector3 color) { - glUniform3f(glGetUniformLocation(id, "color"), color.r, color.g, color.b); -} diff --git a/core/Shaders/FlatShader.h b/core/Shaders/FlatShader.h index 165b58f..dd0e90b 100644 --- a/core/Shaders/FlatShader.h +++ b/core/Shaders/FlatShader.h @@ -1,7 +1,12 @@ +#ifndef FLATSHADER_H +#define FLATSHADER_H + #include "Shader.h" class FlatShader : public Shader { public: FlatShader(); - void UpdateColor(Vector3 color); }; + +#endif /* FLATSHADER_H */ + diff --git a/core/couch.cpp b/core/couch.cpp index 0a8d12d..990610c 100644 --- a/core/couch.cpp +++ b/core/couch.cpp @@ -41,17 +41,7 @@ void render(Node *curr, Shader *shader, Matrix model) { shader->UpdateModel(model); } Mesh *mesh = dynamic_cast(curr); - if (mesh->material->usesColor) { - shader->UpdateColor(true, mesh->material->color); - } else { - shader->UpdateColor(false); - } - if (mesh->material->usesTex) { - shader->UpdateTex(true, mesh->material->tex); - } else { - shader->UpdateTex(false); - } - mesh->Draw(); + mesh->Draw(shader); } for (Node *child : curr->children) { render(child, shader, model); @@ -85,9 +75,6 @@ int main() { glViewport(0, 0, width, height); - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - root = Node::GetRoot(); Input *input = Input::GetInstance(); diff --git a/demo/main.lua b/demo/main.lua index 44aa2b8..8a7fc26 100644 --- a/demo/main.lua +++ b/demo/main.lua @@ -24,33 +24,47 @@ local RED = couch.Color(1.0, 0.0, 0.0) local BLUE = couch.Color(0.0, 0.0, 1.0) function init() + local material + camera = couch.Camera() camera:MakeCurrent() camera.transform:Translate(0.0, 0.0, 10.0) ball = couch.Ball() ball:SetupMesh() - ball.material.color = RED - ball.material.usesColor = true + material = couch.Material.new() + material.color = RED + material.usesColor = true + ball:SetMaterial(0, material) couch.Node.GetRoot().children:Append(ball) ball1 = couch.Ball() ball1:SetupMesh() - ball1.material.tex = couch.Texture.FromFile("container.png") - ball1.material.usesTex = true + material = couch.Material.new() + material.tex = couch.Texture.FromFile("container.png") + material.usesTex = true + ball1:SetMaterial(0, material) couch.Node.GetRoot().children:Append(ball1) ball1.transform:Translate(0.0, 3.0, 0.0) trough = couch.Mesh.FromFile("trough.glb") trough:SetupMesh() - trough.material.tex = couch.Texture.FromFile("wood_lowres.png") - trough.material.usesTex = true + material = couch.Material.new() + material.tex = couch.Texture.FromFile("wood_lowres.png") + material.usesTex = true + trough:SetMaterial(0, material) couch.Node.GetRoot().children:Append(trough) trough.transform:Translate(10.0, 0.0, 0.0) scaffold = couch.Mesh.FromFile("scaffold.glb") scaffold:SetupMesh() - scaffold.material.tex = couch.Texture.FromFile("grate_floor_lowres.png") - scaffold.material.usesTex = true + material = couch.Material.new() + material.tex = couch.Texture.FromFile("grate_floor_lowres.png") + material.usesTex = true + scaffold:SetMaterial(0, material) + material = couch.Material.new() + material.tex = couch.Texture.FromFile("railing.png") + material.usesTex = true + scaffold:SetMaterial(1, material) couch.Node.GetRoot().children:Append(scaffold) scaffold.transform:Translate(-10.0, 0.0, 0.0) end diff --git a/demo/railing.png b/demo/railing.png new file mode 100644 index 0000000000000000000000000000000000000000..f7aaa57c91580a43dfa5e05612288c6684f04a78 GIT binary patch literal 17152 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 literal 0 HcmV?d00001 diff --git a/scripting/couch.i b/scripting/couch.i index ee14760..07691a4 100644 --- a/scripting/couch.i +++ b/scripting/couch.i @@ -7,12 +7,14 @@ #include "Node.h" #include "Transform.h" #include "Spatial.h" -#include "Material.h" #include "Mesh.h" #include "Ball.h" +#include "Material.h" #include "Camera.h" %} +%rename("%(strip:[script_])s") ""; + typedef float cfloat; %ignore "cfloat"; @@ -21,6 +23,7 @@ public: Vector3(); cfloat x, y, z; }; + %extend Vector3 { Vector3 operator+(const Vector3 &o) const { return *$self + o; @@ -31,12 +34,18 @@ public: } %ignore "Vector3"; +%extend Material { + static Material* Material::script_new() { + return new Material(); + } +} + %include "types.h" %include "Node.h" %include "Spatial.h" -%include "Transform.h" -%include "Material.h" %include "Mesh.h" %include "Ball.h" +%include "Transform.h" +%include "Material.h" %include "Camera.h"