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