From 218ca90543758a20ac326e444ca0643174ca7384 Mon Sep 17 00:00:00 2001 From: Rebellion Developments Date: Thu, 16 Mar 2000 11:25:00 +0100 Subject: 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. --- 3dc/win95/animobs.cpp | 593 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 593 insertions(+) create mode 100644 3dc/win95/animobs.cpp (limited to '3dc/win95/animobs.cpp') diff --git a/3dc/win95/animobs.cpp b/3dc/win95/animobs.cpp new file mode 100644 index 0000000..f85001f --- /dev/null +++ b/3dc/win95/animobs.cpp @@ -0,0 +1,593 @@ +#include "hierchnk.hpp" +#include "Animobs.hpp" +#include "list_tem.hpp" +#include + +//macro for helping to force inclusion of chunks when using libraries +FORCE_CHUNK_INCLUDE_IMPLEMENT(animobs) + +RIF_IMPLEMENT_DYNCREATE("OBASEQFR",Object_Animation_Sequence_Frame_Chunk) + +void Object_Animation_Sequence_Frame_Chunk::fill_data_block (char *data_start) +{ + strncpy (data_start, identifier, 8); + + data_start += 8; + + *((int *) data_start) = chunk_size; + + data_start += 4; + + + *((float *) data_start) = orientation.x; + data_start += 4; + *((float *) data_start) = orientation.y; + data_start += 4; + *((float *) data_start) = orientation.z; + data_start += 4; + *((float *) data_start) = orientation.w; + data_start += 4; + + *((int *) data_start) = transform.x; + data_start += 4; + *((int *) data_start) = transform.y; + data_start += 4; + *((int *) data_start) = transform.z; + data_start += 4; + + *((int *) data_start) = at_frame_no; + data_start += 4; + + *((int *) data_start) = frame_ref_no; + data_start += 4; + + *((int *) data_start) = flags; + data_start += 4; + + *(int*) data_start=num_extra_data; + data_start+=4; + + for (int i=0; i=0 && ind<=127) + { + flags &=~HierarchyFrame_SoundIndexMask; + flags |= (ind<<24); + } +} + +RIF_IMPLEMENT_DYNCREATE("OBASEQHD",Object_Animation_Sequence_Header_Chunk) + +void Object_Animation_Sequence_Header_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) = num_frames; + data_start += 4; + + *((int *) data_start) = sequence_number; + data_start += 4; + + *((int *) data_start) = sub_sequence_number; + data_start += 4; + + *(int*)data_start=num_extra_data; + data_start+=4; + + for (int i=0; i *pList) +{ + List cl; + lookup_child ("OBASEQFR",cl); + + for (LIF cli(&cl); !cli.done(); cli.next()) + { + pList->add_entry((Object_Animation_Sequence_Frame_Chunk *)cli()); + } + +} + +//////////////////////////////// + +RIF_IMPLEMENT_DYNCREATE("OBANSEQS",Object_Animation_Sequences_Chunk) + +void Object_Animation_Sequences_Chunk::list_sequences(List * pList) +{ + List cl; + lookup_child ("OBANSEQC",cl); + + for (LIF cli(&cl); !cli.done(); cli.next()) + { + pList->add_entry((Object_Animation_Sequence_Chunk *)cli()); + } +} + + +Object_Animation_Sequence_Chunk::Object_Animation_Sequence_Chunk(Object_Animation_Sequences_Chunk* parent,Object_Animation_Sequence_Chunk* template_seq,ChunkQuat & orient ,ChunkVectorInt & trans) +:Chunk_With_Children (parent, "OBANSEQC") +{ + Object_Animation_Sequence_Header_Chunk* template_header=template_seq->get_header(); + Object_Animation_Sequence_Header_Chunk* header=new Object_Animation_Sequence_Header_Chunk(this); + + header->num_frames=65536; + header->sequence_number=template_header->sequence_number; + header->sub_sequence_number=template_header->sub_sequence_number; + header->sequence_name=new char[strlen(template_header->sequence_name)+1]; + strcpy(header->sequence_name,template_header->sequence_name); + + Object_Animation_Sequence_Frame_Chunk* oasfc=new Object_Animation_Sequence_Frame_Chunk(this); + + oasfc->orientation=orient; + oasfc->transform=trans; + oasfc->at_frame_no=0; + oasfc->frame_ref_no=0; + + //see if template sequence is a delta sequence + List framelist; + template_seq->get_frames(&framelist); + while(framelist.size()) + { + if(framelist.first_entry()->flags & HierarchyFrameFlag_DeltaFrame) + { + oasfc->flags=HierarchyFrameFlag_DeltaFrame; + break; + } + framelist.delete_first_entry(); + } + + +} + +Object_Animation_Sequence_Chunk * Object_Animation_Sequences_Chunk::get_sequence (int num, int subnum) +{ + List seq_list; + list_sequences(&seq_list); + + for (LIF sli(&seq_list); !sli.done(); sli.next()) + { + Object_Animation_Sequence_Header_Chunk * oashc = sli()->get_header(); + if (oashc) + { + if (oashc->sequence_number == num && oashc->sub_sequence_number == subnum) + { + break; + } + } + } + + if (!sli.done()) + { + return(sli()); + } + else + { + return(0); + } +} + +int Object_Animation_Sequence_Chunk::get_sequence_time() +{ + Object_Animation_Sequence_Time_Chunk* time_chunk=(Object_Animation_Sequence_Time_Chunk*)lookup_single_child("OBASEQTM"); + if(time_chunk) + { + return time_chunk->sequence_time; + } + return 0; +} + +int Object_Animation_Sequence_Chunk::get_sequence_speed() +{ + Object_Animation_Sequence_Speed_Chunk* speed_chunk=(Object_Animation_Sequence_Speed_Chunk*)lookup_single_child("OBASEQSP"); + if(speed_chunk) + { + return speed_chunk->sequence_speed; + } + return 0; +} + +BOOL Object_Animation_Sequence_Chunk::get_sequence_vector(ChunkVectorFloat* direction) +{ + if(!direction) return FALSE; + + //default direction is forwards + direction->x=0; + direction->y=0; + direction->z=1; + + + Object_Animation_Sequence_Speed_Chunk* speed_chunk=(Object_Animation_Sequence_Speed_Chunk*)lookup_single_child("OBASEQSP"); + if(speed_chunk) + { + double radian_angle=(speed_chunk->angle/360.0)*2*3.1415278; + direction->x =(float) sin(radian_angle); + direction->z =(float) cos(radian_angle); + + return TRUE; + } + else + { + return FALSE; + } +} + +int Object_Animation_Sequence_Chunk::get_sequence_flags() +{ + Object_Animation_Sequence_Flags_Chunk* flag_chunk=(Object_Animation_Sequence_Flags_Chunk*)lookup_single_child("OBASEQFL"); + if(flag_chunk) + { + return flag_chunk->flags; + } + return 0; +} + +void Object_Animation_Sequence_Chunk::set_sequence_flags(int new_flags) +{ + //find existing flag_chunk , or create a new one + Object_Animation_Sequence_Flags_Chunk* flag_chunk=(Object_Animation_Sequence_Flags_Chunk*)lookup_single_child("OBASEQFL"); + if(flag_chunk) + { + //set the flags + flag_chunk->flags = new_flags; + } + else + { + //create a new chunk then + new Object_Animation_Sequence_Flags_Chunk(this,new_flags); + } +} + +Hierarchy_Bounding_Box_Chunk* Object_Animation_Sequence_Chunk::get_bounding_box() +{ + return (Hierarchy_Bounding_Box_Chunk*)lookup_single_child("HIERBBOX"); +} + +//////////////////////////////////////////////////////////////////////////////// + /*--------------------------------------** + ** Object_Animation_Sequence_Time_Chunk ** + **--------------------------------------*/ + +RIF_IMPLEMENT_DYNCREATE("OBASEQTM",Object_Animation_Sequence_Time_Chunk) + +Object_Animation_Sequence_Time_Chunk::Object_Animation_Sequence_Time_Chunk (Chunk_With_Children * parent,const char * data_start, size_t) +: Chunk (parent, "OBASEQTM") +{ + sequence_time=*(unsigned int*) data_start; +} + +void Object_Animation_Sequence_Time_Chunk::fill_data_block(char* data_start) +{ + strncpy (data_start, identifier, 8); + data_start += 8; + *((int *) data_start) = chunk_size; + data_start += 4; + + *(unsigned int*) data_start = sequence_time; +} + +//////////////////////////////////////////////////////////////////////////////// + /*---------------------------------------** + ** Object_Animation_Sequence_Speed_Chunk ** + **---------------------------------------*/ + +RIF_IMPLEMENT_DYNCREATE("OBASEQSP",Object_Animation_Sequence_Speed_Chunk) + +Object_Animation_Sequence_Speed_Chunk::Object_Animation_Sequence_Speed_Chunk (Chunk_With_Children * parent,const char * data, size_t) +: Chunk (parent, "OBASEQSP") +{ + CHUNK_EXTRACT(sequence_speed,int) + CHUNK_EXTRACT(angle,int) + CHUNK_EXTRACT(spare,int) +} + +void Object_Animation_Sequence_Speed_Chunk::fill_data_block(char* data) +{ + CHUNK_FILL_START + CHUNK_FILL(sequence_speed,int) + CHUNK_FILL(angle,int) + CHUNK_FILL(spare,int) +} + +//////////////////////////////////////////////////////////////////////////////// + /*---------------------------------------** + ** Object_Animation_Sequence_Flags_Chunk ** + **---------------------------------------*/ + + +RIF_IMPLEMENT_DYNCREATE("OBASEQFL",Object_Animation_Sequence_Flags_Chunk) + +Object_Animation_Sequence_Flags_Chunk::Object_Animation_Sequence_Flags_Chunk (Chunk_With_Children * parent,const char * data, size_t) +: Chunk (parent, "OBASEQFL") +{ + CHUNK_EXTRACT(flags,int) +} + +void Object_Animation_Sequence_Flags_Chunk::fill_data_block(char* data) +{ + CHUNK_FILL_START + CHUNK_FILL(flags,int) +} + +//////////////////////////////////////////////////////////////////////////////// + +RIF_IMPLEMENT_DYNCREATE("OBANALLS",Object_Animation_All_Sequence_Chunk) + +Object_Animation_All_Sequence_Chunk::Object_Animation_All_Sequence_Chunk(Chunk_With_Children* parent) +:Chunk(parent,"OBANALLS") +{ + num_sequences=0; + sequences=0; +} + +Object_Animation_All_Sequence_Chunk::Object_Animation_All_Sequence_Chunk(Chunk_With_Children * const parent,const char * data, const size_t) +:Chunk(parent,"OBANALLS") +{ + num_sequences=*(int*)data; + data+=4; + + if(num_sequences) sequences=new Object_Animation_Sequence[num_sequences]; + else sequences=0; + + for(int i=0;inum_frames=*(int*)data; + data+=4; + seq->sequence_number=*(int*)data; + data+=4; + seq->sub_sequence_number=*(int*)data; + data+=4; + seq->sequence_time=*(int*)data; + data+=4; + + if(seq->num_frames) seq->frames=new Object_Animation_Frame[seq->num_frames]; + else seq->frames=0; + + for(unsigned j=0;jnum_frames;j++) + { + seq->frames[j]=*(Object_Animation_Frame*)data; + data+=sizeof(Object_Animation_Frame); + } + } +} + +void Object_Animation_All_Sequence_Chunk::fill_data_block(char* data) +{ + strncpy (data, identifier, 8); + data += 8; + *((int *) data) = chunk_size; + data += 4; + + *(int*)data=num_sequences; + data+=4; + + for(int i=0;inum_frames; + data+=4; + *(int*)data=seq->sequence_number; + data+=4; + *(int*)data=seq->sub_sequence_number; + data+=4; + *(int*)data=seq->sequence_time; + data+=4; + + for(unsigned j=0;jnum_frames;j++) + { + *(Object_Animation_Frame*)data=seq->frames[j]; + data+=sizeof(Object_Animation_Frame); + } + + } +} + +size_t Object_Animation_All_Sequence_Chunk::size_chunk() +{ + chunk_size=12+4; + chunk_size+=num_sequences*16; + for(int i=0;i