From 2186d5f3f95cd74a070a490d899291648d58667a Mon Sep 17 00:00:00 2001 From: Steven Fuller Date: Sun, 1 Jul 2001 00:55:22 +0000 Subject: Initial revision --- src/win95/envchunk.cpp | 325 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 325 insertions(+) create mode 100644 src/win95/envchunk.cpp (limited to 'src/win95/envchunk.cpp') diff --git a/src/win95/envchunk.cpp b/src/win95/envchunk.cpp new file mode 100644 index 0000000..04cc292 --- /dev/null +++ b/src/win95/envchunk.cpp @@ -0,0 +1,325 @@ +#include "chunk.hpp" +#include "envchunk.hpp" + +//macro for helping to force inclusion of chunks when using libraries +FORCE_CHUNK_INCLUDE_IMPLEMENT(envchunk) + +// Class Environment_Data_Chunk functions +RIF_IMPLEMENT_DYNCREATE("REBENVDT",Environment_Data_Chunk) + +// constructor from buffer +LOCKABLE_CHUNK_WITH_CHILDREN_LOADER("REBENVDT",Environment_Data_Chunk) +/* +Children for Enviornment_Data_Chunk : + +"ENVSDSCL" Environment_Scale_Chunk +"GAMEMODE" Environment_Game_Mode_Chunk +"ENVPALET" Environment_Palette_Chunk +"ENVTXLIT" Environment_TLT_Chunk +"TLTCONFG" TLT_Config_Chunk +"CLRLOOKP" Coloured_Polygons_Lookup_Chunk +"MATCHIMG" Matching_Images_Chunk +"BMPNAMES" Global_BMP_Name_Chunk +"BMNAMVER" BMP_Names_Version_Chunk +"BMNAMEXT" BMP_Names_ExtraData_Chunk +"RIFFNAME" RIF_Name_Chunk +"ENDTHEAD" Environment_Data_Header_Chunk +"LIGHTSET" Light_Set_Chunk +"PRSETPAL" Preset_Palette_Chunk +"SPECLOBJ" Special_Objects_Chunk +"AVPEXSTR" AVP_External_Strategy_Chunk +"BMPMD5ID" Bitmap_MD5_Chunk +"GLOGENDC" Global_Generator_Data_Chunk +"FRAGTYPE" Fragment_Type_Chunk +"ENVACOUS" Environment_Acoustics_Chunk +"AVPENVIR" AVP_Environment_Settings_Chunk +"SOUNDDIR" Sound_Directory_Chunk +"RANTEXID" Random_Texture_ID_Chunk +*/ + + + + +// empty constructor +Environment_Data_Chunk::Environment_Data_Chunk (Chunk_With_Children * parent) +:Lockable_Chunk_With_Children (parent, "REBENVDT") +{ + // as necessary, generated automatically + new Environment_Data_Header_Chunk (this); +} + + +BOOL Environment_Data_Chunk::file_equals (HANDLE & /*rif_file*/) +{ + return(TRUE); +} + +Environment_Data_Header_Chunk * Environment_Data_Chunk::get_header() +{ + return (Environment_Data_Header_Chunk *) this->lookup_single_child ("ENDTHEAD"); +} + +const char * Environment_Data_Chunk::get_head_id() +{ + Environment_Data_Header_Chunk * hdptr = get_header(); + + if (!hdptr) return (0); + + return(hdptr->identifier); + +} + +void Environment_Data_Chunk::set_lock_user (char * user) +{ + Environment_Data_Header_Chunk * hdptr = get_header(); + + if (!hdptr) return; + + strncpy (hdptr->lock_user, user,16); + + hdptr->lock_user[16] = 0; +} + +void Environment_Data_Chunk::post_input_processing() +{ + if (get_header()) + if (get_header()->flags & GENERAL_FLAG_LOCKED) + external_lock = TRUE; + + Chunk_With_Children::post_input_processing(); + +} + +/////////////////////////////////////// + +// Class Environment_Data_Header_Chunk functions +RIF_IMPLEMENT_DYNCREATE("ENDTHEAD",Environment_Data_Header_Chunk) + +// from buffer +Environment_Data_Header_Chunk::Environment_Data_Header_Chunk (Chunk_With_Children * parent, const char * hdata, size_t /*hsize*/) + : Chunk (parent, "ENDTHEAD"), + flags (0), version_no (0) +{ + flags = *((int *) hdata); + + strncpy (lock_user, (hdata + 4), 16); + lock_user[16] = '\0'; + + version_no = *((int *) (hdata + 20)); +} + +BOOL Environment_Data_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 Environment_Data_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); + + *((int *) (data_start+20)) = version_no; +} + +void Environment_Data_Header_Chunk::prepare_for_output() +{ + version_no ++; +} + +/////////////////////////////////////// + +// Class Environment_Scale_Chunk functions +RIF_IMPLEMENT_DYNCREATE("ENVSDSCL",Environment_Scale_Chunk) + +void Environment_Scale_Chunk::fill_data_block ( char * data_start) +{ + strncpy (data_start, identifier, 8); + + data_start += 8; + + *((int *) data_start) = chunk_size; + + data_start += 4; + + *((double *) data_start) = scale; +} + +/////////////////////////////////////// + +RIF_IMPLEMENT_DYNCREATE("ENVACOUS",Environment_Acoustics_Chunk) + +Environment_Acoustics_Chunk::Environment_Acoustics_Chunk(Environment_Data_Chunk* parent) +:Chunk(parent,"ENVACOUS") +{ + env_index=0; + reverb=2; + spare=0; +} + +Environment_Acoustics_Chunk::Environment_Acoustics_Chunk(Chunk_With_Children* parent,const char* data,size_t) +:Chunk(parent,"ENVACOUS") +{ + env_index=*(int*)data; + data+=4; + reverb=*(float*)data; + data+=4; + spare=*(int*)data; +} + +void Environment_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("SOUNDDIR",Sound_Directory_Chunk) + +Sound_Directory_Chunk::Sound_Directory_Chunk(Environment_Data_Chunk* parent,const char* dir) +:Chunk(parent,"SOUNDDIR") +{ + directory=new char[strlen(dir)+1]; + strcpy(directory,dir); +} + +Sound_Directory_Chunk::Sound_Directory_Chunk(Chunk_With_Children * const parent, const char* data, size_t const ) +:Chunk(parent,"SOUNDDIR") +{ + directory=new char[strlen(data)+1]; + strcpy(directory,data); +} + +Sound_Directory_Chunk::~Sound_Directory_Chunk() +{ + delete [] directory; +} + +void Sound_Directory_Chunk::fill_data_block(char* data_start) +{ + strncpy (data_start, identifier, 8); + data_start += 8; + *((int *) data_start) = chunk_size; + data_start += 4; + + strcpy(data_start,directory); +} + + +/////////////////////////////////////// +/////////////////////Available shape set collections//////////////////////////////////////// +RIF_IMPLEMENT_DYNCREATE("RANTEXID",Random_Texture_ID_Chunk) + +Random_Texture_ID_Chunk::Random_Texture_ID_Chunk(Chunk_With_Children* parent,const char* _name) +:Chunk(parent,"RANTEXID") +{ + name=new char[strlen(_name)+1]; + strcpy(name,_name); + spare1=spare2=0; +} + + +Random_Texture_ID_Chunk::Random_Texture_ID_Chunk(Chunk_With_Children* parent,const char* data,size_t) +:Chunk(parent,"RANTEXID") +{ + CHUNK_EXTRACT_STRING(name); + + int num_types,type; + CHUNK_EXTRACT(num_types,int); + for(int i=0;i rlif(&random_types);!rlif.done();rlif.next()) + { + CHUNK_FILL(rlif(),int) + } + + CHUNK_FILL(spare1,int) + CHUNK_FILL(spare2,int) + +} + +size_t Random_Texture_ID_Chunk::size_chunk() +{ + chunk_size=12+12+random_types.size()*4; + chunk_size+=(strlen(name)+4)&~3; + return chunk_size; +} +/////////////////////////////////////// + + + + +//Class Special_Objects_Chunk : +RIF_IMPLEMENT_DYNCREATE("SPECLOBJ",Special_Objects_Chunk) + +CHUNK_WITH_CHILDREN_LOADER("SPECLOBJ",Special_Objects_Chunk) +/* +Children for Special_Objects_Chunk : +"AVPGENER" AVP_Generator_Chunk +"SOUNDOB2" Sound_Object_Chunk +"VIOBJECT" Virtual_Object_Chunk +"AVPCABLE" AVP_Power_Cable_Chunk +"AVPSTART" AVP_Player_Start_Chunk +"AVPPATH2" AVP_Path_Chunk +"AVPGENEX" AVP_Generator_Extra_Data_Chunk +"SOUNDEXD" Sound_Object_Extra_Data_Chunk +"PARGENER" AVP_Particle_Generator_Chunk +"PLACHIER" Placed_Hierarchy_Chunk +"CAMORIGN" Camera_Origin_Chunk +"AVPDECAL" AVP_Decal_Chunk +"R6WAYPNT" R6_Waypoint_Chunk + +*/ + + -- cgit v1.3