mirror of https://github.com/AxioDL/metaforce.git
Various CStateManager additions and camera stubs
This commit is contained in:
parent
e51a657ec1
commit
042030934b
|
@ -7,6 +7,7 @@
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
class CStateManager;
|
class CStateManager;
|
||||||
|
class IVisitor;
|
||||||
|
|
||||||
struct SConnection
|
struct SConnection
|
||||||
{
|
{
|
||||||
|
@ -34,12 +35,14 @@ protected:
|
||||||
public:
|
public:
|
||||||
virtual ~CEntity() {}
|
virtual ~CEntity() {}
|
||||||
CEntity(TUniqueId uid, const CEntityInfo& info, bool active);
|
CEntity(TUniqueId uid, const CEntityInfo& info, bool active);
|
||||||
|
virtual void Accept(IVisitor&)=0;
|
||||||
virtual void PreThink(float, CStateManager&) {}
|
virtual void PreThink(float, CStateManager&) {}
|
||||||
virtual void Think(float, CStateManager&) {}
|
virtual void Think(float, CStateManager&) {}
|
||||||
virtual void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr);
|
virtual void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr);
|
||||||
virtual bool GetActive() const {return m_active;}
|
virtual bool GetActive() const {return m_active;}
|
||||||
virtual void SetActive(bool active) {m_active = active;}
|
virtual void SetActive(bool active) {m_active = active;}
|
||||||
|
|
||||||
|
TUniqueId GetUniqueId() const {return m_uid;}
|
||||||
void SendScriptMsgs(EScriptObjectState state, CStateManager& stateMgr, EScriptObjectMessage msg);
|
void SendScriptMsgs(EScriptObjectState state, CStateManager& stateMgr, EScriptObjectMessage msg);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ namespace urde
|
||||||
class CGameState
|
class CGameState
|
||||||
{
|
{
|
||||||
int m_stateFlag = -1;
|
int m_stateFlag = -1;
|
||||||
TOneStatic<CPlayerState> m_playerState;
|
CPlayerState m_playerState;
|
||||||
CWorldTransManager m_transManager;
|
CWorldTransManager m_transManager;
|
||||||
float m_gameTime = 0.0;
|
float m_gameTime = 0.0;
|
||||||
CGameOptions m_gameOpts;
|
CGameOptions m_gameOpts;
|
||||||
|
|
|
@ -4,6 +4,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${BOO_INCLUDE_DIR}
|
||||||
add_subdirectory(Audio)
|
add_subdirectory(Audio)
|
||||||
add_subdirectory(Character)
|
add_subdirectory(Character)
|
||||||
add_subdirectory(Graphics)
|
add_subdirectory(Graphics)
|
||||||
|
add_subdirectory(Camera)
|
||||||
add_subdirectory(GuiSys)
|
add_subdirectory(GuiSys)
|
||||||
add_subdirectory(Input)
|
add_subdirectory(Input)
|
||||||
add_subdirectory(Particle)
|
add_subdirectory(Particle)
|
||||||
|
@ -48,7 +49,9 @@ add_library(RuntimeCommon
|
||||||
IFactory.hpp
|
IFactory.hpp
|
||||||
IObjFactory.hpp
|
IObjFactory.hpp
|
||||||
ScriptObjectSupport.hpp ScriptObjectSupport.cpp
|
ScriptObjectSupport.hpp ScriptObjectSupport.cpp
|
||||||
CObjectList.hpp
|
CObjectList.hpp CObjectList.cpp
|
||||||
|
GameObjectLists.hpp GameObjectLists.cpp
|
||||||
|
CSortedLists.hpp CSortedLists.cpp
|
||||||
CArchitectureMessage.hpp
|
CArchitectureMessage.hpp
|
||||||
CArchitectureQueue.hpp CArchitectureQueue.cpp
|
CArchitectureQueue.hpp CArchitectureQueue.cpp
|
||||||
IObj.hpp
|
IObj.hpp
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
#include "CObjectList.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
CObjectList::CObjectList(EGameObjectList listEnum)
|
||||||
|
: m_listEnum(listEnum)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void CObjectList::AddObject(CEntity& entity)
|
||||||
|
{
|
||||||
|
if (IsQualified())
|
||||||
|
{
|
||||||
|
if (m_lastId != -1)
|
||||||
|
m_list[m_lastId].next = entity.GetUniqueId() & 0x3ff;
|
||||||
|
TUniqueId prevLast = m_lastId;
|
||||||
|
m_lastId = entity.GetUniqueId() & 0x3ff;
|
||||||
|
SObjectListEntry& newEnt = m_list[m_lastId];
|
||||||
|
newEnt.entity = &entity;
|
||||||
|
newEnt.prev = prevLast;
|
||||||
|
newEnt.next = -1;
|
||||||
|
++m_count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CObjectList::RemoveObject(TUniqueId uid)
|
||||||
|
{
|
||||||
|
uid = uid & 0x3ff;
|
||||||
|
SObjectListEntry& ent = m_list[uid];
|
||||||
|
if (!ent.entity || ent.entity->GetUniqueId() != uid)
|
||||||
|
return;
|
||||||
|
if (uid == m_lastId)
|
||||||
|
{
|
||||||
|
m_lastId = ent.prev;
|
||||||
|
if (ent.prev != -1)
|
||||||
|
m_list[ent.prev].next = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ent.prev != -1)
|
||||||
|
m_list[ent.prev].next = -1;
|
||||||
|
m_list[ent.next].prev = -1;
|
||||||
|
}
|
||||||
|
ent.entity = nullptr;
|
||||||
|
ent.prev = -1;
|
||||||
|
ent.next = -1;
|
||||||
|
--m_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CEntity* CObjectList::GetObjectById(TUniqueId uid) const
|
||||||
|
{
|
||||||
|
if (!uid)
|
||||||
|
return nullptr;
|
||||||
|
return m_list[uid & 0x3ff].entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
CEntity* CObjectList::GetObjectById(TUniqueId uid)
|
||||||
|
{
|
||||||
|
if (!uid)
|
||||||
|
return nullptr;
|
||||||
|
return m_list[uid & 0x3ff].entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CObjectList::IsQualified() {return true;}
|
||||||
|
|
||||||
|
}
|
|
@ -32,65 +32,13 @@ class CObjectList
|
||||||
TUniqueId m_lastId = -1;
|
TUniqueId m_lastId = -1;
|
||||||
u16 m_count = 0;
|
u16 m_count = 0;
|
||||||
public:
|
public:
|
||||||
CObjectList(EGameObjectList listEnum)
|
CObjectList(EGameObjectList listEnum);
|
||||||
: m_listEnum(listEnum)
|
|
||||||
{}
|
|
||||||
|
|
||||||
void AddObject(CEntity& entity)
|
void AddObject(CEntity& entity);
|
||||||
{
|
void RemoveObject(TUniqueId uid);
|
||||||
if (IsQualified())
|
const CEntity* GetObjectById(TUniqueId uid) const;
|
||||||
{
|
CEntity* GetObjectById(TUniqueId uid);
|
||||||
if (m_lastId != -1)
|
virtual bool IsQualified();
|
||||||
m_list[m_lastId].next = entity.m_uid & 0x3ff;
|
|
||||||
TUniqueId prevLast = m_lastId;
|
|
||||||
m_lastId = entity.m_uid & 0x3ff;
|
|
||||||
SObjectListEntry& newEnt = m_list[m_lastId];
|
|
||||||
newEnt.entity = &entity;
|
|
||||||
newEnt.prev = prevLast;
|
|
||||||
newEnt.next = -1;
|
|
||||||
++m_count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RemoveObject(TUniqueId uid)
|
|
||||||
{
|
|
||||||
uid = uid & 0x3ff;
|
|
||||||
SObjectListEntry& ent = m_list[uid];
|
|
||||||
if (!ent.entity || ent.entity->m_uid != uid)
|
|
||||||
return;
|
|
||||||
if (uid == m_lastId)
|
|
||||||
{
|
|
||||||
m_lastId = ent.prev;
|
|
||||||
if (ent.prev != -1)
|
|
||||||
m_list[ent.prev].next = -1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (ent.prev != -1)
|
|
||||||
m_list[ent.prev].next = -1;
|
|
||||||
m_list[ent.next].prev = -1;
|
|
||||||
}
|
|
||||||
ent.entity = nullptr;
|
|
||||||
ent.prev = -1;
|
|
||||||
ent.next = -1;
|
|
||||||
--m_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
const CEntity* GetObjectById(TUniqueId uid) const
|
|
||||||
{
|
|
||||||
if (!uid)
|
|
||||||
return nullptr;
|
|
||||||
return m_list[uid & 0x3ff].entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
CEntity* GetObjectById(TUniqueId uid)
|
|
||||||
{
|
|
||||||
if (!uid)
|
|
||||||
return nullptr;
|
|
||||||
return m_list[uid & 0x3ff].entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool IsQualified() {return true;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
#include "CSortedLists.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
CSortedListManager::CSortedListManager()
|
||||||
|
{
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSortedListManager::Reset()
|
||||||
|
{
|
||||||
|
std::fill(std::begin(x0_nodes), std::end(x0_nodes), SNode());
|
||||||
|
for (int i=0 ; i<6 ; ++i)
|
||||||
|
xb000_sortedLists[i].Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
#ifndef __URDE_CSORTEDLISTS_HPP__
|
||||||
|
#define __URDE_CSORTEDLISTS_HPP__
|
||||||
|
|
||||||
|
#include "RetroTypes.hpp"
|
||||||
|
#include "zeus/CAABox.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
struct SSortedList
|
||||||
|
{
|
||||||
|
TUniqueId x0_ids[1024];
|
||||||
|
void Reset() {std::fill(std::begin(x0_ids), std::end(x0_ids), -1);}
|
||||||
|
SSortedList() {Reset();}
|
||||||
|
};
|
||||||
|
|
||||||
|
class CSortedListManager
|
||||||
|
{
|
||||||
|
struct SNode
|
||||||
|
{
|
||||||
|
u32 x0_ = 0;
|
||||||
|
zeus::CAABox x4_box = zeus::CAABox::skNullBox;
|
||||||
|
u32 x1c_;
|
||||||
|
u32 x20_;
|
||||||
|
u32 x24_;
|
||||||
|
u32 x28_ = -1;
|
||||||
|
bool x2a_ = false;
|
||||||
|
};
|
||||||
|
SNode x0_nodes[1024];
|
||||||
|
SSortedList xb000_sortedLists[6];
|
||||||
|
public:
|
||||||
|
CSortedListManager();
|
||||||
|
void Reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __URDE_CSORTEDLISTS_HPP__
|
|
@ -3,6 +3,13 @@
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
|
||||||
|
CStateManager::CStateManager(const std::weak_ptr<CScriptMailbox>&,
|
||||||
|
const std::weak_ptr<CMapWorldInfo>&,
|
||||||
|
const std::weak_ptr<CPlayerState>&,
|
||||||
|
const std::weak_ptr<CWorldTransManager>&)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void CStateManager::SendScriptMsg(TUniqueId uid, TEditorId eid, EScriptObjectMessage msg, EScriptObjectState state)
|
void CStateManager::SendScriptMsg(TUniqueId uid, TEditorId eid, EScriptObjectMessage msg, EScriptObjectState state)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include "CBasics.hpp"
|
#include "CBasics.hpp"
|
||||||
#include "ScriptObjectSupport.hpp"
|
#include "ScriptObjectSupport.hpp"
|
||||||
|
#include "GameObjectLists.hpp"
|
||||||
|
#include "Camera/CCameraManager.hpp"
|
||||||
|
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
@ -11,10 +13,27 @@ class CScriptMailbox;
|
||||||
class CMapWorldInfo;
|
class CMapWorldInfo;
|
||||||
class CPlayerState;
|
class CPlayerState;
|
||||||
class CWorldTransManager;
|
class CWorldTransManager;
|
||||||
|
class CObjectList;
|
||||||
|
|
||||||
class CStateManager
|
class CStateManager
|
||||||
{
|
{
|
||||||
|
TUniqueId x8_idArr[1024] = {};
|
||||||
|
std::unique_ptr<CObjectList> x80c_allObjs;
|
||||||
|
std::unique_ptr<CActorList> x814_allObjs;
|
||||||
|
std::unique_ptr<CPhysicsActorList> x81c_allObjs;
|
||||||
|
std::unique_ptr<CGameCameraList> x824_allObjs;
|
||||||
|
std::unique_ptr<CGameLightList> x82c_allObjs;
|
||||||
|
std::unique_ptr<CListeningAiList> x834_allObjs;
|
||||||
|
std::unique_ptr<CAiWaypointList> x83c_allObjs;
|
||||||
|
std::unique_ptr<CPlatformAndDoorList> x844_allObjs;
|
||||||
|
std::list<u32> x858_;
|
||||||
|
|
||||||
|
// x86c_stateManagerContainer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::shared_ptr<CPlayerState> x8b8_playerState;
|
std::shared_ptr<CPlayerState> x8b8_playerState;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CStateManager(const std::weak_ptr<CScriptMailbox>&,
|
CStateManager(const std::weak_ptr<CScriptMailbox>&,
|
||||||
const std::weak_ptr<CMapWorldInfo>&,
|
const std::weak_ptr<CMapWorldInfo>&,
|
||||||
|
@ -31,6 +50,7 @@ public:
|
||||||
|
|
||||||
}
|
}
|
||||||
void SendScriptMsg(TUniqueId uid, TEditorId eid, EScriptObjectMessage msg, EScriptObjectState state);
|
void SendScriptMsg(TUniqueId uid, TEditorId eid, EScriptObjectMessage msg, EScriptObjectState state);
|
||||||
|
TUniqueId AllocateUniqueId();
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef __URDE_CBALLCAMERA_HPP__
|
||||||
|
#define __URDE_CBALLCAMERA_HPP__
|
||||||
|
|
||||||
|
#include "CGameCamera.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
class CBallCamera : public CGameCamera
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CBallCamera(TUniqueId, TUniqueId, const zeus::CTransform& xf, float, float, float, float);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __URDE_CBALLCAMERA_HPP__
|
|
@ -0,0 +1,10 @@
|
||||||
|
#include "CCameraManager.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
CCameraManager::CCameraManager(TUniqueId id)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
#ifndef __URDE_CCAMERAMANAGER_HPP__
|
||||||
|
#define __URDE_CCAMERAMANAGER_HPP__
|
||||||
|
|
||||||
|
#include "RetroTypes.hpp"
|
||||||
|
#include "zeus/CVector3f.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
class CFirstPersonCamera;
|
||||||
|
class CBallCamera;
|
||||||
|
class CStateManager;
|
||||||
|
|
||||||
|
class CCameraManager
|
||||||
|
{
|
||||||
|
TUniqueId x0_id;
|
||||||
|
std::vector<TUniqueId> x4_cineCameras;
|
||||||
|
CFirstPersonCamera* x7c_fpCamera;
|
||||||
|
CBallCamera* x80_ballCamera;
|
||||||
|
public:
|
||||||
|
CCameraManager(TUniqueId id);
|
||||||
|
|
||||||
|
void SetSpecialCameras(CFirstPersonCamera& fp, CBallCamera& ball)
|
||||||
|
{
|
||||||
|
x7c_fpCamera = &fp;
|
||||||
|
x80_ballCamera = &ball;
|
||||||
|
}
|
||||||
|
bool IsInCinematicCamera() const {return x4_cineCameras.size() != 0;}
|
||||||
|
zeus::CVector3f GetGlobalCameraTranslation(const CStateManager& stateMgr) const;
|
||||||
|
zeus::CTransform GetGlobalCameraTransform(const CStateManager& stateMgr) const;
|
||||||
|
void RemoveCameraShaker(int);
|
||||||
|
void AddCinemaCamera(TUniqueId, CStateManager& stateMgr);
|
||||||
|
void SetInsideFluid(bool, TUniqueId);
|
||||||
|
void Update(float dt, CStateManager& stateMgr);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __URDE_CCAMERAMANAGER_HPP__
|
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef __URDE_CCINEMATICCAMERA_HPP__
|
||||||
|
#define __URDE_CCINEMATICCAMERA_HPP__
|
||||||
|
|
||||||
|
#include "CGameCamera.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
class CCinematicCamera : public CGameCamera
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CCinematicCamera(TUniqueId, const std::string& name, const CEntityInfo& info,
|
||||||
|
const zeus::CTransform& xf, bool, float, float, float, float, float, u32);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __URDE_CCINEMATICCAMERA_HPP__
|
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef __URDE_CFIRSTPERSONCAMERA_HPP__
|
||||||
|
#define __URDE_CFIRSTPERSONCAMERA_HPP__
|
||||||
|
|
||||||
|
#include "CGameCamera.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
class CFirstPersonCamera : public CGameCamera
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CFirstPersonCamera(TUniqueId, const zeus::CTransform& xf, TUniqueId, float, float, float, float, float);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __URDE_CFIRSTPERSONCAMERA_HPP__
|
|
@ -0,0 +1,16 @@
|
||||||
|
#ifndef __URDE_CGAMECAMERA_HPP__
|
||||||
|
#define __URDE_CGAMECAMERA_HPP__
|
||||||
|
|
||||||
|
#include "CActor.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
class CGameCamera : public CActor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __URDE_CGAMECAMERA_HPP__
|
|
@ -0,0 +1,7 @@
|
||||||
|
add_library(RuntimeCommonCamera
|
||||||
|
CCameraManager.hpp CCameraManager.cpp
|
||||||
|
CGameCamera.hpp CGameCamera.cpp
|
||||||
|
CFirstPersonCamera.hpp CFirstPersonCamera.cpp
|
||||||
|
CBallCamera.hpp CBallCamera.cpp
|
||||||
|
CPathCamera.hpp CPathCamera.cpp
|
||||||
|
CCinematicCamera.hpp CCinematicCamera.cpp)
|
|
@ -0,0 +1,23 @@
|
||||||
|
#ifndef __URDE_CPATHCAMERA_HPP__
|
||||||
|
#define __URDE_CPATHCAMERA_HPP__
|
||||||
|
|
||||||
|
#include "CGameCamera.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
class CPathCamera : public CGameCamera
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum class EInitialSplinePosition
|
||||||
|
{
|
||||||
|
};
|
||||||
|
CPathCamera(TUniqueId, const std::string& name, const CEntityInfo& info,
|
||||||
|
const zeus::CTransform& xf, bool, bool, bool, bool, bool,
|
||||||
|
float, float, float, float, float, float, float, u32,
|
||||||
|
EInitialSplinePosition);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __URDE_CPATHCAMERA_HPP__
|
|
@ -1,33 +1,114 @@
|
||||||
#include "CAdditiveAnimPlayback.hpp"
|
#include "CAdditiveAnimPlayback.hpp"
|
||||||
#include "CSegStatementSet.hpp"
|
#include "CSegStatementSet.hpp"
|
||||||
|
#include "CCharLayoutInfo.hpp"
|
||||||
|
#include "CAnimTreeNode.hpp"
|
||||||
|
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
|
||||||
CAdditiveAnimPlayback::CAdditiveAnimPlayback(const std::weak_ptr<CAnimTreeNode>& anim, float weight, bool a,
|
CAdditiveAnimPlayback::CAdditiveAnimPlayback(const std::weak_ptr<CAnimTreeNode>& anim,
|
||||||
const CAdditiveAnimationInfo& info, bool b)
|
float weight, bool a, const CAdditiveAnimationInfo& info, bool b)
|
||||||
: x0_info(info), x8_anim(anim), xc_weight(weight), x14_a(a)
|
: x0_info(info), x8_anim(anim.lock()), xc_targetWeight(weight), x14_a(a)
|
||||||
{
|
{
|
||||||
if (!a && b)
|
if (!a && b)
|
||||||
x20_ = true;
|
x20_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAdditiveAnimPlayback::AddToSegStatementSet(const CSegIdList& list,
|
void CAdditiveAnimPlayback::AddToSegStatementSet(const CSegIdList& list,
|
||||||
const CCharLayoutInfo&,
|
const CCharLayoutInfo& layout,
|
||||||
CSegStatementSet&) const
|
CSegStatementSet& setOut) const
|
||||||
{
|
{
|
||||||
|
CSegStatementSet stackSet;
|
||||||
|
x8_anim->VGetSegStatementSet(list, stackSet);
|
||||||
|
for (const CSegId& id : list.GetList())
|
||||||
|
{
|
||||||
|
CAnimPerSegmentData& data = stackSet.x4_segData[id];
|
||||||
|
data.x10_offset = layout.GetFromParentUnrotated(id);
|
||||||
|
data.x1c_hasOffset = true;
|
||||||
|
}
|
||||||
|
setOut.Add(list, layout, stackSet, x10_curWeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAdditiveAnimPlayback::Update(float dt)
|
void CAdditiveAnimPlayback::Update(float dt)
|
||||||
{
|
{
|
||||||
|
switch (x1c_phase)
|
||||||
|
{
|
||||||
|
case EAdditivePlaybackPhase::FadingIn:
|
||||||
|
{
|
||||||
|
float a = x0_info.GetFadeInDuration();
|
||||||
|
float b = x18_weightTimer + dt;
|
||||||
|
x18_weightTimer = std::min(b, a);
|
||||||
|
if (a > 0.f)
|
||||||
|
x10_curWeight = x18_weightTimer / a * xc_targetWeight;
|
||||||
|
else
|
||||||
|
x10_curWeight = xc_targetWeight;
|
||||||
|
|
||||||
|
if (std::fabs(x10_curWeight - xc_targetWeight) < 0.00001f)
|
||||||
|
x1c_phase = EAdditivePlaybackPhase::FadedIn;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EAdditivePlaybackPhase::FadingOut:
|
||||||
|
{
|
||||||
|
float a = x18_weightTimer - dt;
|
||||||
|
x18_weightTimer = std::max(a, 0.f);
|
||||||
|
if (x0_info.GetFadeOutDuration() > 0.f)
|
||||||
|
x10_curWeight = x18_weightTimer / x0_info.GetFadeOutDuration() * xc_targetWeight;
|
||||||
|
else
|
||||||
|
x10_curWeight = 0.f;
|
||||||
|
|
||||||
|
if (std::fabs(x10_curWeight) < 0.00001f)
|
||||||
|
x1c_phase = EAdditivePlaybackPhase::FadedOut;
|
||||||
|
}
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAdditiveAnimPlayback::FadeOut()
|
void CAdditiveAnimPlayback::FadeOut()
|
||||||
{
|
{
|
||||||
|
switch (x1c_phase)
|
||||||
|
{
|
||||||
|
case EAdditivePlaybackPhase::FadedOut:
|
||||||
|
case EAdditivePlaybackPhase::FadedIn:
|
||||||
|
x18_weightTimer = x0_info.GetFadeOutDuration();
|
||||||
|
break;
|
||||||
|
case EAdditivePlaybackPhase::FadingIn:
|
||||||
|
x18_weightTimer = x18_weightTimer / x0_info.GetFadeInDuration() * x0_info.GetFadeOutDuration();
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x0_info.GetFadeOutDuration() > 0.f)
|
||||||
|
x1c_phase = EAdditivePlaybackPhase::FadingOut;
|
||||||
|
else
|
||||||
|
x1c_phase = EAdditivePlaybackPhase::FadedOut;
|
||||||
|
x10_curWeight = 0.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAdditiveAnimPlayback::SetWeight(float w)
|
void CAdditiveAnimPlayback::SetWeight(float w)
|
||||||
{
|
{
|
||||||
|
xc_targetWeight = w;
|
||||||
|
switch (x1c_phase)
|
||||||
|
{
|
||||||
|
case EAdditivePlaybackPhase::FadingIn:
|
||||||
|
{
|
||||||
|
if (x0_info.GetFadeInDuration() > 0.f)
|
||||||
|
x10_curWeight = x18_weightTimer / x0_info.GetFadeInDuration() * xc_targetWeight;
|
||||||
|
else
|
||||||
|
x10_curWeight = xc_targetWeight;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case EAdditivePlaybackPhase::FadingOut:
|
||||||
|
{
|
||||||
|
if (x0_info.GetFadeOutDuration() > 0.f)
|
||||||
|
x10_curWeight = x18_weightTimer / x0_info.GetFadeOutDuration() * xc_targetWeight;
|
||||||
|
else
|
||||||
|
x10_curWeight = xc_targetWeight;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
x10_curWeight = xc_targetWeight;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,37 +13,39 @@ class CSegStatementSet;
|
||||||
|
|
||||||
class CAdditiveAnimationInfo
|
class CAdditiveAnimationInfo
|
||||||
{
|
{
|
||||||
float x0_a = 0.f;
|
float x0_fadeInDur = 0.f;
|
||||||
float x4_b = 0.f;
|
float x4_fadeOutDur = 0.f;
|
||||||
public:
|
public:
|
||||||
void read(CInputStream& in)
|
void read(CInputStream& in)
|
||||||
{
|
{
|
||||||
x0_a = in.readFloatBig();
|
x0_fadeInDur = in.readFloatBig();
|
||||||
x4_b = in.readFloatBig();
|
x4_fadeOutDur = in.readFloatBig();
|
||||||
}
|
}
|
||||||
CAdditiveAnimationInfo() = default;
|
CAdditiveAnimationInfo() = default;
|
||||||
CAdditiveAnimationInfo(CInputStream& in) {read(in);}
|
CAdditiveAnimationInfo(CInputStream& in) {read(in);}
|
||||||
|
float GetFadeInDuration() const {return x0_fadeInDur;}
|
||||||
|
float GetFadeOutDuration() const {return x4_fadeOutDur;}
|
||||||
};
|
};
|
||||||
|
|
||||||
class CAdditiveAnimPlayback
|
class CAdditiveAnimPlayback
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum class EAdditivePlaybackState
|
enum class EAdditivePlaybackPhase
|
||||||
{
|
{
|
||||||
Zero,
|
None,
|
||||||
One,
|
FadingIn,
|
||||||
Two,
|
FadingOut,
|
||||||
Three,
|
FadedIn,
|
||||||
Four
|
FadedOut
|
||||||
};
|
};
|
||||||
private:
|
private:
|
||||||
CAdditiveAnimationInfo x0_info;
|
CAdditiveAnimationInfo x0_info;
|
||||||
std::weak_ptr<CAnimTreeNode> x8_anim;
|
std::shared_ptr<CAnimTreeNode> x8_anim;
|
||||||
float xc_weight;
|
float xc_targetWeight;
|
||||||
float x10_ = 0.f;
|
float x10_curWeight = 0.f;
|
||||||
bool x14_a;
|
bool x14_a;
|
||||||
float x18_ = 0.f;
|
float x18_weightTimer = 0.f;
|
||||||
EAdditivePlaybackState x1c_ = EAdditivePlaybackState::One;
|
EAdditivePlaybackPhase x1c_phase = EAdditivePlaybackPhase::FadingIn;
|
||||||
bool x20_ = false;
|
bool x20_ = false;
|
||||||
public:
|
public:
|
||||||
CAdditiveAnimPlayback(const std::weak_ptr<CAnimTreeNode>& anim, float weight, bool a,
|
CAdditiveAnimPlayback(const std::weak_ptr<CAnimTreeNode>& anim, float weight, bool a,
|
||||||
|
@ -53,6 +55,9 @@ public:
|
||||||
void Update(float dt);
|
void Update(float dt);
|
||||||
void FadeOut();
|
void FadeOut();
|
||||||
void SetWeight(float w);
|
void SetWeight(float w);
|
||||||
|
float GetTargetWeight() const {return xc_targetWeight;}
|
||||||
|
bool GetA() const {return x14_a;}
|
||||||
|
const std::shared_ptr<CAnimTreeNode>& GetAnim() const {return x8_anim;}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,10 +6,20 @@
|
||||||
#include "CAnimationManager.hpp"
|
#include "CAnimationManager.hpp"
|
||||||
#include "CTransitionManager.hpp"
|
#include "CTransitionManager.hpp"
|
||||||
#include "CAdditiveAnimPlayback.hpp"
|
#include "CAdditiveAnimPlayback.hpp"
|
||||||
|
#include "CBoolPOINode.hpp"
|
||||||
|
#include "CInt32POINode.hpp"
|
||||||
|
#include "CParticlePOINode.hpp"
|
||||||
|
#include "CSoundPOINode.hpp"
|
||||||
|
#include "CParticleGenInfo.hpp"
|
||||||
#include "IAnimReader.hpp"
|
#include "IAnimReader.hpp"
|
||||||
|
#include "CAnimTreeNode.hpp"
|
||||||
|
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
rstl::reserved_vector<CBoolPOINode, 8>CAnimData::g_BoolPOINodes;
|
||||||
|
rstl::reserved_vector<CInt32POINode, 16> CAnimData::g_Int32POINodes;
|
||||||
|
rstl::reserved_vector<CParticlePOINode, 20> CAnimData::g_ParticlePOINodes;
|
||||||
|
rstl::reserved_vector<CSoundPOINode, 20> CAnimData::g_SoundPOINodes;
|
||||||
|
|
||||||
void CAnimData::FreeCache()
|
void CAnimData::FreeCache()
|
||||||
{
|
{
|
||||||
|
@ -45,6 +55,14 @@ CAnimData::CAnimData(ResId id,
|
||||||
{
|
{
|
||||||
if (iceModel)
|
if (iceModel)
|
||||||
xe4_iceModelData = *iceModel;
|
xe4_iceModelData = *iceModel;
|
||||||
|
|
||||||
|
g_BoolPOINodes.resize(8);
|
||||||
|
g_Int32POINodes.resize(16);
|
||||||
|
g_ParticlePOINodes.resize(20);
|
||||||
|
g_SoundPOINodes.resize(20);
|
||||||
|
|
||||||
|
x108_aabb = xd8_modelData->GetModel()->GetAABB();
|
||||||
|
x120_particleDB.CacheParticleDesc(xc_charInfo.GetParticleResData());
|
||||||
}
|
}
|
||||||
|
|
||||||
ResId CAnimData::GetEventResourceIdForAnimResourceId(ResId id) const
|
ResId CAnimData::GetEventResourceIdForAnimResourceId(ResId id) const
|
||||||
|
@ -54,12 +72,34 @@ ResId CAnimData::GetEventResourceIdForAnimResourceId(ResId id) const
|
||||||
|
|
||||||
void CAnimData::AddAdditiveSegData(const CSegIdList& list, CSegStatementSet& stSet)
|
void CAnimData::AddAdditiveSegData(const CSegIdList& list, CSegStatementSet& stSet)
|
||||||
{
|
{
|
||||||
|
for (std::pair<u32, CAdditiveAnimPlayback>& additive : x1044_additiveAnims)
|
||||||
|
if (additive.second.GetTargetWeight() > 0.00001f)
|
||||||
|
additive.second.AddToSegStatementSet(list, *xcc_layoutData.GetObj(), stSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAnimData::AdvanceAdditiveAnims(float)
|
static void AdvanceAnimationTree(std::weak_ptr<CAnimTreeNode>& anim, const CCharAnimTime& dt)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CAnimData::AdvanceAdditiveAnims(float dt)
|
||||||
|
{
|
||||||
|
CCharAnimTime time(dt);
|
||||||
|
|
||||||
|
for (std::pair<u32, CAdditiveAnimPlayback>& additive : x1044_additiveAnims)
|
||||||
|
{
|
||||||
|
if (additive.second.GetA())
|
||||||
|
{
|
||||||
|
while (time.GreaterThanZero() && std::fabs(time) >= 0.00001f)
|
||||||
|
{
|
||||||
|
//additive.second.GetAnim()->GetInt32POIList(time, );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CAnimData::UpdateAdditiveAnims(float)
|
void CAnimData::UpdateAdditiveAnims(float)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,10 @@ class CAnimTreeNode;
|
||||||
class CSegIdList;
|
class CSegIdList;
|
||||||
class CSegStatementSet;
|
class CSegStatementSet;
|
||||||
class CAdditiveAnimPlayback;
|
class CAdditiveAnimPlayback;
|
||||||
|
class CBoolPOINode;
|
||||||
|
class CInt32POINode;
|
||||||
|
class CParticlePOINode;
|
||||||
|
class CSoundPOINode;
|
||||||
struct SAdvancementDeltas;
|
struct SAdvancementDeltas;
|
||||||
|
|
||||||
class CAnimData
|
class CAnimData
|
||||||
|
@ -99,6 +103,11 @@ class CAnimData
|
||||||
u32 x1040_ = 0;
|
u32 x1040_ = 0;
|
||||||
rstl::reserved_vector<std::pair<u32, CAdditiveAnimPlayback>, 8> x1044_additiveAnims;
|
rstl::reserved_vector<std::pair<u32, CAdditiveAnimPlayback>, 8> x1044_additiveAnims;
|
||||||
|
|
||||||
|
static rstl::reserved_vector<CBoolPOINode, 8> g_BoolPOINodes;
|
||||||
|
static rstl::reserved_vector<CInt32POINode, 16> g_Int32POINodes;
|
||||||
|
static rstl::reserved_vector<CParticlePOINode, 20> g_ParticlePOINodes;
|
||||||
|
static rstl::reserved_vector<CSoundPOINode, 20> g_SoundPOINodes;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CAnimData(ResId,
|
CAnimData(ResId,
|
||||||
const CCharacterInfo& character,
|
const CCharacterInfo& character,
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "CAnimData.hpp"
|
#include "CAnimData.hpp"
|
||||||
#include "CAdditiveAnimPlayback.hpp"
|
#include "CAdditiveAnimPlayback.hpp"
|
||||||
#include "GameGlobalObjects.hpp"
|
#include "GameGlobalObjects.hpp"
|
||||||
|
#include "CParticleGenInfo.hpp"
|
||||||
#include "Graphics/CSkinnedModel.hpp"
|
#include "Graphics/CSkinnedModel.hpp"
|
||||||
|
|
||||||
namespace urde
|
namespace urde
|
||||||
|
|
|
@ -47,6 +47,8 @@ public:
|
||||||
|
|
||||||
ResId GetIceModelId() const {return xa8_cmdlOverlay;}
|
ResId GetIceModelId() const {return xa8_cmdlOverlay;}
|
||||||
ResId GetIceSkinRulesId() const {return xac_cskrOverlay;}
|
ResId GetIceSkinRulesId() const {return xac_cskrOverlay;}
|
||||||
|
|
||||||
|
const CParticleResData& GetParticleResData() const {return x44_partRes;}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,9 @@
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
|
||||||
|
CInt32POINode::CInt32POINode()
|
||||||
|
: CPOINode("root", 2, CCharAnimTime(), -1, false, 1.f, -1, 0), x38_val(0), x3c_boneName("root") {}
|
||||||
|
|
||||||
CInt32POINode::CInt32POINode(CInputStream& in)
|
CInt32POINode::CInt32POINode(CInputStream& in)
|
||||||
: CPOINode(in), x38_val(in.readUint32Big()), x3c_boneName(in.readString()) {}
|
: CPOINode(in), x38_val(in.readUint32Big()), x3c_boneName(in.readString()) {}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ class CInt32POINode : public CPOINode
|
||||||
s32 x38_val;
|
s32 x38_val;
|
||||||
std::string x3c_boneName;
|
std::string x3c_boneName;
|
||||||
public:
|
public:
|
||||||
|
CInt32POINode();
|
||||||
CInt32POINode(CInputStream& in);
|
CInt32POINode(CInputStream& in);
|
||||||
s32 GetValue() const {return x38_val;}
|
s32 GetValue() const {return x38_val;}
|
||||||
const std::string& GetBoneName() const {return x3c_boneName;}
|
const std::string& GetBoneName() const {return x3c_boneName;}
|
||||||
|
|
|
@ -61,6 +61,7 @@ add_library(RuntimeCommonCharacter
|
||||||
CTimeScaleFunctions.hpp CTimeScaleFunctions.cpp
|
CTimeScaleFunctions.hpp CTimeScaleFunctions.cpp
|
||||||
CParticleData.hpp CParticleData.cpp
|
CParticleData.hpp CParticleData.cpp
|
||||||
CParticleDatabase.hpp CParticleDatabase.cpp
|
CParticleDatabase.hpp CParticleDatabase.cpp
|
||||||
|
CParticleGenInfo.hpp CParticleGenInfo.cpp
|
||||||
CAnimPOIData.hpp CAnimPOIData.cpp
|
CAnimPOIData.hpp CAnimPOIData.cpp
|
||||||
CPOINode.hpp CPOINode.cpp
|
CPOINode.hpp CPOINode.cpp
|
||||||
CBoolPOINode.hpp CBoolPOINode.cpp
|
CBoolPOINode.hpp CBoolPOINode.cpp
|
||||||
|
|
|
@ -17,12 +17,13 @@ public:
|
||||||
ContinuousSystem
|
ContinuousSystem
|
||||||
};
|
};
|
||||||
private:
|
private:
|
||||||
u32 x0_duration;
|
u32 x0_duration = 0;
|
||||||
SObjectTag x4_particle;
|
SObjectTag x4_particle;
|
||||||
std::string xc_boneName;
|
std::string xc_boneName = "root";
|
||||||
float x1c_scale;
|
float x1c_scale = 1.f;
|
||||||
EParentedMode x20_parentMode;
|
EParentedMode x20_parentMode = EParentedMode::Initial;
|
||||||
public:
|
public:
|
||||||
|
CParticleData() = default;
|
||||||
CParticleData(CInputStream& in);
|
CParticleData(CInputStream& in);
|
||||||
EParentedMode GetParentedMode() const {return x20_parentMode;}
|
EParentedMode GetParentedMode() const {return x20_parentMode;}
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
#include "CParticleDatabase.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
void CParticleDatabase::CacheParticleDesc(const CCharacterInfo::CParticleResData& desc)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,11 +1,19 @@
|
||||||
#ifndef __URDE_CPARTICLEDATABASE_HPP__
|
#ifndef __URDE_CPARTICLEDATABASE_HPP__
|
||||||
#define __URDE_CPARTICLEDATABASE_HPP__
|
#define __URDE_CPARTICLEDATABASE_HPP__
|
||||||
|
|
||||||
|
#include "CCharacterInfo.hpp"
|
||||||
|
#include "CParticleGenInfo.hpp"
|
||||||
|
#include <map>
|
||||||
|
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
|
||||||
class CParticleDatabase
|
class CParticleDatabase
|
||||||
{
|
{
|
||||||
|
std::map<std::string, std::unique_ptr<CParticleGenInfo>> x3c_;
|
||||||
|
public:
|
||||||
|
void CacheParticleDesc(const CCharacterInfo::CParticleResData& desc);
|
||||||
|
void SetModulationColorAllActiveEffects(const zeus::CColor& color);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
#include "CParticleGenInfo.hpp"
|
||||||
|
#include "Particle/CParticleGen.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
CParticleGenInfo::CParticleGenInfo(const SObjectTag& part, int frameCount, const std::string& boneName,
|
||||||
|
const zeus::CVector3f& scale, CParticleData::EParentedMode parentMode,
|
||||||
|
int a)
|
||||||
|
: x4_part(part), xc_seconds(frameCount / 60.f), x10_boneName(boneName), x28_parentMode(parentMode),
|
||||||
|
x2c_a(a), x30_particleScale(scale)
|
||||||
|
{}
|
||||||
|
|
||||||
|
static TUniqueId _initializeLight(const std::weak_ptr<CParticleGen>& system,
|
||||||
|
CStateManager& stateMgr, int lightId)
|
||||||
|
{
|
||||||
|
std::shared_ptr<CParticleGen> systemRef = system.lock();
|
||||||
|
if (systemRef->SystemHasLight())
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
return kInvalidUniqueId;
|
||||||
|
}
|
||||||
|
|
||||||
|
CParticleGenInfoGeneric::CParticleGenInfoGeneric(const SObjectTag& part,
|
||||||
|
const std::weak_ptr<CParticleGen>& system,
|
||||||
|
int frameCount, const std::string& boneName,
|
||||||
|
const zeus::CVector3f& scale,
|
||||||
|
CParticleData::EParentedMode parentMode,
|
||||||
|
int a, CStateManager& stateMgr, int lightId)
|
||||||
|
: CParticleGenInfo(part, frameCount, boneName, scale, parentMode, a), x80_system(system)
|
||||||
|
{
|
||||||
|
if (lightId == -1)
|
||||||
|
x84_lightId = kInvalidUniqueId;
|
||||||
|
else
|
||||||
|
x84_lightId = _initializeLight(system, stateMgr, lightId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CParticleGenInfoGeneric::AddToRenderer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CParticleGenInfoGeneric::Render()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CParticleGenInfoGeneric::Update(float dt, CStateManager& stateMgr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CParticleGenInfoGeneric::SetOrientation(const zeus::CTransform& xf, CStateManager& stateMgr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CParticleGenInfoGeneric::SetTranslation(const zeus::CVector3f& trans, CStateManager& stateMgr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CParticleGenInfoGeneric::SetGlobalOrientation(const zeus::CTransform& xf, CStateManager& stateMgr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CParticleGenInfoGeneric::SetGlobalTranslation(const zeus::CVector3f& trans, CStateManager& stateMgr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CParticleGenInfoGeneric::SetGlobalScale(const zeus::CVector3f& scale)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CParticleGenInfoGeneric::SetParticleEmission(bool, CStateManager& stateMgr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CParticleGenInfoGeneric::IsSystemDeletable() const
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
zeus::CAABox CParticleGenInfoGeneric::GetBounds() const
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CParticleGenInfoGeneric::HasActiveParticles() const
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CParticleGenInfoGeneric::DestroyParticles()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CParticleGenInfoGeneric::HasLight() const
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
TUniqueId CParticleGenInfoGeneric::GetLightId() const
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CParticleGenInfoGeneric::SetModulationColor(const zeus::CColor& color)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,82 @@
|
||||||
|
#ifndef __URDE_CPARTICLEGENINFO_HPP__
|
||||||
|
#define __URDE_CPARTICLEGENINFO_HPP__
|
||||||
|
|
||||||
|
#include "RetroTypes.hpp"
|
||||||
|
#include "CParticleData.hpp"
|
||||||
|
#include "zeus/CVector3f.hpp"
|
||||||
|
#include "zeus/CAABox.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
struct SObjectTag;
|
||||||
|
class CParticleGen;
|
||||||
|
class CStateManager;
|
||||||
|
|
||||||
|
class CParticleGenInfo
|
||||||
|
{
|
||||||
|
SObjectTag x4_part;
|
||||||
|
float xc_seconds;
|
||||||
|
std::string x10_boneName;
|
||||||
|
float x20_ = 0.f;
|
||||||
|
bool x24_ = false;
|
||||||
|
CParticleData::EParentedMode x28_parentMode;
|
||||||
|
int x2c_a;
|
||||||
|
zeus::CVector3f x30_particleScale;
|
||||||
|
float x3c_ = 0.f;
|
||||||
|
bool x40_ = false;
|
||||||
|
zeus::CTransform x44_;
|
||||||
|
zeus::CVector3f x74_;
|
||||||
|
public:
|
||||||
|
CParticleGenInfo(const SObjectTag& part, int frameCount, const std::string& boneName,
|
||||||
|
const zeus::CVector3f&, CParticleData::EParentedMode parentMode, int a);
|
||||||
|
|
||||||
|
virtual ~CParticleGenInfo() = default;
|
||||||
|
virtual void AddToRenderer()=0;
|
||||||
|
virtual void Render()=0;
|
||||||
|
virtual void Update(float dt, CStateManager& stateMgr)=0;
|
||||||
|
virtual void SetOrientation(const zeus::CTransform& xf, CStateManager& stateMgr)=0;
|
||||||
|
virtual void SetTranslation(const zeus::CVector3f& trans, CStateManager& stateMgr)=0;
|
||||||
|
virtual void SetGlobalOrientation(const zeus::CTransform& xf, CStateManager& stateMgr)=0;
|
||||||
|
virtual void SetGlobalTranslation(const zeus::CVector3f& trans, CStateManager& stateMgr)=0;
|
||||||
|
virtual void SetGlobalScale(const zeus::CVector3f& scale)=0;
|
||||||
|
virtual void SetParticleEmission(bool, CStateManager& stateMgr)=0;
|
||||||
|
virtual bool IsSystemDeletable() const=0;
|
||||||
|
virtual zeus::CAABox GetBounds() const=0;
|
||||||
|
virtual bool HasActiveParticles() const=0;
|
||||||
|
virtual void DestroyParticles()=0;
|
||||||
|
virtual bool HasLight() const=0;
|
||||||
|
virtual TUniqueId GetLightId() const=0;
|
||||||
|
virtual void SetModulationColor(const zeus::CColor& color)=0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CParticleGenInfoGeneric : public CParticleGenInfo
|
||||||
|
{
|
||||||
|
std::shared_ptr<CParticleGen> x80_system;
|
||||||
|
TUniqueId x84_lightId;
|
||||||
|
public:
|
||||||
|
CParticleGenInfoGeneric(const SObjectTag& part, const std::weak_ptr<CParticleGen>& system,
|
||||||
|
int, const std::string& boneName, const zeus::CVector3f& scale,
|
||||||
|
CParticleData::EParentedMode parentMode, int a, CStateManager& stateMgr,
|
||||||
|
int lightId);
|
||||||
|
|
||||||
|
void AddToRenderer();
|
||||||
|
void Render();
|
||||||
|
void Update(float dt, CStateManager& stateMgr);
|
||||||
|
void SetOrientation(const zeus::CTransform& xf, CStateManager& stateMgr);
|
||||||
|
void SetTranslation(const zeus::CVector3f& trans, CStateManager& stateMgr);
|
||||||
|
void SetGlobalOrientation(const zeus::CTransform& xf, CStateManager& stateMgr);
|
||||||
|
void SetGlobalTranslation(const zeus::CVector3f& trans, CStateManager& stateMgr);
|
||||||
|
void SetGlobalScale(const zeus::CVector3f& scale);
|
||||||
|
void SetParticleEmission(bool, CStateManager& stateMgr);
|
||||||
|
bool IsSystemDeletable() const;
|
||||||
|
zeus::CAABox GetBounds() const;
|
||||||
|
bool HasActiveParticles() const;
|
||||||
|
void DestroyParticles();
|
||||||
|
bool HasLight() const;
|
||||||
|
TUniqueId GetLightId() const;
|
||||||
|
void SetModulationColor(const zeus::CColor& color);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __URDE_CPARTICLEGENINFO_HPP__
|
|
@ -4,6 +4,9 @@
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
|
||||||
|
CParticlePOINode::CParticlePOINode()
|
||||||
|
: CPOINode("root", 5, CCharAnimTime(), -1, false, 1.f, -1, 0) {}
|
||||||
|
|
||||||
CParticlePOINode::CParticlePOINode(CInputStream& in)
|
CParticlePOINode::CParticlePOINode(CInputStream& in)
|
||||||
: CPOINode(in), x38_data(in) {}
|
: CPOINode(in), x38_data(in) {}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ class CParticlePOINode : public CPOINode
|
||||||
{
|
{
|
||||||
CParticleData x38_data;
|
CParticleData x38_data;
|
||||||
public:
|
public:
|
||||||
|
CParticlePOINode();
|
||||||
CParticlePOINode(CInputStream& in);
|
CParticlePOINode(CInputStream& in);
|
||||||
const CParticleData& GetData() const {return x38_data;}
|
const CParticleData& GetData() const {return x38_data;}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,13 @@
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
|
||||||
|
CSoundPOINode::CSoundPOINode()
|
||||||
|
: CPOINode("root", 8, CCharAnimTime(), -1, false, 1.f, -1, 0),
|
||||||
|
x38_sfxId(0),
|
||||||
|
x3c_falloff(0.f),
|
||||||
|
x40_maxDist(0.f)
|
||||||
|
{}
|
||||||
|
|
||||||
CSoundPOINode::CSoundPOINode(CInputStream& in)
|
CSoundPOINode::CSoundPOINode(CInputStream& in)
|
||||||
: CPOINode(in),
|
: CPOINode(in),
|
||||||
x38_sfxId(in.readUint32Big()),
|
x38_sfxId(in.readUint32Big()),
|
||||||
|
|
|
@ -14,6 +14,7 @@ class CSoundPOINode : public CPOINode
|
||||||
float x3c_falloff;
|
float x3c_falloff;
|
||||||
float x40_maxDist;
|
float x40_maxDist;
|
||||||
public:
|
public:
|
||||||
|
CSoundPOINode();
|
||||||
CSoundPOINode(CInputStream& in);
|
CSoundPOINode(CInputStream& in);
|
||||||
CSoundPOINode(const std::string& name, u16 a,
|
CSoundPOINode(const std::string& name, u16 a,
|
||||||
const CCharAnimTime& time, u32 b, bool c,
|
const CCharAnimTime& time, u32 b, bool c,
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#include "GameObjectLists.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
CActorList::CActorList()
|
||||||
|
: CObjectList(EGameObjectList::Actor) {}
|
||||||
|
|
||||||
|
CPhysicsActorList::CPhysicsActorList()
|
||||||
|
: CObjectList(EGameObjectList::PhysicsActor) {}
|
||||||
|
|
||||||
|
CGameCameraList::CGameCameraList()
|
||||||
|
: CObjectList(EGameObjectList::GameCamera) {}
|
||||||
|
|
||||||
|
CListeningAiList::CListeningAiList()
|
||||||
|
: CObjectList(EGameObjectList::ListeningAi) {}
|
||||||
|
|
||||||
|
CAiWaypointList::CAiWaypointList()
|
||||||
|
: CObjectList(EGameObjectList::AiWaypoint) {}
|
||||||
|
|
||||||
|
CPlatformAndDoorList::CPlatformAndDoorList()
|
||||||
|
: CObjectList(EGameObjectList::PlatformAndDoor) {}
|
||||||
|
|
||||||
|
CGameLightList::CGameLightList()
|
||||||
|
: CObjectList(EGameObjectList::GameLight) {}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
#ifndef __URDE_GAMEOBJECTLISTS_HPP__
|
||||||
|
#define __URDE_GAMEOBJECTLISTS_HPP__
|
||||||
|
|
||||||
|
#include "CObjectList.hpp"
|
||||||
|
|
||||||
|
namespace urde
|
||||||
|
{
|
||||||
|
|
||||||
|
class CActorList : public CObjectList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CActorList();
|
||||||
|
};
|
||||||
|
|
||||||
|
class CPhysicsActorList : public CObjectList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CPhysicsActorList();
|
||||||
|
};
|
||||||
|
|
||||||
|
class CGameCameraList : public CObjectList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CGameCameraList();
|
||||||
|
};
|
||||||
|
|
||||||
|
class CListeningAiList : public CObjectList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CListeningAiList();
|
||||||
|
};
|
||||||
|
|
||||||
|
class CAiWaypointList : public CObjectList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CAiWaypointList();
|
||||||
|
};
|
||||||
|
|
||||||
|
class CPlatformAndDoorList : public CObjectList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CPlatformAndDoorList();
|
||||||
|
};
|
||||||
|
|
||||||
|
class CGameLightList : public CObjectList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CGameLightList();
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __URDE_GAMEOBJECTLISTS_HPP__
|
|
@ -31,44 +31,9 @@ struct SObjectTag
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
using TUniqueId = s16;
|
||||||
* @brief singleton static-allocator
|
using TEditorId = s32;
|
||||||
*/
|
using TAreaId = s32;
|
||||||
template<class T>
|
|
||||||
class TOneStatic
|
|
||||||
{
|
|
||||||
static u8 m_allocspace[sizeof(T)];
|
|
||||||
static u32 m_refCount;
|
|
||||||
public:
|
|
||||||
static T* GetAllocSpace() {return (T*)m_allocspace;}
|
|
||||||
static u32& ReferenceCount() {return m_refCount;}
|
|
||||||
T* operator->() const {return (T*)m_allocspace;}
|
|
||||||
T& operator*() const {return *(T*)m_allocspace;}
|
|
||||||
|
|
||||||
void* operator new(size_t) = delete;
|
|
||||||
void operator delete(void*) = delete;
|
|
||||||
|
|
||||||
template<typename U = T>
|
|
||||||
TOneStatic(typename std::enable_if<!std::is_default_constructible<U>::value>::type* = 0)
|
|
||||||
{++m_refCount;}
|
|
||||||
template<typename U = T>
|
|
||||||
TOneStatic(typename std::enable_if<std::is_default_constructible<U>::value>::type* = 0)
|
|
||||||
{++m_refCount; new (m_allocspace) T();}
|
|
||||||
|
|
||||||
template<typename... Args> TOneStatic(Args&&... args)
|
|
||||||
{++m_refCount; new (m_allocspace) T(std::forward<Args>(args)...);}
|
|
||||||
|
|
||||||
~TOneStatic() {--m_refCount;}
|
|
||||||
|
|
||||||
template<typename... Args> void reset(Args&&... args)
|
|
||||||
{new (m_allocspace) T(std::forward<Args>(args)...);}
|
|
||||||
};
|
|
||||||
template<class T> u8 TOneStatic<T>::m_allocspace[sizeof(T)];
|
|
||||||
template<class T> u32 TOneStatic<T>::m_refCount;
|
|
||||||
|
|
||||||
using TUniqueId = u16;
|
|
||||||
using TEditorId = u32;
|
|
||||||
using TAreaId = u32;
|
|
||||||
|
|
||||||
#define kInvalidEditorId TEditorId(-1)
|
#define kInvalidEditorId TEditorId(-1)
|
||||||
#define kInvalidUniqueId TUniqueId(-1)
|
#define kInvalidUniqueId TUniqueId(-1)
|
||||||
|
|
2
specter
2
specter
|
@ -1 +1 @@
|
||||||
Subproject commit 36cd3fbf9dafdd9c83268593dfcd905edea32a9a
|
Subproject commit 4c668ed85828e2ac11c160a2536dce60bc62657d
|
Loading…
Reference in New Issue