From: Peter Schaefer Date: Thu, 21 Apr 2016 09:27:17 +0000 (+0200) Subject: vereinfache Draw Befehl (verschiedene DRAW Typen/Target) X-Git-Url: https://git.leopard-lacewing.eu/?a=commitdiff_plain;h=151c3068327aecb62955d2777b20484749b1ac77;p=cgue_weave.git vereinfache Draw Befehl (verschiedene DRAW Typen/Target) BugFix (F3&F6 Draw Wireframe) removed drawWire(...) -> drawModel(mat,dr_Wire) removed drawBBox(...) -> drawModel(mat,dr_BBox) --- diff --git a/Weave/Graphix/Model/IMetaMesh.cpp b/Weave/Graphix/Model/IMetaMesh.cpp index a907c49..6d6b8f3 100644 --- a/Weave/Graphix/Model/IMetaMesh.cpp +++ b/Weave/Graphix/Model/IMetaMesh.cpp @@ -146,21 +146,21 @@ void IMetaMesh::unbindShader(const Shader* _shader) } } -void IMetaMesh::drawModel(const mat4& _modelMat) const +void IMetaMesh::drawModel(const mat4& _modelMat, drawType _type, const vec4& _color) const { for (auto i = models.begin(); i != models.end(); ++i) { - i->first->drawModel(_modelMat* i->second); + i->first->drawModel(_modelMat* i->second, _type, _color*.9f); } } -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::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) { @@ -190,26 +190,26 @@ void IMetaMesh::bt_init(bool _isConvex) } -void IMetaMesh::drawBBox(const mat4& _modelMat, const vec4& _color) const -{ - // Model::drawBBox(_modelMat, vec4(0.f,.3f,.9f,1.f)); - if (models.size() == 1) - { - auto i = models.front(); - i.first->drawBBox(_modelMat* i.second, _color); - } - else - { - Model::drawBBox(_modelMat, _color); - if (models.size() > 1) - { - for (auto i = models.begin(); i != models.end(); ++i) - { - i->first->drawBBox(_modelMat* i->second, _color*0.8f); - } - } - } -} +//void IMetaMesh::drawBBox(const mat4& _modelMat, const vec4& _color) const +//{ +// // Model::drawBBox(_modelMat, vec4(0.f,.3f,.9f,1.f)); +// if (models.size() == 1) +// { +// auto i = models.front(); +// i.first->drawBBox(_modelMat* i.second, _color); +// } +// else +// { +// Model::drawBBox(_modelMat, _color); +// if (models.size() > 1) +// { +// for (auto i = models.begin(); i != models.end(); ++i) +// { +// i->first->drawBBox(_modelMat* i->second, _color*0.8f); +// } +// } +// } +//} string IMetaMesh::type2str() const diff --git a/Weave/Graphix/Model/IMetaMesh.h b/Weave/Graphix/Model/IMetaMesh.h index e8f14fb..eff082a 100644 --- a/Weave/Graphix/Model/IMetaMesh.h +++ b/Weave/Graphix/Model/IMetaMesh.h @@ -22,10 +22,10 @@ public: void unbindModel() override; 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; + virtual void drawModel(const mat4& modelMat, drawType type = dr_Model, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) 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; + //void drawBBox(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const override; virtual void bt_init(bool isConvex = true) override; diff --git a/Weave/Graphix/Model/Model.cpp b/Weave/Graphix/Model/Model.cpp index ed85201..dd07243 100644 --- a/Weave/Graphix/Model/Model.cpp +++ b/Weave/Graphix/Model/Model.cpp @@ -129,50 +129,87 @@ void Model::drawWire() const glBindVertexArray(0); } -void Model::drawModel(const mat4& _modelMat) const +void Model::drawModel(const mat4& _modelMat, drawType _type, const vec4& _color) const { useModel(_modelMat); - if (Events::isKToggleActive(SDLK_F3)) + switch (_type) + { + default: + case dr_Model: + drawModel(); + break; + + case dr_WireC: + Shader::getShader()->setUniformLocation("uFragmentColor", _color); + case dr_WireT: drawWire(); - else - drawModel(); -} + break; -void Model::drawWire(const mat4& _modelMat, const vec4& _color) const -{ - //Shader::gBasic()->useShader(); + case dr_BBox: + //Shader::getShader(SH_BASIC)->useShader(); + Shader::getShader()->setUniformLocation("uFragmentColor", _color); - useModel(_modelMat); + btVector3 minB, maxB; + btTransform trans; + trans.setIdentity(); + bt_collision_shape->getAabb(trans, minB, maxB); - Shader::getShader()->setUniformLocation("uFragmentColor", _color); + vec3 min = vec3(minB.getX(), minB.getY(), minB.getZ()); + vec3 max = vec3(maxB.getX(), maxB.getY(), maxB.getZ()); - drawWire(); + vec3 size = (max - min); + vec3 center = (max + min) * .5f; + getBBoxModel()->drawModel(_modelMat*translate(center)*glm::scale(size)); + break; + } + } -void Model::drawBBox(const mat4& _modelMat, const vec4& _color) const -{ - Graphix::getGlError(); - Shader::getShader(SH_BASIC)->useShader(); - - Shader::getShader()->setUniformLocation("uFragmentColor", _color); - - Graphix::getGlError(); - - btVector3 minB, maxB; - btTransform trans; - trans.setIdentity(); - bt_collision_shape->getAabb(trans, minB, maxB); +//void Model::drawModel(const mat4& _modelMat) const +//{ +// useModel(_modelMat); +// +// drawModel(); +//} - vec3 min = vec3(minB.getX(), minB.getY(), minB.getZ()); - vec3 max = vec3(maxB.getX(), maxB.getY(), maxB.getZ()); +//void Model::drawWire(const mat4& _modelMat) const +//{ +// useModel(_modelMat); +// +// drawWire(); +// +//} +// +//void Model::drawWire(const mat4& _modelMat, const vec4& _color) const +//{ +// +// useModel(_modelMat); +// +// Shader::getShader()->setUniformLocation("uFragmentColor", _color); +// +// drawWire(); +// +//} - vec3 size = (max - min); - vec3 center = (max + min) * .5f; - //Shader::gBasic()->useShader(); - getBBoxModel()->drawModel(_modelMat*translate(center)*glm::scale(size)); // -} +//void Model::drawBBox(const mat4& _modelMat, const vec4& _color) const +//{ +// Shader::getShader(SH_BASIC)->useShader(); +// Shader::getShader()->setUniformLocation("uFragmentColor", _color); +// +// btVector3 minB, maxB; +// btTransform trans; +// trans.setIdentity(); +// bt_collision_shape->getAabb(trans, minB, maxB); +// +// vec3 min = vec3(minB.getX(), minB.getY(), minB.getZ()); +// vec3 max = vec3(maxB.getX(), maxB.getY(), maxB.getZ()); +// +// vec3 size = (max - min); +// vec3 center = (max + min) * .5f; +// getBBoxModel()->drawModel(_modelMat*translate(center)*glm::scale(size)); +//} //void Model::getBBcs(vec3& _center, vec3& _size) const //{ diff --git a/Weave/Graphix/Model/Model.h b/Weave/Graphix/Model/Model.h index eb201f1..0bfac79 100644 --- a/Weave/Graphix/Model/Model.h +++ b/Weave/Graphix/Model/Model.h @@ -11,6 +11,13 @@ struct aiMesh; typedef unsigned int uint; +enum drawType { + dr_Model = 0, + dr_WireT = 1, + dr_WireC = 2, + dr_BBox = 3, +}; + class Model { public: @@ -24,11 +31,13 @@ public: virtual void unbindShader(const Shader* shader); /* Draws Model */ - virtual void drawModel(const mat4& modelMat) const; - virtual void drawWire(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const; + virtual void drawModel(const mat4& modelMat, drawType type = dr_Model, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const; + //virtual void drawModel(const mat4& modelMat) const; + //virtual void drawWire(const mat4& modelMat, const vec4& color) const; + //virtual void drawWire(const mat4& modelMat) 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; + //virtual void drawBBox(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const; static Model* getBBoxModel(); static Model* getPlaneModel(); diff --git a/Weave/Graphix/Model/Plane.cpp b/Weave/Graphix/Model/Plane.cpp index 7772e79..a09c17a 100644 --- a/Weave/Graphix/Model/Plane.cpp +++ b/Weave/Graphix/Model/Plane.cpp @@ -29,7 +29,7 @@ Plane::~Plane() void Plane::drawModel() const { - useModel(mat4(1.f)); + //useModel(mat4(1.f)); Shader::getShader()->setUniformLocation("uPlain", 1); Shader::getShader()->setUniformLocation("uFar", 0); diff --git a/Weave/Graphix/Model/SkyBox.cpp b/Weave/Graphix/Model/SkyBox.cpp index 4b777d0..e3b8406 100644 --- a/Weave/Graphix/Model/SkyBox.cpp +++ b/Weave/Graphix/Model/SkyBox.cpp @@ -25,7 +25,7 @@ SkyBox::~SkyBox() { } -void SkyBox::drawModel(const mat4& _modelMat) const +void SkyBox::drawModel() const { //_shader->useShader(); //GLint OldCullFaceMode; @@ -36,8 +36,6 @@ void SkyBox::drawModel(const mat4& _modelMat) const glDepthFunc(GL_LEQUAL); //glDisable(GL_DEPTH_TEST); - useModel(_modelMat); - Shader::getShader()->setUniformLocation("uPlain", 0); Shader::getShader()->setUniformLocation("uFar", 1); diff --git a/Weave/Graphix/Model/SkyBox.h b/Weave/Graphix/Model/SkyBox.h index 2ce87da..49e9e77 100644 --- a/Weave/Graphix/Model/SkyBox.h +++ b/Weave/Graphix/Model/SkyBox.h @@ -10,7 +10,8 @@ public: SkyBox(); ~SkyBox(); - void drawModel(const mat4& modelMat) const override; +protected: + virtual void drawModel() const override; //uncommend following lines to use default Loaders //void useModelMat(const mat4& model, Shader* shader) const override; diff --git a/Weave/Scene/EventBox.cpp b/Weave/Scene/EventBox.cpp index 1db4abc..0ef1c80 100644 --- a/Weave/Scene/EventBox.cpp +++ b/Weave/Scene/EventBox.cpp @@ -48,10 +48,10 @@ void EventBox::update(float _deltaT) { } -void EventBox::draw() const +void EventBox::draw(drawTarget _target) const { -if (Events::isKToggleActive(SDLK_F6)) - collision->drawBBox(modelMat,vec4(.3f,.9f,.9f,1.f)); +if (_target == DRAW_Coll) + collision->drawModel(modelMat, dr_BBox, vec4(.3f,.9f,.9f,1.f)); } void EventBox::collides(SceneObject* _other, btPersistentManifold* _contactManifold, float _deltaT) diff --git a/Weave/Scene/EventBox.h b/Weave/Scene/EventBox.h index 68d0ead..f1b4ab3 100644 --- a/Weave/Scene/EventBox.h +++ b/Weave/Scene/EventBox.h @@ -16,8 +16,8 @@ public: EventBox(const mat4& modelMat, uint EB_TYPE=0); ~EventBox(); - virtual void update(float); - virtual void draw() const; + virtual void update(float) override; + virtual void draw(drawTarget target = DRAW_Model) const override; virtual void collides(SceneObject* other, btPersistentManifold* contactManifold, float deltaT = 1.f) override; protected: diff --git a/Weave/Scene/Scene.cpp b/Weave/Scene/Scene.cpp index 18801dd..5ef3b96 100644 --- a/Weave/Scene/Scene.cpp +++ b/Weave/Scene/Scene.cpp @@ -194,15 +194,35 @@ void Scene::update(float deltaT) void Scene::draw() const { + //Skybox + viewPort.bindView(Shader::getShader(SH_BASICTEXTURE), lookat->getPosition() + vec3(0.0f, 1.0f, 0.0f)); + //BBox + viewPort.bindView(Shader::getShader(SH_BASIC), lookat->getPosition() + vec3(0.0f, 1.0f, 0.0f)); + //SceneObjects + viewPort.bindView(Shader::getShader(SH_LIGHTING), lookat->getPosition() + vec3(0.0f, 1.0f, 0.0f)); + //ShadowDir + viewPort.bindViewShadowDir(Shader::getShader(SH_SHADOWDIR)); + + viewPort.useViewPort(); + + /*Draw WireFrame ONLY*/ + if (Events::isKToggleActive(SDLK_F3)) + { + Shader::getShader(SH_BASICTEXTURE)->useShader(); + SkyBox.draw(); + Shader::getShader(SH_LIGHTING)->useShader(); + drawSceneObjects(DRAW_Wire); + + return; + } + //Directional Light Shadow shadowdir->useBuffer(); - viewPort.bindViewShadowDir(Shader::getShader(SH_SHADOWDIR)); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - /* DRAW SCENE */ if (Graphix::testEffect(EF_BLOOM)) { @@ -210,15 +230,6 @@ void Scene::draw() const glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } - viewPort.useViewPort(); - - //Skybox - viewPort.bindView(Shader::getShader(SH_BASICTEXTURE), lookat->getPosition() + vec3(0.0f, 1.0f, 0.0f)); - //BBox - viewPort.bindView(Shader::getShader(SH_BASIC), lookat->getPosition() + vec3(0.0f, 1.0f, 0.0f)); - //SceneObjects - viewPort.bindView(Shader::getShader(SH_LIGHTING), lookat->getPosition() + vec3(0.0f, 1.0f, 0.0f)); - /*DRAW SCENE*/ Shader::getShader(SH_BASICTEXTURE)->useShader(); SkyBox.draw(); @@ -267,7 +278,7 @@ void Scene::draw() const if (Events::isKToggleActive(SDLK_F6)) { Shader::getShader(SH_BASIC)->useShader(); - drawSceneObjects(false); + drawSceneObjects(DRAW_Coll); } @@ -286,17 +297,14 @@ void Scene::draw() const } -void Scene::drawSceneObjects(bool _scOBJ) const +void Scene::drawSceneObjects(drawTarget _target) const { /*TODO: Frustum Culling*/ /*TODO: Z-Order (Back2Front)*/ for (auto i = SceneObjects.cbegin(); i != SceneObjects.cend(); ++i) { - if(_scOBJ) - (*i)->draw(); - else - (*i)->drawCollision(); + (*i)->draw(_target); } } @@ -344,6 +352,7 @@ void Scene::setView(unsigned int x, unsigned int y, unsigned int width, unsigned void Scene::bindShader() { + /*SceneObject*/ ShaderTarget shader[] = {SH_BASIC,SH_BASICTEXTURE,SH_LIGHTING }; for (int s = 0; s < 3; s++) { @@ -351,6 +360,11 @@ void Scene::bindShader() (*i)->bindShader(Shader::getShader(shader[s])); } + /*Skybox*/ SkyBox.bindShader(Shader::getShader(SH_BASICTEXTURE)); + + /*Collision Meshes*/ + for (auto i = SceneObjects.cbegin(); i != SceneObjects.cend(); ++i) + (*i)->bindShaderCollision(Shader::getShader(SH_BASIC)); } \ No newline at end of file diff --git a/Weave/Scene/Scene.h b/Weave/Scene/Scene.h index ff87cde..d873d18 100644 --- a/Weave/Scene/Scene.h +++ b/Weave/Scene/Scene.h @@ -48,7 +48,7 @@ protected: std::list SceneObjects; std::set ShaderSet; - void drawSceneObjects(bool scObj = true) const; + void drawSceneObjects(drawTarget target = DRAW_Model) const; float currenttime; diff --git a/Weave/Scene/SceneObject.cpp b/Weave/Scene/SceneObject.cpp index de83ff2..fa685eb 100644 --- a/Weave/Scene/SceneObject.cpp +++ b/Weave/Scene/SceneObject.cpp @@ -232,12 +232,26 @@ void SceneObject::setMargin(btScalar _margin) collision->bt_setMargin(_margin); } -void SceneObject::draw() const +void SceneObject::draw(drawTarget _target) const { - + switch (_target) + { + case DRAW_Model: + default: + texture->useTexture(); + model->drawModel(modelMat,dr_Model); + break; + case DRAW_Wire: + texture->useTexture(); + model->drawModel(modelMat, dr_WireT); + break; + case DRAW_Coll: + if (collision != nullptr) + collision->drawModel(modelMat, dr_WireC, vec4(0.9f, 0.f, 0.f, 1.f)); + break; + } /* Draw Object*/ - texture->useTexture(); - model->drawModel(modelMat); + } void SceneObject::bindShader(const Shader* _shader) @@ -246,17 +260,6 @@ void SceneObject::bindShader(const Shader* _shader) } -void SceneObject::drawCollision() const -{ - if (collision != nullptr) - { - // Shader::getShader(SH_BASIC)->useShader(); - // collision->bindShader(Shader::getShader(SH_BASIC)); - collision->drawWire(modelMat); - } -} - - void SceneObject::bindShaderCollision(const Shader* _shader) { collision->bindShader(_shader); diff --git a/Weave/Scene/SceneObject.h b/Weave/Scene/SceneObject.h index 11b9dda..db16528 100644 --- a/Weave/Scene/SceneObject.h +++ b/Weave/Scene/SceneObject.h @@ -22,6 +22,12 @@ enum collisiontypes { COL_EVENT = BIT(4) }; +enum drawTarget { + DRAW_Model = 0, + DRAW_Wire = 1, + DRAW_Coll = 2 +}; + //class string; class SceneObject @@ -35,11 +41,10 @@ public: virtual ~SceneObject(); virtual void update(float); - virtual void draw() const; + virtual void draw(drawTarget target=DRAW_Model) const; virtual void bindShader(const Shader* shader); - virtual void drawCollision() const; virtual void bindShaderCollision(const Shader* shader); virtual void collides(SceneObject* other, btPersistentManifold* contactManifold, float deltaT=1.f);