mirror of
https://github.com/halpz/re3.git
synced 2025-07-22 13:29:47 +00:00
sync with upstream
This commit is contained in:
@ -5,6 +5,7 @@
|
||||
#include "NodeName.h"
|
||||
#include "VisibilityPlugins.h"
|
||||
#include "ModelInfo.h"
|
||||
#include "AnimManager.h"
|
||||
|
||||
void
|
||||
CClumpModelInfo::DeleteRwObject(void)
|
||||
@ -13,17 +14,17 @@ CClumpModelInfo::DeleteRwObject(void)
|
||||
RpClumpDestroy(m_clump);
|
||||
m_clump = nil;
|
||||
RemoveTexDictionaryRef();
|
||||
if(GetAnimFileIndex() != -1)
|
||||
CAnimManager::RemoveAnimBlockRef(GetAnimFileIndex());
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PED_SKIN
|
||||
static RpAtomic*
|
||||
SetHierarchyForSkinAtomic(RpAtomic *atomic, void *data)
|
||||
{
|
||||
RpSkinAtomicSetHAnimHierarchy(atomic, (RpHAnimHierarchy*)data);
|
||||
return nil;
|
||||
}
|
||||
#endif
|
||||
|
||||
RwObject*
|
||||
CClumpModelInfo::CreateInstance(void)
|
||||
@ -31,24 +32,17 @@ CClumpModelInfo::CreateInstance(void)
|
||||
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);
|
||||
RpHAnimHierarchySetFlags(hier, (RpHAnimHierarchyFlag)(rpHANIMHIERARCHYUPDATEMODELLINGMATRICES|rpHANIMHIERARCHYUPDATELTMS));
|
||||
}
|
||||
#endif
|
||||
return (RwObject*)clone;
|
||||
}
|
||||
|
||||
@ -76,31 +70,19 @@ CClumpModelInfo::SetClump(RpClump *clump)
|
||||
m_clump = clump;
|
||||
CVisibilityPlugins::SetClumpModelInfo(m_clump, this);
|
||||
AddTexDictionaryRef();
|
||||
RpClumpForAllAtomics(clump, SetAtomicRendererCB, nil);
|
||||
if(GetAnimFileIndex() != -1)
|
||||
CAnimManager::AddAnimBlockRef(GetAnimFileIndex());
|
||||
|
||||
// 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);
|
||||
RpClumpForAllAtomics(clump, SetHierarchyForSkinAtomic, hier);
|
||||
skinAtomic = GetFirstAtomic(clump);
|
||||
|
||||
assert(skinAtomic);
|
||||
skin = RpSkinGeometryGetSkin(RpAtomicGetGeometry(skinAtomic));
|
||||
@ -113,9 +95,29 @@ CClumpModelInfo::SetClump(RpClump *clump)
|
||||
weights->w2 /= sum;
|
||||
weights->w3 /= sum;
|
||||
}
|
||||
// RpHAnimHierarchySetFlags(hier, (RpHAnimHierarchyFlag)(rpHANIMHIERARCHYUPDATEMODELLINGMATRICES|rpHANIMHIERARCHYUPDATELTMS));
|
||||
RpHAnimHierarchySetFlags(hier, (RpHAnimHierarchyFlag)(rpHANIMHIERARCHYUPDATEMODELLINGMATRICES|rpHANIMHIERARCHYUPDATELTMS));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CClumpModelInfo::SetAnimFile(const char *file)
|
||||
{
|
||||
if(strcasecmp(file, "null") == 0)
|
||||
return;
|
||||
|
||||
m_animFileName = new char[strlen(file)+1];
|
||||
strcpy(m_animFileName, file);
|
||||
}
|
||||
|
||||
void
|
||||
CClumpModelInfo::ConvertAnimFileIndex(void)
|
||||
{
|
||||
if(m_animFileIndex != -1){
|
||||
// we have a string pointer in that union
|
||||
int32 index = CAnimManager::GetAnimationBlockIndex(m_animFileName);
|
||||
delete[] m_animFileName;
|
||||
m_animFileIndex = index;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
@ -139,27 +141,26 @@ CClumpModelInfo::FindFrameFromIdCB(RwFrame *frame, void *data)
|
||||
{
|
||||
RwObjectIdAssociation *assoc = (RwObjectIdAssociation*)data;
|
||||
|
||||
if(CVisibilityPlugins::GetFrameHierarchyId(frame) != assoc->id){
|
||||
RwFrameForAllChildren(frame, FindFrameFromIdCB, assoc);
|
||||
return assoc->frame ? nil : frame;
|
||||
}else{
|
||||
if(CVisibilityPlugins::GetFrameHierarchyId(frame) == assoc->id){
|
||||
assoc->frame = frame;
|
||||
return nil;
|
||||
}
|
||||
RwFrameForAllChildren(frame, FindFrameFromIdCB, assoc);
|
||||
return assoc->frame ? nil : frame;
|
||||
}
|
||||
|
||||
//--MIAMI: unused
|
||||
RwFrame*
|
||||
CClumpModelInfo::FindFrameFromNameCB(RwFrame *frame, void *data)
|
||||
{
|
||||
RwObjectNameAssociation *assoc = (RwObjectNameAssociation*)data;
|
||||
|
||||
if(CGeneral::faststricmp(GetFrameNodeName(frame), assoc->name)){
|
||||
RwFrameForAllChildren(frame, FindFrameFromNameCB, assoc);
|
||||
return assoc->frame ? nil : frame;
|
||||
}else{
|
||||
if(!CGeneral::faststricmp(GetFrameNodeName(frame), assoc->name)){
|
||||
assoc->frame = frame;
|
||||
return nil;
|
||||
}
|
||||
RwFrameForAllChildren(frame, FindFrameFromNameCB, assoc);
|
||||
return assoc->frame ? nil : frame;
|
||||
}
|
||||
|
||||
RwFrame*
|
||||
@ -167,14 +168,13 @@ CClumpModelInfo::FindFrameFromNameWithoutIdCB(RwFrame *frame, void *data)
|
||||
{
|
||||
RwObjectNameAssociation *assoc = (RwObjectNameAssociation*)data;
|
||||
|
||||
if(CVisibilityPlugins::GetFrameHierarchyId(frame) ||
|
||||
CGeneral::faststricmp(GetFrameNodeName(frame), assoc->name)){
|
||||
RwFrameForAllChildren(frame, FindFrameFromNameWithoutIdCB, assoc);
|
||||
return assoc->frame ? nil : frame;
|
||||
}else{
|
||||
if(CVisibilityPlugins::GetFrameHierarchyId(frame) == 0 &&
|
||||
!CGeneral::faststricmp(GetFrameNodeName(frame), assoc->name)){
|
||||
assoc->frame = frame;
|
||||
return nil;
|
||||
}
|
||||
RwFrameForAllChildren(frame, FindFrameFromNameWithoutIdCB, assoc);
|
||||
return assoc->frame ? nil : frame;
|
||||
}
|
||||
|
||||
RwFrame*
|
||||
|
@ -30,9 +30,13 @@ class CClumpModelInfo : public CBaseModelInfo
|
||||
{
|
||||
public:
|
||||
RpClump *m_clump;
|
||||
union {
|
||||
int32 m_animFileIndex;
|
||||
char *m_animFileName;
|
||||
};
|
||||
|
||||
CClumpModelInfo(void) : CBaseModelInfo(MITYPE_CLUMP) {}
|
||||
CClumpModelInfo(ModelInfoType id) : CBaseModelInfo(id) {}
|
||||
CClumpModelInfo(void) : CBaseModelInfo(MITYPE_CLUMP) { m_animFileIndex = -1; }
|
||||
CClumpModelInfo(ModelInfoType id) : CBaseModelInfo(id) { m_animFileIndex = -1; }
|
||||
~CClumpModelInfo() {}
|
||||
void DeleteRwObject(void);
|
||||
RwObject *CreateInstance(void);
|
||||
@ -40,6 +44,9 @@ public:
|
||||
RwObject *GetRwObject(void) { return (RwObject*)m_clump; }
|
||||
|
||||
virtual void SetClump(RpClump *);
|
||||
virtual void SetAnimFile(const char *file);
|
||||
virtual void ConvertAnimFileIndex(void);
|
||||
virtual int GetAnimFileIndex(void) { return m_animFileIndex; }
|
||||
|
||||
static RpAtomic *SetAtomicRendererCB(RpAtomic *atomic, void *data);
|
||||
void SetFrameIds(RwObjectNameIdAssocation *assocs);
|
||||
|
@ -9,6 +9,7 @@ CBaseModelInfo *CModelInfo::ms_modelInfoPtrs[MODELINFOSIZE];
|
||||
|
||||
CStore<CSimpleModelInfo, SIMPLEMODELSIZE> CModelInfo::ms_simpleModelStore;
|
||||
CStore<CTimeModelInfo, TIMEMODELSIZE> CModelInfo::ms_timeModelStore;
|
||||
CStore<CWeaponModelInfo, WEAPONMODELSIZE> CModelInfo::ms_weaponModelStore;
|
||||
CStore<CClumpModelInfo, CLUMPMODELSIZE> CModelInfo::ms_clumpModelStore;
|
||||
CStore<CPedModelInfo, PEDMODELSIZE> CModelInfo::ms_pedModelStore;
|
||||
CStore<CVehicleModelInfo, VEHICLEMODELSIZE> CModelInfo::ms_vehicleModelStore;
|
||||
@ -25,6 +26,7 @@ CModelInfo::Initialise(void)
|
||||
ms_2dEffectStore.clear();
|
||||
ms_simpleModelStore.clear();
|
||||
ms_timeModelStore.clear();
|
||||
ms_weaponModelStore.clear();
|
||||
ms_clumpModelStore.clear();
|
||||
ms_pedModelStore.clear();
|
||||
ms_vehicleModelStore.clear();
|
||||
@ -86,6 +88,8 @@ CModelInfo::ShutDown(void)
|
||||
ms_simpleModelStore.store[i].Shutdown();
|
||||
for(i = 0; i < ms_timeModelStore.allocPtr; i++)
|
||||
ms_timeModelStore.store[i].Shutdown();
|
||||
for(i = 0; i < ms_weaponModelStore.allocPtr; i++)
|
||||
ms_weaponModelStore.store[i].Shutdown();
|
||||
for(i = 0; i < ms_clumpModelStore.allocPtr; i++)
|
||||
ms_clumpModelStore.store[i].Shutdown();
|
||||
for(i = 0; i < ms_vehicleModelStore.allocPtr; i++)
|
||||
@ -98,6 +102,7 @@ CModelInfo::ShutDown(void)
|
||||
ms_2dEffectStore.clear();
|
||||
ms_simpleModelStore.clear();
|
||||
ms_timeModelStore.clear();
|
||||
ms_weaponModelStore.clear();
|
||||
ms_pedModelStore.clear();
|
||||
ms_clumpModelStore.clear();
|
||||
ms_vehicleModelStore.clear();
|
||||
@ -123,6 +128,16 @@ CModelInfo::AddTimeModel(int id)
|
||||
return modelinfo;
|
||||
}
|
||||
|
||||
CWeaponModelInfo*
|
||||
CModelInfo::AddWeaponModel(int id)
|
||||
{
|
||||
CWeaponModelInfo *modelinfo;
|
||||
modelinfo = CModelInfo::ms_weaponModelStore.alloc();
|
||||
CModelInfo::ms_modelInfoPtrs[id] = modelinfo;
|
||||
modelinfo->Init();
|
||||
return modelinfo;
|
||||
}
|
||||
|
||||
CClumpModelInfo*
|
||||
CModelInfo::AddClumpModel(int id)
|
||||
{
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "BaseModelInfo.h"
|
||||
#include "SimpleModelInfo.h"
|
||||
#include "TimeModelInfo.h"
|
||||
#include "WeaponModelInfo.h"
|
||||
#include "ClumpModelInfo.h"
|
||||
#include "PedModelInfo.h"
|
||||
#include "VehicleModelInfo.h"
|
||||
@ -14,6 +15,7 @@ class CModelInfo
|
||||
static CBaseModelInfo *ms_modelInfoPtrs[MODELINFOSIZE];
|
||||
static CStore<CSimpleModelInfo, SIMPLEMODELSIZE> ms_simpleModelStore;
|
||||
static CStore<CTimeModelInfo, TIMEMODELSIZE> ms_timeModelStore;
|
||||
static CStore<CWeaponModelInfo, WEAPONMODELSIZE> ms_weaponModelStore;
|
||||
static CStore<CClumpModelInfo, CLUMPMODELSIZE> ms_clumpModelStore;
|
||||
static CStore<CPedModelInfo, PEDMODELSIZE> ms_pedModelStore;
|
||||
static CStore<CVehicleModelInfo, VEHICLEMODELSIZE> ms_vehicleModelStore;
|
||||
@ -25,6 +27,7 @@ public:
|
||||
|
||||
static CSimpleModelInfo *AddSimpleModel(int id);
|
||||
static CTimeModelInfo *AddTimeModel(int id);
|
||||
static CWeaponModelInfo *AddWeaponModel(int id);
|
||||
static CClumpModelInfo *AddClumpModel(int id);
|
||||
static CPedModelInfo *AddPedModel(int id);
|
||||
static CVehicleModelInfo *AddVehicleModel(int id);
|
||||
|
55
src/modelinfo/WeaponModelInfo.cpp
Normal file
55
src/modelinfo/WeaponModelInfo.cpp
Normal file
@ -0,0 +1,55 @@
|
||||
#include "common.h"
|
||||
|
||||
#include "ModelInfo.h"
|
||||
#include "AnimManager.h"
|
||||
#include "VisibilityPlugins.h"
|
||||
|
||||
//--MIAMI: file done
|
||||
|
||||
void
|
||||
CWeaponModelInfo::SetAnimFile(const char *file)
|
||||
{
|
||||
if(strcasecmp(file, "null") == 0)
|
||||
return;
|
||||
|
||||
m_animFileName = new char[strlen(file)+1];
|
||||
strcpy(m_animFileName, file);
|
||||
}
|
||||
|
||||
void
|
||||
CWeaponModelInfo::ConvertAnimFileIndex(void)
|
||||
{
|
||||
if(m_animFileIndex != -1){
|
||||
// we have a string pointer in that union
|
||||
int32 index = CAnimManager::GetAnimationBlockIndex(m_animFileName);
|
||||
delete[] m_animFileName;
|
||||
m_animFileIndex = index;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CWeaponModelInfo::Init(void)
|
||||
{
|
||||
CSimpleModelInfo::Init();
|
||||
SetWeaponInfo(0);
|
||||
}
|
||||
|
||||
void
|
||||
CWeaponModelInfo::SetWeaponInfo(int32 weaponId)
|
||||
{
|
||||
m_atomics[2] = (RpAtomic*)weaponId;
|
||||
}
|
||||
|
||||
int32
|
||||
CWeaponModelInfo::GetWeaponInfo(void)
|
||||
{
|
||||
return (int32)(uintptr)m_atomics[2];
|
||||
}
|
||||
|
||||
void
|
||||
CWeaponModelInfo::SetAtomic(int n, RpAtomic *atomic)
|
||||
{
|
||||
CSimpleModelInfo::SetAtomic(n, atomic);
|
||||
CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderWeaponCB);
|
||||
}
|
||||
|
22
src/modelinfo/WeaponModelInfo.h
Normal file
22
src/modelinfo/WeaponModelInfo.h
Normal file
@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include "SimpleModelInfo.h"
|
||||
|
||||
class CWeaponModelInfo : public CSimpleModelInfo
|
||||
{
|
||||
union {
|
||||
int32 m_animFileIndex;
|
||||
char *m_animFileName;
|
||||
};
|
||||
public:
|
||||
CWeaponModelInfo(void) : CSimpleModelInfo(MITYPE_WEAPON) { m_animFileIndex = -1; }
|
||||
|
||||
virtual void SetAnimFile(const char *file);
|
||||
virtual void ConvertAnimFileIndex(void);
|
||||
virtual int GetAnimFileIndex(void) { return m_animFileIndex; }
|
||||
|
||||
void Init(void);
|
||||
void SetWeaponInfo(int32 weaponId);
|
||||
int32 GetWeaponInfo(void);
|
||||
void SetAtomic(int n, RpAtomic *atomic);
|
||||
};
|
Reference in New Issue
Block a user