Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package qt6-quick3dphysics for 
openSUSE:Factory checked in at 2023-10-13 23:14:24
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/qt6-quick3dphysics (Old)
 and      /work/SRC/openSUSE:Factory/.qt6-quick3dphysics.new.20540 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "qt6-quick3dphysics"

Fri Oct 13 23:14:24 2023 rev:10 rq:1116946 version:6.6.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/qt6-quick3dphysics/qt6-quick3dphysics.changes    
2023-10-02 20:07:37.365299568 +0200
+++ 
/work/SRC/openSUSE:Factory/.qt6-quick3dphysics.new.20540/qt6-quick3dphysics.changes
 2023-10-13 23:14:56.823615907 +0200
@@ -1,0 +2,6 @@
+Tue Oct 10 09:39:56 UTC 2023 - Christophe Marin <christo...@krop.fr>
+
+- Update to 6.6.0
+  * https://www.qt.io/blog/qt-6.6-released
+
+-------------------------------------------------------------------

Old:
----
  qtquick3dphysics-everywhere-src-6.5.3.tar.xz

New:
----
  qtquick3dphysics-everywhere-src-6.6.0.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ qt6-quick3dphysics.spec ++++++
--- /var/tmp/diff_new_pack.rcgRXR/_old  2023-10-13 23:14:58.467675539 +0200
+++ /var/tmp/diff_new_pack.rcgRXR/_new  2023-10-13 23:14:58.471675684 +0200
@@ -16,8 +16,8 @@
 #
 
 
-%define real_version 6.5.3
-%define short_version 6.5
+%define real_version 6.6.0
+%define short_version 6.6
 %define tar_name qtquick3dphysics-everywhere-src
 %define tar_suffix %{nil}
 #
@@ -27,7 +27,7 @@
 %endif
 #
 Name:           qt6-quick3dphysics%{?pkg_suffix}
-Version:        6.5.3
+Version:        6.6.0
 Release:        0
 Summary:        Qt 6 Quick3D Physics Extensions
 License:        GPL-3.0-only

++++++ qtquick3dphysics-everywhere-src-6.5.3.tar.xz -> 
qtquick3dphysics-everywhere-src-6.6.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtquick3dphysics-everywhere-src-6.5.3/.cmake.conf 
new/qtquick3dphysics-everywhere-src-6.6.0/.cmake.conf
--- old/qtquick3dphysics-everywhere-src-6.5.3/.cmake.conf       2023-09-24 
13:12:43.000000000 +0200
+++ new/qtquick3dphysics-everywhere-src-6.6.0/.cmake.conf       2023-10-03 
22:42:51.000000000 +0200
@@ -1,2 +1,2 @@
-set(QT_REPO_MODULE_VERSION "6.5.3")
+set(QT_REPO_MODULE_VERSION "6.6.0")
 set(QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_AS_CONST=1")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtquick3dphysics-everywhere-src-6.5.3/.tag 
new/qtquick3dphysics-everywhere-src-6.6.0/.tag
--- old/qtquick3dphysics-everywhere-src-6.5.3/.tag      2023-09-24 
13:12:43.000000000 +0200
+++ new/qtquick3dphysics-everywhere-src-6.6.0/.tag      2023-10-03 
22:42:51.000000000 +0200
@@ -1 +1 @@
-b15660de503e00475f381661cd7177817b0a19b6
+26768a556754d5b7f6eab2a447ffb33508d830c4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/qtquick3dphysics-everywhere-src-6.5.3/README.md 
new/qtquick3dphysics-everywhere-src-6.6.0/README.md
--- old/qtquick3dphysics-everywhere-src-6.5.3/README.md 2023-09-24 
13:12:43.000000000 +0200
+++ new/qtquick3dphysics-everywhere-src-6.6.0/README.md 2023-10-03 
22:42:51.000000000 +0200
@@ -1,4 +1,19 @@
-# Qt Quick 3D Physics Module
+# Qt Quick 3D Physics
 
-The purpose of this module is to demonstrate the usage of PhysX Physics engine 
with Qt Quick 3D.
+Qt Quick 3D Physics provides a high-level API for physics simulation. It 
supports simulating interactive rigid bodies as well as static meshes and 
non-colliding bodies used for detecting overlaps. Every simulated body can have 
its own physical properties like mass, density and friction.
 
+## Documentation
+
+The Qt Quick 3D Physics documentation is available as a submodule of the Qt 
Framework's documentation. You can find it in the Qt documentation 
[online](https://doc-snapshots.qt.io/qt6-dev/qtquick3dphysics-index.html), or 
you can build it locally from the source code.
+
+## Reporting Issues
+
+If you encounter any issues while using Qt Quick 3D Physics, you can report 
them on the [Qt bug tracker](https://bugreports.qt.io/). Before submitting a 
new issue, please check the existing issues to see if the issue has already 
been reported, and make sure to select the "Quick: 3D Physics" component when 
creating a new issue.
+
+## Contributing
+
+We welcome contributions to Qt Quick 3D Physics. If you are interested in 
contributing, please read the [Qt Contribution 
Guidelines](https://wiki.qt.io/Qt_Contribution_Guidelines) for more details.
+
+## License
+
+Qt Quick 3D Physics is available under the commercial license from The Qt 
Company. In addition, it is available under the [GNU General Public License, 
version 3](http://www.gnu.org/licenses/gpl-3.0.html). Further 3rd party 
Licenses and Attributions can be found in the LICENSES folder, as well as 
documented 
[here](https://doc-snapshots.qt.io/qt6-dev/qtquick3dphysics-index.html#license-and-attributions).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/coin/axivion/ci_config_linux.json 
new/qtquick3dphysics-everywhere-src-6.6.0/coin/axivion/ci_config_linux.json
--- old/qtquick3dphysics-everywhere-src-6.5.3/coin/axivion/ci_config_linux.json 
1970-01-01 01:00:00.000000000 +0100
+++ new/qtquick3dphysics-everywhere-src-6.6.0/coin/axivion/ci_config_linux.json 
2023-10-03 22:42:51.000000000 +0200
@@ -0,0 +1,61 @@
+{
+    "Project": {
+        "Git": {
+            "_active": true,
+            "sourceserver_gitdir": 
"/data/axivion/databases/$(env:TESTED_MODULE_COIN).git"
+        },
+        "BuildSystemIntegration": {
+            "child_order": [
+                "GCCSetup",
+                "CMake",
+                "LinkLibraries"
+            ]
+        },
+        "CMake": {
+            "_active": true,
+            "_copy_from": "CMakeIntegration",
+            "build_environment": {},
+            "build_options": "-j4",
+            "generate_options": "--fresh",
+            "generator": "Ninja"
+        },
+        "GCCSetup": {
+            "_active": true,
+            "_copy_from": "Command",
+            "build_command": "gccsetup --cc gcc --cxx g++ --config 
../../../axivion/"
+        },
+        "LinkLibraries": {
+            "_active": true,
+            "_copy_from": "AxivionLinker",
+            "input_files": [
+                "build/lib/lib*.so*.ir",
+                "build/qml/*/*/lib*.so*.ir",
+                "build/qml/*/*/*/lib*.so*.ir"
+            ],
+            "ir": "build/$(env:TESTED_MODULE_COIN).ir"
+        },
+        "Project-GlobalOptions": {
+            "directory": "../work/qt/$(env:TESTED_MODULE_COIN)",
+            "ir": "build/$(env:TESTED_MODULE_COIN).ir",
+            "name": "qt_$(env:TESTED_MODULE_COIN)_dev_$(env:TARGET_OS_COIN)"
+        }
+    },
+    "Results": {
+        "Dashboard": {
+            "dashboard_url": "https://axivion-srv.ci.qt.io/axivion/";
+        },
+        "Database": {
+            "ci_mode": {
+                "directory": "/data/axivion/databases"
+            }
+        }
+    },
+    "_Format": "1.0",
+    "_Version": "trunk-9e0ef9c5818",
+    "_VersionNum": [
+        7,
+        6,
+        9999,
+        11489
+    ]
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/dependencies.yaml 
new/qtquick3dphysics-everywhere-src-6.6.0/dependencies.yaml
--- old/qtquick3dphysics-everywhere-src-6.5.3/dependencies.yaml 2023-09-24 
13:12:43.000000000 +0200
+++ new/qtquick3dphysics-everywhere-src-6.6.0/dependencies.yaml 2023-10-03 
22:42:51.000000000 +0200
@@ -1,13 +1,13 @@
 dependencies:
   ../qtbase:
-    ref: 372eaedc5b8c771c46acc4c96e91bbade4ca3624
+    ref: 33f5e985e480283bb0ca9dea5f82643e825ba87c
     required: true
   ../qtdeclarative:
-    ref: e00c258fa5a4e122636d441967dea035865fac5d
+    ref: e559d5cf2b66c4a973f83f173d57676a21d287ef
     required: true
   ../qtquick3d:
-    ref: 1b13cfbfcde76219c660d86b5bd8463668b2a920
+    ref: 5bba89db0520ed6250ab854ae5b04db5886088b4
     required: true
   ../qtshadertools:
-    ref: 8354edb19012d4ffda1da8678a840659574f3f1c
+    ref: ded671b8c17f2a6b2f03cde3b9dad4910adda3cc
     required: true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/designer/CharacterControllerSection.qml
 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/designer/CharacterControllerSection.qml
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/designer/CharacterControllerSection.qml
        2023-09-24 13:12:43.000000000 +0200
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/designer/CharacterControllerSection.qml
        2023-10-03 22:42:51.000000000 +0200
@@ -168,5 +168,21 @@
 
             ExpandingSpacer {}
         }
+
+        PropertyLabel {
+            text: "Enable ShapeHit Callback"
+            tooltip: "Enables the shapeHit callback for this character 
controller."
+        }
+
+        SecondColumnLayout {
+            CheckBox {
+                text: backendValues.midAirControl.valueToString
+                backendValue: backendValues.midAirControl
+                implicitWidth: StudioTheme.Values.twoControlColumnWidth
+                                + StudioTheme.Values.actionIndicatorWidth
+            }
+
+            ExpandingSpacer {}
+        }
     }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/physxnode/qabstractphysxnode.cpp
 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/physxnode/qabstractphysxnode.cpp
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/physxnode/qabstractphysxnode.cpp
       2023-09-24 13:12:43.000000000 +0200
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/physxnode/qabstractphysxnode.cpp
       2023-10-03 22:42:51.000000000 +0200
@@ -23,19 +23,10 @@
 
 QAbstractPhysXNode::QAbstractPhysXNode(QAbstractPhysicsNode *node) : 
frontendNode(node)
 {
-    Q_ASSERT(node->m_backendObject == nullptr);
     node->m_backendObject = this;
 }
 
-QAbstractPhysXNode::~QAbstractPhysXNode() {
-    if (!frontendNode) {
-        Q_ASSERT(isRemoved);
-        return;
-    }
-
-    Q_ASSERT(frontendNode->m_backendObject == this);
-    frontendNode->m_backendObject = nullptr;
-}
+QAbstractPhysXNode::~QAbstractPhysXNode() = default;
 
 bool QAbstractPhysXNode::cleanupIfRemoved(QPhysXWorld *physX)
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/physxnode/qphysxcharactercontroller.cpp
 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/physxnode/qphysxcharactercontroller.cpp
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/physxnode/qphysxcharactercontroller.cpp
        2023-09-24 13:12:43.000000000 +0200
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/physxnode/qphysxcharactercontroller.cpp
        2023-10-03 22:42:51.000000000 +0200
@@ -21,6 +21,35 @@
 
 QT_BEGIN_NAMESPACE
 
+class ControllerCallback : public physx::PxUserControllerHitReport
+{
+public:
+    ControllerCallback(QPhysicsWorld *worldIn) : world(worldIn) { }
+
+    void onShapeHit(const physx::PxControllerShapeHit &hit) override
+    {
+        QMutexLocker locker(&world->m_removedPhysicsNodesMutex);
+
+        QAbstractPhysicsNode *other = static_cast<QAbstractPhysicsNode 
*>(hit.actor->userData);
+        QCharacterController *trigger =
+                static_cast<QCharacterController 
*>(hit.controller->getUserData());
+
+        if (!trigger || !other || !trigger->enableShapeHitCallback())
+            return;
+
+        QVector3D position = 
QPhysicsUtils::toQtType(physx::toVec3(hit.worldPos));
+        QVector3D impulse = QPhysicsUtils::toQtType(hit.dir * hit.length);
+        QVector3D normal = QPhysicsUtils::toQtType(hit.worldNormal);
+
+        emit trigger->shapeHit(other, position, impulse, normal);
+    }
+    void onControllerHit(const physx::PxControllersHit & /*hit*/) override { }
+    void onObstacleHit(const physx::PxControllerObstacleHit & /*hit*/) 
override { }
+
+private:
+    QPhysicsWorld *world = nullptr;
+};
+
 QPhysXCharacterController::QPhysXCharacterController(QCharacterController 
*frontEnd)
     : QAbstractPhysXNode(frontEnd)
 {
@@ -29,6 +58,8 @@
 void QPhysXCharacterController::cleanup(QPhysXWorld *physX)
 {
     PHYSX_RELEASE(controller);
+    delete reportCallback;
+    reportCallback = nullptr;
     QAbstractPhysXNode::cleanup(physX);
 }
 
@@ -60,6 +91,8 @@
     const qreal heightScale = scale.y();
     const qreal radiusScale = scale.x();
     physx::PxCapsuleControllerDesc desc;
+    reportCallback = new ControllerCallback(world);
+    desc.reportCallback = reportCallback;
     desc.radius = 0.5f * radiusScale * capsule->diameter();
     desc.height = heightScale * capsule->height();
     desc.stepOffset = 0.25f * desc.height; // TODO: API
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/physxnode/qphysxcharactercontroller_p.h
 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/physxnode/qphysxcharactercontroller_p.h
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/physxnode/qphysxcharactercontroller_p.h
        2023-09-24 13:12:43.000000000 +0200
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/physxnode/qphysxcharactercontroller_p.h
        2023-10-03 22:42:51.000000000 +0200
@@ -25,6 +25,7 @@
 QT_BEGIN_NAMESPACE
 
 class QCharacterController;
+class ControllerCallback;
 
 class QPhysXCharacterController : public QAbstractPhysXNode
 {
@@ -37,6 +38,7 @@
 
 private:
     physx::PxCapsuleController *controller = nullptr;
+    ControllerCallback *reportCallback = nullptr;
 };
 
 QT_END_NAMESPACE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/qabstractphysicsnode.cpp
 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/qabstractphysicsnode.cpp
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/qabstractphysicsnode.cpp
       2023-09-24 13:12:43.000000000 +0200
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/qabstractphysicsnode.cpp
       2023-10-03 22:42:51.000000000 +0200
@@ -1,4 +1,3 @@
-
 // Copyright (C) 2021 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
@@ -58,11 +57,13 @@
     \qmlsignal PhysicsNode::bodyContact(PhysicsNode *body, list<vector3D> 
positions,
    list<vector3D> impulses, list<vector3D> normals)
 
-    This signal is emitted when there is a collision and \l {PhysicsNode::}
-    {receiveContactReports} is set to \c true in this body and \l 
{PhysicsNode::}
-    {sendContactReports} is set to \c true in the colliding \a body. The 
parameters \a positions, \a
-    impulses and \a normals contain the position, impulse force and normal for 
each contact point at
-    the same index.
+    This signal is emitted when there is a collision between a non-kinematic 
dynamic body and any
+    other body. The \l {PhysicsNode::} {receiveContactReports} in this body 
and \l {PhysicsNode::}
+    {sendContactReports} in the colliding body need to be set to true. The 
parameters \a body, \a
+    positions, \a impulses and \a normals contain the other body, position, 
impulse force and normal
+    for each contact point at the same index.
+
+    \sa CharacterController::shapeHit
 */
 
 /*!
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/qcharactercontroller.cpp
 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/qcharactercontroller.cpp
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/qcharactercontroller.cpp
       2023-09-24 13:12:43.000000000 +0200
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/qcharactercontroller.cpp
       2023-10-03 22:42:51.000000000 +0200
@@ -92,11 +92,34 @@
 */
 
 /*!
+    \qmlproperty bool CharacterController::enableShapeHitCallback
+    \since 6.6
+
+    This property enables/disables the \l {CharacterController::shapeHit} 
callback for this
+    character controller.
+
+    Default value: false
+*/
+
+/*!
     \qmlmethod CharacterController::teleport(vector3d position)
     Immediately move the character to \a position without checking for 
collisions.
     The caller is responsible for avoiding overlap with static objects.
 */
 
+/*!
+    \qmlsignal CharacterController::shapeHit(PhysicsNode *body, vector3D 
position, vector3D impulse,
+    vector3D normal)
+    \since 6.6
+
+    This signal is emitted when \l {CharacterController::}{movement} has been
+    called and it would result
+    in a collision with a \l {DynamicRigidBody} or a \l {StaticRigidBody} and
+    \l {CharacterController::} {enableShapeHitCallback} is set to \c true.
+    The parameters \a body, \a position, \a impulse and \a normal contain the 
body, position,
+    impulse force and normal for the contact point.
+*/
+
 QCharacterController::QCharacterController() = default;
 
 const QVector3D &QCharacterController::movement() const
@@ -235,9 +258,22 @@
     emit collisionsChanged();
 }
 
+bool QCharacterController::enableShapeHitCallback() const
+{
+    return m_enableShapeHitCallback;
+}
+
 QAbstractPhysXNode *QCharacterController::createPhysXBackend()
 {
     return new QPhysXCharacterController(this);
 }
 
+void QCharacterController::setEnableShapeHitCallback(bool 
newEnableShapeHitCallback)
+{
+    if (m_enableShapeHitCallback == newEnableShapeHitCallback)
+        return;
+    m_enableShapeHitCallback = newEnableShapeHitCallback;
+    emit enableShapeHitCallbackChanged();
+}
+
 QT_END_NAMESPACE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/qcharactercontroller_p.h
 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/qcharactercontroller_p.h
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/qcharactercontroller_p.h
       2023-09-24 13:12:43.000000000 +0200
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/qcharactercontroller_p.h
       2023-10-03 22:42:51.000000000 +0200
@@ -30,6 +30,8 @@
     Q_PROPERTY(bool midAirControl READ midAirControl WRITE setMidAirControl 
NOTIFY
                        midAirControlChanged)
     Q_PROPERTY(Collisions collisions READ collisions NOTIFY collisionsChanged)
+    Q_PROPERTY(bool enableShapeHitCallback READ enableShapeHitCallback WRITE
+                       setEnableShapeHitCallback NOTIFY 
enableShapeHitCallbackChanged)
     QML_NAMED_ELEMENT(CharacterController)
 public:
     QCharacterController();
@@ -59,6 +61,9 @@
     void setCollisions(const Collisions &newCollisions);
     QAbstractPhysXNode *createPhysXBackend() final;
 
+    Q_REVISION(6, 6) bool enableShapeHitCallback() const;
+    Q_REVISION(6, 6) void setEnableShapeHitCallback(bool 
newEnableShapeHitCallback);
+
 signals:
     void movementChanged();
     void gravityChanged();
@@ -66,6 +71,9 @@
     void midAirControlChanged();
 
     void collisionsChanged();
+    void enableShapeHitCallbackChanged();
+    void shapeHit(QAbstractPhysicsNode *body, const QVector3D &position, const 
QVector3D &impulse,
+                  const QVector3D &normal);
 
 private:
     QVector3D m_movement;
@@ -77,6 +85,7 @@
     QVector3D m_teleportPosition;
     bool m_teleport = false;
     Collisions m_collisions;
+    bool m_enableShapeHitCallback = false;
 };
 
 Q_DECLARE_OPERATORS_FOR_FLAGS(QCharacterController::Collisions)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/qphysicsworld.cpp 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/qphysicsworld.cpp
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/qphysicsworld.cpp  
    2023-09-24 13:12:43.000000000 +0200
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/qphysicsworld.cpp  
    2023-10-03 22:42:51.000000000 +0200
@@ -227,8 +227,6 @@
     for (auto world : worldManager.worlds) {
         world->m_newPhysicsNodes.removeAll(physicsNode);
         if (physicsNode->m_backendObject) {
-            Q_ASSERT(physicsNode->m_backendObject->frontendNode == 
physicsNode);
-            physicsNode->m_backendObject->frontendNode = nullptr;
             physicsNode->m_backendObject->isRemoved = true;
             physicsNode->m_backendObject = nullptr;
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/qphysicsworld_p.h 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/qphysicsworld_p.h
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/qphysicsworld_p.h  
    2023-09-24 13:12:43.000000000 +0200
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/qphysicsworld_p.h  
    2023-10-03 22:42:51.000000000 +0200
@@ -204,6 +204,7 @@
     friend class QHeightFieldShape;
     friend class QQuick3DPhysicsHeightField;
     friend class SimulationEventCallback;
+    friend class ControllerCallback;
     static physx::PxPhysics *getPhysics();
     static physx::PxCooking *getCooking();
     QThread m_workerThread;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/qstaticphysxobjects.cpp
 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/qstaticphysxobjects.cpp
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/src/quick3dphysics/qstaticphysxobjects.cpp
        2023-09-24 13:12:43.000000000 +0200
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/src/quick3dphysics/qstaticphysxobjects.cpp
        2023-10-03 22:42:51.000000000 +0200
@@ -2,6 +2,7 @@
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
 #include "qstaticphysxobjects_p.h"
+#include <qassert.h>
 #include <QGlobalStatic>
 #include <new>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/tests/auto/CMakeLists.txt 
new/qtquick3dphysics-everywhere-src-6.6.0/tests/auto/CMakeLists.txt
--- old/qtquick3dphysics-everywhere-src-6.5.3/tests/auto/CMakeLists.txt 
2023-09-24 13:12:43.000000000 +0200
+++ new/qtquick3dphysics-everywhere-src-6.6.0/tests/auto/CMakeLists.txt 
2023-10-03 22:42:51.000000000 +0200
@@ -1,3 +1,4 @@
+add_subdirectory(callback)
 add_subdirectory(changescene)
 add_subdirectory(character)
 add_subdirectory(character_remove)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/tests/auto/callback/CMakeLists.txt 
new/qtquick3dphysics-everywhere-src-6.6.0/tests/auto/callback/CMakeLists.txt
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/tests/auto/callback/CMakeLists.txt    
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/tests/auto/callback/CMakeLists.txt    
    2023-10-03 22:42:51.000000000 +0200
@@ -0,0 +1,22 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH 
Qt-GPL-exception-1.0
+
+set(PROJECT_NAME "test_auto_callback")
+
+qt_internal_add_test(${PROJECT_NAME}
+    GUI
+    QMLTEST
+    SOURCES
+        tst_callback.cpp
+    LIBRARIES
+        Qt::Core
+        Qt::Qml
+    TESTDATA
+        tst_callback.qml
+        PlaneScene.qml
+    BUILTIN_TESTDATA
+)
+
+if(QT_BUILD_STANDALONE_TESTS)
+    qt_import_qml_plugins(${PROJECT_NAME})
+endif()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/tests/auto/callback/PlaneScene.qml 
new/qtquick3dphysics-everywhere-src-6.6.0/tests/auto/callback/PlaneScene.qml
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/tests/auto/callback/PlaneScene.qml    
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/tests/auto/callback/PlaneScene.qml    
    2023-10-03 22:42:51.000000000 +0200
@@ -0,0 +1,59 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtQuick3D
+import QtQuick3D.Physics
+
+View3D {
+    id: viewport
+    property real elapsedTime: 0
+
+    environment: SceneEnvironment {
+        clearColor: "#d6dbdf"
+        backgroundMode: SceneEnvironment.Color
+    }
+
+    PerspectiveCamera {
+        position: Qt.vector3d(0, 200, 1000)
+        clipFar: 2000
+        clipNear: 1
+    }
+
+    DirectionalLight {
+        eulerRotation.x: -45
+        eulerRotation.y: 45
+        castsShadow: true
+        brightness: 1
+        shadowFactor: 100
+    }
+
+    PhysicsWorld {
+        id: world
+        scene: viewport.scene
+        //maximumTimestep: 0.1
+        //minimumTimestep: 0.1
+    }
+
+    Connections {
+        target: world
+        function onFrameDone(timeStep) {
+            viewport.elapsedTime += timeStep
+        }
+    }
+
+    StaticRigidBody {
+        position: Qt.vector3d(0, -100, 0)
+        eulerRotation: Qt.vector3d(-90, 0, 0)
+        collisionShapes: PlaneShape {}
+        Model {
+            source: "#Rectangle"
+            scale: Qt.vector3d(500, 500, 0)
+            materials: PrincipledMaterial {
+                baseColor: "green"
+            }
+            castsShadows: false
+            receivesShadows: true
+        }
+    }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/tests/auto/callback/tst_callback.cpp 
new/qtquick3dphysics-everywhere-src-6.6.0/tests/auto/callback/tst_callback.cpp
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/tests/auto/callback/tst_callback.cpp  
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/tests/auto/callback/tst_callback.cpp  
    2023-10-03 22:42:51.000000000 +0200
@@ -0,0 +1,21 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH 
Qt-GPL-exception-1.0
+
+#include <QtQuickTest/quicktest.h>
+class tst_callback: public QObject
+{
+    Q_OBJECT
+private slots:
+    void skiptest() { QSKIP("This test will fail, skipping."); };
+};
+int main(int argc, char **argv)
+{
+    if (!qEnvironmentVariableIsEmpty("QEMU_LD_PREFIX")) {
+        qWarning("This test is unstable on QEMU, so it will be skipped.");
+        tst_callback skip;
+        return QTest::qExec(&skip, argc, argv);
+    }
+    QTEST_SET_MAIN_SOURCE_PATH
+    return quick_test_main(argc, argv, "tst_callback", QUICK_TEST_SOURCE_DIR);
+}
+#include "tst_callback.moc"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/tests/auto/callback/tst_callback.qml 
new/qtquick3dphysics-everywhere-src-6.6.0/tests/auto/callback/tst_callback.qml
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/tests/auto/callback/tst_callback.qml  
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/tests/auto/callback/tst_callback.qml  
    2023-10-03 22:42:51.000000000 +0200
@@ -0,0 +1,818 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+// Tests the callback methods.
+//
+// 00) dynamic vs static
+// 01) dynamic vs kinematic
+// 02) dynamic vs character
+// 03) dynamic vs dynamic
+//
+// 10) character vs dynamic (no callback)
+// 11) character vs static (no callback)
+// 12) character vs kinematic (no callback)
+// 13) character vs character (no callback)
+//
+// 20) character vs dynamic (onShapeHit)
+// 21) character vs static (onShapeHit)
+// 22) character vs kinematic (onShapeHit)
+// 23) character vs character (onShapeHit no callback)
+//
+// 30) kinematic vs static (no callback)
+// 31) kinematic vs kinematic (no callback)
+// 32) kinematic vs character (no callback)
+// 33) kinematic vs dynamic
+
+import QtCore
+import QtTest
+import QtQuick3D
+import QtQuick3D.Physics
+import QtQuick3D.Physics.Helpers
+import QtQuick
+
+Item {
+    id: testItem
+    property real sceneWidth: 200
+    property real sceneHeight: 200
+
+    function xy(i, j) {
+        return [j*testItem.sceneWidth, i*testItem.sceneHeight]
+    }
+    width: sceneWidth*4
+    height: sceneHeight*4
+    visible: true
+
+    //////////////////////////////////////////////////
+    // 00 dynamic vs static
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(0, 0)[0]
+        y: xy(0, 0)[1]
+        id: scene00
+        property bool contact: false
+
+        DynamicRigidBody {
+            position: Qt.vector3d(0, 600, 0)
+            collisionShapes: SphereShape {}
+            receiveContactReports: true
+            onBodyContact: () => {
+                scene00.contact = true
+            }
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+        }
+
+        StaticRigidBody {
+            position: Qt.vector3d(0, 0, 0)
+            collisionShapes: SphereShape {}
+            sendContactReports: true
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+        }
+    }
+
+    TestCase {
+        name: "dynamic vs static"
+        when: scene00.contact
+        function triggered() {}
+    }
+
+    //////////////////////////////////////////////////
+    // 01 dynamic vs kinematic
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(0, 1)[0]
+        y: xy(0, 1)[1]
+        id: scene01
+        property bool contact: false
+
+        DynamicRigidBody {
+            position: Qt.vector3d(0, 600, 0)
+            collisionShapes: SphereShape {}
+            receiveContactReports: true
+            onBodyContact: () => {
+                scene01.contact = true
+            }
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+        }
+
+        DynamicRigidBody {
+            isKinematic: true
+            position: Qt.vector3d(0, 100, 0)
+            collisionShapes: SphereShape {}
+            sendContactReports: true
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+        }
+    }
+
+    TestCase {
+        name: "dynamic vs kinematic"
+        when: scene01.contact
+        function triggered() {}
+    }
+
+    //////////////////////////////////////////////////
+    // 02 dynamic vs character
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(0, 2)[0]
+        y: xy(0, 2)[1]
+        id: scene02
+        property bool contact: false
+
+        DynamicRigidBody {
+            position: Qt.vector3d(0, 600, 0)
+            collisionShapes: SphereShape {}
+            receiveContactReports: true
+            onBodyContact: () => {
+                scene02.contact = true
+            }
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+        }
+
+        CharacterController {
+            position: Qt.vector3d(0, 50, 0)
+            sendContactReports: true
+            Model {
+                eulerRotation.z: 90
+                geometry: CapsuleGeometry {}
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+            collisionShapes: CapsuleShape {}
+        }
+    }
+
+    TestCase {
+        name: "dynamic vs character"
+        when: scene02.contact
+        function triggered() {}
+    }
+
+
+    //////////////////////////////////////////////////
+    // 03 dynamic vs dynamic
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(0, 3)[0]
+        y: xy(0, 3)[1]
+        id: scene03
+        property bool contact: false
+
+        DynamicRigidBody {
+            position: Qt.vector3d(0, 600, 0)
+            collisionShapes: SphereShape {}
+            receiveContactReports: true
+            onBodyContact: () => {
+                scene03.contact = true
+            }
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+        }
+
+        DynamicRigidBody {
+            position: Qt.vector3d(0, 100, 0)
+            collisionShapes: SphereShape {}
+            sendContactReports: true
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+        }
+    }
+
+    TestCase {
+        name: "dynamic vs dynamic"
+        when: scene03.contact
+        function triggered() {}
+    }
+
+    //////////////////////////////////////////////////
+    // 10 character vs dynamic (no callback)
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(1, 0)[0]
+        y: xy(1, 0)[1]
+        id: scene10
+        property bool contact: false
+
+        DynamicRigidBody {
+            position: Qt.vector3d(0, 0, 0)
+            collisionShapes: SphereShape {}
+            receiveContactReports: true
+            onBodyContact: () => {
+                scene10.contact = true
+            }
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+        }
+
+        CharacterController {
+            position: Qt.vector3d(0, 1000, 0)
+            sendContactReports: true
+            gravity: Qt.vector3d(0, -982, 0)
+            Model {
+                eulerRotation.z: 90
+                geometry: CapsuleGeometry {}
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+            collisionShapes: CapsuleShape {}
+        }
+    }
+
+    TestCase {
+        name: "character vs dynamic (no callback)"
+        when: scene10.elapsedTime > 2000 && !scene10.contact
+        function triggered() {}
+    }
+
+    //////////////////////////////////////////////////
+    // 11 character vs static (no callback)
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(1, 1)[0]
+        y: xy(1, 1)[1]
+        id: scene11
+        property bool contact: false
+
+        StaticRigidBody {
+            position: Qt.vector3d(0, 0, 0)
+            collisionShapes: SphereShape {}
+            receiveContactReports: true
+            onBodyContact: () => {
+                scene11.contact = true
+            }
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+        }
+
+        CharacterController {
+            position: Qt.vector3d(0, 1000, 0)
+            sendContactReports: true
+            gravity: Qt.vector3d(0, -982, 0)
+            Model {
+                eulerRotation.z: 90
+                geometry: CapsuleGeometry {}
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+            collisionShapes: CapsuleShape {}
+        }
+    }
+
+    TestCase {
+        name: "character controller vs static (no callback)"
+        when: scene11.elapsedTime > 2000 && !scene11.contact
+        function triggered() {}
+    }
+
+    //////////////////////////////////////////////////
+    // 12 character vs kinematic (no callback)
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(1, 2)[0]
+        y: xy(1, 2)[1]
+        id: scene12
+        property bool contact: false
+
+        DynamicRigidBody {
+            isKinematic: true
+            position: Qt.vector3d(0, 0, 0)
+            collisionShapes: SphereShape {}
+            receiveContactReports: true
+            onBodyContact: () => {
+                scene12.contact = true
+            }
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+        }
+
+        CharacterController {
+            position: Qt.vector3d(0, 1000, 0)
+            sendContactReports: true
+            gravity: Qt.vector3d(0, -982, 0)
+            Model {
+                eulerRotation.z: 90
+                geometry: CapsuleGeometry {}
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+            collisionShapes: CapsuleShape {}
+        }
+    }
+
+    TestCase {
+        name: "character vs kinematic (no callback)"
+        when: scene12.elapsedTime > 2000 && !scene12.contact
+        function triggered() {}
+    }
+
+
+    //////////////////////////////////////////////////
+    // 13 character vs character (no callback)
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(1, 3)[0]
+        y: xy(1, 3)[1]
+        id: scene13
+        property bool contact: false
+
+        CharacterController {
+            position: Qt.vector3d(0, 0, 0)
+            receiveContactReports: true
+            onBodyContact: () => {
+                scene13.contact = true
+            }
+            Model {
+                eulerRotation.z: 90
+                geometry: CapsuleGeometry {}
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+            collisionShapes: CapsuleShape {}
+        }
+
+        CharacterController {
+            position: Qt.vector3d(0, 1000, 0)
+            sendContactReports: true
+            gravity: Qt.vector3d(0, -982, 0)
+            Model {
+                eulerRotation.z: 90
+                geometry: CapsuleGeometry {}
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+            collisionShapes: CapsuleShape {}
+        }
+    }
+
+    TestCase {
+        name: "character vs character (no callback)"
+        when: scene13.elapsedTime > 2000 && !scene13.contact
+        function triggered() {}
+    }
+
+    //////////////////////////////////////////////////
+    // 20 character vs dynamic (onShapeHit)
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(2, 0)[0]
+        y: xy(2, 0)[1]
+        id: scene20
+        property bool contact: false
+
+        DynamicRigidBody {
+            position: Qt.vector3d(0, 0, 0)
+            collisionShapes: SphereShape {}
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+        }
+
+        CharacterController {
+            position: Qt.vector3d(0, 1000, 0)
+            gravity: Qt.vector3d(0, -982, 0)
+            onShapeHit: () => {
+                scene20.contact = true
+            }
+            enableShapeHitCallback: true
+
+            Model {
+                eulerRotation.z: 90
+                geometry: CapsuleGeometry {}
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+            collisionShapes: CapsuleShape {}
+        }
+    }
+
+    TestCase {
+        name: "character vs dynamic (onShapeHit)"
+        when: scene20.contact
+        function triggered() {}
+    }
+
+    //////////////////////////////////////////////////
+    // 21 character vs static (onShapeHit)
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(2, 1)[0]
+        y: xy(2, 1)[1]
+        id: scene21
+        property bool contact: false
+
+        StaticRigidBody {
+            position: Qt.vector3d(0, 0, 0)
+            collisionShapes: SphereShape {}
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+        }
+
+        CharacterController {
+            position: Qt.vector3d(0, 1000, 0)
+            sendContactReports: true
+            gravity: Qt.vector3d(0, -982, 0)
+            onShapeHit: () => {
+                scene21.contact = true
+            }
+            enableShapeHitCallback: true
+            Model {
+                eulerRotation.z: 90
+                geometry: CapsuleGeometry {}
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+            collisionShapes: CapsuleShape {}
+        }
+    }
+
+    TestCase {
+        name: "character controller vs static (onShapeHit)"
+        when: scene21.contact
+        function triggered() {}
+    }
+
+    //////////////////////////////////////////////////
+    // 22 character vs kinematic (onShapeHit)
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(2, 2)[0]
+        y: xy(2, 2)[1]
+        id: scene22
+        property bool contact: false
+
+        DynamicRigidBody {
+            isKinematic: true
+            position: Qt.vector3d(0, 0, 0)
+            collisionShapes: SphereShape {}
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+        }
+
+        CharacterController {
+            position: Qt.vector3d(0, 1000, 0)
+            gravity: Qt.vector3d(0, -982, 0)
+            onShapeHit: () => {
+                scene22.contact = true
+            }
+            enableShapeHitCallback: true
+            Model {
+                eulerRotation.z: 90
+                geometry: CapsuleGeometry {}
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+            collisionShapes: CapsuleShape {}
+        }
+    }
+
+    TestCase {
+        name: "character vs kinematic (onShapeHit)"
+        when: scene22.contact
+        function triggered() {}
+    }
+
+
+    //////////////////////////////////////////////////
+    // 23 character vs character (onShapeHit no callback)
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(2, 3)[0]
+        y: xy(2, 3)[1]
+        id: scene23
+        property bool contact: false
+
+        CharacterController {
+            position: Qt.vector3d(0, 0, 0)
+            Model {
+                eulerRotation.z: 90
+                geometry: CapsuleGeometry {}
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+            collisionShapes: CapsuleShape {}
+        }
+
+        CharacterController {
+            position: Qt.vector3d(0, 1000, 0)
+            gravity: Qt.vector3d(0, -982, 0)
+            Model {
+                eulerRotation.z: 90
+                geometry: CapsuleGeometry {}
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+            onShapeHit: () => {
+                scene23.contact = true
+            }
+            enableShapeHitCallback: true
+            collisionShapes: CapsuleShape {}
+        }
+    }
+
+    TestCase {
+        name: "character vs character (onShapeHit no callback)"
+        when: scene23.elapsedTime > 2000 && !scene23.contact
+        function triggered() {}
+    }
+
+
+    //////////////////////////////////////////////////
+    // 30 kinematic vs static (no callback)
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(3, 0)[0]
+        y: xy(3, 0)[1]
+        id: scene30
+        property bool contact: false
+
+        DynamicRigidBody {
+            id: scene30Sphere
+            position: Qt.vector3d(0, 600, 0)
+            collisionShapes: SphereShape {}
+            receiveContactReports: true
+            onBodyContact: () => {
+                scene30.contact = true
+            }
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+
+            isKinematic: true
+            kinematicPosition: Qt.vector3d(0, Math.max(600 - 
scene30.elapsedTime, 0), 0)
+        }
+
+        StaticRigidBody {
+            position: Qt.vector3d(0, 0, 0)
+            collisionShapes: SphereShape {}
+            sendContactReports: true
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+        }
+    }
+
+    TestCase {
+        name: "kinematic vs static (no callback)"
+        when: !scene30.contact && scene30.elapsedTime > 2000
+        function triggered() {}
+    }
+
+    //////////////////////////////////////////////////
+    // 31 kinematic vs kinematic (no callback)
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(3, 1)[0]
+        y: xy(3, 1)[1]
+        id: scene31
+        property bool contact: false
+
+        DynamicRigidBody {
+            position: Qt.vector3d(0, 600, 0)
+            collisionShapes: SphereShape {}
+            receiveContactReports: true
+            onBodyContact: () => {
+                scene31.contact = true
+            }
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+
+            isKinematic: true
+            kinematicPosition: Qt.vector3d(0, Math.max(600 - 
scene30.elapsedTime, 0), 0)
+        }
+
+        DynamicRigidBody {
+            isKinematic: true
+            position: Qt.vector3d(0, 100, 0)
+            collisionShapes: SphereShape {}
+            sendContactReports: true
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+        }
+    }
+
+    TestCase {
+        name: "kinematic vs kinematic (no callback)"
+        when: !scene31.contact && scene31.elapsedTime > 2000
+        function triggered() {}
+    }
+
+    //////////////////////////////////////////////////
+    // 32 kinematic vs character (no callback)
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(3, 2)[0]
+        y: xy(3, 2)[1]
+        id: scene32
+        property bool contact: false
+
+        DynamicRigidBody {
+            position: Qt.vector3d(0, 600, 0)
+            collisionShapes: SphereShape {}
+            receiveContactReports: true
+            onBodyContact: () => {
+                scene32.contact = true
+            }
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+
+            isKinematic: true
+            kinematicPosition: Qt.vector3d(0, Math.max(600 - 
scene30.elapsedTime, 0), 0)
+        }
+
+        CharacterController {
+            position: Qt.vector3d(0, 50, 0)
+            sendContactReports: true
+            Model {
+                eulerRotation.z: 90
+                geometry: CapsuleGeometry {}
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+            collisionShapes: CapsuleShape {}
+        }
+    }
+
+    TestCase {
+        name: "kinematic vs character (no callback)"
+        when: !scene32.contact && scene32.elapsedTime > 2000
+        function triggered() {}
+    }
+
+
+    //////////////////////////////////////////////////
+    // 33 kinematic vs dynamic
+
+    PlaneScene {
+        width: parent.sceneWidth
+        height: parent.sceneHeight
+        x: xy(3, 3)[0]
+        y: xy(3, 3)[1]
+        id: scene33
+        property bool contact: false
+
+        DynamicRigidBody {
+            position: Qt.vector3d(0, 600, 0)
+            collisionShapes: SphereShape {}
+            receiveContactReports: true
+            onBodyContact: () => {
+                scene33.contact = true
+            }
+
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "red"
+                }
+            }
+        }
+
+        DynamicRigidBody {
+            position: Qt.vector3d(0, 100, 0)
+            collisionShapes: SphereShape {}
+            sendContactReports: true
+            Model {
+                source: "#Sphere"
+                materials: PrincipledMaterial {
+                    baseColor: "blue"
+                }
+            }
+        }
+    }
+
+    TestCase {
+        name: "kinematic vs dynamic"
+        when: scene33.contact
+        function triggered() {}
+    }
+
+    //////////////////////////////////////////////////
+}
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/qtquick3dphysics-everywhere-src-6.5.3/tests/baseline/shared/baselineprotocol.cpp
 
new/qtquick3dphysics-everywhere-src-6.6.0/tests/baseline/shared/baselineprotocol.cpp
--- 
old/qtquick3dphysics-everywhere-src-6.5.3/tests/baseline/shared/baselineprotocol.cpp
        2023-09-24 13:12:43.000000000 +0200
+++ 
new/qtquick3dphysics-everywhere-src-6.6.0/tests/baseline/shared/baselineprotocol.cpp
        2023-10-03 22:42:51.000000000 +0200
@@ -270,7 +270,7 @@
 
     socket.connectToHost(serverName, ServerPort);
     if (!socket.waitForConnected(Timeout)) {
-        QThread::msleep(3000); // Wait a bit and try again, the server might 
just be restarting
+        QThread::sleep(std::chrono::seconds{3});  // Wait a bit and try again, 
the server might just be restarting
         if (!socket.waitForConnected(Timeout)) {
             errMsg += QLS("TCP connectToHost failed. Host:") + QLS(serverName) 
+ QLS(" port:") + QString::number(ServerPort);
             return false;

Reply via email to