Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2010-02-22 15:25:58 +0300
committerCampbell Barton <ideasman42@gmail.com>2010-02-22 15:25:58 +0300
commit4ef1fd1078bbdb8ecb905fc9cd3db60c378408b0 (patch)
tree408bbfb210658cae5a9075791d59dc4c7a4623a9 /source/gameengine
parentdd03793f4edd455c09a1a2273e5e991dd3bd702b (diff)
game engine support for recording animation back & some other minor changes.
Diffstat (limited to 'source/gameengine')
-rw-r--r--source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp227
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.cpp79
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.h4
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Application.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp14
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.h4
6 files changed, 41 insertions, 291 deletions
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index d06fc283613..c655a2538e8 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -168,7 +168,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
bool usefixed = (SYS_GetCommandLineInt(syshandle, "fixedtime", 0) != 0);
bool profile = (SYS_GetCommandLineInt(syshandle, "show_profile", 0) != 0);
bool frameRate = (SYS_GetCommandLineInt(syshandle, "show_framerate", 0) != 0);
- bool game2ipo = (SYS_GetCommandLineInt(syshandle, "game2ipo", 0) != 0);
+ bool animation_record = (SYS_GetCommandLineInt(syshandle, "animation_record", 0) != 0);
bool displaylists = (SYS_GetCommandLineInt(syshandle, "displaylists", 0) != 0);
bool nodepwarnings = (SYS_GetCommandLineInt(syshandle, "ignore_deprecation_warnings", 0) != 0);
bool novertexarrays = (SYS_GetCommandLineInt(syshandle, "novertexarrays", 0) != 0);
@@ -322,7 +322,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
if (blscene)
{
int startFrame = blscene->r.cfra;
- ketsjiengine->SetGame2IpoMode(game2ipo,startFrame);
+ ketsjiengine->SetAnimRecordMode(animation_record, startFrame);
// Quad buffered needs a special window.
if(blscene->gm.stereoflag == STEREO_ENABLED){
@@ -409,7 +409,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
// Set the animation playback rate for ipo's and actions
// the framerate below should patch with FPS macro defined in blendef.h
// Could be in StartEngine set the framerate, we need the scene to do this
- ketsjiengine->SetAnimFrameRate( (((double) blscene->r.frs_sec) / blscene->r.frs_sec_base) );
+ ketsjiengine->SetAnimFrameRate(FPS);
// the mainloop
printf("\nBlender Game Engine Started\n\n");
@@ -567,224 +567,3 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
#endif
}
-
-extern "C" void StartKetsjiShellSimulation(struct wmWindow *win,
- struct ARegion *ar,
- char* scenename,
- struct Main* maggie,
- int always_use_expand_framing)
-{
- int exitrequested = KX_EXIT_REQUEST_NO_REQUEST;
-
- Main* blenderdata = maggie;
-
- RAS_Rect area_rect;
- area_rect.SetLeft(ar->winrct.xmin);
- area_rect.SetBottom(ar->winrct.ymin);
- area_rect.SetRight(ar->winrct.xmax);
- area_rect.SetTop(ar->winrct.ymax);
-
- char* startscenename = scenename;
- char pathname[FILE_MAXDIR+FILE_MAXFILE];
- STR_String exitstring = "";
-
- BLI_strncpy(pathname, blenderdata->name, sizeof(pathname));
-
-#ifndef DISABLE_PYTHON
- // Acquire Python's GIL (global interpreter lock)
- // so we can safely run Python code and API calls
- PyGILState_STATE gilstate = PyGILState_Ensure();
- PyObject *pyGlobalDict = PyDict_New(); /* python utility storage, spans blend file loading */
-#endif
-
- bgl::InitExtensions(true);
-
- do
- {
-
- // get some preferences
- SYS_SystemHandle syshandle = SYS_GetSystem();
- /*
- bool properties = (SYS_GetCommandLineInt(syshandle, "show_properties", 0) != 0);
- bool usefixed = (SYS_GetCommandLineInt(syshandle, "fixedtime", 0) != 0);
- bool profile = (SYS_GetCommandLineInt(syshandle, "show_profile", 0) != 0);
- bool frameRate = (SYS_GetCommandLineInt(syshandle, "show_framerate", 0) != 0);
- */
- bool game2ipo = true;//(SYS_GetCommandLineInt(syshandle, "game2ipo", 0) != 0);
- bool displaylists = (SYS_GetCommandLineInt(syshandle, "displaylists", 0) != 0);
- bool usemat = false;
-
- // create the canvas, rasterizer and rendertools
- RAS_ICanvas* canvas = new KX_BlenderCanvas(win, area_rect);
- //canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
- RAS_IRenderTools* rendertools = new KX_BlenderRenderTools();
- RAS_IRasterizer* rasterizer = NULL;
-
- if(displaylists) {
- if (GLEW_VERSION_1_1)
- rasterizer = new RAS_ListRasterizer(canvas, true, true);
- else
- rasterizer = new RAS_ListRasterizer(canvas);
- }
- else if (GLEW_VERSION_1_1)
- rasterizer = new RAS_VAOpenGLRasterizer(canvas, false);
- else
- rasterizer = new RAS_OpenGLRasterizer(canvas);
-
- // create the inputdevices
- KX_BlenderKeyboardDevice* keyboarddevice = new KX_BlenderKeyboardDevice();
- KX_BlenderMouseDevice* mousedevice = new KX_BlenderMouseDevice();
-
- // create a networkdevice
- NG_NetworkDeviceInterface* networkdevice = new
- NG_LoopBackNetworkDeviceInterface();
-
- // create a ketsji/blendersystem (only needed for timing and stuff)
- KX_BlenderSystem* kxsystem = new KX_BlenderSystem();
-
- // create the ketsjiengine
- KX_KetsjiEngine* ketsjiengine = new KX_KetsjiEngine(kxsystem);
-
- Scene *blscene = NULL;
-
- blscene = (Scene*) maggie->scene.first;
- for (Scene *sce= (Scene*) maggie->scene.first; sce; sce= (Scene*) sce->id.next)
- {
- if (startscenename == (sce->id.name+2))
- {
- blscene = sce;
- break;
- }
- }
-
- int cframe = 1, startFrame;
- if (blscene)
- {
- cframe=blscene->r.cfra;
- startFrame = blscene->r.sfra;
- blscene->r.cfra=startFrame;
- // update_for_newframe(); // XXX scene_update_for_newframe wont cut it!
- ketsjiengine->SetGame2IpoMode(game2ipo,startFrame);
- }
-
- // Quad buffered needs a special window.
- if(blscene->gm.stereoflag == STEREO_ENABLED){
- if (blscene->gm.stereomode != RAS_IRasterizer::RAS_STEREO_QUADBUFFERED)
- rasterizer->SetStereoMode((RAS_IRasterizer::StereoMode) blscene->gm.stereomode);
- }
- rasterizer->SetBackColor(blscene->gm.framing.col[0], blscene->gm.framing.col[1], blscene->gm.framing.col[2], 0.0f);
-
- if (exitrequested != KX_EXIT_REQUEST_QUIT_GAME)
- {
- // create a scene converter, create and convert the startingscene
- KX_ISceneConverter* sceneconverter = new KX_BlenderSceneConverter(maggie, ketsjiengine);
- ketsjiengine->SetSceneConverter(sceneconverter);
- sceneconverter->addInitFromFrame=true;
-
- if (always_use_expand_framing)
- sceneconverter->SetAlwaysUseExpandFraming(true);
-
- if(usemat)
- sceneconverter->SetMaterials(true);
-
- KX_Scene* startscene = new KX_Scene(keyboarddevice,
- mousedevice,
- networkdevice,
- startscenename,
- blscene);
-
-#ifndef DISABLE_PYTHON
- // some python things
- PyObject *gameLogic, *gameLogic_keys;
- setupGamePython(ketsjiengine, startscene, blenderdata, pyGlobalDict, &gameLogic, &gameLogic_keys, 0, NULL);
-#endif // DISABLE_PYTHON
-
- if (sceneconverter)
- {
- // convert and add scene
- sceneconverter->ConvertScene(
- startscene,
- rendertools,
- canvas);
- ketsjiengine->AddScene(startscene);
-
- // start the engine
- ketsjiengine->StartEngine(false);
-
- ketsjiengine->SetUseFixedTime(true);
-
- ketsjiengine->SetTicRate(
- (double) blscene->r.frs_sec /
- (double) blscene->r.frs_sec_base);
-
- // the mainloop
- while ((blscene->r.cfra<=blscene->r.efra)&&(!exitrequested))
- {
- printf("frame %i\n",blscene->r.cfra);
- // first check if we want to exit
- exitrequested = ketsjiengine->GetExitCode();
-
- // kick the engine
- ketsjiengine->NextFrame();
- blscene->r.cfra=blscene->r.cfra+1;
- // update_for_newframe(); // XXX scene_update_for_newframe wont cut it
-
- }
- exitstring = ketsjiengine->GetExitString();
- }
- if (sceneconverter)
- {
- delete sceneconverter;
- sceneconverter = NULL;
- }
- }
- blscene->r.cfra=cframe;
- // set the cursor back to normal
- canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
-
- // clean up some stuff
- if (ketsjiengine)
- {
- delete ketsjiengine;
- ketsjiengine = NULL;
- }
- if (kxsystem)
- {
- delete kxsystem;
- kxsystem = NULL;
- }
- if (networkdevice)
- {
- delete networkdevice;
- networkdevice = NULL;
- }
- if (keyboarddevice)
- {
- delete keyboarddevice;
- keyboarddevice = NULL;
- }
- if (mousedevice)
- {
- delete mousedevice;
- mousedevice = NULL;
- }
- if (rasterizer)
- {
- delete rasterizer;
- rasterizer = NULL;
- }
- if (rendertools)
- {
- delete rendertools;
- rendertools = NULL;
- }
-
- } while (exitrequested == KX_EXIT_REQUEST_RESTART_GAME || exitrequested == KX_EXIT_REQUEST_START_OTHER_GAME);
-
-#ifndef DISABLE_PYTHON
- Py_DECREF(pyGlobalDict);
-
- // Release Python's GIL
- PyGILState_Release(gilstate);
-#endif
-}
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
index 411ddc58c92..3ee4248343c 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -82,13 +82,16 @@ extern "C"
#include "MEM_guardedalloc.h"
//XXX #include "BSE_editipo.h"
//XXX #include "BSE_editipo_types.h"
-#include "DNA_ipo_types.h"
+// #include "DNA_ipo_types.h"
#include "BKE_global.h"
+#include "BKE_animsys.h"
#include "BKE_library.h"
#include "BKE_ipo.h" // eval_icu
#include "BKE_material.h" // copy_material
#include "BKE_mesh.h" // copy_mesh
#include "DNA_space_types.h"
+#include "DNA_anim_types.h"
+#include "../../blender/editors/include/ED_keyframing.h"
}
/* Only for dynamic loading and merging */
@@ -621,57 +624,12 @@ void KX_BlenderSceneConverter::RegisterWorldInfo(
m_worldinfos.push_back(pair<KX_Scene*,KX_WorldInfo*>(m_currentScene,worldinfo));
}
-/*
- * When deleting an IPO curve from Python, check if the IPO is being
- * edited and if so clear the pointer to the old curve.
- */
-void KX_BlenderSceneConverter::localDel_ipoCurve ( IpoCurve * icu )
-{
-#if 0 //XXX
- if (!G.sipo)
- return;
-
- int i;
- EditIpo *ei= (EditIpo *)G.sipo->editipo;
- if (!ei) return;
-
- for(i=0; i<G.sipo->totipo; i++, ei++) {
- if ( ei->icu == icu ) {
- ei->flag &= ~(IPO_SELECT | IPO_EDIT);
- ei->icu= 0;
- return;
- }
- }
-#endif
-}
-
//quick hack
extern "C"
{
- Ipo *add_ipo( char *name, int idcode );
- //XXX char *getIpoCurveName( IpoCurve * icu );
- //XXX struct IpoCurve *verify_ipocurve(struct ID *, short, char *, char *, char *, int);
- //XXX void testhandles_ipocurve(struct IpoCurve *icu);
- void insert_vert_icu(struct IpoCurve *, float, float, short);
- float eval_icu(struct IpoCurve *icu, float ipotime);
- //void mat3_to_eul( float *eul,float tmat[][3]);
void mat3_to_compatible_eul( float *eul, float *oldrot,float mat[][3]);
}
-IpoCurve* findIpoCurve(IpoCurve* first, const char* searchName)
-{
- IpoCurve* icu1;
- for( icu1 = first; icu1; icu1 = icu1->next )
- {
- /*XXX char* curveName = getIpoCurveName( icu1 );
- if( !strcmp( curveName, searchName) )
- {
- return icu1;
- }*/
- }
- return 0;
-}
-
void KX_BlenderSceneConverter::ResetPhysicsObjectsAnimationIpo(bool clearIpo)
{
@@ -695,6 +653,7 @@ void KX_BlenderSceneConverter::ResetPhysicsObjectsAnimationIpo(bool clearIpo)
Object* blenderObject = gameObj->GetBlenderObject();
if (blenderObject)
{
+#if 0
//erase existing ipo's
Ipo* ipo = blenderObject->ipo;//findIpoForName(blenderObject->id.name+2);
if (ipo)
@@ -728,11 +687,7 @@ void KX_BlenderSceneConverter::ResetPhysicsObjectsAnimationIpo(bool clearIpo)
blenderObject->ipo = ipo;
}
-
-
-
-
-
+#endif
}
}
@@ -811,8 +766,28 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber)
//KX_IPhysicsController* physCtrl = gameObj->GetPhysicsController();
Object* blenderObject = gameObj->GetBlenderObject();
- if (blenderObject && blenderObject->ipo)
+
+ if(blenderObject->adt==NULL)
+ BKE_id_add_animdata(&blenderObject->id);
+
+ if (blenderObject && blenderObject->adt)
{
+ const MT_Point3& position = gameObj->NodeGetWorldPosition();
+ //const MT_Vector3& scale = gameObj->NodeGetWorldScaling();
+ const MT_Matrix3x3& orn = gameObj->NodeGetWorldOrientation();
+
+ position.getValue(blenderObject->loc);
+
+ float tmat[3][3];
+ for (int r=0;r<3;r++)
+ for (int c=0;c<3;c++)
+ tmat[r][c] = orn[c][r];
+
+ mat3_to_compatible_eul(blenderObject->rot, blenderObject->rot, tmat);
+
+ insert_keyframe(&blenderObject->id, NULL, NULL, "location", -1, frameNumber, INSERTKEY_FAST);
+ insert_keyframe(&blenderObject->id, NULL, NULL, "rotation_euler", -1, frameNumber, INSERTKEY_FAST);
+
#if 0
const MT_Point3& position = gameObj->NodeGetWorldPosition();
//const MT_Vector3& scale = gameObj->NodeGetWorldScaling();
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.h b/source/gameengine/Converter/KX_BlenderSceneConverter.h
index e880c8b824c..3dd3afb5662 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.h
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.h
@@ -43,7 +43,6 @@ class RAS_MeshObject;
class RAS_IPolyMaterial;
class BL_InterpolatorList;
class BL_Material;
-struct IpoCurve;
struct Main;
struct Scene;
@@ -74,9 +73,6 @@ class KX_BlenderSceneConverter : public KX_ISceneConverter
bool m_usemat;
bool m_useglslmat;
- void localDel_ipoCurve ( IpoCurve * icu );
-// struct Ipo* findIpoForName(char* objName);
-
public:
KX_BlenderSceneConverter(
Main* maggie,
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
index d39b6fbda17..43b26cf9a06 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
@@ -710,8 +710,8 @@ bool GPG_Application::startEngine(void)
// Set the animation playback rate for ipo's and actions
// the framerate below should patch with FPS macro defined in blendef.h
// Could be in StartEngine set the framerate, we need the scene to do this
-// XXX m_ketsjiengine->SetAnimFrameRate( (((double) scene->r.frs_sec) / scene->r.frs_sec_base) );
-
+ Scene *scene= startscene->GetBlenderScene(); // needed for macro
+ m_ketsjiengine->SetAnimFrameRate(FPS);
}
if (!m_engineRunning)
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index af30d32a0aa..18ae80c78c3 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -154,7 +154,7 @@ KX_KetsjiEngine::KX_KetsjiEngine(KX_ISystem* system)
m_showBackground(false),
m_show_debug_properties(false),
- m_game2ipo(false),
+ m_animation_record(false),
// Default behavior is to hide the cursor every frame.
m_hideCursor(false),
@@ -398,7 +398,7 @@ void KX_KetsjiEngine::StartEngine(bool clearIpo)
m_maxPhysicsFrame = 5;
}
- if (m_game2ipo)
+ if (m_animation_record)
{
m_sceneconverter->ResetPhysicsObjectsAnimationIpo(clearIpo);
m_sceneconverter->WritePhysicsObjectToAnimationIpo(m_currentFrame);
@@ -657,7 +657,7 @@ else
scene->UpdateParents(m_frameTime);
- if (m_game2ipo)
+ if (m_animation_record)
{
m_sceneconverter->WritePhysicsObjectToAnimationIpo(++m_currentFrame);
}
@@ -1334,7 +1334,7 @@ void KX_KetsjiEngine::StopEngine()
if (m_bInitialized)
{
- if (m_game2ipo)
+ if (m_animation_record)
{
// printf("TestHandlesPhysicsObjectToAnimationIpo\n");
m_sceneconverter->TestHandlesPhysicsObjectToAnimationIpo();
@@ -1734,10 +1734,10 @@ void KX_KetsjiEngine::SetUseFixedTime(bool bUseFixedTime)
}
-void KX_KetsjiEngine::SetGame2IpoMode(bool game2ipo,int startFrame)
+void KX_KetsjiEngine::SetAnimRecordMode(bool animation_record, int startFrame)
{
- m_game2ipo = game2ipo;
- if (game2ipo)
+ m_animation_record = animation_record;
+ if (animation_record)
{
//when recording physics keyframes, always run at a fixed framerate
m_bFixedTime = true;
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h
index 96ca092c8c1..a6ca5fb6519 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.h
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h
@@ -170,7 +170,7 @@ private:
bool m_show_debug_properties;
/** record physics into keyframes */
- bool m_game2ipo;
+ bool m_animation_record;
/** Hide cursor every frame? */
bool m_hideCursor;
@@ -208,7 +208,7 @@ public:
PyObject* GetPyNamespace(){return m_pythondictionary;};
#endif
void SetSceneConverter(KX_ISceneConverter* sceneconverter);
- void SetGame2IpoMode(bool game2ipo,int startFrame);
+ void SetAnimRecordMode(bool animation_record, int startFrame);
RAS_IRasterizer* GetRasterizer(){return m_rasterizer;};
RAS_ICanvas* GetCanvas(){return m_canvas;};