diff --git a/.travis.yml b/.travis.yml index 8b6d27f3d5..76fc9d3742 100644 --- a/.travis.yml +++ b/.travis.yml @@ -61,7 +61,7 @@ script: - cmake -DHAVE_GTK2=NO -DBUILD_METALIBS=$BUILD_METALIBS -DCOMPOSITE_SOURCE_LIMIT=$COMPOSITE_SOURCE_LIMIT .. - make -j4 -after_script: +- export PYTHONPATH=$PWD - python ../test_imports.py - pytest ../tests diff --git a/cmake/macros/Interrogate.cmake b/cmake/macros/Interrogate.cmake index 1082865f61..55fcee0ed0 100644 --- a/cmake/macros/Interrogate.cmake +++ b/cmake/macros/Interrogate.cmake @@ -237,76 +237,74 @@ endfunction(interrogate_sources) # Python module when it's initialized. # function(add_python_module module) - if(INTERROGATE_PYTHON_INTERFACE) - set(targets) - set(link_targets) - set(import_flags) - set(infiles) - set(sources) - - set(link_keyword OFF) - set(import_keyword OFF) - foreach(arg ${ARGN}) - if(arg STREQUAL "LINK") - set(link_keyword ON) - set(import_keyword OFF) - elseif(arg STREQUAL "IMPORT") - set(link_keyword OFF) - set(import_keyword ON) - elseif(link_keyword) - list(APPEND link_targets "${arg}") - elseif(import_keyword) - list(APPEND import_flags "-import" "${arg}") - else() - list(APPEND targets "${arg}") - endif() - endforeach(arg) - - if(NOT link_targets) - set(link_targets ${targets}) - endif() - - foreach(target ${targets}) - interrogate_sources(${target} "${target}_igate.cxx" "${target}.in" - "-python-native;-module;panda3d.${module}") - get_target_property(target_extensions "${target}" IGATE_EXTENSIONS) - list(APPEND infiles "${target}.in") - list(APPEND sources "${target}_igate.cxx" ${target_extensions}) - endforeach(target) - - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${module}_module.cxx" - COMMAND interrogate_module - -oc "${CMAKE_CURRENT_BINARY_DIR}/${module}_module.cxx" - -module ${module} -library ${module} - ${import_flags} - ${INTERROGATE_MODULE_OPTIONS} - ${IMOD_FLAGS} ${infiles} - DEPENDS interrogate_module ${infiles} - COMMENT "Generating module ${module}" - ) - - if(BUILD_SHARED_LIBS) - add_library(${module} MODULE "${module}_module.cxx" ${sources}) - else() - add_library(${module} STATIC "${module}_module.cxx" ${sources}) - endif() - target_link_libraries(${module} - ${link_targets} ${PYTHON_LIBRARIES} p3dtool) - - set_target_properties(${module} PROPERTIES - LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/panda3d" - PREFIX "" - ) - if(WIN32 AND NOT CYGWIN) - set_target_properties(${module} PROPERTIES SUFFIX ".pyd") - endif() - - install(TARGETS ${module} DESTINATION "${PYTHON_ARCH_INSTALL_DIR}/panda3d") - - list(APPEND ALL_INTERROGATE_MODULES "${module}") - set(ALL_INTERROGATE_MODULES "${ALL_INTERROGATE_MODULES}" CACHE INTERNAL "Internal variable") + if(NOT HAVE_PYTHON OR NOT INTERROGATE_PYTHON_INTERFACE) + return() endif() + + set(targets) + set(link_targets) + set(import_flags) + set(infiles) + set(sources) + + set(link_keyword OFF) + set(import_keyword OFF) + foreach(arg ${ARGN}) + if(arg STREQUAL "LINK") + set(link_keyword ON) + set(import_keyword OFF) + elseif(arg STREQUAL "IMPORT") + set(link_keyword OFF) + set(import_keyword ON) + elseif(link_keyword) + list(APPEND link_targets "${arg}") + elseif(import_keyword) + list(APPEND import_flags "-import" "${arg}") + else() + list(APPEND targets "${arg}") + endif() + endforeach(arg) + + if(NOT link_targets) + set(link_targets ${targets}) + endif() + + foreach(target ${targets}) + interrogate_sources(${target} "${target}_igate.cxx" "${target}.in" + "-python-native;-module;panda3d.${module}") + get_target_property(target_extensions "${target}" IGATE_EXTENSIONS) + list(APPEND infiles "${target}.in") + list(APPEND sources "${target}_igate.cxx" ${target_extensions}) + endforeach(target) + + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${module}_module.cxx" + COMMAND interrogate_module + -oc "${CMAKE_CURRENT_BINARY_DIR}/${module}_module.cxx" + -module ${module} -library ${module} + ${import_flags} + ${INTERROGATE_MODULE_OPTIONS} + ${IMOD_FLAGS} ${infiles} + DEPENDS interrogate_module ${infiles} + COMMENT "Generating module ${module}" + ) + + add_library(${module} ${MODULE_TYPE} "${module}_module.cxx" ${sources}) + target_link_libraries(${module} + ${link_targets} ${PYTHON_LIBRARIES} p3dtool) + + set_target_properties(${module} PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/panda3d" + PREFIX "" + ) + if(WIN32 AND NOT CYGWIN) + set_target_properties(${module} PROPERTIES SUFFIX ".pyd") + endif() + + install(TARGETS ${module} DESTINATION "${PYTHON_ARCH_INSTALL_DIR}/panda3d") + + list(APPEND ALL_INTERROGATE_MODULES "${module}") + set(ALL_INTERROGATE_MODULES "${ALL_INTERROGATE_MODULES}" CACHE INTERNAL "Internal variable") endfunction(add_python_module) 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/Config.cmake b/dtool/Config.cmake index 2551c0a55e..61b213f7be 100644 --- a/dtool/Config.cmake +++ b/dtool/Config.cmake @@ -418,7 +418,7 @@ mark_as_advanced(ANDROID_NDK_HOME ANDROID_ABI ANDROID_STL # # Is Python installed, and should Python interfaces be generated? -set(WANT_PYTHON_VERSION "2.7" +set(WANT_PYTHON_VERSION "" CACHE STRING "Which Python version to seek out for building Panda3D against.") find_package(PythonInterp ${WANT_PYTHON_VERSION} QUIET) diff --git a/dtool/LocalSetup.cmake b/dtool/LocalSetup.cmake index 134c47f153..c671ec7080 100644 --- a/dtool/LocalSetup.cmake +++ b/dtool/LocalSetup.cmake @@ -180,10 +180,15 @@ check_cxx_compiler_flag(-msse2 HAVE_SSE2) #$[cdefine __USE_LARGEFILE64] # Set LINK_ALL_STATIC if we're building everything as static libraries. +# Also set the library type used for "modules" appropriately. if(BUILD_SHARED_LIBS) set(LINK_ALL_STATIC OFF) + set(MODULE_TYPE "MODULE" + CACHE INTERNAL "" FORCE) else() set(LINK_ALL_STATIC ON) + set(MODULE_TYPE "STATIC" + CACHE INTERNAL "" FORCE) endif() # Now go through all the packages and report whether we have them. diff --git a/dtool/dtool_config.h.in b/dtool/dtool_config.h.in index cd87d171b5..19d5408c37 100644 --- a/dtool/dtool_config.h.in +++ b/dtool/dtool_config.h.in @@ -233,9 +233,6 @@ to compile them out. */ #cmakedefine NOTIFY_DEBUG -/* Define if we are linking PANDAPHYSX in with PANDA. */ -#cmakedefine LINK_IN_PHYSX - /* The compiled-in character(s) to expect to separate different components of a path list (e.g. $PRC_PATH). */ #define DEFAULT_PATHSEP "@DEFAULT_PATHSEP@" diff --git a/dtool/metalibs/dtoolconfig/CMakeLists.txt b/dtool/metalibs/dtoolconfig/CMakeLists.txt index 7a22c6fbf4..33dc2922da 100644 --- a/dtool/metalibs/dtoolconfig/CMakeLists.txt +++ b/dtool/metalibs/dtoolconfig/CMakeLists.txt @@ -1,27 +1,3 @@ -# First, dtoolconfig: - set(DTOOLCONFIG_LINK_TARGETS p3prc p3dconfig p3interrogatedb) add_metalib(p3dtoolconfig dtoolconfig.cxx COMPONENTS ${DTOOLCONFIG_LINK_TARGETS}) install(TARGETS p3dtoolconfig DESTINATION lib) - -# Next, panda3d.interrogatedb: - -if(BUILD_SHARED_LIBS) - set(libtype MODULE) -else() - set(libtype STATIC) -endif() - -if(HAVE_PYTHON) - add_library(interrogatedb ${libtype} pydtool.cxx) - target_use_packages(interrogatedb PYTHON) - target_link_libraries(interrogatedb p3dtoolconfig) - - set_target_properties(interrogatedb PROPERTIES - LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/panda3d" - PREFIX "" - OUTPUT_NAME "interrogatedb" - ) - - install(TARGETS interrogatedb DESTINATION "${PYTHON_ARCH_INSTALL_DIR}/panda3d") -endif() 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/CMakeLists.txt b/dtool/src/dtoolbase/CMakeLists.txt index 3de0b9cae4..21daf08d1f 100644 --- a/dtool/src/dtoolbase/CMakeLists.txt +++ b/dtool/src/dtoolbase/CMakeLists.txt @@ -1,4 +1,10 @@ +configure_file(pandaVersion.h.in pandaVersion.h) +configure_file(checkPandaVersion.h.in checkPandaVersion.h) +configure_file(checkPandaVersion.cxx.in checkPandaVersion.cxx) + set(P3DTOOLBASE_HEADERS + ${CMAKE_CURRENT_BINARY_DIR}/checkPandaVersion.h + ${CMAKE_CURRENT_BINARY_DIR}/pandaVersion.h addHash.I addHash.h atomicAdjust.h atomicAdjustDummyImpl.h atomicAdjustDummyImpl.I @@ -38,6 +44,7 @@ set(P3DTOOLBASE_HEADERS ) set(P3DTOOLBASE_SOURCES + ${CMAKE_CURRENT_BINARY_DIR}/checkPandaVersion.cxx addHash.cxx atomicAdjustDummyImpl.cxx atomicAdjustI386Impl.cxx @@ -74,6 +81,8 @@ add_component_library(p3dtoolbase SYMBOL BUILDING_DTOOL_DTOOLBASE # The extensions need py_panda.h and extension.h from interrogatedb target_include_directories(p3dtoolbase PUBLIC $) +# Help other libraries find the autogenerated version headers +target_include_directories(p3dtoolbase PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) target_use_packages(p3dtoolbase THREADS EIGEN) target_interrogate(p3dtoolbase ${P3DTOOLBASE_SOURCES} EXTENSIONS ${P3DTOOLBASE_IGATEEXT}) diff --git a/dtool/src/dtoolutil/checkPandaVersion.cxx.in b/dtool/src/dtoolbase/checkPandaVersion.cxx.in similarity index 92% rename from dtool/src/dtoolutil/checkPandaVersion.cxx.in rename to dtool/src/dtoolbase/checkPandaVersion.cxx.in index e986a719ea..e62f0184c8 100644 --- a/dtool/src/dtoolutil/checkPandaVersion.cxx.in +++ b/dtool/src/dtoolbase/checkPandaVersion.cxx.in @@ -18,4 +18,4 @@ #include "dtoolbase.h" -EXPCL_DTOOL_DTOOLUTIL int @PANDA_VERSION_SYMBOL@ = 0; +EXPCL_DTOOL_DTOOLBASE int @PANDA_VERSION_SYMBOL@ = 0; diff --git a/dtool/src/dtoolbase/checkPandaVersion.h.in b/dtool/src/dtoolbase/checkPandaVersion.h.in new file mode 100644 index 0000000000..d3950d412a --- /dev/null +++ b/dtool/src/dtoolbase/checkPandaVersion.h.in @@ -0,0 +1,64 @@ +/* Filename: checkPandaVersion.h + * Created by: drose (26Jan05) + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * + * 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." + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/******************************************************************* + * Generated automatically by CMake. + ***************************** DO NOT EDIT *************************/ + +/* Include this file in code that compiles with Panda to guarantee + that it is linking with the same version of the Panda DLL's that it + was compiled with. */ + +/* We guarantee this by defining an external symbol which is based on + the version number. If that symbol is defined, then our DLL's + (probably) match. Otherwise, we must be running with the wrong + DLL; but the system linker will prevent the DLL from loading with + an undefined symbol. */ + +#ifndef CHECKPANDAVERSION_H +#define CHECKPANDAVERSION_H + +#include "dtoolbase.h" + +extern EXPCL_DTOOL_DTOOLBASE int @PANDA_VERSION_SYMBOL@; + +/* Just declaring the symbol isn't good enough. We need to force the + compiler and linker to preserve the external reference long enough + to end up in the output DLL. Therefore, we have to reference that + symbol somehow. + + Forcing the compiler to include a reference in its output object + file is easy enough: just define a function that makes use of it + in some way. The problem is the linker, which will enforce the + C++ One-Definition Rule and get upset about said definition + appearing in multiple places in the program. We can appease the + linker by forcing the compiler to emit a weak symbol. Many + compilers have syntax to request this explicitly, but since it + varies from compiler to compiler, that wouldn't be very portable. + + Fortunately, the C++ ODR itself has some exceptions, where a + definition can occur in multiple translation units *if and only if* + it's the same definition each time. In these cases, the compiler + must emit a weak symbol, because the ODR does not guarantee that + the same definition isn't repeated in any other translation units. + One such exception is template instantiation, which we use thus: */ +template +class CheckPandaVersion { +public: + int check() { return @PANDA_VERSION_SYMBOL@; } +}; + +template class CheckPandaVersion; + +#endif 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/dtool/src/dtoolutil/pandaVersion.h.in b/dtool/src/dtoolbase/pandaVersion.h.in similarity index 100% rename from dtool/src/dtoolutil/pandaVersion.h.in rename to dtool/src/dtoolbase/pandaVersion.h.in diff --git a/dtool/src/dtoolutil/CMakeLists.txt b/dtool/src/dtoolutil/CMakeLists.txt index 13d389a586..d2216059d4 100644 --- a/dtool/src/dtoolutil/CMakeLists.txt +++ b/dtool/src/dtoolutil/CMakeLists.txt @@ -1,10 +1,4 @@ -configure_file(pandaVersion.h.in pandaVersion.h) -configure_file(checkPandaVersion.h.in checkPandaVersion.h) -configure_file(checkPandaVersion.cxx.in checkPandaVersion.cxx) - set(P3DTOOLUTIL_HEADERS - ${CMAKE_CURRENT_BINARY_DIR}/checkPandaVersion.h - ${CMAKE_CURRENT_BINARY_DIR}/pandaVersion.h config_dtoolutil.h dSearchPath.I dSearchPath.h executionEnvironment.I executionEnvironment.h filename.I @@ -40,7 +34,6 @@ if(APPLE) endif() set(P3DTOOLUTIL_SOURCES - ${CMAKE_CURRENT_BINARY_DIR}/checkPandaVersion.cxx config_dtoolutil.cxx dSearchPath.cxx executionEnvironment.cxx filename.cxx @@ -76,7 +69,6 @@ composite_sources(p3dtoolutil P3DTOOLUTIL_SOURCES) add_component_library(p3dtoolutil SYMBOL BUILDING_DTOOL_DTOOLUTIL ${P3DTOOLUTIL_HEADERS} ${P3DTOOLUTIL_SOURCES}) set_target_properties(p3dtoolutil PROPERTIES COMPILE_FLAGS ${P3DTOOLUTIL_EXTRA_FLAGS}) -target_include_directories(p3dtoolutil PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) # The extensions need py_panda.h and extension.h from interrogatedb target_include_directories(p3dtoolutil PUBLIC $) diff --git a/dtool/src/dtoolutil/checkPandaVersion.h.in b/dtool/src/dtoolutil/checkPandaVersion.h.in deleted file mode 100644 index 162e16704a..0000000000 --- a/dtool/src/dtoolutil/checkPandaVersion.h.in +++ /dev/null @@ -1,39 +0,0 @@ -/* Filename: checkPandaVersion.h - * Created by: drose (26Jan05) - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * 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." - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/******************************************************************* - * Generated automatically by CMake. - ***************************** DO NOT EDIT *************************/ - -/* Include this file in code that compiles with Panda to guarantee - that it is linking with the same version of the Panda DLL's that it - was compiled with. You should include it in one .cxx file only. */ - -/* We guarantee this by defining an external symbol which is based on - the version number. If that symbol is defined, then our DLL's - (probably) match. Otherwise, we must be running with the wrong - DLL; but the system linker will prevent the DLL from loading with - an undefined symbol. */ - -#include "dtoolbase.h" - -extern EXPCL_DTOOL_DTOOLUTIL int @PANDA_VERSION_SYMBOL@; - -#ifndef WIN32 -/* For Windows, exporting the symbol from the DLL is sufficient; the - DLL will not load unless all expected public symbols are defined. - Other systems may not mind if the symbol is absent unless we - explictly write code that references it. */ -static int check_panda_version = @PANDA_VERSION_SYMBOL@; -#endif diff --git a/dtool/src/interrogatedb/CMakeLists.txt b/dtool/src/interrogatedb/CMakeLists.txt index ef1b7fe25f..b4527b4ab9 100644 --- a/dtool/src/interrogatedb/CMakeLists.txt +++ b/dtool/src/interrogatedb/CMakeLists.txt @@ -27,24 +27,53 @@ set(P3INTERROGATEDB_SOURCES py_panda.cxx py_wrappers.cxx) -composite_sources(p3interrogatedb P3INTERROGATEDB_SOURCES) +set(P3INTERROGATEDB_IGATE + interrogate_interface.h + interrogate_request.h +) -set(P3INTERROGATEDB_IGATE_SOURCES - config_interrogatedb.cxx - indexRemapper.cxx - interrogateComponent.cxx interrogateDatabase.cxx - interrogateElement.cxx interrogateFunction.cxx - interrogateFunctionWrapper.cxx - interrogateMakeSeq.cxx - interrogateManifest.cxx - interrogateType.cxx interrogate_datafile.cxx - interrogate_interface.cxx interrogate_request.cxx) +composite_sources(p3interrogatedb P3INTERROGATEDB_SOURCES) add_component_library(p3interrogatedb SYMBOL SYMBOL BUILDING_INTERROGATEDB ${P3INTERROGATEDB_HEADERS} ${P3INTERROGATEDB_SOURCES}) target_link_libraries(p3interrogatedb p3dconfig) target_use_packages(p3interrogatedb PYTHON) -target_interrogate(p3interrogatedb ${P3INTERROGATEDB_IGATE_SOURCES}) install(TARGETS p3interrogatedb DESTINATION lib) install(FILES ${P3INTERROGATEDB_HEADERS} DESTINATION include/panda3d) + +# ALSO: This has an Interrogate binding! Take care of that if we want it. +# Note we don't use the regular Interrogate macros; this has some custom flags +# that would make it not worthwhile. + +if(NOT HAVE_PYTHON OR NOT INTERROGATE_PYTHON_INTERFACE) + return() +endif() + +add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/interrogatedb_module.cxx" + COMMAND interrogate + -D EXPCL_INTERROGATEDB= + -nodb -python -promiscuous + -module panda3d.interrogatedb + -library interrogatedb + -string -true-names -do-module + -srcdir "${CMAKE_CURRENT_SOURCE_DIR}" + -oc "${CMAKE_CURRENT_BINARY_DIR}/interrogatedb_module.cxx" + ${P3INTERROGATEDB_IGATE} + DEPENDS interrogate ${P3INTERROGATEDB_IGATE} + COMMENT "Interrogating interrogatedb" +) + +add_library(interrogatedb ${MODULE_TYPE} + "${CMAKE_CURRENT_BINARY_DIR}/interrogatedb_module.cxx") +target_use_packages(interrogatedb PYTHON) +target_link_libraries(interrogatedb p3dtoolconfig) + +set_target_properties(interrogatedb PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/panda3d" + PREFIX "" + OUTPUT_NAME "interrogatedb" +) + +install(TARGETS interrogatedb DESTINATION "${PYTHON_ARCH_INSTALL_DIR}/panda3d") 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/CMakeLists.txt b/panda/metalibs/panda/CMakeLists.txt index 55383b0c24..942ef26dd9 100644 --- a/panda/metalibs/panda/CMakeLists.txt +++ b/panda/metalibs/panda/CMakeLists.txt @@ -11,14 +11,6 @@ if(HAVE_FREETYPE) list(APPEND PANDA_LINK_TARGETS p3pnmtext) endif() -if(LINK_IN_PHYSX) - add_definitions(-DBUILDING_PANDAPHYSX) - set(PANDA_LINK_TARGETS - ${PANDA_LINK_TARGETS} - p3physx - ) -endif() - add_metalib(panda panda.cxx COMPONENTS ${PANDA_LINK_TARGETS}) set_target_properties(panda PROPERTIES DEFINE_SYMBOL BUILDING_LIBPANDA) 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/CMakeLists.txt b/panda/src/pstatclient/CMakeLists.txt index c14ad4e21d..809c5b2ede 100644 --- a/panda/src/pstatclient/CMakeLists.txt +++ b/panda/src/pstatclient/CMakeLists.txt @@ -1,5 +1,5 @@ set(P3PSTATCLIENT_HEADERS - config_pstats.h pStatClient.I pStatClient.h + config_pstatclient.h pStatClient.I pStatClient.h pStatClientImpl.I pStatClientImpl.h pStatClientVersion.I pStatClientVersion.h pStatClientControlMessage.h @@ -10,7 +10,7 @@ set(P3PSTATCLIENT_HEADERS pStatTimer.I pStatTimer.h) set(P3PSTATCLIENT_SOURCES - config_pstats.cxx pStatClient.cxx pStatClientImpl.cxx + config_pstatclient.cxx pStatClient.cxx pStatClientImpl.cxx pStatClientVersion.cxx pStatClientControlMessage.cxx pStatCollector.cxx @@ -28,3 +28,4 @@ target_interrogate(p3pstatclient ALL) install(TARGETS p3pstatclient DESTINATION lib) install(FILES ${P3PSTATCLIENT_HEADERS} DESTINATION include/panda3d) +install(FILES config_pstats.h DESTINATION include/panda3d) 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/CMakeLists.txt b/panda/src/putil/CMakeLists.txt index 412706e273..9da712f192 100644 --- a/panda/src/putil/CMakeLists.txt +++ b/panda/src/putil/CMakeLists.txt @@ -23,7 +23,7 @@ set(P3PUTIL_HEADERS copyOnWriteObject.h copyOnWriteObject.I copyOnWritePointer.h copyOnWritePointer.I compareTo.I compareTo.h - config_util.N config_util.h configurable.h + config_putil.N config_putil.h configurable.h cPointerCallbackObject.h cPointerCallbackObject.I datagramBuffer.I datagramBuffer.h datagramInputFile.I datagramInputFile.h @@ -83,7 +83,7 @@ set(P3PUTIL_SOURCES colorSpace.cxx copyOnWriteObject.cxx copyOnWritePointer.cxx - config_util.cxx configurable.cxx + config_putil.cxx configurable.cxx cPointerCallbackObject.cxx datagramBuffer.cxx datagramInputFile.cxx datagramOutputFile.cxx @@ -131,6 +131,7 @@ target_interrogate(p3putil ALL EXTENSIONS ${P3PUTIL_IGATEEXT}) install(TARGETS p3putil DESTINATION lib) install(FILES ${P3PUTIL_HEADERS} DESTINATION include/panda3d) +install(FILES config_util.h DESTINATION include/panda3d) #begin test_bin_target #define TARGET test_bamRead 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