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

📄 animationplus.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 "AnimationPlus.h"

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 SaveAnimation(char *fname,tAnimation *Anim)
{
//	fwrite(Anim,sizeof(tAnimation),1,F);
		
	tAnimationList *List;
	tAnimFrame *Frame;
	char Ch;

	FILE *F;
	if(strchr(fname,'.')==NULL) 
		strcat(fname,".ani");
	F=fopen(fname,"wb");
	fwrite(Anim,sizeof(tAnimation),1,F);
	List=Anim->NodeList;
	while(List!=NULL)
	{
		Ch=_ListItem;
		fwrite(&Ch,1,1,F);
		Frame=List->Frame0;
		while(Frame!=NULL)
		{
			Ch=_Frame;
			fwrite(&Ch,1,1,F);
			fwrite(&Frame->StartCnt,4,1,F);
//			fwrite(Frame->Node,sizeof(tSkeletonNode),1,F);
			fwrite(&Frame->Node->OrgPos,sizeof(tP3D),1,F);
			fwrite(&Frame->Node->Flags,sizeof(char),1,F);
			fwrite(&Frame->Node->Roll,sizeof(float),1,F);
			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)*/)
		{

			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(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)(AnimList->AktFrame->Next->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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -