summaryrefslogtreecommitdiffstats
path: root/src/modelinfo
diff options
context:
space:
mode:
Diffstat (limited to 'src/modelinfo')
-rw-r--r--src/modelinfo/BaseModelInfo.cpp24
-rw-r--r--src/modelinfo/ClumpModelInfo.cpp101
-rw-r--r--src/modelinfo/MloModelInfo.cpp2
-rw-r--r--src/modelinfo/ModelIndices.cpp9
-rw-r--r--src/modelinfo/ModelIndices.h16
-rw-r--r--src/modelinfo/ModelInfo.cpp19
-rw-r--r--src/modelinfo/ModelInfo.h2
-rw-r--r--src/modelinfo/PedModelInfo.cpp174
-rw-r--r--src/modelinfo/PedModelInfo.h17
-rw-r--r--src/modelinfo/SimpleModelInfo.cpp27
-rw-r--r--src/modelinfo/TimeModelInfo.cpp6
-rw-r--r--src/modelinfo/VehicleModelInfo.cpp78
-rw-r--r--src/modelinfo/VehicleModelInfo.h10
13 files changed, 279 insertions, 206 deletions
diff --git a/src/modelinfo/BaseModelInfo.cpp b/src/modelinfo/BaseModelInfo.cpp
index 830ead51..e8d2601f 100644
--- a/src/modelinfo/BaseModelInfo.cpp
+++ b/src/modelinfo/BaseModelInfo.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "templates.h"
#include "TxdStore.h"
#include "2dEffect.h"
@@ -99,25 +99,3 @@ CBaseModelInfo::Get2dEffect(int n)
else
return nil;
}
-
-
-class CBaseModelInfo_ : public CBaseModelInfo
-{
-public:
- void Shutdown_(void) { CBaseModelInfo::Shutdown(); }
-};
-STARTPATCHES
- // can't easily replace ctor at 4F6A50
- InjectHook(0x4F6A90, &CBaseModelInfo_::Shutdown_, PATCH_JUMP);
-
- InjectHook(0x4F6AC0, &CBaseModelInfo::DeleteCollisionModel, PATCH_JUMP);
- InjectHook(0x4F6B70, &CBaseModelInfo::ClearTexDictionary, PATCH_JUMP);
- InjectHook(0x4F6BA0, &CBaseModelInfo::AddRef, PATCH_JUMP);
- InjectHook(0x4F6BB0, &CBaseModelInfo::RemoveRef, PATCH_JUMP);
- InjectHook(0x4F6B40, &CBaseModelInfo::SetTexDictionary, PATCH_JUMP);
- InjectHook(0x4F6B80, &CBaseModelInfo::AddTexDictionaryRef, PATCH_JUMP);
- InjectHook(0x4F6B90, &CBaseModelInfo::RemoveTexDictionaryRef, PATCH_JUMP);
- InjectHook(0x4F6B20, &CBaseModelInfo::Add2dEffect, PATCH_JUMP);
- InjectHook(0x4F6AF0, &CBaseModelInfo::Init2dEffects, PATCH_JUMP);
- InjectHook(0x4F6B00, &CBaseModelInfo::Get2dEffect, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/modelinfo/ClumpModelInfo.cpp b/src/modelinfo/ClumpModelInfo.cpp
index c6a6d5d0..44faf3c5 100644
--- a/src/modelinfo/ClumpModelInfo.cpp
+++ b/src/modelinfo/ClumpModelInfo.cpp
@@ -1,5 +1,6 @@
#include "common.h"
-#include "patcher.h"
+
+#include "RwHelper.h"
#include "General.h"
#include "NodeName.h"
#include "VisibilityPlugins.h"
@@ -15,12 +16,40 @@ CClumpModelInfo::DeleteRwObject(void)
}
}
+#ifdef PED_SKIN
+static RpAtomic*
+SetHierarchyForSkinAtomic(RpAtomic *atomic, void *data)
+{
+ RpSkinAtomicSetHAnimHierarchy(atomic, (RpHAnimHierarchy*)data);
+ return nil;
+}
+#endif
+
RwObject*
CClumpModelInfo::CreateInstance(void)
{
- if(m_clump)
- return (RwObject*)RpClumpClone(m_clump);
- return nil;
+ if(m_clump == nil)
+ return nil;
+ RpClump *clone = RpClumpClone(m_clump);
+#ifdef PED_SKIN
+ if(IsClumpSkinned(clone)){
+ RpHAnimHierarchy *hier;
+ RpHAnimAnimation *anim;
+
+ hier = GetAnimHierarchyFromClump(clone);
+ assert(hier);
+ // This seems dangerous as only the first atomic will get a hierarchy
+ // can we guarantee this if hands and head are also in the clump?
+ RpClumpForAllAtomics(clone, SetHierarchyForSkinAtomic, hier);
+ anim = HAnimAnimationCreateForHierarchy(hier);
+ RpHAnimHierarchySetCurrentAnim(hier, anim);
+// RpHAnimHierarchySetFlags(hier, (RpHAnimHierarchyFlag)(rpHANIMHIERARCHYUPDATEMODELLINGMATRICES|rpHANIMHIERARCHYUPDATELTMS));
+ // the rest is xbox only:
+ // RpSkinGetNumBones(RpSkinGeometryGetSkin(RpAtomicGetGeometry(IsClumpSkinned(clone))));
+ RpHAnimHierarchyUpdateMatrices(hier);
+ }
+#endif
+ return (RwObject*)clone;
}
RwObject*
@@ -48,8 +77,45 @@ CClumpModelInfo::SetClump(RpClump *clump)
CVisibilityPlugins::SetClumpModelInfo(m_clump, this);
AddTexDictionaryRef();
RpClumpForAllAtomics(clump, SetAtomicRendererCB, nil);
+
+ // TODO: also set for player?
if(strncmp(GetName(), "playerh", 8) == 0)
RpClumpForAllAtomics(clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB);
+
+#ifdef PED_SKIN
+ if(IsClumpSkinned(clump)){
+ int i;
+ RpHAnimHierarchy *hier;
+ RpAtomic *skinAtomic;
+ RpSkin *skin;
+
+ // mobile:
+// hier = nil;
+// RwFrameForAllChildren(RpClumpGetFrame(clump), GetHierarchyFromChildNodesCB, &hier);
+// assert(hier);
+// RpClumpForAllAtomics(clump, SetHierarchyForSkinAtomic, hier);
+// skinAtomic = GetFirstAtomic(clump);
+
+ // xbox:
+ hier = GetAnimHierarchyFromClump(clump);
+ assert(hier);
+ RpSkinAtomicSetHAnimHierarchy(IsClumpSkinned(clump), hier);
+ skinAtomic = IsClumpSkinned(clump);
+
+ assert(skinAtomic);
+ skin = RpSkinGeometryGetSkin(RpAtomicGetGeometry(skinAtomic));
+ // ignore const
+ for(i = 0; i < RpGeometryGetNumVertices(RpAtomicGetGeometry(skinAtomic)); i++){
+ RwMatrixWeights *weights = (RwMatrixWeights*)&RpSkinGetVertexBoneWeights(skin)[i];
+ float sum = weights->w0 + weights->w1 + weights->w2 + weights->w3;
+ weights->w0 /= sum;
+ weights->w1 /= sum;
+ weights->w2 /= sum;
+ weights->w3 /= sum;
+ }
+// RpHAnimHierarchySetFlags(hier, (RpHAnimHierarchyFlag)(rpHANIMHIERARCHYUPDATEMODELLINGMATRICES|rpHANIMHIERARCHYUPDATELTMS));
+ }
+#endif
}
void
@@ -138,30 +204,3 @@ CClumpModelInfo::GetFrameFromId(RpClump *clump, int32 id)
RwFrameForAllChildren(RpClumpGetFrame(clump), FindFrameFromIdCB, &assoc);
return assoc.frame;
}
-
-
-class CClumpModelInfo_ : public CClumpModelInfo
-{
-public:
- void DeleteRwObject_(void) { this->CClumpModelInfo::DeleteRwObject(); }
- RwObject *CreateInstance_1(void) { return CClumpModelInfo::CreateInstance(); }
- RwObject *CreateInstance_2(RwMatrix *m) { return CClumpModelInfo::CreateInstance(m); }
- RwObject *GetRwObject_(void) { return CClumpModelInfo::GetRwObject(); }
- void SetClump_(RpClump *clump) { CClumpModelInfo::SetClump(clump); }
-};
-
-STARTPATCHES
- InjectHook(0x4F8800, &CClumpModelInfo_::DeleteRwObject_, PATCH_JUMP);
- InjectHook(0x4F8920, &CClumpModelInfo_::CreateInstance_1, PATCH_JUMP);
- InjectHook(0x4F88A0, &CClumpModelInfo_::CreateInstance_2, PATCH_JUMP);
- InjectHook(0x50C1C0, &CClumpModelInfo_::GetRwObject_, PATCH_JUMP);
- InjectHook(0x4F8830, &CClumpModelInfo_::SetClump_, PATCH_JUMP);
- InjectHook(0x4F8940, &CClumpModelInfo::SetAtomicRendererCB, PATCH_JUMP);
- InjectHook(0x4F8960, &CClumpModelInfo::FindFrameFromNameCB, PATCH_JUMP);
- InjectHook(0x4F8A10, &CClumpModelInfo::FindFrameFromNameWithoutIdCB, PATCH_JUMP);
- InjectHook(0x4F8AD0, &CClumpModelInfo::FindFrameFromIdCB, PATCH_JUMP);
- InjectHook(0x4F8BB0, &CClumpModelInfo::SetFrameIds, PATCH_JUMP);
- InjectHook(0x4F8B20, &CClumpModelInfo::FillFrameArrayCB, PATCH_JUMP);
- InjectHook(0x4F8B90, &CClumpModelInfo::FillFrameArray, PATCH_JUMP);
- InjectHook(0x4F8B50, &CClumpModelInfo::GetFrameFromId, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/modelinfo/MloModelInfo.cpp b/src/modelinfo/MloModelInfo.cpp
index 746d9db4..7535e6c5 100644
--- a/src/modelinfo/MloModelInfo.cpp
+++ b/src/modelinfo/MloModelInfo.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "VisibilityPlugins.h"
#include "ModelInfo.h"
diff --git a/src/modelinfo/ModelIndices.cpp b/src/modelinfo/ModelIndices.cpp
index ec039a0b..9a6a74d0 100644
--- a/src/modelinfo/ModelIndices.cpp
+++ b/src/modelinfo/ModelIndices.cpp
@@ -1,9 +1,9 @@
#include "common.h"
-#include "patcher.h"
+
#include "General.h"
#include "ModelIndices.h"
-#define X(name, var, addr) int16 &var = *(int16*)addr;
+#define X(name, var, addr) int16 var;
MODELINDICES
#undef X
@@ -32,8 +32,3 @@ TestModelIndices(void)
{
;
}
-
-STARTPATCHES
- InjectHook(0x48EB60, InitModelIndices, PATCH_JUMP);
- InjectHook(0x48F030, MatchModelString, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/modelinfo/ModelIndices.h b/src/modelinfo/ModelIndices.h
index 20d1b7f3..8e117882 100644
--- a/src/modelinfo/ModelIndices.h
+++ b/src/modelinfo/ModelIndices.h
@@ -158,7 +158,7 @@
X("subplatform_sub", MI_SUBPLATFORM_SUB2, 0x5F5BC0) \
X("files", MI_FILES, 0x5F5BC4)
-#define X(name, var, addr) extern int16 &var;
+#define X(name, var, addr) extern int16 var;
MODELINDICES
#undef X
@@ -490,3 +490,17 @@ IsPoliceVehicleModel(int16 id)
id == MI_POLICE ||
id == MI_ENFORCER;
}
+
+inline bool
+IsExplosiveThingModel(int16 id)
+{
+ return id == MI_EXPLODINGBARREL ||
+ id == MI_PETROLPUMP;
+}
+
+inline bool
+IsFence(int16 id)
+{
+ return id == MI_FENCE ||
+ id == MI_FENCE2;
+} \ No newline at end of file
diff --git a/src/modelinfo/ModelInfo.cpp b/src/modelinfo/ModelInfo.cpp
index b6a95992..c1ae692f 100644
--- a/src/modelinfo/ModelInfo.cpp
+++ b/src/modelinfo/ModelInfo.cpp
@@ -1,15 +1,12 @@
#include "common.h"
-#include "patcher.h"
+
#include "General.h"
#include "TempColModels.h"
#include "ModelIndices.h"
#include "ModelInfo.h"
-CBaseModelInfo **CModelInfo::ms_modelInfoPtrs = (CBaseModelInfo**)0x83D408;
+CBaseModelInfo *CModelInfo::ms_modelInfoPtrs[MODELINFOSIZE];
-//CStore<CSimpleModelInfo, SIMPLEMODELSIZE> &CModelInfo::ms_simpleModelStore = *(CStore<CSimpleModelInfo, SIMPLEMODELSIZE>*)0x885BB4;
-//CStore<CTimeModelInfo, TIMEMODELSIZE> &CModelInfo::ms_timeModelStore = *(CStore<CTimeModelInfo, TIMEMODELSIZE>*)0x94076C;
-//CStore<C2dEffect, TWODFXSIZE> &CModelInfo::ms_2dEffectStore = *(CStore<C2dEffect, TWODFXSIZE>*)0x9434F8;
CStore<CSimpleModelInfo, SIMPLEMODELSIZE> CModelInfo::ms_simpleModelStore;
CStore<CMloModelInfo, MLOMODELSIZE> CModelInfo::ms_mloModelStore;
CStore<CInstance, MLOINSTANCESIZE> CModelInfo::ms_mloInstanceStore;
@@ -251,15 +248,3 @@ CModelInfo::ReInit2dEffects()
ms_modelInfoPtrs[i]->Init2dEffects();
}
}
-
-STARTPATCHES
- InjectHook(0x50B310, CModelInfo::Initialise, PATCH_JUMP);
- InjectHook(0x50B5B0, CModelInfo::ShutDown, PATCH_JUMP);
- InjectHook(0x50B920, CModelInfo::AddSimpleModel, PATCH_JUMP);
- InjectHook(0x50B9C0, CModelInfo::AddTimeModel, PATCH_JUMP);
- InjectHook(0x50BA10, CModelInfo::AddClumpModel, PATCH_JUMP);
- InjectHook(0x50BAD0, CModelInfo::AddPedModel, PATCH_JUMP);
- InjectHook(0x50BA60, CModelInfo::AddVehicleModel, PATCH_JUMP);
- InjectHook(0x50B860, (CBaseModelInfo *(*)(const char*, int*))CModelInfo::GetModelInfo, PATCH_JUMP);
- InjectHook(0x50BBC0, CModelInfo::RemoveColModelsFromOtherLevels, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/modelinfo/ModelInfo.h b/src/modelinfo/ModelInfo.h
index e6dec1d8..65cfa4e7 100644
--- a/src/modelinfo/ModelInfo.h
+++ b/src/modelinfo/ModelInfo.h
@@ -13,7 +13,7 @@
class CModelInfo
{
- static CBaseModelInfo **ms_modelInfoPtrs; //[MODELINFOSIZE];
+ static CBaseModelInfo *ms_modelInfoPtrs[MODELINFOSIZE];
static CStore<CSimpleModelInfo, SIMPLEMODELSIZE> ms_simpleModelStore;
static CStore<CMloModelInfo, MLOMODELSIZE> ms_mloModelStore;
static CStore<CInstance, MLOINSTANCESIZE> ms_mloInstanceStore;
diff --git a/src/modelinfo/PedModelInfo.cpp b/src/modelinfo/PedModelInfo.cpp
index 015c6949..47080e23 100644
--- a/src/modelinfo/PedModelInfo.cpp
+++ b/src/modelinfo/PedModelInfo.cpp
@@ -1,6 +1,9 @@
#include "common.h"
-#include "patcher.h"
+
+#include "RwHelper.h"
#include "General.h"
+#include "Bones.h"
+#include "SurfaceTable.h"
#include "Ped.h"
#include "NodeName.h"
#include "VisibilityPlugins.h"
@@ -9,13 +12,31 @@
void
CPedModelInfo::DeleteRwObject(void)
{
- CClumpModelInfo::DeleteRwObject();
if(m_hitColModel)
delete m_hitColModel;
m_hitColModel = nil;
+#ifdef PED_SKIN
+ RwFrame *frame;
+ if(m_head){
+ frame = RpAtomicGetFrame(m_head);
+ RpAtomicDestroy(m_head);
+ RwFrameDestroy(frame);
+ }
+ if(m_lhand){
+ frame = RpAtomicGetFrame(m_lhand);
+ RpAtomicDestroy(m_lhand);
+ RwFrameDestroy(frame);
+ }
+ if(m_rhand){
+ frame = RpAtomicGetFrame(m_rhand);
+ RpAtomicDestroy(m_rhand);
+ RwFrameDestroy(frame);
+ }
+#endif
+ CClumpModelInfo::DeleteRwObject(); // PC calls this first
}
-RwObjectNameIdAssocation CPedModelInfo::m_pPedIds[12] = {
+RwObjectNameIdAssocation CPedModelInfo::m_pPedIds[PED_NODE_MAX] = {
{ "Smid", PED_MID, 0, }, // that is strange...
{ "Shead", PED_HEAD, 0, },
{ "Supperarml", PED_UPPERARML, 0, },
@@ -30,15 +51,70 @@ RwObjectNameIdAssocation CPedModelInfo::m_pPedIds[12] = {
{ nil, 0, 0, },
};
+#ifdef PED_SKIN
+struct LimbCBarg
+{
+ CPedModelInfo *mi;
+ RpClump *clump;
+ int32 frameIDs[3];
+};
+
+RpAtomic*
+CPedModelInfo::findLimbsCb(RpAtomic *atomic, void *data)
+{
+ LimbCBarg *limbs = (LimbCBarg*)data;
+ RwFrame *frame = RpAtomicGetFrame(atomic);
+ const char *name = GetFrameNodeName(frame);
+ if(CGeneral::faststricmp(name, "Shead01") == 0){
+ limbs->frameIDs[0] = RpHAnimFrameGetID(frame);
+ limbs->mi->m_head = atomic;
+ RpClumpRemoveAtomic(limbs->clump, atomic);
+ RwFrameRemoveChild(frame);
+ }else if(CGeneral::faststricmp(name, "SLhand01") == 0){
+ limbs->frameIDs[1] = RpHAnimFrameGetID(frame);
+ limbs->mi->m_lhand = atomic;
+ RpClumpRemoveAtomic(limbs->clump, atomic);
+ RwFrameRemoveChild(frame);
+ }else if(CGeneral::faststricmp(name, "SRhand01") == 0){
+ limbs->frameIDs[2] = RpHAnimFrameGetID(frame);
+ limbs->mi->m_rhand = atomic;
+ RpClumpRemoveAtomic(limbs->clump, atomic);
+ RwFrameRemoveChild(frame);
+ }
+ return atomic;
+}
+#endif
+
void
CPedModelInfo::SetClump(RpClump *clump)
{
+#ifdef PED_SKIN
+
+ // CB has to be set here before atomics are detached from clump
+ if(strncmp(GetName(), "player", 7) == 0)
+ RpClumpForAllAtomics(clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB);
+ if(IsClumpSkinned(clump)){
+ LimbCBarg limbs = { this, clump, { 0, 0, 0 } };
+ RpClumpForAllAtomics(clump, findLimbsCb, &limbs);
+ }
+ CClumpModelInfo::SetClump(clump);
+ SetFrameIds(m_pPedIds);
+ if(m_hitColModel == nil && !IsClumpSkinned(clump))
+ CreateHitColModel();
+ // And again because CClumpModelInfo resets it
+ if(strncmp(GetName(), "player", 7) == 0)
+ RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB);
+ else if(IsClumpSkinned(clump))
+ // skinned peds have no low detail version, so they don't have the right render Cb
+ RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPedCB);
+#else
CClumpModelInfo::SetClump(clump);
SetFrameIds(m_pPedIds);
if(m_hitColModel == nil)
CreateHitColModel();
if(strncmp(GetName(), "player", 7) == 0)
RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB);
+#endif
}
RpAtomic*
@@ -157,7 +233,7 @@ CPedModelInfo::CreateHitColModel(void)
}
if(nodeFrame){
float radius = m_pColNodeInfos[i].radius;
- if(m_pColNodeInfos[i].pieceType == 6)
+ if(m_pColNodeInfos[i].pieceType == PEDPIECE_HEAD)
RwFrameForAllObjects(nodeFrame, FindHeadRadiusCB, &radius);
RwMatrixTransform(mat, RwFrameGetMatrix(nodeFrame), rwCOMBINEREPLACE);
const char *name = GetFrameNodeName(nodeFrame);
@@ -172,7 +248,7 @@ CPedModelInfo::CreateHitColModel(void)
center.x = mat->pos.x + m_pColNodeInfos[i].x;
center.y = mat->pos.y + 0.0f;
center.z = mat->pos.z + m_pColNodeInfos[i].z;
- spheres[i].Set(radius, center, 17, m_pColNodeInfos[i].pieceType);
+ spheres[i].Set(radius, center, SURFACE_FLESH, m_pColNodeInfos[i].pieceType);
}
}
RwMatrixDestroy(mat);
@@ -186,7 +262,7 @@ CPedModelInfo::CreateHitColModel(void)
max.x = max.y = 0.5f;
max.z = 1.2f;
colmodel->boundingBox.Set(min, max, 0, 0);
- colmodel->level = 0;
+ colmodel->level = LEVEL_NONE;
m_hitColModel = colmodel;
}
@@ -230,16 +306,80 @@ CPedModelInfo::AnimatePedColModel(CColModel* colmodel, RwFrame* frame)
return colmodel;
}
-class CPedModelInfo_ : public CPedModelInfo
+#ifdef PED_SKIN
+void
+CPedModelInfo::CreateHitColModelSkinned(RpClump *clump)
{
-public:
- void DeleteRwObject_(void) { CPedModelInfo::DeleteRwObject(); }
- void SetClump_(RpClump *clump) { CPedModelInfo::SetClump(clump); }
-};
+ CVector center;
+ RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(clump);
+ CColModel *colmodel = new CColModel;
+ CColSphere *spheres = (CColSphere*)RwMalloc(NUMPEDINFONODES*sizeof(CColSphere));
+ RwFrame *root = RpClumpGetFrame(m_clump);
+ RwMatrix *invmat = RwMatrixCreate();
+ RwMatrix *mat = RwMatrixCreate();
+ RwMatrixInvert(invmat, RwFrameGetMatrix(RpClumpGetFrame(clump)));
+
+ for(int i = 0; i < NUMPEDINFONODES; i++){
+ *mat = *invmat;
+ int id = ConvertPedNode2BoneTag(m_pColNodeInfos[i].pedNode); // this is wrong, wtf R* ???
+ int idx = RpHAnimIDGetIndex(hier, id);
+
+ // This doesn't really work as the positions are not initialized yet
+ RwMatrixTransform(mat, &RpHAnimHierarchyGetMatrixArray(hier)[idx], rwCOMBINEPRECONCAT);
+ RwV3d pos = { 0.0f, 0.0f, 0.0f };
+ RwV3dTransformPoints(&pos, &pos, 1, mat);
+
+ center.x = pos.x + m_pColNodeInfos[i].x;
+ center.y = pos.y + 0.0f;
+ center.z = pos.z + m_pColNodeInfos[i].z;
+ spheres[i].Set(m_pColNodeInfos[i].radius, center, SURFACE_FLESH, m_pColNodeInfos[i].pieceType);
+ }
+ RwMatrixDestroy(invmat);
+ RwMatrixDestroy(mat);
+ colmodel->spheres = spheres;
+ colmodel->numSpheres = NUMPEDINFONODES;
+ center.x = center.y = center.z = 0.0f;
+ colmodel->boundingSphere.Set(2.0f, center, 0, 0);
+ CVector min, max;
+ min.x = min.y = -0.5f;
+ min.z = -1.2f;
+ max.x = max.y = 0.5f;
+ max.z = 1.2f;
+ colmodel->boundingBox.Set(min, max, 0, 0);
+ colmodel->level = LEVEL_NONE;
+ m_hitColModel = colmodel;
+}
+
+CColModel*
+CPedModelInfo::AnimatePedColModelSkinned(RpClump *clump)
+{
+ if(m_hitColModel == nil){
+ CreateHitColModelSkinned(clump);
+ return m_hitColModel;
+ }
+ RwMatrix *invmat, *mat;
+ CColSphere *spheres = m_hitColModel->spheres;
+ RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(clump);
+ invmat = RwMatrixCreate();
+ mat = RwMatrixCreate();
+ RwMatrixInvert(invmat, RwFrameGetMatrix(RpClumpGetFrame(clump)));
+
+ for(int i = 0; i < NUMPEDINFONODES; i++){
+ *mat = *invmat;
+ int id = ConvertPedNode2BoneTag(m_pColNodeInfos[i].pedNode);
+ int idx = RpHAnimIDGetIndex(hier, id);
+
+ RwMatrixTransform(mat, &RpHAnimHierarchyGetMatrixArray(hier)[idx], rwCOMBINEPRECONCAT);
+ RwV3d pos = { 0.0f, 0.0f, 0.0f };
+ RwV3dTransformPoints(&pos, &pos, 1, mat);
+
+ spheres[i].center.x = pos.x + m_pColNodeInfos[i].x;
+ spheres[i].center.y = pos.y + 0.0f;
+ spheres[i].center.z = pos.z + m_pColNodeInfos[i].z;
+ }
+ RwMatrixDestroy(invmat);
+ RwMatrixDestroy(mat);
+ return m_hitColModel;
+}
-STARTPATCHES
- InjectHook(0x510210, &CPedModelInfo_::SetClump_, PATCH_JUMP);
- InjectHook(0x510280, &CPedModelInfo_::DeleteRwObject_, PATCH_JUMP);
- InjectHook(0x510390, &CPedModelInfo::SetLowDetailClump, PATCH_JUMP);
- InjectHook(0x5104D0, &CPedModelInfo::CreateHitColModel, PATCH_JUMP);
-ENDPATCHES
+#endif
diff --git a/src/modelinfo/PedModelInfo.h b/src/modelinfo/PedModelInfo.h
index 0336fa9b..a2bfd122 100644
--- a/src/modelinfo/PedModelInfo.h
+++ b/src/modelinfo/PedModelInfo.h
@@ -28,11 +28,13 @@ public:
ePedStats m_pedStatType;
uint32 m_carsCanDrive;
CColModel *m_hitColModel;
+#ifdef PED_SKIN
RpAtomic *m_head;
RpAtomic *m_lhand;
RpAtomic *m_rhand;
+#endif
- static RwObjectNameIdAssocation m_pPedIds[12];
+ static RwObjectNameIdAssocation m_pPedIds[PED_NODE_MAX];
CPedModelInfo(void) : CClumpModelInfo(MITYPE_PED) { }
void DeleteRwObject(void);
@@ -40,7 +42,18 @@ public:
void SetLowDetailClump(RpClump*);
void CreateHitColModel(void);
+ void CreateHitColModelSkinned(RpClump *clump);
CColModel *GetHitColModel(void) { return m_hitColModel; }
static CColModel *AnimatePedColModel(CColModel* colmodel, RwFrame* frame);
+ CColModel *AnimatePedColModelSkinned(RpClump *clump);
+
+#ifdef PED_SKIN
+ static RpAtomic *findLimbsCb(RpAtomic *atomic, void *data);
+ RpAtomic *getHead(void) { return m_head; }
+ RpAtomic *getLeftHand(void) { return m_lhand; }
+ RpAtomic *getRightHand(void) { return m_rhand; }
+#endif
};
-static_assert(sizeof(CPedModelInfo) == 0x54, "CPedModelInfo: error");
+#ifndef PED_SKIN
+static_assert(sizeof(CPedModelInfo) == 0x48, "CPedModelInfo: error");
+#endif \ No newline at end of file
diff --git a/src/modelinfo/SimpleModelInfo.cpp b/src/modelinfo/SimpleModelInfo.cpp
index f8742f1e..2fb2adeb 100644
--- a/src/modelinfo/SimpleModelInfo.cpp
+++ b/src/modelinfo/SimpleModelInfo.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "General.h"
#include "Camera.h"
#include "ModelInfo.h"
@@ -154,28 +154,3 @@ CSimpleModelInfo::SetupBigBuilding(void)
m_lodDistances[2] = 100.0f;
}
}
-
-class CSimpleModelInfo_ : public CSimpleModelInfo
-{
-public:
- void DeleteRwObject_(void) { CSimpleModelInfo::DeleteRwObject(); }
- RwObject *CreateInstance_1(void) { return CSimpleModelInfo::CreateInstance(); }
- RwObject *CreateInstance_2(RwMatrix *m) { return CSimpleModelInfo::CreateInstance(m); }
- RwObject *GetRwObject_(void) { return CSimpleModelInfo::GetRwObject(); }
-};
-
-STARTPATCHES
- InjectHook(0x5179B0, &CSimpleModelInfo_::DeleteRwObject_, PATCH_JUMP);
- InjectHook(0x517B60, &CSimpleModelInfo_::CreateInstance_1, PATCH_JUMP);
- InjectHook(0x517AC0, &CSimpleModelInfo_::CreateInstance_2, PATCH_JUMP);
- InjectHook(0x4A9BA0, &CSimpleModelInfo_::GetRwObject_, PATCH_JUMP);
- InjectHook(0x517990, &CSimpleModelInfo::Init, PATCH_JUMP);
- InjectHook(0x517C60, &CSimpleModelInfo::IncreaseAlpha, PATCH_JUMP);
- InjectHook(0x517950, &CSimpleModelInfo::SetAtomic, PATCH_JUMP);
- InjectHook(0x517AA0, &CSimpleModelInfo::SetLodDistances, PATCH_JUMP);
- InjectHook(0x517A90, &CSimpleModelInfo::GetNearDistance, PATCH_JUMP);
- InjectHook(0x517A60, &CSimpleModelInfo::GetLargestLodDistance, PATCH_JUMP);
- InjectHook(0x517A00, &CSimpleModelInfo::GetAtomicFromDistance, PATCH_JUMP);
- InjectHook(0x517C00, &CSimpleModelInfo::FindRelatedModel, PATCH_JUMP);
- InjectHook(0x517B90, &CSimpleModelInfo::SetupBigBuilding, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/modelinfo/TimeModelInfo.cpp b/src/modelinfo/TimeModelInfo.cpp
index 3ab3e13a..fec3f6e5 100644
--- a/src/modelinfo/TimeModelInfo.cpp
+++ b/src/modelinfo/TimeModelInfo.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "Camera.h"
#include "ModelInfo.h"
@@ -30,7 +30,3 @@ CTimeModelInfo::FindOtherTimeModel(void)
}
return nil;
}
-
-STARTPATCHES
- InjectHook(0x517C80, &CTimeModelInfo::FindOtherTimeModel, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/modelinfo/VehicleModelInfo.cpp b/src/modelinfo/VehicleModelInfo.cpp
index 0c45aa12..0c3a7720 100644
--- a/src/modelinfo/VehicleModelInfo.cpp
+++ b/src/modelinfo/VehicleModelInfo.cpp
@@ -1,6 +1,6 @@
#include "common.h"
#include <rpmatfx.h>
-#include "patcher.h"
+
#include "RwHelper.h"
#include "General.h"
#include "NodeName.h"
@@ -19,14 +19,14 @@
#include "ModelIndices.h"
#include "ModelInfo.h"
-int8 *CVehicleModelInfo::ms_compsToUse = (int8*)0x5FF2EC; // -2, -2
-int8 *CVehicleModelInfo::ms_compsUsed = (int8*)0x95CCB2;
-RwTexture **CVehicleModelInfo::ms_pEnvironmentMaps = (RwTexture **)0x8F1A30;
-RwRGBA *CVehicleModelInfo::ms_vehicleColourTable = (RwRGBA*)0x86BA88;
-RwTexture **CVehicleModelInfo::ms_colourTextureTable = (RwTexture**)0x711C40;
+int8 CVehicleModelInfo::ms_compsToUse[2] = { -2, -2 };
+int8 CVehicleModelInfo::ms_compsUsed[2];
+RwTexture *CVehicleModelInfo::ms_pEnvironmentMaps[NUM_VEHICLE_ENVMAPS];
+RwRGBA CVehicleModelInfo::ms_vehicleColourTable[256];
+RwTexture *CVehicleModelInfo::ms_colourTextureTable[256];
-RwTexture *&gpWhiteTexture = *(RwTexture**)0x64C4F8;
-RwFrame *&pMatFxIdentityFrame = *(RwFrame**)0x64C510;
+RwTexture *gpWhiteTexture;
+RwFrame *pMatFxIdentityFrame;
enum {
VEHICLE_FLAG_COLLAPSE = 0x2,
@@ -1104,65 +1104,3 @@ CVehicleModelInfo::GetMaximumNumberOfPassengersFromNumberOfDoors(int id)
return n - 1;
}
-
-class CVehicleModelInfo_ : public CVehicleModelInfo
-{
-public:
- void DeleteRwObject_(void) { CVehicleModelInfo::DeleteRwObject(); }
- RwObject *CreateInstance_(void) { return CVehicleModelInfo::CreateInstance(); }
- void SetClump_(RpClump *clump) { CVehicleModelInfo::SetClump(clump); }
-};
-
-STARTPATCHES
- InjectHook(0x427820, &CVehicleModelInfo::SetComponentsToUse, PATCH_JUMP);
-
- InjectHook(0x51FDC0, &CVehicleModelInfo_::DeleteRwObject_, PATCH_JUMP);
- InjectHook(0x51FCB0, &CVehicleModelInfo_::CreateInstance_, PATCH_JUMP);
- InjectHook(0x51FC60, &CVehicleModelInfo_::SetClump_, PATCH_JUMP);
-
- InjectHook(0x51FE10, &CVehicleModelInfo::CollapseFramesCB, PATCH_JUMP);
- InjectHook(0x51FE50, &CVehicleModelInfo::MoveObjectsCB, PATCH_JUMP);
- InjectHook(0x51FE70, &CVehicleModelInfo::HideDamagedAtomicCB, PATCH_JUMP);
- InjectHook(0x51FED0, &CVehicleModelInfo::HideAllComponentsAtomicCB, PATCH_JUMP);
- InjectHook(0x51FEF0, &CVehicleModelInfo::HasAlphaMaterialCB, PATCH_JUMP);
-
- InjectHook(0x51FF10, &CVehicleModelInfo::SetAtomicRendererCB, PATCH_JUMP);
- InjectHook(0x520030, &CVehicleModelInfo::SetAtomicRendererCB_BigVehicle, PATCH_JUMP);
- InjectHook(0x520230, &CVehicleModelInfo::SetAtomicRendererCB_Train, PATCH_JUMP);
- InjectHook(0x520120, &CVehicleModelInfo::SetAtomicRendererCB_Boat, PATCH_JUMP);
- InjectHook(0x520210, &CVehicleModelInfo::SetAtomicRendererCB_Heli, PATCH_JUMP);
- InjectHook(0x5202C0, &CVehicleModelInfo::SetAtomicRenderCallbacks, PATCH_JUMP);
-
- InjectHook(0x520340, &CVehicleModelInfo::SetAtomicFlagCB, PATCH_JUMP);
- InjectHook(0x520360, &CVehicleModelInfo::ClearAtomicFlagCB, PATCH_JUMP);
-
- InjectHook(0x5204D0, &CVehicleModelInfo::PreprocessHierarchy, PATCH_JUMP);
- InjectHook(0x5203C0, &CVehicleModelInfo::SetVehicleComponentFlags, PATCH_JUMP);
-
- InjectHook(0x520840, &CVehicleModelInfo::GetWheelPosn, PATCH_JUMP);
-
- InjectHook(0x520880, IsValidCompRule, PATCH_JUMP);
- InjectHook(0x520990, CountCompsInRule, PATCH_JUMP);
- InjectHook(0x5209C0, ChooseComponent, PATCH_JUMP);
- InjectHook(0x5208C0, GetListOfComponentsNotUsedByRules, PATCH_JUMP);
- InjectHook(0x520AB0, &CVehicleModelInfo::ChooseComponent, PATCH_JUMP);
- InjectHook(0x520BE0, &CVehicleModelInfo::ChooseSecondComponent, PATCH_JUMP);
-
- InjectHook(0x520DC0, (RpAtomic *(*)(RpAtomic*, void*))CVehicleModelInfo::GetEditableMaterialListCB, PATCH_JUMP);
- InjectHook(0x520D30, (RpMaterial *(*)(RpMaterial*, void*))CVehicleModelInfo::GetEditableMaterialListCB, PATCH_JUMP);
- InjectHook(0x520DE0, &CVehicleModelInfo::FindEditableMaterialList, PATCH_JUMP);
- InjectHook(0x520E70, &CVehicleModelInfo::SetVehicleColour, PATCH_JUMP);
- InjectHook(0x520FD0, &CVehicleModelInfo::ChooseVehicleColour, PATCH_JUMP);
- InjectHook(0x5210A0, &CVehicleModelInfo::AvoidSameVehicleColour, PATCH_JUMP);
- InjectHook(0x521260, &CVehicleModelInfo::LoadVehicleColours, PATCH_JUMP);
- InjectHook(0x521650, &CVehicleModelInfo::DeleteVehicleColourTextures, PATCH_JUMP);
-
- InjectHook(0x5219D0, &CVehicleModelInfo::GetMaximumNumberOfPassengersFromNumberOfDoors, PATCH_JUMP);
-
- InjectHook(0x521820, (RpAtomic *(*)(RpAtomic*, void*))CVehicleModelInfo::SetEnvironmentMapCB, PATCH_JUMP);
- InjectHook(0x5217A0, (RpMaterial *(*)(RpMaterial*, void*))CVehicleModelInfo::SetEnvironmentMapCB, PATCH_JUMP);
- InjectHook(0x521770, CVehicleModelInfo::HasSpecularMaterialCB, PATCH_JUMP);
- InjectHook(0x521890, &CVehicleModelInfo::SetEnvironmentMap, PATCH_JUMP);
- InjectHook(0x521680, CVehicleModelInfo::LoadEnvironmentMaps, PATCH_JUMP);
- InjectHook(0x521720, CVehicleModelInfo::ShutdownEnvironmentMaps, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/modelinfo/VehicleModelInfo.h b/src/modelinfo/VehicleModelInfo.h
index 5969c4ca..9992ab98 100644
--- a/src/modelinfo/VehicleModelInfo.h
+++ b/src/modelinfo/VehicleModelInfo.h
@@ -81,11 +81,11 @@ public:
RpAtomic *m_comps[6];
int32 m_numComps;
- static int8 *ms_compsToUse; // [2];
- static int8 *ms_compsUsed; // [2];
- static RwTexture **ms_pEnvironmentMaps; // [NUM_VEHICLE_ENVMAPS]
- static RwRGBA *ms_vehicleColourTable; // [256]
- static RwTexture **ms_colourTextureTable; // [256]
+ static int8 ms_compsToUse[2];
+ static int8 ms_compsUsed[2];
+ static RwTexture *ms_pEnvironmentMaps[NUM_VEHICLE_ENVMAPS];
+ static RwRGBA ms_vehicleColourTable[256];
+ static RwTexture *ms_colourTextureTable[256];
static RwObjectNameIdAssocation *ms_vehicleDescs[NUM_VEHICLE_TYPES];
CVehicleModelInfo(void);