[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50310] trunk/blender/source/gameengine: . .\commmit_hive.txt

Benoit Bolsee benoit.bolsee at online.be
Sat Sep 1 23:23:06 CEST 2012


Revision: 50310
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50310
Author:   ben2610
Date:     2012-09-01 21:23:05 +0000 (Sat, 01 Sep 2012)
Log Message:
-----------
..\commmit_hive.txt

Modified Paths:
--------------
    trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
    trunk/blender/source/gameengine/Ketsji/CMakeLists.txt
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.h

Added Paths:
-----------
    trunk/blender/source/gameengine/Ketsji/KX_PythonMain.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PythonMain.h

Modified: trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp	2012-09-01 15:30:35 UTC (rev 50309)
+++ trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp	2012-09-01 21:23:05 UTC (rev 50310)
@@ -54,6 +54,7 @@
 #include "KX_BlenderSceneConverter.h"
 #include "KX_PythonInit.h"
 #include "KX_PyConstraintBinding.h"
+#include "KX_PythonMain.h"
 
 #include "RAS_GLExtensionManager.h"
 #include "RAS_OpenGLRasterizer.h"
@@ -79,6 +80,9 @@
 #include "DNA_windowmanager_types.h"
 #include "BKE_global.h"
 #include "BKE_report.h"
+
+#include "MEM_guardedalloc.h"
+
 /* #include "BKE_screen.h" */ /* cant include this because of 'new' function name */
 extern float BKE_screen_view3d_zoom_to_fac(float camzoom);
 
@@ -121,6 +125,95 @@
 	return bfd;
 }
 
+int BL_KetsjiNextFrame(struct KX_KetsjiEngine* ketsjiengine, struct bContext *C, struct wmWindow* win, struct Scene* scene, struct ARegion *ar,
+                    KX_BlenderKeyboardDevice* keyboarddevice, KX_BlenderMouseDevice* mousedevice, int draw_letterbox)
+{
+    int exitrequested;
+
+    // first check if we want to exit
+    exitrequested = ketsjiengine->GetExitCode();
+
+    // kick the engine
+    bool render = ketsjiengine->NextFrame();
+
+    if (render)
+    {
+        if(draw_letterbox) {
+            // Clear screen to border color
+            // We do this here since we set the canvas to be within the frames. This means the engine
+            // itself is unaware of the extra space, so we clear the whole region for it.
+            glClearColor(scene->gm.framing.col[0], scene->gm.framing.col[1], scene->gm.framing.col[2], 1.0f);
+            glViewport(ar->winrct.xmin, ar->winrct.ymin,
+			           BLI_RCT_SIZE_X(&ar->winrct), BLI_RCT_SIZE_Y(&ar->winrct));
+            glClear(GL_COLOR_BUFFER_BIT);
+        }
+
+        // render the frame
+        ketsjiengine->Render();
+    }
+
+    wm_window_process_events_nosleep();
+
+    // test for the ESC key
+    //XXX while (qtest())
+    while(wmEvent *event= (wmEvent *)win->queue.first)
+    {
+        short val = 0;
+        //unsigned short event = 0; //XXX extern_qread(&val);
+
+        if (keyboarddevice->ConvertBlenderEvent(event->type,event->val))
+            exitrequested = KX_EXIT_REQUEST_BLENDER_ESC;
+
+            /* Coordinate conversion... where
+            * should this really be?
+        */
+        if (event->type==MOUSEMOVE) {
+            /* Note, not nice! XXX 2.5 event hack */
+            val = event->x - ar->winrct.xmin;
+            mousedevice->ConvertBlenderEvent(MOUSEX, val);
+
+            val = ar->winy - (event->y - ar->winrct.ymin) - 1;
+            mousedevice->ConvertBlenderEvent(MOUSEY, val);
+        }
+        else {
+            mousedevice->ConvertBlenderEvent(event->type,event->val);
+        }
+
+        BLI_remlink(&win->queue, event);
+        wm_event_free(event);
+    }
+
+    if(win != CTX_wm_window(C)) {
+        exitrequested= KX_EXIT_REQUEST_OUTSIDE; /* window closed while bge runs */
+    }
+    return exitrequested;
+}
+
+struct BL_KetsjiNextFrameState {
+	struct KX_KetsjiEngine* ketsjiengine;
+	struct bContext *C;
+	struct wmWindow* win;
+	struct Scene* scene;
+	struct ARegion *ar;
+	KX_BlenderKeyboardDevice* keyboarddevice;
+	KX_BlenderMouseDevice* mousedevice;
+	int draw_letterbox;
+} ketsjinextframestate;
+
+int BL_KetsjiPyNextFrame(void *state0) 
+{
+	BL_KetsjiNextFrameState *state = (BL_KetsjiNextFrameState *) state0;
+	return BL_KetsjiNextFrame(
+		state->ketsjiengine, 
+		state->C, 
+		state->win, 
+		state->scene, 
+		state->ar,
+		state->keyboarddevice, 
+		state->mousedevice, 
+		state->draw_letterbox);
+}
+
 extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *cam_frame, int always_use_expand_framing)
 {
 	/* context values */
@@ -346,6 +439,7 @@
 			rasterizer->SetBackColor(scene->gm.framing.col[0], scene->gm.framing.col[1], scene->gm.framing.col[2], 0.0f);
 		}
 		
+		char *python_main = NULL;
 		if (exitrequested != KX_EXIT_REQUEST_QUIT_GAME)
 		{
 			if (rv3d->persp != RV3D_CAMOB)
@@ -440,72 +534,48 @@
 				// Could be in StartEngine set the framerate, we need the scene to do this
 				ketsjiengine->SetAnimFrameRate(FPS);
 				
+				char *python_main = NULL;
+				pynextframestate.state = NULL;
+				pynextframestate.func = NULL;
+#ifdef WITH_PYTHON
+				python_main = KX_GetPythonMain(scene);
+#endif // WITH_PYTHON
 				// the mainloop
 				printf("\nBlender Game Engine Started\n");
-				while (!exitrequested)
-				{
-					// first check if we want to exit
-					exitrequested = ketsjiengine->GetExitCode();
-					
-					// kick the engine
-					bool render = ketsjiengine->NextFrame();
-					
-					if (render)
+				if (python_main) {
+					char *python_code = KX_GetPythonCode(blenderdata, python_main);
+					if (python_code) {
+#ifdef WITH_PYTHON			    
+						ketsjinextframestate.ketsjiengine = ketsjiengine;
+						ketsjinextframestate.C = C;
+						ketsjinextframestate.win = win;
+						ketsjinextframestate.scene = scene;
+						ketsjinextframestate.ar = ar;
+						ketsjinextframestate.keyboarddevice = keyboarddevice;
+						ketsjinextframestate.mousedevice = mousedevice;
+						ketsjinextframestate.draw_letterbox = draw_letterbox;
+			
+						pynextframestate.state = &ketsjinextframestate;
+						pynextframestate.func = &BL_KetsjiPyNextFrame;			
+						printf("Yielding control to Python script '%s'...\n", python_main);
+						PyRun_SimpleString(python_code);
+						printf("Exit Python script '%s'\n", python_main);
+#endif // WITH_PYTHON				
+						MEM_freeN(python_code);
+					}				
+				}
+				else {
+					while (!exitrequested)
 					{
-						if (draw_letterbox) {
-							// Clear screen to border color
-							// We do this here since we set the canvas to be within the frames. This means the engine
-							// itself is unaware of the extra space, so we clear the whole region for it.
-							glClearColor(scene->gm.framing.col[0], scene->gm.framing.col[1], scene->gm.framing.col[2], 1.0f);
-							glViewport(ar->winrct.xmin, ar->winrct.ymin,
-							           BLI_RCT_SIZE_X(&ar->winrct), BLI_RCT_SIZE_Y(&ar->winrct));
-							glClear(GL_COLOR_BUFFER_BIT);
-						}
-
-						// render the frame
-						ketsjiengine->Render();
+						exitrequested = BL_KetsjiNextFrame(ketsjiengine, C, win, scene, ar, keyboarddevice, mousedevice, draw_letterbox);
 					}
-					
-					wm_window_process_events_nosleep();
-					
-					// test for the ESC key
-					//XXX while (qtest())
-					while(wmEvent *event= (wmEvent *)win->queue.first)
-					{
-						short val = 0;
-						//unsigned short event = 0; //XXX extern_qread(&val);
-						
-						if (keyboarddevice->ConvertBlenderEvent(event->type,event->val))
-							exitrequested = KX_EXIT_REQUEST_BLENDER_ESC;
-						
-							/* Coordinate conversion... where
-							* should this really be?
-						*/
-						if (event->type==MOUSEMOVE) {
-							/* Note, not nice! XXX 2.5 event hack */
-							val = event->x - ar->winrct.xmin;
-							mousedevice->ConvertBlenderEvent(MOUSEX, val);
-							
-							val = ar->winy - (event->y - ar->winrct.ymin) - 1;
-							mousedevice->ConvertBlenderEvent(MOUSEY, val);
-						}
-						else {
-							mousedevice->ConvertBlenderEvent(event->type,event->val);
-						}
-						
-						BLI_remlink(&win->queue, event);
-						wm_event_free(event);
-					}
-					
-					if (win != CTX_wm_window(C)) {
-						exitrequested= KX_EXIT_REQUEST_OUTSIDE; /* window closed while bge runs */
-					}
 				}
 				printf("Blender Game Engine Finished\n");
 				exitstring = ketsjiengine->GetExitString();
+				if (python_main) MEM_freeN(python_main);
+
 				gs = *(ketsjiengine->GetGlobalSettings());
 
-
 				// when exiting the mainloop
 #ifdef WITH_PYTHON
 				// Clears the dictionary by hand:

Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp	2012-09-01 15:30:35 UTC (rev 50309)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp	2012-09-01 21:23:05 UTC (rev 50310)
@@ -47,6 +47,7 @@
 #endif // __APPLE__
 #include "KX_KetsjiEngine.h"
 #include "KX_PythonInit.h"
+#include "KX_PythonMain.h"
 
 /**********************************
 * Begin Blender include block
@@ -332,6 +333,40 @@
 	return bfd;
 }
 
+bool GPG_NextFrame(GHOST_ISystem* system, GPG_Application *app, int &exitcode, STR_String &exitstring, GlobalSettings *gs)
+{
+    bool run = true;
+    system->processEvents(false);
+    system->dispatchEvents();
+    if ((exitcode = app->getExitRequested()))
+    {
+        run = false;
+        exitstring = app->getExitString();
+        *gs = *app->getGlobalSettings();
+    }
+    return run;
+}
+
+struct GPG_NextFrameState {
+	GHOST_ISystem* system;
+	GPG_Application *app;
+	GlobalSettings *gs;
+} gpg_nextframestate;
+
+int GPG_PyNextFrame(void *state0)
+{
+	GPG_NextFrameState *state = (GPG_NextFrameState *) state0;
+	int exitcode;
+	STR_String exitstring;
+	bool run = GPG_NextFrame(state->system, state->app, exitcode, exitstring, state->gs);
+	if (run) return 0;  
+	else {
+		if (exitcode) 
+			fprintf(stderr, "Exit code %d: %s\n", exitcode, exitstring.ReadPtr());
+		return 1;
+	}
+}
+
 int main(int argc, char** argv)
 {
 	int i;
@@ -966,17 +1001,39 @@
 						
 						// Enter main loop
 						bool run = true;
-						while (run)
+                        char *python_main = NULL;
+						pynextframestate.state = NULL;
+						pynextframestate.func = NULL;
+#ifdef WITH_PYTHON
+						python_main = KX_GetPythonMain(scene);
+#endif // WITH_PYTHON
+						if (python_main) 
 						{
-							system->processEvents(false);
-							system->dispatchEvents();
-							app.EngineNextFrame();
+							char *python_code = KX_GetPythonCode(maggie, python_main);
+							if (python_code)
+							{
+#ifdef WITH_PYTHON			    
+								gpg_nextframestate.system = system;
+								gpg_nextframestate.app = &app;
+								gpg_nextframestate.gs = &gs;
+								pynextframestate.state = &gpg_nextframestate;
+								pynextframestate.func = &GPG_PyNextFrame;			
 
-							if ((exitcode = app.getExitRequested()))
+                                printf("Yielding control to Python script '%s'...\n", python_main);
+                                PyRun_SimpleString(python_code);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list