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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to