diff options
| author | Steven Fuller <relnev@icculus.org> | 2001-07-01 00:55:22 +0000 |
|---|---|---|
| committer | Patryk Obara <dreamer.tan@gmail.com> | 2019-08-20 02:09:04 +0200 |
| commit | 2186d5f3f95cd74a070a490d899291648d58667a (patch) | |
| tree | 55241a1afa3e1a22e0b6593a8dead0b703800f44 /3dc/win95/OBCHUNK.CPP | |
| parent | 218ca90543758a20ac326e444ca0643174ca7384 (diff) | |
Initial revision
Diffstat (limited to '3dc/win95/OBCHUNK.CPP')
| -rw-r--r-- | 3dc/win95/OBCHUNK.CPP | 1434 |
1 files changed, 0 insertions, 1434 deletions
diff --git a/3dc/win95/OBCHUNK.CPP b/3dc/win95/OBCHUNK.CPP deleted file mode 100644 index 86e8857..0000000 --- a/3dc/win95/OBCHUNK.CPP +++ /dev/null @@ -1,1434 +0,0 @@ -#include "chunk.hpp" -#include "chnktype.hpp" -#include "mishchnk.hpp" -#include "obchunk.hpp" -#include "shpchunk.hpp" -#include "envchunk.hpp" -#include "md5.h" -// Class Object_Chunk functions - -#ifdef cencon -#define new my_new -#endif -//macro for helping to force inclusion of chunks when using libraries -FORCE_CHUNK_INCLUDE_IMPLEMENT(obchunk) - -RIF_IMPLEMENT_DYNCREATE("RBOBJECT",Object_Chunk) - -/* -Children for Object_Chunk : - -"OBJHEAD1" Object_Header_Chunk -"OBINTDT" Object_Interface_Data_Chunk -"OBJPRJDT" Object_Project_Data_Chunk -"MODULEDT" Object_Module_Data_Chunk -"SHPVTINT" Shape_Vertex_Intensities_Chunk -"OBJTRAK2" Object_Track_Chunk2 -"TRAKSOUN" Object_Track_Sound_Chunk -"OBANSEQS" Object_Animation_Sequences_Chunk -"PLOBJLIT" Placed_Object_Light_Chunk -"ALTLOCAT" Object_Alternate_Locations_Chunk -*/ - - - - - -// from buffer -Object_Chunk::Object_Chunk(Chunk_With_Children * parent, const char *data, size_t size) -: Lockable_Chunk_With_Children (parent, "RBOBJECT"), - object_data () -{ - const char * buffer_ptr = data; - - object_data_store = (ChunkObject *) &object_data; - - while ((data-buffer_ptr)< (signed) size) { - - if ((*(int *)(data + 8)) + (data-buffer_ptr) > (signed) size) { - Parent_File->error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED; - break; - } - - DynCreate(data); - data += *(int *)(data + 8); - - } - - program_object_index=-1; - -} - -// from data -Object_Chunk::Object_Chunk (Chunk_With_Children * parent, ChunkObject &obj) -: Lockable_Chunk_With_Children (parent, "RBOBJECT"), - object_data (obj) -{ - object_data_store = (ChunkObject *) &object_data; - object_data_store->index_num=-1; - - new Object_Header_Chunk(this); - new Object_Interface_Data_Chunk(this); - - //if the parent is a file_chunk get an object index - if(!strcmp(parent->identifier,"REBINFF2")) - { - ((File_Chunk*)parent)->assign_index_to_object(this); - } - program_object_index=-1; - - CalculateID(); -} - -Object_Chunk::~Object_Chunk() -{ -} - -Object_Header_Chunk * Object_Chunk::get_header() -{ - - return (Object_Header_Chunk *) this->lookup_single_child ("OBJHEAD1"); - - -} - -Shape_Chunk * Object_Chunk::get_assoc_shape() -{ - if (!get_header()) return 0; - - return get_header()->associated_shape; - -} - -BOOL Object_Chunk::assoc_with_shape (Shape_Chunk * shpch) -{ - Object_Header_Chunk * obhead = get_header(); - - if (!obhead) return 0; - - // check that we are not already associated with this shape - - if (obhead->associated_shape == shpch) return 1; - - Shape_Header_Chunk * shphead = shpch->get_header(); - - if (!shphead) return 0; - - // deassociate with the old shape - - if (obhead->associated_shape) - deassoc_with_shape (obhead->associated_shape); - - // associate with the new - - obhead->associated_shape = shpch; - - if (!shphead->associated_objects_store.contains(this)) - shphead->associated_objects_store.add_entry(this); - - return 1; - -} - -BOOL Object_Chunk::deassoc_with_shape (Shape_Chunk * shpch) -{ - Shape_Header_Chunk * shphead = shpch->get_header(); - - if (!shphead) return 0; - - if (shphead->associated_objects_store.contains(this)) - shphead->associated_objects_store.delete_entry(this); - - Object_Header_Chunk * obhead = get_header(); - - obhead->associated_shape = 0; - - return 1; - -} - -BOOL Object_Chunk::file_equals(HANDLE &rif_file) -{ - unsigned long bytes_read; - char name[50]; - - // get header list - List<int> obhead; - list_chunks_in_file (&obhead, rif_file, "OBJHEAD1"); - - if (obhead.size() != 1) return FALSE; - - // get object identifier - SetFilePointer(rif_file,obhead.first_entry() + 96,0,FILE_BEGIN); - int i = 0; - do ReadFile (rif_file, (long *) (name + i), 1, &bytes_read, 0); - while (name[i++] != 0); - - if (!strcmp(name, object_data.o_name) ) return (TRUE); - - return (FALSE); -} - -const char * Object_Chunk::get_head_id() -{ - Object_Header_Chunk * hdptr = get_header(); - - if (!hdptr) return (0); - - return(hdptr->identifier); -} - -void Object_Chunk::set_lock_user (char * user) -{ - Object_Header_Chunk * hdptr = get_header(); - - if (!hdptr) return; - - strncpy (hdptr->lock_user, user,16); - - hdptr->lock_user[16] = 0; -} - - -BOOL Object_Chunk::inc_v_no () -{ - Object_Header_Chunk * hdptr = get_header(); - - if (!hdptr) return (FALSE); - - hdptr->version_no++; - - return (TRUE); -} - -BOOL Object_Chunk::same_and_updated(Object_Chunk & obj) -{ - - Object_Header_Chunk * hd1ptr = get_header(); - - if (!hd1ptr) return (0); - - Object_Header_Chunk * hd2ptr = obj.get_header(); - - if (!hd2ptr) return (0); - - return (hd1ptr->version_no < hd2ptr->version_no && - (!strcmp(obj.object_data.o_name, object_data.o_name)) ); - -} - -BOOL Object_Chunk::assoc_with_shape_no(File_Chunk *fc) -{ - Object_Header_Chunk * hdptr = get_header(); - Shape_Chunk * shp = NULL; - Shape_Header_Chunk * shphd; - - if (!hdptr) return (FALSE); - - List<Chunk *> chlst; - fc->lookup_child("REBSHAPE",chlst); - - for (LIF<Chunk *> l(&chlst); !l.done(); l.next()) - { - shp = (Shape_Chunk *)l(); - shphd = shp->get_header(); - if (shphd) - { - if (hdptr->shape_id_no == shphd->file_id_num) - break; - } - } - if (!l.done()) - { - assoc_with_shape(shp); - } - else - { - return(FALSE); - } - - return(TRUE); - - -} - - - - -void Object_Chunk::post_input_processing() -{ - CalculateID(); - - if (get_header()) - if (get_header()->flags & GENERAL_FLAG_LOCKED) - external_lock = TRUE; - - Chunk_With_Children::post_input_processing(); - -} - - -VModule_Array_Chunk * Object_Chunk::get_vmod_chunk() -{ - Object_Module_Data_Chunk * omdc = 0; - - omdc = (Object_Module_Data_Chunk *) lookup_single_child ("MODULEDT"); - - - if (omdc) - { - VModule_Array_Chunk * vmac = 0; - vmac = (VModule_Array_Chunk *)omdc->lookup_single_child ("VMDARRAY") ; - - if (vmac) return(vmac); - } - - return(0); - - -} - -void Object_Chunk::destroy(File_Chunk * fc) -{ - List<Chunk *> cl; - fc->lookup_child("RBOBJECT",cl); - - for (LIF<Chunk *> cli(&cl); !cli.done(); cli.next()) - { - Object_Chunk * ob = (Object_Chunk *)cli(); - if (ob == this) continue; - - VModule_Array_Chunk * vmac = ob->get_vmod_chunk(); - - BOOL in_object_va = FALSE; - - if (vmac) - { - int pos=0; - for(int i=0;i<vmac->num_array_items;i++) - { - - if (vmac->vmod_array[i].object_index==object_data.index_num) - { - in_object_va=TRUE; - //update branch indeces for branches that go beyond this point - for(int j=0;j<vmac->num_array_items;j++) - { - if(vmac->vmod_array[j].branch_no> pos) - vmac->vmod_array[j].branch_no--; - } - } - else - { - if(pos!=i) - { - vmac->vmod_array[pos]=vmac->vmod_array[i]; - } - pos++; - } - } - - if(in_object_va) - { - if(pos==0) - { - delete vmac; - } - else - { - //excess entries should be properly deleted when the array is deleted - vmac->num_array_items=pos; - } - - } - - } - - //now remove this object from any adjacency data - - Object_Module_Data_Chunk* omdc=(Object_Module_Data_Chunk*)ob->lookup_single_child("MODULEDT"); - if(omdc) - { - Adjacent_Module_Entry_Points_Chunk* amepc=(Adjacent_Module_Entry_Points_Chunk*)omdc->lookup_single_child("ADJMDLEP"); - - if(amepc) - { - for(LIF<Adjacent_Module> ad_lif(&amepc->adjacent_modules_list);!ad_lif.done();) - { - if(ad_lif().object_index==object_data.index_num) - ad_lif.delete_current(); - else - ad_lif.next(); - - } - } - } - - - } - - Shape_Chunk * shp = get_assoc_shape(); - - deassoc_with_shape (shp); - - lock_chunk(*fc); - - deleted = TRUE; - - unlock_chunk(*fc,TRUE); - -} - - -void Object_Chunk::update_my_chunkobject(ChunkObject & cob) -{ - //store the object's index , so that it doesn't get lost - int object_index=object_data_store->index_num; - *object_data_store = cob; - //replace the object index - object_data_store->index_num=object_index; - //recalculate the object's id in case the name has changed - CalculateID(); -} - -ObjectID Object_Chunk::CalculateID() -{ - ObjectID retval={0,0}; - List<Chunk*> chlist; - parent->lookup_child("REBENVDT",chlist); - if(!chlist.size()) return retval; - ((Environment_Data_Chunk*)chlist.first_entry())->lookup_child("RIFFNAME",chlist); - if(!chlist.size()) return retval; - char Name[100]; - - #if InterfaceEngine||cencon - //need to check for console specific rif files,and skip the 'sat' or 'psx' - //so that they get the same ids as the pc - const char* r_name=((RIF_Name_Chunk*)chlist.first_entry())->rif_name; - if(tolower(r_name[0])=='p' && tolower(r_name[1])=='s' && tolower(r_name[2])=='x' ) - strcpy(Name,&r_name[3]); - else if (tolower(r_name[0])=='s' && tolower(r_name[1])=='a' && tolower(r_name[2])=='t' ) - strcpy(Name,&r_name[3]); - else - strcpy(Name,r_name); - #else - strcpy(Name,((RIF_Name_Chunk*)chlist.first_entry())->rif_name); - #endif - - strcat(Name,object_data.o_name); - char buffer[16]; - md5_buffer(Name,strlen(Name),&buffer[0]); - buffer[7]=0; - object_data_store->ID=*(ObjectID*)&buffer[0]; - return object_data_store->ID; - -} - -///////////////////////////////////////// - -// Class Object_Header_Chunk functions -RIF_IMPLEMENT_DYNCREATE("OBJHEAD1",Object_Header_Chunk) - -// from buffer -#if UseOldChunkLoader -Object_Header_Chunk::Object_Header_Chunk(Object_Chunk * parent, const char * hdata, size_t /*hsize*/) -: Chunk (parent, "OBJHEAD1"), object_data (parent->object_data_store), -flags(0), version_no (0), associated_shape (0) -{ - flags = *((int *) hdata); - - if (flags & OBJECT_FLAG_BASE_OBJECT) - parent->object_data_store->is_base_object = TRUE; - else - { - parent->object_data_store->is_base_object = FALSE; - } - - strncpy (lock_user, (hdata + 4), 16); - lock_user[16] = '\0'; - - parent->object_data_store->float_location = *((ChunkVector *) (hdata + 20)); - parent->object_data_store->location = parent->object_data_store->float_location; - - parent->object_data_store->orientation.x =- *((double *) (hdata + 44)); - parent->object_data_store->orientation.y =- *((double *) (hdata + 52)); - parent->object_data_store->orientation.z =- *((double *) (hdata + 60)); - parent->object_data_store->orientation.w = *((double *) (hdata + 68)); - - version_no = *((int *) (hdata + 76)); - - shape_id_no = *((int *) (hdata + 80)); - - strcpy (parent->object_data_store->o_name, (hdata + 84)); - parent->object_data_store->ID.id1=0; - parent->object_data_store->ID.id2=0; - parent->object_data_store->index_num=-1; -} -#else -Object_Header_Chunk::Object_Header_Chunk(Chunk_With_Children * parent, const char * hdata, size_t /*hsize*/) -: Chunk (parent, "OBJHEAD1"), object_data (((Object_Chunk*)parent)->object_data_store), -flags(0), version_no (0), associated_shape (0) -{ - Object_Chunk* parent_object = (Object_Chunk*) parent; - - flags = *((int *) hdata); - - if (flags & OBJECT_FLAG_BASE_OBJECT) - parent_object->object_data_store->is_base_object = TRUE; - else - { - parent_object->object_data_store->is_base_object = FALSE; - } - - strncpy (lock_user, (hdata + 4), 16); - lock_user[16] = '\0'; - - hdata+=20; - - parent_object->object_data_store->location = *(ChunkVectorInt*) hdata; - hdata+=sizeof(ChunkVectorInt); - - parent_object->object_data_store->orientation = *((ChunkQuat *) hdata); - hdata+=sizeof(ChunkQuat); - - parent_object->object_data_store->index_num = *(int *) hdata; - hdata+=4; - - version_no = *((int *) hdata); - hdata+=4; - - shape_id_no = *((int *) hdata); - hdata+=4; - - strcpy (parent_object->object_data_store->o_name, hdata); - parent_object->object_data_store->ID.id1=0; - parent_object->object_data_store->ID.id2=0; -} -#endif - -//from data - -Object_Header_Chunk::Object_Header_Chunk (Object_Chunk * parent) -: Chunk (parent, "OBJHEAD1"), -object_data (parent->object_data_store), -flags (0), version_no (0), associated_shape(0) -{ - if (object_data->is_base_object) { - flags = OBJECT_FLAG_BASE_OBJECT; - } -} - - -size_t Object_Header_Chunk::size_chunk() -{ - int length = 72; - - length += (strlen(object_data->o_name)+1); - - length += (4-length%4)%4; - - chunk_size = length; - - return length; -} - -BOOL Object_Header_Chunk::output_chunk (HANDLE & hand) -{ - unsigned long junk; - BOOL ok; - char * data_block; - - data_block = 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 Object_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) = flags; - strncpy ((data_start + 4), lock_user, 16); - data_start+=20; - - *((ChunkVectorInt *) (data_start)) = object_data->location; - data_start+=sizeof(ChunkVectorInt); - - *((ChunkQuat *) (data_start)) = object_data->orientation; - data_start+=sizeof(ChunkQuat); - - *(int*) data_start=object_data->index_num; - data_start+=4; - - *((int *) data_start) = version_no; - data_start+=4; - - *((int *) data_start) = shape_id_no; - data_start+=4; - - strcpy (data_start, object_data->o_name); -} - -void Object_Header_Chunk::prepare_for_output() -{ - version_no ++; -} - -///////////////////////////////////////// - -// Class Object_Interface_Data_Chunk functions -RIF_IMPLEMENT_DYNCREATE("OBINTDT",Object_Interface_Data_Chunk) - -/* -Children for Object_Interface_Data_Chunk : - -"OBJNOTES" Object_Notes_Chunk -*/ - -// from buffer -Object_Interface_Data_Chunk::Object_Interface_Data_Chunk(Chunk_With_Children * parent, const char *data, size_t size) -: Chunk_With_Children (parent, "OBINTDT") -{ - const char * buffer_ptr = data; - - while ((data-buffer_ptr)< (signed) size) { - - if ((*(int *)(data + 8)) + (data-buffer_ptr) > (signed) size) { - Parent_File->error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED; - break; - } - - DynCreate(data); - data += *(int *)(data + 8); - } -} - -Object_Interface_Data_Chunk::Object_Interface_Data_Chunk (Object_Chunk * parent) -: Chunk_With_Children (parent, "OBINTDT") -{ - new Object_Notes_Chunk (this, "Enter notes here", strlen("Enter notes here") + 1); -} - - -/////////////////////////////////////// - -// Class Object_Notes_Chunk functions -RIF_IMPLEMENT_DYNCREATE("OBJNOTES",Object_Notes_Chunk) - -Object_Notes_Chunk::Object_Notes_Chunk (Chunk_With_Children * parent, - const char * _data, size_t _data_size) -: Chunk(parent, "OBJNOTES"), -data(NULL), data_size(_data_size) -{ - data_store = new char [data_size]; - - *((char **) &data) = data_store; - - for (int i = 0; i<(signed) data_size; i++) - data_store[i] = _data[i]; - -} - -void Object_Notes_Chunk::fill_data_block (char * data_start) -{ - strncpy (data_start, identifier, 8); - - data_start += 8; - - *((int *) data_start) = chunk_size; - - data_start += 4; - - for (int i = 0; i<((signed) chunk_size-12); i++) - data_start[i] = data[i]; -} - -Object_Notes_Chunk::~Object_Notes_Chunk () -{ - delete [] data_store; -} - -BOOL Object_Notes_Chunk::output_chunk (HANDLE &hand) -{ - unsigned long junk; - BOOL ok; - char * data_block; - - data_block = 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; -} - - -/////////////////////////////////////// -RIF_IMPLEMENT_DYNCREATE("MODULEDT",Object_Module_Data_Chunk) - -/* -Children For Object_Module_Data_Chunk : - -"VMDARRAY" VModule_Array_Chunk -"ADJMDLEP" Adjacent_Module_Entry_Points_Chunk -"MODFLAGS" Module_Flag_Chunk -"WAYPOINT" Module_Waypoint_Chunk -"MODACOUS" Module_Acoustics_Chunk -"AIMODMAS" AI_Module_Master_Chunk -"AIMODSLA" AI_Module_Slave_Chunk - -*/ - -Object_Module_Data_Chunk::Object_Module_Data_Chunk (Chunk_With_Children * parent,const char * mdata, size_t msize) -: Chunk_With_Children (parent, "MODULEDT") -{ - const char * buffer_ptr = mdata; - - while ((mdata-buffer_ptr)< (signed) msize) { - - if ((*(int *)(mdata + 8)) + (mdata-buffer_ptr) > (signed) msize) { - Parent_File->error_code = CHUNK_FAILED_ON_LOAD_NOT_RECOGNISED; - break; - } - DynCreate(mdata); - mdata += *(int *)(mdata + 8); - - } - -} - -/////////////////////////////////////// -RIF_IMPLEMENT_DYNCREATE("VMDARRAY",VModule_Array_Chunk) - -VModule_Array_Chunk::VModule_Array_Chunk(Object_Module_Data_Chunk * parent, VMod_Arr_Item * vma, int num_in_vma) -: Chunk (parent, "VMDARRAY") -{ - int i; - - num_array_items = num_in_vma; - - vmod_array = new VMod_Arr_Item [num_in_vma]; - - for (i=0; i<num_in_vma; i++) - { - vmod_array[i] = vma[i]; - } - -} - - -void VModule_Array_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_array_items; - - data_start += 4; - - for (int i=0; i<num_array_items; i++) - { - *((int *) data_start) = vmod_array[i].object_index; - data_start += 4; - - *((int *) data_start) = vmod_array[i].branch_no; - data_start += 4; - - *((int *) data_start) = vmod_array[i].flags; - data_start += 4; - - *((int *) data_start) = vmod_array[i].spare; - data_start += 4; - - } - -} - - -size_t VModule_Array_Chunk::size_chunk() -{ - chunk_size =16+16*num_array_items; - return(chunk_size); - -} - -#if UseOldChunkLoader -VModule_Array_Chunk::VModule_Array_Chunk (Object_Module_Data_Chunk * parent, const char * vmdata, size_t /*vmsize*/) -: Chunk (parent, "VMDARRAY") -{ - num_array_items = *((int *) vmdata); - - vmdata += 4; - - vmod_array = new VMod_Arr_Item [num_array_items]; - - for (int i=0; i<num_array_items; i++) - { - //vmod_array[i].type = *((int *) vmdata); - vmdata += 4; - vmod_array[i].branch_no = *((int *) vmdata); - vmdata += 4; - - //vmod_array[i].dir.x = *((double *) vmdata); - vmdata += 8; - //vmod_array[i].dir.y = *((double *) vmdata); - vmdata += 8; - //vmod_array[i].dir.z = *((double *) vmdata); - vmdata += 8; - - //vmod_array[i].angle = *((double *) vmdata); - vmdata += 8; - - vmod_array[i].flags = *((int *) vmdata); - vmdata += 4; - - vmod_array[i].spare = *((int *) vmdata); - vmdata += 4; - - vmod_array[i].object_index=-1; - - vmod_array[i].o_name = new char [strlen(vmdata) + 1]; - strcpy (vmod_array[i].o_name, vmdata); - vmdata += (strlen(vmod_array[i].o_name) + 1) + (4-(strlen(vmod_array[i].o_name) + 1)%4)%4; - - } - -} -#else -VModule_Array_Chunk::VModule_Array_Chunk (Chunk_With_Children * parent, const char * vmdata, size_t /*vmsize*/) -: Chunk (parent, "VMDARRAY") -{ - num_array_items = *((int *) vmdata); - - vmdata += 4; - - vmod_array = new VMod_Arr_Item [num_array_items]; - - for (int i=0; i<num_array_items; i++) - { - - vmod_array[i].object_index = *((int *) vmdata); - vmdata += 4; - - vmod_array[i].branch_no = *((int *) vmdata); - vmdata += 4; - - vmod_array[i].flags = *((int *) vmdata); - vmdata += 4; - - vmod_array[i].spare = *((int *) vmdata); - vmdata += 4; - - } - -} -#endif - -VModule_Array_Chunk::~VModule_Array_Chunk () -{ - delete [] vmod_array; -} - -/////////////////////////////////////// -#if 0 -void Adjacent_Modules_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) = adjacent_modules_list.size(); - - data_start += 4; - - for (LIF<Adjacent_Module> ami(&adjacent_modules_list); !ami.done(); ami.next()) - { - - *((int *) data_start) = 0; - data_start += 4; - - *((int *) data_start) = 0; - data_start += 4; - - strcpy (data_start, ami().o_name); - data_start += (strlen(ami().o_name) + 1) + (4-(strlen(ami().o_name) + 1)%4)%4; - - } - -} - -size_t Adjacent_Modules_Chunk::size_chunk() -{ - int size = 16; - - for (LIF<Adjacent_Module> ami(&adjacent_modules_list); !ami.done(); ami.next()) - { - size += 8; - size += (strlen(ami().o_name) + 1) + (4-(strlen(ami().o_name) + 1)%4)%4; - } - - chunk_size = size; - return(size); - -} - -Adjacent_Modules_Chunk::Adjacent_Modules_Chunk (Object_Module_Data_Chunk * parent, const char * data, size_t /*size*/) -: Chunk (parent, "ADJMDLST") -{ - int num_array_items = *((int *) data); - - data += 4; - - for (int i=0; i<num_array_items; i++) - { - Adjacent_Module am; - - data += 8; - - am.o_name = new char [strlen(data) + 1]; - strcpy (am.o_name, data); - data += (strlen(am.o_name) + 1) + (4-(strlen(am.o_name) + 1)%4)%4; - - adjacent_modules_list.add_entry(am); - - } -} -#endif -/////////////////////////////////////// -RIF_IMPLEMENT_DYNCREATE("ADJMDLEP",Adjacent_Module_Entry_Points_Chunk) - -void Adjacent_Module_Entry_Points_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) = adjacent_modules_list.size(); - - data_start += 4; - - for (LIF<Adjacent_Module> ami(&adjacent_modules_list); !ami.done(); ami.next()) - { - - *((int *) data_start) = ami().object_index; - data_start += 4; - - *((int *) data_start) = ami().flags; - data_start += 4; - - *((ChunkVectorInt *) data_start) = ami().entry_point; - data_start += sizeof(ChunkVectorInt); - - - } - -} - - -size_t Adjacent_Module_Entry_Points_Chunk::size_chunk() -{ - chunk_size = 16+adjacent_modules_list.size()*20; - return(chunk_size); -} - -#if UseOldChunkLoader -Adjacent_Module_Entry_Points_Chunk::Adjacent_Module_Entry_Points_Chunk (Object_Module_Data_Chunk * parent, const char * data, size_t /*size*/) -: Chunk (parent, "ADJMDLEP") -{ - int num_array_items = *((int *) data); - - data += 4; - - for (int i=0; i<num_array_items; i++) - { - Adjacent_Module am; - - am.flags = *((int *) data); - data += 4; - - am.entry_point = *((ChunkVector *) data); - data += sizeof(ChunkVector); - - am.o_name = new char [strlen(data) + 1]; - strcpy (am.o_name, data); - data += (strlen(am.o_name) + 4)&~3; - - am.object_index=-1; - - adjacent_modules_list.add_entry(am); - - } -} -#else -Adjacent_Module_Entry_Points_Chunk::Adjacent_Module_Entry_Points_Chunk (Chunk_With_Children * parent, const char * data, size_t /*size*/) -: Chunk (parent, "ADJMDLEP") -{ - int num_array_items = *((int *) data); - - data += 4; - - for (int i=0; i<num_array_items; i++) - { - Adjacent_Module am; - - am.object_index = *((int *) data); - data += 4; - - am.flags = *((int *) data); - data += 4; - - am.entry_point = *((ChunkVectorInt *) data); - data += sizeof(ChunkVectorInt); - - - adjacent_modules_list.add_entry(am); - - } - -} -#endif - -/////////////////////////////////////// -RIF_IMPLEMENT_DYNCREATE("MODFLAGS",Module_Flag_Chunk) - -Module_Flag_Chunk::Module_Flag_Chunk(Object_Module_Data_Chunk* parent) -:Chunk(parent,"MODFLAGS") -{ - Flags=spare=0; -} - -Module_Flag_Chunk::Module_Flag_Chunk(Chunk_With_Children* parent,const char* data,size_t) -:Chunk(parent,"MODFLAGS") -{ - Flags=*(int*)data; - data+=4; - spare=*(int*)data; -} - -void Module_Flag_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=Flags; - data_start+=4; - *(int*)data_start=spare; - -} -/////////////////////////////////////// -RIF_IMPLEMENT_DYNCREATE("MODZONE",Module_Zone_Chunk) - -Module_Zone_Chunk::Module_Zone_Chunk(Object_Module_Data_Chunk* parent) -:Chunk(parent,"MODZONE") -{ - Zone=spare=0; -} - -Module_Zone_Chunk::Module_Zone_Chunk(Chunk_With_Children* parent,const char* data,size_t) -:Chunk(parent,"MODZONE") -{ - Zone=*(int*)data; - data+=4; - spare=*(int*)data; -} - -void Module_Zone_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=Zone; - data_start+=4; - *(int*)data_start=spare; - -} - -/////////////////////////////////////// - -RIF_IMPLEMENT_DYNCREATE("MODACOUS",Module_Acoustics_Chunk) - -Module_Acoustics_Chunk::Module_Acoustics_Chunk(Object_Module_Data_Chunk* parent) -:Chunk(parent,"MODACOUS") -{ - env_index=-1; //negative means default environment acoustics - reverb=-1.0; - spare=0; -} - -Module_Acoustics_Chunk::Module_Acoustics_Chunk(Chunk_With_Children* parent,const char* data,size_t) -:Chunk(parent,"MODACOUS") -{ - env_index=*(int*)data; - data+=4; - reverb=*(float*)data; - data+=4; - spare=*(int*)data; -} - -void Module_Acoustics_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=env_index; - data_start+=4; - *(float*)data_start=reverb; - data_start+=4; - *(int*)data_start=spare; - -} - - -/////////////////////////////////////// - - -RIF_IMPLEMENT_DYNCREATE("OBJTRAK2",Object_Track_Chunk2) - -Object_Track_Chunk2::Object_Track_Chunk2(Object_Chunk * parent) -: Chunk (parent, "OBJTRAK2") -{ - num_sections=0; - sections=0; - flags=timer_start=0; -} - -Object_Track_Chunk2::~Object_Track_Chunk2() -{ - if(sections) delete sections; -} - -void Object_Track_Chunk2::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_sections; - data_start+=4; - - for(int i=0;i<num_sections;i++) - { - *(ChunkTrackSection*)data_start=sections[i]; - data_start+=sizeof(ChunkTrackSection); - } - - *(int*)data_start=flags; - data_start+=4; - - *(int*)data_start=timer_start; - - - -} - -size_t Object_Track_Chunk2::size_chunk () -{ - chunk_size = 12 + 12 +num_sections*sizeof(ChunkTrackSection) ; - return(chunk_size); -} - -#if UseOldChunkLoader -Object_Track_Chunk2::Object_Track_Chunk2 (Chunk_With_Children * parent,const char * data, size_t /*size*/) -: Chunk (parent, "OBJTRAK2") -{ - num_sections=*(int*)data; - data+=4; - - if(num_sections) - sections=new ChunkTrackSection[num_sections]; - else - sections=0; - - for(int i=0;i<num_sections;i++) - { - sections[i].quat_start.w=(*(int*)data)/65536.0; - data+=4; - sections[i].quat_start.x=(*(int*)data)/-65536.0; - data+=4; - sections[i].quat_start.y=(*(int*)data)/-65536.0; - data+=4; - sections[i].quat_start.z=(*(int*)data)/-65536.0; - data+=4; - - sections[i].quat_end.w=(*(int*)data)/65536.0; - data+=4; - sections[i].quat_end.x=(*(int*)data)/-65536.0; - data+=4; - sections[i].quat_end.y=(*(int*)data)/-65536.0; - data+=4; - sections[i].quat_end.z=(*(int*)data)/-65536.0; - data+=4; - - - sections[i].pivot_start=*(ChunkVector*)data; - data+=sizeof(ChunkVector); - sections[i].pivot_end=*(ChunkVector*)data; - data+=sizeof(ChunkVector); - sections[i].object_offset=*(ChunkVector*)data; - data+=sizeof(ChunkVector); - - sections[i].time_for_section=*(int*)data; - data+=sizeof(int); - sections[i].spare=*(int*)data; - data+=sizeof(int); - - - } - - flags=*(int*)data; - flags|=TrackFlag_QuatProblemSorted; - data+=4; - spare2=*(int*)timer_start; - - -} -#else -Object_Track_Chunk2::Object_Track_Chunk2 (Chunk_With_Children * parent,const char * data, size_t /*size*/) -: Chunk (parent, "OBJTRAK2") -{ - num_sections=*(int*)data; - data+=4; - - if(num_sections) - sections=new ChunkTrackSection[num_sections]; - else - sections=0; - - for(int i=0;i<num_sections;i++) - { - sections[i]=*(ChunkTrackSection*)data; - data+=sizeof(ChunkTrackSection); - } - - flags=*(int*)data; - data+=4; - timer_start=*(int*)data; - - if(!(flags & TrackFlag_QuatProblemSorted)) - { - for(i=0;i<num_sections;i++) - { - ChunkQuat temp=sections[i].quat_start; - sections[i].quat_start.x=-temp.w; - sections[i].quat_start.y=temp.x; - sections[i].quat_start.z=temp.y; - sections[i].quat_start.w=-temp.z; - - temp=sections[i].quat_end; - sections[i].quat_end.x=-temp.w; - sections[i].quat_end.y=temp.x; - sections[i].quat_end.z=temp.y; - sections[i].quat_end.w=-temp.z; - } - flags|=TrackFlag_QuatProblemSorted; - } - -} -#endif - -/////////////////////////////////////// -RIF_IMPLEMENT_DYNCREATE("TRAKSOUN",Object_Track_Sound_Chunk) - -Object_Track_Sound_Chunk::Object_Track_Sound_Chunk(Chunk_With_Children* parent) -:Chunk(parent,"TRAKSOUN") -{ - wav_name=0; - inner_range=5000; - outer_range=40000; - max_volume=127; - pitch=0; - flags=0; - index=0; -} - -Object_Track_Sound_Chunk::Object_Track_Sound_Chunk(Chunk_With_Children* const parent,const char* data,size_t const ) -:Chunk(parent,"TRAKSOUN") -{ - inner_range=*(unsigned long*)data; - data+=4; - outer_range=*(unsigned long*)data; - data+=4; - - max_volume=*(int*)data; - data+=4; - pitch=*(int*)data; - data+=4; - flags=*(int*)data; - data+=4; - index=*(int*)data; - data+=4; - - wav_name=new char[strlen(data)+1]; - strcpy(wav_name,data); - -} - -Object_Track_Sound_Chunk::~Object_Track_Sound_Chunk() -{ - if(wav_name) delete wav_name; -} - -void Object_Track_Sound_Chunk::fill_data_block(char* data_start) -{ - strncpy (data_start, identifier, 8); - data_start += 8; - *((int *) data_start) = chunk_size; - data_start += 4; - - *(unsigned long*)data_start=inner_range; - data_start+=4; - *(unsigned long*)data_start=outer_range; - data_start+=4; - - *(int*)data_start=max_volume; - data_start+=4; - *(int*)data_start=pitch; - data_start+=4; - *(int*)data_start=flags; - data_start+=4; - *(int*)data_start=index; - data_start+=4; - - strcpy(data_start,wav_name); - -} - -size_t Object_Track_Sound_Chunk::size_chunk() -{ - chunk_size=12+24; - chunk_size+=(strlen(wav_name)+4)&~3; - return chunk_size; -} -/////////////////////////////////////// - -RIF_IMPLEMENT_DYNCREATE("ALTLOCAT",Object_Alternate_Locations_Chunk) - -Object_Alternate_Locations_Chunk::Object_Alternate_Locations_Chunk(Chunk_With_Children* parent,const char* data,size_t) -:Chunk(parent,"ALTLOCAT") -{ - group=*(int*) data; - data+=4; - spare2=*(int*) data; - data+=4; - - num_locations=*(int*) data; - data+=4; - - if(num_locations) - locations=new AltObjectLocation[num_locations]; - else - locations=0; - - for(int i=0;i<num_locations;i++) - { - locations[i] = *(AltObjectLocation*) data; - data+=sizeof(AltObjectLocation); - } -} - -Object_Alternate_Locations_Chunk::Object_Alternate_Locations_Chunk(Chunk_With_Children* parent) -:Chunk(parent,"ALTLOCAT") -{ - num_locations=0; - locations=0; - group=spare2=0; -} - -Object_Alternate_Locations_Chunk::~Object_Alternate_Locations_Chunk() -{ - if(locations) delete [] locations; -} - -void Object_Alternate_Locations_Chunk::fill_data_block(char* data) -{ - strncpy (data, identifier, 8); - data += 8; - *((int *) data) = chunk_size; - data += 4; - - *(int*)data=group; - data+=4; - - *(int*)data=spare2; - data+=4; - - - *(int*) data = num_locations; - data+=4; - - for(int i=0;i<num_locations;i++) - { - *(AltObjectLocation*)data=locations[i]; - data+=sizeof(AltObjectLocation); - } - -} - -size_t Object_Alternate_Locations_Chunk::size_chunk() -{ - chunk_size=24+num_locations*sizeof(AltObjectLocation); - return chunk_size; -} - - -///////////////////////////////////////// -//class Object_Project_Data_Chunk - -RIF_IMPLEMENT_DYNCREATE("OBJPRJDT",Object_Project_Data_Chunk) - -CHUNK_WITH_CHILDREN_LOADER("OBJPRJDT",Object_Project_Data_Chunk) - -/* -Children for Object_Project_Data_Chunk : - -"MAPBLOCK" Map_Block_Chunk -"STRATEGY" Strategy_Chunk -"AVPSTRAT" AVP_Strategy_Chunk -*/ |
