From 71ed41880a2b6a44e616a2187cb7954c3f27874a Mon Sep 17 00:00:00 2001 From: Peter Schaefer Date: Thu, 21 Apr 2016 10:21:36 +0200 Subject: [PATCH] moved Shader out from SceneObj --- Weave/Game.cpp | 23 ++++----- Weave/Scene/EventBox.cpp | 2 +- Weave/Scene/Level.cpp | 2 +- Weave/Scene/Level.h | 2 +- Weave/Scene/Marvin.cpp | 4 +- Weave/Scene/Marvin.h | 2 +- Weave/Scene/Scene.cpp | 94 +++++++++++++++++++++++++------------ Weave/Scene/Scene.h | 5 ++ Weave/Scene/SceneObject.cpp | 42 ++++++++++------- Weave/Scene/SceneObject.h | 13 +++-- Weave/Scene/Sky.cpp | 2 +- 11 files changed, 122 insertions(+), 69 deletions(-) diff --git a/Weave/Game.cpp b/Weave/Game.cpp index 8fa4a32..4071729 100644 --- a/Weave/Game.cpp +++ b/Weave/Game.cpp @@ -45,30 +45,28 @@ Game::Game() : playing(true) // load LVL - auto defaultShader = Shader::getShader(SH_LIGHTING); - - SceneObject* tmp_world = new Level(defaultShader, "level_1", "model_levelTest_2D.jpg"); + SceneObject* tmp_world = new Level( "level_1", "model_levelTest_2D.jpg"); //tmp_world->ignore = true; current_world->addObject(tmp_world); -// current_world->addObject(new SceneObject(defaultShader, translate(vec3(-3.f, 1.f, 0.f)), vec4(1.0f, 1.0f, 1.0f, 3.0f), new BBox(), "")); +// current_world->addObject(new SceneObject( translate(vec3(-3.f, 1.f, 0.f)), vec4(1.0f, 1.0f, 1.0f, 3.0f), new BBox(), "")); //Player - SceneObject* tmp_playerObject = new Marvin(defaultShader, translate(vec3(1.f, 3.f, 1.f))*rotate((float)M_PI_4,vec3(0.f,1.f,0.f))); + SceneObject* tmp_playerObject = new Marvin(translate(vec3(1.f, 3.f, 1.f))*rotate((float)M_PI_4,vec3(0.f,1.f,0.f))); tmp_playerObject->yStatic= false; current_world->addObject(tmp_playerObject); current_world->setLookAt(tmp_playerObject); - //current_world->addObject(new SceneObject(defaultShader, glm::mat4(1.0f), "Player.dae", "model_player.png")); - //current_world->addObject(new SceneObject(defaultShader, translate(vec3(-3.f, .4f, 0.f))*scale(vec3(3.f)), "cow/cow.dae", "model_cow_2D.jpg")); - current_world->addObject(new SceneObject(defaultShader, translate(vec3(-3.f, .4f, 0.f)), vec4(3.0f, 0.5f, 0.4f, 1.5f), "duck_col", "model_duck_2D.png")); - current_world->addObject(new SceneObject(defaultShader, translate(vec3(-5.f, .4f, 0.f)), vec4(3.0f, 3.f, 0.4f, 1.5f), "duck", "model_duck_2D.png")); - current_world->addObject(new SceneObject(defaultShader, translate(vec3(0.f, .4f, 0.f)), vec4(3.0f, 3.f, 0.4f, 1.5f), "lever", "model_duck_2D.png")); + //current_world->addObject(new SceneObject( glm::mat4(1.0f), "Player.dae", "model_player.png")); + //current_world->addObject(new SceneObject( translate(vec3(-3.f, .4f, 0.f))*scale(vec3(3.f)), "cow/cow.dae", "model_cow_2D.jpg")); + current_world->addObject(new SceneObject(translate(vec3(-3.f, .4f, 0.f)), vec4(3.0f, 0.5f, 0.4f, 1.5f), "duck_col", "model_duck_2D.png")); + current_world->addObject(new SceneObject(translate(vec3(-5.f, .4f, 0.f)), vec4(3.0f, 3.f, 0.4f, 1.5f), "duck", "model_duck_2D.png")); + current_world->addObject(new SceneObject(translate(vec3(0.f, .4f, 0.f)), vec4(3.0f, 3.f, 0.4f, 1.5f), "lever", "model_duck_2D.png")); - current_world->addObject(new SceneObject(defaultShader, translate(vec3(-5.f, 3.f, 0.f)), vec4(3.0f, 3.f, 0.4f, 1.5f), "SkyBox", "model_SkyBox_2D.png")); + current_world->addObject(new SceneObject(translate(vec3(-5.f, 3.f, 0.f)), vec4(3.0f, 3.f, 0.4f, 1.5f), "SkyBox", "model_SkyBox_2D.png")); //current_world->addObject(new EventBox(translate(vec3(3.f, .4f, 0.f)),EB_LOSTZONE)); current_world->addObject(new EventBox(translate(vec3(3.f, .4f, -15.f)), EB_WINZONE)); @@ -94,6 +92,9 @@ void Game::play() float message_time=0; int framecount = 0; + + current_world->bindShader(); + while (!Events::halt){ fps.step(); diff --git a/Weave/Scene/EventBox.cpp b/Weave/Scene/EventBox.cpp index 1c54ff5..1db4abc 100644 --- a/Weave/Scene/EventBox.cpp +++ b/Weave/Scene/EventBox.cpp @@ -13,7 +13,7 @@ EventBox::EventBox(const mat4& _modelMat, uint _EB_TYPE) : - SceneObject(Shader::getShader(SH_BASIC), _modelMat, vec4(0.f), Model::getBBoxModel(), ""), + SceneObject( _modelMat, vec4(0.f), Model::getBBoxModel(), ""), eb_type(_EB_TYPE) { collide_group = COL_EVENT; diff --git a/Weave/Scene/Level.cpp b/Weave/Scene/Level.cpp index 3b436a7..43f1aec 100644 --- a/Weave/Scene/Level.cpp +++ b/Weave/Scene/Level.cpp @@ -7,7 +7,7 @@ #include "../GLM.h" -Level::Level(const Shader* _shader, std::string _modelpath, std::string _texturepath) : SceneObject(_shader, mat4(1.f), vec4(1.f), Model::newIMetaModel(_modelpath+".dae"), _texturepath) +Level::Level(std::string _modelpath, std::string _texturepath) : SceneObject(mat4(1.f), vec4(1.f), Model::newIMetaModel(_modelpath+".dae"), _texturepath) { collide_group = COL_LEVEL; collide_with = COL_MARVIN | COL_ENEMY; diff --git a/Weave/Scene/Level.h b/Weave/Scene/Level.h index 937a4fc..b5d81ec 100644 --- a/Weave/Scene/Level.h +++ b/Weave/Scene/Level.h @@ -9,7 +9,7 @@ class Level : public SceneObject { public: - Level(const Shader* shader,std::string modelpath, std::string texturepath); + Level(std::string modelpath, std::string texturepath); ~Level(); virtual void collides(SceneObject* other, btPersistentManifold* contactManifold, float deltaT=1.f) override; diff --git a/Weave/Scene/Marvin.cpp b/Weave/Scene/Marvin.cpp index 098ee24..ab03b84 100644 --- a/Weave/Scene/Marvin.cpp +++ b/Weave/Scene/Marvin.cpp @@ -12,8 +12,8 @@ #define SPEED_MOVE_NORMAL 1.5f #define MOVE_FASTER 2.5f -Marvin::Marvin(const Shader* _shader, const mat4& _modelMat) : -SceneObject(_shader, _modelMat, vec4(7.0f, 0.7f, 1.0f, 3.0f), "Player", "model_player_2D.png") +Marvin::Marvin( const mat4& _modelMat) : +SceneObject( _modelMat, vec4(7.0f, 0.7f, 1.0f, 3.0f), "Player", "model_player_2D.png") { collide_group = COL_MARVIN; collide_with = COL_LEVEL | COL_ENEMY | COL_EVENT; diff --git a/Weave/Scene/Marvin.h b/Weave/Scene/Marvin.h index 8415a1b..4e688b2 100644 --- a/Weave/Scene/Marvin.h +++ b/Weave/Scene/Marvin.h @@ -9,7 +9,7 @@ class Marvin : public SceneObject { public: - Marvin(const Shader* shader, const mat4& modelMat); + Marvin(const mat4& modelMat); ~Marvin(); virtual void update(float) override; diff --git a/Weave/Scene/Scene.cpp b/Weave/Scene/Scene.cpp index e1fd1ac..18801dd 100644 --- a/Weave/Scene/Scene.cpp +++ b/Weave/Scene/Scene.cpp @@ -57,29 +57,25 @@ lookat(_lookat) bt_dynamics_world->setGravity(btVector3(0, YFALL_SPEED, 0)); - + /*BUFFERS*/ render = new fBufferObject(); - render->bindBuffer(Graphix::getWindowWidth(), Graphix::getWindowHeight()); - blurPingPong = new fBufferObject*[2]; - blurPingPong[0] = new fBufferObject(1, false); - blurPingPong[1] = new fBufferObject(1, false); - - blurPingPong[0]->bindBuffer(Graphix::getWindowWidth(), Graphix::getWindowHeight()); - blurPingPong[1]->bindBuffer(Graphix::getWindowWidth(), Graphix::getWindowHeight()); + for (int i = 0; i < 2; i++) + { + blurPingPong[i] = new fBufferObject(1, false); + blurPingPong[i]->bindBuffer(Graphix::getWindowWidth(), Graphix::getWindowHeight()); + } shadowdir = new fBufferObject(); - shadowdir->bindBuffer(Graphix::getWindowWidth(), Graphix::getWindowHeight()); - postRender = new fBufferObject(2, false); - postRender->bindBuffer(Graphix::getWindowWidth(), Graphix::getWindowHeight()); render->clearBuffer(); + } @@ -102,8 +98,8 @@ Scene::~Scene() //fBO delete render; - delete blurPingPong[0]; - delete blurPingPong[1]; + for (int i = 0; i < 2; i++) + delete blurPingPong[i]; delete blurPingPong; delete shadowdir; @@ -207,39 +203,35 @@ void Scene::draw() const - /* DRAW SCENE */ if (Graphix::testEffect(EF_BLOOM)) { render->useBuffer(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } + viewPort.useViewPort(); //Skybox - viewPort.bindView(SkyBox.gShader(), lookat->getPosition() + vec3(0.0f, 1.0f, 0.0f)); + 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)); - for (auto i = ShaderSet.cbegin(); i != ShaderSet.cend(); ++i) - { - viewPort.bindView(*i, lookat->getPosition() + vec3(0.0f, 1.0f, 0.0f)); - //bind Lighting - } - + /*DRAW SCENE*/ + Shader::getShader(SH_BASICTEXTURE)->useShader(); SkyBox.draw(); - for (auto i = SceneObjects.cbegin(); i != SceneObjects.cend(); ++i) - { - (*i)->draw(); - } - + Shader::getShader(SH_LIGHTING)->useShader(); + drawSceneObjects(); + GLboolean horizontal = true, firstit = true; if (Graphix::testEffect(EF_BLOOM)) { /* DRAW BRIGHTNESS */ postRender->useBuffer(); //glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT); Shader::getShader(SH_BASICTEXTURE)->useShader(); Shader::getShader(SH_BASICTEXTURE)->setUniformLocation("uBrightness", 1); render->getTexture()->useTexture(); @@ -248,7 +240,7 @@ void Scene::draw() const /* BLUR BRIGHTNESS */ Shader::getShader(SH_BLUR)->useShader(); - GLboolean horizontal = true, firstit = true; + for (int i = 0; i < 10; i++) { @@ -266,8 +258,21 @@ void Scene::draw() const if (firstit) firstit = false; } + } + + /*DRAW BBOX WIRES*/ + if (Graphix::testEffect(EF_BLOOM)) + render->useBuffer(); + if (Events::isKToggleActive(SDLK_F6)) + { + Shader::getShader(SH_BASIC)->useShader(); + drawSceneObjects(false); + } + + if (Graphix::testEffect(EF_BLOOM)) + { /* BLEND BRIGHTNESS TO ORIGINAL*/ Shader::getShader(SH_BLEND)->useShader(); render->clearBuffer(); @@ -281,10 +286,23 @@ void Scene::draw() const } +void Scene::drawSceneObjects(bool _scOBJ) const +{ + /*TODO: Frustum Culling*/ + /*TODO: Z-Order (Back2Front)*/ + + for (auto i = SceneObjects.cbegin(); i != SceneObjects.cend(); ++i) + { + if(_scOBJ) + (*i)->draw(); + else + (*i)->drawCollision(); + } +} + void Scene::addObject(SceneObject* _add) { SceneObjects.push_back(_add); - ShaderSet.insert(_add->gShader()); bt_collision_world->addCollisionObject(*_add, _add->getCollideGroup(), _add->getCollideWith()); bt_dynamics_world->addCollisionObject(*_add,_add->getCollideGroup(),_add->getCollideWith()); @@ -319,6 +337,20 @@ void Scene::setView(unsigned int x, unsigned int y, unsigned int width, unsigned viewPort.setView(x, y, width, height, updateProjection); render->updateSize(width, height); postRender->updateSize(width, height); - blurPingPong[0]->updateSize(width, height); - blurPingPong[1]->updateSize(width, height); + for (int i = 0; i < 2; i++) + blurPingPong[i]->updateSize(width, height); + +} + +void Scene::bindShader() +{ + ShaderTarget shader[] = {SH_BASIC,SH_BASICTEXTURE,SH_LIGHTING }; + for (int s = 0; s < 3; s++) + { + for (auto i = SceneObjects.cbegin(); i != SceneObjects.cend(); ++i) + (*i)->bindShader(Shader::getShader(shader[s])); + } + + SkyBox.bindShader(Shader::getShader(SH_BASICTEXTURE)); + } \ No newline at end of file diff --git a/Weave/Scene/Scene.h b/Weave/Scene/Scene.h index ebe02e5..ff87cde 100644 --- a/Weave/Scene/Scene.h +++ b/Weave/Scene/Scene.h @@ -25,6 +25,8 @@ public: virtual ~Scene(); + void bindShader(); + virtual void update(float); virtual void draw() const; @@ -46,6 +48,9 @@ protected: std::list SceneObjects; std::set ShaderSet; + void drawSceneObjects(bool scObj = true) const; + + float currenttime; std::stack timestamps; //std::stack PlayerModels; diff --git a/Weave/Scene/SceneObject.cpp b/Weave/Scene/SceneObject.cpp index 63d5a34..de83ff2 100644 --- a/Weave/Scene/SceneObject.cpp +++ b/Weave/Scene/SceneObject.cpp @@ -28,11 +28,10 @@ static inline bool file_exist(const std::string& name) { } -SceneObject::SceneObject(const Shader* _shader, const mat4& _modelMat, const vec4& _material, string _modelpath, string texturepath) : +SceneObject::SceneObject(const mat4& _modelMat, const vec4& _material, string _modelpath, string texturepath) : model(nullptr), collision(nullptr), modelMat(_modelMat), -shader(_shader), mainScene(NULL), collision_ignore(false), texture(nullptr), @@ -56,14 +55,12 @@ move_delta(0) { model = Model::newIMetaModel(_modelpath+".dae"); model->bindModel(); - model->bindShader(shader); if (file_exist("../models/" + _modelpath + "_col.dae")) { //Message::info("SceneObject loaded."); collision = Model::newIMetaModel(_modelpath + "_col.dae"); collision->bindModel(); - collision->bindShader(shader); } //Model::deleteIMetaModel(_modelpath); @@ -126,11 +123,10 @@ move_delta(0) // bt_rigid_body } -SceneObject::SceneObject(const Shader* _shader, const mat4& _modelMat, const vec4& _material, Model* _model, string texturepath) : +SceneObject::SceneObject(const mat4& _modelMat, const vec4& _material, Model* _model, string texturepath) : model(_model), collision(nullptr), modelMat(_modelMat), -shader(_shader), mainScene(NULL), collision_ignore(false), texture(nullptr), @@ -168,7 +164,7 @@ move_delta(0) collision = Model::getBBoxModel(); model->bindModel(); - model->bindShader(shader); + //Message::info("Binding Shader"); //Graphix::getGlError(); //Message::info("Done"); @@ -240,19 +236,33 @@ void SceneObject::draw() const { /* Draw Object*/ - shader->useShader(); texture->useTexture(); model->drawModel(modelMat); +} + +void SceneObject::bindShader(const Shader* _shader) +{ + model->bindShader(_shader); +} - if (Events::isKToggleActive(SDLK_F6) && collision != nullptr) + +void SceneObject::drawCollision() const +{ + if (collision != nullptr) { - Shader::getShader(SH_BASIC)->useShader(); - collision->bindShader(Shader::getShader(SH_BASIC)); + // Shader::getShader(SH_BASIC)->useShader(); + // collision->bindShader(Shader::getShader(SH_BASIC)); collision->drawWire(modelMat); - //collision->drawWire(modelMat); } } + +void SceneObject::bindShaderCollision(const Shader* _shader) +{ + collision->bindShader(_shader); +} + + void SceneObject::collides(SceneObject* _other, btPersistentManifold* _contactManifold, float _deltaT) { int numContacts = _contactManifold->getNumContacts(); @@ -270,10 +280,10 @@ void SceneObject::collides(SceneObject* _other, btPersistentManifold* _contactMa } -const Shader * SceneObject::gShader() const -{ - return shader; -} +//const Shader * SceneObject::gShader() const +//{ +// return shader; +//} const Texture * SceneObject::gTexture() const { diff --git a/Weave/Scene/SceneObject.h b/Weave/Scene/SceneObject.h index 20d2886..11b9dda 100644 --- a/Weave/Scene/SceneObject.h +++ b/Weave/Scene/SceneObject.h @@ -29,14 +29,19 @@ class SceneObject public: //SceneObject(Shader* _shader, mat4& model); - SceneObject(const Shader* _shader, const mat4& modelMat, const vec4& material, string modelpath, string texturepath); - SceneObject(const Shader* _shader, const mat4& modelMat, const vec4& material, Model* model, string texturepath); + SceneObject(const mat4& modelMat, const vec4& material, string modelpath, string texturepath); + SceneObject(const mat4& modelMat, const vec4& material, Model* model, string texturepath); virtual ~SceneObject(); virtual void update(float); virtual void draw() 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); virtual vec3 getPosition() const; @@ -58,7 +63,7 @@ public: void setCollision(bool); - const Shader * gShader() const; + //const Shader * gShader() const; const Texture * gTexture() const; const Model * gModel() const; @@ -85,7 +90,7 @@ protected: mat4 modelMat; - const Shader * shader; + //const Shader * shader; Texture* texture; Model* model; Model* collision; diff --git a/Weave/Scene/Sky.cpp b/Weave/Scene/Sky.cpp index 2584e89..9cd43f4 100644 --- a/Weave/Scene/Sky.cpp +++ b/Weave/Scene/Sky.cpp @@ -10,7 +10,7 @@ -Sky::Sky() : SceneObject(Shader::getShader(SH_BASICTEXTURE), scale(vec3(20.f)), vec4(1.f), Model::getSkyBoxModel(), "model_skybox_2D.jpg") +Sky::Sky() : SceneObject( scale(vec3(20.f)), vec4(1.f), Model::getSkyBoxModel(), "model_skybox_2D.jpg") { modelMat[3][3] = 0.f; } -- 2.47.3