#include <optimize.h>

Public Member Functions | |
| Optimize (const MODULE_ID &_id, const wxString &_name, EventHandler *msgSink) | |
| Class constructor - do not alter. | |
| virtual | ~Optimize () |
| Class destructor - deinitialize your data. | |
| virtual wxString | GetDesc () const |
| Always overload method giving description for your module. | |
Protected Member Functions | |
| void | parseMask (wxString mask, std::vector< wxString > &maskList) |
| bool | nameHasMask (wxString name, std::vector< wxString > &maskList) |
| void | deleteAction (SCENE_ID _sceneID, wxString mask) |
| bool | simplifyStructureRecursion (Scene *scene, const SceneNode *node, std::vector< wxString > &maskList, long &delCount) |
| void | simplifyStructureAction (SCENE_ID _sceneID, wxString mask) |
| void | removeUnusedMaterialsAction (SCENE_ID _sceneID) |
| void | unifyMaterialsAction (SCENE_ID _sceneID) |
| void | unifyVerticesAction (SCENE_ID _sceneID) |
| void | removeUnusedGeometriesAction (SCENE_ID _sceneID) |
| void | mergePrimitive (std::vector< size_t > &canMerge, GeometryTriangles::PRIMITIVE_TYPE primType, GeometryTriangles::TriDescList &ntriD, GeometryTriangles::TriDescList *triDescList, std::vector< GeometryTriangles::Indice > &nind, std::vector< bool > &primUsed, std::vector< GeometryTriangles::Indice > *indices, long &delCount) |
| Merge one type of primitives (help method for mergePrimitivesAction). | |
| void | mergePrimitivesAction (SCENE_ID _sceneID) |
| void | deleteNormalsAction (SCENE_ID _sceneID, wxString mask) |
| void | deleteTexCoordsAction (SCENE_ID _sceneID, wxString mask) |
| void | statisticsAction (SCENE_ID _sceneID) |
| virtual void | processEvent (wxCommandEvent &evt) |
| Overload this to process events you need. | |
Protected Attributes | |
| wxString | nameMask |
| name mask for delete action | |
| Parameter::ParameterIdentificator | nameMaskParamID |
Add nameMask param identificator to register this as parameter. | |
| Parameter::ParameterIdentificator | deleteActionParamID |
Add delete push button param identificator to register this as parameter. | |
| Parameter::ParameterIdentificator | simplifyStructureActionParamID |
Add simplifyStructure push button param identificator to register this as parameter. | |
| Parameter::ParameterIdentificator | removeUnusedMaterialsActionParamID |
Add removeUnusedMaterials push button param identificator to register this as parameter. | |
| Parameter::ParameterIdentificator | unifyMaterialsActionParamID |
Add unifyMaterials push button param identificator to register this as parameter. | |
| Parameter::ParameterIdentificator | unifyVerticesActionParamID |
Add unifyVertices push button param identificator to register this as parameter. | |
| Parameter::ParameterIdentificator | removeUnusedGeometriesActionParamID |
Add removeUnusedGeometries push button param identificator to register this as parameter. | |
| Parameter::ParameterIdentificator | mergePrimitivesActionParamID |
Add mergePrimitives push button param identificator to register this as parameter. | |
| Parameter::ParameterIdentificator | deleteNormalsActionParamID |
Add deleteNormals push button param identificator to register this as parameter. | |
| Parameter::ParameterIdentificator | deleteTexCoordsActionParamID |
Add deleteTexCoords push button param identificator to register this as parameter. | |
| Parameter::ParameterIdentificator | statisticsActionParamID |
Add statistics push button param identificator to register this as parameter. | |
Definition at line 29 of file optimize.h.
| VRUT::Optimize::Optimize | ( | const MODULE_ID & | _id, | |
| const wxString & | _name, | |||
| EventHandler * | msgSink | |||
| ) | [inline] |
Class constructor - do not alter.
Definition at line 164 of file optimize.h.
00165 : SceneModule(_id, _name, 0, msgSink) 00166 { 00167 REGISTER_PARAM_GUI_TEXTCONTROL(nameMaskParamID, wxT("nameMask"), wxT("*"), wxT("Mame mask for Delete and Simplify structure.\n* - any number on any characters\n? - any character")); 00168 REGISTER_PARAM_GUI_BUTTON(deleteActionParamID, wxT("delete"), wxT("Delete nodes with given nameMask.")); 00169 REGISTER_PARAM_GUI_BUTTON(simplifyStructureActionParamID, wxT("simplifyStructure"), wxT("Delete nodes with given nameMask, if they have only one children.")); 00170 REGISTER_PARAM_GUI_BUTTON(removeUnusedMaterialsActionParamID, wxT("removeUnusedMaterials"), wxT("Remove materials not used in any node.")); 00171 REGISTER_PARAM_GUI_BUTTON(unifyMaterialsActionParamID, wxT("unifyMaterials"), wxT("Remove duplicated materials (that differs only by the name).")); 00172 REGISTER_PARAM_GUI_BUTTON(unifyVerticesActionParamID, wxT("unifyVertices"), wxT("Unify vertices with the same coordinates, normal and texture coordinates")); 00173 REGISTER_PARAM_GUI_BUTTON(removeUnusedGeometriesActionParamID, wxT("removeUnusedGeometries"), wxT("Delete geometries not used in any node.")); 00174 REGISTER_PARAM_GUI_BUTTON(mergePrimitivesActionParamID, wxT("mergePrimitives"), wxT("Merge primitives (for example TRIANGLES, QUADS, etc.).\nIt can also convert some types to another (triangle strip with three vertices is triangle, etc.")); 00175 REGISTER_PARAM_GUI_BUTTON(deleteNormalsActionParamID, wxT("deleteNormals"), wxT("Detete normals from nodes with given nameMask.")); 00176 REGISTER_PARAM_GUI_BUTTON(deleteTexCoordsActionParamID, wxT("deleteTexCoords"), wxT("Detete texture coordinates from nodes with given nameMask.")); 00177 REGISTER_PARAM_GUI_BUTTON(statisticsActionParamID, wxT("statistics"), wxT("Compute and log information about scene.\nCorrect LogLevel must be set to see results.")); 00178 }
| virtual VRUT::Optimize::~Optimize | ( | ) | [inline, virtual] |
| void Optimize::parseMask | ( | wxString | mask, | |
| std::vector< wxString > & | maskList | |||
| ) | [protected] |
Definition at line 18 of file optimize.cpp.
00019 { 00020 while (!mask.IsEmpty()) 00021 { 00022 int pos = mask.Find(wxT(',')); 00023 if (pos != wxNOT_FOUND) 00024 { 00025 if (pos>0) 00026 maskList.push_back(mask.SubString(0,pos-1)); 00027 mask.Remove(0, pos+1); 00028 } 00029 else 00030 { 00031 maskList.push_back(mask.SubString(0,pos-1)); 00032 mask.Clear(); 00033 } 00034 } 00035 }
| bool Optimize::nameHasMask | ( | wxString | name, | |
| std::vector< wxString > & | maskList | |||
| ) | [protected] |
Definition at line 37 of file optimize.cpp.
00038 { 00039 for (std::vector<wxString>::iterator maskIt = maskList.begin(); maskIt != maskList.end(); maskIt++) 00040 { 00041 if (name.Matches(*maskIt)) 00042 return true; 00043 } 00044 return false; 00045 }
| void Optimize::deleteAction | ( | SCENE_ID | _sceneID, | |
| wxString | mask | |||
| ) | [protected] |
Delete nodes with name matching mask
| [in] | _sceneID | Scene to be processed |
| [in] | mask | Name mask (arbitrary number separated by comma) |
Definition at line 47 of file optimize.cpp.
00048 { 00049 Scene * scene = GetSceneMgr()->GetScene(_sceneID); 00050 if (!scene) 00051 return; 00052 00053 std::vector<wxString> maskList; 00054 parseMask(mask, maskList); 00055 long delCount=0; 00056 00057 std::vector<NODE_ID> nodes; 00058 scene->GetNodeIDs(&nodes); 00059 00060 for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin(); 00061 nodeIt != nodes.end(); nodeIt++) 00062 { 00063 const SceneNode * node = scene->GetNode(*nodeIt); 00064 if (nameHasMask(node->GetName(),maskList)) 00065 { 00066 //scene->Remove(*nodeIt); 00067 wxCommandEvent evNodeRemove = Event::GET_EVT_SCENE_NODE_REMOVE(_sceneID, *nodeIt); 00068 PostToKernel(evNodeRemove); 00069 delCount++; 00070 } 00071 } 00072 LOG(wxString::Format(wxT("<Optimize>deleteAction removed %li nodes"), delCount)); 00073 }
| bool Optimize::simplifyStructureRecursion | ( | Scene * | scene, | |
| const SceneNode * | node, | |||
| std::vector< wxString > & | maskList, | |||
| long & | delCount | |||
| ) | [protected] |
Recursive traversing function for scene simplification
| [in] | scene | Scene to be processed |
| [in] | node | current node |
| [in] | maskList | The list of masks |
| [in] | delCount | Deleted nodes counter (only for logging) |
Definition at line 75 of file optimize.cpp.
00076 { 00077 const SceneNode::NodeIDList *children = node->GetChildren(); 00078 for (SceneNode::NodeIDList::const_iterator it = children->begin(); it != children->end();) 00079 { 00080 const SceneNode *child = scene->GetNode(*it); 00081 if ((child->IsOfType(SceneNode::ASSEMBLY))||(child->IsOfType(SceneNode::GEOMETRY))) 00082 { 00083 if (simplifyStructureRecursion(scene, child, maskList, delCount)) 00084 it = children->begin(); 00085 else 00086 it++; 00087 } 00088 else 00089 it++; 00090 } 00091 00092 if (node->GetID()==0) 00093 return false; 00094 if ((children->size()==0)&&(node->IsOfType(SceneNode::ASSEMBLY))&&(nameHasMask(node->GetName(), maskList))) 00095 { 00096 scene->Remove(node->GetID()); 00097 delCount++; 00098 return true; 00099 } 00100 if (children->size()==1) 00101 { 00102 if (nameHasMask(node->GetName(), maskList)) 00103 { 00104 NODE_ID childID = children->front(); 00105 MATRIX transf((*node->GetLocalTransMatrix())*(*(scene->GetNode(childID)->GetLocalTransMatrix()))); 00106 scene->Move(childID, node->GetParent()); 00107 scene->SetTransformation(childID, transf); 00108 scene->Remove(node->GetID()); 00109 delCount++; 00110 return true; 00111 } else if (nameHasMask(scene->GetNode(children->front())->GetName(), maskList)) 00112 { 00113 NODE_ID childID = children->front(); 00114 MATRIX transf((*node->GetLocalTransMatrix())*(*(scene->GetNode(childID)->GetLocalTransMatrix()))); 00115 scene->Move(childID, node->GetParent()); 00116 scene->SetTransformation(childID, transf); 00117 wxString name(node->GetName()); 00118 scene->Remove(node->GetID()); 00119 scene->SetName(childID, name); 00120 delCount++; 00121 return true; 00122 } 00123 } 00124 return false; 00125 }
| void Optimize::simplifyStructureAction | ( | SCENE_ID | _sceneID, | |
| wxString | mask | |||
| ) | [protected] |
Simplifies structure of scene, deletes ASSEMBLY nodes with name matching mask that contains only one child, deletes ASSEMBLY that contains only one child and the child has name matching mask
| [in] | _sceneID | Scene to be processed |
| [in] | mask | Name mask (arbitrary number separated by comma) |
Definition at line 127 of file optimize.cpp.
00128 { 00129 Scene * scene = GetSceneMgr()->GetScene(_sceneID); 00130 if (!scene) 00131 return; 00132 00133 std::vector<wxString> maskList; 00134 parseMask(mask, maskList); 00135 long delCount = 0; 00136 simplifyStructureRecursion(scene, scene->GetNode(scene->GetRootID()), maskList, delCount); 00137 LOG(wxString::Format(wxT("<Optimize>simplifyStructureAction removed %li nodes"), delCount)); 00138 }
| void Optimize::removeUnusedMaterialsAction | ( | SCENE_ID | _sceneID | ) | [protected] |
Removes unused materials from scene
| [in] | _sceneID | Scene to be processed |
Definition at line 140 of file optimize.cpp.
00141 { 00142 Scene * scene = GetSceneMgr()->GetScene(_sceneID); 00143 if (!scene) 00144 return; 00145 00146 const Scene::MaterialList *materials = scene->GetMaterials(); 00147 std::vector<bool> matUsed; 00148 matUsed.insert(matUsed.end(), materials->size(), false); 00149 std::vector<NODE_ID> nodes; 00150 scene->GetNodeIDs(&nodes); 00151 long delCount = 0; 00152 for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin(); 00153 nodeIt != nodes.end(); nodeIt++) 00154 { 00155 const SceneNode * node = scene->GetNode(*nodeIt); 00156 if (node && node->IsOfType(SceneNode::GEOMETRY)) 00157 if (((GeometryNode*)node)->GetMaterialID()!=MATERIAL_ID_NONE) 00158 matUsed[((GeometryNode*)node)->GetMaterialID()]=true; 00159 } 00160 for (size_t i=0; i<matUsed.size(); i++) 00161 { 00162 if (!matUsed[i]) 00163 { 00164 const Material *mat = scene->GetMaterial((MATERIAL_ID)i); 00165 if (mat) 00166 { 00167 LOG(wxString::Format(wxT("<Optimize>remove Material: %s"), mat->name.c_str())); 00168 scene->RemoveMaterial((MATERIAL_ID)i); 00169 delCount++; 00170 } 00171 } 00172 } 00173 LOG(wxString::Format(wxT("<Optimize>removeUnusedMaterialsAction removed %li materials"), delCount)); 00174 }
| void Optimize::unifyMaterialsAction | ( | SCENE_ID | _sceneID | ) | [protected] |
Unifies materials in scene
| [in] | _sceneID | Scene to be processed |
Definition at line 176 of file optimize.cpp.
00177 { 00178 Scene * scene = GetSceneMgr()->GetScene(_sceneID); 00179 if (!scene) 00180 return; 00181 00182 long uniCount = 0; 00183 const Scene::MaterialList *materials = scene->GetMaterials(); 00184 for (size_t i=0; i<materials->size(); i++) 00185 { 00186 const Material *firstMat = scene->GetMaterial((MATERIAL_ID)i); 00187 if (!firstMat) 00188 continue; 00189 for (size_t j=i+1; j<materials->size(); j++) 00190 { 00191 const Material *secMat = scene->GetMaterial((MATERIAL_ID)j); 00192 if (!secMat) 00193 continue; 00194 if (firstMat->IsSameAs(*secMat, 28)) 00195 { 00196 uniCount++; 00197 //use material matIt for all geometry that use matIt2 and remove material matId2 00198 LOG(wxString::Format(wxT("<Optimize>unifyMaterialsAction: materials %s and %s are the same"), firstMat->name.c_str(), secMat->name.c_str())); 00199 std::vector<NODE_ID> nodes; 00200 scene->GetNodeIDs(&nodes); 00201 for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin(); nodeIt != nodes.end(); nodeIt++) 00202 { 00203 const SceneNode * node = scene->GetNode(*nodeIt); 00204 if (node && node->IsOfType(SceneNode::GEOMETRY)) 00205 { 00206 if ((((GeometryNode*)node)->GetMaterialID())==j) 00207 { 00208 scene->SetMaterial(*nodeIt, (MATERIAL_ID)i); 00209 /*wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_MATERIAL_SET(_sceneID, *nodeIt, firstMat->name); 00210 PostToKernel(ev);*/ 00211 } 00212 } 00213 } 00214 scene->RemoveMaterial((MATERIAL_ID)j); 00215 } 00216 } 00217 } 00218 LOG(wxString::Format(wxT("<Optimize>unifyMaterialsAction merged %li materials"), uniCount)); 00219 }
| void Optimize::unifyVerticesAction | ( | SCENE_ID | _sceneID | ) | [protected] |
Unifies vertices in geometries, the vertices with the same coordinates, normals and texture coordinates are merged
| [in] | _sceneID | Scene to be processed |
Definition at line 266 of file optimize.cpp.
00267 { 00268 Scene * scene = GetSceneMgr()->GetScene(_sceneID); 00269 if (!scene) 00270 return; 00271 00272 long uniCount = 0; 00273 std::vector<NODE_ID> nodes; 00274 scene->GetNodeIDs(&nodes); 00275 for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin(); nodeIt != nodes.end(); nodeIt++) 00276 { 00277 const SceneNode * node = scene->GetNode(*nodeIt); 00278 if (node && node->IsOfType(SceneNode::GEOMETRY)) 00279 { 00280 const Geometry *geom = scene->GetGeometry(((GeometryNode*)node)->GetGeometryID()); 00281 if (geom && geom->type==Geometry::GEOMETRY_TRIANGLE) 00282 { 00283 GeometryTriangles *geoTri = (GeometryTriangles*)geom->Clone(); 00284 std::vector<VECTOR3> * verts = &(geoTri->vertices); 00285 std::vector<VECTOR3> * norms = &(geoTri->normals); 00286 std::vector<GeometryTriangles::TexCoord> * texs = &(geoTri->texCoords); 00287 std::vector<GeometryTriangles::Indice> * inds = &(geoTri->indices); 00288 //sort verts 00289 std::vector<size_t> ind(verts->size()); 00290 for (size_t i=0; i<ind.size(); i++) 00291 ind[i]=GeometryTriangles::Indice(i); 00292 //std::sort(ind.begin(), ind.end(), VerticesVectorSort(verts)); 00293 std::sort(ind.begin(), ind.end(), VerticesVectorSort2(verts, norms, texs)); 00294 //test equivalence and merge 00295 bool geomChanged = false; 00296 std::vector<std::vector<size_t> > vertsref(verts->size()); 00297 for (size_t i=0; i<inds->size(); i++) 00298 vertsref[inds->at(i)].push_back(i); 00299 size_t lastNotMerged = 0; 00300 for (size_t i=1; i<ind.size(); i++) 00301 { 00302 if (verts->at(ind[lastNotMerged])!=verts->at(ind[i])) 00303 { 00304 lastNotMerged = i; 00305 continue; 00306 } 00307 if (norms->size()==verts->size()) 00308 if (norms->at(ind[lastNotMerged])!=norms->at(ind[i])) 00309 { 00310 lastNotMerged = i; 00311 continue; 00312 } 00313 if (texs->size()==verts->size()) 00314 if (texs->at(ind[lastNotMerged])!=texs->at(ind[i])) 00315 { 00316 lastNotMerged = i; 00317 continue; 00318 } 00319 //replace in inds 00320 while (vertsref[ind[i]].size()) 00321 { 00322 inds->at(vertsref[ind[i]].back())=(GeometryTriangles::Indice)ind[lastNotMerged]; 00323 vertsref[ind[lastNotMerged]].push_back(vertsref[ind[i]].back()); 00324 vertsref[ind[i]].pop_back(); 00325 } 00326 geomChanged = true; 00327 } 00328 if (!geomChanged) 00329 { 00330 for (size_t i=0; i<vertsref.size(); i++) 00331 { 00332 if (vertsref.at(i).size()==0) 00333 { 00334 geomChanged=true; 00335 break; 00336 } 00337 } 00338 } 00339 if (geomChanged) 00340 { 00341 //remove unused vertices 00342 size_t lastUsed = vertsref.size()-1; 00343 for (size_t i=0; i<vertsref.size() && i<=lastUsed; i++) 00344 { 00345 if (!vertsref[i].size()) 00346 { 00347 while (!vertsref[lastUsed].size()) 00348 { 00349 lastUsed--; 00350 if (norms->size()==verts->size()) 00351 norms->pop_back(); 00352 if (texs->size()==verts->size()) 00353 texs->pop_back(); 00354 verts->pop_back(); 00355 uniCount++; 00356 } 00357 if (i>=lastUsed) 00358 break; 00359 verts->at(i)=verts->at(lastUsed); 00360 if (norms->size()==verts->size()) 00361 norms->at(i)=norms->at(lastUsed); 00362 if (texs->size()==verts->size()) 00363 texs->at(i)=texs->at(lastUsed); 00364 while (vertsref[lastUsed].size()) 00365 { 00366 inds->at(vertsref[lastUsed].back())=(GeometryTriangles::Indice)i; 00367 vertsref[i].push_back(vertsref[lastUsed].back()); 00368 vertsref[lastUsed].pop_back(); 00369 } 00370 } 00371 } 00372 scene->AddGeometry(geoTri); 00373 if (TestExit()) 00374 return; 00375 } 00376 } 00377 } 00378 } 00379 LOG(wxString::Format(wxT("<Optimize>unifyVerticesAction merged %li vertices"), uniCount)); 00380 }
| void Optimize::removeUnusedGeometriesAction | ( | SCENE_ID | _sceneID | ) | [protected] |
Removes unused geometries from scene
| [in] | _sceneID | Scene to be processed |
Definition at line 382 of file optimize.cpp.
00383 { 00384 Scene * scene = GetSceneMgr()->GetScene(_sceneID); 00385 if (!scene) 00386 return; 00387 00388 const Scene::GeometryList *geometries = scene->GetGeometries(); 00389 std::vector<bool> geoUsed; 00390 geoUsed.insert(geoUsed.end(), geometries->size(), false); 00391 std::vector<NODE_ID> nodes; 00392 scene->GetNodeIDs(&nodes); 00393 long delCount = 0; 00394 for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin(); 00395 nodeIt != nodes.end(); nodeIt++) 00396 { 00397 const SceneNode * node = scene->GetNode(*nodeIt); 00398 if (node->IsOfType(SceneNode::GEOMETRY)) 00399 if (((GeometryNode*)node)->GetGeometryID()!=GEOMETRY_ID_NONE) 00400 geoUsed[((GeometryNode*)node)->GetGeometryID()]=true; 00401 } 00402 for (size_t i=0; i<geoUsed.size(); i++) 00403 { 00404 if (!geoUsed[i]) 00405 { 00406 const Geometry *geo = scene->GetGeometry((GEOMETRY_ID)i); 00407 if (geo) 00408 { 00409 LOG(wxString::Format(wxT("<Optimize>remove Geometry: %s"), geo->GetName().c_str())); 00410 scene->RemoveGeometry((GEOMETRY_ID)i); 00411 delCount++; 00412 } 00413 } 00414 } 00415 LOG(wxString::Format(wxT("<Optimize>removeUnusedGeometriesAction removed %li geometries"), delCount)); 00416 }
| void Optimize::mergePrimitive | ( | std::vector< size_t > & | canMerge, | |
| GeometryTriangles::PRIMITIVE_TYPE | primType, | |||
| GeometryTriangles::TriDescList & | ntriD, | |||
| GeometryTriangles::TriDescList * | triDescList, | |||
| std::vector< GeometryTriangles::Indice > & | nind, | |||
| std::vector< bool > & | primUsed, | |||
| std::vector< GeometryTriangles::Indice > * | indices, | |||
| long & | delCount | |||
| ) | [protected] |
Merge one type of primitives (help method for mergePrimitivesAction).
Definition at line 418 of file optimize.cpp.
00421 { 00422 if (canMerge.size()>1) 00423 { 00424 ntriD.push_back(triDescList->at(canMerge[0])); 00425 ntriD.back().first=(GeometryTriangles::Indice)nind.size(); 00426 ntriD.back().second=primType; 00427 for (size_t j=0; j<canMerge.size(); j++) 00428 { 00429 primUsed[canMerge[j]]=true; 00430 size_t last = (canMerge[j]+1<triDescList->size())?triDescList->at(canMerge[j]+1).first:indices->size(); 00431 for (size_t k=triDescList->at(canMerge[j]).first; k<last; k++) 00432 nind.push_back(indices->at(k)); 00433 } 00434 delCount+=long(canMerge.size()-1); 00435 } 00436 }
| void Optimize::mergePrimitivesAction | ( | SCENE_ID | _sceneID | ) | [protected] |
Merge triangles into one TRI_LIST
| [in] | _sceneID | Scene to be processed |
!!Conversion to QUAD switchs triangles and can cause visible artefacts!!!
Definition at line 438 of file optimize.cpp.
00439 { 00440 Scene * scene = GetSceneMgr()->GetScene(_sceneID); 00441 if (!scene) 00442 return; 00443 00444 long delCount = 0; 00445 const Scene::GeometryList *geometries = scene->GetGeometries(); 00446 for (size_t i=0; i<geometries->size(); i++) 00447 { 00448 if (!geometries->at(i)) 00449 continue; 00450 if (geometries->at(i)->type==Geometry::GEOMETRY_TRIANGLE) 00451 { 00452 GeometryTriangles *geoTri = (GeometryTriangles*)geometries->at(i)->Clone(); 00453 std::vector<GeometryTriangles::Indice> * indices = &(geoTri->indices); 00454 GeometryTriangles::TriDescList *triDescList = &(geoTri->triDescList); 00455 std::vector<size_t> canTriangles, canLines, canPoints, canQuads; 00456 for (size_t j=0; j<geoTri->triDescList.size(); j++) 00457 { 00458 long count = long(((j+1<triDescList->size())?triDescList->at(j+1).first:indices->size()) - triDescList->at(j).first); 00459 switch (triDescList->at(j).second) 00460 { 00461 case GeometryTriangles::TRI_STRIP: 00462 if (count==4) 00463 { 00465 /* //convert to QUAD 00466 size_t itmp=triDescList->at(j).first+2; 00467 GeometryTriangles::Indice tmp=indices->at(itmp); 00468 indices->at(itmp)=indices->at(itmp+1); 00469 indices->at(itmp+1)=tmp; 00470 triDescList->at(j).second=GeometryTriangles::QUADS; 00471 canQuads.push_back(j);*/ 00472 break; 00473 } 00474 case GeometryTriangles::TRI_FAN: 00475 case GeometryTriangles::POLYGON: 00476 if (count==3) 00477 canTriangles.push_back(j); 00478 else if (count==4) 00479 canQuads.push_back(j); 00480 break; 00481 case GeometryTriangles::TRI_LIST: 00482 canTriangles.push_back(j); 00483 break; 00484 case GeometryTriangles::LINE_STRIP: 00485 if (count!=2) 00486 break; 00487 case GeometryTriangles::LINES: 00488 canLines.push_back(j); 00489 break; 00490 case GeometryTriangles::POINTS: 00491 canPoints.push_back(j); 00492 break; 00493 case GeometryTriangles::QUADS: 00494 canQuads.push_back(j); 00495 break; 00496 } 00497 } 00498 //really merge 00499 std::vector<GeometryTriangles::Indice> nind; 00500 GeometryTriangles::TriDescList ntriD; 00501 std::vector<bool> primUsed; 00502 primUsed.insert(primUsed.end(), triDescList->size(), false); 00503 mergePrimitive(canTriangles, GeometryTriangles::TRI_LIST, ntriD, triDescList, nind, primUsed, indices, delCount); 00504 mergePrimitive(canLines, GeometryTriangles::LINES, ntriD, triDescList, nind, primUsed, indices, delCount); 00505 mergePrimitive(canPoints, GeometryTriangles::POINTS, ntriD, triDescList, nind, primUsed, indices, delCount); 00506 mergePrimitive(canQuads, GeometryTriangles::QUADS, ntriD, triDescList, nind, primUsed, indices, delCount); 00507 if (ntriD.size()>0) 00508 { 00509 for (size_t j=0; j<triDescList->size(); j++) 00510 { 00511 if (primUsed[j]) 00512 continue; 00513 ntriD.push_back(triDescList->at(j)); 00514 ntriD.back().first=(GeometryTriangles::Indice)nind.size(); 00515 size_t last = (j+1<triDescList->size())?triDescList->at(j+1).first:indices->size(); 00516 for (size_t k=triDescList->at(j).first; k<last; k++) 00517 nind.push_back(indices->at(k)); 00518 } 00519 indices->assign(nind.begin(), nind.end()); 00520 triDescList->assign(ntriD.begin(), ntriD.end()); 00521 scene->AddGeometry(geoTri); 00522 if (TestExit()) 00523 return; 00524 } 00525 } 00526 } 00527 LOG(wxString::Format(wxT("<Optimize>mergePrimitivesAction merged %li primitives"), delCount)); 00528 }
| void Optimize::deleteNormalsAction | ( | SCENE_ID | _sceneID, | |
| wxString | mask | |||
| ) | [protected] |
Delete normals from scene
| [in] | _sceneID | Scene to be processed |
Definition at line 530 of file optimize.cpp.
00531 { 00532 Scene * scene = GetSceneMgr()->GetScene(_sceneID); 00533 if (!scene) 00534 return; 00535 00536 std::vector<wxString> maskList; 00537 parseMask(mask, maskList); 00538 long delCount=0; 00539 00540 std::vector<NODE_ID> nodes; 00541 scene->GetNodeIDs(&nodes); 00542 00543 for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin(); nodeIt != nodes.end(); nodeIt++) 00544 { 00545 const SceneNode * node = scene->GetNode(*nodeIt); 00546 if (node->IsOfType(SceneNode::GEOMETRY) && nameHasMask(node->GetName(),maskList)) 00547 { 00548 const Geometry *geom = scene->GetGeometry(((GeometryNode*)node)->GetGeometryID()); 00549 if (geom->type==Geometry::GEOMETRY_TRIANGLE) 00550 { 00551 GeometryTriangles *geoTri = (GeometryTriangles*)geom->Clone(); 00552 if (geoTri->normals.size()>0) 00553 { 00554 geoTri->normals.clear(); 00555 delCount++; 00556 scene->AddGeometry(geoTri); 00557 } 00558 } 00559 } 00560 } 00561 LOG(wxString::Format(wxT("<Optimize>deleteNormalsAction removed normals from %li nodes"), delCount)); 00562 }
| void Optimize::deleteTexCoordsAction | ( | SCENE_ID | _sceneID, | |
| wxString | mask | |||
| ) | [protected] |
Delete texture coordinates from scene
| [in] | _sceneID | Scene to be processed |
Definition at line 564 of file optimize.cpp.
00565 { 00566 Scene * scene = GetSceneMgr()->GetScene(_sceneID); 00567 if (!scene) 00568 return; 00569 00570 std::vector<wxString> maskList; 00571 parseMask(mask, maskList); 00572 long delCount=0; 00573 00574 std::vector<NODE_ID> nodes; 00575 scene->GetNodeIDs(&nodes); 00576 00577 for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin(); nodeIt != nodes.end(); nodeIt++) 00578 { 00579 const SceneNode * node = scene->GetNode(*nodeIt); 00580 if (node->IsOfType(SceneNode::GEOMETRY) && nameHasMask(node->GetName(),maskList)) 00581 { 00582 const Geometry *geom = scene->GetGeometry(((GeometryNode*)node)->GetGeometryID()); 00583 if (geom->type==Geometry::GEOMETRY_TRIANGLE) 00584 { 00585 GeometryTriangles *geoTri = (GeometryTriangles*)geom->Clone(); 00586 if (geoTri->texCoords.size()>0) 00587 { 00588 geoTri->texCoords.clear(); 00589 delCount++; 00590 scene->AddGeometry(geoTri); 00591 } 00592 } 00593 } 00594 } 00595 LOG(wxString::Format(wxT("<Optimize>deleteTexCoordsAction removed texture coordinates from %li nodes"), delCount)); 00596 }
| void Optimize::statisticsAction | ( | SCENE_ID | _sceneID | ) | [protected] |
Computes statistics about scene
| [in] | _sceneID | Scene to be processed |
Definition at line 598 of file optimize.cpp.
00599 { 00600 Scene * scene = GetSceneMgr()->GetScene(_sceneID); 00601 if (!scene) 00602 return; 00603 00604 std::vector<NODE_ID> nodes; 00605 scene->GetNodeIDs(&nodes); 00606 00607 long ass = 0, geo = 0, lig = 0, cam = 0; 00608 for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin(); nodeIt != nodes.end(); nodeIt++) 00609 { 00610 switch (scene->GetNode(*nodeIt)->GetType()) 00611 { 00612 case SceneNode::ASSEMBLY: 00613 ass++; 00614 break; 00615 case SceneNode::GEOMETRY: 00616 geo++; 00617 break; 00618 case SceneNode::CAMERA: 00619 cam++; 00620 break; 00621 case SceneNode::LIGHT: 00622 lig++; 00623 break; 00624 } 00625 } 00626 00627 long geos = 0, ver = 0, nor = 0, tco = 0, ind = 0, fac = 0; 00628 long tri = 0, fan = 0, str = 0, pol = 0, lin = 0, lli = 0, poi = 0, qua = 0; 00629 long tris = 0; 00630 const Scene::GeometryList *geometries = scene->GetGeometries(); 00631 for (size_t i=0; i<geometries->size(); i++) 00632 { 00633 if (geometries->at(i)) 00634 geos++; 00635 else 00636 continue; 00637 if (geometries->at(i)->type==Geometry::GEOMETRY_TRIANGLE) 00638 { 00639 GeometryTriangles *geoTri = (GeometryTriangles*)geometries->at(i); 00640 ver+=long(geoTri->vertices.size()); 00641 nor+=long(geoTri->normals.size()); 00642 tco+=long(geoTri->texCoords.size()); 00643 ind+=long(geoTri->indices.size()); 00644 fac+=long(geoTri->triDescList.size()); 00645 for (size_t j=0; j<geoTri->triDescList.size(); j++) 00646 { 00647 long count = long(((j+1<geoTri->triDescList.size())?geoTri->triDescList.at(j+1).first:geoTri->indices.size()) - geoTri->triDescList.at(j).first); 00648 switch (geoTri->triDescList.at(j).second) 00649 { 00650 case GeometryTriangles::TRI_LIST: 00651 tri++; 00652 tris+=count/3; 00653 break; 00654 case GeometryTriangles::TRI_FAN: 00655 tris+=count-2; 00656 fan++; 00657 break; 00658 case GeometryTriangles::TRI_STRIP: 00659 tris+=count-2; 00660 str++; 00661 break; 00662 case GeometryTriangles::POLYGON: 00663 tris+=count-2; 00664 pol++; 00665 break; 00666 case GeometryTriangles::LINES: 00667 lin++; 00668 break; 00669 case GeometryTriangles::LINE_STRIP: 00670 lli++; 00671 break; 00672 case GeometryTriangles::POINTS: 00673 poi++; 00674 break; 00675 case GeometryTriangles::QUADS: 00676 tris+=count/2; 00677 qua++; 00678 break; 00679 } 00680 } 00681 } 00682 } 00683 long mat = 0, sha = 0, tex = 0; 00684 const Scene::MaterialList *materials = scene->GetMaterials(); 00685 for (size_t i=0; i<materials->size(); i++) 00686 { 00687 if (scene->GetMaterial((MATERIAL_ID)i)) 00688 { 00689 mat++; 00690 if (scene->GetMaterial((MATERIAL_ID)i)->shader) 00691 sha++; 00692 if (!scene->GetMaterial((MATERIAL_ID)i)->imageName.IsEmpty()) 00693 tex++; 00694 } 00695 } 00696 wxString result(wxString::Format(wxT("<Optimize>statistics, scene=%i ("), _sceneID)); 00697 result+=scene->GetName()+wxT(")\n"); 00698 result+=wxString::Format(wxT("Nodes=%li, ASSEMBLY=%li, GEOMETRY=%li, CAMERA=%li, LIGHT=%li\n"), nodes.size(), ass, geo, cam, lig); 00699 result+=wxString::Format(wxT("Geometries=%li, Vertices=%li, Normals=%li, TexCoords=%li, Indices=%li, Faces=%li\n"),geos, ver, nor, tco, ind, fac); 00700 result+=wxString::Format(wxT("Materials=%li, Shaders=%li, Textures=%li, Triangles=%li\n"), mat, sha, tex, tris); 00701 result+=wxString::Format(wxT("TRI_LIST=%li, TRI_FAN=%li, TRI_STRIP=%li, POLYGON=%li, LINES=%li, LINE_STRIP=%li, POINTS=%li, QUADS=%li\n"), tri, fan, str, pol, lin, lli, poi, qua); 00702 LOG(result); 00703 }
| virtual void VRUT::Optimize::processEvent | ( | wxCommandEvent & | evt | ) | [inline, protected, virtual] |
Overload this to process events you need.
Always call base method
Remember to process registered param update events
Reimplemented from VRUT::SceneModule.
Definition at line 125 of file optimize.h.
00126 { 00128 SceneModule::processEvent(evt); 00129 00130 switch (evt.GetEventType()) 00131 { 00133 case Event::EVT_PARAM_SET: 00134 { 00135 UPDATE_PARAM_FROM_EVENT_STRING(nameMaskParamID, nameMask, evt); 00136 00137 if (Parameter::ParameterIdentificator::FromEvent(evt) == deleteActionParamID) 00138 deleteAction(sceneID, nameMask); 00139 if (Parameter::ParameterIdentificator::FromEvent(evt) == simplifyStructureActionParamID) 00140 simplifyStructureAction(sceneID, nameMask); 00141 if (Parameter::ParameterIdentificator::FromEvent(evt) == removeUnusedMaterialsActionParamID) 00142 removeUnusedMaterialsAction(sceneID); 00143 if (Parameter::ParameterIdentificator::FromEvent(evt) == unifyMaterialsActionParamID) 00144 unifyMaterialsAction(sceneID); 00145 if (Parameter::ParameterIdentificator::FromEvent(evt) == unifyVerticesActionParamID) 00146 unifyVerticesAction(sceneID); 00147 if (Parameter::ParameterIdentificator::FromEvent(evt) == removeUnusedGeometriesActionParamID) 00148 removeUnusedGeometriesAction(sceneID); 00149 if (Parameter::ParameterIdentificator::FromEvent(evt) == mergePrimitivesActionParamID) 00150 mergePrimitivesAction(sceneID); 00151 if (Parameter::ParameterIdentificator::FromEvent(evt) == deleteNormalsActionParamID) 00152 deleteNormalsAction(sceneID, nameMask); 00153 if (Parameter::ParameterIdentificator::FromEvent(evt) == deleteTexCoordsActionParamID) 00154 deleteTexCoordsAction(sceneID, nameMask); 00155 if (Parameter::ParameterIdentificator::FromEvent(evt) == statisticsActionParamID) 00156 statisticsAction(sceneID); 00157 break; 00158 } 00159 } 00160 }
| virtual wxString VRUT::Optimize::GetDesc | ( | ) | const [inline, virtual] |
Always overload method giving description for your module.
Implements VRUT::Module.
Definition at line 185 of file optimize.h.
wxString VRUT::Optimize::nameMask [protected] |
Add nameMask param identificator to register this as parameter.
Definition at line 35 of file optimize.h.
Add delete push button param identificator to register this as parameter.
Definition at line 38 of file optimize.h.
Add simplifyStructure push button param identificator to register this as parameter.
Definition at line 41 of file optimize.h.
Add removeUnusedMaterials push button param identificator to register this as parameter.
Definition at line 44 of file optimize.h.
Add unifyMaterials push button param identificator to register this as parameter.
Definition at line 47 of file optimize.h.
Add unifyVertices push button param identificator to register this as parameter.
Definition at line 50 of file optimize.h.
Add removeUnusedGeometries push button param identificator to register this as parameter.
Definition at line 53 of file optimize.h.
Add mergePrimitives push button param identificator to register this as parameter.
Definition at line 56 of file optimize.h.
Add deleteNormals push button param identificator to register this as parameter.
Definition at line 59 of file optimize.h.
Add deleteTexCoords push button param identificator to register this as parameter.
Definition at line 62 of file optimize.h.
Add statistics push button param identificator to register this as parameter.
Definition at line 65 of file optimize.h.
1.5.5