📄 animationplus.cpp
字号:
/* Animation.CPP
*
* provides Animation-Declarations & -operations
*
* Copyright 2003 by PaP / JTMK
*/
#include "stdio.h"
#include <windows.h>
#include "SystemIO.h"
#include "objekt.h"
#include "Animation.h"
#include "AnimationPlus.h"
bool SaveWithoutFrame0;
bool SkelEqual(tSkeletonNode *Node1,tSkeletonNode *Node2)
{
if(Node1->OrgPos.X!=Node2->OrgPos.X) return(false);
if(Node1->OrgPos.Y!=Node2->OrgPos.Y) return(false);
if(Node1->OrgPos.Z!=Node2->OrgPos.Z) return(false);
if(Node1->Roll!=Node2->Roll) return(false);
if(Node1->Flags!=Node2->Flags) return(false);
return(true);
}
tAnimFrame *GetAnimFrame(tAnimation *Anim,long NodeNr)
{
tAnimationList *AnimList;
long I;
AnimList=Anim->NodeList;
for(I=0;I<NodeNr;I++) AnimList=AnimList->Next;
return(AnimList->AktFrame);
}
tSkeletonNode *CreateFrame(tSkeletonNode *Temp)
{
tSkeletonNode *NewNode;
NewNode=(tSkeletonNode *) malloc(sizeof(tSkeletonNode));
memcpy(NewNode,Temp,sizeof(tSkeletonNode));
NewNode->Next=NULL;
NewNode->Child=NULL;
return(NewNode);
}
tAnimationList *AddToNodeList(tSkeletonNode *Temp)
{
tAnimationList *NewList;
NewList=(tAnimationList*) malloc(sizeof(tAnimationList));
NewList->Frame0=(tAnimFrame*) malloc(sizeof(tAnimFrame));
NewList->Frame0->Node=CreateFrame(Temp);
NewList->Frame0->Pre=NULL;
NewList->Frame0->Next=NULL;
NewList->Frame0->StartCnt=0;
NewList->AktFrame=NewList->Frame0;
NewList->Next=NULL;
if(AktList!=NULL) AktList->Next=NewList;
AktList=NewList;
if(Temp->Child!=NULL) AddToNodeList(Temp->Child);
if(Temp->Next!=NULL) AddToNodeList(Temp->Next);
return(NewList);
}
tAnimation *CreateAnimation(tObjekt *Obj)
{
tAnimation *Temp;
Temp=(tAnimation*) malloc(sizeof(tAnimation));
Temp->FrameCounter=0;
Temp->LoopPoint=-1;
Temp->EndCount=-1;
AktList=NULL;
Temp->NodeList=AddToNodeList(Obj->Skel);
return(Temp);
}
void UpDateAnimList(tObjekt *Obj,tAnimation *Anim,long FramePos)
{
tSkelList *ObjNode;
tAnimationList *AnimList;
ObjNode=Obj->SkelList;
Anim->FrameCounter=FramePos;
AnimList=Anim->NodeList;
while(AnimList!=NULL)
{
AnimList->AktFrame=FindFrame(AnimList->Frame0,FramePos);
if(!SkelEqual(ObjNode->Node,AnimList->AktFrame->Node))
AddFrame(AnimList->AktFrame,ObjNode->Node,FramePos);
AnimList=AnimList->Next;
ObjNode=ObjNode->Next;
}
}
long GetNextAnimCnt(tAnimation *Anim,long NodeNr)
{
tAnimationList *AnimList;
long I;
AnimList=Anim->NodeList;
for(I=0;I<NodeNr;I++) AnimList=AnimList->Next;
if(AnimList->AktFrame->Next!=NULL)
{
return(AnimList->AktFrame->Next->StartCnt);
} else
{
return(AnimList->AktFrame->StartCnt);
}
}
long GetPreAnimCnt(tAnimation *Anim,long NodeNr)
{
tAnimationList *AnimList;
long I;
AnimList=Anim->NodeList;
for(I=0;I<NodeNr;I++) AnimList=AnimList->Next;
if(AnimList->AktFrame->Pre!=NULL)
{
return(AnimList->AktFrame->Pre->StartCnt);
} else
{
return(AnimList->AktFrame->StartCnt);
}
}
void WriteFloat(FILE *F,float Val)
{
fwrite((((unsigned char*)&Val)+1),sizeof(float)-1,1,F);
}
void SaveAnimation(char *fname,tAnimation *Anim)
{
// fwrite(Anim,sizeof(tAnimation),1,F);
tAnimationList *List;
tAnimFrame *Frame,*Old;
unsigned char Ch,Cnt;
FILE *F;
if(strchr(fname,'.')==NULL)
strcat(fname,".ani");
F=fopen(fname,"wb");
fwrite(Anim,sizeof(tAnimation),1,F);
if(SaveWithoutFrame0)
{
Ch=_Copy_Base;
fwrite(&Ch,1,1,F);
}
List=Anim->NodeList;
while(List!=NULL)
{
Ch=_ListItem;
fwrite(&Ch,1,1,F);
Old=NULL;
Frame=List->Frame0;
while(Frame!=NULL)
{
if((!SaveWithoutFrame0)||(Frame->StartCnt!=0))
{
if((Old==NULL)||(!vEqual(Frame->Node->OrgPos,Old->Node->OrgPos))
||(Frame->Node->Flags!=Old->Node->Flags)||(Frame->Node->Roll!=Old->Node->Roll))
{
Ch=_Frame;
if(Old!=NULL)
{
if(Old->Node->OrgPos.X==Frame->Node->OrgPos.X) Ch|=_Bit1;
if(Old->Node->OrgPos.Y==Frame->Node->OrgPos.Y) Ch|=_Bit2;
if(Old->Node->OrgPos.Z==Frame->Node->OrgPos.Z) Ch|=_Bit3;
if(Old->Node->Flags==Frame->Node->Flags) Ch|=_Bit4;
if(Old->Node->Roll==Frame->Node->Roll) Ch|=_Bit5;
}
fwrite(&Ch,1,1,F);
Cnt=Frame->StartCnt;
fwrite(&Cnt,1,1,F);
// fwrite(&Frame->StartCnt,4,1,F);
if(!(Ch&_Bit1))
// fwrite(&Frame->Node->OrgPos.X,sizeof(float),1,F);
WriteFloat(F,Frame->Node->OrgPos.X);
if(!(Ch&_Bit2))
// fwrite(&Frame->Node->OrgPos.Y,sizeof(float),1,F);
WriteFloat(F,Frame->Node->OrgPos.Y);
if(!(Ch&_Bit3))
// fwrite(&Frame->Node->OrgPos.Z,sizeof(float),1,F);
WriteFloat(F,Frame->Node->OrgPos.Z);
if(!(Ch&_Bit4))
fwrite(&Frame->Node->Flags,sizeof(char),1,F);
if(!(Ch&_Bit5))
// fwrite(&Frame->Node->Roll,sizeof(float),1,F);
WriteFloat(F,Frame->Node->Roll);
/*
fwrite(&Frame->Node->OrgPos,sizeof(tP3D),1,F);
*/
}
}
Old=Frame;
Frame=Frame->Next;
}
List=List->Next;
// fwrite(List,sizeof(tAnimationList),1,F);
}
Ch=_EndOfFile;
fwrite(&Ch,1,1,F);
fclose(F);
}
void CalcObjUsingAnimationAndCount(tObjekt *Obj,tAnimation *Anim,long Cnt)
{
tP3D V1,V2;
tSkelList *SkelList;
tAnimationList *AnimList;
tAnimFrame *NextFrame;
float FrameAb,R1,R2;
SkelList=Obj->SkelList;
AnimList=Anim->NodeList;
while(SkelList!=NULL)
{
AnimList->AktFrame=FindFrame(AnimList->Frame0,Cnt);
// Letzter Animationsschritt , no calc
if((AnimList->AktFrame->Next==NULL)&&(Anim->LoopPoint==-1))
{
// if(Anim->LoopPoint!=-1) AnimList->AktFrame=AnimList->Frame0;
SkelList->Node->OrgPos=AnimList->AktFrame->Node->OrgPos;
SkelList->Node->Roll=AnimList->AktFrame->Node->Roll;
// SkelList->Node->Flags=AnimList->AktFrame->Node->Flags;
} else
{
NextFrame=AnimList->AktFrame->Next;
// if((Anim->LoopPoint!=-1)&&(NextFrame==NULL)) NextFrame=AnimList->Frame0;
if(NextFrame==NULL)
{
// Wenn gelooped dann auf Startframe zur點ksetzen
NextFrame=AnimList->Frame0;
FrameAb=Cnt-AnimList->AktFrame->StartCnt;
FrameAb=FrameAb/(float)(Anim->LoopPoint-AnimList->AktFrame->StartCnt);
} else {
FrameAb=Cnt-AnimList->AktFrame->StartCnt;
FrameAb=FrameAb/(float)(AnimList->AktFrame->Next->StartCnt-AnimList->AktFrame->StartCnt);
}
/*
FrameAb=Cnt-AnimList->AktFrame->StartCnt;
FrameAb=FrameAb/(float)(NextFrame->StartCnt-AnimList->AktFrame->StartCnt);
/**/
V1=AnimList->AktFrame->Node->OrgPos;
R1=AnimList->AktFrame->Node->Roll;
V2=NextFrame->Node->OrgPos;
R2=NextFrame->Node->Roll;
SkelList->Node->OrgPos=vAdd(V1,vMulK(vSub(V2,V1),FrameAb));
SkelList->Node->Roll=R1+(R2-R1)*FrameAb;
// SkelList->Node->Flags=NextFrame->Node->Flags;
}
SkelList=SkelList->Next;
AnimList=AnimList->Next;
}
}
bool LowerAnimationFrame(tAnimation *Anim,long Number,long Cnt)
{
tAnimFrame *Frame;
Frame=GetAnimFrame(Anim,Number);
if((Frame->Pre!=NULL)&(Frame->StartCnt-1>Frame->Pre->StartCnt))
{
Frame->StartCnt--;
return(true);
}
return(false);
}
bool HigherAnimationFrame(tAnimation *Anim,long Number,long Cnt)
{
tAnimFrame *Frame;
Frame=GetAnimFrame(Anim,Number);
if((Frame->Next==NULL)||(Frame->StartCnt+1<Frame->Next->StartCnt))
{
Frame->StartCnt++;
return(true);
}
return(false);
}
void UpDateAnimSingleNode(tObjekt *Obj,tAnimation *Anim,long FramePos,long Number)
{
tSkelList *ObjNode;
long I;
tAnimationList *AnimList;
ObjNode=Obj->SkelList;
Anim->FrameCounter=FramePos;
AnimList=Anim->NodeList;
for(I=0;I<Number;I++)
{
AnimList=AnimList->Next;
ObjNode=ObjNode->Next;
}
AnimList->AktFrame=FindFrame(AnimList->Frame0,FramePos);
if(!SkelEqual(ObjNode->Node,AnimList->AktFrame->Node))
AddFrame(AnimList->AktFrame,ObjNode->Node,FramePos);
}
void AddFrame(tAnimFrame *Akt_Frame,tSkeletonNode *Node,long FramePos)
{
tAnimFrame *Temp;
if(Akt_Frame->StartCnt!=FramePos)
{
Temp=(tAnimFrame*)malloc(sizeof(tAnimFrame));
Temp->Next=Akt_Frame->Next;
Temp->Pre=Akt_Frame;
Temp->StartCnt=FramePos;
Temp->Node=CreateFrame(Node);
Akt_Frame->Next=Temp;
Akt_Frame=Temp;
}
Akt_Frame->Node->OrgPos.X=Node->OrgPos.X;
Akt_Frame->Node->OrgPos.Y=Node->OrgPos.Y;
Akt_Frame->Node->OrgPos.Z=Node->OrgPos.Z;
Akt_Frame->Node->Roll=Node->Roll;
Akt_Frame->Node->Flags=Node->Flags;
}
void StartAnimationPlay(tObjekt *Obj,tAnimation *Anim)
{
tSkelList *SkelList;
tAnimationList *AnimList;
SkelList=Obj->SkelList;
AnimList=Anim->NodeList;
while(SkelList!=NULL)
{
// Letzter Animationsschritt , no calc
SkelList->Node->OrgPos=AnimList->Frame0->Node->OrgPos;
SkelList->Node->Roll=AnimList->Frame0->Node->Roll;
SkelList->Node->Flags=AnimList->Frame0->Node->Flags;
SkelList=SkelList->Next;
AnimList=AnimList->Next;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -