summaryrefslogtreecommitdiff
path: root/src/win95/animobs.cpp
diff options
context:
space:
mode:
authorSteven Fuller <relnev@icculus.org>2001-07-01 00:55:22 +0000
committerPatryk Obara <dreamer.tan@gmail.com>2019-08-20 02:09:04 +0200
commit2186d5f3f95cd74a070a490d899291648d58667a (patch)
tree55241a1afa3e1a22e0b6593a8dead0b703800f44 /src/win95/animobs.cpp
parent218ca90543758a20ac326e444ca0643174ca7384 (diff)
Initial revision
Diffstat (limited to 'src/win95/animobs.cpp')
-rw-r--r--src/win95/animobs.cpp593
1 files changed, 593 insertions, 0 deletions
diff --git a/src/win95/animobs.cpp b/src/win95/animobs.cpp
new file mode 100644
index 0000000..f85001f
--- /dev/null
+++ b/src/win95/animobs.cpp
@@ -0,0 +1,593 @@
+#include "hierchnk.hpp"
+#include "Animobs.hpp"
+#include "list_tem.hpp"
+#include <math.h>
+
+//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<num_extra_data; i++)
+ {
+ *((int *) data_start) = extra_data[i];
+ data_start += 4;
+ }
+
+}
+
+#if UseOldChunkLoader
+Object_Animation_Sequence_Frame_Chunk::Object_Animation_Sequence_Frame_Chunk (Object_Animation_Sequence_Chunk * parent,const char *data_start, size_t)
+: Chunk (parent, "OBASEQFR")
+{
+ orientation.x = -(*(double *) data_start);
+ data_start += 8;
+ orientation.y = -(*(double *) data_start);
+ data_start += 8;
+ orientation.z = -(*(double *) data_start);
+ data_start += 8;
+ orientation.w = (*(double *) data_start);
+ data_start += 8;
+
+ transform.x = *((double *) data_start);
+ data_start += 8;
+ transform.y = *((double *) data_start);
+ data_start += 8;
+ transform.z = *((double *) data_start);
+ data_start += 8;
+
+ at_frame_no = *((int *) data_start);
+ data_start += 4;
+
+ frame_ref_no = *((int *) data_start);
+ data_start += 4;
+
+ flags = *((int *) data_start);
+ data_start += 4;
+
+ num_extra_data=0;
+ extra_data=0;
+
+}
+#else
+Object_Animation_Sequence_Frame_Chunk::Object_Animation_Sequence_Frame_Chunk (Chunk_With_Children * parent,const char *data_start, size_t)
+: Chunk (parent, "OBASEQFR")
+{
+ orientation.x = *((float *) data_start);
+ data_start += 4;
+ orientation.y = *((float *) data_start);
+ data_start += 4;
+ orientation.z = *((float *) data_start);
+ data_start += 4;
+ orientation.w = *((float *) data_start);
+ data_start += 4;
+
+ transform.x = *((int *) data_start);
+ data_start += 4;
+ transform.y = *((int *) data_start);
+ data_start += 4;
+ transform.z = *((int *) data_start);
+ data_start += 4;
+
+ at_frame_no = *((int *) data_start);
+ data_start += 4;
+
+ frame_ref_no = *((int *) data_start);
+ data_start += 4;
+
+ flags = *((int *) data_start);
+ data_start += 4;
+
+ num_extra_data=*(int*) data_start;
+ data_start+=4;
+
+ if(num_extra_data)
+ extra_data=new int[num_extra_data];
+ else
+ extra_data=0;
+
+
+ for (int i=0; i<num_extra_data; i++)
+ {
+ extra_data[i] = *((int *) data_start);
+ data_start += 4;
+ }
+
+}
+#endif
+
+void Object_Animation_Sequence_Frame_Chunk::set_sound_index(int ind)
+{
+ if(ind>=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<num_extra_data; i++)
+ {
+ *((int *) data_start) = extra_data[i];
+ data_start += 4;
+ }
+
+ if (sequence_name)
+ {
+ sprintf (data_start, "%s", sequence_name);
+ }
+ else
+ {
+ *data_start = 0;
+ }
+
+}
+
+Object_Animation_Sequence_Header_Chunk::~Object_Animation_Sequence_Header_Chunk()
+{
+ if (sequence_name)
+ delete sequence_name;
+ if(extra_data)
+ delete extra_data;
+}
+
+
+#if UseOldChunkLoader
+Object_Animation_Sequence_Header_Chunk::Object_Animation_Sequence_Header_Chunk (Chunk_With_Children * parent,const char * data_start, size_t)
+: Chunk (parent, "OBASEQHD"), sequence_name (0)
+{
+ num_frames = *((int *) data_start);
+ data_start += 4;
+
+ sequence_number = *((int *) data_start);
+ data_start += 4;
+
+ sub_sequence_number = *((int *) data_start);
+ data_start += 4;
+
+ num_extra_data=0;
+ extra_data=0;
+ data_start+=40;
+
+ if (strlen(data_start))
+ {
+ sequence_name = new char [strlen(data_start) + 1];
+ strcpy (sequence_name, data_start);
+ }
+}
+#else
+Object_Animation_Sequence_Header_Chunk::Object_Animation_Sequence_Header_Chunk (Chunk_With_Children * parent,const char * data_start, size_t)
+: Chunk (parent, "OBASEQHD"), sequence_name (0)
+{
+ num_frames = *((int *) data_start);
+ data_start += 4;
+
+ sequence_number = *((int *) data_start);
+ data_start += 4;
+
+ sub_sequence_number = *((int *) data_start);
+ data_start += 4;
+
+ num_extra_data=*(int*) data_start;
+ data_start+=4;
+
+ if(num_extra_data)
+ extra_data=new int[num_extra_data];
+ else
+ extra_data=0;
+
+
+ for (int i=0; i<num_extra_data; i++)
+ {
+ extra_data[i] = *((int *) data_start);
+ data_start += 4;
+ }
+
+
+ if (strlen(data_start))
+ {
+ sequence_name = new char [strlen(data_start) + 1];
+ strcpy (sequence_name, data_start);
+ }
+}
+#endif
+
+
+
+Object_Animation_Sequence_Header_Chunk * Object_Animation_Sequence_Chunk::get_header()
+{
+ return(Object_Animation_Sequence_Header_Chunk *) lookup_single_child("OBASEQHD");
+}
+
+void Object_Animation_Sequence_Chunk::get_frames(List <Object_Animation_Sequence_Frame_Chunk*> *pList)
+{
+ List <Chunk *> cl;
+ lookup_child ("OBASEQFR",cl);
+
+ for (LIF<Chunk *> 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 <Object_Animation_Sequence_Chunk *> * pList)
+{
+ List <Chunk *> cl;
+ lookup_child ("OBANSEQC",cl);
+
+ for (LIF<Chunk *> 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<Object_Animation_Sequence_Frame_Chunk*> 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 <Object_Animation_Sequence_Chunk *> seq_list;
+ list_sequences(&seq_list);
+
+ for (LIF<Object_Animation_Sequence_Chunk *> 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;i<num_sequences;i++)
+ {
+ Object_Animation_Sequence* seq=&sequences[i];
+ seq->num_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;j<seq->num_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;i<num_sequences;i++)
+ {
+ Object_Animation_Sequence* seq=&sequences[i];
+ *(int*)data=seq->num_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;j<seq->num_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<num_sequences;i++)
+ {
+ chunk_size+=sequences[i].num_frames*sizeof(Object_Animation_Frame);
+ }
+ return chunk_size;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+
+//loader for Object_Animation_Sequences_Chunk
+CHUNK_WITH_CHILDREN_LOADER("OBANSEQS",Object_Animation_Sequences_Chunk)
+
+
+
+//Object_Animation_Sequence_Chunk
+
+RIF_IMPLEMENT_DYNCREATE("OBANSEQC",Object_Animation_Sequence_Chunk)
+//loader for Object_Animation_Sequence_Chunk
+CHUNK_WITH_CHILDREN_LOADER("OBANSEQC",Object_Animation_Sequence_Chunk)