Updated the display controllers to use state controls

This commit is contained in:
2023-03-01 08:43:59 -08:00
parent b9667f8312
commit 94d15b20cc
7 changed files with 79 additions and 137 deletions

View File

@ -19,19 +19,14 @@ void AnimationController::addAnimation(Animation *animation) {
this->animations.push_back(animation); this->animations.push_back(animation);
} }
void AnimationController::onSceneUpdate() {
auto it = this->animations.begin();
while(it != this->animations.end()) {
(*it)->tick(this->getGame()->timeManager.delta);
++it;
}
}
void AnimationController::onStart() { void AnimationController::onStart() {
SceneItemComponent::onStart(); SceneItemComponent::onStart();
getScene()->eventSceneUnpausedUpdate.addListener(this, &AnimationController::onSceneUpdate);
}
void AnimationController::onDispose() { useEventLegacy([&]{
getScene()->eventSceneUnpausedUpdate.removeListener(this, &AnimationController::onSceneUpdate); auto it = this->animations.begin();
while(it != this->animations.end()) {
(*it)->tick(this->getGame()->timeManager.delta);
++it;
}
}, getScene()->eventSceneUnpausedUpdate);
} }

View File

@ -1,24 +1,27 @@
// Copyright (c) 2022 Dominic Masters // Copyright (c) 2022 Dominic Masters
// //
// This software is released under the MIT License. // This software is released under the MIT License.
// https://opensource.org/licenses/MIT // https://opensource.org/licenses/MIT
#pragma once #pragma once
#include "scene/SceneItemComponent.hpp" #include "scene/SceneItemComponent.hpp"
#include "display/animation/Animation.hpp" #include "display/animation/Animation.hpp"
namespace Dawn { namespace Dawn {
class AnimationController : public SceneItemComponent { class AnimationController : public SceneItemComponent {
private: private:
std::vector<Animation*> animations; std::vector<Animation*> animations;
void onSceneUpdate();
public:
public: AnimationController(SceneItem *item);
AnimationController(SceneItem *item);
/**
void addAnimation(Animation *animation); * Add an animation to this controller.
*
void onStart() override; * @param animation Pointer to the animation to add.
void onDispose() override; */
}; void addAnimation(Animation *animation);
void onStart() override;
};
} }

View File

@ -77,59 +77,34 @@ glm::vec3 Camera::getRayDirectionFromScreenSpace(glm::vec2 screenSpace) {
} }
void Camera::onStart() { void Camera::onStart() {
// Render Target useEffectWithTeardown([&]{
useEffect([&]{
if(renderTarget.previous != nullptr) {
renderTarget.previous->eventRenderTargetResized.removeListener(
this, &Camera::onRenderTargetResize
);
}
this->projectionNeedsUpdating = true;
auto rt = this->getRenderTarget(); auto rt = this->getRenderTarget();
rt->eventRenderTargetResized.addListener( this->projectionNeedsUpdating = true;
this, &Camera::onRenderTargetResize this->eventRenderTargetResized.invoke(rt->getWidth(), rt->getHeight());
);
this->eventRenderTargetResized.invoke(
rt->getWidth(), rt->getHeight()
);
this->event2RenderTargetResized.invoke(rt->getWidth(), rt->getHeight()); this->event2RenderTargetResized.invoke(rt->getWidth(), rt->getHeight());
// Subscribe to new render target resized.
return evtResized = useEventLegacy([&](RenderTarget *rt, float_t w, float_t h){
this->projectionNeedsUpdating = true;
this->eventRenderTargetResized.invoke(w, h);
this->event2RenderTargetResized.invoke(w, h);
}, rt->eventRenderTargetResized);
}, renderTarget); }, renderTarget);
// All regular properties. // All regular properties.
useEffect([&]{ useEffect([&]{
this->projectionNeedsUpdating = true; this->projectionNeedsUpdating = true;
}, { }, {
&fov, &fov, &type,
&type, &orthoLeft, &orthoRight, &orthoBottom, &orthoTop,
&orthoLeft, &clipNear, &clipFar
&orthoRight,
&orthoBottom,
&orthoTop,
&clipNear,
&clipFar
}); });
// useEffect(fov, cbUpdateProj); // Sub to evt legacy, we don't invoke the useTeardown to avoid invoking
// useEffect(type, cbUpdateProj); // the state event for this camera when we don't need to.
// useEffect(orthoLeft, cbUpdateProj); evtResized = useEventLegacy([&](RenderTarget *rt, float_t w, float_t h){
// useEffect(orthoRight, cbUpdateProj); this->projectionNeedsUpdating = true;
// useEffect(orthoBottom, cbUpdateProj); this->eventRenderTargetResized.invoke(w, h);
// useEffect(orthoTop, cbUpdateProj); this->event2RenderTargetResized.invoke(w, h);
// useEffect(clipNear, cbUpdateProj); }, getRenderTarget()->eventRenderTargetResized);
// useEffect(clipFar, cbUpdateProj);
getRenderTarget()->eventRenderTargetResized.addListener(this, &Camera::onRenderTargetResize);
}
void Camera::onRenderTargetResize(RenderTarget *target, float_t w, float_t h) {
this->projectionNeedsUpdating = true;
this->eventRenderTargetResized.invoke(w, h);
this->event2RenderTargetResized.invoke(w, h);
}
void Camera::onDispose() {
this->getRenderTarget()->eventRenderTargetResized.removeListener(
this, &Camera::onRenderTargetResize
);
} }

View File

@ -19,8 +19,7 @@ namespace Dawn {
protected: protected:
bool_t projectionNeedsUpdating = true; bool_t projectionNeedsUpdating = true;
glm::mat4 projection; glm::mat4 projection;
std::function<void()> evtResized;
void onRenderTargetResize(RenderTarget *target, float_t w, float_t h);
public: public:
static Camera * create(Scene *scene) { static Camera * create(Scene *scene) {
@ -89,6 +88,5 @@ namespace Dawn {
* Event triggered by the scene item when the item is added to the scene. * Event triggered by the scene item when the item is added to the scene.
*/ */
void onStart() override; void onStart() override;
void onDispose() override;
}; };
} }

View File

@ -13,23 +13,6 @@ SimpleRenderTargetQuad::SimpleRenderTargetQuad(SceneItem *i) :
{ {
} }
void SimpleRenderTargetQuad::onRenderTargetResized(
RenderTarget *target, float_t w, float_t h
) {
assertTrue(target == this->renderTarget);
QuadMesh::bufferQuadMesh(
&this->meshHost->mesh,
glm::vec2(0, 0), glm::vec2(0, 0),
glm::vec2(
((RenderTarget*)this->renderTarget)->getWidth(),
((RenderTarget*)this->renderTarget)->getHeight()
),
glm::vec2(1, 1),
0, 0
);
}
std::vector<SceneItemComponent*> SimpleRenderTargetQuad::getDependencies() { std::vector<SceneItemComponent*> SimpleRenderTargetQuad::getDependencies() {
return std::vector<SceneItemComponent*>{ return std::vector<SceneItemComponent*>{
(this->meshHost = this->item->getComponent<MeshHost>()) (this->meshHost = this->item->getComponent<MeshHost>())
@ -42,14 +25,10 @@ void SimpleRenderTargetQuad::onStart() {
// Create quad mesh // Create quad mesh
this->meshHost->mesh.createBuffers(QUAD_VERTICE_COUNT, QUAD_INDICE_COUNT); this->meshHost->mesh.createBuffers(QUAD_VERTICE_COUNT, QUAD_INDICE_COUNT);
useEffect([&]{ // Create teardown effect and keep track.
if(this->renderTarget.previous != nullptr) { auto initial = useEffectWithTeardown([&]{
this->renderTarget.previous->eventRenderTargetResized.addListener( // No teardown needed.
this, &SimpleRenderTargetQuad::onRenderTargetResized if(this->renderTarget == nullptr) return evtResized = [&]{ };
);
}
if(this->renderTarget == nullptr) return;
// Update mesh // Update mesh
QuadMesh::bufferQuadMesh( QuadMesh::bufferQuadMesh(
@ -63,30 +42,20 @@ void SimpleRenderTargetQuad::onStart() {
0, 0 0, 0
); );
((RenderTarget*)this->renderTarget)->eventRenderTargetResized.addListener( // Subscribe to resize event.
this, &SimpleRenderTargetQuad::onRenderTargetResized evtResized = useEventLegacy([&](RenderTarget *target, float_t w, float_t h){
); QuadMesh::bufferQuadMesh(
&this->meshHost->mesh,
glm::vec2(0, 0), glm::vec2(0, 0),
glm::vec2(w, h), glm::vec2(1, 1),
0, 0
);
}, this->renderTarget->eventRenderTargetResized);
// Teardown
return evtResized;
}, this->renderTarget); }, this->renderTarget);
// Perform first resize. // Invoke immediate
if(this->renderTarget != nullptr) { initial();
QuadMesh::bufferQuadMesh(
&this->meshHost->mesh,
glm::vec2(0, 0), glm::vec2(0, 0),
glm::vec2(
((RenderTarget*)this->renderTarget)->getWidth(),
((RenderTarget*)this->renderTarget)->getHeight()
),
glm::vec2(1, 1),
0, 0
);
}
}
void SimpleRenderTargetQuad::onDispose() {
if(this->renderTarget != nullptr) {
((RenderTarget*)this->renderTarget)->eventRenderTargetResized.removeListener(
this, &SimpleRenderTargetQuad::onRenderTargetResized
);
}
} }

View File

@ -12,8 +12,7 @@ namespace Dawn {
class SimpleRenderTargetQuad : public SceneItemComponent { class SimpleRenderTargetQuad : public SceneItemComponent {
protected: protected:
MeshHost *meshHost = nullptr; MeshHost *meshHost = nullptr;
std::function<void()> evtResized;
void onRenderTargetResized(RenderTarget *target, float_t w, float_t h);
public: public:
StateProperty<RenderTarget*> renderTarget; StateProperty<RenderTarget*> renderTarget;
@ -29,6 +28,5 @@ namespace Dawn {
std::vector<SceneItemComponent*> getDependencies() override; std::vector<SceneItemComponent*> getDependencies() override;
void onStart() override; void onStart() override;
void onDispose() override;
}; };
} }

View File

@ -58,7 +58,7 @@ namespace Dawn {
* Creates a new state property and listens for its change. * Creates a new state property and listens for its change.
* @param initial The initial value of this state. * @param initial The initial value of this state.
*/ */
StateProperty(V initial) : _realValue(initial) {} StateProperty(V initial) : _realValue(initial), previous(initial) {}
const StateProperty& operator += (const V &value) { const StateProperty& operator += (const V &value) {
this->setInternal(this->_realValue + value); this->setInternal(this->_realValue + value);
@ -78,6 +78,10 @@ namespace Dawn {
return *this; return *this;
} }
const V operator->() const {
return this->_realValue;
}
operator V() const { operator V() const {
return this->_realValue; return this->_realValue;
} }