Input manager, camera zoom

This commit is contained in:
legatt 2026-01-25 03:39:50 +03:00
parent 83f947ce1f
commit 49affdcc38
14 changed files with 117 additions and 11 deletions

Binary file not shown.

View File

@ -0,0 +1,23 @@
#pragma once
#include <functional>
namespace ee_engine
{
struct InputHandlers
{
std::function<void(float dx, float dy)> zooming;
std::function<void(float dx, float dy)> mapScroll;
};
class IInput
{
public:
virtual ~IInput() {};
virtual void Poll() = 0;
protected:
InputHandlers handlers;
explicit IInput(const InputHandlers &handlers) {this->handlers = handlers;};
};
}

View File

@ -39,6 +39,8 @@ namespace ee_engine
virtual void ResizeWindow(int width, int height); virtual void ResizeWindow(int width, int height);
void SetCamera(const CameraTransform &camera); void SetCamera(const CameraTransform &camera);
CameraTransform getCamera();
protected: protected:
int screenWidth, screenHeight; int screenWidth, screenHeight;
float screenAspect; float screenAspect;

View File

@ -66,3 +66,5 @@ void ee_engine::IRenderer::SetCamera(const CameraTransform &camera)
ApplyCamera(); ApplyCamera();
} }
ee_engine::CameraTransform ee_engine::IRenderer::getCamera() {return this->camera;}

View File

@ -0,0 +1,14 @@
#pragma once
#include <ee_engine_api/InputInterface.hpp>
class Actions
{
public:
static ee_engine::InputHandlers mappings;
private:
static void Zoom(float dx, float dy);
static void MapScroll(float dx, float dy);
Actions();
};

View File

@ -1,12 +1,15 @@
#pragma once #pragma once
#include <GLFW/glfw3.h>
#include <ee_engine_api/RenderInterface.hpp> #include <ee_engine_api/RenderInterface.hpp>
#include <ee_engine_api/InputInterface.hpp>
#include "AssetManager.hpp" #include "AssetManager.hpp"
class Engine class Engine
{ {
public: public:
static GLFWwindow *window;
static ee_engine::IInput *input;
static AssetManager *assetManager; static AssetManager *assetManager;
static ee_engine::IRenderer *renderer; static ee_engine::IRenderer *renderer;

View File

@ -0,0 +1,10 @@
#pragma once
#include <ee_engine_api/InputInterface.hpp>
#include <GLFW/glfw3.h>
class GLFWInput : public ee_engine::IInput
{
public:
GLFWInput(ee_engine::InputHandlers handlers);
void Poll() override;
};

20
engine/src/Actions.cpp Normal file
View File

@ -0,0 +1,20 @@
#include "Actions.hpp"
#include "Engine.hpp"
#include <cmath>
ee_engine::InputHandlers Actions::mappings {
.zooming = Zoom,
.mapScroll = MapScroll
};
void Actions::Zoom(float dx, float dy)
{
ee_engine::CameraTransform cam = Engine::renderer->getCamera();
cam.zoom *= pow(1.1f, -dy);
Engine::renderer->SetCamera(cam);
}
void Actions::MapScroll(float dx, float dy)
{
}

View File

@ -1,11 +1,17 @@
#include "Engine.hpp" #include "Engine.hpp"
#include <ee_utils/allocator.hpp> #include <ee_utils/allocator.hpp>
GLFWwindow* Engine::window;
ee_engine::IInput* Engine::input;
AssetManager* Engine::assetManager; AssetManager* Engine::assetManager;
ee_engine::IRenderer* Engine::renderer; ee_engine::IRenderer* Engine::renderer;
void Engine::Shutdown() void Engine::Shutdown()
{ {
if (input != nullptr)
Deallocate(input);
if (renderer != nullptr) if (renderer != nullptr)
{ {
renderer->Shutdown(); renderer->Shutdown();
@ -13,13 +19,14 @@ void Engine::Shutdown()
} }
renderer = nullptr; renderer = nullptr;
if (Engine::assetManager != nullptr)
{ // Wait for asset manager to clean and shutdown
Engine::assetManager->Shutdown();
while(Engine::assetManager->isRunning.load());
}
if (assetManager != nullptr) if (assetManager != nullptr)
{ // Wait for asset manager to clean and shutdown
assetManager->Shutdown();
while(assetManager->isRunning.load()) {}
Deallocate(assetManager); Deallocate(assetManager);
assetManager = nullptr; }
assetManager = nullptr;
glfwDestroyWindow(window);
glfwTerminate();
} }

20
engine/src/GLFWInput.cpp Normal file
View File

@ -0,0 +1,20 @@
#include "GLFWInput.hpp"
#include "Engine.hpp"
#include "Logger.h"
GLFWInput::GLFWInput(ee_engine::InputHandlers handlers) : ee_engine::IInput(handlers)
{
glfwSetWindowUserPointer(Engine::window, this);
glfwSetScrollCallback(Engine::window, [](GLFWwindow *window, double dx, double dy) {
reinterpret_cast<GLFWInput*>(glfwGetWindowUserPointer(window))->
handlers.zooming(static_cast<float>(dx), static_cast<float>(dy));
});
LOG(INFO, "Input mappings initialized");
}
void GLFWInput::Poll()
{
}

View File

@ -4,6 +4,8 @@
#include <ee_utils/allocator.hpp> #include <ee_utils/allocator.hpp>
#include "compile_config.hpp" #include "compile_config.hpp"
#include "GLFWInput.hpp"
#include "Actions.hpp"
#include "Engine.hpp" #include "Engine.hpp"
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
@ -33,6 +35,7 @@ int main(int argc, char **argv)
else LOG(INFO, "GLFW Window created"); else LOG(INFO, "GLFW Window created");
glfwMakeContextCurrent(window); glfwMakeContextCurrent(window);
Engine::window = window;
// Setup Asset Manager // Setup Asset Manager
Engine::assetManager = Allocate<AssetManager>(); Engine::assetManager = Allocate<AssetManager>();
@ -43,6 +46,9 @@ int main(int argc, char **argv)
// Load assets // Load assets
Engine::assetManager->LoadAsync(AssetInfo::MAP_MESH, "assets/map/states.map"); Engine::assetManager->LoadAsync(AssetInfo::MAP_MESH, "assets/map/states.map");
// Setup input manager TODO: builder
Engine::input = Allocate<GLFWInput>(Actions::mappings);
// Setup renderer TODO: builder // Setup renderer TODO: builder
Engine::renderer = reinterpret_cast<ee_engine::IRenderer*>(Allocate<ee_magnum::MagnumRenderer>(window)); Engine::renderer = reinterpret_cast<ee_engine::IRenderer*>(Allocate<ee_magnum::MagnumRenderer>(window));
@ -61,7 +67,7 @@ int main(int argc, char **argv)
Engine::renderer->Init(); Engine::renderer->Init();
Engine::renderer->SetCamera({ Engine::renderer->SetCamera({
.position = {1000.0f, 1000.0f}, //.position = {1000.0f, 1000.0f},
.zoom = 2000.0f .zoom = 2000.0f
}); });
@ -75,14 +81,13 @@ int main(int argc, char **argv)
Engine::renderer->Draw(); Engine::renderer->Draw();
glfwSwapBuffers(window); glfwSwapBuffers(window);
Engine::input->Poll();
glfwPollEvents(); glfwPollEvents();
} }
// Free memory // Free memory
LOG(INFO, "Exit..."); LOG(INFO, "Exit...");
Engine::Shutdown(); Engine::Shutdown();
glfwDestroyWindow(window);
glfwTerminate();
//TODO: check Unregister in other threads and make threaded module base class //TODO: check Unregister in other threads and make threaded module base class
Logger::trace->Unregister_Thread(0); Logger::trace->Unregister_Thread(0);
Logger::trace->Release(); Logger::trace->Release();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

BIN
sdk/map/_states.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 MiB

After

Width:  |  Height:  |  Size: 29 KiB