anim compression
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#include "common.h"
|
||||
|
||||
#include "AnimBlendSequence.h"
|
||||
#include "MemoryHeap.h"
|
||||
|
||||
//--MIAMI: file done
|
||||
|
||||
@@ -65,3 +66,116 @@ CAnimBlendSequence::RemoveQuaternionFlips(void)
|
||||
last = frame->rotation;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendSequence::Uncompress(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(numFrames == 0)
|
||||
return;
|
||||
|
||||
PUSH_MEMID(MEMID_ANIMATION);
|
||||
|
||||
float rotScale = 1.0f/4096.0f;
|
||||
float timeScale = 1.0f/60.0f;
|
||||
float transScale = 1.0f/1024.0f;
|
||||
if(type & KF_TRANS){
|
||||
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrameTrans));
|
||||
KeyFrameTransCompressed *ckf = (KeyFrameTransCompressed*)keyFramesCompressed;
|
||||
KeyFrameTrans *kf = (KeyFrameTrans*)newKfs;
|
||||
for(i = 0; i < numFrames; i++){
|
||||
kf->rotation.x = ckf->rot[0]*rotScale;
|
||||
kf->rotation.y = ckf->rot[1]*rotScale;
|
||||
kf->rotation.z = ckf->rot[2]*rotScale;
|
||||
kf->rotation.w = ckf->rot[3]*rotScale;
|
||||
kf->deltaTime = ckf->deltaTime*timeScale;
|
||||
kf->translation.x = ckf->trans[0]*transScale;
|
||||
kf->translation.y = ckf->trans[1]*transScale;
|
||||
kf->translation.z = ckf->trans[2]*transScale;
|
||||
kf++;
|
||||
ckf++;
|
||||
}
|
||||
keyFrames = newKfs;
|
||||
}else{
|
||||
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrame));
|
||||
KeyFrameCompressed *ckf = (KeyFrameCompressed*)keyFramesCompressed;
|
||||
KeyFrame *kf = (KeyFrame*)newKfs;
|
||||
for(i = 0; i < numFrames; i++){
|
||||
kf->rotation.x = ckf->rot[0]*rotScale;
|
||||
kf->rotation.y = ckf->rot[1]*rotScale;
|
||||
kf->rotation.z = ckf->rot[2]*rotScale;
|
||||
kf->rotation.w = ckf->rot[3]*rotScale;
|
||||
kf->deltaTime = ckf->deltaTime*timeScale;
|
||||
kf++;
|
||||
ckf++;
|
||||
}
|
||||
keyFrames = newKfs;
|
||||
}
|
||||
REGISTER_MEMPTR(&keyFrames);
|
||||
|
||||
RwFree(keyFramesCompressed);
|
||||
keyFramesCompressed = nil;
|
||||
|
||||
POP_MEMID();
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendSequence::CompressKeyframes(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(numFrames == 0)
|
||||
return;
|
||||
|
||||
PUSH_MEMID(MEMID_ANIMATION);
|
||||
|
||||
float rotScale = 4096.0f;
|
||||
float timeScale = 60.0f;
|
||||
float transScale = 1024.0f;
|
||||
if(type & KF_TRANS){
|
||||
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrameTransCompressed));
|
||||
KeyFrameTransCompressed *ckf = (KeyFrameTransCompressed*)newKfs;
|
||||
KeyFrameTrans *kf = (KeyFrameTrans*)keyFrames;
|
||||
for(i = 0; i < numFrames; i++){
|
||||
ckf->rot[0] = kf->rotation.x*rotScale;
|
||||
ckf->rot[1] = kf->rotation.y*rotScale;
|
||||
ckf->rot[2] = kf->rotation.z*rotScale;
|
||||
ckf->rot[3] = kf->rotation.w*rotScale;
|
||||
ckf->deltaTime = kf->deltaTime*timeScale + 0.5f;
|
||||
ckf->trans[0] = kf->translation.x*transScale;
|
||||
ckf->trans[1] = kf->translation.y*transScale;
|
||||
ckf->trans[2] = kf->translation.z*transScale;
|
||||
kf++;
|
||||
ckf++;
|
||||
}
|
||||
keyFramesCompressed = newKfs;
|
||||
}else{
|
||||
void *newKfs = RwMalloc(numFrames * sizeof(KeyFrameCompressed));
|
||||
KeyFrameCompressed *ckf = (KeyFrameCompressed*)newKfs;
|
||||
KeyFrame *kf = (KeyFrame*)keyFrames;
|
||||
for(i = 0; i < numFrames; i++){
|
||||
ckf->rot[0] = kf->rotation.x*rotScale;
|
||||
ckf->rot[1] = kf->rotation.y*rotScale;
|
||||
ckf->rot[2] = kf->rotation.z*rotScale;
|
||||
ckf->rot[3] = kf->rotation.w*rotScale;
|
||||
ckf->deltaTime = kf->deltaTime*timeScale + 0.5f;
|
||||
kf++;
|
||||
ckf++;
|
||||
}
|
||||
keyFramesCompressed = newKfs;
|
||||
}
|
||||
REGISTER_MEMPTR(&keyFramesCompressed);
|
||||
|
||||
POP_MEMID();
|
||||
}
|
||||
|
||||
void
|
||||
CAnimBlendSequence::RemoveUncompressedData(void)
|
||||
{
|
||||
if(numFrames == 0)
|
||||
return;
|
||||
CompressKeyframes();
|
||||
RwFree(keyFrames);
|
||||
keyFrames = nil;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user