2017-01-22 00:33:53 +00:00
|
|
|
#ifndef EVENTS_H
|
|
|
|
#define EVENTS_H
|
|
|
|
|
|
|
|
#include "dobject.h"
|
|
|
|
|
2017-01-22 06:56:57 +00:00
|
|
|
class DStaticEventHandler;
|
2017-01-22 05:04:35 +00:00
|
|
|
|
|
|
|
// register
|
2017-01-22 06:56:57 +00:00
|
|
|
bool E_RegisterHandler(DStaticEventHandler* handler);
|
2017-01-22 05:04:35 +00:00
|
|
|
// unregister
|
2017-01-22 06:56:57 +00:00
|
|
|
bool E_UnregisterHandler(DStaticEventHandler* handler);
|
|
|
|
// find
|
|
|
|
bool E_CheckHandler(DStaticEventHandler* handler);
|
2017-01-22 05:04:35 +00:00
|
|
|
|
|
|
|
// called right after the map has loaded (approximately same time as OPEN ACS scripts)
|
|
|
|
void E_MapLoaded();
|
|
|
|
// called when the map is about to unload (approximately same time as UNLOADING ACS scripts)
|
|
|
|
void E_MapUnloading();
|
|
|
|
// called on each render frame once.
|
|
|
|
void E_RenderFrame();
|
|
|
|
// called before entering each actor's view (including RenderFrame)
|
|
|
|
void E_RenderCamera();
|
|
|
|
// called before adding each actor to the render list
|
|
|
|
void E_RenderBeforeThing(AActor* thing);
|
|
|
|
// called after adding each actor to the render list
|
|
|
|
void E_RenderAfterThing(AActor* thing);
|
|
|
|
|
2017-01-22 06:56:57 +00:00
|
|
|
class DStaticEventHandler : public DObject // make it a part of normal GC process
|
2017-01-22 00:33:53 +00:00
|
|
|
{
|
2017-01-22 06:56:57 +00:00
|
|
|
DECLARE_CLASS(DStaticEventHandler, DObject)
|
2017-01-22 00:33:53 +00:00
|
|
|
public:
|
2017-01-22 06:56:57 +00:00
|
|
|
DStaticEventHandler* prev;
|
|
|
|
DStaticEventHandler* next;
|
|
|
|
DStaticEventHandler* unregPrev;
|
|
|
|
DStaticEventHandler* unregNext;
|
|
|
|
virtual bool IsStatic() { return true; }
|
2017-01-22 00:33:53 +00:00
|
|
|
|
|
|
|
// destroy handler. this unlinks EventHandler from the list automatically.
|
|
|
|
void OnDestroy() override;
|
|
|
|
|
2017-01-22 06:56:57 +00:00
|
|
|
// this checks if we are /actually/ static, using DObject dynamic typing system.
|
|
|
|
static bool IsActuallyStatic(PClass* type);
|
|
|
|
|
2017-01-22 00:33:53 +00:00
|
|
|
// called right after the map has loaded (approximately same time as OPEN ACS scripts)
|
|
|
|
virtual void MapLoaded();
|
|
|
|
// called when the map is about to unload (approximately same time as UNLOADING ACS scripts)
|
|
|
|
virtual void MapUnloading();
|
|
|
|
// called on each render frame once.
|
|
|
|
virtual void RenderFrame();
|
|
|
|
// called before entering each actor's view (including RenderFrame)
|
|
|
|
virtual void RenderCamera();
|
2017-01-22 05:04:35 +00:00
|
|
|
// called before adding each actor to the render list
|
|
|
|
virtual void RenderBeforeThing(AActor* thing);
|
|
|
|
// called after adding each actor to the render list
|
|
|
|
virtual void RenderAfterThing(AActor* thing);
|
2017-01-22 00:33:53 +00:00
|
|
|
};
|
2017-01-22 06:56:57 +00:00
|
|
|
class DEventHandler : public DStaticEventHandler
|
|
|
|
{
|
|
|
|
DECLARE_CLASS(DEventHandler, DStaticEventHandler) // TODO: make sure this does not horribly break anything
|
|
|
|
public:
|
|
|
|
bool IsStatic() override { return false; }
|
|
|
|
};
|
|
|
|
extern DStaticEventHandler* E_FirstEventHandler;
|
2017-01-22 00:33:53 +00:00
|
|
|
|
2017-01-22 06:56:57 +00:00
|
|
|
class DStaticRenderEventHandler : public DStaticEventHandler
|
2017-01-22 00:33:53 +00:00
|
|
|
{
|
2017-01-22 06:56:57 +00:00
|
|
|
DECLARE_CLASS(DStaticRenderEventHandler, DStaticEventHandler)
|
2017-01-22 00:33:53 +00:00
|
|
|
public:
|
2017-01-22 05:04:35 +00:00
|
|
|
// these are for all render events
|
2017-01-22 00:33:53 +00:00
|
|
|
DVector3 ViewPos;
|
|
|
|
DAngle ViewAngle;
|
|
|
|
DAngle ViewPitch;
|
|
|
|
DAngle ViewRoll;
|
|
|
|
double FracTic; // 0..1 value that describes where we are inside the current gametic, render-wise.
|
2017-01-22 05:04:35 +00:00
|
|
|
// this makes sense in RenderCamera
|
|
|
|
AActor* Camera;
|
|
|
|
// this is for RenderBeforeThing and RenderAfterThing
|
|
|
|
AActor* CurrentThing;
|
2017-01-22 00:33:53 +00:00
|
|
|
|
|
|
|
void RenderFrame() override;
|
|
|
|
void RenderCamera() override;
|
2017-01-22 05:04:35 +00:00
|
|
|
void RenderBeforeThing(AActor* thing) override;
|
|
|
|
void RenderAfterThing(AActor* thing) override;
|
|
|
|
|
|
|
|
// this is a class that I use to automatically call RenderAfterThing.
|
|
|
|
// C++ is really horrible for not providing try-finally statement.
|
|
|
|
struct AutoThing
|
|
|
|
{
|
|
|
|
AActor* thing;
|
|
|
|
|
|
|
|
AutoThing(AActor* thing)
|
|
|
|
{
|
|
|
|
this->thing = thing;
|
|
|
|
E_RenderBeforeThing(this->thing);
|
|
|
|
}
|
|
|
|
|
|
|
|
~AutoThing()
|
|
|
|
{
|
|
|
|
E_RenderAfterThing(this->thing);
|
|
|
|
}
|
|
|
|
};
|
2017-01-22 00:33:53 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
void Setup();
|
|
|
|
};
|
2017-01-22 06:56:57 +00:00
|
|
|
class DRenderEventHandler : public DStaticRenderEventHandler
|
|
|
|
{
|
|
|
|
DECLARE_CLASS(DRenderEventHandler, DStaticRenderEventHandler) // TODO: make sure this does not horribly break anythings
|
|
|
|
public:
|
|
|
|
bool IsStatic() override { return false; }
|
|
|
|
};
|
2017-01-22 00:33:53 +00:00
|
|
|
|
|
|
|
#endif
|