}\r
}\r
\r
+void IMetaMesh::drawWire(const mat4& _modelMat, const vec4& _color) const\r
+{\r
+ for (auto i = models.begin(); i != models.end(); ++i)\r
+ {\r
+ i->first->drawWire(_modelMat* i->second, _color*0.8f);\r
+ }\r
+}\r
+\r
void IMetaMesh::bt_init(bool _isConvex)\r
{\r
if (bt_collision_shape == nullptr)\r
void unbindShader(const Shader* shader) override;\r
\r
void drawModel(const mat4& modelMat) const override;\r
+ void drawWire(const mat4& modelMat, const vec4& _color = vec4(0.9f, 0.f, 0.f, 1.f)) const override;\r
\r
void drawBBox(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const override;\r
\r
void Model::bindModel()\r
{\r
if(vertex != nullptr)\r
- genBuffer(vertexBuffer,GL_ARRAY_BUFFER, numvertices * 3 * sizeof(float), (void*)vertex);\r
+ Shader::genBuffer(vertexBuffer,GL_ARRAY_BUFFER, numvertices * 3 * sizeof(float), (void*)vertex);\r
if (normals != nullptr)\r
- genBuffer(normalBuffer, GL_ARRAY_BUFFER, numvertices * 3 * sizeof(float), (void*)normals);\r
+ Shader::genBuffer(normalBuffer, GL_ARRAY_BUFFER, numvertices * 3 * sizeof(float), (void*)normals);\r
if (uvs != nullptr)\r
- genBuffer(uvBuffer, GL_ARRAY_BUFFER, numvertices * 2 * sizeof(float), (void*)uvs);\r
+ Shader::genBuffer(uvBuffer, GL_ARRAY_BUFFER, numvertices * 2 * sizeof(float), (void*)uvs);\r
if (index != nullptr)\r
- genBuffer(indexBuffer, GL_ELEMENT_ARRAY_BUFFER, numfaces * 3 * sizeof(uint), (void*)index);\r
+ Shader::genBuffer(indexBuffer, GL_ELEMENT_ARRAY_BUFFER, numfaces * 3 * sizeof(uint), (void*)index);\r
\r
glBindBuffer(GL_ARRAY_BUFFER, 0);\r
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);\r
\r
void Model::unbindModel()\r
{\r
- deleteBuffer(vertexBuffer);\r
- deleteBuffer(indexBuffer);\r
- deleteBuffer(normalBuffer);\r
- deleteBuffer(uvBuffer);\r
+ Shader::deleteBuffer(vertexBuffer);\r
+ Shader::deleteBuffer(indexBuffer);\r
+ Shader::deleteBuffer(normalBuffer);\r
+ Shader::deleteBuffer(uvBuffer);\r
\r
}\r
\r
glGenVertexArrays(1, &vao);\r
glBindVertexArray(vao);\r
\r
-\r
- if (vertexBuffer != (uint)-1)\r
- bindBuffer(vertexBuffer, GL_ARRAY_BUFFER, _shader->getAttribLocation("aPosition"));\r
-\r
- if (uvBuffer != (uint)-1)\r
- bindBuffer(uvBuffer, GL_ARRAY_BUFFER, _shader->getAttribLocation("aUV"), 2);\r
-\r
- if (normalBuffer != (uint)-1)\r
- bindBuffer(normalBuffer, GL_ARRAY_BUFFER, _shader->getAttribLocation("aNormal"));\r
+ _shader->bindBuffer(vertexBuffer, GL_ARRAY_BUFFER, "aPosition");\r
+ _shader->bindBuffer(uvBuffer, GL_ARRAY_BUFFER, "aUV", 2);\r
+ _shader->bindBuffer(normalBuffer, GL_ARRAY_BUFFER, "aNormal");\r
\r
if (indexBuffer != (uint)-1)\r
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);\r
\r
void Model::drawWire() const\r
{\r
- glDrawElements(GL_LINE_LOOP, numfaces * 3, GL_UNSIGNED_INT, 0);\r
+ for (uint i = 0; i < numfaces; i++)\r
+ glDrawElements(GL_LINE_LOOP, 3, GL_UNSIGNED_INT, (void*)(3*i*sizeof(unsigned int)));\r
glBindVertexArray(0);\r
}\r
\r
drawModel();\r
}\r
\r
-void Model::drawWire(const mat4& _modelMat) const\r
+void Model::drawWire(const mat4& _modelMat, const vec4& _color) const\r
{\r
+ //Shader::gBasic()->useShader();\r
\r
useModel(_modelMat);\r
\r
+ Shader::gActive()->setUniformLocation("uFragmentColor", _color);\r
+\r
drawWire();\r
\r
}\r
Graphix::getGlError();\r
Shader::gBasic()->useShader();\r
\r
- Shader::setUniformLocation("uFragmentColor", _color);\r
+ Shader::gActive()->setUniformLocation("uFragmentColor", _color);\r
\r
Graphix::getGlError();\r
\r
\r
vec3 size = (max - min);\r
vec3 center = (max + min) * .5f;\r
- Shader::gBasic()->useShader();\r
+ //Shader::gBasic()->useShader();\r
getBBoxModel()->drawModel(_modelMat*translate(center)*glm::scale(size)); //\r
}\r
\r
// _center = (max + min) * .5f;\r
//}\r
\r
-void Model::genBuffer(uint &buffer, const uint target, const uint size, const void* value)\r
-{\r
- if (buffer != (uint)-1)\r
- {\r
-// Message::error("genBuffer: Buffer wurde schon gesetzt und ausgelassen.");\r
- return;\r
- }\r
- \r
- glGenBuffers(1, &buffer);\r
- glBindBuffer(target, buffer);\r
- glBufferData(target, size, value, GL_STATIC_DRAW);\r
- //glBindBuffer(target, 0);\r
-}\r
-\r
-void Model::deleteBuffer(uint &buffer)\r
-{\r
- if (buffer != (uint)-1)\r
- {\r
- glDeleteBuffers(1, &buffer);\r
- buffer = -1;\r
- }\r
-}\r
-\r
-void Model::bindBuffer(const uint &buffer, const uint target, const uint index, const uint dim)\r
-{\r
- //Falls index nicht gefunden werden konnte\r
- if (index == (uint)-1)\r
- {\r
- Message::error("Model: BindBuffer wird ausgelassen da index fehlerhaft ist.");\r
- return;\r
- }\r
-\r
- glBindBuffer(target, buffer);\r
- glEnableVertexAttribArray(index);\r
- glVertexAttribPointer(index, dim, GL_FLOAT, GL_FALSE, 0, 0); //FLOAT as Default\r
- //glBindBuffer(target, 0);\r
-}\r
-\r
\r
void Model::useModel(const mat4& _modelMat) const\r
{\r
\r
\r
/* use ModelMAT*/\r
- Shader::setUniformLocation("uModel", _modelMat);\r
+ Shader::gActive()->setUniformLocation("uModel", _modelMat);\r
\r
}\r
\r
\r
/* Draws Model */\r
virtual void drawModel(const mat4& modelMat) const;\r
- virtual void drawWire(const mat4& modelMat) const;\r
+ virtual void drawWire(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const;\r
\r
/* Draws a BoundingBox around the Model */\r
virtual void drawBBox(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const;\r
uint *index = nullptr;\r
\r
std::unordered_map<uint, uint> shader_map;\r
-\r
- //gen Buffer\r
- void genBuffer(uint &buffer, const uint target, const uint size, const void* value);\r
- //delete Buffer\r
- void deleteBuffer(uint &buffer);\r
- //bind Buffer to VAO\r
- void bindBuffer(const uint &buffer, const uint tartget, const uint index, const uint dim = 3);\r
\r
\r
/* use Model with active Shader*/\r
{
useModel(mat4(1.f));
- Shader::setUniformLocation("uPlain", 1);
+ Shader::gActive()->setUniformLocation("uPlain", 1);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindVertexArray(0);
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));
}
\r
useModel(_modelMat);\r
\r
- Shader::setUniformLocation("uFar", 1);\r
+ Shader::gActive()->setUniformLocation("uFar", 1);\r
\r
Model::drawModel();\r
//glEnable(GL_DEPTH_TEST);\r
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());
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;
#include <fstream>
#include <unordered_map>
#include "../GLM.h"
+#include "../GL/glew.h"
using std::string;
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();
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
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){
if (Events::isKToggleActive(SDLK_F6) && collision != nullptr)
{
- collision->drawBBox(modelMat);
+ Shader::gBasic()->useShader();
+ collision->bindShader(Shader::gBasic());
+ collision->drawWire(modelMat);
//collision->drawWire(modelMat);
}
}