diff --git a/README.md b/README.md index 1cac845fd6..dc7e4fdb54 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Installing Panda3D ================== The latest Panda3D SDK can be downloaded from -[this page](https://www.panda3d.org/download/sdk-1-10-11/). +[this page](https://www.panda3d.org/download/sdk-1-10-12/). If you are familiar with installing Python packages, you can use the following command: @@ -64,8 +64,8 @@ depending on whether you are on a 32-bit or 64-bit system, or you can [click here](https://github.com/rdb/panda3d-thirdparty) for instructions on building them from source. -- https://www.panda3d.org/download/panda3d-1.10.11/panda3d-1.10.11-tools-win64.zip -- https://www.panda3d.org/download/panda3d-1.10.11/panda3d-1.10.11-tools-win32.zip +- https://www.panda3d.org/download/panda3d-1.10.12/panda3d-1.10.12-tools-win64.zip +- https://www.panda3d.org/download/panda3d-1.10.12/panda3d-1.10.12-tools-win32.zip After acquiring these dependencies, you can build Panda3D from the command prompt using the following command. Change the `--msvc-version` option based @@ -136,7 +136,7 @@ macOS ----- On macOS, you will need to download a set of precompiled thirdparty packages in order to -compile Panda3D, which can be acquired from [here](https://www.panda3d.org/download/panda3d-1.10.11/panda3d-1.10.11-tools-mac.tar.gz). +compile Panda3D, which can be acquired from [here](https://www.panda3d.org/download/panda3d-1.10.12/panda3d-1.10.12-tools-mac.tar.gz). After placing the thirdparty directory inside the panda3d source directory, you may build Panda3D using a command like the following: diff --git a/direct/src/dist/FreezeTool.py b/direct/src/dist/FreezeTool.py index 10e80e4f08..37583e9e12 100644 --- a/direct/src/dist/FreezeTool.py +++ b/direct/src/dist/FreezeTool.py @@ -81,6 +81,12 @@ defaultHiddenImports = { 'pandas.compat': ['lzma', 'cmath'], 'pandas._libs.tslibs.conversion': ['pandas._libs.tslibs.base'], 'plyer': ['plyer.platforms'], + 'scipy.linalg': ['scipy.linalg.cython_blas', 'scipy.linalg.cython_lapack'], + 'scipy.sparse.csgraph': ['scipy.sparse.csgraph._validation'], + 'scipy.spatial._qhull': ['scipy._lib.messagestream'], + 'scipy.spatial.transform._rotation': ['scipy.spatial.transform._rotation_groups'], + 'scipy.special._ufuncs': ['scipy.special._ufuncs_cxx'], + 'scipy.stats._stats': ['scipy.special.cython_special'], } @@ -1189,22 +1195,31 @@ class Freezer: # Special case for sysconfig, which depends on a platform-specific # sysconfigdata module on POSIX systems. - if 'sysconfig' in self.mf.modules: + missing = [] + if 'sysconfig' in self.mf.modules and \ + ('linux' in self.platform or 'mac' in self.platform): + modname = '_sysconfigdata' if sys.version_info >= (3, 6): + modname += '_' + if sys.version_info < (3, 8): + modname += 'm' + if 'linux' in self.platform: arch = self.platform.split('_', 1)[1] - self.__loadModule(self.ModuleDef('_sysconfigdata__linux_' + arch + '-linux-gnu', implicit=True)) + modname += '_linux_' + arch + '-linux-gnu' elif 'mac' in self.platform: - self.__loadModule(self.ModuleDef('_sysconfigdata__darwin_darwin', implicit=True)) - elif 'linux' in self.platform or 'mac' in self.platform: - self.__loadModule(self.ModuleDef('_sysconfigdata', implicit=True)) + modname += '_darwin_darwin' + + try: + self.__loadModule(self.ModuleDef(modname, implicit=True)) + except: + missing.append(modname) # Now, any new modules we found get added to the export list. for origName in list(self.mf.modules.keys()): if origName not in origToNewName: self.modules[origName] = self.ModuleDef(origName, implicit = True) - missing = [] for origName in self.mf.any_missing_maybe()[0]: if origName in startupModules: continue diff --git a/direct/src/showbase/BufferViewer.py b/direct/src/showbase/BufferViewer.py index 8c1ec73712..f54edca7f9 100644 --- a/direct/src/showbase/BufferViewer.py +++ b/direct/src/showbase/BufferViewer.py @@ -240,10 +240,10 @@ class BufferViewer(DirectObject): offsetx = (ringoffset[ring]*2.0) / float(sizex) offsety = (ringoffset[ring]*2.0) / float(sizey) bright = ringbright[ring] - vwriter.addData3f(Vec3.rfu(-1 - offsetx, 0, -1 - offsety)) - vwriter.addData3f(Vec3.rfu( 1 + offsetx, 0, -1 - offsety)) - vwriter.addData3f(Vec3.rfu( 1 + offsetx, 0, 1 + offsety)) - vwriter.addData3f(Vec3.rfu(-1 - offsetx, 0, 1 + offsety)) + vwriter.addData3f(Vec3F.rfu(-1 - offsetx, 0, -1 - offsety)) + vwriter.addData3f(Vec3F.rfu( 1 + offsetx, 0, -1 - offsety)) + vwriter.addData3f(Vec3F.rfu( 1 + offsetx, 0, 1 + offsety)) + vwriter.addData3f(Vec3F.rfu(-1 - offsetx, 0, 1 + offsety)) cwriter.addData3f(bright, bright, bright) cwriter.addData3f(bright, bright, bright) cwriter.addData3f(bright, bright, bright) diff --git a/doc/ReleaseNotes b/doc/ReleaseNotes index a2499ce00d..53aa89a4bb 100644 --- a/doc/ReleaseNotes +++ b/doc/ReleaseNotes @@ -1,3 +1,59 @@ +----------------------- RELEASE 1.10.12 ----------------------- + +Recommended maintenance release containing primarily bug fixes. + +Windowing +* Windows: Fix origin not respected when switching to windowed mode +* macOS: Fix origin not being updated when resizing window +* macOS: Fix off-by-one errors with mouse cursor position +* macOS: Fix issues with confined mouse mode +* macOS: Fix events being suppressed when moving the mouse pointer +* macOS: Invert horizontal scroll, set `cocoa-invert-wheel-x true` to revert + +Rendering +* Add `shadow-cube-map-filter` setting to enable cube map shadow filtering +* Support floating-point FBOs in OpenGL ES 2+ +* Fix texture format selection in OpenGL with T_half_float component type +* Added `egl-device-index` config var to select EGL device +* Offscreen windows in tinydisplay renderer are now resizeable +* CommonFilters now supports alternative coordinate systems +* Fix BufferViewer frame when using a different coordinate system + +Deployment +* Fix _bootlocale error in deployed application on Windows with Python 3.10 +* Include _sysconfigdata module properly when using sysconfig module +* Fix building deploy-stub on platforms that use DT_RUNPATH instead of DT_RPATH +* `sys.flags.optimize` is now set to 2 in Python 3.2 and above +* Fix import errors when using scipy + +Miscellaneous +* `Texture::get_ram_image_as()` fixed for 3D textures +* Fix PStats GPU timing not working with newer NVIDIA drivers +* Fix false negative in collision test when sphere is fully inside box +* Resolve segmentation fault when statically linking ffmpeg module +* Fix issue with failed mmap when using WebcamVideo on Linux +* macOS: Keyboard/mouse devices are no longer enumerated by default +* Fix repr of LPlane class +* Remove dependency on ShowBase in FilterManager +* Many new functions added to interrogatedb module to query additional info +* Interrogate no longer writes wrappers with rvalue references to interrogatedb +* PStats on Linux: Fix mouse motion detected outside strip chart graph area +* Fix assertion when reading bam file with Bullet convex hull shape +* Fix memory leak when specifying owner of a task +* Add additional helpful debug/spam prints to display code + +Build +* Support building with Python 3.11 +* Support building with OpenSSL 1.1.1 on Windows +* Support building with OpenEXR 3.0 or 3.1 on Windows +* Fix errors when compiling Panda headers with MinGW +* Allow compiling Panda headers on Windows without NOMINMAX set +* Fix wheel platform tag on manylinux aarch64 +* Experimentally allow building with mimalloc on Windows +* Makepanda records cache timestamps as integers instead of floats +* Makepanda can now also build tinydisplay on Linux without X11 +* Fix naming of built wheels when building for macOS 12 + ----------------------- RELEASE 1.10.11 ----------------------- Maintenance release containing assorted bug fixes and minor improvements. diff --git a/panda/src/cocoadisplay/cocoaGraphicsWindow.mm b/panda/src/cocoadisplay/cocoaGraphicsWindow.mm index e5c6404c09..e931b59f44 100644 --- a/panda/src/cocoadisplay/cocoaGraphicsWindow.mm +++ b/panda/src/cocoadisplay/cocoaGraphicsWindow.mm @@ -137,15 +137,17 @@ move_pointer(int device, int x, int y) { if (device == 0) { CGPoint point; if (_properties.get_fullscreen()) { - point = CGPointMake(x, y + 1); + point = CGPointMake(x, y); } else { point = CGPointMake(x + _properties.get_x_origin(), - y + _properties.get_y_origin() + 1); + y + _properties.get_y_origin()); } - // I don't know what the difference between these two methods is. if - // (CGWarpMouseCursorPosition(point) == kCGErrorSuccess) { - if (CGDisplayMoveCursorToPoint(_display, point) == kCGErrorSuccess) { + if (CGWarpMouseCursorPosition(point) == kCGErrorSuccess) { + //After moving (or warping) the mouse position, CG starts an event + // suppression interval during which no more mouse events can occur + // This interval can be interupted by the following call : + CGAssociateMouseAndMouseCursorPosition(YES); // Generate a mouse event. NSPoint pos = [_window mouseLocationOutsideOfEventStream]; NSPoint loc = [_view convertPoint:pos fromView:nil]; @@ -1861,9 +1863,8 @@ handle_mouse_moved_event(bool in_window, double x, double y, bool absolute) { } } - // Strangely enough, in Cocoa, mouse Y coordinates are 1-based. nx = x; - ny = y - 1; + ny = y; } else { // We received deltas, so add it to the current mouse position. @@ -1880,13 +1881,17 @@ handle_mouse_moved_event(bool in_window, double x, double y, bool absolute) { ny = std::max(0., std::min((double) get_y_size() - 1, ny)); if (_properties.get_fullscreen()) { - point = CGPointMake(nx, ny + 1); + point = CGPointMake(nx, ny); } else { point = CGPointMake(nx + _properties.get_x_origin(), - ny + _properties.get_y_origin() + 1); + ny + _properties.get_y_origin()); } if (CGWarpMouseCursorPosition(point) == kCGErrorSuccess) { + //After moving (or warping) the mouse position, CG starts an event + // suppression interval during which no more mouse events can occur + // This interval can be interupted by the following call : + CGAssociateMouseAndMouseCursorPosition(YES); in_window = true; } else { cocoadisplay_cat.warning() << "Failed to return mouse pointer to window\n"; diff --git a/panda/src/cocoadisplay/cocoaPandaView.mm b/panda/src/cocoadisplay/cocoaPandaView.mm index 454c4a032f..f501592aa2 100644 --- a/panda/src/cocoadisplay/cocoaPandaView.mm +++ b/panda/src/cocoadisplay/cocoaPandaView.mm @@ -121,9 +121,7 @@ NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil]; BOOL inside = [self mouse:loc inRect:[self bounds]]; - // the correlation between mouse deltas and location are "debounced" - // apparently, so send deltas for both relative and confined modes - if (_graphicsWindow->get_properties().get_mouse_mode() != WindowProperties::M_absolute) { + if (_graphicsWindow->get_properties().get_mouse_mode() == WindowProperties::M_relative) { _graphicsWindow->handle_mouse_moved_event(inside, [event deltaX], [event deltaY], false); } else { _graphicsWindow->handle_mouse_moved_event(inside, loc.x, loc.y, true); diff --git a/panda/src/cocoadisplay/cocoaPandaWindowDelegate.mm b/panda/src/cocoadisplay/cocoaPandaWindowDelegate.mm index 7e39748bd1..17fae241f3 100644 --- a/panda/src/cocoadisplay/cocoaPandaWindowDelegate.mm +++ b/panda/src/cocoadisplay/cocoaPandaWindowDelegate.mm @@ -30,6 +30,7 @@ - (void) windowDidResize:(NSNotification *)notification { // Forcing a move event is unfortunately necessary because Cocoa does not // call windowDidMove in case of window zooms. + _graphicsWindow->handle_move_event(); _graphicsWindow->handle_resize_event(); } diff --git a/panda/src/collide/collisionBox.cxx b/panda/src/collide/collisionBox.cxx index cb1d9a3c92..ab5cb21717 100644 --- a/panda/src/collide/collisionBox.cxx +++ b/panda/src/collide/collisionBox.cxx @@ -208,6 +208,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { bool intersect; LPlane plane; LVector3 normal; + bool fully_inside = true; for(ip = 0, intersect = false; ip < 6 && !intersect; ip++) { plane = get_plane(ip); @@ -224,6 +225,7 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { // moving in the same direction as the plane's normal. PN_stdfloat dot = delta.dot(plane.get_normal()); if (dot > 0.1f) { + fully_inside = false; continue; // no intersection } @@ -280,13 +282,19 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { if (!plane.intersects_line(dist, from_center, -(plane.get_normal()))) { // No intersection with plane? This means the plane's effective normal // was within the plane itself. A useless polygon. + fully_inside = false; continue; } - if (dist > from_radius || dist < -from_radius) { - // No intersection with the plane. + if (dist > from_radius) { + // Fully outside this plane, there can not be an intersection. + return nullptr; + } + if (dist < -from_radius) { + // Fully inside this plane. continue; } + fully_inside = false; LPoint2 p = to_2d(from_center - dist * plane.get_normal(), ip); PN_stdfloat edge_dist = 0.0f; @@ -342,8 +350,9 @@ test_intersection_from_sphere(const CollisionEntry &entry) const { } intersect = true; } - if( !intersect ) + if (!fully_inside && !intersect) { return nullptr; + } if (collide_cat.is_debug()) { collide_cat.debug() diff --git a/setup.cfg b/setup.cfg index 5fadcd1c53..9c2b79edb3 100644 --- a/setup.cfg +++ b/setup.cfg @@ -19,6 +19,7 @@ classifiers = Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 + Programming Language :: Python :: 3.11 Programming Language :: Python :: Implementation :: CPython Topic :: Games/Entertainment Topic :: Multimedia