2 * ***** BEGIN GPL LICENSE BLOCK *****
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.
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.
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.
18 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19 * All rights reserved.
21 * The Original Code is: all of this file.
23 * Contributor(s): none yet.
25 * ***** END GPL LICENSE BLOCK *****
28 /** \file gameengine/GamePlayer/common/GPC_Engine.cpp
34 #pragma warning (disable:4786) // suppress stl-MSVC debug info warning
39 #include "BKE_blender.h" // initglobals()
40 #include "BKE_global.h" // Global G
41 #include "BKE_report.h"
42 #include "DNA_scene_types.h"
43 #include "DNA_camera_types.h" // Camera
44 #include "DNA_object_types.h" // Object
46 #include "BLO_readfile.h"
47 #include "BLI_blenlib.h"
49 // include files needed by "KX_BlenderSceneConverter.h"
52 #include "SCA_IActuator.h"
53 #include "RAS_MeshObject.h"
55 #include "KX_BlenderSceneConverter.h"
56 #include "KX_KetsjiEngine.h"
57 #include "NG_LoopBackNetworkDeviceInterface.h"
59 #include "RAS_IRenderTools.h"
61 #include "GPC_Engine.h"
62 #include "GPC_KeyboardDevice.h"
63 #include "GPC_MouseDevice.h"
64 #include "GPC_RawImage.h"
65 #include "GPC_RawLoadDotBlendArray.h"
69 GPC_Engine::GPC_Engine(char *customLoadingAnimationURL,
70 int foregroundColor, int backgroundColor, int frameRate) :
71 m_initialized(false), m_running(false), m_loading(false),
72 m_customLoadingAnimation(false), m_previousProgress(0.0),
73 m_system(NULL), m_keyboarddev(NULL),
74 m_mousedev(NULL), m_canvas(NULL), m_rendertools(NULL),
75 m_portal(NULL), m_sceneconverter(NULL), m_networkdev(NULL),
76 m_curarea(NULL), m_customLoadingAnimationURL(NULL),
77 m_foregroundColor(foregroundColor), m_backgroundColor(backgroundColor),
78 m_frameRate(frameRate),
79 m_BlenderLogo(0), m_Blender3DLogo(0)/*, m_NaNLogo(0)*/
81 if(customLoadingAnimationURL[0] != '\0')
83 m_customLoadingAnimationURL = new char[sizeof(customLoadingAnimationURL)];
84 // not yet, need to be implemented first... m_customLoadingAnimation = true;
87 // load the Blender logo into memory
88 m_BlenderLogo = new GPC_RawImage();
89 // blender3d size is 115 x 32 so make resulting texture 128 x 128
90 if(!m_BlenderLogo->Load("BlenderLogo", 128, 128, GPC_RawImage::alignTopLeft, 8, 8))
93 // load the Blender3D logo into memory
94 m_Blender3DLogo = new GPC_RawImage();
95 // blender3d size is 136 x 11 so make resulting texture 256 x 256
96 if(!m_Blender3DLogo->Load("Blender3DLogo", 256, 256, GPC_RawImage::alignBottomRight, 8, 8))
101 // load the NaN logo into memory
102 m_NaNLogo = new GPC_RawImage();
103 // blender3d size is 32 x 31 so make resulting texture 64 x 64
104 if(!m_NaNLogo->Load("NaNLogo", 64, 64, GPC_RawImage::alignBottomRight, 8, 8))
110 GPC_Engine::~GPC_Engine()
112 // deleting everything in reverse order of creation
114 // hmm deleted in Stop() delete m_portal;
115 // hmm deleted in Stop() delete m_sceneconverter;
118 delete m_rendertools;
121 delete m_keyboarddev;
122 // not yet used so be careful and not delete them
123 // delete m_WaveCache;
124 // delete m_curarea; // for future use, not used yet
126 delete m_BlenderLogo;
127 delete m_Blender3DLogo;
134 bool GPC_Engine::Start(char *filename)
139 BKE_reports_init(&reports, RPT_STORE);
140 bfd= BLO_read_from_file(filename, &reports);
141 BKE_reports_clear(&reports);
144 // XXX, deal with error here
145 cout << "Unable to load: " << filename << endl;
151 if(bfd->type == BLENFILETYPE_PUB)
152 m_canvas->SetBannerDisplayEnabled(false);
158 bool GPC_Engine::Start(unsigned char *blenderDataBuffer,
159 unsigned int blenderDataBufferSize)
164 BKE_reports_init(&reports, RPT_STORE);
165 bfd= BLO_read_from_memory(blenderDataBuffer, blenderDataBufferSize, &reports);
166 BKE_reports_clear(&reports);
169 // XXX, deal with error here
170 cout << "Unable to load. " << endl;
176 if(bfd->type == BLENFILETYPE_PUB)
177 m_canvas->SetBannerDisplayEnabled(false);
183 bool GPC_Engine::StartKetsji(void)
185 STR_String startSceneName = ""; // XXX scene->id.name + 2;
187 KX_KetsjiEngine* ketsjieng = new KX_KetsjiEngine(m_system);
188 m_portal = new KetsjiPortal(ketsjieng);
189 m_portal->setSecurity(psl_Highest);
191 KX_ISceneConverter *sceneconverter = new KX_BlenderSceneConverter(&G, ketsjieng);
203 m_system->SetMainLoop(m_portal->m_ketsjieng);
211 void GPC_Engine::StartLoadingAnimation()
213 if(m_customLoadingAnimation)
218 unsigned char *blenderDataBuffer;
219 int blenderDataBufferSize;
220 GetRawLoadingAnimation(&blenderDataBuffer, &blenderDataBufferSize);
221 if(!Start(blenderDataBuffer, blenderDataBufferSize))
222 cout << "something went wrong when starting the engine" << endl;
223 delete blenderDataBuffer; // created with 'new' in GetRawLoadingAnimation()
228 // will be platform dependant
229 float GPC_Engine::DetermineProgress(void)
233 if ((m_blenderData.m_ulProgress > 0) &&
234 (m_blenderData.m_ulProgressMax != m_blenderData.m_ulProgress)) {
235 progress = (float)m_blenderData.m_ulProgress;
236 progress /= (float)m_blenderData.m_ulProgressMax;
242 return (unsigned int) progress ;
244 return m_previousProgress + 0.01; // temporary TODO
248 void GPC_Engine::UpdateLoadingAnimation(void)
252 float progress = DetermineProgress();
254 if(progress > m_previousProgress)
256 // delta = progress - m_previousProgress;
257 m_previousProgress = progress;
258 if(m_previousProgress > 1.0)
259 m_previousProgress = 1.0; // limit to 1.0 (has to change !)
260 // m_engine->m_previousProgress = 0.0;
264 STR_String from = "";
265 STR_String subject = "progress";
267 body.Format("%f", progress); // a number between 0.0 and 1.0
271 // Store a progress message in the network device.
272 NG_NetworkMessage* msg = new NG_NetworkMessage(to, from, subject, body);
273 m_networkdev->SendNetworkMessage(msg);
279 void GPC_Engine::Stop()
281 // only delete things that are created in StartKetsji()
285 delete m_portal; // also gets rid of KX_KetsjiEngine (says Maarten)
288 */ if(m_sceneconverter)
290 delete m_sceneconverter;
291 m_sceneconverter = 0;
296 ::KillTimer(0, m_frameTimerID);
299 m_engineRunning = false;
306 void GPC_Engine::Exit()
316 delete m_keyboarddev;
328 delete m_rendertools;
336 m_initialized = false;