📄 anim.cpp
字号:
#include "anim.h"
#define TOTAL_FLOAT_IN_RECORD 10
void CAnimation::Setup (GLfloat *animdata)
{
GLint i, recsize;
GLint yaw, pitch, roll;
GLfloat *ptr;
GLmatrix mat;
glReleaseMemory ((char *) animPointer);
animTotal = 0;
ptr = animdata;
while (*ptr != -1) {
animTotal++;
ptr += 9;
}
// 8 float (quaternionX) + float (speed) + int (spin)
recsize = sizeof (GLquaternionX) + sizeof (GLfloat) + sizeof (GLint);
animPointer = (GLfloat *) glAllocateMemory (animTotal * recsize);
if (animPointer) {
ptr = animPointer;
GLquaternionX *q;
for (i=0; i < animTotal; i++) {
*(ptr) = (GLfloat) 1000.0 * (*animdata++); // time
*(ptr+1) = *animdata++; // spin
q = (GLquaternionX *) (ptr+2);
yaw = (GLint) *animdata++; // yaw
pitch = (GLint) *animdata++; // pitch
roll = (GLint) *animdata++; // roll
glCreateTransformation (yaw, pitch, roll, &mat);
glMatrixToQuaternion ((GLquaternion *) q, &mat);
q -> t.x = *animdata++; // transx
q -> t.y = *animdata++; // transy
q -> t.z = *animdata++; // transz
q -> scale = *animdata++; // scale
ptr += TOTAL_FLOAT_IN_RECORD;
}
animfirsttime = 1;
}
}
void CAnimation::Cleanup ()
{
glReleaseMemory ((char *) animPointer);
animPointer = 0;
}
GLquaternionX *CAnimation::Process ()
{
if (animPointer) {
GLquaternionX *q;
if (animfirsttime) {
animfirsttime = 0;
animIndex = 0;
currentPointer = animPointer;
animtime = *(currentPointer);
animspin = (GLint) *(currentPointer+1);
q = (GLquaternionX *) (currentPointer+2);
animcurrent = animstart = *q;
q = (GLquaternionX *) (currentPointer+2+TOTAL_FLOAT_IN_RECORD);
animend = *q;
animstarttime = timeGetTime();
}
GLint curtime = timeGetTime() - animstarttime;
if (curtime < animtime) {
GLfloat t = (GLfloat) curtime / animtime;
glInterpolateQuaternionX ( &animstart, &animend,
&animcurrent, t, animspin);
}
else {
animIndex++;
if (animIndex < animTotal) {
currentPointer += TOTAL_FLOAT_IN_RECORD;
}
else {
currentPointer = animPointer;
animIndex = 0;
}
animcurrent = animstart = animend;
animtime = *(currentPointer);
animspin = (GLint) *(currentPointer+1);
q = (GLquaternionX *) (currentPointer+2);
animend = *q;
animstarttime = timeGetTime();
}
return &animcurrent;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -