📄 animation.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 "GameDefines.h"
tAnimationList *AktList;
tAnimFrame *FindFrame(tAnimFrame *Frame_1,long FramePos)
{
while((Frame_1->Next!=NULL)&&(Frame_1->Next->StartCnt<=FramePos))
{
Frame_1=Frame_1->Next;
}
return(Frame_1);
}
void CalcObjUsingAnimationAndCountReal(tObjekt *Obj,tAnimation *Anim,long Cnt)
{
tSkelList *SkelList;
tAnimationList *AnimList;
SkelList=Obj->SkelList;
AnimList=Anim->NodeList;
while(SkelList!=NULL)
{
AnimList->AktFrame=FindFrame(AnimList->Frame0,Cnt);
// Letzter Animationsschritt , no calc
if(AnimList->AktFrame->Next==NULL)
{
if(Anim->LoopPoint!=-1) AnimList->AktFrame=AnimList->Frame0;
SkelList->Node->ZielOrgPos=AnimList->AktFrame->Node->OrgPos;
SkelList->Node->ZielRoll=AnimList->AktFrame->Node->Roll;
} else
{
SkelList->Node->ZielOrgPos=AnimList->AktFrame->Next->Node->OrgPos;
SkelList->Node->ZielRoll=AnimList->AktFrame->Next->Node->Roll;
}
// SkelList->Node->Flags=AnimList->AktFrame->Node->Flags;
SkelList=SkelList->Next;
AnimList=AnimList->Next;
}
}
#ifdef ANIMemoryLoading
tAnimation *LoadAnimationFromMem(unsigned char *FileAddr,tAnimation *BaseAnimation)
{
// fwrite(Anim,sizeof(tAnimation),1,F);
bool CopyBase=false;
tAnimation *Anim;
tAnimationList *List,*OldList,*BaseList;
tAnimFrame *Frame,*OldFrame;
long Fl;
unsigned char Ch,Ch2,Cnt;
t_File_Handle F;
F.Pos=0;
F.Pointer=FileAddr;
// F=Load_File(fname);
Anim=(tAnimation *) malloc(sizeof(tAnimation));
FileRead(&F,Anim,sizeof(tAnimation));
Anim->FrameCounter=0;
List=NULL;
FileRead(&F,&Ch,1);
while(Ch!=_EndOfFile)
{
if(Ch==_Copy_Base) CopyBase=true;
if(Ch==_ListItem)
{
OldList=List;
List=(tAnimationList *)malloc(sizeof(tAnimationList));
List->Next=NULL;
List->Frame0=NULL;
Frame=NULL;
if(OldList==NULL)
{
Anim->NodeList=List;
if(BaseAnimation!=NULL) BaseList=BaseAnimation->NodeList;
} else
{
OldList->Next=List;
if(BaseAnimation!=NULL) BaseList=BaseList->Next;
}
// Aufpassen !!! Frame wird nicht kopiert bei CopyBase
if(CopyBase)
{
OldFrame=Frame;
Frame=(tAnimFrame*) malloc(sizeof(tAnimFrame));
*Frame=*(BaseList->Frame0);
Frame->Node=(tSkeletonNode*)malloc(sizeof(tSkeletonNode));
*Frame->Node=*(BaseList->Frame0->Node);
Frame->Pre=OldFrame;
Frame->Next=NULL;
if(OldFrame==NULL)
{
List->Frame0=Frame;
List->AktFrame=Frame;
} else
{
OldFrame->Next=Frame;
}
}
}
if(Ch==_Frame)
{
// MessageBox (HWND_DESKTOP, "Test Message", "B-Clopd3D Interrupted", MB_OK | MB_ICONEXCLAMATION);
OldFrame=Frame;
Frame=(tAnimFrame*) malloc(sizeof(tAnimFrame));
Frame->Pre=OldFrame;
Frame->Next=NULL;
FileRead(&F,&Cnt,1);
Frame->StartCnt=Cnt;
// FileRead(&F,&Frame->StartCnt,4);
Frame->Node=(tSkeletonNode*)malloc(sizeof(tSkeletonNode));
// FileRead(F,Frame->Node,sizeof(tSkeletonNode));
if(OldFrame!=NULL)
{
Frame->Node->OrgPos=OldFrame->Node->OrgPos;
Frame->Node->Flags=OldFrame->Node->Flags;
Frame->Node->Roll=OldFrame->Node->Roll;
}
if(!(Ch2&_Bit1))
// FileRead(&F,&Frame->Node->OrgPos.X,sizeof(float));
ReadFloat(&F,&Frame->Node->OrgPos.X);
if(!(Ch2&_Bit2))
// FileRead(&F,&Frame->Node->OrgPos.Y,sizeof(float));
ReadFloat(&F,&Frame->Node->OrgPos.Y);
if(!(Ch2&_Bit3))
// FileRead(&F,&Frame->Node->OrgPos.Z,sizeof(float));
ReadFloat(&F,&Frame->Node->OrgPos.Z);
if(!(Ch2&_Bit4))
FileRead(&F,&Frame->Node->Flags,sizeof(char));
if(!(Ch2&_Bit5))
// FileRead(&F,&Frame->Node->Roll,sizeof(float));
ReadFloat(&F,&Frame->Node->Roll);
/*
FileRead(&F,&Frame->Node->OrgPos,sizeof(tP3D));
FileRead(&F,&Frame->Node->Flags,sizeof(char));
FileRead(&F,&Frame->Node->Roll,sizeof(float));
*/
if(OldFrame==NULL)
{
List->Frame0=Frame;
List->AktFrame=Frame;
} else
{
OldFrame->Next=Frame;
}
}
FileRead(&F,&Ch2,1);
Ch=Ch2&3;
}
List=Anim->NodeList;
while(List!=NULL)
{
Frame=List->Frame0;
while(Frame->Next!=NULL)
{
Frame=Frame->Next;
}
Fl=Frame->Node->Flags;
Frame=List->Frame0;
while(Frame!=NULL)
{
Frame->Node->Flags=Fl;
Frame=Frame->Next;
}
List=List->Next;
}
// Close_File(F);
// MessageBox (HWND_DESKTOP, "Test Message", "B-Clopd3D Interrupted", MB_OK | MB_ICONEXCLAMATION);
return(Anim);
}
#else
tAnimation *LoadAnimation(char *fname,tAnimation *BaseAnimation)
{
// fwrite(Anim,sizeof(tAnimation),1,F);
bool CopyBase=false;
tAnimation *Anim;
tAnimationList *List,*OldList,*BaseList;
tAnimFrame *Frame,*OldFrame;
long Fl;
unsigned char Ch,Ch2,Cnt;
t_File_Handle *F;
F=Load_File(fname);
Anim=(tAnimation *) malloc(sizeof(tAnimation));
FileRead(F,Anim,sizeof(tAnimation));
Anim->FrameCounter=0;
List=NULL;
FileRead(F,&Ch,1);
while(Ch!=_EndOfFile)
{
if(Ch==_Copy_Base) CopyBase=true;
if(Ch==_ListItem)
{
OldList=List;
List=(tAnimationList *)malloc(sizeof(tAnimationList));
List->Next=NULL;
List->Frame0=NULL;
Frame=NULL;
if(OldList==NULL)
{
Anim->NodeList=List;
if(BaseAnimation!=NULL) BaseList=BaseAnimation->NodeList;
} else
{
OldList->Next=List;
if(BaseAnimation!=NULL) BaseList=BaseList->Next;
}
// Aufpassen !!! Frame wird nicht kopiert bei CopyBase
if(CopyBase)
{
OldFrame=Frame;
Frame=(tAnimFrame*) malloc(sizeof(tAnimFrame));
*Frame=*(BaseList->Frame0);
Frame->Node=(tSkeletonNode*)malloc(sizeof(tSkeletonNode));
*Frame->Node=*(BaseList->Frame0->Node);
Frame->Pre=OldFrame;
Frame->Next=NULL;
if(OldFrame==NULL)
{
List->Frame0=Frame;
List->AktFrame=Frame;
} else
{
OldFrame->Next=Frame;
}
}
}
if(Ch==_Frame)
{
OldFrame=Frame;
Frame=(tAnimFrame*) malloc(sizeof(tAnimFrame));
Frame->Pre=OldFrame;
Frame->Next=NULL;
// FileRead(F,&Frame->StartCnt,4);
FileRead(F,&Cnt,1);
Frame->StartCnt=Cnt;
/**/
Frame->Node=(tSkeletonNode*)malloc(sizeof(tSkeletonNode));
if(OldFrame!=NULL)
{
Frame->Node->OrgPos=OldFrame->Node->OrgPos;
Frame->Node->Flags=OldFrame->Node->Flags;
Frame->Node->Roll=OldFrame->Node->Roll;
}
if(!(Ch2&_Bit1))
// FileRead(F,&Frame->Node->OrgPos.X,sizeof(float));
ReadFloat(F,&Frame->Node->OrgPos.X);
if(!(Ch2&_Bit2))
// FileRead(F,&Frame->Node->OrgPos.Y,sizeof(float));
ReadFloat(F,&Frame->Node->OrgPos.Y);
if(!(Ch2&_Bit3))
// FileRead(F,&Frame->Node->OrgPos.Z,sizeof(float));
ReadFloat(F,&Frame->Node->OrgPos.Z);
if(!(Ch2&_Bit4))
FileRead(F,&Frame->Node->Flags,sizeof(char));
if(!(Ch2&_Bit5))
// FileRead(F,&Frame->Node->Roll,sizeof(float));
ReadFloat(F,&Frame->Node->Roll);
/*
FileRead(F,&Frame->Node->OrgPos,sizeof(tP3D));
FileRead(F,&Frame->Node->Flags,sizeof(char));
FileRead(F,&Frame->Node->Roll,sizeof(float));
*/
if(OldFrame==NULL)
{
List->Frame0=Frame;
List->AktFrame=Frame;
} else
{
OldFrame->Next=Frame;
}
}
FileRead(F,&Ch2,1);
Ch=Ch2&3;
}
Close_File(F);
List=Anim->NodeList;
while(List!=NULL)
{
Frame=List->Frame0;
while(Frame->Next!=NULL)
{
Frame=Frame->Next;
}
Fl=Frame->Node->Flags;
Frame=List->Frame0;
while(Frame!=NULL)
{
Frame->Node->Flags=Fl;
Frame=Frame->Next;
}
List=List->Next;
}
// MessageBox (HWND_DESKTOP, "Test Message", "B-Clopd3D Interrupted", MB_OK | MB_ICONEXCLAMATION);
return(Anim);
}
#endif
#ifdef ANIMemoryLoading
tAnimation *LoadBaseAnimation(tObjekt *Obj,unsigned char *Addr)
{
tAnimation *Temp;
tSkeletonNode *Node1,*Node2;
tAnimationList *List;
tSkelList *ListN;
Temp=LoadAnimationFromMem(Addr,NULL);
List=Temp->NodeList;
ListN=Obj->SkelList;
while(List!=NULL)
{
Node1=ListN->Node;
Node2=List->Frame0->Node;
Node1->OrgPos=Node2->OrgPos;
Node1->Roll=Node2->Roll;
ListN=ListN->Next;
List=List->Next;
}
ReCalcSkelNode(Obj->Skel,&Kart_Matrix,&vNull,0);
SetMeshAsItIs(Obj->Skel);
return(Temp);
}
#else
tAnimation *LoadBaseAnimation(tObjekt *Obj,char *fname)
{
tAnimation *Temp;
tSkeletonNode *Node1,*Node2;
tAnimationList *List;
tSkelList *ListN;
Temp=LoadAnimation(fname,NULL);
List=Temp->NodeList;
ListN=Obj->SkelList;
while(List!=NULL)
{
Node1=ListN->Node;
Node2=List->Frame0->Node;
Node1->OrgPos=Node2->OrgPos;
Node1->Roll=Node2->Roll;
ListN=ListN->Next;
List=List->Next;
}
ReCalcSkelNode(Obj->Skel,&Kart_Matrix,&vNull,0);
SetMeshAsItIs(Obj->Skel);
return(Temp);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -