// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only

/*!
    \example impeller
    \ingroup quick3dphysics-examples
    \title Qt Quick 3D Physics - Impeller Example
    \examplecategory {3D}
    \brief Demonstrates using trigger bodies and collision info.
    \image impeller-example.jpg {Screenshot of a 3D rendering showing a blue sphere on a green surface, a pink rectangular block above it,
           and a red sphere floating on top}

    This example demonstrates how to use trigger bodies and collision info.
    The scene consists of a green static plane, a red dynamic sphere, a pink box trigger and a blue static sphere.
    When the red sphere overlaps the trigger body it will turn yellow and when it collides with the blue sphere it will be repelled away.

    \section1 Setup

    As usual we need to add our PhysicsWorld:

    \snippet impeller/main.qml world

    We also add a View3D where we put our scene objects.
    In this we have some settings for the visual environment:

    \snippet impeller/main.qml environment

    \section1 Physical objects

    We have our regular static plane:

    \snippet impeller/main.qml plane

    This is how our dynamic sphere is defined:

    \snippet impeller/main.qml sphere

    The property \c inArea is a custom property we use to keep track of when the sphere is overlapping the box trigger body.
    This is then used for the \c baseColor property to make the sphere yellow when it is overlapping the box and red otherwise.
    Since we want the sphere to partake in contact reporting the property \l {PhysicsNode::} {sendContactReports} needs to be set to \c true.
    Since we also want the sphere to get callbacks when entering and leaving a TriggerBody, the property
    \l {PhysicsNode::} {receiveContactReports} is also set to \c true.
    We implement the \l {PhysicsNode::} {enteredTriggerBody} and \l {PhysicsNode::} {exitedTriggerBody} signal methods
    on the sphere where we set the \c inArea property to \c true or \c false when entering or leaving the trigger body.

    Now let's look at the trigger body:

    \snippet impeller/main.qml box

    The qml type is a TriggerBody which acts like a static body except its collisions are inactive.
    Instead it will trigger \l {PhysicsNode::} {enteredTriggerBody} and \l {PhysicsNode::} {exitedTriggerBody} method calls on the sphere.

    Finally, lets look at the impeller:

    \snippet impeller/main.qml impeller

    This is a static body and we set \l {PhysicsNode::} {receiveContactReports} to \c true to enable the collision callbacks.
    The callback \l {PhysicsNode::} {bodyContact} gets called whenever a collision is reported.
    In the method we call \l{DynamicRigidBody::}{setLinearVelocity} to set the linear velocity
    in the opposite direction of the collision normal vector to simulate an impeller.
*/
