#pragma once

#include "Mat4.h"
#include "ReferenceCounter.h"

namespace Framework
{
    struct MausEreignis3D;
    struct TastaturEreignis;
    class Render3D; //! Render3D.h

    //! Ein Objekt, das von der Bildschirm3D Klasse gezeichnet werden kann.
    class Zeichnung3D : public virtual ReferenceCounter
    {
    protected:
        Vec3< float > pos; //! Position des Objekts
        Vec3< float > angle; //! Drehungswinkel für x, y und z
        Mat4< float > welt; //! Wlet translation matrix
        float radius; //! Der radius einer Kugel, der das gesamte Objekt umschließt
        bool alpha; //! Speichert ob das Objekt teilweise oder ganz transparente stellen enthält
        bool rend;
        float size;

    public:
        //! Konstruktor
        DLLEXPORT Zeichnung3D();
        DLLEXPORT virtual ~Zeichnung3D();
        //! Setzt die Position der Zeichnung in der Welt
        //! \param p Die Position
        DLLEXPORT void setPosition( Vec3< float >& p );
        //! Setzt die Position der Zeichnung in der Welt
        //! \param x Die x Position
        //! \param y Die y Position
        //! \param z Die z Position
        DLLEXPORT void setPosition( float x, float y, float z );
        //! Setzt die Position der Zeichnung in der Welt
        //! \param x Die x Position
        DLLEXPORT void setX( float x );
        //! Setzt die Position der Zeichnung in der Welt
        //! \param y Die y Position
        DLLEXPORT void setY( float y );
        //! Setzt die Position der Zeichnung in der Welt
        //! \param z Die z Position
        DLLEXPORT void setZ( float z );
        //! Setzt die Drehung der Zeichnung in der Welt
        //! \param d Die drehung um die x, y und z achse
        DLLEXPORT void setDrehung( Vec3< float >& d );
        //! Setzt die Drehung der Zeichnung in der Welt
        //! \param xWinkel Die drehung um die x achse
        //! \param yWinkel Die drehung um die y achse
        //! \param zWinkel Die drehung um die z achse
        DLLEXPORT void setDrehung( float xWinkel, float yWinkel, float zWinkel );
        //! Setzt die Drehung der Zeichnung in der Welt
        //! \param winkel Die drehung um die x achse
        DLLEXPORT void setDrehungX( float winkel );
        //! Setzt die Drehung der Zeichnung in der Welt
        //! \param winkel Die drehung um die y achse
        DLLEXPORT void setDrehungY( float winkel );
        //! Setzt die Drehung der Zeichnung in der Welt
        //! \param winkel Die drehung um die z achse
        DLLEXPORT void setDrehungZ( float winkel );
        //! Legt fest, ob das Objekt teilweise oder ganz transparente stellen enthält
        //! \param a true, wenn teilweise oder ganz transparente stellen vorhanden sind
        DLLEXPORT void setAlpha( bool a );
        //! Setzt die skallierung
        DLLEXPORT void setSize( float size );
        //! Errechnet die Matrizen aller Knochen des Skeletts der Zeichnung
        //! \param viewProj Die miteinander multiplizierten Kameramatrizen
        //! \param matBuffer Ein Array mit Matrizen, der gefüllt werden soll
        //! \return Die Anzahl der Matrizen, die die Zeichnung benötigt
        DLLEXPORT virtual int errechneMatrizen( Mat4< float >& viewProj, Mat4< float >* matBuffer );
        //! Verarbeitet ein Mausereignis
        //! \param me Das Mausereignis, das verarbeitet werden soll
        DLLEXPORT virtual void doMausEreignis( MausEreignis3D& me );
        //! Verarbeitet ein Tastaturereignis
        //! \param te das Tastaturereignis, das verarbeitet werden soll
        DLLEXPORT virtual void doTastaturEreignis( TastaturEreignis& te );
        //! Verarbeitet die vergangene Zeit
        //! \param tickval Die zeit in sekunden, die seit dem letzten Aufruf der Funktion vergangen ist
        //! \return true, wenn sich das Objekt verändert hat, false sonnst.
        DLLEXPORT virtual bool tick( double tickval );
        //! Gibt zurück, ob das Objekt teilweise oder ganz transparente stellen enthält
        DLLEXPORT bool hatAlpha() const;
        //! Gibt den radius einer Kugel zurück, die das gesammte Model umschließt
        DLLEXPORT float getRadius() const;
        //! Gibt einen Punkt zurück, der die Position der Zeichnung in der Welt darstellt
        DLLEXPORT const Vec3< float >& getPos() const;
        //! Gibt die X Position der Zeichnung in der Welt zurück
        DLLEXPORT float getX() const;
        //! Gibt die Y Position der Zeichnung in der Welt zurück
        DLLEXPORT float getY() const;
        //! Gibt die Z Position der Zeichnung in der Welt zurück
        DLLEXPORT float getZ() const;
        //! Gibt einen Vektor zurück, der die drehung der Zeichnung in der Welt darstellt. x ist die Drehung um die X Achse im Bogenmaß usw
        DLLEXPORT const Vec3< float >& getDrehung() const;
        //! Gibt die Drehung um die X Achse im Bogenmaß zurück
        DLLEXPORT float getXDrehung() const;
        //! Gibt die Drehung um die Y Achse im Bogenmaß zurück
        DLLEXPORT float getYDrehung() const;
        //! Gibt die Drehung um die Z Achse im Bogenmaß zurück
        DLLEXPORT float getZDrehung() const;
        //! Gibt die Matrix zurück, die die Zeichnung in den Welt Raum übersetzt
        DLLEXPORT const Mat4< float >& getMatrix() const;

    };
}