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 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 CGameGraphBuilder::save_graph (const float &start, const float &amount) { Progress (start); Msg ("Saving graph"); // header CMemoryWriter writer; CGameGraph::CHeader header; header.m_version = XRAI_CURRENT_VERSION; VERIFY (graph().vertices().size() < (u32(1) << (8*sizeof(GameGraph::_GRAPH_ID)))); header.m_vertex_count = (GameGraph::_GRAPH_ID)graph().vertices().size(); VERIFY (graph().edge_count() < (u32(1) << (8*sizeof(GameGraph::_GRAPH_ID)))); header.m_edge_count = (GameGraph::_GRAPH_ID)graph().edge_count(); header.m_death_point_count = 0; header.m_guid = m_graph_guid; // levels CGameGraph::SLevel level; level.m_offset.set (0,0,0); level.m_id = 0; level.m_name = m_level_name; level.m_section = ""; level.m_guid = level_graph().header().guid(); header.m_levels.insert (std::make_pair(level.m_id,level)); header.save (&writer); { u32 edge_offset = graph().vertices().size()*sizeof(CGameGraph::CVertex); graph_type::const_vertex_iterator I = graph().vertices().begin(); graph_type::const_vertex_iterator E = graph().vertices().end(); for ( ; I != E; ++I) { CGameGraph::CVertex &vertex = (*I).second->data(); VERIFY ((*I).second->edges().size() < 256); vertex.tNeighbourCount = (u8)(*I).second->edges().size(); vertex.dwEdgeOffset = edge_offset; edge_offset += vertex.tNeighbourCount*sizeof(CGameGraph::CEdge); writer.w (&vertex,sizeof(CGameGraph::CVertex)); } } { graph_type::const_vertex_iterator I = graph().vertices().begin(); graph_type::const_vertex_iterator E = graph().vertices().end(); for ( ; I != E; ++I) { graph_type::const_iterator i = (*I).second->edges().begin(); graph_type::const_iterator e = (*I).second->edges().end(); for ( ; i != e; ++i) { GameGraph::CEdge edge; VERIFY ((*i).vertex_id() < (u32(1) << (8*sizeof(GameGraph::_GRAPH_ID)))); edge.m_vertex_id = (GameGraph::_GRAPH_ID)(*i).vertex_id(); edge.m_path_distance = (*i).weight(); writer.w (&edge.m_vertex_id,sizeof(edge.m_vertex_id)); writer.w_float (edge.m_path_distance); } } } #ifdef PRIQUEL writer.save_to (m_graph_name); #else // PRIQUEL string_path file_name; strconcat (sizeof(file_name),file_name,*m_level_name,GAME_LEVEL_GRAPH); writer.save_to (file_name); #endif // PRIQUEL Msg ("%d bytes saved",int(writer.size())); Progress (start + amount); }