mirror of
https://git.rip/DMCA_FUCKER/re3.git
synced 2024-11-05 10:55:54 +00:00
Merge remote-tracking branch 'upstream/miami' into miami
This commit is contained in:
commit
512f5657f7
|
@ -413,6 +413,13 @@ char const *aPlayerBBBatAnimations[] = {
|
|||
"IDLE_STANCE",
|
||||
"walk_start",
|
||||
};
|
||||
char const *aPlayerChainsawAnimations[] = {
|
||||
"walk_csaw",
|
||||
"run_csaw",
|
||||
"run_csaw",
|
||||
"IDLE_csaw",
|
||||
"walk_start_csaw",
|
||||
};
|
||||
char const *aShuffleAnimations[] = {
|
||||
"WALK_shuffle",
|
||||
"RUN_civi",
|
||||
|
@ -449,6 +456,12 @@ char const *aOldFatAnimations[] = {
|
|||
"woman_runpanic",
|
||||
"idle_stance",
|
||||
};
|
||||
char const *aJoggerAnimations[] = {
|
||||
"JOG_maleA",
|
||||
"run_civi",
|
||||
"sprint_civi",
|
||||
"idle_stance",
|
||||
};
|
||||
char const *aStdWomanAnimations[] = {
|
||||
"woman_walknorm",
|
||||
"woman_run",
|
||||
|
@ -473,14 +486,20 @@ char const *aSexyWomanAnimations[] = {
|
|||
"woman_runpanic",
|
||||
"woman_idlestance",
|
||||
};
|
||||
char const *aFatWomanAnimations[] = {
|
||||
"walk_fat",
|
||||
"woman_run",
|
||||
"woman_runpanic",
|
||||
"woman_idlestance",
|
||||
};
|
||||
char const *aOldWomanAnimations[] = {
|
||||
"woman_walkold",
|
||||
"woman_run",
|
||||
"woman_runpanic",
|
||||
"woman_idlestance",
|
||||
};
|
||||
char const *aFatWomanAnimations[] = {
|
||||
"walk_fat",
|
||||
char const *aJoggerWomanAnimations[] = {
|
||||
"JOG_maleB",
|
||||
"woman_run",
|
||||
"woman_runpanic",
|
||||
"woman_idlestance",
|
||||
|
@ -491,22 +510,28 @@ char const *aPanicChunkyAnimations[] = {
|
|||
"woman_runpanic",
|
||||
"idle_stance",
|
||||
};
|
||||
char const *aSkateAnimations[] = {
|
||||
"skate_run",
|
||||
"skate_sprint",
|
||||
"skate_sprint",
|
||||
"skate_idle",
|
||||
};
|
||||
char const *aPlayerStrafeBackAnimations[] = {
|
||||
"walk_player_back",
|
||||
"run_player_back",
|
||||
"run_player_back",
|
||||
"walk_back",
|
||||
"run_back",
|
||||
"run_back",
|
||||
"IDLE_STANCE",
|
||||
"walk_start_back",
|
||||
};
|
||||
char const *aPlayerStrafeLeftAnimations[] = {
|
||||
"walk_player_left",
|
||||
"walk_left",
|
||||
"run_left",
|
||||
"run_left",
|
||||
"IDLE_STANCE",
|
||||
"walk_start_left",
|
||||
};
|
||||
char const *aPlayerStrafeRightAnimations[] = {
|
||||
"walk_player_right",
|
||||
"walk_right",
|
||||
"run_right",
|
||||
"run_right",
|
||||
"IDLE_STANCE",
|
||||
|
@ -533,6 +558,28 @@ char const *aRocketStrafeRightAnimations[] = {
|
|||
"idle_rocket",
|
||||
"walkst_rocket_right",
|
||||
};
|
||||
char const *aChainsawStrafeBackAnimations[] = {
|
||||
"walk_csaw_back",
|
||||
"run_csaw_back",
|
||||
"run_csaw_back",
|
||||
"idle_csaw",
|
||||
"walkst_csaw_back",
|
||||
};
|
||||
char const *aChainsawStrafeLeftAnimations[] = {
|
||||
"walk_csaw_left",
|
||||
"run_csaw_left",
|
||||
"run_csaw_left",
|
||||
"idle_csaw",
|
||||
"walkst_csaw_left",
|
||||
};
|
||||
char const *aChainsawStrafeRightAnimations[] = {
|
||||
"walk_csaw_right",
|
||||
"run_csaw_right",
|
||||
"run_csaw_right",
|
||||
"idle_csaw",
|
||||
"walkst_csaw_right",
|
||||
};
|
||||
|
||||
const AnimAssocDefinition CAnimManager::ms_aAnimAssocDefinitions[NUM_ANIM_ASSOC_GROUPS] = {
|
||||
{ "man", "ped", MI_COP, 173, aStdAnimations, aStdAnimDescs },
|
||||
{ "player", "ped", MI_COP, 5, aPlayerAnimations, aStdAnimDescs },
|
||||
|
@ -540,25 +587,32 @@ const AnimAssocDefinition CAnimManager::ms_aAnimAssocDefinitions[NUM_ANIM_ASSOC_
|
|||
{ "player1armed", "ped", MI_COP, 5, aPlayer1ArmedAnimations, aStdAnimDescs },
|
||||
{ "player2armed", "ped", MI_COP, 5, aPlayer2ArmedAnimations, aStdAnimDescs },
|
||||
{ "playerBBBat", "ped", MI_COP, 5, aPlayerBBBatAnimations, aStdAnimDescs },
|
||||
{ "playercsaw", "ped", MI_COP, 5, aPlayerChainsawAnimations, aStdAnimDescs },
|
||||
{ "shuffle", "ped", MI_COP, 4, aShuffleAnimations, aStdAnimDescs },
|
||||
{ "oldman", "ped", MI_COP, 4, aOldAnimations, aStdAnimDescs },
|
||||
{ "gang1", "ped", MI_COP, 4, aGang1Animations, aStdAnimDescs },
|
||||
{ "gang2", "ped", MI_COP, 4, aGang2Animations, aStdAnimDescs },
|
||||
{ "fatman", "ped", MI_COP, 4, aFatAnimations, aStdAnimDescs },
|
||||
{ "oldfatman", "ped", MI_COP, 4, aOldFatAnimations, aStdAnimDescs },
|
||||
{ "jogger", "ped", MI_COP, 4, aJoggerAnimations, aStdAnimDescs },
|
||||
{ "woman", "ped", MI_COP, 4, aStdWomanAnimations, aStdAnimDescs },
|
||||
{ "shopping", "ped", MI_COP, 4, aWomanShopAnimations, aStdAnimDescs },
|
||||
{ "busywoman", "ped", MI_COP, 4, aBusyWomanAnimations, aStdAnimDescs },
|
||||
{ "sexywoman", "ped", MI_COP, 4, aSexyWomanAnimations, aStdAnimDescs },
|
||||
{ "oldwoman", "ped", MI_COP, 4, aOldWomanAnimations, aStdAnimDescs },
|
||||
{ "fatwoman", "ped", MI_COP, 4, aFatWomanAnimations, aStdAnimDescs },
|
||||
{ "oldwoman", "ped", MI_COP, 4, aOldWomanAnimations, aStdAnimDescs },
|
||||
{ "jogwoman", "ped", MI_COP, 4, aJoggerWomanAnimations, aStdAnimDescs },
|
||||
{ "panicchunky", "ped", MI_COP, 4, aPanicChunkyAnimations, aStdAnimDescs },
|
||||
{ "skate", "skate", MI_COP, 4, aSkateAnimations, aStdAnimDescs },
|
||||
{ "playerback", "ped", MI_COP, 5, aPlayerStrafeBackAnimations, aStdAnimDescs },
|
||||
{ "playerleft", "ped", MI_COP, 5, aPlayerStrafeLeftAnimations, aStdAnimDescsSide },
|
||||
{ "playerright", "ped", MI_COP, 5, aPlayerStrafeRightAnimations, aStdAnimDescsSide },
|
||||
{ "rocketback", "ped", MI_COP, 5, aRocketStrafeBackAnimations, aStdAnimDescs },
|
||||
{ "rocketleft", "ped", MI_COP, 5, aRocketStrafeLeftAnimations, aStdAnimDescsSide },
|
||||
{ "rocketright", "ped", MI_COP, 5, aRocketStrafeRightAnimations, aStdAnimDescsSide },
|
||||
{ "csawback", "ped", MI_COP, 5, aChainsawStrafeBackAnimations, aStdAnimDescs },
|
||||
{ "csawleft", "ped", MI_COP, 5, aChainsawStrafeLeftAnimations, aStdAnimDescsSide },
|
||||
{ "csawright", "ped", MI_COP, 5, aChainsawStrafeRightAnimations, aStdAnimDescsSide },
|
||||
};
|
||||
|
||||
void
|
||||
|
|
|
@ -11,25 +11,32 @@ enum AssocGroupId
|
|||
ASSOCGRP_PLAYER1ARMED,
|
||||
ASSOCGRP_PLAYER2ARMED,
|
||||
ASSOCGRP_PLAYERBBBAT,
|
||||
ASSOCGRP_PLAYERCHAINSAW,
|
||||
ASSOCGRP_SHUFFLE,
|
||||
ASSOCGRP_OLD,
|
||||
ASSOCGRP_GANG1,
|
||||
ASSOCGRP_GANG2,
|
||||
ASSOCGRP_FAT,
|
||||
ASSOCGRP_OLDFAT,
|
||||
ASSOCGRP_JOGGER,
|
||||
ASSOCGRP_WOMAN,
|
||||
ASSOCGRP_WOMANSHOP,
|
||||
ASSOCGRP_BUSYWOMAN,
|
||||
ASSOCGRP_SEXYWOMAN,
|
||||
ASSOCGRP_OLDWOMAN,
|
||||
ASSOCGRP_FATWOMAN,
|
||||
ASSOCGRP_OLDWOMAN,
|
||||
ASSOCGRP_JOGWOMAN,
|
||||
ASSOCGRP_PANICCHUNKY,
|
||||
ASSOCGRP_SKATE,
|
||||
ASSOCGRP_PLAYERBACK,
|
||||
ASSOCGRP_PLAYERLEFT,
|
||||
ASSOCGRP_PLAYERRIGHT,
|
||||
ASSOCGRP_ROCKETBACK,
|
||||
ASSOCGRP_ROCKETLEFT,
|
||||
ASSOCGRP_ROCKETRIGHT,
|
||||
ASSOCGRP_CHAINSAWBACK,
|
||||
ASSOCGRP_CHAINSAWLEFT,
|
||||
ASSOCGRP_CHAINSAWRIGHT,
|
||||
|
||||
NUM_ANIM_ASSOC_GROUPS // should be 61 in the end
|
||||
};
|
||||
|
|
|
@ -368,13 +368,7 @@ CAnimViewer::Update(void)
|
|||
} else {
|
||||
// Originally it was GetPad(1)->LeftShoulder2
|
||||
if (pad->NewState.Triangle) {
|
||||
#ifdef PED_SKIN
|
||||
if(IsClumpSkinned(pTarget->GetClump()))
|
||||
((CPedModelInfo *)CModelInfo::GetModelInfo(pTarget->GetModelIndex()))->AnimatePedColModelSkinned(pTarget->GetClump());
|
||||
else
|
||||
#endif
|
||||
CPedModelInfo::AnimatePedColModel(((CPedModelInfo *)CModelInfo::GetModelInfo(pTarget->GetModelIndex()))->GetHitColModel(),
|
||||
RpClumpGetFrame(pTarget->GetClump()));
|
||||
((CPedModelInfo *)CModelInfo::GetModelInfo(pTarget->GetModelIndex()))->AnimatePedColModelSkinned(pTarget->GetClump());
|
||||
AsciiToUnicode("Ped Col model will be animated as long as you hold the button", gUString);
|
||||
CMessages::AddMessage(gUString, 100, 0);
|
||||
}
|
||||
|
|
|
@ -443,14 +443,6 @@ CFileLoader::LoadClumpFile(RwStream *stream, uint32 id)
|
|||
return false;
|
||||
mi = (CClumpModelInfo*)CModelInfo::GetModelInfo(id);
|
||||
mi->SetClump(clump);
|
||||
if (mi->GetModelType() == MITYPE_PED && id != 0 && RwStreamFindChunk(stream, rwID_CLUMP, nil, nil)) {
|
||||
// Read LOD ped
|
||||
clump = RpClumpStreamRead(stream);
|
||||
if(clump){
|
||||
((CPedModelInfo*)mi)->SetLowDetailClump(clump);
|
||||
RpClumpDestroy(clump);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -339,11 +339,8 @@ CWorld::ProcessLineOfSightSectorList(CPtrList &list, const CColLine &line, CColP
|
|||
|
||||
if(e->IsPed()) {
|
||||
if(e->bUsesCollision || deadPeds && ((CPed *)e)->m_nPedState == PED_DEAD) {
|
||||
#ifdef PED_SKIN
|
||||
if(IsClumpSkinned(e->GetClump()))
|
||||
colmodel = ((CPedModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex()))->AnimatePedColModelSkinned(e->GetClump());
|
||||
else
|
||||
#endif
|
||||
colmodel = ((CPedModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex()))->AnimatePedColModelSkinned(e->GetClump());
|
||||
/* this should all be gone, right?
|
||||
if(((CPed *)e)->UseGroundColModel())
|
||||
colmodel = &CTempColModels::ms_colModelPedGroundHit;
|
||||
else
|
||||
|
@ -357,8 +354,10 @@ CWorld::ProcessLineOfSightSectorList(CPtrList &list, const CColLine &line, CColP
|
|||
((CPedModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex()))
|
||||
->GetHitColModel();
|
||||
#endif
|
||||
*/
|
||||
} else
|
||||
colmodel = nil;
|
||||
|
||||
} else if(e->bUsesCollision)
|
||||
colmodel = CModelInfo::GetModelInfo(e->GetModelIndex())->GetColModel();
|
||||
|
||||
|
|
|
@ -9,33 +9,18 @@
|
|||
#include "VisibilityPlugins.h"
|
||||
#include "ModelInfo.h"
|
||||
|
||||
//--MIAMI: file done
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
// leftover...
|
||||
RwObjectNameIdAssocation CPedModelInfo::m_pPedIds[PED_NODE_MAX] = {
|
||||
{ "Smid", PED_MID, 0, }, // that is strange...
|
||||
{ "Shead", PED_HEAD, 0, },
|
||||
|
@ -51,131 +36,16 @@ RwObjectNameIdAssocation CPedModelInfo::m_pPedIds[PED_NODE_MAX] = {
|
|||
{ 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);
|
||||
SetFrameIds(m_pPedIds); // not needed in VC actually
|
||||
if(m_hitColModel == nil)
|
||||
CreateHitColModel();
|
||||
if(strncmp(GetName(), "player", 7) == 0)
|
||||
CreateHitColModelSkinned(clump);
|
||||
RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPedCB);
|
||||
if(strcmp(GetName(), "player") == 0)
|
||||
RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB);
|
||||
#endif
|
||||
}
|
||||
|
||||
RpAtomic*
|
||||
CountAtomicsCB(RpAtomic *atomic, void *data)
|
||||
{
|
||||
(*(int32*)data)++;
|
||||
return atomic;
|
||||
}
|
||||
|
||||
RpAtomic*
|
||||
GetAtomicListCB(RpAtomic *atomic, void *data)
|
||||
{
|
||||
**(RpAtomic***)data = atomic;
|
||||
(*(RpAtomic***)data)++;
|
||||
return atomic;
|
||||
}
|
||||
|
||||
RwFrame*
|
||||
FindPedFrameFromNameCB(RwFrame *frame, void *data)
|
||||
{
|
||||
RwObjectNameAssociation *assoc = (RwObjectNameAssociation*)data;
|
||||
|
||||
if(CGeneral::faststricmp(GetFrameNodeName(frame)+1, assoc->name+1)){
|
||||
RwFrameForAllChildren(frame, FindPedFrameFromNameCB, assoc);
|
||||
return assoc->frame ? nil : frame;
|
||||
}else{
|
||||
assoc->frame = frame;
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CPedModelInfo::SetLowDetailClump(RpClump *lodclump)
|
||||
{
|
||||
RpAtomic *atomics[16];
|
||||
RpAtomic **pAtm;
|
||||
int32 numAtm, numLodAtm;
|
||||
int i;
|
||||
RwObjectNameAssociation assoc;
|
||||
|
||||
numAtm = 0;
|
||||
numLodAtm = 0;
|
||||
RpClumpForAllAtomics(m_clump, CountAtomicsCB, &numAtm); // actually unused
|
||||
RpClumpForAllAtomics(lodclump, CountAtomicsCB, &numLodAtm);
|
||||
|
||||
RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPedHiDetailCB);
|
||||
RpClumpForAllAtomics(lodclump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPedLowDetailCB);
|
||||
|
||||
pAtm = atomics;
|
||||
RpClumpForAllAtomics(lodclump, GetAtomicListCB, &pAtm);
|
||||
|
||||
for(i = 0; i < numLodAtm; i++){
|
||||
assoc.name = GetFrameNodeName(RpAtomicGetFrame(atomics[i]));
|
||||
assoc.frame = nil;
|
||||
RwFrameForAllChildren(RpClumpGetFrame(m_clump), FindPedFrameFromNameCB, &assoc);
|
||||
if(assoc.frame){
|
||||
RpAtomicSetFrame(atomics[i], assoc.frame);
|
||||
RpClumpRemoveAtomic(lodclump, atomics[i]);
|
||||
RpClumpAddAtomic(m_clump, atomics[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct ColNodeInfo
|
||||
|
@ -201,114 +71,6 @@ ColNodeInfo m_pColNodeInfos[NUMPEDINFONODES] = {
|
|||
{ nil, PED_FOOTR, PEDPIECE_RIGHTLEG, 0.0f, 0.15f, 0.15f },
|
||||
};
|
||||
|
||||
RwObject*
|
||||
FindHeadRadiusCB(RwObject *object, void *data)
|
||||
{
|
||||
RpAtomic *atomic = (RpAtomic*)object;
|
||||
*(float*)data = RpAtomicGetBoundingSphere(atomic)->radius;
|
||||
return nil;
|
||||
}
|
||||
|
||||
void
|
||||
CPedModelInfo::CreateHitColModel(void)
|
||||
{
|
||||
RwObjectNameAssociation nameAssoc;
|
||||
RwObjectIdAssociation idAssoc;
|
||||
CVector center;
|
||||
RwFrame *nodeFrame;
|
||||
CColModel *colmodel = new CColModel;
|
||||
CColSphere *spheres = (CColSphere*)RwMalloc(NUMPEDINFONODES*sizeof(CColSphere));
|
||||
RwFrame *root = RpClumpGetFrame(m_clump);
|
||||
RwMatrix *mat = RwMatrixCreate();
|
||||
for(int i = 0; i < NUMPEDINFONODES; i++){
|
||||
nodeFrame = nil;
|
||||
if(m_pColNodeInfos[i].name){
|
||||
nameAssoc.name = m_pColNodeInfos[i].name;
|
||||
nameAssoc.frame = nil;
|
||||
RwFrameForAllChildren(root, FindFrameFromNameCB, &nameAssoc);
|
||||
nodeFrame = nameAssoc.frame;
|
||||
}else{
|
||||
idAssoc.id = m_pColNodeInfos[i].pedNode;
|
||||
idAssoc.frame = nil;
|
||||
RwFrameForAllChildren(root, FindFrameFromIdCB, &idAssoc);
|
||||
nodeFrame = idAssoc.frame;
|
||||
}
|
||||
if(nodeFrame){
|
||||
float radius = m_pColNodeInfos[i].radius;
|
||||
if(m_pColNodeInfos[i].pieceType == PEDPIECE_HEAD)
|
||||
RwFrameForAllObjects(nodeFrame, FindHeadRadiusCB, &radius);
|
||||
RwMatrixTransform(mat, RwFrameGetMatrix(nodeFrame), rwCOMBINEREPLACE);
|
||||
const char *name = GetFrameNodeName(nodeFrame);
|
||||
for(nodeFrame = RwFrameGetParent(nodeFrame);
|
||||
nodeFrame;
|
||||
nodeFrame = RwFrameGetParent(nodeFrame)){
|
||||
name = GetFrameNodeName(nodeFrame);
|
||||
RwMatrixTransform(mat, RwFrameGetMatrix(nodeFrame), rwCOMBINEPOSTCONCAT);
|
||||
if(RwFrameGetParent(nodeFrame) == root)
|
||||
break;
|
||||
}
|
||||
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, SURFACE_FLESH, m_pColNodeInfos[i].pieceType);
|
||||
}
|
||||
}
|
||||
RwMatrixDestroy(mat);
|
||||
colmodel->spheres = spheres;
|
||||
colmodel->numSpheres = NUMPEDINFONODES;
|
||||
center.x = center.y = center.z = 0.0f;
|
||||
colmodel->boundingSphere.Set(2.0f, center);
|
||||
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);
|
||||
colmodel->level = LEVEL_NONE;
|
||||
m_hitColModel = colmodel;
|
||||
}
|
||||
|
||||
CColModel*
|
||||
CPedModelInfo::AnimatePedColModel(CColModel* colmodel, RwFrame* frame)
|
||||
{
|
||||
RwObjectNameAssociation nameAssoc;
|
||||
RwObjectIdAssociation idAssoc;
|
||||
RwMatrix* mat = RwMatrixCreate();
|
||||
CColSphere* spheres = colmodel->spheres;
|
||||
|
||||
for (int i = 0; i < NUMPEDINFONODES; i++) {
|
||||
RwFrame* f = nil;
|
||||
if (m_pColNodeInfos[i].name) {
|
||||
nameAssoc.name = m_pColNodeInfos[i].name;
|
||||
nameAssoc.frame = nil;
|
||||
RwFrameForAllChildren(frame, FindFrameFromNameCB, &nameAssoc);
|
||||
f = nameAssoc.frame;
|
||||
}
|
||||
else {
|
||||
idAssoc.id = m_pColNodeInfos[i].pedNode;
|
||||
idAssoc.frame = nil;
|
||||
RwFrameForAllChildren(frame, FindFrameFromIdCB, &idAssoc);
|
||||
f = idAssoc.frame;
|
||||
}
|
||||
if (f) {
|
||||
RwMatrixCopy(mat, RwFrameGetMatrix(f));
|
||||
|
||||
for (f = RwFrameGetParent(f); f; f = RwFrameGetParent(f)) {
|
||||
RwMatrixTransform(mat, RwFrameGetMatrix(f), rwCOMBINEPOSTCONCAT);
|
||||
if (RwFrameGetParent(f) == frame)
|
||||
break;
|
||||
}
|
||||
|
||||
spheres[i].center.x = mat->pos.x + m_pColNodeInfos[i].x;
|
||||
spheres[i].center.y = mat->pos.y + 0.0f;
|
||||
spheres[i].center.z = mat->pos.z + m_pColNodeInfos[i].z;
|
||||
}
|
||||
}
|
||||
|
||||
return colmodel;
|
||||
}
|
||||
|
||||
#ifdef PED_SKIN
|
||||
void
|
||||
CPedModelInfo::CreateHitColModelSkinned(RpClump *clump)
|
||||
{
|
||||
|
@ -384,4 +146,26 @@ CPedModelInfo::AnimatePedColModelSkinned(RpClump *clump)
|
|||
return m_hitColModel;
|
||||
}
|
||||
|
||||
#endif
|
||||
CColModel*
|
||||
CPedModelInfo::AnimatePedColModelSkinnedWorld(RpClump *clump)
|
||||
{
|
||||
if(m_hitColModel == nil)
|
||||
CreateHitColModelSkinned(clump);
|
||||
CColSphere *spheres = m_hitColModel->spheres;
|
||||
RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(clump);
|
||||
RwMatrix *mat;
|
||||
|
||||
for(int i = 0; i < NUMPEDINFONODES; i++){
|
||||
int id = ConvertPedNode2BoneTag(m_pColNodeInfos[i].pedNode);
|
||||
int idx = RpHAnimIDGetIndex(hier, id);
|
||||
|
||||
mat = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
|
||||
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;
|
||||
}
|
||||
return m_hitColModel;
|
||||
}
|
||||
|
|
|
@ -36,32 +36,17 @@ public:
|
|||
ePedStats m_pedStatType;
|
||||
uint32 m_carsCanDrive;
|
||||
CColModel *m_hitColModel;
|
||||
#ifdef PED_SKIN
|
||||
RpAtomic *m_head;
|
||||
RpAtomic *m_lhand;
|
||||
RpAtomic *m_rhand;
|
||||
#endif
|
||||
int8 radio1, radio2;
|
||||
|
||||
static RwObjectNameIdAssocation m_pPedIds[PED_NODE_MAX];
|
||||
|
||||
CPedModelInfo(void) : CClumpModelInfo(MITYPE_PED) { }
|
||||
CPedModelInfo(void) : CClumpModelInfo(MITYPE_PED) { m_hitColModel = nil; }
|
||||
~CPedModelInfo(void) { delete m_hitColModel; }
|
||||
void DeleteRwObject(void);
|
||||
void SetClump(RpClump *);
|
||||
|
||||
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
|
||||
CColModel *AnimatePedColModelSkinnedWorld(RpClump *clump);
|
||||
};
|
||||
#ifndef PED_SKIN
|
||||
static_assert(sizeof(CPedModelInfo) == 0x48, "CPedModelInfo: error");
|
||||
#endif
|
|
@ -5153,12 +5153,9 @@ CPed::FightStrike(CVector &touchedNodePos)
|
|||
// He can beat us
|
||||
if (sq(maxDistanceToBeBeaten) > potentialAttackDistance.MagnitudeSqr()) {
|
||||
|
||||
#ifdef PED_SKIN
|
||||
// Have to animate a skinned clump because the initial col model is useless
|
||||
if(IsClumpSkinned(GetClump()))
|
||||
ourCol = ((CPedModelInfo *)CModelInfo::GetModelInfo(GetModelIndex()))->AnimatePedColModelSkinned(GetClump());
|
||||
else
|
||||
#endif
|
||||
ourCol = ((CPedModelInfo *)CModelInfo::GetModelInfo(GetModelIndex()))->AnimatePedColModelSkinned(GetClump());
|
||||
/* this should all be gone, right?
|
||||
if (nearPed->m_nPedState == PED_FALL
|
||||
|| nearPed->m_nPedState == PED_DEAD || nearPed->m_nPedState == PED_DIE
|
||||
|| !nearPed->IsPedHeadAbovePos(-0.3f)) {
|
||||
|
@ -5171,6 +5168,7 @@ CPed::FightStrike(CVector &touchedNodePos)
|
|||
ourCol = ((CPedModelInfo*)CModelInfo::GetModelInfo(m_modelIndex))->GetHitColModel();
|
||||
#endif
|
||||
}
|
||||
*/
|
||||
|
||||
for (int j = 0; j < ourCol->numSpheres; j++) {
|
||||
attackDistance = nearPed->GetPosition() + ourCol->spheres[j].center;
|
||||
|
@ -12606,13 +12604,7 @@ CPed::Render(void)
|
|||
bRenderPedInCar && sq(25.0f * TheCamera.LODDistMultiplier) >= (TheCamera.GetPosition() - GetPosition()).MagnitudeSqr()) {
|
||||
CEntity::Render();
|
||||
|
||||
#ifdef PED_SKIN
|
||||
if(IsClumpSkinned(GetClump())){
|
||||
renderLimb(PED_HEAD);
|
||||
renderLimb(PED_HANDL);
|
||||
renderLimb(PED_HANDR);
|
||||
}
|
||||
if(m_pWeaponModel && IsClumpSkinned(GetClump())){
|
||||
if(m_pWeaponModel){
|
||||
RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(GetClump());
|
||||
int idx = RpHAnimIDGetIndex(hier, m_pFrames[PED_HANDR]->nodeID);
|
||||
RwMatrix *mat = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
|
||||
|
@ -12621,51 +12613,9 @@ CPed::Render(void)
|
|||
RwFrameUpdateObjects(frame);
|
||||
RpAtomicRender(m_pWeaponModel);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PED_SKIN
|
||||
static RpMaterial*
|
||||
SetLimbAlphaCB(RpMaterial *material, void *data)
|
||||
{
|
||||
((RwRGBA*)RpMaterialGetColor(material))->alpha = *(uint8*)data;
|
||||
return material;
|
||||
}
|
||||
|
||||
void
|
||||
CPed::renderLimb(int node)
|
||||
{
|
||||
RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(GetClump());
|
||||
int idx = RpHAnimIDGetIndex(hier, m_pFrames[node]->nodeID);
|
||||
RwMatrix *mat = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
|
||||
CPedModelInfo *mi = (CPedModelInfo *)CModelInfo::GetModelInfo(GetModelIndex());
|
||||
RpAtomic *atomic;
|
||||
switch(node){
|
||||
case PED_HEAD:
|
||||
atomic = mi->getHead();
|
||||
break;
|
||||
case PED_HANDL:
|
||||
atomic = mi->getLeftHand();
|
||||
break;
|
||||
case PED_HANDR:
|
||||
atomic = mi->getRightHand();
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
if(atomic == nil)
|
||||
return;
|
||||
|
||||
RwFrame *frame = RpAtomicGetFrame(atomic);
|
||||
*RwFrameGetMatrix(frame) = *mat;
|
||||
RwFrameUpdateObjects(frame);
|
||||
int alpha = CVisibilityPlugins::GetClumpAlpha(GetClump());
|
||||
RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), SetLimbAlphaCB, &alpha);
|
||||
RpAtomicRender(atomic);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
CPed::ProcessObjective(void)
|
||||
{
|
||||
|
|
|
@ -890,10 +890,6 @@ public:
|
|||
void DebugRenderOnePedText(void);
|
||||
#endif
|
||||
|
||||
#ifdef PED_SKIN
|
||||
void renderLimb(int node);
|
||||
#endif
|
||||
|
||||
#ifdef COMPATIBLE_SAVES
|
||||
virtual void Save(uint8*& buf);
|
||||
virtual void Load(uint8*& buf);
|
||||
|
|
Loading…
Reference in a new issue