camera notify

This commit is contained in:
2025-07-16 12:54:50 +02:00
parent aaf76a3ff0
commit 1bee6aed9c
8 changed files with 69 additions and 24 deletions

View File

@@ -0,0 +1,36 @@
#pragma once
#include <algorithm>
#include <functional>
#include <vector>
namespace td {
namespace utils {
template <typename Listener>
class ObjectNotifier {
protected:
std::vector<Listener*> m_Listeners;
public:
void BindListener(Listener* listener) {
m_Listeners.push_back(listener);
}
void UnbindListener(Listener* listener) {
auto iter = std::find(m_Listeners.begin(), m_Listeners.end(), listener);
if (iter == m_Listeners.end()) return;
m_Listeners.erase(iter);
}
template <typename Func, typename... Args>
void NotifyListeners(Func function, Args... args) {
for (Listener* listener : m_Listeners)
std::bind(function, listener, args...)();
}
};
} // namespace utils
} // namespace td

View File

@@ -1,11 +1,20 @@
#pragma once
#include <td/Maths.h>
#include <td/misc/ObjectNotifier.h>
namespace td {
namespace render {
class Camera {
class ICameraListener {
public:
virtual void OnPerspectiveChange() {}
virtual void OnViewChange() {}
};
using CameraNotifier = utils::ObjectNotifier<ICameraListener>;
class Camera : public CameraNotifier {
private:
Mat4f m_ViewMatrix;
Mat4f m_ProjectionMatrix;

View File

@@ -8,7 +8,7 @@
namespace td {
namespace render {
class WorldRenderer : public Renderer {
class WorldRenderer : public Renderer, public ICameraListener {
private:
const game::World& m_World;
shader::WorldShader m_Shader;
@@ -19,6 +19,9 @@ class WorldRenderer : public Renderer {
virtual ~WorldRenderer();
virtual void Render() override;
virtual void OnPerspectiveChange() override;
virtual void OnViewChange() override;
};
} // namespace render