BGE: alpha on frame buffer and precedence of MSAA over swap.
[blender.git] / intern / ghost / intern / GHOST_System.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file ghost/intern/GHOST_System.h
29  *  \ingroup GHOST
30  * Declaration of GHOST_System class.
31  */
32
33 #ifndef __GHOST_SYSTEM_H__
34 #define __GHOST_SYSTEM_H__
35
36 #include "GHOST_ISystem.h"
37
38 #include "GHOST_Debug.h"
39 #include "GHOST_Buttons.h"
40 #include "GHOST_ModifierKeys.h"
41 #include "GHOST_EventManager.h"
42 #ifdef GHOST_DEBUG
43 #include "GHOST_EventPrinter.h"
44 #endif // GHOST_DEBUG
45
46 class GHOST_DisplayManager;
47 class GHOST_Event;
48 class GHOST_TimerManager;
49 class GHOST_Window;
50 class GHOST_WindowManager;
51 class GHOST_NDOFManager;
52
53 /**
54  * Implementation of platform independent functionality of the GHOST_ISystem
55  * interface.
56  * GHOST_System is an abstract class because not all methods of GHOST_ISystem
57  * are implemented.
58  * \see GHOST_ISystem.
59  * \author      Maarten Gribnau
60  * \date        May 7, 2001
61  */
62 class GHOST_System : public GHOST_ISystem
63 {
64 protected:
65         /**
66          * Constructor.
67          * Protected default constructor to force use of static createSystem member.
68          */
69         GHOST_System();
70
71         /**
72          * Destructor.
73          * Protected default constructor to force use of static dispose member.
74          */
75         virtual ~GHOST_System();
76
77 public:
78         /***************************************************************************************
79          * Time(r) functionality
80          ***************************************************************************************/
81
82         /**
83          * Returns the system time.
84          * Returns the number of milliseconds since the start of the system process.
85          * Based on ANSI clock() routine.
86          * \return The number of milliseconds.
87          */
88         virtual GHOST_TUns64 getMilliSeconds() const;
89
90         /**
91          * Installs a timer.
92          * Note that, on most operating systems, messages need to be processed in order 
93          * for the timer callbacks to be invoked.
94          * \param delay         The time to wait for the first call to the timerProc (in milliseconds)
95          * \param interval      The interval between calls to the timerProc
96          * \param timerProc     The callback invoked when the interval expires,
97          * \param userData      Placeholder for user data.
98          * \return A timer task (0 if timer task installation failed).
99          */
100         GHOST_ITimerTask *installTimer(GHOST_TUns64 delay,
101                                                GHOST_TUns64 interval,
102                                                GHOST_TimerProcPtr timerProc,
103                                                GHOST_TUserDataPtr userData = NULL);
104
105         /**
106          * Removes a timer.
107          * \param timerTask Timer task to be removed.
108          * \return Indication of success.
109          */
110         GHOST_TSuccess removeTimer(GHOST_ITimerTask *timerTask);
111
112         /***************************************************************************************
113          * Display/window management functionality
114          ***************************************************************************************/
115         
116         /**
117          * Inherited from GHOST_ISystem but left pure virtual
118          *
119          * virtual      GHOST_TUns8 getNumDisplays() const = 0;
120          * virtual void getMainDisplayDimensions(...) const = 0;
121          * virtual GHOST_IWindow* createWindow(..)
122          */
123
124         /**
125          * Dispose a window.
126          * \param       window Pointer to the window to be disposed.
127          * \return      Indication of success.
128          */
129         GHOST_TSuccess disposeWindow(GHOST_IWindow *window);
130
131         /**
132          * Returns whether a window is valid.
133          * \param       window Pointer to the window to be checked.
134          * \return      Indication of validity.
135          */
136         bool validWindow(GHOST_IWindow *window);
137
138         /**
139          * Begins full screen mode.
140          * \param setting       The new setting of the display.
141          * \param window        Window displayed in full screen.
142          * \param stereoVisual  Stereo visual for quad buffered stereo.
143          * This window is invalid after full screen has been ended.
144          * \return      Indication of success.
145          */
146         GHOST_TSuccess beginFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow **window,
147                                        const bool stereoVisual, const bool alphaBackground, const GHOST_TUns16 numOfAASamples = 0);
148
149         /**
150          * Updates the resolution while in fullscreen mode.
151          * \param setting       The new setting of the display.
152          * \param window        Window displayed in full screen.
153          *
154          * \return      Indication of success.
155          */
156         GHOST_TSuccess updateFullScreen(const GHOST_DisplaySetting& setting, GHOST_IWindow **window);
157
158         /**
159          * Ends full screen mode.
160          * \return      Indication of success.
161          */
162         GHOST_TSuccess endFullScreen(void);
163
164         /**
165          * Returns current full screen mode status.
166          * \return The current status.
167          */
168         bool getFullScreen(void);
169
170         
171         /**
172          * Native pixel size support (MacBook 'retina').
173          * \return The pixel size in float.
174          */
175         bool useNativePixel(void);
176         bool m_nativePixel;
177
178         /***************************************************************************************
179          * Event management functionality
180          ***************************************************************************************/
181
182         /**
183          * Inherited from GHOST_ISystem but left pure virtual
184          *
185          *  virtual bool processEvents(bool waitForEvent) = 0;
186          */
187
188
189
190         /**
191          * Dispatches all the events on the stack.
192          * The event stack will be empty afterwards.
193          */
194         void dispatchEvents();
195
196         /**
197          * Adds the given event consumer to our list.
198          * \param consumer The event consumer to add.
199          * \return Indication of success.
200          */
201         GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer *consumer);
202
203         /**
204          * Remove the given event consumer to our list.
205          * \param consumer The event consumer to remove.
206          * \return Indication of success.
207          */
208         GHOST_TSuccess removeEventConsumer(GHOST_IEventConsumer *consumer);
209
210         /***************************************************************************************
211          * Cursor management functionality
212          ***************************************************************************************/
213
214         /** Inherited from GHOST_ISystem but left pure virtual
215          *      GHOST_TSuccess getCursorPosition(GHOST_TInt32& x, GHOST_TInt32& y) const = 0;
216          *  GHOST_TSuccess setCursorPosition(GHOST_TInt32 x, GHOST_TInt32 y)
217          */
218
219         /***************************************************************************************
220          * Access to mouse button and keyboard states.
221          ***************************************************************************************/
222
223         /**
224          * Returns the state of a modifier key (ouside the message queue).
225          * \param mask          The modifier key state to retrieve.
226          * \param isDown        The state of a modifier key (true == pressed).
227          * \return                      Indication of success.
228          */
229         GHOST_TSuccess getModifierKeyState(GHOST_TModifierKeyMask mask, bool& isDown) const;
230
231         /**
232          * Returns the state of a mouse button (ouside the message queue).
233          * \param mask          The button state to retrieve.
234          * \param isDown        Button state.
235          * \return                      Indication of success.
236          */
237         GHOST_TSuccess getButtonState(GHOST_TButtonMask mask, bool& isDown) const;
238         
239         /***************************************************************************************
240          * Access to 3D mouse.
241          ***************************************************************************************/
242
243         /**
244          * Sets 3D mouse deadzone
245          * \param deadzone: Deadzone of the 3D mouse (both for rotation and pan) relative to full range
246          */
247         void setNDOFDeadZone(float deadzone);
248
249         /***************************************************************************************
250          * Other (internal) functionality.
251          ***************************************************************************************/
252
253         /**
254          * Pushes an event on the stack.
255          * To dispatch it, call dispatchEvent() or dispatchEvents().
256          * Do not delete the event!
257          * \param event The event to push on the stack.
258          */
259         GHOST_TSuccess pushEvent(GHOST_IEvent *event);
260
261         /**
262          * \return The timer manager.
263          */
264         inline GHOST_TimerManager *getTimerManager() const;
265
266         /**
267          * \return A pointer to our event manager.
268          */
269         inline GHOST_EventManager *getEventManager() const;
270
271         /**
272          * \return A pointer to our window manager.
273          */
274         inline GHOST_WindowManager *getWindowManager() const;
275
276 #ifdef WITH_INPUT_NDOF
277         /**
278          * \return A pointer to our n-degree of freedom manager.
279          */
280         inline GHOST_NDOFManager *getNDOFManager() const;
281 #endif
282
283         /**
284          * Returns the state of all modifier keys.
285          * \param keys  The state of all modifier keys (true == pressed).
286          * \return              Indication of success.
287          */
288         virtual GHOST_TSuccess getModifierKeys(GHOST_ModifierKeys& keys) const = 0;
289
290         /**
291          * Returns the state of the mouse buttons (ouside the message queue).
292          * \param buttons       The state of the buttons.
293          * \return                      Indication of success.
294          */
295         virtual GHOST_TSuccess getButtons(GHOST_Buttons& buttons) const = 0;
296
297         /**
298          * Returns the selection buffer
299          * \param selection             Only used on X11
300          * \return              Returns the clipboard data
301          *
302          */
303         virtual GHOST_TUns8 *getClipboard(bool selection) const = 0;
304           
305         /**
306          * Put data to the Clipboard
307          * \param buffer                The buffer to copy to the clipboard
308          * \param selection     The clipboard to copy too only used on X11
309          */
310         virtual void putClipboard(GHOST_TInt8 *buffer, bool selection) const = 0;
311
312         /**
313          * Confirms quitting he program when there is just one window left open
314          * in the application
315          */
316         virtual int confirmQuit(GHOST_IWindow *window) const;
317
318
319         
320 protected:
321         /**
322          * Initialize the system.
323          * \return Indication of success.
324          */
325         virtual GHOST_TSuccess init();
326
327         /**
328          * Shut the system down.
329          * \return Indication of success.
330          */
331         virtual GHOST_TSuccess exit();
332
333         /**
334          * Creates a fullscreen window.
335          * \param window The window created.
336          * \return Indication of success.
337          */
338         GHOST_TSuccess createFullScreenWindow(GHOST_Window **window, const GHOST_DisplaySetting &settings,
339                                               const bool stereoVisual, const bool alphaBackground = 0, const GHOST_TUns16 numOfAASamples = 0);
340
341         /** The display manager (platform dependent). */
342         GHOST_DisplayManager *m_displayManager;
343
344         /** The timer manager. */
345         GHOST_TimerManager *m_timerManager;
346
347         /** The window manager. */
348         GHOST_WindowManager *m_windowManager;
349
350         /** The event manager. */
351         GHOST_EventManager *m_eventManager;
352
353 #ifdef WITH_INPUT_NDOF
354         /** The N-degree of freedom device manager */
355         GHOST_NDOFManager *m_ndofManager;
356 #endif
357         
358         /** Prints all the events. */
359 #ifdef GHOST_DEBUG
360         GHOST_EventPrinter *m_eventPrinter;
361 #endif // GHOST_DEBUG
362
363         /** Settings of the display before the display went fullscreen. */
364         GHOST_DisplaySetting m_preFullScreenSetting;
365         
366 };
367
368 inline GHOST_TimerManager *GHOST_System::getTimerManager() const
369 {
370         return m_timerManager;
371 }
372
373 inline GHOST_EventManager *GHOST_System::getEventManager() const
374 {
375         return m_eventManager;
376 }
377
378 inline GHOST_WindowManager *GHOST_System::getWindowManager() const
379 {
380         return m_windowManager;
381 }
382
383 #ifdef WITH_INPUT_NDOF
384 inline GHOST_NDOFManager *GHOST_System::getNDOFManager() const
385 {
386         return m_ndofManager;
387 }
388 #endif
389
390 #endif // __GHOST_SYSTEM_H__
391