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

/*!
    \example compoundshapes
    \ingroup quick3dphysics-examples
    \title Qt Quick 3D Physics - Compound Shapes Example
    \examplecategory {3D}
    \brief Demonstrates using complex collision shapes.
    \image compoundshapes-example.jpg {Screenshot of a landscape and multiple square frames and rings chained together}

    This example demonstrates how to use more than one collision shape to create complex objects for collision detection.
    The scene consists of a green static plane and a series of links connected to each other.
    At the beginning, the simulation is disabled. After some time or when the user press the space key, the simulation will
    start. An animation will start that causes the leftmost and rightmost links to move horizontally back and forth.

    \section1 Setup

    As usual we need to add our PhysicsWorld:

    \snippet compoundshapes/main.qml world

    We do the usual setup where we have an environment, camera and lights:

    \snippet compoundshapes/main.qml environment

    \section1 Physical objects

    We have our regular static plane:

    \snippet compoundshapes/main.qml plane

    Then we make instances of our links.

    \snippet compoundshapes/main.qml link

    The first link which is on the left has its \l {DynamicRigidBody::} {isKinematic}
    property set to \c true so that we can control it via animation. Since it is a kinematic object we need to set the
    \l {DynamicRigidBody::} {kinematicPosition} and \l {DynamicRigidBody::} {kinematicRotation} properties. We animate
    it by animating the \l {DynamicRigidBody::} {kinematicPosition} property. The other links are instanced with some
    spacing between them.

    To get a smooth animation that follows the physical simulation exactly we use an AnimationController which we connect
    to the \c onFrameDone signal on the \l PhysicsWorld. This way, if there were to be any frame drops slowing down the
    simulation the animation will slow down accordingly. We use a SequentialAnimation with four NumberAnimation to move
    the leftmost and rightmost rings back and forth. This is the QML code for the animation:

    \snippet compoundshapes/main.qml animation

    The interesting part is what is happening inside the Mesh and Capsule Links files. Let's take a look at each
    one of them.

    \section1 Mesh Link
    \snippet compoundshapes/MeshLink.qml meshlink

    The Mesh Link is a Dynamic Rigid Body with a model and a material. The model loads the mesh from a mesh file.
    We also have a list of collision shapes that together are combined and form a compound shape for collision detection.
    Each shape is a Convex Mesh shape which loads the mesh from a source file.
    A convex shape is basically a shape where the line between any two points within the shape is always inside the shape.

    If we take a closer look when the debug mode is enabled, this is how the collision shapes form the compound
    collision shape:

    \image compoundshapes-example-meshlink.jpg

    \section1 Capsule Link
    \snippet compoundshapes/CapsuleLink.qml capsulelink

    The Capsule Link is a Dynamic Rigid Body with some models that share the same material. This link is formed from
    several cylinders and spheres.
    Like the Mesh Link we have a list of collision shapes. This time each shape is a Capsule Shape.

    If we take a closer look when the debug mode is enabled, this is how the collision shapes form the compound
    collision shape.

    \image compoundshapes-example-capsulelink.jpg {Screenshot of a 3D rendering showing two rings connected through
           a square frame and their rigid bodies}
*/
