Browse Source

limit cost of test_vref_integrity()

David Rose 15 years ago
parent
commit
326da19431
3 changed files with 40 additions and 30 deletions
  1. 6 0
      panda/src/egg/config_egg.cxx
  2. 1 0
      panda/src/egg/config_egg.h
  3. 33 30
      panda/src/egg/eggPrimitive.cxx

+ 6 - 0
panda/src/egg/config_egg.cxx

@@ -144,6 +144,12 @@ ConfigVariableDouble egg_coplanar_threshold
  PRC_DESC("The numerical threshold below which polygons are considered "
           "to be coplanar.  Determined empirically."));
 
+ConfigVariableInt egg_test_vref_integrity
+("egg-test-vref-integrity", 20,
+ PRC_DESC("The maximum number of vertices a primitive may have before "
+          "its vertices will no longer be checked for internal integrity.  "
+          "This is meaningful in non-production builds only."));
+
 ////////////////////////////////////////////////////////////////////
 //     Function: init_libegg
 //  Description: Initializes the library.  This must be called at

+ 1 - 0
panda/src/egg/config_egg.h

@@ -39,6 +39,7 @@ extern EXPCL_PANDAEGG ConfigVariableBool egg_consider_fans;
 extern EXPCL_PANDAEGG ConfigVariableDouble egg_max_tfan_angle;
 extern EXPCL_PANDAEGG ConfigVariableInt egg_min_tfan_tris;
 extern EXPCL_PANDAEGG ConfigVariableDouble egg_coplanar_threshold;
+extern EXPCL_PANDAEGG ConfigVariableInt egg_test_vref_integrity;
 
 extern EXPCL_PANDAEGG void init_libegg();
 

+ 33 - 30
panda/src/egg/eggPrimitive.cxx

@@ -17,6 +17,7 @@
 #include "eggMiscFuncs.h"
 #include "eggTextureCollection.h"
 #include "lexerDefs.h"
+#include "config_egg.h"
 
 #include "indent.h"
 #include "vector_int.h"
@@ -813,37 +814,39 @@ copy_vertices(const EggPrimitive &other) {
 void EggPrimitive::
 test_vref_integrity() const {
   test_ref_count_integrity();
-
-  // First, we need to know how many times each vertex appears.
-  // Usually, this will be only one, but it's possible for a vertex to
-  // appear more than once.
-  typedef pmap<const EggVertex *, int> VertexCount;
-  VertexCount _count;
-
-  // Now count up the vertices.
-  iterator vi;
-  for (vi = begin(); vi != end(); ++vi) {
-    const EggVertex *vert = *vi;
-    vert->test_ref_count_integrity();
-
-    VertexCount::iterator vci = _count.find(vert);
-    if (vci == _count.end()) {
-      _count[vert] = 1;
-    } else {
-      (*vci).second++;
+  
+  if ((int)size() <= egg_test_vref_integrity) {
+    // First, we need to know how many times each vertex appears.
+    // Usually, this will be only one, but it's possible for a vertex to
+    // appear more than once.
+    typedef pmap<const EggVertex *, int> VertexCount;
+    VertexCount _count;
+    
+    // Now count up the vertices.
+    iterator vi;
+    for (vi = begin(); vi != end(); ++vi) {
+      const EggVertex *vert = *vi;
+      vert->test_ref_count_integrity();
+      
+      VertexCount::iterator vci = _count.find(vert);
+      if (vci == _count.end()) {
+        _count[vert] = 1;
+      } else {
+        (*vci).second++;
+      }
+    }
+    
+    // Ok, now walk through the vertices found and make sure the vertex
+    // has the proper number of entries of this primitive in its pref.
+    VertexCount::iterator vci;
+    for (vci = _count.begin(); vci != _count.end(); ++vci) {
+      const EggVertex *vert = (*vci).first;
+      
+      int count = (*vci).second;
+      int vert_count = vert->has_pref(this);
+      
+      nassertv(count == vert_count);
     }
-  }
-
-  // Ok, now walk through the vertices found and make sure the vertex
-  // has the proper number of entries of this primitive in its pref.
-  VertexCount::iterator vci;
-  for (vci = _count.begin(); vci != _count.end(); ++vci) {
-    const EggVertex *vert = (*vci).first;
-
-    int count = (*vci).second;
-    int vert_count = vert->has_pref(this);
-
-    nassertv(count == vert_count);
   }
 }