summaryrefslogtreecommitdiff
path: root/3dc/win95/ANIMCHNK.CPP
diff options
context:
space:
mode:
authorRebellion Developments <rebellion@nomail>2000-03-16 11:25:00 +0100
committerPatryk Obara <dreamer.tan@gmail.com>2019-08-19 05:45:17 +0200
commit218ca90543758a20ac326e444ca0643174ca7384 (patch)
tree16bfe3e5307f9f515489000f28728224291a0e3b /3dc/win95/ANIMCHNK.CPP
Import Aliens vs Predator - Gold (Build 116)
Source code release, imported from: https://www.gamefront.com/games/aliens-vs-predator-3/file/avp-gold-complete-source-code All text files were converted to Unix format.
Diffstat (limited to '3dc/win95/ANIMCHNK.CPP')
-rw-r--r--3dc/win95/ANIMCHNK.CPP270
1 files changed, 270 insertions, 0 deletions
diff --git a/3dc/win95/ANIMCHNK.CPP b/3dc/win95/ANIMCHNK.CPP
new file mode 100644
index 0000000..3f5d87a
--- /dev/null
+++ b/3dc/win95/ANIMCHNK.CPP
@@ -0,0 +1,270 @@
+#include "animchnk.hpp"
+
+//macro for helping to force inclusion of chunks when using libraries
+FORCE_CHUNK_INCLUDE_IMPLEMENT(animchnk)
+
+RIF_IMPLEMENT_DYNCREATE("TEXTANIM",Animation_Chunk)
+
+Animation_Chunk::Animation_Chunk(Chunk_With_Children* parent)
+: Chunk(parent, "TEXTANIM")
+{
+ NumPolys=0;
+ AnimList=0;
+}
+Animation_Chunk::Animation_Chunk(Chunk_With_Children* parent,const char* data,size_t /*datasize*/)
+: Chunk(parent, "TEXTANIM")
+{
+ NumPolys=*((int*)data);
+ data+=4;
+ if(NumPolys)
+ {
+ AnimList=(TEXANIM**)malloc(NumPolys*sizeof(TEXANIM*));
+ for(int i=0;i<NumPolys;i++)
+ {
+ AnimList[i]=new TEXANIM;
+ TEXANIM* ta=AnimList[i];
+ ta->poly=*((int*)data);
+ data+=4;
+ ta->ID=*((int*)data);
+ data+=4;
+ ta->NumSeq=*((int*)data);
+ data+=4;
+ ta->NumVerts=*((int*)data);
+ data+=4;
+ ta->AnimFlags=*((int*)data);
+ data+=4;
+ ta->Identifier=*((int*)data);
+ data+=4;
+ ta->CurSeq=0;
+ ta->Seq=new FrameList*[ta->NumSeq];
+ for(int j=0;j<ta->NumSeq;j++)
+ {
+ ta->Seq[j]=new FrameList(ta);
+ FrameList* fl=ta->Seq[j];
+ fl->Speed=*((int*)data);
+ data+=4;
+ fl->Flags=*((int*)data);
+ data+=4;
+
+ fl->NumFrames=*((int*)data);
+ data+=4;
+ fl->spare1=*((int*)data);
+ data+=4;
+ fl->spare2=*((int*)data);
+ data+=4;
+ fl->CurFrame=0;
+
+ fl->Textures=new int[fl->NumFrames];
+ fl->UVCoords=new int[(2*ta->NumVerts)*fl->NumFrames];
+ for(int k=0;k<fl->NumFrames;k++)
+ {
+ fl->Textures[k]=*((int*)data);
+ data+=4;
+ }
+ for(k=0;k<(2*ta->NumVerts)*fl->NumFrames;k++)
+ {
+ fl->UVCoords[k]=*((int*)data);
+ data+=4;
+ }
+ }
+
+ }
+ }
+ else
+ AnimList=0;
+
+}
+
+Animation_Chunk::~Animation_Chunk()
+{
+ for(int i=0;i<NumPolys;i++)
+ {
+ delete AnimList[i];
+ }
+ free(AnimList);
+}
+
+
+size_t Animation_Chunk::size_chunk()
+{
+ chunk_size=12+4;
+ for(int i=0;i<NumPolys;i++)
+ {
+ chunk_size+=24;
+ TEXANIM* ta=AnimList[i];
+ for(int j=0;j<ta->NumSeq;j++)
+ {
+ chunk_size+=20;
+ chunk_size+=4*(1+2*ta->NumVerts)*ta->Seq[j]->NumFrames;
+ }
+ }
+ return chunk_size;
+}
+
+BOOL Animation_Chunk::output_chunk (HANDLE &hand)
+{
+ unsigned long junk;
+ BOOL ok;
+ char * data_block;
+
+ data_block = this->make_data_block_from_chunk();
+
+ ok = WriteFile (hand, (long *) data_block, (unsigned long) chunk_size, &junk, 0);
+
+ delete [] data_block;
+
+ if (!ok) return FALSE;
+
+ return TRUE;
+}
+
+void Animation_Chunk::fill_data_block(char* data_start)
+{
+ strncpy (data_start, identifier, 8);
+
+ data_start += 8;
+
+ *((int *) data_start) = chunk_size;
+
+ data_start += 4;
+
+ *(int*)data_start=NumPolys;
+ data_start+=4;
+ for(int i=0;i<NumPolys;i++)
+ {
+ TEXANIM* ta=AnimList[i];
+ *(int*)data_start=ta->poly;
+ data_start+=4;
+ *(int*)data_start=ta->ID;
+ data_start+=4;
+ *(int*)data_start=ta->NumSeq;
+ data_start+=4;
+ *(int*)data_start=ta->NumVerts;
+ data_start+=4;
+ *(int*)data_start=ta->AnimFlags;
+ data_start+=4;
+ *(int*)data_start=ta->Identifier;
+ data_start+=4;
+
+ for(int j=0;j<ta->NumSeq;j++)
+ {
+ FrameList* fl=ta->Seq[j];
+ *(int*)data_start=fl->Speed;
+ data_start+=4;
+ *(int*)data_start=fl->Flags;
+ data_start+=4;
+ *(int*)data_start=fl->NumFrames;
+ data_start+=4;
+ *(int*)data_start=fl->spare1;
+ data_start+=4;
+ *(int*)data_start=fl->spare2;
+ data_start+=4;
+ for(int k=0;k<fl->NumFrames;k++)
+ {
+ *(int*)data_start=fl->Textures[k];
+ data_start+=4;
+ }
+ for(k=0;k<(2*ta->NumVerts)*fl->NumFrames;k++)
+ {
+ *(int*)data_start=fl->UVCoords[k];
+ data_start+=4;
+ }
+ }
+
+ }
+}
+
+FrameList::FrameList(TEXANIM* p)
+{
+ Speed=65536;
+ Flags=0;
+ NumFrames=0;
+ CurFrame=-1;
+ parent=p;
+ Textures=0;
+ UVCoords=0;
+ spare1=spare2=0;
+}
+FrameList::FrameList(TEXANIM* p,FrameList* fl,int* conv)
+{
+ Speed=fl->Speed;
+ Flags=fl->Flags;
+ NumFrames=fl->NumFrames;
+ parent=p;
+ Textures=new int[NumFrames];
+ UVCoords=new int[NumFrames*2*p->NumVerts];
+ spare1=fl->spare1;
+ spare2=fl->spare2;
+ if(conv)
+ {
+ for(int i=0;i<NumFrames;i++)
+ {
+ Textures[i]=conv[fl->Textures[i]];
+ }
+ }
+ else
+ {
+ for(int i=0;i<NumFrames;i++)
+ {
+ Textures[i]=fl->Textures[i];
+ }
+ }
+ for(int i=0;i<NumFrames*2*p->NumVerts;i++)
+ {
+ UVCoords[i]=fl->UVCoords[i];
+ }
+ CurFrame=0;
+}
+FrameList::~FrameList()
+{
+ delete [] Textures;
+ delete UVCoords;
+}
+
+TEXANIM::TEXANIM()
+{
+ shape=0;
+ NumSeq=0;
+ CurSeq=-1;
+ Seq=0;
+ NumVerts=3;
+ AnimFlags=Identifier=0;
+}
+TEXANIM::TEXANIM(TEXANIM* ta)
+{
+ shape=0;
+ NumSeq=0;
+ CurSeq=-1;
+ Seq=0;
+ NumVerts=3;
+ AnimFlags=Identifier=0;
+ CopyAnimData(ta,0);
+}
+
+TEXANIM::~TEXANIM()
+{
+ for(int i=0;i<NumSeq;i++)
+ {
+ delete Seq[i];
+ }
+ delete [] Seq;
+}
+
+void TEXANIM::CopyAnimData(TEXANIM* ta,int*conv)
+{
+ shape=ta->shape;
+ poly=ta->poly;
+ ID=ta->ID;
+ NumSeq=ta->NumSeq;
+ CurSeq=0;
+ Seq=new FrameList*[NumSeq];
+ NumVerts=ta->NumVerts;
+ AnimFlags=ta->AnimFlags;
+ Identifier=ta->Identifier;
+ for(int i=0;i<NumSeq;i++)
+ {
+ Seq[i]=new FrameList(this,ta->Seq[i],conv);
+ }
+
+}
+