soc-2008-mxcurioni: merged changes to revision 15441
[blender.git] / source / gameengine / Ketsji / KX_KetsjiEngine.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  *
29  */
30 #ifndef __KX_KETSJI_ENGINE
31 #define __KX_KETSJI_ENGINE
32
33 #include "MT_CmMatrix4x4.h"
34 #include "MT_Matrix4x4.h"
35 #include "STR_String.h"
36 #include "KX_ISystem.h"
37 #include "KX_Scene.h"
38 #include "KX_Python.h"
39 #include "KX_WorldInfo.h"
40 #include <vector>
41 #include <set>
42
43 class KX_TimeCategoryLogger;
44
45 #define LEFT_EYE  1
46 #define RIGHT_EYE 2
47
48 enum KX_ExitRequestMode
49 {
50         KX_EXIT_REQUEST_NO_REQUEST = 0,
51         KX_EXIT_REQUEST_QUIT_GAME,
52         KX_EXIT_REQUEST_RESTART_GAME,
53         KX_EXIT_REQUEST_START_OTHER_GAME,
54         KX_EXIT_REQUEST_NO_SCENES_LEFT,
55         KX_EXIT_REQUEST_BLENDER_ESC,
56         KX_EXIT_REQUEST_OUTSIDE,
57         KX_EXIT_REQUEST_MAX
58 };
59
60 /**
61  * KX_KetsjiEngine is the core game engine class.
62  */
63 class KX_KetsjiEngine
64 {
65
66 private:
67         class RAS_ICanvas*                              m_canvas; // 2D Canvas (2D Rendering Device Context)
68         class RAS_IRasterizer*                          m_rasterizer;  // 3D Rasterizer (3D Rendering)
69         class KX_ISystem*                               m_kxsystem;
70         class RAS_IRenderTools*                         m_rendertools;
71         class KX_ISceneConverter*                       m_sceneconverter;
72         class NG_NetworkDeviceInterface*                m_networkdevice;
73         class SND_IAudioDevice*                         m_audiodevice;
74         PyObject*                                       m_pythondictionary;
75         class SCA_IInputDevice*                         m_keyboarddevice;
76         class SCA_IInputDevice*                         m_mousedevice;
77
78         /** Lists of scenes scheduled to be removed at the end of the frame. */
79         std::set<STR_String> m_removingScenes;
80         /** Lists of overley scenes scheduled to be added at the end of the frame. */
81         std::set<STR_String> m_addingOverlayScenes;
82         /** Lists of background scenes scheduled to be added at the end of the frame. */
83         std::set<STR_String> m_addingBackgroundScenes;
84         /** Lists of scenes scheduled to be replaced at the end of the frame. */
85         std::set<std::pair<STR_String,STR_String> >     m_replace_scenes;
86
87         /* The current list of scenes. */
88         KX_SceneList            m_scenes;
89         /* State variable recording the presence of object debug info in the current scene list. */
90         bool                            m_propertiesPresent;    
91
92         bool                            m_bInitialized;
93         int                                     m_activecam;
94         bool                            m_bFixedTime;
95         
96         
97         bool                            m_firstframe;
98         int                                     m_currentFrame;
99
100         double                          m_frameTime;//discrete timestamp of the 'game logic frame'
101         double                          m_clockTime;//current time
102         double                          m_previousClockTime;//previous clock time
103         double                          m_remainingTime;
104
105         static double                   m_ticrate;
106         static double                   m_anim_framerate; /* for animation playback only - ipo and action */
107
108         static double                   m_suspendedtime;
109         static double                   m_suspendeddelta;
110
111         int                                     m_exitcode;
112         STR_String                      m_exitstring;
113                 /**
114                  * Some drawing parameters, the drawing mode
115                  * (wire/flat/texture), and the camera zoom
116                  * factor.
117                  */
118         int                             m_drawingmode;
119         float                   m_cameraZoom;
120         
121         bool                    m_overrideCam;  
122         STR_String              m_overrideSceneName;
123         
124         bool                    m_overrideCamUseOrtho;
125         MT_CmMatrix4x4  m_overrideCamProjMat;
126         MT_CmMatrix4x4  m_overrideCamViewMat;
127
128         bool m_stereo;
129         int m_curreye;
130
131         /** Categories for profiling display. */
132         typedef enum
133         {
134                 tc_first = 0,
135                 tc_physics = 0,
136                 tc_logic,
137                 tc_network,
138                 tc_scenegraph,
139                 tc_sound,
140                 tc_rasterizer,
141                 tc_services,    // time spend in miscelaneous activities
142                 tc_overhead,    // profile info drawing overhead
143                 tc_outside,             // time spend outside main loop
144                 tc_numCategories
145         } KX_TimeCategory;
146
147         /** Time logger. */
148         KX_TimeCategoryLogger*  m_logger;
149         
150         /** Labels for profiling display. */
151         static const char               m_profileLabels[tc_numCategories][15];
152         /** Show the framerate on the game display? */
153         bool                                    m_show_framerate;
154         /** Show profiling info on the game display? */
155         bool                                    m_show_profile;
156         /** Show any debug (scene) object properties on the game display? */
157         bool                                    m_showProperties;
158         /** Show background behind text for readability? */
159         bool                                    m_showBackground;
160
161         bool                                    m_show_debug_properties;
162
163         /** record physics into keyframes */
164         bool                                    m_game2ipo;
165
166         /** Hide cursor every frame? */
167         bool                                    m_hideCursor;
168
169         /** Override framing bars color? */
170         bool                                    m_overrideFrameColor;
171         /** Red component of framing bar color. */
172         float                                   m_overrideFrameColorR;
173         /** Green component of framing bar color. */
174         float                                   m_overrideFrameColorG;
175         /** Blue component of framing bar color. */
176         float                                   m_overrideFrameColorB;
177
178         void                                    SetupRenderFrame(KX_Scene *scene, KX_Camera* cam);
179         void                                    RenderFrame(KX_Scene* scene, KX_Camera* cam);
180         void                                    PostRenderFrame();
181         void                                    RenderDebugProperties();
182         void                                    SetBackGround(KX_WorldInfo* worldinfo);
183         void                                    SetWorldSettings(KX_WorldInfo* worldinfo);
184         void                                    DoSound(KX_Scene* scene);
185
186 public:
187
188         KX_KetsjiEngine(class KX_ISystem* system);
189         virtual ~KX_KetsjiEngine();
190
191         // set the devices and stuff. the client must take care of creating these
192         void                    SetKeyboardDevice(SCA_IInputDevice* keyboarddevice);
193         void                    SetMouseDevice(SCA_IInputDevice* mousedevice);
194         void                    SetNetworkDevice(NG_NetworkDeviceInterface* networkdevice);
195         void                    SetAudioDevice(SND_IAudioDevice* audiodevice);
196         void                    SetCanvas(RAS_ICanvas* canvas);
197         void                    SetRenderTools(RAS_IRenderTools* rendertools);
198         void                    SetRasterizer(RAS_IRasterizer* rasterizer);
199         void                    SetPythonDictionary(PyObject* pythondictionary);
200         void                    SetSceneConverter(KX_ISceneConverter* sceneconverter);
201         void                    SetGame2IpoMode(bool game2ipo,int startFrame);
202
203         RAS_IRasterizer*                GetRasterizer(){return m_rasterizer;};
204
205         ///returns true if an update happened to indicate -> Render
206         bool                    NextFrame();
207         void                    Render();
208         
209         void                    StartEngine(bool clearIpo);
210         void                    StopEngine();
211         void                    Export(const STR_String& filename);
212
213         void                    RequestExit(int exitrequestmode);
214         void                    SetNameNextGame(const STR_String& nextgame);
215         int                             GetExitCode();
216         const STR_String&       GetExitString();
217
218         KX_SceneList*   CurrentScenes();
219         KX_Scene*       FindScene(const STR_String& scenename);
220         void                    AddScene(class KX_Scene* scene);
221         void                    ConvertAndAddScene(const STR_String& scenename,bool overlay);
222
223         void                    RemoveScene(const STR_String& scenename);
224         void                    ReplaceScene(const STR_String& oldscene,const STR_String& newscene);
225         void                    SuspendScene(const STR_String& scenename);
226         void                    ResumeScene(const STR_String& scenename);
227
228         void SetDrawType(int drawingtype);
229         void SetCameraZoom(float camzoom);
230         
231         void EnableCameraOverride(const STR_String& forscene);
232         
233         void SetCameraOverrideUseOrtho(bool useOrtho);
234         void SetCameraOverrideProjectionMatrix(const MT_CmMatrix4x4& mat);
235         void SetCameraOverrideViewMatrix(const MT_CmMatrix4x4& mat);
236         
237         /**
238          * Sets display of all frames.
239          * @param bUseFixedTime New setting for display all frames.
240          */ 
241         void SetUseFixedTime(bool bUseFixedTime);
242
243         /**
244          * Returns display of all frames.
245          * @return Current setting for display all frames.
246          */ 
247         bool GetUseFixedTime(void) const;
248
249         /**
250          * Returns the difference between the local time of the scene (when it
251          * was running and not suspended) and the "curtime"
252          */
253         static double GetSuspendedDelta();
254
255         /**
256          * Gets the number of logic updates per second.
257          */
258         static double GetTicRate();
259         /**
260          * Sets the number of logic updates per second.
261          */
262         static void SetTicRate(double ticrate);
263
264         /**
265          * Gets the framerate for playing animations. (actions and ipos)
266          */
267         static double GetAnimFrameRate();
268         /**
269          * Sets the framerate for playing animations. (actions and ipos)
270          */
271         static void SetAnimFrameRate(double framerate);
272
273         /**
274          * Activates or deactivates timing information display.
275          * @param frameRate             Display for frame rate on or off.
276          * @param profile               Display for individual components on or off.
277          * @param properties    Display of scene object debug properties on or off.
278          */ 
279         void SetTimingDisplay(bool frameRate, bool profile, bool properties);
280
281         /**
282          * Returns status of timing information display.
283          * @param frameRate             Display for frame rate on or off.
284          * @param profile               Display for individual components on or off.
285          * @param properties    Display of scene object debug properties on or off.
286          */ 
287         void GetTimingDisplay(bool& frameRate, bool& profile, bool& properties) const;
288
289         /** 
290          * Sets cursor hiding on every frame.
291          * @param hideCursor Turns hiding on or off.
292          */
293         void SetHideCursor(bool hideCursor);
294
295         /** 
296          * Returns the current setting for cursor hiding.
297          * @return The current setting for cursor hiding.
298          */
299         bool GetHideCursor(void) const;
300
301         /** 
302          * Enables/disables the use of the framing bar color of the Blender file's scenes.
303          * @param overrideFrameColor The new setting.
304          */
305         void SetUseOverrideFrameColor(bool overrideFrameColor);
306
307         /** 
308          * Enables/disables the use of the framing bar color of the Blender file's scenes.
309          * @param useSceneFrameColor The new setting.
310          */
311         bool GetUseOverrideFrameColor(void) const; 
312
313         /** 
314          * Set the color used for framing bar color instead of the one in the Blender file's scenes.
315          * @param r Red component of the override color.
316          * @param g Green component of the override color.
317          * @param b Blue component of the override color.
318          */
319         void SetOverrideFrameColor(float r, float g, float b);
320
321         /** 
322          * Returns the color used for framing bar color instead of the one in the Blender file's scenes.
323          * @param r Red component of the override color.
324          * @param g Green component of the override color.
325          * @param b Blue component of the override color.
326          */
327         void GetOverrideFrameColor(float& r, float& g, float& b) const;
328         
329 protected:
330         /**
331          * Processes all scheduled scene activity.
332          * At the end, if the scene lists have changed,
333          * SceneListsChanged(void) is called.
334          * @see SceneListsChanged(void).
335          */
336         void                    ProcessScheduledScenes(void);
337
338         /**
339          * This method is invoked when the scene lists have changed.
340          */
341         void                    SceneListsChanged(void);
342
343         void                    RemoveScheduledScenes(void);
344         void                    AddScheduledScenes(void);
345         void                    ReplaceScheduledScenes(void);
346         void                    PostProcessScene(class KX_Scene* scene);
347         KX_Scene*               CreateScene(const STR_String& scenename);
348         
349         bool                    BeginFrame();
350         void                    EndFrame();
351 };
352
353 #endif //__KX_KETSJI_ENGINE
354
355