2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-08-09 11:39:06 +00:00

More ScriptLoader imps

This commit is contained in:
Jack Andersen 2016-04-18 14:17:49 -10:00
parent c614d2d2d1
commit 76afccbdbe
31 changed files with 485 additions and 73 deletions

View File

@ -648,7 +648,7 @@ FourCC ProjectResourceFactoryBase::GetResourceTypeById(ResId id) const
void ProjectResourceFactoryBase::AsyncIdle() void ProjectResourceFactoryBase::AsyncIdle()
{ {
/* Consume completed transactions, they will be processed this cycle at the latest */ /* Consume completed transactions, they will be processed this cycle at the latest */
std::list<std::unique_ptr<hecl::ClientProcess::Transaction>> completed; std::list<std::shared_ptr<hecl::ClientProcess::Transaction>> completed;
m_clientProc.swapCompletedQueue(completed); m_clientProc.swapCompletedQueue(completed);
/* Begin self-profiling loop */ /* Begin self-profiling loop */

View File

@ -48,8 +48,8 @@ protected:
hecl::ProjectPath m_workingPath; hecl::ProjectPath m_workingPath;
hecl::ProjectPath m_cookedPath; hecl::ProjectPath m_cookedPath;
const hecl::ClientProcess::CookTransaction* m_cookTransaction = nullptr; std::shared_ptr<const hecl::ClientProcess::CookTransaction> m_cookTransaction;
const hecl::ClientProcess::BufferTransaction* m_bufTransaction = nullptr; std::shared_ptr<const hecl::ClientProcess::BufferTransaction> m_bufTransaction;
bool m_failed = false; bool m_failed = false;
bool m_complete = false; bool m_complete = false;

View File

@ -9,6 +9,8 @@
#include "Input/CRumbleManager.hpp" #include "Input/CRumbleManager.hpp"
#include "World/CWorld.hpp" #include "World/CWorld.hpp"
#include "Graphics/CLight.hpp" #include "Graphics/CLight.hpp"
#include "GameGlobalObjects.hpp"
#include "CSimplePool.hpp"
namespace urde namespace urde
{ {
@ -160,6 +162,8 @@ CStateManager::CStateManager(const std::weak_ptr<CScriptMailbox>&,
x904_loaderFuncs[int(EScriptObjectType::NewCameraShaker)] = ScriptLoader::LoadNewCameraShaker; x904_loaderFuncs[int(EScriptObjectType::NewCameraShaker)] = ScriptLoader::LoadNewCameraShaker;
x904_loaderFuncs[int(EScriptObjectType::ShadowProjector)] = ScriptLoader::LoadShadowProjector; x904_loaderFuncs[int(EScriptObjectType::ShadowProjector)] = ScriptLoader::LoadShadowProjector;
x904_loaderFuncs[int(EScriptObjectType::EnergyBall)] = ScriptLoader::LoadEnergyBall; x904_loaderFuncs[int(EScriptObjectType::EnergyBall)] = ScriptLoader::LoadEnergyBall;
x8ec_shadowTex = g_SimplePool->GetObj("DefaultShadow");
} }
void CStateManager::RenderLast(TUniqueId) void CStateManager::RenderLast(TUniqueId)

View File

@ -231,6 +231,8 @@ public:
CRandom16* GetActiveRandom() {return x8fc_activeRandom;} CRandom16* GetActiveRandom() {return x8fc_activeRandom;}
CRumbleManager& GetRumbleManager() {return *x88c_rumbleManager;} CRumbleManager& GetRumbleManager() {return *x88c_rumbleManager;}
CCameraFilterPass& GetCameraFilterPass(int idx) {return xaf8_camFilterPasses[idx];} CCameraFilterPass& GetCameraFilterPass(int idx) {return xaf8_camFilterPasses[idx];}
CWorld* GetWorld() {return x850_world.get();}
}; };
} }

View File

@ -7,6 +7,7 @@
#include "CParticleDatabase.hpp" #include "CParticleDatabase.hpp"
#include "CPoseAsTransforms.hpp" #include "CPoseAsTransforms.hpp"
#include "CHierarchyPoseBuilder.hpp" #include "CHierarchyPoseBuilder.hpp"
#include "CAdditiveAnimPlayback.hpp"
#include <set> #include <set>
enum class EUserEventType enum class EUserEventType
@ -36,7 +37,6 @@ class CSkinRules;
class CAnimTreeNode; class CAnimTreeNode;
class CSegIdList; class CSegIdList;
class CSegStatementSet; class CSegStatementSet;
class CAdditiveAnimPlayback;
class CBoolPOINode; class CBoolPOINode;
class CInt32POINode; class CInt32POINode;
class CParticlePOINode; class CParticlePOINode;

View File

@ -23,16 +23,16 @@ CModelData::CModelData() {}
CModelData CModelData::CModelDataNull() {return CModelData();} CModelData CModelData::CModelDataNull() {return CModelData();}
CModelData::CModelData(const CStaticRes& res) CModelData::CModelData(const CStaticRes& res)
: x0_particleScale(res.x4_particleScale) : x0_particleScale(res.x4_scale)
{ {
x1c_normalModel = g_SimplePool->GetObj({SBIG('CMDL'), res.x0_cmdlId}); x1c_normalModel = g_SimplePool->GetObj({SBIG('CMDL'), res.x0_cmdlId});
} }
CModelData::CModelData(const CAnimRes& res) CModelData::CModelData(const CAnimRes& res)
: x0_particleScale(res.x8_particleScale) : x0_particleScale(res.x8_scale)
{ {
TToken<CCharacterFactory> factory = g_CharFactoryBuilder->GetFactory(res); TToken<CCharacterFactory> factory = g_CharFactoryBuilder->GetFactory(res);
xc_animData = factory->CreateCharacter(res.x4_charIdx, res.x14_, factory, res.x1c_); xc_animData = factory->CreateCharacter(res.x4_charIdx, res.x14_, factory, res.x1c_defaultAnim);
} }
SAdvancementDeltas CModelData::GetAdvancementDeltas(const CCharAnimTime& a, SAdvancementDeltas CModelData::GetAdvancementDeltas(const CCharAnimTime& a,

View File

@ -6,6 +6,7 @@
#include "zeus/CColor.hpp" #include "zeus/CColor.hpp"
#include "RetroTypes.hpp" #include "RetroTypes.hpp"
#include "CToken.hpp" #include "CToken.hpp"
#include "CAnimData.hpp"
namespace urde namespace urde
{ {
@ -23,16 +24,16 @@ struct SAdvancementDeltas;
struct CStaticRes struct CStaticRes
{ {
ResId x0_cmdlId; ResId x0_cmdlId;
zeus::CVector3f x4_particleScale; zeus::CVector3f x4_scale;
}; };
struct CAnimRes struct CAnimRes
{ {
ResId x0_ancsId; ResId x0_ancsId;
u32 x4_charIdx; s32 x4_charIdx;
zeus::CVector3f x8_particleScale; zeus::CVector3f x8_scale;
bool x14_; bool x14_;
int x1c_; s32 x1c_defaultAnim;
}; };
class CModelData class CModelData
@ -53,8 +54,6 @@ class CModelData
TLockedToken<CModel> x2c_xrayModel; TLockedToken<CModel> x2c_xrayModel;
TLockedToken<CModel> x3c_infraModel; TLockedToken<CModel> x3c_infraModel;
CModelData();
public: public:
enum class EWhichModel enum class EWhichModel
{ {
@ -67,6 +66,8 @@ public:
CModelData(const CStaticRes& res); CModelData(const CStaticRes& res);
CModelData(const CAnimRes& res); CModelData(const CAnimRes& res);
CModelData(CModelData&&) = default; CModelData(CModelData&&) = default;
CModelData& operator=(CModelData&&) = default;
CModelData();
CModelData CModelDataNull(); CModelData CModelDataNull();
SAdvancementDeltas GetAdvancementDeltas(const CCharAnimTime& a, const CCharAnimTime& b) const; SAdvancementDeltas GetAdvancementDeltas(const CCharAnimTime& a, const CCharAnimTime& b) const;

View File

@ -2,4 +2,5 @@ add_library(RuntimeCommonCollision
CGameCollision.hpp CGameCollision.cpp CGameCollision.hpp CGameCollision.cpp
CCollisionInfo.hpp CCollisionInfo.cpp CCollisionInfo.hpp CCollisionInfo.cpp
CCollidableOBBTree.hpp CCollidableOBBTree.cpp CCollidableOBBTree.hpp CCollidableOBBTree.cpp
CCollidableOBBTreeGroup.hpp CCollidableOBBTreeGroup.cpp) CCollidableOBBTreeGroup.hpp CCollidableOBBTreeGroup.cpp
CMaterialList.hpp)

View File

@ -0,0 +1,20 @@
#ifndef __URDE_CMATERIALLIST_HPP__
#define __URDE_CMATERIALLIST_HPP__
#include "RetroTypes.hpp"
namespace urde
{
class CMaterialList
{
friend class ScriptLoader;
u64 x0_ = 0;
public:
CMaterialList() = default;
CMaterialList(int idx) : x0_(1 << idx) {}
};
}
#endif // __URDE_CMATERIALLIST_HPP__

View File

@ -29,6 +29,11 @@ struct SObjectTag
in.readBytesToBuf(&type, 4); in.readBytesToBuf(&type, 4);
id = in.readUint32Big(); id = in.readUint32Big();
} }
void readMLVL(CInputStream& in)
{
id = in.readUint32Big();
in.readBytesToBuf(&type, 4);
}
}; };
using TUniqueId = s16; using TUniqueId = s16;

View File

@ -2,4 +2,12 @@
namespace urde namespace urde
{ {
CActor::CActor(TUniqueId uid, bool active, const std::string&, const CEntityInfo& info,
const zeus::CTransform&, const CModelData&, const CMaterialList&,
const CActorParameters&, TUniqueId)
: CEntity(uid, info, active)
{
}
} }

View File

@ -20,6 +20,9 @@ class CModelData;
class CMaterialList; class CMaterialList;
class CActorParameters; class CActorParameters;
class CWeaponMode; class CWeaponMode;
class CHealthInfo;
class CDamageVulnerability;
class CLightParameters;
class CActor : public CEntity class CActor : public CEntity
{ {
@ -45,6 +48,7 @@ public:
const zeus::CTransform&, const CModelData&, const CMaterialList&, const zeus::CTransform&, const CModelData&, const CMaterialList&,
const CActorParameters&, TUniqueId); const CActorParameters&, TUniqueId);
virtual void Accept(IVisitor&);
virtual void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&) {} virtual void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&) {}
virtual zeus::CVector3f GetAimPosition(const CStateManager&, float) virtual zeus::CVector3f GetAimPosition(const CStateManager&, float)
{ return zeus::CVector3f(x40_unknown, x50_unknown, x60_unknown); } { return zeus::CVector3f(x40_unknown, x50_unknown, x60_unknown); }

View File

@ -10,6 +10,7 @@ namespace urde
class CActorParameters class CActorParameters
{ {
friend class ScriptLoader;
CLightParameters x4_lightParms; CLightParameters x4_lightParms;
CScannableParameters x40_scanParms; CScannableParameters x40_scanParms;
std::pair<ResId, ResId> x44_xrayAssets = {}; std::pair<ResId, ResId> x44_xrayAssets = {};

View File

@ -6,6 +6,7 @@
#include "RetroTypes.hpp" #include "RetroTypes.hpp"
#include "CEntity.hpp" #include "CEntity.hpp"
#include "CPhysicsActor.hpp" #include "CPhysicsActor.hpp"
#include "CDamageVulnerability.hpp"
#include "zeus/zeus.hpp" #include "zeus/zeus.hpp"
@ -37,57 +38,6 @@ public:
CHealthInfo(CInputStream& in) : x0_(in.readFloatBig()), x4_(in.readFloatBig()) {} CHealthInfo(CInputStream& in) : x0_(in.readFloatBig()), x4_(in.readFloatBig()) {}
}; };
enum class EVulnerability
{
};
class CDamageVulnerability
{
EVulnerability x0_power;
EVulnerability x4_ice;
EVulnerability x8_wave;
EVulnerability xc_plasma;
EVulnerability x10_bomb;
EVulnerability x14_powerbomb;
EVulnerability x18_missile;
EVulnerability x1c_boostBall;
EVulnerability x20_phazon;
EVulnerability x24_enemyWp1;
EVulnerability x28_enemyWp2Poison;
EVulnerability x2c_enemyWp3Lava;
EVulnerability x30_enemyWp4;
EVulnerability x34_unk1;
EVulnerability x38_unk2;
EVulnerability x3c_unk3;
#if 0
struct ChargedBeams : BigYAML
{
DECL_YAML
Value<atUint32> propertyCount;
Value<atUint32> power;
Value<atUint32> ice;
Value<atUint32> wave;
Value<atUint32> plasma;
Value<atUint32> phazon;
} chargedBeams;
struct BeamCombos : BigYAML
{
DECL_YAML
Value<atUint32> propertyCount;
Value<atUint32> superMissiles;
Value<atUint32> iceSpreader;
Value<atUint32> wavebuster;
Value<atUint32> flameThrower;
Value<atUint32> phazonCombo;
} beamCombos;
#endif
public:
CDamageVulnerability(CInputStream& in) {}
};
class CStateManager; class CStateManager;
class CAi : public CPhysicsActor class CAi : public CPhysicsActor
{ {

View File

@ -8,10 +8,10 @@ namespace urde
class CAnimationParameters class CAnimationParameters
{ {
public:
ResId x0_ancs; ResId x0_ancs;
s32 x4_charIdx; s32 x4_charIdx;
u32 x8_defaultAnim; u32 x8_defaultAnim;
public:
CAnimationParameters(ResId ancs, s32 charIdx, u32 defaultAnim) CAnimationParameters(ResId ancs, s32 charIdx, u32 defaultAnim)
: x0_ancs(ancs), x4_charIdx(charIdx), x8_defaultAnim(defaultAnim) {} : x0_ancs(ancs), x4_charIdx(charIdx), x8_defaultAnim(defaultAnim) {}
}; };

View File

@ -0,0 +1,113 @@
#ifndef __URDE_CDAMAGEVULNERABILITY_HPP__
#define __URDE_CDAMAGEVULNERABILITY_HPP__
#include "RetroTypes.hpp"
namespace urde
{
enum class EVulnerability
{
DoubleDamage,
Normal,
Reflect,
Immune,
PassThrough,
DirectDouble,
Direct
};
class CDamageVulnerability
{
EVulnerability x0_power;
EVulnerability x4_ice;
EVulnerability x8_wave;
EVulnerability xc_plasma;
EVulnerability x10_bomb;
EVulnerability x14_powerbomb;
EVulnerability x18_missile;
EVulnerability x1c_boostBall;
EVulnerability x20_phazon;
EVulnerability x24_enemyWp1;
EVulnerability x28_enemyWp2Poison;
EVulnerability x2c_enemyWp3Lava;
EVulnerability x30_enemyWp4;
EVulnerability x34_unk1;
EVulnerability x38_unk2;
EVulnerability x3c_chargedPower;
EVulnerability x40_chargedIce;
EVulnerability x44_chargedWave;
EVulnerability x48_chargedPlasma;
EVulnerability x4c_superMissile;
EVulnerability x50_iceSpreader;
EVulnerability x54_wavebuster;
EVulnerability x58_flamethrower;
u32 x5c_;
u32 x60_;
u32 x64_;
void ConstructNew(CInputStream& in, int propCount)
{
EVulnerability* vulns = &x0_power;
for (int i=0 ; i<std::min(propCount - 3, 15) ; ++i)
vulns[i] = EVulnerability(in.readUint32Big());
if (propCount < 15)
{
for (int i=propCount ; i<15 ; ++i)
vulns[i] = EVulnerability::Reflect;
}
for (int i=15 ; i<propCount ; ++i)
in.readUint32Big();
x5c_ = in.readUint32Big();
EVulnerability* vulns2 = &x3c_chargedPower;
in.readUint32Big();
for (int i=0 ; i<4 ; ++i)
vulns2[i] = EVulnerability(in.readUint32Big());
x60_ = in.readUint32Big();
EVulnerability* vulns3 = &x4c_superMissile;
in.readUint32Big();
for (int i=0 ; i<4 ; ++i)
vulns3[i] = EVulnerability(in.readUint32Big());
x64_ = in.readUint32Big();
}
public:
CDamageVulnerability(CInputStream& in)
{
u32 propCount = in.readUint32Big();;
if (propCount == 11)
{
EVulnerability* vulns = &x0_power;
for (int i=0 ; i<15 ; ++i)
vulns[i] = EVulnerability(in.readUint32Big());
if (propCount == 15)
x5c_ = 0;
else
x5c_ = in.readUint32Big();
x3c_chargedPower = x0_power;
x4c_superMissile = x0_power;
x40_chargedIce = x4_ice;
x50_iceSpreader = x4_ice;
x44_chargedWave = x8_wave;
x54_wavebuster = x8_wave;
x48_chargedPlasma = xc_plasma;
x58_flamethrower = xc_plasma;
}
else
ConstructNew(in, propCount);
}
};
}
#endif // __URDE_CDAMAGEVULNERABILITY_HPP__

View File

@ -24,6 +24,7 @@ class CEntityInfo
public: public:
CEntityInfo(TAreaId aid, const std::vector<SConnection>& conns) CEntityInfo(TAreaId aid, const std::vector<SConnection>& conns)
: m_aid(aid), m_conns(conns) {} : m_aid(aid), m_conns(conns) {}
TAreaId GetAreaId() const {return m_aid;}
}; };
class CEntity class CEntity

View File

@ -0,0 +1,39 @@
#include "CGameArea.hpp"
namespace urde
{
static std::vector<SObjectTag> ReadDependencyList(CInputStream& in)
{
std::vector<SObjectTag> ret;
u32 count = in.readUint32Big();
ret.reserve(count);
for (int i=0 ; i<count ; ++i)
{
ret.emplace_back();
ret.back().readMLVL(in);
}
return ret;
}
CGameArea::CGameArea(CInputStream& in, int mlvlVersion)
: x4_mlvlVersion(mlvlVersion), xf0_25_(true)
{
x8_nameSTRG = in.readUint32Big();
xc_transform.read34RowMajor(in);
x3c_invTransform = xc_transform.inverse();
x6c_aabb.readBoundingBoxBig(in);
x84_mrea = in.readUint32Big();
x88_areaId = in.readUint32Big();
u32 attachedCount = in.readUint32Big();
x8c_attachedAreaIndices.reserve(attachedCount);
for (int i=0 ; i<attachedCount ; ++i)
x8c_attachedAreaIndices.push_back(in.readUint16Big());
x9c_deps1 = ReadDependencyList(in);
xac_deps2 = ReadDependencyList(in);
}
}

View File

@ -3,7 +3,11 @@
#include "zeus/CVector2f.hpp" #include "zeus/CVector2f.hpp"
#include "zeus/CColor.hpp" #include "zeus/CColor.hpp"
#include "zeus/CAABox.hpp"
#include "CToken.hpp"
#include "RetroTypes.hpp" #include "RetroTypes.hpp"
#include "IGameArea.hpp"
#include "hecl/ClientProcess.hpp"
namespace urde namespace urde
{ {
@ -13,8 +17,40 @@ enum class ERglFogMode
Four = 4 Four = 4
}; };
class CGameArea class CGameArea : public IGameArea
{ {
int x4_mlvlVersion;
ResId x8_nameSTRG;
zeus::CTransform xc_transform;
zeus::CTransform x3c_invTransform;
zeus::CAABox x6c_aabb;
ResId x84_mrea;
u32 x88_areaId;
std::vector<u16> x8c_attachedAreaIndices;
std::vector<SObjectTag> x9c_deps1;
std::vector<SObjectTag> xac_deps2;
std::vector<u32> xbc_;
std::vector<Dock> xcc_docks;
std::vector<CToken> xdc_tokens;
u32 xec_totalResourcesSize = 0;
union
{
struct
{
bool xf0_24_ : 1;
bool xf0_25_ : 1;
bool xf0_26_ : 1;
bool xf0_27_ : 1;
bool xf0_28_ : 1;
};
u8 _dummy = 0;
};
std::list<std::shared_ptr<const hecl::ClientProcess::BufferTransaction>> xf8_loadTransactions;
public: public:
class CAreaFog class CAreaFog
{ {
@ -29,6 +65,13 @@ public:
void DisableFog(); void DisableFog();
void Update(float dt); void Update(float dt);
}; };
CGameArea(CInputStream& in, int mlvlVersion);
const zeus::CTransform& GetTransform() const {return xc_transform;}
const zeus::CTransform& GetInverseTransform() const {return x3c_invTransform;}
const zeus::CAABox& GetAABB() const {return x6c_aabb;}
}; };
} }

View File

@ -15,9 +15,12 @@ add_library(RuntimeCommonWorld
ScriptObjectSupport.hpp ScriptObjectSupport.cpp ScriptObjectSupport.hpp ScriptObjectSupport.cpp
ScriptLoader.hpp ScriptLoader.cpp ScriptLoader.hpp ScriptLoader.cpp
CScriptWater.hpp CScriptWater.cpp CScriptWater.hpp CScriptWater.cpp
CScriptActor.hpp CScriptActor.cpp
CScriptWaypoint.hpp CScriptWaypoint.cpp
CGrappleParameters.hpp CGrappleParameters.hpp
CActorParameters.hpp CActorParameters.hpp
CLightParameters.hpp CLightParameters.hpp
CScannableParameters.hpp CScannableParameters.hpp
CVisorParameters.hpp CVisorParameters.hpp
CAnimationParameters.hpp) CAnimationParameters.hpp
CDamageVulnerability.hpp)

View File

@ -0,0 +1,14 @@
#include "CPhysicsActor.hpp"
namespace urde
{
CPhysicsActor::CPhysicsActor(TUniqueId uid, bool active, const std::string& name, const CEntityInfo& info,
const zeus::CTransform& xf, const CModelData& mData, const CMaterialList& matList,
const zeus::CAABox& box, const SMoverData& moverData, const CActorParameters& actorParms,
float, float)
: CActor(uid, active, name, info, xf, mData, matList, actorParms, kInvalidUniqueId)
{
}
}

View File

@ -5,6 +5,7 @@
namespace urde namespace urde
{ {
struct SMoverData;
class CCollisionPrimitive class CCollisionPrimitive
{ {
@ -16,6 +17,17 @@ class CCollisionInfoList
{ {
}; };
struct SMoverData
{
zeus::CVector3f x0_;
zeus::CAxisAngle xc_;
zeus::CVector3f x18_;
zeus::CAxisAngle x24_;
float x30_;
SMoverData(float a) : x30_(a) {}
};
class CPhysicsActor : public CActor class CPhysicsActor : public CActor
{ {
protected: protected:
@ -30,6 +42,10 @@ protected:
float x230_restitutionCoefModifier; float x230_restitutionCoefModifier;
float x234_collisionAccuracyModifier; float x234_collisionAccuracyModifier;
public: public:
CPhysicsActor(TUniqueId, bool, const std::string&, const CEntityInfo&,
const zeus::CTransform&, const CModelData&, const CMaterialList&,
const zeus::CAABox&, const SMoverData&, const CActorParameters&,
float, float);
float GetCollisionAccuracyModifier() float GetCollisionAccuracyModifier()
{ return x234_collisionAccuracyModifier; } { return x234_collisionAccuracyModifier; }

View File

@ -0,0 +1,14 @@
#include "CScriptActor.hpp"
namespace urde
{
CScriptActor::CScriptActor(TUniqueId uid, const std::string& name, const CEntityInfo& info,
const zeus::CTransform& xf, const CModelData& mData, const zeus::CAABox& aabb, float a, float,
const CMaterialList& matList, const CHealthInfo&, const CDamageVulnerability&,
const CActorParameters& actParms, bool, bool active, u32, float, bool, bool, bool, bool)
: CPhysicsActor(uid, active, name, info, xf, mData, matList, aabb, SMoverData(a), actParms, 0.3f, 0.1f)
{
}
}

View File

@ -0,0 +1,20 @@
#ifndef __URDE_CSCRIPTACTOR_HPP__
#define __URDE_CSCRIPTACTOR_HPP__
#include "CPhysicsActor.hpp"
namespace urde
{
class CScriptActor : public CPhysicsActor
{
public:
CScriptActor(TUniqueId, const std::string&, const CEntityInfo&,
const zeus::CTransform&, const CModelData&, const zeus::CAABox& aabb, float, float,
const CMaterialList& matList, const CHealthInfo&, const CDamageVulnerability&,
const CActorParameters&, bool, bool, u32, float, bool, bool, bool, bool);
};
}
#endif // __URDE_CSCRIPTACTOR_HPP__

View File

@ -0,0 +1,17 @@
#include "CScriptWaypoint.hpp"
#include "Character/CModelData.hpp"
#include "Collision/CMaterialList.hpp"
#include "CActorParameters.hpp"
namespace urde
{
CScriptWaypoint::CScriptWaypoint(TUniqueId uid, const std::string& name, const CEntityInfo& info,
const zeus::CTransform& xf, bool active, float, float,
u32, u32, u32, u32, u32, u32, u32)
: CActor(uid, active, name, info, xf, CModelData(), CMaterialList(1),
CActorParameters::None(), kInvalidUniqueId)
{
}
}

View File

@ -0,0 +1,19 @@
#ifndef __URDE_CSCRIPTWAYPOINT_HPP__
#define __URDE_CSCRIPTWAYPOINT_HPP__
#include "CActor.hpp"
namespace urde
{
class CScriptWaypoint : public CActor
{
public:
CScriptWaypoint(TUniqueId, const std::string&, const CEntityInfo&,
const zeus::CTransform&, bool, float, float,
u32, u32, u32, u32, u32, u32, u32);
};
}
#endif // __URDE_CSCRIPTWAYPOINT_HPP__

View File

@ -1,11 +1,17 @@
#ifndef __URDE_CWORLD_HPP__ #ifndef __URDE_CWORLD_HPP__
#define __URDE_CWORLD_HPP__ #define __URDE_CWORLD_HPP__
#include "RetroTypes.hpp"
namespace urde namespace urde
{ {
class CGameArea;
class CWorld class CWorld
{ {
std::vector<std::unique_ptr<CGameArea>> x18_areas;
public:
std::vector<std::unique_ptr<CGameArea>>& GetGameAreas() {return x18_areas;}
}; };
} }

View File

@ -0,0 +1,17 @@
#ifndef __URDE_IGAMEAREA_HPP__
#define __URDE_IGAMEAREA_HPP__
namespace urde
{
class IGameArea
{
public:
class Dock
{
};
};
}
#endif // __URDE_IGAMEAREA_HPP__

View File

@ -7,6 +7,11 @@
#include "CLightParameters.hpp" #include "CLightParameters.hpp"
#include "CAnimationParameters.hpp" #include "CAnimationParameters.hpp"
#include "GameGlobalObjects.hpp" #include "GameGlobalObjects.hpp"
#include "CWorld.hpp"
#include "Character/CModelData.hpp"
#include "Collision/CMaterialList.hpp"
#include "CScriptActor.hpp"
#include "CScriptWaypoint.hpp"
#include "logvisor/logvisor.hpp" #include "logvisor/logvisor.hpp"
namespace urde namespace urde
@ -71,6 +76,14 @@ static SScaledActorHead LoadScaledActorHead(CInputStream& in, CStateManager& sta
return ret; return ret;
} }
static zeus::CAABox GetCollisionBox(CStateManager& stateMgr, TAreaId id,
const zeus::CVector3f& extent, const zeus::CVector3f& offset)
{
zeus::CAABox box(-extent * 0.5f + offset, extent * 0.5f + offset);
zeus::CTransform rot = stateMgr.GetWorld()->GetGameAreas()[id]->GetTransform().getRotation();
return box.getTransformedAABox(rot);
}
u32 ScriptLoader::LoadParameterFlags(CInputStream& in) u32 ScriptLoader::LoadParameterFlags(CInputStream& in)
{ {
u32 count = in.readUint32Big(); u32 count = in.readUint32Big();
@ -242,7 +255,8 @@ zeus::CTransform ScriptLoader::ConvertEditorEulerToTransform4f(const zeus::CVect
zeus::CTransform::RotateX(zeus::degToRad(orientation.x)) + position; zeus::CTransform::RotateX(zeus::degToRad(orientation.x)) + position;
} }
CEntity* ScriptLoader::LoadActor(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info) CEntity* ScriptLoader::LoadActor(CStateManager& mgr, CInputStream& in,
int propCount, const CEntityInfo& info)
{ {
if (!EnsurePropertyCount(propCount, 24, "Actor")) if (!EnsurePropertyCount(propCount, 24, "Actor"))
return nullptr; return nullptr;
@ -262,11 +276,91 @@ CEntity* ScriptLoader::LoadActor(CStateManager& mgr, CInputStream& in, int propC
CDamageVulnerability dInfo(in); CDamageVulnerability dInfo(in);
// TODO: Finish ResId staticId = in.readUint32Big();
CAnimationParameters aParms = LoadAnimationParameters(in);
CActorParameters actParms = LoadActorParameters(in);
bool b1 = in.readBool();
bool b2 = in.readBool();
bool b3 = in.readBool();
bool b4 = in.readBool();
bool b5 = in.readBool();
u32 w2 = in.readUint32Big();
float f3 = in.readFloatBig();
bool b6 = in.readBool();
bool b7 = in.readBool();
bool b8 = in.readBool();
bool b9 = in.readBool();
FourCC animType = g_ResFactory->GetResourceTypeById(aParms.x0_ancs);
if (!g_ResFactory->GetResourceTypeById(staticId) && !animType)
return nullptr;
zeus::CAABox aabb = GetCollisionBox(mgr, info.GetAreaId(), collisionExtent, centroid);
CMaterialList list;
if (b2)
list.x0_ = 0x80000000000;
if (b3)
list.x0_ |= 8;
if (b4)
list.x0_ |= 32;
bool generateExtent = false;
if (collisionExtent.x < 0.f || collisionExtent.y < 0.f || collisionExtent.z < 0.f)
generateExtent = true;
CModelData data;
if (animType == SBIG('ANCS'))
{
CAnimRes aRes;
aRes.x0_ancsId = aParms.x0_ancs;
aRes.x4_charIdx = aParms.x4_charIdx;
aRes.x8_scale = head.x40_scale;
aRes.x14_ = true;
aRes.x1c_defaultAnim = aParms.x8_defaultAnim;
data = aRes;
}
else
{
CStaticRes sRes;
sRes.x0_cmdlId = staticId;
sRes.x4_scale = head.x40_scale;
data = sRes;
}
if (collisionExtent.isZero() || generateExtent)
aabb = data.GetBounds(head.x10_transform.getRotation());
return new CScriptActor(mgr.AllocateUniqueId(), head.x0_name, info,
head.x10_transform, data, aabb, f1, f2, list, hInfo, dInfo,
actParms, b1, b5, w2, f3, b6, b7, b8, b9);
} }
CEntity* ScriptLoader::LoadWaypoint(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info) CEntity* ScriptLoader::LoadWaypoint(CStateManager& mgr, CInputStream& in,
int propCount, const CEntityInfo& info)
{ {
if (!EnsurePropertyCount(propCount, 13, "Waypoint"))
return nullptr;
SActorHead head = LoadActorHead(in, mgr);
bool b1 = in.readBool();
float f1 = in.readFloatBig();
float f2 = in.readFloatBig();
u32 w1 = in.readUint32Big();
u32 w2 = in.readUint32Big();
u32 w3 = in.readUint32Big();
u32 w4 = in.readUint32Big();
u32 w5 = in.readUint32Big();
u32 w6 = in.readUint32Big();
u32 w7 = in.readUint32Big();
return new CScriptWaypoint(mgr.AllocateUniqueId(), head.x0_name, info, head.x10_transform,
b1, f1, f2, w1, w2, w3, w4, w5, w6, w7);
} }
CEntity* ScriptLoader::LoadDoorArea(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info) CEntity* ScriptLoader::LoadDoorArea(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info)

2
hecl

@ -1 +1 @@
Subproject commit dabc519fe168e6a2db839119eb20f706cd39ddac Subproject commit 675d00d08a2713006dd64622ff61ae849f71c06f

@ -1 +1 @@
Subproject commit 4c668ed85828e2ac11c160a2536dce60bc62657d Subproject commit c72304bae2d84106e2474fb08acdd9b127b76d7f