/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once

#include <AzCore/Math/Color.h>
#include <AzCore/Math/Matrix4x4.h>
#include <AzCore/Math/Vector2.h>

#include <LmbrCentral/Rendering/MaterialAsset.h>

#include <Animation/AnimSplineTrack.h>
#include <Animation/CompoundSplineTrack.h>

#include <VertexFormats.h>

class UiParticle
{
public: //types

    struct UiParticleInitialParameters
    {
        float lifetime;
        AZ::Vector2 position;
        AZ::Vector2 initialEmitterOffset;
        AZ::Vector2 initialVelocity;
        AZ::Vector2 acceleration;
        float rotation;
        float angularVelocity;
        AZ::Vector2 pivot;
        AZ::Vector2 size;
        AZ::Color color;
        int spriteSheetCellIndex;
    };

    struct UiParticleUpdateParameters
    {
        bool isParticleInfinite;
        bool isVelocityCartesian;
        bool isAccelerationCartesian;
        bool isSpeedMultiplierUsed;
        C2DSplineTrack* speedMultiplier;
    };

    struct UiParticleRenderParameters
    {
        ISprite* sprite;
        AZ::Vector2* particleOffset;
        bool isVelocityCartesian;
        bool isRelativeToEmitter;
        bool isParticleInfinite;
        bool isAspectRatioLocked;
        bool isRotationVelocityBased;
        bool isWidthMultiplierUsed;
        bool isHeightMultiplierUsed;
        bool isColorMultiplierUsed;
        bool isAlphaMultiplierUsed;
        bool isColorOverrideUsed;
        bool isAlphaOverrideUsed;
        AZ::Color colorOverride;
        float alphaOverride;
        float alphaFadeMultiplier;
        C2DSplineTrack* sizeWidthMultiplier;
        C2DSplineTrack* sizeHeightMultiplier;
        UiCompoundSplineTrack* colorMultiplier;
        C2DSplineTrack* alphaMultiplier;
        int spritesheetStartFrame;
        int spritesheetFrameRange;
        float spritesheetFrameDelay;
        bool spritesheetCellIndexAnimated;
        bool spritesheetCellIndexAnimationLooped;
    };

public:
    void Init(UiParticle::UiParticleInitialParameters* emitter);
    void Update(float timeStep, const UiParticleUpdateParameters& updateParameters);

    //! Fill out the four vertices for the particle. 
    //! Returns false if the vertex was not added because it was fully transparent.
    bool FillVertices(SVF_P2F_C4B_T2F_F4B* outputVertices, const UiParticleRenderParameters& renderParameters, const AZ::Matrix4x4& transform);

    bool IsActive(bool infiniteLifetime) const;

private:

    float m_particleAge;
    float m_particleLifetime;

    AZ::Vector2 m_emitterInitialOffset;
    AZ::Vector2 m_position;
    AZ::Vector2 m_pivot;
    float m_rotation;

    int m_spriteCellIndex;

    AZ::Vector2 m_size;

    AZ::Vector2 m_positionDifference;
    AZ::Vector2 m_velocity;
    AZ::Vector2 m_accelerationBasedVelocity;
    AZ::Vector2 m_acceleration;
    float m_angularVelocity;

    AZ::Color m_color;
};