From a9697b55bedb2e5cbdd93c223c0e65fe7cf9e3fb Mon Sep 17 00:00:00 2001 From: Peter Schaefer Date: Tue, 28 Apr 2015 13:20:11 +0200 Subject: [PATCH] new SceneObjects (Sky, Marvin) fixed BBox Texture Bug? refactor SceneConcept --- .gitignore | 4 +- Weave/Game.cpp | 12 ++-- Weave/Graphix/Graphix.cpp | 8 ++- Weave/Graphix/Graphix.h | 4 ++ Weave/Graphix/Model.h | 3 +- Weave/Graphix/Model/Model.cpp | 11 +-- Weave/Scene/Marvin.cpp | 14 ++++ Weave/Scene/Marvin.h | 15 +++++ Weave/Scene/Scene.cpp | 122 ++++++++++++++-------------------- Weave/Scene/Scene.h | 24 +++---- Weave/Scene/SceneObject.cpp | 26 +++----- Weave/Scene/SceneObject.h | 25 +++---- Weave/Scene/Sky.cpp | 15 +++++ Weave/Scene/Sky.h | 15 +++++ Weave/Weave.vcxproj | 4 ++ Weave/Weave.vcxproj.filters | 14 +++- shader/basic_FS.hlsl | 6 +- shader/basic_VS.hlsl | 2 +- 18 files changed, 187 insertions(+), 137 deletions(-) create mode 100644 Weave/Scene/Marvin.cpp create mode 100644 Weave/Scene/Marvin.h create mode 100644 Weave/Scene/Sky.cpp create mode 100644 Weave/Scene/Sky.h diff --git a/.gitignore b/.gitignore index 593d577..644bf6d 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,6 @@ build-* Submission* RES -*.[Cc]ache \ No newline at end of file +*.[Cc]ache + +CGUE*.rar \ No newline at end of file diff --git a/Weave/Game.cpp b/Weave/Game.cpp index 5a07f67..8ee7620 100644 --- a/Weave/Game.cpp +++ b/Weave/Game.cpp @@ -12,6 +12,9 @@ #include #include "Scene\Scene.h" #include "Scene\SceneObject.h" + +#include "Scene\Marvin.h" + #include "Graphix\Shader.h" #include "Graphix\Graphix.h" #include "Fps.h" @@ -44,13 +47,6 @@ Game::Game() : playing(true) // Hauptfenster current_world = new Scene(0, 0, Graphix::getWindowWidth(), Graphix::getWindowHeight(), 45, 0.1f, 40, vec3(0.0f, 0.0f, 0.f)); - //SKYBOX! --------------------------- - shader_skybox = new Shader("skybox_VS.hlsl", "skybox_color_FS.hlsl"); - //texture_skybox = new Texture("skybox_CUBE.jpg"); - - current_world->addObject(new SceneObject(shader_skybox, scale(3.f * vec3(1.f, .5f, 1.f)), new SkyBox(), "")); - //SKYBOX! ---------------------------- - //Allg Shader Shader* shader1 = new Shader("basicTexture_VS.hlsl", "lightingTexture_FS.hlsl"); // Shader* shaderSky = new Shader("skybox_VS.hlsl", "skybox_FS.hlsl"); @@ -61,7 +57,7 @@ Game::Game() : playing(true) current_world->addObject(new SceneObject(shader1, translate(vec3(-3.f,1.f,0.f)), new BBox() , "")); //Player - SceneObject* tmp_playerObject = new SceneObject(shader1, translate(vec3(1.f, 3.f, 1.f))*rotate((float)M_PI_4,vec3(0.f,1.f,0.f)), "Player.dae", "model_player_2D.png"); + SceneObject* tmp_playerObject = new Marvin(shader1, translate(vec3(1.f, 3.f, 1.f))*rotate((float)M_PI_4,vec3(0.f,1.f,0.f))); tmp_playerObject->yStatic= false; diff --git a/Weave/Graphix/Graphix.cpp b/Weave/Graphix/Graphix.cpp index df52a9d..d4a776b 100644 --- a/Weave/Graphix/Graphix.cpp +++ b/Weave/Graphix/Graphix.cpp @@ -1,6 +1,7 @@ #include "Graphix.h" #include "../Message.h" +#include "Shader.h" #include using std::string; @@ -71,6 +72,8 @@ void Graphix::init() //glEnable(GL_BLEND); //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + shader_BBox = new Shader("basic_VS.hlsl", "basic_FS.hlsl"); } void Graphix::catchMouse() @@ -142,4 +145,7 @@ Uint32 Graphix::sdlFlags = SDL_INIT_VIDEO | SDL_INIT_TIMER; SDL_Window* Graphix::sdl_window; -SDL_GLContext Graphix::sdl_glcontext; \ No newline at end of file +SDL_GLContext Graphix::sdl_glcontext; + + +Shader* Graphix::shader_BBox; diff --git a/Weave/Graphix/Graphix.h b/Weave/Graphix/Graphix.h index 38f3e39..7a9f23b 100644 --- a/Weave/Graphix/Graphix.h +++ b/Weave/Graphix/Graphix.h @@ -11,6 +11,8 @@ using std::string; //using std::unordered_map; +class Shader; + class Graphix { public: @@ -30,6 +32,8 @@ public: static unsigned int getGlError(); + static Shader* shader_BBox; + private: static unsigned int width; static unsigned int height; diff --git a/Weave/Graphix/Model.h b/Weave/Graphix/Model.h index 0a85701..601c461 100644 --- a/Weave/Graphix/Model.h +++ b/Weave/Graphix/Model.h @@ -3,4 +3,5 @@ #include "Model\Model.h" #include "Model\IMetaMesh.h" #include "Model\SkyBox.h" -#include "Model\BBox.h" \ No newline at end of file +#include "Model\BBox.h" + diff --git a/Weave/Graphix/Model/Model.cpp b/Weave/Graphix/Model/Model.cpp index d891b40..08f087e 100644 --- a/Weave/Graphix/Model/Model.cpp +++ b/Weave/Graphix/Model/Model.cpp @@ -106,12 +106,15 @@ void Model::drawBBox(Shader* _shader,const mat4& _modelMat) const { BoundingBox = new BBox(); // BBoxShader = new Shader("basic_FS.hlsl", "basic_VS.hlsl"); -// BoundingBox->bindShader(BBoxShader); - + BoundingBox->bindShader(Graphix::shader_BBox); + + //auto tmp = Graphix::shader_BBox->getUniformLocation("uFragmentColor"); + //if (tmp >= 0) + // glUniform4fv((int)Graphix::shader_BBox, 1, value_ptr(vec4(.3f,.9f,.9f,1.f))); } - BoundingBox->bindShader(_shader); - BoundingBox->drawModel(_shader, (Texture*)nullptr, _modelMat*translate(BBposition)*scale(BBsize)); +// BoundingBox->bindShader(_shader); + BoundingBox->drawModel(Graphix::shader_BBox, (Texture*)nullptr, _modelMat*translate(BBposition)*scale(BBsize)); } void Model::updateBB(const vec3& _min, const vec3& _max) diff --git a/Weave/Scene/Marvin.cpp b/Weave/Scene/Marvin.cpp new file mode 100644 index 0000000..3759689 --- /dev/null +++ b/Weave/Scene/Marvin.cpp @@ -0,0 +1,14 @@ +#include "Marvin.h" + +#include "../Graphix/Shader.h" + + +Marvin::Marvin(Shader* _shader, const mat4& _modelMat) : SceneObject(_shader,_modelMat,"Player.dae","model_player_2D.png") +{ + +} + + +Marvin::~Marvin() +{ +} diff --git a/Weave/Scene/Marvin.h b/Weave/Scene/Marvin.h new file mode 100644 index 0000000..ed44973 --- /dev/null +++ b/Weave/Scene/Marvin.h @@ -0,0 +1,15 @@ +#pragma once +#include "SceneObject.h" + +#include "../Graphix/GLM.h" + +class Shader; + +class Marvin : + public SceneObject +{ +public: + Marvin(Shader* shader, const mat4& modelMat); + ~Marvin(); +}; + diff --git a/Weave/Scene/Scene.cpp b/Weave/Scene/Scene.cpp index 19f8ce9..2f6f362 100644 --- a/Weave/Scene/Scene.cpp +++ b/Weave/Scene/Scene.cpp @@ -1,14 +1,21 @@ #include "Scene.h" +#include "SceneObject.h" +#include "Sky.h" +#include #include "../Graphix/GLM.h" -#include +#include "../Graphix/Graphix.h" -#include "../Message.h" -#include +#include "../Graphix/Shader.h" +#include "../Graphix/ViewPort.h" +#include "../Message.h" #include "../Events.h" -#include "../Graphix/Shader.h" +#include + +using std::list; +using std::set; #define TIME_TILL_MAX_MOVE 2 #define TIME_TILL_DIRECTION_ROTATE 1 @@ -16,57 +23,29 @@ #define SPEED_MOVE_NORMAL 1.5f #define MOVE_FASTER 2.f -/* -Scene::Scene() : - SceneObjects(new list), - ShaderSet(new set), - newObjects(true) -{ -}*/ Scene::Scene(unsigned int x, unsigned int y, unsigned int width, unsigned int height, float fovy, float zNear, float zFar, vec3 pos, SceneObject* _lookat) : viewPort(new ViewPort(x, y, width, height, fovy, zNear, zFar)), - SceneObjects(new list), - ShaderSet(new set), - newObjects(true), - lookat(_lookat), - move_delta(0) +lookat(_lookat), +move_delta(0), +SkyBox(new Sky()) { } -Scene::Scene(Scene* _Scene, unsigned int x, unsigned int y, unsigned int width, unsigned int height, float fovy, float zNear, float zFar, vec3 pos, SceneObject* _lookat) : -viewPort(new ViewPort(x, y, width, height, fovy, zNear, zFar)), - SceneObjects(_Scene->SceneObjects), - ShaderSet((_Scene->ShaderSet)), - newObjects(false), - lookat(_lookat), - move_delta(0) -{ -} - -Scene::Scene(Scene* _Scene) : - SceneObjects(_Scene->SceneObjects), - ShaderSet((_Scene->ShaderSet)), - newObjects(false), - move_delta(0) -{ -} - Scene::~Scene() { - if (newObjects){ - for (auto i = SceneObjects->begin(); i != SceneObjects->end(); ++i) - { - delete (*i); - } - delete SceneObjects; - delete ShaderSet; + + for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i) + { + delete (*i); } - + + + if (viewPort != nullptr) delete viewPort; } @@ -93,7 +72,7 @@ void Scene::update(float deltaT) //Jump if (Events::getJump() && lookat->floorBound()) - lookat->ySpeed += 5.5; + lookat->ySpeed += 5.5; //else if (!Events::isKHeld(SDLK_SPACE) && lookat->ySpeed>0) // lookat->ySpeed = 0; @@ -120,8 +99,8 @@ void Scene::update(float deltaT) //Rotate Play in move direction if (move_x || move_y) - lookat->turnTo(viewPort->rotateDirection(vec3(0.f, 0.f, -1.f)),3*deltaT/TIME_TILL_DIRECTION_ROTATE); - + lookat->turnTo(viewPort->rotateDirection(vec3(0.f, 0.f, -1.f)), 3 * deltaT / TIME_TILL_DIRECTION_ROTATE); + //// Zoom auf Player //if (Events::getViewZ()) @@ -135,35 +114,38 @@ void Scene::update(float deltaT) //} // Alle Objekte der Scene aktualisieren - if (newObjects) + for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i) { - for (auto i = SceneObjects->begin(); i != SceneObjects->end(); ++i) - { - (*i)->update(deltaT); - } - + (*i)->update(deltaT); + } + - for (auto i = SceneObjects->begin(); i != SceneObjects->end(); ++i) + for (auto i = SceneObjects.begin(); i != SceneObjects.end(); ++i) + { + auto j = i; + for (j++; j != SceneObjects.end(); ++j) { - auto j = i; - for (j++; j != SceneObjects->end(); ++j) - { - (*i)->collisions(*j); - } + (*i)->collisions(*j); } - - } + + + } void Scene::draw() const { viewPort->useViewPort(); - for (auto i = ShaderSet->cbegin(); i != ShaderSet->cend(); ++i) + //Skybox + viewPort->bindView(SkyBox->getShader(), lookat->getPosition() + vec3(0.0f, 1.0f, 0.0f)); + //BBox + viewPort->bindView(Graphix::shader_BBox, 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)); + viewPort->bindView(*i, lookat->getPosition() + vec3(0.0f, 1.0f, 0.0f)); //don't know if this is really the right place to set the lighting //add ambient light @@ -176,14 +158,10 @@ void Scene::draw() const //glLightfv(GL_LIGHT0, GL_DIFFUSE, lightcolor0); //glLightfv(GL_LIGHT0, GL_POSITION, lightposition0); } - - - - - + SkyBox->draw(); - for (auto i = SceneObjects->cbegin(); i != SceneObjects->cend(); ++i) + for (auto i = SceneObjects.cbegin(); i != SceneObjects.cend(); ++i) { (*i)->draw(); } @@ -191,20 +169,20 @@ void Scene::draw() const void Scene::addObject(SceneObject* _add) { - SceneObjects->push_back(_add); - ShaderSet->insert(_add->getShader()); - _add->setMainScene(this); + SceneObjects.push_back(_add); + ShaderSet.insert(_add->getShader()); +// _add->setMainScene(this); } void Scene::deleteObject(SceneObject* _del) { - SceneObjects->remove(_del); + SceneObjects.remove(_del); } list* Scene::getSceneObjects() { - return SceneObjects; + return &SceneObjects; } diff --git a/Weave/Scene/Scene.h b/Weave/Scene/Scene.h index 4a2f746..41c29e9 100644 --- a/Weave/Scene/Scene.h +++ b/Weave/Scene/Scene.h @@ -1,26 +1,20 @@ #pragma once -#include "../Graphix/ViewPort.h" -#include "SceneObject.h" #include "../Graphix/GLM.h" #include #include -using std::list; -using std::set; - -typedef list SceneList; +class SceneObject; +class ViewPort; +class Shader; class Scene { public: //Scene(); Scene(unsigned int x, unsigned int y, unsigned int width, unsigned int height, float fovy, float zNear, float zFar, vec3 pos, SceneObject* lookat = NULL); - __declspec(deprecated) - Scene(Scene*); - __declspec(deprecated) - Scene(Scene* _Scene, unsigned int x, unsigned int y, unsigned int width, unsigned int height, float fovy, float zNear, float zFar, vec3 pos, SceneObject* lookat = NULL); + virtual ~Scene(); virtual void update(float); @@ -29,19 +23,19 @@ public: void addObject(SceneObject*); void deleteObject(SceneObject*); - SceneList* getSceneObjects(); + std::list* getSceneObjects(); void setLookAt(SceneObject* _lookat); protected: ViewPort* viewPort; - SceneObject* lookat; + std::list SceneObjects; + std::set ShaderSet; - bool newObjects; - SceneList* SceneObjects; - set* ShaderSet; + SceneObject* SkyBox; float move_delta; + }; diff --git a/Weave/Scene/SceneObject.cpp b/Weave/Scene/SceneObject.cpp index 839205a..2845187 100644 --- a/Weave/Scene/SceneObject.cpp +++ b/Weave/Scene/SceneObject.cpp @@ -1,32 +1,26 @@ #include "SceneObject.h" +#include "Scene.h" #include -#include "../Graphix/GLM.h" - -#include "../Message.h" -#include -#include +#include "../Graphix/GLM.h" +#include "../Graphix/Graphix.h" #include "../Graphix/Shader.h" -#include "Scene.h" #include "../Graphix/Texture.h" - #include "../Graphix/Model.h" -#include "../Graphix/Graphix.h" - +#include "../Message.h" #include "../Events.h" -using std::string; - -using std::cout; -using std::endl; +#include +#include +using std::string; #define YFALL_SPEED 9.8f -SceneObject::SceneObject(Shader* _shader, mat4& _modelMat, string _modelpath, string texturepath, unsigned int _model_index) : +SceneObject::SceneObject(Shader* _shader, const mat4& _modelMat, string _modelpath, string texturepath, unsigned int _model_index) : model(new IMetaMesh(_modelpath)), modelMat(_modelMat), shader(_shader), @@ -54,7 +48,7 @@ yStatic(true) } -SceneObject::SceneObject(Shader* _shader, mat4& _modelMat, Model* _model, string texturepath) : +SceneObject::SceneObject(Shader* _shader, const mat4& _modelMat, Model* _model, string texturepath) : model(_model), modelMat(_modelMat), shader(_shader), @@ -121,7 +115,7 @@ void SceneObject::update(float deltaT) else { modelMat = translate(vec3(0.f, getFloor() - pos.y, 0.f))*modelMat; - ySpeed = 0; + ySpeed = 0; //set to FloorSpeed? } ySpeed -= deltaT*YFALL_SPEED; } diff --git a/Weave/Scene/SceneObject.h b/Weave/Scene/SceneObject.h index acba06d..a2e7e74 100644 --- a/Weave/Scene/SceneObject.h +++ b/Weave/Scene/SceneObject.h @@ -18,11 +18,9 @@ class SceneObject public: //SceneObject(Shader* _shader, mat4& model); - SceneObject(Shader* _shader, mat4& model, string modelpath, string texturepath, unsigned int model_index=0); + SceneObject(Shader* _shader, const mat4& model, string modelpath, string texturepath, unsigned int model_index=0); + SceneObject(Shader* _shader, const mat4& modelMat, Model* model, string texturepath); - SceneObject(Shader* _shader, mat4& modelMat, Model* model, string texturepath); - - //SceneObject(Shader* _shader, mat4& model, IMesh* model_obj, string texturepath); virtual ~SceneObject(); virtual void update(float); @@ -41,6 +39,7 @@ public: //virtual bool operator==(SceneObject); + __declspec(deprecated) void setMainScene(Scene *); void setCollision(bool); @@ -52,32 +51,28 @@ public: __declspec(deprecated) bool isEnemy(); - + //Floor bool floorBound() const; float getFloor() const; + //Falling bool yStatic; float ySpeed; protected: - void setMatter(float); - mat4 modelMat; - - - //__declspec(deprecated) - //unsigned int modelID; - Shader* shader; + Texture* texture; + Model* model; Scene* mainScene; bool collision_ignore; - Texture* texture; - - Model* model; + + Shader* shader_BBox; + }; diff --git a/Weave/Scene/Sky.cpp b/Weave/Scene/Sky.cpp new file mode 100644 index 0000000..2d2b3ca --- /dev/null +++ b/Weave/Scene/Sky.cpp @@ -0,0 +1,15 @@ +#include "Sky.h" + +#include "../Graphix/Shader.h" +#include "../Graphix/Model.h" + + +Sky::Sky() : SceneObject(new Shader("skybox_VS.hlsl","skybox_color_FS.hlsl"), mat4(1.f), new SkyBox(), "") +{ + +} + + +Sky::~Sky() +{ +} diff --git a/Weave/Scene/Sky.h b/Weave/Scene/Sky.h new file mode 100644 index 0000000..0156bb2 --- /dev/null +++ b/Weave/Scene/Sky.h @@ -0,0 +1,15 @@ +#pragma once +#include "SceneObject.h" + +#include "../Graphix/GLM.h" + +class Shader; + +class Sky : + public SceneObject +{ +public: + Sky(); + ~Sky(); +}; + diff --git a/Weave/Weave.vcxproj b/Weave/Weave.vcxproj index 11170a8..1e07713 100644 --- a/Weave/Weave.vcxproj +++ b/Weave/Weave.vcxproj @@ -100,6 +100,7 @@ + @@ -109,6 +110,7 @@ + @@ -121,6 +123,7 @@ + @@ -129,6 +132,7 @@ + diff --git a/Weave/Weave.vcxproj.filters b/Weave/Weave.vcxproj.filters index 5a064c7..606740a 100644 --- a/Weave/Weave.vcxproj.filters +++ b/Weave/Weave.vcxproj.filters @@ -60,10 +60,16 @@ Source Files + + Source Files + Source Files - + + Source Files + + Source Files @@ -122,5 +128,11 @@ Header Files + + Header Files + + + Header Files + \ No newline at end of file diff --git a/shader/basic_FS.hlsl b/shader/basic_FS.hlsl index d17d213..a041461 100644 --- a/shader/basic_FS.hlsl +++ b/shader/basic_FS.hlsl @@ -1,7 +1,9 @@ //Fragment Shader #version 330 out vec4 FragmentColor; + +uniform vec4 uFragmentColor = vec4(0.6, 0, 0, 0.6); void main(){ - FragmentColor = vec4(0, 0.3, 0, 0.6); -} \ No newline at end of file + FragmentColor = uFragmentColor; +} diff --git a/shader/basic_VS.hlsl b/shader/basic_VS.hlsl index 2d4c11c..6e75553 100644 --- a/shader/basic_VS.hlsl +++ b/shader/basic_VS.hlsl @@ -8,4 +8,4 @@ uniform mat4 uView; void main(){ gl_Position = uProjection * uView * uModel * vec4(aPosition, 1); -} \ No newline at end of file +} -- 2.47.3