Browse Source

Merge branch 'master' into deploy-ng

rdb 7 years ago
parent
commit
3d7fcf2ce9
100 changed files with 485 additions and 2304 deletions
  1. 1 1
      contrib/src/rplight/gpuCommand.I
  2. 1 1
      direct/src/plugin/fileSpec.cxx
  3. 1 1
      direct/src/plugin/get_twirl_data.cxx
  4. 1 1
      direct/src/plugin/load_plugin.cxx
  5. 3 3
      direct/src/plugin/p3dCert.h
  6. 2 2
      direct/src/plugin/p3dCert_wx.cxx
  7. 4 4
      direct/src/plugin/p3dCert_wx.h
  8. 1 1
      direct/src/plugin/p3dHost.cxx
  9. 3 3
      direct/src/plugin/p3dInstanceManager.h
  10. 1 1
      direct/src/plugin/p3dPackage.cxx
  11. 3 3
      direct/src/plugin_activex/P3DActiveX.cpp
  12. 3 3
      direct/src/plugin_activex/P3DActiveXCtrl.cpp
  13. 1 1
      direct/src/plugin_activex/P3DActiveXCtrl.h
  14. 1 1
      direct/src/plugin_activex/PPInstance.h
  15. 1 1
      direct/src/plugin_activex/PPInterface.cpp
  16. 2 1
      direct/src/plugin_activex/PPLogger.cpp
  17. 1 1
      direct/src/plugin_npapi/nppanda3d_common.h
  18. 4 4
      direct/src/showutil/FreezeTool.py
  19. 1 1
      dtool/metalibs/dtoolconfig/pydtool.cxx
  20. 7 2
      dtool/src/interrogate/functionRemap.cxx
  21. 78 10
      dtool/src/interrogate/interfaceMakerPythonNative.cxx
  22. 2 2
      dtool/src/interrogate/interfaceMakerPythonNative.h
  23. 1 1
      dtool/src/interrogatedb/py_compat.h
  24. 1 1
      dtool/src/interrogatedb/py_panda.h
  25. 0 3
      dtool/src/parser-inc/Python.h
  26. 1 1
      dtool/src/prc/configPage.cxx
  27. 2 2
      dtool/src/prc/encryptStreamBuf.cxx
  28. 2 2
      dtool/src/prc/prcKeyRegistry.cxx
  29. 5 5
      dtool/src/prckeys/makePrcKey.cxx
  30. 5 5
      dtool/src/prckeys/signPrcFile_src.cxx
  31. 23 9
      makepanda/installer.nsi
  32. 20 20
      makepanda/makepanda.py
  33. 30 26
      makepanda/makepandacore.py
  34. 5 0
      makepanda/test_wheel.py
  35. 2 1
      panda/src/android/android_main.cxx
  36. 1 1
      panda/src/audiotraits/fmodAudioSound.h
  37. 2 1
      panda/src/audiotraits/globalMilesManager.h
  38. 2 1
      panda/src/audiotraits/milesAudioManager.h
  39. 2 1
      panda/src/audiotraits/milesAudioSample.h
  40. 2 1
      panda/src/audiotraits/milesAudioSequence.h
  41. 2 1
      panda/src/audiotraits/milesAudioSound.h
  42. 2 1
      panda/src/audiotraits/milesAudioStream.h
  43. 16 0
      panda/src/audiotraits/openalAudioManager.cxx
  44. 2 1
      panda/src/awesomium/awWebCore.cxx
  45. 3 3
      panda/src/awesomium/awesomium_includes.h
  46. 15 15
      panda/src/bullet/bullet_includes.h
  47. 5 0
      panda/src/cocoadisplay/cocoaGraphicsStateGuardian.mm
  48. 0 93
      panda/src/collada/colladaBindMaterial.cxx
  49. 0 41
      panda/src/collada/colladaBindMaterial.h
  50. 0 28
      panda/src/collada/colladaInput.I
  51. 0 265
      panda/src/collada/colladaInput.cxx
  52. 0 77
      panda/src/collada/colladaInput.h
  53. 0 12
      panda/src/collada/colladaLoader.I
  54. 0 549
      panda/src/collada/colladaLoader.cxx
  55. 0 76
      panda/src/collada/colladaLoader.h
  56. 0 40
      panda/src/collada/colladaPrimitive.I
  57. 0 293
      panda/src/collada/colladaPrimitive.cxx
  58. 0 71
      panda/src/collada/colladaPrimitive.h
  59. 0 87
      panda/src/collada/config_collada.cxx
  60. 0 36
      panda/src/collada/config_collada.h
  61. 0 92
      panda/src/collada/load_collada_file.cxx
  62. 0 36
      panda/src/collada/load_collada_file.h
  63. 0 74
      panda/src/collada/loaderFileTypeDae.cxx
  64. 0 54
      panda/src/collada/loaderFileTypeDae.h
  65. 0 3
      panda/src/collada/p3collada_composite1.cxx
  66. 0 28
      panda/src/collada/pre_collada_include.h
  67. 1 1
      panda/src/device/clientBase.h
  68. 4 0
      panda/src/display/p3display_ext_composite.cxx
  69. 2 0
      panda/src/display/windowProperties.cxx
  70. 7 2
      panda/src/display/windowProperties.h
  71. 82 0
      panda/src/display/windowProperties_ext.cxx
  72. 37 0
      panda/src/display/windowProperties_ext.h
  73. 1 1
      panda/src/downloader/bioPtr.cxx
  74. 2 1
      panda/src/downloader/httpCookie.cxx
  75. 2 2
      panda/src/downloader/httpDigestAuthorization.cxx
  76. 1 1
      panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx
  77. 1 1
      panda/src/express/config_express.h
  78. 1 1
      panda/src/express/hashVal.cxx
  79. 5 5
      panda/src/express/openSSLWrapper.h
  80. 1 1
      panda/src/express/password_hash.cxx
  81. 1 1
      panda/src/express/patchfile.cxx
  82. 3 3
      panda/src/ffmpeg/config_ffmpeg.cxx
  83. 5 5
      panda/src/ffmpeg/ffmpegAudioCursor.cxx
  84. 1 1
      panda/src/ffmpeg/ffmpegAudioCursor.h
  85. 4 4
      panda/src/ffmpeg/ffmpegVideoCursor.cxx
  86. 2 2
      panda/src/ffmpeg/ffmpegVirtualFile.cxx
  87. 1 1
      panda/src/ffmpeg/ffmpegVirtualFile.h
  88. 4 4
      panda/src/glstuff/glGraphicsStateGuardian_src.cxx
  89. 2 1
      panda/src/grutil/movieTexture.cxx
  90. 1 1
      panda/src/mathutil/fftCompressor.cxx
  91. 0 119
      panda/src/ode/odeHeightFieldGeom.h
  92. 1 1
      panda/src/ode/ode_includes.h
  93. 1 1
      panda/src/pgraph/config_pgraph.h
  94. 20 21
      panda/src/pgraphnodes/shaderGenerator.cxx
  95. 1 1
      panda/src/physx/physxFileStream.cxx
  96. 10 10
      panda/src/physx/physx_includes.h
  97. 1 1
      panda/src/speedtree/speedTreeNode.cxx
  98. 4 4
      panda/src/speedtree/speedtree_api.h
  99. 2 1
      panda/src/tinydisplay/tinySDLGraphicsWindow.h
  100. 1 1
      panda/src/tinydisplay/vertex.cxx

+ 1 - 1
contrib/src/rplight/gpuCommand.I

@@ -24,7 +24,7 @@
  *
  */
 
-#include "stdint.h"
+#include <stdint.h>
 
 /**
  * @brief Appends an integer to the GPUCommand.

+ 1 - 1
direct/src/plugin/fileSpec.cxx

@@ -13,7 +13,7 @@
 
 #include "fileSpec.h"
 #include "wstring_encode.h"
-#include "openssl/md5.h"
+#include <openssl/md5.h>
 
 #include <fstream>
 #include <fcntl.h>

+ 1 - 1
direct/src/plugin/get_twirl_data.cxx

@@ -12,7 +12,7 @@
  */
 
 #include "get_twirl_data.h"
-#include "string.h"
+#include <string.h>
 
 struct twirl_flip {
   int _index;

+ 1 - 1
direct/src/plugin/load_plugin.cxx

@@ -16,7 +16,7 @@
 #include "is_pathsep.h"
 #include "wstring_encode.h"
 
-#include "assert.h"
+#include <assert.h>
 
 #include <iostream>
 

+ 3 - 3
direct/src/plugin/p3dCert.h

@@ -18,9 +18,9 @@
 #include <FL/Fl_Window.H>
 
 #define OPENSSL_NO_KRB5
-#include "openssl/x509.h"
-#include "openssl/x509_vfy.h"
-#include "openssl/pem.h"
+#include <openssl/x509.h>
+#include <openssl/x509_vfy.h>
+#include <openssl/pem.h>
 
 #include <string>
 #include <iostream>

+ 2 - 2
direct/src/plugin/p3dCert_wx.cxx

@@ -15,8 +15,8 @@
 #include "wstring_encode.h"
 #include "mkdir_complete.h"
 
-#include "wx/cmdline.h"
-#include "wx/filename.h"
+#include <wx/cmdline.h>
+#include <wx/filename.h>
 
 #include "ca_bundle_data_src.c"
 

+ 4 - 4
direct/src/plugin/p3dCert_wx.h

@@ -14,12 +14,12 @@
 #ifndef P3DCERT_WX_H
 #define P3DCERT_WX_H
 
-#include "wx/wx.h"
+#include <wx/wx.h>
 
 #define OPENSSL_NO_KRB5
-#include "openssl/x509.h"
-#include "openssl/x509_vfy.h"
-#include "openssl/pem.h"
+#include <openssl/x509.h>
+#include <openssl/x509_vfy.h>
+#include <openssl/pem.h>
 
 #include <string>
 #include <iostream>

+ 1 - 1
direct/src/plugin/p3dHost.cxx

@@ -17,7 +17,7 @@
 #include "mkdir_complete.h"
 #include "wstring_encode.h"
 #include "xml_helpers.h"
-#include "openssl/md5.h"
+#include <openssl/md5.h>
 
 #include <algorithm>
 

+ 3 - 3
direct/src/plugin/p3dInstanceManager.h

@@ -26,9 +26,9 @@
 #endif
 
 #define OPENSSL_NO_KRB5
-#include "openssl/x509.h"
-#include "openssl/pem.h"
-#include "openssl/md5.h"
+#include <openssl/x509.h>
+#include <openssl/pem.h>
+#include <openssl/md5.h>
 
 class P3DInstance;
 class P3DSession;

+ 1 - 1
direct/src/plugin/p3dPackage.cxx

@@ -20,7 +20,7 @@
 #include "mkdir_complete.h"
 #include "wstring_encode.h"
 
-#include "zlib.h"
+#include <zlib.h>
 
 #include <algorithm>
 #include <fstream>

+ 3 - 3
direct/src/plugin_activex/P3DActiveX.cpp

@@ -16,9 +16,9 @@
 #include "stdafx.h"
 #include "P3DActiveX.h"
 
-#include "comcat.h"
-#include "strsafe.h"
-#include "objsafe.h"
+#include <comcat.h>
+#include <strsafe.h>
+#include <objsafe.h>
 
 
 #ifdef _DEBUG

+ 3 - 3
direct/src/plugin_activex/P3DActiveXCtrl.cpp

@@ -20,9 +20,9 @@
 #include "P3DActiveXPropPage.h"
 #include "PPBrowserObject.h"
 
-#include "Mshtml.h"
-#include "atlconv.h"
-#include "comutil.h"
+#include <Mshtml.h>
+#include <atlconv.h>
+#include <comutil.h>
 
 #include <strstream>
 

+ 1 - 1
direct/src/plugin_activex/P3DActiveXCtrl.h

@@ -19,7 +19,7 @@
 #include "PPPandaObject.h"
 #include "PPInterface.h"
 #include "get_twirl_data.h"
-#include "Mshtml.h"
+#include <Mshtml.h>
 
 #include <vector>
 

+ 1 - 1
direct/src/plugin_activex/PPInstance.h

@@ -16,7 +16,7 @@
 #include <string>
 #include <vector>
 #include <math.h>
-#include "afxmt.h"
+#include <afxmt.h>
 
 #include "p3d_plugin.h"
 #include "PPDownloadCallback.h"

+ 1 - 1
direct/src/plugin_activex/PPInterface.cpp

@@ -20,7 +20,7 @@
 #include "P3DActiveXCtrl.h"
 
 #include <strstream>
-#include "Mshtml.h"
+#include <Mshtml.h>
 
 PPInterface::PPInterface( )
 {

+ 2 - 1
direct/src/plugin_activex/PPLogger.cpp

@@ -13,11 +13,12 @@
 
 #include "stdafx.h"
 
-#include "windows.h"
 #include "PPLogger.h"
 #include "mkdir_complete.h"
 #include "wstring_encode.h"
 
+#include <windows.h>
+
 std::ofstream PPLogger::m_logfile;
 bool PPLogger::m_isOpen = false;
 

+ 1 - 1
direct/src/plugin_npapi/nppanda3d_common.h

@@ -64,7 +64,7 @@ extern bool has_plugin_thread_async_call;
 
 #include "npapi.h"
 #if NP_VERSION_MAJOR == 0 && NP_VERSION_MINOR <= 19
-  #include "npupp.h"
+  #include <npupp.h>
 #else
   // Somewhere between version 0.19 and 0.22, Mozilla renamed npupp.h to
   // npfunctions.h.

+ 4 - 4
direct/src/showutil/FreezeTool.py

@@ -308,7 +308,7 @@ class CompilationEnvironment:
 frozenMainCode = """
 /* Python interpreter main program for frozen scripts */
 
-#include "Python.h"
+#include <Python.h>
 
 #if PY_MAJOR_VERSION >= 3
 #include <locale.h>
@@ -443,7 +443,7 @@ error:
 # The code from frozen_dllmain.c in the Python source repository.
 # Windows only.
 frozenDllMainCode = """
-#include "windows.h"
+#include <windows.h>
 
 static char *possibleModules[] = {
     "pywintypes",
@@ -612,9 +612,9 @@ static PyMethodDef nullMethods[] = {
 """
 
 programFile = """
-#include "Python.h"
+#include <Python.h>
 #ifdef _WIN32
-#include "malloc.h"
+#include <malloc.h>
 #endif
 
 %(moduleDefs)s

+ 1 - 1
dtool/metalibs/dtoolconfig/pydtool.cxx

@@ -17,7 +17,7 @@
 #if PYTHON_FRAMEWORK
   #include <Python/Python.h>
 #else
-  #include "Python.h"
+  #include <Python.h>
 #endif
 
 static PyObject *_inP07yttbRf(PyObject *self, PyObject *args);

+ 7 - 2
dtool/src/interrogate/functionRemap.cxx

@@ -960,8 +960,13 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak
 
     } else if (!_has_this && _parameters.size() > 0 &&
                (_cppfunc->_storage_class & CPPInstance::SC_explicit) == 0) {
-      // A non-explicit non-copy constructor might be eligible for coercion.
-      _flags |= F_coerce_constructor;
+      // A non-explicit non-copy constructor might be eligible for coercion,
+      // as long as it does not require explicit keyword args.
+      if ((_flags & F_explicit_args) == 0 ||
+          _args_type != InterfaceMaker::AT_keyword_args) {
+
+        _flags |= F_coerce_constructor;
+      }
     }
 
     // Constructors always take varargs, and possibly keyword args.

+ 78 - 10
dtool/src/interrogate/interfaceMakerPythonNative.cxx

@@ -31,13 +31,13 @@
 #include "cppSimpleType.h"
 #include "cppStructType.h"
 #include "cppExpression.h"
-#include "vector"
 #include "cppParameterList.h"
-#include "algorithm"
 #include "lineStream.h"
 
-#include <set>
+#include <algorithm>
 #include <map>
+#include <set>
+#include <vector>
 
 using std::dec;
 using std::hex;
@@ -1495,11 +1495,15 @@ write_module_support(ostream &out, ostream *out_h, InterrogateModuleDef *def) {
 
   out << "  {nullptr, nullptr, 0, nullptr}\n" << "};\n\n";
 
-  out << "extern const struct LibraryDef " << def->library_name << "_moddef = {python_simple_funcs, exports, ";
   if (_external_imports.empty()) {
-    out << "nullptr};\n";
+    out << "extern const struct LibraryDef " << def->library_name << "_moddef = {python_simple_funcs, exports, nullptr};\n";
   } else {
-    out << "imports};\n";
+    out <<
+      "#ifdef LINK_ALL_STATIC\n"
+      "extern const struct LibraryDef " << def->library_name << "_moddef = {python_simple_funcs, exports, nullptr};\n"
+      "#else\n"
+      "extern const struct LibraryDef " << def->library_name << "_moddef = {python_simple_funcs, exports, imports};\n"
+      "#endif\n";
   }
   if (out_h != nullptr) {
     *out_h << "extern const struct LibraryDef " << def->library_name << "_moddef;\n";
@@ -1644,6 +1648,16 @@ write_module_class(ostream &out, Object *obj) {
 
     if (!func->_has_this) {
       flags += " | METH_STATIC";
+
+      // Skip adding this entry if we also have a property with the same name.
+      // In that case, we will use a Dtool_StaticProperty to disambiguate
+      // access to this method.  See GitHub issue #444.
+      for (const Property *property : obj->_properties) {
+        if (property->_has_this &&
+            property->_ielement.get_name() == func->_ifunc.get_name()) {
+          continue;
+        }
+      }
     }
 
     bool has_nonslotted = false;
@@ -2661,6 +2675,14 @@ write_module_class(ostream &out, Object *obj) {
         continue;
       }
 
+      // Actually, if we have a conflicting static method with the same name,
+      // we will need to use Dtool_StaticProperty instead.
+      for (const Function *func : obj->_methods) {
+        if (!func->_has_this && func->_ifunc.get_name() == ielem.get_name()) {
+          continue;
+        }
+      }
+
       if (num_getset == 0) {
         out << "static PyGetSetDef Dtool_Properties_" << ClassName << "[] = {\n";
       }
@@ -3236,9 +3258,23 @@ write_module_class(ostream &out, Object *obj) {
   // Also add the static properties, which can't be added via getset.
   for (Property *property : obj->_properties) {
     const InterrogateElement &ielem = property->_ielement;
-    if (property->_has_this || property->_getter_remaps.empty()) {
+    if (property->_getter_remaps.empty()) {
       continue;
     }
+    if (property->_has_this) {
+      // Actually, continue if we have a conflicting static method with the
+      // same name, which may still require use of Dtool_StaticProperty.
+      bool have_shadow = false;
+      for (const Function *func : obj->_methods) {
+        if (!func->_has_this && func->_ifunc.get_name() == ielem.get_name()) {
+          have_shadow = true;
+          break;
+        }
+      }
+      if (!have_shadow) {
+        continue;
+      }
+    }
 
     string name1 = methodNameFromCppName(ielem.get_name(), "", false);
     // string name2 = methodNameFromCppName(ielem.get_name(), "", true);
@@ -6892,8 +6928,42 @@ write_getset(ostream &out, Object *obj, Property *property) {
 
   // Now write the actual getter wrapper.  It will be a different wrapper
   // depending on whether it's a mapping or a sequence.
+  out << "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter(PyObject *self, void *) {\n";
+
+  // Is this property shadowing a static method with the same name?  This is a
+  // special case to handle WindowProperties::make -- see GH #444.
+  if (property->_has_this) {
+    for (const Function *func : obj->_methods) {
+      if (!func->_has_this && func->_ifunc.get_name() == ielem.get_name()) {
+        string flags;
+        string fptr = "&" + func->_name;
+        switch (func->_args_type) {
+        case AT_keyword_args:
+          flags = "METH_VARARGS | METH_KEYWORDS";
+          fptr = "(PyCFunction) " + fptr;
+          break;
+        case AT_varargs:
+          flags = "METH_VARARGS";
+          break;
+        case AT_single_arg:
+          flags = "METH_O";
+          break;
+        default:
+          flags = "METH_NOARGS";
+          break;
+        }
+        out << "  if (self == nullptr) {\n"
+            << "    static PyMethodDef def = {\"" << ielem.get_name() << "\", "
+            << fptr << ", " << flags << " | METH_STATIC, (const char *)"
+            << func->_name << "_comment};\n"
+            << "    return PyCFunction_New(&def, nullptr);\n"
+            << "  }\n\n";
+        break;
+      }
+    }
+  }
+
   if (ielem.is_mapping()) {
-    out << "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter(PyObject *self, void *) {\n";
     if (property->_has_this) {
       out << "  nassertr(self != nullptr, nullptr);\n";
     }
@@ -6920,7 +6990,6 @@ write_getset(ostream &out, Object *obj, Property *property) {
             "}\n\n";
 
   } else if (ielem.is_sequence()) {
-    out << "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter(PyObject *self, void *) {\n";
     if (property->_has_this) {
       out << "  nassertr(self != nullptr, nullptr);\n";
     }
@@ -6951,7 +7020,6 @@ write_getset(ostream &out, Object *obj, Property *property) {
 
   } else {
     // Write out a regular, unwrapped getter.
-    out << "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter(PyObject *self, void *) {\n";
     FunctionRemap *remap = property->_getter_remaps.front();
 
     if (remap->_has_this) {

+ 2 - 2
dtool/src/interrogate/interfaceMakerPythonNative.h

@@ -11,8 +11,8 @@
 
 #ifndef INTERFACEMAKERPYTHONNATIVE_H
 #define INTERFACEMAKERPYTHONNATIVE_H
-#include "map"
-#include "set"
+#include <map>
+#include <set>
 #include "dtoolbase.h"
 
 #include "interfaceMakerPython.h"

+ 1 - 1
dtool/src/interrogatedb/py_compat.h

@@ -29,7 +29,7 @@
 // See PEP 353
 #define PY_SSIZE_T_CLEAN 1
 
-#include "Python.h"
+#include <Python.h>
 
 /* Python 2.4 */
 

+ 1 - 1
dtool/src/interrogatedb/py_panda.h

@@ -21,7 +21,7 @@
 
 // py_compat.h includes Python.h.
 #include "py_compat.h"
-#include "structmember.h"
+#include <structmember.h>
 
 using namespace std;
 

+ 0 - 3
dtool/src/parser-inc/Python.h

@@ -47,9 +47,6 @@ PyObject _Py_FalseStruct;
 #define Py_False ((PyObject *) &_Py_FalseStruct)
 #endif
 
-// This file defines PY_VERSION_HEX, which is used in some places.
-#include "patchlevel.h"
-
 typedef void *visitproc;
 
 #endif  // PYTHON_H

+ 1 - 1
dtool/src/prc/configPage.cxx

@@ -22,7 +22,7 @@
 #include <ctype.h>
 
 #ifdef HAVE_OPENSSL
-#include "openssl/evp.h"
+#include <openssl/evp.h>
 #endif
 
 using std::istream;

+ 2 - 2
dtool/src/prc/encryptStreamBuf.cxx

@@ -20,8 +20,8 @@
 
 #ifdef HAVE_OPENSSL
 
-#include "openssl/rand.h"
-#include "openssl/evp.h"
+#include <openssl/rand.h>
+#include <openssl/evp.h>
 
 // The iteration count is scaled by this factor for writing to the stream.
 static const int iteration_count_factor = 1000;

+ 2 - 2
dtool/src/prc/prcKeyRegistry.cxx

@@ -19,8 +19,8 @@
 
 #ifdef HAVE_OPENSSL
 
-#include "openssl/evp.h"
-#include "openssl/pem.h"
+#include <openssl/evp.h>
+#include <openssl/pem.h>
 
 // Some versions of OpenSSL appear to define this as a macro.  Yucky.
 #undef set_key

+ 5 - 5
dtool/src/prckeys/makePrcKey.cxx

@@ -24,11 +24,11 @@
 #include PRC_PUBLIC_KEYS_INCLUDE
 #endif
 
-#include "openssl/rsa.h"
-#include "openssl/err.h"
-#include "openssl/pem.h"
-#include "openssl/rand.h"
-#include "openssl/bio.h"
+#include <openssl/rsa.h>
+#include <openssl/err.h>
+#include <openssl/pem.h>
+#include <openssl/rand.h>
+#include <openssl/bio.h>
 
 using std::cerr;
 using std::string;

+ 5 - 5
dtool/src/prckeys/signPrcFile_src.cxx

@@ -24,11 +24,11 @@
 
 #include <time.h>
 
-#include "openssl/err.h"
-#include "openssl/pem.h"
-#include "openssl/rand.h"
-#include "openssl/bio.h"
-#include "openssl/evp.h"
+#include <openssl/err.h>
+#include <openssl/pem.h>
+#include <openssl/rand.h>
+#include <openssl/bio.h>
+#include <openssl/evp.h>
 
 using std::cerr;
 using std::string;

+ 23 - 9
makepanda/installer.nsi

@@ -385,26 +385,36 @@ SectionGroup "Python support"
         SetRegView ${REGVIEW}
         !endif
 
-        ; Check for a system-wide Python installation.
-        ; We could check for a user installation of Python as well, but there
-        ; is no distinction between 64-bit and 32-bit regviews in HKCU, so we
-        ; can't guess whether it might be a compatible version.
+        ; Check for a non-Panda3D system-wide Python installation.
         ReadRegStr $0 HKLM "Software\Python\PythonCore\${PYVER}\InstallPath" ""
+        StrCmp $0 "$INSTDIR\python" UserExternalPthCheck 0
+        StrCmp $0 "" UserExternalPthCheck 0
+        IfFileExists "$0\ppython.exe" UserExternalPthCheck 0
+        IfFileExists "$0\python.exe" AskExternalPth UserExternalPthCheck
+
+        ; Check for a non-Panda3D user installation of Python.
+        UserExternalPthCheck:
+        ReadRegStr $0 HKCU "Software\Python\PythonCore\${PYVER}\InstallPath" ""
         StrCmp $0 "$INSTDIR\python" SkipExternalPth 0
         StrCmp $0 "" SkipExternalPth 0
         IfFileExists "$0\ppython.exe" SkipExternalPth 0
-        IfFileExists "$0\python.exe" 0 SkipExternalPth
+        IfFileExists "$0\python.exe" AskExternalPth SkipExternalPth
 
         ; We're pretty sure this Python build is of the right architecture.
+        AskExternalPth:
         MessageBox MB_YESNO|MB_ICONQUESTION \
             "Your system already has a copy of Python ${PYVER} installed in:$\r$\n$0$\r$\nWould you like to configure it to be able to use the Panda3D libraries?$\r$\nIf you choose no, you will only be able to use Panda3D's own copy of Python." \
             IDYES WriteExternalPth IDNO SkipExternalPth
 
         WriteExternalPth:
-        FileOpen $1 "$0\Lib\site-packages\panda.pth" w
-        FileWrite $1 "$INSTDIR$\r$\n"
-        FileWrite $1 "$INSTDIR\bin$\r$\n"
-        FileClose $1
+        ;FileOpen $1 "$0\Lib\site-packages\panda.pth" w
+        ;FileWrite $1 "$INSTDIR$\r$\n"
+        ;FileWrite $1 "$INSTDIR\bin$\r$\n"
+        ;FileClose $1
+
+        ; Actually, it looks like we can just do this instead:
+        WriteRegStr HKCU "Software\Python\PythonCore\${PYVER}\PythonPath\Panda3D" "" "$INSTDIR"
+
         SkipExternalPth:
     SectionEnd
 
@@ -736,6 +746,10 @@ Section Uninstall
     StrCmp $0 "$INSTDIR\python" 0 +2
     DeleteRegKey HKCU "Software\Python\PythonCore\${PYVER}"
 
+    ReadRegStr $0 HKCU "Software\Python\PythonCore\${PYVER}\PythonPath\Panda3D" ""
+    StrCmp $0 "$INSTDIR" 0 +2
+    DeleteRegKey HKCU "Software\Python\PythonCore\${PYVER}\PythonPath\Panda3D"
+
     SetDetailsPrint both
     DetailPrint "Deleting files..."
     SetDetailsPrint listonly

+ 20 - 20
makepanda/makepanda.py

@@ -746,7 +746,7 @@ if (COMPILER == "MSVC"):
         path = GetThirdpartyDir() + "assimp/lib/IrrXML.lib"
         if os.path.isfile(path):
             LibName("ASSIMP", GetThirdpartyDir() + "assimp/lib/IrrXML.lib")
-        IncDirectory("ASSIMP", GetThirdpartyDir() + "assimp/include/assimp")
+        IncDirectory("ASSIMP", GetThirdpartyDir() + "assimp/include")
     if (PkgSkip("SQUISH")==0):
         if GetOptimize() <= 2:
             LibName("SQUISH",   GetThirdpartyDir() + "squish/lib/squishd.lib")
@@ -891,7 +891,7 @@ if (COMPILER=="GCC"):
         SmartPkgEnable("EIGEN",     "eigen3",    (), ("Eigen/Dense",), target_pkg = 'ALWAYS')
         SmartPkgEnable("ARTOOLKIT", "",          ("AR"), "AR/ar.h")
         SmartPkgEnable("FCOLLADA",  "",          ChooseLib(fcollada_libs, "FCOLLADA"), ("FCollada", "FCollada/FCollada.h"))
-        SmartPkgEnable("ASSIMP",    "",          ("assimp"), "assimp")
+        SmartPkgEnable("ASSIMP",    "",          ("assimp"), "assimp/Importer.hpp")
         SmartPkgEnable("FFMPEG",    ffmpeg_libs, ffmpeg_libs, ("libavformat/avformat.h", "libavcodec/avcodec.h", "libavutil/avutil.h"))
         SmartPkgEnable("SWSCALE",   "libswscale", "libswscale", ("libswscale/swscale.h"), target_pkg = "FFMPEG", thirdparty_dir = "ffmpeg")
         SmartPkgEnable("SWRESAMPLE","libswresample", "libswresample", ("libswresample/swresample.h"), target_pkg = "FFMPEG", thirdparty_dir = "ffmpeg")
@@ -2640,9 +2640,9 @@ WriteConfigSettings()
 
 WarnConflictingFiles()
 if SystemLibraryExists("dtoolbase"):
-    print("%sWARNING:%s Found conflicting Panda3D libraries from other ppremake build!" % (GetColor("red"), GetColor()))
+    Warn("Found conflicting Panda3D libraries from other ppremake build!")
 if SystemLibraryExists("p3dtoolconfig"):
-    print("%sWARNING:%s Found conflicting Panda3D libraries from other makepanda build!" % (GetColor("red"), GetColor()))
+    Warn("Found conflicting Panda3D libraries from other makepanda build!")
 
 ##########################################################################################
 #
@@ -3158,7 +3158,7 @@ if tp_dir is not None:
                 pattern = os.path.join('C:' + os.sep, 'Windows', 'WinSxS', 'Manifests', sxs_name + '_*.manifest')
                 manifests = glob.glob(pattern)
                 if not manifests:
-                    print("%sWARNING:%s Could not locate manifest %s.  You may need to reinstall the Visual C++ Redistributable." % (GetColor("red"), GetColor(), pattern))
+                    Warn("Could not locate manifest %s.  You may need to reinstall the Visual C++ Redistributable." % (pattern))
                     continue
 
                 CopyFile(GetOutputDir() + "/python/" + ident.get('name') + ".manifest", manifests[0])
@@ -3972,9 +3972,7 @@ if (not RUNTIME):
   IGATEFILES.remove("renderBuffer.h")
   TargetAdd('libp3display.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3display.in', opts=['IMOD:panda3d.core', 'ILIB:libp3display', 'SRCDIR:panda/src/display'])
-  PyTargetAdd('p3display_graphicsStateGuardian_ext.obj', opts=OPTS, input='graphicsStateGuardian_ext.cxx')
-  PyTargetAdd('p3display_graphicsWindow_ext.obj', opts=OPTS, input='graphicsWindow_ext.cxx')
-  PyTargetAdd('p3display_pythonGraphicsWindowProc.obj', opts=OPTS, input='pythonGraphicsWindowProc.cxx')
+  PyTargetAdd('p3display_ext_composite.obj', opts=OPTS, input='p3display_ext_composite.cxx')
 
   if RTDIST and GetTarget() == 'darwin':
     OPTS=['DIR:panda/src/display']
@@ -4374,9 +4372,7 @@ if (not RUNTIME):
   PyTargetAdd('core.pyd', input='p3event_pythonTask.obj')
   PyTargetAdd('core.pyd', input='p3gobj_ext_composite.obj')
   PyTargetAdd('core.pyd', input='p3pgraph_ext_composite.obj')
-  PyTargetAdd('core.pyd', input='p3display_graphicsStateGuardian_ext.obj')
-  PyTargetAdd('core.pyd', input='p3display_graphicsWindow_ext.obj')
-  PyTargetAdd('core.pyd', input='p3display_pythonGraphicsWindowProc.obj')
+  PyTargetAdd('core.pyd', input='p3display_ext_composite.obj')
 
   PyTargetAdd('core.pyd', input='core_module.obj')
   if not GetLinkAllStatic() and GetTarget() != 'emscripten':
@@ -4959,7 +4955,6 @@ if (PkgSkip("ODE")==0 and not RUNTIME):
   OPTS=['DIR:panda/src/ode', 'ODE']
   IGATEFILES=GetDirectoryContents('panda/src/ode', ["*.h", "*_composite*.cxx"])
   IGATEFILES.remove("odeConvexGeom.h")
-  IGATEFILES.remove("odeHeightFieldGeom.h")
   IGATEFILES.remove("odeHelperStructs.h")
   TargetAdd('libpandaode.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libpandaode.in', opts=['IMOD:panda3d.ode', 'ILIB:libpandaode', 'SRCDIR:panda/src/ode'])
@@ -5052,7 +5047,7 @@ if (PkgSkip("PHYSX")==0):
   TargetAdd('libpandaphysx.dll', input='pandaphysx_pandaphysx.obj')
   TargetAdd('libpandaphysx.dll', input='p3physx_composite.obj')
   TargetAdd('libpandaphysx.dll', input=COMMON_PANDA_LIBS)
-  TargetAdd('libpandaphysx.dll', opts=['WINUSER', 'PHYSX', 'NOARCH:PPC'])
+  TargetAdd('libpandaphysx.dll', opts=['WINUSER', 'PHYSX', 'NOARCH:PPC', 'PYTHON'])
 
   OPTS=['DIR:panda/metalibs/pandaphysx', 'PHYSX', 'NOARCH:PPC']
   PyTargetAdd('physx_module.obj', input='libpandaphysx.in')
@@ -5169,6 +5164,9 @@ if (not RTDIST and not RUNTIME and PkgSkip("PVIEW")==0):
   TargetAdd('pview.exe', input=COMMON_PANDA_LIBS)
   TargetAdd('pview.exe', opts=['ADVAPI', 'WINSOCK2', 'WINSHELL'])
 
+  if GetLinkAllStatic() and not PkgSkip("GL"):
+    TargetAdd('pview.exe', input='libpandagl.dll')
+
 #
 # DIRECTORY: panda/src/android/
 #
@@ -6887,10 +6885,13 @@ def MakeInstallerNSIS(file, title, installdir):
     elif (os.path.isdir(file)):
         shutil.rmtree(file)
 
+    pyver = SDK["PYTHONVERSION"][6:9]
     if GetTargetArch() == 'x64':
         regview = '64'
     else:
         regview = '32'
+        if int(pyver[0]) == 3 and int(pyver[2]) >= 5:
+            pyver += '-32'
 
     if (RUNTIME):
         # Invoke the make_installer script.
@@ -6923,7 +6924,7 @@ def MakeInstallerNSIS(file, title, installdir):
         'OUTFILE'     : '..\\' + file,
         'BUILT'       : '..\\' + GetOutputDir(),
         'SOURCE'      : '..',
-        'PYVER'       : SDK["PYTHONVERSION"][6:9],
+        'PYVER'       : pyver,
         'REGVIEW'     : regview,
         'EXT_SUFFIX'  : GetExtensionSuffix(),
     }
@@ -6970,17 +6971,16 @@ Architecture: ARCH
 Essential: no
 Depends: DEPENDS
 Recommends: RECOMMENDS
-Suggests: panda3d-runtime
-Provides: panda3d
-Conflicts: panda3d
-Replaces: panda3d
+Provides: panda3d, pythonPV-panda3d
+Conflicts: panda3d, pythonPV-panda3d
+Replaces: panda3d, pythonPV-panda3d
 Maintainer: rdb <[email protected]>
 Installed-Size: INSTSIZE
 Description: Panda3D free 3D engine SDK
  Panda3D is a game engine which includes graphics, audio, I/O, collision detection, and other abilities relevant to the creation of 3D games. Panda3D is open source and free software under the revised BSD license, and can be used for both free and commercial game development at no financial cost.
  Panda3D's intended game-development language is Python. The engine itself is written in C++, and utilizes an automatic wrapper-generator to expose the complete functionality of the engine in a Python interface.
  .
- This package contains the SDK for development with Panda3D, install panda3d-runtime for the runtime files.
+ This package contains the SDK for development with Panda3D.
 
 """
 
@@ -7135,7 +7135,7 @@ def MakeInstallerLinux():
         rpmbuild_present = True
 
     if dpkg_present and rpmbuild_present:
-        print("Warning: both dpkg and rpmbuild present.")
+        Warn("both dpkg and rpmbuild present.")
 
     if dpkg_present:
         # Invoke installpanda.py to install it into a temporary dir

+ 30 - 26
makepanda/makepandacore.py

@@ -150,7 +150,7 @@ CONFLICTING_FILES=["dtool/src/dtoolutil/pandaVersion.h",
 def WarnConflictingFiles(delete = False):
     for cfile in CONFLICTING_FILES:
         if os.path.exists(cfile):
-            print("%sWARNING:%s file may conflict with build: %s%s%s" % (GetColor("red"), GetColor(), GetColor("green"), cfile, GetColor()))
+            Warn("file may conflict with build:", cfile)
             if delete:
                 os.unlink(cfile)
                 print("Deleted.")
@@ -284,6 +284,20 @@ def exit(msg = ""):
         print(msg)
         raise "initiate-exit"
 
+def Warn(msg, extra=None):
+    if extra is not None:
+        print("%sWARNING:%s %s %s%s%s" % (GetColor("red"), GetColor(), msg, GetColor("green"), extra, GetColor()))
+    else:
+        print("%sWARNING:%s %s" % (GetColor("red"), GetColor(), msg))
+    sys.stdout.flush()
+
+def Error(msg, extra=None):
+    if extra is not None:
+        print("%sERROR:%s %s %s%s%s" % (GetColor("red"), GetColor(), msg, GetColor("green"), extra, GetColor()))
+    else:
+        print("%sERROR:%s %s" % (GetColor("red"), GetColor(), msg))
+    exit()
+
 ########################################################################
 ##
 ## SetTarget, GetTarget, GetHost
@@ -723,7 +737,7 @@ def NeedsBuild(files, others):
                     print("    dependency changed: %s" % (key))
 
         if VERBOSE and frozenset(cached) != frozenset(dates):
-            print("%sWARNING:%s file dependencies changed: %s%s%s" % (GetColor("red"), GetColor(), GetColor("green"), files, GetColor()))
+            Warn("file dependencies changed:", files)
 
     return True
 
@@ -1298,7 +1312,7 @@ def GetThirdpartyDir():
         THIRDPARTYDIR = GetThirdpartyBase()+"/android-libs-%s/" % (GetTargetArch())
 
     else:
-        print("%s Unsupported platform: %s" % (ColorText("red", "WARNING:"), target))
+        Warn("Unsupported platform:", target)
         return
 
     if (GetVerbose()):
@@ -1744,11 +1758,10 @@ def SmartPkgEnable(pkg, pkgconfig = None, libs = None, incs = None, defs = None,
     if not custom_loc and pkgconfig is not None and not libs:
         # pkg-config is all we can do, abort if it wasn't found.
         if pkg in PkgListGet():
-            print("%sWARNING:%s Could not locate pkg-config package %s, excluding from build" % (GetColor("red"), GetColor(), pkgconfig))
+            Warn("Could not locate pkg-config package %s, excluding from build" % (pkgconfig))
             PkgDisable(pkg)
         else:
-            print("%sERROR:%s Could not locate pkg-config package %s, aborting build" % (GetColor("red"), GetColor(), pkgconfig))
-            exit()
+            Error("Could not locate pkg-config package %s, aborting build" % (pkgconfig))
 
     else:
         # Okay, our pkg-config attempts failed. Let's try locating the libs by ourselves.
@@ -1812,14 +1825,12 @@ def SmartPkgEnable(pkg, pkgconfig = None, libs = None, incs = None, defs = None,
 
         if not have_pkg:
             if custom_loc:
-                print("%sERROR:%s Could not locate thirdparty package %s in specified directory, aborting build" % (GetColor("red"), GetColor(), pkg.lower()))
-                exit()
+                Error("Could not locate thirdparty package %s in specified directory, aborting build" % (pkg.lower()))
             elif pkg in PkgListGet():
-                print("%sWARNING:%s Could not locate thirdparty package %s, excluding from build" % (GetColor("red"), GetColor(), pkg.lower()))
+                Warn("Could not locate thirdparty package %s, excluding from build" % (pkg.lower()))
                 PkgDisable(pkg)
             else:
-                print("%sERROR:%s Could not locate thirdparty package %s, aborting build" % (GetColor("red"), GetColor(), pkg.lower()))
-                exit()
+                Error("Could not locate thirdparty package %s, aborting build" % (pkg.lower()))
 
 ########################################################################
 ##
@@ -2100,7 +2111,7 @@ def SdkLocatePython(prefer_thirdparty_python=False):
         os.environ["PYTHONHOME"] = SDK["PYTHON"]
 
         if sys.version[:3] != ver:
-            print("Warning: running makepanda with Python %s, but building Panda3D with Python %s." % (sys.version[:3], ver))
+            Warn("running makepanda with Python %s, but building Panda3D with Python %s." % (sys.version[:3], ver))
 
     elif CrossCompiling() or (prefer_thirdparty_python and os.path.isdir(os.path.join(GetThirdpartyDir(), "python"))):
         tp_python = os.path.join(GetThirdpartyDir(), "python")
@@ -2743,12 +2754,11 @@ def LibName(opt, name):
             WARNINGS.append(name + " not found.  Skipping Package " + opt)
             if (opt in PkgListGet()):
                 if not PkgSkip(opt):
-                    print("%sWARNING:%s Could not locate thirdparty package %s, excluding from build" % (GetColor("red"), GetColor(), opt.lower()))
+                    Warn("Could not locate thirdparty package %s, excluding from build" % (opt.lower()))
                     PkgDisable(opt)
                 return
             else:
-                print("%sERROR:%s Could not locate thirdparty package %s, aborting build" % (GetColor("red"), GetColor(), opt.lower()))
-                exit()
+                Error("Could not locate thirdparty package %s, aborting build" % (opt.lower()))
     LIBNAMES.append((opt, name))
 
 def DefSymbol(opt, sym, val=""):
@@ -2831,7 +2841,7 @@ def SetupBuildEnvironment(compiler):
 
         returnval = handle.close()
         if returnval != None and returnval != 0:
-            print("%sWARNING:%s %s failed" % (GetColor("red"), GetColor(), cmd))
+            Warn("%s failed" % (cmd))
             SYS_LIB_DIRS += [SDK.get("SYSROOT", "") + "/usr/lib"]
 
         # Now extract the preprocessor's include directories.
@@ -2860,7 +2870,7 @@ def SetupBuildEnvironment(compiler):
                 print("Ignoring non-existent include directory %s" % (line))
 
         if handle.returncode != 0 or not SYS_INC_DIRS:
-            print("%sWARNING:%s %s failed or did not produce the expected result" % (GetColor("red"), GetColor(), cmd))
+            Warn("%s failed or did not produce the expected result" % (cmd))
             sysroot = SDK.get("SYSROOT", "")
             # Add some sensible directories as a fallback.
             SYS_INC_DIRS = [
@@ -3250,14 +3260,8 @@ def SetOrigExt(x, v):
 
 def GetExtensionSuffix():
     if sys.version_info >= (3, 0):
-        suffix = sysconfig.get_config_var('EXT_SUFFIX')
-        if suffix == '.so':
-            # On my FreeBSD system, this is not set correctly, but SOABI is.
-            soabi = sysconfig.get_config_var('SOABI')
-            if soabi:
-                return '.%s.so' % (soabi)
-        elif suffix:
-            return suffix
+        import _imp
+        return _imp.extension_suffixes()[0]
 
     target = GetTarget()
     if target == 'windows':
@@ -3374,7 +3378,7 @@ def FindLocation(fn, ipath, pyabi=None):
 
         elif ext != ".pyd" and loc not in WARNED_FILES:
             WARNED_FILES.add(loc)
-            print("%sWARNING:%s file depends on Python but is not in an ABI-specific directory: %s%s%s" % (GetColor("red"), GetColor(), GetColor("green"), loc, GetColor()))
+            Warn("file depends on Python but is not in an ABI-specific directory:", loc)
 
     ORIG_EXT[loc] = ext
     return loc

+ 5 - 0
makepanda/test_wheel.py

@@ -23,6 +23,11 @@ def test_wheel(wheel, verbose=False):
     else:
         subprocess.call([sys.executable, "-m", "virtualenv", "--clear", envdir])
 
+    # Make sure pip is up-to-date first.
+    if subprocess.call([sys.executable, "-m", "pip", "install", "-U", "pip"]) != 0:
+        shutil.rmtree(envdir)
+        sys.exit(1)
+
     # Install pytest into the environment, as well as our wheel.
     if sys.platform == "win32":
         pip = os.path.join(envdir, "Scripts", "pip.exe")

+ 2 - 1
panda/src/android/android_main.cxx

@@ -19,10 +19,11 @@
 #include "thread.h"
 #include "urlSpec.h"
 
+#include "android_native_app_glue.h"
+
 #include "config_display.h"
 // #define OPENGLES_1 #include "config_androiddisplay.h"
 
-#include <android_native_app_glue.h>
 #include <sys/socket.h>
 #include <arpa/inet.h>
 

+ 1 - 1
panda/src/audiotraits/fmodAudioSound.h

@@ -61,7 +61,7 @@
 #ifndef __FMOD_AUDIO_SOUND_H__
 #define __FMOD_AUDIO_SOUND_H__
 
-#include <pandabase.h>
+#include "pandabase.h"
 
 #include "audioSound.h"
 #include "reMutex.h"

+ 2 - 1
panda/src/audiotraits/globalMilesManager.h

@@ -17,11 +17,12 @@
 #include "pandabase.h"
 #ifdef HAVE_RAD_MSS //[
 
-#include "mss.h"
 #include "pset.h"
 #include "lightMutex.h"
 #include "lightMutexHolder.h"
 
+#include <mss.h>
+
 #ifndef UINTa
 #define UINTa U32
 #endif

+ 2 - 1
panda/src/audiotraits/milesAudioManager.h

@@ -19,7 +19,6 @@
 #ifdef HAVE_RAD_MSS //[
 
 #include "audioManager.h"
-#include "mss.h"
 #include "pset.h"
 #include "pmap.h"
 #include "pdeque.h"
@@ -30,6 +29,8 @@
 #include "conditionVar.h"
 #include "vector_uchar.h"
 
+#include <mss.h>
+
 class MilesAudioSound;
 
 class EXPCL_MILES_AUDIO MilesAudioManager: public AudioManager {

+ 2 - 1
panda/src/audiotraits/milesAudioSample.h

@@ -20,7 +20,8 @@
 
 #include "milesAudioSound.h"
 #include "milesAudioManager.h"
-#include "mss.h"
+
+#include <mss.h>
 
 /**
  * A sound file, such as a WAV or MP3 file, that is preloaded into memory and

+ 2 - 1
panda/src/audiotraits/milesAudioSequence.h

@@ -19,7 +19,8 @@
 
 #include "milesAudioSound.h"
 #include "milesAudioManager.h"
-#include "mss.h"
+
+#include <mss.h>
 
 /**
  * A MIDI file, preloaded and played from a memory buffer.  MIDI files cannot

+ 2 - 1
panda/src/audiotraits/milesAudioSound.h

@@ -19,7 +19,8 @@
 
 #include "audioSound.h"
 #include "milesAudioManager.h"
-#include "mss.h"
+
+#include <mss.h>
 
 /**
  * The base class for both MilesAudioStream and MilesAudioSample.

+ 2 - 1
panda/src/audiotraits/milesAudioStream.h

@@ -19,7 +19,8 @@
 
 #include "milesAudioSound.h"
 #include "milesAudioManager.h"
-#include "mss.h"
+
+#include <mss.h>
 
 /**
  * This represents a sound file played by the Miles Sound System, similar to

+ 16 - 0
panda/src/audiotraits/openalAudioManager.cxx

@@ -534,6 +534,9 @@ uncache_sound(const Filename &file_name) {
   vfs->resolve_filename(path, get_model_path());
 
   SampleCache::iterator sci = _sample_cache.find(path);
+  if (sci == _sample_cache.end()) {
+    sci = _sample_cache.find(file_name);
+  }
   if (sci != _sample_cache.end()) {
     SoundData *sd = (*sci).second;
     if (sd->_client_count == 0) {
@@ -542,6 +545,19 @@ uncache_sound(const Filename &file_name) {
       delete sd;
     }
   }
+
+  ExpirationQueue::iterator exqi;
+  for (exqi = _expiring_streams.begin(); exqi != _expiring_streams.end();) {
+    SoundData *sd = (SoundData *)(*exqi);
+    if (sd->_client_count == 0) {
+      if (sd->_movie->get_filename() == path ||
+          sd->_movie->get_filename() == file_name) {
+        exqi = _expiring_streams.erase(exqi);
+        continue;
+      }
+    }
+    ++exqi;
+  }
 }
 
 /**

+ 2 - 1
panda/src/awesomium/awWebCore.cxx

@@ -13,7 +13,8 @@
 
 #include "config_awesomium.h"
 #include "awWebCore.h"
-#include "WebCore.h"
+
+#include <WebCore.h>
 
 TypeHandle AwWebCore::_type_handle;
 

+ 3 - 3
panda/src/awesomium/awesomium_includes.h

@@ -14,8 +14,8 @@
 #ifndef _AWESOMIUM_INCLUDES_H_
 #define _AWESOMIUM_INCLUDES_H_
 
-#include "WebCore.h"
-#include "WebView.h"
-#include "WebViewListener.h"
+#include <WebCore.h>
+#include <WebView.h>
+#include <WebViewListener.h>
 
 #endif

+ 15 - 15
panda/src/bullet/bullet_includes.h

@@ -16,23 +16,23 @@
 
 #include "pandabase.h"
 
-#include "btBulletDynamicsCommon.h"
+#include <btBulletDynamicsCommon.h>
 
 #ifndef CPPPARSER
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
-#include "BulletCollision/CollisionDispatch/btGhostObject.h"
-#include "BulletCollision/CollisionDispatch/btManifoldResult.h"
-#include "BulletCollision/CollisionShapes/btConvexPointCloudShape.h"
-#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h"
-#include "BulletCollision/CollisionShapes/btMinkowskiSumShape.h"
-#include "BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h"
-#include "BulletCollision/Gimpact/btGImpactShape.h"
-#include "BulletDynamics/Character/btKinematicCharacterController.h"
-#include "BulletDynamics/Vehicle/btRaycastVehicle.h"
-#include "BulletSoftBody/btSoftBodyHelpers.h"
-#include "BulletSoftBody/btSoftBodyInternals.h"
-#include "BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h"
-#include "BulletSoftBody/btSoftRigidDynamicsWorld.h"
+#include <BulletCollision/BroadphaseCollision/btBroadphaseProxy.h>
+#include <BulletCollision/CollisionDispatch/btGhostObject.h>
+#include <BulletCollision/CollisionDispatch/btManifoldResult.h>
+#include <BulletCollision/CollisionShapes/btConvexPointCloudShape.h>
+#include <BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h>
+#include <BulletCollision/CollisionShapes/btMinkowskiSumShape.h>
+#include <BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h>
+#include <BulletCollision/Gimpact/btGImpactShape.h>
+#include <BulletDynamics/Character/btKinematicCharacterController.h>
+#include <BulletDynamics/Vehicle/btRaycastVehicle.h>
+#include <BulletSoftBody/btSoftBodyHelpers.h>
+#include <BulletSoftBody/btSoftBodyInternals.h>
+#include <BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h>
+#include <BulletSoftBody/btSoftRigidDynamicsWorld.h>
 #endif
 
 #endif // __BULLET_INCLUDES_H__

+ 5 - 0
panda/src/cocoadisplay/cocoaGraphicsStateGuardian.mm

@@ -254,6 +254,11 @@ choose_pixel_format(const FrameBufferProperties &properties,
     "Pixel format has " << [format numberOfVirtualScreens] << " virtual screens.\n";
   get_properties(_fbprops, format, 0);
 
+  // Don't enable sRGB unless it was explicitly requested.
+  if (!properties.get_srgb_color()) {
+    _fbprops.set_srgb_color(false);
+  }
+
   // TODO: print out renderer
 
   _context = [[NSOpenGLContext alloc] initWithFormat:format shareContext:_share_context];

+ 0 - 93
panda/src/collada/colladaBindMaterial.cxx

@@ -1,93 +0,0 @@
-/**
- * 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 colladaBindMaterial.cxx
- * @author rdb
- * @date 2011-05-26
- */
-
-#include "colladaBindMaterial.h"
-#include "colladaPrimitive.h"
-
-// Collada DOM includes.  No other includes beyond this point.
-#include "pre_collada_include.h"
-#include <dom/domBind_material.h>
-#include <dom/domEffect.h>
-#include <dom/domInstance_effect.h>
-#include <dom/domInstance_material.h>
-#include <dom/domMaterial.h>
-
-#if PANDA_COLLADA_VERSION >= 15
-#include <dom/domFx_profile.h>
-#else
-#include <dom/domFx_profile_abstract.h>
-#define domFx_profile domFx_profile_abstract
-#define domFx_profile_Array domFx_profile_abstract_Array
-#define getFx_profile_array getFx_profile_abstract_array
-#endif
-
-/**
- * Returns the material to be applied to the given primitive, or NULL if there
- * was none bound.
- */
-CPT(RenderState) ColladaBindMaterial::
-get_material(const ColladaPrimitive *prim) const {
-  if (prim == nullptr || _states.count(prim->get_material()) == 0) {
-    return nullptr;
-  }
-  return _states.find(prim->get_material())->second;
-}
-
-/**
- * Returns the bound material with the indicated symbol, or NULL if it was not
- * found.
- */
-CPT(RenderState) ColladaBindMaterial::
-get_material(const std::string &symbol) const {
-  if (_states.count(symbol) == 0) {
-    return nullptr;
-  }
-  return _states.find(symbol)->second;
-}
-
-/**
- * Loads a bind_material object.
- */
-void ColladaBindMaterial::
-load_bind_material(domBind_material &bind_mat) {
-  domInstance_material_Array &mat_instances
-    = bind_mat.getTechnique_common()->getInstance_material_array();
-
-  for (size_t i = 0; i < mat_instances.getCount(); ++i) {
-    load_instance_material(*mat_instances[i]);
-  }
-}
-
-/**
- * Loads an instance_material object.
- */
-void ColladaBindMaterial::
-load_instance_material(domInstance_material &inst) {
-  domMaterialRef mat = daeSafeCast<domMaterial> (inst.getTarget().getElement());
-  nassertv(mat != nullptr);
-
-  domInstance_effectRef einst = mat->getInstance_effect();
-  nassertv(einst != nullptr);
-
-  domInstance_effect::domSetparam_Array &setparams = einst->getSetparam_array();
-
-  domEffectRef effect = daeSafeCast<domEffect>
-    (mat->getInstance_effect()->getUrl().getElement());
-
-  // TODO: read params
-
-  const domFx_profile_Array &profiles = effect->getFx_profile_array();
-  for (size_t i = 0; i < profiles.getCount(); ++i) {
-    // profiles[i]->
-  }
-}

+ 0 - 41
panda/src/collada/colladaBindMaterial.h

@@ -1,41 +0,0 @@
-/**
- * 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 colladaBindMaterial.h
- * @author rdb
- * @date 2011-05-25
- */
-
-#ifndef COLLADABINDMATERIAL_H
-#define COLLADABINDMATERIAL_H
-
-#include "config_collada.h"
-#include "renderState.h"
-#include "pmap.h"
-
-class ColladaPrimitive;
-
-class domBind_material;
-class domInstance_material;
-
-/**
- * Class that deals with binding materials to COLLADA geometry.
- */
-class ColladaBindMaterial {
-public:
-  CPT(RenderState) get_material(const ColladaPrimitive *prim) const;
-  CPT(RenderState) get_material(const std::string &symbol) const;
-
-  void load_bind_material(domBind_material &bind_mat);
-  void load_instance_material(domInstance_material &inst);
-
-private:
-  pmap<std::string, CPT(RenderState)> _states;
-};
-
-#endif

+ 0 - 28
panda/src/collada/colladaInput.I

@@ -1,28 +0,0 @@
-/**
- * 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 colladaInput.I
- * @author rdb
- * @date 2011-05-23
- */
-
-/**
- * Returns true if this has a <vertices> element as source.
- */
-bool ColladaInput::
-is_vertex_source() const {
-  return (_semantic == "VERTEX");
-}
-
-/**
- * Returns the offset associated with this input.
- */
-unsigned int ColladaInput::
-get_offset() const {
-  return _offset;
-}

+ 0 - 265
panda/src/collada/colladaInput.cxx

@@ -1,265 +0,0 @@
-/**
- * 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 colladaInput.cxx
- * @author rdb
- * @date 2011-05-23
- */
-
-#include "colladaInput.h"
-#include "string_utils.h"
-#include "geomVertexArrayFormat.h"
-#include "geomVertexWriter.h"
-
-// Collada DOM includes.  No other includes beyond this point.
-#include "pre_collada_include.h"
-#include <dom/domAccessor.h>
-#include <dom/domP.h>
-#include <dom/domSource.h>
-#include <dom/domVertices.h>
-
-#if PANDA_COLLADA_VERSION >= 15
-#include <dom/domInput_local_offset.h>
-#include <dom/domInput_local.h>
-#else
-#include <dom/domInputLocalOffset.h>
-#include <dom/domInputLocal.h>
-#define domList_of_floats domListOfFloats
-#define domList_of_uints domListOfUInts
-#endif
-
-/**
- * Pretty obvious what this does.
- */
-ColladaInput::
-ColladaInput(const std::string &semantic) :
-  _column_name (nullptr),
-  _semantic (semantic),
-  _offset (0),
-  _have_set (false),
-  _set (0) {
-
-  if (semantic == "POSITION") {
-    _column_name = InternalName::get_vertex();
-    _column_contents = GeomEnums::C_point;
-  } else if (semantic == "COLOR") {
-    _column_name = InternalName::get_color();
-    _column_contents = GeomEnums::C_color;
-  } else if (semantic == "NORMAL") {
-    _column_name = InternalName::get_normal();
-    _column_contents = GeomEnums::C_vector;
-  } else if (semantic == "TEXCOORD") {
-    _column_name = InternalName::get_texcoord();
-    _column_contents = GeomEnums::C_texcoord;
-  } else if (semantic == "TEXBINORMAL") {
-    _column_name = InternalName::get_binormal();
-    _column_contents = GeomEnums::C_vector;
-  } else if (semantic == "TEXTANGENT") {
-    _column_name = InternalName::get_tangent();
-    _column_contents = GeomEnums::C_vector;
-  }
-}
-
-/**
- * Pretty obvious what this does.
- */
-ColladaInput::
-ColladaInput(const std::string &semantic, unsigned int set) :
-  _column_name (nullptr),
-  _semantic (semantic),
-  _offset (0),
-  _have_set (true),
-  _set (set) {
-
-  std::ostringstream setstr;
-  setstr << _set;
-
-  if (semantic == "POSITION") {
-    _column_name = InternalName::get_vertex();
-    _column_contents = GeomEnums::C_point;
-  } else if (semantic == "COLOR") {
-    _column_name = InternalName::get_color();
-    _column_contents = GeomEnums::C_color;
-  } else if (semantic == "NORMAL") {
-    _column_name = InternalName::get_normal();
-    _column_contents = GeomEnums::C_vector;
-  } else if (semantic == "TEXCOORD") {
-    _column_name = InternalName::get_texcoord_name(setstr.str());
-    _column_contents = GeomEnums::C_texcoord;
-  } else if (semantic == "TEXBINORMAL") {
-    _column_name = InternalName::get_binormal_name(setstr.str());
-    _column_contents = GeomEnums::C_vector;
-  } else if (semantic == "TEXTANGENT") {
-    _column_name = InternalName::get_tangent_name(setstr.str());
-    _column_contents = GeomEnums::C_vector;
-  }
-}
-
-/**
- * Returns the ColladaInput object that represents the provided DOM input
- * element.
- */
-ColladaInput *ColladaInput::
-from_dom(domInput_local_offset &input) {
-  // If we already loaded it before, use that.
-  if (input.getUserData() != nullptr) {
-    return (ColladaInput *) input.getUserData();
-  }
-
-  ColladaInput *new_input = new ColladaInput(input.getSemantic(), input.getSet());
-  new_input->_offset = input.getOffset();
-
-  // If this has the VERTEX semantic, it points to a <vertices> element.
-  if (new_input->is_vertex_source()) {
-    domVertices *verts = daeSafeCast<domVertices> (input.getSource().getElement());
-    nassertr(verts != nullptr, nullptr);
-    daeTArray<domInput_localRef> &inputs = verts->getInput_array();
-
-    // Iterate over the <input> elements in <vertices>.
-    for (size_t i = 0; i < inputs.getCount(); ++i) {
-      PT(ColladaInput) vtx_input = ColladaInput::from_dom(*inputs[i]);
-      new_input->_vertex_inputs.push_back(vtx_input);
-    }
-  } else {
-    domSource *source = daeSafeCast<domSource> (input.getSource().getElement());
-    nassertr(source != nullptr, nullptr);
-    new_input->read_data(*source);
-  }
-
-  return new_input;
-}
-
-/**
- * Returns the ColladaInput object that represents the provided DOM input
- * element.
- */
-ColladaInput *ColladaInput::
-from_dom(domInput_local &input) {
-  // If we already loaded it before, use that.
-  if (input.getUserData() != nullptr) {
-    return (ColladaInput *) input.getUserData();
-  }
-
-  ColladaInput *new_input = new ColladaInput(input.getSemantic());
-  new_input->_offset = 0;
-
-  nassertr (!new_input->is_vertex_source(), nullptr);
-
-  domSource *source = daeSafeCast<domSource> (input.getSource().getElement());
-  nassertr(source != nullptr, nullptr);
-  new_input->read_data(*source);
-
-  return new_input;
-}
-
-/**
- * Takes a semantic and source URI, and adds a new column to the format.  If
- * this is a vertex source, adds all of the inputs from the corresponding
- * <vertices> element.  Returns the number of columns added to the format.
- */
-int ColladaInput::
-make_vertex_columns(GeomVertexArrayFormat *format) const {
-
-  if (is_vertex_source()) {
-    int counter = 0;
-    Inputs::const_iterator it;
-    for (it = _vertex_inputs.begin(); it != _vertex_inputs.end(); ++it) {
-      counter += (*it)->make_vertex_columns(format);
-    }
-    return counter;
-  }
-
-  nassertr(_column_name != nullptr, 0);
-
-  format->add_column(_column_name, _num_bound_params, GeomEnums::NT_stdfloat, _column_contents);
-  return 1;
-}
-
-/**
- * Reads the data from the source and fills in _data.
- */
-bool ColladaInput::
-read_data(domSource &source) {
-  _data.clear();
-
-  // Get this, get that
-  domFloat_array* float_array = source.getFloat_array();
-  if (float_array == nullptr) {
-    return false;
-  }
-
-  domList_of_floats &floats = float_array->getValue();
-  domAccessor &accessor = *source.getTechnique_common()->getAccessor();
-  domParam_Array &params = accessor.getParam_array();
-
-  // Count the number of params that have a name attribute.
-  _num_bound_params = 0;
-  for (size_t p = 0; p < params.getCount(); ++p) {
-    if (params[p]->getName()) {
-      ++_num_bound_params;
-    }
-  }
-
-  _data.reserve(accessor.getCount());
-
-  domUint pos = accessor.getOffset();
-  for (domUint a = 0; a < accessor.getCount(); ++a) {
-    domUint c = 0;
-    // Yes, the last component defaults to 1 to work around a perspective
-    // divide that Panda3D does internally for points.
-    LVecBase4f v (0, 0, 0, 1);
-    for (domUint p = 0; p < params.getCount(); ++p) {
-      if (params[c]->getName()) {
-        v[c++] = floats[pos + p];
-      }
-    }
-    _data.push_back(v);
-    pos += accessor.getStride();
-  }
-
-  return true;
-}
-
-/**
- * Writes data to the indicated GeomVertexData using the given indices.
- */
-void ColladaInput::
-write_data(GeomVertexData *vdata, int start_row, domP &p, unsigned int stride) const {
-  if (is_vertex_source()) {
-    Inputs::const_iterator it;
-    for (it = _vertex_inputs.begin(); it != _vertex_inputs.end(); ++it) {
-      (*it)->write_data(vdata, start_row, p, stride, _offset);
-    }
-
-  } else {
-    write_data(vdata, start_row, p, stride, _offset);
-  }
-}
-
-/**
- * Called internally by the other write_data.
- */
-void ColladaInput::
-write_data(GeomVertexData *vdata, int start_row, domP &p, unsigned int stride, unsigned int offset) const {
-  nassertv(_column_name != nullptr);
-  GeomVertexWriter writer (vdata, _column_name);
-  writer.set_row_unsafe(start_row);
-
-  domList_of_uints &indices = p.getValue();
-
-  // Allocate space for all the rows we're going to write.
-  int min_length = start_row + indices.getCount() / stride;
-  if (vdata->get_num_rows() < min_length) {
-    vdata->unclean_set_num_rows(start_row);
-  }
-
-  for (size_t i = 0; i < indices.getCount(); i += stride) {
-    size_t index = indices[i + offset];
-    writer.add_data4f(_data[index]);
-  }
-}

+ 0 - 77
panda/src/collada/colladaInput.h

@@ -1,77 +0,0 @@
-/**
- * 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 colladaInput.h
- * @author rdb
- * @date 2011-05-23
- */
-
-#ifndef COLLADAINPUT_H
-#define COLLADAINPUT_H
-
-#include "config_collada.h"
-#include "referenceCount.h"
-#include "pvector.h"
-#include "pta_LVecBase4.h"
-#include "internalName.h"
-#include "geomEnums.h"
-
-class GeomPrimitive;
-class GeomVertexArrayFormat;
-class GeomVertexData;
-
-#if PANDA_COLLADA_VERSION < 15
-#define domInput_local domInputLocal
-#define domInput_localRef domInputLocalRef
-#define domInput_local_offset domInputLocalOffset
-#define domInput_local_offsetRef domInputLocalOffsetRef
-#endif
-
-class domInput_local;
-class domInput_local_offset;
-class domP;
-class domSource;
-
-/**
- * Class that deals with COLLADA data sources.
- */
-class ColladaInput : public ReferenceCount {
-public:
-  static ColladaInput *from_dom(domInput_local_offset &input);
-  static ColladaInput *from_dom(domInput_local &input);
-
-  int make_vertex_columns(GeomVertexArrayFormat *fmt) const;
-  void write_data(GeomVertexData *vdata, int start_row, domP &p, unsigned int stride) const;
-
-  INLINE bool is_vertex_source() const;
-  INLINE unsigned int get_offset() const;
-
-private:
-  ColladaInput(const std::string &semantic);
-  ColladaInput(const std::string &semantic, unsigned int set);
-  bool read_data(domSource &source);
-  void write_data(GeomVertexData *vdata, int start_row, domP &p, unsigned int stride, unsigned int offset) const;
-
-  typedef pvector<PT(ColladaInput)> Inputs;
-  Inputs _vertex_inputs;
-  PTA_LVecBase4f _data;
-
-  // Only filled in when appropriate.
-  PT(InternalName) _column_name;
-  GeomEnums::Contents _column_contents;
-
-  unsigned int _num_bound_params;
-  unsigned int _offset;
-  std::string _semantic;
-  bool _have_set;
-  unsigned int _set;
-};
-
-#include "colladaInput.I"
-
-#endif

+ 0 - 12
panda/src/collada/colladaLoader.I

@@ -1,12 +0,0 @@
-/**
- * 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 colladaLoader.I
- * @author rdb
- * @date 2011-03-16
- */

+ 0 - 549
panda/src/collada/colladaLoader.cxx

@@ -1,549 +0,0 @@
-/**
- * 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 colladaLoader.cxx
- * @author Xidram
- * @date 2010-12-21
- */
-
-#include "colladaLoader.h"
-#include "virtualFileSystem.h"
-#include "luse.h"
-#include "string_utils.h"
-#include "geomNode.h"
-#include "geomVertexWriter.h"
-#include "geomTriangles.h"
-#include "lightNode.h"
-#include "lightAttrib.h"
-#include "ambientLight.h"
-#include "directionalLight.h"
-#include "pointLight.h"
-#include "spotlight.h"
-
-#include "colladaBindMaterial.h"
-#include "colladaPrimitive.h"
-
-// Collada DOM includes.  No other includes beyond this point.
-#include "pre_collada_include.h"
-#include <dom/domCOLLADA.h>
-#include <dom/domNode.h>
-#include <dom/domVisual_scene.h>
-#include <dom/domTranslate.h>
-#include <dom/domRotate.h>
-#include <dom/domMatrix.h>
-
-#if PANDA_COLLADA_VERSION >= 15
-#include <dom/domInstance_with_extra.h>
-#else
-#include <dom/domInstanceWithExtra.h>
-#define domInstance_with_extra domInstanceWithExtra
-#define domTargetable_floatRef domTargetableFloatRef
-#endif
-
-#define TOSTRING(x) (x == nullptr ? "" : x)
-
-/**
- *
- */
-ColladaLoader::
-ColladaLoader() :
-  _record (nullptr),
-  _cs (CS_default),
-  _error (false),
-  _root (nullptr),
-  _collada (nullptr) {
-
-  _dae = new DAE;
-}
-
-/**
- *
- */
-ColladaLoader::
-~ColladaLoader() {
-  delete _dae;
-}
-
-/**
- * Reads from the indicated file.
- */
-bool ColladaLoader::
-read(const Filename &filename) {
-  _filename = filename;
-
-  std::string data;
-  VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr();
-
-  if (!vfs->read_file(_filename, data, true)) {
-    collada_cat.error()
-      << "Error reading " << _filename << "\n";
-    _error = true;
-    return false;
-  }
-
-  _collada = _dae->openFromMemory(_filename.to_os_specific(), data.c_str());
-  _error = (_collada == nullptr);
-  return !_error;
-}
-
-/**
- * Converts scene graph structures into a Panda3D scene graph, with _root
- * being the root node.
- */
-void ColladaLoader::
-build_graph() {
-  nassertv(_collada); // read() must be called first
-  nassertv(!_error);  // and have succeeded
-
-  _root = new ModelRoot(_filename.get_basename());
-
-  domCOLLADA::domScene* scene = _collada->getScene();
-  domInstance_with_extra* inst = scene->getInstance_visual_scene();
-  domVisual_scene* vscene = daeSafeCast<domVisual_scene> (inst->getUrl().getElement());
-  if (vscene) {
-    load_visual_scene(*vscene, _root);
-  }
-}
-
-/**
- * Loads a visual scene structure.
- */
-void ColladaLoader::
-load_visual_scene(domVisual_scene& scene, PandaNode *parent) {
-  // If we already loaded it before, instantiate the stored node.
-  if (scene.getUserData() != nullptr) {
-    parent->add_child((PandaNode *) scene.getUserData());
-    return;
-  }
-
-  PT(PandaNode) pnode = new PandaNode(TOSTRING(scene.getName()));
-  scene.setUserData((void *) pnode);
-  parent->add_child(pnode);
-
-  // Load in any tags.
-  domExtra_Array &extras = scene.getExtra_array();
-  for (size_t i = 0; i < extras.getCount(); ++i) {
-    load_tags(*extras[i], pnode);
-  }
-
-  // Now load in the child nodes.
-  domNode_Array &nodes = scene.getNode_array();
-  for (size_t i = 0; i < nodes.getCount(); ++i) {
-    load_node(*nodes[i], pnode);
-  }
-
-  // Apply any lights we've encountered to the visual scene.
-  if (_lights.size() > 0) {
-    CPT(LightAttrib) lattr = DCAST(LightAttrib, LightAttrib::make());
-    pvector<LightNode*>::iterator it;
-    for (it = _lights.begin(); it != _lights.end(); ++it) {
-      lattr = DCAST(LightAttrib, lattr->add_on_light(*it));
-    }
-    pnode->set_state(RenderState::make(lattr));
-
-    _lights.clear();
-  }
-}
-
-/**
- * Loads a COLLADA <node>.
- */
-void ColladaLoader::
-load_node(domNode& node, PandaNode *parent) {
-  // If we already loaded it before, instantiate the stored node.
-  if (node.getUserData() != nullptr) {
-    parent->add_child((PandaNode *) node.getUserData());
-    return;
-  }
-
-  // Create the node.
-  PT(PandaNode) pnode;
-  pnode = new PandaNode(TOSTRING(node.getName()));
-  node.setUserData((void *) pnode);
-  parent->add_child(pnode);
-
-  // Apply the transformation elements in reverse order.
-  LMatrix4f transform (LMatrix4f::ident_mat());
-
-  daeElementRefArray &elements = node.getContents();
-  for (size_t i = elements.getCount(); i > 0; --i) {
-    daeElementRef &elem = elements[i - 1];
-
-    switch (elem->getElementType()) {
-      case COLLADA_TYPE::LOOKAT: {
-        // Didn't test this, but *should* be right.
-        domFloat3x3 &l = (daeSafeCast<domLookat>(elem))->getValue();
-        LPoint3f eye (l[0], l[1], l[2]);
-        LVector3f up (l[6], l[7], l[8]);
-        LVector3f forward = LPoint3f(l[3], l[4], l[5]) - eye;
-        forward.normalize();
-        LVector3f side = forward.cross(up);
-        side.normalize();
-        up = side.cross(forward);
-        LMatrix4f mat (LMatrix4f::ident_mat());
-        mat.set_col(0, side);
-        mat.set_col(1, up);
-        mat.set_col(2, -forward);
-        transform *= mat;
-        transform *= LMatrix4f::translate_mat(-eye);
-        break;
-      }
-      case COLLADA_TYPE::MATRIX: {
-        domFloat4x4 &m = (daeSafeCast<domMatrix>(elem))->getValue();
-        transform *= LMatrix4f(
-          m[0], m[4], m[ 8], m[12],
-          m[1], m[5], m[ 9], m[13],
-          m[2], m[6], m[10], m[14],
-          m[3], m[7], m[11], m[15]);
-        break;
-      }
-      case COLLADA_TYPE::ROTATE: {
-        domFloat4 &r = (daeSafeCast<domRotate>(elem))->getValue();
-        transform *= LMatrix4f::rotate_mat(r[3], LVecBase3f(r[0], r[1], r[2]));
-        break;
-      }
-      case COLLADA_TYPE::SCALE: {
-        domFloat3 &s = (daeSafeCast<domScale>(elem))->getValue();
-        transform *= LMatrix4f::scale_mat(s[0], s[1], s[2]);
-        break;
-      }
-      case COLLADA_TYPE::SKEW:
-        // FIXME: implement skew
-        collada_cat.error() << "<skew> not supported yet\n";
-        break;
-      case COLLADA_TYPE::TRANSLATE: {
-        domFloat3 &t = (daeSafeCast<domTranslate>(elem))->getValue();
-        transform *= LMatrix4f::translate_mat(t[0], t[1], t[2]);
-        break;
-      }
-    }
-  }
-  // TODO: convert coordinate systems transform *= LMatrix4f::convert_mat(XXX,
-  // _cs);
-
-  // If there's a transform, set it.
-  if (transform != LMatrix4f::ident_mat()) {
-    pnode->set_transform(TransformState::make_mat(transform));
-  }
-
-  // See if this node instantiates any cameras.
-  domInstance_camera_Array &caminst = node.getInstance_camera_array();
-  for (size_t i = 0; i < caminst.getCount(); ++i) {
-    domCamera* target = daeSafeCast<domCamera> (caminst[i]->getUrl().getElement());
-    load_camera(*target, pnode);
-  }
-
-  // See if this node instantiates any controllers.
-  domInstance_controller_Array &ctrlinst = node.getInstance_controller_array();
-  for (size_t i = 0; i < ctrlinst.getCount(); ++i) {
-    domController* target = daeSafeCast<domController> (ctrlinst[i]->getUrl().getElement());
-    // TODO: implement controllers.  For now, let's just read the geometry
-    if (target->getSkin() != nullptr) {
-      domGeometry* geom = daeSafeCast<domGeometry> (target->getSkin()->getSource().getElement());
-      // TODO load_geometry(*geom, ctrlinst[i]->getBind_material(), pnode);
-    }
-  }
-
-  // See if this node instantiates any geoms.
-  domInstance_geometry_Array &ginst = node.getInstance_geometry_array();
-  for (size_t i = 0; i < ginst.getCount(); ++i) {
-    load_instance_geometry(*ginst[i], pnode);
-  }
-
-  // See if this node instantiates any lights.
-  domInstance_light_Array &linst = node.getInstance_light_array();
-  for (size_t i = 0; i < linst.getCount(); ++i) {
-    domLight* target = daeSafeCast<domLight> (linst[i]->getUrl().getElement());
-    load_light(*target, pnode);
-  }
-
-  // And instantiate any <instance_nodes> elements.
-  domInstance_node_Array &ninst = node.getInstance_node_array();
-  for (size_t i = 0; i < ninst.getCount(); ++i) {
-    domNode* target = daeSafeCast<domNode> (ninst[i]->getUrl().getElement());
-    load_node(*target, pnode);
-  }
-
-  // Now load in the child nodes.
-  domNode_Array &nodes = node.getNode_array();
-  for (size_t i = 0; i < nodes.getCount(); ++i) {
-    load_node(*nodes[i], pnode);
-  }
-
-  // Load in any tags.
-  domExtra_Array &extras = node.getExtra_array();
-  for (size_t i = 0; i < extras.getCount(); ++i) {
-    load_tags(*extras[i], pnode);
-    // TODO: load SI_Visibility under XSI profile TODO: support
-    // OpenSceneGraph's switch nodes
-  }
-}
-
-/**
- * Loads tags specified in an <extra> element.
- */
-void ColladaLoader::
-load_tags(domExtra &extra, PandaNode *node) {
-  domTechnique_Array &techniques = extra.getTechnique_array();
-
-  for (size_t t = 0; t < techniques.getCount(); ++t) {
-    if (cmp_nocase(techniques[t]->getProfile(), "PANDA3D") == 0) {
-      const daeElementRefArray &children = techniques[t]->getChildren();
-
-      for (size_t c = 0; c < children.getCount(); ++c) {
-        daeElement &child = *children[c];
-
-        if (cmp_nocase(child.getElementName(), "tag") == 0) {
-          const std::string &name = child.getAttribute("name");
-          if (name.size() > 0) {
-            node->set_tag(name, child.getCharData());
-          } else {
-            collada_cat.warning() << "Ignoring <tag> without name attribute\n";
-          }
-        } else if (cmp_nocase(child.getElementName(), "param") == 0) {
-          collada_cat.error() <<
-            "Unknown <param> attribute in PANDA3D technique. "
-            "Did you mean to use <tag> instead?\n";
-        }
-      }
-    }
-  }
-}
-
-/**
- * Loads a COLLADA <camera> as a Camera object.
- */
-void ColladaLoader::
-load_camera(domCamera &cam, PandaNode *parent) {
-  // If we already loaded it before, instantiate the stored node.
-  if (cam.getUserData() != nullptr) {
-    parent->add_child((PandaNode *) cam.getUserData());
-    return;
-  }
-
-  // TODO
-}
-
-/**
- * Loads a COLLADA <instance_geometry> as a GeomNode object.
- */
-void ColladaLoader::
-load_instance_geometry(domInstance_geometry &inst, PandaNode *parent) {
-  // If we already loaded it before, instantiate the stored node.
-  if (inst.getUserData() != nullptr) {
-    parent->add_child((PandaNode *) inst.getUserData());
-    return;
-  }
-
-  domGeometry* geom = daeSafeCast<domGeometry> (inst.getUrl().getElement());
-  nassertv(geom != nullptr);
-
-  // Create the node.
-  PT(GeomNode) gnode = new GeomNode(TOSTRING(geom->getName()));
-  inst.setUserData((void *) gnode);
-  parent->add_child(gnode);
-
-  domBind_materialRef bind_mat = inst.getBind_material();
-  ColladaBindMaterial cbm;
-  if (bind_mat != nullptr) {
-    cbm.load_bind_material(*bind_mat);
-  }
-
-  load_geometry(*geom, gnode, cbm);
-
-  // Load in any tags.
-  domExtra_Array &extras = geom->getExtra_array();
-  for (size_t i = 0; i < extras.getCount(); ++i) {
-    load_tags(*extras[i], gnode);
-  }
-}
-
-/**
- * Loads a COLLADA <geometry> and adds the primitives to the given GeomNode
- * object.
- */
-void ColladaLoader::
-load_geometry(domGeometry &geom, GeomNode *gnode, ColladaBindMaterial &bind_mat) {
-  domMesh* mesh = geom.getMesh();
-  if (mesh == nullptr) {
-    // TODO: support non-mesh geometry.
-    return;
-  }
-
-  // TODO: support other than just triangles.
-  domLines_Array &lines_array = mesh->getLines_array();
-  for (size_t i = 0; i < lines_array.getCount(); ++i) {
-    PT(ColladaPrimitive) prim = ColladaPrimitive::from_dom(*lines_array[i]);
-    if (prim != nullptr) {
-      gnode->add_geom(prim->get_geom());
-    }
-  }
-
-  domLinestrips_Array &linestrips_array = mesh->getLinestrips_array();
-  for (size_t i = 0; i < linestrips_array.getCount(); ++i) {
-    PT(ColladaPrimitive) prim = ColladaPrimitive::from_dom(*linestrips_array[i]);
-    if (prim != nullptr) {
-      gnode->add_geom(prim->get_geom());
-    }
-  }
-
-  domPolygons_Array &polygons_array = mesh->getPolygons_array();
-  for (size_t i = 0; i < polygons_array.getCount(); ++i) {
-    PT(ColladaPrimitive) prim = ColladaPrimitive::from_dom(*polygons_array[i]);
-    if (prim != nullptr) {
-      gnode->add_geom(prim->get_geom());
-    }
-  }
-
-  domPolylist_Array &polylist_array = mesh->getPolylist_array();
-  for (size_t i = 0; i < polylist_array.getCount(); ++i) {
-    PT(ColladaPrimitive) prim = ColladaPrimitive::from_dom(*polylist_array[i]);
-    if (prim != nullptr) {
-      gnode->add_geom(prim->get_geom());
-    }
-  }
-
-  domTriangles_Array &triangles_array = mesh->getTriangles_array();
-  for (size_t i = 0; i < triangles_array.getCount(); ++i) {
-    PT(ColladaPrimitive) prim = ColladaPrimitive::from_dom(*triangles_array[i]);
-    if (prim != nullptr) {
-      gnode->add_geom(prim->get_geom());
-    }
-  }
-
-  domTrifans_Array &trifans_array = mesh->getTrifans_array();
-  for (size_t i = 0; i < trifans_array.getCount(); ++i) {
-    PT(ColladaPrimitive) prim = ColladaPrimitive::from_dom(*trifans_array[i]);
-    if (prim != nullptr) {
-      gnode->add_geom(prim->get_geom());
-    }
-  }
-
-  domTristrips_Array &tristrips_array = mesh->getTristrips_array();
-  for (size_t i = 0; i < tristrips_array.getCount(); ++i) {
-    PT(ColladaPrimitive) prim = ColladaPrimitive::from_dom(*tristrips_array[i]);
-    if (prim != nullptr) {
-      gnode->add_geom(prim->get_geom());
-    }
-  }
-}
-
-/**
- * Loads a COLLADA <light> as a LightNode object.
- */
-void ColladaLoader::
-load_light(domLight &light, PandaNode *parent) {
-  // If we already loaded it before, instantiate the stored node.
-  if (light.getUserData() != nullptr) {
-    parent->add_child((PandaNode *) light.getUserData());
-    return;
-  }
-
-  PT(LightNode) lnode;
-  domLight::domTechnique_common &tc = *light.getTechnique_common();
-
-  // Check for an ambient light.
-  domLight::domTechnique_common::domAmbientRef ambient = tc.getAmbient();
-  if (ambient != nullptr) {
-    PT(AmbientLight) alight = new AmbientLight(TOSTRING(light.getName()));
-    lnode = DCAST(LightNode, alight);
-
-    domFloat3 &color = ambient->getColor()->getValue();
-    alight->set_color(LColor(color[0], color[1], color[2], 1.0));
-  }
-
-  // Check for a directional light.
-  domLight::domTechnique_common::domDirectionalRef directional = tc.getDirectional();
-  if (directional != nullptr) {
-    PT(DirectionalLight) dlight = new DirectionalLight(TOSTRING(light.getName()));
-    lnode = DCAST(LightNode, dlight);
-
-    domFloat3 &color = directional->getColor()->getValue();
-    dlight->set_color(LColor(color[0], color[1], color[2], 1.0));
-    dlight->set_direction(LVector3f(0, 0, -1));
-  }
-
-  // Check for a point light.
-  domLight::domTechnique_common::domPointRef point = tc.getPoint();
-  if (point != nullptr) {
-    PT(PointLight) plight = new PointLight(TOSTRING(light.getName()));
-    lnode = DCAST(LightNode, plight);
-
-    domFloat3 &color = point->getColor()->getValue();
-    plight->set_color(LColor(color[0], color[1], color[2], 1.0));
-
-    LVecBase3f atten (1.0f, 0.0f, 0.0f);
-    domTargetable_floatRef fval = point->getConstant_attenuation();
-    if (fval != nullptr) {
-      atten[0] = fval->getValue();
-    }
-    fval = point->getLinear_attenuation();
-    if (fval != nullptr) {
-      atten[1] = fval->getValue();
-    }
-    fval = point->getQuadratic_attenuation();
-    if (fval != nullptr) {
-      atten[2] = fval->getValue();
-    }
-
-    plight->set_attenuation(atten);
-  }
-
-  // Check for a spot light.
-  domLight::domTechnique_common::domSpotRef spot = tc.getSpot();
-  if (spot != nullptr) {
-    PT(Spotlight) slight = new Spotlight(TOSTRING(light.getName()));
-    lnode = DCAST(LightNode, slight);
-
-    domFloat3 &color = spot->getColor()->getValue();
-    slight->set_color(LColor(color[0], color[1], color[2], 1.0));
-
-    LVecBase3f atten (1.0f, 0.0f, 0.0f);
-    domTargetable_floatRef fval = spot->getConstant_attenuation();
-    if (fval != nullptr) {
-      atten[0] = fval->getValue();
-    }
-    fval = spot->getLinear_attenuation();
-    if (fval != nullptr) {
-      atten[1] = fval->getValue();
-    }
-    fval = spot->getQuadratic_attenuation();
-    if (fval != nullptr) {
-      atten[2] = fval->getValue();
-    }
-
-    slight->set_attenuation(atten);
-
-    fval = spot->getFalloff_angle();
-    if (fval != nullptr) {
-      slight->get_lens()->set_fov(fval->getValue());
-    } else {
-      slight->get_lens()->set_fov(180.0f);
-    }
-
-    fval = spot->getFalloff_exponent();
-    if (fval != nullptr) {
-      slight->set_exponent(fval->getValue());
-    } else {
-      slight->set_exponent(0.0f);
-    }
-  }
-
-  if (lnode == nullptr) {
-    return;
-  }
-  parent->add_child(lnode);
-  _lights.push_back(lnode);
-  light.setUserData((void*) lnode);
-
-  // Load in any tags.
-  domExtra_Array &extras = light.getExtra_array();
-  for (size_t i = 0; i < extras.getCount(); ++i) {
-    load_tags(*extras[i], lnode);
-  }
-}

+ 0 - 76
panda/src/collada/colladaLoader.h

@@ -1,76 +0,0 @@
-/**
- * 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 colladaLoader.h
- * @author Xidram
- * @date 2010-12-21
- */
-
-#ifndef COLLADALOADER_H
-#define COLLADALOADER_H
-
-#include "pandabase.h"
-#include "config_collada.h"
-#include "typedReferenceCount.h"
-#include "pandaNode.h"
-#include "modelRoot.h"
-#include "pvector.h"
-#include "pta_LVecBase4.h"
-
-class ColladaBindMaterial;
-class BamCacheRecord;
-class GeomNode;
-class LightNode;
-
-class domBind_material;
-class domCOLLADA;
-class domNode;
-class domVisual_scene;
-class domExtra;
-class domGeometry;
-class domInstance_geometry;
-class domLight;
-class domCamera;
-class domSource;
-class DAE;
-
-/**
- * Object that interfaces with the COLLADA DOM library and loads the COLLADA
- * structures into Panda nodes.
- */
-class ColladaLoader {
-public:
-  ColladaLoader();
-  virtual ~ColladaLoader();
-
-  bool _error;
-  PT(ModelRoot) _root;
-  BamCacheRecord *_record;
-  CoordinateSystem _cs;
-  Filename _filename;
-
-  bool read(const Filename &filename);
-  void build_graph();
-
-private:
-  const domCOLLADA* _collada;
-  DAE* _dae;
-  pvector<LightNode*> _lights;
-
-  void load_visual_scene(domVisual_scene &scene, PandaNode *parent);
-  void load_node(domNode &node, PandaNode *parent);
-  void load_tags(domExtra &extra, PandaNode *node);
-  void load_camera(domCamera &cam, PandaNode *parent);
-  void load_instance_geometry(domInstance_geometry &inst, PandaNode *parent);
-  void load_geometry(domGeometry &geom, GeomNode *parent, ColladaBindMaterial &bind_mat);
-  void load_light(domLight &light, PandaNode *parent);
-};
-
-#include "colladaLoader.I"
-
-#endif

+ 0 - 40
panda/src/collada/colladaPrimitive.I

@@ -1,40 +0,0 @@
-/**
- * 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 colladaPrimitive.I
- * @author rdb
- * @date 2011-05-23
- */
-
-/**
- * Adds a new ColladaInput to this primitive.
- */
-INLINE void ColladaPrimitive::
-add_input(ColladaInput *input) {
-  if (input->get_offset() >= _stride) {
-    _stride = input->get_offset() + 1;
-  }
-  _inputs.push_back(input);
-}
-
-/**
- * Returns the Geom associated with this primitive.
- */
-INLINE PT(Geom) ColladaPrimitive::
-get_geom() const {
-  return _geom;
-}
-
-/**
- * Returns the name of this primitive's material, or the empty string if none
- * was assigned.
- */
-INLINE const std::string &ColladaPrimitive::
-get_material() const {
-  return _material;
-}

+ 0 - 293
panda/src/collada/colladaPrimitive.cxx

@@ -1,293 +0,0 @@
-/**
- * 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 colladaPrimitive.cxx
- * @author rdb
- * @date 2011-05-23
- */
-
-#include "colladaPrimitive.h"
-#include "geomLines.h"
-#include "geomLinestrips.h"
-#include "geomTriangles.h"
-#include "geomTrifans.h"
-#include "geomTristrips.h"
-
-// Collada DOM includes.  No other includes beyond this point.
-#include "pre_collada_include.h"
-#include <dom/domLines.h>
-#include <dom/domLinestrips.h>
-#include <dom/domPolygons.h>
-#include <dom/domPolylist.h>
-#include <dom/domTriangles.h>
-#include <dom/domTrifans.h>
-#include <dom/domTristrips.h>
-
-#if PANDA_COLLADA_VERSION < 15
-#define domInput_local_offsetRef domInputLocalOffsetRef
-#endif
-
-/**
- * Why do I even bother documenting the simplest of constructors?  A private
- * one at that.
- */
-ColladaPrimitive::
-ColladaPrimitive(GeomPrimitive *prim, daeTArray<domInput_local_offsetRef> &inputs)
-  : _stride (1), _gprim (prim) {
-
-  PT(GeomVertexArrayFormat) aformat = new GeomVertexArrayFormat;
-
-  // Add the inputs one by one.
-  for (size_t in = 0; in < inputs.getCount(); ++in) {
-    PT(ColladaInput) input = ColladaInput::from_dom(*inputs[in]);
-    add_input(input);
-
-    input->make_vertex_columns(aformat);
-  }
-
-  // Create the vertex data.
-  PT(GeomVertexFormat) format = new GeomVertexFormat();
-  format->add_array(aformat);
-  _vdata = new GeomVertexData("", GeomVertexFormat::register_format(format), GeomEnums::UH_static);
-  _geom = new Geom(_vdata);
-  _geom->add_primitive(_gprim);
-}
-
-/**
- * Returns the ColladaPrimitive object that represents the provided DOM input
- * element.
- */
-ColladaPrimitive *ColladaPrimitive::
-from_dom(domLines &prim) {
-  // If we already loaded it before, use that.
-  if (prim.getUserData() != nullptr) {
-    return (ColladaPrimitive *) prim.getUserData();
-  }
-
-  ColladaPrimitive *new_prim =
-    new ColladaPrimitive(new GeomLines(GeomEnums::UH_static),
-                         prim.getInput_array());
-  new_prim->_material = prim.getMaterial();
-
-  prim.setUserData(new_prim);
-
-  domPRef p = prim.getP();
-  if (p != nullptr) {
-    new_prim->load_primitive(*p);
-  }
-
-  return new_prim;
-}
-
-/**
- * Returns the ColladaPrimitive object that represents the provided DOM input
- * element.
- */
-ColladaPrimitive *ColladaPrimitive::
-from_dom(domLinestrips &prim) {
-  // If we already loaded it before, use that.
-  if (prim.getUserData() != nullptr) {
-    return (ColladaPrimitive *) prim.getUserData();
-  }
-
-  ColladaPrimitive *new_prim =
-    new ColladaPrimitive(new GeomLinestrips(GeomEnums::UH_static),
-                         prim.getInput_array());
-  new_prim->_material = prim.getMaterial();
-
-  prim.setUserData(new_prim);
-
-  new_prim->load_primitives(prim.getP_array());
-
-  return new_prim;
-}
-
-/**
- * Returns the ColladaPrimitive object that represents the provided DOM input
- * element.
- */
-ColladaPrimitive *ColladaPrimitive::
-from_dom(domPolygons &prim) {
-  // If we already loaded it before, use that.
-  if (prim.getUserData() != nullptr) {
-    return (ColladaPrimitive *) prim.getUserData();
-  }
-
-  // We use trifans to represent polygons, seems to be easiest.  I tried using
-  // tristrips instead, but for some reason, this resulted in a few flipped
-  // polygons.  Weird.
-  ColladaPrimitive *new_prim =
-    new ColladaPrimitive(new GeomTrifans(GeomEnums::UH_static),
-                         prim.getInput_array());
-  new_prim->_material = prim.getMaterial();
-
-  prim.setUserData(new_prim);
-
-  new_prim->load_primitives(prim.getP_array());
-
-  if (prim.getPh_array().getCount() > 0) {
-    collada_cat.error()
-      << "Polygons with holes are not supported!\n";
-  }
-
-  return new_prim;
-}
-
-/**
- * Returns the ColladaPrimitive object that represents the provided DOM input
- * element.
- */
-ColladaPrimitive *ColladaPrimitive::
-from_dom(domPolylist &prim) {
-  // If we already loaded it before, use that.
-  if (prim.getUserData() != nullptr) {
-    return (ColladaPrimitive *) prim.getUserData();
-  }
-
-  // We use trifans to represent polygons, seems to be easiest.  I tried using
-  // tristrips instead, but for some reason, this resulted in a few flipped
-  // polygons.  Weird.
-  PT(GeomPrimitive) gprim = new GeomTrifans(GeomEnums::UH_static);
-
-  ColladaPrimitive *new_prim =
-    new ColladaPrimitive(gprim, prim.getInput_array());
-  new_prim->_material = prim.getMaterial();
-
-  prim.setUserData(new_prim);
-
-  domPRef p = prim.getP();
-  domPolylist::domVcountRef vcounts = prim.getVcount();
-  if (p == nullptr || vcounts == nullptr) {
-    return new_prim;
-  }
-
-  new_prim->write_data(new_prim->_vdata, 0, *p);
-
-  daeTArray<domUint> &values = vcounts->getValue();
-  for (size_t i = 0; i < values.getCount(); ++i) {
-    unsigned int vcount = values[i];
-    gprim->add_next_vertices(vcount);
-    gprim->close_primitive();
-  }
-
-  return new_prim;
-}
-
-/**
- * Returns the ColladaPrimitive object that represents the provided DOM input
- * element.
- */
-ColladaPrimitive *ColladaPrimitive::
-from_dom(domTriangles &prim) {
-  // If we already loaded it before, use that.
-  if (prim.getUserData() != nullptr) {
-    return (ColladaPrimitive *) prim.getUserData();
-  }
-
-  ColladaPrimitive *new_prim =
-    new ColladaPrimitive(new GeomTriangles(GeomEnums::UH_static),
-                         prim.getInput_array());
-  new_prim->_material = prim.getMaterial();
-
-  prim.setUserData(new_prim);
-
-  domPRef p = prim.getP();
-  if (p != nullptr) {
-    new_prim->load_primitive(*p);
-  }
-
-  return new_prim;
-}
-
-/**
- * Returns the ColladaPrimitive object that represents the provided DOM input
- * element.
- */
-ColladaPrimitive *ColladaPrimitive::
-from_dom(domTrifans &prim) {
-  // If we already loaded it before, use that.
-  if (prim.getUserData() != nullptr) {
-    return (ColladaPrimitive *) prim.getUserData();
-  }
-
-  ColladaPrimitive *new_prim =
-    new ColladaPrimitive(new GeomTrifans(GeomEnums::UH_static),
-                         prim.getInput_array());
-  new_prim->_material = prim.getMaterial();
-
-  prim.setUserData(new_prim);
-
-  new_prim->load_primitives(prim.getP_array());
-
-  return new_prim;
-}
-
-/**
- * Returns the ColladaPrimitive object that represents the provided DOM input
- * element.
- */
-ColladaPrimitive *ColladaPrimitive::
-from_dom(domTristrips &prim) {
-  // If we already loaded it before, use that.
-  if (prim.getUserData() != nullptr) {
-    return (ColladaPrimitive *) prim.getUserData();
-  }
-
-  ColladaPrimitive *new_prim =
-    new ColladaPrimitive(new GeomTristrips(GeomEnums::UH_static),
-                         prim.getInput_array());
-  new_prim->_material = prim.getMaterial();
-
-  prim.setUserData(new_prim);
-
-  new_prim->load_primitives(prim.getP_array());
-
-  return new_prim;
-}
-
-/**
- * Writes the vertex data to the GeomVertexData.  Returns the number of rows
- * written.
- */
-unsigned int ColladaPrimitive::
-write_data(GeomVertexData *vdata, int start_row, domP &p) {
-  unsigned int num_vertices = p.getValue().getCount() / _stride;
-
-  Inputs::iterator it;
-  for (it = _inputs.begin(); it != _inputs.end(); ++it) {
-    (*it)->write_data(vdata, start_row, p, _stride);
-  }
-
-  return num_vertices;
-}
-
-/**
- * Adds the given indices to the primitive, and writes the relevant data to
- * the geom.
- */
-void ColladaPrimitive::
-load_primitive(domP &p) {
-  _gprim->add_next_vertices(write_data(_vdata, 0, p));
-  _gprim->close_primitive();
-}
-
-/**
- * Adds the given indices to the primitive, and writes the relevant data to
- * the geom.
- */
-void ColladaPrimitive::
-load_primitives(domP_Array &p_array) {
-  int start_row = 0;
-
-  for (size_t i = 0; i < p_array.getCount(); ++i) {
-    unsigned int num_vertices = write_data(_vdata, start_row, *p_array[i]);
-    _gprim->add_next_vertices(num_vertices);
-    _gprim->close_primitive();
-    start_row += num_vertices;
-  }
-}

+ 0 - 71
panda/src/collada/colladaPrimitive.h

@@ -1,71 +0,0 @@
-/**
- * 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 colladaPrimitive.h
- * @author rdb
- * @date 2011-05-23
- */
-
-#ifndef COLLADAPRIMITIVE_H
-#define COLLADAPRIMITIVE_H
-
-#include "config_collada.h"
-#include "referenceCount.h"
-#include "geomVertexData.h"
-#include "geom.h"
-#include "geomPrimitive.h"
-
-#include "colladaInput.h"
-
-class domP;
-class domLines;
-class domLinestrips;
-class domPolygons;
-class domPolylist;
-class domTriangles;
-class domTrifans;
-class domTristrips;
-
-/**
- * Class that deals with COLLADA primitive structures, such as <triangles> and
- * <polylist>.
- */
-class ColladaPrimitive : public ReferenceCount {
-public:
-  static ColladaPrimitive *from_dom(domLines &lines);
-  static ColladaPrimitive *from_dom(domLinestrips &linestrips);
-  static ColladaPrimitive *from_dom(domPolygons &polygons);
-  static ColladaPrimitive *from_dom(domPolylist &polylist);
-  static ColladaPrimitive *from_dom(domTriangles &triangles);
-  static ColladaPrimitive *from_dom(domTrifans &trifans);
-  static ColladaPrimitive *from_dom(domTristrips &tristrips);
-
-  unsigned int write_data(GeomVertexData *vdata, int start_row, domP &p);
-
-  INLINE PT(Geom) get_geom() const;
-  INLINE const std::string &get_material() const;
-
-private:
-  ColladaPrimitive(GeomPrimitive *prim, daeTArray<daeSmartRef<domInput_local_offset> > &inputs);
-  void load_primitive(domP &p);
-  void load_primitives(daeTArray<daeSmartRef<domP> > &p_array);
-  INLINE void add_input(ColladaInput *input);
-
-  typedef pvector<PT(ColladaInput)> Inputs;
-  Inputs _inputs;
-
-  unsigned int _stride;
-  PT(Geom) _geom;
-  PT(GeomVertexData) _vdata;
-  PT(GeomPrimitive) _gprim;
-  std::string _material;
-};
-
-#include "colladaPrimitive.I"
-
-#endif

+ 0 - 87
panda/src/collada/config_collada.cxx

@@ -1,87 +0,0 @@
-/**
- * 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_collada.cxx
- * @author Xidram
- * @date 2010-12-21
- */
-
-#include "config_collada.h"
-
-#include "dconfig.h"
-#include "loaderFileTypeDae.h"
-#include "loaderFileTypeRegistry.h"
-
-#if !defined(CPPPARSER) && !defined(LINK_ALL_STATIC) && !defined(BUILDING_COLLADA)
-  #error Buildsystem error: BUILDING_COLLADA not defined
-#endif
-
-ConfigureDef(config_collada);
-NotifyCategoryDef(collada, "");
-
-ConfigVariableBool collada_flatten
-("collada-flatten", false,
- PRC_DESC("This is normally true to flatten out useless nodes after loading "
-          "a collada file.  Set it false if you want to see the complete "
-          "and true hierarchy as specified in the file (although the "
-          "extra nodes may have a small impact on render performance)."));
-
-ConfigVariableDouble collada_flatten_radius
-("collada-flatten-radius", 0.0,
- PRC_DESC("This specifies the minimum cull radius in the egg file.  Nodes "
-          "whose bounding volume is smaller than this radius will be "
-          "flattened tighter than nodes larger than this radius, to "
-          "reduce the node count even further.  The idea is that small "
-          "objects will not need to have their individual components "
-          "culled separately, but large environments should.  This allows "
-          "the user to specify what should be considered \"small\".  Set "
-          "it to 0.0 to disable this feature."));
-
-ConfigVariableBool collada_unify
-("collada-unify", true,
- PRC_DESC("When this is true, then in addition to flattening the scene graph "
-          "nodes, the collada loader will also combine as many Geoms as "
-          "possible within "
-          "a given node into a single Geom.  This has theoretical performance "
-          "benefits, especially on higher-end graphics cards, but it also "
-          "slightly slows down collada loading."));
-
-ConfigVariableBool collada_combine_geoms
-("collada-combine-geoms", false,
- PRC_DESC("Set this true to combine sibling GeomNodes into a single GeomNode, "
-          "when possible."));
-
-ConfigVariableBool collada_accept_errors
-("collada-accept-errors", true,
- PRC_DESC("When this is true, certain kinds of recoverable errors (not syntax "
-          "errors) in a collada file will be allowed and ignored when a "
-          "collada file is loaded.  When it is false, only perfectly pristine "
-          "collada files may be loaded."));
-
-ConfigureFn(config_collada) {
-  init_libcollada();
-}
-
-/**
- * Initializes the library.  This must be called at least once before any of
- * the functions or classes in this library can be used.  Normally it will be
- * called by the static initializers and need not be called explicitly, but
- * special cases exist.
- */
-void
-init_libcollada() {
-  static bool initialized = false;
-  if (initialized) {
-    return;
-  }
-  initialized = true;
-
-  LoaderFileTypeRegistry *reg = LoaderFileTypeRegistry::get_global_ptr();
-
-  reg->register_type(new LoaderFileTypeDae);
-}

+ 0 - 36
panda/src/collada/config_collada.h

@@ -1,36 +0,0 @@
-/**
- * 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_collada.h
- * @author Xidram
- * @date 2010-12-21
- */
-
-#ifndef CONFIG_COLLADA_H
-#define CONFIG_COLLADA_H
-
-#include "pandabase.h"
-
-#include "notifyCategoryProxy.h"
-#include "dconfig.h"
-
-template<class T> class daeTArray;
-template<class T> class daeSmartRef;
-
-ConfigureDecl(config_collada, EXPCL_COLLADA, EXPTP_COLLADA);
-NotifyCategoryDecl(collada, EXPCL_COLLADA, EXPTP_COLLADA);
-
-extern EXPCL_COLLADA ConfigVariableBool collada_flatten;
-extern EXPCL_COLLADA ConfigVariableBool collada_unify;
-extern EXPCL_COLLADA ConfigVariableDouble collada_flatten_radius;
-extern EXPCL_COLLADA ConfigVariableBool collada_combine_geoms;
-extern EXPCL_COLLADA ConfigVariableBool collada_accept_errors;
-
-extern EXPCL_COLLADA void init_libcollada();
-
-#endif

+ 0 - 92
panda/src/collada/load_collada_file.cxx

@@ -1,92 +0,0 @@
-/**
- * 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 load_collada_file.cxx
- * @author rdb
- * @date 2011-03-16
- */
-
-#include "load_collada_file.h"
-#include "colladaLoader.h"
-#include "config_collada.h"
-#include "sceneGraphReducer.h"
-#include "virtualFileSystem.h"
-#include "config_putil.h"
-#include "bamCacheRecord.h"
-
-static PT(PandaNode)
-load_from_loader(ColladaLoader &loader) {
-  loader.build_graph();
-
-  if (loader._error && !collada_accept_errors) {
-    collada_cat.error()
-      << "Errors in collada file.\n";
-    return nullptr;
-  }
-
-  if (loader._root != nullptr && collada_flatten) {
-    SceneGraphReducer gr;
-
-    int combine_siblings_bits = 0;
-    if (collada_combine_geoms) {
-      combine_siblings_bits |= SceneGraphReducer::CS_geom_node;
-    }
-    if (collada_flatten_radius > 0.0) {
-      combine_siblings_bits |= SceneGraphReducer::CS_within_radius;
-      gr.set_combine_radius(collada_flatten_radius);
-    }
-
-    int num_reduced = gr.flatten(loader._root, combine_siblings_bits);
-    collada_cat.info() << "Flattened " << num_reduced << " nodes.\n";
-
-    if (collada_unify) {
-      // We want to premunge before unifying, since otherwise we risk
-      // needlessly duplicating vertices.
-      if (premunge_data) {
-        gr.premunge(loader._root, RenderState::make_empty());
-      }
-      gr.collect_vertex_data(loader._root);
-      gr.unify(loader._root, true);
-      if (collada_cat.is_debug()) {
-        collada_cat.debug() << "Unified.\n";
-      }
-    }
-  }
-
-  return DCAST(ModelRoot, loader._root);
-}
-
-/**
- * A convenience function.  Loads up the indicated dae file, and returns the
- * root of a scene graph.  Returns NULL if the file cannot be read for some
- * reason.  Does not search along the model path for the filename first.
- */
-PT(PandaNode)
-load_collada_file(const Filename &filename, CoordinateSystem cs,
-                  BamCacheRecord *record) {
-
-  VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr();
-
-  if (record != nullptr) {
-    record->add_dependent_file(filename);
-  }
-
-  ColladaLoader loader;
-  loader._filename = filename;
-  loader._cs = cs;
-  loader._record = record;
-
-  collada_cat.info()
-    << "Reading " << filename << "\n";
-
-  if (!loader.read(filename)) {
-    return nullptr;
-  }
-
-  return load_from_loader(loader);
-}

+ 0 - 36
panda/src/collada/load_collada_file.h

@@ -1,36 +0,0 @@
-/**
- * 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 load_collada_file.h
- * @author rdb
- * @date 2011-03-16
- */
-
-#ifndef LOAD_COLLADA_FILE_H
-#define LOAD_COLLADA_FILE_H
-
-#include "pandabase.h"
-
-#include "pandaNode.h"
-#include "filename.h"
-#include "coordinateSystem.h"
-
-class BamCacheRecord;
-
-BEGIN_PUBLISH
-/**
- * A convenience function; the primary interface to this package.  Loads up
- * the indicated DAE file, and returns the root of a scene graph.  Returns
- * NULL if the file cannot be read for some reason.
- */
-EXPCL_COLLADA PT(PandaNode)
-load_collada_file(const Filename &filename, CoordinateSystem cs = CS_default,
-                  BamCacheRecord *record = nullptr);
-END_PUBLISH
-
-#endif

+ 0 - 74
panda/src/collada/loaderFileTypeDae.cxx

@@ -1,74 +0,0 @@
-/**
- * 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 loaderFileTypeDae.cxx
- * @author rdb
- * @date 2009-08-23
- */
-
-#include "loaderFileTypeDae.h"
-#include "load_collada_file.h"
-
-TypeHandle LoaderFileTypeDae::_type_handle;
-
-/**
- *
- */
-LoaderFileTypeDae::
-LoaderFileTypeDae() {
-}
-
-/**
- *
- */
-std::string LoaderFileTypeDae::
-get_name() const {
-#if PANDA_COLLADA_VERSION == 14
-  return "COLLADA 1.4";
-#elif PANDA_COLLADA_VERSION == 15
-  return "COLLADA 1.5";
-#else
-  return "COLLADA";
-#endif
-}
-
-/**
- *
- */
-std::string LoaderFileTypeDae::
-get_extension() const {
-  return "dae";
-}
-
-/**
- * Returns a space-separated list of extension, in addition to the one
- * returned by get_extension(), that are recognized by this loader.
- */
-std::string LoaderFileTypeDae::
-get_additional_extensions() const {
-  return "zae";
-}
-
-/**
- * Returns true if this file type can transparently load compressed files
- * (with a .pz or .gz extension), false otherwise.
- */
-bool LoaderFileTypeDae::
-supports_compressed() const {
-  return true;
-}
-
-/**
- *
- */
-PT(PandaNode) LoaderFileTypeDae::
-load_file(const Filename &path, const LoaderOptions &,
-          BamCacheRecord *record) const {
-  PT(PandaNode) result = load_collada_file(path, CS_default, record);
-  return result;
-}

+ 0 - 54
panda/src/collada/loaderFileTypeDae.h

@@ -1,54 +0,0 @@
-/**
- * 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 loaderFileTypeDae.h
- * @author rdb
- * @date 2009-08-23
- */
-
-#ifndef LOADERFILETYPEDAE_H
-#define LOADERFILETYPEDAE_H
-
-#include "pandabase.h"
-
-#include "loaderFileType.h"
-
-/**
- * This defines the Loader interface to read Dae files.
- */
-class EXPCL_COLLADA LoaderFileTypeDae : public LoaderFileType {
-public:
-  LoaderFileTypeDae();
-
-  virtual std::string get_name() const;
-  virtual std::string get_extension() const;
-  virtual std::string get_additional_extensions() const;
-  virtual bool supports_compressed() const;
-
-  virtual PT(PandaNode) load_file(const Filename &path, const LoaderOptions &options,
-                                  BamCacheRecord *record) const;
-
-public:
-  static TypeHandle get_class_type() {
-    return _type_handle;
-  }
-  static void init_type() {
-    LoaderFileType::init_type();
-    register_type(_type_handle, "LoaderFileTypeDae",
-                  LoaderFileType::get_class_type());
-  }
-  virtual TypeHandle get_type() const {
-    return get_class_type();
-  }
-  virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
-
-private:
-  static TypeHandle _type_handle;
-};
-
-#endif

+ 0 - 3
panda/src/collada/p3collada_composite1.cxx

@@ -1,3 +0,0 @@
-#include "config_collada.cxx"
-#include "load_collada_file.cxx"
-#include "loaderFileTypeDae.cxx"

+ 0 - 28
panda/src/collada/pre_collada_include.h

@@ -1,28 +0,0 @@
-/**
- * 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 pre_collada_include.h
- * @author rdb
- * @date 2011-05-23
- */
-
-// This header file should be included before including any of the COLLADA DOM
-// headers.  It should only be included in a .cxx file (not in a header file)
-// and no Panda3D headers should be included after the pre_collada_include.h
-// include.
-
-#ifdef PRE_COLLADA_INCLUDE_H
-#error Don't include any Panda headers after including pre_collada_include.h!
-#endif
-#define PRE_COLLADA_INCLUDE_H
-
-// Undef some macros that conflict with COLLADA.
-#undef INLINE
-#undef tolower
-
-#include <dae.h>

+ 1 - 1
panda/src/device/clientBase.h

@@ -27,7 +27,7 @@
 #include "coordinateSystem.h"
 
 #ifdef OLD_HAVE_IPC
-#include "ipc_thread.h"
+#include <ipc_thread.h>
 #endif
 
 #include "pmap.h"

+ 4 - 0
panda/src/display/p3display_ext_composite.cxx

@@ -0,0 +1,4 @@
+#include "graphicsStateGuardian_ext.cxx"
+#include "graphicsWindow_ext.cxx"
+#include "pythonGraphicsWindowProc.cxx"
+#include "windowProperties_ext.cxx"

+ 2 - 0
panda/src/display/windowProperties.cxx

@@ -135,6 +135,8 @@ clear_default() {
 /**
  * Returns a WindowProperties structure with only the size specified.  The
  * size is the only property that matters to buffers.
+ *
+ * @deprecated in the Python API, use WindowProperties(size=(x, y)) instead.
  */
 WindowProperties WindowProperties::
 size(const LVecBase2i &size) {

+ 7 - 2
panda/src/display/windowProperties.h

@@ -27,6 +27,10 @@
  * properties for a window after it has been opened.
  */
 class EXPCL_PANDA_DISPLAY WindowProperties {
+public:
+  WindowProperties();
+  INLINE WindowProperties(const WindowProperties &copy);
+
 PUBLISHED:
   enum ZOrder {
     Z_bottom,
@@ -40,8 +44,9 @@ PUBLISHED:
     M_confined,
   };
 
-  WindowProperties();
-  INLINE WindowProperties(const WindowProperties &copy);
+  EXTENSION(WindowProperties(PyObject *self, PyObject *args, PyObject *kwds));
+
+PUBLISHED:
   void operator = (const WindowProperties &copy);
   INLINE ~WindowProperties();
 

+ 82 - 0
panda/src/display/windowProperties_ext.cxx

@@ -0,0 +1,82 @@
+/**
+ * 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 windowProperties_ext.cxx
+ * @author rdb
+ * @date 2018-11-12
+ */
+
+#include "windowProperties_ext.h"
+
+#ifdef HAVE_PYTHON
+
+extern struct Dtool_PyTypedObject Dtool_WindowProperties;
+
+/**
+ * Creates a new WindowProperties initialized with the given properties.
+ */
+void Extension<WindowProperties>::
+__init__(PyObject *self, PyObject *args, PyObject *kwds) {
+  nassertv_always(_this != nullptr);
+
+  // We need to initialize the self object before we can use it.
+  DtoolInstance_INIT_PTR(self, _this);
+
+  // Support copy constructor by extracting the one positional argument.
+  Py_ssize_t nargs = PyTuple_GET_SIZE(args);
+  if (nargs != 0) {
+    if (nargs != 1) {
+      PyErr_Format(PyExc_TypeError,
+                   "WindowProperties() takes at most 1 positional argument (%d given)",
+                   (int)nargs);
+      return;
+    }
+
+    PyObject *arg = PyTuple_GET_ITEM(args, 0);
+    const WindowProperties *copy_from;
+    if (DtoolInstance_GetPointer(arg, copy_from, Dtool_WindowProperties)) {
+      *_this = *copy_from;
+    } else {
+      Dtool_Raise_ArgTypeError(arg, 0, "WindowProperties", "WindowProperties");
+      return;
+    }
+  }
+
+  // Now iterate over the keyword arguments, which define the default values
+  // for the different properties.
+  if (kwds != nullptr) {
+    PyTypeObject *type = Py_TYPE(self);
+    PyObject *key, *value;
+    Py_ssize_t pos = 0;
+
+    while (PyDict_Next(kwds, &pos, &key, &value)) {
+      // Look for a writable property on the type by this name.
+      PyObject *descr = _PyType_Lookup(type, key);
+
+      if (descr != nullptr && Py_TYPE(descr)->tp_descr_set != nullptr) {
+        if (Py_TYPE(descr)->tp_descr_set(descr, self, value) < 0) {
+          return;
+        }
+      } else {
+        PyObject *key_repr = PyObject_Repr(key);
+        PyErr_Format(PyExc_TypeError,
+                     "%.100s is an invalid keyword argument for WindowProperties()",
+#if PY_MAJOR_VERSION >= 3
+                     PyUnicode_AsUTF8(key_repr)
+#else
+                     PyString_AsString(key_repr)
+#endif
+                    );
+        Py_DECREF(key_repr);
+        return;
+      }
+    }
+  }
+}
+
+#endif  // HAVE_PYTHON

+ 37 - 0
panda/src/display/windowProperties_ext.h

@@ -0,0 +1,37 @@
+/**
+ * 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 windowProperties_ext.h
+ * @author rdb
+ * @date 2018-11-12
+ */
+
+#ifndef WINDOWPROPERTIES_EXT_H
+#define WINDOWPROPERTIES_EXT_H
+
+#include "dtoolbase.h"
+
+#ifdef HAVE_PYTHON
+
+#include "extension.h"
+#include "windowProperties.h"
+#include "py_panda.h"
+
+/**
+ * This class defines the extension methods for WindowProperties, which are
+ * called instead of any C++ methods with the same prototype.
+ */
+template<>
+class Extension<WindowProperties> : public ExtensionBase<WindowProperties> {
+public:
+  void __init__(PyObject *self, PyObject *args, PyObject *kwds);
+};
+
+#endif  // HAVE_PYTHON
+
+#endif  // WINDOWPROPERTIES_EXT_H

+ 1 - 1
panda/src/downloader/bioPtr.cxx

@@ -19,7 +19,7 @@
 #include "config_downloader.h"
 
 #include "openSSLWrapper.h"  // must be included before any other openssl.
-#include "openssl/ssl.h"
+#include <openssl/ssl.h>
 
 #ifdef _WIN32
 #include <winsock2.h>

+ 2 - 1
panda/src/downloader/httpCookie.cxx

@@ -15,9 +15,10 @@
 
 #ifdef HAVE_OPENSSL
 
-#include "ctype.h"
 #include "httpChannel.h"
 
+#include <ctype.h>
+
 using std::string;
 
 /**

+ 2 - 2
panda/src/downloader/httpDigestAuthorization.cxx

@@ -17,8 +17,8 @@
 
 #include "httpChannel.h"
 #include "openSSLWrapper.h"  // must be included before any other openssl.
-#include "openssl/ssl.h"
-#include "openssl/md5.h"
+#include <openssl/ssl.h>
+#include <openssl/md5.h>
 #include <time.h>
 
 using std::ostream;

+ 1 - 1
panda/src/dxgsg9/dxGraphicsStateGuardian9.cxx

@@ -66,7 +66,7 @@
 #include "config_pgraph.h"
 #include "shaderGenerator.h"
 #ifdef HAVE_CG
-#include "Cg/cgD3D9.h"
+#include <Cg/cgD3D9.h>
 #endif
 
 #include <mmsystem.h>

+ 1 - 1
panda/src/express/config_express.h

@@ -48,7 +48,7 @@ extern ConfigVariableInt patchfile_increment_size;
 extern ConfigVariableInt patchfile_buffer_size;
 extern ConfigVariableInt patchfile_zone_size;
 
-extern ConfigVariableBool keep_temporary_files;
+extern EXPCL_PANDA_EXPRESS ConfigVariableBool keep_temporary_files;
 extern ConfigVariableBool multifile_always_binary;
 
 extern EXPCL_PANDA_EXPRESS ConfigVariableBool collect_tcp;

+ 1 - 1
panda/src/express/hashVal.cxx

@@ -17,7 +17,7 @@
 
 #ifdef HAVE_OPENSSL
 #include "openSSLWrapper.h"  // must be included before any other openssl.
-#include "openssl/md5.h"
+#include <openssl/md5.h>
 #endif  // HAVE_OPENSSL
 
 using std::istream;

+ 5 - 5
panda/src/express/openSSLWrapper.h

@@ -27,11 +27,11 @@
 #define OPENSSL_NO_KRB5
 #endif
 
-#include "openssl/ssl.h"
-#include "openssl/rand.h"
-#include "openssl/err.h"
-#include "openssl/x509.h"
-#include "openssl/x509v3.h"
+#include <openssl/ssl.h>
+#include <openssl/rand.h>
+#include <openssl/err.h>
+#include <openssl/x509.h>
+#include <openssl/x509v3.h>
 
 // Windows may define this macro inappropriately.
 #ifdef X509_NAME

+ 1 - 1
panda/src/express/password_hash.cxx

@@ -18,7 +18,7 @@
 #ifdef HAVE_OPENSSL
 
 #include "pnotify.h"
-#include "openssl/evp.h"
+#include <openssl/evp.h>
 #include "memoryHook.h"
 
 using std::string;

+ 1 - 1
panda/src/express/patchfile.cxx

@@ -27,7 +27,7 @@
 #include <string.h>  // for strstr
 
 #ifdef HAVE_TAR
-#include "libtar.h"
+#include <libtar.h>
 #include <fcntl.h>  // for O_RDONLY
 #endif  // HAVE_TAR
 

+ 3 - 3
panda/src/ffmpeg/config_ffmpeg.cxx

@@ -21,9 +21,9 @@
 #include "movieTypeRegistry.h"
 
 extern "C" {
-  #include "libavcodec/avcodec.h"
-  #include "libavformat/avformat.h"
-  #include "libavutil/avutil.h"
+  #include <libavcodec/avcodec.h>
+  #include <libavformat/avformat.h>
+  #include <libavutil/avutil.h>
 }
 
 #if !defined(CPPPARSER) && !defined(LINK_ALL_STATIC) && !defined(BUILDING_FFMPEG)

+ 5 - 5
panda/src/ffmpeg/ffmpegAudioCursor.cxx

@@ -16,15 +16,15 @@
 
 #include "ffmpegAudio.h"
 extern "C" {
-  #include "libavutil/dict.h"
-  #include "libavutil/opt.h"
-  #include "libavcodec/avcodec.h"
-  #include "libavformat/avformat.h"
+  #include <libavutil/dict.h>
+  #include <libavutil/opt.h>
+  #include <libavcodec/avcodec.h>
+  #include <libavformat/avformat.h>
 }
 
 #ifdef HAVE_SWRESAMPLE
 extern "C" {
-  #include "libswresample/swresample.h"
+  #include <libswresample/swresample.h>
 }
 #endif
 

+ 1 - 1
panda/src/ffmpeg/ffmpegAudioCursor.h

@@ -23,7 +23,7 @@
 #include "ffmpegVirtualFile.h"
 
 extern "C" {
-  #include "libavcodec/avcodec.h"
+  #include <libavcodec/avcodec.h>
 }
 
 class FfmpegAudio;

+ 4 - 4
panda/src/ffmpeg/ffmpegVideoCursor.cxx

@@ -20,11 +20,11 @@
 #include "ffmpegVideo.h"
 #include "bamReader.h"
 extern "C" {
-  #include "libavcodec/avcodec.h"
-  #include "libavformat/avformat.h"
-  #include "libavutil/pixdesc.h"
+  #include <libavcodec/avcodec.h>
+  #include <libavformat/avformat.h>
+  #include <libavutil/pixdesc.h>
 #ifdef HAVE_SWSCALE
-  #include "libswscale/swscale.h"
+  #include <libswscale/swscale.h>
 #endif
 }
 

+ 2 - 2
panda/src/ffmpeg/ffmpegVirtualFile.cxx

@@ -21,8 +21,8 @@ using std::streampos;
 using std::streamsize;
 
 extern "C" {
-  #include "libavcodec/avcodec.h"
-  #include "libavformat/avformat.h"
+  #include <libavcodec/avcodec.h>
+  #include <libavformat/avformat.h>
 }
 
 #ifndef AVSEEK_SIZE

+ 1 - 1
panda/src/ffmpeg/ffmpegVirtualFile.h

@@ -21,7 +21,7 @@
 
 #include <stdarg.h>
 extern "C" {
-  #include "libavformat/avio.h"
+  #include <libavformat/avio.h>
 }
 
 struct URLContext;

+ 4 - 4
panda/src/glstuff/glGraphicsStateGuardian_src.cxx

@@ -68,7 +68,7 @@
 #include "displayInformation.h"
 
 #if defined(HAVE_CG) && !defined(OPENGLES)
-#include "Cg/cgGL.h"
+#include <Cg/cgGL.h>
 #endif
 
 #include <algorithm>
@@ -11759,8 +11759,6 @@ do_issue_tex_gen() {
 
   _tex_gen_modifies_mat = false;
 
-  bool got_point_sprites = false;
-
   for (int i = 0; i < _num_active_texture_stages; i++) {
     set_active_texture_stage(i);
     if (_supports_point_sprite) {
@@ -11953,7 +11951,6 @@ do_issue_tex_gen() {
 #else
         glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
 #endif
-        got_point_sprites = true;
       }
       break;
 
@@ -11991,6 +11988,9 @@ do_issue_tex_gen() {
 #endif  // OPENGLES
   }
 
+  bool got_point_sprites = _supports_point_sprite &&
+    (_target_tex_gen->get_geom_rendering(Geom::GR_point) & GeomEnums::GR_point_sprite) != 0;
+
   if (got_point_sprites != _tex_gen_point_sprite) {
     _tex_gen_point_sprite = got_point_sprites;
 #ifdef OPENGLES

+ 2 - 1
panda/src/grutil/movieTexture.cxx

@@ -25,9 +25,10 @@
 #include "bamCacheRecord.h"
 #include "bamReader.h"
 #include "bamWriter.h"
-#include "math.h"
 #include "audioSound.h"
 
+#include <math.h>
+
 TypeHandle MovieTexture::_type_handle;
 
 /**

+ 1 - 1
panda/src/mathutil/fftCompressor.cxx

@@ -29,7 +29,7 @@
 #undef howmany
 #endif
 
-#include "fftw3.h"
+#include <fftw3.h>
 
 // These FFTW support objects can only be defined if we actually have the FFTW
 // library available.

+ 0 - 119
panda/src/ode/odeHeightFieldGeom.h

@@ -1,119 +0,0 @@
-/**
- * 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 odeHeightFieldGeom.h
- * @author joswilso
- * @date 2006-12-27
- */
-
-#ifndef ODEHEIGHTFIELDGEOM_H
-#define ODEHEIGHTFIELDGEOM_H
-
-#include "pandabase.h"
-#include "typedObject.h"
-#include "luse.h"
-
-#include "ode_includes.h"
-#include "odeGeom.h"
-
-/**
- *
- */
-class EXPCL_PANDAODE OdeHeightfieldGeom : public OdeGeom {
-  friend class OdeGeom;
-
-public:
-  OdeHeightfieldGeom(dGeomID id);
-
-PUBLISHED:
-  OdeHeightfieldGeom();
-  virtual ~OdeHeightfieldGeom();
-
-  INLINE dHeightfieldDataID heightfield_data_create();
-  INLINE void heightfield_data_destroy(dHeightfieldDataID d);
-  INLINE void heightfield_data_build_callback(dHeightfieldDataID d,
-                                              void* p_user_data,
-                                              dHeightfieldGetHeight* p_callback,
-                                              dReal width,
-                                              dReal depth,
-                                              int width_samples,
-                                              int depth_samples,
-                                              dReal scale,
-                                              dReal offset,
-                                              dReal thickness,
-                                              int b_wrap);
-  INLINE void heightfield_data_build_byte(dHeightfieldDataID d,
-                                          const unsigned char* p_height_data,
-                                          int b_copy_height_data,
-                                          dReal width,
-                                          dReal depth,
-                                          int width_samples,
-                                          int depth_samples,
-                                          dReal scale,
-                                          dReal offset,
-                                          dReal thickness,
-                                          int b_wrap);
-  INLINE void heightfield_data_build_short(dHeightfieldDataID d,
-                                           const short* p_height_data,
-                                           int b_copy_height_data,
-                                           dReal width,
-                                           dReal depth,
-                                           int width_samples,
-                                           int depth_samples,
-                                           dReal scale,
-                                           dReal offset,
-                                           dReal thickness,
-                                           int b_wrap);
-  INLINE void heightfield_data_build_single(dHeightfieldDataID d,
-                                            const float* p_height_data,
-                                            int b_copy_height_data,
-                                            dReal width,
-                                            dReal depth,
-                                            int width_samples,
-                                            int depth_samples,
-                                            dReal scale,
-                                            dReal offset,
-                                            dReal thickness,
-                                            int b_wrap);
-  INLINE void heightfield_data_build_double(dHeightfieldDataID d,
-                                            const double* p_height_data,
-                                            int b_copy_height_data,
-                                            dReal width,
-                                            dReal depth,
-                                            int width_samples,
-                                            int depth_samples,
-                                            dReal scale,
-                                            dReal offset,
-                                            dReal thickness,
-                                            int b_wrap);
-  INLINE void heightfield_data_set_bounds(dHeightfieldDataID d,
-                                          dReal min_height,
-                                          dReal max_height);
-  INLINE void heightfield_set_heightfield_data(dHeightfieldDataID d);
-
-public:
-  static TypeHandle get_class_type() {
-    return _type_handle;
-  }
-  static void init_type() {
-    OdeGeom::init_type();
-    register_type(_type_handle, "OdeHeightfieldGeom",
-                  OdeGeom::get_class_type());
-  }
-  virtual TypeHandle get_type() const {
-    return get_class_type();
-  }
-  virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
-
-private:
-  static TypeHandle _type_handle;
-};
-
-#include "odeHeightfieldGeom.I"
-
-#endif

+ 1 - 1
panda/src/ode/ode_includes.h

@@ -35,7 +35,7 @@
 #define int32 ode_int32
 #define uint32 ode_uint32
 
-#include "ode/ode.h"
+#include <ode/ode.h>
 
 // These are the ones that conflict with other defines in Panda.  It may be
 // necessary to add to this list at a later time.

+ 1 - 1
panda/src/pgraph/config_pgraph.h

@@ -48,7 +48,7 @@ extern ConfigVariableDouble garbage_collect_states_rate;
 extern ConfigVariableBool transform_cache;
 extern ConfigVariableBool state_cache;
 extern ConfigVariableBool uniquify_transforms;
-extern ConfigVariableBool uniquify_states;
+extern EXPCL_PANDA_PGRAPH ConfigVariableBool uniquify_states;
 extern ConfigVariableBool uniquify_attribs;
 extern ConfigVariableBool retransform_sprites;
 extern ConfigVariableBool depth_offset_decals;

+ 20 - 21
panda/src/pgraphnodes/shaderGenerator.cxx

@@ -850,7 +850,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) {
   if (need_eye_normal) {
     eye_normal_freg = alloc_freg();
     text << "\t uniform float4x4 tpose_view_to_model,\n";
-    text << "\t out float4 l_eye_normal : " << eye_normal_freg << ",\n";
+    text << "\t out float3 l_eye_normal : " << eye_normal_freg << ",\n";
   }
   if ((key._texture_flags & ShaderKey::TF_map_height) != 0 || need_world_normal || need_eye_normal) {
     text << "\t in float3 vtx_normal : " << normal_vreg << ",\n";
@@ -937,8 +937,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) {
     text << "\t l_eye_position = mul(trans_model_to_view, vtx_position);\n";
   }
   if (need_eye_normal) {
-    text << "\t l_eye_normal.xyz = normalize(mul((float3x3)tpose_view_to_model, vtx_normal));\n";
-    text << "\t l_eye_normal.w = 0;\n";
+    text << "\t l_eye_normal = normalize(mul((float3x3)tpose_view_to_model, vtx_normal));\n";
   }
   pmap<const InternalName *, const char *>::const_iterator it;
   for (it = texcoord_fregs.begin(); it != texcoord_fregs.end(); ++it) {
@@ -987,7 +986,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) {
     text << "\t in float4 l_eye_position : " << eye_position_freg << ",\n";
   }
   if (need_eye_normal) {
-    text << "\t in float4 l_eye_normal : " << eye_normal_freg << ",\n";
+    text << "\t in float3 l_eye_normal : " << eye_normal_freg << ",\n";
   }
   for (it = texcoord_fregs.begin(); it != texcoord_fregs.end(); ++it) {
     text << "\t in float4 l_" << it->first->join("_") << " : " << it->second << ",\n";
@@ -1096,8 +1095,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) {
       text << "\t float4 texcoord" << i << " = l_eye_position;\n";
       break;
     case TexGenAttrib::M_eye_normal:
-      text << "\t float4 texcoord" << i << " = l_eye_normal;\n";
-      text << "\t texcoord" << i << ".w = 1.0f;\n";
+      text << "\t float4 texcoord" << i << " = float4(l_eye_normal, 1.0f);\n";
       break;
     default:
       text << "\t float4 texcoord" << i << " = float4(0, 0, 0, 0);\n";
@@ -1187,6 +1185,10 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) {
       text << ");\n";
     }
   }
+  if (need_eye_normal) {
+    text << "\t // Correct the surface normal for interpolation effects\n";
+    text << "\t l_eye_normal = normalize(l_eye_normal);\n";
+  }
   if (key._texture_flags & ShaderKey::TF_map_normal) {
     text << "\t // Translate tangent-space normal in map to view-space.\n";
 
@@ -1196,7 +1198,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) {
       const ShaderKey::TextureInfo &tex = key._textures[i];
       if (tex._flags & ShaderKey::TF_map_normal) {
         if (is_first) {
-          text << "\t float3 tsnormal = (tex" << i << ".xyz * 2) - 1;\n";
+          text << "\t float3 tsnormal = normalize((tex" << i << ".xyz * 2) - 1);\n";
           is_first = false;
           continue;
         }
@@ -1205,17 +1207,14 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) {
         text << "\t tsnormal = normalize(tsnormal * dot(tsnormal, tmp" << i << ") - tmp" << i << " * tsnormal.z);\n";
       }
     }
-    text << "\t l_eye_normal.xyz *= tsnormal.z;\n";
-    text << "\t l_eye_normal.xyz += l_tangent * tsnormal.x;\n";
-    text << "\t l_eye_normal.xyz += l_binormal * tsnormal.y;\n";
-  }
-  if (need_eye_normal) {
-    text << "\t // Correct the surface normal for interpolation effects\n";
-    text << "\t l_eye_normal.xyz = normalize(l_eye_normal.xyz);\n";
+    text << "\t l_eye_normal *= tsnormal.z;\n";
+    text << "\t l_eye_normal += normalize(l_tangent) * tsnormal.x;\n";
+    text << "\t l_eye_normal += normalize(l_binormal) * tsnormal.y;\n";
+    text << "\t l_eye_normal = normalize(l_eye_normal);\n";
   }
   if (key._outputs & AuxBitplaneAttrib::ABO_aux_normal) {
     text << "\t // Output the camera-space surface normal\n";
-    text << "\t o_aux.rgb = (l_eye_normal.xyz*0.5) + float3(0.5,0.5,0.5);\n";
+    text << "\t o_aux.rgb = (l_eye_normal*0.5) + float3(0.5,0.5,0.5);\n";
   }
   if (key._lighting) {
     text << "\t // Begin view-space light calculations\n";
@@ -1251,7 +1250,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) {
         text << "\t lspec  = lcolor;\n";
       }
       text << "\t lvec   = attr_light" << i << "[3].xyz;\n";
-      text << "\t lcolor *= saturate(dot(l_eye_normal.xyz, lvec.xyz));\n";
+      text << "\t lcolor *= saturate(dot(l_eye_normal, lvec.xyz));\n";
       if (light._flags & ShaderKey::LF_has_shadows) {
         if (_use_shadow_filter) {
           text << "\t lshad = shadow2DProj(shadow_" << i << ", l_lightcoord" << i << ").r;\n";
@@ -1268,7 +1267,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) {
         } else {
           text << "\t lhalf = normalize(lvec - float3(0, 1, 0));\n";
         }
-        text << "\t lspec *= pow(saturate(dot(l_eye_normal.xyz, lhalf)), shininess);\n";
+        text << "\t lspec *= pow(saturate(dot(l_eye_normal, lhalf)), shininess);\n";
         text << "\t tot_specular += lspec;\n";
       }
     } else if (light._type.is_derived_from(PointLight::get_class_type())) {
@@ -1288,7 +1287,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) {
         text << "\t ldist = max(ldist, attr_light" << i << "[2].w);\n";
       }
       text << "\t lattenv = 1/(latten.x + latten.y*ldist + latten.z*ldist*ldist);\n";
-      text << "\t lcolor *= lattenv * saturate(dot(l_eye_normal.xyz, lvec));\n";
+      text << "\t lcolor *= lattenv * saturate(dot(l_eye_normal, lvec));\n";
       if (light._flags & ShaderKey::LF_has_shadows) {
         text << "\t ldist = max(abs(l_lightcoord" << i << ".x), max(abs(l_lightcoord" << i << ".y), abs(l_lightcoord" << i << ".z)));\n";
         text << "\t ldist = ((latten.w+lpoint.w)/(latten.w-lpoint.w))+((-2*latten.w*lpoint.w)/(ldist * (latten.w-lpoint.w)));\n";
@@ -1304,7 +1303,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) {
           text << "\t lhalf = normalize(lvec - float3(0, 1, 0));\n";
         }
         text << "\t lspec *= lattenv;\n";
-        text << "\t lspec *= pow(saturate(dot(l_eye_normal.xyz, lhalf)), shininess);\n";
+        text << "\t lspec *= pow(saturate(dot(l_eye_normal, lhalf)), shininess);\n";
         text << "\t tot_specular += lspec;\n";
       }
     } else if (light._type.is_derived_from(Spotlight::get_class_type())) {
@@ -1325,7 +1324,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) {
       text << "\t lattenv = 1/(latten.x + latten.y*ldist + latten.z*ldist*ldist);\n";
       text << "\t lattenv *= pow(langle, latten.w);\n";
       text << "\t if (langle < ldir.w) lattenv = 0;\n";
-      text << "\t lcolor *= lattenv * saturate(dot(l_eye_normal.xyz, lvec));\n";
+      text << "\t lcolor *= lattenv * saturate(dot(l_eye_normal, lvec));\n";
       if (light._flags & ShaderKey::LF_has_shadows) {
         if (_use_shadow_filter) {
           text << "\t lshad = shadow2DProj(shadow_" << i << ", l_lightcoord" << i << ").r;\n";
@@ -1344,7 +1343,7 @@ synthesize_shader(const RenderState *rs, const GeomVertexAnimationSpec &anim) {
           text << "\t lhalf = normalize(lvec - float3(0,1,0));\n";
         }
         text << "\t lspec *= lattenv;\n";
-        text << "\t lspec *= pow(saturate(dot(l_eye_normal.xyz, lhalf)), shininess);\n";
+        text << "\t lspec *= pow(saturate(dot(l_eye_normal, lhalf)), shininess);\n";
         text << "\t tot_specular += lspec;\n";
       }
     }

+ 1 - 1
panda/src/physx/physxFileStream.cxx

@@ -13,7 +13,7 @@
 
 #include "physxFileStream.h"
 
-#include "stdio.h"
+#include <stdio.h>
 
 #include "virtualFileSystem.h"
 

+ 10 - 10
panda/src/physx/physx_includes.h

@@ -15,7 +15,7 @@
 #define PHYSX_INCLUDES_H
 
 // This one is safe to include
-#include "NxVersionNumber.h"
+#include <NxVersionNumber.h>
 
 // Platform-specific defines
 #if defined(_WIN64)
@@ -49,15 +49,15 @@
 
 
 // PhysX headers
-#include "Nxp.h"
-#include "NxPhysics.h"
-#include "NxExtended.h"
-#include "NxStream.h"
-#include "NxCooking.h"
-#include "NxController.h"
-#include "NxControllerManager.h"
-#include "NxBoxController.h"
-#include "NxCapsuleController.h"
+#include <Nxp.h>
+#include <NxPhysics.h>
+#include <NxExtended.h>
+#include <NxStream.h>
+#include <NxCooking.h>
+#include <NxController.h>
+#include <NxControllerManager.h>
+#include <NxBoxController.h>
+#include <NxCapsuleController.h>
 
 
 #endif // PHYSX_INCLUDES_H

+ 1 - 1
panda/src/speedtree/speedTreeNode.cxx

@@ -35,7 +35,7 @@
 #include "pStatTimer.h"
 
 #ifdef SPEEDTREE_OPENGL
-#include "glew/glew.h"
+#include <glew/glew.h>
 #endif  // SPEEDTREE_OPENGL
 
 #ifdef SPEEDTREE_DIRECTX9

+ 4 - 4
panda/src/speedtree/speedtree_api.h

@@ -18,14 +18,14 @@
 // headers from the SpeedTree API, needed in this directory.
 
 #include "speedtree_parameters.h"
-#include "Core/Core.h"
-#include "Forest/Forest.h"
+#include <Core/Core.h>
+#include <Forest/Forest.h>
 
 #if defined(SPEEDTREE_OPENGL)
-  #include "Renderers/OpenGL/OpenGLRenderer.h"
+  #include <Renderers/OpenGL/OpenGLRenderer.h>
 #elif defined(SPEEDTREE_DIRECTX9)
   #undef Configure
-  #include "Renderers/DirectX9/DirectX9Renderer.h"
+  #include <Renderers/DirectX9/DirectX9Renderer.h>
 #else
   #error Unexpected graphics API.
 #endif

+ 2 - 1
panda/src/tinydisplay/tinySDLGraphicsWindow.h

@@ -21,9 +21,10 @@
 #include "tinySDLGraphicsPipe.h"
 #include "graphicsWindow.h"
 #include "buttonHandle.h"
-#include "SDL.h"
 #include "zbuffer.h"
 
+#include <SDL.h>
+
 /**
  * This graphics window class is implemented via SDL.
  */

+ 1 - 1
panda/src/tinydisplay/vertex.cxx

@@ -1,5 +1,5 @@
 #include "zgl.h"
-#include "string.h"
+#include <string.h>
 
 void gl_eval_viewport(GLContext * c) {
   GLViewport *v = &c->viewport;

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