diff --git a/direct/src/showbase/PythonUtil.py b/direct/src/showbase/PythonUtil.py index 0c850f51a0..2cd4e62d15 100644 --- a/direct/src/showbase/PythonUtil.py +++ b/direct/src/showbase/PythonUtil.py @@ -10,7 +10,7 @@ __all__ = ['indent', 'bound', 'clamp', 'lerp', 'average', 'addListsByValue', 'boolEqual', 'lineupPos', 'formatElapsedSeconds', 'solveQuadratic', 'findPythonModule', 'mostDerivedLast', -'weightedChoice', 'randFloat', 'normalDistrib', +'clampScalar', 'weightedChoice', 'randFloat', 'normalDistrib', 'weightedRand', 'randUint31', 'randInt32', 'SerialNumGen', 'serialNum', 'uniqueName', 'Enum', 'Singleton', 'SingletonError', 'printListEnum', 'safeRepr', @@ -178,27 +178,6 @@ class Queue: def __len__(self): return len(self.__list) -if __debug__ and __name__ == '__main__': - q = Queue() - assert q.isEmpty() - q.clear() - assert q.isEmpty() - q.push(10) - assert not q.isEmpty() - q.push(20) - assert not q.isEmpty() - assert len(q) == 2 - assert q.front() == 10 - assert q.back() == 20 - assert q.top() == 10 - assert q.top() == 10 - assert q.pop() == 10 - assert len(q) == 1 - assert not q.isEmpty() - assert q.pop() == 20 - assert len(q) == 0 - assert q.isEmpty() - def indent(stream, numIndents, str): """ @@ -1130,6 +1109,23 @@ def findPythonModule(module): return None +def clampScalar(value, a, b): + # calling this ought to be faster than calling both min and max + if a < b: + if value < a: + return a + elif value > b: + return b + else: + return value + else: + if value < b: + return b + elif value > a: + return a + else: + return value + def weightedChoice(choiceList, rng=random.random, sum=None): """given a list of (weight, item) pairs, chooses an item based on the weights. rng must return 0..1. if you happen to have the sum of the @@ -2313,36 +2309,6 @@ def flywheel(*args, **kArgs): pass return flywheel -if __debug__ and __name__ == '__main__': - f = flywheel(['a','b','c','d'], countList=[11,20,3,4]) - obj2count = {} - for obj in f: - obj2count.setdefault(obj, 0) - obj2count[obj] += 1 - assert obj2count['a'] == 11 - assert obj2count['b'] == 20 - assert obj2count['c'] == 3 - assert obj2count['d'] == 4 - - f = flywheel([1,2,3,4], countFunc=lambda x: x*2) - obj2count = {} - for obj in f: - obj2count.setdefault(obj, 0) - obj2count[obj] += 1 - assert obj2count[1] == 2 - assert obj2count[2] == 4 - assert obj2count[3] == 6 - assert obj2count[4] == 8 - - f = flywheel([1,2,3,4], countFunc=lambda x: x, scale = 3) - obj2count = {} - for obj in f: - obj2count.setdefault(obj, 0) - obj2count[obj] += 1 - assert obj2count[1] == 1 * 3 - assert obj2count[2] == 2 * 3 - assert obj2count[3] == 3 * 3 - assert obj2count[4] == 4 * 3 if __debug__: def quickProfile(name="unnamed"): @@ -2687,11 +2653,36 @@ def unescapeHtmlString(s): result += char return result -if __debug__ and __name__ == '__main__': - assert unescapeHtmlString('asdf') == 'asdf' - assert unescapeHtmlString('as+df') == 'as df' - assert unescapeHtmlString('as%32df') == 'as2df' - assert unescapeHtmlString('asdf%32') == 'asdf2' +class PriorityCallbacks: + """ manage a set of prioritized callbacks, and allow them to be invoked in order of priority """ + def __init__(self): + self._callbacks = [] + + def clear(self): + del self._callbacks[:] + + def add(self, callback, priority=None): + if priority is None: + priority = 0 + callbacks = self._callbacks + lo = 0 + hi = len(callbacks) + while lo < hi: + mid = (lo + hi) // 2 + if priority < callbacks[mid][0]: + hi = mid + else: + lo = mid + 1 + item = (priority, callback) + callbacks.insert(lo, item) + return item + + def remove(self, item): + self._callbacks.remove(item) + + def __call__(self): + for priority, callback in self._callbacks: + callback() builtins.Functor = Functor builtins.Stack = Stack diff --git a/direct/src/showbase/ShowBase.py b/direct/src/showbase/ShowBase.py index 367ae57d1a..13b9839255 100644 --- a/direct/src/showbase/ShowBase.py +++ b/direct/src/showbase/ShowBase.py @@ -2672,15 +2672,18 @@ class ShowBase(DirectObject.DirectObject): output file name (e.g. if sd = 4, movie_0001.png) - source is the Window, Buffer, DisplayRegion, or Texture from which to save the resulting images. The default is the main window. + + The task is returned, so that it can be awaited. """ globalClock.setMode(ClockObject.MNonRealTime) globalClock.setDt(1.0/float(fps)) - t = taskMgr.add(self._movieTask, namePrefix + '_task') + t = self.taskMgr.add(self._movieTask, namePrefix + '_task') t.frameIndex = 0 # Frame 0 is not captured. t.numFrames = int(duration * fps) t.source = source t.outputString = namePrefix + '_%0' + repr(sd) + 'd.' + format t.setUponDeath(lambda state: globalClock.setMode(ClockObject.MNormal)) + return t def _movieTask(self, state): if state.frameIndex != 0: diff --git a/direct/src/showbase/Transitions.py b/direct/src/showbase/Transitions.py index e26d0e93ec..5c449c6997 100644 --- a/direct/src/showbase/Transitions.py +++ b/direct/src/showbase/Transitions.py @@ -23,7 +23,9 @@ class Transitions: scale=3.0, pos=Vec3(0, 0, 0)): self.transitionIval = None + self.__transitionFuture = None self.letterboxIval = None + self.__letterboxFuture = None self.iris = None self.fade = None self.letterbox = None @@ -94,7 +96,9 @@ class Transitions: """ #self.noTransitions() masad: this creates a one frame pop, is it necessary? self.loadFade() - transitionIval = Sequence(Func(self.fade.reparentTo, aspect2d, DGG.FADE_SORT_INDEX), + + parent = aspect2d if self.fadeModel else render2d + transitionIval = Sequence(Func(self.fade.reparentTo, parent, DGG.FADE_SORT_INDEX), Func(self.fade.showThrough), # in case aspect2d is hidden for some reason self.lerpFunc(self.fade, t, self.alphaOff, @@ -115,7 +119,8 @@ class Transitions: self.noTransitions() self.loadFade() - transitionIval = Sequence(Func(self.fade.reparentTo,aspect2d,DGG.FADE_SORT_INDEX), + parent = aspect2d if self.fadeModel else render2d + transitionIval = Sequence(Func(self.fade.reparentTo, parent, DGG.FADE_SORT_INDEX), Func(self.fade.showThrough), # in case aspect2d is hidden for some reason self.lerpFunc(self.fade, t, self.alphaOn, @@ -148,11 +153,17 @@ class Transitions: self.noTransitions() self.loadFade() self.fade.detachNode() + fut = AsyncFuture() + fut.setResult(None) + return fut else: # Create a sequence that lerps the color out, then # parents the fade to hidden self.transitionIval = self.getFadeInIval(t, finishIval) + self.transitionIval.append(Func(self.__finishTransition)) + self.__transitionFuture = AsyncFuture() self.transitionIval.start() + return self.__transitionFuture def fadeOut(self, t=0.5, finishIval=None): """ @@ -167,7 +178,9 @@ class Transitions: # Fade out immediately with no lerp self.noTransitions() self.loadFade() - self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) + + parent = aspect2d if self.fadeModel else render2d + self.fade.reparentTo(parent, DGG.FADE_SORT_INDEX) self.fade.setColor(self.alphaOn) elif ConfigVariableBool('no-loading-screen', False): if finishIval: @@ -176,8 +189,16 @@ class Transitions: else: # Create a sequence that lerps the color out, then # parents the fade to hidden - self.transitionIval = self.getFadeOutIval(t,finishIval) + self.transitionIval = self.getFadeOutIval(t, finishIval) + self.transitionIval.append(Func(self.__finishTransition)) + self.__transitionFuture = AsyncFuture() self.transitionIval.start() + return self.__transitionFuture + + # Immediately done, so return a dummy future. + fut = AsyncFuture() + fut.setResult(None) + return fut def fadeOutActive(self): return self.fade and self.fade.getColor()[3] > 0 @@ -191,7 +212,9 @@ class Transitions: #print "transitiosn: fadeScreen" self.noTransitions() self.loadFade() - self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) + + parent = aspect2d if self.fadeModel else render2d + self.fade.reparentTo(parent, DGG.FADE_SORT_INDEX) self.fade.setColor(self.alphaOn[0], self.alphaOn[1], self.alphaOn[2], @@ -206,7 +229,9 @@ class Transitions: #print "transitiosn: fadeScreenColor" self.noTransitions() self.loadFade() - self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) + + parent = aspect2d if self.fadeModel else render2d + self.fade.reparentTo(parent, DGG.FADE_SORT_INDEX) self.fade.setColor(color) def noFade(self): @@ -217,6 +242,9 @@ class Transitions: if self.transitionIval: self.transitionIval.pause() self.transitionIval = None + if self.__transitionFuture: + self.__transitionFuture.cancel() + self.__transitionFuture = None if self.fade: # Make sure to reset the color, since fadeOutActive() is looking at it self.fade.setColor(self.alphaOff) @@ -247,18 +275,25 @@ class Transitions: self.loadIris() if (t == 0): self.iris.detachNode() + fut = AsyncFuture() + fut.setResult(None) + return fut else: self.iris.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) + scale = 0.18 * max(base.a2dRight, base.a2dTop) self.transitionIval = Sequence(LerpScaleInterval(self.iris, t, - scale = 0.18, + scale = scale, startScale = 0.01), Func(self.iris.detachNode), + Func(self.__finishTransition), name = self.irisTaskName, ) + self.__transitionFuture = AsyncFuture() if finishIval: self.transitionIval.append(finishIval) self.transitionIval.start() + return self.__transitionFuture def irisOut(self, t=0.5, finishIval=None): """ @@ -274,20 +309,27 @@ class Transitions: if (t == 0): self.iris.detachNode() self.fadeOut(0) + fut = AsyncFuture() + fut.setResult(None) + return fut else: self.iris.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) + scale = 0.18 * max(base.a2dRight, base.a2dTop) self.transitionIval = Sequence(LerpScaleInterval(self.iris, t, scale = 0.01, - startScale = 0.18), + startScale = scale), Func(self.iris.detachNode), # Use the fade to cover up the hole that the iris would leave Func(self.fadeOut, 0), + Func(self.__finishTransition), name = self.irisTaskName, ) + self.__transitionFuture = AsyncFuture() if finishIval: self.transitionIval.append(finishIval) self.transitionIval.start() + return self.__transitionFuture def noIris(self): """ @@ -311,6 +353,11 @@ class Transitions: # Letterbox is not really a transition, it is a screen overlay # self.noLetterbox() + def __finishTransition(self): + if self.__transitionFuture: + self.__transitionFuture.setResult(None) + self.__transitionFuture = None + ################################################## # Letterbox ################################################## @@ -383,9 +430,17 @@ class Transitions: if self.letterboxIval: self.letterboxIval.pause() self.letterboxIval = None + if self.__letterboxFuture: + self.__letterboxFuture.cancel() + self.__letterboxFuture = None if self.letterbox: self.letterbox.stash() + def __finishLetterbox(self): + if self.__letterboxFuture: + self.__letterboxFuture.setResult(None) + self.__letterboxFuture = None + def letterboxOn(self, t=0.25, finishIval=None): """ Move black bars in over t seconds. @@ -396,7 +451,11 @@ class Transitions: if (t == 0): self.letterboxBottom.setPos(0, 0, -1) self.letterboxTop.setPos(0, 0, 0.8) + fut = AsyncFuture() + fut.setResult(None) + return fut else: + self.__letterboxFuture = AsyncFuture() self.letterboxIval = Sequence(Parallel( LerpPosInterval(self.letterboxBottom, t, @@ -409,11 +468,13 @@ class Transitions: # startPos = Vec3(0, 0, 1), ), ), + Func(self.__finishLetterbox), name = self.letterboxTaskName, ) if finishIval: self.letterboxIval.append(finishIval) self.letterboxIval.start() + return self.__letterboxFuture def letterboxOff(self, t=0.25, finishIval=None): """ @@ -424,7 +485,11 @@ class Transitions: self.letterbox.unstash() if (t == 0): self.letterbox.stash() + fut = AsyncFuture() + fut.setResult(None) + return fut else: + self.__letterboxFuture = AsyncFuture() self.letterboxIval = Sequence(Parallel( LerpPosInterval(self.letterboxBottom, t, @@ -438,9 +503,11 @@ class Transitions: ), ), Func(self.letterbox.stash), + Func(self.__finishLetterbox), Func(messenger.send,'letterboxOff'), name = self.letterboxTaskName, ) if finishIval: self.letterboxIval.append(finishIval) self.letterboxIval.start() + return self.__letterboxFuture diff --git a/dtool/src/cppparser/cppEnumType.cxx b/dtool/src/cppparser/cppEnumType.cxx index 927488585d..fbc3a7df53 100644 --- a/dtool/src/cppparser/cppEnumType.cxx +++ b/dtool/src/cppparser/cppEnumType.cxx @@ -224,12 +224,24 @@ substitute_decl(CPPDeclaration::SubstDecl &subst, bool any_changed = false; for (size_t i = 0; i < _elements.size(); ++i) { - CPPInstance *elem_rep = - _elements[i]->substitute_decl(subst, current_scope, global_scope) - ->as_instance(); + // We don't just do substitute_decl on the instance, which could lead to + // an infinite recursion. + CPPInstance *element = _elements[i]; + CPPExpression *value = element->_initializer-> + substitute_decl(subst, current_scope, global_scope)->as_expression(); - if (elem_rep != _elements[i]) { - rep->_elements[i] = elem_rep; + if (is_scoped()) { + // For a strong enum, we consider the elements to be of this type. + if (value != element->_initializer) { + rep->_elements[i] = new CPPInstance(rep, element->_ident); + rep->_elements[i]->_initializer = value; + any_changed = true; + } + } else if (value != element->_initializer || + rep->get_underlying_type() != get_underlying_type()) { + // In an unscoped enum, the elements are integers. + rep->_elements[i] = new CPPInstance(rep->get_underlying_type(), element->_ident); + rep->_elements[i]->_initializer = value; any_changed = true; } } diff --git a/dtool/src/cppparser/cppExpression.cxx b/dtool/src/cppparser/cppExpression.cxx index adbbaea14e..139ac72d1b 100644 --- a/dtool/src/cppparser/cppExpression.cxx +++ b/dtool/src/cppparser/cppExpression.cxx @@ -81,7 +81,7 @@ as_integer() const { case RT_pointer: // We don't mind if this loses precision. - return (int)reinterpret_cast(_u._pointer); + return (int)(intptr_t)(_u._pointer); default: cerr << "Invalid type\n"; @@ -104,7 +104,7 @@ as_real() const { case RT_pointer: // We don't mind if this loses precision. - return (double)reinterpret_cast(_u._pointer); + return (double)(uintptr_t)(_u._pointer); default: cerr << "Invalid type\n"; @@ -120,10 +120,10 @@ void *CPPExpression::Result:: as_pointer() const { switch (_type) { case RT_integer: - return reinterpret_cast((long)_u._integer); + return (void *)(intptr_t)_u._integer; case RT_real: - return reinterpret_cast((long)_u._real); + return (void *)(uintptr_t)_u._real; case RT_pointer: return _u._pointer; diff --git a/dtool/src/dtoolbase/dtoolbase_cc.h b/dtool/src/dtoolbase/dtoolbase_cc.h index 6777ce5611..81968085bc 100644 --- a/dtool/src/dtoolbase/dtoolbase_cc.h +++ b/dtool/src/dtoolbase/dtoolbase_cc.h @@ -122,6 +122,11 @@ typedef ios::seekdir ios_seekdir; // Apple has an outdated libstdc++. Not all is lost, though, as we can fill // in some important missing functions. #if defined(__GLIBCXX__) && __GLIBCXX__ <= 20070719 +#include + +using std::tr1::tuple; +using std::tr1::tie; + typedef decltype(nullptr) nullptr_t; template struct remove_reference {typedef T type;}; diff --git a/makepanda/installer.nsi b/makepanda/installer.nsi index bd139f7083..39b7dd3518 100644 --- a/makepanda/installer.nsi +++ b/makepanda/installer.nsi @@ -368,7 +368,7 @@ SectionGroup "Python support" SetOutPath $INSTDIR\pandac\input File /r "${BUILT}\pandac\input\*" SetOutPath $INSTDIR\Pmw - File /r /x CVS "${BUILT}\Pmw\*" + File /nonfatal /r /x CVS "${BUILT}\Pmw\*" !ifdef REGVIEW SetRegView ${REGVIEW} diff --git a/makepanda/makepanda.py b/makepanda/makepanda.py index 5ae064b649..56ffecdbd5 100755 --- a/makepanda/makepanda.py +++ b/makepanda/makepanda.py @@ -3668,6 +3668,7 @@ if (not RUNTIME): OPTS=['DIR:panda/src/putil', 'ZLIB', 'PYTHON'] IGATEFILES=GetDirectoryContents('panda/src/putil', ["*.h", "*_composite*.cxx"]) IGATEFILES.remove("test_bam.h") + IGATEFILES.remove("config_util.h") TargetAdd('libp3putil.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3putil.in', opts=['IMOD:panda3d.core', 'ILIB:libp3putil', 'SRCDIR:panda/src/putil']) TargetAdd('libp3putil_igate.obj', input='libp3putil.in', opts=["DEPENDENCYONLY"]) @@ -3794,6 +3795,7 @@ if (not RUNTIME): OPTS=['DIR:panda/src/pstatclient', 'PYTHON'] IGATEFILES=GetDirectoryContents('panda/src/pstatclient', ["*.h", "*_composite*.cxx"]) + IGATEFILES.remove("config_pstats.h") TargetAdd('libp3pstatclient.in', opts=OPTS, input=IGATEFILES) TargetAdd('libp3pstatclient.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pstatclient', 'SRCDIR:panda/src/pstatclient']) TargetAdd('libp3pstatclient_igate.obj', input='libp3pstatclient.in', opts=["DEPENDENCYONLY"]) @@ -6110,9 +6112,9 @@ if not PkgSkip("PANDATOOL"): TargetAdd('pfm-trans.exe', opts=['ADVAPI']) TargetAdd('pfm-bba_pfmBba.obj', opts=OPTS, input='pfmBba.cxx') - TargetAdd('pfm-bba_config_pfm.obj', opts=OPTS, input='config_pfm.cxx') + TargetAdd('pfm-bba_config_pfmprogs.obj', opts=OPTS, input='config_pfmprogs.cxx') TargetAdd('pfm-bba.exe', input='pfm-bba_pfmBba.obj') - TargetAdd('pfm-bba.exe', input='pfm-bba_config_pfm.obj') + TargetAdd('pfm-bba.exe', input='pfm-bba_config_pfmprogs.obj') TargetAdd('pfm-bba.exe', input='libp3progbase.lib') TargetAdd('pfm-bba.exe', input='libp3pandatoolbase.lib') TargetAdd('pfm-bba.exe', input=COMMON_PANDA_LIBS) diff --git a/makepanda/makepanda.vcproj b/makepanda/makepanda.vcproj index c21322f94a..b8bdcbf07b 100644 --- a/makepanda/makepanda.vcproj +++ b/makepanda/makepanda.vcproj @@ -1228,7 +1228,7 @@ - + @@ -1307,7 +1307,7 @@ - + @@ -2322,8 +2322,8 @@ - - + + diff --git a/panda/metalibs/panda/panda.cxx b/panda/metalibs/panda/panda.cxx index d3a3b0c24a..8a193a8a28 100644 --- a/panda/metalibs/panda/panda.cxx +++ b/panda/metalibs/panda/panda.cxx @@ -11,7 +11,7 @@ #include "config_display.h" #include "config_pgraph.h" #ifdef DO_PSTATS -#include "config_pstats.h" +#include "config_pstatclient.h" #endif // By including checkPandaVersion.h, we guarantee that runtime attempts to diff --git a/panda/src/android/android_main.cxx b/panda/src/android/android_main.cxx index 0565ef5835..865936e2ed 100644 --- a/panda/src/android/android_main.cxx +++ b/panda/src/android/android_main.cxx @@ -12,7 +12,7 @@ */ #include "config_android.h" -#include "config_util.h" +#include "config_putil.h" #include "virtualFileMountAndroidAsset.h" #include "virtualFileSystem.h" #include "filename.h" diff --git a/panda/src/audio/audioManager.cxx b/panda/src/audio/audioManager.cxx index c09bbffc05..b52ceb50e5 100644 --- a/panda/src/audio/audioManager.cxx +++ b/panda/src/audio/audioManager.cxx @@ -18,7 +18,7 @@ #include "nullAudioManager.h" #include "windowsRegistry.h" #include "virtualFileSystem.h" -#include "config_util.h" +#include "config_putil.h" #include "load_dso.h" #ifdef WIN32 diff --git a/panda/src/audiotraits/fmodAudioManager.cxx b/panda/src/audiotraits/fmodAudioManager.cxx index cc1b8ecd0b..012fd103cd 100644 --- a/panda/src/audiotraits/fmodAudioManager.cxx +++ b/panda/src/audiotraits/fmodAudioManager.cxx @@ -20,7 +20,7 @@ // Panda headers. #include "config_audio.h" -#include "config_util.h" +#include "config_putil.h" #include "fmodAudioManager.h" #include "fmodAudioSound.h" #include "filename.h" diff --git a/panda/src/audiotraits/milesAudioManager.cxx b/panda/src/audiotraits/milesAudioManager.cxx index 750475dee1..c20ebd1a9a 100644 --- a/panda/src/audiotraits/milesAudioManager.cxx +++ b/panda/src/audiotraits/milesAudioManager.cxx @@ -21,7 +21,7 @@ #include "milesAudioStream.h" #include "globalMilesManager.h" #include "config_audio.h" -#include "config_util.h" +#include "config_putil.h" #include "config_express.h" #include "virtualFileSystem.h" #include "nullAudioSound.h" diff --git a/panda/src/audiotraits/openalAudioManager.cxx b/panda/src/audiotraits/openalAudioManager.cxx index 2ba02c2fa7..1a91185ecf 100644 --- a/panda/src/audiotraits/openalAudioManager.cxx +++ b/panda/src/audiotraits/openalAudioManager.cxx @@ -14,7 +14,7 @@ // Panda headers. #include "config_audio.h" -#include "config_util.h" +#include "config_putil.h" #include "config_express.h" #include "config_openalAudio.h" #include "openalAudioManager.h" diff --git a/panda/src/bullet/bulletWorld.cxx b/panda/src/bullet/bulletWorld.cxx index 9bfa707e9d..6098759581 100644 --- a/panda/src/bullet/bulletWorld.cxx +++ b/panda/src/bullet/bulletWorld.cxx @@ -1052,7 +1052,7 @@ BulletPersistentManifold *BulletWorld:: get_manifold(int idx) const { LightMutexHolder holder(get_global_lock()); - nassertr(idx < get_num_manifolds(), NULL); + nassertr(idx < _dispatcher->getNumManifolds(), NULL); btPersistentManifold *ptr = _dispatcher->getManifoldByIndexInternal(idx); return (ptr) ? new BulletPersistentManifold(ptr) : NULL; @@ -1186,7 +1186,12 @@ tick_callback(btDynamicsWorld *world, btScalar timestep) { CallbackObject *obj = w->_tick_callback_obj; if (obj) { BulletTickCallbackData cbdata(timestep); + // Release the global lock that we are holding during the tick callback + // and allow interactions with bullet world in the user callback + get_global_lock().release(); obj->do_callback(&cbdata); + // Acquire the global lock again and protect the execution + get_global_lock().acquire(); } } diff --git a/panda/src/collada/load_collada_file.cxx b/panda/src/collada/load_collada_file.cxx index bda9641c6f..1d849f0f79 100644 --- a/panda/src/collada/load_collada_file.cxx +++ b/panda/src/collada/load_collada_file.cxx @@ -16,7 +16,7 @@ #include "config_collada.h" #include "sceneGraphReducer.h" #include "virtualFileSystem.h" -#include "config_util.h" +#include "config_putil.h" #include "bamCacheRecord.h" static PT(PandaNode) diff --git a/panda/src/display/graphicsPipeSelection.cxx b/panda/src/display/graphicsPipeSelection.cxx index cef68b22c2..1134cc0553 100644 --- a/panda/src/display/graphicsPipeSelection.cxx +++ b/panda/src/display/graphicsPipeSelection.cxx @@ -19,7 +19,7 @@ #include "config_display.h" #include "typeRegistry.h" #include "pset.h" -#include "config_util.h" +#include "config_putil.h" #include diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index 5817b62e4a..5f282b82ce 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -58,7 +58,7 @@ #include "colorScaleAttrib.h" #include "clipPlaneAttrib.h" #include "fogAttrib.h" -#include "config_pstats.h" +#include "config_pstatclient.h" #include #include diff --git a/panda/src/display/pStatGPUTimer.h b/panda/src/display/pStatGPUTimer.h index f5185778ec..1e0accdc04 100644 --- a/panda/src/display/pStatGPUTimer.h +++ b/panda/src/display/pStatGPUTimer.h @@ -17,7 +17,7 @@ #include "pandabase.h" #include "pStatTimer.h" #include "pStatCollector.h" -#include "config_pstats.h" +#include "config_pstatclient.h" #include "timerQueryContext.h" class Thread; diff --git a/panda/src/downloader/httpChannel.I b/panda/src/downloader/httpChannel.I index ccc30d504d..1a254e478a 100644 --- a/panda/src/downloader/httpChannel.I +++ b/panda/src/downloader/httpChannel.I @@ -426,6 +426,23 @@ get_max_updates_per_second() const { return _max_updates_per_second; } +/** + * Specifies the Content-Type header, useful for applications that require + * different types of content, such as JSON. + */ +INLINE void HTTPChannel:: +set_content_type(string content_type) { + _content_type = content_type; +} + +/** + * Returns the value of the Content-Type header. + */ +INLINE string HTTPChannel:: +get_content_type() const { + return _content_type; +} + /** * This may be called immediately after a call to get_document() or some * related function to specify the expected size of the document we are diff --git a/panda/src/downloader/httpChannel.cxx b/panda/src/downloader/httpChannel.cxx index a7eb5f58d3..93e04f1432 100644 --- a/panda/src/downloader/httpChannel.cxx +++ b/panda/src/downloader/httpChannel.cxx @@ -100,6 +100,7 @@ HTTPChannel(HTTPClient *client) : _response_type = RT_none; _http_version = _client->get_http_version(); _http_version_string = _client->get_http_version_string(); + _content_type = "application/x-www-form-urlencoded"; _state = S_new; _done_state = S_new; _started_download = false; @@ -3624,7 +3625,7 @@ make_header() { if (!_body.empty()) { stream - << "Content-Type: application/x-www-form-urlencoded\r\n" + << "Content-Type: " << _content_type << "\r\n" << "Content-Length: " << _body.length() << "\r\n"; } diff --git a/panda/src/downloader/httpChannel.h b/panda/src/downloader/httpChannel.h index b9131eba9a..7de0e17e83 100644 --- a/panda/src/downloader/httpChannel.h +++ b/panda/src/downloader/httpChannel.h @@ -143,6 +143,9 @@ PUBLISHED: INLINE void set_max_updates_per_second(double max_updates_per_second); INLINE double get_max_updates_per_second() const; + INLINE void set_content_type(string content_type); + INLINE string get_content_type() const; + INLINE void set_expected_file_size(size_t file_size); streamsize get_file_size() const; INLINE bool is_file_size_known() const; @@ -336,6 +339,7 @@ private: string request_path; string _header; string _body; + string _content_type; bool _want_ssl; bool _proxy_serves_document; bool _proxy_tunnel_now; diff --git a/panda/src/egg/eggData.cxx b/panda/src/egg/eggData.cxx index f81755f8d9..69eb4eb6e6 100644 --- a/panda/src/egg/eggData.cxx +++ b/panda/src/egg/eggData.cxx @@ -18,7 +18,7 @@ #include "eggComment.h" #include "eggPoolUniquifier.h" #include "config_egg.h" -#include "config_util.h" +#include "config_putil.h" #include "config_express.h" #include "string_utils.h" #include "dSearchPath.h" diff --git a/panda/src/egg2pg/load_egg_file.cxx b/panda/src/egg2pg/load_egg_file.cxx index a3a5dd5fbf..36b60bb92c 100644 --- a/panda/src/egg2pg/load_egg_file.cxx +++ b/panda/src/egg2pg/load_egg_file.cxx @@ -16,7 +16,7 @@ #include "config_egg2pg.h" #include "sceneGraphReducer.h" #include "virtualFileSystem.h" -#include "config_util.h" +#include "config_putil.h" #include "bamCacheRecord.h" static PT(PandaNode) diff --git a/panda/src/egg2pg/save_egg_file.cxx b/panda/src/egg2pg/save_egg_file.cxx index 520987da68..bda4205943 100644 --- a/panda/src/egg2pg/save_egg_file.cxx +++ b/panda/src/egg2pg/save_egg_file.cxx @@ -17,7 +17,7 @@ #include "modelRoot.h" #include "sceneGraphReducer.h" #include "virtualFileSystem.h" -#include "config_util.h" +#include "config_putil.h" /** * A convenience function; converts the indicated scene graph to an egg file diff --git a/panda/src/event/asyncTask.h b/panda/src/event/asyncTask.h index d514b2f5a3..9712daa0f5 100644 --- a/panda/src/event/asyncTask.h +++ b/panda/src/event/asyncTask.h @@ -119,6 +119,7 @@ protected: double _wake_time; int _sort; int _priority; + unsigned int _implicit_sort; State _state; Thread *_servicing_thread; diff --git a/panda/src/event/asyncTaskChain.cxx b/panda/src/event/asyncTaskChain.cxx index c7d732eca9..bb82e00f92 100644 --- a/panda/src/event/asyncTaskChain.cxx +++ b/panda/src/event/asyncTaskChain.cxx @@ -51,7 +51,8 @@ AsyncTaskChain(AsyncTaskManager *manager, const string &name) : _needs_cleanup(false), _current_frame(0), _time_in_frame(0.0), - _block_till_next_frame(false) + _block_till_next_frame(false), + _next_implicit_sort(0) { } @@ -418,6 +419,9 @@ do_add(AsyncTask *task) { task->_start_time = now; task->_start_frame = _manager->_clock->get_frame_count(); + // Remember the order in which tasks were added to the chain. + task->_implicit_sort = _next_implicit_sort++; + _manager->add_task_by_name(task); if (task->has_delay()) { diff --git a/panda/src/event/asyncTaskChain.h b/panda/src/event/asyncTaskChain.h index 512a7b9fa0..5f81f6c3dd 100644 --- a/panda/src/event/asyncTaskChain.h +++ b/panda/src/event/asyncTaskChain.h @@ -146,7 +146,12 @@ protected: if (a->get_priority() != b->get_priority()) { return a->get_priority() < b->get_priority(); } - return a->get_start_time() > b->get_start_time(); + if (a->get_start_time() != b->get_start_time()) { + return a->get_start_time() > b->get_start_time(); + } + // Failing any other ordering criteria, we sort the tasks based on the + // order in which they were added to the task chain. + return a->_implicit_sort > b->_implicit_sort; } }; @@ -186,6 +191,8 @@ protected: double _time_in_frame; bool _block_till_next_frame; + unsigned int _next_implicit_sort; + static PStatCollector _task_pcollector; static PStatCollector _wait_pcollector; diff --git a/panda/src/event/pythonTask.cxx b/panda/src/event/pythonTask.cxx index 996587885e..6a818ad19c 100644 --- a/panda/src/event/pythonTask.cxx +++ b/panda/src/event/pythonTask.cxx @@ -94,6 +94,9 @@ PythonTask:: PyErr_Restore(_exception, _exc_value, _exc_traceback); PyErr_Print(); PyErr_Restore(nullptr, nullptr, nullptr); + _exception = nullptr; + _exc_value = nullptr; + _exc_traceback = nullptr; } #endif diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index 97917acee0..c4dd42ceb3 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -14,7 +14,7 @@ * get_supports_cg_profile) */ -#include "config_util.h" +#include "config_putil.h" #include "displayRegion.h" #include "renderBuffer.h" #include "geom.h" @@ -12647,7 +12647,7 @@ upload_texture_image(CLP(TextureContext) *gtc, bool needs_reload, int depth = tex->get_expected_mipmap_z_size(mipmap_bias); // Determine the number of images to upload. - int num_levels = 1; + int num_levels = mipmap_bias + 1; if (uses_mipmaps) { num_levels = tex->get_expected_num_mipmap_levels(); } diff --git a/panda/src/gobj/config_gobj.cxx b/panda/src/gobj/config_gobj.cxx index d152f6ebcf..b7d0e02eb5 100644 --- a/panda/src/gobj/config_gobj.cxx +++ b/panda/src/gobj/config_gobj.cxx @@ -13,7 +13,7 @@ #include "animateVerticesRequest.h" #include "bufferContext.h" -#include "config_util.h" +#include "config_putil.h" #include "config_gobj.h" #include "geom.h" #include "geomCacheEntry.h" diff --git a/panda/src/gobj/shader.cxx b/panda/src/gobj/shader.cxx index add7acef2f..35fd3ce560 100644 --- a/panda/src/gobj/shader.cxx +++ b/panda/src/gobj/shader.cxx @@ -19,7 +19,7 @@ #include "shader.h" #include "preparedGraphicsObjects.h" #include "virtualFileSystem.h" -#include "config_util.h" +#include "config_putil.h" #include "bamCache.h" #include "string_utils.h" diff --git a/panda/src/gobj/texture.cxx b/panda/src/gobj/texture.cxx index 5328b921d9..fa85fd44f0 100644 --- a/panda/src/gobj/texture.cxx +++ b/panda/src/gobj/texture.cxx @@ -16,7 +16,7 @@ #include "pandabase.h" #include "texture.h" #include "config_gobj.h" -#include "config_util.h" +#include "config_putil.h" #include "texturePool.h" #include "textureContext.h" #include "bamCache.h" diff --git a/panda/src/gobj/texturePool.cxx b/panda/src/gobj/texturePool.cxx index dd850c98ad..6b4c0a5168 100644 --- a/panda/src/gobj/texturePool.cxx +++ b/panda/src/gobj/texturePool.cxx @@ -15,7 +15,7 @@ #include "texturePool.h" #include "config_gobj.h" -#include "config_util.h" +#include "config_putil.h" #include "config_express.h" #include "string_utils.h" #include "virtualFileSystem.h" diff --git a/panda/src/iphonedisplay/iPhoneGraphicsWindow.mm b/panda/src/iphonedisplay/iPhoneGraphicsWindow.mm index cae0463e6b..07be09f580 100644 --- a/panda/src/iphonedisplay/iPhoneGraphicsWindow.mm +++ b/panda/src/iphonedisplay/iPhoneGraphicsWindow.mm @@ -31,7 +31,7 @@ #include "throw_event.h" #include "pnmImage.h" #include "virtualFileSystem.h" -#include "config_util.h" +#include "config_putil.h" #include "pset.h" #include "pmutex.h" diff --git a/panda/src/movies/movieTypeRegistry.cxx b/panda/src/movies/movieTypeRegistry.cxx index bca56d3628..9c747b6fe3 100644 --- a/panda/src/movies/movieTypeRegistry.cxx +++ b/panda/src/movies/movieTypeRegistry.cxx @@ -14,7 +14,7 @@ #include "movieTypeRegistry.h" #include "string_utils.h" #include "config_movies.h" -#include "config_util.h" +#include "config_putil.h" #include "load_dso.h" MovieTypeRegistry *MovieTypeRegistry::_global_ptr = NULL; diff --git a/panda/src/osxdisplay/osxGraphicsWindow.mm b/panda/src/osxdisplay/osxGraphicsWindow.mm index 4fe2c45965..293f2fd2a3 100644 --- a/panda/src/osxdisplay/osxGraphicsWindow.mm +++ b/panda/src/osxdisplay/osxGraphicsWindow.mm @@ -36,7 +36,7 @@ #include "throw_event.h" #include "pnmImage.h" #include "virtualFileSystem.h" -#include "config_util.h" +#include "config_putil.h" #include "pset.h" #include "pmutex.h" diff --git a/panda/src/pgraph/bamFile.cxx b/panda/src/pgraph/bamFile.cxx index 83256c340a..871ec94587 100644 --- a/panda/src/pgraph/bamFile.cxx +++ b/panda/src/pgraph/bamFile.cxx @@ -16,7 +16,7 @@ #include "bam.h" #include "bamCacheRecord.h" -#include "config_util.h" +#include "config_putil.h" #include "bamReader.h" #include "bamWriter.h" #include "filename.h" diff --git a/panda/src/pgraph/loader.cxx b/panda/src/pgraph/loader.cxx index 32187508e0..7e8c201daf 100644 --- a/panda/src/pgraph/loader.cxx +++ b/panda/src/pgraph/loader.cxx @@ -19,7 +19,7 @@ #include "modelLoadRequest.h" #include "modelSaveRequest.h" #include "config_express.h" -#include "config_util.h" +#include "config_putil.h" #include "virtualFileSystem.h" #include "filename.h" #include "load_dso.h" diff --git a/panda/src/pgraph/shaderPool.cxx b/panda/src/pgraph/shaderPool.cxx index 6334d83789..ba9f99e8c2 100644 --- a/panda/src/pgraph/shaderPool.cxx +++ b/panda/src/pgraph/shaderPool.cxx @@ -12,7 +12,7 @@ */ #include "shaderPool.h" -#include "config_util.h" +#include "config_putil.h" #include "config_express.h" #include "virtualFileSystem.h" #include "loader.h" diff --git a/panda/src/physx/physxEnums.cxx b/panda/src/physx/physxEnums.cxx index 5b186445c2..172e6013b3 100644 --- a/panda/src/physx/physxEnums.cxx +++ b/panda/src/physx/physxEnums.cxx @@ -14,7 +14,7 @@ #include "physxEnums.h" #include "string_utils.h" -#include "config_util.h" +#include "config_putil.h" ostream & operator << (ostream &out, PhysxEnums::PhysxUpAxis axis) { diff --git a/panda/src/pnmtext/freetypeFont.cxx b/panda/src/pnmtext/freetypeFont.cxx index f42b5b72bc..379a139426 100644 --- a/panda/src/pnmtext/freetypeFont.cxx +++ b/panda/src/pnmtext/freetypeFont.cxx @@ -16,7 +16,7 @@ #ifdef HAVE_FREETYPE #include "config_pnmtext.h" -#include "config_util.h" +#include "config_putil.h" #include "config_express.h" #include "virtualFileSystem.h" #include "nurbsCurveEvaluator.h" diff --git a/panda/src/pstatclient/config_pstats.cxx b/panda/src/pstatclient/config_pstatclient.cxx similarity index 96% rename from panda/src/pstatclient/config_pstats.cxx rename to panda/src/pstatclient/config_pstatclient.cxx index dcd49a4365..4be7472441 100644 --- a/panda/src/pstatclient/config_pstats.cxx +++ b/panda/src/pstatclient/config_pstatclient.cxx @@ -6,12 +6,12 @@ * license. You should have received a copy of this license along * with this source code in a file named "LICENSE." * - * @file config_pstats.cxx + * @file config_pstatclient.cxx * @author drose * @date 2000-07-09 */ -#include "config_pstats.h" +#include "config_pstatclient.h" #include "dconfig.h" @@ -19,10 +19,10 @@ #error Buildsystem error: BUILDING_PANDA_PSTATCLIENT not defined #endif -ConfigureDef(config_pstats); +ConfigureDef(config_pstatclient); NotifyCategoryDef(pstats, ""); -ConfigureFn(config_pstats) { +ConfigureFn(config_pstatclient) { init_libpstatclient(); } diff --git a/panda/src/pstatclient/config_pstatclient.h b/panda/src/pstatclient/config_pstatclient.h new file mode 100644 index 0000000000..6de3c5c120 --- /dev/null +++ b/panda/src/pstatclient/config_pstatclient.h @@ -0,0 +1,50 @@ +/** + * PANDA 3D SOFTWARE + * Copyright (c) Carnegie Mellon University. All rights reserved. + * + * All use of this software is subject to the terms of the revised BSD + * license. You should have received a copy of this license along + * with this source code in a file named "LICENSE." + * + * @file config_pstatclient.h + * @author drose + * @date 2000-07-09 + */ + +#ifndef CONFIG_PSTATS_H +#define CONFIG_PSTATS_H + +#include "pandabase.h" + +#include "notifyCategoryProxy.h" +#include "dconfig.h" +#include "configVariableString.h" +#include "configVariableInt.h" +#include "configVariableDouble.h" +#include "configVariableBool.h" + +// Configure variables for pstats package. + +ConfigureDecl(config_pstatclient, EXPCL_PANDA_PSTATCLIENT, EXPTP_PANDA_PSTATCLIENT); +NotifyCategoryDecl(pstats, EXPCL_PANDA_PSTATCLIENT, EXPTP_PANDA_PSTATCLIENT); + +extern EXPCL_PANDA_PSTATCLIENT ConfigVariableString pstats_name; +extern EXPCL_PANDA_PSTATCLIENT ConfigVariableDouble pstats_max_rate; +extern EXPCL_PANDA_PSTATCLIENT ConfigVariableBool pstats_threaded_write; +extern EXPCL_PANDA_PSTATCLIENT ConfigVariableInt pstats_max_queue_size; +extern EXPCL_PANDA_PSTATCLIENT ConfigVariableDouble pstats_tcp_ratio; + +extern EXPCL_PANDA_PSTATCLIENT ConfigVariableString pstats_host; +extern EXPCL_PANDA_PSTATCLIENT ConfigVariableInt pstats_port; +extern EXPCL_PANDA_PSTATCLIENT ConfigVariableDouble pstats_target_frame_rate; +extern EXPCL_PANDA_PSTATCLIENT ConfigVariableBool pstats_gpu_timing; + +extern EXPCL_PANDA_PSTATCLIENT ConfigVariableBool pstats_scroll_mode; +extern EXPCL_PANDA_PSTATCLIENT ConfigVariableDouble pstats_history; +extern EXPCL_PANDA_PSTATCLIENT ConfigVariableDouble pstats_average_time; + +extern EXPCL_PANDA_PSTATCLIENT ConfigVariableBool pstats_mem_other; + +extern EXPCL_PANDA_PSTATCLIENT void init_libpstatclient(); + +#endif diff --git a/panda/src/pstatclient/config_pstats.h b/panda/src/pstatclient/config_pstats.h index d3136ad736..84f42df553 100644 --- a/panda/src/pstatclient/config_pstats.h +++ b/panda/src/pstatclient/config_pstats.h @@ -1,50 +1,2 @@ -/** - * PANDA 3D SOFTWARE - * Copyright (c) Carnegie Mellon University. All rights reserved. - * - * All use of this software is subject to the terms of the revised BSD - * license. You should have received a copy of this license along - * with this source code in a file named "LICENSE." - * - * @file config_pstats.h - * @author drose - * @date 2000-07-09 - */ - -#ifndef CONFIG_PSTATS_H -#define CONFIG_PSTATS_H - -#include "pandabase.h" - -#include "notifyCategoryProxy.h" -#include "dconfig.h" -#include "configVariableString.h" -#include "configVariableInt.h" -#include "configVariableDouble.h" -#include "configVariableBool.h" - -// Configure variables for pstats package. - -ConfigureDecl(config_pstats, EXPCL_PANDA_PSTATCLIENT, EXPTP_PANDA_PSTATCLIENT); -NotifyCategoryDecl(pstats, EXPCL_PANDA_PSTATCLIENT, EXPTP_PANDA_PSTATCLIENT); - -extern EXPCL_PANDA_PSTATCLIENT ConfigVariableString pstats_name; -extern EXPCL_PANDA_PSTATCLIENT ConfigVariableDouble pstats_max_rate; -extern EXPCL_PANDA_PSTATCLIENT ConfigVariableBool pstats_threaded_write; -extern EXPCL_PANDA_PSTATCLIENT ConfigVariableInt pstats_max_queue_size; -extern EXPCL_PANDA_PSTATCLIENT ConfigVariableDouble pstats_tcp_ratio; - -extern EXPCL_PANDA_PSTATCLIENT ConfigVariableString pstats_host; -extern EXPCL_PANDA_PSTATCLIENT ConfigVariableInt pstats_port; -extern EXPCL_PANDA_PSTATCLIENT ConfigVariableDouble pstats_target_frame_rate; -extern EXPCL_PANDA_PSTATCLIENT ConfigVariableBool pstats_gpu_timing; - -extern EXPCL_PANDA_PSTATCLIENT ConfigVariableBool pstats_scroll_mode; -extern EXPCL_PANDA_PSTATCLIENT ConfigVariableDouble pstats_history; -extern EXPCL_PANDA_PSTATCLIENT ConfigVariableDouble pstats_average_time; - -extern EXPCL_PANDA_PSTATCLIENT ConfigVariableBool pstats_mem_other; - -extern EXPCL_PANDA_PSTATCLIENT void init_libpstatclient(); - -#endif +// This file to remain during the whole 1.10.x cycle; remove after that. +#error config_pstats.h has been renamed to config_pstatclient.h - please update your project. diff --git a/panda/src/pstatclient/p3pstatclient_composite1.cxx b/panda/src/pstatclient/p3pstatclient_composite1.cxx index e1a29761d7..b20594b02a 100644 --- a/panda/src/pstatclient/p3pstatclient_composite1.cxx +++ b/panda/src/pstatclient/p3pstatclient_composite1.cxx @@ -1,5 +1,5 @@ -#include "config_pstats.cxx" +#include "config_pstatclient.cxx" #include "pStatClient.cxx" #include "pStatClientImpl.cxx" #include "pStatClientVersion.cxx" diff --git a/panda/src/pstatclient/pStatClient.cxx b/panda/src/pstatclient/pStatClient.cxx index 906d99a29a..a735ea080e 100644 --- a/panda/src/pstatclient/pStatClient.cxx +++ b/panda/src/pstatclient/pStatClient.cxx @@ -21,7 +21,7 @@ #include "pStatServerControlMessage.h" #include "pStatCollector.h" #include "pStatThread.h" -#include "config_pstats.h" +#include "config_pstatclient.h" #include "pStatProperties.h" #include "thread.h" #include "clockObject.h" diff --git a/panda/src/pstatclient/pStatClientControlMessage.cxx b/panda/src/pstatclient/pStatClientControlMessage.cxx index 0cecb2aead..e7fd765547 100644 --- a/panda/src/pstatclient/pStatClientControlMessage.cxx +++ b/panda/src/pstatclient/pStatClientControlMessage.cxx @@ -11,7 +11,7 @@ * @date 2000-07-09 */ -#include "config_pstats.h" +#include "config_pstatclient.h" #include "pStatClientControlMessage.h" #include "pStatClientVersion.h" diff --git a/panda/src/pstatclient/pStatClientImpl.cxx b/panda/src/pstatclient/pStatClientImpl.cxx index 56f044d2a1..d126c6c753 100644 --- a/panda/src/pstatclient/pStatClientImpl.cxx +++ b/panda/src/pstatclient/pStatClientImpl.cxx @@ -21,7 +21,7 @@ #include "pStatServerControlMessage.h" #include "pStatCollector.h" #include "pStatThread.h" -#include "config_pstats.h" +#include "config_pstatclient.h" #include "pStatProperties.h" #include "cmath.h" diff --git a/panda/src/pstatclient/pStatFrameData.cxx b/panda/src/pstatclient/pStatFrameData.cxx index 835b30f1df..f15f6bc61e 100644 --- a/panda/src/pstatclient/pStatFrameData.cxx +++ b/panda/src/pstatclient/pStatFrameData.cxx @@ -13,7 +13,7 @@ #include "pStatFrameData.h" #include "pStatClientVersion.h" -#include "config_pstats.h" +#include "config_pstatclient.h" #include "datagram.h" #include "datagramIterator.h" diff --git a/panda/src/pstatclient/pStatProperties.cxx b/panda/src/pstatclient/pStatProperties.cxx index 25d2bfd591..01411f3f74 100644 --- a/panda/src/pstatclient/pStatProperties.cxx +++ b/panda/src/pstatclient/pStatProperties.cxx @@ -14,7 +14,7 @@ #include "pStatProperties.h" #include "pStatCollectorDef.h" #include "pStatClient.h" -#include "config_pstats.h" +#include "config_pstatclient.h" #include "configVariableBool.h" #include "configVariableColor.h" #include "configVariableDouble.h" diff --git a/panda/src/pstatclient/pStatServerControlMessage.cxx b/panda/src/pstatclient/pStatServerControlMessage.cxx index f5003ba18c..e75f9eebec 100644 --- a/panda/src/pstatclient/pStatServerControlMessage.cxx +++ b/panda/src/pstatclient/pStatServerControlMessage.cxx @@ -11,7 +11,7 @@ * @date 2000-07-09 */ -#include "config_pstats.h" +#include "config_pstatclient.h" #include "pStatServerControlMessage.h" #include "datagram.h" diff --git a/panda/src/pstatclient/test_client.cxx b/panda/src/pstatclient/test_client.cxx index 11f6f392fe..35a79a8cbd 100644 --- a/panda/src/pstatclient/test_client.cxx +++ b/panda/src/pstatclient/test_client.cxx @@ -11,7 +11,7 @@ * @date 2000-07-09 */ -#include "config_pstats.h" +#include "config_pstatclient.h" #include "pStatClient.h" #include "pStatCollector.h" #include "thread.h" diff --git a/panda/src/putil/autoTextureScale.cxx b/panda/src/putil/autoTextureScale.cxx index 38f1c0a62a..ea17b6f08b 100644 --- a/panda/src/putil/autoTextureScale.cxx +++ b/panda/src/putil/autoTextureScale.cxx @@ -13,7 +13,7 @@ #include "autoTextureScale.h" #include "string_utils.h" -#include "config_util.h" +#include "config_putil.h" ostream & operator << (ostream &out, AutoTextureScale ats) { diff --git a/panda/src/putil/bamCache.cxx b/panda/src/putil/bamCache.cxx index 5576e16a43..94c31665c6 100644 --- a/panda/src/putil/bamCache.cxx +++ b/panda/src/putil/bamCache.cxx @@ -18,7 +18,7 @@ #include "hashVal.h" #include "datagramInputFile.h" #include "datagramOutputFile.h" -#include "config_util.h" +#include "config_putil.h" #include "bam.h" #include "typeRegistry.h" #include "string_utils.h" diff --git a/panda/src/putil/bamCacheIndex.cxx b/panda/src/putil/bamCacheIndex.cxx index 600ee6c328..31c62ec3a5 100644 --- a/panda/src/putil/bamCacheIndex.cxx +++ b/panda/src/putil/bamCacheIndex.cxx @@ -14,7 +14,7 @@ #include "bamCacheIndex.h" #include "bamReader.h" #include "bamWriter.h" -#include "config_util.h" // util_cat +#include "config_putil.h" // util_cat #include "indent.h" #include diff --git a/panda/src/putil/bamCacheRecord.cxx b/panda/src/putil/bamCacheRecord.cxx index 487d2b1e5d..8fabae7326 100644 --- a/panda/src/putil/bamCacheRecord.cxx +++ b/panda/src/putil/bamCacheRecord.cxx @@ -17,7 +17,7 @@ #include "virtualFileSystem.h" #include "virtualFile.h" #include "indent.h" -#include "config_util.h" // util_cat +#include "config_putil.h" // util_cat TypeHandle BamCacheRecord::_type_handle; diff --git a/panda/src/putil/bamEnums.cxx b/panda/src/putil/bamEnums.cxx index 292227d359..ed1b18ac58 100644 --- a/panda/src/putil/bamEnums.cxx +++ b/panda/src/putil/bamEnums.cxx @@ -13,7 +13,7 @@ #include "bamEnums.h" #include "string_utils.h" -#include "config_util.h" +#include "config_putil.h" ostream & operator << (ostream &out, BamEnums::BamEndian be) { diff --git a/panda/src/putil/bamReader.cxx b/panda/src/putil/bamReader.cxx index 3ab1386d7f..eab309c9d6 100644 --- a/panda/src/putil/bamReader.cxx +++ b/panda/src/putil/bamReader.cxx @@ -17,7 +17,7 @@ #include "bam.h" #include "bamReader.h" #include "datagramIterator.h" -#include "config_util.h" +#include "config_putil.h" #include "pipelineCyclerBase.h" TypeHandle BamReaderAuxData::_type_handle; diff --git a/panda/src/putil/bamReader_ext.cxx b/panda/src/putil/bamReader_ext.cxx index 1648d7e24c..444688a654 100644 --- a/panda/src/putil/bamReader_ext.cxx +++ b/panda/src/putil/bamReader_ext.cxx @@ -12,7 +12,7 @@ */ #include "bamReader_ext.h" -#include "config_util.h" +#include "config_putil.h" #include "pythonThread.h" #ifdef HAVE_PYTHON diff --git a/panda/src/putil/bamWriter.cxx b/panda/src/putil/bamWriter.cxx index 679600b664..ac3ac6b8ad 100644 --- a/panda/src/putil/bamWriter.cxx +++ b/panda/src/putil/bamWriter.cxx @@ -15,7 +15,7 @@ #include "pnotify.h" #include "typedWritable.h" -#include "config_util.h" +#include "config_putil.h" #include "bam.h" #include "bamWriter.h" #include "bamReader.h" @@ -94,6 +94,10 @@ BamWriter:: for (si = _state_map.begin(); si != _state_map.end(); ++si) { TypedWritable *object = (TypedWritable *)(*si).first; object->remove_bam_writer(this); + + if ((*si).second._refcount != nullptr) { + unref_delete((*si).second._refcount); + } } } @@ -529,6 +533,9 @@ object_destructs(TypedWritable *object) { // we're in trouble when we do write it out. nassertv(!(*si).second._written_seq.is_initial()); + // This cannot be called if we are still holding a reference to it. + nassertv((*si).second._refcount == nullptr); + int object_id = (*si).second._object_id; _freed_object_ids.push_back(object_id); @@ -606,8 +613,10 @@ enqueue_object(const TypedWritable *object) { // No, it hasn't, so assign it the next number in sequence arbitrarily. object_id = _next_object_id; - bool inserted = - _state_map.insert(StateMap::value_type(object, StoreState(_next_object_id))).second; + StateMap::iterator si; + bool inserted; + tie(si, inserted) = + _state_map.insert(StateMap::value_type(object, StoreState(_next_object_id))); nassertr(inserted, false); // Store ourselves on the TypedWritable so that we get notified when it @@ -615,6 +624,14 @@ enqueue_object(const TypedWritable *object) { (const_cast(object))->add_bam_writer(this); _next_object_id++; + // Increase the reference count if this inherits from ReferenceCount, + // until we get a chance to write this object for the first time. + const ReferenceCount *rc = ((TypedWritable *)object)->as_reference_count(); + if (rc != nullptr) { + rc->ref(); + (*si).second._refcount = rc; + } + } else { // Yes, it has; get the object ID. object_id = (*si).second._object_id; @@ -703,6 +720,15 @@ flush_queue() { (*si).second._written_seq = _writing_seq; (*si).second._modified = object->get_bam_modified(); + // Now release any reference we hold to it, so that it may destruct. + const ReferenceCount *rc = (*si).second._refcount; + if (rc != nullptr) { + // We need to assign this pointer to null before deleting the object, + // since that may end up calling object_destructs. + (*si).second._refcount = nullptr; + unref_delete(rc); + } + } else { // On subsequent times when we write a particular object, we write // simply TypeHandle::none(), followed by the object ID. The occurrence diff --git a/panda/src/putil/bamWriter.h b/panda/src/putil/bamWriter.h index c2b04b3757..bcd4a76ce6 100644 --- a/panda/src/putil/bamWriter.h +++ b/panda/src/putil/bamWriter.h @@ -140,8 +140,9 @@ private: int _object_id; UpdateSeq _written_seq; UpdateSeq _modified; + const ReferenceCount *_refcount; - StoreState(int object_id) : _object_id(object_id) {} + StoreState(int object_id) : _object_id(object_id), _refcount(nullptr) {} }; typedef phash_map StateMap; StateMap _state_map; diff --git a/panda/src/putil/buttonRegistry.cxx b/panda/src/putil/buttonRegistry.cxx index ff181c95ae..594a5864fd 100644 --- a/panda/src/putil/buttonRegistry.cxx +++ b/panda/src/putil/buttonRegistry.cxx @@ -12,7 +12,7 @@ */ #include "buttonRegistry.h" -#include "config_util.h" +#include "config_putil.h" #include diff --git a/panda/src/putil/clockObject.cxx b/panda/src/putil/clockObject.cxx index 09353ab739..341a11374a 100644 --- a/panda/src/putil/clockObject.cxx +++ b/panda/src/putil/clockObject.cxx @@ -12,7 +12,7 @@ */ #include "clockObject.h" -#include "config_util.h" +#include "config_putil.h" #include "configVariableEnum.h" #include "string_utils.h" #include "thread.h" diff --git a/panda/src/putil/colorSpace.cxx b/panda/src/putil/colorSpace.cxx index 34c37ee423..075eb438a1 100644 --- a/panda/src/putil/colorSpace.cxx +++ b/panda/src/putil/colorSpace.cxx @@ -12,7 +12,7 @@ */ #include "colorSpace.h" -#include "config_util.h" +#include "config_putil.h" #include "configVariableEnum.h" #include "string_utils.h" diff --git a/panda/src/putil/config_util.N b/panda/src/putil/config_putil.N similarity index 100% rename from panda/src/putil/config_util.N rename to panda/src/putil/config_putil.N diff --git a/panda/src/putil/config_util.cxx b/panda/src/putil/config_putil.cxx similarity index 98% rename from panda/src/putil/config_util.cxx rename to panda/src/putil/config_putil.cxx index c5956adc2b..5461b73f3f 100644 --- a/panda/src/putil/config_util.cxx +++ b/panda/src/putil/config_putil.cxx @@ -6,12 +6,12 @@ * license. You should have received a copy of this license along * with this source code in a file named "LICENSE." * - * @file config_util.cxx + * @file config_putil.cxx * @author cary * @date 2000-01-04 */ -#include "config_util.h" +#include "config_putil.h" #include "animInterface.h" #include "bamCacheIndex.h" #include "bamCacheRecord.h" @@ -51,7 +51,7 @@ #error Buildsystem error: BUILDING_PANDA_PUTIL not defined #endif -ConfigureDef(config_util); +ConfigureDef(config_putil); NotifyCategoryDef(util, ""); NotifyCategoryDef(bam, util_cat); @@ -88,7 +88,7 @@ ConfigVariableEnum bam_texture_mode PRC_DESC("Set this to specify how textures should be written into Bam files." "See the panda source or documentation for available options.")); -ConfigureFn(config_util) { +ConfigureFn(config_putil) { init_libputil(); } diff --git a/panda/src/putil/config_putil.h b/panda/src/putil/config_putil.h new file mode 100644 index 0000000000..ec9f683378 --- /dev/null +++ b/panda/src/putil/config_putil.h @@ -0,0 +1,55 @@ +/** + * PANDA 3D SOFTWARE + * Copyright (c) Carnegie Mellon University. All rights reserved. + * + * All use of this software is subject to the terms of the revised BSD + * license. You should have received a copy of this license along + * with this source code in a file named "LICENSE." + * + * @file config_putil.h + * @author cary + * @date 2000-01-04 + */ + +#ifndef __CONFIG_UTIL_H__ +#define __CONFIG_UTIL_H__ + +#include "pandabase.h" +#include "notifyCategoryProxy.h" +#include "configVariableSearchPath.h" +#include "configVariableEnum.h" +#include "configVariableDouble.h" +#include "bamEnums.h" +#include "dconfig.h" + +class DSearchPath; + +ConfigureDecl(config_putil, EXPCL_PANDA_PUTIL, EXPTP_PANDA_PUTIL); +NotifyCategoryDecl(util, EXPCL_PANDA_PUTIL, EXPTP_PANDA_PUTIL); +NotifyCategoryDecl(bam, EXPCL_PANDA_PUTIL, EXPTP_PANDA_PUTIL); + +// Actually, we can't determine this config variable the normal way, because +// we must be able to access it at static init time. Instead of declaring it +// a global constant, we'll make it a member of MemoryUsage. extern +// EXPCL_PANDA_PUTIL const bool track_memory_usage; + +extern EXPCL_PANDA_PUTIL ConfigVariableInt bam_version; +extern EXPCL_PANDA_PUTIL ConfigVariableEnum bam_endian; +extern EXPCL_PANDA_PUTIL ConfigVariableBool bam_stdfloat_double; +extern EXPCL_PANDA_PUTIL ConfigVariableEnum bam_texture_mode; + +BEGIN_PUBLISH +EXPCL_PANDA_PUTIL ConfigVariableSearchPath &get_model_path(); +EXPCL_PANDA_PUTIL ConfigVariableSearchPath &get_plugin_path(); +END_PUBLISH + +extern ConfigVariableDouble sleep_precision; + +extern EXPCL_PANDA_PUTIL ConfigVariableBool preload_textures; +extern EXPCL_PANDA_PUTIL ConfigVariableBool preload_simple_textures; +extern EXPCL_PANDA_PUTIL ConfigVariableBool compressed_textures; +extern EXPCL_PANDA_PUTIL ConfigVariableBool cache_check_timestamps; + +extern EXPCL_PANDA_PUTIL void init_libputil(); + +#endif /* __CONFIG_UTIL_H__ */ diff --git a/panda/src/putil/config_util.h b/panda/src/putil/config_util.h index 34ff4abc2d..6886f3257d 100644 --- a/panda/src/putil/config_util.h +++ b/panda/src/putil/config_util.h @@ -1,55 +1,2 @@ -/** - * PANDA 3D SOFTWARE - * Copyright (c) Carnegie Mellon University. All rights reserved. - * - * All use of this software is subject to the terms of the revised BSD - * license. You should have received a copy of this license along - * with this source code in a file named "LICENSE." - * - * @file config_util.h - * @author cary - * @date 2000-01-04 - */ - -#ifndef __CONFIG_UTIL_H__ -#define __CONFIG_UTIL_H__ - -#include "pandabase.h" -#include "notifyCategoryProxy.h" -#include "configVariableSearchPath.h" -#include "configVariableEnum.h" -#include "configVariableDouble.h" -#include "bamEnums.h" -#include "dconfig.h" - -class DSearchPath; - -ConfigureDecl(config_util, EXPCL_PANDA_PUTIL, EXPTP_PANDA_PUTIL); -NotifyCategoryDecl(util, EXPCL_PANDA_PUTIL, EXPTP_PANDA_PUTIL); -NotifyCategoryDecl(bam, EXPCL_PANDA_PUTIL, EXPTP_PANDA_PUTIL); - -// Actually, we can't determine this config variable the normal way, because -// we must be able to access it at static init time. Instead of declaring it -// a global constant, we'll make it a member of MemoryUsage. extern -// EXPCL_PANDA_PUTIL const bool track_memory_usage; - -extern EXPCL_PANDA_PUTIL ConfigVariableInt bam_version; -extern EXPCL_PANDA_PUTIL ConfigVariableEnum bam_endian; -extern EXPCL_PANDA_PUTIL ConfigVariableBool bam_stdfloat_double; -extern EXPCL_PANDA_PUTIL ConfigVariableEnum bam_texture_mode; - -BEGIN_PUBLISH -EXPCL_PANDA_PUTIL ConfigVariableSearchPath &get_model_path(); -EXPCL_PANDA_PUTIL ConfigVariableSearchPath &get_plugin_path(); -END_PUBLISH - -extern ConfigVariableDouble sleep_precision; - -extern EXPCL_PANDA_PUTIL ConfigVariableBool preload_textures; -extern EXPCL_PANDA_PUTIL ConfigVariableBool preload_simple_textures; -extern EXPCL_PANDA_PUTIL ConfigVariableBool compressed_textures; -extern EXPCL_PANDA_PUTIL ConfigVariableBool cache_check_timestamps; - -extern EXPCL_PANDA_PUTIL void init_libputil(); - -#endif /* __CONFIG_UTIL_H__ */ +// This file to remain during the whole 1.10.x cycle; remove after that. +#error config_util.h has been renamed to config_putil.h - please update your project. diff --git a/panda/src/putil/copyOnWritePointer.cxx b/panda/src/putil/copyOnWritePointer.cxx index 03ed76e24b..4beb105ada 100644 --- a/panda/src/putil/copyOnWritePointer.cxx +++ b/panda/src/putil/copyOnWritePointer.cxx @@ -12,7 +12,7 @@ */ #include "copyOnWritePointer.h" -#include "config_util.h" +#include "config_putil.h" #include "config_pipeline.h" #ifdef COW_THREADED diff --git a/panda/src/putil/datagramInputFile.cxx b/panda/src/putil/datagramInputFile.cxx index f81381d02e..4fc9b47ffb 100644 --- a/panda/src/putil/datagramInputFile.cxx +++ b/panda/src/putil/datagramInputFile.cxx @@ -16,7 +16,7 @@ #include "numeric_types.h" #include "datagramIterator.h" #include "profileTimer.h" -#include "config_util.h" +#include "config_putil.h" #include "config_express.h" #include "virtualFileSystem.h" #include "streamReader.h" diff --git a/panda/src/putil/datagramOutputFile.h b/panda/src/putil/datagramOutputFile.h index bd2007219a..c81dcdf986 100644 --- a/panda/src/putil/datagramOutputFile.h +++ b/panda/src/putil/datagramOutputFile.h @@ -21,7 +21,7 @@ #include "fileReference.h" #include "virtualFile.h" #include "virtualFileSystem.h" -#include "config_util.h" +#include "config_putil.h" /** * This class can be used to write a binary file that consists of an arbitrary diff --git a/panda/src/putil/factoryBase.cxx b/panda/src/putil/factoryBase.cxx index 52704e92cd..d34035177c 100644 --- a/panda/src/putil/factoryBase.cxx +++ b/panda/src/putil/factoryBase.cxx @@ -13,7 +13,7 @@ #include "factoryBase.h" #include "indent.h" -#include "config_util.h" +#include "config_putil.h" /** * diff --git a/panda/src/putil/globalPointerRegistry.cxx b/panda/src/putil/globalPointerRegistry.cxx index dcec8579bd..40e062d9c0 100644 --- a/panda/src/putil/globalPointerRegistry.cxx +++ b/panda/src/putil/globalPointerRegistry.cxx @@ -12,7 +12,7 @@ */ #include "globalPointerRegistry.h" -#include "config_util.h" +#include "config_putil.h" // In general, we use the util_cat->info() syntax in this file (instead of // util_cat.info()), because much of this work is done at static init time, diff --git a/panda/src/putil/keyboardButton.cxx b/panda/src/putil/keyboardButton.cxx index 07e5265c03..e6d7162d50 100644 --- a/panda/src/putil/keyboardButton.cxx +++ b/panda/src/putil/keyboardButton.cxx @@ -84,7 +84,7 @@ DEFINE_KEYBD_BUTTON_HANDLE(rmeta) /** * This is intended to be called only once, by the static initialization - * performed in config_util.cxx. + * performed in config_putil.cxx. */ void KeyboardButton:: init_keyboard_buttons() { diff --git a/panda/src/putil/load_prc_file.cxx b/panda/src/putil/load_prc_file.cxx index d35a3b9c29..5663c49038 100644 --- a/panda/src/putil/load_prc_file.cxx +++ b/panda/src/putil/load_prc_file.cxx @@ -16,7 +16,7 @@ #include "configVariableManager.h" #include "virtualFileSystem.h" #include "config_express.h" -#include "config_util.h" +#include "config_putil.h" #include "hashVal.h" /** diff --git a/panda/src/putil/loaderOptions.cxx b/panda/src/putil/loaderOptions.cxx index 61aeb4f5d1..7f57d77fef 100644 --- a/panda/src/putil/loaderOptions.cxx +++ b/panda/src/putil/loaderOptions.cxx @@ -12,7 +12,7 @@ */ #include "loaderOptions.h" -#include "config_util.h" +#include "config_putil.h" #include "indent.h" /** @@ -25,7 +25,7 @@ LoaderOptions(int flags) : _texture_num_views(0), _auto_texture_scale(ATS_unspecified) { - // Shadowing the variables in config_util for static init ordering issues. + // Shadowing the variables in config_putil for static init ordering issues. static ConfigVariableBool *preload_textures; static ConfigVariableBool *preload_simple_textures; static ConfigVariableBool *compressed_textures; diff --git a/panda/src/putil/mouseButton.cxx b/panda/src/putil/mouseButton.cxx index 5f3ebabbe1..ef3802edca 100644 --- a/panda/src/putil/mouseButton.cxx +++ b/panda/src/putil/mouseButton.cxx @@ -129,7 +129,7 @@ is_mouse_button(ButtonHandle button) { /** * This is intended to be called only once, by the static initialization - * performed in config_util.cxx. + * performed in config_putil.cxx. */ void MouseButton:: init_mouse_buttons() { diff --git a/panda/src/putil/p3putil_composite1.cxx b/panda/src/putil/p3putil_composite1.cxx index 4fc6fcaf70..446f7f1f07 100644 --- a/panda/src/putil/p3putil_composite1.cxx +++ b/panda/src/putil/p3putil_composite1.cxx @@ -17,7 +17,7 @@ #include "callbackObject.cxx" #include "clockObject.cxx" #include "colorSpace.cxx" -#include "config_util.cxx" +#include "config_putil.cxx" #include "configurable.cxx" #include "copyOnWriteObject.cxx" #include "copyOnWritePointer.cxx" diff --git a/panda/src/putil/pythonCallbackObject.cxx b/panda/src/putil/pythonCallbackObject.cxx index fd1c9aa64f..b1917c6e0e 100644 --- a/panda/src/putil/pythonCallbackObject.cxx +++ b/panda/src/putil/pythonCallbackObject.cxx @@ -18,7 +18,7 @@ #include "py_panda.h" #include "pythonThread.h" #include "callbackData.h" -#include "config_util.h" +#include "config_putil.h" TypeHandle PythonCallbackObject::_type_handle; diff --git a/panda/src/putil/simpleHashMap.h b/panda/src/putil/simpleHashMap.h index 50a7e3af12..68f6352a88 100644 --- a/panda/src/putil/simpleHashMap.h +++ b/panda/src/putil/simpleHashMap.h @@ -16,7 +16,7 @@ #include "pandabase.h" #include "pvector.h" -#include "config_util.h" +#include "config_putil.h" /** * Entry in the SimpleHashMap. diff --git a/panda/src/putil/test_filename.cxx b/panda/src/putil/test_filename.cxx index a4cbfa76e6..b6703d7387 100644 --- a/panda/src/putil/test_filename.cxx +++ b/panda/src/putil/test_filename.cxx @@ -12,7 +12,7 @@ */ #include "filename.h" -#include "config_util.h" +#include "config_putil.h" #include "dSearchPath.h" diff --git a/panda/src/putil/weakKeyHashMap.h b/panda/src/putil/weakKeyHashMap.h index bbb7077998..3769660fbc 100644 --- a/panda/src/putil/weakKeyHashMap.h +++ b/panda/src/putil/weakKeyHashMap.h @@ -16,7 +16,7 @@ #include "pandabase.h" #include "pvector.h" -#include "config_util.h" +#include "config_putil.h" #include "weakPointerTo.h" /** diff --git a/panda/src/speedtree/speedTreeNode.cxx b/panda/src/speedtree/speedTreeNode.cxx index 61150a5a01..c455e848f5 100644 --- a/panda/src/speedtree/speedTreeNode.cxx +++ b/panda/src/speedtree/speedTreeNode.cxx @@ -15,7 +15,7 @@ #include "speedTreeNode.h" #include "stBasicTerrain.h" #include "virtualFileSystem.h" -#include "config_util.h" +#include "config_putil.h" #include "cullTraverser.h" #include "cullableObject.h" #include "cullHandler.h" diff --git a/panda/src/text/dynamicTextFont.cxx b/panda/src/text/dynamicTextFont.cxx index 3a349a6d69..f02328009e 100644 --- a/panda/src/text/dynamicTextFont.cxx +++ b/panda/src/text/dynamicTextFont.cxx @@ -28,7 +28,7 @@ #endif #include "config_text.h" -#include "config_util.h" +#include "config_putil.h" #include "config_express.h" #include "virtualFileSystem.h" #include "geomVertexData.h" diff --git a/panda/src/text/fontPool.cxx b/panda/src/text/fontPool.cxx index 1fab675bff..ac7d476c63 100644 --- a/panda/src/text/fontPool.cxx +++ b/panda/src/text/fontPool.cxx @@ -14,7 +14,7 @@ #include "fontPool.h" #include "staticTextFont.h" #include "dynamicTextFont.h" -#include "config_util.h" +#include "config_putil.h" #include "config_express.h" #include "virtualFileSystem.h" #include "nodePath.h" diff --git a/panda/src/tinydisplay/tinyOsxGraphicsWindow.mm b/panda/src/tinydisplay/tinyOsxGraphicsWindow.mm index da3630a572..01892094b0 100644 --- a/panda/src/tinydisplay/tinyOsxGraphicsWindow.mm +++ b/panda/src/tinydisplay/tinyOsxGraphicsWindow.mm @@ -26,7 +26,7 @@ #include "throw_event.h" #include "pnmImage.h" #include "virtualFileSystem.h" -#include "config_util.h" +#include "config_putil.h" #include diff --git a/panda/src/windisplay/winGraphicsWindow.cxx b/panda/src/windisplay/winGraphicsWindow.cxx index 054581e1fd..f8fa283020 100644 --- a/panda/src/windisplay/winGraphicsWindow.cxx +++ b/panda/src/windisplay/winGraphicsWindow.cxx @@ -19,7 +19,7 @@ #include "keyboardButton.h" #include "mouseButton.h" #include "clockObject.h" -#include "config_util.h" +#include "config_putil.h" #include "throw_event.h" #include "nativeWindowHandle.h" diff --git a/pandatool/src/bam/eggToBam.cxx b/pandatool/src/bam/eggToBam.cxx index 238eba17cf..f6c9bf4b52 100644 --- a/pandatool/src/bam/eggToBam.cxx +++ b/pandatool/src/bam/eggToBam.cxx @@ -13,7 +13,7 @@ #include "eggToBam.h" -#include "config_util.h" +#include "config_putil.h" #include "bamFile.h" #include "load_egg_file.h" #include "config_egg2pg.h" diff --git a/pandatool/src/bam/ptsToBam.cxx b/pandatool/src/bam/ptsToBam.cxx index 5f570d309b..4db96663ca 100644 --- a/pandatool/src/bam/ptsToBam.cxx +++ b/pandatool/src/bam/ptsToBam.cxx @@ -13,7 +13,7 @@ #include "ptsToBam.h" -#include "config_util.h" +#include "config_putil.h" #include "geomPoints.h" #include "bamFile.h" #include "pandaNode.h" diff --git a/pandatool/src/converter/somethingToEggConverter.h b/pandatool/src/converter/somethingToEggConverter.h index 0388ca8fb4..b3e71b6ab5 100644 --- a/pandatool/src/converter/somethingToEggConverter.h +++ b/pandatool/src/converter/somethingToEggConverter.h @@ -17,7 +17,7 @@ #include "pandatoolbase.h" #include "filename.h" -#include "config_util.h" // for get_model_path() +#include "config_putil.h" // for get_model_path() #include "animationConvert.h" #include "pathReplace.h" #include "pointerTo.h" diff --git a/pandatool/src/egg-palettize/txaFileFilter.cxx b/pandatool/src/egg-palettize/txaFileFilter.cxx index a8f6c21507..5c673c51a1 100644 --- a/pandatool/src/egg-palettize/txaFileFilter.cxx +++ b/pandatool/src/egg-palettize/txaFileFilter.cxx @@ -20,7 +20,7 @@ #include "dconfig.h" #include "configVariableFilename.h" #include "virtualFileSystem.h" -#include "config_util.h" +#include "config_putil.h" NotifyCategoryDeclNoExport(txafile); NotifyCategoryDef(txafile, ""); diff --git a/pandatool/src/eggbase/eggReader.cxx b/pandatool/src/eggbase/eggReader.cxx index dce7b64c51..e570b8aa9d 100644 --- a/pandatool/src/eggbase/eggReader.cxx +++ b/pandatool/src/eggbase/eggReader.cxx @@ -14,7 +14,7 @@ #include "eggReader.h" #include "pnmImage.h" -#include "config_util.h" +#include "config_putil.h" #include "eggTextureCollection.h" #include "eggGroup.h" #include "eggGroupNode.h" diff --git a/pandatool/src/eggbase/somethingToEgg.cxx b/pandatool/src/eggbase/somethingToEgg.cxx index 497761ea06..4f33599761 100644 --- a/pandatool/src/eggbase/somethingToEgg.cxx +++ b/pandatool/src/eggbase/somethingToEgg.cxx @@ -14,7 +14,7 @@ #include "somethingToEgg.h" #include "somethingToEggConverter.h" -#include "config_util.h" +#include "config_putil.h" /** * The first parameter to the constructor should be the one-word name of the diff --git a/pandatool/src/flt/fltTexture.cxx b/pandatool/src/flt/fltTexture.cxx index dfc2b9d987..c3c61cf130 100644 --- a/pandatool/src/flt/fltTexture.cxx +++ b/pandatool/src/flt/fltTexture.cxx @@ -16,7 +16,7 @@ #include "fltRecordWriter.h" #include "fltHeader.h" #include "pathReplace.h" -#include "config_util.h" +#include "config_putil.h" TypeHandle FltTexture::_type_handle; diff --git a/pandatool/src/gtk-stats/gtkStats.cxx b/pandatool/src/gtk-stats/gtkStats.cxx index b76bc292f3..5f3cf83e82 100644 --- a/pandatool/src/gtk-stats/gtkStats.cxx +++ b/pandatool/src/gtk-stats/gtkStats.cxx @@ -14,7 +14,7 @@ #include "pandatoolbase.h" #include "gtkStats.h" #include "gtkStatsServer.h" -#include "config_pstats.h" +#include "config_pstatclient.h" GtkWidget *main_window; static GtkStatsServer *server = NULL; diff --git a/pandatool/src/maxegg/maxToEggConverter.cxx b/pandatool/src/maxegg/maxToEggConverter.cxx index b07c1fd77d..6e79178fc5 100644 --- a/pandatool/src/maxegg/maxToEggConverter.cxx +++ b/pandatool/src/maxegg/maxToEggConverter.cxx @@ -25,7 +25,7 @@ */ #include "maxEgg.h" -#include "config_util.h" +#include "config_putil.h" /** * diff --git a/pandatool/src/mayaprogs/mayaPview.cxx b/pandatool/src/mayaprogs/mayaPview.cxx index 60af297044..286d94ad67 100644 --- a/pandatool/src/mayaprogs/mayaPview.cxx +++ b/pandatool/src/mayaprogs/mayaPview.cxx @@ -19,7 +19,7 @@ #include "mayaToEggConverter.h" #include "eggData.h" #include "load_egg_file.h" -#include "config_util.h" +#include "config_putil.h" #include "config_chan.h" #include "config_gobj.h" #include "textNode.h" diff --git a/pandatool/src/pandatoolbase/pathReplace.cxx b/pandatool/src/pandatoolbase/pathReplace.cxx index 786bb6ae03..c3891cf047 100644 --- a/pandatool/src/pandatoolbase/pathReplace.cxx +++ b/pandatool/src/pandatoolbase/pathReplace.cxx @@ -12,7 +12,7 @@ */ #include "pathReplace.h" -#include "config_util.h" +#include "config_putil.h" #include "config_pandatoolbase.h" #include "indent.h" #include "virtualFileSystem.h" diff --git a/pandatool/src/pfmprogs/config_pfm.cxx b/pandatool/src/pfmprogs/config_pfmprogs.cxx similarity index 89% rename from pandatool/src/pfmprogs/config_pfm.cxx rename to pandatool/src/pfmprogs/config_pfmprogs.cxx index fc8cea6bf3..afa49ef91b 100644 --- a/pandatool/src/pfmprogs/config_pfm.cxx +++ b/pandatool/src/pfmprogs/config_pfmprogs.cxx @@ -6,16 +6,16 @@ * license. You should have received a copy of this license along * with this source code in a file named "LICENSE." * - * @file config_pfm.cxx + * @file config_pfmprogs.cxx * @author drose * @date 2010-12-23 */ -#include "config_pfm.h" +#include "config_pfmprogs.h" #include "dconfig.h" -Configure(config_pfm); +Configure(config_pfmprogs); NotifyCategoryDef(pfm, ""); ConfigVariableDouble pfm_bba_dist @@ -23,7 +23,7 @@ ConfigVariableDouble pfm_bba_dist PRC_DESC("Specifies the point_dist and sample_radius, in UV space, for " "compute bba files with pfm_trans.")); -ConfigureFn(config_pfm) { +ConfigureFn(config_pfmprogs) { init_libpfm(); } diff --git a/pandatool/src/pfmprogs/config_pfm.h b/pandatool/src/pfmprogs/config_pfmprogs.h similarity index 95% rename from pandatool/src/pfmprogs/config_pfm.h rename to pandatool/src/pfmprogs/config_pfmprogs.h index 5da1fcbb4e..98777496e7 100644 --- a/pandatool/src/pfmprogs/config_pfm.h +++ b/pandatool/src/pfmprogs/config_pfmprogs.h @@ -6,7 +6,7 @@ * license. You should have received a copy of this license along * with this source code in a file named "LICENSE." * - * @file config_pfm.h + * @file config_pfmprogs.h * @author drose * @date 2010-12-23 */ diff --git a/pandatool/src/pfmprogs/pfmBba.cxx b/pandatool/src/pfmprogs/pfmBba.cxx index 5517e45a63..5456efad27 100644 --- a/pandatool/src/pfmprogs/pfmBba.cxx +++ b/pandatool/src/pfmprogs/pfmBba.cxx @@ -12,7 +12,7 @@ */ #include "pfmBba.h" -#include "config_pfm.h" +#include "config_pfmprogs.h" #include "pfmFile.h" /** diff --git a/pandatool/src/pfmprogs/pfmTrans.cxx b/pandatool/src/pfmprogs/pfmTrans.cxx index 270d6a03af..123b098768 100644 --- a/pandatool/src/pfmprogs/pfmTrans.cxx +++ b/pandatool/src/pfmprogs/pfmTrans.cxx @@ -12,7 +12,7 @@ */ #include "pfmTrans.h" -#include "config_pfm.h" +#include "config_pfmprogs.h" #include "pfmFile.h" #include "pfmVizzer.h" #include "texture.h" diff --git a/pandatool/src/pstatserver/pStatGraph.cxx b/pandatool/src/pstatserver/pStatGraph.cxx index a216950117..f65dafbc3b 100644 --- a/pandatool/src/pstatserver/pStatGraph.cxx +++ b/pandatool/src/pstatserver/pStatGraph.cxx @@ -16,7 +16,7 @@ #include "pStatFrameData.h" #include "pStatCollectorDef.h" #include "string_utils.h" -#include "config_pstats.h" +#include "config_pstatclient.h" #include // for sprintf diff --git a/pandatool/src/pstatserver/pStatPianoRoll.cxx b/pandatool/src/pstatserver/pStatPianoRoll.cxx index 517fca358a..923c3991e7 100644 --- a/pandatool/src/pstatserver/pStatPianoRoll.cxx +++ b/pandatool/src/pstatserver/pStatPianoRoll.cxx @@ -16,7 +16,7 @@ #include "pStatFrameData.h" #include "pStatCollectorDef.h" #include "string_utils.h" -#include "config_pstats.h" +#include "config_pstatclient.h" #include diff --git a/pandatool/src/pstatserver/pStatServer.cxx b/pandatool/src/pstatserver/pStatServer.cxx index ddb6926995..1e295ee4f9 100644 --- a/pandatool/src/pstatserver/pStatServer.cxx +++ b/pandatool/src/pstatserver/pStatServer.cxx @@ -14,7 +14,7 @@ #include "pStatServer.h" #include "pStatReader.h" #include "thread.h" -#include "config_pstats.h" +#include "config_pstatclient.h" /** * diff --git a/pandatool/src/pstatserver/pStatStripChart.cxx b/pandatool/src/pstatserver/pStatStripChart.cxx index 28b28d6240..9b64abaa02 100644 --- a/pandatool/src/pstatserver/pStatStripChart.cxx +++ b/pandatool/src/pstatserver/pStatStripChart.cxx @@ -18,7 +18,7 @@ #include "pStatFrameData.h" #include "pStatCollectorDef.h" #include "string_utils.h" -#include "config_pstats.h" +#include "config_pstatclient.h" #include diff --git a/pandatool/src/pstatserver/pStatThreadData.cxx b/pandatool/src/pstatserver/pStatThreadData.cxx index eb3aa92702..fd5e3f411b 100644 --- a/pandatool/src/pstatserver/pStatThreadData.cxx +++ b/pandatool/src/pstatserver/pStatThreadData.cxx @@ -15,7 +15,7 @@ #include "pStatFrameData.h" #include "pStatCollectorDef.h" -#include "config_pstats.h" +#include "config_pstatclient.h" PStatFrameData PStatThreadData::_null_frame; diff --git a/pandatool/src/ptloader/loaderFileTypePandatool.cxx b/pandatool/src/ptloader/loaderFileTypePandatool.cxx index 48625154f2..0de02c19de 100644 --- a/pandatool/src/ptloader/loaderFileTypePandatool.cxx +++ b/pandatool/src/ptloader/loaderFileTypePandatool.cxx @@ -15,7 +15,7 @@ #include "config_ptloader.h" #include "somethingToEggConverter.h" #include "eggToSomethingConverter.h" -#include "config_util.h" +#include "config_putil.h" #include "load_egg_file.h" #include "save_egg_file.h" #include "eggData.h" diff --git a/pandatool/src/text-stats/textStats.cxx b/pandatool/src/text-stats/textStats.cxx index 2cbf69b4d9..cc1e2392c1 100644 --- a/pandatool/src/text-stats/textStats.cxx +++ b/pandatool/src/text-stats/textStats.cxx @@ -15,7 +15,7 @@ #include "textMonitor.h" #include "pStatServer.h" -#include "config_pstats.h" +#include "config_pstatclient.h" #include diff --git a/pandatool/src/win-stats/winStats.cxx b/pandatool/src/win-stats/winStats.cxx index e8995edaba..5c54535210 100644 --- a/pandatool/src/win-stats/winStats.cxx +++ b/pandatool/src/win-stats/winStats.cxx @@ -14,7 +14,7 @@ #include "pandatoolbase.h" #include "winStatsServer.h" -#include "config_pstats.h" +#include "config_pstatclient.h" #include diff --git a/tests/bullet/test_bullet_bam.py b/tests/bullet/test_bullet_bam.py index 11523a4f51..e22aa57ba2 100644 --- a/tests/bullet/test_bullet_bam.py +++ b/tests/bullet/test_bullet_bam.py @@ -88,8 +88,8 @@ def test_minkowski_sum_shape(): assert type(shape) is type(shape2) assert shape.margin == shape2.margin assert shape.name == shape2.name - assert shape.transform_a.mat.compare_to(shape2.transform_a.mat) == 0 - assert shape.transform_b.mat.compare_to(shape2.transform_b.mat) == 0 + assert shape.transform_a.mat.compare_to(shape2.transform_a.mat, 0.001) == 0 + assert shape.transform_b.mat.compare_to(shape2.transform_b.mat, 0.001) == 0 assert type(shape.shape_a) == type(shape2.shape_a) assert type(shape.shape_b) == type(shape2.shape_b) diff --git a/tests/showbase/test_PythonUtil.py b/tests/showbase/test_PythonUtil.py new file mode 100644 index 0000000000..faf5da269f --- /dev/null +++ b/tests/showbase/test_PythonUtil.py @@ -0,0 +1,105 @@ +from direct.showbase import PythonUtil + + +def test_queue(): + q = PythonUtil.Queue() + assert q.isEmpty() + q.clear() + assert q.isEmpty() + q.push(10) + assert not q.isEmpty() + q.push(20) + assert not q.isEmpty() + assert len(q) == 2 + assert q.front() == 10 + assert q.back() == 20 + assert q.top() == 10 + assert q.top() == 10 + assert q.pop() == 10 + assert len(q) == 1 + assert not q.isEmpty() + assert q.pop() == 20 + assert len(q) == 0 + assert q.isEmpty() + + +def test_flywheel(): + f = PythonUtil.flywheel(['a','b','c','d'], countList=[11,20,3,4]) + obj2count = {} + for obj in f: + obj2count.setdefault(obj, 0) + obj2count[obj] += 1 + assert obj2count['a'] == 11 + assert obj2count['b'] == 20 + assert obj2count['c'] == 3 + assert obj2count['d'] == 4 + + f = PythonUtil.flywheel([1,2,3,4], countFunc=lambda x: x*2) + obj2count = {} + for obj in f: + obj2count.setdefault(obj, 0) + obj2count[obj] += 1 + assert obj2count[1] == 2 + assert obj2count[2] == 4 + assert obj2count[3] == 6 + assert obj2count[4] == 8 + + f = PythonUtil.flywheel([1,2,3,4], countFunc=lambda x: x, scale = 3) + obj2count = {} + for obj in f: + obj2count.setdefault(obj, 0) + obj2count[obj] += 1 + assert obj2count[1] == 1 * 3 + assert obj2count[2] == 2 * 3 + assert obj2count[3] == 3 * 3 + assert obj2count[4] == 4 * 3 + + +def test_unescape_html_string(): + assert PythonUtil.unescapeHtmlString('asdf') == 'asdf' + assert PythonUtil.unescapeHtmlString('as+df') == 'as df' + assert PythonUtil.unescapeHtmlString('as%32df') == 'as2df' + assert PythonUtil.unescapeHtmlString('asdf%32') == 'asdf2' + + +def test_priority_callbacks(): + l = [] + def a(l=l): + l.append('a') + def b(l=l): + l.append('b') + def c(l=l): + l.append('c') + + pc = PythonUtil.PriorityCallbacks() + pc.add(a) + pc() + assert l == ['a'] + + del l[:] + bItem = pc.add(b) + pc() + assert 'a' in l + assert 'b' in l + assert len(l) == 2 + + del l[:] + pc.remove(bItem) + pc() + assert l == ['a'] + + del l[:] + pc.add(c, 2) + bItem = pc.add(b, 10) + pc() + assert l == ['a', 'c', 'b'] + + del l[:] + pc.remove(bItem) + pc() + assert l == ['a', 'c'] + + del l[:] + pc.clear() + pc() + assert len(l) == 0