1
0
Fork 0
mirror of https://git.rip/DMCA_FUCKER/re3.git synced 2024-11-10 20:39:15 +00:00

Merge remote-tracking branch 'upstream/miami' into miami

This commit is contained in:
Nikolay Korolev 2020-05-10 15:24:09 +03:00
commit 512f5657f7
9 changed files with 114 additions and 353 deletions

View file

@ -413,6 +413,13 @@ char const *aPlayerBBBatAnimations[] = {
"IDLE_STANCE", "IDLE_STANCE",
"walk_start", "walk_start",
}; };
char const *aPlayerChainsawAnimations[] = {
"walk_csaw",
"run_csaw",
"run_csaw",
"IDLE_csaw",
"walk_start_csaw",
};
char const *aShuffleAnimations[] = { char const *aShuffleAnimations[] = {
"WALK_shuffle", "WALK_shuffle",
"RUN_civi", "RUN_civi",
@ -449,6 +456,12 @@ char const *aOldFatAnimations[] = {
"woman_runpanic", "woman_runpanic",
"idle_stance", "idle_stance",
}; };
char const *aJoggerAnimations[] = {
"JOG_maleA",
"run_civi",
"sprint_civi",
"idle_stance",
};
char const *aStdWomanAnimations[] = { char const *aStdWomanAnimations[] = {
"woman_walknorm", "woman_walknorm",
"woman_run", "woman_run",
@ -473,14 +486,20 @@ char const *aSexyWomanAnimations[] = {
"woman_runpanic", "woman_runpanic",
"woman_idlestance", "woman_idlestance",
}; };
char const *aFatWomanAnimations[] = {
"walk_fat",
"woman_run",
"woman_runpanic",
"woman_idlestance",
};
char const *aOldWomanAnimations[] = { char const *aOldWomanAnimations[] = {
"woman_walkold", "woman_walkold",
"woman_run", "woman_run",
"woman_runpanic", "woman_runpanic",
"woman_idlestance", "woman_idlestance",
}; };
char const *aFatWomanAnimations[] = { char const *aJoggerWomanAnimations[] = {
"walk_fat", "JOG_maleB",
"woman_run", "woman_run",
"woman_runpanic", "woman_runpanic",
"woman_idlestance", "woman_idlestance",
@ -491,22 +510,28 @@ char const *aPanicChunkyAnimations[] = {
"woman_runpanic", "woman_runpanic",
"idle_stance", "idle_stance",
}; };
char const *aSkateAnimations[] = {
"skate_run",
"skate_sprint",
"skate_sprint",
"skate_idle",
};
char const *aPlayerStrafeBackAnimations[] = { char const *aPlayerStrafeBackAnimations[] = {
"walk_player_back", "walk_back",
"run_player_back", "run_back",
"run_player_back", "run_back",
"IDLE_STANCE", "IDLE_STANCE",
"walk_start_back", "walk_start_back",
}; };
char const *aPlayerStrafeLeftAnimations[] = { char const *aPlayerStrafeLeftAnimations[] = {
"walk_player_left", "walk_left",
"run_left", "run_left",
"run_left", "run_left",
"IDLE_STANCE", "IDLE_STANCE",
"walk_start_left", "walk_start_left",
}; };
char const *aPlayerStrafeRightAnimations[] = { char const *aPlayerStrafeRightAnimations[] = {
"walk_player_right", "walk_right",
"run_right", "run_right",
"run_right", "run_right",
"IDLE_STANCE", "IDLE_STANCE",
@ -533,6 +558,28 @@ char const *aRocketStrafeRightAnimations[] = {
"idle_rocket", "idle_rocket",
"walkst_rocket_right", "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] = { const AnimAssocDefinition CAnimManager::ms_aAnimAssocDefinitions[NUM_ANIM_ASSOC_GROUPS] = {
{ "man", "ped", MI_COP, 173, aStdAnimations, aStdAnimDescs }, { "man", "ped", MI_COP, 173, aStdAnimations, aStdAnimDescs },
{ "player", "ped", MI_COP, 5, aPlayerAnimations, 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 }, { "player1armed", "ped", MI_COP, 5, aPlayer1ArmedAnimations, aStdAnimDescs },
{ "player2armed", "ped", MI_COP, 5, aPlayer2ArmedAnimations, aStdAnimDescs }, { "player2armed", "ped", MI_COP, 5, aPlayer2ArmedAnimations, aStdAnimDescs },
{ "playerBBBat", "ped", MI_COP, 5, aPlayerBBBatAnimations, aStdAnimDescs }, { "playerBBBat", "ped", MI_COP, 5, aPlayerBBBatAnimations, aStdAnimDescs },
{ "playercsaw", "ped", MI_COP, 5, aPlayerChainsawAnimations, aStdAnimDescs },
{ "shuffle", "ped", MI_COP, 4, aShuffleAnimations, aStdAnimDescs }, { "shuffle", "ped", MI_COP, 4, aShuffleAnimations, aStdAnimDescs },
{ "oldman", "ped", MI_COP, 4, aOldAnimations, aStdAnimDescs }, { "oldman", "ped", MI_COP, 4, aOldAnimations, aStdAnimDescs },
{ "gang1", "ped", MI_COP, 4, aGang1Animations, aStdAnimDescs }, { "gang1", "ped", MI_COP, 4, aGang1Animations, aStdAnimDescs },
{ "gang2", "ped", MI_COP, 4, aGang2Animations, aStdAnimDescs }, { "gang2", "ped", MI_COP, 4, aGang2Animations, aStdAnimDescs },
{ "fatman", "ped", MI_COP, 4, aFatAnimations, aStdAnimDescs }, { "fatman", "ped", MI_COP, 4, aFatAnimations, aStdAnimDescs },
{ "oldfatman", "ped", MI_COP, 4, aOldFatAnimations, aStdAnimDescs }, { "oldfatman", "ped", MI_COP, 4, aOldFatAnimations, aStdAnimDescs },
{ "jogger", "ped", MI_COP, 4, aJoggerAnimations, aStdAnimDescs },
{ "woman", "ped", MI_COP, 4, aStdWomanAnimations, aStdAnimDescs }, { "woman", "ped", MI_COP, 4, aStdWomanAnimations, aStdAnimDescs },
{ "shopping", "ped", MI_COP, 4, aWomanShopAnimations, aStdAnimDescs }, { "shopping", "ped", MI_COP, 4, aWomanShopAnimations, aStdAnimDescs },
{ "busywoman", "ped", MI_COP, 4, aBusyWomanAnimations, aStdAnimDescs }, { "busywoman", "ped", MI_COP, 4, aBusyWomanAnimations, aStdAnimDescs },
{ "sexywoman", "ped", MI_COP, 4, aSexyWomanAnimations, aStdAnimDescs }, { "sexywoman", "ped", MI_COP, 4, aSexyWomanAnimations, aStdAnimDescs },
{ "oldwoman", "ped", MI_COP, 4, aOldWomanAnimations, aStdAnimDescs },
{ "fatwoman", "ped", MI_COP, 4, aFatWomanAnimations, 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 }, { "panicchunky", "ped", MI_COP, 4, aPanicChunkyAnimations, aStdAnimDescs },
{ "skate", "skate", MI_COP, 4, aSkateAnimations, aStdAnimDescs },
{ "playerback", "ped", MI_COP, 5, aPlayerStrafeBackAnimations, aStdAnimDescs }, { "playerback", "ped", MI_COP, 5, aPlayerStrafeBackAnimations, aStdAnimDescs },
{ "playerleft", "ped", MI_COP, 5, aPlayerStrafeLeftAnimations, aStdAnimDescsSide }, { "playerleft", "ped", MI_COP, 5, aPlayerStrafeLeftAnimations, aStdAnimDescsSide },
{ "playerright", "ped", MI_COP, 5, aPlayerStrafeRightAnimations, aStdAnimDescsSide }, { "playerright", "ped", MI_COP, 5, aPlayerStrafeRightAnimations, aStdAnimDescsSide },
{ "rocketback", "ped", MI_COP, 5, aRocketStrafeBackAnimations, aStdAnimDescs }, { "rocketback", "ped", MI_COP, 5, aRocketStrafeBackAnimations, aStdAnimDescs },
{ "rocketleft", "ped", MI_COP, 5, aRocketStrafeLeftAnimations, aStdAnimDescsSide }, { "rocketleft", "ped", MI_COP, 5, aRocketStrafeLeftAnimations, aStdAnimDescsSide },
{ "rocketright", "ped", MI_COP, 5, aRocketStrafeRightAnimations, 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 void

View file

@ -11,25 +11,32 @@ enum AssocGroupId
ASSOCGRP_PLAYER1ARMED, ASSOCGRP_PLAYER1ARMED,
ASSOCGRP_PLAYER2ARMED, ASSOCGRP_PLAYER2ARMED,
ASSOCGRP_PLAYERBBBAT, ASSOCGRP_PLAYERBBBAT,
ASSOCGRP_PLAYERCHAINSAW,
ASSOCGRP_SHUFFLE, ASSOCGRP_SHUFFLE,
ASSOCGRP_OLD, ASSOCGRP_OLD,
ASSOCGRP_GANG1, ASSOCGRP_GANG1,
ASSOCGRP_GANG2, ASSOCGRP_GANG2,
ASSOCGRP_FAT, ASSOCGRP_FAT,
ASSOCGRP_OLDFAT, ASSOCGRP_OLDFAT,
ASSOCGRP_JOGGER,
ASSOCGRP_WOMAN, ASSOCGRP_WOMAN,
ASSOCGRP_WOMANSHOP, ASSOCGRP_WOMANSHOP,
ASSOCGRP_BUSYWOMAN, ASSOCGRP_BUSYWOMAN,
ASSOCGRP_SEXYWOMAN, ASSOCGRP_SEXYWOMAN,
ASSOCGRP_OLDWOMAN,
ASSOCGRP_FATWOMAN, ASSOCGRP_FATWOMAN,
ASSOCGRP_OLDWOMAN,
ASSOCGRP_JOGWOMAN,
ASSOCGRP_PANICCHUNKY, ASSOCGRP_PANICCHUNKY,
ASSOCGRP_SKATE,
ASSOCGRP_PLAYERBACK, ASSOCGRP_PLAYERBACK,
ASSOCGRP_PLAYERLEFT, ASSOCGRP_PLAYERLEFT,
ASSOCGRP_PLAYERRIGHT, ASSOCGRP_PLAYERRIGHT,
ASSOCGRP_ROCKETBACK, ASSOCGRP_ROCKETBACK,
ASSOCGRP_ROCKETLEFT, ASSOCGRP_ROCKETLEFT,
ASSOCGRP_ROCKETRIGHT, ASSOCGRP_ROCKETRIGHT,
ASSOCGRP_CHAINSAWBACK,
ASSOCGRP_CHAINSAWLEFT,
ASSOCGRP_CHAINSAWRIGHT,
NUM_ANIM_ASSOC_GROUPS // should be 61 in the end NUM_ANIM_ASSOC_GROUPS // should be 61 in the end
}; };

View file

@ -368,13 +368,7 @@ CAnimViewer::Update(void)
} else { } else {
// Originally it was GetPad(1)->LeftShoulder2 // Originally it was GetPad(1)->LeftShoulder2
if (pad->NewState.Triangle) { if (pad->NewState.Triangle) {
#ifdef PED_SKIN
if(IsClumpSkinned(pTarget->GetClump()))
((CPedModelInfo *)CModelInfo::GetModelInfo(pTarget->GetModelIndex()))->AnimatePedColModelSkinned(pTarget->GetClump()); ((CPedModelInfo *)CModelInfo::GetModelInfo(pTarget->GetModelIndex()))->AnimatePedColModelSkinned(pTarget->GetClump());
else
#endif
CPedModelInfo::AnimatePedColModel(((CPedModelInfo *)CModelInfo::GetModelInfo(pTarget->GetModelIndex()))->GetHitColModel(),
RpClumpGetFrame(pTarget->GetClump()));
AsciiToUnicode("Ped Col model will be animated as long as you hold the button", gUString); AsciiToUnicode("Ped Col model will be animated as long as you hold the button", gUString);
CMessages::AddMessage(gUString, 100, 0); CMessages::AddMessage(gUString, 100, 0);
} }

View file

@ -443,14 +443,6 @@ CFileLoader::LoadClumpFile(RwStream *stream, uint32 id)
return false; return false;
mi = (CClumpModelInfo*)CModelInfo::GetModelInfo(id); mi = (CClumpModelInfo*)CModelInfo::GetModelInfo(id);
mi->SetClump(clump); 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; return true;
} }

View file

@ -339,11 +339,8 @@ CWorld::ProcessLineOfSightSectorList(CPtrList &list, const CColLine &line, CColP
if(e->IsPed()) { if(e->IsPed()) {
if(e->bUsesCollision || deadPeds && ((CPed *)e)->m_nPedState == PED_DEAD) { 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()); colmodel = ((CPedModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex()))->AnimatePedColModelSkinned(e->GetClump());
else /* this should all be gone, right?
#endif
if(((CPed *)e)->UseGroundColModel()) if(((CPed *)e)->UseGroundColModel())
colmodel = &CTempColModels::ms_colModelPedGroundHit; colmodel = &CTempColModels::ms_colModelPedGroundHit;
else else
@ -357,8 +354,10 @@ CWorld::ProcessLineOfSightSectorList(CPtrList &list, const CColLine &line, CColP
((CPedModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex())) ((CPedModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex()))
->GetHitColModel(); ->GetHitColModel();
#endif #endif
*/
} else } else
colmodel = nil; colmodel = nil;
} else if(e->bUsesCollision) } else if(e->bUsesCollision)
colmodel = CModelInfo::GetModelInfo(e->GetModelIndex())->GetColModel(); colmodel = CModelInfo::GetModelInfo(e->GetModelIndex())->GetColModel();

View file

@ -9,33 +9,18 @@
#include "VisibilityPlugins.h" #include "VisibilityPlugins.h"
#include "ModelInfo.h" #include "ModelInfo.h"
//--MIAMI: file done
void void
CPedModelInfo::DeleteRwObject(void) CPedModelInfo::DeleteRwObject(void)
{ {
CClumpModelInfo::DeleteRwObject();
if(m_hitColModel) if(m_hitColModel)
delete m_hitColModel; delete m_hitColModel;
m_hitColModel = nil; 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] = { RwObjectNameIdAssocation CPedModelInfo::m_pPedIds[PED_NODE_MAX] = {
{ "Smid", PED_MID, 0, }, // that is strange... { "Smid", PED_MID, 0, }, // that is strange...
{ "Shead", PED_HEAD, 0, }, { "Shead", PED_HEAD, 0, },
@ -51,131 +36,16 @@ RwObjectNameIdAssocation CPedModelInfo::m_pPedIds[PED_NODE_MAX] = {
{ nil, 0, 0, }, { 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 void
CPedModelInfo::SetClump(RpClump *clump) 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); CClumpModelInfo::SetClump(clump);
SetFrameIds(m_pPedIds); SetFrameIds(m_pPedIds); // not needed in VC actually
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) if(m_hitColModel == nil)
CreateHitColModel(); CreateHitColModelSkinned(clump);
if(strncmp(GetName(), "player", 7) == 0) RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPedCB);
if(strcmp(GetName(), "player") == 0)
RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); 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 struct ColNodeInfo
@ -201,114 +71,6 @@ ColNodeInfo m_pColNodeInfos[NUMPEDINFONODES] = {
{ nil, PED_FOOTR, PEDPIECE_RIGHTLEG, 0.0f, 0.15f, 0.15f }, { 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 void
CPedModelInfo::CreateHitColModelSkinned(RpClump *clump) CPedModelInfo::CreateHitColModelSkinned(RpClump *clump)
{ {
@ -384,4 +146,26 @@ CPedModelInfo::AnimatePedColModelSkinned(RpClump *clump)
return m_hitColModel; 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;
}

View file

@ -36,32 +36,17 @@ public:
ePedStats m_pedStatType; ePedStats m_pedStatType;
uint32 m_carsCanDrive; uint32 m_carsCanDrive;
CColModel *m_hitColModel; CColModel *m_hitColModel;
#ifdef PED_SKIN int8 radio1, radio2;
RpAtomic *m_head;
RpAtomic *m_lhand;
RpAtomic *m_rhand;
#endif
static RwObjectNameIdAssocation m_pPedIds[PED_NODE_MAX]; 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 DeleteRwObject(void);
void SetClump(RpClump *); void SetClump(RpClump *);
void SetLowDetailClump(RpClump*);
void CreateHitColModel(void);
void CreateHitColModelSkinned(RpClump *clump); void CreateHitColModelSkinned(RpClump *clump);
CColModel *GetHitColModel(void) { return m_hitColModel; } CColModel *GetHitColModel(void) { return m_hitColModel; }
static CColModel *AnimatePedColModel(CColModel* colmodel, RwFrame* frame);
CColModel *AnimatePedColModelSkinned(RpClump *clump); CColModel *AnimatePedColModelSkinned(RpClump *clump);
CColModel *AnimatePedColModelSkinnedWorld(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
}; };
#ifndef PED_SKIN
static_assert(sizeof(CPedModelInfo) == 0x48, "CPedModelInfo: error");
#endif

View file

@ -5153,12 +5153,9 @@ CPed::FightStrike(CVector &touchedNodePos)
// He can beat us // He can beat us
if (sq(maxDistanceToBeBeaten) > potentialAttackDistance.MagnitudeSqr()) { if (sq(maxDistanceToBeBeaten) > potentialAttackDistance.MagnitudeSqr()) {
#ifdef PED_SKIN
// Have to animate a skinned clump because the initial col model is useless // Have to animate a skinned clump because the initial col model is useless
if(IsClumpSkinned(GetClump()))
ourCol = ((CPedModelInfo *)CModelInfo::GetModelInfo(GetModelIndex()))->AnimatePedColModelSkinned(GetClump()); ourCol = ((CPedModelInfo *)CModelInfo::GetModelInfo(GetModelIndex()))->AnimatePedColModelSkinned(GetClump());
else /* this should all be gone, right?
#endif
if (nearPed->m_nPedState == PED_FALL if (nearPed->m_nPedState == PED_FALL
|| nearPed->m_nPedState == PED_DEAD || nearPed->m_nPedState == PED_DIE || nearPed->m_nPedState == PED_DEAD || nearPed->m_nPedState == PED_DIE
|| !nearPed->IsPedHeadAbovePos(-0.3f)) { || !nearPed->IsPedHeadAbovePos(-0.3f)) {
@ -5171,6 +5168,7 @@ CPed::FightStrike(CVector &touchedNodePos)
ourCol = ((CPedModelInfo*)CModelInfo::GetModelInfo(m_modelIndex))->GetHitColModel(); ourCol = ((CPedModelInfo*)CModelInfo::GetModelInfo(m_modelIndex))->GetHitColModel();
#endif #endif
} }
*/
for (int j = 0; j < ourCol->numSpheres; j++) { for (int j = 0; j < ourCol->numSpheres; j++) {
attackDistance = nearPed->GetPosition() + ourCol->spheres[j].center; attackDistance = nearPed->GetPosition() + ourCol->spheres[j].center;
@ -12606,13 +12604,7 @@ CPed::Render(void)
bRenderPedInCar && sq(25.0f * TheCamera.LODDistMultiplier) >= (TheCamera.GetPosition() - GetPosition()).MagnitudeSqr()) { bRenderPedInCar && sq(25.0f * TheCamera.LODDistMultiplier) >= (TheCamera.GetPosition() - GetPosition()).MagnitudeSqr()) {
CEntity::Render(); CEntity::Render();
#ifdef PED_SKIN if(m_pWeaponModel){
if(IsClumpSkinned(GetClump())){
renderLimb(PED_HEAD);
renderLimb(PED_HANDL);
renderLimb(PED_HANDR);
}
if(m_pWeaponModel && IsClumpSkinned(GetClump())){
RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(GetClump()); RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(GetClump());
int idx = RpHAnimIDGetIndex(hier, m_pFrames[PED_HANDR]->nodeID); int idx = RpHAnimIDGetIndex(hier, m_pFrames[PED_HANDR]->nodeID);
RwMatrix *mat = &RpHAnimHierarchyGetMatrixArray(hier)[idx]; RwMatrix *mat = &RpHAnimHierarchyGetMatrixArray(hier)[idx];
@ -12621,51 +12613,9 @@ CPed::Render(void)
RwFrameUpdateObjects(frame); RwFrameUpdateObjects(frame);
RpAtomicRender(m_pWeaponModel); 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 void
CPed::ProcessObjective(void) CPed::ProcessObjective(void)
{ {

View file

@ -890,10 +890,6 @@ public:
void DebugRenderOnePedText(void); void DebugRenderOnePedText(void);
#endif #endif
#ifdef PED_SKIN
void renderLimb(int node);
#endif
#ifdef COMPATIBLE_SAVES #ifdef COMPATIBLE_SAVES
virtual void Save(uint8*& buf); virtual void Save(uint8*& buf);
virtual void Load(uint8*& buf); virtual void Load(uint8*& buf);