Added camera operations and better input handling

This commit is contained in:
Julian Nießner
2018-05-07 16:58:15 +02:00
parent 1039a0fdb6
commit 51eff2d983
9 changed files with 118 additions and 27 deletions

View File

@@ -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;
}

49
src/Camera.cpp Normal file
View File

@@ -0,0 +1,49 @@
#include "Camera.h"
#include <glm/gtc/matrix_transform.hpp>
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() {
}

31
src/Camera.h Normal file
View File

@@ -0,0 +1,31 @@
#ifndef CAMERA_H
#define CAMERA_H
#include <glm/glm.hpp>
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

View File

@@ -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));

View File

@@ -4,10 +4,12 @@
class DarkRP2D;
#include <SDL.h>
#include <vector>
#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);

View File

@@ -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();

View File

@@ -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;
}
}

View File

@@ -6,9 +6,9 @@
class InputHandler {
public:
void handleInput(SDL_Event *event);
~InputHandler();
InputHandler();
Command* handleInput(SDL_Event *event);
private:
Command* W;

View File

@@ -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);
}