256 lines
5.3 KiB
C++
256 lines
5.3 KiB
C++
![]() |
#include "fragchnk.hpp"
|
||
|
|
||
|
//macro for helping to force inclusion of chunks when using libraries
|
||
|
FORCE_CHUNK_INCLUDE_IMPLEMENT(fragchnk)
|
||
|
|
||
|
RIF_IMPLEMENT_DYNCREATE("FRAGTYPE",Fragment_Type_Chunk)
|
||
|
|
||
|
CHUNK_WITH_CHILDREN_LOADER("FRAGTYPE",Fragment_Type_Chunk)
|
||
|
|
||
|
/*
|
||
|
Children for Fragment_Type_Chunk :
|
||
|
|
||
|
Fragment_Type_Data_Chunk "FRGTYPDC"
|
||
|
Fragment_Type_Shape_Chunk "FRGTYPSC"
|
||
|
Fragment_Type_Sound_Chunk "FRGSOUND"
|
||
|
*/
|
||
|
|
||
|
|
||
|
const char* Fragment_Type_Chunk::get_name()
|
||
|
{
|
||
|
Fragment_Type_Data_Chunk* ftdc=(Fragment_Type_Data_Chunk*)lookup_single_child("FRGTYPDC");
|
||
|
|
||
|
if(ftdc)
|
||
|
return ftdc->frag_type_name;
|
||
|
else
|
||
|
return 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////
|
||
|
RIF_IMPLEMENT_DYNCREATE("FRGTYPDC",Fragment_Type_Data_Chunk)
|
||
|
|
||
|
Fragment_Type_Data_Chunk::Fragment_Type_Data_Chunk(Chunk_With_Children* parent,const char* name)
|
||
|
:Chunk(parent,"FRGTYPDC")
|
||
|
{
|
||
|
frag_type_name=new char[strlen(name)+1];
|
||
|
strcpy(frag_type_name,name);
|
||
|
pad1=pad2=pad3=0;
|
||
|
}
|
||
|
|
||
|
Fragment_Type_Data_Chunk::Fragment_Type_Data_Chunk(Chunk_With_Children* const parent,const char* data,size_t const )
|
||
|
:Chunk(parent,"FRGTYPDC")
|
||
|
{
|
||
|
int length=strlen(data)+1;
|
||
|
frag_type_name=new char[length];
|
||
|
strcpy(frag_type_name,data);
|
||
|
data+=(length+3)&~3;
|
||
|
|
||
|
pad1=*(int*)data;
|
||
|
data+=4;
|
||
|
pad2=*(int*)data;
|
||
|
data+=4;
|
||
|
pad3=*(int*)data;
|
||
|
data+=4;
|
||
|
}
|
||
|
|
||
|
Fragment_Type_Data_Chunk::~Fragment_Type_Data_Chunk()
|
||
|
{
|
||
|
if(frag_type_name) delete frag_type_name;
|
||
|
}
|
||
|
|
||
|
void Fragment_Type_Data_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,frag_type_name);
|
||
|
data_start+=(strlen(frag_type_name)+4)&~3;
|
||
|
|
||
|
*(int*)data_start=pad1;
|
||
|
data_start+=4;
|
||
|
*(int*)data_start=pad2;
|
||
|
data_start+=4;
|
||
|
*(int*)data_start=pad3;
|
||
|
data_start+=4;
|
||
|
|
||
|
}
|
||
|
|
||
|
size_t Fragment_Type_Data_Chunk::size_chunk()
|
||
|
{
|
||
|
chunk_size=12+12;
|
||
|
chunk_size+=(strlen(frag_type_name)+4)&~3;
|
||
|
return chunk_size;
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////
|
||
|
RIF_IMPLEMENT_DYNCREATE("FRGTYPSC",Fragment_Type_Shape_Chunk)
|
||
|
|
||
|
Fragment_Type_Shape_Chunk::Fragment_Type_Shape_Chunk(Chunk_With_Children* parent,const char* _name,int number,ChunkVectorInt _location)
|
||
|
:Chunk(parent,"FRGTYPSC")
|
||
|
{
|
||
|
name=new char[strlen(_name)+1];
|
||
|
strcpy(name,_name);
|
||
|
num_fragments=number;
|
||
|
location=_location;
|
||
|
pad1=pad2=pad3=0;
|
||
|
}
|
||
|
|
||
|
#if UseOldChunkLoader
|
||
|
Fragment_Type_Shape_Chunk::Fragment_Type_Shape_Chunk(Chunk_With_Children* const parent,const char* data,size_t const )
|
||
|
:Chunk(parent,"FRGTYPSC")
|
||
|
{
|
||
|
int length=strlen(data)+1;
|
||
|
name=new char[length];
|
||
|
strcpy(name,data);
|
||
|
data+=(length+3)&~3;
|
||
|
|
||
|
num_fragments=*(int*)data;
|
||
|
data+=4;
|
||
|
|
||
|
location=*(ChunkVector*)data;
|
||
|
data+=sizeof(ChunkVector);
|
||
|
|
||
|
|
||
|
pad1=*(int*)data;
|
||
|
data+=4;
|
||
|
pad2=*(int*)data;
|
||
|
data+=4;
|
||
|
pad3=*(int*)data;
|
||
|
data+=4;
|
||
|
};
|
||
|
#else
|
||
|
Fragment_Type_Shape_Chunk::Fragment_Type_Shape_Chunk(Chunk_With_Children* const parent,const char* data,size_t const )
|
||
|
:Chunk(parent,"FRGTYPSC")
|
||
|
{
|
||
|
int length=strlen(data)+1;
|
||
|
name=new char[length];
|
||
|
strcpy(name,data);
|
||
|
data+=(length+3)&~3;
|
||
|
|
||
|
num_fragments=*(int*)data;
|
||
|
data+=4;
|
||
|
|
||
|
location=*(ChunkVectorInt*)data;
|
||
|
data+=sizeof(ChunkVectorInt);
|
||
|
|
||
|
|
||
|
pad1=*(int*)data;
|
||
|
data+=4;
|
||
|
pad2=*(int*)data;
|
||
|
data+=4;
|
||
|
pad3=*(int*)data;
|
||
|
data+=4;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
Fragment_Type_Shape_Chunk::~Fragment_Type_Shape_Chunk()
|
||
|
{
|
||
|
if(name) delete name;
|
||
|
}
|
||
|
|
||
|
void Fragment_Type_Shape_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,name);
|
||
|
data_start+=(strlen(name)+4)&~3;
|
||
|
|
||
|
*(int*)data_start=num_fragments;
|
||
|
data_start+=4;
|
||
|
|
||
|
*(ChunkVectorInt*)data_start=location;
|
||
|
data_start+=sizeof(ChunkVectorInt);
|
||
|
|
||
|
*(int*)data_start=pad1;
|
||
|
data_start+=4;
|
||
|
*(int*)data_start=pad2;
|
||
|
data_start+=4;
|
||
|
*(int*)data_start=pad3;
|
||
|
data_start+=4;
|
||
|
|
||
|
}
|
||
|
|
||
|
size_t Fragment_Type_Shape_Chunk::size_chunk()
|
||
|
{
|
||
|
chunk_size=12+16+sizeof(ChunkVectorInt);
|
||
|
chunk_size+=(strlen(name)+4)&~3;
|
||
|
return chunk_size;
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////
|
||
|
RIF_IMPLEMENT_DYNCREATE("FRGSOUND",Fragment_Type_Sound_Chunk)
|
||
|
|
||
|
Fragment_Type_Sound_Chunk::Fragment_Type_Sound_Chunk(Chunk_With_Children* parent)
|
||
|
:Chunk(parent,"FRGSOUND")
|
||
|
{
|
||
|
wav_name=0;
|
||
|
inner_range=5000;
|
||
|
outer_range=40000;
|
||
|
max_volume=127;
|
||
|
pitch=0;
|
||
|
pad=0;
|
||
|
}
|
||
|
|
||
|
Fragment_Type_Sound_Chunk::Fragment_Type_Sound_Chunk(Chunk_With_Children* const parent,const char* data,size_t const )
|
||
|
:Chunk(parent,"FRGSOUND")
|
||
|
{
|
||
|
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;
|
||
|
pad=*(int*)data;
|
||
|
data+=4;
|
||
|
|
||
|
wav_name=new char[strlen(data)+1];
|
||
|
strcpy(wav_name,data);
|
||
|
|
||
|
}
|
||
|
|
||
|
Fragment_Type_Sound_Chunk::~Fragment_Type_Sound_Chunk()
|
||
|
{
|
||
|
if(wav_name) delete wav_name;
|
||
|
}
|
||
|
|
||
|
void Fragment_Type_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=pad;
|
||
|
data_start+=4;
|
||
|
|
||
|
strcpy(data_start,wav_name);
|
||
|
|
||
|
}
|
||
|
|
||
|
size_t Fragment_Type_Sound_Chunk::size_chunk()
|
||
|
{
|
||
|
chunk_size=12+20;
|
||
|
chunk_size+=(strlen(wav_name)+4)&~3;
|
||
|
return chunk_size;
|
||
|
}
|
||
|
|