#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
#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 Model3DList *m3dRegister;
    Global TexturList *texturRegister;
    Global bool istInitialisiert;
    Global ThreadRegister *thRegister;
    Global bool logEnabled;
    Global Datei *logFile;
    Global Critical logC;
    Global HINSTANCE__ *_hinst;

#ifdef WIN32
    // Gibt die Koordinaten der Maus auf dem Bildschirm zur�ck
    __declspec( dllexport ) const Punkt &getMausPos();
#endif
    // Gibt zur�ck, ob eine Taste der Maus momentan gedr�ckt wird
    //  taste: Die Taste, die gepr�ft werden soll
    // Beispiel: getMausStand( M_Links ); (Ben�tigt include <MausEreignis.h>
    __declspec( dllexport ) bool getMausStand( int taste );
    // Gibt zur�ck, ob eine Taste auf der tastatur momentan gedr�ckt wird
    //  taste: Die Taste, die �berpr�ft werden soll
    // Beispiel: getTastenStand( T_Enter ); (Ben�togt include <TastaturEreignis.h>
    __declspec( 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
    //  taste: Die Taste, deren Status gesetzt werden soll
    //  st: Ob die Taste momentan gedr�ckt wird. (true), wenn ja. (false) sonnst.
    __declspec( dllexport ) void setTastenStand( unsigned char taste, bool st );
    // Gibt das Model3DData Register des Frameworks ohne erh�hten reference Counter zur�ck
    __declspec( dllexport ) Model3DList *zM3DRegister();
    // Gibt das Textur Register des Frameworks ohne erh�hten reference Counter zur�ck
    __declspec( dllexport ) TexturList *zTexturRegister();
    // Initialisiert das Framework
    // Wird in der (WinMain) des Frameworks automatisch aufgerufen
    __declspec( dllexport ) void initFramework( HINSTANCE__ *hInst = 0 );
    // Gibt den duch (initFramework) benutzten Arbeitsspeicher wieder frei
    // Wird in der (WinMain) des Frameworks automatisch aufgerufen
    __declspec( dllexport ) void releaseFramework();
    // �berpr�ft, ob ein bestimmter Zeiger auf ein G�ltiges Thread Objekt zeigt
    //  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
    __declspec( dllexport ) bool istThreadOk( Thread *t );
    // Gibt das Thread Register des Frameworks zur�ck
    __declspec( dllexport ) ThreadRegister *getThreadRegister();
    // Legt fest ob Log Nachrichten gespeichert werden sollen
    __declspec( dllexport ) void setLogEnabled( bool le );
    // Speichert eine Zeile in die Logdatei
    //  txt: die zu Speichernde Nachricht
    __declspec( dllexport ) void logLine( char *txt );
#ifdef WIN32
    // gibt eine Referenz auf die Maus zur�ck
    __declspec( dllexport ) Maus &getMaus();
#endif
}

#endif