Updated the display controllers to use state controls
This commit is contained in:
@ -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);
|
||||||
}
|
}
|
@ -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;
|
||||||
|
};
|
||||||
}
|
}
|
@ -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
|
|
||||||
);
|
|
||||||
}
|
}
|
@ -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;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -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
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -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;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user