bool SceneBuilder::BuildSOMModel() { BOOL bResult = TRUE; CMemoryWriter F; F.open_chunk (0); F.w_u32 (0); F.close_chunk (); F.open_chunk (1); ObjectList& lst = Scene->ListObj(OBJCLASS_SCENEOBJECT); for (ObjectIt it=lst.begin(); it!=lst.end(); it++){ CSceneObject* S = (CSceneObject*)(*it); CEditableObject* E = S->GetReference(); R_ASSERT(E); if (E->m_Flags.is(CEditableObject::eoSoundOccluder)){ Fvector v; const Fmatrix& parent = S->_Transform(); for (EditMeshIt m_it=E->FirstMesh(); m_it!=E->LastMesh(); m_it++){ for (SurfFacesPairIt sf_it=(*m_it)->m_SurfFaces.begin(); sf_it!=(*m_it)->m_SurfFaces.end(); sf_it++){ CSurface* surf = sf_it->first; int gm_id = surf->_GameMtl(); if (gm_id==GAMEMTL_NONE_ID){ ELog.DlgMsg (mtError,"Object '%s', surface '%s' contain invalid game material.",(*m_it)->Parent()->m_LibName.c_str(),surf->_Name()); bResult = FALSE; break; } SGameMtl* mtl = GMLib.GetMaterialByID(gm_id); if (0==mtl){ ELog.DlgMsg (mtError,"Object '%s', surface '%s' contain undefined game material.",(*m_it)->Parent()->m_LibName.c_str(),surf->_Name()); bResult = FALSE; break; } BOOL b2Sided = surf->m_Flags.is(CSurface::sf2Sided); IntVec& i_lst = sf_it->second; for (IntIt i_it=i_lst.begin(); i_it!=i_lst.end(); i_it++){ st_Face& face = (*m_it)->m_Faces[*i_it]; for (int k=0; k<3; k++){ parent.transform_tiny(v,(*m_it)->m_Verts[face.pv[k].pindex]); F.w_fvector3(v); } F.w_u32 (b2Sided); F.w_float (mtl->fSndOcclusionFactor); } } } } } BOOL bValid = !!F.chunk_size()&&bResult; F.close_chunk(); if (bValid){ xr_string som_name = MakeLevelPath("level.som"); bValid = F.save_to(som_name.c_str()); } return bValid; }
void CSoundManager::MakeGameSound(ESoundThumbnail* THM, LPCSTR src_name, LPCSTR game_name) { VerifyPath(game_name); CMemoryWriter F; F.w_u32 (OGG_COMMENT_VERSION); F.w_float (THM->m_fMinDist); F.w_float (THM->m_fMaxDist); F.w_float (THM->m_fBaseVolume); F.w_u32 (THM->m_uGameType); F.w_float (THM->m_fMaxAIDist); if (!ogg_enc(src_name,game_name, THM->m_fQuality,F.pointer(),F.size())){ FS.file_delete(game_name); ELog.DlgMsg(mtError,"Can't make game sound '%s'.",game_name); } }
bool CEditableObject::SaveSMotions(const char* fname) { CMemoryWriter F; F.w_u32 (m_SMotions.size()); for (SMotionIt m_it=m_SMotions.begin(); m_it!=m_SMotions.end(); m_it++) (*m_it)->Save(F); return F.save_to(fname); }
void ETextureThumbnail::Save(int age, LPCSTR path) { if (!Valid()) return; CMemoryWriter F; F.open_chunk (THM_CHUNK_VERSION); F.w_u16 (THM_TEXTURE_VERSION); F.close_chunk (); /* F.w_chunk (THM_CHUNK_DATA | CFS_CompressMark,m_Pixels.begin(),m_Pixels.size()*sizeof(u32)); */ F.open_chunk (THM_CHUNK_TYPE); F.w_u32 (m_Type); F.close_chunk (); m_TexParams.Save(F); string_path fn; if (path) FS.update_path(fn, path, m_Name.c_str()); else FS.update_path(fn, _game_textures_, m_Name.c_str()); if (F.save_to(fn)) { FS.set_file_age (fn,age?age:m_Age); }else{ Log ("!Can't save thumbnail:",fn); } }
//---------------------------------------------------- // some types bool SceneBuilder::BuildHOMModel() { CMemoryWriter F; F.open_chunk(0); F.w_u32(0); F.close_chunk(); F.open_chunk(1); ObjectList& lst = Scene->ListObj(OBJCLASS_SCENEOBJECT); for (ObjectIt it=lst.begin(); it!=lst.end(); it++){ CSceneObject* S = (CSceneObject*)(*it); CEditableObject* E = S->GetReference(); R_ASSERT(E); if (E->m_Flags.is(CEditableObject::eoHOM)){ Fvector v; const Fmatrix& parent = S->_Transform(); for (EditMeshIt m_it=E->FirstMesh(); m_it!=E->LastMesh(); m_it++){ for (SurfFacesPairIt sf_it=(*m_it)->m_SurfFaces.begin(); sf_it!=(*m_it)->m_SurfFaces.end(); sf_it++){ BOOL b2Sided = sf_it->first->m_Flags.is(CSurface::sf2Sided); IntVec& i_lst= sf_it->second; for (IntIt i_it=i_lst.begin(); i_it!=i_lst.end(); i_it++){ st_Face& face = (*m_it)->m_Faces[*i_it]; for (int k=0; k<3; k++){ parent.transform_tiny(v,(*m_it)->m_Verts[face.pv[k].pindex]); F.w_fvector3 (v); } F.w_u32(b2Sided); } } } } } BOOL bValid = !!F.chunk_size(); F.close_chunk(); if (bValid){ xr_string hom_name = MakeLevelPath("level.hom"); bValid = F.save_to(hom_name.c_str()); } return bValid; }
IC void write_file_header (LPCSTR file_name, const u32 &crc, const u32 &ptr, const u32 &size_real, const u32 &size_compressed) { #ifndef PROTECTED_BUILD fs_desc.w_stringZ (file_name); fs_desc.w_u32 (crc); // crc fs_desc.w_u32 (ptr); fs_desc.w_u32 (size_real); fs_desc.w_u32 (size_compressed); #else // PROTECTED_BUILD u32 file_name_size = (xr_strlen(file_name) + 0)*sizeof(char); u32 buffer_size = file_name_size + 4*sizeof(u32); VERIFY (buffer_size <= 65535); u32 full_buffer_size = buffer_size + sizeof(u16); u8 *buffer = (u8*)_alloca(full_buffer_size); u8 *buffer_start = buffer; *(u16*)buffer = (u16)buffer_size; buffer += sizeof(u16); *(u32*)buffer = size_real; buffer += sizeof(u32); *(u32*)buffer = size_compressed; buffer += sizeof(u32); *(u32*)buffer = crc; buffer += sizeof(u32); Memory.mem_copy (buffer,file_name,file_name_size); buffer += file_name_size; *(u32*)buffer = ptr; // trivial_encryptor::encode (buffer_start,full_buffer_size,buffer_start); fs_desc.w (buffer_start,full_buffer_size); #endif // PROTECTED_BUILD }
bool CGameMtlLibrary::Save() { R_ASSERT (FALSE==UpdateMtlPairs()); // save CMemoryWriter fs; fs.open_chunk (GAMEMTLS_CHUNK_VERSION); fs.w_u16 (GAMEMTL_CURRENT_VERSION); fs.close_chunk (); fs.open_chunk (GAMEMTLS_CHUNK_AUTOINC); fs.w_u32 (material_index); fs.w_u32 (material_pair_index); fs.close_chunk (); fs.open_chunk (GAMEMTLS_CHUNK_MTLS); int count = 0; for(GameMtlIt m_it=materials.begin(); m_it!=materials.end(); m_it++){ fs.open_chunk (count++); (*m_it)->Save (fs); fs.close_chunk (); } fs.close_chunk (); fs.open_chunk (GAMEMTLS_CHUNK_MTLS_PAIR); count = 0; for(GameMtlPairIt p_it=material_pairs.begin(); p_it!=material_pairs.end(); p_it++){ fs.open_chunk (count++); (*p_it)->Save (fs); fs.close_chunk (); } fs.close_chunk (); string_path fn; FS.update_path (fn,_game_data_,GAMEMTL_FILENAME); return fs.save_to (fn); }
void CGameSpawnConstructor::save_spawn (LPCSTR name, LPCSTR output) { CMemoryWriter stream; m_spawn_header.m_version = XRAI_CURRENT_VERSION; m_spawn_header.m_guid = generate_guid(); m_spawn_header.m_graph_guid = game_graph().header().guid(); m_spawn_header.m_spawn_count = spawn_graph().vertex_count(); m_spawn_header.m_level_count = (u32)m_level_spawns.size(); stream.open_chunk (0); stream.w_u32 (m_spawn_header.m_version); save_data (m_spawn_header.m_guid,stream); save_data (m_spawn_header.m_graph_guid,stream); stream.w_u32 (m_spawn_header.m_spawn_count); stream.w_u32 (m_spawn_header.m_level_count); stream.close_chunk (); stream.open_chunk (1); save_data (spawn_graph(),stream); stream.close_chunk (); stream.open_chunk (2); save_data (m_level_points,stream); stream.close_chunk (); stream.open_chunk (3); save_data (m_patrol_path_storage,stream); stream.close_chunk (); stream.open_chunk (4); m_game_graph->save (stream); stream.close_chunk (); stream.save_to (*spawn_name(output)); }