#ifndef DreieckListe_H
#define DreieckListe_H

#include "Punkt.h"
#include "Array.h"

namespace Framework
{
    template< typename T >
    // Eine Ecke eines Dreiecks
    struct DreieckPunkt
    {
        T *punkt;
        Vec2<float> *textur;
        // Konstruktor
        //  punkt: Die Koordinate der Ecke
        //  textur: Die Koordinate in der Textur
        DreieckPunkt( T *punkt, Vec2<float> *textur )
        {
            this->punkt = punkt;
            this->textur = textur;
        }
        // Destruktor
        ~DreieckPunkt()
        {
            delete punkt;
            delete textur;
        }
    };

    template< typename T >
    // Eine Liste von Dreiecken, wobei immer die Beiden letzten Punkte des vorheriegen Dreiecks mit dem n�chsten Punkt ein neues Dreieck bilden
    class DreieckListe
    {
    private:
        Array< DreieckPunkt< T >* > *punkte;
        int ref;

    public:
        // Konstruktor
        DreieckListe()
        {
            ref = 1;
            punkte = new Array< DreieckPunkt< T >* >();
        }

        // Destruktor
        ~DreieckListe()
        {
            int anz = punkte->getEintragAnzahl();
            for( int i = 0; i < anz; i++ )
                delete punkte->get( i );
            punkte->release();
        }

        // F�gt der Liste einen Punkt hinzu
        //  p: Die Koordinaten des Punktes
        //  textur: Die Koordinaten in der Textur
        void addPunkt( T *p, Vec2<float> *textur )
        {
            punkte->add( new DreieckPunkt< T >( p, textur ) );
        }

        // L�scht den letzten Punkt
        void removeLetztenPunkt()
        {
            int i = punkte->getEintragAnzahl() - 1;
            if( !punkte->hat( i ) )
                return;
            delete punkte->get( i );
            punkte->remove( i );
        }

        // L�scht alle Ecken
        void lehren()
        {
            int anz = punkte->getEintragAnzahl();
            for( int i = 0; i < anz; i++ )
                delete punkte->get( i );
            punkte->leeren();
        }

        // gibt die Anzahl der Dreiecke zur�ck
        int getDreieckAnzahl() const
        {
            return punkte->getEintragAnzahl() - 2;
        }

        // Gibt zur�ck, ob eine Textur verwendet wird
        bool hatTextur() const
        {
            int anz = punkte->getEintragAnzahl();
            bool ret = 1;
            for( int i = 0; i < anz; i++ )
            {
                if( punkte->hat( i ) )
                    ret &= punkte->get( i )->textur;
            }
            return ret;
        }

        // Gibt die Liste mit Punkten zur�ck
        Array< DreieckPunkt< T >* > *zListe() const
        {
            return punkte;
        }

        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        DreieckListe *getThis()
        {
            ref++;
            return this;
        }

        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Objekt automatisch gel�scht.
        //  return: 0.
        DreieckListe *release()
        {
            ref--;
            if( !ref )
                delete this;
            return 0;
        }
    };
}

#endif