From 5fe67de6d8649c9a24be60528d2c60eb3d284a84 Mon Sep 17 00:00:00 2001 From: Peter Schaefer Date: Wed, 13 Apr 2016 20:00:03 +0200 Subject: [PATCH] moved bind/gen/deleteBuffer ->Shader CollisionShapes statt BBox --- Weave/Graphix/Model/IMetaMesh.cpp | 8 ++++ Weave/Graphix/Model/IMetaMesh.h | 1 + Weave/Graphix/Model/Model.cpp | 80 ++++++++----------------------- Weave/Graphix/Model/Model.h | 9 +--- Weave/Graphix/Model/Plane.cpp | 4 +- Weave/Graphix/Model/SkyBox.cpp | 2 +- Weave/Graphix/Shader.cpp | 61 ++++++++++++++++++++--- Weave/Graphix/Shader.h | 16 +++++-- Weave/Graphix/Texture.cpp | 4 +- Weave/Graphix/ViewPort.cpp | 12 ++--- Weave/Scene/SceneObject.cpp | 4 +- 11 files changed, 111 insertions(+), 90 deletions(-) diff --git a/Weave/Graphix/Model/IMetaMesh.cpp b/Weave/Graphix/Model/IMetaMesh.cpp index b536c17..a907c49 100644 --- a/Weave/Graphix/Model/IMetaMesh.cpp +++ b/Weave/Graphix/Model/IMetaMesh.cpp @@ -154,6 +154,14 @@ void IMetaMesh::drawModel(const mat4& _modelMat) const } } +void IMetaMesh::drawWire(const mat4& _modelMat, const vec4& _color) const +{ + for (auto i = models.begin(); i != models.end(); ++i) + { + i->first->drawWire(_modelMat* i->second, _color*0.8f); + } +} + void IMetaMesh::bt_init(bool _isConvex) { if (bt_collision_shape == nullptr) diff --git a/Weave/Graphix/Model/IMetaMesh.h b/Weave/Graphix/Model/IMetaMesh.h index 287add2..e8f14fb 100644 --- a/Weave/Graphix/Model/IMetaMesh.h +++ b/Weave/Graphix/Model/IMetaMesh.h @@ -23,6 +23,7 @@ public: void unbindShader(const Shader* shader) override; void drawModel(const mat4& modelMat) const override; + void drawWire(const mat4& modelMat, const vec4& _color = vec4(0.9f, 0.f, 0.f, 1.f)) const override; void drawBBox(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const override; diff --git a/Weave/Graphix/Model/Model.cpp b/Weave/Graphix/Model/Model.cpp index a7bce97..c819389 100644 --- a/Weave/Graphix/Model/Model.cpp +++ b/Weave/Graphix/Model/Model.cpp @@ -52,13 +52,13 @@ Model::operator std::string() const void Model::bindModel() { if(vertex != nullptr) - genBuffer(vertexBuffer,GL_ARRAY_BUFFER, numvertices * 3 * sizeof(float), (void*)vertex); + Shader::genBuffer(vertexBuffer,GL_ARRAY_BUFFER, numvertices * 3 * sizeof(float), (void*)vertex); if (normals != nullptr) - genBuffer(normalBuffer, GL_ARRAY_BUFFER, numvertices * 3 * sizeof(float), (void*)normals); + Shader::genBuffer(normalBuffer, GL_ARRAY_BUFFER, numvertices * 3 * sizeof(float), (void*)normals); if (uvs != nullptr) - genBuffer(uvBuffer, GL_ARRAY_BUFFER, numvertices * 2 * sizeof(float), (void*)uvs); + Shader::genBuffer(uvBuffer, GL_ARRAY_BUFFER, numvertices * 2 * sizeof(float), (void*)uvs); if (index != nullptr) - genBuffer(indexBuffer, GL_ELEMENT_ARRAY_BUFFER, numfaces * 3 * sizeof(uint), (void*)index); + Shader::genBuffer(indexBuffer, GL_ELEMENT_ARRAY_BUFFER, numfaces * 3 * sizeof(uint), (void*)index); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); @@ -66,10 +66,10 @@ void Model::bindModel() void Model::unbindModel() { - deleteBuffer(vertexBuffer); - deleteBuffer(indexBuffer); - deleteBuffer(normalBuffer); - deleteBuffer(uvBuffer); + Shader::deleteBuffer(vertexBuffer); + Shader::deleteBuffer(indexBuffer); + Shader::deleteBuffer(normalBuffer); + Shader::deleteBuffer(uvBuffer); } @@ -92,15 +92,9 @@ void Model::bindShader(const Shader* _shader) glGenVertexArrays(1, &vao); glBindVertexArray(vao); - - if (vertexBuffer != (uint)-1) - bindBuffer(vertexBuffer, GL_ARRAY_BUFFER, _shader->getAttribLocation("aPosition")); - - if (uvBuffer != (uint)-1) - bindBuffer(uvBuffer, GL_ARRAY_BUFFER, _shader->getAttribLocation("aUV"), 2); - - if (normalBuffer != (uint)-1) - bindBuffer(normalBuffer, GL_ARRAY_BUFFER, _shader->getAttribLocation("aNormal")); + _shader->bindBuffer(vertexBuffer, GL_ARRAY_BUFFER, "aPosition"); + _shader->bindBuffer(uvBuffer, GL_ARRAY_BUFFER, "aUV", 2); + _shader->bindBuffer(normalBuffer, GL_ARRAY_BUFFER, "aNormal"); if (indexBuffer != (uint)-1) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); @@ -129,7 +123,8 @@ void Model::drawModel() const void Model::drawWire() const { - glDrawElements(GL_LINE_LOOP, numfaces * 3, GL_UNSIGNED_INT, 0); + for (uint i = 0; i < numfaces; i++) + glDrawElements(GL_LINE_LOOP, 3, GL_UNSIGNED_INT, (void*)(3*i*sizeof(unsigned int))); glBindVertexArray(0); } @@ -143,11 +138,14 @@ void Model::drawModel(const mat4& _modelMat) const drawModel(); } -void Model::drawWire(const mat4& _modelMat) const +void Model::drawWire(const mat4& _modelMat, const vec4& _color) const { + //Shader::gBasic()->useShader(); useModel(_modelMat); + Shader::gActive()->setUniformLocation("uFragmentColor", _color); + drawWire(); } @@ -157,7 +155,7 @@ void Model::drawBBox(const mat4& _modelMat, const vec4& _color) const Graphix::getGlError(); Shader::gBasic()->useShader(); - Shader::setUniformLocation("uFragmentColor", _color); + Shader::gActive()->setUniformLocation("uFragmentColor", _color); Graphix::getGlError(); @@ -171,7 +169,7 @@ void Model::drawBBox(const mat4& _modelMat, const vec4& _color) const vec3 size = (max - min); vec3 center = (max + min) * .5f; - Shader::gBasic()->useShader(); + //Shader::gBasic()->useShader(); getBBoxModel()->drawModel(_modelMat*translate(center)*glm::scale(size)); // } @@ -189,44 +187,6 @@ void Model::drawBBox(const mat4& _modelMat, const vec4& _color) const // _center = (max + min) * .5f; //} -void Model::genBuffer(uint &buffer, const uint target, const uint size, const void* value) -{ - if (buffer != (uint)-1) - { -// Message::error("genBuffer: Buffer wurde schon gesetzt und ausgelassen."); - return; - } - - glGenBuffers(1, &buffer); - glBindBuffer(target, buffer); - glBufferData(target, size, value, GL_STATIC_DRAW); - //glBindBuffer(target, 0); -} - -void Model::deleteBuffer(uint &buffer) -{ - if (buffer != (uint)-1) - { - glDeleteBuffers(1, &buffer); - buffer = -1; - } -} - -void Model::bindBuffer(const uint &buffer, const uint target, const uint index, const uint dim) -{ - //Falls index nicht gefunden werden konnte - if (index == (uint)-1) - { - Message::error("Model: BindBuffer wird ausgelassen da index fehlerhaft ist."); - return; - } - - glBindBuffer(target, buffer); - glEnableVertexAttribArray(index); - glVertexAttribPointer(index, dim, GL_FLOAT, GL_FALSE, 0, 0); //FLOAT as Default - //glBindBuffer(target, 0); -} - void Model::useModel(const mat4& _modelMat) const { @@ -243,7 +203,7 @@ void Model::useModel(const mat4& _modelMat) const /* use ModelMAT*/ - Shader::setUniformLocation("uModel", _modelMat); + Shader::gActive()->setUniformLocation("uModel", _modelMat); } diff --git a/Weave/Graphix/Model/Model.h b/Weave/Graphix/Model/Model.h index 81499e5..c14756b 100644 --- a/Weave/Graphix/Model/Model.h +++ b/Weave/Graphix/Model/Model.h @@ -25,7 +25,7 @@ public: /* Draws Model */ virtual void drawModel(const mat4& modelMat) const; - virtual void drawWire(const mat4& modelMat) const; + virtual void drawWire(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const; /* Draws a BoundingBox around the Model */ virtual void drawBBox(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const; @@ -62,13 +62,6 @@ protected: uint *index = nullptr; std::unordered_map shader_map; - - //gen Buffer - void genBuffer(uint &buffer, const uint target, const uint size, const void* value); - //delete Buffer - void deleteBuffer(uint &buffer); - //bind Buffer to VAO - void bindBuffer(const uint &buffer, const uint tartget, const uint index, const uint dim = 3); /* use Model with active Shader*/ diff --git a/Weave/Graphix/Model/Plane.cpp b/Weave/Graphix/Model/Plane.cpp index 597cde0..f967b4c 100644 --- a/Weave/Graphix/Model/Plane.cpp +++ b/Weave/Graphix/Model/Plane.cpp @@ -31,7 +31,7 @@ void Plane::drawModel() const { useModel(mat4(1.f)); - Shader::setUniformLocation("uPlain", 1); + Shader::gActive()->setUniformLocation("uPlain", 1); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glBindVertexArray(0); @@ -40,7 +40,7 @@ void Plane::drawModel() const void Plane::bt_init(bool isConvex) { if(bt_collision_shape==nullptr) - bt_collision_shape = new btBoxShape(btVector3(.5f, .5f, .5f)); + bt_collision_shape = new btBoxShape(btVector3(.5f, .5f, .001f)); } diff --git a/Weave/Graphix/Model/SkyBox.cpp b/Weave/Graphix/Model/SkyBox.cpp index fb963af..a3f5e23 100644 --- a/Weave/Graphix/Model/SkyBox.cpp +++ b/Weave/Graphix/Model/SkyBox.cpp @@ -38,7 +38,7 @@ void SkyBox::drawModel(const mat4& _modelMat) const useModel(_modelMat); - Shader::setUniformLocation("uFar", 1); + Shader::gActive()->setUniformLocation("uFar", 1); Model::drawModel(); //glEnable(GL_DEPTH_TEST); diff --git a/Weave/Graphix/Shader.cpp b/Weave/Graphix/Shader.cpp index 285eac6..68bd179 100644 --- a/Weave/Graphix/Shader.cpp +++ b/Weave/Graphix/Shader.cpp @@ -40,6 +40,55 @@ int Shader::getAttribLocation(const string& name) const return ind; } +void Shader::genBuffer(uint &buffer, const uint target, const uint size, const void* value, const uint _draw) +{ + if (buffer != (uint)-1) + { + // Message::error("genBuffer: Buffer wurde schon gesetzt und ausgelassen."); + return; + } + + glGenBuffers(1, &buffer); + glBindBuffer(target, buffer); + glBufferData(target, size, value, _draw); + //glBindBuffer(target, 0); +} + +void Shader::deleteBuffer(uint &buffer) +{ + if (buffer == (uint)-1) + { + Message::error("Model: DeleteBuffer wird ausgelassen da buffer leer ist."); + return; + } + + glDeleteBuffers(1, &buffer); + buffer = -1; +} + +void Shader::bindBuffer(const uint &_buffer, const uint _target, const string& _name, const uint _dim) const +{ + if (_buffer == (uint)-1) + { + Message::error("Model: BindBuffer wird ausgelassen da buffer fuer [" + _name + "] nicht leer ist."); + return; + } + + + //Falls index nicht gefunden werden konnte + int ind = glGetAttribLocation(handle, _name.c_str()); + if (ind == (uint)-1) + { + Message::error("Model: BindBuffer wird ausgelassen da index fuer [" + _name + "] fehlerhaft ist."); + return; + } + + glBindBuffer(_target, _buffer); + glEnableVertexAttribArray(ind); + glVertexAttribPointer(ind, _dim, GL_FLOAT, GL_FALSE, 0, 0); //FLOAT as Default + //glBindBuffer(_target, 0); +} + int Shader::getUniformLocation(const string& name) const { int ind = glGetUniformLocation(handle, name.c_str()); @@ -49,25 +98,25 @@ int Shader::getUniformLocation(const string& name) const return ind; } -int Shader::setUniformLocation(const string& _name, const mat4& _mat) +int Shader::setUniformLocation(const string& _name, const mat4& _mat) const { - int tmp = glGetUniformLocation(*shActive, _name.c_str()); + int tmp = glGetUniformLocation(handle, _name.c_str()); if (tmp >= 0) glUniformMatrix4fv(tmp, 1, GL_FALSE, value_ptr(_mat)); return tmp; } -int Shader::setUniformLocation(const string& _name, const vec4& _vec) +int Shader::setUniformLocation(const string& _name, const vec4& _vec) const { - int tmp = glGetUniformLocation(*shActive, _name.c_str()); + int tmp = glGetUniformLocation(handle, _name.c_str()); if (tmp >= 0) glUniform4fv(tmp, 1, value_ptr(_vec)); return tmp; } -int Shader::setUniformLocation(const string& _name, const int& _i) +int Shader::setUniformLocation(const string& _name, const int& _i) const { - int tmp = glGetUniformLocation(*shActive, _name.c_str()); + int tmp = glGetUniformLocation(handle, _name.c_str()); if (tmp >= 0) glUniform1i(tmp, _i); return tmp; diff --git a/Weave/Graphix/Shader.h b/Weave/Graphix/Shader.h index 1473e55..8a96a4f 100644 --- a/Weave/Graphix/Shader.h +++ b/Weave/Graphix/Shader.h @@ -3,6 +3,7 @@ #include #include #include "../GLM.h" +#include "../GL/glew.h" using std::string; @@ -18,13 +19,20 @@ public: int getAttribLocation(const string& name) const; int getUniformLocation(const string& name) const; + uint getHandle() const; operator uint() const; - //static int setAttribLocation(const string& name) const; - static int setUniformLocation(const string& name, const mat4& mat); - static int setUniformLocation(const string& name, const vec4& vec); - static int setUniformLocation(const string& name, const int& i); + /*genBuffer*/ + static void genBuffer(uint &buffer, const uint target, const uint size, const void* value, const uint draw= GL_STATIC_DRAW); + //delete Buffer + static void deleteBuffer(uint &buffer); + //bind Buffer to VAO + void bindBuffer(const uint &buffer, const uint tartget, const string& name, const uint dim = 3) const; + + int setUniformLocation(const string& name, const mat4& mat) const; + int setUniformLocation(const string& name, const vec4& vec) const; + int setUniformLocation(const string& name, const int& i) const; static const Shader * gActive(); static const Shader * gBasic(); diff --git a/Weave/Graphix/Texture.cpp b/Weave/Graphix/Texture.cpp index 98529c5..5f57fcb 100644 --- a/Weave/Graphix/Texture.cpp +++ b/Weave/Graphix/Texture.cpp @@ -145,10 +145,10 @@ void Texture::useTexture() const glActiveTexture(GL_TEXTURE0 + unit); glBindTexture(TEXTURE_TYPE, handle); - Shader::setUniformLocation("uColorTexture", unit); + Shader::gActive()->setUniformLocation("uColorTexture", unit); /* bind Material*/ - Shader::setUniformLocation("material", material); + Shader::gActive()->setUniformLocation("material", material); } Texture::operator string() const diff --git a/Weave/Graphix/ViewPort.cpp b/Weave/Graphix/ViewPort.cpp index 058ca31..c7a5d2e 100644 --- a/Weave/Graphix/ViewPort.cpp +++ b/Weave/Graphix/ViewPort.cpp @@ -39,18 +39,18 @@ void ViewPort::useViewPort() const void ViewPort::bindView(const Shader* shader) const{ shader->useShader(); - Shader::setUniformLocation("uProjection", projection); - Shader::setUniformLocation("uInvProjection", glm::inverse(projection)); - Shader::setUniformLocation("uView", view); + shader->setUniformLocation("uProjection", projection); + shader->setUniformLocation("uInvProjection", glm::inverse(projection)); + shader->setUniformLocation("uView", view); } void ViewPort::bindView(const Shader* shader, vec3 pos) const{ shader->useShader(); - Shader::setUniformLocation("uProjection", projection); - Shader::setUniformLocation("uInvProjection", glm::inverse(projection)); - Shader::setUniformLocation("uView", translate(view, -pos)); + shader->setUniformLocation("uProjection", projection); + shader->setUniformLocation("uInvProjection", glm::inverse(projection)); + shader->setUniformLocation("uView", translate(view, -pos)); } void ViewPort::rotateView(float angle_x, float angle_y){ diff --git a/Weave/Scene/SceneObject.cpp b/Weave/Scene/SceneObject.cpp index 9a271f1..c3c1fb9 100644 --- a/Weave/Scene/SceneObject.cpp +++ b/Weave/Scene/SceneObject.cpp @@ -237,7 +237,9 @@ void SceneObject::draw() const if (Events::isKToggleActive(SDLK_F6) && collision != nullptr) { - collision->drawBBox(modelMat); + Shader::gBasic()->useShader(); + collision->bindShader(Shader::gBasic()); + collision->drawWire(modelMat); //collision->drawWire(modelMat); } } -- 2.47.3