RpAnimBlend and frame updates
This commit is contained in:
@@ -9,9 +9,9 @@
|
||||
#include "AnimBlendHierarchy.h"
|
||||
#include "AnimBlendAssociation.h"
|
||||
#include "RpAnimBlend.h"
|
||||
#ifdef PED_SKIN
|
||||
#include "PedModelInfo.h"
|
||||
#endif
|
||||
|
||||
//--MIAMI: file done
|
||||
|
||||
RwInt32 ClumpOffset;
|
||||
|
||||
@@ -141,7 +141,6 @@ FrameInitCBskin(AnimBlendFrameData *frameData, void*)
|
||||
frameData->flag = 0;
|
||||
}
|
||||
|
||||
#ifdef PED_SKIN
|
||||
void
|
||||
RpAnimBlendClumpInitSkinned(RpClump *clump)
|
||||
{
|
||||
@@ -155,7 +154,7 @@ RpAnimBlendClumpInitSkinned(RpClump *clump)
|
||||
|
||||
RpAnimBlendAllocateData(clump);
|
||||
clumpData = *RPANIMBLENDCLUMPDATA(clump);
|
||||
atomic = IsClumpSkinned(clump);
|
||||
atomic = GetFirstAtomic(clump);
|
||||
assert(atomic);
|
||||
skin = RpSkinGeometryGetSkin(RpAtomicGetGeometry(atomic));
|
||||
assert(skin);
|
||||
@@ -175,7 +174,6 @@ RpAnimBlendClumpInitSkinned(RpClump *clump)
|
||||
clumpData->ForAllFrames(FrameInitCBskin, nil);
|
||||
clumpData->frames[0].flag |= AnimBlendFrameData::VELOCITY_EXTRACTION;
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
RpAnimBlendClumpInitNotSkinned(RpClump *clump)
|
||||
@@ -199,11 +197,9 @@ RpAnimBlendClumpInitNotSkinned(RpClump *clump)
|
||||
void
|
||||
RpAnimBlendClumpInit(RpClump *clump)
|
||||
{
|
||||
#ifdef PED_SKIN
|
||||
if(IsClumpSkinned(clump))
|
||||
RpAnimBlendClumpInitSkinned(clump);
|
||||
else
|
||||
#endif
|
||||
RpAnimBlendClumpInitNotSkinned(clump);
|
||||
}
|
||||
|
||||
@@ -348,9 +344,11 @@ CAnimBlendAssociation*
|
||||
RpAnimBlendClumpGetFirstAssociation(RpClump *clump)
|
||||
{
|
||||
CAnimBlendClumpData *clumpData = *RPANIMBLENDCLUMPDATA(clump);
|
||||
if(clumpData == nil) return nil;
|
||||
if(clumpData->link.next == nil) return nil;
|
||||
return CAnimBlendAssociation::FromLink(clumpData->link.next);
|
||||
if(!RpAnimBlendClumpIsInitialized(clump))
|
||||
return nil;
|
||||
if(clumpData->link.next)
|
||||
return CAnimBlendAssociation::FromLink(clumpData->link.next);
|
||||
return nil;
|
||||
}
|
||||
|
||||
// FillFrameArrayCallBack on PS2
|
||||
@@ -361,7 +359,6 @@ FillFrameArrayCBnonskin(AnimBlendFrameData *frame, void *arg)
|
||||
frames[CVisibilityPlugins::GetFrameHierarchyId(frame->frame)] = frame;
|
||||
}
|
||||
|
||||
#ifdef PED_SKIN
|
||||
void
|
||||
RpAnimBlendClumpFillFrameArraySkin(RpClump *clump, AnimBlendFrameData **frames)
|
||||
{
|
||||
@@ -371,16 +368,13 @@ RpAnimBlendClumpFillFrameArraySkin(RpClump *clump, AnimBlendFrameData **frames)
|
||||
for(i = PED_MID; i < PED_NODE_MAX; i++)
|
||||
frames[i] = &clumpData->frames[RpHAnimIDGetIndex(hier, ConvertPedNode2BoneTag(i))];
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
RpAnimBlendClumpFillFrameArray(RpClump *clump, AnimBlendFrameData **frames)
|
||||
{
|
||||
#ifdef PED_SKIN
|
||||
if(IsClumpSkinned(clump))
|
||||
RpAnimBlendClumpFillFrameArraySkin(clump, frames);
|
||||
else
|
||||
#endif
|
||||
(*RPANIMBLENDCLUMPDATA(clump))->ForAllFrames(FillFrameArrayCBnonskin, frames);
|
||||
}
|
||||
|
||||
@@ -429,9 +423,27 @@ RpAnimBlendClumpFindBone(RpClump *clump, uint32 boneTag)
|
||||
}
|
||||
|
||||
void
|
||||
RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta)
|
||||
RpAnimBlendNodeUpdateKeyframes(AnimBlendFrameData *frames, AnimBlendFrameUpdateData *updateData, int32 numNodes)
|
||||
{
|
||||
CAnimBlendNode **node;
|
||||
int i;
|
||||
|
||||
for(node = updateData->nodes; *node; node++){
|
||||
CAnimBlendAssociation *a = (*node)->association;
|
||||
for(i = 0; i < numNodes; i++)
|
||||
if((frames[i].flag & AnimBlendFrameData::VELOCITY_EXTRACTION) == 0 ||
|
||||
gpAnimBlendClump->velocity == nil){
|
||||
if((*node)[i].sequence)
|
||||
(*node)[i].FindKeyFrame(a->currentTime - a->timeStep);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta, bool doRender)
|
||||
{
|
||||
int i;
|
||||
CAnimBlendAssociation *assoc;
|
||||
AnimBlendFrameUpdateData updateData;
|
||||
float totalLength = 0.0f;
|
||||
float totalBlend = 0.0f;
|
||||
@@ -447,30 +459,45 @@ RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta)
|
||||
updateData.foobar = 0;
|
||||
for(link = clumpData->link.next; link; link = next){
|
||||
next = link->next;
|
||||
CAnimBlendAssociation *assoc = CAnimBlendAssociation::FromLink(link);
|
||||
assoc = CAnimBlendAssociation::FromLink(link);
|
||||
if(assoc->UpdateBlend(timeDelta)){
|
||||
// CAnimManager::UncompressAnimation(v6->hierarchy)
|
||||
updateData.nodes[i++] = assoc->GetNode(0);
|
||||
if(assoc->flags & ASSOC_MOVEMENT){
|
||||
totalLength += assoc->hierarchy->totalLength/assoc->speed * assoc->blendAmount;
|
||||
totalBlend += assoc->blendAmount;
|
||||
if(assoc->hierarchy->sequences){
|
||||
//CAnimManager::UncompressAnimation(v6->hierarchy)
|
||||
if(i < 11)
|
||||
updateData.nodes[i++] = assoc->GetNode(0);
|
||||
if(assoc->flags & ASSOC_MOVEMENT){
|
||||
totalLength += assoc->hierarchy->totalLength/assoc->speed * assoc->blendAmount;
|
||||
totalBlend += assoc->blendAmount;
|
||||
}else
|
||||
updateData.foobar = 1;
|
||||
}else
|
||||
updateData.foobar = 1;
|
||||
debug("anim %s is not loaded\n", assoc->hierarchy->name);
|
||||
}
|
||||
}
|
||||
updateData.nodes[i] = nil;
|
||||
|
||||
#ifdef PED_SKIN
|
||||
if(IsClumpSkinned(clump))
|
||||
clumpData->ForAllFrames(FrameUpdateCallBackSkinned, &updateData);
|
||||
else
|
||||
#endif
|
||||
clumpData->ForAllFrames(FrameUpdateCallBackNonSkinned, &updateData);
|
||||
|
||||
for(link = clumpData->link.next; link; link = link->next){
|
||||
CAnimBlendAssociation *assoc = CAnimBlendAssociation::FromLink(link);
|
||||
float relSpeed = totalLength == 0.0f ? 1.0f : totalBlend/totalLength;
|
||||
assoc->UpdateTime(timeDelta, relSpeed);
|
||||
assoc = CAnimBlendAssociation::FromLink(link);
|
||||
assoc->UpdateTimeStep(timeDelta, totalLength == 0.0f ? 1.0f : totalBlend/totalLength);
|
||||
}
|
||||
|
||||
updateData.nodes[i] = nil;
|
||||
|
||||
if(doRender){
|
||||
if(clumpData->frames[0].flag & AnimBlendFrameData::UPDATE_KEYFRAMES)
|
||||
RpAnimBlendNodeUpdateKeyframes(clumpData->frames, &updateData, clumpData->numFrames);
|
||||
if(IsClumpSkinned(clump))
|
||||
clumpData->ForAllFrames(FrameUpdateCallBackSkinned, &updateData);
|
||||
else
|
||||
clumpData->ForAllFrames(FrameUpdateCallBackNonSkinned, &updateData);
|
||||
clumpData->frames[0].flag &= ~AnimBlendFrameData::UPDATE_KEYFRAMES;
|
||||
}else{
|
||||
clumpData->ForAllFrames(FrameUpdateCallBackOffscreen, &updateData);
|
||||
clumpData->frames[0].flag |= AnimBlendFrameData::UPDATE_KEYFRAMES;
|
||||
}
|
||||
|
||||
for(link = clumpData->link.next; link; link = link->next){
|
||||
assoc = CAnimBlendAssociation::FromLink(link);
|
||||
assoc->UpdateTime(timeDelta, totalLength == 0.0f ? 1.0f : totalBlend/totalLength);
|
||||
}
|
||||
RwFrameUpdateObjects(RpClumpGetFrame(clump));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user