mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 00:32:57 -04:00
Merge branch 'release/1.10.x'
This commit is contained in:
commit
f8df5cac32
@ -127,6 +127,8 @@ class TaskManager:
|
|||||||
self.destroyed = False
|
self.destroyed = False
|
||||||
self.fKeyboardInterrupt = False
|
self.fKeyboardInterrupt = False
|
||||||
self.interruptCount = 0
|
self.interruptCount = 0
|
||||||
|
if signal:
|
||||||
|
self.__prevHandler = signal.default_int_handler
|
||||||
|
|
||||||
self._frameProfileQueue = []
|
self._frameProfileQueue = []
|
||||||
|
|
||||||
@ -168,7 +170,7 @@ class TaskManager:
|
|||||||
print('*** allowing mid-frame keyboard interrupt.')
|
print('*** allowing mid-frame keyboard interrupt.')
|
||||||
# Restore default interrupt handler
|
# Restore default interrupt handler
|
||||||
if signal:
|
if signal:
|
||||||
signal.signal(signal.SIGINT, signal.default_int_handler)
|
signal.signal(signal.SIGINT, self.__prevHandler)
|
||||||
# and invoke it
|
# and invoke it
|
||||||
raise KeyboardInterrupt
|
raise KeyboardInterrupt
|
||||||
|
|
||||||
@ -475,25 +477,30 @@ class TaskManager:
|
|||||||
chains that are in sub-threads or that have frame budgets
|
chains that are in sub-threads or that have frame budgets
|
||||||
might execute their tasks differently. """
|
might execute their tasks differently. """
|
||||||
|
|
||||||
|
startFrameTime = self.globalClock.getRealTime()
|
||||||
|
|
||||||
# Replace keyboard interrupt handler during task list processing
|
# Replace keyboard interrupt handler during task list processing
|
||||||
# so we catch the keyboard interrupt but don't handle it until
|
# so we catch the keyboard interrupt but don't handle it until
|
||||||
# after task list processing is complete.
|
# after task list processing is complete.
|
||||||
self.fKeyboardInterrupt = 0
|
self.fKeyboardInterrupt = 0
|
||||||
self.interruptCount = 0
|
self.interruptCount = 0
|
||||||
|
|
||||||
if signal:
|
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
|
finally:
|
||||||
nextTaskTime = self.mgr.getNextWakeTime()
|
# Restore previous interrupt handler
|
||||||
self.doYield(startFrameTime, nextTaskTime)
|
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:
|
if self.fKeyboardInterrupt:
|
||||||
raise KeyboardInterrupt
|
raise KeyboardInterrupt
|
||||||
|
|
||||||
|
@ -881,17 +881,36 @@ do_premunge(GraphicsStateGuardianBase *gsg,
|
|||||||
GeomTransformer &transformer) {
|
GeomTransformer &transformer) {
|
||||||
Thread *current_thread = Thread::get_current_thread();
|
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) {
|
OPEN_ITERATE_CURRENT_AND_UPSTREAM(_cycler, current_thread) {
|
||||||
CDStageWriter cdata(_cycler, pipeline_stage, current_thread);
|
CDStageWriter cdata(_cycler, pipeline_stage, current_thread);
|
||||||
|
|
||||||
GeomList::iterator gi;
|
|
||||||
PT(GeomList) geoms = cdata->modify_geoms();
|
PT(GeomList) geoms = cdata->modify_geoms();
|
||||||
for (gi = geoms->begin(); gi != geoms->end(); ++gi) {
|
for (GeomEntry &entry : *geoms) {
|
||||||
GeomEntry &entry = (*gi);
|
|
||||||
CPT(RenderState) geom_state = node_state->compose(entry._state);
|
CPT(RenderState) geom_state = node_state->compose(entry._state);
|
||||||
CPT(Geom) geom = entry._geom.get_read_pointer();
|
CPT(Geom) geom = entry._geom.get_read_pointer();
|
||||||
PT(GeomMunger) munger = gsg->get_geom_munger(geom_state, current_thread);
|
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);
|
CLOSE_ITERATE_CURRENT_AND_UPSTREAM(_cycler);
|
||||||
|
@ -469,6 +469,7 @@ replace_on_light(const NodePath &source, const NodePath &dest) const {
|
|||||||
slobj->attrib_unref();
|
slobj->attrib_unref();
|
||||||
|
|
||||||
*it = dest;
|
*it = dest;
|
||||||
|
attrib->_on_lights.sort();
|
||||||
}
|
}
|
||||||
return return_new(attrib);
|
return return_new(attrib);
|
||||||
}
|
}
|
||||||
@ -531,6 +532,7 @@ replace_off_light(const NodePath &source, const NodePath &dest) const {
|
|||||||
slobj->attrib_unref();
|
slobj->attrib_unref();
|
||||||
|
|
||||||
*it = dest;
|
*it = dest;
|
||||||
|
attrib->_off_lights.sort();
|
||||||
}
|
}
|
||||||
return return_new(attrib);
|
return return_new(attrib);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user