Example #1
0
int ProcNKeys(TxtNode *t,int& foundkeys)
{
	if (t->child)
	{
		TxtNode *sib=t->child;
		if (!sib->text)
			return 207;
		int tp=myatoi(sib->text,sib->length);
		sib=sib->sibling;
		if (!sib||!sib->text)
			return 208;
		int num=myatoi(sib->text,sib->length);
		sib=sib->sibling;
		int i;
		int lastframe=startframe-1;
		TxtNode *s=sib;
		for (i=0;i<num;i++)
		{
			if (!s||!s->text)
				return 110;
			int frame=myatoi(s->text,s->length);
			if (frame>33000)
				frame=frame-65536;
			if (frame<startframe)
			{
				assert(!i);
				lastframe=frame-1;
				startframe=frame;
			}
			if (frame>endframe)
				endframe=frame;
			if (frame-startframe>maxmatframe)
				maxmatframe=frame-startframe;
			s=s->sibling;
			if (!s||!s->text)
				return 212;
			int junk=myatoi(s->text,s->length);
			if (junk!=3)
				return 213;
			s=s->sibling;
			if (!s||!s->text)
				return 216;
			float x=(float)myatof(s->text,s->length);
			s=s->sibling;
			if (!s||!s->text)
				return 216;
			float y=(float)myatof(s->text,s->length);
			s=s->sibling;
			if (!s||!s->text)
				return 216;
			float z=(float)myatof(s->text,s->length);
			s=s->sibling;
			int k;
			if (tp==1) //scale
			{
				Vect3 v=Vect3(x,z,y);
				for (k=lastframe+1;k<=frame;k++)
					scales[k-startframe]=v;
				foundkeys|=4;
			}
			else if (tp==2) //translation
			{
				Vect3 v(x,-z,y);
				for (k=lastframe+1;k<=frame;k++)
				{
					mats[k-startframe].SetRow(3,v);
					mats[k-startframe].CalcFlags();
				}
				foundkeys|=1;
			}
			else if (tp==3) //rotation
			{
				Matrix4 tmp;
				tmp.Rotate(-x*M_PI/180.0f,-y*M_PI/180.0f,-z*M_PI/180.0f);
				Vect3 t,tt;
				tmp.GetRow(2,t);
				t*=-1.0f;
				tmp.GetRow(1,tt);
				tmp.SetRow(2,tt);
				tmp.SetRow(1,t);
				for (k=0;k<3;k++)
				{
					float tt=-tmp[k][2];
					tmp[k][2]=tmp[k][1];
					tmp[k][1]=tt;
				}
				for (k=lastframe+1;k<=frame;k++)
				{
					int l;
					for (l=0;l<3;l++)
					{
						tmp.GetRow(l,t);
						mats[k-startframe].SetRow(l,t);
						mats[k-startframe].CalcFlags();
					}
				}
				foundkeys|=2;
			}
			lastframe=frame;
		}
	}
	return 0;
}
Example #2
0
int FindPKeys(TxtNode *t)
{
	if (t->child)
	{
		TxtNode *sib=t->child;
		if (!sib)
			return 200;
		char framename[100];
		{
			if (!sib->child)
				return 201;
			if (!sib->child->text)
				return 202;
			if (!strncmp("frm-",sib->child->text,4))
				mystrncpy(framename,sib->child->text+4,sib->child->length-4);
			else
			{
				if (!strncmp("SCENE",sib->child->text,4))
					return 0;
				mystrncpy(framename,sib->child->text,sib->child->length);
			}
			sib=sib->sibling;
		}
		int foundkeys=0;
		maxmatframe=0;
		while (sib)
		{
			if (sib->text&&!mystrncmp("SI_AnimationKey",sib->text,sib->length))
			{
				if (!sib->sibling)
					return 103;
				sib=sib->sibling;
				int err=ProcNKeys(sib,foundkeys);
				if (err)
					return err;
			}
			sib=sib->sibling;
		}
		{
			if (maxmatframe>maxframe)
				maxframe=maxmatframe;
			int i;
			for (i=0;i<nsNodes;i++)
			{
				if (!strcmp(sNodes[i].name,framename))
				{
					int j;
					if (sNodes[i].nanimat<maxmatframe+1)
					{
						delete[] sNodes[i].animat;
						sNodes[i].nanimat=maxmatframe+1;
						sNodes[i].animat=new Matrix4[maxmatframe+1];
						for (j=0;j<=maxmatframe;j++)
							sNodes[i].animat[j].Identity();
					}
					for (j=0;j<=maxmatframe;j++)
					{
						Matrix4 xf;
						xf=sNodes[i].mat;
						Vect3 tt,t2;
						if (foundkeys&1)
						{
							mats[j].GetRow(3,tt);
							xf.SetRow(3,tt);
						}
						if (foundkeys&2)
						{
							float l;
							xf.GetRow(0,t2);
							l=t2.Len();
							mats[j].GetRow(0,tt);
							tt*=l;
							xf.SetRow(0,tt);

							xf.GetRow(1,t2);
							l=t2.Len();
							mats[j].GetRow(1,tt);
							tt*=l;
							xf.SetRow(1,tt);

							xf.GetRow(2,t2);
							l=t2.Len();
							mats[j].GetRow(2,tt);
							tt*=l;
							xf.SetRow(2,tt);
						}
						if (foundkeys&4)
						{
							xf.GetRow(0,tt);
							tt.Norm();
							tt*=scales[j].x();
							xf.SetRow(0,tt);

							xf.GetRow(1,tt);
							tt.Norm();
							tt*=scales[j].x();
							xf.SetRow(1,tt);

							xf.GetRow(2,tt);
							tt.Norm();
							tt*=scales[j].x();
							xf.SetRow(2,tt);

						}
						xf.CalcFlags();
						Matrix4 par,tmat;
						if (sNodes[i].parent)
						{
							if (j<sNodes[i].parent->nanimat)
								par=sNodes[i].parent->animat[j];
							else
								par=sNodes[i].parent->BaseMat;
							tmat.Concat(xf,par);
						}
						else
							tmat=xf;
						sNodes[i].animat[j]=tmat;

#if 0
						par.Inverse(sNodes[i].BaseMat);
						tmat.Concat(par,sNodes[i].animat[j]);
	char tmp[1000];
	int r;
	sprintf(tmp,"final frame %d %s\n",j,sNodes[i].name);
	OutputDebugString(tmp);
	for (r=0;r<4;r++)
	{
		sprintf(tmp,"%6f %6f %6f\n",tmat[r][0],tmat[r][1],tmat[r][2]);
		OutputDebugString(tmp);
	}
	sprintf(tmp,"baseinv frame %d %s\n",j,sNodes[i].name);
	OutputDebugString(tmp);
	for (r=0;r<4;r++)
	{
		sprintf(tmp,"%6f %6f %6f\n",par[r][0],par[r][1],par[r][2]);
		OutputDebugString(tmp);
	}
	sprintf(tmp,"bone frame %d %s\n",j,sNodes[i].name);
	OutputDebugString(tmp);
	for (r=0;r<4;r++)
	{
		sprintf(tmp,"%6f %6f %6f\n",sNodes[i].animat[j][r][0],sNodes[i].animat[j][r][1],sNodes[i].animat[j][r][2]);
		OutputDebugString(tmp);
	}
#endif
					}
				}
			}
		}
	}
	return 0;
}
void BinaryBufferBuilder::WriteMatrix4(const Matrix4& mat4) {
	WriteVec4(mat4.GetRow(0));
	WriteVec4(mat4.GetRow(1));
	WriteVec4(mat4.GetRow(2));
	WriteVec4(mat4.GetRow(3));
}