metaforce/Runtime/GuiSys/CGuiWidget.hpp

200 lines
6.8 KiB
C++
Raw Normal View History

2016-03-10 03:47:37 +00:00
#ifndef __URDE_CGUIWIDGET_HPP__
#define __URDE_CGUIWIDGET_HPP__
#include "IOStreams.hpp"
#include "CGuiObject.hpp"
2016-03-14 00:58:19 +00:00
#include "CGuiFunctionDef.hpp"
2016-03-11 22:50:15 +00:00
#include "zeus/CColor.hpp"
2016-03-10 03:47:37 +00:00
namespace urde
{
class CGuiAnimBase;
class CGuiFrame;
class CGuiMessage;
2016-03-14 00:58:19 +00:00
class CGuiAnimController;
class CGuiLogicalEventTrigger;
2016-03-15 23:23:45 +00:00
class CGuiTextSupport;
2016-03-10 03:47:37 +00:00
enum class EGuiAnimBehListID
{
2016-03-15 04:55:57 +00:00
NegOne = -1,
Zero = 0,
One = 1,
2016-03-15 23:23:45 +00:00
Two = 2,
EGuiAnimBehListIDMAX = 13
2016-03-10 03:47:37 +00:00
};
2016-03-11 05:32:18 +00:00
enum class ETraversalMode
{
2016-03-15 23:23:45 +00:00
ChildrenAndSiblings = 0,
Children = 1,
Single = 2
2016-03-11 05:32:18 +00:00
};
enum class EGuiAnimInitMode
{
2016-03-15 04:55:57 +00:00
One = 1,
Two = 2,
2016-03-15 23:23:45 +00:00
Three = 3,
2016-03-15 04:55:57 +00:00
Five = 5
2016-03-11 05:32:18 +00:00
};
enum class EGuiTextureClampModeHorz
{
2016-03-17 22:19:25 +00:00
NoClamp = 0,
Right = 1,
Left = 2,
Center = 3
};
enum class EGuiTextureClampModeVert
{
2016-03-17 22:19:25 +00:00
NoClamp = 0,
Top = 1,
Bottom = 2,
Center = 3
};
2016-03-10 03:47:37 +00:00
class CGuiWidget : public CGuiObject
{
2016-03-14 00:58:19 +00:00
friend class CGuiFrame;
2016-03-10 03:47:37 +00:00
public:
2016-03-11 22:50:15 +00:00
enum class EGuiModelDrawFlags
{
2016-03-17 22:19:25 +00:00
Shadeless = 0,
Opaque = 1,
Alpha = 2,
Additive = 3,
AlphaAdditiveOverdraw = 4
2016-03-11 22:50:15 +00:00
};
2016-03-10 03:47:37 +00:00
struct CGuiWidgetParms
{
2016-03-11 22:50:15 +00:00
CGuiFrame* x0_frame;
2016-03-16 03:37:51 +00:00
bool x4_useAnimController;
2016-03-11 22:50:15 +00:00
s16 x6_selfId;
s16 x8_parentId;
2016-03-15 23:23:45 +00:00
bool xa_defaultVisible;
2016-03-14 00:58:19 +00:00
bool xb_defaultActive;
2016-03-17 02:18:01 +00:00
bool xc_cullFaces;
2016-03-11 22:50:15 +00:00
bool xd_g;
bool xe_h;
zeus::CColor x10_color;
EGuiModelDrawFlags x14_drawFlags;
2016-03-16 03:37:51 +00:00
CGuiWidgetParms(CGuiFrame* frame, bool useAnimController, s16 selfId, s16 parentId,
2016-03-17 02:18:01 +00:00
bool defaultVisible, bool defaultActive, bool cullFaces,
const zeus::CColor& color, EGuiModelDrawFlags drawFlags,
bool g, bool h)
2016-03-16 03:37:51 +00:00
: x0_frame(frame), x4_useAnimController(useAnimController), x6_selfId(selfId),
x8_parentId(parentId), xa_defaultVisible(defaultVisible), xb_defaultActive(defaultActive),
2016-03-17 02:18:01 +00:00
xc_cullFaces(cullFaces), xd_g(g), xe_h(h), x10_color(color), x14_drawFlags(drawFlags) {}
2016-03-10 03:47:37 +00:00
};
2016-03-11 00:23:16 +00:00
static void LoadWidgetFnMap();
2016-03-16 03:37:51 +00:00
virtual FourCC GetWidgetTypeID() const {return FOURCC('BWIG');}
2016-03-15 23:23:45 +00:00
protected:
2016-03-14 00:58:19 +00:00
s16 x7c_selfId;
s16 x7e_parentId;
zeus::CTransform x80_transform;
std::unique_ptr<CGuiAnimController> xb0_animController;
zeus::CColor xb4_ = zeus::CColor::skWhite;
zeus::CColor xb8_ = zeus::CColor::skClear;
zeus::CColor xbc_color;
zeus::CColor xc0_color2;
EGuiModelDrawFlags xc4_drawFlags;
CGuiFrame* xc8_frame;
2016-03-15 23:23:45 +00:00
std::unordered_map<int, std::unique_ptr<std::vector<std::unique_ptr<CGuiLogicalEventTrigger>>>> xcc_triggerMap;
std::unordered_map<int, std::unique_ptr<std::vector<std::unique_ptr<CGuiFunctionDef>>>> xe0_functionMap;
2016-03-14 00:58:19 +00:00
s16 xf4_workerId = -1;
bool xf6_24_pg : 1;
2016-03-15 23:23:45 +00:00
bool xf6_25_isVisible : 1;
2016-03-14 00:58:19 +00:00
bool xf6_26_isActive : 1;
bool xf6_27_ : 1;
2016-03-15 23:23:45 +00:00
bool xf6_28_eventLock : 1;
2016-03-17 02:18:01 +00:00
bool xf6_29_cullFaces : 1;
2016-03-14 00:58:19 +00:00
bool xf6_30_ : 1;
2016-03-22 02:27:46 +00:00
bool xf6_31_depthTest : 1;
bool xf7_24_depthWrite : 1;
2016-03-14 00:58:19 +00:00
bool xf7_25_ : 1;
2016-03-10 03:47:37 +00:00
public:
2016-03-11 22:50:15 +00:00
CGuiWidget(const CGuiWidgetParms& parms);
static CGuiWidgetParms ReadWidgetHeader(CGuiFrame* frame, CInputStream& in, bool);
static CGuiWidget* Create(CGuiFrame* frame, CInputStream& in, bool);
2016-03-14 23:32:44 +00:00
virtual bool Message(const CGuiMessage& msg);
2016-03-10 03:47:37 +00:00
virtual void ParseBaseInfo(CGuiFrame* frame, CInputStream& in, const CGuiWidgetParms& parms);
virtual void ParseMessages(CInputStream& in, const CGuiWidgetParms& parms);
virtual void ParseAnimations(CInputStream& in, const CGuiWidgetParms& parms);
2016-04-14 21:42:47 +00:00
virtual std::vector<ResId> GetTextureAssets() const;
virtual std::vector<ResId> GetModelAssets() const;
virtual std::vector<ResId> GetFontAssets() const;
2016-03-10 03:47:37 +00:00
virtual void Initialize();
virtual void Touch() const;
2016-03-15 04:55:57 +00:00
virtual bool GetIsVisible() const;
2016-03-14 00:58:19 +00:00
virtual bool GetIsActive() const;
2016-03-15 23:23:45 +00:00
virtual CGuiTextSupport* TextSupport();
2016-03-22 02:27:46 +00:00
virtual const CGuiTextSupport* GetTextSupport() const;
2016-03-10 03:47:37 +00:00
virtual void ModifyRGBA(CGuiWidget* widget);
virtual void AddAnim(EGuiAnimBehListID, CGuiAnimBase*);
2016-03-15 23:23:45 +00:00
virtual void AddChildWidget(CGuiWidget* widget, bool makeWorldLocal, bool atEnd);
virtual CGuiWidget* RemoveChildWidget(CGuiWidget* widget, bool makeWorldLocal);
2016-03-14 00:58:19 +00:00
virtual bool AddWorkerWidget(CGuiWidget* worker);
2016-03-15 23:23:45 +00:00
virtual bool GetIsFinishedLoadingWidgetSpecific() const;
2016-03-10 03:47:37 +00:00
virtual void OnVisible();
virtual void OnInvisible();
virtual void OnActivate(bool);
virtual void OnDeActivate();
2016-03-14 00:58:19 +00:00
virtual bool DoRegisterEventHandler();
virtual bool DoUnregisterEventHandler();
2016-03-11 00:23:16 +00:00
2016-03-15 23:23:45 +00:00
s16 GetSelfId() const {return x7c_selfId;}
s16 GetParentId() const {return x7e_parentId;}
2016-03-16 03:37:51 +00:00
s16 GetWorkerId() const {return xf4_workerId;}
2016-03-15 23:23:45 +00:00
const zeus::CTransform& GetTransform() const {return x80_transform;}
std::vector<std::unique_ptr<CGuiLogicalEventTrigger>>* FindTriggerList(int id);
void AddTrigger(std::unique_ptr<CGuiLogicalEventTrigger>&& trigger);
std::vector<std::unique_ptr<CGuiFunctionDef>>* FindFunctionDefList(int id);
void AddFunctionDef(s32 id, std::unique_ptr<CGuiFunctionDef>&& def);
2016-04-29 10:08:46 +00:00
const zeus::CVector3f& GetIdlePosition() const {return x80_transform.origin;}
2016-03-15 23:23:45 +00:00
void SetIdlePosition(const zeus::CVector3f& pos, bool reapply);
2016-03-11 05:32:18 +00:00
void ReapplyXform();
void SetIsVisible(bool);
void SetIsActive(bool, bool);
2016-03-14 00:58:19 +00:00
void EnsureHasAnimController();
2016-03-11 05:32:18 +00:00
void BroadcastMessage(int, CGuiControllerInfo* info);
void LockEvents(bool);
void UnregisterEventHandler();
void UnregisterEventHandler(ETraversalMode);
void RegisterEventHandler();
void RegisterEventHandler(ETraversalMode);
void ResetAllAnimUpdateState();
void SetVisibility(bool, ETraversalMode);
void SetAnimUpdateState(EGuiAnimBehListID, bool);
void SetAnimUpdateState(EGuiAnimBehListID, bool, ETraversalMode);
void GetBranchAnimLen(EGuiAnimBehListID, float&);
void GetBranchAnimLen(EGuiAnimBehListID, float&, ETraversalMode);
void IsAllAnimsDone(EGuiAnimBehListID, bool&);
void IsAllAnimsDone(EGuiAnimBehListID, bool&, ETraversalMode);
void InitializeAnimControllers(EGuiAnimBehListID, float, bool, EGuiAnimInitMode);
void InitializeAnimControllers(EGuiAnimBehListID, float, bool, EGuiAnimInitMode, ETraversalMode);
void RecalcWidgetColor(ETraversalMode);
void SetColor(const zeus::CColor& color);
void RecalculateAllRGBA();
void InitializeRGBAFactor();
CGuiWidget* FindWidget(s16 id);
2016-03-11 05:32:18 +00:00
bool GetIsFinishedLoading() const;
void InitializeRecursive();
2016-03-11 00:23:16 +00:00
bool MAF_StartAnimationSet(CGuiFunctionDef* def, CGuiControllerInfo* info);
bool MAF_SendMessage(CGuiFunctionDef* def, CGuiControllerInfo* info);
bool MAF_PauseAnim(CGuiFunctionDef* def, CGuiControllerInfo* info);
bool MAF_ResumeAnim(CGuiFunctionDef* def, CGuiControllerInfo* info);
bool MAF_SetState(CGuiFunctionDef* def, CGuiControllerInfo* info);
bool MAF_SetStateOfWidget(CGuiFunctionDef* def, CGuiControllerInfo* info);
2016-03-10 03:47:37 +00:00
};
}
#endif // __URDE_CGUIWIDGET_HPP__