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

/*!
    \page rain-snow-particle-effect.html
    \ingroup gstutorials
    \sa Particles

    \title Particle System: The rain and the snow effects
    \brief Illustrates how to create a rain and a snow effect with the \QDS
    particle system.

    \image snow-particles.png

    \e{The rain and the snow effects} tutorial illustrates how you can add a rain and
    a snow effect to your scene using the \QDS particle system.

    You need to download the starting project for this tutorial from
    \l{https://git.qt.io/public-demos/qtdesign-studio/-/tree/master/tutorial%20projects/rain-snow-particles/Start}{here}
    before you start.

    Download the project and open the \e faceparticles.qmlproject file in \QDS
    to get started.

    \image rain-snow-tutorial-start.png
    \section1 Creating a rain effect

    \section2 Adding a Particle System to your scene

    To add a particle system, you first need to import the QtQuick3D.Particles3D
    module to your project:

    \list 1
      \li In the \uicontrol Component view, select \imageplus
      .
      \li Find QtQuick3D.Particles3D and select it to add it to your project.
      \li From \uicontrol Components, drag a
      \uicontrol{Particle System} to \uicontrol scene in \uicontrol Navigator.
    \endlist

    Now you have added a particle system to your scene.

    \image rain-snow-tutorial-particle-system.png

    \section2 Adjusting the behavior and apperance of the Particle System

    Next, you adjust the position, behavior, and apperance of the particle
    system to create a simple rain effect:

    \list 1
      \li Adjust the position of the particle system to align with the sphere.
      In \uicontrol Navigator, select \e particleSystem and in
      \uicontrol Properties, set \uicontrol Translation > \uicontrol Y to 193.
      \li Set the \e rain-drop-white-square.png as texture for the particles.
      From \uicontrol Assets, drag
      \e {rain-drop-white-square.png} to \e spriteParticle.
      \li Adjust the apperance and behavior of the sprite further. In \uicontrol
      Properties, set:
        \list
          \li \uicontrol{Particle Scale} to 10.
          \li \uicontrol{Max Amount} to 1000.
          \li \uicontrol Color to #91ffffff.
          \li \uicontrol{Fade In Effect} to FadeNone.
          \li \uicontrol{Fade Out Effect} to FadeNone.
        \endlist
      \li Now you have set the apperance of the particles. Next, adjust
      the particle emitter. In \uicontrol Navigator, select \uicontrol
      particleEmitter, and in \uicontrol Properties set:
        \list
          \li \uicontrol System to particleSystem.
          \li \uicontrol{Emit Rate} to 1500.
          \li \uicontrol{Life Span} to 100.
          \li \uicontrol{Life Span Variation} to 0.
          \li \uicontrol{Particle End Scale} to 1.
          \li \uicontrol{Particle Scale Variation} to 0,5.
          \li \uicontrol{Particle End Scale Variation} to 0,5.
          \li \uicontrol{Particle Rotation} > \uicontrol Variation >
          \uicontrol X, \uicontrol Y,
          and \uicontrol Z to 0.
          \li \uicontrol{Particle Rotation} > \uicontrol{Velocity Variation} >
          \uicontrol X,
          \uicontrol Y, and \uicontrol Z to 0.
          \li \uicontrol Transform > \uicontrol Translation \uicontrol Y to -69.
        \endlist
      \li Finally, you set the direction of the particles. In \uicontrol
      Navigator, select \uicontrol dir3d and in \uicontrol
      Properties set:
        \list
          \li \uicontrol Direction > \uicontrol Y to -500.
          \li \uicontrol Direction > \uicontrol Z to 0.
          \li \uicontrol{Direction Variation} > \uicontrol X, \uicontrol Y, and
          \uicontrol Z to 0.
        \endlist
    \endlist

    \section2 Adjusting the size of the emitting area

    By default, the \uicontrol {Particle Emitter} emits particles from one
    point in the scene. In this scene you want to emit particles from a bigger
    area matching the size of the sphere. To do this, you need to add
    a \uicontrol{Particle Shape} component:

    \list 1
      \li From \uicontrol Components, drag a \uicontrol{Particle Shape}
      component to \uicontrol{particleSystem} in \uicontrol Navigator.
      \li In \uicontrol Navigator, select \uicontrol particleShape, and in
      \uicontrol Properties set:
        \list
          \li \uicontrol Type to \uicontrol Sphere.
          \li \uicontrol Extends \uicontrol X to 85.
          \li \uicontrol Extends \uicontrol Y to 85.
          \li \uicontrol Extends \uicontrol Z to 85.
        \endlist
      \li In \uicontrol Navigator, select \uicontrol particleEmitter, and in
      \uicontrol Particle set
      \uicontrol Shape to \uicontrol particleShape.
    \endlist

    \image rain-snow-tutorial-navigator.png

    Now, the rain effect is ready. Select \key Alt+P to see it in the live
    preview.

    \section1 Creating a snow effect

    To make it easy, you can duplicate the particle system you created for the
    rain effect and adjust the properties to create a snow effect. To do this,
    first create a new state for the snow effect:

    \list
      \li In \uicontrol{States}, select \uicontrol{Create New State}.
    \endlist

    \image rain-snow-tutorial-states.png

    \section2 Turning the rain into snow

    \list 1
      \li With the new state that you just created selected in
      \uicontrol{States}, in \uicontrol{Navigator}, select \uicontrol
      spriteParticle and set \uicontrol Color to #ffffff.
      \li In \uicontrol{Navigator}, select \uicontrol texture1 and set
      \uicontrol Source to \e{snowflake.png}.
      \li In \uicontrol{Navigator}, select \uicontrol particleEmitter and set:
        \list
          \li \uicontrol{Emit Rate} to 250.
          \li \uicontrol{Life Span} to 450.
          \li \uicontrol{Particle Rotation} > \uicontrol Variation >
          \uicontrol{X}, \uicontrol{Y}, and \uicontrol Z to 180.
          \li \uicontrol{Particle Rotation} > \uicontrol{Velocity Variation} >
          \uicontrol{X}, \uicontrol{Y}, and \uicontrol Z to 200.
        \endlist
      \li In \uicontrol{Navigator}, select \uicontrol particleEmitter
      > \uicontrol dir3d and set:
        \list
          \li \uicontrol Direction > \uicontrol Y to -100.
          \li \uicontrol{Direction Variation} \uicontrol{X}, \uicontrol{Y},
          and \uicontrol Z
          to 10.
        \endlist
    \endlist

    Now you can run the snow effect in the live preview:
    \list 1
      \li In \uicontrol{States} next to \uicontrol State1 select
      \imageactionicon
      and select \uicontrol{Set as Default}.
      \li Select \key{Alt+P}.
    \endlist

    \image rain-snow-tutorial-default-state.png
*/
