]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
moved Shader out from SceneObj
authorPeter Schaefer <schaeferpm@gmail.com>
Thu, 21 Apr 2016 08:21:36 +0000 (10:21 +0200)
committerPeter Schaefer <schaeferpm@gmail.com>
Thu, 21 Apr 2016 08:21:36 +0000 (10:21 +0200)
Weave/Game.cpp
Weave/Scene/EventBox.cpp
Weave/Scene/Level.cpp
Weave/Scene/Level.h
Weave/Scene/Marvin.cpp
Weave/Scene/Marvin.h
Weave/Scene/Scene.cpp
Weave/Scene/Scene.h
Weave/Scene/SceneObject.cpp
Weave/Scene/SceneObject.h
Weave/Scene/Sky.cpp

index 8fa4a328499b47cae6aae6ef0f4099ff1d84c1ff..4071729bd1cb11c24e26c120fda42f6d65022ff5 100644 (file)
@@ -45,30 +45,28 @@ Game::Game() : playing(true)
 \r
        // load LVL\r
 \r
-       auto defaultShader = Shader::getShader(SH_LIGHTING);\r
-\r
-       SceneObject* tmp_world = new Level(defaultShader, "level_1", "model_levelTest_2D.jpg");\r
+       SceneObject* tmp_world = new Level( "level_1", "model_levelTest_2D.jpg");\r
 \r
        //tmp_world->ignore = true;\r
        current_world->addObject(tmp_world);\r
 \r
-//     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(), ""));\r
+//     current_world->addObject(new SceneObject( translate(vec3(-3.f, 1.f, 0.f)), vec4(1.0f, 1.0f, 1.0f, 3.0f), new BBox(), ""));\r
 \r
        //Player\r
-       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)));\r
+       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)));\r
 \r
        tmp_playerObject->yStatic= false;\r
 \r
        current_world->addObject(tmp_playerObject);\r
        current_world->setLookAt(tmp_playerObject);\r
 \r
-       //current_world->addObject(new SceneObject(defaultShader, glm::mat4(1.0f), "Player.dae", "model_player.png"));\r
-       //current_world->addObject(new SceneObject(defaultShader, translate(vec3(-3.f, .4f, 0.f))*scale(vec3(3.f)), "cow/cow.dae", "model_cow_2D.jpg"));\r
-       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"));\r
-       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"));\r
-       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"));\r
+       //current_world->addObject(new SceneObject( glm::mat4(1.0f), "Player.dae", "model_player.png"));\r
+       //current_world->addObject(new SceneObject( translate(vec3(-3.f, .4f, 0.f))*scale(vec3(3.f)), "cow/cow.dae", "model_cow_2D.jpg"));\r
+       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"));\r
+       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"));\r
+       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"));\r
 \r
-       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"));\r
+       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"));\r
 \r
        //current_world->addObject(new EventBox(translate(vec3(3.f, .4f, 0.f)),EB_LOSTZONE));\r
        current_world->addObject(new EventBox(translate(vec3(3.f, .4f, -15.f)), EB_WINZONE));\r
@@ -94,6 +92,9 @@ void Game::play()
        float message_time=0;\r
        int framecount = 0;\r
 \r
+\r
+       current_world->bindShader();\r
+\r
        while (!Events::halt){\r
                fps.step();\r
 \r
index 1c54ff551e7dd207d64a944452c76ab96ed87c78..1db4abcc2dd5e3686a84086d10af6cd6799ba535 100644 (file)
@@ -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;
index 3b436a73aeb173fb51eb1ada19f23da2bb3ea905..43f1aec5ad0af6688155eaf3bcc2c7fbf89e3407 100644 (file)
@@ -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;
index 937a4fcad1ef1b90fb715d35fa20605b11f6e32a..b5d81ec58d1d649baf53fd1132d167615e313185 100644 (file)
@@ -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;
index 098ee24ae00e3c6228904c141e605441f34a3e27..ab03b84db810b8b7639c5d387f0688085aa5e74c 100644 (file)
@@ -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;
index 8415a1bfe8656cba8e429e82ab5e9fada940d9a3..4e688b2db68ec8228b43bc95c585d76c82b92e0b 100644 (file)
@@ -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;
index e1fd1ac1086347bcbbdd0729c5ef56709eea266a..18801dd8b7b372184642e617a96f7f9af40b6f38 100644 (file)
@@ -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
index ebe02e58b466bf82f848d31f03549cd773ea2b09..ff87cde9aae8fa5075c02d6b98d3460b9ca5454f 100644 (file)
@@ -25,6 +25,8 @@ public:
 
        virtual ~Scene();
 
+       void bindShader();
+       
        virtual void update(float);
        virtual void draw() const;
 
@@ -46,6 +48,9 @@ protected:
        std::list<SceneObject*> SceneObjects;
        std::set<const Shader *> ShaderSet;
 
+       void drawSceneObjects(bool scObj = true) const;
+       
+
        float currenttime;
        std::stack<Timestamp> timestamps;
        //std::stack<mat4> PlayerModels;
index 63d5a34c033d4c9d8b7fdd56949c9c8e26075fdf..de83ff2a2a76676ce3803e06c0c3b3f378d4b83c 100644 (file)
@@ -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
 {
index 20d2886c6c3118c63f16e351126bec209fd9ee73..11b9dda9c505283b80871accf5cb351e051a2e06 100644 (file)
@@ -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;
index 2584e893981dc42bd0ec4716a0a8f6e3ad0114b7..9cd43f4cdbe24b1e3b7b02fe680f69629dc06dd0 100644 (file)
@@ -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;
 }