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

📄 animation.cpp

📁 一个96K的3D游戏源码
💻 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 + -