#pragma once

#include "Vec3.h"
#include "ReferenceCounter.h"

namespace Framework
{
    class Skelett;
    class Knochen;

    class Animation3D : public virtual ReferenceCounter
    {
    private:
        struct KnochenData
        {
            KnochenData *next;
            double time = 0;
            Vec3<float> pos;
            Vec3<float> rot;
        };

        KnochenData *kd[ MAX_KNOCHEN_ANZ ];
        double maxTime;

        //! löscht eine KnochenData Struktur
        void deleteKnochenData( KnochenData *d );

    public:
        //! Konstruktor
        DLLEXPORT Animation3D();
        //! Destructor
        DLLEXPORT ~Animation3D();
        //! Fügt für einen bestimmten Knochen ein Keyframe hinzu
        //! \param kId Die Id des Knochens
        //! \param time Die Zeit, die vergehen soll bis der Knochen die Position und die Rotation des Keyframes follständig erreicht hat
        //! \param pos Die Position des Knochens die erreicht werden soll in Modellkoordinaten
        //! \param rot Die Rotation des Knochens um seine Position die erreicht werden soll
        DLLEXPORT void addKeyFrame( int kId, double time, Vec3<float> pos, Vec3<float> rot );
        //! Wendet die Animation auf ein bestimmtes Skelett an
        //! zS: Das Skelett
        //! timeOffset: zeit in sekunden, die diese Animation bereits auf dem Skelett angewendet wurde. Wird automatisch von der Animation aktualisiert.
        //! sec: zeit in Sekunden, die vergangen ist seit dem diese Methode zuletzt für das Skelett aufgerufen wurde
        DLLEXPORT void apply( Skelett *zS, double &timeOffset, double sec ) const;
        //! Wendet die Animation auf ein bestimmten Knochen an
        //! zS: Der Knochen
        //! timeOffset: zeit in sekunden, die diese Animation bereits auf dem Knochen angewendet wurde.
        //! sec: zeit in Sekunden, die vergangen ist seit dem diese Methode zuletzt für dem Knochen aufgerufen wurde
        DLLEXPORT void apply( Knochen *zK, double timeOffset, double sec ) const;
    };
}