diff options
author | Campbell Barton <ideasman42@gmail.com> | 2010-02-22 15:25:58 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2010-02-22 15:25:58 +0300 |
commit | 4ef1fd1078bbdb8ecb905fc9cd3db60c378408b0 (patch) | |
tree | 408bbfb210658cae5a9075791d59dc4c7a4623a9 /source/gameengine | |
parent | dd03793f4edd455c09a1a2273e5e991dd3bd702b (diff) |
game engine support for recording animation back & some other minor changes.
Diffstat (limited to 'source/gameengine')
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;}; |