Browse Source

Merge branch 'master' of https://github.com/panda3d/panda3d

enn0x 10 years ago
parent
commit
b996af18dd
37 changed files with 1429 additions and 462 deletions
  1. 6 0
      direct/src/p3d/DeploymentTools.py
  2. 3 3
      direct/src/p3d/thirdparty.pdef
  3. 3 2
      direct/src/plugin/p3dAuthSession.cxx
  4. 162 59
      direct/src/plugin/p3dCert.cxx
  5. 3 3
      direct/src/plugin/p3dCert.h
  6. 571 0
      direct/src/plugin/p3dCert_strings.cxx
  7. 45 0
      direct/src/plugin/p3dCert_strings.h
  8. 98 70
      direct/src/plugin/p3dOsxSplashWindow.cxx
  9. 2 0
      direct/src/plugin/p3dOsxSplashWindow.h
  10. 3 1
      direct/src/plugin/p3dSession.cxx
  11. 13 3
      direct/src/plugin/p3dWinSplashWindow.cxx
  12. 1 0
      direct/src/plugin/p3dWinSplashWindow.h
  13. 5 5
      direct/src/plugin_standalone/panda3dBase.cxx
  14. 2 2
      direct/src/plugin_standalone/panda3dBase.h
  15. 221 218
      dtool/metalibs/dtoolconfig/pydtool.cxx
  16. 15 0
      dtool/src/dtoolbase/typeHandle.I
  17. 4 1
      dtool/src/dtoolbase/typeHandle.h
  18. 34 14
      dtool/src/interrogate/functionRemap.cxx
  19. 41 5
      dtool/src/interrogate/interfaceMakerC.cxx
  20. 2 0
      dtool/src/interrogate/interfaceMakerC.h
  21. 4 0
      dtool/src/interrogate/interfaceMakerPythonNative.cxx
  22. 2 0
      dtool/src/interrogate/interfaceMakerPythonObj.cxx
  23. 2 0
      dtool/src/interrogate/interfaceMakerPythonSimple.cxx
  24. 1 0
      dtool/src/interrogate/interrogate_composite2.cxx
  25. 65 0
      dtool/src/interrogate/parameterRemapHandleToInt.cxx
  26. 40 0
      dtool/src/interrogate/parameterRemapHandleToInt.h
  27. 2 2
      dtool/src/interrogate/parameterRemapThis.cxx
  28. 26 1
      dtool/src/interrogate/typeManager.cxx
  29. 1 0
      dtool/src/interrogate/typeManager.h
  30. 2 0
      makepanda/makepanda.py
  31. 1 1
      panda/src/express/config_express.N
  32. 0 1
      panda/src/glstuff/glGraphicsStateGuardian_src.cxx
  33. 37 37
      panda/src/linmath/luse.N
  34. 5 8
      panda/src/pgraphnodes/lightLensNode.cxx
  35. 5 24
      panda/src/pgraphnodes/pointLight.cxx
  36. 1 1
      panda/src/putil/buttonHandle.h
  37. 1 1
      panda/src/putil/config_util.N

+ 6 - 0
direct/src/p3d/DeploymentTools.py

@@ -99,6 +99,9 @@ class Standalone:
         if len(platforms) == 0:
             Standalone.notify.warning("No platforms found to build for!")
 
+        if 'win32' in platforms and 'win_i386' in platforms:
+            platforms.remove('win32')
+
         outputDir = Filename(outputDir + "/")
         outputDir.makeDir()
         for platform in platforms:
@@ -669,6 +672,9 @@ class Installer:
         if len(platforms) == 0:
             Installer.notify.warning("No platforms found to build for!")
 
+        if 'win32' in platforms and 'win_i386' in platforms:
+            platforms.remove('win32')
+
         outputDir = Filename(outputDir + "/")
         outputDir.makeDir()
         for platform in platforms:

+ 3 - 3
direct/src/p3d/thirdparty.pdef

@@ -137,7 +137,7 @@ class pyopengl(package):
     module('OpenGL.GLU', 'OpenGL.GLUT', 'OpenGL.GLE', 'OpenGL.GLX')
 
 class httplib2(package):
-    config(display_name = "httplib2")
+    config(display_name = "httplib2", platform_specific = False)
     require('panda3d')
 
     module('httplib2', required = True)
@@ -149,7 +149,7 @@ class box2d(package):
     module('Box2D', required = True)
 
 class pyglet(package):
-    config(display_name = "pyglet")
-    require('panda3d')
+    config(display_name = "pyglet", platform_specific = False)
+    require('panda3d', 'morepy')
 
     module('pyglet', required = True)

+ 3 - 2
direct/src/plugin/p3dAuthSession.cxx

@@ -183,7 +183,7 @@ start_p3dcert() {
   // These are the enviroment variables we forward from the current
   // environment, if they are set.
   const wchar_t *keep[] = {
-    L"TMP", L"TEMP", L"HOME", L"USER", 
+    L"TMP", L"TEMP", L"HOME", L"USER",
     L"SYSTEMROOT", L"USERPROFILE", L"COMSPEC",
     NULL
   };
@@ -209,7 +209,8 @@ start_p3dcert() {
   // These are the enviroment variables we forward from the current
   // environment, if they are set.
   const char *keep[] = {
-    "TMP", "TEMP", "HOME", "USER", 
+    "TMP", "TEMP", "HOME", "USER",
+    "LANGUAGE", "LC_ALL", "LC_MESSAGES", "LANG",
 #ifdef HAVE_X11
     "DISPLAY", "XAUTHORITY",
 #endif

+ 162 - 59
direct/src/plugin/p3dCert.cxx

@@ -13,6 +13,7 @@
 ////////////////////////////////////////////////////////////////////
 
 #include "p3dCert.h"
+#include "p3dCert_strings.h"
 #include "wstring_encode.h"
 #include "mkdir_complete.h"
 
@@ -26,8 +27,9 @@
 #include <sys/stat.h>
 #include <string.h>
 #include <limits.h>
+#include <locale.h>
 
-#define BUTTON_WIDTH 120
+#define BUTTON_WIDTH 180 // fit the Russian text
 #define BUTTON_SPACE 10
 
 #include "ca_bundle_data_src.c"
@@ -36,63 +38,152 @@
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #include <shellapi.h>
+#include <malloc.h>
 
 #define snprintf sprintf_s
 #endif
 
-static const char
-self_signed_cert_text[] =
-  "This Panda3D application uses a self-signed certificate.  "
-  "This means the author's name can't be verified, and you have "
-  "no way of knowing for sure who wrote it.\n\n"
+#ifdef __APPLE__
+#include <CoreFoundation/CoreFoundation.h>
+#endif
 
-  "We recommend you click Cancel to avoid running this application.";
+static LanguageIndex li = LI_default;
+
+#if defined(_WIN32)
+static LanguageIndex detect_language() {
+  // This function was introduced in Windows Vista; it may not be available
+  // on older systems.
+  typedef BOOL (*GUPL)(DWORD, PULONG, PZZWSTR, PULONG);
+  GUPL pGetUserPreferredUILanguages = (GUPL)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
+                                                           TEXT("GetUserPreferredUILanguages"));
+  if (pGetUserPreferredUILanguages != NULL) {
+    ULONG num_langs = 0;
+    ULONG buffer_size = 0;
+    pGetUserPreferredUILanguages(8, &num_langs, NULL, &buffer_size);
+    PZZWSTR buffer = (PZZWSTR)_alloca(buffer_size);
+    if (pGetUserPreferredUILanguages(8, &num_langs, buffer, &buffer_size)) {
+      for (ULONG i = 0; i < num_langs; ++i) {
+        size_t len = wcslen(buffer);
+        if (len >= 2 && (buffer[2] == 0 || buffer[2] == L'-')) {
+          // It may be a two-letter code; match it in our list.
+          for (int j = 0; j < LI_COUNT; ++j) {
+            const char *lang_code = language_codes[j];
+            if (lang_code != NULL && lang_code[0] == buffer[0] &&
+                                     lang_code[1] == buffer[1]) {
+              return (LanguageIndex)j;
+            }
+          }
+        }
+        buffer += len + 1;
+      }
+    }
+  }
 
-static const char
-unknown_auth_cert_text[] =
-  "This Panda3D application has been signed, but we don't recognize "
-  "the authority that verifies the signature.  This means the author's "
-  "name can't be trusted, and you have no way of knowing "
-  "for sure who wrote it.\n\n"
+  // Fall back to the old Windows XP function.
+  LANGID lang = GetUserDefaultUILanguage() & 0x3ff;
+  if (lang == 0) {
+    return LI_default;
+  }
 
-  "We recommend you click Cancel to avoid running this application.";
+  for (int i = 0; i < LI_COUNT; ++i) {
+    if (language_ids[i] != 0 && language_ids[i] == lang) {
+      return (LanguageIndex)i;
+    }
+  }
+  return LI_default;
+}
 
-static const char
-verified_cert_text[] =
-  "This Panda3D application has been signed by %s. "
-  "If you trust %s, then click the Run button below "
-  "to run this application on your computer.  This will also "
-  "automatically approve this and any other applications signed by "
-  "%s in the future.\n\n"
+#elif defined(__APPLE__)
+static LanguageIndex detect_language() {
+  // Get and iterate through the list of preferred languages.
+  CFArrayRef langs = CFLocaleCopyPreferredLanguages();
+  CFIndex num_langs = CFArrayGetCount(langs);
 
-  "If you are unsure about this application, "
-  "you should click Cancel instead.";
+  for (long i = 0; i < num_langs; ++i) {
+    CFStringRef lang = (CFStringRef)CFArrayGetValueAtIndex(langs, i);
 
-static const char
-expired_cert_text[] =
-  "This Panda3D application has been signed by %s, "
-  "but the certificate has expired.\n\n"
+    CFIndex length = CFStringGetLength(lang);
+    if (length < 2) {
+      continue;
+    }
 
-  "You should check the current date set on your computer's clock "
-  "to make sure it is correct.\n\n"
+    CFIndex max_size = CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8) + 1;
+    char *buffer = (char *)alloca(max_size);
+    if (!CFStringGetCString(lang, buffer, max_size, kCFStringEncodingUTF8)) {
+      continue;
+    }
 
-  "If your computer's date is correct, we recommend "
-  "you click Cancel to avoid running this application.";
+    if (isalnum(buffer[2])) {
+      // It's not a two-letter code.
+      continue;
+    }
 
-static const char
-generic_error_cert_text[] =
-  "This Panda3D application has been signed, but there is a problem "
-  "with the certificate (OpenSSL error code %d).\n\n"
+    // See if we support this language.
+    for (int j = 0; j < LI_COUNT; ++j) {
+      const char *lang_code = language_codes[j];
+      if (lang_code != NULL && strncasecmp(buffer, lang_code, 2) == 0) {
+        CFRelease(langs);
+        return (LanguageIndex)j;
+      }
+    }
+  }
 
-  "We recommend you click Cancel to avoid running this application.";
+  CFRelease(langs);
+  return LI_default;
+}
 
-static const char
-no_cert_text[] =
-  "This Panda3D application has not been signed.  This means you have "
-  "no way of knowing for sure who wrote it.\n\n"
+#else
+static LanguageIndex detect_language() {
+  // First consult the LANGUAGE variable, which is a GNU extension that can
+  // contain multiple languages in order of preference.
+  const char *lang = getenv("LANGUAGE");
+  while (lang != NULL && lang[0] != 0) {
+    size_t len;
+    const char *next = strchr(lang, ':');
+    if (next == NULL) {
+      len = strlen(lang);
+    } else {
+      len = (next - lang);
+      ++next;
+    }
 
-  "Click Cancel to avoid running this application.";
+    if (len >= 2 && !isalnum(lang[2])) {
+      // It may be a two-letter language code; match it in our list.
+      for (int i = 0; i < LI_COUNT; ++i) {
+        const char *lang_code = language_codes[i];
+        if (lang_code != NULL && strncasecmp(lang, lang_code, 2) == 0) {
+          return (LanguageIndex)i;
+        }
+      }
+    }
+
+    lang = next;
+  }
+
+  // Fall back to the C locale functions.
+  setlocale(LC_ALL, "");
+  lang = setlocale(LC_MESSAGES, NULL);
+
+  if (lang == NULL || lang[0] == 0 || strcmp(lang, "C") == 0) {
+    // Try the LANG variable.
+    lang = getenv("LANG");
+  }
+
+  if (lang == NULL || strlen(lang) < 2 || isalnum(lang[2])) {
+    // Couldn't extract a meaningful two-letter code.
+    return LI_default;
+  }
 
+  // It may be a two-letter language code; match it in our list.
+  for (int i = 0; i < LI_COUNT; ++i) {
+    const char *lang_code = language_codes[i];
+    if (lang_code != NULL && strncasecmp(lang, lang_code, 2) == 0) {
+      return (LanguageIndex)i;
+    }
+  }
+  return LI_default;
+}
+#endif
 
 #ifdef _WIN32
 int WINAPI
@@ -107,6 +198,8 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdS
     return 1;
   }
 
+  li = detect_language();
+
   wstring cert_filename (argv[0]);
   wstring cert_dir (argv[1]);
   LocalFree(argv);
@@ -126,6 +219,8 @@ int main(int argc, char **argv) {
     return 1;
   }
 
+  li = detect_language();
+
   string cert_filename (argv[1]);
   string cert_dir (argv[2]);
 
@@ -148,7 +243,7 @@ AuthDialog(const wstring &cert_filename, const wstring &cert_dir) :
 AuthDialog::
 AuthDialog(const string &cert_filename, const string &cert_dir) :
 #endif
-  Fl_Window(435, 242, "New Panda3D Application"),
+  Fl_Window(435, 242, new_application_title[li]),
   _cert_dir(cert_dir)
 {
   _view_cert_dialog = NULL;
@@ -315,12 +410,20 @@ read_cert_file(const string &cert_filename) {
 #endif  // _WIN32
 
   if (fp == NULL) {
+#ifdef _WIN32
+    wcerr << L"Couldn't read " << cert_filename.c_str() << L"\n";
+#else
     cerr << "Couldn't read " << cert_filename.c_str() << "\n";
+#endif
     return;
   }
   _cert = PEM_read_X509(fp, NULL, NULL, (void *)"");
   if (_cert == NULL) {
+#ifdef _WIN32
+    wcerr << L"Could not read certificate in " << cert_filename.c_str() << L".\n";
+#else
     cerr << "Could not read certificate in " << cert_filename.c_str() << ".\n";
+#endif
     fclose(fp);
     return;
   }
@@ -510,19 +613,19 @@ layout() {
   short bx = (w() - nbuttons * BUTTON_WIDTH - (nbuttons - 1) * BUTTON_SPACE) / 2;
 
   if (_verify_result == 0 && _cert != NULL) {
-    Fl_Return_Button *run_button = new Fl_Return_Button(bx, next_y, BUTTON_WIDTH, 25, "Run");
+    Fl_Return_Button *run_button = new Fl_Return_Button(bx, next_y, BUTTON_WIDTH, 25, run_title[li]);
     run_button->callback(this->run_clicked, this);
     bx += BUTTON_WIDTH + BUTTON_SPACE;
   }
 
   if (_cert != NULL) {
-    Fl_Button *view_button = new Fl_Button(bx, next_y, BUTTON_WIDTH, 25, "View Certificate");
+    Fl_Button *view_button = new Fl_Button(bx, next_y, BUTTON_WIDTH, 25, show_cert_title[li]);
     view_button->callback(this->view_cert_clicked, this);
     bx += BUTTON_WIDTH + BUTTON_SPACE;
   }
 
   Fl_Button *cancel_button;
-  cancel_button = new Fl_Button(bx, next_y, BUTTON_WIDTH, 25, "Cancel");
+  cancel_button = new Fl_Button(bx, next_y, BUTTON_WIDTH, 25, cancel_title[li]);
   cancel_button->callback(this->cancel_clicked, this);
 
   next_y += 42;
@@ -542,12 +645,12 @@ void AuthDialog::
 get_text(char *header, size_t hlen, char *text, size_t tlen) {
   switch (_verify_result) {
   case -1:
-    strncpy(header, "No signature!", hlen);
-    strncpy(text, no_cert_text, tlen);
+    strncpy(header, no_cert_title[li], hlen);
+    strncpy(text, no_cert_text[li], tlen);
     break;
 
   case 0:
-    snprintf(text, tlen, verified_cert_text, _friendly_name.c_str(),
+    snprintf(text, tlen, verified_cert_text[li], _friendly_name.c_str(),
                         _friendly_name.c_str(), _friendly_name.c_str());
     break;
 
@@ -555,24 +658,24 @@ get_text(char *header, size_t hlen, char *text, size_t tlen) {
   case X509_V_ERR_CERT_HAS_EXPIRED:
   case X509_V_ERR_CRL_NOT_YET_VALID:
   case X509_V_ERR_CRL_HAS_EXPIRED:
-    strncpy(header, "Expired signature!", hlen);
-    snprintf(text, tlen, expired_cert_text, _friendly_name.c_str());
+    strncpy(header, expired_cert_title[li], hlen);
+    snprintf(text, tlen, expired_cert_text[li], _friendly_name.c_str());
     break;
 
   case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
-    strncpy(header, "Unverified signature!", hlen);
-    snprintf(text, tlen, unknown_auth_cert_text);
+    strncpy(header, unverified_cert_title[li], hlen);
+    strncpy(text, unknown_auth_cert_text[li], tlen);
     break;
 
   case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
   case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
-    strncpy(header, "Unverified signature!", hlen);
-    strncpy(text, self_signed_cert_text, tlen);
+    strncpy(header, unverified_cert_title[li], hlen);
+    strncpy(text, self_signed_cert_text[li], tlen);
     break;
 
   default:
-    strncpy(header, "Unverified signature!", hlen);
-    snprintf(text, tlen, generic_error_cert_text, _verify_result);
+    strncpy(header, unverified_cert_title[li], hlen);
+    snprintf(text, tlen, generic_error_cert_text[li], _verify_result);
   }
 }
 
@@ -583,7 +686,7 @@ get_text(char *header, size_t hlen, char *text, size_t tlen) {
 ////////////////////////////////////////////////////////////////////
 ViewCertDialog::
 ViewCertDialog(AuthDialog *auth_dialog, X509 *cert) :
-  Fl_Window(600, 400, "View Certificate"),
+  Fl_Window(600, 400, show_cert_title[li]),
   _auth_dialog(auth_dialog),
   _cert(cert)
 {
@@ -660,12 +763,12 @@ layout() {
 
   short bx = (w() - BUTTON_WIDTH * 2 - BUTTON_SPACE) / 2;
 
-  Fl_Return_Button *run_button = new Fl_Return_Button(bx, 360, BUTTON_WIDTH, 25, "Run");
+  Fl_Return_Button *run_button = new Fl_Return_Button(bx, 360, BUTTON_WIDTH, 25, run_title[li]);
   run_button->callback(this->run_clicked, this);
 
   bx += BUTTON_WIDTH + BUTTON_SPACE;
 
-  Fl_Button *cancel_button = new Fl_Button(bx, 360, BUTTON_WIDTH, 25, "Cancel");
+  Fl_Button *cancel_button = new Fl_Button(bx, 360, BUTTON_WIDTH, 25, cancel_title[li]);
   cancel_button->callback(this->cancel_clicked, this);
 
   end();

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

@@ -92,9 +92,9 @@ private:
   X509 *_cert;
   STACK_OF(X509) *_stack;
 
-  char _header[32];
-  char _text[512];
-  char _text_clean[1024];
+  char _header[64];
+  char _text[1024];
+  char _text_clean[2048];
 
   string _friendly_name;
   int _verify_result;

+ 571 - 0
direct/src/plugin/p3dCert_strings.cxx

@@ -0,0 +1,571 @@
+// Filename: p3dCert_strings.h
+// Created by:  rdb (25Mar15)
+//
+////////////////////////////////////////////////////////////////////
+//
+// 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."
+//
+////////////////////////////////////////////////////////////////////
+
+#include "p3dCert_strings.h"
+
+// Translations kindly provided by:
+// eng: drwr
+// nld: rdb
+// deu: Sebastian Hoffmann <TheCheapestPixels at googlemail dot com>
+// spa: Imanol Celaya <imanol at celaya dot me>
+// ita: Flavio Clava
+// rus: montreal
+
+const char *language_codes[LI_COUNT] =
+  {"en", "nl", "de", "es", "it", "eo", "ru"};
+
+// https://msdn.microsoft.com/en-us/library/windows/desktop/dd318693%28v=vs.85%29.aspx
+const unsigned char language_ids[LI_COUNT] =
+  {0x09, 0x13, 0x07, 0x0A, 0x10, 0x8F, 0x19};
+
+const char *
+run_title[LI_COUNT] = {
+  "Run",
+  "Uitvoeren",
+  "Starten",
+  "Ejecutar",
+  "Lancia",
+  "Lan\304\211i",
+  "\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214",
+};
+
+const char *
+cancel_title[LI_COUNT] = {
+  "Cancel",
+  "Annuleren",
+  "Abbrechen",
+  "Cancelar",
+  "Cancella",
+  "Nuligi",
+  "\320\236\321\202\320\274\320\265\320\275\320\260",
+};
+
+const char *
+show_cert_title[LI_COUNT] = {
+  "Show Certificate",
+  "Toon Certificaat",
+  "Zertifikat anzeigen",
+  "Mostrar certificado",
+  "Mostra certificato",
+  "Montri Ateston",
+  "\320\237\320\276\320\272\320\260\320\267\320\260\321\202\321\214 \321\201"
+  "\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202",
+};
+
+const char *
+new_application_title[LI_COUNT] = {
+  "New Panda3D Application",
+  "Nieuwe Panda3D Applicatie",
+  "Neue Panda3D-Anwendung",
+  "Nueva aplicaci\303\263n de Panda3D",
+  "Nuova applicazione Panda3D",
+  "Nova aplika\304\265o de Panda3D",
+  "\320\235\320\276\320\262\320\276\320\265 Panda3D-\320\277\321\200\320\270"
+  "\320\273\320\276\320\266\320\265\320\275\320\270\320\265",
+};
+
+const char *
+no_cert_title[LI_COUNT] = {
+  "No signature!",
+  "Geen handtekening!",
+  "Keine Signatur!",
+  "Sin firma!",
+  "Nessuna firma!",
+  "Ne subskribo!",
+  "\320\235\320\265\321\202 \320\277\320\276\320\264\320\277\320\270\321\201"
+  "\320\270!",
+};
+
+const char *
+unverified_cert_title[LI_COUNT] = {
+  "Unverified signature!",
+  "Ongeverifieerde handtekening!",
+  "Unbest\303\244tigte Signatur!",
+  "Firma sin verificar!",
+  "Firma non verificata!",
+  "Nekontrolita subskribo!",
+  "\320\235\320\265\320\277\321\200\320\276\320\262\320\265\321\200\320\265"
+  "\320\275\320\275\320\260\321\217 \320\277\320\276\320\264\320\277\320\270"
+  "\321\201\321\214!",
+};
+
+const char *
+expired_cert_title[LI_COUNT] = {
+  "Expired signature!",
+  "Verlopen handtekening!",
+  "Abgelaufene Signatur!",
+  "Firma caducada!",
+  "Firma scaduta!",
+  "Eksvalidi\304\235inta subskribo!",
+  "\320\241\321\200\320\276\320\272 \320\264\320\265\320\271\321\201\321\202"
+  "\320\262\320\270\321\217 \320\277\320\276\320\264\320\277\320\270\321\201"
+  "\320\270 \320\270\321\201\321\202\321\221\320\272!",
+};
+
+
+const char *
+self_signed_cert_text[LI_COUNT] = {
+  // eng
+  "This Panda3D application uses a self-signed certificate.  "
+  "This means the author's name can't be verified, and you have "
+  "no way of knowing for sure who wrote it.\n"
+  "\n"
+  "We recommend you click Cancel to avoid running this application.",
+
+  // nld
+  "Deze Panda3D applicatie gebruikt een zelf-getekend certificaat.  "
+  "Dit betekent dat de auteursnaam niet kan worden geverifieerd, en het "
+  "niet zeker is of de applicatie te vertrouwen is.\n"
+  "\n"
+  "Het is aanbevolen om op Annuleren te klikken om de applicatie af te "
+  "sluiten.",
+
+  // deu
+  "Diese Panda3D-Anwendung benutzt ein selbst-signiertes Zertifikat.  Dies "
+  "bedeutet, dass weder der Name des Autors \303\274berpr\303\274ft werden "
+  "kann, noch dass garantiert werden kann, dass tats\303\244chlich die "
+  "angegebene Person diese Anwendung geschrieben hat.\n"
+  "\n"
+  "Wir empfehlen, dass Sie Abbrechen dr\303\274cken um diese Anwendung nicht "
+  "auszuf\303\274hren.",
+
+  // spa
+  "Esta aplicaci\303\263n de Panda3D usa un certificado autofirmado.  "
+  "Esto significa que el nombre del autor no puede ser verificado y no se "
+  "puede conocer seguro quien la ha escrito.\n"
+  "\n"
+  "Se recomienda cancelar para evitar ejecutar esta aplicaci\303\263n.",
+
+  // ita
+  "Questa applicazione Panda3D usa un certificato autofirmato.  Ci\303\262 "
+  "significa che il nome dell'autore non pu\303\262 essere verificato, e "
+  "che non hai modo di assicurarti circa chi la abbia scritta.\n"
+  "\n"
+  "Raccomandiamo di cliccare su Cancella per evitare di lanciare questa "
+  "applicazione.",
+
+  // epo
+  "\304\210i tiu aplika\304\265o de Panda3D uzas memsubskribitan ateston.  "
+  "Tio signifas  ke la nomo de la verkanto ne povas esti kontrolita, kaj vi "
+  "ne havas certan scimanieron pri la vera verkanto de la aplika\304\265o.\n"
+  "\n"
+  "Ni rekomendas ke vi premas la butonon 'Nuligi' por eviti lan\304\211on de "
+  "\304\211i tiu aplika\304\265o.",
+
+  // rus
+  "\320\255\321\202\320\276 \320\277\321\200\320\270\320\273\320\276\320\266"
+  "\320\265\320\275\320\270\320\265 \320\270\321\201\320\277\320\276\320\273"
+  "\321\214\320\267\321\203\320\265\321\202 \321\201\320\260\320\274\320\276"
+  "\320\267\320\260\320\262\320\265\321\200\320\265\320\275\320\275\321\213"
+  "\320\271 \321\201\320\265\321\200\321\202\320\270\321\204\320\270\320\272"
+  "\320\260\321\202.  \320\255\321\202\320\276 \320\276\320\267\320\275"
+  "\320\260\321\207\320\260\320\265\321\202, \321\207\321\202\320\276 "
+  "\320\270\320\274\321\217 \320\260\320\262\321\202\320\276\321\200\320\260 "
+  "\320\275\320\265 \320\274\320\276\320\266\320\265\321\202 \320\261\321\213"
+  "\321\202\321\214 \320\277\320\276\320\264\321\202\320\262\320\265\320\266"
+  "\320\264\320\265\320\275\320\276, \320\270 \320\262\321\213 \320\275"
+  "\320\265 \320\274\320\276\320\266\320\265\321\202\320\265 \320\267\320\275"
+  "\320\260\321\202\321\214, \320\272\321\202\320\276 \320\275\320\260"
+  "\320\277\320\270\321\201\320\260\320\273 \321\215\321\202\320\276 \320\277"
+  "\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265.\n"
+  "\n"
+  "\320\234\321\213 \321\200\320\265\320\272\320\276\320\274\320\265\320\275"
+  "\320\264\321\203\320\265\320\274 \320\262\320\260\320\274 \320\275\320\260"
+  "\320\266\320\260\321\202\321\214 \"\320\236\321\202\320\274\320\265"
+  "\320\275\320\260\" \320\270 \320\275\320\265 \320\267\320\260\320\277"
+  "\321\203\321\201\320\272\320\260\321\202\321\214 \321\215\321\202\320\276 "
+  "\320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270"
+  "\320\265.",
+};
+
+
+const char *
+unknown_auth_cert_text[LI_COUNT] = {
+  "This Panda3D application has been signed, but we don't recognize "
+  "the authority that verifies the signature.  This means the author's "
+  "name can't be verified, and you have no way of knowing "
+  "for sure who wrote it.\n"
+  "\n"
+  "We recommend you click Cancel to avoid running this application.",
+
+   // nld
+  "Deze Panda3D applicatie is ondertekend, maar de certificaatautoriteit "
+  "die het certificaat heeft uitgegeven wordt niet herkend.  Dit betekent "
+  "dat de auteursnaam niet te vertrouwen is, en het niet zeker is wie de "
+  "applicatie gemaakt heeft.\n"
+  "\n"
+  "Het is aanbevolen om op Annuleren te klikken om de applicatie af te "
+  "sluiten.",
+
+  // deu
+  "Diese Panda3D-Anwendung wurde signiert, aber die "
+  "\303\234berpr\303\274fungsstelle wurde nicht anerkannt.  Dies bedeutet, "
+  "dass weder der Name des Autors \303\274berpr\303\274ft werden kann, noch "
+  "dass garantiert werden kann, dass tats\303\244chlich die angegebene "
+  "Person diese Anwendung geschrieben hat.\n"
+  "\n"
+  "Wir empfehlen, dass Sie Abbrechen dr\303\274cken um diese Anwendung nicht "
+  "auszuf\303\274hren.",
+
+  // spa
+  "Esta aplicaci\303\263n de Panda3D esta firmada, pero no reconocemos la "
+  "autoridad que la verifica.  Esto significa que el nombre del autor no "
+  "puede ser verificado y no se puede conocer seguro quien la ha escrito.\n"
+  "\n"
+  "Se recomienda cancelar para evitar ejecutar esta aplicaci\303\263n.",
+
+  // ita
+  "Questa applicazione Panda3D \303\250 stata firmata, ma non riconosciamo "
+  "l'autorit\303\240 che verifica la firma. Ci\303\262 significa che il "
+  "nome dell'autore non pu\303\262 essere verificato, e che non hai modo "
+  "di assicurarti circa chi la abbia scritta.\n"
+  "\n"
+  "Raccomandiamo di cliccare su Cancella per evitare di lanciare questa "
+  "applicazione.",
+
+  // epo
+  "\304\210i tiu aplika\304\265o estas subskribita, sed ni ne rekonas "
+  "la a\305\255toritaton, kiu kontrolas la subskribon. Tio signifas ke la "
+  "nomo de la verkanto ne povas esti konfidata, kaj vi ne havas certan "
+  "scimanieron pri la vera verkanto de la aplika\304\265o.\n"
+  "\n"
+  "Ni rekomendas ke vi premas la butonon 'Nuligi' por eviti lan\304\211on "
+  "de \304\211i tiu aplika\304\265o.",
+
+  // rus
+  "\320\243 \321\215\321\202\320\276\320\263\320\276 \320\277\321\200\320\270"
+  "\320\273\320\276\320\266\320\265\320\275\320\270\321\217 \320\265\321\201"
+  "\321\202\321\214 \320\277\320\276\320\264\320\277\320\270\321\201\321\214,"
+  " \320\277\320\276 \320\272\320\276\321\202\320\276\321\200\320\276\320\271"
+  " \320\274\321\213 \320\275\320\265 \320\274\320\276\320\266\320\265"
+  "\320\274 \321\200\320\260\321\201\320\277\320\276\320\267\320\275\320\260"
+  "\321\202\321\214 \320\262\320\273\320\260\320\264\320\265\320\273\321\214"
+  "\321\206\320\260.  \320\255\321\202\320\276 \320\276\320\267\320\275"
+  "\320\260\321\207\320\260\320\265\321\202, \321\207\321\202\320\276 "
+  "\320\270\320\274\321\217 \320\260\320\262\321\202\320\276\321\200\320\260 "
+  "\320\275\320\265 \320\274\320\276\320\266\320\265\321\202 \320\261\321\213"
+  "\321\202\321\214 \320\276\320\277\321\200\320\265\320\264\320\265\320\273"
+  "\320\265\320\275\320\276, \320\270 \320\275\320\265\320\262\320\276"
+  "\320\267\320\274\320\276\320\266\320\275\320\276 \321\202\320\276\321\207"
+  "\320\275\320\276 \321\203\320\267\320\275\320\260\321\202\321\214, "
+  "\320\272\321\202\320\276 \320\275\320\260\320\277\320\270\321\201\320\260"
+  "\320\273 \321\215\321\202\320\276 \320\277\321\200\320\270\320\273\320\276"
+  "\320\266\320\265\320\275\320\270\320\265.\n"
+  "\n"
+  "\320\234\321\213 \321\200\320\265\320\272\320\276\320\274\320\265\320\275"
+  "\320\264\321\203\320\265\320\274 \320\262\320\260\320\274 \320\275\320\260"
+  "\320\266\320\260\321\202\321\214 \"\320\236\321\202\320\274\320\265"
+  "\320\275\320\260\" \320\270 \320\275\320\265 \320\267\320\260\320\277"
+  "\321\203\321\201\320\272\320\260\321\202\321\214 \321\215\321\202\320\276 "
+  "\320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270"
+  "\320\265.",
+};
+
+
+const char *
+verified_cert_text[LI_COUNT] = {
+  // eng
+  "This Panda3D application has been signed by %s.  "
+  "If you trust %s, then click the Run button below "
+  "to run this application on your computer.  This will also "
+  "automatically approve this and any other applications signed by "
+  "%s in the future.\n"
+  "\n"
+  "If you are unsure about this application, "
+  "you should click Cancel instead.",
+
+  // nld
+  "Deze Panda3D applicatie is ondertekend door %s.  "
+  "Als u %s vertrouwt, klik dan de onderstaande knop Uitvoeren om de applicatie "
+  "op uw computer uit te voeren.  Dit zal ook deze en andere door %s getekende "
+  "applicaties in het vervolg toestaan.\n"
+  "\n"
+  "Als u niet zeker bent over deze applicatie is het aanbevolen om op "
+  "Annuleren te klikken.",
+
+  // deu
+  "Diese Panda3D-Anwendung wurde von %s signiert.  Falls Sie %s vertrauen, "
+  "dr\303\274cken Sie den Starten-Knopf, um diese Anwendung auszuf\303\274hren.  "
+  "Zudem werden in der Zukunft diese und alle anderen von %s signierten "
+  "Anwendungen automatisch als vertrauensw\303\274rdig anerkannt.\n"
+  "\n"
+  "Falls Sie sich unsicher \303\274ber diese Anwendung sind, sollten Sie "
+  "Abbrechen dr\303\274cken.",
+
+  // spa
+  "Esta aplicaci\303\263n de Panda3D ha sido firmada por %s.  Si se considera %s"
+  "de confianza el bot\303\263n inferior ejecutar\303\241 la aplicaci\303\263n."
+  "Esto validara esta y cualquier otra applizacion firmada por %s en el futuro.\n"
+  "\n"
+  "Si se duda de la aplicaci\303\263nse recomienda cancelar."
+
+  // ita
+  "Questa applicazione Panda3D \303\250 stata firmata da %s.  Se %s \303\250 "
+  "un'entit\303\240 fidata, allora clicca il bottone Lancia sottostante per "
+  "lanciare questa applicazione sul tuo computer. Inoltre, ci\303\262 "
+  "approver\303\240 automaticamente questa e ogni altra applicazione "
+  "firmata da %s in futuro.\n"
+  "\n"
+  "Se non sei sicuro circa questa applicazione, dovresti invece cliccare "
+  "su Cancella.",
+
+  // epo
+  "\304\210i tiu aplika\304\265o estas subskribita de %s.  "
+  "Se %s estas fidinda la\305\255 vi, premu la butonon 'Lan\304\211i' sube por "
+  "lan\304\211i \304\211i tiun aplika\304\265on per via komputilo.  Anka\305\255 "
+  "tio a\305\255tomate estonece aprobos \304\211i tiun kaj alian ajn "
+  "aplika\304\265on, kiu estas subskribita de %s.\n"
+  "\n"
+  "Se vi ne estas certa pri \304\211i tiu aplika\304\265o, "
+  "vi anstata\305\255e povus premi la butonon 'Nuligi'.",
+
+  // rus
+  "\320\255\321\202\320\276 \320\277\321\200\320\270\320\273\320\276\320\266"
+  "\320\265\320\275\320\270\320\265 \320\277\320\276\320\264\320\277\320\270"
+  "\321\201\320\260\320\275\320\276 %s.  "
+  "\320\225\321\201\320\273\320\270 \320\262\321\213 \320\264\320\276\320\262"
+  "\320\265\321\200\321\217\320\265\321\202\320\265 %s, \320\275\320\260"
+  "\320\266\320\274\320\270\321\202\320\265 \320\272\320\275\320\276\320\277"
+  "\320\272\321\203 \"\320\227\320\260\320\277\321\203\321\201\321\202"
+  "\320\270\321\202\321\214\" \320\262\320\275\320\270\320\267\321\203, "
+  "\321\207\321\202\320\276\320\261\321\213 \320\267\320\260\320\277\321\203"
+  "\321\201\321\202\320\270\321\202\321\214 \321\215\321\202\320\276 \320\277"
+  "\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265 "
+  "\320\275\320\260 \320\262\320\260\321\210\320\265\320\274 \320\272\320\276"
+  "\320\274\320\277\321\214\321\216\321\202\320\265\321\200\320\265. \320\255"
+  "\321\202\320\276 \321\202\320\260\320\272\320\266\320\265 \320\260\320\262"
+  "\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201"
+  "\320\272\320\270 \320\277\320\276\320\264\321\202\320\262\320\265\321\200"
+  "\320\264\320\270\321\202 \321\215\321\202\320\276 \320\270 \320\264"
+  "\321\200\321\203\320\263\320\270\320\265 \320\277\321\200\320\270\320\273"
+  "\320\276\320\266\320\265\320\275\320\270\321\217, \320\275\320\260\320\277"
+  "\320\270\321\201\320\260\320\275\320\275\321\213\320\265 %s \320\262 "
+  "\320\261\321\203\320\264\321\203\321\211\320\265\320\274.\n"
+  "\n"
+  "\320\225\321\201\320\273\320\270 \320\262\321\213 \320\275\320\265 "
+  "\321\203\320\262\320\265\321\200\320\265\320\275\321\213 \320\262 \321\215"
+  "\321\202\320\276\320\274 \320\277\321\200\320\270\320\273\320\276\320\266"
+  "\320\265\320\275\320\270\320\270, \320\275\320\260\320\266\320\274\320\270"
+  "\321\202\320\265 \320\272\320\275\320\276\320\277\320\272\321\203 \""
+  "\320\236\321\202\320\274\320\265\320\275\320\260\".",
+};
+
+
+const char *
+expired_cert_text[LI_COUNT] = {
+  // eng
+  "This Panda3D application has been signed by %s, "
+  "but the certificate has expired.\n"
+  "\n"
+  "You should check the current date set on your computer's clock "
+  "to make sure it is correct.\n"
+  "\n"
+  "If your computer's date is correct, we recommend "
+  "you click Cancel to avoid running this application.",
+
+  // nld
+  "Deze Panda3D applicatie is ondertekend door %s, maar de geldigheidsdatum "
+  "van het certificaat is verstreken.\n"
+  "\n"
+  "Controleer de datum op uw computerklok om te zorgen dat deze juist is "
+  "ingesteld.\n"
+  "\n"
+  "Als de datum op uw computer juist is, is het aanbevolen om op Annuleren te "
+  "klikken om de applicatie af te sluiten.",
+
+  // deu
+  "Diese Anwendung wurde von %s signiert, aber das Zertifikat ist abgelaufen.\n"
+  "\n"
+  "Sie sollten die aktuelle Uhrzeit auf Ihrem Computer "
+  "\303\274berpr\303\274fen, um sicherzugehen, dass sie korrekt ist.\n"
+  "\n"
+  "Falls die Uhrzeit auf Ihrem Computer korrekt ist, empfehlen wir Ihnen "
+  "Abbrechen zu dr\303\274cken.",
+
+  // spa
+  "Esta aplicaci\303\263n Panda3D ha sido firmada por %s pero el certificado ha"
+  "caducado.\n"
+  "\n"
+  "Se recomienda comprobar la fecha del reloj.\n"
+  "\n"
+  "Si la fecha del reloj es correcta se recomienda cancelar.",
+
+  // ita
+  "Questa applicazione Panda3D \303\250 stata firmata da %s, ma il "
+  "certificato \303\250 scaduto.\n"
+  "\n"
+  "Dovresti controllare la data attuale impostata nell'orologio del tuo "
+  "computer per assicurarti che sia corretta.\n"
+  "\n"
+  "Se la data del tuo computer \303\250 corretta, raccomandiamo di cliccare "
+  "Cancella per evitare di lanciare questa applicazione."
+
+  // epo
+  "\304\210i tiu aplika\304\265o de Panda3D estas subskribita de %s, "
+  "sed la atesto eksvalidi\304\235is.\n"
+  "\n"
+  "Vi povus kontroli la aktualan daton, kiu estas agordata sur la horlo\304\235o de "
+  "via komputilo por certigi ke \304\235i estas korekta.\n"
+  "\n"
+  "Se la dato de via komputilo estas korekta, ni rekomendas ke vi premas la "
+  "butonon 'Nuligi' por eviti lan\304\211on de \304\211i tiu aplika\304\265o.",
+
+  // rus
+  "\320\255\321\202\320\276 \320\277\321\200\320\270\320\273\320\276\320\266"
+  "\320\265\320\275\320\270\320\265 \320\277\320\276\320\264\320\277\320\270"
+  "\321\201\320\260\320\275\320\276 %s, \320\276\320\264\320\275\320\260"
+  "\320\272\320\276 \321\201\321\200\320\276\320\272 \320\264\320\265\320\271"
+  "\321\201\321\202\320\262\320\270\321\217 \321\201\320\265\321\200\321\202"
+  "\320\270\321\204\320\270\320\272\320\260\321\202\320\260 \320\270\321\201"
+  "\321\202\321\221\320\272.\n"
+  "\n"
+  "\320\237\321\200\320\276\320\262\320\265\321\200\321\214\321\202\320\265, "
+  "\320\277\320\276\320\266\320\260\320\273\321\203\320\271\321\201\321\202"
+  "\320\260, \320\264\320\260\321\202\321\203 \320\275\320\260 \320\262"
+  "\320\260\321\210\320\265\320\274 \320\272\320\276\320\274\320\277\321\214"
+  "\321\216\321\202\320\265\321\200\320\265.\n"
+  "\n"
+  "\320\225\321\201\320\273\320\270 \320\275\320\260 \320\262\320\260\321\210"
+  "\320\265\320\274 \320\272\320\276\320\274\320\277\321\214\321\216\321\202"
+  "\320\265\321\200\320\265 \321\203\321\201\321\202\320\260\320\275\320\276"
+  "\320\262\320\273\320\265\320\275\320\276 \320\277\321\200\320\260\320\262"
+  "\320\270\320\273\321\214\320\275\320\276\320\265 \320\262\321\200\320\265"
+  "\320\274\321\217, \320\274\321\213 \321\200\320\265\320\272\320\276"
+  "\320\274\320\265\320\275\320\264\321\203\320\265\320\274 \320\262\320\260"
+  "\320\274 \320\275\320\260\320\266\320\260\321\202\321\214 \320\272\320\275"
+  "\320\276\320\277\320\272\321\203 \"\320\236\321\202\320\274\320\265"
+  "\320\275\320\260\" \320\270 \320\275\320\265 \320\267\320\260\320\277"
+  "\321\203\321\201\320\272\320\260\321\202\321\214 \321\215\321\202\320\276 "
+  "\320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270"
+  "\320\265.",
+};
+
+
+const char *
+generic_error_cert_text[LI_COUNT] = {
+  // eng
+  "This Panda3D application has been signed, but there is a problem "
+  "with the certificate (OpenSSL error code %d).\n"
+  "\n"
+  "We recommend you click Cancel to avoid running this application.",
+
+  // nld
+  "Deze Panda3D applicatie is ondertekend, maar er is een probleem "
+  "met het certificaat opgetreden (OpenSSL foutcode %d).\n"
+  "\n"
+  "Het is aanbevolen om op Annuleren te klikken om de applicatie af te "
+  "sluiten.",
+
+  // deu
+  "Diese Panda3D-Anwendung wurde signiert, aber es gibt ein Problem mit "
+  "dem Zertifikat (OpenSSL Fehlercode %d).\n"
+  "\n"
+  "Wir empfehlen, dass Sie Abbrechen dr\303\274cken um diese Anwendung nicht "
+  "auszuf\303\274hren.",
+
+  // spa
+  "Esta aplicaci\303\263n de Panda3D esta firmada pero hay un problema con el "
+  "certificado (Error de OpenSSL %d).\n"
+  "\n"
+  "Se recomienda cancelar para evitar ejecutar esta aplicaci\303\263n.",
+
+  // ita
+  "Questa applicazione Panda3D \303\250 stata firmata, ma c'\303\250 un "
+  "problema col certificato (codice di errore OpenSSL %s).\n"
+  "\n"
+  "Raccomandiamo di cliccare su Cancella per evitare di lanciare questa "
+  "applicazione.",
+
+  // epo
+  "\304\210i tiu aplika\304\265o de Panda3D estas subskribita, sed la "
+  "atesto havas problemon (OpenSSL erarkodo %d).\n"
+  "\n"
+  "Ni rekomendas ke vi premas la butonon 'Nuligi' por eviti lan\304\211on "
+  "de \304\211i tiu aplika\304\265o.",
+
+  // rus
+  "\320\243 \321\215\321\202\320\276\320\263\320\276 \320\277\321\200\320\270"
+  "\320\273\320\276\320\266\320\265\320\275\320\270\321\217 \320\265\321\201"
+  "\321\202\321\214 \320\277\320\276\320\264\320\277\320\270\321\201\321\214,"
+  " \320\275\320\276 \320\262\320\276\320\267\320\275\320\270\320\272\320\273"
+  "\320\260 \320\277\321\200\320\276\320\261\320\273\320\265\320\274\320\260 "
+  "\321\201 \321\201\320\265\321\200\321\202\320\270\321\204\320\270\320\272"
+  "\320\260\321\202\320\276\320\274 (\320\232\320\276\320\264 \320\276"
+  "\321\210\320\270\320\261\320\272\320\270 OpenSSL %d).\n"
+  "\n"
+  "\320\234\321\213 \321\200\320\265\320\272\320\276\320\274\320\265\320\275"
+  "\320\264\321\203\320\265\320\274 \320\262\320\260\320\274 \320\275\320\260"
+  "\320\266\320\260\321\202\321\214 \"\320\236\321\202\320\274\320\265"
+  "\320\275\320\260\" \320\270 \320\275\320\265 \320\267\320\260\320\277"
+  "\321\203\321\201\320\272\320\260\321\202\321\214 \321\215\321\202\320\276 "
+  "\320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270"
+  "\320\265.",
+};
+
+
+const char *
+no_cert_text[LI_COUNT] = {
+  "This Panda3D application has not been signed.  This means you have "
+  "no way of knowing for sure who wrote it.\n"
+  "\n"
+  "Click Cancel to avoid running this application.",
+
+  // nld
+  "Deze Panda3D applicatie is niet ondertekend.  Dit betekent dat het niet "
+  "mogelijk is om de auteur te verifi\303\253ren.\n"
+  "\n"
+  "Klik op Annuleren om de applicatie af te sluiten.",
+
+  // deu
+  "Diese Panda3D-Anwendung wurde nicht signiert.  Es gibt keine "
+  "M\303\266glichkeit festzustellen, wer diese entwickelt hat.\n"
+  "\n"
+  "Dr\303\274cken Sie Abbrechen, um diese Anwendung nicht auszuf\303\274hren.",
+
+  // spa
+  "Esta aplicaci\303\263n de Panda3D no esta firmada, no hay forma de conocer "
+  "quien la ha escrito.\n"
+  "\n"
+  "Cancelar para evitar ejecutar la aplicaci\303\263n.",
+
+  // ita
+  "Questa applicazione Panda3D non \303\250 stata firmata.  Ci\303\262 "
+  "significa che non hai modo di assicurarti circa chi la abbia scritta.\n"
+  "\n"
+  "Clicca Cancella per evitare di lanciare questa applicazione.",
+
+  // epo
+  "\304\210i tiu aplika\304\265o de Panda3D ne estas subskribita.  Tio "
+  "signifas ke vi ne havas certan scimanieron pri la vera verkanto de "
+  "la aplika\304\265o.\n"
+  "\n"
+  "Premu la butonon 'Nuligi' por eviti lan\304\211on de \304\211i tiu "
+  "aplika\304\265o.",
+
+  // rus
+  "\320\243 \321\215\321\202\320\276\320\263\320\276 \320\277\321\200\320\270"
+  "\320\273\320\276\320\266\320\265\320\275\320\270\321\217 \320\275\320\265"
+  "\321\202 \320\277\320\276\320\264\320\277\320\270\321\201\320\270. "
+  "\320\255\321\202\320\276 \320\276\320\267\320\275\320\260\321\207\320\260"
+  "\320\265\321\202, \321\207\321\202\320\276 \320\262\321\213 \320\275"
+  "\320\265 \320\274\320\276\320\266\320\265\321\202\320\265 \320\267\320\275"
+  "\320\260\321\202\321\214, \320\272\321\202\320\276 \320\265\320\263"
+  "\320\276 \320\275\320\260\320\277\320\270\321\201\320\260\320\273.\n"
+  "\n"
+  "\320\235\320\260\320\266\320\274\320\270\321\202\320\265 \"\320\236"
+  "\321\202\320\274\320\265\320\275\320\260\", \321\207\321\202\320\276"
+  "\320\261\321\213 \320\275\320\265 \320\267\320\260\320\277\321\203\321\201"
+  "\320\272\320\260\321\202\321\214 \320\277\321\200\320\270\320\273\320\276"
+  "\320\266\320\265\320\275\320\270\320\265.",
+};

+ 45 - 0
direct/src/plugin/p3dCert_strings.h

@@ -0,0 +1,45 @@
+// Filename: p3dCert_strings.h
+// Created by:  rdb (25Mar15)
+//
+////////////////////////////////////////////////////////////////////
+//
+// 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."
+//
+////////////////////////////////////////////////////////////////////
+
+enum LanguageIndex {
+  LI_en, // English
+  LI_nl, // Dutch
+  LI_de, // German
+  LI_es, // Spanish
+  LI_it, // Italian
+  LI_eo, // Esperanto
+  LI_ru, // Russian
+  LI_COUNT,
+
+  LI_default = LI_en
+};
+
+extern const char *language_codes[LI_COUNT];
+extern const unsigned char language_ids[LI_COUNT];
+
+extern const char *run_title[LI_COUNT];
+extern const char *cancel_title[LI_COUNT];
+extern const char *show_cert_title[LI_COUNT];
+
+extern const char *new_application_title[LI_COUNT];
+extern const char *no_cert_title[LI_COUNT];
+extern const char *unverified_cert_title[LI_COUNT];
+extern const char *expired_cert_title[LI_COUNT];
+
+extern const char *self_signed_cert_text[LI_COUNT];
+extern const char *unknown_auth_cert_text[LI_COUNT];
+extern const char *verified_cert_text[LI_COUNT];
+extern const char *expired_cert_text[LI_COUNT];
+extern const char *generic_error_cert_text[LI_COUNT];
+extern const char *no_cert_text[LI_COUNT];

+ 98 - 70
direct/src/plugin/p3dOsxSplashWindow.cxx

@@ -36,6 +36,7 @@ P3DOsxSplashWindow::
 P3DOsxSplashWindow(P3DInstance *inst, bool make_visible) : 
   P3DSplashWindow(inst, make_visible)
 {
+  _font_attribs = NULL;
   _install_progress = 0;
   _progress_known = true;
   _received_data = 0;
@@ -59,6 +60,9 @@ P3DOsxSplashWindow::
     DisposeWindow(_toplevel_window);
     _toplevel_window = NULL;
   }
+  if (_font_attribs != NULL) {
+    CFRelease(_font_attribs);
+  }
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -123,6 +127,41 @@ set_wparams(const P3DWindowParams &wparams) {
       }
     }
   }
+
+  // Determine the attributes of the font we're going to use.
+  int symbolic = 0;
+  if (_font_style != FS_normal) {
+    symbolic |= kCTFontItalicTrait;
+  }
+  if (_font_weight > 500) {
+    symbolic |= kCTFontBoldTrait;
+  }
+  CFNumberRef symbolic_ref = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &symbolic);
+
+  CFStringRef traits_keys[1] = { kCTFontSymbolicTrait };
+  CFTypeRef traits_values[1] = { symbolic_ref };
+  CFDictionaryRef traits = CFDictionaryCreate(kCFAllocatorDefault, (const void **)&traits_keys, (const void **)&traits_values, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+
+  CFStringRef family = CFStringCreateWithCString(NULL, _font_family.c_str(), kCFStringEncodingUTF8);
+
+  CFStringRef attribs_keys[2] = { kCTFontFamilyNameAttribute, kCTFontTraitsAttribute };
+  CFTypeRef attribs_values[2] = { family, traits };
+  CFDictionaryRef attribs = CFDictionaryCreate(kCFAllocatorDefault, (const void **)&attribs_keys, (const void **)&attribs_values, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+
+  // Create the font object.
+  CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes(attribs);
+  CTFontRef font = CTFontCreateWithFontDescriptor(font_desc, _font_size, NULL);
+
+  CFStringRef keys[1] = { kCTFontAttributeName };
+  CFTypeRef values[1] = { font };
+  _font_attribs = CFDictionaryCreate(kCFAllocatorDefault, (const void **)&keys, (const void **)&values, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+
+  CFRelease(font);
+  CFRelease(font_desc);
+  CFRelease(attribs);
+  CFRelease(traits);
+  CFRelease(family);
+  CFRelease(symbolic_ref);
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -171,6 +210,9 @@ set_image_filename(const string &image_filename, ImagePlacement image_placement)
   case IP_button_click:
     load_image(_button_click_image, image_filename);
     break;
+
+  default:
+    return;
   }
 
   refresh();
@@ -333,10 +375,8 @@ paint_window_osx_cgcontext(CGContextRef context) {
   CGColorRef bg = CGColorCreate(rgb_space, bg_components);
 
   CGRect region = { { 0, 0 }, { _win_width, _win_height } };
-  CGContextBeginPath(context);
   CGContextSetFillColorWithColor(context, bg);
-  CGContextAddRect(context, region);
-  CGContextFillPath(context);
+  CGContextFillRect(context, region);
 
   CGColorRelease(bg);
   CGColorSpaceRelease(rgb_space);
@@ -445,8 +485,6 @@ handle_event_osx_event_record(const P3D_event_data &event) {
 ////////////////////////////////////////////////////////////////////
 bool P3DOsxSplashWindow::
 handle_event_osx_cocoa(const P3D_event_data &event) {
-  bool retval = false;
-
   assert(event._event_type == P3D_ET_osx_cocoa);
   const P3DCocoaEvent &ce = event._event._osx_cocoa._event;
 
@@ -455,33 +493,31 @@ handle_event_osx_cocoa(const P3D_event_data &event) {
     if (_visible) {
       CGContextRef context = ce.data.draw.context;
       paint_window_osx_cgcontext(context);
-      retval = true;
+      return true;
+    } else {
+      return false;
     }
-    break;
 
   case P3DCocoaEventMouseDown:
     set_mouse_data((int)ce.data.mouse.pluginX, (int)ce.data.mouse.pluginY, true);
-    retval = true;
-    break;
+    return true;
 
   case P3DCocoaEventMouseUp:
     set_mouse_data((int)ce.data.mouse.pluginX, (int)ce.data.mouse.pluginY, false);
-    retval = true;
-    break;
+    return true;
 
   case P3DCocoaEventMouseMoved:
   case P3DCocoaEventMouseDragged:
     set_mouse_data((int)ce.data.mouse.pluginX, (int)ce.data.mouse.pluginY, _mouse_down);
-    retval = true;
-    break;
+    return true;
 
   case P3DCocoaEventFocusChanged:
     _mouse_active = (ce.data.focus.hasFocus != 0);
-    retval = true;
-    break;
-  }
+    return true;
 
-  return retval;
+  default:
+    return false;
+  }
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -612,42 +648,33 @@ paint_image(CGContextRef context, const OsxImageData &image) {
 ////////////////////////////////////////////////////////////////////
 void P3DOsxSplashWindow::
 paint_progress_bar(CGContextRef context) {
-  // Get some colors we'll need.  We can't just use
-  // CGColorGetConstantColor(), since that requires 10.5.
   CGFloat fg_components[] = { _fgcolor_r / 255.0f, _fgcolor_g / 255.0f, _fgcolor_b / 255.0f, 1 };
   CGFloat bg_components[] = { _bgcolor_r / 255.0f, _bgcolor_g / 255.0f, _bgcolor_b / 255.0f, 1 };
   CGFloat bar_components[] = { _barcolor_r / 255.0f, _barcolor_g / 255.0f, _barcolor_b / 255.0f, 1 };
+  CGFloat bar_bg_components[] = { _bar_bgcolor_r / 255.0f, _bar_bgcolor_g / 255.0f, _bar_bgcolor_b / 255.0f, 1 };
   CGColorSpaceRef rgb_space = CGColorSpaceCreateDeviceRGB();
   CGColorRef fg = CGColorCreate(rgb_space, fg_components);
   CGColorRef bg = CGColorCreate(rgb_space, bg_components);
   CGColorRef bar = CGColorCreate(rgb_space, bar_components);
+  CGColorRef bar_bg = CGColorCreate(rgb_space, bar_bg_components);
 
+  // Get the proper placement for the progress bar.
   int bar_x, bar_y, bar_width, bar_height;
   get_bar_placement(bar_x, bar_y, bar_width, bar_height);
 
-  // We offset the bar by half a pixel, so we'll be drawing the
-  // one-pixel line through the middle of a pixel, and it won't try to
-  // antialias itself into a half-black two-pixel line.
-  float bar_xf = bar_x + 0.5;
-  float bar_yf = bar_y - 0.5;
-
-  CGRect bar_rect = { { bar_xf, bar_yf }, { bar_width, bar_height } };
+  CGRect bar_rect = { { bar_x, bar_y }, { bar_width, bar_height } };
 
   // Clear the entire progress bar to white (or the background color).
-  CGContextBeginPath(context);
-  CGContextSetFillColorWithColor(context, bg);
-  CGContextAddRect(context, bar_rect);
-  CGContextFillPath(context);
+  CGContextSetFillColorWithColor(context, bar_bg);
+  CGContextFillRect(context, bar_rect);
 
   // Draw the interior of the progress bar in blue (or the bar color).
   if (_progress_known) {
     int progress_width = (int)(bar_width * _install_progress + 0.5);
     if (progress_width != 0) {
-      CGRect prog = { { bar_xf, bar_yf }, { progress_width, bar_height } };
-      CGContextBeginPath(context);
+      CGRect prog = { { bar_x, bar_y }, { progress_width, bar_height } };
       CGContextSetFillColorWithColor(context, bar);
-      CGContextAddRect(context, prog);
-      CGContextFillPath(context);
+      CGContextFillRect(context, prog);
     }
   } else {
     // Progress is unknown.  Draw a moving block, not a progress bar
@@ -660,57 +687,58 @@ paint_progress_bar(CGContextRef context) {
       progress = block_travel * 2 - progress;
     }
 
-    CGRect prog = { { bar_xf + progress, bar_yf }, { block_width, bar_height } };
-    CGContextBeginPath(context);
+    CGRect prog = { { bar_x + progress, bar_y }, { block_width, bar_height } };
     CGContextSetFillColorWithColor(context, bar);
-    CGContextAddRect(context, prog);
-    CGContextFillPath(context);
+    CGContextFillRect(context, prog);
   }
-    
+
   // Draw the black stroke around the progress bar.
-  CGContextBeginPath(context);
-  CGContextSetLineWidth(context, 1);
-  CGContextSetStrokeColorWithColor(context, fg);
-  CGContextAddRect(context, bar_rect);
-  CGContextStrokePath(context);
+  if (_bar_border > 0) {
+    // We offset the border by half a pixel, so we'll be drawing the
+    // one-pixel line through the middle of a pixel, and it won't try to
+    // antialias itself into a half-black two-pixel line.
+    CGRect border_rect = { { bar_x - 0.5, bar_y - 0.5 },
+                           { bar_width + 1, bar_height + 1 } };
 
-  if (!_install_label.empty()) {
-    // Now draw the install_label right above it.
+    CGContextBeginPath(context);
+    CGContextSetLineWidth(context, 1);
+    CGContextSetStrokeColorWithColor(context, fg);
+
+    for (int i = 0; i < _bar_border; ++i) {
+      CGContextAddRect(context, border_rect);
+      border_rect.origin.x -= 1;
+      border_rect.origin.y -= 1;
+      border_rect.size.width += 2;
+      border_rect.size.height += 2;
+    }
+    CGContextStrokePath(context);
+  }
 
+  if (!_install_label.empty()) {
     // Need to invert the text so it won't be upside-down.
     CGAffineTransform text_xform = CGAffineTransformMakeScale(1, -1);
     CGContextSetTextMatrix(context, text_xform);
 
-    // Choose a suitable font.
-    float text_height = 15.0;
-    CGContextSelectFont(context, _font_family.c_str(), text_height, kCGEncodingMacRoman);
-
-    // Measure the text, for centering.
-    CGContextSetTextPosition(context, 0, 0);
-    CGContextSetTextDrawingMode(context, kCGTextInvisible);
-    CGContextShowText(context, _install_label.data(), _install_label.length());
-    CGPoint end_point = CGContextGetTextPosition(context);
-    float text_width = end_point.x;
-
-    int text_x = (int)(_win_width - text_width) / 2;
-    int text_y = (int)(bar_y - text_height * 1.5);
-
-    // Clear the rectangle behind the text to bg.
-    CGRect text_rect = { { text_x - 2, text_y - 2 }, { text_width + 4, text_height + 4 } };
+    // Now draw the install_label right above it.
+    CFStringRef string = CFStringCreateWithCString(NULL, _install_label.c_str(), kCFStringEncodingUTF8);
+    CFAttributedStringRef attr_string = CFAttributedStringCreate(NULL, string, _font_attribs);
+    CTLineRef line = CTLineCreateWithAttributedString(attr_string);
 
-    CGContextBeginPath(context);
-    CGContextAddRect(context, text_rect);
-    CGContextSetFillColorWithColor(context, bg);
-    CGContextFillPath(context);
+    // Determine the placement based on the size of the text.
+    CGRect bounds = CTLineGetImageBounds(line, context);
+    float text_x = (_win_width - bounds.size.width) / 2.0f - bounds.origin.x;
+    float text_y = bar_y + bounds.origin.y - 4 - _bar_border;
 
     // And finally, draw the text.
-    CGContextSetTextDrawingMode(context, kCGTextFill);
-    CGContextSetFillColorWithColor(context, fg);
+    CGContextSetTextPosition(context, text_x, text_y);
+    CTLineDraw(line, context);
 
-    CGContextShowTextAtPoint(context, text_x, text_y + text_height, 
-                             _install_label.data(), _install_label.length());
+    CFRelease(line);
+    CFRelease(attr_string);
+    CFRelease(string);
   }
 
+  CGColorRelease(bar_bg);
   CGColorRelease(bar);
   CGColorRelease(bg);
   CGColorRelease(fg);

+ 2 - 0
direct/src/plugin/p3dOsxSplashWindow.h

@@ -83,6 +83,8 @@ private:
   OsxImageData _button_rollover_image;
   OsxImageData _button_click_image;
 
+  CFDictionaryRef _font_attribs;
+
   string _install_label;
   double _install_progress;
   bool _progress_known;

+ 3 - 1
direct/src/plugin/p3dSession.cxx

@@ -891,11 +891,13 @@ start_p3dpython(P3DInstance *inst) {
     // These are the enviroment variables we forward from the current
     // environment, if they are set.
     const char *keep[] = {
-      "HOME", "USER", 
+      "HOME", "USER",
 #ifdef _WIN32
       "SYSTEMROOT", "USERPROFILE", "COMSPEC",
       "SYSTEMDRIVE", "ALLUSERSPROFILE", "APPDATA", "COMMONPROGRAMFILES",
       "PROGRAMFILES", "WINDIR", "PROGRAMDATA", "USERDOMAIN",
+#else
+      "LANGUAGE", "LC_ALL", "LC_MESSAGES", "LANG",
 #endif
 #ifdef HAVE_X11
       "DISPLAY", "XAUTHORITY",

+ 13 - 3
direct/src/plugin/p3dWinSplashWindow.cxx

@@ -34,6 +34,7 @@ P3DWinSplashWindow(P3DInstance *inst, bool make_visible) :
   _thread = NULL;
   _thread_id = 0;
   _hwnd = NULL;
+  _font = NULL;
   _fg_brush = NULL;
   _bg_brush = NULL;
   _bar_brush = NULL;
@@ -498,6 +499,17 @@ make_window() {
     ShowWindow(_hwnd, SW_HIDE);
   }
 
+  // Load the requested font.
+  _font = CreateFontA(-_font_size, 0, 0, 0, _font_weight,
+                      (_font_style != FS_normal), FALSE, FALSE,
+                      ANSI_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS,
+                      CLEARTYPE_QUALITY, VARIABLE_PITCH, _font_family.c_str());
+
+  if (_font == NULL) {
+    nout << "CreateFont failed: " << GetLastError() << "\n";
+    _font = (HFONT)GetStockObject(ANSI_VAR_FONT);
+  }
+
   _fg_brush = CreateSolidBrush(RGB(_fgcolor_r, _fgcolor_g, _fgcolor_b));
   _bg_brush = CreateSolidBrush(RGB(_bgcolor_r, _bgcolor_g, _bgcolor_b));
   _bar_brush = CreateSolidBrush(RGB(_barcolor_r, _barcolor_g, _barcolor_b));
@@ -840,12 +852,10 @@ paint_progress_bar(HDC dc) {
 
   if (!_drawn_label.empty()) {
     // Now draw the install_label right above it.
-
     const char *text = _drawn_label.c_str();
-    HFONT font = (HFONT)GetStockObject(ANSI_VAR_FONT); 
 
     // Measure the text, for centering.
-    SelectObject(dc, font);
+    SelectObject(dc, _font);
     SIZE text_size;
     GetTextExtentPoint32(dc, text, strlen(text), &text_size);
 

+ 1 - 0
direct/src/plugin/p3dWinSplashWindow.h

@@ -109,6 +109,7 @@ private:
   HANDLE _thread;
   DWORD _thread_id;
   HWND _hwnd;
+  HFONT _font;
   HBRUSH _fg_brush;
   HBRUSH _bg_brush;
   HBRUSH _bar_brush;

+ 5 - 5
direct/src/plugin_standalone/panda3dBase.cxx

@@ -342,7 +342,7 @@ make_parent_window() {
 ////////////////////////////////////////////////////////////////////
 P3D_instance *Panda3DBase::
 create_instance(const string &p3d, bool start_instance,
-                char **args, int num_args, const int &p3d_offset) {
+                char **args, int num_args, int p3d_offset) {
   // Check to see if the p3d filename we were given is a URL, or a
   // local file.
   Filename p3d_filename = Filename::from_os_specific(p3d);
@@ -356,9 +356,9 @@ create_instance(const string &p3d, bool start_instance,
 
     p3d_filename.make_absolute();
     os_p3d_filename = p3d_filename.to_os_specific();
-  } 
+  }
   if (is_local) {
-    read_p3d_info(p3d_filename);
+    read_p3d_info(p3d_filename, p3d_offset);
   }
 
   // Build up the token list.
@@ -454,9 +454,9 @@ delete_instance(P3D_instance *inst) {
 //               parameters (like width and height).
 ////////////////////////////////////////////////////////////////////
 bool Panda3DBase::
-read_p3d_info(const Filename &p3d_filename) {
+read_p3d_info(const Filename &p3d_filename, int p3d_offset) {
   PT(Multifile) mf = new Multifile;
-  if (!mf->open_read(p3d_filename)) {
+  if (!mf->open_read(p3d_filename, p3d_offset)) {
     return false;
   }
   int si = mf->find_subfile("p3d_info.xml");

+ 2 - 2
direct/src/plugin_standalone/panda3dBase.h

@@ -49,10 +49,10 @@ protected:
 
   P3D_instance *
   create_instance(const string &p3d, bool start_instance,
-                  char **args, int num_args, const int &p3d_offset = 0);
+                  char **args, int num_args, int p3d_offset = 0);
   void delete_instance(P3D_instance *instance);
 
-  bool read_p3d_info(const Filename &p3d_filename);
+  bool read_p3d_info(const Filename &p3d_filename, int p3d_offset = 0);
   bool parse_token(const char *arg);
   bool parse_int_pair(const char *arg, int &x, int &y);
   string lookup_token(const string &keyword) const;

File diff suppressed because it is too large
+ 221 - 218
dtool/metalibs/dtoolconfig/pydtool.cxx


+ 15 - 0
dtool/src/dtoolbase/typeHandle.I

@@ -263,3 +263,18 @@ INLINE TypeHandle::
 operator bool () const {
   return (_index != 0);
 }
+
+////////////////////////////////////////////////////////////////////
+//     Function: TypeHandle::from_index
+//       Access: Public, Static
+//  Description: Creates a TypeHandle from a type index without
+//               error checking, for use by internal functions.
+//
+//               See TypeRegistry::find_type_by_id().
+////////////////////////////////////////////////////////////////////
+INLINE TypeHandle TypeHandle::
+from_index(int index) {
+  TypeHandle handle;
+  handle._index = index;
+  return handle;
+}

+ 4 - 1
dtool/src/dtoolbase/typeHandle.h

@@ -82,7 +82,7 @@ class TypedObject;
 //               ancestry of a particular type may be queried, and the
 //               type name may be retrieved for run-time display.
 ////////////////////////////////////////////////////////////////////
-class EXPCL_DTOOL TypeHandle {
+class EXPCL_DTOOL TypeHandle FINAL {
 PUBLISHED:
   enum MemoryClass {
     MC_singleton,
@@ -140,6 +140,9 @@ PUBLISHED:
   INLINE static TypeHandle none();
   INLINE operator bool () const;
 
+public:
+  INLINE static TypeHandle from_index(int index);
+
 private:
   int _index;
   static TypeHandle _none;

+ 34 - 14
dtool/src/interrogate/functionRemap.cxx

@@ -17,6 +17,7 @@
 #include "interrogate.h"
 #include "parameterRemap.h"
 #include "parameterRemapThis.h"
+#include "parameterRemapHandleToInt.h"
 #include "parameterRemapUnchanged.h"
 #include "interfaceMaker.h"
 #include "interrogateBuilder.h"
@@ -146,8 +147,13 @@ call_function(ostream &out, int indent_level, bool convert_result,
   } else if (_type == T_typecast_method) {
     // A typecast method can be invoked implicitly.
     string cast_expr =
-      "(" + _return_type->get_orig_type()->get_local_name(&parser) +
-      ")(*" + container + ")";
+      "(" + _return_type->get_orig_type()->get_local_name(&parser) + ")";
+
+    if (TypeManager::is_handle(_cpptype)) {
+      cast_expr += "(" + container + ")";
+    } else {
+      cast_expr += "(*" + container + ")";
+    }
 
     if (!convert_result) {
       return_expr = cast_expr;
@@ -177,10 +183,7 @@ call_function(ostream &out, int indent_level, bool convert_result,
 
   } else if (_type == T_constructor) {
     // A special case for constructors.
-    string defconstruct = builder.in_defconstruct(_cpptype->get_local_name(&parser));
-    if (pexprs.empty() && !defconstruct.empty()) {
-      return_expr = defconstruct;
-    } else if (_extension) {
+    if (_extension) {
       // Extension constructors are a special case.  We assume there is a
       // default constructor for the class, and the actual construction is
       // done by an __init__ method.
@@ -192,8 +195,22 @@ call_function(ostream &out, int indent_level, bool convert_result,
         << get_call_str("result", pexprs) << ";\n";
 
       return_expr = "result";
+
     } else {
-      return_expr = "new " + get_call_str(container, pexprs);
+      string defconstruct = builder.in_defconstruct(_cpptype->get_local_name(&parser));
+      string call_expr;
+
+      if (pexprs.empty() && !defconstruct.empty()) {
+        call_expr = defconstruct;
+      } else {
+        call_expr = get_call_str(container, pexprs);
+      }
+
+      if (!_return_type->return_value_needs_management()) {
+        return_expr = _return_type->get_return_expr(call_expr);
+      } else {
+        return_expr = "new " + call_expr;
+      }
     }
     if (_void_return) {
       nout << "Error, constructor for " << *_cpptype << " returning void.\n";
@@ -448,12 +465,9 @@ get_call_str(const string &container, const vector_string &pexprs) const {
       } else if (_has_this && !container.empty()) {
         // If we have a "this" parameter, the calling convention is also
         // a bit different.
-        if (container == "local_this") {
-          // This isn't important, it just looks a bit prettier.
-          call << container << "->" << _cppfunc->get_local_name();
-        } else {
-          call << "(" << container << ")->" << _cppfunc->get_local_name();
-        }
+        call << "(";
+        _parameters[0]._remap->pass_parameter(call, container);
+        call << ")." << _cppfunc->get_local_name();
 
       } else {
         call << _cppfunc->get_local_name(&parser);
@@ -569,7 +583,13 @@ setup_properties(const InterrogateFunction &ifunc, InterfaceMaker *interface_mak
       Parameter param;
       param._name = "this";
       param._has_name = true;
-      param._remap = new ParameterRemapThis(_cpptype, _const_method);
+      if (_const_method) {
+        CPPType *const_type = CPPType::new_type(new CPPConstType(_cpptype));
+        param._remap = interface_maker->remap_parameter(_cpptype, const_type);
+      } else {
+        param._remap = interface_maker->remap_parameter(_cpptype, _cpptype);
+      }
+      //  param._remap = new ParameterRemapThis(_cpptype, _const_method);
       _parameters.push_back(param);
       _first_true_parameter = 1;
     }

+ 41 - 5
dtool/src/interrogate/interfaceMakerC.cxx

@@ -16,6 +16,7 @@
 #include "interrogateBuilder.h"
 #include "interrogate.h"
 #include "functionRemap.h"
+#include "parameterRemapHandleToInt.h"
 #include "parameterRemapUnchanged.h"
 #include "typeManager.h"
 
@@ -53,6 +54,14 @@ InterfaceMakerC::
 ////////////////////////////////////////////////////////////////////
 void InterfaceMakerC::
 write_prototypes(ostream &out,ostream *out_h) {
+  // The 'used' attribute prevents emscripten from optimizing it out.
+  out <<
+    "#if __GNUC__ >= 4\n"
+    "#define EXPORT_FUNC extern \"C\" __attribute__((used, visibility(\"default\")))\n"
+    "#else\n"
+    "#define EXPORT_FUNC extern \"C\"\n"
+    "#endif\n\n";
+
   FunctionsByIndex::iterator fi;
   for (fi = _functions.begin(); fi != _functions.end(); ++fi) {
     Function *func = (*fi).second;
@@ -81,6 +90,32 @@ write_functions(ostream &out) {
   InterfaceMaker::write_functions(out);
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: InterfaceMakerC::remap_parameter
+//       Access: Public, Virtual
+//  Description: Allocates a new ParameterRemap object suitable to the
+//               indicated parameter type.  If struct_type is
+//               non-NULL, it is the type of the enclosing class for
+//               the function (method) in question.
+//
+//               The return value is a newly-allocated ParameterRemap
+//               object, if the parameter type is acceptable, or NULL
+//               if the parameter type cannot be handled.
+////////////////////////////////////////////////////////////////////
+ParameterRemap *InterfaceMakerC::
+remap_parameter(CPPType *struct_type, CPPType *param_type) {
+  // Wrap TypeHandle and ButtonHandle, which are practically just
+  // ints, as an integer instead of a pointer.  It makes things easier
+  // on the scripting language, especially if there has to be a
+  // dynamic downcasting system on the scripting language side.
+   if (TypeManager::is_handle(param_type)) {
+    return new ParameterRemapHandleToInt(param_type);
+
+  } else {
+    return InterfaceMaker::remap_parameter(struct_type, param_type);
+  }
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: InterfaceMakerC::synthesize_this_parameter
 //       Access: Public, Virtual
@@ -140,8 +175,13 @@ write_prototype_for(ostream &out, InterfaceMaker::Function *func) {
 
   for (ri = func->_remaps.begin(); ri != func->_remaps.end(); ++ri) {
     FunctionRemap *remap = (*ri);
+
+    if (remap->_extension || (remap->_flags & FunctionRemap::F_explicit_self)) {
+      continue;
+    }
+
     if (output_function_names) {
-      out << "extern \"C\" ";
+      out << "EXPORT_FUNC ";
     }
     write_function_header(out, func, remap, false);
     out << ";\n";
@@ -216,10 +256,6 @@ write_function_instance(ostream &out, InterfaceMaker::Function *func,
 void InterfaceMakerC::
 write_function_header(ostream &out, InterfaceMaker::Function *func,
                       FunctionRemap *remap, bool newline) {
-  if (remap->_extension || (remap->_flags & FunctionRemap::F_explicit_self)) {
-    return;
-  }
-
   if (remap->_void_return) {
     out << "void";
   } else {

+ 2 - 0
dtool/src/interrogate/interfaceMakerC.h

@@ -36,6 +36,8 @@ public:
   virtual void write_prototypes(ostream &out,ostream *out_h);
   virtual void write_functions(ostream &out);
 
+  virtual ParameterRemap *remap_parameter(CPPType *struct_type, CPPType *param_type);
+
   virtual bool synthesize_this_parameter();
 
 protected:

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

@@ -1499,6 +1499,8 @@ write_module(ostream &out, ostream *out_h, InterrogateModuleDef *def) {
       << "\n"
       << "#ifdef _WIN32\n"
       << "extern \"C\" __declspec(dllexport) PyObject *PyInit_" << def->module_name << "();\n"
+      << "#elif __GNUC__ >= 4\n"
+      << "extern \"C\" __attribute__((visibility(\"default\"))) PyInit_" << def->module_name << "();\n"
       << "#else\n"
       << "extern \"C\" PyObject *PyInit_" << def->module_name << "();\n"
       << "#endif\n"
@@ -1512,6 +1514,8 @@ write_module(ostream &out, ostream *out_h, InterrogateModuleDef *def) {
       << "\n"
       << "#ifdef _WIN32\n"
       << "extern \"C\" __declspec(dllexport) void init" << def->module_name << "();\n"
+      << "#elif __GNUC__ >= 4\n"
+      << "extern \"C\" __attribute__((visibility(\"default\"))) init" << def->module_name << "();\n"
       << "#else\n"
       << "extern \"C\" void init" << def->module_name << "();\n"
       << "#endif\n"

+ 2 - 0
dtool/src/interrogate/interfaceMakerPythonObj.cxx

@@ -136,6 +136,8 @@ write_module(ostream &out,ostream *out_h, InterrogateModuleDef *def) {
 
       << "#ifdef _WIN32\n"
       << "extern \"C\" __declspec(dllexport) INIT_FUNC();\n"
+      << "#elif __GNUC__ >= 4\n"
+      << "extern \"C\" __attribute__((visibility(\"default\"))) INIT_FUNC();\n"
       << "#else\n"
       << "extern \"C\" INIT_FUNC();\n"
       << "#endif\n\n"

+ 2 - 0
dtool/src/interrogate/interfaceMakerPythonSimple.cxx

@@ -123,6 +123,8 @@ write_module(ostream &out,ostream *out_h, InterrogateModuleDef *def) {
 
       << "#ifdef _WIN32\n"
       << "extern \"C\" __declspec(dllexport) INIT_FUNC();\n"
+      << "#elif __GNUC__ >= 4\n"
+      << "extern \"C\" __attribute__((visibility(\"default\"))) INIT_FUNC();\n"
       << "#else\n"
       << "extern \"C\" INIT_FUNC();\n"
       << "#endif\n\n"

+ 1 - 0
dtool/src/interrogate/interrogate_composite2.cxx

@@ -14,5 +14,6 @@
 #include "parameterRemapReferenceToPointer.cxx"
 #include "parameterRemapThis.cxx"
 #include "parameterRemapToString.cxx"
+#include "parameterRemapHandleToInt.cxx"
 #include "parameterRemapUnchanged.cxx"
 

+ 65 - 0
dtool/src/interrogate/parameterRemapHandleToInt.cxx

@@ -0,0 +1,65 @@
+// Filename: parameterRemapHandleToInt.cxx
+// Created by:  rdb (08Sep15)
+//
+////////////////////////////////////////////////////////////////////
+//
+// 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."
+//
+////////////////////////////////////////////////////////////////////
+
+#include "parameterRemapHandleToInt.h"
+#include "interrogate.h"
+#include "interrogateBuilder.h"
+#include "typeManager.h"
+
+#include "cppType.h"
+#include "cppDeclaration.h"
+#include "cppConstType.h"
+#include "cppPointerType.h"
+
+////////////////////////////////////////////////////////////////////
+//     Function: ParameterRemapHandleToInt::Constructor
+//       Access: Public
+//  Description:
+////////////////////////////////////////////////////////////////////
+ParameterRemapHandleToInt::
+ParameterRemapHandleToInt(CPPType *orig_type) :
+  ParameterRemap(orig_type)
+{
+  _new_type = TypeManager::get_int_type();
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: ParameterRemapHandleToInt::pass_parameter
+//       Access: Public, Virtual
+//  Description: Outputs an expression that converts the indicated
+//               variable from the new type to the original type, for
+//               passing into the actual C++ function.
+////////////////////////////////////////////////////////////////////
+void ParameterRemapHandleToInt::
+pass_parameter(ostream &out, const string &variable_name) {
+  CPPType *unwrapped = TypeManager::unwrap_const(_orig_type);
+
+  if (unwrapped->get_local_name(&parser) == "TypeHandle") {
+    out << "TypeHandle::from_index(" << variable_name << ")";
+  } else {
+    out << unwrapped->get_local_name(&parser) << "(" << variable_name << ")";
+  }
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: ParameterRemapHandleToInt::get_return_expr
+//       Access: Public, Virtual
+//  Description: Returns an expression that evalutes to the
+//               appropriate value type for returning from the
+//               function, given an expression of the original type.
+////////////////////////////////////////////////////////////////////
+string ParameterRemapHandleToInt::
+get_return_expr(const string &expression) {
+  return "(" + expression + ").get_index()";
+}

+ 40 - 0
dtool/src/interrogate/parameterRemapHandleToInt.h

@@ -0,0 +1,40 @@
+// Filename: parameterRemapHandleToInt.h
+// Created by:  rdb (08Sep15)
+//
+////////////////////////////////////////////////////////////////////
+//
+// 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 PARAMETERREMAPHANDLETOINT_H
+#define PARAMETERREMAPHANDLETOINT_H
+
+#include "dtoolbase.h"
+
+#include "parameterRemap.h"
+
+////////////////////////////////////////////////////////////////////
+//       Class : ParameterRemapHandleToInt
+// Description : A ParameterRemap class that handles remapping a
+//               Handle parameter to an integer.  This makes it
+//               easier to set up a dynamic typing system on the
+//               scripting language side.
+//
+//               It also applies to ButtonHandle or any other class
+//               with the same semantics, because why not.
+////////////////////////////////////////////////////////////////////
+class ParameterRemapHandleToInt : public ParameterRemap {
+public:
+  ParameterRemapHandleToInt(CPPType *orig_type);
+
+  virtual void pass_parameter(ostream &out, const string &variable_name);
+  virtual string get_return_expr(const string &expression);
+};
+
+#endif

+ 2 - 2
dtool/src/interrogate/parameterRemapThis.cxx

@@ -45,8 +45,8 @@ ParameterRemapThis(CPPType *type, bool is_const) :
 //               passing into the actual C++ function.
 ////////////////////////////////////////////////////////////////////
 void ParameterRemapThis::
-pass_parameter(ostream &out, const string &) {
-  out << "**invalid**";
+pass_parameter(ostream &out, const string &variable_name) {
+  out << "(*" << variable_name << ")";
 }
 
 ////////////////////////////////////////////////////////////////////

+ 26 - 1
dtool/src/interrogate/typeManager.cxx

@@ -1820,6 +1820,31 @@ is_Py_buffer(CPPType *type) {
   }
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: TypeManager::is_handle
+//       Access: Public, Static
+//  Description: Returns true if the indicated type is TypeHandle
+//               or a class with identical semantics like ButtonHandle.
+////////////////////////////////////////////////////////////////////
+bool TypeManager::
+is_handle(CPPType *type) {
+  switch (type->get_subtype()) {
+  case CPPDeclaration::ST_const:
+    return is_handle(type->as_const_type()->_wrapped_around);
+
+  case CPPDeclaration::ST_extension:
+  case CPPDeclaration::ST_struct:
+    return (type->get_local_name(&parser) == "TypeHandle" ||
+            type->get_local_name(&parser) == "ButtonHandle");
+
+  case CPPDeclaration::ST_typedef:
+    return is_handle(type->as_typedef_type()->_type);
+
+  default:
+    return false;
+  }
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: TypeManager::is_ostream
 //       Access: Public, Static
@@ -2631,7 +2656,7 @@ is_trivial(CPPType *source_type) {
     return is_trivial(source_type->as_typedef_type()->_type);
 
   default:
-    if (source_type->is_trivial()) {
+    if (source_type->is_trivial() || is_handle(source_type)) {
       return true;
     } else {
       // This is a bit of a hack.  is_trivial() returns false for types that

+ 1 - 0
dtool/src/interrogate/typeManager.h

@@ -112,6 +112,7 @@ public:
   static bool is_PyUnicodeObject(CPPType *type);
   static bool is_pointer_to_Py_buffer(CPPType *type);
   static bool is_Py_buffer(CPPType *type);
+  static bool is_handle(CPPType *type);
   static bool involves_unpublished(CPPType *type);
   static bool involves_protected(CPPType *type);
 

+ 2 - 0
makepanda/makepanda.py

@@ -5055,9 +5055,11 @@ if (RTDIST or RUNTIME):
     if (PkgSkip("FLTK")==0):
       OPTS.append("FLTK")
       TargetAdd('plugin_p3dCert.obj', opts=OPTS, input='p3dCert.cxx')
+      TargetAdd('plugin_p3dCert_strings.obj', opts=OPTS, input='p3dCert_strings.cxx')
       TargetAdd('p3dcert.exe', input='plugin_mkdir_complete.obj')
       TargetAdd('p3dcert.exe', input='plugin_wstring_encode.obj')
       TargetAdd('p3dcert.exe', input='plugin_p3dCert.obj')
+      TargetAdd('p3dcert.exe', input='plugin_p3dCert_strings.obj')
       OPTS=['OPENSSL', 'FLTK', 'X11', 'WINCOMCTL', 'WINSOCK', 'WINGDI', 'WINUSER', 'ADVAPI', 'WINOLE', 'WINSHELL', 'SUBSYSTEM:WINDOWS']
       if GetTarget() == 'darwin':
           OPTS += ['OPT:2']

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

@@ -1,4 +1,4 @@
-defconstruct TypeHandle new TypeHandle(TypeHandle::none())
+defconstruct TypeHandle TypeHandle(TypeHandle::none())
 
 forcetype PandaSystem
 forcetype DSearchPath

+ 0 - 1
panda/src/glstuff/glGraphicsStateGuardian_src.cxx

@@ -11331,7 +11331,6 @@ upload_texture_image(CLP(TextureContext) *gtc, bool needs_reload,
               if (_supports_clear_buffer) {
                 // For buffer textures we need to clear the underlying storage.
                 string clear_data = tex->get_clear_data();
-                cerr << "clearing buffer data\n";
 
                 _glClearBufferData(GL_TEXTURE_BUFFER, internal_format, external_format,
                                    component_type, (const void *)clear_data.data());

+ 37 - 37
panda/src/linmath/luse.N

@@ -1,46 +1,46 @@
 
-defconstruct LPoint2f new LPoint2f(0.0f)
-defconstruct LPoint3f new LPoint3f(0.0f)
-defconstruct LPoint4f new LPoint4f(0.0f)
-defconstruct LPoint2d new LPoint2d(0.0)
-defconstruct LPoint3d new LPoint3d(0.0)
-defconstruct LPoint4d new LPoint4d(0.0)
-defconstruct LPoint2i new LPoint2i(0)
-defconstruct LPoint3i new LPoint3i(0)
-defconstruct LPoint4i new LPoint4i(0)
+defconstruct LPoint2f LPoint2f(0.0f)
+defconstruct LPoint3f LPoint3f(0.0f)
+defconstruct LPoint4f LPoint4f(0.0f)
+defconstruct LPoint2d LPoint2d(0.0)
+defconstruct LPoint3d LPoint3d(0.0)
+defconstruct LPoint4d LPoint4d(0.0)
+defconstruct LPoint2i LPoint2i(0)
+defconstruct LPoint3i LPoint3i(0)
+defconstruct LPoint4i LPoint4i(0)
 
-defconstruct LVecBase2f new LVecBase2f(0.0f)
-defconstruct LVecBase3f new LVecBase3f(0.0f)
-defconstruct LVecBase4f new LVecBase4f(0.0f)
-defconstruct LVecBase2d new LVecBase2d(0.0)
-defconstruct LVecBase3d new LVecBase3d(0.0)
-defconstruct LVecBase4d new LVecBase4d(0.0)
-defconstruct LVecBase2i new LVecBase2i(0)
-defconstruct LVecBase3i new LVecBase3i(0)
-defconstruct LVecBase4i new LVecBase4i(0)
+defconstruct LVecBase2f LVecBase2f(0.0f)
+defconstruct LVecBase3f LVecBase3f(0.0f)
+defconstruct LVecBase4f LVecBase4f(0.0f)
+defconstruct LVecBase2d LVecBase2d(0.0)
+defconstruct LVecBase3d LVecBase3d(0.0)
+defconstruct LVecBase4d LVecBase4d(0.0)
+defconstruct LVecBase2i LVecBase2i(0)
+defconstruct LVecBase3i LVecBase3i(0)
+defconstruct LVecBase4i LVecBase4i(0)
 
-defconstruct LVector2f new LVector2f(0.0f)
-defconstruct LVector3f new LVector3f(0.0f)
-defconstruct LVector4f new LVector4f(0.0f)
-defconstruct LVector2d new LVector2d(0.0)
-defconstruct LVector3d new LVector3d(0.0)
-defconstruct LVector4d new LVector4d(0.0)
-defconstruct LVector2i new LVector2i(0)
-defconstruct LVector3i new LVector3i(0)
-defconstruct LVector4i new LVector4i(0)
+defconstruct LVector2f LVector2f(0.0f)
+defconstruct LVector3f LVector3f(0.0f)
+defconstruct LVector4f LVector4f(0.0f)
+defconstruct LVector2d LVector2d(0.0)
+defconstruct LVector3d LVector3d(0.0)
+defconstruct LVector4d LVector4d(0.0)
+defconstruct LVector2i LVector2i(0)
+defconstruct LVector3i LVector3i(0)
+defconstruct LVector4i LVector4i(0)
 
-defconstruct LMatrix3f new LMatrix3f(LMatrix3f::ident_mat())
-defconstruct LMatrix4f new LMatrix4f(LMatrix4f::ident_mat())
-defconstruct LMatrix3d new LMatrix3d(LMatrix3d::ident_mat())
-defconstruct LMatrix4d new LMatrix4d(LMatrix4d::ident_mat())
+defconstruct LMatrix3f LMatrix3f(LMatrix3f::ident_mat())
+defconstruct LMatrix4f LMatrix4f(LMatrix4f::ident_mat())
+defconstruct LMatrix3d LMatrix3d(LMatrix3d::ident_mat())
+defconstruct LMatrix4d LMatrix4d(LMatrix4d::ident_mat())
 
-defconstruct LQuaternionf new LQuaternionf(LQuaternionf::ident_quat())
-defconstruct LRotationf new LRotationf(LQuaternionf::ident_quat())
-defconstruct LOrientationf new LOrientationf(LQuaternionf::ident_quat())
+defconstruct LQuaternionf LQuaternionf(LQuaternionf::ident_quat())
+defconstruct LRotationf LRotationf(LQuaternionf::ident_quat())
+defconstruct LOrientationf LOrientationf(LQuaternionf::ident_quat())
 
-defconstruct LQuaterniond new LQuaterniond(LQuaterniond::ident_quat())
-defconstruct LRotationd new LRotationd(LQuaterniond::ident_quat())
-defconstruct LOrientationd new LOrientationd(LQuaterniond::ident_quat())
+defconstruct LQuaterniond LQuaterniond(LQuaterniond::ident_quat())
+defconstruct LRotationd LRotationd(LQuaterniond::ident_quat())
+defconstruct LOrientationd LOrientationd(LQuaterniond::ident_quat())
 
 # We don't want to accidentally include any of the _src files in the
 # generated output, since these files aren't intended to be included by

+ 5 - 8
panda/src/pgraphnodes/lightLensNode.cxx

@@ -62,15 +62,12 @@ LightLensNode::
 LightLensNode::
 LightLensNode(const LightLensNode &copy) :
   Light(copy),
-  Camera(copy)
+  Camera(copy),
+  _shadow_caster(copy._shadow_caster),
+  _sb_xsize(copy._sb_xsize),
+  _sb_ysize(copy._sb_ysize),
+  _sb_sort(-10)
 {
-  _shadow_caster = false;
-  _sb_xsize = 512;
-  _sb_ysize = 512;
-  _sb_sort = -10;
-  // Backface culling helps eliminating artifacts.
-  set_initial_state(RenderState::make(CullFaceAttrib::make_reverse(),
-                    ColorWriteAttrib::make(ColorWriteAttrib::C_off)));
 }
 
 ////////////////////////////////////////////////////////////////////

+ 5 - 24
panda/src/pgraphnodes/pointLight.cxx

@@ -69,22 +69,22 @@ PointLight(const string &name) :
 {
   PT(Lens) lens;
   lens = new PerspectiveLens(90, 90);
-  lens->set_view_vector(1, 0, 0, 0, 0, 1);
+  lens->set_view_vector(1, 0, 0, 0, -1, 0);
   set_lens(0, lens);
   lens = new PerspectiveLens(90, 90);
-  lens->set_view_vector(-1, 0, 0, 0, 0, 1);
+  lens->set_view_vector(-1, 0, 0, 0, -1, 0);
   set_lens(1, lens);
   lens = new PerspectiveLens(90, 90);
   lens->set_view_vector(0, 1, 0, 0, 0, 1);
   set_lens(2, lens);
   lens = new PerspectiveLens(90, 90);
-  lens->set_view_vector(0, -1, 0, 0, 0, 1);
+  lens->set_view_vector(0, -1, 0, 0, 0, -1);
   set_lens(3, lens);
   lens = new PerspectiveLens(90, 90);
-  lens->set_view_vector(0, 0, 1, 0, 0, 1);
+  lens->set_view_vector(0, 0, 1, 0, -1, 0);
   set_lens(4, lens);
   lens = new PerspectiveLens(90, 90);
-  lens->set_view_vector(0, 0, -1, 0, 0, 1);
+  lens->set_view_vector(0, 0, -1, 0, -1, 0);
   set_lens(5, lens);
 }
 
@@ -100,25 +100,6 @@ PointLight(const PointLight &copy) :
   LightLensNode(copy),
   _cycler(copy._cycler)
 {
-  PT(Lens) lens;
-  lens = new PerspectiveLens(90, 90);
-  lens->set_view_vector(1, 0, 0, 0, 0, 1);
-  set_lens(0, lens);
-  lens = new PerspectiveLens(90, 90);
-  lens->set_view_vector(-1, 0, 0, 0, 0, 1);
-  set_lens(1, lens);
-  lens = new PerspectiveLens(90, 90);
-  lens->set_view_vector(0, 1, 0, 0, 0, 1);
-  set_lens(2, lens);
-  lens = new PerspectiveLens(90, 90);
-  lens->set_view_vector(0, -1, 0, 0, 0, 1);
-  set_lens(3, lens);
-  lens = new PerspectiveLens(90, 90);
-  lens->set_view_vector(0, 0, 1, 0, 0, 1);
-  set_lens(4, lens);
-  lens = new PerspectiveLens(90, 90);
-  lens->set_view_vector(0, 0, -1, 0, 0, 1);
-  set_lens(5, lens);
 }
 
 ////////////////////////////////////////////////////////////////////

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

@@ -25,7 +25,7 @@
 //               device, including keyboard buttons and mouse buttons
 //               (but see KeyboardButton and MouseButton).
 ////////////////////////////////////////////////////////////////////
-class EXPCL_PANDA_PUTIL ButtonHandle {
+class EXPCL_PANDA_PUTIL ButtonHandle FINAL {
 PUBLISHED:
   INLINE ButtonHandle();
   INLINE ButtonHandle(int index);

+ 1 - 1
panda/src/putil/config_util.N

@@ -1,4 +1,4 @@
-defconstruct ButtonHandle new ButtonHandle(0)
+defconstruct ButtonHandle ButtonHandle(0)
 
 ignoremember _factory
 ignoremember get_factory

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