Browse Source

Merge branch 'release/1.10.x'

rdb 4 years ago
parent
commit
f8df5cac32
3 changed files with 42 additions and 14 deletions
  1. 17 10
      direct/src/task/Task.py
  2. 23 4
      panda/src/pgraph/geomNode.cxx
  3. 2 0
      panda/src/pgraph/lightAttrib.cxx

+ 17 - 10
direct/src/task/Task.py

@@ -127,6 +127,8 @@ class TaskManager:
         self.destroyed = False
         self.fKeyboardInterrupt = False
         self.interruptCount = 0
+        if signal:
+            self.__prevHandler = signal.default_int_handler
 
         self._frameProfileQueue = []
 
@@ -168,7 +170,7 @@ class TaskManager:
         print('*** allowing mid-frame keyboard interrupt.')
         # Restore default interrupt handler
         if signal:
-            signal.signal(signal.SIGINT, signal.default_int_handler)
+            signal.signal(signal.SIGINT, self.__prevHandler)
         # and invoke it
         raise KeyboardInterrupt
 
@@ -475,25 +477,30 @@ class TaskManager:
         chains that are in sub-threads or that have frame budgets
         might execute their tasks differently. """
 
+        startFrameTime = self.globalClock.getRealTime()
+
         # Replace keyboard interrupt handler during task list processing
         # so we catch the keyboard interrupt but don't handle it until
         # after task list processing is complete.
         self.fKeyboardInterrupt = 0
         self.interruptCount = 0
+
         if signal:
-            signal.signal(signal.SIGINT, self.keyboardInterruptHandler)
+            self.__prevHandler = signal.signal(signal.SIGINT, self.keyboardInterruptHandler)
 
-        startFrameTime = self.globalClock.getRealTime()
+        try:
+            self.mgr.poll()
 
-        self.mgr.poll()
+            # This is the spot for an internal yield function
+            nextTaskTime = self.mgr.getNextWakeTime()
+            self.doYield(startFrameTime, nextTaskTime)
 
-        # This is the spot for an internal yield function
-        nextTaskTime = self.mgr.getNextWakeTime()
-        self.doYield(startFrameTime, nextTaskTime)
+        finally:
+            # Restore previous interrupt handler
+            if signal:
+                signal.signal(signal.SIGINT, self.__prevHandler)
+                self.__prevHandler = signal.default_int_handler
 
-        # Restore default interrupt handler
-        if signal:
-            signal.signal(signal.SIGINT, signal.default_int_handler)
         if self.fKeyboardInterrupt:
             raise KeyboardInterrupt
 

+ 23 - 4
panda/src/pgraph/geomNode.cxx

@@ -881,17 +881,36 @@ do_premunge(GraphicsStateGuardianBase *gsg,
             GeomTransformer &transformer) {
   Thread *current_thread = Thread::get_current_thread();
 
+  // Cache munged vertex data, so that we don't duplicate vertex data
+  // unnecessarily.
+  std::map<CPT(GeomVertexData), CPT(GeomVertexData)> munged_vdata;
+
   OPEN_ITERATE_CURRENT_AND_UPSTREAM(_cycler, current_thread) {
     CDStageWriter cdata(_cycler, pipeline_stage, current_thread);
 
-    GeomList::iterator gi;
     PT(GeomList) geoms = cdata->modify_geoms();
-    for (gi = geoms->begin(); gi != geoms->end(); ++gi) {
-      GeomEntry &entry = (*gi);
+    for (GeomEntry &entry : *geoms) {
       CPT(RenderState) geom_state = node_state->compose(entry._state);
       CPT(Geom) geom = entry._geom.get_read_pointer();
       PT(GeomMunger) munger = gsg->get_geom_munger(geom_state, current_thread);
-      entry._geom = transformer.premunge_geom(geom, munger);
+
+      CPT(GeomVertexData) vdata = geom->get_vertex_data();
+
+      auto it = munged_vdata.find(vdata);
+      if (it != munged_vdata.end()) {
+        vdata = it->second;
+      } else {
+        CPT(GeomVertexData) old_vdata = std::move(vdata);
+        vdata = munger->premunge_data(old_vdata);
+        munged_vdata[std::move(old_vdata)] = vdata;
+      }
+
+      CPT(Geom) pgeom = geom;
+      munger->premunge_geom(pgeom, vdata);
+
+      PT(Geom) geom_copy = pgeom->make_copy();
+      geom_copy->set_vertex_data(vdata);
+      entry._geom = std::move(geom_copy);
     }
   }
   CLOSE_ITERATE_CURRENT_AND_UPSTREAM(_cycler);

+ 2 - 0
panda/src/pgraph/lightAttrib.cxx

@@ -469,6 +469,7 @@ replace_on_light(const NodePath &source, const NodePath &dest) const {
     slobj->attrib_unref();
 
     *it = dest;
+    attrib->_on_lights.sort();
   }
   return return_new(attrib);
 }
@@ -531,6 +532,7 @@ replace_off_light(const NodePath &source, const NodePath &dest) const {
     slobj->attrib_unref();
 
     *it = dest;
+    attrib->_off_lights.sort();
   }
   return return_new(attrib);
 }