diff --git a/shaders/vert.shader b/shaders/vert.shader index 717d805..19c660f 100644 --- a/shaders/vert.shader +++ b/shaders/vert.shader @@ -3,9 +3,12 @@ layout (location = 0) in vec2 aPos; layout (location = 1) in vec2 texCoord; +uniform mat4 projection; +uniform mat4 view; + out vec2 TexCoord; void main() { - gl_Position = vec4(aPos.x,aPos.y,0.,1.0); + gl_Position = projection * view * vec4(aPos.xy,0.0,1.0); TexCoord = texCoord; } diff --git a/src/Camera.cpp b/src/Camera.cpp new file mode 100644 index 0000000..dee2d2f --- /dev/null +++ b/src/Camera.cpp @@ -0,0 +1,49 @@ +#include "Camera.h" + +#include + +OrtographicCamera::~OrtographicCamera() { + +} + +void OrtographicCamera::setPosition(glm::vec2 position) { + this->cameraPos = position; +} + +glm::vec2 OrtographicCamera::getPosition() { + return this->cameraPos; +} + +void OrtographicCamera::setZoomLevel(float newZoom) { + this->zoom = newZoom; +} + +void OrtographicCamera::zoomIn(float targetZoom) { + +} + +void OrtographicCamera::translate(glm::vec2) { + +} + +void OrtographicCamera::smoothTranslate(glm::vec2) { + +} + +glm::mat4 OrtographicCamera::getViewMatrix() { + glm::mat4 view(1); + view = glm::translate(view, glm::vec3(-cameraPos,0.f)); + return view; +} + +glm::mat4 OrtographicCamera::getProjectionMatrix() { + int width = 800; + int height = 600; + glm::mat4 projection; + projection = glm::ortho(0.0f, width*this->zoom, 0.0f, height*this->zoom); + return projection; +} + +void OrtographicCamera::update() { + +} \ No newline at end of file diff --git a/src/Camera.h b/src/Camera.h new file mode 100644 index 0000000..c934057 --- /dev/null +++ b/src/Camera.h @@ -0,0 +1,31 @@ +#ifndef CAMERA_H +#define CAMERA_H + +#include + +class OrtographicCamera { + private: + glm::vec2 cameraPos; + + float zoom = 0.01f; + + public: + OrtographicCamera() : cameraPos(glm::vec2(-5.0f,-5.0f)) {} + ~OrtographicCamera(); + + void setPosition(glm::vec2); + glm::vec2 getPosition(); + + void setZoomLevel(float newZoom); + void zoomIn(float targetZoom); + + void translate(glm::vec2); + void smoothTranslate(glm::vec2); + + glm::mat4 getViewMatrix(); + glm::mat4 getProjectionMatrix(); + + void update(); +}; + +#endif \ No newline at end of file diff --git a/src/DarkRP2D.cpp b/src/DarkRP2D.cpp index 89758fe..0a15b95 100644 --- a/src/DarkRP2D.cpp +++ b/src/DarkRP2D.cpp @@ -8,6 +8,7 @@ DarkRP2D::~DarkRP2D() { delete assets; delete obj; delete inputHandler; + delete camera; } void DarkRP2D::create () { @@ -32,17 +33,19 @@ void DarkRP2D::create () { inputHandler = new InputHandler(); font = new BitmapFont("arial.ttf"); + camera = new OrtographicCamera(); + glClearColor(1.f,1.f,1.f,1.f); } -void DarkRP2D::loop(SDL_Event *event, unsigned int delta) { +void DarkRP2D::loop(unsigned int delta) { static unsigned int accumulator = 0, ups = 0, fps = 0, acc = 0; accumulator += delta; acc += delta; while(accumulator >= 17) { accumulator -= 17; - update(event, delta); + update(delta); ups++; } @@ -56,8 +59,16 @@ void DarkRP2D::loop(SDL_Event *event, unsigned int delta) { fps++; } -void DarkRP2D::update(SDL_Event *event, unsigned int delta) { - inputHandler->handleInput(event); +void DarkRP2D::update(unsigned int delta) { + SDL_Event event; + while(SDL_PollEvent(&event) != 0) { + Command* command = inputHandler->handleInput(&event); + if (command) { + command->execute(); + } + } + + //camera update } void DarkRP2D::render(unsigned int delta) { @@ -65,10 +76,11 @@ void DarkRP2D::render(unsigned int delta) { //Drawing Shader defaultShader = assets->getShader("defaultShader"); - defaultShader.Use(); - //Draw Triangle + defaultShader.SetMatrix4("view",camera->getViewMatrix(),true); + defaultShader.SetMatrix4("projection",camera->getProjectionMatrix(),true); + //Draw Mesh obj->draw(); - + //texttest Shader bitmapShader = assets->getShader("bitmapShader"); font->drawText(bitmapShader, "Hallo du noob", 25.0f, 25.0f, 1.f, glm::vec3(0.5f,0.8f,0.2f)); diff --git a/src/DarkRP2D.h b/src/DarkRP2D.h index 71dfedb..f117762 100644 --- a/src/DarkRP2D.h +++ b/src/DarkRP2D.h @@ -4,10 +4,12 @@ class DarkRP2D; #include #include + #include "Assets.h" #include "Mesh.h" #include "InputHandler.h" #include "BitmapFont.h" +#include "Camera.h" class DarkRP2D { private: @@ -16,14 +18,15 @@ class DarkRP2D { Mesh *obj; InputHandler *inputHandler; BitmapFont *font; + OrtographicCamera *camera; public: DarkRP2D(SDL_Window *gWindow) : gWindow(gWindow) {} ~DarkRP2D(); void create (); - void loop(SDL_Event *event, unsigned int delta); - void update(SDL_Event *event, unsigned int delta); + void loop(unsigned int delta); + void update(unsigned int delta); void render(unsigned int delta); void resize(int width, int height); diff --git a/src/DesktopLauncher.cpp b/src/DesktopLauncher.cpp index b7c4599..5514cc9 100755 --- a/src/DesktopLauncher.cpp +++ b/src/DesktopLauncher.cpp @@ -25,7 +25,6 @@ int main(int argc, char *argv[]) { //While application is running bool quit = false; - SDL_Event e; DarkRP2D resA(gWindow); resA.create(); unsigned int lastTime = SDL_GetTicks(), currentTime, elapsedTime; @@ -33,16 +32,7 @@ int main(int argc, char *argv[]) { currentTime = SDL_GetTicks(); elapsedTime = currentTime - lastTime; lastTime = currentTime; - if(SDL_PollEvent(&e) != 0) { - if(e.type == SDL_QUIT) { - quit = true; - break; - } - resA.loop(&e,elapsedTime); - } else { - resA.loop(NULL,elapsedTime); - } - + resA.loop(elapsedTime); } dispose(); diff --git a/src/InputHandler.cpp b/src/InputHandler.cpp index 65582e3..8655fb1 100644 --- a/src/InputHandler.cpp +++ b/src/InputHandler.cpp @@ -10,18 +10,21 @@ InputHandler::~InputHandler() { //Free all Commands } -void InputHandler::handleInput(SDL_Event *event) { +Command* InputHandler::handleInput(SDL_Event *event) { if(event == NULL) { - return; + return NULL; } switch (event->type) { case SDL_KEYDOWN: std::cout << "The Key " << SDL_GetKeyName(event->key.keysym.sym) << " has been pressed!" << std::endl; - + return NULL; break; case SDL_KEYUP: std::cout << "The Key " << SDL_GetKeyName(event->key.keysym.sym) << " has been released!" << std::endl; + return NULL; break; - default: break; + default: + return NULL; + break; } } diff --git a/src/InputHandler.h b/src/InputHandler.h index d6ea3ff..72a8f0a 100644 --- a/src/InputHandler.h +++ b/src/InputHandler.h @@ -6,9 +6,9 @@ class InputHandler { public: - void handleInput(SDL_Event *event); ~InputHandler(); InputHandler(); + Command* handleInput(SDL_Event *event); private: Command* W; diff --git a/src/Texture.cpp b/src/Texture.cpp index 0240def..1b0480b 100644 --- a/src/Texture.cpp +++ b/src/Texture.cpp @@ -4,7 +4,7 @@ Texture2D::Texture2D() - : Width(0), Height(0), Internal_Format(GL_RGB), Image_Format(GL_RGB), Wrap_S(GL_REPEAT), Wrap_T(GL_REPEAT), Filter_Min(GL_NEAREST), Filter_Max(GL_NEAREST) + : Width(0), Height(0), Internal_Format(GL_RGB), Image_Format(GL_RGB), Wrap_S(GL_REPEAT), Wrap_T(GL_REPEAT), Filter_Min(GL_LINEAR), Filter_Max(GL_LINEAR) { glGenTextures(1, &this->ID); }