#pragma once

#include "Array.h"

namespace Framework
{
    class Model3DData; //! Model3D.h
    class Text;        //! Text.h
    class Model3D;     //! Model3D.h

    namespace Standart3DTypes
    {
        extern const char* cube; //! = "f_würfel"; Die Modeldaten eines Würfels
                                 //! der 100 * 100 * 100 groß ist
        extern const char* texturModel; //! = "f_würfel"; Die Modeldaten eines
                                        //! Würfels der 100 * 100 * 100 groß ist
    };                                  // namespace Standart3DTypes

    //! Verwaltet alle geladenen Modeldaten, so dass mehrere Zeichnungen die
    //! selben Daten benutzen können
    class Model3DList : public virtual ReferenceCounter
    {
    private:
        RCArray<Model3DData>* models;
        RCArray<Text>* names;

    public:
        //! Konstruktor
        DLLEXPORT Model3DList();
        //! Destruktor
        DLLEXPORT ~Model3DList();
        //! Fügt der Liste ein Model Hinzu
        //! \param mdl Das Model
        //! \param name Der name, unter dem das Model in der Liste gespeichert
        //! wird
        DLLEXPORT bool addModel(Model3DData* mdl, const char* name);
        //! Entfernt ein Model aus der Liste
        //! \param name Der Name des Models
        DLLEXPORT void removeModel(const char* name);
        //! Überprüft, ob unter einem bestimmten Namen ein Model abgespeichert
        //! wurde \param name Der Name \return true, wenn ein Model mit dem
        //! Namen existiert
        DLLEXPORT bool hatModel(const char* name) const;
        //! Gibt ein bestimmtes Model zurück
        //! \param name Der Name des Models
        DLLEXPORT Model3DData* getModel(const char* name) const;
        //! Gibt ein bestimmtes Model ohne erhöhten Reference Counter zurück
        //! \param name Der Name des Models
        DLLEXPORT Model3DData* zModel(const char* name) const;
        //! remove All models
        DLLEXPORT void removeAll();
    };
} // namespace Framework