Revision: 16479
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16479
Author:   campbellbarton
Date:     2008-09-12 04:15:16 +0200 (Fri, 12 Sep 2008)

Log Message:
-----------
save and load configuration actuator, (option in game actuator menu)
saves a marshal'd GameLogic.globalDict to the blendfile path with the blend 
extension replaced with bgeconf

Use this in YoFrankie to save keyboard layout and graphics quality settings.

Modified Paths:
--------------
    trunk/blender/source/blender/makesdna/DNA_actuator_types.h
    trunk/blender/source/blender/src/buttons_logic.c
    trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.h

Modified: trunk/blender/source/blender/makesdna/DNA_actuator_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_actuator_types.h  2008-09-11 
23:50:22 UTC (rev 16478)
+++ trunk/blender/source/blender/makesdna/DNA_actuator_types.h  2008-09-12 
02:15:16 UTC (rev 16479)
@@ -445,6 +445,8 @@
 #define ACT_GAME_START         1
 #define ACT_GAME_RESTART       2
 #define ACT_GAME_QUIT          3
+#define ACT_GAME_SAVECFG       4
+#define ACT_GAME_LOADCFG       5
 
 /* visibilityact->flag */
 /* Set means the object will become invisible */

Modified: trunk/blender/source/blender/src/buttons_logic.c
===================================================================
--- trunk/blender/source/blender/src/buttons_logic.c    2008-09-11 23:50:22 UTC 
(rev 16478)
+++ trunk/blender/source/blender/src/buttons_logic.c    2008-09-12 02:15:16 UTC 
(rev 16479)
@@ -2296,21 +2296,15 @@
                                uiDefBut(block, TEX, 1, "File: ", xco+10, 
yco-44,width-20,19, &(gma->filename), 0, 63, 0, 0, "Load this file");
                                uiDefBut(block, TEX, 1, "Anim: ", xco+10, 
yco-64,width-20,19, &(gma->loadaniname), 0, 63, 0, 0, "Use this 
loadinganimation");
                        }
-*/                     else if (gma->type == ACT_GAME_RESTART)
+*/                     else if (ELEM4(gma->type, ACT_GAME_RESTART, 
ACT_GAME_QUIT, ACT_GAME_SAVECFG, ACT_GAME_LOADCFG))
                        {
                                ysize = 28; 
                                glRects(xco, yco-ysize, xco+width, yco); 
                                uiEmboss((float)xco, (float)yco-ysize, 
(float)xco+width, (float)yco, 1); 
                        }
-                       else if (gma->type == ACT_GAME_QUIT)
-                       {
-                               ysize = 28; 
-                               glRects(xco, yco-ysize, xco+width, yco); 
-                               uiEmboss((float)xco, (float)yco-ysize, 
(float)xco+width, (float)yco, 1); 
-                       }
 
                        //str = "Scene %t|Load game%x0|Start loaded 
game%x1|Restart this game%x2|Quit this game %x3";
-                       str = "Scene %t|Start new game%x0|Restart this 
game%x2|Quit this game %x3";
+                       str = "Scene %t|Start new game%x0|Restart this 
game%x2|Quit this game %x3|Save GameLogic.globalDict %x4|Load 
GameLogic.globalDict %x5";
                        uiDefButS(block, MENU, B_REDR, str, xco+40, yco-24, 
(width-80), 19, &gma->type, 0.0, 0.0, 0, 0, ""); 
                        
                        yco -= ysize; 

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp   
2008-09-11 23:50:22 UTC (rev 16478)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp   
2008-09-12 02:15:16 UTC (rev 16479)
@@ -876,6 +876,16 @@
                                                mode = 
KX_GameActuator::KX_GAME_QUIT;
                                                break;
                                        }
+                               case ACT_GAME_SAVECFG:
+                                       {
+                                               mode = 
KX_GameActuator::KX_GAME_SAVECFG;
+                                               break;
+                                       }
+                               case ACT_GAME_LOADCFG:
+                                       {
+                                               mode = 
KX_GameActuator::KX_GAME_LOADCFG;
+                                               break;
+                                       }
                                default:
                                        ; /* flag error */
                                }

Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp        
2008-09-11 23:50:22 UTC (rev 16478)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp        
2008-09-12 02:15:16 UTC (rev 16479)
@@ -98,7 +98,6 @@
 #include "GHOST_IEventConsumer.h"
 #include "GHOST_IWindow.h"
 #include "GHOST_Rect.h"
-#include "marshal.h"
 
 static void frameTimerProc(GHOST_ITimerTask* task, GHOST_TUns64 time);
 
@@ -685,15 +684,7 @@
                initMathutils();
 
                /* Restore the dict */
-               if (m_pyGlobalDictString) {
-                       PyObject* pyGlobalDict = 
PyMarshal_ReadObjectFromString(m_pyGlobalDictString, 
m_pyGlobalDictString_Length);
-                       if (pyGlobalDict) {
-                               
PyDict_SetItemString(PyModule_GetDict(gameLogic), "globalDict", pyGlobalDict); 
// Same as importing the module.
-                       } else {
-                               PyErr_Clear();
-                               printf("Error could not marshall string\n");
-                       }
-               }
+               loadGamePythonConfig(m_pyGlobalDictString, 
m_pyGlobalDictString_Length);
                
                m_sceneconverter->ConvertScene(
                        startscenename,
@@ -731,37 +722,13 @@
 void GPG_Application::stopEngine()
 {
        // get the python dict and convert to a string for future use
-       {
-               SetPyGlobalDictMarshal(NULL, 0);
-               
-               PyObject* gameLogic = PyImport_ImportModule("GameLogic");
-               if (gameLogic) {
-                       PyObject* pyGlobalDict = 
PyDict_GetItemString(PyModule_GetDict(gameLogic), "globalDict"); // Same as 
importing the module
-                       if (pyGlobalDict) {
-#ifdef Py_MARSHAL_VERSION      
-                               PyObject* pyGlobalDictMarshal = 
PyMarshal_WriteObjectToString(  pyGlobalDict, 2); // Py_MARSHAL_VERSION == 2 as 
of Py2.5
-#else
-                               PyObject* pyGlobalDictMarshal = 
PyMarshal_WriteObjectToString(  pyGlobalDict ); 
-#endif
-                               if (pyGlobalDictMarshal) {
-                                       m_pyGlobalDictString_Length = 
PyString_Size(pyGlobalDictMarshal);
-                                       // for testing only
-                                       // PyObject_Print(pyGlobalDictMarshal, 
stderr, 0);
-                                       m_pyGlobalDictString = static_cast<char 
*> (malloc(m_pyGlobalDictString_Length));
-                                       memcpy(m_pyGlobalDictString, 
PyString_AsString(pyGlobalDictMarshal), m_pyGlobalDictString_Length);
-                               } else {
-                                       printf("Error, GameLogic.globalDict 
could not be marshal'd\n");
-                               }
-                               Py_DECREF(gameLogic);
-                       } else {
-                               printf("Error, GameLogic.globalDict was 
removed\n");
-                       }
-               } else {
-                       printf("Error, GameLogic failed to import 
GameLogic.globalDict will be lost\n");
-               }
-       }       
+       char *marshal_buffer;
+       m_pyGlobalDictString_Length = saveGamePythonConfig(&marshal_buffer);
+       if (m_pyGlobalDictString_Length) {
+               m_pyGlobalDictString = static_cast<char *> 
(malloc(m_pyGlobalDictString_Length));
+               memcpy(m_pyGlobalDictString, marshal_buffer, 
m_pyGlobalDictString_Length);
+       } 
        
-       
        // when exiting the mainloop
        exitGamePythonScripting();
        m_ketsjiengine->StopEngine();

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameActuator.cpp  2008-09-11 
23:50:22 UTC (rev 16478)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameActuator.cpp  2008-09-12 
02:15:16 UTC (rev 16479)
@@ -34,6 +34,7 @@
 //#include <iostream>
 #include "KX_Scene.h"
 #include "KX_KetsjiEngine.h"
+#include "KX_PythonInit.h" /* for config load/saving */
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -125,6 +126,71 @@
                        }
                        break;
                }
+       case KX_GAME_SAVECFG:
+               {
+                       if (m_ketsjiengine)
+                       {
+                               char mashal_path[512];
+                               char *marshal_buffer = NULL;
+                               int marshal_length;
+                               FILE *fp = NULL;
+                               
+                               pathGamePythonConfig(mashal_path);
+                               marshal_length = 
saveGamePythonConfig(&marshal_buffer);
+                               
+                               if (marshal_length && marshal_buffer) {
+                                       fp = fopen(mashal_path, "wb");
+                                       if (fp) {
+                                               if (fwrite(marshal_buffer, 1, 
marshal_length, fp) != marshal_length) {
+                                                       printf("Warning: could 
not write marshal data\n");
+                                               }
+                                               fclose(fp);
+                                       } else {
+                                               printf("Warning: could not open 
marshal file\n");
+                                       }
+                               } else {
+                                       printf("Warning: could not create 
marshal buffer\n");
+                               }
+                       }
+                       break;
+               }
+       case KX_GAME_LOADCFG:
+               {
+                       if (m_ketsjiengine)
+                       {
+                               char mashal_path[512];
+                               char *marshal_buffer;
+                               int marshal_length;
+                               FILE *fp = NULL;
+                               int result;
+                               
+                               pathGamePythonConfig(mashal_path);
+                               
+                               fp = fopen(mashal_path, "rb");
+                               if (fp) {
+                                       // obtain file size:
+                                       fseek (fp , 0 , SEEK_END);
+                                       marshal_length = ftell(fp);
+                                       rewind(fp);
+                                       
+                                       marshal_buffer = (char*) malloc 
(sizeof(char)*marshal_length);
+                                       
+                                       result = fread (marshal_buffer, 1, 
marshal_length, fp);
+                                       
+                                       if (result == marshal_length) {
+                                               
loadGamePythonConfig(marshal_buffer, marshal_length);
+                                       } else {
+                                               printf("warning: could not read 
all of '%s'\n", mashal_path);
+                                       }
+                                       
+                                       free(marshal_buffer);
+                                       fclose(fp);
+                               } else {
+                                       printf("warning: could not open 
'%s'\n", mashal_path);
+                               }
+                       }
+                       break;
+               }
        default:
                ; /* do nothing? this is an internal error !!! */
        }

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameActuator.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameActuator.h    2008-09-11 
23:50:22 UTC (rev 16478)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameActuator.h    2008-09-12 
02:15:16 UTC (rev 16479)
@@ -54,6 +54,8 @@
                KX_GAME_START,
                KX_GAME_RESTART,
                KX_GAME_QUIT,
+               KX_GAME_SAVECFG,
+               KX_GAME_LOADCFG,
                KX_GAME_MAX
 
        };

Modified: trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp    2008-09-11 
23:50:22 UTC (rev 16478)
+++ trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp    2008-09-12 
02:15:16 UTC (rev 16479)
@@ -74,6 +74,8 @@
        #include "Mathutils.h" // Blender.Mathutils module copied here so the 
blenderlayer can use.
 }
 
+#include "marshal.h" /* python header for loading/saving dicts */
+
 #include "PHY_IPhysicsEnvironment.h"
 // FIXME: Enable for access to blender python modules.  This is disabled 
because
 // python has dependencies on a lot of other modules and is a pain to link.
@@ -1319,3 +1321,66 @@
 {
        return gp_KetsjiScene;
 }
+
+// utility function for loading and saving the globalDict
+int saveGamePythonConfig( char **marshal_buffer)
+{
+       int marshal_length = 0;
+       PyObject* gameLogic = PyImport_ImportModule("GameLogic");
+       if (gameLogic) {
+               PyObject* pyGlobalDict = 
PyDict_GetItemString(PyModule_GetDict(gameLogic), "globalDict"); // Same as 
importing the module
+               if (pyGlobalDict) {
+#ifdef Py_MARSHAL_VERSION      
+                       PyObject* pyGlobalDictMarshal = 
PyMarshal_WriteObjectToString(  pyGlobalDict, 2); // Py_MARSHAL_VERSION == 2 as 
of Py2.5
+#else
+                       PyObject* pyGlobalDictMarshal = 
PyMarshal_WriteObjectToString(  pyGlobalDict ); 
+#endif
+                       if (pyGlobalDictMarshal) {
+                               marshal_length= 
PyString_Size(pyGlobalDictMarshal);
+                               // for testing only
+                               // PyObject_Print(pyGlobalDictMarshal, stderr, 
0);
+                               *marshal_buffer = 
PyString_AsString(pyGlobalDictMarshal);
+                       } else {
+                               printf("Error, GameLogic.globalDict could not 
be marshal'd\n");
+                       }
+                       Py_DECREF(gameLogic);
+               } else {
+                       printf("Error, GameLogic.globalDict was removed\n");
+               }
+       } else {
+               printf("Error, GameLogic failed to import GameLogic.globalDict 
will be lost\n");
+       }
+       return marshal_length;
+}
+
+int loadGamePythonConfig(char *marshal_buffer, int marshal_length)
+{
+       PyObject* gameLogic = PyImport_ImportModule("GameLogic");
+       /* Restore the dict */

@@ 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