diff options
| author | Rebellion Developments <rebellion@nomail> | 2000-03-16 11:25:00 +0100 |
|---|---|---|
| committer | Patryk Obara <dreamer.tan@gmail.com> | 2019-08-19 05:45:17 +0200 |
| commit | 218ca90543758a20ac326e444ca0643174ca7384 (patch) | |
| tree | 16bfe3e5307f9f515489000f28728224291a0e3b /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.CPP | 270 |
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); + } + +} + |
