⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 anim.cpp

📁 空战游戏flacon源码
💻 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 + -