#ifndef Globals_H
#define Globals_H

#include "Punkt.h"
#include "Critical.h"

#ifndef Global
#define Global extern
#endif

struct HINSTANCE__; //! windows.h

namespace Framework
{
    class ThreadRegister; //! Thread.h
    class Thread; //! Thread.h
    class Model3DList; //! Model3DList.h
    class TexturList; //! TexturList.h
    class Datei; //! Datei.h
    class DLLRegister; //! DLLRegister.h

#ifdef WIN32
    class Maus; //! Maus.h
    class WFensterArray; //! Fenster.h

    Global WFensterArray WFensterA;
    Global bool MausTrack;
    Global Maus MausZeiger;
    Global bool msgExit;
    Global Punkt mausPos;
#endif
    Global bool TastenStand[ 255 ];
    Global bool MausStand[ 3 ];
    Global bool istInitialisiert;
    Global ThreadRegister* thRegister;
    Global bool logEnabled;
    Global Datei* logFile;
    Global Critical logC;
    Global HINSTANCE__* _hinst;
    Global DLLRegister* dlls;
    Global bool debugDX;

#ifdef WIN32
    //! Gibt die Koordinaten der Maus auf dem Bildschirm zurück
    DLLEXPORT const Punkt& getMausPos();
#endif
    //! Gibt zurück, ob eine Taste der Maus momentan gedrückt wird
    //! \param taste Die Taste, die geprüft werden soll
    //! Beispiel: getMausStand( M_Links ); (Benötigt include <MausEreignis.h>
    DLLEXPORT bool getMausStand( int taste );
    //! Gibt zurück, ob eine Taste auf der tastatur momentan gedrückt wird
    //! \param taste Die Taste, die überprüft werden soll
    //! Beispiel: getTastenStand( T_Enter ); (Benötogt include <TastaturEreignis.h>
    DLLEXPORT bool getTastenStand( unsigned char taste );
    //! Legt fest, ob eine Taste auf der tastatur momentan gedrückt wird
    //! Der Tastenstand wird vom Framework selbst verwaltet und muss nicht mit dieser Funktion gesetzt werden
    //! \param taste Die Taste, deren Status gesetzt werden soll
    //! \param st Ob die Taste momentan gedrückt wird. (true), wenn ja. (false) sonnst.
    DLLEXPORT void setTastenStand( unsigned char taste, bool st );
    //! Initialisiert das Framework
    //! Wird in der (WinMain) des Frameworks automatisch aufgerufen
    DLLEXPORT void initFramework( HINSTANCE__* hInst = 0 );
    //! Gibt den duch (initFramework) benutzten Arbeitsspeicher wieder frei
    //! Wird in der (WinMain) des Frameworks automatisch aufgerufen
    DLLEXPORT void releaseFramework();
    //! Überprüft, ob ein bestimmter Zeiger auf ein Gültiges Thread Objekt zeigt
    //! \param t Der zeiger, der überprüft werden soll
    //! \return 1, falls der Zeiger in Ordnung ist. 0, falls der Zeiger auf kein existentes Thread Objekt zeigt
    DLLEXPORT bool istThreadOk( Thread* t );
    //! Gibt das Thread Register des Frameworks zurück
    DLLEXPORT ThreadRegister* getThreadRegister();
    //! Legt fest ob Log Nachrichten gespeichert werden sollen
    DLLEXPORT void setLogEnabled( bool le );
    //! Speichert eine Zeile in die Logdatei
    //! \param txt die zu Speichernde Nachricht
    DLLEXPORT void logLine( char* txt );
    //! Gibt das DLL Register zurück, in dem alle zurzeit dynamisch geladenen DLL Dateien hinterlegt sind
    DLLEXPORT DLLRegister* getDLLRegister();
    //! Versetzt DirectX in den Debug modus
    DLLEXPORT void setDebugDX( bool debug );
#ifdef WIN32
    //! gibt eine Referenz auf die Maus zurück
    DLLEXPORT Maus& getMaus();
#endif
}

#endif