mirror of
https://github.com/GTAmodding/re3.git
synced 2025-10-13 20:00:34 +00:00
first commit
This commit is contained in:
commit
600bf03514
116 changed files with 15132 additions and 0 deletions
156
src/modelinfo/ClumpModelInfo.cpp
Normal file
156
src/modelinfo/ClumpModelInfo.cpp
Normal file
|
@ -0,0 +1,156 @@
|
|||
#include "common.h"
|
||||
#include "patcher.h"
|
||||
#include "NodeName.h"
|
||||
#include "VisibilityPlugins.h"
|
||||
#include "ModelInfo.h"
|
||||
|
||||
void
|
||||
CClumpModelInfo::DeleteRwObject(void)
|
||||
{
|
||||
if(m_clump){
|
||||
RpClumpDestroy(m_clump);
|
||||
m_clump = nil;
|
||||
RemoveTexDictionaryRef();
|
||||
}
|
||||
}
|
||||
|
||||
RwObject*
|
||||
CClumpModelInfo::CreateInstance(void)
|
||||
{
|
||||
if(m_clump)
|
||||
return (RwObject*)RpClumpClone(m_clump);
|
||||
return nil;
|
||||
}
|
||||
|
||||
RwObject*
|
||||
CClumpModelInfo::CreateInstance(RwMatrix *m)
|
||||
{
|
||||
if(m_clump){
|
||||
RpClump *clump = (RpClump*)CreateInstance();
|
||||
*RwFrameGetMatrix(RpClumpGetFrame(clump)) = *m;
|
||||
return (RwObject*)clump;
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
RpAtomic*
|
||||
CClumpModelInfo::SetAtomicRendererCB(RpAtomic *atomic, void *data)
|
||||
{
|
||||
CVisibilityPlugins::SetAtomicRenderCallback(atomic, (RpAtomicCallBackRender)data);
|
||||
return atomic;
|
||||
}
|
||||
|
||||
void
|
||||
CClumpModelInfo::SetClump(RpClump *clump)
|
||||
{
|
||||
m_clump = clump;
|
||||
CVisibilityPlugins::SetClumpModelInfo(m_clump, this);
|
||||
AddTexDictionaryRef();
|
||||
RpClumpForAllAtomics(clump, SetAtomicRendererCB, nil);
|
||||
if(strncmp(GetName(), "playerh", 8) == 0)
|
||||
RpClumpForAllAtomics(clump, SetAtomicRendererCB, CVisibilityPlugins::RenderPlayerCB);
|
||||
}
|
||||
|
||||
void
|
||||
CClumpModelInfo::SetFrameIds(RwObjectNameIdAssocation *assocs)
|
||||
{
|
||||
int32 i;
|
||||
RwObjectNameAssociation objname;
|
||||
|
||||
for(i = 0; assocs[i].name; i++)
|
||||
if((assocs[i].flags & CLUMP_FLAG_NO_HIERID) == 0){
|
||||
objname.frame = nil;
|
||||
objname.name = assocs[i].name;
|
||||
RwFrameForAllChildren(RpClumpGetFrame(m_clump), FindFrameFromNameWithoutIdCB, &objname);
|
||||
if(objname.frame)
|
||||
CVisibilityPlugins::SetFrameHierarchyId(objname.frame, assocs[i].hierId);
|
||||
}
|
||||
}
|
||||
|
||||
RwFrame*
|
||||
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{
|
||||
assoc->frame = frame;
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
RwFrame*
|
||||
CClumpModelInfo::FindFrameFromNameCB(RwFrame *frame, void *data)
|
||||
{
|
||||
RwObjectNameAssociation *assoc = (RwObjectNameAssociation*)data;
|
||||
|
||||
if(_strcmpi(GetFrameNodeName(frame), assoc->name) != 0){
|
||||
RwFrameForAllChildren(frame, FindFrameFromNameCB, assoc);
|
||||
return assoc->frame ? nil : frame;
|
||||
}else{
|
||||
assoc->frame = frame;
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
RwFrame*
|
||||
CClumpModelInfo::FindFrameFromNameWithoutIdCB(RwFrame *frame, void *data)
|
||||
{
|
||||
RwObjectNameAssociation *assoc = (RwObjectNameAssociation*)data;
|
||||
|
||||
if(CVisibilityPlugins::GetFrameHierarchyId(frame) ||
|
||||
_strcmpi(GetFrameNodeName(frame), assoc->name) != 0){
|
||||
RwFrameForAllChildren(frame, FindFrameFromNameWithoutIdCB, assoc);
|
||||
return assoc->frame ? nil : frame;
|
||||
}else{
|
||||
assoc->frame = frame;
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
RwFrame*
|
||||
CClumpModelInfo::FillFrameArrayCB(RwFrame *frame, void *data)
|
||||
{
|
||||
int32 id;
|
||||
RwFrame **frames = (RwFrame**)data;
|
||||
id = CVisibilityPlugins::GetFrameHierarchyId(frame);
|
||||
if(id > 0)
|
||||
frames[id] = frame;
|
||||
RwFrameForAllChildren(frame, FillFrameArrayCB, data);
|
||||
return frame;
|
||||
}
|
||||
|
||||
void
|
||||
CClumpModelInfo::FillFrameArray(RpClump *clump, RwFrame **frames)
|
||||
{
|
||||
RwFrameForAllChildren(RpClumpGetFrame(clump), FillFrameArrayCB, frames);
|
||||
}
|
||||
|
||||
RwFrame*
|
||||
CClumpModelInfo::GetFrameFromId(RpClump *clump, int32 id)
|
||||
{
|
||||
RwObjectIdAssociation assoc;
|
||||
assoc.id = id;
|
||||
assoc.frame = nil;
|
||||
RwFrameForAllChildren(RpClumpGetFrame(clump), FindFrameFromIdCB, &assoc);
|
||||
return assoc.frame;
|
||||
}
|
||||
|
||||
|
||||
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
|
Loading…
Add table
Add a link
Reference in a new issue