Browse Source

Move all Python bindings out of core DLLs into the .pyd files.

rdb 11 years ago
parent
commit
cbd70ad8af
68 changed files with 996 additions and 852 deletions
  1. 1 1
      direct/src/dcparser/dcPacker.h
  2. 23 8
      dtool/src/interrogate/functionRemap.cxx
  3. 4 4
      dtool/src/interrogate/interfaceMakerPythonNative.cxx
  4. 16 0
      dtool/src/interrogate/interrogateBuilder.cxx
  5. 154 65
      makepanda/makepanda.py
  6. 1 1
      panda/src/display/Sources.pp
  7. 4 5
      panda/src/display/callbackGraphicsWindow.h
  8. 1 1
      panda/src/display/graphicsStateGuardian_ext.cxx
  9. 1 1
      panda/src/display/graphicsWindowProc.h
  10. 0 3
      panda/src/display/p3display_composite2.cxx
  11. 1 5
      panda/src/downloader/httpAuthorization.h
  12. 4 4
      panda/src/dxml/config_dxml.h
  13. 14 14
      panda/src/dxml/tinyxml.h
  14. 2 2
      panda/src/egg/eggGroupNode_ext.cxx
  15. 1 2
      panda/src/event/Sources.pp
  16. 0 4
      panda/src/event/config_event.cxx
  17. 0 1
      panda/src/event/p3event_composite1.cxx
  18. 7 2
      panda/src/event/pythonTask.cxx
  19. 1 1
      panda/src/event/pythonTask.h
  20. 0 48
      panda/src/express/multifile.I
  21. 47 0
      panda/src/express/multifile.cxx
  22. 5 5
      panda/src/express/multifile.h
  23. 3 2
      panda/src/express/password_hash.h
  24. 1 324
      panda/src/express/pointerToArray.I
  25. 9 71
      panda/src/express/pointerToArray.h
  26. 326 0
      panda/src/express/pointerToArray_ext.I
  27. 100 0
      panda/src/express/pointerToArray_ext.h
  28. 2 1
      panda/src/express/virtualFileSystem_ext.cxx
  29. 3 3
      panda/src/gobj/vertexDataPage.h
  30. 6 6
      panda/src/linmath/lpoint2_ext_src.I
  31. 6 6
      panda/src/linmath/lpoint3_ext_src.I
  32. 6 6
      panda/src/linmath/lpoint4_ext_src.I
  33. 6 7
      panda/src/linmath/lvecBase2_ext_src.I
  34. 6 7
      panda/src/linmath/lvecBase3_ext_src.I
  35. 6 7
      panda/src/linmath/lvecBase4_ext_src.I
  36. 6 6
      panda/src/linmath/lvector2_ext_src.I
  37. 6 6
      panda/src/linmath/lvector3_ext_src.I
  38. 6 6
      panda/src/linmath/lvector4_ext_src.I
  39. 2 0
      panda/src/mathutil/config_mathutil.N
  40. 1 1
      panda/src/net/connectionManager.h
  41. 13 13
      panda/src/ode/odeGeom_ext.cxx
  42. 12 12
      panda/src/ode/odeJoint_ext.cxx
  43. 4 4
      panda/src/ode/odeSpace_ext.cxx
  44. 1 1
      panda/src/parametrics/curveFitter.h
  45. 2 2
      panda/src/parametrics/hermiteCurve.h
  46. 2 2
      panda/src/pgraph/Sources.pp
  47. 0 51
      panda/src/pgraph/nodePathCollection_ext.I
  48. 38 0
      panda/src/pgraph/nodePathCollection_ext.cxx
  49. 1 3
      panda/src/pgraph/nodePathCollection_ext.h
  50. 0 38
      panda/src/pgraph/nodePath_ext.I
  51. 38 4
      panda/src/pgraph/nodePath_ext.cxx
  52. 1 1
      panda/src/pgraph/nodePath_ext.h
  53. 1 1
      panda/src/pgraph/pandaNode_ext.cxx
  54. 3 3
      panda/src/pgraph/renderState_ext.cxx
  55. 4 4
      panda/src/pgraph/transformState_ext.cxx
  56. 54 54
      panda/src/pgraphnodes/shaderGenerator.cxx
  57. 2 2
      panda/src/pgraphnodes/shaderGenerator.h
  58. 3 3
      panda/src/pnmimage/pfmFile_ext.cxx
  59. 3 3
      panda/src/pnmimage/pnmImageHeader.h
  60. 1 1
      panda/src/putil/Sources.pp
  61. 4 0
      panda/src/putil/bitMask.h
  62. 3 0
      panda/src/putil/config_util.N
  63. 0 4
      panda/src/putil/config_util.cxx
  64. 4 1
      panda/src/putil/doubleBitMask.h
  65. 0 1
      panda/src/putil/p3putil_composite2.cxx
  66. 10 4
      panda/src/putil/pythonCallbackObject.cxx
  67. 1 1
      panda/src/putil/pythonCallbackObject.h
  68. 3 3
      panda/src/text/config_text.h

+ 1 - 1
direct/src/dcparser/dcPacker.h

@@ -220,7 +220,7 @@ private:
   const DCPackerCatalog *_catalog;
   const DCPackerCatalog *_catalog;
   const DCPackerCatalog::LiveCatalog *_live_catalog;
   const DCPackerCatalog::LiveCatalog *_live_catalog;
 
 
-  class StackElement {
+  class EXPCL_DIRECT StackElement {
   public:
   public:
     // As an optimization, we implement operator new and delete here
     // As an optimization, we implement operator new and delete here
     // to minimize allocation overhead during push() and pop().
     // to minimize allocation overhead during push() and pop().

+ 23 - 8
dtool/src/interrogate/functionRemap.cxx

@@ -162,6 +162,20 @@ call_function(ostream &out, int indent_level, bool convert_result,
     string defconstruct = builder.in_defconstruct(_cpptype->get_local_name(&parser));
     string defconstruct = builder.in_defconstruct(_cpptype->get_local_name(&parser));
     if (pexprs.empty() && !defconstruct.empty()) {
     if (pexprs.empty() && !defconstruct.empty()) {
       return_expr = defconstruct;
       return_expr = defconstruct;
+    } else if (_extension) {
+      // Extension constructors are a special case.  We allocate memory, but
+      // the actual construction is done by an __init__ method, similar to how
+      // it works in Python.
+      InterfaceMaker::indent(out, indent_level);
+      _return_type->get_new_type()->output_instance(out, "result", &parser);
+      out << " = (" << _cpptype->get_local_name(&parser)
+          << " *) " << _cpptype->get_local_name(&parser)
+          << "::operator new(sizeof(" << _cpptype->get_local_name(&parser) << "));\n";
+
+      InterfaceMaker::indent(out, indent_level)
+        << get_call_str("result", pexprs) << ";\n";
+
+      return_expr = "result";
     } else {
     } else {
       return_expr = "new " + get_call_str(container, pexprs);
       return_expr = "new " + get_call_str(container, pexprs);
     }
     }
@@ -330,7 +344,7 @@ make_wrapper_entry(FunctionIndex function_index) {
       // understands that if the destructor function is zero, it
       // understands that if the destructor function is zero, it
       // should use the regular class destructor.
       // should use the regular class destructor.
 
 
-      //          nout << "Warning!  Destructor for " 
+      //          nout << "Warning!  Destructor for "
       //               << *_return_type->get_orig_type()
       //               << *_return_type->get_orig_type()
       //               << " is unavailable.\n"
       //               << " is unavailable.\n"
       //               << "  Cannot manage return value for:\n  "
       //               << "  Cannot manage return value for:\n  "
@@ -386,11 +400,13 @@ get_call_str(const string &container, const vector_string &pexprs) const {
         call << "Extension<" << _cpptype->get_local_name(&parser) << ">::";
         call << "Extension<" << _cpptype->get_local_name(&parser) << ">::";
       }
       }
 
 
-      call << _cppfunc->get_local_name();
-      call << "(";
-
+      if (_type == T_constructor) {
+        // Constructor extensions are named __init__, by convention.
+        call << "__init__";
+      } else {
+        call << _cppfunc->get_local_name();
+      }
     } else {
     } else {
-
       if (_type == T_constructor) {
       if (_type == T_constructor) {
         // Constructors are called differently.
         // Constructors are called differently.
         call << _cpptype->get_local_name(&parser);
         call << _cpptype->get_local_name(&parser);
@@ -403,9 +419,8 @@ get_call_str(const string &container, const vector_string &pexprs) const {
       } else {
       } else {
         call << _cppfunc->get_local_name(&parser);
         call << _cppfunc->get_local_name(&parser);
       }
       }
-
-      call << "(";
     }
     }
+    call << "(";
 
 
     if (_flags & F_explicit_self) {
     if (_flags & F_explicit_self) {
       // Pass on the PyObject * that we stripped off above.
       // Pass on the PyObject * that we stripped off above.
@@ -639,7 +654,7 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak
   }
   }
 
 
   if (_has_this || _type == T_constructor) {
   if (_has_this || _type == T_constructor) {
-    if (_parameters.size() > first_param && _parameters[first_param]._name == "self" &&
+    if (_parameters.size() > (size_t)first_param && _parameters[first_param]._name == "self" &&
         TypeManager::is_pointer_to_PyObject(_parameters[first_param]._remap->get_orig_type())) {
         TypeManager::is_pointer_to_PyObject(_parameters[first_param]._remap->get_orig_type())) {
       // Here's a special case.  If the first parameter of a nonstatic
       // Here's a special case.  If the first parameter of a nonstatic
       // method is a PyObject * called "self", then we will
       // method is a PyObject * called "self", then we will

+ 4 - 4
dtool/src/interrogate/interfaceMakerPythonNative.cxx

@@ -3121,7 +3121,7 @@ write_function_instance(ostream &out, InterfaceMaker::Object *obj,
                          " wchar_t *" + param_name + "_str = (wchar_t *)alloca(sizeof(wchar_t) * " + param_name + "_len);"
                          " wchar_t *" + param_name + "_str = (wchar_t *)alloca(sizeof(wchar_t) * " + param_name + "_len);"
                          " PyUnicode_AsWideChar(" + param_name + ", " + param_name + "_str, " + param_name + "_len);";
                          " PyUnicode_AsWideChar(" + param_name + ", " + param_name + "_str, " + param_name + "_len);";
 
 
-        pexpr_string = "basic_string<wchar_t>(" +
+        pexpr_string = "std::wstring(" +
           param_name + "_str, " +
           param_name + "_str, " +
           param_name + "_len)";
           param_name + "_len)";
 
 
@@ -3140,7 +3140,7 @@ write_function_instance(ostream &out, InterfaceMaker::Object *obj,
                          " wchar_t *" + param_name + "_str = (wchar_t *)alloca(sizeof(wchar_t) * " + param_name + "_len);"
                          " wchar_t *" + param_name + "_str = (wchar_t *)alloca(sizeof(wchar_t) * " + param_name + "_len);"
                          " PyUnicode_AsWideChar(" + param_name + ", " + param_name + "_str, " + param_name + "_len);";
                          " PyUnicode_AsWideChar(" + param_name + ", " + param_name + "_str, " + param_name + "_len);";
 
 
-        pexpr_string = "&basic_string<wchar_t>(" +
+        pexpr_string = "&std::wstring(" +
           param_name + "_str, " +
           param_name + "_str, " +
           param_name + "_len)";
           param_name + "_len)";
 
 
@@ -3169,11 +3169,11 @@ write_function_instance(ostream &out, InterfaceMaker::Object *obj,
         }
         }
 
 
         if (TypeManager::is_const_ptr_to_basic_string_char(orig_type)) {
         if (TypeManager::is_const_ptr_to_basic_string_char(orig_type)) {
-          pexpr_string = "&basic_string<char>(" +
+          pexpr_string = "&std::string(" +
             param_name + "_str, " +
             param_name + "_str, " +
             param_name + "_len)";
             param_name + "_len)";
         } else {
         } else {
-          pexpr_string = "basic_string<char>(" +
+          pexpr_string = "std::string(" +
             param_name + "_str, " +
             param_name + "_str, " +
             param_name + "_len)";
             param_name + "_len)";
         }
         }

+ 16 - 0
dtool/src/interrogate/interrogateBuilder.cxx

@@ -214,6 +214,22 @@ do_command(const string &command, const string &params) {
   } else if (command == "noinclude") {
   } else if (command == "noinclude") {
     insert_param_list(_noinclude, params);
     insert_param_list(_noinclude, params);
 
 
+  } else if (command == "forceinclude") {
+    size_t nchars = params.size();
+    if (nchars >= 2 && params[0] == '"' && params[nchars-1] == '"') {
+      string incfile = params.substr(1, nchars - 2);
+      _include_files[incfile] = '"';
+
+    } else if (nchars >= 2 && params[0] == '<' && params[nchars-1] == '>') {
+      string incfile = params.substr(1, nchars - 2);
+      _include_files[incfile] = '<';
+
+    } else {
+      nout << "Ignoring invalid forceinclude " << params << "\n"
+              "Expected to be in one of the following forms:\n"
+              "  forceinclude \"file.h\"\n"
+              "  forceinclude <file.h>\n";
+    }
   } else {
   } else {
     nout << "Ignoring " << command << " " << params << "\n";
     nout << "Ignoring " << command << " " << params << "\n";
   }
   }

+ 154 - 65
makepanda/makepanda.py

@@ -981,6 +981,9 @@ def CompileCxx(obj,src,opts):
             else:
             else:
                 cmd += " -D_HAS_EXCEPTIONS=0"
                 cmd += " -D_HAS_EXCEPTIONS=0"
 
 
+            if 'RTTI' not in opts:
+                 cmd += " /GR-"
+
             if GetTargetArch() == 'x64':
             if GetTargetArch() == 'x64':
                 cmd += " /DWIN64_VC /DWIN64"
                 cmd += " /DWIN64_VC /DWIN64"
 
 
@@ -1300,8 +1303,8 @@ def CompileIgate(woutd,wsrc,opts):
         if (opt=="ALWAYS") or (opt in opts):
         if (opt=="ALWAYS") or (opt in opts):
             cmd += ' -D' + var + '=' + val
             cmd += ' -D' + var + '=' + val
 
 
-    building = GetValueOption(opts, "BUILDING:")
-    if (building): cmd += " -DBUILDING_"+building
+    #building = GetValueOption(opts, "BUILDING:")
+    #if (building): cmd += " -DBUILDING_"+building
     cmd += ' -module ' + module + ' -library ' + library
     cmd += ' -module ' + module + ' -library ' + library
     for x in wsrc:
     for x in wsrc:
         if (x.startswith("/")):
         if (x.startswith("/")):
@@ -2947,6 +2950,7 @@ TargetAdd('libp3dtoolconfig.dll', input='libp3dtool.dll')
 TargetAdd('libp3dtoolconfig.dll', opts=['ADVAPI', 'OPENSSL', 'WINGDI', 'WINUSER'])
 TargetAdd('libp3dtoolconfig.dll', opts=['ADVAPI', 'OPENSSL', 'WINGDI', 'WINUSER'])
 
 
 if not PkgSkip("PYTHON"):
 if not PkgSkip("PYTHON"):
+  OPTS=['DIR:dtool/metalibs/dtoolconfig']
   TargetAdd('dtoolconfig_pydtool.obj', opts=OPTS, input="pydtool.cxx")
   TargetAdd('dtoolconfig_pydtool.obj', opts=OPTS, input="pydtool.cxx")
   TargetAdd('dtoolconfig.pyd', input='dtoolconfig_pydtool.obj')
   TargetAdd('dtoolconfig.pyd', input='dtoolconfig_pydtool.obj')
   TargetAdd('dtoolconfig.pyd', input='libp3dtoolconfig.dll')
   TargetAdd('dtoolconfig.pyd', input='libp3dtoolconfig.dll')
@@ -3026,11 +3030,13 @@ TargetAdd('p3pandabase_pandabase.obj', opts=OPTS, input='pandabase.cxx')
 OPTS=['DIR:panda/src/express', 'BUILDING:PANDAEXPRESS', 'OPENSSL', 'ZLIB']
 OPTS=['DIR:panda/src/express', 'BUILDING:PANDAEXPRESS', 'OPENSSL', 'ZLIB']
 TargetAdd('p3express_composite1.obj', opts=OPTS, input='p3express_composite1.cxx')
 TargetAdd('p3express_composite1.obj', opts=OPTS, input='p3express_composite1.cxx')
 TargetAdd('p3express_composite2.obj', opts=OPTS, input='p3express_composite2.cxx')
 TargetAdd('p3express_composite2.obj', opts=OPTS, input='p3express_composite2.cxx')
-TargetAdd('p3express_ext_composite.obj', opts=OPTS, input='p3express_ext_composite.cxx')
+
+OPTS=['DIR:panda/src/express', 'OPENSSL', 'ZLIB']
 IGATEFILES=GetDirectoryContents('panda/src/express', ["*.h", "*_composite*.cxx"])
 IGATEFILES=GetDirectoryContents('panda/src/express', ["*.h", "*_composite*.cxx"])
 TargetAdd('libp3express.in', opts=OPTS, input=IGATEFILES)
 TargetAdd('libp3express.in', opts=OPTS, input=IGATEFILES)
 TargetAdd('libp3express.in', opts=['IMOD:panda3d.core', 'ILIB:libp3express', 'SRCDIR:panda/src/express'])
 TargetAdd('libp3express.in', opts=['IMOD:panda3d.core', 'ILIB:libp3express', 'SRCDIR:panda/src/express'])
 TargetAdd('libp3express_igate.obj', input='libp3express.in', opts=["DEPENDENCYONLY"])
 TargetAdd('libp3express_igate.obj', input='libp3express.in', opts=["DEPENDENCYONLY"])
+TargetAdd('p3express_ext_composite.obj', opts=OPTS, input='p3express_ext_composite.cxx')
 
 
 #
 #
 # DIRECTORY: panda/src/downloader/
 # DIRECTORY: panda/src/downloader/
@@ -3039,6 +3045,8 @@ TargetAdd('libp3express_igate.obj', input='libp3express.in', opts=["DEPENDENCYON
 OPTS=['DIR:panda/src/downloader', 'BUILDING:PANDAEXPRESS', 'OPENSSL', 'ZLIB']
 OPTS=['DIR:panda/src/downloader', 'BUILDING:PANDAEXPRESS', 'OPENSSL', 'ZLIB']
 TargetAdd('p3downloader_composite1.obj', opts=OPTS, input='p3downloader_composite1.cxx')
 TargetAdd('p3downloader_composite1.obj', opts=OPTS, input='p3downloader_composite1.cxx')
 TargetAdd('p3downloader_composite2.obj', opts=OPTS, input='p3downloader_composite2.cxx')
 TargetAdd('p3downloader_composite2.obj', opts=OPTS, input='p3downloader_composite2.cxx')
+
+OPTS=['DIR:panda/src/downloader', 'OPENSSL', 'ZLIB']
 IGATEFILES=GetDirectoryContents('panda/src/downloader', ["*.h", "*_composite*.cxx"])
 IGATEFILES=GetDirectoryContents('panda/src/downloader', ["*.h", "*_composite*.cxx"])
 TargetAdd('libp3downloader.in', opts=OPTS, input=IGATEFILES)
 TargetAdd('libp3downloader.in', opts=OPTS, input=IGATEFILES)
 TargetAdd('libp3downloader.in', opts=['IMOD:panda3d.core', 'ILIB:libp3downloader', 'SRCDIR:panda/src/downloader'])
 TargetAdd('libp3downloader.in', opts=['IMOD:panda3d.core', 'ILIB:libp3downloader', 'SRCDIR:panda/src/downloader'])
@@ -3053,11 +3061,8 @@ TargetAdd('pandaexpress_pandaexpress.obj', opts=OPTS, input='pandaexpress.cxx')
 TargetAdd('libpandaexpress.dll', input='pandaexpress_pandaexpress.obj')
 TargetAdd('libpandaexpress.dll', input='pandaexpress_pandaexpress.obj')
 TargetAdd('libpandaexpress.dll', input='p3downloader_composite1.obj')
 TargetAdd('libpandaexpress.dll', input='p3downloader_composite1.obj')
 TargetAdd('libpandaexpress.dll', input='p3downloader_composite2.obj')
 TargetAdd('libpandaexpress.dll', input='p3downloader_composite2.obj')
-TargetAdd('libpandaexpress.dll', input='libp3downloader_igate.obj')
 TargetAdd('libpandaexpress.dll', input='p3express_composite1.obj')
 TargetAdd('libpandaexpress.dll', input='p3express_composite1.obj')
 TargetAdd('libpandaexpress.dll', input='p3express_composite2.obj')
 TargetAdd('libpandaexpress.dll', input='p3express_composite2.obj')
-TargetAdd('libpandaexpress.dll', input='p3express_ext_composite.obj')
-TargetAdd('libpandaexpress.dll', input='libp3express_igate.obj')
 TargetAdd('libpandaexpress.dll', input='p3pandabase_pandabase.obj')
 TargetAdd('libpandaexpress.dll', input='p3pandabase_pandabase.obj')
 TargetAdd('libpandaexpress.dll', input=COMMON_DTOOL_LIBS)
 TargetAdd('libpandaexpress.dll', input=COMMON_DTOOL_LIBS)
 TargetAdd('libpandaexpress.dll', opts=['ADVAPI', 'WINSOCK2',  'OPENSSL', 'ZLIB', 'WINGDI', 'WINUSER'])
 TargetAdd('libpandaexpress.dll', opts=['ADVAPI', 'WINSOCK2',  'OPENSSL', 'ZLIB', 'WINGDI', 'WINUSER'])
@@ -3071,6 +3076,8 @@ if (not RUNTIME):
   TargetAdd('p3pipeline_composite1.obj', opts=OPTS, input='p3pipeline_composite1.cxx')
   TargetAdd('p3pipeline_composite1.obj', opts=OPTS, input='p3pipeline_composite1.cxx')
   TargetAdd('p3pipeline_composite2.obj', opts=OPTS, input='p3pipeline_composite2.cxx')
   TargetAdd('p3pipeline_composite2.obj', opts=OPTS, input='p3pipeline_composite2.cxx')
   TargetAdd('p3pipeline_contextSwitch.obj', opts=OPTS, input='contextSwitch.c')
   TargetAdd('p3pipeline_contextSwitch.obj', opts=OPTS, input='contextSwitch.c')
+
+  OPTS=['DIR:panda/src/pipeline']
   IGATEFILES=GetDirectoryContents('panda/src/pipeline', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/pipeline', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3pipeline.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pipeline.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pipeline.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pipeline', 'SRCDIR:panda/src/pipeline'])
   TargetAdd('libp3pipeline.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pipeline', 'SRCDIR:panda/src/pipeline'])
@@ -3084,6 +3091,8 @@ if (not RUNTIME):
   OPTS=['DIR:panda/src/linmath', 'BUILDING:PANDA']
   OPTS=['DIR:panda/src/linmath', 'BUILDING:PANDA']
   TargetAdd('p3linmath_composite1.obj', opts=OPTS, input='p3linmath_composite1.cxx')
   TargetAdd('p3linmath_composite1.obj', opts=OPTS, input='p3linmath_composite1.cxx')
   TargetAdd('p3linmath_composite2.obj', opts=OPTS, input='p3linmath_composite2.cxx')
   TargetAdd('p3linmath_composite2.obj', opts=OPTS, input='p3linmath_composite2.cxx')
+
+  OPTS=['DIR:panda/src/linmath']
   IGATEFILES=GetDirectoryContents('panda/src/linmath', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/linmath', ["*.h", "*_composite*.cxx"])
   for ifile in IGATEFILES[:]:
   for ifile in IGATEFILES[:]:
       if "_src." in ifile:
       if "_src." in ifile:
@@ -3103,12 +3112,15 @@ if (not RUNTIME):
   OPTS=['DIR:panda/src/putil', 'BUILDING:PANDA',  'ZLIB']
   OPTS=['DIR:panda/src/putil', 'BUILDING:PANDA',  'ZLIB']
   TargetAdd('p3putil_composite1.obj', opts=OPTS, input='p3putil_composite1.cxx')
   TargetAdd('p3putil_composite1.obj', opts=OPTS, input='p3putil_composite1.cxx')
   TargetAdd('p3putil_composite2.obj', opts=OPTS, input='p3putil_composite2.cxx')
   TargetAdd('p3putil_composite2.obj', opts=OPTS, input='p3putil_composite2.cxx')
+
+  OPTS=['DIR:panda/src/putil', 'ZLIB']
   IGATEFILES=GetDirectoryContents('panda/src/putil', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/putil', ["*.h", "*_composite*.cxx"])
   IGATEFILES.remove("test_bam.h")
   IGATEFILES.remove("test_bam.h")
   TargetAdd('libp3putil.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3putil.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3putil.in', opts=['IMOD:panda3d.core', 'ILIB:libp3putil', 'SRCDIR:panda/src/putil'])
   TargetAdd('libp3putil.in', opts=['IMOD:panda3d.core', 'ILIB:libp3putil', 'SRCDIR:panda/src/putil'])
   TargetAdd('libp3putil_igate.obj', input='libp3putil.in', opts=["DEPENDENCYONLY"])
   TargetAdd('libp3putil_igate.obj', input='libp3putil.in', opts=["DEPENDENCYONLY"])
   TargetAdd('p3putil_typedWritable_ext.obj', opts=OPTS, input='typedWritable_ext.cxx')
   TargetAdd('p3putil_typedWritable_ext.obj', opts=OPTS, input='typedWritable_ext.cxx')
+  TargetAdd('p3putil_pythonCallbackObject.obj', opts=OPTS, input='pythonCallbackObject.cxx')
 
 
 #
 #
 # DIRECTORY: panda/src/audio/
 # DIRECTORY: panda/src/audio/
@@ -3117,6 +3129,8 @@ if (not RUNTIME):
 if (not RUNTIME):
 if (not RUNTIME):
   OPTS=['DIR:panda/src/audio', 'BUILDING:PANDA']
   OPTS=['DIR:panda/src/audio', 'BUILDING:PANDA']
   TargetAdd('p3audio_composite1.obj', opts=OPTS, input='p3audio_composite1.cxx')
   TargetAdd('p3audio_composite1.obj', opts=OPTS, input='p3audio_composite1.cxx')
+
+  OPTS=['DIR:panda/src/audio']
   IGATEFILES=["audio.h"]
   IGATEFILES=["audio.h"]
   TargetAdd('libp3audio.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3audio.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3audio.in', opts=['IMOD:panda3d.core', 'ILIB:libp3audio', 'SRCDIR:panda/src/audio'])
   TargetAdd('libp3audio.in', opts=['IMOD:panda3d.core', 'ILIB:libp3audio', 'SRCDIR:panda/src/audio'])
@@ -3130,6 +3144,9 @@ if (not RUNTIME):
   OPTS=['DIR:panda/src/event', 'BUILDING:PANDA']
   OPTS=['DIR:panda/src/event', 'BUILDING:PANDA']
   TargetAdd('p3event_composite1.obj', opts=OPTS, input='p3event_composite1.cxx')
   TargetAdd('p3event_composite1.obj', opts=OPTS, input='p3event_composite1.cxx')
   TargetAdd('p3event_composite2.obj', opts=OPTS, input='p3event_composite2.cxx')
   TargetAdd('p3event_composite2.obj', opts=OPTS, input='p3event_composite2.cxx')
+
+  OPTS=['DIR:panda/src/event']
+  TargetAdd('p3event_pythonTask.obj', opts=OPTS, input='pythonTask.cxx')
   IGATEFILES=GetDirectoryContents('panda/src/event', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/event', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3event.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3event.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3event.in', opts=['IMOD:panda3d.core', 'ILIB:libp3event', 'SRCDIR:panda/src/event'])
   TargetAdd('libp3event.in', opts=['IMOD:panda3d.core', 'ILIB:libp3event', 'SRCDIR:panda/src/event'])
@@ -3143,6 +3160,8 @@ if (not RUNTIME):
   OPTS=['DIR:panda/src/mathutil', 'BUILDING:PANDA', 'FFTW']
   OPTS=['DIR:panda/src/mathutil', 'BUILDING:PANDA', 'FFTW']
   TargetAdd('p3mathutil_composite1.obj', opts=OPTS, input='p3mathutil_composite1.cxx')
   TargetAdd('p3mathutil_composite1.obj', opts=OPTS, input='p3mathutil_composite1.cxx')
   TargetAdd('p3mathutil_composite2.obj', opts=OPTS, input='p3mathutil_composite2.cxx')
   TargetAdd('p3mathutil_composite2.obj', opts=OPTS, input='p3mathutil_composite2.cxx')
+
+  OPTS=['DIR:panda/src/mathutil', 'FFTW']
   IGATEFILES=GetDirectoryContents('panda/src/mathutil', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/mathutil', ["*.h", "*_composite*.cxx"])
   for ifile in IGATEFILES[:]:
   for ifile in IGATEFILES[:]:
       if "_src." in ifile:
       if "_src." in ifile:
@@ -3158,6 +3177,8 @@ if (not RUNTIME):
 if (not RUNTIME):
 if (not RUNTIME):
   OPTS=['DIR:panda/src/gsgbase', 'BUILDING:PANDA']
   OPTS=['DIR:panda/src/gsgbase', 'BUILDING:PANDA']
   TargetAdd('p3gsgbase_composite1.obj', opts=OPTS, input='p3gsgbase_composite1.cxx')
   TargetAdd('p3gsgbase_composite1.obj', opts=OPTS, input='p3gsgbase_composite1.cxx')
+
+  OPTS=['DIR:panda/src/gsgbase']
   IGATEFILES=GetDirectoryContents('panda/src/gsgbase', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/gsgbase', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3gsgbase.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3gsgbase.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3gsgbase.in', opts=['IMOD:panda3d.core', 'ILIB:libp3gsgbase', 'SRCDIR:panda/src/gsgbase'])
   TargetAdd('libp3gsgbase.in', opts=['IMOD:panda3d.core', 'ILIB:libp3gsgbase', 'SRCDIR:panda/src/gsgbase'])
@@ -3171,6 +3192,8 @@ if (not RUNTIME):
   OPTS=['DIR:panda/src/pnmimage', 'BUILDING:PANDA',  'ZLIB']
   OPTS=['DIR:panda/src/pnmimage', 'BUILDING:PANDA',  'ZLIB']
   TargetAdd('p3pnmimage_composite1.obj', opts=OPTS, input='p3pnmimage_composite1.cxx')
   TargetAdd('p3pnmimage_composite1.obj', opts=OPTS, input='p3pnmimage_composite1.cxx')
   TargetAdd('p3pnmimage_composite2.obj', opts=OPTS, input='p3pnmimage_composite2.cxx')
   TargetAdd('p3pnmimage_composite2.obj', opts=OPTS, input='p3pnmimage_composite2.cxx')
+
+  OPTS=['DIR:panda/src/pnmimage', 'ZLIB']
   IGATEFILES=GetDirectoryContents('panda/src/pnmimage', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/pnmimage', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3pnmimage.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pnmimage.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pnmimage.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pnmimage', 'SRCDIR:panda/src/pnmimage'])
   TargetAdd('libp3pnmimage.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pnmimage', 'SRCDIR:panda/src/pnmimage'])
@@ -3184,6 +3207,8 @@ if (not RUNTIME):
 if (not RUNTIME):
 if (not RUNTIME):
   OPTS=['DIR:panda/src/nativenet', 'OPENSSL', 'BUILDING:PANDA']
   OPTS=['DIR:panda/src/nativenet', 'OPENSSL', 'BUILDING:PANDA']
   TargetAdd('p3nativenet_composite1.obj', opts=OPTS, input='p3nativenet_composite1.cxx')
   TargetAdd('p3nativenet_composite1.obj', opts=OPTS, input='p3nativenet_composite1.cxx')
+
+  OPTS=['DIR:panda/src/nativenet', 'OPENSSL']
   IGATEFILES=GetDirectoryContents('panda/src/nativenet', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/nativenet', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3nativenet.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3nativenet.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3nativenet.in', opts=['IMOD:panda3d.core', 'ILIB:libp3nativenet', 'SRCDIR:panda/src/nativenet'])
   TargetAdd('libp3nativenet.in', opts=['IMOD:panda3d.core', 'ILIB:libp3nativenet', 'SRCDIR:panda/src/nativenet'])
@@ -3197,6 +3222,8 @@ if (not RUNTIME):
   OPTS=['DIR:panda/src/net', 'BUILDING:PANDA']
   OPTS=['DIR:panda/src/net', 'BUILDING:PANDA']
   TargetAdd('p3net_composite1.obj', opts=OPTS, input='p3net_composite1.cxx')
   TargetAdd('p3net_composite1.obj', opts=OPTS, input='p3net_composite1.cxx')
   TargetAdd('p3net_composite2.obj', opts=OPTS, input='p3net_composite2.cxx')
   TargetAdd('p3net_composite2.obj', opts=OPTS, input='p3net_composite2.cxx')
+
+  OPTS=['DIR:panda/src/net']
   IGATEFILES=GetDirectoryContents('panda/src/net', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/net', ["*.h", "*_composite*.cxx"])
   IGATEFILES.remove("datagram_ui.h")
   IGATEFILES.remove("datagram_ui.h")
   TargetAdd('libp3net.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3net.in', opts=OPTS, input=IGATEFILES)
@@ -3211,6 +3238,8 @@ if (not RUNTIME):
   OPTS=['DIR:panda/src/pstatclient', 'BUILDING:PANDA']
   OPTS=['DIR:panda/src/pstatclient', 'BUILDING:PANDA']
   TargetAdd('p3pstatclient_composite1.obj', opts=OPTS, input='p3pstatclient_composite1.cxx')
   TargetAdd('p3pstatclient_composite1.obj', opts=OPTS, input='p3pstatclient_composite1.cxx')
   TargetAdd('p3pstatclient_composite2.obj', opts=OPTS, input='p3pstatclient_composite2.cxx')
   TargetAdd('p3pstatclient_composite2.obj', opts=OPTS, input='p3pstatclient_composite2.cxx')
+
+  OPTS=['DIR:panda/src/pstatclient']
   IGATEFILES=GetDirectoryContents('panda/src/pstatclient', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/pstatclient', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3pstatclient.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pstatclient.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pstatclient.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pstatclient', 'SRCDIR:panda/src/pstatclient'])
   TargetAdd('libp3pstatclient.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pstatclient', 'SRCDIR:panda/src/pstatclient'])
@@ -3221,9 +3250,11 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/gobj', 'BUILDING:PANDA',  'NVIDIACG', 'ZLIB', 'SQUISH', "BIGOBJ"]
+  OPTS=['DIR:panda/src/gobj', 'BUILDING:PANDA',  'NVIDIACG', 'ZLIB', 'SQUISH']
   TargetAdd('p3gobj_composite1.obj', opts=OPTS, input='p3gobj_composite1.cxx')
   TargetAdd('p3gobj_composite1.obj', opts=OPTS, input='p3gobj_composite1.cxx')
   TargetAdd('p3gobj_composite2.obj', opts=OPTS, input='p3gobj_composite2.cxx')
   TargetAdd('p3gobj_composite2.obj', opts=OPTS, input='p3gobj_composite2.cxx')
+
+  OPTS=['DIR:panda/src/gobj', 'NVIDIACG', 'ZLIB', 'SQUISH']
   IGATEFILES=GetDirectoryContents('panda/src/gobj', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/gobj', ["*.h", "*_composite*.cxx"])
   if ("cgfx_states.h" in IGATEFILES): IGATEFILES.remove("cgfx_states.h")
   if ("cgfx_states.h" in IGATEFILES): IGATEFILES.remove("cgfx_states.h")
   TargetAdd('libp3gobj.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3gobj.in', opts=OPTS, input=IGATEFILES)
@@ -3237,9 +3268,11 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/pgraphnodes', 'BUILDING:PANDA', "BIGOBJ"]
+  OPTS=['DIR:panda/src/pgraphnodes', 'BUILDING:PANDA']
   TargetAdd('p3pgraphnodes_composite1.obj', opts=OPTS, input='p3pgraphnodes_composite1.cxx')
   TargetAdd('p3pgraphnodes_composite1.obj', opts=OPTS, input='p3pgraphnodes_composite1.cxx')
   TargetAdd('p3pgraphnodes_composite2.obj', opts=OPTS, input='p3pgraphnodes_composite2.cxx')
   TargetAdd('p3pgraphnodes_composite2.obj', opts=OPTS, input='p3pgraphnodes_composite2.cxx')
+
+  OPTS=['DIR:panda/src/pgraphnodes']
   IGATEFILES=GetDirectoryContents('panda/src/pgraphnodes', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/pgraphnodes', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3pgraphnodes.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pgraphnodes.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pgraphnodes.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pgraphnodes', 'SRCDIR:panda/src/pgraphnodes'])
   TargetAdd('libp3pgraphnodes.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pgraphnodes', 'SRCDIR:panda/src/pgraphnodes'])
@@ -3250,12 +3283,14 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/pgraph', 'BUILDING:PANDA','BIGOBJ']
+  OPTS=['DIR:panda/src/pgraph', 'BUILDING:PANDA']
   TargetAdd('p3pgraph_nodePath.obj', opts=OPTS, input='nodePath.cxx')
   TargetAdd('p3pgraph_nodePath.obj', opts=OPTS, input='nodePath.cxx')
   TargetAdd('p3pgraph_composite1.obj', opts=OPTS, input='p3pgraph_composite1.cxx')
   TargetAdd('p3pgraph_composite1.obj', opts=OPTS, input='p3pgraph_composite1.cxx')
   TargetAdd('p3pgraph_composite2.obj', opts=OPTS, input='p3pgraph_composite2.cxx')
   TargetAdd('p3pgraph_composite2.obj', opts=OPTS, input='p3pgraph_composite2.cxx')
   TargetAdd('p3pgraph_composite3.obj', opts=OPTS, input='p3pgraph_composite3.cxx')
   TargetAdd('p3pgraph_composite3.obj', opts=OPTS, input='p3pgraph_composite3.cxx')
   TargetAdd('p3pgraph_composite4.obj', opts=OPTS, input='p3pgraph_composite4.cxx')
   TargetAdd('p3pgraph_composite4.obj', opts=OPTS, input='p3pgraph_composite4.cxx')
+
+  OPTS=['DIR:panda/src/pgraph']
   IGATEFILES=GetDirectoryContents('panda/src/pgraph', ["*.h", "nodePath.cxx", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/pgraph', ["*.h", "nodePath.cxx", "*_composite*.cxx"])
   TargetAdd('libp3pgraph.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pgraph.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pgraph.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pgraph', 'SRCDIR:panda/src/pgraph'])
   TargetAdd('libp3pgraph.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pgraph', 'SRCDIR:panda/src/pgraph'])
@@ -3267,9 +3302,11 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/cull', 'BUILDING:PANDA', 'BIGOBJ']
+  OPTS=['DIR:panda/src/cull', 'BUILDING:PANDA']
   TargetAdd('p3cull_composite1.obj', opts=OPTS, input='p3cull_composite1.cxx')
   TargetAdd('p3cull_composite1.obj', opts=OPTS, input='p3cull_composite1.cxx')
   TargetAdd('p3cull_composite2.obj', opts=OPTS, input='p3cull_composite2.cxx')
   TargetAdd('p3cull_composite2.obj', opts=OPTS, input='p3cull_composite2.cxx')
+
+  OPTS=['DIR:panda/src/cull']
   IGATEFILES=GetDirectoryContents('panda/src/cull', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/cull', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3cull.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3cull.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3cull.in', opts=['IMOD:panda3d.core', 'ILIB:libp3cull', 'SRCDIR:panda/src/cull'])
   TargetAdd('libp3cull.in', opts=['IMOD:panda3d.core', 'ILIB:libp3cull', 'SRCDIR:panda/src/cull'])
@@ -3280,9 +3317,11 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/chan', 'BUILDING:PANDA', 'BIGOBJ']
+  OPTS=['DIR:panda/src/chan', 'BUILDING:PANDA']
   TargetAdd('p3chan_composite1.obj', opts=OPTS, input='p3chan_composite1.cxx')
   TargetAdd('p3chan_composite1.obj', opts=OPTS, input='p3chan_composite1.cxx')
   TargetAdd('p3chan_composite2.obj', opts=OPTS, input='p3chan_composite2.cxx')
   TargetAdd('p3chan_composite2.obj', opts=OPTS, input='p3chan_composite2.cxx')
+
+  OPTS=['DIR:panda/src/chan']
   IGATEFILES=GetDirectoryContents('panda/src/chan', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/chan', ["*.h", "*_composite*.cxx"])
   IGATEFILES.remove('movingPart.h')
   IGATEFILES.remove('movingPart.h')
   IGATEFILES.remove('animChannelFixed.h')
   IGATEFILES.remove('animChannelFixed.h')
@@ -3295,9 +3334,11 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/char', 'BUILDING:PANDA', 'BIGOBJ']
+  OPTS=['DIR:panda/src/char', 'BUILDING:PANDA']
   TargetAdd('p3char_composite1.obj', opts=OPTS, input='p3char_composite1.cxx')
   TargetAdd('p3char_composite1.obj', opts=OPTS, input='p3char_composite1.cxx')
   TargetAdd('p3char_composite2.obj', opts=OPTS, input='p3char_composite2.cxx')
   TargetAdd('p3char_composite2.obj', opts=OPTS, input='p3char_composite2.cxx')
+
+  OPTS=['DIR:panda/src/char']
   IGATEFILES=GetDirectoryContents('panda/src/char', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/char', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3char.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3char.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3char.in', opts=['IMOD:panda3d.core', 'ILIB:libp3char', 'SRCDIR:panda/src/char'])
   TargetAdd('libp3char.in', opts=['IMOD:panda3d.core', 'ILIB:libp3char', 'SRCDIR:panda/src/char'])
@@ -3311,6 +3352,8 @@ if (not RUNTIME):
   OPTS=['DIR:panda/src/dgraph', 'BUILDING:PANDA']
   OPTS=['DIR:panda/src/dgraph', 'BUILDING:PANDA']
   TargetAdd('p3dgraph_composite1.obj', opts=OPTS, input='p3dgraph_composite1.cxx')
   TargetAdd('p3dgraph_composite1.obj', opts=OPTS, input='p3dgraph_composite1.cxx')
   TargetAdd('p3dgraph_composite2.obj', opts=OPTS, input='p3dgraph_composite2.cxx')
   TargetAdd('p3dgraph_composite2.obj', opts=OPTS, input='p3dgraph_composite2.cxx')
+
+  OPTS=['DIR:panda/src/dgraph']
   IGATEFILES=GetDirectoryContents('panda/src/dgraph', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/dgraph', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3dgraph.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3dgraph.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3dgraph.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dgraph', 'SRCDIR:panda/src/dgraph'])
   TargetAdd('libp3dgraph.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dgraph', 'SRCDIR:panda/src/dgraph'])
@@ -3321,9 +3364,11 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/display', 'BUILDING:PANDA', 'BIGOBJ']
+  OPTS=['DIR:panda/src/display', 'BUILDING:PANDA']
   TargetAdd('p3display_composite1.obj', opts=OPTS, input='p3display_composite1.cxx')
   TargetAdd('p3display_composite1.obj', opts=OPTS, input='p3display_composite1.cxx')
   TargetAdd('p3display_composite2.obj', opts=OPTS, input='p3display_composite2.cxx')
   TargetAdd('p3display_composite2.obj', opts=OPTS, input='p3display_composite2.cxx')
+
+  OPTS=['DIR:panda/src/display']
   IGATEFILES=GetDirectoryContents('panda/src/display', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/display', ["*.h", "*_composite*.cxx"])
   IGATEFILES.remove("renderBuffer.h")
   IGATEFILES.remove("renderBuffer.h")
   TargetAdd('libp3display.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3display.in', opts=OPTS, input=IGATEFILES)
@@ -3331,6 +3376,7 @@ if (not RUNTIME):
   TargetAdd('libp3display_igate.obj', input='libp3display.in', opts=["DEPENDENCYONLY"])
   TargetAdd('libp3display_igate.obj', input='libp3display.in', opts=["DEPENDENCYONLY"])
   TargetAdd('p3display_graphicsStateGuardian_ext.obj', opts=OPTS, input='graphicsStateGuardian_ext.cxx')
   TargetAdd('p3display_graphicsStateGuardian_ext.obj', opts=OPTS, input='graphicsStateGuardian_ext.cxx')
   TargetAdd('p3display_graphicsWindow_ext.obj', opts=OPTS, input='graphicsWindow_ext.cxx')
   TargetAdd('p3display_graphicsWindow_ext.obj', opts=OPTS, input='graphicsWindow_ext.cxx')
+  TargetAdd('p3display_pythonGraphicsWindowProc.obj', opts=OPTS, input='pythonGraphicsWindowProc.cxx')
 
 
   if RTDIST and GetTarget() == 'darwin':
   if RTDIST and GetTarget() == 'darwin':
     OPTS=['DIR:panda/src/display']
     OPTS=['DIR:panda/src/display']
@@ -3342,9 +3388,11 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/device', 'BUILDING:PANDA', 'BIGOBJ']
+  OPTS=['DIR:panda/src/device', 'BUILDING:PANDA']
   TargetAdd('p3device_composite1.obj', opts=OPTS, input='p3device_composite1.cxx')
   TargetAdd('p3device_composite1.obj', opts=OPTS, input='p3device_composite1.cxx')
   TargetAdd('p3device_composite2.obj', opts=OPTS, input='p3device_composite2.cxx')
   TargetAdd('p3device_composite2.obj', opts=OPTS, input='p3device_composite2.cxx')
+
+  OPTS=['DIR:panda/src/device']
   IGATEFILES=GetDirectoryContents('panda/src/device', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/device', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3device.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3device.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3device.in', opts=['IMOD:panda3d.core', 'ILIB:libp3device', 'SRCDIR:panda/src/device'])
   TargetAdd('libp3device.in', opts=['IMOD:panda3d.core', 'ILIB:libp3device', 'SRCDIR:panda/src/device'])
@@ -3357,6 +3405,8 @@ if (not RUNTIME):
 if (PkgSkip("FREETYPE")==0 and not RUNTIME):
 if (PkgSkip("FREETYPE")==0 and not RUNTIME):
   OPTS=['DIR:panda/src/pnmtext', 'BUILDING:PANDA',  'FREETYPE']
   OPTS=['DIR:panda/src/pnmtext', 'BUILDING:PANDA',  'FREETYPE']
   TargetAdd('p3pnmtext_composite1.obj', opts=OPTS, input='p3pnmtext_composite1.cxx')
   TargetAdd('p3pnmtext_composite1.obj', opts=OPTS, input='p3pnmtext_composite1.cxx')
+
+  OPTS=['DIR:panda/src/pnmtext', 'FREETYPE']
   IGATEFILES=GetDirectoryContents('panda/src/pnmtext', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/pnmtext', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3pnmtext.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pnmtext.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pnmtext.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pnmtext', 'SRCDIR:panda/src/pnmtext'])
   TargetAdd('libp3pnmtext.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pnmtext', 'SRCDIR:panda/src/pnmtext'])
@@ -3367,9 +3417,11 @@ if (PkgSkip("FREETYPE")==0 and not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/text', 'BUILDING:PANDA', 'ZLIB',  'FREETYPE', 'BIGOBJ']
+  OPTS=['DIR:panda/src/text', 'BUILDING:PANDA', 'ZLIB',  'FREETYPE']
   TargetAdd('p3text_composite1.obj', opts=OPTS, input='p3text_composite1.cxx')
   TargetAdd('p3text_composite1.obj', opts=OPTS, input='p3text_composite1.cxx')
   TargetAdd('p3text_composite2.obj', opts=OPTS, input='p3text_composite2.cxx')
   TargetAdd('p3text_composite2.obj', opts=OPTS, input='p3text_composite2.cxx')
+
+  OPTS=['DIR:panda/src/text', 'ZLIB', 'FREETYPE']
   IGATEFILES=GetDirectoryContents('panda/src/text', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/text', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3text.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3text.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3text.in', opts=['IMOD:panda3d.core', 'ILIB:libp3text', 'SRCDIR:panda/src/text'])
   TargetAdd('libp3text.in', opts=['IMOD:panda3d.core', 'ILIB:libp3text', 'SRCDIR:panda/src/text'])
@@ -3382,6 +3434,8 @@ if (not RUNTIME):
 if (not RUNTIME):
 if (not RUNTIME):
   OPTS=['DIR:panda/src/movies', 'BUILDING:PANDA', 'VORBIS']
   OPTS=['DIR:panda/src/movies', 'BUILDING:PANDA', 'VORBIS']
   TargetAdd('p3movies_composite1.obj', opts=OPTS, input='p3movies_composite1.cxx')
   TargetAdd('p3movies_composite1.obj', opts=OPTS, input='p3movies_composite1.cxx')
+
+  OPTS=['DIR:panda/src/movies', 'VORBIS']
   IGATEFILES=GetDirectoryContents('panda/src/movies', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/movies', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3movies.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3movies.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3movies.in', opts=['IMOD:panda3d.core', 'ILIB:libp3movies', 'SRCDIR:panda/src/movies'])
   TargetAdd('libp3movies.in', opts=['IMOD:panda3d.core', 'ILIB:libp3movies', 'SRCDIR:panda/src/movies'])
@@ -3392,10 +3446,12 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/grutil', 'BUILDING:PANDA', 'BIGOBJ']
+  OPTS=['DIR:panda/src/grutil', 'BUILDING:PANDA']
   TargetAdd('p3grutil_multitexReducer.obj', opts=OPTS, input='multitexReducer.cxx')
   TargetAdd('p3grutil_multitexReducer.obj', opts=OPTS, input='multitexReducer.cxx')
   TargetAdd('p3grutil_composite1.obj', opts=OPTS, input='p3grutil_composite1.cxx')
   TargetAdd('p3grutil_composite1.obj', opts=OPTS, input='p3grutil_composite1.cxx')
   TargetAdd('p3grutil_composite2.obj', opts=OPTS, input='p3grutil_composite2.cxx')
   TargetAdd('p3grutil_composite2.obj', opts=OPTS, input='p3grutil_composite2.cxx')
+
+  OPTS=['DIR:panda/src/grutil']
   IGATEFILES=GetDirectoryContents('panda/src/grutil', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/grutil', ["*.h", "*_composite*.cxx"])
   if 'convexHull.h' in IGATEFILES: IGATEFILES.remove('convexHull.h')
   if 'convexHull.h' in IGATEFILES: IGATEFILES.remove('convexHull.h')
   TargetAdd('libp3grutil.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3grutil.in', opts=OPTS, input=IGATEFILES)
@@ -3407,9 +3463,11 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/tform', 'BUILDING:PANDA', 'BIGOBJ']
+  OPTS=['DIR:panda/src/tform', 'BUILDING:PANDA']
   TargetAdd('p3tform_composite1.obj', opts=OPTS, input='p3tform_composite1.cxx')
   TargetAdd('p3tform_composite1.obj', opts=OPTS, input='p3tform_composite1.cxx')
   TargetAdd('p3tform_composite2.obj', opts=OPTS, input='p3tform_composite2.cxx')
   TargetAdd('p3tform_composite2.obj', opts=OPTS, input='p3tform_composite2.cxx')
+
+  OPTS=['DIR:panda/src/tform']
   IGATEFILES=GetDirectoryContents('panda/src/tform', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/tform', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3tform.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3tform.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3tform.in', opts=['IMOD:panda3d.core', 'ILIB:libp3tform', 'SRCDIR:panda/src/tform'])
   TargetAdd('libp3tform.in', opts=['IMOD:panda3d.core', 'ILIB:libp3tform', 'SRCDIR:panda/src/tform'])
@@ -3420,9 +3478,11 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/collide', 'BUILDING:PANDA', 'BIGOBJ']
+  OPTS=['DIR:panda/src/collide', 'BUILDING:PANDA']
   TargetAdd('p3collide_composite1.obj', opts=OPTS, input='p3collide_composite1.cxx')
   TargetAdd('p3collide_composite1.obj', opts=OPTS, input='p3collide_composite1.cxx')
   TargetAdd('p3collide_composite2.obj', opts=OPTS, input='p3collide_composite2.cxx')
   TargetAdd('p3collide_composite2.obj', opts=OPTS, input='p3collide_composite2.cxx')
+
+  OPTS=['DIR:panda/src/collide']
   IGATEFILES=GetDirectoryContents('panda/src/collide', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/collide', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3collide.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3collide.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3collide.in', opts=['IMOD:panda3d.core', 'ILIB:libp3collide', 'SRCDIR:panda/src/collide'])
   TargetAdd('libp3collide.in', opts=['IMOD:panda3d.core', 'ILIB:libp3collide', 'SRCDIR:panda/src/collide'])
@@ -3433,9 +3493,11 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/parametrics', 'BUILDING:PANDA', 'BIGOBJ']
+  OPTS=['DIR:panda/src/parametrics', 'BUILDING:PANDA']
   TargetAdd('p3parametrics_composite1.obj', opts=OPTS, input='p3parametrics_composite1.cxx')
   TargetAdd('p3parametrics_composite1.obj', opts=OPTS, input='p3parametrics_composite1.cxx')
   TargetAdd('p3parametrics_composite2.obj', opts=OPTS, input='p3parametrics_composite2.cxx')
   TargetAdd('p3parametrics_composite2.obj', opts=OPTS, input='p3parametrics_composite2.cxx')
+
+  OPTS=['DIR:panda/src/parametrics']
   IGATEFILES=GetDirectoryContents('panda/src/parametrics', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/parametrics', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3parametrics.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3parametrics.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3parametrics.in', opts=['IMOD:panda3d.core', 'ILIB:libp3parametrics', 'SRCDIR:panda/src/parametrics'])
   TargetAdd('libp3parametrics.in', opts=['IMOD:panda3d.core', 'ILIB:libp3parametrics', 'SRCDIR:panda/src/parametrics'])
@@ -3446,9 +3508,11 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/pgui', 'BUILDING:PANDA', 'BIGOBJ']
+  OPTS=['DIR:panda/src/pgui', 'BUILDING:PANDA']
   TargetAdd('p3pgui_composite1.obj', opts=OPTS, input='p3pgui_composite1.cxx')
   TargetAdd('p3pgui_composite1.obj', opts=OPTS, input='p3pgui_composite1.cxx')
   TargetAdd('p3pgui_composite2.obj', opts=OPTS, input='p3pgui_composite2.cxx')
   TargetAdd('p3pgui_composite2.obj', opts=OPTS, input='p3pgui_composite2.cxx')
+
+  OPTS=['DIR:panda/src/pgui']
   IGATEFILES=GetDirectoryContents('panda/src/pgui', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/pgui', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3pgui.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pgui.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3pgui.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pgui', 'SRCDIR:panda/src/pgui'])
   TargetAdd('libp3pgui.in', opts=['IMOD:panda3d.core', 'ILIB:libp3pgui', 'SRCDIR:panda/src/pgui'])
@@ -3471,6 +3535,8 @@ if (not RUNTIME):
   OPTS=['DIR:panda/src/recorder', 'BUILDING:PANDA']
   OPTS=['DIR:panda/src/recorder', 'BUILDING:PANDA']
   TargetAdd('p3recorder_composite1.obj', opts=OPTS, input='p3recorder_composite1.cxx')
   TargetAdd('p3recorder_composite1.obj', opts=OPTS, input='p3recorder_composite1.cxx')
   TargetAdd('p3recorder_composite2.obj', opts=OPTS, input='p3recorder_composite2.cxx')
   TargetAdd('p3recorder_composite2.obj', opts=OPTS, input='p3recorder_composite2.cxx')
+
+  OPTS=['DIR:panda/src/recorder']
   IGATEFILES=GetDirectoryContents('panda/src/recorder', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/recorder', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3recorder.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3recorder.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3recorder.in', opts=['IMOD:panda3d.core', 'ILIB:libp3recorder', 'SRCDIR:panda/src/recorder'])
   TargetAdd('libp3recorder.in', opts=['IMOD:panda3d.core', 'ILIB:libp3recorder', 'SRCDIR:panda/src/recorder'])
@@ -3490,6 +3556,8 @@ if (RUNTIME or RTDIST):
 if (not RUNTIME):
 if (not RUNTIME):
   OPTS=['DIR:panda/src/dxml', 'BUILDING:PANDA', 'TINYXML']
   OPTS=['DIR:panda/src/dxml', 'BUILDING:PANDA', 'TINYXML']
   TargetAdd('p3dxml_composite1.obj', opts=OPTS, input='p3dxml_composite1.cxx')
   TargetAdd('p3dxml_composite1.obj', opts=OPTS, input='p3dxml_composite1.cxx')
+
+  OPTS=['DIR:panda/src/dxml', 'TINYXML']
   IGATEFILES=GetDirectoryContents('panda/src/dxml', ["*.h", "p3dxml_composite1.cxx"])
   IGATEFILES=GetDirectoryContents('panda/src/dxml', ["*.h", "p3dxml_composite1.cxx"])
   TargetAdd('libp3dxml.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3dxml.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3dxml.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dxml', 'SRCDIR:panda/src/dxml'])
   TargetAdd('libp3dxml.in', opts=['IMOD:panda3d.core', 'ILIB:libp3dxml', 'SRCDIR:panda/src/dxml'])
@@ -3509,108 +3577,71 @@ if (not RUNTIME):
   TargetAdd('libpanda.dll', input='panda_panda.obj')
   TargetAdd('libpanda.dll', input='panda_panda.obj')
   TargetAdd('libpanda.dll', input='p3recorder_composite1.obj')
   TargetAdd('libpanda.dll', input='p3recorder_composite1.obj')
   TargetAdd('libpanda.dll', input='p3recorder_composite2.obj')
   TargetAdd('libpanda.dll', input='p3recorder_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3recorder_igate.obj')
   TargetAdd('libpanda.dll', input='p3pgraphnodes_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pgraphnodes_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pgraphnodes_composite2.obj')
   TargetAdd('libpanda.dll', input='p3pgraphnodes_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3pgraphnodes_igate.obj')
   TargetAdd('libpanda.dll', input='p3pgraph_nodePath.obj')
   TargetAdd('libpanda.dll', input='p3pgraph_nodePath.obj')
   TargetAdd('libpanda.dll', input='p3pgraph_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pgraph_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pgraph_composite2.obj')
   TargetAdd('libpanda.dll', input='p3pgraph_composite2.obj')
   TargetAdd('libpanda.dll', input='p3pgraph_composite3.obj')
   TargetAdd('libpanda.dll', input='p3pgraph_composite3.obj')
   TargetAdd('libpanda.dll', input='p3pgraph_composite4.obj')
   TargetAdd('libpanda.dll', input='p3pgraph_composite4.obj')
-  TargetAdd('libpanda.dll', input='libp3pgraph_igate.obj')
   TargetAdd('libpanda.dll', input='p3cull_composite1.obj')
   TargetAdd('libpanda.dll', input='p3cull_composite1.obj')
   TargetAdd('libpanda.dll', input='p3cull_composite2.obj')
   TargetAdd('libpanda.dll', input='p3cull_composite2.obj')
   TargetAdd('libpanda.dll', input='p3movies_composite1.obj')
   TargetAdd('libpanda.dll', input='p3movies_composite1.obj')
-  TargetAdd('libpanda.dll', input='libp3movies_igate.obj')
   TargetAdd('libpanda.dll', input='p3grutil_multitexReducer.obj')
   TargetAdd('libpanda.dll', input='p3grutil_multitexReducer.obj')
   TargetAdd('libpanda.dll', input='p3grutil_composite1.obj')
   TargetAdd('libpanda.dll', input='p3grutil_composite1.obj')
   TargetAdd('libpanda.dll', input='p3grutil_composite2.obj')
   TargetAdd('libpanda.dll', input='p3grutil_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3grutil_igate.obj')
   TargetAdd('libpanda.dll', input='p3chan_composite1.obj')
   TargetAdd('libpanda.dll', input='p3chan_composite1.obj')
   TargetAdd('libpanda.dll', input='p3chan_composite2.obj')
   TargetAdd('libpanda.dll', input='p3chan_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3chan_igate.obj')
   TargetAdd('libpanda.dll', input='p3pstatclient_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pstatclient_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pstatclient_composite2.obj')
   TargetAdd('libpanda.dll', input='p3pstatclient_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3pstatclient_igate.obj')
   TargetAdd('libpanda.dll', input='p3char_composite1.obj')
   TargetAdd('libpanda.dll', input='p3char_composite1.obj')
   TargetAdd('libpanda.dll', input='p3char_composite2.obj')
   TargetAdd('libpanda.dll', input='p3char_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3char_igate.obj')
   TargetAdd('libpanda.dll', input='p3collide_composite1.obj')
   TargetAdd('libpanda.dll', input='p3collide_composite1.obj')
   TargetAdd('libpanda.dll', input='p3collide_composite2.obj')
   TargetAdd('libpanda.dll', input='p3collide_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3collide_igate.obj')
   TargetAdd('libpanda.dll', input='p3device_composite1.obj')
   TargetAdd('libpanda.dll', input='p3device_composite1.obj')
   TargetAdd('libpanda.dll', input='p3device_composite2.obj')
   TargetAdd('libpanda.dll', input='p3device_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3device_igate.obj')
   TargetAdd('libpanda.dll', input='p3dgraph_composite1.obj')
   TargetAdd('libpanda.dll', input='p3dgraph_composite1.obj')
   TargetAdd('libpanda.dll', input='p3dgraph_composite2.obj')
   TargetAdd('libpanda.dll', input='p3dgraph_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3dgraph_igate.obj')
   TargetAdd('libpanda.dll', input='p3display_composite1.obj')
   TargetAdd('libpanda.dll', input='p3display_composite1.obj')
   TargetAdd('libpanda.dll', input='p3display_composite2.obj')
   TargetAdd('libpanda.dll', input='p3display_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3display_igate.obj')
   TargetAdd('libpanda.dll', input='p3pipeline_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pipeline_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pipeline_composite2.obj')
   TargetAdd('libpanda.dll', input='p3pipeline_composite2.obj')
   TargetAdd('libpanda.dll', input='p3pipeline_contextSwitch.obj')
   TargetAdd('libpanda.dll', input='p3pipeline_contextSwitch.obj')
-  TargetAdd('libpanda.dll', input='libp3pipeline_igate.obj')
   TargetAdd('libpanda.dll', input='p3event_composite1.obj')
   TargetAdd('libpanda.dll', input='p3event_composite1.obj')
   TargetAdd('libpanda.dll', input='p3event_composite2.obj')
   TargetAdd('libpanda.dll', input='p3event_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3event_igate.obj')
   TargetAdd('libpanda.dll', input='p3gobj_composite1.obj')
   TargetAdd('libpanda.dll', input='p3gobj_composite1.obj')
   TargetAdd('libpanda.dll', input='p3gobj_composite2.obj')
   TargetAdd('libpanda.dll', input='p3gobj_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3gobj_igate.obj')
   TargetAdd('libpanda.dll', input='p3gsgbase_composite1.obj')
   TargetAdd('libpanda.dll', input='p3gsgbase_composite1.obj')
-  TargetAdd('libpanda.dll', input='libp3gsgbase_igate.obj')
   TargetAdd('libpanda.dll', input='p3linmath_composite1.obj')
   TargetAdd('libpanda.dll', input='p3linmath_composite1.obj')
   TargetAdd('libpanda.dll', input='p3linmath_composite2.obj')
   TargetAdd('libpanda.dll', input='p3linmath_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3linmath_igate.obj')
   TargetAdd('libpanda.dll', input='p3mathutil_composite1.obj')
   TargetAdd('libpanda.dll', input='p3mathutil_composite1.obj')
   TargetAdd('libpanda.dll', input='p3mathutil_composite2.obj')
   TargetAdd('libpanda.dll', input='p3mathutil_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3mathutil_igate.obj')
   TargetAdd('libpanda.dll', input='p3parametrics_composite1.obj')
   TargetAdd('libpanda.dll', input='p3parametrics_composite1.obj')
   TargetAdd('libpanda.dll', input='p3parametrics_composite2.obj')
   TargetAdd('libpanda.dll', input='p3parametrics_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3parametrics_igate.obj')
   TargetAdd('libpanda.dll', input='p3pnmimagetypes_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pnmimagetypes_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pnmimagetypes_composite2.obj')
   TargetAdd('libpanda.dll', input='p3pnmimagetypes_composite2.obj')
   TargetAdd('libpanda.dll', input='p3pnmimage_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pnmimage_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pnmimage_composite2.obj')
   TargetAdd('libpanda.dll', input='p3pnmimage_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3pnmimage_igate.obj')
   TargetAdd('libpanda.dll', input='p3text_composite1.obj')
   TargetAdd('libpanda.dll', input='p3text_composite1.obj')
   TargetAdd('libpanda.dll', input='p3text_composite2.obj')
   TargetAdd('libpanda.dll', input='p3text_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3text_igate.obj')
   TargetAdd('libpanda.dll', input='p3tform_composite1.obj')
   TargetAdd('libpanda.dll', input='p3tform_composite1.obj')
   TargetAdd('libpanda.dll', input='p3tform_composite2.obj')
   TargetAdd('libpanda.dll', input='p3tform_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3tform_igate.obj')
   TargetAdd('libpanda.dll', input='p3putil_composite1.obj')
   TargetAdd('libpanda.dll', input='p3putil_composite1.obj')
   TargetAdd('libpanda.dll', input='p3putil_composite2.obj')
   TargetAdd('libpanda.dll', input='p3putil_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3putil_igate.obj')
   TargetAdd('libpanda.dll', input='p3audio_composite1.obj')
   TargetAdd('libpanda.dll', input='p3audio_composite1.obj')
-  TargetAdd('libpanda.dll', input='libp3audio_igate.obj')
   TargetAdd('libpanda.dll', input='p3pgui_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pgui_composite1.obj')
   TargetAdd('libpanda.dll', input='p3pgui_composite2.obj')
   TargetAdd('libpanda.dll', input='p3pgui_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3pgui_igate.obj')
   TargetAdd('libpanda.dll', input='p3net_composite1.obj')
   TargetAdd('libpanda.dll', input='p3net_composite1.obj')
   TargetAdd('libpanda.dll', input='p3net_composite2.obj')
   TargetAdd('libpanda.dll', input='p3net_composite2.obj')
-  TargetAdd('libpanda.dll', input='libp3net_igate.obj')
   TargetAdd('libpanda.dll', input='p3nativenet_composite1.obj')
   TargetAdd('libpanda.dll', input='p3nativenet_composite1.obj')
-  TargetAdd('libpanda.dll', input='libp3nativenet_igate.obj')
   TargetAdd('libpanda.dll', input='p3pandabase_pandabase.obj')
   TargetAdd('libpanda.dll', input='p3pandabase_pandabase.obj')
   TargetAdd('libpanda.dll', input='libpandaexpress.dll')
   TargetAdd('libpanda.dll', input='libpandaexpress.dll')
   TargetAdd('libpanda.dll', input='p3dxml_composite1.obj')
   TargetAdd('libpanda.dll', input='p3dxml_composite1.obj')
-  TargetAdd('libpanda.dll', input='libp3dxml_igate.obj')
   TargetAdd('libpanda.dll', input='libp3dtoolconfig.dll')
   TargetAdd('libpanda.dll', input='libp3dtoolconfig.dll')
   TargetAdd('libpanda.dll', input='libp3dtool.dll')
   TargetAdd('libpanda.dll', input='libp3dtool.dll')
 
 
-  TargetAdd('libpanda.dll', input='p3putil_typedWritable_ext.obj')
-  TargetAdd('libpanda.dll', input='p3pnmimage_pfmFile_ext.obj')
-  TargetAdd('libpanda.dll', input='p3gobj_geomVertexArrayData_ext.obj')
-  TargetAdd('libpanda.dll', input='p3gobj_internalName_ext.obj')
-  TargetAdd('libpanda.dll', input='p3pgraph_ext_composite.obj')
-  TargetAdd('libpanda.dll', input='p3display_graphicsStateGuardian_ext.obj')
-  TargetAdd('libpanda.dll', input='p3display_graphicsWindow_ext.obj')
-
   if PkgSkip("FREETYPE")==0:
   if PkgSkip("FREETYPE")==0:
     TargetAdd('libpanda.dll', input="p3pnmtext_composite1.obj")
     TargetAdd('libpanda.dll', input="p3pnmtext_composite1.obj")
-    TargetAdd('libpanda.dll', input="libp3pnmtext_igate.obj")
 
 
   TargetAdd('libpanda.dll', dep='dtool_have_freetype.dat')
   TargetAdd('libpanda.dll', dep='dtool_have_freetype.dat')
   TargetAdd('libpanda.dll', opts=OPTS)
   TargetAdd('libpanda.dll', opts=OPTS)
@@ -3653,9 +3684,57 @@ if (not RUNTIME):
 
 
   TargetAdd('core_module.obj', opts=['IMOD:panda3d.core', 'ILIB:core'])
   TargetAdd('core_module.obj', opts=['IMOD:panda3d.core', 'ILIB:core'])
 
 
+  OPTS=['WINSOCK2']
+  TargetAdd('core.pyd', input='libp3downloader_igate.obj')
+  TargetAdd('core.pyd', input='p3express_ext_composite.obj')
+  TargetAdd('core.pyd', input='libp3express_igate.obj')
+
+  TargetAdd('core.pyd', input='libp3recorder_igate.obj')
+  TargetAdd('core.pyd', input='libp3pgraphnodes_igate.obj')
+  TargetAdd('core.pyd', input='libp3pgraph_igate.obj')
+  TargetAdd('core.pyd', input='libp3movies_igate.obj')
+  TargetAdd('core.pyd', input='libp3grutil_igate.obj')
+  TargetAdd('core.pyd', input='libp3chan_igate.obj')
+  TargetAdd('core.pyd', input='libp3pstatclient_igate.obj')
+  TargetAdd('core.pyd', input='libp3char_igate.obj')
+  TargetAdd('core.pyd', input='libp3collide_igate.obj')
+  TargetAdd('core.pyd', input='libp3device_igate.obj')
+  TargetAdd('core.pyd', input='libp3dgraph_igate.obj')
+  TargetAdd('core.pyd', input='libp3display_igate.obj')
+  TargetAdd('core.pyd', input='libp3pipeline_igate.obj')
+  TargetAdd('core.pyd', input='libp3event_igate.obj')
+  TargetAdd('core.pyd', input='libp3gobj_igate.obj')
+  TargetAdd('core.pyd', input='libp3gsgbase_igate.obj')
+  TargetAdd('core.pyd', input='libp3linmath_igate.obj')
+  TargetAdd('core.pyd', input='libp3mathutil_igate.obj')
+  TargetAdd('core.pyd', input='libp3parametrics_igate.obj')
+  TargetAdd('core.pyd', input='libp3pnmimage_igate.obj')
+  TargetAdd('core.pyd', input='libp3text_igate.obj')
+  TargetAdd('core.pyd', input='libp3tform_igate.obj')
+  TargetAdd('core.pyd', input='libp3putil_igate.obj')
+  TargetAdd('core.pyd', input='libp3audio_igate.obj')
+  TargetAdd('core.pyd', input='libp3pgui_igate.obj')
+  TargetAdd('core.pyd', input='libp3net_igate.obj')
+  TargetAdd('core.pyd', input='libp3nativenet_igate.obj')
+  TargetAdd('core.pyd', input='libp3dxml_igate.obj')
+
+  if PkgSkip("FREETYPE")==0:
+    TargetAdd('core.pyd', input="libp3pnmtext_igate.obj")
+
+  TargetAdd('core.pyd', input='p3putil_typedWritable_ext.obj')
+  TargetAdd('core.pyd', input='p3putil_pythonCallbackObject.obj')
+  TargetAdd('core.pyd', input='p3pnmimage_pfmFile_ext.obj')
+  TargetAdd('core.pyd', input='p3event_pythonTask.obj')
+  TargetAdd('core.pyd', input='p3gobj_geomVertexArrayData_ext.obj')
+  TargetAdd('core.pyd', input='p3gobj_internalName_ext.obj')
+  TargetAdd('core.pyd', input='p3pgraph_ext_composite.obj')
+  TargetAdd('core.pyd', input='p3display_graphicsStateGuardian_ext.obj')
+  TargetAdd('core.pyd', input='p3display_graphicsWindow_ext.obj')
+  TargetAdd('core.pyd', input='p3display_pythonGraphicsWindowProc.obj')
+
   TargetAdd('core.pyd', input='core_module.obj')
   TargetAdd('core.pyd', input='core_module.obj')
   TargetAdd('core.pyd', input=COMMON_PANDA_LIBS)
   TargetAdd('core.pyd', input=COMMON_PANDA_LIBS)
-  TargetAdd('core.pyd', opts=['PYTHON'])
+  TargetAdd('core.pyd', opts=OPTS)
 
 
 #
 #
 # DIRECTORY: panda/src/vision/
 # DIRECTORY: panda/src/vision/
@@ -4536,6 +4615,8 @@ if (PkgSkip("DIRECT")==0):
   TargetAdd('p3dcparser_dcLexer.obj', opts=OPTS, input='dcLexer.lxx')
   TargetAdd('p3dcparser_dcLexer.obj', opts=OPTS, input='dcLexer.lxx')
   TargetAdd('p3dcparser_composite1.obj', opts=OPTS, input='p3dcparser_composite1.cxx')
   TargetAdd('p3dcparser_composite1.obj', opts=OPTS, input='p3dcparser_composite1.cxx')
   TargetAdd('p3dcparser_composite2.obj', opts=OPTS, input='p3dcparser_composite2.cxx')
   TargetAdd('p3dcparser_composite2.obj', opts=OPTS, input='p3dcparser_composite2.cxx')
+
+  OPTS=['DIR:direct/src/dcparser', 'WITHINPANDA']
   IGATEFILES=GetDirectoryContents('direct/src/dcparser', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('direct/src/dcparser', ["*.h", "*_composite*.cxx"])
   if "dcParser.h" in IGATEFILES: IGATEFILES.remove("dcParser.h")
   if "dcParser.h" in IGATEFILES: IGATEFILES.remove("dcParser.h")
   if "dcmsgtypes.h" in IGATEFILES: IGATEFILES.remove('dcmsgtypes.h')
   if "dcmsgtypes.h" in IGATEFILES: IGATEFILES.remove('dcmsgtypes.h')
@@ -4550,6 +4631,8 @@ if (PkgSkip("DIRECT")==0):
 if (PkgSkip("DIRECT")==0):
 if (PkgSkip("DIRECT")==0):
   OPTS=['DIR:direct/src/deadrec', 'BUILDING:DIRECT']
   OPTS=['DIR:direct/src/deadrec', 'BUILDING:DIRECT']
   TargetAdd('p3deadrec_composite1.obj', opts=OPTS, input='p3deadrec_composite1.cxx')
   TargetAdd('p3deadrec_composite1.obj', opts=OPTS, input='p3deadrec_composite1.cxx')
+
+  OPTS=['DIR:direct/src/deadrec']
   IGATEFILES=GetDirectoryContents('direct/src/deadrec', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('direct/src/deadrec', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3deadrec.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3deadrec.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3deadrec.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3deadrec', 'SRCDIR:direct/src/deadrec'])
   TargetAdd('libp3deadrec.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3deadrec', 'SRCDIR:direct/src/deadrec'])
@@ -4564,6 +4647,8 @@ if (PkgSkip("DIRECT")==0):
   TargetAdd('p3distributed_config_distributed.obj', opts=OPTS, input='config_distributed.cxx')
   TargetAdd('p3distributed_config_distributed.obj', opts=OPTS, input='config_distributed.cxx')
   TargetAdd('p3distributed_cConnectionRepository.obj', opts=OPTS, input='cConnectionRepository.cxx')
   TargetAdd('p3distributed_cConnectionRepository.obj', opts=OPTS, input='cConnectionRepository.cxx')
   TargetAdd('p3distributed_cDistributedSmoothNodeBase.obj', opts=OPTS, input='cDistributedSmoothNodeBase.cxx')
   TargetAdd('p3distributed_cDistributedSmoothNodeBase.obj', opts=OPTS, input='cDistributedSmoothNodeBase.cxx')
+
+  OPTS=['DIR:direct/src/distributed', 'WITHINPANDA', 'OPENSSL']
   IGATEFILES=GetDirectoryContents('direct/src/distributed', ["*.h", "*.cxx"])
   IGATEFILES=GetDirectoryContents('direct/src/distributed', ["*.h", "*.cxx"])
   TargetAdd('libp3distributed.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3distributed.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3distributed.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3distributed', 'SRCDIR:direct/src/distributed'])
   TargetAdd('libp3distributed.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3distributed', 'SRCDIR:direct/src/distributed'])
@@ -4576,6 +4661,8 @@ if (PkgSkip("DIRECT")==0):
 if (PkgSkip("DIRECT")==0):
 if (PkgSkip("DIRECT")==0):
   OPTS=['DIR:direct/src/interval', 'BUILDING:DIRECT']
   OPTS=['DIR:direct/src/interval', 'BUILDING:DIRECT']
   TargetAdd('p3interval_composite1.obj', opts=OPTS, input='p3interval_composite1.cxx')
   TargetAdd('p3interval_composite1.obj', opts=OPTS, input='p3interval_composite1.cxx')
+
+  OPTS=['DIR:direct/src/interval']
   IGATEFILES=GetDirectoryContents('direct/src/interval', ["*.h", "*_composite*.cxx"])
   IGATEFILES=GetDirectoryContents('direct/src/interval', ["*.h", "*_composite*.cxx"])
   TargetAdd('libp3interval.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3interval.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3interval.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3interval', 'SRCDIR:direct/src/interval'])
   TargetAdd('libp3interval.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3interval', 'SRCDIR:direct/src/interval'])
@@ -4590,6 +4677,8 @@ if (PkgSkip("DIRECT")==0):
   TargetAdd('p3showbase_showBase.obj', opts=OPTS, input='showBase.cxx')
   TargetAdd('p3showbase_showBase.obj', opts=OPTS, input='showBase.cxx')
   if GetTarget() == 'darwin':
   if GetTarget() == 'darwin':
     TargetAdd('p3showbase_showBase_assist.obj', opts=OPTS, input='showBase_assist.mm')
     TargetAdd('p3showbase_showBase_assist.obj', opts=OPTS, input='showBase_assist.mm')
+
+  OPTS=['DIR:direct/src/showbase']
   IGATEFILES=GetDirectoryContents('direct/src/showbase', ["*.h", "showBase.cxx"])
   IGATEFILES=GetDirectoryContents('direct/src/showbase', ["*.h", "showBase.cxx"])
   TargetAdd('libp3showbase.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3showbase.in', opts=OPTS, input=IGATEFILES)
   TargetAdd('libp3showbase.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3showbase', 'SRCDIR:direct/src/showbase'])
   TargetAdd('libp3showbase.in', opts=['IMOD:panda3d.direct', 'ILIB:libp3showbase', 'SRCDIR:direct/src/showbase'])
@@ -4609,19 +4698,14 @@ if (PkgSkip("DIRECT")==0):
   TargetAdd('libp3direct.dll', input='p3dcparser_composite2.obj')
   TargetAdd('libp3direct.dll', input='p3dcparser_composite2.obj')
   TargetAdd('libp3direct.dll', input='p3dcparser_dcParser.obj')
   TargetAdd('libp3direct.dll', input='p3dcparser_dcParser.obj')
   TargetAdd('libp3direct.dll', input='p3dcparser_dcLexer.obj')
   TargetAdd('libp3direct.dll', input='p3dcparser_dcLexer.obj')
-  TargetAdd('libp3direct.dll', input='libp3dcparser_igate.obj')
   TargetAdd('libp3direct.dll', input='p3showbase_showBase.obj')
   TargetAdd('libp3direct.dll', input='p3showbase_showBase.obj')
   if GetTarget() == 'darwin':
   if GetTarget() == 'darwin':
     TargetAdd('libp3direct.dll', input='p3showbase_showBase_assist.obj')
     TargetAdd('libp3direct.dll', input='p3showbase_showBase_assist.obj')
-  TargetAdd('libp3direct.dll', input='libp3showbase_igate.obj')
   TargetAdd('libp3direct.dll', input='p3deadrec_composite1.obj')
   TargetAdd('libp3direct.dll', input='p3deadrec_composite1.obj')
-  TargetAdd('libp3direct.dll', input='libp3deadrec_igate.obj')
   TargetAdd('libp3direct.dll', input='p3interval_composite1.obj')
   TargetAdd('libp3direct.dll', input='p3interval_composite1.obj')
-  TargetAdd('libp3direct.dll', input='libp3interval_igate.obj')
   TargetAdd('libp3direct.dll', input='p3distributed_config_distributed.obj')
   TargetAdd('libp3direct.dll', input='p3distributed_config_distributed.obj')
   TargetAdd('libp3direct.dll', input='p3distributed_cConnectionRepository.obj')
   TargetAdd('libp3direct.dll', input='p3distributed_cConnectionRepository.obj')
   TargetAdd('libp3direct.dll', input='p3distributed_cDistributedSmoothNodeBase.obj')
   TargetAdd('libp3direct.dll', input='p3distributed_cDistributedSmoothNodeBase.obj')
-  TargetAdd('libp3direct.dll', input='libp3distributed_igate.obj')
   TargetAdd('libp3direct.dll', input=COMMON_PANDA_LIBS)
   TargetAdd('libp3direct.dll', input=COMMON_PANDA_LIBS)
   TargetAdd('libp3direct.dll', opts=['ADVAPI',  'OPENSSL', 'WINUSER', 'WINGDI'])
   TargetAdd('libp3direct.dll', opts=['ADVAPI',  'OPENSSL', 'WINUSER', 'WINGDI'])
 
 
@@ -4634,6 +4718,12 @@ if (PkgSkip("DIRECT")==0):
   TargetAdd('direct_module.obj', opts=OPTS)
   TargetAdd('direct_module.obj', opts=OPTS)
   TargetAdd('direct_module.obj', opts=['IMOD:panda3d.direct', 'ILIB:direct'])
   TargetAdd('direct_module.obj', opts=['IMOD:panda3d.direct', 'ILIB:direct'])
 
 
+  TargetAdd('direct.pyd', input='libp3dcparser_igate.obj')
+  TargetAdd('direct.pyd', input='libp3showbase_igate.obj')
+  TargetAdd('direct.pyd', input='libp3deadrec_igate.obj')
+  TargetAdd('direct.pyd', input='libp3interval_igate.obj')
+  TargetAdd('direct.pyd', input='libp3distributed_igate.obj')
+
   TargetAdd('direct.pyd', input='direct_module.obj')
   TargetAdd('direct.pyd', input='direct_module.obj')
   TargetAdd('direct.pyd', input='libp3direct.dll')
   TargetAdd('direct.pyd', input='libp3direct.dll')
   TargetAdd('direct.pyd', input='core.pyd')
   TargetAdd('direct.pyd', input='core.pyd')
@@ -5255,9 +5345,8 @@ if (PkgSkip("PANDATOOL")==0):
 
 
 if (PkgSkip("PANDATOOL")==0):
 if (PkgSkip("PANDATOOL")==0):
   OPTS=['DIR:pandatool/src/flt', 'ZLIB']
   OPTS=['DIR:pandatool/src/flt', 'ZLIB']
-  TargetAdd('p3flt_fltVectorRecord.obj', opts=OPTS, input='fltVectorRecord.cxx')
   TargetAdd('p3flt_composite1.obj', opts=OPTS, input='p3flt_composite1.cxx')
   TargetAdd('p3flt_composite1.obj', opts=OPTS, input='p3flt_composite1.cxx')
-  TargetAdd('libp3flt.lib', input=['p3flt_fltVectorRecord.obj', 'p3flt_composite1.obj'])
+  TargetAdd('libp3flt.lib', input=['p3flt_composite1.obj'])
 
 
 #
 #
 # DIRECTORY: pandatool/src/fltegg/
 # DIRECTORY: pandatool/src/fltegg/

+ 1 - 1
panda/src/display/Sources.pp

@@ -14,6 +14,7 @@
     standardMunger.I standardMunger.h \
     standardMunger.I standardMunger.h \
     config_display.h \
     config_display.h \
     $[if $[HAVE_PYTHON], pythonGraphicsWindowProc.h] \
     $[if $[HAVE_PYTHON], pythonGraphicsWindowProc.h] \
+    $[if $[HAVE_PYTHON], pythonGraphicsWindowProc.cxx] \
     callbackGraphicsWindow.I callbackGraphicsWindow.h \
     callbackGraphicsWindow.I callbackGraphicsWindow.h \
     drawableRegion.I drawableRegion.h \
     drawableRegion.I drawableRegion.h \
     displayRegion.I displayRegion.h  \
     displayRegion.I displayRegion.h  \
@@ -54,7 +55,6 @@
  #define INCLUDED_SOURCES  \
  #define INCLUDED_SOURCES  \
     standardMunger.cxx \
     standardMunger.cxx \
     config_display.cxx \
     config_display.cxx \
-    $[if $[HAVE_PYTHON], pythonGraphicsWindowProc.cxx] \
     callbackGraphicsWindow.cxx \
     callbackGraphicsWindow.cxx \
     drawableRegion.cxx \
     drawableRegion.cxx \
     displayRegion.cxx \
     displayRegion.cxx \

+ 4 - 5
panda/src/display/callbackGraphicsWindow.h

@@ -40,7 +40,7 @@ protected:
 PUBLISHED:
 PUBLISHED:
   virtual ~CallbackGraphicsWindow();
   virtual ~CallbackGraphicsWindow();
 
 
-  class WindowCallbackData : public CallbackData {
+  class EXPCL_PANDA_DISPLAY WindowCallbackData : public CallbackData {
   public:
   public:
     INLINE WindowCallbackData(CallbackGraphicsWindow *window);
     INLINE WindowCallbackData(CallbackGraphicsWindow *window);
 
 
@@ -68,8 +68,7 @@ PUBLISHED:
     static TypeHandle _type_handle;
     static TypeHandle _type_handle;
   };
   };
 
 
-
-  class EventsCallbackData : public WindowCallbackData {
+  class EXPCL_PANDA_DISPLAY EventsCallbackData : public WindowCallbackData {
   public:
   public:
     INLINE EventsCallbackData(CallbackGraphicsWindow *window);
     INLINE EventsCallbackData(CallbackGraphicsWindow *window);
 
 
@@ -94,7 +93,7 @@ PUBLISHED:
     static TypeHandle _type_handle;
     static TypeHandle _type_handle;
   };
   };
 
 
-  class PropertiesCallbackData : public WindowCallbackData {
+  class EXPCL_PANDA_DISPLAY PropertiesCallbackData : public WindowCallbackData {
   public:
   public:
     INLINE PropertiesCallbackData(CallbackGraphicsWindow *window, WindowProperties &properties);
     INLINE PropertiesCallbackData(CallbackGraphicsWindow *window, WindowProperties &properties);
 
 
@@ -131,7 +130,7 @@ PUBLISHED:
     RCT_end_flip,
     RCT_end_flip,
   };
   };
 
 
-  class RenderCallbackData : public WindowCallbackData {
+  class EXPCL_PANDA_DISPLAY RenderCallbackData : public WindowCallbackData {
   public:
   public:
     INLINE RenderCallbackData(CallbackGraphicsWindow *window, RenderCallbackType callback_type, FrameMode frame_mode);
     INLINE RenderCallbackData(CallbackGraphicsWindow *window, RenderCallbackType callback_type, FrameMode frame_mode);
 
 

+ 1 - 1
panda/src/display/graphicsStateGuardian_ext.cxx

@@ -18,7 +18,7 @@
 #ifdef HAVE_PYTHON
 #ifdef HAVE_PYTHON
 
 
 #ifndef CPPPARSER
 #ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject Dtool_Texture;
+extern struct Dtool_PyTypedObject Dtool_Texture;
 #endif
 #endif
 
 
 static bool traverse_callback(TextureContext *tc, void *data) {
 static bool traverse_callback(TextureContext *tc, void *data) {

+ 1 - 1
panda/src/display/graphicsWindowProc.h

@@ -31,7 +31,7 @@ class GraphicsWindow;
 // Description : Defines an interface for storing platform-specific
 // Description : Defines an interface for storing platform-specific
 //               window processor methods.
 //               window processor methods.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-class GraphicsWindowProc{
+class EXPCL_PANDA_DISPLAY GraphicsWindowProc {
 public:
 public:
   GraphicsWindowProc();
   GraphicsWindowProc();
 #if defined(__WIN32__) || defined(_WIN32)
 #if defined(__WIN32__) || defined(_WIN32)

+ 0 - 3
panda/src/display/p3display_composite2.cxx

@@ -4,9 +4,6 @@
 #include "graphicsWindow.cxx"
 #include "graphicsWindow.cxx"
 #include "graphicsWindowProc.cxx"
 #include "graphicsWindowProc.cxx"
 #include "graphicsWindowProcCallbackData.cxx"
 #include "graphicsWindowProcCallbackData.cxx"
-#ifdef HAVE_PYTHON
-#include "pythonGraphicsWindowProc.cxx"
-#endif
 #include "graphicsWindowInputDevice.cxx"
 #include "graphicsWindowInputDevice.cxx"
 #include "lru.cxx"
 #include "lru.cxx"
 #include "nativeWindowHandle.cxx"
 #include "nativeWindowHandle.cxx"

+ 1 - 5
panda/src/downloader/httpAuthorization.h

@@ -35,12 +35,8 @@ class URLSpec;
 //               authorization requests in the past, which can
 //               authorization requests in the past, which can
 //               possibly be re-used for future requests to the same
 //               possibly be re-used for future requests to the same
 //               server.
 //               server.
-//
-//               This class does not need to be exported from the DLL
-//               because it has no public interface; it is simply a
-//               helper class for HTTPChannel.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-class HTTPAuthorization : public ReferenceCount {
+class EXPCL_PANDAEXPRESS HTTPAuthorization : public ReferenceCount {
 public:
 public:
   typedef pmap<string, string> Tokens;
   typedef pmap<string, string> Tokens;
   typedef pmap<string, Tokens> AuthenticationSchemes;
   typedef pmap<string, Tokens> AuthenticationSchemes;

+ 4 - 4
panda/src/dxml/config_dxml.h

@@ -36,10 +36,10 @@ extern EXPCL_PANDA void init_libdxml();
 class TiXmlDocument;
 class TiXmlDocument;
 class TiXmlNode;
 class TiXmlNode;
 BEGIN_PUBLISH
 BEGIN_PUBLISH
-TiXmlDocument *read_xml_stream(istream &in);
-void write_xml_stream(ostream &out, TiXmlDocument *doc);
-void print_xml(TiXmlNode *xnode);
-void print_xml_to_file(const Filename &filename, TiXmlNode *xnode);
+EXPCL_PANDA TiXmlDocument *read_xml_stream(istream &in);
+EXPCL_PANDA void write_xml_stream(ostream &out, TiXmlDocument *doc);
+EXPCL_PANDA void print_xml(TiXmlNode *xnode);
+EXPCL_PANDA void print_xml_to_file(const Filename &filename, TiXmlNode *xnode);
 END_PUBLISH
 END_PUBLISH
 
 
 #endif
 #endif

+ 14 - 14
panda/src/dxml/tinyxml.h

@@ -96,7 +96,7 @@ const int TIXML_PATCH_VERSION = 1;
 /*  Internal structure for tracking location of items 
 /*  Internal structure for tracking location of items 
     in the XML file.
     in the XML file.
 */
 */
-struct TiXmlCursor
+struct EXPCL_PANDA TiXmlCursor
 {
 {
     TiXmlCursor()       { Clear(); }
     TiXmlCursor()       { Clear(); }
     void Clear()        { row = col = -1; }
     void Clear()        { row = col = -1; }
@@ -125,7 +125,7 @@ struct TiXmlCursor
 
 
     @sa TiXmlNode::Accept()
     @sa TiXmlNode::Accept()
 */
 */
-class TiXmlVisitor
+class EXPCL_PANDA TiXmlVisitor
 {
 {
 public:
 public:
     virtual ~TiXmlVisitor() {}
     virtual ~TiXmlVisitor() {}
@@ -191,7 +191,7 @@ const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN;
     A Decleration contains: Attributes (not on tree)
     A Decleration contains: Attributes (not on tree)
     @endverbatim
     @endverbatim
 */
 */
-class TiXmlBase
+class EXPCL_PANDA TiXmlBase
 {
 {
     friend class TiXmlNode;
     friend class TiXmlNode;
     friend class TiXmlElement;
     friend class TiXmlElement;
@@ -420,7 +420,7 @@ private:
     in a document, or stand on its own. The type of a TiXmlNode
     in a document, or stand on its own. The type of a TiXmlNode
     can be queried, and it can be cast to its more defined type.
     can be queried, and it can be cast to its more defined type.
 */
 */
-class TiXmlNode : public TiXmlBase
+class EXPCL_PANDA TiXmlNode : public TiXmlBase
 {
 {
     friend class TiXmlDocument;
     friend class TiXmlDocument;
     friend class TiXmlElement;
     friend class TiXmlElement;
@@ -776,7 +776,7 @@ private:
           part of the tinyXML document object model. There are other
           part of the tinyXML document object model. There are other
           suggested ways to look at this problem.
           suggested ways to look at this problem.
 */
 */
-class TiXmlAttribute : public TiXmlBase
+class EXPCL_PANDA TiXmlAttribute : public TiXmlBase
 {
 {
     friend class TiXmlAttributeSet;
     friend class TiXmlAttributeSet;
 
 
@@ -900,7 +900,7 @@ private:
         - I like circular lists
         - I like circular lists
         - it demonstrates some independence from the (typical) doubly linked list.
         - it demonstrates some independence from the (typical) doubly linked list.
 */
 */
-class TiXmlAttributeSet
+class EXPCL_PANDA TiXmlAttributeSet
 {
 {
 public:
 public:
     TiXmlAttributeSet();
     TiXmlAttributeSet();
@@ -937,7 +937,7 @@ private:
     and can contain other elements, text, comments, and unknowns.
     and can contain other elements, text, comments, and unknowns.
     Elements also contain an arbitrary number of attributes.
     Elements also contain an arbitrary number of attributes.
 */
 */
-class TiXmlElement : public TiXmlNode
+class EXPCL_PANDA TiXmlElement : public TiXmlNode
 {
 {
 public:
 public:
     /// Construct an element.
     /// Construct an element.
@@ -1152,7 +1152,7 @@ private:
 
 
 /** An XML comment.
 /** An XML comment.
 */
 */
-class TiXmlComment : public TiXmlNode
+class EXPCL_PANDA TiXmlComment : public TiXmlNode
 {
 {
 public:
 public:
     /// Constructs an empty comment.
     /// Constructs an empty comment.
@@ -1202,7 +1202,7 @@ private:
     you generally want to leave it alone, but you can change the output mode with 
     you generally want to leave it alone, but you can change the output mode with 
     SetCDATA() and query it with CDATA().
     SetCDATA() and query it with CDATA().
 */
 */
-class TiXmlText : public TiXmlNode
+class EXPCL_PANDA TiXmlText : public TiXmlNode
 {
 {
     friend class TiXmlElement;
     friend class TiXmlElement;
 public:
 public:
@@ -1275,7 +1275,7 @@ private:
     handled as special cases, not generic attributes, simply
     handled as special cases, not generic attributes, simply
     because there can only be at most 3 and they are always the same.
     because there can only be at most 3 and they are always the same.
 */
 */
-class TiXmlDeclaration : public TiXmlNode
+class EXPCL_PANDA TiXmlDeclaration : public TiXmlNode
 {
 {
 public:
 public:
     /// Construct an empty declaration.
     /// Construct an empty declaration.
@@ -1344,7 +1344,7 @@ private:
 
 
     DTD tags get thrown into TiXmlUnknowns.
     DTD tags get thrown into TiXmlUnknowns.
 */
 */
-class TiXmlUnknown : public TiXmlNode
+class EXPCL_PANDA TiXmlUnknown : public TiXmlNode
 {
 {
 public:
 public:
     TiXmlUnknown() : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN )    {}
     TiXmlUnknown() : TiXmlNode( TiXmlNode::TINYXML_UNKNOWN )    {}
@@ -1383,7 +1383,7 @@ private:
     XML pieces. It can be saved, loaded, and printed to the screen.
     XML pieces. It can be saved, loaded, and printed to the screen.
     The 'value' of a document node is the xml file name.
     The 'value' of a document node is the xml file name.
 */
 */
-class TiXmlDocument : public TiXmlNode
+class EXPCL_PANDA TiXmlDocument : public TiXmlNode
 {
 {
 public:
 public:
     /// Create an empty document, that has no name.
     /// Create an empty document, that has no name.
@@ -1628,7 +1628,7 @@ private:
     }
     }
     @endverbatim
     @endverbatim
 */
 */
-class TiXmlHandle
+class EXPCL_PANDA TiXmlHandle
 {
 {
 public:
 public:
     /// Create a handle from any node (at any depth of the tree.) This can be a null pointer.
     /// Create a handle from any node (at any depth of the tree.) This can be a null pointer.
@@ -1727,7 +1727,7 @@ private:
     fprintf( stdout, "%s", printer.CStr() );
     fprintf( stdout, "%s", printer.CStr() );
     @endverbatim
     @endverbatim
 */
 */
-class TiXmlPrinter : public TiXmlVisitor
+class EXPCL_PANDA TiXmlPrinter : public TiXmlVisitor
 {
 {
 public:
 public:
     TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ),
     TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ),

+ 2 - 2
panda/src/egg/eggGroupNode_ext.cxx

@@ -17,7 +17,7 @@
 #ifdef HAVE_PYTHON
 #ifdef HAVE_PYTHON
 
 
 #ifndef CPPPARSER
 #ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject Dtool_EggNode;
+extern struct Dtool_PyTypedObject Dtool_EggNode;
 #endif
 #endif
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -37,7 +37,7 @@ get_children() const {
   }
   }
 
 
   // Fill in the list.
   // Fill in the list.
-  int i = 0;
+  size_t i = 0;
   for (it = _this->begin(); it != _this->end() && i < len; ++it) {
   for (it = _this->begin(); it != _this->end() && i < len; ++it) {
     EggNode *node = *it;
     EggNode *node = *it;
     node->ref();
     node->ref();

+ 1 - 2
panda/src/event/Sources.pp

@@ -20,7 +20,7 @@
     genericAsyncTask.h genericAsyncTask.I \
     genericAsyncTask.h genericAsyncTask.I \
     pointerEvent.I pointerEvent.h \
     pointerEvent.I pointerEvent.h \
     pointerEventList.I pointerEventList.h \
     pointerEventList.I pointerEventList.h \
-    pythonTask.h pythonTask.I \
+    pythonTask.h pythonTask.I pythonTask.cxx \
     event.I event.h eventHandler.h eventHandler.I \
     event.I event.h eventHandler.h eventHandler.I \
     eventParameter.I eventParameter.h \
     eventParameter.I eventParameter.h \
     eventQueue.I eventQueue.h eventReceiver.h \
     eventQueue.I eventQueue.h eventReceiver.h \
@@ -38,7 +38,6 @@
     genericAsyncTask.cxx \
     genericAsyncTask.cxx \
     pointerEvent.cxx \
     pointerEvent.cxx \
     pointerEventList.cxx \
     pointerEventList.cxx \
-    pythonTask.cxx \
     config_event.cxx event.cxx eventHandler.cxx \ 
     config_event.cxx event.cxx eventHandler.cxx \ 
     eventParameter.cxx eventQueue.cxx eventReceiver.cxx \
     eventParameter.cxx eventQueue.cxx eventReceiver.cxx \
     pt_Event.cxx
     pt_Event.cxx

+ 0 - 4
panda/src/event/config_event.cxx

@@ -24,7 +24,6 @@
 #include "eventParameter.h"
 #include "eventParameter.h"
 #include "genericAsyncTask.h"
 #include "genericAsyncTask.h"
 #include "pointerEventList.h"
 #include "pointerEventList.h"
-#include "pythonTask.h"
 
 
 #include "dconfig.h"
 #include "dconfig.h"
 
 
@@ -45,9 +44,6 @@ ConfigureFn(config_event) {
   EventStoreInt::init_type("EventStoreInt");
   EventStoreInt::init_type("EventStoreInt");
   EventStoreDouble::init_type("EventStoreDouble");
   EventStoreDouble::init_type("EventStoreDouble");
   GenericAsyncTask::init_type();
   GenericAsyncTask::init_type();
-#ifdef HAVE_PYTHON
-  PythonTask::init_type();
-#endif
 
 
   ButtonEventList::register_with_read_factory();
   ButtonEventList::register_with_read_factory();
   EventStoreInt::register_with_read_factory();
   EventStoreInt::register_with_read_factory();

+ 0 - 1
panda/src/event/p3event_composite1.cxx

@@ -9,4 +9,3 @@
 #include "genericAsyncTask.cxx"
 #include "genericAsyncTask.cxx"
 #include "pointerEvent.cxx"
 #include "pointerEvent.cxx"
 #include "pointerEventList.cxx"
 #include "pointerEventList.cxx"
-#include "pythonTask.cxx"

+ 7 - 2
panda/src/event/pythonTask.cxx

@@ -17,12 +17,17 @@
 #include "config_event.h"
 #include "config_event.h"
 
 
 #ifdef HAVE_PYTHON
 #ifdef HAVE_PYTHON
-#include "py_panda.h"  
+#include "py_panda.h"
 
 
 TypeHandle PythonTask::_type_handle;
 TypeHandle PythonTask::_type_handle;
 
 
+Configure(config_pythonTask);
+ConfigureFn(config_pythonTask) {
+  PythonTask::init_type();
+}
+
 #ifndef CPPPARSER
 #ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject Dtool_TypedReferenceCount;
+extern struct Dtool_PyTypedObject Dtool_TypedReferenceCount;
 #endif
 #endif
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////

+ 1 - 1
panda/src/event/pythonTask.h

@@ -25,7 +25,7 @@
 // Description : This class exists to allow association of a Python
 // Description : This class exists to allow association of a Python
 //               function with the AsyncTaskManager.
 //               function with the AsyncTaskManager.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-class EXPCL_PANDA_PIPELINE PythonTask : public AsyncTask {
+class PythonTask : public AsyncTask {
 PUBLISHED:
 PUBLISHED:
   PythonTask(PyObject *function = Py_None, const string &name = string());
   PythonTask(PyObject *function = Py_None, const string &name = string());
   virtual ~PythonTask();
   virtual ~PythonTask();

+ 0 - 48
panda/src/express/multifile.I

@@ -534,51 +534,3 @@ get_last_byte_pos() const {
   return max(_index_start + (streampos)_index_length, 
   return max(_index_start + (streampos)_index_length, 
              _data_start + (streampos)_data_length) - (streampos)1;
              _data_start + (streampos)_data_length) - (streampos)1;
 }
 }
-
-#ifdef HAVE_OPENSSL
-////////////////////////////////////////////////////////////////////
-//     Function: Multifile::CertRecord::Constructor
-//       Access: Public
-//  Description: Ownership of the X509 object is passed into the
-//               CertRecord; it will be freed when the CertRecord
-//               destructs.
-////////////////////////////////////////////////////////////////////
-INLINE Multifile::CertRecord::
-CertRecord(X509 *cert) :
-  _cert(cert)
-{
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: Multifile::CertRecord::Copy Constructor
-//       Access: Public
-//  Description: 
-////////////////////////////////////////////////////////////////////
-INLINE Multifile::CertRecord::
-CertRecord(const Multifile::CertRecord &copy) :
-  _cert(X509_dup(copy._cert))
-{
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: Multifile::CertRecord::Destructor
-//       Access: Public
-//  Description: 
-////////////////////////////////////////////////////////////////////
-INLINE Multifile::CertRecord::
-~CertRecord() {
-  X509_free(_cert);
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: Multifile::CertRecord::Copy Assignment
-//       Access: Public
-//  Description: 
-////////////////////////////////////////////////////////////////////
-INLINE void Multifile::CertRecord::
-operator = (const Multifile::CertRecord &other) {
-  X509_free(_cert);
-  _cert = X509_dup(other._cert);
-}
-#endif
-

+ 47 - 0
panda/src/express/multifile.cxx

@@ -604,6 +604,53 @@ update_subfile(const string &subfile_name, const Filename &filename,
   return name;
   return name;
 }
 }
 
 
+#ifdef HAVE_OPENSSL
+////////////////////////////////////////////////////////////////////
+//     Function: Multifile::CertRecord::Constructor
+//       Access: Public
+//  Description: Ownership of the X509 object is passed into the
+//               CertRecord; it will be freed when the CertRecord
+//               destructs.
+////////////////////////////////////////////////////////////////////
+Multifile::CertRecord::
+CertRecord(X509 *cert) :
+  _cert(cert)
+{
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: Multifile::CertRecord::Copy Constructor
+//       Access: Public
+//  Description:
+////////////////////////////////////////////////////////////////////
+Multifile::CertRecord::
+CertRecord(const Multifile::CertRecord &copy) :
+  _cert(X509_dup(copy._cert))
+{
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: Multifile::CertRecord::Destructor
+//       Access: Public
+//  Description:
+////////////////////////////////////////////////////////////////////
+Multifile::CertRecord::
+~CertRecord() {
+  X509_free(_cert);
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: Multifile::CertRecord::Copy Assignment
+//       Access: Public
+//  Description:
+////////////////////////////////////////////////////////////////////
+void Multifile::CertRecord::
+operator = (const Multifile::CertRecord &other) {
+  X509_free(_cert);
+  _cert = X509_dup(other._cert);
+}
+#endif  // HAVE_OPENSSL
+
 #ifdef HAVE_OPENSSL
 #ifdef HAVE_OPENSSL
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: Multifile::add_signature
 //     Function: Multifile::add_signature

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

@@ -84,12 +84,12 @@ PUBLISHED:
                         int compression_level);
                         int compression_level);
 
 
 #ifdef HAVE_OPENSSL
 #ifdef HAVE_OPENSSL
-  class CertRecord {
+  class EXPCL_PANDAEXPRESS CertRecord {
   public:
   public:
-    INLINE CertRecord(X509 *cert);
-    INLINE CertRecord(const CertRecord &copy);
-    INLINE ~CertRecord();
-    INLINE void operator = (const CertRecord &other);
+    CertRecord(X509 *cert);
+    CertRecord(const CertRecord &copy);
+    ~CertRecord();
+    void operator = (const CertRecord &other);
     X509 *_cert;
     X509 *_cert;
   };
   };
   typedef pvector<CertRecord> CertChain;
   typedef pvector<CertRecord> CertChain;

+ 3 - 2
panda/src/express/password_hash.h

@@ -23,8 +23,9 @@
 
 
 BEGIN_PUBLISH
 BEGIN_PUBLISH
 
 
-string password_hash(const string &password, const string &salt, 
-                     int iters, int keylen);
+EXPCL_PANDAEXPRESS string password_hash(const string &password,
+                                        const string &salt,
+                                        int iters, int keylen);
 
 
 END_PUBLISH
 END_PUBLISH
 
 

+ 1 - 324
panda/src/express/pointerToArray.I

@@ -39,7 +39,7 @@ PointerToArray(TypeHandle type_handle) :
 //  Description: Return an empty array of size n
 //  Description: Return an empty array of size n
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 template<class Element>
 template<class Element>
-INLINE PointerToArray<Element> 
+INLINE PointerToArray<Element>
 PointerToArray<Element>::empty_array(size_type n, TypeHandle type_handle) {
 PointerToArray<Element>::empty_array(size_type n, TypeHandle type_handle) {
   PointerToArray<Element> temp(type_handle);
   PointerToArray<Element> temp(type_handle);
   temp.reassign(new ReferenceCountedVector<Element>(type_handle));
   temp.reassign(new ReferenceCountedVector<Element>(type_handle));
@@ -77,129 +77,6 @@ PointerToArray(const PointerToArray<Element> &copy) :
 {
 {
 }
 }
 
 
-#ifdef HAVE_PYTHON
-////////////////////////////////////////////////////////////////////
-//     Function: PointerToArray::Constructor
-//       Access: Published
-//  Description: This special constructor accepts a Python list of
-//               elements, or a Python string (or a bytes object,
-//               in Python 3), or any object that supports the
-//               Python buffer protocol.
-////////////////////////////////////////////////////////////////////
-template<class Element>
-PointerToArray<Element>::
-PointerToArray(PyObject *self, PyObject *source) :
-  PointerToArrayBase<Element>((ReferenceCountedVector<Element> *)NULL),
-  _type_handle(get_type_handle(Element))
-{
-  // We have to pre-initialize self's "this" pointer when we receive
-  // self in the constructor--the caller can't initialize this for us.
-  ((Dtool_PyInstDef *)self)->_ptr_to_object = this;
-
-#if PY_VERSION_HEX >= 0x02060000
-  if (PyObject_CheckBuffer(source)) {
-    // User passed a buffer object.
-    Py_buffer view;
-    if (PyObject_GetBuffer(source, &view, PyBUF_CONTIG_RO) == -1) {
-      PyErr_SetString(PyExc_TypeError, "PointerToArray constructor requires a contiguous buffer");
-      return;
-    }
-
-    if (view.itemsize != 1 && view.itemsize != sizeof(Element)) {
-      PyErr_SetString(PyExc_TypeError, "buffer.itemsize does not match PointerToArray element size");
-      return;
-    }
-
-    int num_elements = view.len / sizeof(Element);
-    insert(begin(), num_elements, Element());
-
-    if (view.len > 0) {
-      memcpy(p(), view.buf, view.len);
-    }
-
-    PyBuffer_Release(&view);
-    return;
-  }
-#endif
-
-  if (!PySequence_Check(source)) {
-    // If passed with a non-sequence, this isn't the right constructor.
-    PyErr_SetString(PyExc_TypeError, "PointerToArray constructor requires a sequence or buffer object");
-    return;
-  }
-
-  // If we were passed a Python string, then instead of storing it
-  // character-at-a-time, just load the whole string as a data
-  // buffer.
-#if PY_MAJOR_VERSION >= 3
-  if (PyBytes_Check(source)) {
-    int size = PyBytes_Size(source);
-    if (size % sizeof(Element) != 0) {
-      ostringstream stream;
-      stream << "Buffer not a multiple of " << sizeof(Element) << " bytes";
-      string str = stream.str();
-      PyErr_SetString(PyExc_ValueError, str.c_str());
-      return;
-    }
-      
-    int num_elements = size / sizeof(Element);
-    insert(begin(), num_elements, Element());
-
-    // Hope there aren't any constructors or destructors involved
-    // here.
-    if (size != 0) {
-      const char *data = PyBytes_AsString(source);
-      memcpy(p(), data, size);
-    }
-    return;
-  }
-#else
-  if (PyString_CheckExact(source)) {
-    int size = PyString_Size(source);
-    if (size % sizeof(Element) != 0) {
-      ostringstream stream;
-      stream << "Buffer not a multiple of " << sizeof(Element) << " bytes";
-      string str = stream.str();
-      PyErr_SetString(PyExc_ValueError, str.c_str());
-      return;
-    }
-      
-    int num_elements = size / sizeof(Element);
-    insert(begin(), num_elements, Element());
-
-    // Hope there aren't any constructors or destructors involved
-    // here.
-    if (size != 0) {
-      const char *data = PyString_AsString(source);
-      memcpy(p(), data, size);
-    }
-    return;
-  }
-#endif
-
-  // Now construct the internal list by copying the elements
-  // one-at-a-time from Python.
-  int size = PySequence_Size(source);
-  for (int i = 0; i < size; ++i) {
-    PyObject *item = PySequence_GetItem(source, i);
-    if (item == NULL) {
-      return;
-    }
-    PyObject *result = PyObject_CallMethod(self, (char *)"pushBack", (char *)"O", item);
-    Py_DECREF(item);
-    if (result == NULL) {
-      // Unable to add item--probably it wasn't of the appropriate type.
-      ostringstream stream;
-      stream << "Element " << i << " in sequence passed to PointerToArray constructor could not be added";
-      string str = stream.str();
-      PyErr_SetString(PyExc_TypeError, str.c_str());
-      return;
-    }
-    Py_DECREF(result);
-  }
-}
-#endif  // HAVE_PYTHON
-
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: PointerToArray::begin
 //     Function: PointerToArray::begin
 //       Access: Public
 //       Access: Public
@@ -593,31 +470,6 @@ set_element(size_type n, const Element &value) {
   (*this)[n] = value;
   (*this)[n] = value;
 }
 }
 
 
-////////////////////////////////////////////////////////////////////
-//     Function: PointerToArray::__getitem__
-//       Access: Published
-//  Description: Same as get_element(), this returns the nth element
-//               of the array.
-////////////////////////////////////////////////////////////////////
-template<class Element>
-INLINE const Element &PointerToArray<Element>::
-__getitem__(size_type n) const {
-  return (*this)[n];
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: PointerToArray::__setitem__
-//       Access: Published
-//  Description: Same as set_element(), this replaces the nth element
-//               of the array.
-////////////////////////////////////////////////////////////////////
-template<class Element>
-INLINE void PointerToArray<Element>::
-__setitem__(size_type n, const Element &value) {
-  nassertv(n < ((To *)(this->_void_ptr))->size());
-  (*this)[n] = value;
-}
-
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: PointerToArray::get_data
 //     Function: PointerToArray::get_data
 //       Access: Published
 //       Access: Published
@@ -884,23 +736,6 @@ ConstPointerToArray(const ConstPointerToArray<Element> &copy) :
 {
 {
 }
 }
 
 
-#ifdef HAVE_PYTHON
-////////////////////////////////////////////////////////////////////
-//     Function: ConstPointerToArray::Constructor
-//       Access: Public
-//  Description: This special constructor accepts a Python list of
-//               elements, or a Python string (or a bytes object,
-//               in Python 3).
-////////////////////////////////////////////////////////////////////
-template<class Element>
-INLINE ConstPointerToArray<Element>::
-ConstPointerToArray(PyObject *self, PyObject *source) :
-  PointerToArrayBase<Element>(PointerToArray<Element>(self, source)),
-  _type_handle(get_type_handle(Element))
-{
-}
-#endif  // HAVE_PYTHON
-
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: ConstPointerToArray::begin
 //     Function: ConstPointerToArray::begin
 //       Access: Public
 //       Access: Public
@@ -1158,18 +993,6 @@ get_element(size_type n) const {
   return (*this)[n];
   return (*this)[n];
 }
 }
 
 
-////////////////////////////////////////////////////////////////////
-//     Function: ConstPointerToArray::__getitem__
-//       Access: Published
-//  Description: Same as get_element(), this returns the nth element
-//               of the array.
-////////////////////////////////////////////////////////////////////
-template<class Element>
-INLINE const Element &ConstPointerToArray<Element>::
-__getitem__(size_type n) const {
-  return (*this)[n];
-}
-
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: ConstPointerToArray::get_data
 //     Function: ConstPointerToArray::get_data
 //       Access: Published
 //       Access: Published
@@ -1331,150 +1154,4 @@ clear() {
   ((ConstPointerToArray<Element> *)this)->reassign((ReferenceCountedVector<Element> *)NULL);
   ((ConstPointerToArray<Element> *)this)->reassign((ReferenceCountedVector<Element> *)NULL);
 }
 }
 
 
-#ifdef HAVE_PYTHON
-#if PY_VERSION_HEX >= 0x02060000
-////////////////////////////////////////////////////////////////////
-//     Function: PointerToArray::__getbuffer__
-//       Access: Published
-//  Description: This is used to implement the buffer protocol, in
-//               order to allow efficient access to the array data
-//               through a Python multiview object.
-////////////////////////////////////////////////////////////////////
-template<class Element>
-INLINE int PointerToArray<Element>::
-__getbuffer__(PyObject *self, Py_buffer *view, int flags) {
-
-  const char *format = get_format_code(Element);
-  if (format == NULL) {
-    // Not supported.
-    return -1;
-  }
-
-  if (self != NULL) {
-    Py_INCREF(self);
-  }
-  view->obj = self;
-  view->buf = (void*) p();
-  view->len = size() * sizeof(Element);
-  view->readonly = 0;
-  view->itemsize = sizeof(Element);
-  view->format = NULL;
-  if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
-    view->format = (char*) format;
-  }
-  view->ndim = 1;
-  view->shape = NULL;
-  if ((flags & PyBUF_ND) == PyBUF_ND) {
-    // This leaks, which sucks, but __releasebuffer__ doesn't give us
-    // the same pointer, so we would need to store it elsewhere if we
-    // wanted to delete it there.  Eh, it's just an int, who cares.
-    view->shape = new Py_ssize_t(size());
-  }
-  view->strides = NULL;
-  if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES) {
-    view->strides = &(view->itemsize);
-  }
-  view->suboffsets = NULL;
-
-  // Store a reference to ourselves on the Py_buffer object
-  // as a reminder that we have increased our refcount.
-  ref();
-  view->internal = (void*) this;
-
-  return 0;
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: PointerToArray::__releasebuffer__
-//       Access: Published
-//  Description: Releases the buffer allocated by __getbuffer__.
-////////////////////////////////////////////////////////////////////
-template<class Element>
-INLINE void PointerToArray<Element>::
-__releasebuffer__(PyObject *self, Py_buffer *view) const {
-  // Note: PyBuffer_Release automatically decrements view->obj.
-
-  if (view->internal != NULL) {
-    // Oh, right, let's not forget to unref this.
-    ((const PointerToArray<Element> *) view->internal)->unref();
-    view->internal = NULL;
-  }
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: ConstPointerToArray::__getbuffer__
-//       Access: Published
-//  Description: This is used to implement the buffer protocol, in
-//               order to allow efficient access to the array data
-//               through a Python multiview object.
-////////////////////////////////////////////////////////////////////
-template<class Element>
-INLINE int ConstPointerToArray<Element>::
-__getbuffer__(PyObject *self, Py_buffer *view, int flags) const {
-
-  if ((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) {
-    PyErr_SetString(PyExc_BufferError,
-                    "Object is not writable.");
-    return -1;
-  }
-
-  const char *format = get_format_code(Element);
-  if (format == NULL) {
-    // Not supported.
-    return -1;
-  }
-
-  if (self != NULL) {
-    Py_INCREF(self);
-  }
-  view->obj = self;
-  view->buf = (void*) p();
-  view->len = size() * sizeof(Element);
-  view->readonly = 1;
-  view->itemsize = sizeof(Element);
-  view->format = NULL;
-  if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
-    view->format = (char*) format;
-  }
-  view->ndim = 1;
-  view->shape = NULL;
-  if ((flags & PyBUF_ND) == PyBUF_ND) {
-    // This leaks, which sucks, but __releasebuffer__ doesn't give us
-    // the same pointer, so we would need to store it elsewhere if we
-    // wanted to delete it there.  Eh, it's just an int, who cares.
-    view->shape = new Py_ssize_t(size());
-  }
-  view->strides = NULL;
-  if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES) {
-    view->strides = &(view->itemsize);
-  }
-  view->suboffsets = NULL;
-
-  // Store a reference to ourselves on the Py_buffer object
-  // as a reminder that we have increased our refcount.
-  ref();
-  view->internal = (void*) this;
-
-  return 0;
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: ConstPointerToArray::__releasebuffer__
-//       Access: Published
-//  Description: Releases the buffer allocated by __getbuffer__.
-////////////////////////////////////////////////////////////////////
-template<class Element>
-INLINE void ConstPointerToArray<Element>::
-__releasebuffer__(PyObject *self, Py_buffer *view) const {
-  // Note: PyBuffer_Release automatically decrements obj->view.
-
-  if (view->internal != NULL) {
-    // Oh, right, let's not forget to unref this.
-    ((const PointerToArray<Element> *) view->internal)->unref();
-    view->internal = NULL;
-  }
-}
-#endif  // PY_VERSION_HEX
-#endif  // HAVE_PYTHON
-
 #endif  // CPPPARSER
 #endif  // CPPPARSER

+ 9 - 71
panda/src/express/pointerToArray.h

@@ -67,9 +67,6 @@
 #include "pandabase.h"
 #include "pandabase.h"
 
 
 #include "pointerToArrayBase.h"
 #include "pointerToArrayBase.h"
-#ifdef HAVE_PYTHON
-#include "py_panda.h"
-#endif
 
 
 #if (defined(WIN32_VC) || defined(WIN64_VC)) && !defined(__INTEL_COMPILER)
 #if (defined(WIN32_VC) || defined(WIN64_VC)) && !defined(__INTEL_COMPILER)
 // disable mysterious MSVC warning for static inline PTA::empty_array method
 // disable mysterious MSVC warning for static inline PTA::empty_array method
@@ -112,17 +109,15 @@ PUBLISHED:
   INLINE static PointerToArray<Element> empty_array(size_type n, TypeHandle type_handle = get_type_handle(Element));
   INLINE static PointerToArray<Element> empty_array(size_type n, TypeHandle type_handle = get_type_handle(Element));
   INLINE PointerToArray(const PointerToArray<Element> &copy);
   INLINE PointerToArray(const PointerToArray<Element> &copy);
 
 
-#ifdef HAVE_PYTHON
-  PointerToArray(PyObject *self, PyObject *source);
-#endif
+  EXTENSION(PointerToArray(PyObject *self, PyObject *source));
 
 
   INLINE size_type size() const;
   INLINE size_type size() const;
   INLINE void push_back(const Element &x);
   INLINE void push_back(const Element &x);
   INLINE void pop_back();
   INLINE void pop_back();
   INLINE const Element &get_element(size_type n) const;
   INLINE const Element &get_element(size_type n) const;
   INLINE void set_element(size_type n, const Element &value);
   INLINE void set_element(size_type n, const Element &value);
-  INLINE const Element &__getitem__(size_type n) const;
-  INLINE void __setitem__(size_type n, const Element &value);
+  EXTENSION(const Element &__getitem__(size_type n) const);
+  EXTENSION(void __setitem__(size_type n, const Element &value));
   INLINE string get_data() const;
   INLINE string get_data() const;
   INLINE void set_data(const string &data);
   INLINE void set_data(const string &data);
   INLINE string get_subdata(size_type n, size_type count) const;
   INLINE string get_subdata(size_type n, size_type count) const;
@@ -132,8 +127,8 @@ PUBLISHED:
 
 
 #ifdef HAVE_PYTHON
 #ifdef HAVE_PYTHON
 #if PY_VERSION_HEX >= 0x02060000
 #if PY_VERSION_HEX >= 0x02060000
-  int __getbuffer__(PyObject *self, Py_buffer *view, int flags);
-  void __releasebuffer__(PyObject *self, Py_buffer *view) const;
+  EXTENSION(int __getbuffer__(PyObject *self, Py_buffer *view, int flags));
+  EXTENSION(void __releasebuffer__(PyObject *self, Py_buffer *view) const);
 #endif
 #endif
 #endif
 #endif
 
 
@@ -156,10 +151,6 @@ public:
   INLINE PointerToArray(size_type n, const Element &value, TypeHandle type_handle = get_type_handle(Element));
   INLINE PointerToArray(size_type n, const Element &value, TypeHandle type_handle = get_type_handle(Element));
   INLINE PointerToArray(const PointerToArray<Element> &copy);
   INLINE PointerToArray(const PointerToArray<Element> &copy);
 
 
-#ifdef HAVE_PYTHON
-  PointerToArray(PyObject *self, PyObject *source);
-#endif
-
 public:
 public:
   // Duplicating the interface of vector.  The following member
   // Duplicating the interface of vector.  The following member
   // functions are all const, because they do not reassign the
   // functions are all const, because they do not reassign the
@@ -213,8 +204,6 @@ public:
   // Methods to help out Python and other high-level languages.
   // Methods to help out Python and other high-level languages.
   INLINE const Element &get_element(size_type n) const;
   INLINE const Element &get_element(size_type n) const;
   INLINE void set_element(size_type n, const Element &value);
   INLINE void set_element(size_type n, const Element &value);
-  INLINE const Element &__getitem__(size_type n) const;
-  INLINE void __setitem__(size_type n, const Element &value);
   INLINE string get_data() const;
   INLINE string get_data() const;
   INLINE void set_data(const string &data);
   INLINE void set_data(const string &data);
   INLINE string get_subdata(size_type n, size_type count) const;
   INLINE string get_subdata(size_type n, size_type count) const;
@@ -237,13 +226,6 @@ public:
   INLINE void node_ref() const;
   INLINE void node_ref() const;
   INLINE bool node_unref() const;
   INLINE bool node_unref() const;
 
 
-#ifdef HAVE_PYTHON
-#if PY_VERSION_HEX >= 0x02060000
-  int __getbuffer__(PyObject *self, Py_buffer *view, int flags);
-  void __releasebuffer__(PyObject *self, Py_buffer *view) const;
-#endif
-#endif
-
   // Reassignment is by pointer, not memberwise as with a vector.
   // Reassignment is by pointer, not memberwise as with a vector.
   INLINE PointerToArray<Element> &
   INLINE PointerToArray<Element> &
   operator = (ReferenceCountedVector<Element> *ptr);
   operator = (ReferenceCountedVector<Element> *ptr);
@@ -283,14 +265,12 @@ PUBLISHED:
   INLINE ConstPointerToArray(const PointerToArray<Element> &copy);
   INLINE ConstPointerToArray(const PointerToArray<Element> &copy);
   INLINE ConstPointerToArray(const ConstPointerToArray<Element> &copy);
   INLINE ConstPointerToArray(const ConstPointerToArray<Element> &copy);
 
 
-#ifdef HAVE_PYTHON
-  INLINE ConstPointerToArray(PyObject *self, PyObject *source);
-#endif
+  EXTENSION(ConstPointerToArray(PyObject *self, PyObject *source));
 
 
   typedef TYPENAME pvector<Element>::size_type size_type;
   typedef TYPENAME pvector<Element>::size_type size_type;
   INLINE size_type size() const;
   INLINE size_type size() const;
   INLINE const Element &get_element(size_type n) const;
   INLINE const Element &get_element(size_type n) const;
-  INLINE const Element &__getitem__(size_type n) const;
+  EXTENSION(const Element &__getitem__(size_type n) const);
   INLINE string get_data() const;
   INLINE string get_data() const;
   INLINE string get_subdata(size_type n, size_type count) const;
   INLINE string get_subdata(size_type n, size_type count) const;
   INLINE int get_ref_count() const;
   INLINE int get_ref_count() const;
@@ -298,8 +278,8 @@ PUBLISHED:
 
 
 #ifdef HAVE_PYTHON
 #ifdef HAVE_PYTHON
 #if PY_VERSION_HEX >= 0x02060000
 #if PY_VERSION_HEX >= 0x02060000
-  int __getbuffer__(PyObject *self, Py_buffer *view, int flags) const;
-  void __releasebuffer__(PyObject *self, Py_buffer *view) const;
+  EXTENSION(int __getbuffer__(PyObject *self, Py_buffer *view, int flags) const);
+  EXTENSION(void __releasebuffer__(PyObject *self, Py_buffer *view) const);
 #endif
 #endif
 #endif
 #endif
 
 
@@ -325,10 +305,6 @@ PUBLISHED:
   INLINE ConstPointerToArray(const PointerToArray<Element> &copy);
   INLINE ConstPointerToArray(const PointerToArray<Element> &copy);
   INLINE ConstPointerToArray(const ConstPointerToArray<Element> &copy);
   INLINE ConstPointerToArray(const ConstPointerToArray<Element> &copy);
 
 
-#ifdef HAVE_PYTHON
-  INLINE ConstPointerToArray(PyObject *self, PyObject *source);
-#endif
-
   // Duplicating the interface of vector.
   // Duplicating the interface of vector.
 
 
   INLINE iterator begin() const;
   INLINE iterator begin() const;
@@ -361,7 +337,6 @@ PUBLISHED:
 
 
   // Methods to help out Python and other high-level languages.
   // Methods to help out Python and other high-level languages.
   INLINE const Element &get_element(size_type n) const;
   INLINE const Element &get_element(size_type n) const;
-  INLINE const Element &__getitem__(size_type n) const;
   INLINE string get_data() const;
   INLINE string get_data() const;
   INLINE string get_subdata(size_type n, size_type count) const;
   INLINE string get_subdata(size_type n, size_type count) const;
 
 
@@ -373,13 +348,6 @@ PUBLISHED:
   INLINE void node_ref() const;
   INLINE void node_ref() const;
   INLINE bool node_unref() const;
   INLINE bool node_unref() const;
 
 
-#ifdef HAVE_PYTHON
-#if PY_VERSION_HEX >= 0x02060000
-  int __getbuffer__(PyObject *self, Py_buffer *view, int flags) const;
-  void __releasebuffer__(PyObject *self, Py_buffer *view) const;
-#endif
-#endif
-
   // Reassignment is by pointer, not memberwise as with a vector.
   // Reassignment is by pointer, not memberwise as with a vector.
   INLINE ConstPointerToArray<Element> &
   INLINE ConstPointerToArray<Element> &
   operator = (ReferenceCountedVector<Element> *ptr);
   operator = (ReferenceCountedVector<Element> *ptr);
@@ -408,36 +376,6 @@ private:
 #define PTA(type) PointerToArray< type >
 #define PTA(type) PointerToArray< type >
 #define CPTA(type) ConstPointerToArray< type >
 #define CPTA(type) ConstPointerToArray< type >
 
 
-#ifdef HAVE_PYTHON
-// This macro is used to map a data type to a format code
-// as used in the Python 'struct' and 'array' modules.
-#define get_format_code(type) _get_format_code((const type *)0)
-#define define_format_code(code, type) template<> \
-  INLINE const char *_get_format_code(const type *) { \
-    return code; \
-  }
-
-template<class T>
-INLINE const char *_get_format_code(const T *) {
-  return NULL;
-}
-
-define_format_code("c", char);
-define_format_code("b", signed char);
-define_format_code("B", unsigned char);
-define_format_code("h", short);
-define_format_code("H", unsigned short);
-define_format_code("i", int);
-define_format_code("I", unsigned int);
-define_format_code("l", long);
-define_format_code("L", unsigned long);
-define_format_code("q", long long);
-define_format_code("Q", unsigned long long);
-define_format_code("f", float);
-define_format_code("d", double);
-
-#endif  // HAVE_PYTHON
-
 #include "pointerToArray.I"
 #include "pointerToArray.I"
 
 
 #endif  // HAVE_POINTERTOARRAY_H
 #endif  // HAVE_POINTERTOARRAY_H

+ 326 - 0
panda/src/express/pointerToArray_ext.I

@@ -0,0 +1,326 @@
+// Filename: pointerToArray_ext.I
+// Created by:  rdb (08Feb15)
+//
+////////////////////////////////////////////////////////////////////
+//
+// 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."
+//
+////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////
+//     Function: PointerToArray::__init__
+//       Access: Published
+//  Description: This special constructor accepts a Python list of
+//               elements, or a Python string (or a bytes object,
+//               in Python 3), or any object that supports the
+//               Python buffer protocol.
+////////////////////////////////////////////////////////////////////
+template<class Element>
+void Extension<PointerToArray<Element> >::
+__init__(PyObject *self, PyObject *source) {
+  // We have to pre-initialize self's "this" pointer when we receive
+  // self in the constructor--the caller can't initialize this for us.
+  new (this->_this) PointerToArray<Element>(get_type_handle(Element));
+  ((Dtool_PyInstDef *)self)->_ptr_to_object = this->_this;
+
+#if PY_VERSION_HEX >= 0x02060000
+  if (PyObject_CheckBuffer(source)) {
+    // User passed a buffer object.
+    Py_buffer view;
+    if (PyObject_GetBuffer(source, &view, PyBUF_CONTIG_RO) == -1) {
+      PyErr_SetString(PyExc_TypeError, "PointerToArray constructor requires a contiguous buffer");
+      return;
+    }
+
+    if (view.itemsize != 1 && view.itemsize != sizeof(Element)) {
+      PyErr_SetString(PyExc_TypeError, "buffer.itemsize does not match PointerToArray element size");
+      return;
+    }
+
+    int num_elements = view.len / sizeof(Element);
+    this->_this->insert(this->_this->begin(), num_elements, Element());
+
+    if (view.len > 0) {
+      memcpy(this->_this->p(), view.buf, view.len);
+    }
+
+    PyBuffer_Release(&view);
+    return;
+  }
+#endif
+
+  if (!PySequence_Check(source)) {
+    // If passed with a non-sequence, this isn't the right constructor.
+    PyErr_SetString(PyExc_TypeError, "PointerToArray constructor requires a sequence or buffer object");
+    return;
+  }
+
+  // If we were passed a Python string, then instead of storing it
+  // character-at-a-time, just load the whole string as a data
+  // buffer.
+#if PY_MAJOR_VERSION >= 3
+  if (PyBytes_Check(source)) {
+    int size = PyBytes_Size(source);
+    if (size % sizeof(Element) != 0) {
+      ostringstream stream;
+      stream << "Buffer not a multiple of " << sizeof(Element) << " bytes";
+      string str = stream.str();
+      PyErr_SetString(PyExc_ValueError, str.c_str());
+      return;
+    }
+
+    int num_elements = size / sizeof(Element);
+    this->_this->insert(this->_this->begin(), num_elements, Element());
+
+    // Hope there aren't any constructors or destructors involved
+    // here.
+    if (size != 0) {
+      const char *data = PyBytes_AsString(source);
+      memcpy(this->_this->p(), data, size);
+    }
+    return;
+  }
+#else
+  if (PyString_CheckExact(source)) {
+    int size = PyString_Size(source);
+    if (size % sizeof(Element) != 0) {
+      ostringstream stream;
+      stream << "Buffer not a multiple of " << sizeof(Element) << " bytes";
+      string str = stream.str();
+      PyErr_SetString(PyExc_ValueError, str.c_str());
+      return;
+    }
+
+    int num_elements = size / sizeof(Element);
+    this->_this->insert(this->_this->begin(), num_elements, Element());
+
+    // Hope there aren't any constructors or destructors involved
+    // here.
+    if (size != 0) {
+      const char *data = PyString_AsString(source);
+      memcpy(this->_this->p(), data, size);
+    }
+    return;
+  }
+#endif
+
+  // Now construct the internal list by copying the elements
+  // one-at-a-time from Python.
+  int size = PySequence_Size(source);
+  for (int i = 0; i < size; ++i) {
+    PyObject *item = PySequence_GetItem(source, i);
+    if (item == NULL) {
+      return;
+    }
+    PyObject *result = PyObject_CallMethod(self, (char *)"push_back", (char *)"O", item);
+    Py_DECREF(item);
+    if (result == NULL) {
+      // Unable to add item--probably it wasn't of the appropriate type.
+      ostringstream stream;
+      stream << "Element " << i << " in sequence passed to PointerToArray constructor could not be added";
+      string str = stream.str();
+      PyErr_SetString(PyExc_TypeError, str.c_str());
+      return;
+    }
+    Py_DECREF(result);
+  }
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: PointerToArray::__getitem__
+//       Access: Published
+//  Description: Same as get_element(), this returns the nth element
+//               of the array.
+////////////////////////////////////////////////////////////////////
+template<class Element>
+INLINE const Element &Extension<PointerToArray<Element> >::
+__getitem__(size_t n) const {
+  return this->_this->get_element(n);
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: PointerToArray::__setitem__
+//       Access: Published
+//  Description: Same as set_element(), this replaces the nth element
+//               of the array.
+////////////////////////////////////////////////////////////////////
+template<class Element>
+INLINE void Extension<PointerToArray<Element> >::
+__setitem__(size_t n, const Element &value) {
+  this->_this->set_element(n, value);
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: ConstPointerToArray::__init__
+//       Access: Public
+//  Description: This special constructor accepts a Python list of
+//               elements, or a Python string (or a bytes object,
+//               in Python 3).
+////////////////////////////////////////////////////////////////////
+template<class Element>
+INLINE void Extension<ConstPointerToArray<Element> >::
+__init__(PyObject *self, PyObject *source) {
+  new (this->_this) ConstPointerToArray<Element>(get_type_handle(Element));
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: ConstPointerToArray::__getitem__
+//       Access: Published
+//  Description: Same as get_element(), this returns the nth element
+//               of the array.
+////////////////////////////////////////////////////////////////////
+template<class Element>
+INLINE const Element &Extension<ConstPointerToArray<Element> >::
+__getitem__(size_t n) const {
+  return (*this->_this)[n];
+}
+
+#if PY_VERSION_HEX >= 0x02060000
+////////////////////////////////////////////////////////////////////
+//     Function: PointerToArray::__getbuffer__
+//       Access: Published
+//  Description: This is used to implement the buffer protocol, in
+//               order to allow efficient access to the array data
+//               through a Python multiview object.
+////////////////////////////////////////////////////////////////////
+template<class Element>
+INLINE int Extension<PointerToArray<Element> >::
+__getbuffer__(PyObject *self, Py_buffer *view, int flags) {
+
+  const char *format = get_format_code(Element);
+  if (format == NULL) {
+    // Not supported.
+    return -1;
+  }
+
+  if (self != NULL) {
+    Py_INCREF(self);
+  }
+  view->obj = self;
+  view->buf = (void*) this->_this->p();
+  view->len = this->_this->size() * sizeof(Element);
+  view->readonly = 0;
+  view->itemsize = sizeof(Element);
+  view->format = NULL;
+  if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
+    view->format = (char*) format;
+  }
+  view->ndim = 1;
+  view->shape = NULL;
+  if ((flags & PyBUF_ND) == PyBUF_ND) {
+    // This leaks, which sucks, but __releasebuffer__ doesn't give us
+    // the same pointer, so we would need to store it elsewhere if we
+    // wanted to delete it there.  Eh, it's just an int, who cares.
+    view->shape = new Py_ssize_t(this->_this->size());
+  }
+  view->strides = NULL;
+  if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES) {
+    view->strides = &(view->itemsize);
+  }
+  view->suboffsets = NULL;
+
+  // Store a reference to ourselves on the Py_buffer object
+  // as a reminder that we have increased our refcount.
+  this->_this->ref();
+  view->internal = (void*) this->_this;
+
+  return 0;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: PointerToArray::__releasebuffer__
+//       Access: Published
+//  Description: Releases the buffer allocated by __getbuffer__.
+////////////////////////////////////////////////////////////////////
+template<class Element>
+INLINE void Extension<PointerToArray<Element> >::
+__releasebuffer__(PyObject *self, Py_buffer *view) const {
+  // Note: PyBuffer_Release automatically decrements view->obj.
+
+  if (view->internal != NULL) {
+    // Oh, right, let's not forget to unref this.
+    ((const PointerToArray<Element> *) view->internal)->unref();
+    view->internal = NULL;
+  }
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: ConstPointerToArray::__getbuffer__
+//       Access: Published
+//  Description: This is used to implement the buffer protocol, in
+//               order to allow efficient access to the array data
+//               through a Python multiview object.
+////////////////////////////////////////////////////////////////////
+template<class Element>
+INLINE int Extension<ConstPointerToArray<Element> >::
+__getbuffer__(PyObject *self, Py_buffer *view, int flags) const {
+
+  if ((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) {
+    PyErr_SetString(PyExc_BufferError,
+                    "Object is not writable.");
+    return -1;
+  }
+
+  const char *format = get_format_code(Element);
+  if (format == NULL) {
+    // Not supported.
+    return -1;
+  }
+
+  if (self != NULL) {
+    Py_INCREF(self);
+  }
+  view->obj = self;
+  view->buf = (void*) this->_this->p();
+  view->len = this->_this->size() * sizeof(Element);
+  view->readonly = 1;
+  view->itemsize = sizeof(Element);
+  view->format = NULL;
+  if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
+    view->format = (char*) format;
+  }
+  view->ndim = 1;
+  view->shape = NULL;
+  if ((flags & PyBUF_ND) == PyBUF_ND) {
+    // This leaks, which sucks, but __releasebuffer__ doesn't give us
+    // the same pointer, so we would need to store it elsewhere if we
+    // wanted to delete it there.  Eh, it's just an int, who cares.
+    view->shape = new Py_ssize_t(this->_this->size());
+  }
+  view->strides = NULL;
+  if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES) {
+    view->strides = &(view->itemsize);
+  }
+  view->suboffsets = NULL;
+
+  // Store a reference to ourselves on the Py_buffer object
+  // as a reminder that we have increased our refcount.
+  this->_this->ref();
+  view->internal = (void*) this->_this;
+
+  return 0;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: ConstPointerToArray::__releasebuffer__
+//       Access: Published
+//  Description: Releases the buffer allocated by __getbuffer__.
+////////////////////////////////////////////////////////////////////
+template<class Element>
+INLINE void Extension<ConstPointerToArray<Element> >::
+__releasebuffer__(PyObject *self, Py_buffer *view) const {
+  // Note: PyBuffer_Release automatically decrements obj->view.
+
+  if (view->internal != NULL) {
+    // Oh, right, let's not forget to unref this.
+    ((const PointerToArray<Element> *) view->internal)->unref();
+    view->internal = NULL;
+  }
+}
+#endif  // PY_VERSION_HEX

+ 100 - 0
panda/src/express/pointerToArray_ext.h

@@ -0,0 +1,100 @@
+// Filename: pointerToArray_ext.h
+// Created by:  rdb (08Feb15)
+//
+////////////////////////////////////////////////////////////////////
+//
+// 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."
+//
+////////////////////////////////////////////////////////////////////
+
+#ifndef POINTERTOARRAY_EXT_H
+#define POINTERTOARRAY_EXT_H
+
+#ifndef CPPPARSER
+
+#include "extension.h"
+#include "py_panda.h"
+#include "pointerToArray.h"
+
+////////////////////////////////////////////////////////////////////
+//       Class : Extension<PointerToArray>
+// Description : This class defines the extension methods for
+//               PointerToArray, which are called instead of
+//               any C++ methods with the same prototype.
+//
+//               This is a little bit awkward because of the nested
+//               templating, but it does the job.
+////////////////////////////////////////////////////////////////////
+template<class Element>
+class Extension<PointerToArray<Element> > : public ExtensionBase<PointerToArray<Element> > {
+public:
+  INLINE void __init__(PyObject *self, PyObject *source);
+
+  INLINE const Element &__getitem__(size_t n) const;
+  INLINE void __setitem__(size_t n, const Element &value);
+
+#if PY_VERSION_HEX >= 0x02060000
+  INLINE int __getbuffer__(PyObject *self, Py_buffer *view, int flags);
+  INLINE void __releasebuffer__(PyObject *self, Py_buffer *view) const;
+#endif
+};
+
+////////////////////////////////////////////////////////////////////
+//       Class : Extension<ConstPointerToArray>
+// Description : This class defines the extension methods for
+//               ConstPointerToArray, which are called instead of
+//               any C++ methods with the same prototype.
+//
+//               This is a little bit awkward because of the nested
+//               templating, but it does the job.
+////////////////////////////////////////////////////////////////////
+template<class Element>
+class Extension<ConstPointerToArray<Element> > : public ExtensionBase<ConstPointerToArray<Element> > {
+public:
+  INLINE void __init__(PyObject *self, PyObject *source);
+
+  INLINE const Element &__getitem__(size_t n) const;
+
+#if PY_VERSION_HEX >= 0x02060000
+  INLINE int __getbuffer__(PyObject *self, Py_buffer *view, int flags) const;
+  INLINE void __releasebuffer__(PyObject *self, Py_buffer *view) const;
+#endif
+};
+
+// This macro is used to map a data type to a format code
+// as used in the Python 'struct' and 'array' modules.
+#define get_format_code(type) _get_format_code((const type *)0)
+#define define_format_code(code, type) template<> \
+  INLINE const char *_get_format_code(const type *) { \
+    return code; \
+  }
+
+template<class T>
+INLINE const char *_get_format_code(const T *) {
+  return NULL;
+}
+
+define_format_code("c", char);
+define_format_code("b", signed char);
+define_format_code("B", unsigned char);
+define_format_code("h", short);
+define_format_code("H", unsigned short);
+define_format_code("i", int);
+define_format_code("I", unsigned int);
+define_format_code("l", long);
+define_format_code("L", unsigned long);
+define_format_code("q", long long);
+define_format_code("Q", unsigned long long);
+define_format_code("f", float);
+define_format_code("d", double);
+
+#include "pointerToArray_ext.I"
+
+#endif  // CPPPARSER
+
+#endif  // HAVE_POINTERTOARRAY_EXT_H

+ 2 - 1
panda/src/express/virtualFileSystem_ext.cxx

@@ -13,6 +13,7 @@
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
 #include "virtualFileSystem_ext.h"
 #include "virtualFileSystem_ext.h"
+#include "vector_uchar.h"
 
 
 #ifdef HAVE_PYTHON
 #ifdef HAVE_PYTHON
 
 
@@ -30,7 +31,7 @@
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 PyObject *Extension<VirtualFileSystem>::
 PyObject *Extension<VirtualFileSystem>::
 read_file(const Filename &filename, bool auto_unwrap) const {
 read_file(const Filename &filename, bool auto_unwrap) const {
-  pvector<unsigned char> pv;
+  vector_uchar pv;
   bool okflag = _this->read_file(filename, pv, auto_unwrap);
   bool okflag = _this->read_file(filename, pv, auto_unwrap);
   nassertr(okflag, NULL);
   nassertr(okflag, NULL);
 
 

+ 3 - 3
panda/src/gobj/vertexDataPage.h

@@ -114,7 +114,7 @@ private:
   typedef pdeque<VertexDataPage *> PendingPages;
   typedef pdeque<VertexDataPage *> PendingPages;
 
 
   class PageThreadManager;
   class PageThreadManager;
-  class PageThread : public Thread {
+  class EXPCL_PANDA_GOBJ PageThread : public Thread {
   public:
   public:
     PageThread(PageThreadManager *manager, const string &name);
     PageThread(PageThreadManager *manager, const string &name);
 
 
@@ -132,7 +132,7 @@ private:
   };
   };
   typedef pvector<PT(PageThread) > PageThreads;
   typedef pvector<PT(PageThread) > PageThreads;
 
 
-  class PageThreadManager : public ReferenceCount {
+  class EXPCL_PANDA_GOBJ PageThreadManager : public ReferenceCount {
   public:
   public:
     PageThreadManager(int num_threads);
     PageThreadManager(int num_threads);
     void add_page(VertexDataPage *page, RamClass ram_class);
     void add_page(VertexDataPage *page, RamClass ram_class);
@@ -176,7 +176,7 @@ private:
 
 
   // We build up a temporary linked list of these while deflating
   // We build up a temporary linked list of these while deflating
   // (compressing) the vertex data in-memory.
   // (compressing) the vertex data in-memory.
-  class DeflatePage {
+  class EXPCL_PANDA_GOBJ DeflatePage {
   public:
   public:
     DeflatePage() {
     DeflatePage() {
       _used_size = 0;
       _used_size = 0;

+ 6 - 6
panda/src/linmath/lpoint2_ext_src.I

@@ -12,12 +12,6 @@
 //
 //
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
-#ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint2);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint3);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint4);
-#endif
-
 #ifdef FLOATTYPE_IS_INT
 #ifdef FLOATTYPE_IS_INT
 #if PY_MAJOR_VERSION >= 3
 #if PY_MAJOR_VERSION >= 3
 #define PY_FROM_FLOATTYPE PyLong_FromLong
 #define PY_FROM_FLOATTYPE PyLong_FromLong
@@ -47,6 +41,12 @@ python_repr(ostream &out, const string &class_name) const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LPoint2)>::
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LPoint2)>::
 __getattr__(const string &attr_name) const {
 __getattr__(const string &attr_name) const {
+#ifndef CPPPARSER
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint2);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint3);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint4);
+#endif
+
   // Validate the attribute name.
   // Validate the attribute name.
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
     if (*it != 'x' && *it != 'y') {
     if (*it != 'x' && *it != 'y') {

+ 6 - 6
panda/src/linmath/lpoint3_ext_src.I

@@ -12,12 +12,6 @@
 //
 //
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
-#ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint2);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint3);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint4);
-#endif
-
 #ifdef FLOATTYPE_IS_INT
 #ifdef FLOATTYPE_IS_INT
 #if PY_MAJOR_VERSION >= 3
 #if PY_MAJOR_VERSION >= 3
 #define PY_FROM_FLOATTYPE PyLong_FromLong
 #define PY_FROM_FLOATTYPE PyLong_FromLong
@@ -48,6 +42,12 @@ python_repr(ostream &out, const string &class_name) const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LPoint3)>::
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LPoint3)>::
 __getattr__(const string &attr_name) const {
 __getattr__(const string &attr_name) const {
+#ifndef CPPPARSER
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint2);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint3);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint4);
+#endif
+
   // Validate the attribute name.
   // Validate the attribute name.
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
     if (*it < 'x' || *it > 'z') {
     if (*it < 'x' || *it > 'z') {

+ 6 - 6
panda/src/linmath/lpoint4_ext_src.I

@@ -12,12 +12,6 @@
 //
 //
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
-#ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint2);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint3);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint4);
-#endif
-
 #ifdef FLOATTYPE_IS_INT
 #ifdef FLOATTYPE_IS_INT
 #if PY_MAJOR_VERSION >= 3
 #if PY_MAJOR_VERSION >= 3
 #define PY_FROM_FLOATTYPE PyLong_FromLong
 #define PY_FROM_FLOATTYPE PyLong_FromLong
@@ -49,6 +43,12 @@ python_repr(ostream &out, const string &class_name) const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LPoint4)>::
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LPoint4)>::
 __getattr__(const string &attr_name) const {
 __getattr__(const string &attr_name) const {
+#ifndef CPPPARSER
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint2);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint3);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LPoint4);
+#endif
+
   // Validate the attribute name.
   // Validate the attribute name.
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
     if (*it < 'w' || *it > 'z') {
     if (*it < 'w' || *it > 'z') {

+ 6 - 7
panda/src/linmath/lvecBase2_ext_src.I

@@ -12,13 +12,6 @@
 //
 //
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
-
-#ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase2);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase3);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase4);
-#endif
-
 #ifdef FLOATTYPE_IS_INT
 #ifdef FLOATTYPE_IS_INT
 #if PY_MAJOR_VERSION >= 3
 #if PY_MAJOR_VERSION >= 3
 #define PYNUMBER_FLOATTYPE PyNumber_Long
 #define PYNUMBER_FLOATTYPE PyNumber_Long
@@ -97,6 +90,12 @@ __reduce__(PyObject *self) const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LVecBase2)>::
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LVecBase2)>::
 __getattr__(const string &attr_name) const {
 __getattr__(const string &attr_name) const {
+#ifndef CPPPARSER
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase2);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase3);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase4);
+#endif
+
   // Validate the attribute name.
   // Validate the attribute name.
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
     if (*it != 'x' && *it != 'y') {
     if (*it != 'x' && *it != 'y') {

+ 6 - 7
panda/src/linmath/lvecBase3_ext_src.I

@@ -12,13 +12,6 @@
 //
 //
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
-
-#ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase2);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase3);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase4);
-#endif
-
 #ifdef FLOATTYPE_IS_INT
 #ifdef FLOATTYPE_IS_INT
 #if PY_MAJOR_VERSION >= 3
 #if PY_MAJOR_VERSION >= 3
 #define PYNUMBER_FLOATTYPE PyNumber_Long
 #define PYNUMBER_FLOATTYPE PyNumber_Long
@@ -98,6 +91,12 @@ __reduce__(PyObject *self) const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LVecBase3)>::
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LVecBase3)>::
 __getattr__(const string &attr_name) const {
 __getattr__(const string &attr_name) const {
+#ifndef CPPPARSER
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase2);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase3);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase4);
+#endif
+
   // Validate the attribute name.
   // Validate the attribute name.
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
     if (*it < 'x' || *it > 'z') {
     if (*it < 'x' || *it > 'z') {

+ 6 - 7
panda/src/linmath/lvecBase4_ext_src.I

@@ -12,13 +12,6 @@
 //
 //
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
-
-#ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase2);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase3);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase4);
-#endif
-
 #ifdef FLOATTYPE_IS_INT
 #ifdef FLOATTYPE_IS_INT
 #if PY_MAJOR_VERSION >= 3
 #if PY_MAJOR_VERSION >= 3
 #define PYNUMBER_FLOATTYPE PyNumber_Long
 #define PYNUMBER_FLOATTYPE PyNumber_Long
@@ -99,6 +92,12 @@ __reduce__(PyObject *self) const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LVecBase4)>::
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LVecBase4)>::
 __getattr__(const string &attr_name) const {
 __getattr__(const string &attr_name) const {
+#ifndef CPPPARSER
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase2);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase3);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVecBase4);
+#endif
+
   // Validate the attribute name.
   // Validate the attribute name.
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
     if (*it < 'w' || *it > 'z') {
     if (*it < 'w' || *it > 'z') {

+ 6 - 6
panda/src/linmath/lvector2_ext_src.I

@@ -12,12 +12,6 @@
 //
 //
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
-#ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector2);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector3);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector4);
-#endif
-
 #ifdef FLOATTYPE_IS_INT
 #ifdef FLOATTYPE_IS_INT
 #if PY_MAJOR_VERSION >= 3
 #if PY_MAJOR_VERSION >= 3
 #define PY_FROM_FLOATTYPE PyLong_FromLong
 #define PY_FROM_FLOATTYPE PyLong_FromLong
@@ -47,6 +41,12 @@ python_repr(ostream &out, const string &class_name) const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LVector2)>::
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LVector2)>::
 __getattr__(const string &attr_name) const {
 __getattr__(const string &attr_name) const {
+#ifndef CPPPARSER
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector2);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector3);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector4);
+#endif
+
   // Validate the attribute name.
   // Validate the attribute name.
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
     if (*it != 'x' && *it != 'y') {
     if (*it != 'x' && *it != 'y') {

+ 6 - 6
panda/src/linmath/lvector3_ext_src.I

@@ -12,12 +12,6 @@
 //
 //
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
-#ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector2);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector3);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector4);
-#endif
-
 #ifdef FLOATTYPE_IS_INT
 #ifdef FLOATTYPE_IS_INT
 #if PY_MAJOR_VERSION >= 3
 #if PY_MAJOR_VERSION >= 3
 #define PY_FROM_FLOATTYPE PyLong_FromLong
 #define PY_FROM_FLOATTYPE PyLong_FromLong
@@ -48,6 +42,12 @@ python_repr(ostream &out, const string &class_name) const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LVector3)>::
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LVector3)>::
 __getattr__(const string &attr_name) const {
 __getattr__(const string &attr_name) const {
+#ifndef CPPPARSER
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector2);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector3);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector4);
+#endif
+
   // Validate the attribute name.
   // Validate the attribute name.
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
     if (*it < 'x' || *it > 'z') {
     if (*it < 'x' || *it > 'z') {

+ 6 - 6
panda/src/linmath/lvector4_ext_src.I

@@ -12,12 +12,6 @@
 //
 //
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
-#ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector2);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector3);
-IMPORT_THIS struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector4);
-#endif
-
 #ifdef FLOATTYPE_IS_INT
 #ifdef FLOATTYPE_IS_INT
 #if PY_MAJOR_VERSION >= 3
 #if PY_MAJOR_VERSION >= 3
 #define PY_FROM_FLOATTYPE PyLong_FromLong
 #define PY_FROM_FLOATTYPE PyLong_FromLong
@@ -49,6 +43,12 @@ python_repr(ostream &out, const string &class_name) const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LVector4)>::
 INLINE_LINMATH PyObject *Extension<FLOATNAME(LVector4)>::
 __getattr__(const string &attr_name) const {
 __getattr__(const string &attr_name) const {
+#ifndef CPPPARSER
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector2);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector3);
+  extern struct Dtool_PyTypedObject FLOATNAME(Dtool_LVector4);
+#endif
+
   // Validate the attribute name.
   // Validate the attribute name.
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
   for (string::const_iterator it = attr_name.begin(); it < attr_name.end(); it++) {
     if (*it < 'w' || *it > 'z') {
     if (*it < 'w' || *it > 'z') {

+ 2 - 0
panda/src/mathutil/config_mathutil.N

@@ -66,3 +66,5 @@ forcetype PointerToBase<ReferenceCountedVector<LVecBase2i> >
 forcetype PointerToArrayBase<LVecBase2i>
 forcetype PointerToArrayBase<LVecBase2i>
 forcetype PTA_LVecBase2i
 forcetype PTA_LVecBase2i
 forcetype CPTA_LVecBase2i
 forcetype CPTA_LVecBase2i
+
+forceinclude "pointerToArray_ext.h"

+ 1 - 1
panda/src/net/connectionManager.h

@@ -67,7 +67,7 @@ PUBLISHED:
 
 
   static string get_host_name();
   static string get_host_name();
 
 
-  class Interface {
+  class EXPCL_PANDA_NET Interface {
   PUBLISHED:
   PUBLISHED:
     const string &get_name() const { return _name; }
     const string &get_name() const { return _name; }
     const string &get_mac_address() const { return _mac_address; }
     const string &get_mac_address() const { return _mac_address; }

+ 13 - 13
panda/src/ode/odeGeom_ext.cxx

@@ -31,19 +31,19 @@
 #ifdef HAVE_PYTHON
 #ifdef HAVE_PYTHON
 
 
 #ifndef CPPPARSER
 #ifndef CPPPARSER
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeBoxGeom;
-//extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeConvexGeom;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeGeom;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeHashSpace;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeCappedCylinderGeom;
-//extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeHeightfieldGeom;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdePlaneGeom;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeQuadTreeSpace;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeRayGeom;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeSimpleSpace;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeSpace;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeSphereGeom;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeTriMeshGeom;
+extern Dtool_PyTypedObject Dtool_OdeBoxGeom;
+//extern Dtool_PyTypedObject Dtool_OdeConvexGeom;
+extern Dtool_PyTypedObject Dtool_OdeGeom;
+extern Dtool_PyTypedObject Dtool_OdeHashSpace;
+extern Dtool_PyTypedObject Dtool_OdeCappedCylinderGeom;
+//extern Dtool_PyTypedObject Dtool_OdeHeightfieldGeom;
+extern Dtool_PyTypedObject Dtool_OdePlaneGeom;
+extern Dtool_PyTypedObject Dtool_OdeQuadTreeSpace;
+extern Dtool_PyTypedObject Dtool_OdeRayGeom;
+extern Dtool_PyTypedObject Dtool_OdeSimpleSpace;
+extern Dtool_PyTypedObject Dtool_OdeSpace;
+extern Dtool_PyTypedObject Dtool_OdeSphereGeom;
+extern Dtool_PyTypedObject Dtool_OdeTriMeshGeom;
 #endif
 #endif
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////

+ 12 - 12
panda/src/ode/odeJoint_ext.cxx

@@ -30,18 +30,18 @@
 #include "odePlane2dJoint.h"
 #include "odePlane2dJoint.h"
 
 
 #ifndef CPPPARSER
 #ifndef CPPPARSER
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeJoint;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeBallJoint;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeHingeJoint;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeSliderJoint;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeContactJoint;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeUniversalJoint;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeHinge2Joint;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeFixedJoint;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeNullJoint;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeAMotorJoint;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeLMotorJoint;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdePlane2dJoint;
+extern Dtool_PyTypedObject Dtool_OdeJoint;
+extern Dtool_PyTypedObject Dtool_OdeBallJoint;
+extern Dtool_PyTypedObject Dtool_OdeHingeJoint;
+extern Dtool_PyTypedObject Dtool_OdeSliderJoint;
+extern Dtool_PyTypedObject Dtool_OdeContactJoint;
+extern Dtool_PyTypedObject Dtool_OdeUniversalJoint;
+extern Dtool_PyTypedObject Dtool_OdeHinge2Joint;
+extern Dtool_PyTypedObject Dtool_OdeFixedJoint;
+extern Dtool_PyTypedObject Dtool_OdeNullJoint;
+extern Dtool_PyTypedObject Dtool_OdeAMotorJoint;
+extern Dtool_PyTypedObject Dtool_OdeLMotorJoint;
+extern Dtool_PyTypedObject Dtool_OdePlane2dJoint;
 #endif
 #endif
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////

+ 4 - 4
panda/src/ode/odeSpace_ext.cxx

@@ -24,10 +24,10 @@
 #include "odeQuadTreeSpace.h"
 #include "odeQuadTreeSpace.h"
 
 
 #ifndef CPPPARSER
 #ifndef CPPPARSER
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeHashSpace;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeSimpleSpace;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeSpace;
-extern EXPCL_PANDAODE Dtool_PyTypedObject Dtool_OdeQuadTreeSpace;
+extern Dtool_PyTypedObject Dtool_OdeHashSpace;
+extern Dtool_PyTypedObject Dtool_OdeSimpleSpace;
+extern Dtool_PyTypedObject Dtool_OdeSpace;
+extern Dtool_PyTypedObject Dtool_OdeQuadTreeSpace;
 #endif
 #endif
 
 
 PyObject *Extension<OdeSpace>::_python_callback = NULL;
 PyObject *Extension<OdeSpace>::_python_callback = NULL;

+ 1 - 1
panda/src/parametrics/curveFitter.h

@@ -32,7 +32,7 @@ class NurbsCurve;
 //       Class : CurveFitter
 //       Class : CurveFitter
 // Description :
 // Description :
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-class CurveFitter {
+class EXPCL_PANDA_GOBJ CurveFitter {
 PUBLISHED:
 PUBLISHED:
   CurveFitter();
   CurveFitter();
   ~CurveFitter();
   ~CurveFitter();

+ 2 - 2
panda/src/parametrics/hermiteCurve.h

@@ -49,7 +49,7 @@ END_PUBLISH //]
 // Description : A single CV of a Hermite curve.  Hermite curve CV's
 // Description : A single CV of a Hermite curve.  Hermite curve CV's
 //               include an in and out tangent, as well as a position.
 //               include an in and out tangent, as well as a position.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-class HermiteCurveCV {
+class EXPCL_PANDA_PARAMETRICS HermiteCurveCV {
 public:
 public:
   HermiteCurveCV();
   HermiteCurveCV();
   HermiteCurveCV(const HermiteCurveCV &c);
   HermiteCurveCV(const HermiteCurveCV &c);
@@ -85,7 +85,7 @@ public:
 //               list of the CV's that are used to define the curve
 //               list of the CV's that are used to define the curve
 //               (since the CubicCurveseg class doesn't retain these).
 //               (since the CubicCurveseg class doesn't retain these).
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-class HermiteCurve : public PiecewiseCurve {
+class EXPCL_PANDA_PARAMETRICS HermiteCurve : public PiecewiseCurve {
 PUBLISHED:
 PUBLISHED:
   HermiteCurve();
   HermiteCurve();
   HermiteCurve(const ParametricCurve &pc);
   HermiteCurve(const ParametricCurve &pc);

+ 2 - 2
panda/src/pgraph/Sources.pp

@@ -73,7 +73,7 @@
     nodePath.I nodePath.h nodePath.cxx \
     nodePath.I nodePath.h nodePath.cxx \
     nodePath_ext.I nodePath_ext.h \
     nodePath_ext.I nodePath_ext.h \
     nodePathCollection.I nodePathCollection.h \
     nodePathCollection.I nodePathCollection.h \
-    nodePathCollection_ext.I nodePathCollection_ext.h \
+    nodePathCollection_ext.h \
     nodePathComponent.I nodePathComponent.h \
     nodePathComponent.I nodePathComponent.h \
     occluderEffect.I occluderEffect.h \
     occluderEffect.I occluderEffect.h \
     occluderNode.I occluderNode.h \
     occluderNode.I occluderNode.h \
@@ -112,7 +112,7 @@
     weakNodePath.I weakNodePath.h \
     weakNodePath.I weakNodePath.h \
     workingNodePath.I workingNodePath.h \
     workingNodePath.I workingNodePath.h \
     nodePath_ext.h nodePath_ext.I \
     nodePath_ext.h nodePath_ext.I \
-    nodePathCollection_ext.h nodePathCollection_ext.I \
+    nodePathCollection_ext.h \
     pandaNode_ext.h \
     pandaNode_ext.h \
     renderState_ext.h \
     renderState_ext.h \
     transformState_ext.h
     transformState_ext.h

+ 0 - 51
panda/src/pgraph/nodePathCollection_ext.I

@@ -1,51 +0,0 @@
-// Filename: nodePathCollection_ext.I
-// Created by:  rdb (09Dec13)
-//
-////////////////////////////////////////////////////////////////////
-//
-// 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."
-//
-////////////////////////////////////////////////////////////////////
-
-#ifndef CPPPARSER
-#ifdef STDFLOAT_DOUBLE
-IMPORT_THIS struct Dtool_PyTypedObject Dtool_LPoint3d;
-#else
-IMPORT_THIS struct Dtool_PyTypedObject Dtool_LPoint3f;
-#endif
-#endif
-
-////////////////////////////////////////////////////////////////////
-//     Function: Extension<NodePathCollection>::get_tight_bounds
-//       Access: Published
-//  Description: Returns the tight bounds as a 2-tuple of LPoint3
-//               objects.  This is a convenience function for Python
-//               users, among which the use of calc_tight_bounds
-//               may be confusing.
-//               Returns None if calc_tight_bounds returned false.
-////////////////////////////////////////////////////////////////////
-INLINE PyObject *Extension<NodePathCollection>::
-get_tight_bounds() const {
-  LPoint3 *min_point = new LPoint3;
-  LPoint3 *max_point = new LPoint3;
-
-  if (_this->calc_tight_bounds(*min_point, *max_point)) {
-#ifdef STDFLOAT_DOUBLE
-    PyObject *min_inst = DTool_CreatePyInstance((void*) min_point, Dtool_LPoint3d, true, false);
-    PyObject *max_inst = DTool_CreatePyInstance((void*) max_point, Dtool_LPoint3d, true, false);
-#else
-    PyObject *min_inst = DTool_CreatePyInstance((void*) min_point, Dtool_LPoint3f, true, false);
-    PyObject *max_inst = DTool_CreatePyInstance((void*) max_point, Dtool_LPoint3f, true, false);
-#endif
-    return Py_BuildValue("NN", min_inst, max_inst);
-
-  } else {
-    Py_INCREF(Py_None);
-    return Py_None;
-  }
-}

+ 38 - 0
panda/src/pgraph/nodePathCollection_ext.cxx

@@ -16,6 +16,14 @@
 
 
 #ifdef HAVE_PYTHON
 #ifdef HAVE_PYTHON
 
 
+#ifndef CPPPARSER
+#ifdef STDFLOAT_DOUBLE
+extern struct Dtool_PyTypedObject Dtool_LPoint3d;
+#else
+extern struct Dtool_PyTypedObject Dtool_LPoint3f;
+#endif
+#endif
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: NodePathCollection::__reduce__
 //     Function: NodePathCollection::__reduce__
 //       Access: Published
 //       Access: Published
@@ -45,4 +53,34 @@ __reduce__(PyObject *self) const {
   return result;
   return result;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: Extension<NodePathCollection>::get_tight_bounds
+//       Access: Published
+//  Description: Returns the tight bounds as a 2-tuple of LPoint3
+//               objects.  This is a convenience function for Python
+//               users, among which the use of calc_tight_bounds
+//               may be confusing.
+//               Returns None if calc_tight_bounds returned false.
+////////////////////////////////////////////////////////////////////
+PyObject *Extension<NodePathCollection>::
+get_tight_bounds() const {
+  LPoint3 *min_point = new LPoint3;
+  LPoint3 *max_point = new LPoint3;
+
+  if (_this->calc_tight_bounds(*min_point, *max_point)) {
+#ifdef STDFLOAT_DOUBLE
+    PyObject *min_inst = DTool_CreatePyInstance((void*) min_point, Dtool_LPoint3d, true, false);
+    PyObject *max_inst = DTool_CreatePyInstance((void*) max_point, Dtool_LPoint3d, true, false);
+#else
+    PyObject *min_inst = DTool_CreatePyInstance((void*) min_point, Dtool_LPoint3f, true, false);
+    PyObject *max_inst = DTool_CreatePyInstance((void*) max_point, Dtool_LPoint3f, true, false);
+#endif
+    return Py_BuildValue("NN", min_inst, max_inst);
+
+  } else {
+    Py_INCREF(Py_None);
+    return Py_None;
+  }
+}
+
 #endif
 #endif

+ 1 - 3
panda/src/pgraph/nodePathCollection_ext.h

@@ -34,11 +34,9 @@ class Extension<NodePathCollection> : public ExtensionBase<NodePathCollection> {
 public:
 public:
   PyObject *__reduce__(PyObject *self) const;
   PyObject *__reduce__(PyObject *self) const;
 
 
-  INLINE PyObject *get_tight_bounds() const;
+  PyObject *get_tight_bounds() const;
 };
 };
 
 
-#include "nodePathCollection_ext.I"
-
 #endif  // HAVE_PYTHON
 #endif  // HAVE_PYTHON
 
 
 #endif  // NODEPATHCOLLECTION_EXT_H
 #endif  // NODEPATHCOLLECTION_EXT_H

+ 0 - 38
panda/src/pgraph/nodePath_ext.I

@@ -14,14 +14,6 @@
 
 
 #include "pandaNode_ext.h"
 #include "pandaNode_ext.h"
 
 
-#ifndef CPPPARSER
-#ifdef STDFLOAT_DOUBLE
-IMPORT_THIS struct Dtool_PyTypedObject Dtool_LPoint3d;
-#else
-IMPORT_THIS struct Dtool_PyTypedObject Dtool_LPoint3f;
-#endif
-#endif
-
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: Extension<NodePath>::get_python_tag_keys
 //     Function: Extension<NodePath>::get_python_tag_keys
 //       Access: Published
 //       Access: Published
@@ -167,33 +159,3 @@ INLINE bool Extension<NodePath>::
 has_net_python_tag(const string &key) const {
 has_net_python_tag(const string &key) const {
   return !find_net_python_tag(key).is_empty();
   return !find_net_python_tag(key).is_empty();
 }
 }
-
-////////////////////////////////////////////////////////////////////
-//     Function: Extension<NodePath>::get_tight_bounds
-//       Access: Published
-//  Description: Returns the tight bounds as a 2-tuple of LPoint3
-//               objects.  This is a convenience function for Python
-//               users, among which the use of calc_tight_bounds
-//               may be confusing.
-//               Returns None if calc_tight_bounds returned false.
-////////////////////////////////////////////////////////////////////
-INLINE PyObject *Extension<NodePath>::
-get_tight_bounds() const {
-  LPoint3 *min_point = new LPoint3;
-  LPoint3 *max_point = new LPoint3;
-
-  if (_this->calc_tight_bounds(*min_point, *max_point)) {
-#ifdef STDFLOAT_DOUBLE
-    PyObject *min_inst = DTool_CreatePyInstance((void*) min_point, Dtool_LPoint3d, true, false);
-    PyObject *max_inst = DTool_CreatePyInstance((void*) max_point, Dtool_LPoint3d, true, false);
-#else
-    PyObject *min_inst = DTool_CreatePyInstance((void*) min_point, Dtool_LPoint3f, true, false);
-    PyObject *max_inst = DTool_CreatePyInstance((void*) max_point, Dtool_LPoint3f, true, false);
-#endif
-    return Py_BuildValue("NN", min_inst, max_inst);
-
-  } else {
-    Py_INCREF(Py_None);
-    return Py_None;
-  }
-}

+ 38 - 4
panda/src/pgraph/nodePath_ext.cxx

@@ -18,8 +18,13 @@
 #ifdef HAVE_PYTHON
 #ifdef HAVE_PYTHON
 
 
 #ifndef CPPPARSER
 #ifndef CPPPARSER
-extern EXPCL_PANDA_PUTIL Dtool_PyTypedObject Dtool_BamWriter;
-extern EXPCL_PANDA_PUTIL Dtool_PyTypedObject Dtool_BamReader;
+extern struct Dtool_PyTypedObject Dtool_BamWriter;
+extern struct Dtool_PyTypedObject Dtool_BamReader;
+#ifdef STDFLOAT_DOUBLE
+extern struct Dtool_PyTypedObject Dtool_LPoint3d;
+#else
+extern struct Dtool_PyTypedObject Dtool_LPoint3f;
+#endif
 #endif  // CPPPARSER
 #endif  // CPPPARSER
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -53,7 +58,7 @@ __copy__() const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 PyObject *Extension<NodePath>::
 PyObject *Extension<NodePath>::
 __deepcopy__(PyObject *self, PyObject *memo) const {
 __deepcopy__(PyObject *self, PyObject *memo) const {
-  IMPORT_THIS struct Dtool_PyTypedObject Dtool_NodePath;
+  extern struct Dtool_PyTypedObject Dtool_NodePath;
 
 
   // Borrowed reference.
   // Borrowed reference.
   PyObject *dupe = PyDict_GetItem(memo, self);
   PyObject *dupe = PyDict_GetItem(memo, self);
@@ -228,5 +233,34 @@ py_decode_NodePath_from_bam_stream_persist(PyObject *unpickler, const string &da
   return NodePath::decode_from_bam_stream(data, reader);
   return NodePath::decode_from_bam_stream(data, reader);
 }
 }
 
 
-#endif  // HAVE_PYTHON
+////////////////////////////////////////////////////////////////////
+//     Function: Extension<NodePath>::get_tight_bounds
+//       Access: Published
+//  Description: Returns the tight bounds as a 2-tuple of LPoint3
+//               objects.  This is a convenience function for Python
+//               users, among which the use of calc_tight_bounds
+//               may be confusing.
+//               Returns None if calc_tight_bounds returned false.
+////////////////////////////////////////////////////////////////////
+PyObject *Extension<NodePath>::
+get_tight_bounds() const {
+  LPoint3 *min_point = new LPoint3;
+  LPoint3 *max_point = new LPoint3;
+
+  if (_this->calc_tight_bounds(*min_point, *max_point)) {
+#ifdef STDFLOAT_DOUBLE
+    PyObject *min_inst = DTool_CreatePyInstance((void*) min_point, Dtool_LPoint3d, true, false);
+    PyObject *max_inst = DTool_CreatePyInstance((void*) max_point, Dtool_LPoint3d, true, false);
+#else
+    PyObject *min_inst = DTool_CreatePyInstance((void*) min_point, Dtool_LPoint3f, true, false);
+    PyObject *max_inst = DTool_CreatePyInstance((void*) max_point, Dtool_LPoint3f, true, false);
+#endif
+    return Py_BuildValue("NN", min_inst, max_inst);
 
 
+  } else {
+    Py_INCREF(Py_None);
+    return Py_None;
+  }
+}
+
+#endif  // HAVE_PYTHON

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

@@ -48,7 +48,7 @@ public:
   INLINE bool has_net_python_tag(const string &key) const;
   INLINE bool has_net_python_tag(const string &key) const;
   NodePath find_net_python_tag(const string &key) const;
   NodePath find_net_python_tag(const string &key) const;
 
 
-  INLINE PyObject *get_tight_bounds() const;
+  PyObject *get_tight_bounds() const;
 };
 };
 
 
 BEGIN_PUBLISH
 BEGIN_PUBLISH

+ 1 - 1
panda/src/pgraph/pandaNode_ext.cxx

@@ -53,7 +53,7 @@ __copy__() const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 PyObject *Extension<PandaNode>::
 PyObject *Extension<PandaNode>::
 __deepcopy__(PyObject *self, PyObject *memo) const {
 __deepcopy__(PyObject *self, PyObject *memo) const {
-  IMPORT_THIS struct Dtool_PyTypedObject Dtool_PandaNode;
+  extern struct Dtool_PyTypedObject Dtool_PandaNode;
 
 
   // Borrowed reference.
   // Borrowed reference.
   PyObject *dupe = PyDict_GetItem(memo, self);
   PyObject *dupe = PyDict_GetItem(memo, self);

+ 3 - 3
panda/src/pgraph/renderState_ext.cxx

@@ -32,7 +32,7 @@
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 PyObject *Extension<RenderState>::
 PyObject *Extension<RenderState>::
 get_composition_cache() const {
 get_composition_cache() const {
-  IMPORT_THIS struct Dtool_PyTypedObject Dtool_RenderState;
+  extern struct Dtool_PyTypedObject Dtool_RenderState;
   LightReMutexHolder holder(*RenderState::_states_lock);
   LightReMutexHolder holder(*RenderState::_states_lock);
   size_t cache_size = _this->_composition_cache.get_size();
   size_t cache_size = _this->_composition_cache.get_size();
   PyObject *list = PyList_New(cache_size);
   PyObject *list = PyList_New(cache_size);
@@ -90,7 +90,7 @@ get_composition_cache() const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 PyObject *Extension<RenderState>::
 PyObject *Extension<RenderState>::
 get_invert_composition_cache() const {
 get_invert_composition_cache() const {
-  IMPORT_THIS struct Dtool_PyTypedObject Dtool_RenderState;
+  extern struct Dtool_PyTypedObject Dtool_RenderState;
   LightReMutexHolder holder(*RenderState::_states_lock);
   LightReMutexHolder holder(*RenderState::_states_lock);
   size_t cache_size = _this->_invert_composition_cache.get_size();
   size_t cache_size = _this->_invert_composition_cache.get_size();
   PyObject *list = PyList_New(cache_size);
   PyObject *list = PyList_New(cache_size);
@@ -141,7 +141,7 @@ get_invert_composition_cache() const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 PyObject *Extension<RenderState>::
 PyObject *Extension<RenderState>::
 get_states() {
 get_states() {
-  IMPORT_THIS struct Dtool_PyTypedObject Dtool_RenderState;
+  extern struct Dtool_PyTypedObject Dtool_RenderState;
   if (RenderState::_states == (RenderState::States *)NULL) {
   if (RenderState::_states == (RenderState::States *)NULL) {
     return PyList_New(0);
     return PyList_New(0);
   }
   }

+ 4 - 4
panda/src/pgraph/transformState_ext.cxx

@@ -32,7 +32,7 @@
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 PyObject *Extension<TransformState>::
 PyObject *Extension<TransformState>::
 get_composition_cache() const {
 get_composition_cache() const {
-  IMPORT_THIS struct Dtool_PyTypedObject Dtool_TransformState;
+  extern struct Dtool_PyTypedObject Dtool_TransformState;
   LightReMutexHolder holder(*_this->_states_lock);
   LightReMutexHolder holder(*_this->_states_lock);
 
 
   size_t num_states = _this->_composition_cache.get_num_entries();
   size_t num_states = _this->_composition_cache.get_num_entries();
@@ -94,7 +94,7 @@ get_composition_cache() const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 PyObject *Extension<TransformState>::
 PyObject *Extension<TransformState>::
 get_invert_composition_cache() const {
 get_invert_composition_cache() const {
-  IMPORT_THIS struct Dtool_PyTypedObject Dtool_TransformState;
+  extern struct Dtool_PyTypedObject Dtool_TransformState;
   LightReMutexHolder holder(*_this->_states_lock);
   LightReMutexHolder holder(*_this->_states_lock);
 
 
   size_t num_states = _this->_invert_composition_cache.get_num_entries();
   size_t num_states = _this->_invert_composition_cache.get_num_entries();
@@ -149,7 +149,7 @@ get_invert_composition_cache() const {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 PyObject *Extension<TransformState>::
 PyObject *Extension<TransformState>::
 get_states() {
 get_states() {
-  IMPORT_THIS struct Dtool_PyTypedObject Dtool_TransformState;
+  extern struct Dtool_PyTypedObject Dtool_TransformState;
   if (TransformState::_states == (TransformState::States *)NULL) {
   if (TransformState::_states == (TransformState::States *)NULL) {
     return PyList_New(0);
     return PyList_New(0);
   }
   }
@@ -186,7 +186,7 @@ get_states() {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 PyObject *Extension<TransformState>::
 PyObject *Extension<TransformState>::
 get_unused_states() {
 get_unused_states() {
-  IMPORT_THIS struct Dtool_PyTypedObject Dtool_TransformState;
+  extern struct Dtool_PyTypedObject Dtool_TransformState;
   if (TransformState::_states == (TransformState::States *)NULL) {
   if (TransformState::_states == (TransformState::States *)NULL) {
     return PyList_New(0);
     return PyList_New(0);
   }
   }

+ 54 - 54
panda/src/pgraphnodes/shaderGenerator.cxx

@@ -86,35 +86,35 @@ reset_register_allocator() {
 //       Access: Protected
 //       Access: Protected
 //  Description: Allocate a vreg.
 //  Description: Allocate a vreg.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-INLINE char *ShaderGenerator::
+const char *ShaderGenerator::
 alloc_vreg() {
 alloc_vreg() {
   switch (_vtregs_used) {
   switch (_vtregs_used) {
-  case  0: _vtregs_used += 1; return (char*)"TEXCOORD0";
-  case  1: _vtregs_used += 1; return (char*)"TEXCOORD1";
-  case  2: _vtregs_used += 1; return (char*)"TEXCOORD2";
-  case  3: _vtregs_used += 1; return (char*)"TEXCOORD3";
-  case  4: _vtregs_used += 1; return (char*)"TEXCOORD4";
-  case  5: _vtregs_used += 1; return (char*)"TEXCOORD5";
-  case  6: _vtregs_used += 1; return (char*)"TEXCOORD6";
-  case  7: _vtregs_used += 1; return (char*)"TEXCOORD7";
+  case  0: _vtregs_used += 1; return "TEXCOORD0";
+  case  1: _vtregs_used += 1; return "TEXCOORD1";
+  case  2: _vtregs_used += 1; return "TEXCOORD2";
+  case  3: _vtregs_used += 1; return "TEXCOORD3";
+  case  4: _vtregs_used += 1; return "TEXCOORD4";
+  case  5: _vtregs_used += 1; return "TEXCOORD5";
+  case  6: _vtregs_used += 1; return "TEXCOORD6";
+  case  7: _vtregs_used += 1; return "TEXCOORD7";
   }
   }
   switch (_vcregs_used) {
   switch (_vcregs_used) {
-  case  0: _vcregs_used += 1; return (char*)"COLOR0";
-  case  1: _vcregs_used += 1; return (char*)"COLOR1";
+  case  0: _vcregs_used += 1; return "COLOR0";
+  case  1: _vcregs_used += 1; return "COLOR1";
   }
   }
   // These don't exist in arbvp1, though they're reportedly
   // These don't exist in arbvp1, though they're reportedly
   // supported by other profiles.
   // supported by other profiles.
   switch (_vtregs_used) {
   switch (_vtregs_used) {
-  case  8: _vtregs_used += 1; return (char*)"TEXCOORD8";
-  case  9: _vtregs_used += 1; return (char*)"TEXCOORD9";
-  case 10: _vtregs_used += 1; return (char*)"TEXCOORD10";
-  case 11: _vtregs_used += 1; return (char*)"TEXCOORD11";
-  case 12: _vtregs_used += 1; return (char*)"TEXCOORD12";
-  case 13: _vtregs_used += 1; return (char*)"TEXCOORD13";
-  case 14: _vtregs_used += 1; return (char*)"TEXCOORD14";
-  case 15: _vtregs_used += 1; return (char*)"TEXCOORD15";
-  }
-  return (char*)"UNKNOWN";
+  case  8: _vtregs_used += 1; return "TEXCOORD8";
+  case  9: _vtregs_used += 1; return "TEXCOORD9";
+  case 10: _vtregs_used += 1; return "TEXCOORD10";
+  case 11: _vtregs_used += 1; return "TEXCOORD11";
+  case 12: _vtregs_used += 1; return "TEXCOORD12";
+  case 13: _vtregs_used += 1; return "TEXCOORD13";
+  case 14: _vtregs_used += 1; return "TEXCOORD14";
+  case 15: _vtregs_used += 1; return "TEXCOORD15";
+  }
+  return "UNKNOWN";
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -122,37 +122,37 @@ alloc_vreg() {
 //       Access: Protected
 //       Access: Protected
 //  Description: Allocate a freg.
 //  Description: Allocate a freg.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-INLINE char *ShaderGenerator::
+const char *ShaderGenerator::
 alloc_freg() {
 alloc_freg() {
   switch (_ftregs_used) {
   switch (_ftregs_used) {
-  case  0: _ftregs_used += 1; return (char*)"TEXCOORD0";
-  case  1: _ftregs_used += 1; return (char*)"TEXCOORD1";
-  case  2: _ftregs_used += 1; return (char*)"TEXCOORD2";
-  case  3: _ftregs_used += 1; return (char*)"TEXCOORD3";
-  case  4: _ftregs_used += 1; return (char*)"TEXCOORD4";
-  case  5: _ftregs_used += 1; return (char*)"TEXCOORD5";
-  case  6: _ftregs_used += 1; return (char*)"TEXCOORD6";
-  case  7: _ftregs_used += 1; return (char*)"TEXCOORD7";
+  case  0: _ftregs_used += 1; return "TEXCOORD0";
+  case  1: _ftregs_used += 1; return "TEXCOORD1";
+  case  2: _ftregs_used += 1; return "TEXCOORD2";
+  case  3: _ftregs_used += 1; return "TEXCOORD3";
+  case  4: _ftregs_used += 1; return "TEXCOORD4";
+  case  5: _ftregs_used += 1; return "TEXCOORD5";
+  case  6: _ftregs_used += 1; return "TEXCOORD6";
+  case  7: _ftregs_used += 1; return "TEXCOORD7";
   }
   }
   // We really shouldn't rely on COLOR fregs,
   // We really shouldn't rely on COLOR fregs,
   // since the clamping can have unexpected side-effects.
   // since the clamping can have unexpected side-effects.
   //switch (_fcregs_used) {
   //switch (_fcregs_used) {
-  //case  0: _fcregs_used += 1; return (char*)"COLOR0";
-  //case  1: _fcregs_used += 1; return (char*)"COLOR1";
+  //case  0: _fcregs_used += 1; return "COLOR0";
+  //case  1: _fcregs_used += 1; return "COLOR1";
   //}
   //}
   // These don't exist in arbvp1/arbfp1, though they're
   // These don't exist in arbvp1/arbfp1, though they're
   // reportedly supported by other profiles.
   // reportedly supported by other profiles.
   switch (_ftregs_used) {
   switch (_ftregs_used) {
-  case  8: _ftregs_used += 1; return (char*)"TEXCOORD8";
-  case  9: _ftregs_used += 1; return (char*)"TEXCOORD9";
-  case 10: _ftregs_used += 1; return (char*)"TEXCOORD10";
-  case 11: _ftregs_used += 1; return (char*)"TEXCOORD11";
-  case 12: _ftregs_used += 1; return (char*)"TEXCOORD12";
-  case 13: _ftregs_used += 1; return (char*)"TEXCOORD13";
-  case 14: _ftregs_used += 1; return (char*)"TEXCOORD14";
-  case 15: _ftregs_used += 1; return (char*)"TEXCOORD15";
-  }
-  return (char*)"UNKNOWN";
+  case  8: _ftregs_used += 1; return "TEXCOORD8";
+  case  9: _ftregs_used += 1; return "TEXCOORD9";
+  case 10: _ftregs_used += 1; return "TEXCOORD10";
+  case 11: _ftregs_used += 1; return "TEXCOORD11";
+  case 12: _ftregs_used += 1; return "TEXCOORD12";
+  case 13: _ftregs_used += 1; return "TEXCOORD13";
+  case 14: _ftregs_used += 1; return "TEXCOORD14";
+  case 15: _ftregs_used += 1; return "TEXCOORD15";
+  }
+  return "UNKNOWN";
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -624,18 +624,18 @@ synthesize_shader(const RenderState *rs) {
 
 
   // These variables will hold the results of register allocation.
   // These variables will hold the results of register allocation.
 
 
-  char *tangent_freg = 0;
-  char *binormal_freg = 0;
+  const char *tangent_freg = 0;
+  const char *binormal_freg = 0;
   string tangent_input;
   string tangent_input;
   string binormal_input;
   string binormal_input;
-  pmap<const InternalName *, char *> texcoord_fregs;
-  pvector<char *> dlightcoord_fregs;
-  pvector<char *> slightcoord_fregs;
-  char *world_position_freg = 0;
-  char *world_normal_freg = 0;
-  char *eye_position_freg = 0;
-  char *eye_normal_freg = 0;
-  char *hpos_freg = 0;
+  pmap<const InternalName *, const char *> texcoord_fregs;
+  pvector<const char *> dlightcoord_fregs;
+  pvector<const char *> slightcoord_fregs;
+  const char *world_position_freg = 0;
+  const char *world_normal_freg = 0;
+  const char *eye_position_freg = 0;
+  const char *eye_normal_freg = 0;
+  const char *hpos_freg = 0;
 
 
   if (_vertex_colors) {
   if (_vertex_colors) {
     // Reserve COLOR0
     // Reserve COLOR0
@@ -662,7 +662,7 @@ synthesize_shader(const RenderState *rs) {
       const InternalName *texcoord_name = stage->get_texcoord_name();
       const InternalName *texcoord_name = stage->get_texcoord_name();
 
 
       if (texcoord_fregs.count(texcoord_name) == 0) {
       if (texcoord_fregs.count(texcoord_name) == 0) {
-        char *freg = alloc_freg();
+        const char *freg = alloc_freg();
         string tcname = texcoord_name->join("_");
         string tcname = texcoord_name->join("_");
         texcoord_fregs[texcoord_name] = freg;
         texcoord_fregs[texcoord_name] = freg;
 
 
@@ -774,7 +774,7 @@ synthesize_shader(const RenderState *rs) {
     text << "\t l_eye_normal.xyz = mul((float3x3)tpose_view_to_model, vtx_normal);\n";
     text << "\t l_eye_normal.xyz = mul((float3x3)tpose_view_to_model, vtx_normal);\n";
     text << "\t l_eye_normal.w = 0;\n";
     text << "\t l_eye_normal.w = 0;\n";
   }
   }
-  pmap<const InternalName *, char *>::const_iterator it;
+  pmap<const InternalName *, const char *>::const_iterator it;
   for (it = texcoord_fregs.begin(); it != texcoord_fregs.end(); ++it) {
   for (it = texcoord_fregs.begin(); it != texcoord_fregs.end(); ++it) {
     // Pass through all texcoord inputs as-is.
     // Pass through all texcoord inputs as-is.
     string tcname = it->first->join("_");
     string tcname = it->first->join("_");

+ 2 - 2
panda/src/pgraphnodes/shaderGenerator.h

@@ -85,8 +85,8 @@ protected:
   int _vtregs_used;
   int _vtregs_used;
   int _ftregs_used;
   int _ftregs_used;
   void reset_register_allocator();
   void reset_register_allocator();
-  char *alloc_vreg();
-  char *alloc_freg();
+  const char *alloc_vreg();
+  const char *alloc_freg();
 
 
   // RenderState analysis information.  Created by analyze_renderstate:
   // RenderState analysis information.  Created by analyze_renderstate:
 
 

+ 3 - 3
panda/src/pnmimage/pfmFile_ext.cxx

@@ -17,9 +17,9 @@
 #ifdef HAVE_PYTHON
 #ifdef HAVE_PYTHON
 
 
 #ifndef CPPPARSER
 #ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject Dtool_LPoint2f;
-IMPORT_THIS struct Dtool_PyTypedObject Dtool_LPoint3f;
-IMPORT_THIS struct Dtool_PyTypedObject Dtool_LPoint4f;
+extern struct Dtool_PyTypedObject Dtool_LPoint2f;
+extern struct Dtool_PyTypedObject Dtool_LPoint3f;
+extern struct Dtool_PyTypedObject Dtool_LPoint4f;
 #endif
 #endif
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////

+ 3 - 3
panda/src/pnmimage/pnmImageHeader.h

@@ -106,7 +106,7 @@ PUBLISHED:
   // Contains a single pixel specification used in compute_histogram()
   // Contains a single pixel specification used in compute_histogram()
   // and make_histogram().  Note that pixels are stored by integer
   // and make_histogram().  Note that pixels are stored by integer
   // value, not by floating-point scaled value.
   // value, not by floating-point scaled value.
-  class PixelSpec {
+  class EXPCL_PANDA_PNMIMAGE PixelSpec {
   PUBLISHED:
   PUBLISHED:
     INLINE PixelSpec(xelval gray_value);
     INLINE PixelSpec(xelval gray_value);
     INLINE PixelSpec(xelval gray_value, xelval alpha);
     INLINE PixelSpec(xelval gray_value, xelval alpha);
@@ -143,7 +143,7 @@ PUBLISHED:
 
 
   // Associates a pixel specification with an appearance count, for
   // Associates a pixel specification with an appearance count, for
   // use in Histogram, below.
   // use in Histogram, below.
-  class PixelSpecCount {
+  class EXPCL_PANDA_PNMIMAGE PixelSpecCount {
   public:
   public:
     INLINE PixelSpecCount(const PixelSpec &pixel, int count);
     INLINE PixelSpecCount(const PixelSpec &pixel, int count);
     INLINE bool operator < (const PixelSpecCount &other) const;
     INLINE bool operator < (const PixelSpecCount &other) const;
@@ -157,7 +157,7 @@ PUBLISHED:
   typedef pvector<PixelSpec> Palette;
   typedef pvector<PixelSpec> Palette;
 
 
   // Used to return a pixel histogram in PNMImage::get_histogram().
   // Used to return a pixel histogram in PNMImage::get_histogram().
-  class Histogram {
+  class EXPCL_PANDA_PNMIMAGE Histogram {
   PUBLISHED:
   PUBLISHED:
     INLINE Histogram();
     INLINE Histogram();
 
 

+ 1 - 1
panda/src/putil/Sources.pp

@@ -61,6 +61,7 @@
     pbitops.I pbitops.h \
     pbitops.I pbitops.h \
     portalMask.h \
     portalMask.h \
     pta_ushort.h \
     pta_ushort.h \
+    pythonCallbackObject.cxx \
     pythonCallbackObject.h pythonCallbackObject.I \
     pythonCallbackObject.h pythonCallbackObject.I \
     simpleHashMap.I simpleHashMap.h \
     simpleHashMap.I simpleHashMap.h \
     sparseArray.I sparseArray.h \
     sparseArray.I sparseArray.h \
@@ -111,7 +112,6 @@
     paramValue.cxx \
     paramValue.cxx \
     pbitops.cxx \
     pbitops.cxx \
     pta_ushort.cxx \
     pta_ushort.cxx \
-    pythonCallbackObject.cxx \
     simpleHashMap.cxx \
     simpleHashMap.cxx \
     sparseArray.cxx \
     sparseArray.cxx \
     timedCycle.cxx typedWritable.cxx \
     timedCycle.cxx typedWritable.cxx \

+ 4 - 0
panda/src/putil/bitMask.h

@@ -159,8 +159,12 @@ INLINE ostream &operator << (ostream &out, const BitMask<WType, nbits> &bitmask)
 
 
 // We need to define this temporary macro so we can pass a parameter
 // We need to define this temporary macro so we can pass a parameter
 // containing a comma through the macro.
 // containing a comma through the macro.
+#define BITMASK16_DEF BitMask<PN_uint16, 16>
 #define BITMASK32_DEF BitMask<PN_uint32, 32>
 #define BITMASK32_DEF BitMask<PN_uint32, 32>
+#define BITMASK64_DEF BitMask<PN_uint64, 64>
+EXPORT_TEMPLATE_CLASS(EXPCL_PANDA_PUTIL, EXPTP_PANDA_PUTIL, BITMASK16_DEF);
 EXPORT_TEMPLATE_CLASS(EXPCL_PANDA_PUTIL, EXPTP_PANDA_PUTIL, BITMASK32_DEF);
 EXPORT_TEMPLATE_CLASS(EXPCL_PANDA_PUTIL, EXPTP_PANDA_PUTIL, BITMASK32_DEF);
+EXPORT_TEMPLATE_CLASS(EXPCL_PANDA_PUTIL, EXPTP_PANDA_PUTIL, BITMASK64_DEF);
 
 
 typedef BitMask<PN_uint16, 16> BitMask16;
 typedef BitMask<PN_uint16, 16> BitMask16;
 typedef BitMask<PN_uint32, 32> BitMask32;
 typedef BitMask<PN_uint32, 32> BitMask32;

+ 3 - 0
panda/src/putil/config_util.N

@@ -14,3 +14,6 @@ forcetype PointerToBase<ReferenceCountedVector<ushort> >
 forcetype PointerToArrayBase<ushort>
 forcetype PointerToArrayBase<ushort>
 forcetype PTA_ushort
 forcetype PTA_ushort
 forcetype CPTA_ushort
 forcetype CPTA_ushort
+
+# This is so the extensions for PTA_ushort are made available.
+forceinclude "pointerToArray_ext.h"

+ 0 - 4
panda/src/putil/config_util.cxx

@@ -35,7 +35,6 @@
 #include "namable.h"
 #include "namable.h"
 #include "nodeCachedReferenceCount.h"
 #include "nodeCachedReferenceCount.h"
 #include "paramValue.h"
 #include "paramValue.h"
-#include "pythonCallbackObject.h"
 #include "referenceCount.h"
 #include "referenceCount.h"
 #include "sparseArray.h"
 #include "sparseArray.h"
 #include "typedObject.h"
 #include "typedObject.h"
@@ -216,9 +215,6 @@ init_libputil() {
   ParamVecBase4d::init_type("ParamVecBase4d");
   ParamVecBase4d::init_type("ParamVecBase4d");
   ParamVecBase4i::init_type("ParamVecBase4i");
   ParamVecBase4i::init_type("ParamVecBase4i");
   ParamWstring::init_type("ParamWstring");
   ParamWstring::init_type("ParamWstring");
-#ifdef HAVE_PYTHON
-  PythonCallbackObject::init_type();
-#endif
   QuadBitMaskNative::init_type();
   QuadBitMaskNative::init_type();
   ReferenceCount::init_type();
   ReferenceCount::init_type();
   SparseArray::init_type();
   SparseArray::init_type();

+ 4 - 1
panda/src/putil/doubleBitMask.h

@@ -34,7 +34,7 @@ public:
   typedef BMType BitMaskType;
   typedef BMType BitMaskType;
   typedef TYPENAME BMType::WordType WordType;
   typedef TYPENAME BMType::WordType WordType;
 #ifndef CPPPARSER  // interrogate has a problem with these lines.
 #ifndef CPPPARSER  // interrogate has a problem with these lines.
-  enum { 
+  enum {
     half_bits = BitMaskType::num_bits,
     half_bits = BitMaskType::num_bits,
     num_bits = BitMaskType::num_bits * 2,
     num_bits = BitMaskType::num_bits * 2,
   };
   };
@@ -142,7 +142,10 @@ INLINE ostream &operator << (ostream &out, const DoubleBitMask<BMType> &doubleBi
   return out;
   return out;
 }
 }
 
 
+EXPORT_TEMPLATE_CLASS(EXPCL_PANDA_PUTIL, EXPTP_PANDA_PUTIL, DoubleBitMask<BitMaskNative>);
 typedef DoubleBitMask<BitMaskNative> DoubleBitMaskNative;
 typedef DoubleBitMask<BitMaskNative> DoubleBitMaskNative;
+
+EXPORT_TEMPLATE_CLASS(EXPCL_PANDA_PUTIL, EXPTP_PANDA_PUTIL, DoubleBitMask<DoubleBitMaskNative>);
 typedef DoubleBitMask<DoubleBitMaskNative> QuadBitMaskNative;
 typedef DoubleBitMask<DoubleBitMaskNative> QuadBitMaskNative;
 
 
 // Tell GCC that we'll take care of the instantiation explicitly here.
 // Tell GCC that we'll take care of the instantiation explicitly here.

+ 0 - 1
panda/src/putil/p3putil_composite2.cxx

@@ -15,7 +15,6 @@
 #include "paramValue.cxx"
 #include "paramValue.cxx"
 #include "pbitops.cxx"
 #include "pbitops.cxx"
 #include "pta_ushort.cxx"
 #include "pta_ushort.cxx"
-#include "pythonCallbackObject.cxx"
 #include "simpleHashMap.cxx"
 #include "simpleHashMap.cxx"
 #include "sparseArray.cxx"
 #include "sparseArray.cxx"
 #include "timedCycle.cxx"
 #include "timedCycle.cxx"

+ 10 - 4
panda/src/putil/pythonCallbackObject.cxx

@@ -15,15 +15,21 @@
 #include "pythonCallbackObject.h"
 #include "pythonCallbackObject.h"
 
 
 #ifdef HAVE_PYTHON
 #ifdef HAVE_PYTHON
-#include "py_panda.h"  
+
+#include "py_panda.h"
 #include "thread.h"
 #include "thread.h"
 #include "callbackData.h"
 #include "callbackData.h"
 #include "config_util.h"
 #include "config_util.h"
 
 
 TypeHandle PythonCallbackObject::_type_handle;
 TypeHandle PythonCallbackObject::_type_handle;
 
 
+Configure(config_pythonCallbackObject);
+ConfigureFn(config_pythonCallbackObject) {
+  PythonCallbackObject::init_type();
+}
+
 #ifndef CPPPARSER
 #ifndef CPPPARSER
-IMPORT_THIS struct Dtool_PyTypedObject Dtool_TypedObject;
+extern struct Dtool_PyTypedObject Dtool_TypedObject;
 #endif
 #endif
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -126,13 +132,13 @@ do_python_callback(CallbackData *cbdata) {
 
 
   // Wrap the cbdata up in a Python object, then put it in a tuple,
   // Wrap the cbdata up in a Python object, then put it in a tuple,
   // for the argument list.
   // for the argument list.
-  PyObject *pycbdata = 
+  PyObject *pycbdata =
     DTool_CreatePyInstanceTyped(cbdata, Dtool_TypedObject,
     DTool_CreatePyInstanceTyped(cbdata, Dtool_TypedObject,
                                 false, false, cbdata->get_type_index());
                                 false, false, cbdata->get_type_index());
   PyObject *args = Py_BuildValue("(O)", pycbdata);
   PyObject *args = Py_BuildValue("(O)", pycbdata);
   Py_DECREF(pycbdata);
   Py_DECREF(pycbdata);
 
 
-  PyObject *result = 
+  PyObject *result =
     Thread::get_current_thread()->call_python_func(_function, args);
     Thread::get_current_thread()->call_python_func(_function, args);
   Py_DECREF(args);
   Py_DECREF(args);
 
 

+ 1 - 1
panda/src/putil/pythonCallbackObject.h

@@ -28,7 +28,7 @@
 //               a callback to directly call an arbitarary Python
 //               a callback to directly call an arbitarary Python
 //               function.  Powerful!  But use with caution.
 //               function.  Powerful!  But use with caution.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-class EXPCL_PANDA_PUTIL PythonCallbackObject : public CallbackObject {
+class PythonCallbackObject : public CallbackObject {
 PUBLISHED:
 PUBLISHED:
   PythonCallbackObject(PyObject *function = Py_None);
   PythonCallbackObject(PyObject *function = Py_None);
   virtual ~PythonCallbackObject();
   virtual ~PythonCallbackObject();

+ 3 - 3
panda/src/text/config_text.h

@@ -36,9 +36,9 @@ extern ConfigVariableInt text_texture_margin;
 extern ConfigVariableDouble text_poly_margin;
 extern ConfigVariableDouble text_poly_margin;
 extern ConfigVariableInt text_page_size;
 extern ConfigVariableInt text_page_size;
 extern ConfigVariableBool text_small_caps;
 extern ConfigVariableBool text_small_caps;
-extern ConfigVariableDouble text_small_caps_scale;
+extern EXPCL_PANDA_TEXT ConfigVariableDouble text_small_caps_scale;
 extern ConfigVariableFilename text_default_font;
 extern ConfigVariableFilename text_default_font;
-extern ConfigVariableDouble text_tab_width;
+extern EXPCL_PANDA_TEXT ConfigVariableDouble text_tab_width;
 extern ConfigVariableInt text_push_properties_key;
 extern ConfigVariableInt text_push_properties_key;
 extern ConfigVariableInt text_pop_properties_key;
 extern ConfigVariableInt text_pop_properties_key;
 extern ConfigVariableInt text_soft_hyphen_key;
 extern ConfigVariableInt text_soft_hyphen_key;
@@ -48,7 +48,7 @@ extern wstring get_text_soft_hyphen_output();
 extern ConfigVariableDouble text_hyphen_ratio;
 extern ConfigVariableDouble text_hyphen_ratio;
 extern wstring get_text_never_break_before();
 extern wstring get_text_never_break_before();
 extern ConfigVariableInt text_max_never_break;
 extern ConfigVariableInt text_max_never_break;
-extern ConfigVariableDouble text_default_underscore_height;
+extern EXPCL_PANDA_TEXT ConfigVariableDouble text_default_underscore_height;
 
 
 extern ConfigVariableEnum<SamplerState::FilterType> text_minfilter;
 extern ConfigVariableEnum<SamplerState::FilterType> text_minfilter;
 extern ConfigVariableEnum<SamplerState::FilterType> text_magfilter;
 extern ConfigVariableEnum<SamplerState::FilterType> text_magfilter;