diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 80db1477f8..ed6781198e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -386,9 +386,9 @@ jobs: shell: powershell run: | $wc = New-Object System.Net.WebClient - $wc.DownloadFile("https://www.panda3d.org/download/panda3d-1.10.15/panda3d-1.10.15-tools-win64.zip", "thirdparty-tools.zip") + $wc.DownloadFile("https://www.panda3d.org/download/panda3d-1.10.16/panda3d-1.10.16-tools-win64.zip", "thirdparty-tools.zip") Expand-Archive -Path thirdparty-tools.zip - Move-Item -Path thirdparty-tools/panda3d-1.10.15/thirdparty -Destination . + Move-Item -Path thirdparty-tools/panda3d-1.10.16/thirdparty -Destination . - name: Get thirdparty packages (macOS) if: runner.os == 'macOS' run: | diff --git a/README.md b/README.md index daa2240b34..36195415ec 100644 --- a/README.md +++ b/README.md @@ -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.15/panda3d-1.10.15-tools-win64.zip -- https://www.panda3d.org/download/panda3d-1.10.15/panda3d-1.10.15-tools-win32.zip +- https://www.panda3d.org/download/panda3d-1.10.16/panda3d-1.10.16-tools-win64.zip +- https://www.panda3d.org/download/panda3d-1.10.16/panda3d-1.10.16-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 diff --git a/direct/src/dist/commands.py b/direct/src/dist/commands.py index cf0316b1ba..259ce58289 100644 --- a/direct/src/dist/commands.py +++ b/direct/src/dist/commands.py @@ -319,7 +319,10 @@ class build_apps(setuptools.Command): 'win_amd64', ] - if sys.version_info >= (3, 13): + if sys.version_info >= (3, 14): + # This version of Python is only available for 10.15+. + self.platforms[1] = 'macosx_10_15_x86_64' + elif sys.version_info >= (3, 13): # This version of Python is only available for 10.13+. self.platforms[1] = 'macosx_10_13_x86_64' @@ -707,8 +710,14 @@ class build_apps(setuptools.Command): subprocess.check_call([sys.executable, '-m', 'pip'] + pip_args) except: # Display a more helpful message for these common issues. - if platform.startswith('macosx_10_9_') and sys.version_info >= (3, 13): - new_platform = platform.replace('macosx_10_9_', 'macosx_10_13_') + if platform.startswith('macosx_10_13_') and sys.version_info >= (3, 14): + new_platform = platform.replace('macosx_10_13_', 'macosx_10_15_') + self.announce('This error likely occurs because {} is not a supported target as of Python 3.14.\nChange the target platform to {} instead.'.format(platform, new_platform), distutils.log.ERROR) + elif platform.startswith('macosx_10_9_') and sys.version_info >= (3, 13): + if sys.version_info >= (3, 14): + new_platform = platform.replace('macosx_10_9_', 'macosx_10_15_') + else: + new_platform = platform.replace('macosx_10_9_', 'macosx_10_13_') self.announce('This error likely occurs because {} is not a supported target as of Python 3.13.\nChange the target platform to {} instead.'.format(platform, new_platform), distutils.log.ERROR) elif platform.startswith('manylinux2010_') and sys.version_info >= (3, 11): new_platform = platform.replace('manylinux2010_', 'manylinux2014_') @@ -717,7 +726,9 @@ class build_apps(setuptools.Command): new_platform = platform.replace('manylinux1_', 'manylinux2014_') self.announce('This error likely occurs because {} is not a supported target as of Python 3.10.\nChange the target platform to {} instead.'.format(platform, new_platform), distutils.log.ERROR) elif platform.startswith('macosx_10_6_') and sys.version_info >= (3, 8): - if sys.version_info >= (3, 13): + if sys.version_info >= (3, 14): + new_platform = platform.replace('macosx_10_6_', 'macosx_10_15_') + elif sys.version_info >= (3, 13): new_platform = platform.replace('macosx_10_6_', 'macosx_10_13_') else: new_platform = platform.replace('macosx_10_6_', 'macosx_10_9_') diff --git a/direct/src/showbase/ShowBase.py b/direct/src/showbase/ShowBase.py index 7bfe5ed5c3..e5c2e79376 100644 --- a/direct/src/showbase/ShowBase.py +++ b/direct/src/showbase/ShowBase.py @@ -3517,6 +3517,7 @@ class ShowBase(DirectObject.DirectObject): remove_camera_frustum = removeCameraFrustum save_cube_map = saveCubeMap save_sphere_map = saveSphereMap + user_exit = userExit start_wx = startWx start_tk = startTk start_direct = startDirect diff --git a/doc/ReleaseNotes b/doc/ReleaseNotes index e5651145b7..5942c69e8c 100644 --- a/doc/ReleaseNotes +++ b/doc/ReleaseNotes @@ -1,3 +1,31 @@ +----------------------- RELEASE 1.10.16 ----------------------- + +This maintenance release fixes some minor defects and stability issues. + +* OpenAL: Support non-default coordinate systems when playing 3D audio +* Tasks: Coroutine detect now also handles coroutine subclass to support Nuitka +* Tasks: Now properly handles generators without send() +* Windows: Fixes a hang when adjusting Z-order in some situations +* Fix SparseArray methods get_lowest_off_bit() and get_lowest_on_bit() +* Fix linecache error when distributing for newer Python versions +* Fix `await AsyncFuture.gather()` returning first item instead of tuple (#1738) +* Fix use-after-free in collision system with transform cache disabled (#1733) +* Egg: Add limited forward compatibility for metallic-roughness textures +* OpenGL: fix error blitting depth texture on macOS (#1719) +* OpenGL: fix SSBO support not being detected in certain situations +* GLSL: Add p3d_MetallicRoughnessTexture input mapped to M_metallic_roughness +* X11: Add config variable to enable detection of autorepeat key events (#1735) +* GUI: Fix bug with PGSliderBar dragging (#1722) +* Minor thread safety things for free-threaded Python builds +* Add forward compatibility for bam version 6.46 +* Fixes a harmless buffer overflow in pdtoa +* Fix compilation issues with SDL version of tinydisplay (#1708) +* bam2egg: Fix issue when having more than two tags (#1725) +* Fix "Detected leak for ... which interrogate cannot delete." error (#1743) +* Fix PythonCallbackObject crash upon destruction in some cases +* PStats: Fix crash when receiving frames out of order +* PandaFramework::close_framework() now clears task manager of tasks + ----------------------- RELEASE 1.10.15 ----------------------- This release adds support for Python 3.13, and fixes some significant bugs. diff --git a/makepanda/installer.nsi b/makepanda/installer.nsi index 468dbe269b..93dfbe7068 100644 --- a/makepanda/installer.nsi +++ b/makepanda/installer.nsi @@ -381,6 +381,7 @@ SectionGroup "Python modules" SecGroupPython !insertmacro PyBindingSection 3.12-32 .cp312-win32.pyd !insertmacro PyBindingSection 3.13-32 .cp313-win32.pyd !insertmacro PyBindingSection 3.14-32 .cp314-win32.pyd + !insertmacro PyBindingSection 3.15-32 .cp315-win32.pyd !else !insertmacro PyBindingSection 3.5 .cp35-win_amd64.pyd !insertmacro PyBindingSection 3.6 .cp36-win_amd64.pyd @@ -392,6 +393,7 @@ SectionGroup "Python modules" SecGroupPython !insertmacro PyBindingSection 3.12 .cp312-win_amd64.pyd !insertmacro PyBindingSection 3.13 .cp313-win_amd64.pyd !insertmacro PyBindingSection 3.14 .cp314-win_amd64.pyd + !insertmacro PyBindingSection 3.15 .cp315-win_amd64.pyd !endif SectionGroupEnd @@ -504,6 +506,7 @@ Function .onInit !insertmacro MaybeEnablePyBindingSection 3.12-32 !insertmacro MaybeEnablePyBindingSection 3.13-32 !insertmacro MaybeEnablePyBindingSection 3.14-32 + !insertmacro MaybeEnablePyBindingSection 3.15-32 ${EndIf} !else !insertmacro MaybeEnablePyBindingSection 3.5 @@ -517,6 +520,7 @@ Function .onInit !insertmacro MaybeEnablePyBindingSection 3.12 !insertmacro MaybeEnablePyBindingSection 3.13 !insertmacro MaybeEnablePyBindingSection 3.14 + !insertmacro MaybeEnablePyBindingSection 3.15 ${EndIf} !endif @@ -546,6 +550,10 @@ Function .onInit SectionSetFlags ${SecPyBindings3.14} ${SF_RO} SectionSetInstTypes ${SecPyBindings3.14} 0 !endif + !ifdef SecPyBindings3.15 + SectionSetFlags ${SecPyBindings3.15} ${SF_RO} + SectionSetInstTypes ${SecPyBindings3.15} 0 + !endif ${EndUnless} FunctionEnd @@ -851,6 +859,7 @@ Section Uninstall !insertmacro RemovePythonPath 3.12-32 !insertmacro RemovePythonPath 3.13-32 !insertmacro RemovePythonPath 3.14-32 + !insertmacro RemovePythonPath 3.15-32 !else !insertmacro RemovePythonPath 3.5 !insertmacro RemovePythonPath 3.6 @@ -862,6 +871,7 @@ Section Uninstall !insertmacro RemovePythonPath 3.12 !insertmacro RemovePythonPath 3.13 !insertmacro RemovePythonPath 3.14 + !insertmacro RemovePythonPath 3.15 !endif SetDetailsPrint both @@ -934,6 +944,7 @@ SectionEnd !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.12-32} $(DESC_SecPyBindings3.12-32) !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.13-32} $(DESC_SecPyBindings3.13-32) !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.14-32} $(DESC_SecPyBindings3.14-32) + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.15-32} $(DESC_SecPyBindings3.15-32) !else !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.5} $(DESC_SecPyBindings3.5) !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.6} $(DESC_SecPyBindings3.6) @@ -945,6 +956,7 @@ SectionEnd !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.12} $(DESC_SecPyBindings3.12) !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.13} $(DESC_SecPyBindings3.13) !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.14} $(DESC_SecPyBindings3.14) + !insertmacro MUI_DESCRIPTION_TEXT ${SecPyBindings3.15} $(DESC_SecPyBindings3.15) !endif !ifdef INCLUDE_PYVER !insertmacro MUI_DESCRIPTION_TEXT ${SecPython} $(DESC_SecPython) diff --git a/panda/src/event/asyncFuture_ext.cxx b/panda/src/event/asyncFuture_ext.cxx index 92b3d837d1..0ac681f1b2 100644 --- a/panda/src/event/asyncFuture_ext.cxx +++ b/panda/src/event/asyncFuture_ext.cxx @@ -373,7 +373,7 @@ gather(PyObject *args) { futures.push_back(fut); continue; } - } else if (PyCoro_CheckExact(item)) { + } else if (PyObject_TypeCheck(item, &PyCoro_Type)) { // We allow passing in a coroutine instead of a future. This causes it // to be scheduled as a task on the current task manager. PT(AsyncTask) task = new PythonTask(item); diff --git a/panda/src/event/pythonTask.cxx b/panda/src/event/pythonTask.cxx index d9ea12b2f2..57c3bd88cc 100644 --- a/panda/src/event/pythonTask.cxx +++ b/panda/src/event/pythonTask.cxx @@ -53,12 +53,10 @@ PythonTask(PyObject *func_or_coro, const std::string &name) : if (func_or_coro == Py_None || PyCallable_Check(func_or_coro)) { _function = Py_NewRef(func_or_coro); } - else if (PyCoro_CheckExact(func_or_coro)) { - // We also allow passing in a coroutine, because why not. - _generator = Py_NewRef(func_or_coro); - } - else if (PyGen_CheckExact(func_or_coro)) { - // Something emulating a coroutine. + else if (PyCoro_CheckExact(func_or_coro) || + PyGen_CheckExact(func_or_coro) || + PyType_IsSubtype(Py_TYPE(func_or_coro), &PyCoro_Type)) { + // We also allow passing in a coroutine or something emulating it. _generator = Py_NewRef(func_or_coro); } else { @@ -620,7 +618,7 @@ do_python_task() { Py_DECREF(str); Py_DECREF(str2); } - if (PyCoro_CheckExact(result)) { + if (PyObject_TypeCheck(result, &PyCoro_Type)) { // If a coroutine, am_await is possible but senseless, since we can // just call send(None) on the coroutine itself. _generator = result; @@ -747,7 +745,7 @@ do_python_task() { } } else if (result == Py_None) { - // Bare yield means to continue next frame. + // Bare yield from a coroutine means to continue next frame. Py_DECREF(result); return DS_cont; diff --git a/panda/src/pgui/pgSliderBar.cxx b/panda/src/pgui/pgSliderBar.cxx index d423549ccb..7fe5bc8c73 100644 --- a/panda/src/pgui/pgSliderBar.cxx +++ b/panda/src/pgui/pgSliderBar.cxx @@ -693,6 +693,11 @@ advance_scroll() { */ void PGSliderBar:: advance_page() { + // Do not try to advance the page while dragging + if (_dragging) { + return; + } + // Is the mouse position left or right of the current thumb position? LPoint3 mouse = mouse_to_local(_mouse_pos) - _thumb_start; PN_stdfloat target_ratio = mouse.dot(_axis) / _range_x; @@ -705,7 +710,7 @@ advance_page() { t = min(_ratio + _page_ratio - _scroll_ratio, target_ratio); } internal_set_ratio(t); - if (t == target_ratio) { + if (_ratio == target_ratio) { // We made it; begin dragging from now on until the user releases the // mouse. begin_drag(); diff --git a/panda/src/x11display/x11GraphicsWindow.cxx b/panda/src/x11display/x11GraphicsWindow.cxx index b6b26194e7..90d1ee0d44 100644 --- a/panda/src/x11display/x11GraphicsWindow.cxx +++ b/panda/src/x11display/x11GraphicsWindow.cxx @@ -2755,7 +2755,7 @@ enable_detectable_auto_repeat() { if (!x_detectable_auto_repeat) { return; } - + Bool supported; if (XkbSetDetectableAutoRepeat(_display, True, &supported)) { x11display_cat.info() << "Detectable auto-repeat enabled.\n"; diff --git a/pandatool/src/deploy-stub/deploy-stub.c b/pandatool/src/deploy-stub/deploy-stub.c index b47615a6b7..97c3e9d672 100644 --- a/pandatool/src/deploy-stub/deploy-stub.c +++ b/pandatool/src/deploy-stub/deploy-stub.c @@ -21,6 +21,7 @@ #include #include #include +#include #include