RedCore
Loading...
Searching...
No Matches
RenderStepEvent.h
Go to the documentation of this file.
1#pragma once
2
3#include <layer/aglLayer.h>
4#include <layer/aglRenderStep.h>
5#include <layer/aglRenderInfo.h>
6#include <layer/aglRenderer.h>
7#include <red/event_sys/EventBase.h>
8#include <red/event_sys/EventDelegator.h>
9#include <telkin/Assembly.h>
10#include <concepts>
11
12namespace red {
13
15 public:
22
23 template <Stage S>
24 class Listener {
25 public:
26 Listener(ListenerFunc f, s32 priority = 0)
28 {
29 RenderStepEvent::subscribe<S>(mListener);
30 }
31
32 private:
33 EventDelegator<RenderStepEvent>::Listener mListener;
34 };
35
36 public:
37 [[nodiscard]]
38 agl::lyr::Layer& getLayer() const { return *mLayer; }
39
40 [[nodiscard]]
41 agl::lyr::RenderStep& getRenderStep() const { return *mRenderStep; }
42
43 [[nodiscard]]
44 agl::lyr::RenderInfo& getRenderInfo() const { return *mRenderInfo; }
45
46 [[nodiscard]]
47 bool isDisplayList() const { return mRenderAsDL; }
48
49 public:
50 // filter helpers
51
52 bool filterLayer(std::convertible_to<s32> auto... args) {
53 return ((agl::lyr::Renderer::instance()->getLayer(args) == &getLayer()) || ...);
54 }
55
56 bool filterRenderStep(std::convertible_to<s32> auto... args) {
57 return ((args == getRenderInfo().getRenderStep()) || ...);
58 }
59
60 private:
61 RenderStepEvent(agl::lyr::Layer* layer, bool renderAsDL, agl::lyr::RenderStep* renderStep, agl::lyr::RenderInfo* renderInfo)
62 : mLayer(layer)
63 , mRenderStep(renderStep)
64 , mRenderInfo(renderInfo)
65 , mRenderAsDL(renderAsDL)
66 { }
67
68 template <Stage S>
69 [[nodiscard]]
70 static Delegator& getDelegator();
71
72 private:
73 template <Stage S>
74 static void subscribe(EventDelegator<RenderStepEvent>::Listener& listener) {
75 getDelegator<S>().connect(listener);
76 }
77
78 // Pre/AfterPre: 0x02A39644, 0x02A395D0
79 // BeforePost/Post: 0x02A39668, 0x02A395F4
80 template <Stage S>
81 static void emit(agl::lyr::Layer* layer, bool renderAsDL, agl::lyr::RenderStep* renderStep, agl::lyr::RenderInfo* renderInfo) {
82 RenderStepEvent event(layer, renderAsDL, renderStep, renderInfo);
83 getDelegator<S>().fire(event);
84 }
85
86 public: //! TODO: Make private
87 static void hookPre(agl::lyr::Layer* layer, agl::lyr::RenderInfo* renderInfo);
88 static void hookPost(agl::lyr::Layer* layer, agl::lyr::RenderInfo* renderInfo);
89
90 private:
91 agl::lyr::Layer* mLayer;
92 agl::lyr::RenderStep* mRenderStep;
93 agl::lyr::RenderInfo* mRenderInfo;
94 bool mRenderAsDL;
95 };
96
97}
Definition RenderStepEvent.h:24
Listener(ListenerFunc f, s32 priority=0)
Definition RenderStepEvent.h:26
Definition RenderStepEvent.h:14
bool filterLayer(std::convertible_to< s32 > auto... args)
Definition RenderStepEvent.h:52
agl::lyr::RenderStep & getRenderStep() const
Definition RenderStepEvent.h:41
static void hookPost(agl::lyr::Layer *layer, agl::lyr::RenderInfo *renderInfo)
Stage
Definition RenderStepEvent.h:16
@ Post
Definition RenderStepEvent.h:20
@ BeforePost
Definition RenderStepEvent.h:19
@ AfterPre
Definition RenderStepEvent.h:18
@ Pre
Definition RenderStepEvent.h:17
bool filterRenderStep(std::convertible_to< s32 > auto... args)
Definition RenderStepEvent.h:56
static void hookPre(agl::lyr::Layer *layer, agl::lyr::RenderInfo *renderInfo)
TODO: Make private.
agl::lyr::RenderInfo & getRenderInfo() const
Definition RenderStepEvent.h:44
bool isDisplayList() const
Definition RenderStepEvent.h:47
agl::lyr::Layer & getLayer() const
Definition RenderStepEvent.h:38
Definition ActorDonutBlock.h:5