Add CScriptActor

This commit is contained in:
Luke Street 2022-11-04 01:25:39 -04:00
parent 752c4e9c39
commit febfd1faae
19 changed files with 398 additions and 48 deletions

View File

@ -19,7 +19,7 @@ lbl_803E85E8:
.4byte Render__13CPhysicsActorCFRC13CStateManager .4byte Render__13CPhysicsActorCFRC13CStateManager
.4byte CanRenderUnsorted__6CActorCFRC13CStateManager .4byte CanRenderUnsorted__6CActorCFRC13CStateManager
.4byte CalculateRenderBounds__6CActorFv .4byte CalculateRenderBounds__6CActorFv
.4byte GetHealthInfo__12CScriptActorCFRC13CStateManager .4byte HealthInfo__12CScriptActorFR13CStateManager
.4byte GetDamageVulnerability__12CScriptActorCFv .4byte GetDamageVulnerability__12CScriptActorCFv
.4byte GetDamageVulnerability__6CActorCFRC9CVector3fRC9CVector3fRC11CDamageInfo .4byte GetDamageVulnerability__6CActorCFRC9CVector3fRC9CVector3fRC11CDamageInfo
.4byte GetTouchBounds__12CScriptActorCFv .4byte GetTouchBounds__12CScriptActorCFv
@ -28,7 +28,7 @@ lbl_803E85E8:
.4byte GetAimPosition__13CPhysicsActorCFRC13CStateManagerf .4byte GetAimPosition__13CPhysicsActorCFRC13CStateManagerf
.4byte GetHomingPosition__6CActorCFRC13CStateManagerf .4byte GetHomingPosition__6CActorCFRC13CStateManagerf
.4byte GetScanObjectIndicatorPosition__6CActorCFRC13CStateManager .4byte GetScanObjectIndicatorPosition__6CActorCFRC13CStateManager
.4byte GetCollisionResponseType__12CScriptActorCFRC9CVector3fRC9CVector3fRC11CWeaponModei .4byte GetCollisionResponseType__12CScriptActorCFRC9CVector3fRC9CVector3fRC11CWeaponMode17EProjectileAttrib
.4byte FluidFXThink__6CActorFQ26CActor11EFluidStateR12CScriptWaterR13CStateManager .4byte FluidFXThink__6CActorFQ26CActor11EFluidStateR12CScriptWaterR13CStateManager
.4byte OnScanStateChange__6CActorFQ26CActor10EScanStateR13CStateManager .4byte OnScanStateChange__6CActorFQ26CActor10EScanStateR13CStateManager
.4byte GetSortingBounds__12CScriptActorCFRC13CStateManager .4byte GetSortingBounds__12CScriptActorCFRC13CStateManager
@ -534,7 +534,7 @@ lbl_8023F978:
/* 8023F9F0 0023C950 90 01 00 24 */ stw r0, 0x24(r1) /* 8023F9F0 0023C950 90 01 00 24 */ stw r0, 0x24(r1)
/* 8023F9F4 0023C954 90 01 00 28 */ stw r0, 0x28(r1) /* 8023F9F4 0023C954 90 01 00 28 */ stw r0, 0x28(r1)
/* 8023F9F8 0023C958 90 01 00 2C */ stw r0, 0x2c(r1) /* 8023F9F8 0023C958 90 01 00 2C */ stw r0, 0x2c(r1)
/* 8023F9FC 0023C95C 4B E3 5E B1 */ bl "__ct__12CScriptActorF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC6CAABoxRC13CMaterialListffRC11CHealthInfoRC20CDamageVulnerabilityRC16CActorParametersbbUibbbb" /* 8023F9FC 0023C95C 4B E3 5E B1 */ bl "__ct__12CScriptActorF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC6CAABoxRC13CMaterialListffRC11CHealthInfoRC20CDamageVulnerabilityRC16CActorParametersbbUifbbbb"
/* 8023FA00 0023C960 3C 80 80 3F */ lis r4, lbl_803E85E8@ha /* 8023FA00 0023C960 3C 80 80 3F */ lis r4, lbl_803E85E8@ha
/* 8023FA04 0023C964 3C 60 80 3D */ lis r3, lbl_803D43A0@ha /* 8023FA04 0023C964 3C 60 80 3D */ lis r3, lbl_803D43A0@ha
/* 8023FA08 0023C968 38 04 85 E8 */ addi r0, r4, lbl_803E85E8@l /* 8023FA08 0023C968 38 04 85 E8 */ addi r0, r4, lbl_803E85E8@l

View File

@ -20458,7 +20458,7 @@ lbl_800D7B64:
/* 800D7BFC 000D4B5C 91 81 00 24 */ stw r12, 0x24(r1) /* 800D7BFC 000D4B5C 91 81 00 24 */ stw r12, 0x24(r1)
/* 800D7C00 000D4B60 91 61 00 28 */ stw r11, 0x28(r1) /* 800D7C00 000D4B60 91 61 00 28 */ stw r11, 0x28(r1)
/* 800D7C04 000D4B64 90 01 00 2C */ stw r0, 0x2c(r1) /* 800D7C04 000D4B64 90 01 00 2C */ stw r0, 0x2c(r1)
/* 800D7C08 000D4B68 4B F9 DC A5 */ bl "__ct__12CScriptActorF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC6CAABoxRC13CMaterialListffRC11CHealthInfoRC20CDamageVulnerabilityRC16CActorParametersbbUibbbb" /* 800D7C08 000D4B68 4B F9 DC A5 */ bl "__ct__12CScriptActorF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC6CAABoxRC13CMaterialListffRC11CHealthInfoRC20CDamageVulnerabilityRC16CActorParametersbbUifbbbb"
/* 800D7C0C 000D4B6C 7C 70 1B 78 */ mr r16, r3 /* 800D7C0C 000D4B6C 7C 70 1B 78 */ mr r16, r3
lbl_800D7C10: lbl_800D7C10:
/* 800D7C10 000D4B70 38 61 02 64 */ addi r3, r1, 0x264 /* 800D7C10 000D4B70 38 61 02 64 */ addi r3, r1, 0x264

View File

@ -19,7 +19,7 @@ lbl_803DA450:
.4byte Render__13CPhysicsActorCFRC13CStateManager .4byte Render__13CPhysicsActorCFRC13CStateManager
.4byte CanRenderUnsorted__6CActorCFRC13CStateManager .4byte CanRenderUnsorted__6CActorCFRC13CStateManager
.4byte CalculateRenderBounds__6CActorFv .4byte CalculateRenderBounds__6CActorFv
.4byte GetHealthInfo__12CScriptActorCFRC13CStateManager .4byte HealthInfo__12CScriptActorFR13CStateManager
.4byte GetDamageVulnerability__12CScriptActorCFv .4byte GetDamageVulnerability__12CScriptActorCFv
.4byte GetDamageVulnerability__6CActorCFRC9CVector3fRC9CVector3fRC11CDamageInfo .4byte GetDamageVulnerability__6CActorCFRC9CVector3fRC9CVector3fRC11CDamageInfo
.4byte GetTouchBounds__12CScriptActorCFv .4byte GetTouchBounds__12CScriptActorCFv
@ -28,7 +28,7 @@ lbl_803DA450:
.4byte GetAimPosition__13CPhysicsActorCFRC13CStateManagerf .4byte GetAimPosition__13CPhysicsActorCFRC13CStateManagerf
.4byte GetHomingPosition__6CActorCFRC13CStateManagerf .4byte GetHomingPosition__6CActorCFRC13CStateManagerf
.4byte GetScanObjectIndicatorPosition__6CActorCFRC13CStateManager .4byte GetScanObjectIndicatorPosition__6CActorCFRC13CStateManager
.4byte GetCollisionResponseType__12CScriptActorCFRC9CVector3fRC9CVector3fRC11CWeaponModei .4byte GetCollisionResponseType__12CScriptActorCFRC9CVector3fRC9CVector3fRC11CWeaponMode17EProjectileAttrib
.4byte FluidFXThink__6CActorFQ26CActor11EFluidStateR12CScriptWaterR13CStateManager .4byte FluidFXThink__6CActorFQ26CActor11EFluidStateR12CScriptWaterR13CStateManager
.4byte OnScanStateChange__6CActorFQ26CActor10EScanStateR13CStateManager .4byte OnScanStateChange__6CActorFQ26CActor10EScanStateR13CStateManager
.4byte GetSortingBounds__12CScriptActorCFRC13CStateManager .4byte GetSortingBounds__12CScriptActorCFRC13CStateManager
@ -115,8 +115,8 @@ lbl_80074FC8:
/* 80074FDC 00071F3C 38 21 00 20 */ addi r1, r1, 0x20 /* 80074FDC 00071F3C 38 21 00 20 */ addi r1, r1, 0x20
/* 80074FE0 00071F40 4E 80 00 20 */ blr /* 80074FE0 00071F40 4E 80 00 20 */ blr
.global GetCollisionResponseType__12CScriptActorCFRC9CVector3fRC9CVector3fRC11CWeaponModei .global GetCollisionResponseType__12CScriptActorCFRC9CVector3fRC9CVector3fRC11CWeaponMode17EProjectileAttrib
GetCollisionResponseType__12CScriptActorCFRC9CVector3fRC9CVector3fRC11CWeaponModei: GetCollisionResponseType__12CScriptActorCFRC9CVector3fRC9CVector3fRC11CWeaponMode17EProjectileAttrib:
/* 80074FE4 00071F44 94 21 FF E0 */ stwu r1, -0x20(r1) /* 80074FE4 00071F44 94 21 FF E0 */ stwu r1, -0x20(r1)
/* 80074FE8 00071F48 7C 08 02 A6 */ mflr r0 /* 80074FE8 00071F48 7C 08 02 A6 */ mflr r0
/* 80074FEC 00071F4C 90 01 00 24 */ stw r0, 0x24(r1) /* 80074FEC 00071F4C 90 01 00 24 */ stw r0, 0x24(r1)
@ -710,8 +710,8 @@ GetDamageVulnerability__12CScriptActorCFv:
/* 8007583C 0007279C 38 63 02 68 */ addi r3, r3, 0x268 /* 8007583C 0007279C 38 63 02 68 */ addi r3, r3, 0x268
/* 80075840 000727A0 4E 80 00 20 */ blr /* 80075840 000727A0 4E 80 00 20 */ blr
.global GetHealthInfo__12CScriptActorCFRC13CStateManager .global HealthInfo__12CScriptActorFR13CStateManager
GetHealthInfo__12CScriptActorCFRC13CStateManager: HealthInfo__12CScriptActorFR13CStateManager:
/* 80075844 000727A4 38 63 02 60 */ addi r3, r3, 0x260 /* 80075844 000727A4 38 63 02 60 */ addi r3, r3, 0x260
/* 80075848 000727A8 4E 80 00 20 */ blr /* 80075848 000727A8 4E 80 00 20 */ blr
@ -743,8 +743,8 @@ lbl_80075890:
/* 800758A4 00072804 38 21 00 10 */ addi r1, r1, 0x10 /* 800758A4 00072804 38 21 00 10 */ addi r1, r1, 0x10
/* 800758A8 00072808 4E 80 00 20 */ blr /* 800758A8 00072808 4E 80 00 20 */ blr
.global "__ct__12CScriptActorF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC6CAABoxRC13CMaterialListffRC11CHealthInfoRC20CDamageVulnerabilityRC16CActorParametersbbUibbbb" .global "__ct__12CScriptActorF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC6CAABoxRC13CMaterialListffRC11CHealthInfoRC20CDamageVulnerabilityRC16CActorParametersbbUifbbbb"
"__ct__12CScriptActorF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC6CAABoxRC13CMaterialListffRC11CHealthInfoRC20CDamageVulnerabilityRC16CActorParametersbbUibbbb": "__ct__12CScriptActorF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC6CAABoxRC13CMaterialListffRC11CHealthInfoRC20CDamageVulnerabilityRC16CActorParametersbbUifbbbb":
/* 800758AC 0007280C 94 21 FF 30 */ stwu r1, -0xd0(r1) /* 800758AC 0007280C 94 21 FF 30 */ stwu r1, -0xd0(r1)
/* 800758B0 00072810 7C 08 02 A6 */ mflr r0 /* 800758B0 00072810 7C 08 02 A6 */ mflr r0
/* 800758B4 00072814 90 01 00 D4 */ stw r0, 0xd4(r1) /* 800758B4 00072814 90 01 00 D4 */ stw r0, 0xd4(r1)

View File

@ -19,7 +19,7 @@ lbl_803E4BE0:
.4byte Render__18CScriptPlayerActorCFRC13CStateManager .4byte Render__18CScriptPlayerActorCFRC13CStateManager
.4byte CanRenderUnsorted__6CActorCFRC13CStateManager .4byte CanRenderUnsorted__6CActorCFRC13CStateManager
.4byte CalculateRenderBounds__6CActorFv .4byte CalculateRenderBounds__6CActorFv
.4byte GetHealthInfo__12CScriptActorCFRC13CStateManager .4byte HealthInfo__12CScriptActorFR13CStateManager
.4byte GetDamageVulnerability__12CScriptActorCFv .4byte GetDamageVulnerability__12CScriptActorCFv
.4byte GetDamageVulnerability__6CActorCFRC9CVector3fRC9CVector3fRC11CDamageInfo .4byte GetDamageVulnerability__6CActorCFRC9CVector3fRC9CVector3fRC11CDamageInfo
.4byte GetTouchBounds__12CScriptActorCFv .4byte GetTouchBounds__12CScriptActorCFv
@ -28,7 +28,7 @@ lbl_803E4BE0:
.4byte GetAimPosition__13CPhysicsActorCFRC13CStateManagerf .4byte GetAimPosition__13CPhysicsActorCFRC13CStateManagerf
.4byte GetHomingPosition__6CActorCFRC13CStateManagerf .4byte GetHomingPosition__6CActorCFRC13CStateManagerf
.4byte GetScanObjectIndicatorPosition__6CActorCFRC13CStateManager .4byte GetScanObjectIndicatorPosition__6CActorCFRC13CStateManager
.4byte GetCollisionResponseType__12CScriptActorCFRC9CVector3fRC9CVector3fRC11CWeaponModei .4byte GetCollisionResponseType__12CScriptActorCFRC9CVector3fRC9CVector3fRC11CWeaponMode17EProjectileAttrib
.4byte FluidFXThink__6CActorFQ26CActor11EFluidStateR12CScriptWaterR13CStateManager .4byte FluidFXThink__6CActorFQ26CActor11EFluidStateR12CScriptWaterR13CStateManager
.4byte OnScanStateChange__6CActorFQ26CActor10EScanStateR13CStateManager .4byte OnScanStateChange__6CActorFQ26CActor10EScanStateR13CStateManager
.4byte GetSortingBounds__12CScriptActorCFRC13CStateManager .4byte GetSortingBounds__12CScriptActorCFRC13CStateManager
@ -2235,7 +2235,7 @@ lbl_801ABFAC:
/* 801AC054 001A8FB4 90 01 00 24 */ stw r0, 0x24(r1) /* 801AC054 001A8FB4 90 01 00 24 */ stw r0, 0x24(r1)
/* 801AC058 001A8FB8 90 01 00 28 */ stw r0, 0x28(r1) /* 801AC058 001A8FB8 90 01 00 28 */ stw r0, 0x28(r1)
/* 801AC05C 001A8FBC 90 01 00 2C */ stw r0, 0x2c(r1) /* 801AC05C 001A8FBC 90 01 00 2C */ stw r0, 0x2c(r1)
/* 801AC060 001A8FC0 4B EC 98 4D */ bl "__ct__12CScriptActorF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC6CAABoxRC13CMaterialListffRC11CHealthInfoRC20CDamageVulnerabilityRC16CActorParametersbbUibbbb" /* 801AC060 001A8FC0 4B EC 98 4D */ bl "__ct__12CScriptActorF9TUniqueIdRCQ24rstl66basic_string<c,Q24rstl14char_traits<c>,Q24rstl17rmemory_allocator>RC11CEntityInfoRC12CTransform4fRC10CModelDataRC6CAABoxRC13CMaterialListffRC11CHealthInfoRC20CDamageVulnerabilityRC16CActorParametersbbUifbbbb"
/* 801AC064 001A8FC4 3C 60 80 3E */ lis r3, lbl_803E4BE0@ha /* 801AC064 001A8FC4 3C 60 80 3E */ lis r3, lbl_803E4BE0@ha
/* 801AC068 001A8FC8 38 00 FF FF */ li r0, -1 /* 801AC068 001A8FC8 38 00 FF FF */ li r0, -1
/* 801AC06C 001A8FCC 38 63 4B E0 */ addi r3, r3, lbl_803E4BE0@l /* 801AC06C 001A8FCC 38 63 4B E0 */ addi r3, r3, lbl_803E4BE0@l

View File

@ -61,6 +61,8 @@ public:
return CColor((mRgba & ~0xff) | CCast::ToUint8(a * static_cast< float >(mA))); return CColor((mRgba & ~0xff) | CCast::ToUint8(a * static_cast< float >(mA)));
} }
bool operator==(const CColor& other) { return mRgba == other.mRgba; }
// TODO check // TODO check
static GXColor ToGX(uint c) { return *reinterpret_cast< const GXColor* >(&c); } static GXColor ToGX(uint c) { return *reinterpret_cast< const GXColor* >(&c); }

View File

@ -105,4 +105,9 @@ private:
}; };
CHECK_SIZEOF(CModelFlags, 0x8) CHECK_SIZEOF(CModelFlags, 0x8)
static inline bool operator==(const CModelFlags& lhs, const CModelFlags& rhs) {
return lhs.GetTrans() == rhs.GetTrans() && lhs.GetShaderSet() == rhs.GetShaderSet() &&
lhs.GetOtherFlags() == rhs.GetOtherFlags() && lhs.GetColor() == rhs.GetColor();
}
#endif // _CMODELFLAGS #endif // _CMODELFLAGS

View File

@ -147,6 +147,15 @@ inline CVector3f operator+(const CVector3f& lhs, const CVector3f& rhs) {
float z = lhs.GetZ() + rhs.GetZ(); float z = lhs.GetZ() + rhs.GetZ();
return CVector3f(x, y, z); return CVector3f(x, y, z);
} }
// TODO real?
inline CVector3f operator*(const CVector3f& lhs, const CVector3f& rhs) {
float x = lhs.GetX() * rhs.GetX();
float y = lhs.GetY() * rhs.GetY();
float z = lhs.GetZ() * rhs.GetZ();
return CVector3f(x, y, z);
}
inline CVector3f operator*(const CVector3f& vec, const float f) { inline CVector3f operator*(const CVector3f& vec, const float f) {
float x = vec.GetX() * f; float x = vec.GetX() * f;
float y = vec.GetY() * f; float y = vec.GetY() * f;

View File

@ -311,7 +311,11 @@ public:
bool GetDrawShadow() const { return xe5_24_shadowEnabled; } bool GetDrawShadow() const { return xe5_24_shadowEnabled; }
bool GetShadowDirty() const { return xe5_25_shadowDirty; } bool GetShadowDirty() const { return xe5_25_shadowDirty; }
bool GetMuted() const { return xe5_26_muted; } bool GetMuted() const { return xe5_26_muted; }
EThermalFlags GetThermalFlags() const {
return static_cast< EThermalFlags >(xe6_27_thermalVisorFlags);
}
bool GetRenderParticleDatabaseInside() const { return xe6_29_renderParticleDBInside; } bool GetRenderParticleDatabaseInside() const { return xe6_29_renderParticleDBInside; }
bool GetTargetable() const { return xe7_31_targetable; }
void SetTransformDirty(bool b) { xe4_27_notInSortedLists = b; } void SetTransformDirty(bool b) { xe4_27_notInSortedLists = b; }
void SetTransformDirtySpare(bool b) { xe4_28_transformDirty = b; } void SetTransformDirtySpare(bool b) { xe4_28_transformDirty = b; }
@ -322,6 +326,7 @@ public:
void SetShadowDirty(bool b) { xe5_25_shadowDirty = b; } void SetShadowDirty(bool b) { xe5_25_shadowDirty = b; }
void SetMuted(bool b) { xe5_26_muted = b; } void SetMuted(bool b) { xe5_26_muted = b; }
void SetRenderParticleDatabaseInside(bool b) { xe6_29_renderParticleDBInside = b; } void SetRenderParticleDatabaseInside(bool b) { xe6_29_renderParticleDBInside = b; }
void SetTargetable(bool b) { xe7_31_targetable = b; }
void RemoveMaterial(EMaterialTypes, EMaterialTypes, EMaterialTypes, EMaterialTypes, void RemoveMaterial(EMaterialTypes, EMaterialTypes, EMaterialTypes, EMaterialTypes,
CStateManager&); CStateManager&);
@ -334,9 +339,7 @@ public:
void AddMaterial(EMaterialTypes, EMaterialTypes, EMaterialTypes, CStateManager&); void AddMaterial(EMaterialTypes, EMaterialTypes, EMaterialTypes, CStateManager&);
void AddMaterial(EMaterialTypes, EMaterialTypes, CStateManager&); void AddMaterial(EMaterialTypes, EMaterialTypes, CStateManager&);
void AddMaterial(EMaterialTypes, CStateManager&); void AddMaterial(EMaterialTypes, CStateManager&);
void AddMaterial(const CMaterialList& l) { void AddMaterial(const CMaterialList& l) { x68_material.Add(l); }
x68_material.Add(l);
}
const CAABox& GetRenderBoundsCached() const { return x9c_renderBounds; } const CAABox& GetRenderBoundsCached() const { return x9c_renderBounds; }
void SetRenderBounds(const CAABox& bounds) { x9c_renderBounds = bounds; } void SetRenderBounds(const CAABox& bounds) { x9c_renderBounds = bounds; }
@ -353,7 +356,7 @@ public:
// HasModelParticles__6CActorCFv // HasModelParticles__6CActorCFv
protected: private:
CTransform4f x34_transform; CTransform4f x34_transform;
rstl::single_ptr< CModelData > x64_modelData; rstl::single_ptr< CModelData > x64_modelData;
CMaterialList x68_material; CMaterialList x68_material;
@ -389,7 +392,7 @@ protected:
uint xe5_30_renderUnsorted : 1; uint xe5_30_renderUnsorted : 1;
uint xe5_31_pointGeneratorParticles : 1; uint xe5_31_pointGeneratorParticles : 1;
uint xe6_24_fluidCounter : 3; uint xe6_24_fluidCounter : 3;
EThermalFlags xe6_27_thermalVisorFlags : 2; uint xe6_27_thermalVisorFlags : 2;
uint xe6_29_renderParticleDBInside : 1; uint xe6_29_renderParticleDBInside : 1;
uint xe6_30_enablePitchBend : 1; uint xe6_30_enablePitchBend : 1;
uint xe6_31_targetableVisorFlags : 4; uint xe6_31_targetableVisorFlags : 4;

View File

@ -172,7 +172,7 @@ enum EScriptObjectState {
kSS_UnFrozen = 29, kSS_UnFrozen = 29,
kSS_Default = 30, kSS_Default = 30,
kSS_ReflectedDamage = 31, kSS_ReflectedDamage = 31,
InheritBounds = 32 kSS_InheritBounds = 32,
}; };
enum EScriptObjectMessage { enum EScriptObjectMessage {

View File

@ -0,0 +1,16 @@
#ifndef _CCINEMATICCAMERA
#define _CCINEMATICCAMERA
#include "types.h"
#include "MetroidPrime/Cameras/CGameCamera.hpp"
class CCinematicCamera : public CGameCamera {
public:
// TODO
private:
// TODO
};
#endif // _CCINEMATICCAMERA

View File

@ -0,0 +1,60 @@
#ifndef _CSCRIPTACTOR
#define _CSCRIPTACTOR
#include "types.h"
#include "MetroidPrime/CDamageVulnerability.hpp"
#include "MetroidPrime/CHealthInfo.hpp"
#include "MetroidPrime/CPhysicsActor.hpp"
class CActorParameters;
class CScriptActor : public CPhysicsActor {
public:
CScriptActor(TUniqueId uid, const rstl::string& name, const CEntityInfo& info,
const CTransform4f& xf, const CModelData& mData, const CAABox& aabb,
const CMaterialList& matList, float mass, float zMomentum, const CHealthInfo& hInfo,
const CDamageVulnerability& dVuln, const CActorParameters& actParms, bool looping,
bool active, uint shaderIdx, float xrayAlpha, bool noThermalHotZ, bool castsShadow,
bool scaleAdvancementDelta, bool materialFlag54);
// CEntity
~CScriptActor() override;
void Accept(IVisitor& visitor) override;
void Think(float dt, CStateManager& mgr) override;
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override;
// CActor
void PreRender(CStateManager&, const CFrustumPlanes&) override;
CHealthInfo* HealthInfo(CStateManager&) override;
const CDamageVulnerability* GetDamageVulnerability() const override;
rstl::optional_object< CAABox > GetTouchBounds() const override;
void Touch(CActor&, CStateManager&) override;
// CPhysicsActor
EWeaponCollisionResponseTypes GetCollisionResponseType(const CVector3f&, const CVector3f&,
const CWeaponMode&,
EProjectileAttrib) const override;
CAABox GetSortingBounds(const CStateManager&) const override;
private:
CHealthInfo x258_initialHealth;
CHealthInfo x260_currentHealth;
CDamageVulnerability x268_damageVulnerability;
float x2d0_fadeInTime;
float x2d4_fadeOutTime;
int x2d8_shaderIdx;
float x2dc_xrayAlpha;
TUniqueId x2e0_triggerId;
bool x2e2_24_noThermalHotZ : 1;
bool x2e2_25_dead : 1;
bool x2e2_26_animating : 1;
bool x2e2_27_xrayAlphaEnabled : 1;
bool x2e2_28_inXrayAlpha : 1;
bool x2e2_29_processModelFlags : 1;
bool x2e2_30_scaleAdvancementDelta : 1;
bool x2e2_31_materialFlag54 : 1;
bool x2e3_24_isPlayerActor : 1;
};
#endif // _CSCRIPTACTOR

View File

@ -0,0 +1,19 @@
#ifndef _CSCRIPTCOLORMODULATE
#define _CSCRIPTCOLORMODULATE
#include "types.h"
#include "MetroidPrime/CEntity.hpp"
class CScriptColorModulate : public CEntity {
public:
// TODO
static TUniqueId FadeOutHelper(CStateManager& mgr, TUniqueId obj, float fadetime);
static TUniqueId FadeInHelper(CStateManager& mgr, TUniqueId obj, float fadetime);
private:
// TODO
};
#endif // _CSCRIPTCOLORMODULATE

View File

@ -75,12 +75,14 @@ public:
struct const_iterator { struct const_iterator {
node* mNode; node* mNode;
const header* mHeader; const header* mHeader;
bool x8_; // bool x8_;
// TODO why is this bool here?
const_iterator(node* node, const header* header, bool b) const_iterator(node* node, const header* header, bool b)
: mNode(node), mHeader(header), x8_(b) {} : mNode(node), mHeader(header)/*, x8_(b)*/ {}
const P* operator->() const { return mNode->get_value(); } const P* operator->() const { return mNode->get_value(); }
const P* operator*() const { return mNode->get_value(); }
bool operator==(const const_iterator& other) const { bool operator==(const const_iterator& other) const {
return mNode == other.mNode && mHeader == other.mHeader; return mNode == other.mNode && mHeader == other.mHeader;
} }

View File

@ -29,10 +29,10 @@ void CGameLight::SetLight(const CLight& light) {
CLight CGameLight::GetLight() const { CLight CGameLight::GetLight() const {
CLight ret = xec_light; CLight ret = xec_light;
ret.SetPosition(x34_transform * xec_light.GetPosition()); ret.SetPosition(GetTransform() * xec_light.GetPosition());
if (ret.GetType() != kLT_Point) if (ret.GetType() != kLT_Point)
ret.SetDirection(x34_transform.Rotate(xec_light.GetDirection()).AsNormalized()); ret.SetDirection(GetTransform().Rotate(xec_light.GetDirection()).AsNormalized());
return ret; return ret;
} }

View File

@ -0,0 +1,231 @@
#include "MetroidPrime/ScriptObjects/CScriptActor.hpp"
#include "MetroidPrime/CActorParameters.hpp"
#include "MetroidPrime/CAnimData.hpp"
#include "MetroidPrime/Cameras/CCameraManager.hpp"
#include "MetroidPrime/Cameras/CCinematicCamera.hpp"
#include "MetroidPrime/Player/CPlayerState.hpp"
#include "MetroidPrime/ScriptObjects/CScriptColorModulate.hpp"
#include "MetroidPrime/ScriptObjects/CScriptTrigger.hpp"
#include "Kyoto/Math/CloseEnough.hpp"
CScriptActor::CScriptActor(TUniqueId uid, const rstl::string& name, const CEntityInfo& info,
const CTransform4f& xf, const CModelData& mData, const CAABox& aabb,
const CMaterialList& matList, float mass, float zMomentum,
const CHealthInfo& hInfo, const CDamageVulnerability& dVuln,
const CActorParameters& actParms, bool looping, bool active,
uint shaderIdx, float xrayAlpha, bool noThermalHotZ, bool castsShadow,
bool scaleAdvancementDelta, bool materialFlag54)
: CPhysicsActor(uid, active, name, info, xf, mData, matList, aabb, SMoverData(mass), actParms, 0.3f,
0.1f)
, x258_initialHealth(hInfo)
, x260_currentHealth(hInfo)
, x268_damageVulnerability(dVuln)
, x2d0_fadeInTime(actParms.GetFadeInTime())
, x2d4_fadeOutTime(actParms.GetFadeOutTime())
, x2d8_shaderIdx(shaderIdx)
, x2dc_xrayAlpha(xrayAlpha)
, x2e0_triggerId(kInvalidUniqueId)
, x2e2_24_noThermalHotZ(noThermalHotZ)
, x2e2_25_dead(false)
, x2e2_26_animating(true)
, x2e2_27_xrayAlphaEnabled(!close_enough(xrayAlpha, 1.f))
, x2e2_28_inXrayAlpha(false)
, x2e2_29_processModelFlags(x2e2_27_xrayAlphaEnabled || x2e2_24_noThermalHotZ ||
x2d8_shaderIdx != 0)
, x2e2_30_scaleAdvancementDelta(scaleAdvancementDelta)
, x2e2_31_materialFlag54(materialFlag54)
, x2e3_24_isPlayerActor(false) {
if (HasModelData()) {
if (castsShadow) {
CreateShadow(true);
}
if (HasAnimation()) {
ModelData()->EnableLooping(looping);
}
}
SetMomentumWR(CVector3f(0.f, 0.f, -zMomentum));
}
CScriptActor::~CScriptActor() {}
CHealthInfo* CScriptActor::HealthInfo(CStateManager&) { return &x260_currentHealth; }
const CDamageVulnerability* CScriptActor::GetDamageVulnerability() const override {
return &x268_damageVulnerability;
}
void CScriptActor::Touch(CActor&, CStateManager&) {}
rstl::optional_object< CAABox > CScriptActor::GetTouchBounds() const {
if (GetActive() && GetMaterialList().HasMaterial(kMT_Solid)) {
return CPhysicsActor::GetBoundingBox();
}
return rstl::optional_object_null();
}
void CScriptActor::Think(float dt, CStateManager& mgr) {
if (!GetActive()) {
return;
}
if (HasAnimation()) {
const bool timeRemaining =
GetAnimationData()->IsAnimTimeRemaining(dt - FLT_EPSILON, rstl::string_l("Whole Body"));
const bool loop = GetModelData()->GetIsLoop();
const CAdvancementDeltas deltas = CActor::UpdateAnimation(dt, mgr, true);
if (timeRemaining || loop) {
x2e2_26_animating = true;
if (x2e2_30_scaleAdvancementDelta) {
CVector3f rot = GetTransform().TransposeRotate(deltas.GetOffsetDelta());
CVector3f scale = GetModelData()->GetScale();
// CVector3f ret = GetTransform().Rotate(scale * rot);
CVector3f ret = GetTransform().Rotate(CVector3f(
scale.GetX() * rot.GetX(), scale.GetY() * rot.GetY(), scale.GetZ() * rot.GetZ()));
MoveToOR(ret, dt);
} else {
MoveToOR(deltas.GetOffsetDelta(), dt);
}
RotateToOR(deltas.GetOrientationDelta(), dt);
}
if (!timeRemaining && x2e2_26_animating && !loop) {
SendScriptMsgs(kSS_MaxReached, mgr, kSM_None);
x2e2_26_animating = false;
}
}
if (!x2e2_25_dead && HealthInfo(mgr)->GetHP() <= 0.f) {
x2e2_25_dead = true;
SendScriptMsgs(kSS_Dead, mgr, kSM_None);
}
}
void CScriptActor::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) {
switch (msg) {
case kSM_InitializedInArea: {
rstl::vector< SConnection >::const_iterator conn = GetConnectionList().begin();
for (; conn != GetConnectionList().end(); ++conn) {
if (conn->x0_state != kSS_InheritBounds || conn->x4_msg != kSM_Activate) {
continue;
}
CStateManager::TIdListResult search = mgr.GetIdListForScript(conn->x8_objId);
CStateManager::TIdList::const_iterator current = search.first;
CStateManager::TIdList::const_iterator end = search.second;
while (current != end) {
if (TCastToConstPtr< CScriptTrigger >(mgr.GetObjectById(current->second))) {
x2e0_triggerId = current->second;
}
current++;
}
}
if (x2e2_31_materialFlag54) {
CActor::AddMaterial(kMT_Unknown54, mgr);
}
break;
}
case kSM_Reset: {
x2e2_25_dead = false;
x260_currentHealth = x258_initialHealth;
break;
}
case kSM_Increment: {
if (!GetActive()) {
mgr.SendScriptMsg(this, GetUniqueId(), kSM_Activate);
CScriptColorModulate::FadeInHelper(mgr, GetUniqueId(), x2d0_fadeInTime);
}
break;
}
case kSM_Decrement: {
CScriptColorModulate::FadeOutHelper(mgr, GetUniqueId(), x2d4_fadeOutTime);
break;
}
default:
break;
}
CActor::AcceptScriptMsg(msg, uid, mgr);
}
void CScriptActor::PreRender(CStateManager& mgr, const CFrustumPlanes& frustum) {
CActor::PreRender(mgr, frustum);
if (GetPreRenderClipped() &&
TCastToConstPtr< CCinematicCamera >(mgr.GetCameraManager()->GetCurrentCamera(mgr))) {
SetPreRenderClipped(false);
}
if (!GetPreRenderClipped() && x2e2_29_processModelFlags) {
if (x2e2_27_xrayAlphaEnabled) {
CModelFlags xrayFlags = CModelFlags::AlphaBlended(x2dc_xrayAlpha);
if (mgr.GetPlayerState()->GetActiveVisor(mgr) == CPlayerState::kPV_XRay) {
SetModelFlags(xrayFlags);
x2e2_28_inXrayAlpha = true;
} else if (x2e2_28_inXrayAlpha) {
x2e2_28_inXrayAlpha = false;
if (GetModelFlags() == xrayFlags) {
SetModelFlags(CModelFlags::Normal());
}
}
}
if (x2e2_24_noThermalHotZ && GetThermalFlags() == kTF_Hot) {
if (mgr.GetPlayerState()->GetActiveVisor(mgr) == CPlayerState::kPV_Thermal) {
SetModelFlags(GetModelFlags().DepthCompareUpdate(false, false));
} else {
SetModelFlags(GetModelFlags().DepthCompareUpdate(true, true));
}
}
if (x2d8_shaderIdx != 0) {
SetModelFlags(GetModelFlags().UseShaderSet(x2d8_shaderIdx));
}
}
if (mgr.GetObjectById(x2e0_triggerId) == nullptr) {
x2e0_triggerId = kInvalidUniqueId;
}
}
void CScriptActor::Accept(IVisitor& visitor) override { visitor.Visit(*this); }
EWeaponCollisionResponseTypes CScriptActor::GetCollisionResponseType(const CVector3f& v1,
const CVector3f& v2,
const CWeaponMode& wMode,
EProjectileAttrib w) const {
const CDamageVulnerability* dVuln = GetDamageVulnerability();
if (dVuln->GetVulnerability(wMode, false) == kVN_Deflect) {
const EDeflectionType deflectType = dVuln->GetDeflectionType(wMode);
switch (deflectType) {
case kDT_One:
case kDT_Two:
case kDT_Three:
return kWCR_Unknown15;
default:
break;
}
}
return CActor::GetCollisionResponseType(v1, v2, wMode, w);
}
CAABox CScriptActor::GetSortingBounds(const CStateManager& mgr) const {
if (x2e0_triggerId != kInvalidUniqueId) {
const CScriptTrigger* trigger =
static_cast< const CScriptTrigger* >(mgr.GetObjectById(x2e0_triggerId));
if (trigger) {
return trigger->GetTriggerBoundsWR();
}
}
return CActor::GetSortingBounds(mgr);
}

View File

@ -14,7 +14,6 @@ CScriptBeam::CScriptBeam(TUniqueId uid, const rstl::string& name, const CEntityI
, x138_damageInfo(dInfo) , x138_damageInfo(dInfo)
, x154_projectileId(kInvalidUniqueId) {} , x154_projectileId(kInvalidUniqueId) {}
void CScriptBeam::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& mgr) { void CScriptBeam::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& mgr) {
switch (msg) { switch (msg) {
@ -22,7 +21,7 @@ void CScriptBeam::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CSt
x154_projectileId = mgr.AllocateUniqueId(); x154_projectileId = mgr.AllocateUniqueId();
mgr.AddObject(new CPlasmaProjectile( mgr.AddObject(new CPlasmaProjectile(
xe8_weaponDescription, GetDebugName() + rstl::string_l("-Projectile"), xe8_weaponDescription, GetDebugName() + rstl::string_l("-Projectile"),
x138_damageInfo.GetWeaponMode().GetType(), xf4_beamInfo, x34_transform, kMT_Projectile, x138_damageInfo.GetWeaponMode().GetType(), xf4_beamInfo, GetTransform(), kMT_Projectile,
x138_damageInfo, x154_projectileId, GetCurrentAreaId(), GetUniqueId(), x138_damageInfo, x154_projectileId, GetCurrentAreaId(), GetUniqueId(),
CPlasmaProjectile::PlayerEffectResources(), false, CPlasmaProjectile::PlayerEffectResources(), false,
kPA_KeepInCinematic // TODO: wrong attrib definition? kPA_KeepInCinematic // TODO: wrong attrib definition?
@ -58,7 +57,7 @@ void CScriptBeam::Think(float dt, CStateManager& mgr) {
if (CPlasmaProjectile* proj = if (CPlasmaProjectile* proj =
static_cast< CPlasmaProjectile* >(mgr.ObjectById(x154_projectileId))) { static_cast< CPlasmaProjectile* >(mgr.ObjectById(x154_projectileId))) {
if (proj->GetActive()) { if (proj->GetActive()) {
proj->UpdateFx(x34_transform, dt, mgr); proj->UpdateFx(GetTransform(), dt, mgr);
} }
} else { } else {
x154_projectileId = kInvalidUniqueId; x154_projectileId = kInvalidUniqueId;

View File

@ -7,8 +7,8 @@ CScriptGrapplePoint::CScriptGrapplePoint(TUniqueId uid, const rstl::string& name
bool active, const CGrappleParameters& params) bool active, const CGrappleParameters& params)
: CActor(uid, active, name, info, xf, CModelData::CModelDataNull(), CMaterialList(kMT_Orbit), : CActor(uid, active, name, info, xf, CModelData::CModelDataNull(), CMaterialList(kMT_Orbit),
CActorParameters::None(), kInvalidUniqueId) CActorParameters::None(), kInvalidUniqueId)
, xe8_touchBounds(x34_transform.GetTranslation() - CVector3f(0.5f, 0.5f, 0.5f), , xe8_touchBounds(GetTranslation() - CVector3f(0.5f, 0.5f, 0.5f),
x34_transform.GetTranslation() + CVector3f(0.5f, 0.5f, 0.5f)) GetTranslation() + CVector3f(0.5f, 0.5f, 0.5f))
, x100_parameters(params) {} , x100_parameters(params) {}
CScriptGrapplePoint::~CScriptGrapplePoint() {} CScriptGrapplePoint::~CScriptGrapplePoint() {}

View File

@ -21,7 +21,7 @@ void CScriptPointOfInterest::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId
} }
rstl::optional_object< CAABox > CScriptPointOfInterest::GetTouchBounds() const { rstl::optional_object< CAABox > CScriptPointOfInterest::GetTouchBounds() const {
return CAABox(x34_transform.GetTranslation(), x34_transform.GetTranslation()); return CAABox(GetTranslation(), GetTranslation());
} }
void CScriptPointOfInterest::Render(const CStateManager&) const {} void CScriptPointOfInterest::Render(const CStateManager&) const {}
@ -31,7 +31,7 @@ void CScriptPointOfInterest::AddToRenderer(const CFrustumPlanes&, const CStateMa
void CScriptPointOfInterest::Accept(IVisitor& visitor) { visitor.Visit(*this); } void CScriptPointOfInterest::Accept(IVisitor& visitor) { visitor.Visit(*this); }
void CScriptPointOfInterest::Think(float dt, CStateManager& mgr) { void CScriptPointOfInterest::Think(float dt, CStateManager& mgr) {
xe7_31_targetable = mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::kPV_Scan; SetTargetable(mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::kPV_Scan);
CEntity::Think(dt, mgr); CEntity::Think(dt, mgr);
} }
@ -39,9 +39,8 @@ void CScriptPointOfInterest::CalculateRenderBounds() {
if (xe8_pointSize == 0.f) { if (xe8_pointSize == 0.f) {
CActor::CalculateRenderBounds(); CActor::CalculateRenderBounds();
} else { } else {
CVector3f origin = x34_transform.GetTranslation(); CVector3f origin = GetTranslation();
x9c_renderBounds = CAABox( SetRenderBounds(CAABox(origin - CVector3f(xe8_pointSize, xe8_pointSize, xe8_pointSize),
origin - CVector3f(xe8_pointSize, xe8_pointSize, xe8_pointSize), origin + CVector3f(xe8_pointSize, xe8_pointSize, xe8_pointSize)));
origin + CVector3f(xe8_pointSize, xe8_pointSize, xe8_pointSize));
} }
} }

View File

@ -3,10 +3,10 @@
#include "MetroidPrime/CActorParameters.hpp" #include "MetroidPrime/CActorParameters.hpp"
#include "MetroidPrime/CDamageVulnerability.hpp" #include "MetroidPrime/CDamageVulnerability.hpp"
#include "MetroidPrime/CStateManager.hpp" #include "MetroidPrime/CStateManager.hpp"
#include "MetroidPrime/Player/CPlayer.hpp"
#include "MetroidPrime/Weapons/CWeapon.hpp"
#include "MetroidPrime/Cameras/CCameraManager.hpp" #include "MetroidPrime/Cameras/CCameraManager.hpp"
#include "MetroidPrime/Cameras/CGameCamera.hpp" #include "MetroidPrime/Cameras/CGameCamera.hpp"
#include "MetroidPrime/Player/CPlayer.hpp"
#include "MetroidPrime/Weapons/CWeapon.hpp"
CScriptTrigger::CScriptTrigger(TUniqueId uid, const rstl::string& name, const CEntityInfo& info, CScriptTrigger::CScriptTrigger(TUniqueId uid, const rstl::string& name, const CEntityInfo& info,
const CVector3f& pos, const CAABox& bounds, const CDamageInfo& dInfo, const CVector3f& pos, const CAABox& bounds, const CDamageInfo& dInfo,
@ -132,8 +132,8 @@ void CScriptTrigger::Touch(CActor& act, CStateManager& mgr) {
} }
CAABox CScriptTrigger::GetTriggerBoundsWR() const { CAABox CScriptTrigger::GetTriggerBoundsWR() const {
return CAABox(x130_bounds.GetMinPoint() + x34_transform.GetTranslation(), return CAABox(x130_bounds.GetMinPoint() + GetTranslation(),
x130_bounds.GetMaxPoint() + x34_transform.GetTranslation()); x130_bounds.GetMaxPoint() + GetTranslation());
} }
rstl::optional_object< CAABox > CScriptTrigger::GetTouchBounds() const override { rstl::optional_object< CAABox > CScriptTrigger::GetTouchBounds() const override {
@ -194,7 +194,8 @@ void CScriptTrigger::UpdateInhabitants(float dt, CStateManager& mgr) {
bool sendInside = false; bool sendInside = false;
bool sendExited = false; bool sendExited = false;
rstl::list< CObjectTracker >::iterator nextIt; rstl::list< CObjectTracker >::iterator nextIt;
for (rstl::list<CObjectTracker>::iterator it = xe8_inhabitants.begin(); it != xe8_inhabitants.end(); it = nextIt) { for (rstl::list< CObjectTracker >::iterator it = xe8_inhabitants.begin();
it != xe8_inhabitants.end(); it = nextIt) {
nextIt = it; nextIt = it;
++nextIt; ++nextIt;
if (CActor* act = TCastToPtr< CActor >(mgr.ObjectById(it->GetObjectId()))) { if (CActor* act = TCastToPtr< CActor >(mgr.ObjectById(it->GetObjectId()))) {
@ -229,19 +230,23 @@ void CScriptTrigger::UpdateInhabitants(float dt, CStateManager& mgr) {
rstl::optional_object< CAABox > touchBounds = GetTouchBounds(); rstl::optional_object< CAABox > touchBounds = GetTouchBounds();
rstl::optional_object< CAABox > actTouchBounds = act->GetTouchBounds(); rstl::optional_object< CAABox > actTouchBounds = act->GetTouchBounds();
if (touchBounds.valid() && actTouchBounds.valid() && touchBounds->DoBoundsOverlap(*actTouchBounds)) { if (touchBounds.valid() && actTouchBounds.valid() &&
touchBounds->DoBoundsOverlap(*actTouchBounds)) {
sendInside = true; sendInside = true;
InhabitantIdle(*act, mgr); InhabitantIdle(*act, mgr);
if (act->HealthInfo(mgr) && x100_damageInfo.GetDamage() > 0.f) { if (act->HealthInfo(mgr) && x100_damageInfo.GetDamage() > 0.f) {
// mgr.ApplyDamage(GetUniqueId(), act->GetUniqueId(), GetUniqueId(), {x100_damageInfo, dt}, // mgr.ApplyDamage(GetUniqueId(), act->GetUniqueId(), GetUniqueId(), {x100_damageInfo,
// CMaterialFilter::MakeIncludeExclude({EMaterialTypes::Solid}, {}), zeus::skZero3f); // dt},
// CMaterialFilter::MakeIncludeExclude({EMaterialTypes::Solid}, {}),
// zeus::skZero3f);
} }
if (x128_forceMagnitude > 0.f) { if (x128_forceMagnitude > 0.f) {
if (CPhysicsActor* pact = TCastToPtr< CPhysicsActor >(act)) { if (CPhysicsActor* pact = TCastToPtr< CPhysicsActor >(act)) {
float forceMult = 1.f; float forceMult = 1.f;
if ((x12c_flags & kTFL_UseBooleanIntersection)) { if ((x12c_flags & kTFL_UseBooleanIntersection)) {
forceMult = touchBounds->GetBooleanIntersection(*actTouchBounds).GetVolume() / actTouchBounds->GetVolume(); forceMult = touchBounds->GetBooleanIntersection(*actTouchBounds).GetVolume() /
actTouchBounds->GetVolume();
} }
const CVector3f force = forceMult * x11c_forceField; const CVector3f force = forceMult * x11c_forceField;