diff --git a/direct/src/p3d/Packager.py b/direct/src/p3d/Packager.py index 5386bb8d71..8685de09ea 100644 --- a/direct/src/p3d/Packager.py +++ b/direct/src/p3d/Packager.py @@ -375,6 +375,9 @@ class Packager: # This records the current list of modules we have added so # far. self.freezer = FreezeTool.Freezer(platform = self.packager.platform) + + # Map of extensions to files to number (ignored by dir) + self.ignoredDirFiles = {} def close(self): """ Writes out the contents of the current package. Returns True @@ -385,6 +388,13 @@ class Packager: message = 'Cannot generate packages without an installDir; use -i' raise PackagerError, message + if self.ignoredDirFiles: + exts = list(self.ignoredDirFiles.keys()) + exts.sort() + total = sum([x for x in self.ignoredDirFiles.values()]) + self.notify.warning("excluded %s files not marked for inclusion: %s" \ + % (total, ", ".join(["'" + ext + "'" for ext in exts]))) + if not self.host: self.host = self.packager.host @@ -2185,6 +2195,9 @@ class Packager: # ignoring any request to specify a particular download host, # e.g. for testing and development. self.ignoreSetHost = False + + # Set this to true to verbosely log files ignored by dir(). + self.verbosePrint = False # This will be appended to the basename of any .p3d package, # before the .p3d extension. @@ -2390,6 +2403,14 @@ class Packager: # should be added exactly byte-for-byte as they are. self.unprocessedExtensions = [] + # Files for which warnings should be suppressed when they are + # not handled by dir() + self.suppressWarningForExtensions = ['', 'pyc', 'pyo', + 'p3d', 'pdef', + 'c', 'C', 'cxx', 'cpp', 'h', 'H', + 'hpp', 'pp', 'I', 'pem', 'p12', 'crt', + 'o', 'obj', 'a', 'lib', 'bc', 'll'] + # System files that should never be packaged. For # case-insensitive filesystems (like Windows and OSX), put the # lowercase filename here. Case-sensitive filesystems should @@ -2617,12 +2638,20 @@ class Packager: if dirname.makeTrueCase(): searchPath.appendDirectory(dirname) + def _ensureExtensions(self): + self.knownExtensions = \ + self.imageExtensions + \ + self.modelExtensions + \ + self.textExtensions + \ + self.binaryExtensions + \ + self.uncompressibleExtensions + \ + self.unprocessedExtensions def setup(self): """ Call this method to initialize the class after filling in some of the values in the constructor. """ - self.knownExtensions = self.imageExtensions + self.modelExtensions + self.textExtensions + self.binaryExtensions + self.uncompressibleExtensions + self.unprocessedExtensions + self._ensureExtensions() self.currentPackage = None @@ -3604,6 +3633,43 @@ class Packager: filename = Filename(filename) self.currentPackage.excludeFile(filename) + + def do_includeExtensions(self, executableExtensions = None, extractExtensions = None, + imageExtensions = None, textExtensions = None, + uncompressibleExtensions = None, unprocessedExtensions = None, + suppressWarningForExtensions = None): + """ Ensure that dir() will include files with the given extensions. + The extensions should not have '.' prefixes. + + All except 'suppressWarningForExtensions' allow the given kinds of files + to be packaged with their respective semantics (read the source). + + 'suppressWarningForExtensions' lists extensions *expected* to be ignored, + so no warnings will be emitted for them. + """ + if executableExtensions: + self.executableExtensions += executableExtensions + + if extractExtensions: + self.extractExtensions += extractExtensions + + if imageExtensions: + self.imageExtensions += imageExtensions + + if textExtensions: + self.textExtensions += textExtensions + + if uncompressibleExtensions: + self.uncompressibleExtensions += uncompressibleExtensions + + if unprocessedExtensions: + self.unprocessedExtensions += unprocessedExtensions + + if suppressWarningForExtensions: + self.suppressWarningForExtensions += suppressWarningForExtensions + + self._ensureExtensions() + def do_dir(self, dirname, newDir = None, unprocessed = None): """ Adds the indicated directory hierarchy to the current @@ -3676,7 +3742,12 @@ class Packager: filename.setBinary() self.currentPackage.addFile(filename, newName = newName, explicit = False, unprocessed = unprocessed) - + elif not ext in self.suppressWarningForExtensions: + newCount = self.currentPackage.ignoredDirFiles.get(ext, 0) + 1 + self.currentPackage.ignoredDirFiles[ext] = newCount + + if self.verbosePrint: + self.notify.warning("ignoring file %s" % filename) def readContentsFile(self): """ Reads the contents.xml file at the beginning of diff --git a/direct/src/p3d/ppackage.py b/direct/src/p3d/ppackage.py index 36be497a9f..dc00bdc567 100755 --- a/direct/src/p3d/ppackage.py +++ b/direct/src/p3d/ppackage.py @@ -123,6 +123,10 @@ Options: as such. This only applies to .p3d packages, not to other types of packages! + -v + Emit a warning for any file not recognized by the dir() command + (indicating there may be a need for addExtensions(...)). + -h Display this help """ @@ -151,11 +155,12 @@ allowPythonDev = False universalBinaries = False systemRoot = None ignoreSetHost = False +verbosePrint = False p3dSuffix = '' platforms = [] try: - opts, args = getopt.getopt(sys.argv[1:], 'i:ps:S:DuP:R:Ha:h') + opts, args = getopt.getopt(sys.argv[1:], 'i:ps:S:DuP:R:Ha:hv') except getopt.error, msg: usage(1, msg) @@ -188,6 +193,9 @@ for opt, arg in opts: elif opt == '-a': p3dSuffix = arg + elif opt == '-v': + verbosePrint = True + elif opt == '-h': usage(0) else: @@ -230,6 +238,7 @@ for platform in platforms: packager.allowPythonDev = allowPythonDev packager.systemRoot = systemRoot packager.ignoreSetHost = ignoreSetHost + packager.verbosePrint = verbosePrint packager.p3dSuffix = p3dSuffix try: diff --git a/panda/src/bullet/bulletHingeConstraint.cxx b/panda/src/bullet/bulletHingeConstraint.cxx index c9a369eca7..8976c23126 100644 --- a/panda/src/bullet/bulletHingeConstraint.cxx +++ b/panda/src/bullet/bulletHingeConstraint.cxx @@ -211,10 +211,12 @@ get_hinge_angle() { // Function: BulletHingeConstraint::enable_angular_motor // Access: Published // Description: Applies an impulse to the constraint so that the -// angle changes at target_velocity (probably -// degrees/second) where max_impulse is the maximum -// impulse that is used for achieving the specified -// velocity. +// angle changes at target_velocity where max_impulse +// is the maximum impulse that is used for achieving +// the specified velocity. +// +// Note that the target_velocity is in radians/second, +// not degrees. //////////////////////////////////////////////////////////////////// void BulletHingeConstraint:: enable_angular_motor(bool enable, PN_stdfloat target_velocity, PN_stdfloat max_impulse) { diff --git a/panda/src/express/referenceCount.I b/panda/src/express/referenceCount.I index c71886f46d..9f098b0384 100644 --- a/panda/src/express/referenceCount.I +++ b/panda/src/express/referenceCount.I @@ -319,6 +319,9 @@ get_weak_list() const { INLINE void ReferenceCount:: weak_ref(WeakPointerToVoid *ptv) { TAU_PROFILE("void ReferenceCount::weak_ref()", " ", TAU_USER); +#ifdef _DEBUG + nassertv(test_ref_count_integrity()); +#endif get_weak_list()->add_reference(ptv); } @@ -332,6 +335,9 @@ weak_ref(WeakPointerToVoid *ptv) { INLINE void ReferenceCount:: weak_unref(WeakPointerToVoid *ptv) { TAU_PROFILE("void ReferenceCount::weak_unref()", " ", TAU_USER); +#ifdef _DEBUG + nassertv(test_ref_count_integrity()); +#endif nassertv(has_weak_list()); ((WeakReferenceList *)_weak_list)->clear_reference(ptv); } diff --git a/panda/src/express/weakPointerTo.I b/panda/src/express/weakPointerTo.I index d42111bbca..797d1cf000 100644 --- a/panda/src/express/weakPointerTo.I +++ b/panda/src/express/weakPointerTo.I @@ -43,7 +43,7 @@ WeakPointerTo(const PointerTo ©) : template INLINE WeakPointerTo:: WeakPointerTo(const WeakPointerTo ©) : - WeakPointerToBase(*(const PointerToBase *)©) + WeakPointerToBase(*(const WeakPointerToBase *)©) { } @@ -194,7 +194,7 @@ WeakConstPointerTo(const ConstPointerTo ©) : template INLINE WeakConstPointerTo:: WeakConstPointerTo(const WeakPointerTo ©) : - WeakPointerToBase(*(const PointerToBase *)©) + WeakPointerToBase(*(const WeakPointerToBase *)©) { } @@ -206,7 +206,7 @@ WeakConstPointerTo(const WeakPointerTo ©) : template INLINE WeakConstPointerTo:: WeakConstPointerTo(const WeakConstPointerTo ©) : - WeakPointerToBase(*(const PointerToBase *)©) + WeakPointerToBase(*(const WeakPointerToBase *)©) { } diff --git a/panda/src/express/weakPointerToBase.I b/panda/src/express/weakPointerToBase.I index 61d454ea89..ead49a1424 100644 --- a/panda/src/express/weakPointerToBase.I +++ b/panda/src/express/weakPointerToBase.I @@ -43,7 +43,13 @@ WeakPointerToBase(const PointerToBase ©) { template INLINE WeakPointerToBase:: WeakPointerToBase(const WeakPointerToBase ©) { - reassign(copy); + _void_ptr = copy._void_ptr; + _ptr_was_deleted = copy._ptr_was_deleted; + + if (is_valid_pointer()) { + To *ptr = (To *)_void_ptr; + ptr->weak_ref(this); + } } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/x11display/x11GraphicsWindow.cxx b/panda/src/x11display/x11GraphicsWindow.cxx index 46a3e03882..c7fd0eef61 100644 --- a/panda/src/x11display/x11GraphicsWindow.cxx +++ b/panda/src/x11display/x11GraphicsWindow.cxx @@ -1643,6 +1643,7 @@ map_button(KeySym key) const { case XK_ampersand: return KeyboardButton::ascii_key('&'); case XK_apostrophe: // == XK_quoteright + case XK_dead_acute: // on int'l keyboards return KeyboardButton::ascii_key('\''); case XK_parenleft: return KeyboardButton::ascii_key('('); @@ -1774,6 +1775,7 @@ map_button(KeySym key) const { case XK_underscore: return KeyboardButton::ascii_key('_'); case XK_grave: // == XK_quoteleft + case XK_dead_grave: // on int'l keyboards return KeyboardButton::ascii_key('`'); case XK_a: return KeyboardButton::ascii_key('a'); @@ -1916,15 +1918,20 @@ map_button(KeySym key) const { case XK_Alt_R: return KeyboardButton::ralt(); case XK_Meta_L: + case XK_Super_L: return KeyboardButton::lmeta(); case XK_Meta_R: + case XK_Super_R: return KeyboardButton::rmeta(); case XK_Caps_Lock: return KeyboardButton::caps_lock(); case XK_Shift_Lock: return KeyboardButton::shift_lock(); } - + if (x11display_cat.is_debug()) { + x11display_cat.debug() + << "Unrecognized keysym 0x" << hex << key << dec << "\n"; + } return ButtonHandle::none(); }