#pragma once

#include "Critical.h"
#include "Array.h"

namespace Framework
{
    class Zeichnung3D; // Zeichnung.h
    class Render3D; // Render3D.h
    struct MausEreignis3D; // MausEreignis.h
    class Model3D;

    // Speichert alle 3D Zeichnungen einer Szene ab
    class Welt3D
    {
    private:
        RCArray< Model3D > *members;
        bool rend;
        Critical cs;
        int ref;

    public:
        // Konstructor
        __declspec( dllexport ) Welt3D();
        // Destruktor
        __declspec( dllexport ) virtual ~Welt3D();
        // Blockiert den zugriff auf das Objekt und wartet gegebenfalls auf den Zugriff
        __declspec( dllexport ) void lock();
        // Gibt das Objekt f�r andere Threads frei
        __declspec( dllexport ) void unlock();
        // F�gt der Welt ein Objekt hinzu
        //  obj: Das Objekt, was hinzugef�gt werden soll
        __declspec( dllexport ) void addZeichnung( Model3D *obj );
        // Entfernt ein Objekt aus der Welt
        //  obj: Das Objekt, das entwernt werden soll (ohne erh�hten reference Counter)
        __declspec( dllexport ) void removeZeichnung( Model3D *zObj );
        // Verarbeitet ein Mausereignis
        //  me: Das Mausereignis, das verarbeitet werden soll
        __declspec( dllexport ) void doMausEreignis( MausEreignis3D &me );
        // Verarbeitet die vergangene Zeit
        //  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.
        __declspec( dllexport ) virtual bool tick( double tickval );
        // Gibt einen Iterator zur�ck, mit dem alle Members aufgez�hlt werden k�nnen
        __declspec( dllexport ) Iterator< Model3D * > getMembers();
        // Erh�ht den Reference Counting Z�hler.
        //  return: this.
        __declspec( dllexport ) Welt3D *getThis();
        // Verringert den Reference Counting Z�hler. Wenn der Z�hler 0 erreicht, wird das Zeichnung automatisch gel�scht.
        //  return: 0.
        __declspec( dllexport ) Welt3D *release();
    };
}