]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
removed ViewPort
authorPeter Schaefer <schaeferpm@gmail.com>
Mon, 2 May 2016 10:13:17 +0000 (12:13 +0200)
committerPeter Schaefer <schaeferpm@gmail.com>
Mon, 2 May 2016 10:13:17 +0000 (12:13 +0200)
new Camera Class
bugFix (Rotierende Kamera bei Fenster Ă„nderungen)
Projection only updated after change

preps for Frustum Culling

21 files changed:
Weave/Events.cpp
Weave/GLM.h
Weave/Game.cpp
Weave/Game.h
Weave/Graphix/Graphix.cpp
Weave/Graphix/Model/BBox.cpp
Weave/Graphix/Model/IMetaMesh.cpp
Weave/Graphix/Model/Model.cpp
Weave/Graphix/Model/Model.h
Weave/Graphix/ViewPort.cpp [deleted file]
Weave/Graphix/ViewPort.h [deleted file]
Weave/Scene/Camera.cpp [new file with mode: 0644]
Weave/Scene/Camera.h [new file with mode: 0644]
Weave/Scene/Marvin.cpp
Weave/Scene/Scene.cpp
Weave/Scene/Scene.h
Weave/Scene/SceneObject.h
Weave/Scene/Timestamp.cpp
Weave/Scene/Timestamp.h
Weave/Weave.vcxproj
Weave/Weave.vcxproj.filters

index e19a3316caa5bcba47ebcc2ce8df9708e49c2f5c..d294895f1027e46bfb23520a7bdebbb9cb93f077 100644 (file)
@@ -2,6 +2,7 @@
 #include <SDL2\SDL.h>
 
 #include "Graphix\Graphix.h"
+#include "Game.h"
 
 #include "GLM.h"
 
@@ -15,6 +16,7 @@ using std::endl;
 void Events::processEvents()
 {
        SDL_Event sdl_event;
+       bool focus_gained = false;
        while (SDL_PollEvent(&sdl_event)){
                //cout << sdl_event.type << endl;
                switch (sdl_event.type){
@@ -28,6 +30,7 @@ void Events::processEvents()
                        case SDL_WINDOWEVENT_FOCUS_GAINED:
                                window_focus = true;
                                Graphix::hideMouse(true);
+                               focus_gained = true;
                                break;
                        case SDL_WINDOWEVENT_FOCUS_LOST:
                                window_focus = false;
@@ -35,6 +38,7 @@ void Events::processEvents()
                                break;
                        case SDL_WINDOWEVENT_RESIZED:
                                Graphix::setWindowSize(sdl_event.window.data1, sdl_event.window.data2);
+                               Game::updateActiveView();
                                break;
                        default:
                                break;
@@ -73,6 +77,13 @@ void Events::processEvents()
                        break;
                }
        }
+
+       if (focus_gained)
+       {
+               view_x = 0;
+               view_y = 0;
+       }
+
        keymotion();
 }
 
index 5617289ada67572419ba41aa572ee08c21be3d21..61a23de4369679fe0591acc6321b272ed79b2333 100644 (file)
@@ -15,9 +15,10 @@ using glm::translate;
 using glm::rotate;
 //using glm::scale;
 using glm::determinant;
-using glm::perspective;
+//using glm::perspective;
+//using glm::lookAt;
 using glm::normalize;
-using glm::inverse;
+//using glm::inverse;
 using glm::transpose;
 using glm::dot;
 using glm::cross;
@@ -43,7 +44,7 @@ typedef aiMatrix4x4t<float> aiMatrix4x4;
 #define M_2_PI      0.636619772367581343075535053490057448  /* 2/pi */
 #define M_D_R       57.2957795131                                                      /* 180/pi */
 
-__declspec(deprecated)
+__declspec(deprecated("Use glm::lenght(vec3)"))
 float VektorAbs(const vec3& vek);
 
 mat4 removeScale(const mat4& matrix);
index 4071729bd1cb11c24e26c120fda42f6d65022ff5..6001e419b5da52efdbc40a22d91751b5e8ecf11d 100644 (file)
@@ -87,12 +87,13 @@ Game::~Game()
 \r
 void Game::play()\r
 {\r
+       active = this;\r
+\r
        Fps fps(0.3f);\r
        int sleep_time=0;\r
        float message_time=0;\r
        int framecount = 0;\r
 \r
-\r
        current_world->bindShader();\r
 \r
        while (!Events::halt){\r
@@ -137,14 +138,19 @@ void Game::play()
        }\r
 }\r
 \r
+void Game::updateActiveView()\r
+{\r
+       active->current_world->setView(Graphix::getWindowWidth(), Graphix::getWindowHeight());\r
+}\r
+\r
 void Game::update(float deltaT)\r
 {\r
        /* ADJUST WINDOWS SIZE*/\r
-       if (Graphix::getWindowHeight() != current_world->getViewport().getHeight() || Graphix::getWindowWidth() != current_world->getViewport().getWidth())\r
-       {\r
-               current_world->setView(0, 0, Graphix::getWindowWidth(), Graphix::getWindowHeight());\r
+       //if (Graphix::getWindowHeight() != current_world->getViewport().getHeight() || Graphix::getWindowWidth() != current_world->getViewport().getWidth())\r
+       //{\r
+       //      current_world->setView(0, 0, Graphix::getWindowWidth(), Graphix::getWindowHeight());\r
 \r
-       }\r
+       //}\r
                \r
        if (playing){\r
                current_world->update(deltaT);\r
@@ -169,4 +175,6 @@ void Game::draw() const
        //else\r
        //      l_menu->draw();\r
 \r
-}
\ No newline at end of file
+}\r
+\r
+Game* Game::active = nullptr;
\ No newline at end of file
index 1e584f158168592222c6a6f763e8b1d587189906..863a67f686e02fa1764a10efe37562688122a4f0 100644 (file)
@@ -17,6 +17,7 @@ public:
 
        //void loadLVL();
 
+       static void updateActiveView();
 
 private:
 
@@ -29,5 +30,7 @@ private:
        void update(float);
        void draw() const;
 
+       static Game* active;
+
 };
 
index d6d9e09aab6e0783679cc1f592ca4569622f7e04..4f8186939406b29502420b6b8f538a8cbf16f29f 100644 (file)
@@ -14,6 +14,8 @@ void Graphix::setWindowSize(unsigned int _width, unsigned int _height)
 {\r
        width = _width;\r
        height = _height;\r
+\r
+       glViewport(0, 0, width, height);\r
 }\r
 \r
 void Graphix::setWindowPos(unsigned int _xpos, unsigned int _ypos)\r
@@ -148,6 +150,8 @@ void Graphix::init()
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\r
        glClearAccum(0.f, 0.f, 0.f, 0.f);\r
        glClear(GL_ACCUM_BUFFER_BIT);\r
+\r
+       glViewport(0, 0, width, height);\r
 }\r
 \r
 void Graphix::FullScreen(bool _enable, bool _keepDesktopResolution)\r
index cd5ef1e12782f8bff75a2de159c3755370810e6d..e10936497e9700820c062f374bf470b952307c84 100644 (file)
@@ -15,6 +15,7 @@ BBox::BBox()
 \r
        //bindModel();\r
        bt_init();\r
+       box_init();\r
 \r
        name = "BBox";\r
 \r
index 6d6b8f3dce1d30caecde80fd75a6f302a200bb70..a405820550fd4ea846bbbca0ebf318162693b014 100644 (file)
@@ -45,6 +45,12 @@ IMetaMesh::IMetaMesh(const string& _modelpath, const vec3& _scale, bool _isConve
                                tmpIMesh = new IMesh(scene->mMeshes[i], _scale* getScale(tmpModelMat));\r
                                models.push_back(std::pair<IMesh*, mat4>(tmpIMesh, tmpModelMatClean));\r
 \r
+                               tmpIMesh->box_init(tmpModelMatClean);\r
+\r
+                               if (i == 0)\r
+                                       box = tmpIMesh->getBox();\r
+                               else\r
+                                       box.update(tmpIMesh->getBox());\r
                        }\r
 \r
                }\r
@@ -212,10 +218,13 @@ void IMetaMesh::bt_init(bool _isConvex)
 //}\r
 \r
 \r
+\r
+\r
 string IMetaMesh::type2str() const\r
 {\r
        return "IMetaMesh";\r
 }\r
+\r
 //\r
 //void IMetaMesh::setMargin(btScalar _margin)\r
 //{\r
index 68e07d7de759c2f015ab44f1ef7dd97bb24b7a33..9866b51809fe3a2617d12fbdcdbdfb3eeb806a11 100644 (file)
@@ -21,6 +21,8 @@
 \r
 using namespace std;\r
 \r
+typedef Model::Box Box;\r
+\r
 Model::Model()\r
 {\r
 }\r
@@ -435,6 +437,38 @@ bool Model::loadMesh(const aiMesh* mesh, const vec3& _scale)
        return true;\r
 }\r
 \r
+void Model::box_init(const mat4& _model)\r
+{\r
+       if (vertex == nullptr)\r
+               return;\r
+\r
+       vec3 tmp = vec3(_model * vec4(vertex[0], vertex[1], vertex[2],1.f));\r
+\r
+       vec3 min = tmp, max = tmp;\r
+\r
+       for (uint i = 1; i < numvertices; i++)\r
+       {\r
+               tmp = vec3(_model * vec4(vertex[3 * i], vertex[3 * i + 1], vertex[3 * i + 2], 1.f));\r
+               for (uint k = 0; k < 3; k++)\r
+               {\r
+                       if (tmp[k] > max[k])\r
+                               max[k] = tmp[k];\r
+                       if (tmp[k] < min[k])\r
+                               min[k] = tmp[k];\r
+               }\r
+       }\r
+\r
+       box = Box((max + min) * .5f, (max - min) * .5f);\r
+}\r
+\r
+Box Model::getBox()\r
+{\r
+       if (box.size() == vec3(0.f))\r
+               box_init();\r
+       return box;\r
+}\r
+\r
+\r
 Model::operator btCollisionShape*() const\r
 {\r
        return bt_collision_shape;\r
@@ -474,3 +508,148 @@ Model* Model::PlaneModel = nullptr;
 Model* Model::SkyBoxModel = nullptr;\r
 std::unordered_map<string, Model*> Model::IMetaModel;\r
 std::unordered_map<string, uint> Model::IMetaModel_count;\r
+\r
+\r
+//CLASS BOX\r
+\r
+Box::Box() : cen(0.f), siz(0.f), rad(0.f)\r
+{}\r
+\r
+Model::Box::Box(const unsigned int num, const float * verts)\r
+{\r
+}\r
+\r
+Box::Box(const vec3& _center, const vec3& _size) : cen(_center), siz(_size), rad(length(_size))\r
+{\r
+}\r
+\r
+Box::~Box()\r
+{\r
+}\r
+\r
+void Box::update(const Box& _box)\r
+{\r
+       vec3 diff = _box.cen - cen;\r
+       float size;\r
+\r
+       for (int i = 0; i<3; ++i)\r
+       {\r
+               if (abs(siz[i] - _box.siz[i]) - abs(diff[i]) >= 0)\r
+               {\r
+                       if (siz[i] < _box.siz[i])\r
+                       {\r
+                               siz[i] = _box.siz[i];\r
+                               cen[i] = _box.cen[i];\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       size = (siz[i] + _box.siz[i] + abs(diff[i])) * .5f;\r
+                       cen[i] = cen[i] - sign(diff[i]) * (siz[i] - size);\r
+                       siz[i] = size;\r
+               }\r
+\r
+       }\r
+       rad = length(siz);\r
+}\r
+\r
+\r
+void Box::getBBcs(vec3& _center, vec3& _size) const\r
+{\r
+       _center = cen;\r
+       _size = siz;\r
+}\r
+\r
+vec3 Box::center() const\r
+{\r
+       return cen;\r
+}\r
+\r
+vec3 Box::size() const\r
+{\r
+       return siz;\r
+}\r
+\r
+float Box::radius() const\r
+{\r
+       return rad;\r
+}\r
+\r
+void Box::rotate(const mat4& _modelMat)\r
+{\r
+       //Rotate Center\r
+       cen = (vec3)(_modelMat*vec4(cen, 1.f));\r
+\r
+       //Rotate Size\r
+       vec3 newSize(0.f);\r
+       mat3 tmpModelMat(_modelMat);\r
+       for (auto i = 0; i < 3; ++i)\r
+               newSize += abs(tmpModelMat[i]) * siz[i];\r
+       siz = newSize;\r
+       rad = length(siz);\r
+}\r
+\r
+void Box::scale(const vec3& _scale)\r
+{\r
+       for (uint i = 0; i < 3; ++i)\r
+       {\r
+               cen[i] *= _scale[i];\r
+               siz[i] *= _scale[i];\r
+       }\r
+\r
+       rad = length(siz);\r
+}\r
+\r
+float Box::getDist(const vec3& _pos) const\r
+{\r
+       vec3 diff = _pos - cen;\r
+       vec3 direc = normalize(diff);\r
+\r
+       float size(0.f);\r
+       for (auto i = 0; i < 3; ++i)\r
+               size += abs(siz[i] * direc[i]);\r
+       return diff.length() - size;\r
+}\r
+\r
+float Box::getDist(const vec3& _pos, const vec3& _direc) const\r
+{\r
+       vec3 diff = _pos - cen;\r
+\r
+       float size(0.f);\r
+       for (auto i = 0; i < 3; ++i)\r
+               size += abs(siz[i] * _direc[i]);\r
+       return dot(diff, _direc) - size;\r
+}\r
+\r
+\r
+Box Box::merge(const Box& _boxA, const Box& _boxB)\r
+{\r
+       vec3 diff = _boxB.cen - _boxA.cen;\r
+       vec3 size;\r
+       vec3 center;\r
+\r
+       for (int i = 0; i<3; ++i)\r
+       {\r
+               if (abs(_boxA.siz[i] - _boxB.siz[i]) - abs(diff[i]) >= 0)\r
+               {\r
+                       if (_boxA.siz[i] > _boxB.siz[i])\r
+                       {\r
+                               size[i] = _boxA.siz[i];\r
+                               center[i] = _boxA.cen[i];\r
+                       }\r
+                       else\r
+                       {\r
+                               size[i] = _boxB.siz[i];\r
+                               center[i] = _boxB.cen[i];\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       size[i] = (_boxA.siz[i] + _boxB.siz[i] + abs(diff[i])) * .5f;\r
+                       center[i] = _boxA.cen[i] - sign(diff[i]) * (_boxA.siz[i] - size[i]);\r
+               }\r
+\r
+       }\r
+       return Box(center, size);\r
+}\r
+\r
index 5d43284a943a7cf9b54cb8ab4a6c66a0964eecd2..60daefff37ad8295d84bbad509f72d3afc3d310a 100644 (file)
@@ -22,6 +22,8 @@ class Model
 {\r
 public:\r
 \r
+       class Box;\r
+\r
        /* Binds Model to GL*/\r
        virtual void bindModel();\r
        virtual void unbindModel();\r
@@ -55,10 +57,43 @@ public:
        virtual void bt_init(bool _convex = true);\r
        virtual void bt_setMargin(btScalar margin);\r
 \r
+       virtual void box_init(const mat4& modelMat = mat4(1.f));\r
+       virtual Box getBox();\r
+\r
        // Mesh Speichern?\r
        bool loadMesh(const std::string& modelpath, uint mindex = 0);\r
        bool loadMesh(const aiMesh* mesh, const vec3& scale = vec3(1.f));\r
 \r
+       class Box\r
+       {\r
+       public:\r
+               Box();\r
+               Box(const unsigned int num, const float* verts);\r
+               Box(const vec3& center, const vec3& size);\r
+               ~Box();\r
+\r
+               void update(const Box& box);\r
+\r
+               void getBBcs(vec3& center, vec3& size) const;\r
+\r
+               vec3 center() const;\r
+               vec3 size() const;\r
+               float radius() const;\r
+\r
+               void rotate(const mat4& modelMat);\r
+               void scale(const vec3& scale);\r
+\r
+               float getDist(const vec3& pos) const;\r
+               float getDist(const vec3& pos, const vec3& direc) const;\r
+\r
+               static Box merge(const Box& boxA, const Box& boxB);\r
+\r
+       protected:\r
+               vec3 cen;\r
+               vec3 siz;\r
+               float rad;\r
+       };\r
+\r
 protected:\r
        Model();\r
        virtual ~Model();\r
@@ -71,8 +106,10 @@ protected:
        float *vertex = nullptr, *normals = nullptr, *uvs = nullptr;\r
        uint *index = nullptr;\r
 \r
-       vec3 center;\r
-       float radius;\r
+       //vec3 center = vec3(0.f), size = vec3(0.f);\r
+       //float radius = 0.f;\r
+\r
+       Box box;\r
 \r
        std::unordered_map<uint, uint> shader_map;\r
        \r
diff --git a/Weave/Graphix/ViewPort.cpp b/Weave/Graphix/ViewPort.cpp
deleted file mode 100644 (file)
index 8b93506..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-#include "ViewPort.h"
-
-#include <GL\glew.h>
-#include "../GLM.h"
-
-#include "Shader.h"
-
-#define VIEW_TOP_LIM 0.9f
-#define VIEW_BOT_LIM -0.3f
-
-
-ViewPort::ViewPort(unsigned int _x, unsigned int _y, unsigned int _width, unsigned int _height, float _fovy, float _zNear, float _zFar) :
-       xpos(_x),
-       ypos(_y),
-       width(_width),
-       height(_height),
-       fovy(_fovy),
-       zNear(_zNear),
-       zFar(_zFar),
-       projection(perspective(fovy, (float)width / height, zNear, zFar)),
-       view_angle_x(0),
-       view_angle_y(0),
-       view_dist(2),
-       view(0.f),
-       shadow_dist(2)
-{
-       rotateView(0.f, -.5f);
-}
-
-
-ViewPort::~ViewPort()
-{
-}
-
-void ViewPort::useViewPort() const
-{
-       glViewport(xpos, ypos, width, height);
-}
-
-void ViewPort::bindView(const Shader* shader) const{
-       shader->useShader();
-
-       shader->setUniformLocation("uProjection", projection);
-       shader->setUniformLocation("uInvProjection", glm::inverse(projection));
-       shader->setUniformLocation("uView", view);
-
-}
-
-void ViewPort::bindView(const Shader* shader, vec3 pos) const{
-       shader->useShader();
-
-       shader->setUniformLocation("uProjection", projection);
-       shader->setUniformLocation("uInvProjection", glm::inverse(projection));
-       shader->setUniformLocation("uView", translate(view, -pos));
-}
-
-void ViewPort::bindViewShadowDir(const Shader* shader) const {
-       shader->useShader();
-
-       shader->setUniformLocation("uProjection", glm::mat4(1 / shadow_dist));
-       shader->setUniformLocation("uInvProjection", glm::mat4(shadow_dist));
-       //TODO the real thing
-       shader->setUniformLocation("uView", view);
-}
-
-void ViewPort::rotateView(float angle_x, float angle_y){
-
-       if (angle_y || angle_x){
-
-               view_angle_x -= angle_x;
-               view_angle_y -= angle_y;
-
-               //Y-Limits
-               if (view_angle_y > VIEW_TOP_LIM)
-                       view_angle_y = VIEW_TOP_LIM;
-
-               if (view_angle_y < VIEW_BOT_LIM)
-                       view_angle_y = VIEW_BOT_LIM;
-
-               view = translate(vec3(0.f, 0.f, -view_dist))*rotate(view_angle_y *(float)M_PI_2, vec3(1.f, 0.f, 0.f))*rotate(view_angle_x * (float)M_PI_2, vec3(0.f, 1.f, 0.f));
-       }
-
-}
-
-vec3 ViewPort::rotateDirection(const vec3 & direction) const{
-       return glm::rotateY(direction, -view_angle_x * (float)M_PI_2);
-}
-
-unsigned int ViewPort::getXPos() const
-{
-       return xpos;
-}
-
-unsigned int ViewPort::getYPos() const
-{
-       return ypos;
-}
-
-unsigned int ViewPort::getWidth() const
-{
-       return width;
-}
-
-unsigned int ViewPort::getHeight() const
-{
-       return height;
-}
-
-void ViewPort::setView(uint _x, uint _y, uint _width, uint _height, bool _updateProjection)
-{
-       xpos = _x;
-       ypos = _y;
-       width = _width;
-       height = _height;
-       if (_updateProjection)
-               projection = perspective(fovy, (float)width / height, zNear, zFar);
-}
diff --git a/Weave/Graphix/ViewPort.h b/Weave/Graphix/ViewPort.h
deleted file mode 100644 (file)
index 62c02a6..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#pragma once
-
-//#include "Drawable.h"
-#include "../GLM.h"
-
-class Shader;
-
-class ViewPort
-{
-public:
-       ViewPort(unsigned int x, unsigned int y, unsigned int width, unsigned int height, float fovy, float zNear, float zFar);
-       ~ViewPort();
-
-       void useViewPort() const;
-
-       void setView(unsigned int x, unsigned int y, unsigned int width, unsigned int height, bool updateProjection = true);
-
-       void bindView(const Shader* shader) const;
-       void bindView(const Shader* shader, vec3 lookat) const;
-       void bindViewShadowDir(const Shader* shader) const;
-
-       void rotateView(float angle_x, float angle_y);
-       vec3 rotateDirection(const vec3 & direction) const;
-
-       unsigned int getXPos() const;
-       unsigned int getYPos() const;
-       unsigned int getWidth() const;
-       unsigned int getHeight() const;
-
-//     Drawable* content;
-
-
-protected:
-       unsigned int width;
-       unsigned int height;
-
-       unsigned int xpos;
-       unsigned int ypos;
-
-       float fovy, zNear, zFar;
-
-       mat4 projection;
-       mat4 view;
-
-       float view_dist;
-       float view_angle_x;
-       float view_angle_y;
-
-       float shadow_dist;
-};
-
diff --git a/Weave/Scene/Camera.cpp b/Weave/Scene/Camera.cpp
new file mode 100644 (file)
index 0000000..3c18120
--- /dev/null
@@ -0,0 +1,128 @@
+#include "Camera.h"
+
+#include "../Graphix/Shader.h"
+
+using glm::lookAt;
+using glm::perspective;
+using glm::inverse;
+
+#define VIEW_PITCH_MAX 0.3f
+#define VIEW_PITCH_MIN -0.9f
+
+#define WORLD_UP  vec3(0.f, 1.f, 0.f)
+
+Camera::Camera(float _yFov, float _xyRatio, float _zNear, float _zFar) :
+       yFov(_yFov),
+       xyRatio(_xyRatio),
+       zNear(_zNear),
+       zFar(_zFar),
+       projection(perspective(yFov, xyRatio, zNear, zFar)),
+       pitch(0.f),
+       yaw(0.f),
+       dist(2.f),      //DIST 
+       cPosition(0.f)
+{
+       updateVectors();
+}
+
+
+Camera::~Camera()
+{
+}
+
+void Camera::useCamera() const
+{
+               useProjection();
+               useView();
+}
+
+void Camera::useView() const
+{
+       Shader::getShader(SH_ACTIVE)->setUniformLocation("uView", lookAt(cPosition - dist* cFront,cPosition, cUpVector));
+}
+
+void Camera::useProjection() const
+{
+       Shader::getShader(SH_ACTIVE)->setUniformLocation("uProjection", projection);
+       Shader::getShader(SH_ACTIVE)->setUniformLocation("uInvProjection", glm::inverse(projection));
+}
+
+void Camera::updateView(const vec3& _target)
+{
+
+       if (_target == cPosition)
+               return;
+
+       cPosition = _target;
+}
+
+void Camera::updateView_pitch(float _pitch)
+{
+       if (_pitch == 0)
+               return;
+
+       float piTmp = pitch + _pitch;
+       
+       if (piTmp > VIEW_PITCH_MAX)
+               piTmp = VIEW_PITCH_MAX;
+       else if(piTmp < VIEW_PITCH_MIN)
+               piTmp = VIEW_PITCH_MIN;
+
+       if (pitch == piTmp)
+               return;
+
+       pitch = piTmp;
+
+       updateVectors();
+}
+
+void Camera::updateView_yaw(float _yaw)
+{
+       if (_yaw == 0)
+               return;
+
+       yaw += _yaw;
+
+       updateVectors();
+}
+
+
+void Camera::updateProjection(float _xyRatio)
+{
+       if (xyRatio == _xyRatio)
+               return;
+
+       xyRatio = _xyRatio;
+
+       projection = perspective(yFov, xyRatio, zNear, zFar);
+}
+
+void Camera::updateProjection(float _yFov, float _xyRatio, float _zNear, float _zFar)
+{
+       if (yFov == _yFov && xyRatio == _xyRatio&&zNear == _zNear&&zFar == _zFar)
+               return;
+
+       yFov = _yFov;
+       xyRatio = _xyRatio;
+       zNear = _zNear;
+       zFar = _zFar;
+
+       projection = perspective(yFov, xyRatio, zNear, zFar);
+}
+
+bool Camera::frustum_sphere(vec3 center, float radius)
+{
+       return false;
+}
+
+void Camera::updateVectors()
+{
+       cFront.x = cos(yaw*(float)M_PI_2) * cos(pitch*(float)M_2_PI);
+       cFront.y = sin(pitch*(float)M_2_PI);
+       cFront.z = sin(yaw*(float)M_PI_2) * cos(pitch*(float)M_2_PI);
+       cFront = normalize(cFront);
+
+
+       cRight = normalize(cross(cFront, WORLD_UP));
+       cUpVector = normalize(cross(cRight, cFront));
+}
\ No newline at end of file
diff --git a/Weave/Scene/Camera.h b/Weave/Scene/Camera.h
new file mode 100644 (file)
index 0000000..418dd74
--- /dev/null
@@ -0,0 +1,51 @@
+#pragma once
+
+#include "../GLM.h"
+
+
+//TURN AROUND TARGET!
+class Camera
+{
+public:
+       Camera(float yFov, float xyRatio, float zNear, float zFar);
+       ~Camera();
+
+       
+
+       /*use Camera (bind View&Projection at current Shader) if unchanged*/
+       void useCamera() const;
+
+       void useView() const;
+       void useProjection() const;
+
+       void updateView(const vec3& target);
+       void updateView_pitch(float);
+       void updateView_yaw(float);
+
+       void updateProjection(float xyRatio);
+       void updateProjection(float yFov, float xyRatio, float zNear, float zFar);
+
+       vec3 getDirection() { return cFront;}
+       vec3 getRight() { return cRight; }
+
+       vec3 getWorldDirection() { return normalize(vec3(cFront.x, 0.f, cFront.z)); }
+       vec3 getWorldRight() { return normalize(vec3(cRight.x, 0.f, cRight.z)); }
+
+       bool frustum_sphere(vec3 center, float radius = 0.f);
+
+
+protected:
+
+       void updateVectors();
+
+       /*Projection*/
+       float yFov, xyRatio, zNear, zFar;
+       mat4 projection = mat4(1.f);
+
+       /*View*/
+       vec3 cPosition, cFront, cUpVector, cRight;
+       float pitch, yaw;
+       float dist;
+       
+};
+
index ab03b84db810b8b7639c5d387f0688085aa5e74c..0c86498443d8a7effb40bc4e2781d1f53b4f116c 100644 (file)
@@ -3,7 +3,7 @@
 #include "../Graphix/Shader.h"
 #include "../GLM.h"
 #include "../Events.h"
-#include "../Graphix/ViewPort.h"
+#include "Camera.h"
 #include "Scene.h"
 
 #define TIME_TILL_MAX_MOVE 2
@@ -28,7 +28,8 @@ Marvin::~Marvin()
 
 void Marvin::update(float deltaT)
 {
-       ViewPort& viewPort(mainScene->getViewport());
+       //ViewPort& viewPort(mainScene->getViewport());
+       Camera& cam(mainScene->getCam());
 
 
 
@@ -40,7 +41,7 @@ void Marvin::update(float deltaT)
        int move_y = Events::getMoveY();
        // MOVE Player
        if (move_x)
-               move(SPEED_MOVE_NORMAL *move_x * deltaT * viewPort.rotateDirection(vec3(-1.f, 0.f, 0.f)));
+               move(-SPEED_MOVE_NORMAL *move_x * deltaT * cam.getWorldRight());
 
        if (move_y){
                if (move_y > 0){
@@ -48,10 +49,10 @@ void Marvin::update(float deltaT)
                                move_delta += deltaT;
                        if (move_delta > TIME_TILL_MAX_MOVE)
                                move_delta = TIME_TILL_MAX_MOVE;
-                       move(SPEED_MOVE_NORMAL * (MOVE_FASTER * move_delta / TIME_TILL_MAX_MOVE + 1) *move_y * deltaT * viewPort.rotateDirection(vec3(0.f, 0.f, -1.f)));
+                       move(SPEED_MOVE_NORMAL * (MOVE_FASTER * move_delta / TIME_TILL_MAX_MOVE + 1) *move_y * deltaT * cam.getWorldDirection());
                }
                else
-                       move(SPEED_MOVE_NORMAL *move_y * deltaT * viewPort.rotateDirection(vec3(0.f, 0.f, -1.f)));
+                       move(SPEED_MOVE_NORMAL *move_y * deltaT * cam.getWorldDirection());
        }
        else
        {
@@ -60,7 +61,7 @@ void Marvin::update(float deltaT)
 
        //Rotate Play in move direction
        if (move_x || move_y)
-               turnTo(viewPort.rotateDirection(vec3(0.f, 0.f, -1.f)), 3 * deltaT / TIME_TILL_DIRECTION_ROTATE);
+               turnTo(cam.getWorldDirection(), 3 * deltaT / TIME_TILL_DIRECTION_ROTATE);
 
        SceneObject::update(deltaT);
 }
index a39bbaaa910af1443fd901ac7cccc6e29163c0ea..5f45d927c63c2744233981d57dad20be2ae4dae2 100644 (file)
@@ -1,13 +1,14 @@
 #include "Scene.h"
 #include "SceneObject.h"
-#include "Sky.h"
+//#include "Sky.h"
+//#include "Camera.h"
 #include <GL\glew.h>
 
-#include "../GLM.h"
+//#include "../GLM.h"
 #include "../Graphix/Graphix.h"
 
 #include "../Graphix/Shader.h"
-#include "../Graphix/ViewPort.h"
+//#include "../Graphix/ViewPort.h"
 #include "../Graphix/Textures.h"
 #include "../Graphix/Model.h"
 
@@ -20,6 +21,8 @@
 
 #define NELEMS(x)  (sizeof(x) / sizeof((x)[0]))
 
+ShaderTarget shader[] = { SH_BASIC,SH_BASICTEXTURE,SH_LIGHTING, SH_SHADOWDIR };
+
 
 using std::list;
 using std::set;
@@ -33,12 +36,13 @@ using std::stack;
 #define YFALL_SPEED 9.8f
 
 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(x, y, width, height, fovy, zNear, zFar),
+//viewPort(x, y, width, height, fovy, zNear, zFar),
+camera(fovy, (float)width/height, zNear, zFar),
 lookat(_lookat)
 {
        currenttime = 0.0f;
        if (lookat != nullptr)
-               timestamps.push(Timestamp(0.0f, _lookat->getModelMat(), x, lookat->ySpeed));
+               timestamps.push(Timestamp(0.0f, _lookat->getModelMat(), lookat->ySpeed));
 
        bt_collision_configuration = new btDefaultCollisionConfiguration();
        bt_dispatcher = new btCollisionDispatcher(bt_collision_configuration);
@@ -79,6 +83,12 @@ lookat(_lookat)
        fBufferObject::clearBuffer();
 
        Graphix::disableEffects(EF_BLOOM);
+
+       for (int s = 0; s < NELEMS(shader); s++)
+       {
+               Shader::getShader(shader[s])->useShader();
+               camera.useCamera();
+       }
 }
 
 
@@ -121,9 +131,11 @@ Scene::~Scene()
 void Scene::update(float deltaT)
 {
        // XYAchse um den Player
-       float rotatex = 0.002f*Events::getViewX();
-       float rotatey = 0.001f*Events::getViewY();
-       viewPort.rotateView(rotatex, rotatey);
+       //float rotatex = 0.002f*Events::getViewX();
+       //float rotatey = 0.001f*Events::getViewY();
+       camera.updateView_pitch(0.001f*Events::getViewY());
+       camera.updateView_yaw(-0.002f*Events::getViewX());
+       //viewPort.rotateView(rotatex, rotatey);
 
        if (!Events::getTimeShift())
        {
@@ -131,7 +143,7 @@ void Scene::update(float deltaT)
 
                if (ceil((currenttime + deltaT) / timestep) > ceil(currenttime / timestep))
                {
-                       timestamps.push(Timestamp(currenttime, lookat->getModelMat(), viewPort.getXPos(), lookat->ySpeed));
+                       timestamps.push(Timestamp(currenttime, lookat->getModelMat(), lookat->ySpeed));
                }
                currenttime += deltaT;
 
@@ -164,7 +176,7 @@ void Scene::update(float deltaT)
        {
                float prev_time = timestamps.top().time;
                mat4 prev_mat = timestamps.top().Playermodel;
-               unsigned int prev_camera = timestamps.top().CameraX;
+               //unsigned int prev_camera = timestamps.top().CameraX;
                int prev_ySpeed = timestamps.top().ySpeed;
                while (max(0.0f, currenttime - deltaT) < prev_time)
                {
@@ -172,7 +184,7 @@ void Scene::update(float deltaT)
 
                        prev_time = timestamps.top().time;
                        prev_mat = timestamps.top().Playermodel;
-                       prev_camera = timestamps.top().CameraX;
+                       //prev_camera = timestamps.top().CameraX;
                        prev_ySpeed = timestamps.top().ySpeed;
                }
 
@@ -192,21 +204,19 @@ void Scene::update(float deltaT)
                currenttime = max(0.0f, currenttime - deltaT);
        }
 
+       camera.updateView(lookat->getPosition()+vec3(0.f,1.f,0.f));
+
 }
 
 
 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();
+       for (int s = 0; s < NELEMS(shader); s++)
+       {
+               Shader::getShader(shader[s])->useShader();
+               camera.useView();
+       }
 
        /*Draw WireFrame ONLY*/
        if (Events::isKToggleActive(SDLK_F3))
@@ -241,6 +251,8 @@ void Scene::draw() const
        /*DRAW SCENE*/
        Shader::getShader(SH_BASICTEXTURE)->useShader();
        SkyBox.draw();
+       //Shader::getShader(SH_BASICTEXTURE)->useShader();
+       //Shader::getShader(SH_BASICTEXTURE)->setUniformLocation("uFar", false);
        Shader::getShader(SH_LIGHTING)->useShader();
        drawSceneObjects();
 
@@ -345,14 +357,22 @@ void Scene::setLookAt(SceneObject* _lookat)
        lookat = _lookat;
 }
 
-ViewPort& Scene::getViewport()
-{
-       return viewPort;
-}
+//ViewPort& Scene::getViewport()
+//{
+//     return viewPort;
+//}
 
-void Scene::setView(unsigned int x, unsigned int y, unsigned int width, unsigned int height, bool updateProjection)
+void Scene::setView(unsigned int width, unsigned int height, bool updateProjection)
 {
-       viewPort.setView(x, y, width, height, updateProjection);
+       if(updateProjection)
+               camera.updateProjection((float)width / height);
+
+       for (int s = 0; s < NELEMS(shader); s++)
+       {
+               Shader::getShader(shader[s])->useShader();
+               camera.useProjection();
+       }
+
        render->updateSize(width, height);
        postRender->updateSize(width, height);
        for (int i = 0; i < 2; i++)
@@ -364,13 +384,13 @@ 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, SH_SHADOWDIR};
        for (int s = 0; s < NELEMS(shader); s++)
        {
                for (auto i = SceneObjects.cbegin(); i != SceneObjects.cend(); ++i)
                        (*i)->bindShader(Shader::getShader(shader[s]));
        }
 
+
        /*Skybox*/
        SkyBox.bindShader(Shader::getShader(SH_BASICTEXTURE));
 
index d873d18d33523c5828943189e7e1ceb8427ffcf8..63f77544c8a1fdfd04e01b7fb0d6f3bc4ccfffa1 100644 (file)
@@ -2,8 +2,8 @@
 
 #include "../GLM.h"
 
-#include "../Graphix/ViewPort.h"
 #include "Sky.h"
+#include "Camera.h"
 #include "Timestamp.h"
 
 #include <list>
 #include <stack>
 
 class SceneObject;
-class ViewPort;
-class Sky;
+//class ViewPort;
+//class Sky;
 class Shader;
 class fBufferObject;
+//class Camera;
 
 class Scene
 {
@@ -36,12 +37,14 @@ public:
        std::list<SceneObject*>* getSceneObjects();
 
        void setLookAt(SceneObject* _lookat);
-       ViewPort& getViewport();
+       //ViewPort& getViewport();
+       Camera& getCam() { return camera; }
 
-       void setView(unsigned int x, unsigned int y, unsigned int width, unsigned int height, bool updateProjection = true);
+       void setView(unsigned int width, unsigned int height, bool updateProjection = true);
 
 protected:
-       ViewPort viewPort;
+       //ViewPort viewPort;
+       Camera camera;
        Sky SkyBox;
        SceneObject* lookat;
 
index db165282b72a4f82975484b9a59bae7e3affb267..0232a660470a957ff63cb131c261639bf513d2b6 100644 (file)
@@ -44,7 +44,6 @@ public:
        virtual void draw(drawTarget target=DRAW_Model) const;
 
        virtual void bindShader(const Shader* shader);
-
        virtual void bindShaderCollision(const Shader* shader);
 
        virtual void collides(SceneObject* other, btPersistentManifold* contactManifold, float deltaT=1.f);
index e6d32e507eb21e218caf04a62790cbd0bc643302..974861bfea7e33201992ee663c91b52a7552d5e7 100644 (file)
@@ -1,9 +1,9 @@
 #include "Timestamp.h"
 
-Timestamp::Timestamp(float _time, mat4& _Playermodel, unsigned int x, float _ySpeed) :
+Timestamp::Timestamp(float _time, mat4& _Playermodel, float _ySpeed) :
 time(_time),
 Playermodel(_Playermodel),
-CameraX(x),
+//CameraX(x),
 ySpeed(_ySpeed)
 {
 
index 88350df627cf511a870c83a324219f53b6936889..26753e7c187e4abadbc81dc02e130defeb1c8abc 100644 (file)
@@ -5,12 +5,12 @@
 class Timestamp
 {
 public:
-       Timestamp(float _time, mat4& _Playermodel, unsigned int _Camera, float ySpeed);
+       Timestamp(float _time, mat4& _Playermodel, float ySpeed);
 
        virtual ~Timestamp();
 
        float time;
        mat4 Playermodel;
-       unsigned int CameraX;
+       //unsigned int CameraX;
        float ySpeed;
 };
\ No newline at end of file
index f6da46dc85c0e00b3d8a16a2a9e72f454f306828..24971980ce64a5cc9a526add68e5b7d9173f33df 100644 (file)
     <ClCompile Include="Graphix\Textures\fBufferObject.cpp" />\r
     <ClCompile Include="Graphix\Textures\rBufferObject.cpp" />\r
     <ClCompile Include="Graphix\Textures\Texture.cpp" />\r
+    <ClCompile Include="Scene\Camera.cpp" />\r
     <ClCompile Include="Scene\EventBox.cpp" />\r
     <ClCompile Include="Scene\Level.cpp" />\r
     <ClCompile Include="Scene\Marvin.cpp" />\r
     <ClCompile Include="Scene\Scene.cpp" />\r
     <ClCompile Include="Scene\SceneObject.cpp" />\r
     <ClCompile Include="Graphix\Shader.cpp" />\r
-    <ClCompile Include="Graphix\ViewPort.cpp" />\r
     <ClCompile Include="main.cpp" />\r
     <ClCompile Include="Message.cpp" />\r
     <ClCompile Include="Scene\Sky.cpp" />\r
     <ClInclude Include="Graphix\Textures\rBufferObject.h" />\r
     <ClInclude Include="Graphix\Textures\Texture.h" />\r
     <ClInclude Include="Scene.h" />\r
+    <ClInclude Include="Scene\Camera.h" />\r
     <ClInclude Include="Scene\EventBox.h" />\r
     <ClInclude Include="Scene\Level.h" />\r
     <ClInclude Include="Scene\Marvin.h" />\r
     <ClInclude Include="Scene\Scene.h" />\r
     <ClInclude Include="Scene\SceneObject.h" />\r
     <ClInclude Include="Graphix\Shader.h" />\r
-    <ClInclude Include="Graphix\ViewPort.h" />\r
     <ClInclude Include="Message.h" />\r
     <ClInclude Include="Scene\Sky.h" />\r
     <ClInclude Include="Scene\Timestamp.h" />\r
index 820ddde9fbad787eaee8e185ab568af2a68190df..89e5f83f7d11aca8b4626da5980aac411a70b516 100644 (file)
@@ -33,9 +33,6 @@
     <ClCompile Include="Graphix\Shader.cpp">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="Graphix\ViewPort.cpp">\r
-      <Filter>Source Files</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="Game.cpp">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
     <ClCompile Include="Graphix\Textures\dBufferObject.cpp">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="Scene\Camera.cpp">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="Fps.h">\r
     <ClInclude Include="Graphix\Shader.h">\r
       <Filter>Header Files</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="Graphix\ViewPort.h">\r
-      <Filter>Header Files</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="Game.h">\r
       <Filter>Header Files</Filter>\r
     </ClInclude>\r
     <ClInclude Include="Graphix\Textures\dBufferObject.h">\r
       <Filter>Header Files</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="Scene\Camera.h">\r
+      <Filter>Header Files</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
 </Project>
\ No newline at end of file