void SSceneSummary::SObjectInfo::Prepare() { bReady = true; if (object_name.size()){ CEditableObject* O = Lib.CreateEditObject(object_name.c_str()); xr_string pref = object_name.c_str(); if (O){ SPairInfo tmp; tmp.first = pref+"\\References"; tmp.second = _itoa(ref_count); info.push_back (tmp); tmp.first = pref+"\\Geometry\\Faces"; tmp.second = _itoa(O->GetFaceCount()); info.push_back (tmp); tmp.first = pref+"\\Geometry\\Vertices"; tmp.second = _itoa(O->GetVertexCount()); info.push_back (tmp); SurfaceVec& surfaces = O->Surfaces(); for (SurfaceIt it=surfaces.begin(); it!=surfaces.end(); it++){ xr_string pr= pref+xr_string("\\Materials\\")+(*it)->_Name(); tmp.first = pr+"\\Texture"; tmp.second = (*it)->_Texture(); info.push_back (tmp); tmp.first = pr+"\\Faces"; tmp.second = _itoa(O->GetSurfFaceCount((*it)->_Name()));info.push_back (tmp); } Lib.RemoveEditObject(O); } }else{ Msg("!Empty object name found."); } }
bool EDetail::Update (LPCSTR name) { m_sRefs = name; // update link CEditableObject* R = Lib.CreateEditObject(name); if (!R){ ELog.Msg (mtError,"Can't load detail object '%s'.", name); return false; } if(R->SurfaceCount()!=1){ ELog.Msg (mtError,"Object must contain 1 material."); Lib.RemoveEditObject(R); return false; } if(R->MeshCount()==0){ ELog.Msg (mtError,"Object must contain 1 mesh."); Lib.RemoveEditObject(R); return false; } Lib.RemoveEditObject(m_pRefs); m_pRefs = R; // fill geometry CEditableMesh* M = *m_pRefs->FirstMesh(); U16Vec inds; // fill vertices bv_bb.invalidate(); u32 idx = 0; for (u32 f_id=0; f_id<M->GetFCount(); f_id++){ st_Face& F = M->GetFaces()[f_id]; u16 ind[3]; for (int k=0; k<3; k++,idx++){ Fvector& P = M->GetVerts()[F.pv[k].pindex]; st_VMapPt&vm= M->GetVMRefs()[F.pv[k].vmref].pts[0]; Fvector2& uv= M->GetVMaps()[vm.vmap_index]->getUV(vm.index); ind[k] = _AddVert (P,uv.x,uv.y); bv_bb.modify(vertices[ind[k]].P); } if (isDegenerated(ind)) continue; if (isEqual(inds,ind)) continue; inds.push_back(ind[0]); inds.push_back(ind[1]); inds.push_back(ind[2]); } number_indices = inds.size(); indices = (u16*)xr_malloc(number_indices*sizeof(u16)); Memory.mem_copy (indices,inds.begin(),number_indices*sizeof(u16)); bv_bb.getsphere (bv_sphere.P,bv_sphere.R); OnDeviceCreate (); return true; }
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; }
bool EDetailManager::GetSummaryInfo(SSceneSummary* inf) { for (DetailIt it=objects.begin(); it!=objects.end(); it++){ ((EDetail*)(*it))->OnDeviceCreate(); CEditableObject* E = ((EDetail*)(*it))->m_pRefs; if (!E) continue; CSurface* surf = *E->FirstSurface(); VERIFY(surf); inf->AppendTexture (surf->_Texture(),SSceneSummary::sttDO,0,0,"$DETAILS$"); } return true; }
void __fastcall TClipMaker::BPOnPaint(TObject *Sender) { TMxPanel* bp = dynamic_cast<TMxPanel*>(Sender); VERIFY(bp); CEditableObject* O = m_CurrentObject; VERIFY(O); TCanvas* canvas = bp->Canvas; canvas->Font->Name = "MS Sans Serif"; canvas->Font->Style = TFontStyles(); canvas->Font->Color = clBlack; canvas->Pen->Color = clBlack; canvas->Pen->Style = psSolid; canvas->Brush->Style= bsSolid; if (-2==bp->Tag){ for (UIClipIt it=clips.begin(); it!=clips.end(); it++){ canvas->Brush->Color= (*it==sel_clip)?(drag_obj==bp->Tag?BP_ACTIVE_DRAG_COLOR:BP_ACTIVE_COLOR):BP_INACTIVE_COLOR; TRect R = TRect((*it)->PLeft(), 1, (*it)->PRight()-1, 15); AnsiString fx_name = (*it)->FXName(); if (!fx_name.IsEmpty()){ canvas->Rectangle (R); R.Top += 1; R.Bottom -= 1; R.Left += 1; R.Right -= 1; canvas->TextRect (R,R.Left,R.Top,fx_name); } } }else if ((bp->Tag>=0)&&(bp->Tag<(int)O->BoneParts().size())){ AnsiString mn_prev = ""; for (UIClipIt it=clips.begin(); it!=clips.end(); it++){ AnsiString mn = (*it)->CycleName(u16(bp->Tag)); TRect R = TRect((*it)->PLeft(), 1, (*it)->PRight()-1, 15); if (!mn.IsEmpty()){ canvas->Brush->Color= (*it==sel_clip)?(drag_obj==bp->Tag?BP_ACTIVE_DRAG_COLOR:BP_ACTIVE_COLOR):BP_INACTIVE_COLOR; canvas->Rectangle (R); R.Top += 1; R.Bottom -= 1; R.Left += 1; R.Right -= 1; canvas->TextRect (R,R.Left,R.Top,mn); mn_prev = mn; }else if (!mn_prev.IsEmpty()){ canvas->MoveTo ((*it)->PLeft()+1,13); canvas->LineTo (R.Right,13); canvas->LineTo (R.Width()>5?R.Right-5:R.Right-R.Width(),8); R.Top += 1; R.Bottom -= 1; R.Left += 1; R.Right -= 1; } } } }
BOOL GetStaticCformData( CSceneObject* obj,mesh_build_data &data, bool b_selected_only ) { Fmatrix T = obj->_Transform(); CEditableObject *O = obj->GetReference(); for(EditMeshIt M=O->FirstMesh();M!=O->LastMesh();M++){ // CSector* S = PortalUtils.FindSector(obj,*M); // int sect_num = S?S->m_sector_num:m_iDefaultSectorNum; // if (!BuildMesh(T,O,*M,sect_num,l_verts,l_vert_cnt,l_vert_it,l_faces,l_face_cnt,l_face_it,l_smgroups,obj->_Transform())) if(!::GetStaticCformData(T,*M,O,data.l_verts,data.l_vert_cnt,data.l_vert_it,data.l_faces,data.l_face_cnt,data.l_face_it) ) return FALSE; } return FALSE; }
MStatus CXRayObjectExport::writer ( const MFileObject& file, const MString& options, FileAccessMode mode ) { MStatus status= MS::kFailure; //move default extesion here.. MString mname = file.fullName()+".object"; LPCSTR fname = mname.asChar(); Log("Export object: ",fname); CEditableObject* OBJECT = new CEditableObject(fname); OBJECT->SetVersionToCurrent(TRUE,TRUE); if((mode==MPxFileTranslator::kExportAccessMode)||(mode==MPxFileTranslator::kSaveAccessMode)){ status = ExportAll(OBJECT)?MS::kSuccess:MS::kFailure; }else if(mode==MPxFileTranslator::kExportActiveAccessMode){ status = ExportSelected(OBJECT)?MS::kSuccess:MS::kFailure; } if (MS::kSuccess==status){ OBJECT->Optimize (); OBJECT->SaveObject (fname); Log("Object succesfully exported."); Msg("%d vertices, %d faces", OBJECT->GetVertexCount(), OBJECT->GetFaceCount()); }else{ Log("! Export failed."); } xr_delete(OBJECT); return status; }
//---------------------------------------------------- // 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; }
void TClipMaker::RealRepaintClips() { m_RTFlags.set (flRT_RepaintClips,FALSE); // repaint paClips->Repaint (); gtClip->Repaint (); paBP0->Repaint (); paBP1->Repaint (); paBP2->Repaint (); paBP3->Repaint (); paFXs->Repaint (); // set BP name CEditableObject* O = m_CurrentObject; u32 k = 0; if (O){ BPVec& bps = O->BoneParts(); for (; k<bps.size(); k++) m_LB[k]->Caption = bps[k].alias.c_str(); } for (; k<4; k++) m_LB[k]->Caption = "-"; UpdateProperties (); }
bool ESceneObjectTool::ExportBreakableObjects(SExportStreams* F) { bool bResult = true; CGeomPartExtractor* extractor=0; Fbox bb; if (!GetBox(bb)) return false; extractor = xr_new<CGeomPartExtractor>(); extractor->Initialize(bb,EPS_L,2); UI->SetStatus ("Export breakable objects..."); // collect verts&&faces { SPBItem* pb = UI->ProgressStart(m_Objects.size(),"Prepare geometry..."); for (ObjectIt it=m_Objects.begin(); it!=m_Objects.end(); it++){ pb->Inc(); CSceneObject* obj = dynamic_cast<CSceneObject*>(*it); VERIFY(obj); if (obj->IsStatic()){ CEditableObject *O = obj->GetReference(); const Fmatrix& T = obj->_Transform(); for(EditMeshIt M=O->FirstMesh();M!=O->LastMesh();M++) if (!build_mesh (T,*M,extractor,SGameMtl::flBreakable,FALSE)){bResult=false;break;} } } UI->ProgressEnd(pb); } if (!extractor->Process()) bResult = false; // export parts if (bResult){ SBPartVec& parts = extractor->GetParts(); SPBItem* pb = UI->ProgressStart(parts.size(),"Export Parts..."); for (SBPartVecIt p_it=parts.begin(); p_it!=parts.end(); p_it++){ pb->Inc(); SBPart* P = *p_it; if (P->Valid()){ // export visual AnsiString sn = AnsiString().sprintf("meshes\\brkbl#%d.ogf",(p_it-parts.begin())); xr_string fn = Scene->LevelPath()+sn.c_str(); IWriter* W = FS.w_open(fn.c_str()); R_ASSERT(W); if (!P->Export(*W,1)){ ELog.DlgMsg (mtError,"Invalid breakable object."); bResult = false; break; } FS.w_close (W); // export spawn object { AnsiString entity_ref = "breakable_object"; ISE_Abstract* m_Data = create_entity(entity_ref.c_str()); VERIFY(m_Data); CSE_Visual* m_Visual = m_Data->visual(); VERIFY(m_Visual); // set params m_Data->set_name (entity_ref.c_str()); m_Data->set_name_replace (sn.c_str()); m_Data->position().set (P->m_RefOffset); m_Data->angle().set (P->m_RefRotate); m_Visual->set_visual (sn.c_str(),false); if (s_draw_dbg){ Fmatrix MX; MX.setXYZi (P->m_RefRotate); MX.translate_over (P->m_RefOffset); Fvector DR = {0,0,1}; MX.transform_dir (DR); Tools->m_DebugDraw.AppendLine(P->m_RefOffset,Fvector().mad(P->m_RefOffset,MX.k,1.f),0xFF0000FF,false,false); } NET_Packet Packet; m_Data->Spawn_Write (Packet,TRUE); F->spawn.stream.open_chunk (F->spawn.chunk++); F->spawn.stream.w (Packet.B.data,Packet.B.count); F->spawn.stream.close_chunk (); destroy_entity (m_Data); } }else{ ELog.Msg(mtError,"Can't export invalid part #%d",p_it-parts.begin()); } } UI->ProgressEnd(pb); } // clean up xr_delete(extractor); return bResult; }
bool ESceneObjectTool::ExportClimableObjects(SExportStreams* F) { bool bResult = true; CGeomPartExtractor* extractor = 0; Fbox bb; if (!GetBox(bb)) return false; extractor = xr_new<CGeomPartExtractor>(); extractor->Initialize (bb,EPS_L,int_max); UI->SetStatus ("Export climable objects..."); // collect verts&&faces { SPBItem* pb = UI->ProgressStart(m_Objects.size(), "Prepare geometry..."); for (ObjectIt it=m_Objects.begin(); it!=m_Objects.end(); it++) { pb->Inc(); CSceneObject* obj = dynamic_cast<CSceneObject*>(*it); VERIFY (obj); if (obj->IsStatic()) { CEditableObject *O = obj->GetReference(); const Fmatrix& T = obj->_Transform(); for(EditMeshIt M =O->FirstMesh(); M!=O->LastMesh(); M++) if (!build_mesh (T, *M, extractor, SGameMtl::flClimable, TRUE)) { bResult = false; break; } } } UI->ProgressEnd(pb); } if (!extractor->Process()) bResult = false; // export parts if (bResult) { SBPartVec& parts = extractor->GetParts(); SPBItem* pb = UI->ProgressStart(parts.size(),"Export Parts..."); for (SBPartVecIt p_it=parts.begin(); p_it!=parts.end(); p_it++) { pb->Inc (); SBPart* P = *p_it; if (P->Valid()) { // export visual AnsiString sn = AnsiString().sprintf("clmbl#%d",(p_it-parts.begin())); Fvector local_normal = {0,0,0}; LPCSTR mat_name = NULL; for (SBFaceVecIt it=P->m_Faces.begin(); it!=P->m_Faces.end(); it++) { for (u32 k=0; k<3; k++) local_normal.add ((*it)->n[k]); mat_name = (*it)->surf->_GameMtlName(); } local_normal.normalize_safe (); // export spawn object { AnsiString entity_ref = "climable_object"; ISE_Abstract* m_Data = create_entity(entity_ref.c_str()); VERIFY(m_Data); ISE_Shape* m_Shape = m_Data->shape(); VERIFY(m_Shape); // CSE_Visual* m_Visual = m_Data->visual(); VERIFY(m_Visual); // set params m_Data->set_name (entity_ref.c_str()); m_Data->set_name_replace (sn.c_str()); // set shape CShapeData::shape_def shape; shape.type = CShapeData::cfBox; shape.data.box.scale ((P->m_BBox.max.x-P->m_BBox.min.x)*0.5f, (P->m_BBox.max.y-P->m_BBox.min.y)*0.5f, (P->m_BBox.max.z-P->m_BBox.min.z)*0.5f); m_Shape->assign_shapes (&shape,1); // orientate object if (!OrientToNorm(local_normal,P->m_OBB.m_rotate,P->m_OBB.m_halfsize)) { ELog.Msg(mtError,"Invalid climable object found. [%3.2f, %3.2f, %3.2f]",VPUSH(P->m_RefOffset)); } else { Fmatrix M; M.set (P->m_OBB.m_rotate.i,P->m_OBB.m_rotate.j,P->m_OBB.m_rotate.k,P->m_OBB.m_translate); M.getXYZ (P->m_RefRotate); // не i потому что в движке так m_Data->position().set (P->m_RefOffset); m_Data->angle().set (P->m_RefRotate); m_Data->set_additional_info((void*)mat_name); NET_Packet Packet; m_Data->Spawn_Write (Packet,TRUE); F->spawn.stream.open_chunk (F->spawn.chunk++); F->spawn.stream.w (Packet.B.data,Packet.B.count); F->spawn.stream.close_chunk (); if (s_draw_dbg) { Tools->m_DebugDraw.AppendOBB(P->m_OBB); M.transform_dir (local_normal); Tools->m_DebugDraw.AppendLine(P->m_RefOffset,Fvector().mad(P->m_RefOffset,local_normal,1.f)); } } destroy_entity (m_Data); } }else { ELog.Msg(mtError,"Can't export invalid part #%d",p_it-parts.begin()); } } UI->ProgressEnd (pb); } // clean up xr_delete (extractor); return bResult; }
bool ESceneAIMapTool::GenerateMap(bool bFromSelectedOnly) { std::sort(m_ignored_materials.begin(),m_ignored_materials.end()); bool bRes = false; if (!GetSnapList()->empty()){ if (!RealUpdateSnapList()) return false; if (m_Nodes.empty()){ ELog.DlgMsg(mtError,"Append at least one node."); return false; } if (!m_Flags.is(flSlowCalculate)){ // evict resources ExecCommand (COMMAND_EVICT_OBJECTS); ExecCommand (COMMAND_EVICT_TEXTURES); // prepare collision model u32 avg_face_cnt = 0; u32 avg_vert_cnt = 0; u32 mesh_cnt = 0; Fbox snap_bb; { snap_bb.invalidate (); for (ObjectIt o_it=m_SnapObjects.begin(); o_it!=m_SnapObjects.end(); o_it++){ CSceneObject* S = dynamic_cast<CSceneObject*>(*o_it); VERIFY(S); avg_face_cnt += S->GetFaceCount(); avg_vert_cnt += S->GetVertexCount(); mesh_cnt += S->Meshes()->size(); Fbox bb; S->GetBox (bb); snap_bb.merge (bb); } } SPBItem* pb = UI->ProgressStart(mesh_cnt,"Prepare collision model..."); CDB::Collector* CL = ETOOLS::create_collector(); Fvector verts[3]; for (ObjectIt o_it=m_SnapObjects.begin(); o_it!=m_SnapObjects.end(); o_it++) { CSceneObject* S = dynamic_cast<CSceneObject*>(*o_it); VERIFY(S); CEditableObject* E = S->GetReference(); VERIFY(E); EditMeshVec& _meshes = E->Meshes(); for (EditMeshIt m_it=_meshes.begin(); m_it!=_meshes.end(); m_it++) { pb->Inc(AnsiString().sprintf("%s [%s]",S->Name,(*m_it)->Name().c_str()).c_str()); const SurfFaces& _sfaces = (*m_it)->GetSurfFaces(); for (SurfFaces::const_iterator sp_it=_sfaces.begin(); sp_it!=_sfaces.end(); sp_it++) { CSurface* surf = sp_it->first; // test passable //. SGameMtl* mtl = GMLib.GetMaterialByID(surf->_GameMtl()); //. if (mtl->Flags.is(SGameMtl::flPassable))continue; Shader_xrLC* c_sh = Device.ShaderXRLC.Get(surf->_ShaderXRLCName()); if (!c_sh->flags.bCollision) continue; // collect tris const IntVec& face_lst = sp_it->second; for (IntVec::const_iterator it=face_lst.begin(); it!=face_lst.end(); it++) { E->GetFaceWorld (S->_Transform(),*m_it,*it,verts); ETOOLS::collector_add_face_d(CL,verts[0],verts[1],verts[2], surf->_GameMtl() /* *it */); if (surf->m_Flags.is(CSurface::sf2Sided)) ETOOLS::collector_add_face_d(CL,verts[2],verts[1],verts[0], surf->_GameMtl() /* *it */); } } } } UI->ProgressEnd(pb); UI->SetStatus ("Building collision model..."); // create CFModel m_CFModel = ETOOLS::create_model_cl(CL); ETOOLS::destroy_collector(CL); } // building Scene->lock (); CTimer tm; tm.Start(); BuildNodes (bFromSelectedOnly); tm.GetElapsed_sec(); Scene->unlock (); //. Log("-test time: ", g_tm.GetElapsed_sec()); Log("-building time: ",tm.GetElapsed_sec()); //. Msg("-Rate: %3.2f Count: %d",(g_tm.GetElapsed_sec()/tm.GetElapsed_sec())*100.f,g_tm.count); // unload CFModel ETOOLS::destroy_model(m_CFModel); Scene->UndoSave (); bRes = true; UI->SetStatus (""); }else{ ELog.DlgMsg(mtError,"Fill snap list before generating slots!"); } return bRes; }
bool CSceneObject::Validate(bool bMsg) { CEditableObject* E = GetReference(); R_ASSERT(E); return E->Validate(); }
bool CSceneObject::GetSummaryInfo(SSceneSummary* inf) { inherited::GetSummaryInfo (inf); CEditableObject* E = GetReference(); R_ASSERT(E); if (IsStatic()||IsMUStatic()){ for(SurfaceIt s_it=E->m_Surfaces.begin(); s_it!=E->m_Surfaces.end(); s_it++){ float area = 0.f; float pixel_area = 0.f; for(EditMeshIt m = E->Meshes().begin();m!=E->Meshes().end();m++){ area += (*m)->CalculateSurfaceArea(*s_it,true); pixel_area += (*m)->CalculateSurfacePixelArea(*s_it,true); } inf->AppendTexture(ChangeFileExt(AnsiString(*(*s_it)->m_Texture),"").LowerCase().c_str(),SSceneSummary::sttBase,area,pixel_area,E->m_LibName.c_str()); } if (m_Flags.is(CEditableObject::eoUsingLOD)){ inf->AppendTexture(E->GetLODTextureName().c_str(),SSceneSummary::sttLOD,0,0,"$LOD$"); inf->lod_objects.insert (E->m_LibName.c_str()); inf->object_lod_ref_cnt++; } if (m_Flags.is(CEditableObject::eoMultipleUsage)){ inf->mu_objects.insert(E->m_LibName.c_str()); inf->object_mu_ref_cnt++; } inf->face_cnt += E->GetFaceCount (); inf->vert_cnt += E->GetVertexCount(); } if (m_Flags.is(CEditableObject::eoHOM)){ inf->hom_face_cnt += E->GetFaceCount (); inf->hom_vert_cnt += E->GetVertexCount(); } if (m_Flags.is(CEditableObject::eoSoundOccluder)){ inf->snd_occ_face_cnt += E->GetFaceCount(); inf->snd_occ_vert_cnt += E->GetVertexCount(); } inf->AppendObject (E->GetName()); return true; }