}\r
}\r
\r
-void IMetaMesh::drawModel(const mat4& _modelMat) const\r
+void IMetaMesh::drawModel(const mat4& _modelMat, drawType _type, const vec4& _color) const\r
{\r
for (auto i = models.begin(); i != models.end(); ++i)\r
{\r
- i->first->drawModel(_modelMat* i->second);\r
+ i->first->drawModel(_modelMat* i->second, _type, _color*.9f);\r
}\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
+//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
}\r
\r
\r
-void IMetaMesh::drawBBox(const mat4& _modelMat, const vec4& _color) const\r
-{\r
- // Model::drawBBox(_modelMat, vec4(0.f,.3f,.9f,1.f));\r
- if (models.size() == 1)\r
- {\r
- auto i = models.front();\r
- i.first->drawBBox(_modelMat* i.second, _color);\r
- }\r
- else\r
- {\r
- Model::drawBBox(_modelMat, _color);\r
- if (models.size() > 1)\r
- {\r
- for (auto i = models.begin(); i != models.end(); ++i)\r
- {\r
- i->first->drawBBox(_modelMat* i->second, _color*0.8f);\r
- }\r
- }\r
- }\r
-}\r
+//void IMetaMesh::drawBBox(const mat4& _modelMat, const vec4& _color) const\r
+//{\r
+// // Model::drawBBox(_modelMat, vec4(0.f,.3f,.9f,1.f));\r
+// if (models.size() == 1)\r
+// {\r
+// auto i = models.front();\r
+// i.first->drawBBox(_modelMat* i.second, _color);\r
+// }\r
+// else\r
+// {\r
+// Model::drawBBox(_modelMat, _color);\r
+// if (models.size() > 1)\r
+// {\r
+// for (auto i = models.begin(); i != models.end(); ++i)\r
+// {\r
+// i->first->drawBBox(_modelMat* i->second, _color*0.8f);\r
+// }\r
+// }\r
+// }\r
+//}\r
\r
\r
string IMetaMesh::type2str() const\r
void unbindModel() override;\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
+ virtual void drawModel(const mat4& modelMat, drawType type = dr_Model, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) 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
+ //void drawBBox(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const override;\r
\r
virtual void bt_init(bool isConvex = true) override;\r
\r
glBindVertexArray(0);\r
}\r
\r
-void Model::drawModel(const mat4& _modelMat) const\r
+void Model::drawModel(const mat4& _modelMat, drawType _type, const vec4& _color) const\r
{\r
useModel(_modelMat);\r
\r
- if (Events::isKToggleActive(SDLK_F3))\r
+ switch (_type)\r
+ {\r
+ default:
+ case dr_Model:
+ drawModel();
+ break;\r
+\r
+ case dr_WireC:\r
+ Shader::getShader()->setUniformLocation("uFragmentColor", _color);\r
+ case dr_WireT:\r
drawWire();\r
- else\r
- drawModel();\r
-}\r
+ break;\r
\r
-void Model::drawWire(const mat4& _modelMat, const vec4& _color) const\r
-{\r
- //Shader::gBasic()->useShader();\r
+ case dr_BBox:\r
+ //Shader::getShader(SH_BASIC)->useShader();\r
+ Shader::getShader()->setUniformLocation("uFragmentColor", _color);\r
\r
- useModel(_modelMat);\r
+ btVector3 minB, maxB;\r
+ btTransform trans;\r
+ trans.setIdentity();\r
+ bt_collision_shape->getAabb(trans, minB, maxB);\r
\r
- Shader::getShader()->setUniformLocation("uFragmentColor", _color);\r
+ vec3 min = vec3(minB.getX(), minB.getY(), minB.getZ());\r
+ vec3 max = vec3(maxB.getX(), maxB.getY(), maxB.getZ());\r
\r
- drawWire();\r
+ vec3 size = (max - min);\r
+ vec3 center = (max + min) * .5f;\r
+ getBBoxModel()->drawModel(_modelMat*translate(center)*glm::scale(size));\r
+ break;\r
+ }\r
\r
+ \r
}\r
\r
-void Model::drawBBox(const mat4& _modelMat, const vec4& _color) const\r
-{\r
- Graphix::getGlError();\r
- Shader::getShader(SH_BASIC)->useShader();\r
-\r
- Shader::getShader()->setUniformLocation("uFragmentColor", _color);\r
-\r
- Graphix::getGlError();\r
-\r
- btVector3 minB, maxB;\r
- btTransform trans;\r
- trans.setIdentity();\r
- bt_collision_shape->getAabb(trans, minB, maxB);\r
+//void Model::drawModel(const mat4& _modelMat) const\r
+//{\r
+// useModel(_modelMat);\r
+//\r
+// drawModel();\r
+//}\r
\r
- vec3 min = vec3(minB.getX(), minB.getY(), minB.getZ());\r
- vec3 max = vec3(maxB.getX(), maxB.getY(), maxB.getZ());\r
+//void Model::drawWire(const mat4& _modelMat) const\r
+//{\r
+// useModel(_modelMat);\r
+//\r
+// drawWire();\r
+//\r
+//}\r
+//\r
+//void Model::drawWire(const mat4& _modelMat, const vec4& _color) const\r
+//{\r
+//\r
+// useModel(_modelMat);\r
+//\r
+// Shader::getShader()->setUniformLocation("uFragmentColor", _color);\r
+//\r
+// drawWire();\r
+//\r
+//}\r
\r
- vec3 size = (max - min);\r
- vec3 center = (max + min) * .5f;\r
- //Shader::gBasic()->useShader();\r
- getBBoxModel()->drawModel(_modelMat*translate(center)*glm::scale(size)); //\r
-}\r
+//void Model::drawBBox(const mat4& _modelMat, const vec4& _color) const\r
+//{\r
+// Shader::getShader(SH_BASIC)->useShader();\r
+// Shader::getShader()->setUniformLocation("uFragmentColor", _color);\r
+//\r
+// btVector3 minB, maxB;\r
+// btTransform trans;\r
+// trans.setIdentity();\r
+// bt_collision_shape->getAabb(trans, minB, maxB);\r
+//\r
+// vec3 min = vec3(minB.getX(), minB.getY(), minB.getZ());\r
+// vec3 max = vec3(maxB.getX(), maxB.getY(), maxB.getZ());\r
+//\r
+// vec3 size = (max - min);\r
+// vec3 center = (max + min) * .5f;\r
+// getBBoxModel()->drawModel(_modelMat*translate(center)*glm::scale(size));\r
+//}\r
\r
//void Model::getBBcs(vec3& _center, vec3& _size) const\r
//{\r
\r
typedef unsigned int uint;\r
\r
+enum drawType {\r
+ dr_Model = 0,\r
+ dr_WireT = 1,\r
+ dr_WireC = 2,\r
+ dr_BBox = 3,\r
+};\r
+\r
class Model\r
{\r
public:\r
virtual void unbindShader(const Shader* shader);\r
\r
/* Draws Model */\r
- virtual void drawModel(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
+ virtual void drawModel(const mat4& modelMat, drawType type = dr_Model, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const;\r
+ //virtual void drawModel(const mat4& modelMat) const;\r
+ //virtual void drawWire(const mat4& modelMat, const vec4& color) const;\r
+ //virtual void drawWire(const mat4& modelMat) 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
+ //virtual void drawBBox(const mat4& modelMat, const vec4& color = vec4(0.9f, 0.f, 0.f, 1.f)) const;\r
\r
static Model* getBBoxModel();\r
static Model* getPlaneModel();\r
void Plane::drawModel() const
{
- useModel(mat4(1.f));
+ //useModel(mat4(1.f));
Shader::getShader()->setUniformLocation("uPlain", 1);
Shader::getShader()->setUniformLocation("uFar", 0);
{\r
}\r
\r
-void SkyBox::drawModel(const mat4& _modelMat) const\r
+void SkyBox::drawModel() const\r
{\r
//_shader->useShader();\r
//GLint OldCullFaceMode;\r
glDepthFunc(GL_LEQUAL);\r
//glDisable(GL_DEPTH_TEST);\r
\r
- useModel(_modelMat);\r
-\r
Shader::getShader()->setUniformLocation("uPlain", 0);\r
Shader::getShader()->setUniformLocation("uFar", 1);\r
\r
SkyBox();\r
~SkyBox();\r
\r
- void drawModel(const mat4& modelMat) const override;\r
+protected:\r
+ virtual void drawModel() const override;\r
\r
//uncommend following lines to use default Loaders\r
//void useModelMat(const mat4& model, Shader* shader) const override;\r
{
}
-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)
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:
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))
{
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();
if (Events::isKToggleActive(SDLK_F6))
{
Shader::getShader(SH_BASIC)->useShader();
- drawSceneObjects(false);
+ drawSceneObjects(DRAW_Coll);
}
}
-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);
}
}
void Scene::bindShader()
{
+ /*SceneObject*/
ShaderTarget shader[] = {SH_BASIC,SH_BASICTEXTURE,SH_LIGHTING };
for (int s = 0; s < 3; s++)
{
(*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
std::list<SceneObject*> SceneObjects;
std::set<const Shader *> ShaderSet;
- void drawSceneObjects(bool scObj = true) const;
+ void drawSceneObjects(drawTarget target = DRAW_Model) const;
float currenttime;
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)
}
-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);
COL_EVENT = BIT(4)
};
+enum drawTarget {
+ DRAW_Model = 0,
+ DRAW_Wire = 1,
+ DRAW_Coll = 2
+};
+
//class string;
class SceneObject
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);