#ifndef _BASEWIN_H // BaseWin.h nicht doppelt benutzen #define _BASEWIN_H #include "IGL_intern.h" #include #include // Zeit in ms, in der das Fenster aktualisiert werden soll #define WINDOW_REFRESH_TIME 100 using namespace IGL; // Ein Assoziatives Array, das die GLUT-WindowsIDs (->current window) auf die // zugehoerigen Fenster-Objekte abbildet, wird von den statischen Wrappern // benoetigt static map windowList; // die Warteschlange neu zu erzeugender Fenster static queue newObjectsQueue; /* Basisklasse fuer IGL: Implementiert die GL- und GLUT-Funktionalitaet */ class IGL::BaseWin { private: // index fuer glut{Set,Get}Window (setzen des 'current window') int windowID; // Fenster-Attribute bool open_it; bool isOpen; // offen oder geschlossen? DrawMode drawingMode; // Zeichnen mit oder ohne Pufferung int width, height; // Breite, Hoehe in Pixeln const char *name; // Name (im Titelbalken etc.) float markerSize; // aktuelle Markergroesse bool wireMode; // nur Drahtgitter zeichnen float axis[6]; // Bildausschnitt float backColor[3]; // Hintergrundfarbe // Warteschlange, in der die Window-Operationen abgespeichert werden, // die in einer windowEvents-Schleife ausgefuehrt werden CmdQueueCL cmdQueue; // Warteschlange, in der die GL-Befehle abgespeichert werden, // um im Falle eines Events ausgefuehrt zu werden. DrawQueueCL drawQueue; // setzt das Fenster in GLUT als 'current window' void setCurrentWindow(); // beim ersten Aufruf des Konstruktors wird das Glut-API initialisiert // danach werden die einzelnen Fenster ueber registerGlut(dummyWindow ? 1:0) // eingehaengt void initializeGlut(); void registerGlut(int i); // Member-Funktionen, die ueber C-Callbacks durch die statischen Wrapper // st_* mittels glutGetWindow() aufgerufen werden void issueWindowCmds(); // Aufruf durch den Timer st_windowEvents() void _display(); // Neuzeichnen des Fensters, Aufruf durch st_display() void _reshape(int w, int h); // Aufruf durch st_reshape() // diese Methoden werden von Cmd aufgerufen void open(); void close(); void clear(); void setAxis(float xmin, float xmax, float ymin, float ymax, float zmin, float zmax); void redisplay(); // statische Wrapper zu den Member-Funktionen static void st_display(); static void st_reshape(int w, int h); static void st_registerGlut(int i); static void st_close(int windowID); // Arbeitet die in cmdQueue gespeicherten Window-Events (Opn, Cls, Clr, Rdp) // ab: static void st_windowEvents(int null); // Haengt einen Zeichenbefehl an drawQueue an void sendToDrawQueue (IGLCmd *cmd , MessType=Store ); // Haengt eine Fensteroperation an cmdQueue an void sendToCmdQueue(CmdWin *cmd, MessType T); public: BaseWin(int w, int h); ~BaseWin(); // Freunde friend class IGLWin; friend class CmdWin; friend class CmdObj; friend class CmdSetProp; }; #endif