Mostly functional mouse look

Walking doesn't take it into account though...
This commit is contained in:
karl 2020-01-07 20:02:40 +01:00
parent 511b2da319
commit a262b60def
9 changed files with 131 additions and 7 deletions

View File

@ -7,7 +7,7 @@ find_package(OpenGL REQUIRED)
find_package(glfw3 REQUIRED) find_package(glfw3 REQUIRED)
find_package(glm REQUIRED) find_package(glm REQUIRED)
add_executable(ecsgame Util/glad.c Util/OBJ_Loader.h Rendering/Shader.cpp Rendering/Shader.h main.cpp ECS/Components/Transform.h ECS/Components/Movement.h ECS/Events/InputEvent.h ECS/Systems/GravitySystem.h ECS/Systems/PositionDebugSystem.h ECS/Systems/KeyboardMovementSystem.h ECS/Components/Camera.h ECS/Systems/RenderSystem.h ECS/Components/Mesh.h) add_executable(ecsgame Util/glad.c Util/OBJ_Loader.h Rendering/Shader.cpp Rendering/Shader.h main.cpp ECS/Components/Transform.h ECS/Components/Movement.h ECS/Events/InputEvent.h ECS/Events/MouseMoveEvent.h ECS/Systems/GravitySystem.h ECS/Systems/PositionDebugSystem.h ECS/Systems/KeyboardMovementSystem.h ECS/Components/Camera.h ECS/Systems/RenderSystem.h ECS/Components/Mesh.h ECS/Systems/MouseLookSystem.h ECS/Components/MouseLook.h)
include_directories(${OPENGL_INCLUDE_DIRS}) include_directories(${OPENGL_INCLUDE_DIRS})

View File

@ -14,6 +14,8 @@ struct Camera {
glm::perspective(glm::radians(fov), width / height, near, far)) {} glm::perspective(glm::radians(fov), width / height, near, far)) {}
glm::mat4 projection; glm::mat4 projection;
glm::mat4 view;
}; };
#endif //ECSGAME_CAMERA_H #endif //ECSGAME_CAMERA_H

View File

@ -0,0 +1,14 @@
//
// Created by karl on 07.01.20.
//
#ifndef ECSGAME_MOUSELOOK_H
#define ECSGAME_MOUSELOOK_H
struct MouseLook {
explicit MouseLook(float sensitivity) : sensitivity(sensitivity) {}
float sensitivity;
};
#endif //ECSGAME_MOUSELOOK_H

View File

@ -33,6 +33,18 @@ struct Transform {
glm::vec3 getPosition() { glm::vec3 getPosition() {
return matrix * glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); return matrix * glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);
} }
glm::vec3 forward() {
return matrix * glm::vec4(0.0, 0.0, -1.0, 1.0);
}
glm::vec3 up() {
return matrix * glm::vec4(0.0, 1.0, 0.0, 1.0);
}
glm::vec3 right() {
return matrix * glm::vec4(1.0, 0.0, 0.0, 1.0);
}
}; };
#endif //ECSGAME_TRANSFORM_H #endif //ECSGAME_TRANSFORM_H

View File

@ -0,0 +1,13 @@
//
// Created by karl on 04.01.20.
//
#ifndef ECSGAME_MOUSEMOVEEVENT_H
#define ECSGAME_MOUSEMOVEEVENT_H
struct MouseMoveEvent {
double newX;
double newY;
};
#endif //ECSGAME_INPUTEVENT_H

View File

@ -64,7 +64,7 @@ class KeyboardMovementSystem : public EntitySystem, public EventSubscriber<Input
void tick(World *pWorld, float deltaTime) override { void tick(World *pWorld, float deltaTime) override {
pWorld->each<Transform, Movement>( pWorld->each<Transform, Movement>(
[&](Entity *ent, ComponentHandle<Transform> transform, ComponentHandle<Movement> movement) { [&](Entity *ent, ComponentHandle<Transform> transform, ComponentHandle<Movement> movement) {
transform->translate(glm::vec3(movement->moving) * movement->speed * deltaTime); transform->translate(glm::mat3x3(transform->matrix) * glm::vec3(movement->moving) * movement->speed * deltaTime);
}); });
} }

View File

@ -0,0 +1,73 @@
//
// Created by karl on 07.01.20.
//
#ifndef ECSGAME_MOUSELOOKSYSTEM_H
#define ECSGAME_MOUSELOOKSYSTEM_H
#include "../ECS.h"
#include "../Components/Transform.h"
#include "../Components/MouseLook.h"
#include "../Events/MouseMoveEvent.h"
using namespace ECS;
class MouseLookSystem : public EntitySystem, public EventSubscriber<MouseMoveEvent> {
public:
explicit MouseLookSystem(int width, int height) : lastX(width / 2.0), lastY(height / 2.0) {}
void configure(World *pWorld) override {
myWorld = pWorld;
myWorld->subscribe<MouseMoveEvent>(this);
}
void unconfigure(World *pWorld) override {
pWorld->unsubscribeAll(this);
}
void receive(World *pWorld, const MouseMoveEvent &event) override {
pWorld->each<Transform, MouseLook, Camera>([&](Entity *ent, ComponentHandle<Transform> transform, ComponentHandle<MouseLook> mouse, ComponentHandle<Camera> camera) {
double xOffset = event.newX - lastX;
double yOffset = lastY - event.newY;
lastX = event.newX;
lastY = event.newY;
yaw += xOffset * mouse->sensitivity;
pitch += yOffset * mouse->sensitivity;
});
}
void tick(World *pWorld, float deltaTime) override {
pWorld->each<Transform, MouseLook, Camera>([&](Entity *ent, ComponentHandle<Transform> transform, ComponentHandle<MouseLook> mouse, ComponentHandle<Camera> camera) {
if(pitch > 89.0f)
pitch = 89.0f;
if(pitch < -89.0f)
pitch = -89.0f;
glm::vec3 direction;
direction.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
direction.y = sin(glm::radians(pitch));
direction.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
glm::vec3 cameraOrigin = transform->getPosition();
glm::vec3 cameraFront = glm::normalize(direction);
glm::vec3 cameraUp = glm::vec3(0.0, 1.0, 0.0);
glm::vec3 cameraRight = glm::cross(cameraFront, cameraUp);
camera->view = glm::lookAt(cameraOrigin, cameraOrigin + cameraFront, cameraUp);
});
}
private:
double lastX;
double lastY;
double pitch = 0.0;
double yaw = 0.0;
World *myWorld;
};
#endif //ECSGAME_MOUSELOOKSYSTEM_H

View File

@ -23,7 +23,7 @@ public:
shader.use(); shader.use();
shader.setMat4("projection", camera->projection); shader.setMat4("projection", camera->projection);
shader.setMat4("view", cameraTransform->matrix); shader.setMat4("view", camera->view);
pWorld->each<Mesh, Transform>([&](Entity *ent, ComponentHandle<Mesh> mesh, ComponentHandle<Transform> transform) { pWorld->each<Mesh, Transform>([&](Entity *ent, ComponentHandle<Mesh> mesh, ComponentHandle<Transform> transform) {
shader.setMat4("model", transform->matrix); shader.setMat4("model", transform->matrix);

View File

@ -6,10 +6,12 @@
#include "Rendering/Shader.h" #include "Rendering/Shader.h"
#include "ECS/ECS.h" #include "ECS/ECS.h"
#include "ECS/Events/InputEvent.h" #include "ECS/Events/InputEvent.h"
#include "ECS/Events/MouseMoveEvent.h"
#include "ECS/Systems/GravitySystem.h" #include "ECS/Systems/GravitySystem.h"
#include "ECS/Systems/PositionDebugSystem.h" #include "ECS/Systems/PositionDebugSystem.h"
#include "ECS/Systems/KeyboardMovementSystem.h" #include "ECS/Systems/KeyboardMovementSystem.h"
#include "ECS/Systems/RenderSystem.h" #include "ECS/Systems/RenderSystem.h"
#include "ECS/Systems/MouseLookSystem.h"
using namespace ECS; using namespace ECS;
@ -24,6 +26,10 @@ static void key_callback(GLFWwindow *window, int key, int scancode, int action,
world->emit<InputEvent>({key, action}); world->emit<InputEvent>({key, action});
} }
static void mouse_callback(GLFWwindow* window, double xpos, double ypos) {
world->emit<MouseMoveEvent>({xpos, ypos});
}
int main() { int main() {
GLFWwindow *window; GLFWwindow *window;
@ -41,6 +47,10 @@ int main() {
/* Make the window's context current */ /* Make the window's context current */
glfwMakeContextCurrent(window); glfwMakeContextCurrent(window);
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
glfwSetCursorPosCallback(window, mouse_callback);
glfwSetKeyCallback(window, key_callback); glfwSetKeyCallback(window, key_callback);
// glad: load all OpenGL function pointers // glad: load all OpenGL function pointers
@ -55,8 +65,9 @@ int main() {
// TODO: Could be automated by getting all classes within 'ECS/Systems' // TODO: Could be automated by getting all classes within 'ECS/Systems'
// world->registerSystem(new GravitySystem(-9.8f)); // world->registerSystem(new GravitySystem(-9.8f));
world->registerSystem(new PositionDebugOutputSystem()); // world->registerSystem(new PositionDebugOutputSystem());
world->registerSystem(new KeyboardMovementSystem()); world->registerSystem(new KeyboardMovementSystem());
world->registerSystem(new MouseLookSystem(640, 480));
RenderSystem* renderSystem = new RenderSystem(); RenderSystem* renderSystem = new RenderSystem();
world->registerSystem(renderSystem); world->registerSystem(renderSystem);
@ -65,6 +76,7 @@ int main() {
player->assign<Transform>(); player->assign<Transform>();
player->assign<Movement>(glm::vec3(1.f, 1.f, 1.f)); player->assign<Movement>(glm::vec3(1.f, 1.f, 1.f));
player->assign<Camera>(70.0f, 640, 480, 0.1f, 100.0f); player->assign<Camera>(70.0f, 640, 480, 0.1f, 100.0f);
player->assign<MouseLook>(0.1);
Entity *box = world->create(); Entity *box = world->create();
box->assign<Transform>(); box->assign<Transform>();
@ -111,7 +123,7 @@ int main() {
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, -0.5f, 0.5f, 0.5f, 0.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f -0.5f, 0.5f, -0.5f, 0.0f, 1.0f
}); });
box->get<Transform>()->translate(glm::vec3(0.0f, 0.0f, -10.0f)); box->get<Transform>()->translate(glm::vec3(0.0f, 0.0f, -5.0f));
Shader defaultShader("Shaders/default-vertex.vs", "Shaders/default-fragment.fs"); Shader defaultShader("Shaders/default-vertex.vs", "Shaders/default-fragment.fs");
@ -125,8 +137,6 @@ int main() {
timeInLastFrame = glfwGetTime(); timeInLastFrame = glfwGetTime();
elapsed_time += delta; elapsed_time += delta;
std::cout << "Elapsed time: " << elapsed_time << std::endl;
world->tick(delta); world->tick(delta);
renderSystem->render(world, defaultShader); renderSystem->render(world, defaultShader);