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; }
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)); }