Browse Source

Merge branch 'cmake' of https://github.com/panda3d/panda3d into cmake

Donny Lawrence 7 years ago
parent
commit
8b51b0faeb
100 changed files with 606 additions and 428 deletions
  1. 1 1
      .travis.yml
  2. 61 63
      cmake/macros/Interrogate.cmake
  3. 48 57
      direct/src/showbase/PythonUtil.py
  4. 4 1
      direct/src/showbase/ShowBase.py
  5. 75 8
      direct/src/showbase/Transitions.py
  6. 1 1
      dtool/Config.cmake
  7. 5 0
      dtool/LocalSetup.cmake
  8. 0 3
      dtool/dtool_config.h.in
  9. 0 24
      dtool/metalibs/dtoolconfig/CMakeLists.txt
  10. 18 6
      dtool/src/cppparser/cppEnumType.cxx
  11. 4 4
      dtool/src/cppparser/cppExpression.cxx
  12. 9 0
      dtool/src/dtoolbase/CMakeLists.txt
  13. 1 1
      dtool/src/dtoolbase/checkPandaVersion.cxx.in
  14. 64 0
      dtool/src/dtoolbase/checkPandaVersion.h.in
  15. 5 0
      dtool/src/dtoolbase/dtoolbase_cc.h
  16. 0 0
      dtool/src/dtoolbase/pandaVersion.h.in
  17. 0 8
      dtool/src/dtoolutil/CMakeLists.txt
  18. 0 39
      dtool/src/dtoolutil/checkPandaVersion.h.in
  19. 41 12
      dtool/src/interrogatedb/CMakeLists.txt
  20. 1 1
      makepanda/installer.nsi
  21. 4 2
      makepanda/makepanda.py
  22. 4 4
      makepanda/makepanda.vcproj
  23. 0 8
      panda/metalibs/panda/CMakeLists.txt
  24. 1 1
      panda/metalibs/panda/panda.cxx
  25. 1 1
      panda/src/android/android_main.cxx
  26. 1 1
      panda/src/audio/audioManager.cxx
  27. 1 1
      panda/src/audiotraits/fmodAudioManager.cxx
  28. 1 1
      panda/src/audiotraits/milesAudioManager.cxx
  29. 1 1
      panda/src/audiotraits/openalAudioManager.cxx
  30. 6 1
      panda/src/bullet/bulletWorld.cxx
  31. 1 1
      panda/src/collada/load_collada_file.cxx
  32. 1 1
      panda/src/display/graphicsPipeSelection.cxx
  33. 1 1
      panda/src/display/graphicsStateGuardian.cxx
  34. 1 1
      panda/src/display/pStatGPUTimer.h
  35. 17 0
      panda/src/downloader/httpChannel.I
  36. 2 1
      panda/src/downloader/httpChannel.cxx
  37. 4 0
      panda/src/downloader/httpChannel.h
  38. 1 1
      panda/src/egg/eggData.cxx
  39. 1 1
      panda/src/egg2pg/load_egg_file.cxx
  40. 1 1
      panda/src/egg2pg/save_egg_file.cxx
  41. 1 0
      panda/src/event/asyncTask.h
  42. 5 1
      panda/src/event/asyncTaskChain.cxx
  43. 8 1
      panda/src/event/asyncTaskChain.h
  44. 3 0
      panda/src/event/pythonTask.cxx
  45. 2 2
      panda/src/glstuff/glGraphicsStateGuardian_src.cxx
  46. 1 1
      panda/src/gobj/config_gobj.cxx
  47. 1 1
      panda/src/gobj/shader.cxx
  48. 1 1
      panda/src/gobj/texture.cxx
  49. 1 1
      panda/src/gobj/texturePool.cxx
  50. 1 1
      panda/src/iphonedisplay/iPhoneGraphicsWindow.mm
  51. 1 1
      panda/src/movies/movieTypeRegistry.cxx
  52. 1 1
      panda/src/osxdisplay/osxGraphicsWindow.mm
  53. 1 1
      panda/src/pgraph/bamFile.cxx
  54. 1 1
      panda/src/pgraph/loader.cxx
  55. 1 1
      panda/src/pgraph/shaderPool.cxx
  56. 1 1
      panda/src/physx/physxEnums.cxx
  57. 1 1
      panda/src/pnmtext/freetypeFont.cxx
  58. 3 2
      panda/src/pstatclient/CMakeLists.txt
  59. 4 4
      panda/src/pstatclient/config_pstatclient.cxx
  60. 50 0
      panda/src/pstatclient/config_pstatclient.h
  61. 2 50
      panda/src/pstatclient/config_pstats.h
  62. 1 1
      panda/src/pstatclient/p3pstatclient_composite1.cxx
  63. 1 1
      panda/src/pstatclient/pStatClient.cxx
  64. 1 1
      panda/src/pstatclient/pStatClientControlMessage.cxx
  65. 1 1
      panda/src/pstatclient/pStatClientImpl.cxx
  66. 1 1
      panda/src/pstatclient/pStatFrameData.cxx
  67. 1 1
      panda/src/pstatclient/pStatProperties.cxx
  68. 1 1
      panda/src/pstatclient/pStatServerControlMessage.cxx
  69. 1 1
      panda/src/pstatclient/test_client.cxx
  70. 3 2
      panda/src/putil/CMakeLists.txt
  71. 1 1
      panda/src/putil/autoTextureScale.cxx
  72. 1 1
      panda/src/putil/bamCache.cxx
  73. 1 1
      panda/src/putil/bamCacheIndex.cxx
  74. 1 1
      panda/src/putil/bamCacheRecord.cxx
  75. 1 1
      panda/src/putil/bamEnums.cxx
  76. 1 1
      panda/src/putil/bamReader.cxx
  77. 1 1
      panda/src/putil/bamReader_ext.cxx
  78. 29 3
      panda/src/putil/bamWriter.cxx
  79. 2 1
      panda/src/putil/bamWriter.h
  80. 1 1
      panda/src/putil/buttonRegistry.cxx
  81. 1 1
      panda/src/putil/clockObject.cxx
  82. 1 1
      panda/src/putil/colorSpace.cxx
  83. 0 0
      panda/src/putil/config_putil.N
  84. 4 4
      panda/src/putil/config_putil.cxx
  85. 55 0
      panda/src/putil/config_putil.h
  86. 2 55
      panda/src/putil/config_util.h
  87. 1 1
      panda/src/putil/copyOnWritePointer.cxx
  88. 1 1
      panda/src/putil/datagramInputFile.cxx
  89. 1 1
      panda/src/putil/datagramOutputFile.h
  90. 1 1
      panda/src/putil/factoryBase.cxx
  91. 1 1
      panda/src/putil/globalPointerRegistry.cxx
  92. 1 1
      panda/src/putil/keyboardButton.cxx
  93. 1 1
      panda/src/putil/load_prc_file.cxx
  94. 2 2
      panda/src/putil/loaderOptions.cxx
  95. 1 1
      panda/src/putil/mouseButton.cxx
  96. 1 1
      panda/src/putil/p3putil_composite1.cxx
  97. 1 1
      panda/src/putil/pythonCallbackObject.cxx
  98. 1 1
      panda/src/putil/simpleHashMap.h
  99. 1 1
      panda/src/putil/test_filename.cxx
  100. 1 1
      panda/src/putil/weakKeyHashMap.h

+ 1 - 1
.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
 

+ 61 - 63
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 HAVE_PYTHON OR NOT INTERROGATE_PYTHON_INTERFACE)
+    return()
+  endif()
 
-    if(NOT link_targets)
-      set(link_targets ${targets})
-    endif()
+  set(targets)
+  set(link_targets)
+  set(import_flags)
+  set(infiles)
+  set(sources)
 
-    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})
+  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()
-      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")
+      list(APPEND targets "${arg}")
     endif()
+  endforeach(arg)
+
+  if(NOT link_targets)
+    set(link_targets ${targets})
+  endif()
 
-    install(TARGETS ${module} DESTINATION "${PYTHON_ARCH_INSTALL_DIR}/panda3d")
+  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)
 
-    list(APPEND ALL_INTERROGATE_MODULES "${module}")
-    set(ALL_INTERROGATE_MODULES "${ALL_INTERROGATE_MODULES}" CACHE INTERNAL "Internal variable")
+  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)
 
 

+ 48 - 57
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

+ 4 - 1
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:

+ 75 - 8
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

+ 1 - 1
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)

+ 5 - 0
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.

+ 0 - 3
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@"

+ 0 - 24
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()

+ 18 - 6
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();
-
-    if (elem_rep != _elements[i]) {
-      rep->_elements[i] = elem_rep;
+    // 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 (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;
     }
   }

+ 4 - 4
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<long>(_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<long>(_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<void*>((long)_u._integer);
+    return (void *)(intptr_t)_u._integer;
 
   case RT_real:
-    return reinterpret_cast<void*>((long)_u._real);
+    return (void *)(uintptr_t)_u._real;
 
   case RT_pointer:
     return _u._pointer;

+ 9 - 0
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
   $<TARGET_PROPERTY:p3interrogatedb,INTERFACE_INCLUDE_DIRECTORIES>)
+# 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})
 

+ 1 - 1
dtool/src/dtoolutil/checkPandaVersion.cxx.in → 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;

+ 64 - 0
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<typename T>
+class CheckPandaVersion {
+public:
+  int check() { return @PANDA_VERSION_SYMBOL@; }
+};
+
+template class CheckPandaVersion<void>;
+
+#endif

+ 5 - 0
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 <tr1/tuple>
+
+using std::tr1::tuple;
+using std::tr1::tie;
+
 typedef decltype(nullptr) nullptr_t;
 
 template<class T> struct remove_reference      {typedef T type;};

+ 0 - 0
dtool/src/dtoolutil/pandaVersion.h.in → dtool/src/dtoolbase/pandaVersion.h.in


+ 0 - 8
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
   $<TARGET_PROPERTY:p3interrogatedb,INTERFACE_INCLUDE_DIRECTORIES>)

+ 0 - 39
dtool/src/dtoolutil/checkPandaVersion.h.in

@@ -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

+ 41 - 12
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")

+ 1 - 1
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}

+ 4 - 2
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)

+ 4 - 4
makepanda/makepanda.vcproj

@@ -1228,7 +1228,7 @@
 				<File RelativePath="..\panda\src\putil\pta_double.h"></File>
 				<File RelativePath="..\panda\src\putil\copyOnWritePointer.cxx"></File>
 				<File RelativePath="..\panda\src\putil\bitMask.cxx"></File>
-				<File RelativePath="..\panda\src\putil\config_util.h"></File>
+				<File RelativePath="..\panda\src\putil\config_putil.h"></File>
 				<File RelativePath="..\panda\src\putil\clockObject.h"></File>
 				<File RelativePath="..\panda\src\putil\lineStream.h"></File>
 				<File RelativePath="..\panda\src\putil\datagramInputFile.cxx"></File>
@@ -1307,7 +1307,7 @@
 				<File RelativePath="..\panda\src\putil\bamCacheRecord.I"></File>
 				<File RelativePath="..\panda\src\putil\animInterface.cxx"></File>
 				<File RelativePath="..\panda\src\putil\lineStreamBuf.h"></File>
-				<File RelativePath="..\panda\src\putil\config_util.cxx"></File>
+				<File RelativePath="..\panda\src\putil\config_putil.cxx"></File>
 				<File RelativePath="..\panda\src\putil\cachedTypedWritableReferenceCount.cxx"></File>
 				<File RelativePath="..\panda\src\putil\pythonCallbackObject.cxx"></File>
 				<File RelativePath="..\panda\src\putil\test_linestream.cxx"></File>
@@ -2322,8 +2322,8 @@
 				<File RelativePath="..\panda\src\pstatclient\pStatCollectorForward.h"></File>
 				<File RelativePath="..\panda\src\pstatclient\pStatClientControlMessage.h"></File>
 				<File RelativePath="..\panda\src\pstatclient\pStatServerControlMessage.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\config_pstats.h"></File>
-				<File RelativePath="..\panda\src\pstatclient\config_pstats.cxx"></File>
+				<File RelativePath="..\panda\src\pstatclient\config_pstatclient.h"></File>
+				<File RelativePath="..\panda\src\pstatclient\config_pstatclient.cxx"></File>
 				<File RelativePath="..\panda\src\pstatclient\pStatClient.cxx"></File>
 				<File RelativePath="..\panda\src\pstatclient\pStatFrameData.I"></File>
 				<File RelativePath="..\panda\src\pstatclient\test_client.cxx"></File>

+ 0 - 8
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)
 

+ 1 - 1
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

+ 1 - 1
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"

+ 1 - 1
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

+ 1 - 1
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"

+ 1 - 1
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"

+ 1 - 1
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"

+ 6 - 1
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();
   }
 }
 

+ 1 - 1
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)

+ 1 - 1
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 <algorithm>
 

+ 1 - 1
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 <algorithm>
 #include <limits.h>

+ 1 - 1
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;

+ 17 - 0
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

+ 2 - 1
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";
   }
 

+ 4 - 0
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;

+ 1 - 1
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"

+ 1 - 1
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)

+ 1 - 1
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

+ 1 - 0
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;

+ 5 - 1
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()) {

+ 8 - 1
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;
 

+ 3 - 0
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
 

+ 2 - 2
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();
   }

+ 1 - 1
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"

+ 1 - 1
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"
 

+ 1 - 1
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"

+ 1 - 1
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"

+ 1 - 1
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"
 

+ 1 - 1
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;

+ 1 - 1
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"
 

+ 1 - 1
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"

+ 1 - 1
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"

+ 1 - 1
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"

+ 1 - 1
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) {

+ 1 - 1
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"

+ 3 - 2
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)

+ 4 - 4
panda/src/pstatclient/config_pstats.cxx → 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();
 }
 

+ 50 - 0
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

+ 2 - 50
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.

+ 1 - 1
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"

+ 1 - 1
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"

+ 1 - 1
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"
 

+ 1 - 1
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"
 

+ 1 - 1
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"

+ 1 - 1
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"

+ 1 - 1
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"

+ 1 - 1
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"

+ 3 - 2
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

+ 1 - 1
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) {

+ 1 - 1
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"

+ 1 - 1
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 <algorithm>
 

+ 1 - 1
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;
 

+ 1 - 1
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) {

+ 1 - 1
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;

+ 1 - 1
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

+ 29 - 3
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<TypedWritable*>(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

+ 2 - 1
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<const TypedWritable *, StoreState, pointer_hash> StateMap;
   StateMap _state_map;

+ 1 - 1
panda/src/putil/buttonRegistry.cxx

@@ -12,7 +12,7 @@
  */
 
 #include "buttonRegistry.h"
-#include "config_util.h"
+#include "config_putil.h"
 
 #include <stdio.h>
 

+ 1 - 1
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"

+ 1 - 1
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"
 

+ 0 - 0
panda/src/putil/config_util.N → panda/src/putil/config_putil.N


+ 4 - 4
panda/src/putil/config_util.cxx → 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<BamEnums::BamTextureMode> 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();
 }
 

+ 55 - 0
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<BamEnums::BamEndian> bam_endian;
+extern EXPCL_PANDA_PUTIL ConfigVariableBool bam_stdfloat_double;
+extern EXPCL_PANDA_PUTIL ConfigVariableEnum<BamEnums::BamTextureMode> 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__ */

+ 2 - 55
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<BamEnums::BamEndian> bam_endian;
-extern EXPCL_PANDA_PUTIL ConfigVariableBool bam_stdfloat_double;
-extern EXPCL_PANDA_PUTIL ConfigVariableEnum<BamEnums::BamTextureMode> 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.

+ 1 - 1
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

+ 1 - 1
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"

+ 1 - 1
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

+ 1 - 1
panda/src/putil/factoryBase.cxx

@@ -13,7 +13,7 @@
 
 #include "factoryBase.h"
 #include "indent.h"
-#include "config_util.h"
+#include "config_putil.h"
 
 /**
  *

+ 1 - 1
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,

+ 1 - 1
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() {

+ 1 - 1
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"
 
 /**

+ 2 - 2
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;

+ 1 - 1
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() {

+ 1 - 1
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"

+ 1 - 1
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;
 

+ 1 - 1
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.

+ 1 - 1
panda/src/putil/test_filename.cxx

@@ -12,7 +12,7 @@
  */
 
 #include "filename.h"
-#include "config_util.h"
+#include "config_putil.h"
 
 #include "dSearchPath.h"
 

+ 1 - 1
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"
 
 /**

Some files were not shown because too many files changed in this diff