BGE Animations: Adding an option to let users choose whether or not to lock animation...
authorMitchell Stokes <mogurijin@gmail.com>
Fri, 12 Aug 2011 20:53:29 +0000 (20:53 +0000)
committerMitchell Stokes <mogurijin@gmail.com>
Fri, 12 Aug 2011 20:53:29 +0000 (20:53 +0000)
release/scripts/startup/bl_ui/properties_game.py
source/blender/makesdna/DNA_scene_types.h
source/blender/makesrna/intern/rna_scene.c
source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
source/gameengine/GamePlayer/ghost/GPG_Application.cpp
source/gameengine/Ketsji/KX_KetsjiEngine.cpp
source/gameengine/Ketsji/KX_KetsjiEngine.h

index 58b2cacfbcc9dbb555d49e27b2b2e4f1d1efd659..dc397635452e1b4866d9945124eb5646ee819727 100644 (file)
@@ -342,6 +342,7 @@ class RENDER_PT_game_performance(RenderButtonsPanel, bpy.types.Panel):
         row = layout.row()
         row.prop(gs, "use_frame_rate")
         row.prop(gs, "use_display_lists")
+        row.prop(gs, "restrict_animation_updates")
 
 
 class RENDER_PT_game_display(RenderButtonsPanel, bpy.types.Panel):
index 542aea00b00523067d2ac89999f13fc7ef0efd69..be2a78ac774a9b581e051606ead17536cfa0e985 100644 (file)
@@ -479,6 +479,7 @@ typedef struct GameData {
 #define WOPHY_BULLET   5
 
 /* GameData.flag */
+#define GAME_RESTRICT_ANIM_UPDATES                     (1 << 0)
 #define GAME_ENABLE_ALL_FRAMES                         (1 << 1)
 #define GAME_SHOW_DEBUG_PROPS                          (1 << 2)
 #define GAME_SHOW_FRAMERATE                                    (1 << 3)
@@ -494,6 +495,7 @@ typedef struct GameData {
 #define GAME_ENABLE_ANIMATION_RECORD           (1 << 13)
 #define GAME_SHOW_MOUSE                                                (1 << 14)
 #define GAME_GLSL_NO_COLOR_MANAGEMENT          (1 << 15)
+/* Note: GameData.flag is a short (max 16 flags). To add more flags, GameData.flag needs to be an int */
 
 /* GameData.matmode */
 #define GAME_MAT_TEXFACE       0
index 7313a39e5ec3b241ed558801de5d80d5761ed713..7f8aeb652097265d6c394a634636465537602ea5 100644 (file)
@@ -1919,6 +1919,10 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
        prop= RNA_def_property(srna, "use_auto_start", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_funcs(prop, "rna_GameSettings_auto_start_get", "rna_GameSettings_auto_start_set");
        RNA_def_property_ui_text(prop, "Auto Start", "Automatically start game at load time");
+
+       prop= RNA_def_property(srna, "restrict_animation_updates", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_RESTRICT_ANIM_UPDATES);
+       RNA_def_property_ui_text(prop, "Restrict Animation Updates", "Restrict the number of animation updates to the animation FPS. This is better for performance, but can cause issues with smooth playback.");
        
        /* materials */
        prop= RNA_def_property(srna, "material_mode", PROP_ENUM, PROP_NONE);
index 3c766affe56e435b02d360b15e785869cd644b2f..4850c1459f449e00440c8d888a315b5e3b44e0a6 100644 (file)
@@ -187,6 +187,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
 #endif
                bool novertexarrays = (SYS_GetCommandLineInt(syshandle, "novertexarrays", 0) != 0);
                bool mouse_state = startscene->gm.flag & GAME_SHOW_MOUSE;
+               bool restrictAnimFPS = startscene->gm.flag & GAME_RESTRICT_ANIM_UPDATES;
 
                if(animation_record) usefixed= true; /* override since you's always want fixed time for sim recording */
 
@@ -237,6 +238,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
                ketsjiengine->SetNetworkDevice(networkdevice);
                ketsjiengine->SetUseFixedTime(usefixed);
                ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
+               ketsjiengine->SetRestrictAnimationFPS(restrictAnimFPS);
 
 #ifdef WITH_PYTHON
                CValue::SetDeprecationWarnings(nodepwarnings);
index f2b322084ed6a305e343b4176995e23164608995..1c6d3efc31827971ad14428efa8b647016ab99ae 100644 (file)
@@ -545,6 +545,7 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
                bool frameRate = (SYS_GetCommandLineInt(syshandle, "show_framerate", 0) != 0);
                bool useLists = (SYS_GetCommandLineInt(syshandle, "displaylists", gm->flag & GAME_DISPLAY_LISTS) != 0);
                bool nodepwarnings = (SYS_GetCommandLineInt(syshandle, "ignore_deprecation_warnings", 1) != 0);
+               bool restrictAnimFPS = gm->flag & GAME_RESTRICT_ANIM_UPDATES;
 
                if(GLEW_ARB_multitexture && GLEW_VERSION_1_1)
                        m_blendermat = (SYS_GetCommandLineInt(syshandle, "blender_material", 1) != 0);
@@ -627,6 +628,7 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
 
                m_ketsjiengine->SetUseFixedTime(fixed_framerate);
                m_ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
+               m_ketsjiengine->SetRestrictAnimationFPS(restrictAnimFPS);
 
                m_engineInitialized = true;
        }
index 6fb03d0a573cc9122108737b2ca7bf7cada7bdf9..0b83e3247ff3b8a789ba0079c5eee684e857fe24 100644 (file)
@@ -110,6 +110,7 @@ double KX_KetsjiEngine::m_anim_framerate = 25.0;
 double KX_KetsjiEngine::m_suspendedtime = 0.0;
 double KX_KetsjiEngine::m_suspendeddelta = 0.0;
 double KX_KetsjiEngine::m_average_framerate = 0.0;
+bool   KX_KetsjiEngine::m_restrict_anim_fps = false;
 
 
 /**
@@ -660,7 +661,14 @@ else
                                m_logger->StartLog(tc_scenegraph, m_kxsystem->GetTimeInSeconds(), true);
                                SG_SetActiveStage(SG_STAGE_ACTUATOR_UPDATE);
                                scene->UpdateParents(m_frameTime);
-                               
+
+                               if (!GetRestrictAnimationFPS())
+                               {
+                                       m_logger->StartLog(tc_animations, m_kxsystem->GetTimeInSeconds(), true);
+                                       SG_SetActiveStage(SG_STAGE_ANIMATION_UPDATE);
+                                       scene->UpdateAnimations(m_frameTime);
+                               }
+
                                m_logger->StartLog(tc_physics, m_kxsystem->GetTimeInSeconds(), true);
                                SG_SetActiveStage(SG_STAGE_PHYSICS2);
                                scene->GetPhysicsEnvironment()->beginFrame();
@@ -769,21 +777,24 @@ else
 
                
        // Handle the animations independently of the logic time step
-       m_logger->StartLog(tc_animations, m_kxsystem->GetTimeInSeconds(), true);
-       SG_SetActiveStage(SG_STAGE_ANIMATION_UPDATE);
-
-       double anim_timestep = 1.0/KX_GetActiveScene()->GetAnimationFPS();
-       if (m_clockTime - m_previousAnimTime > anim_timestep)
+       if (GetRestrictAnimationFPS())
        {
-               // Sanity/debug print to make sure we're actually going at the fps we want (should be close to anim_timestep)
-               // printf("Anim fps: %f\n", 1.0/(m_clockTime - m_previousAnimTime));
-               m_previousAnimTime = m_clockTime;
-               for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); ++sceneit)
+               m_logger->StartLog(tc_animations, m_kxsystem->GetTimeInSeconds(), true);
+               SG_SetActiveStage(SG_STAGE_ANIMATION_UPDATE);
+
+               double anim_timestep = 1.0/KX_GetActiveScene()->GetAnimationFPS();
+               if (m_clockTime - m_previousAnimTime > anim_timestep)
                {
-                       (*sceneit)->UpdateAnimations(m_frameTime);
+                       // Sanity/debug print to make sure we're actually going at the fps we want (should be close to anim_timestep)
+                       // printf("Anim fps: %f\n", 1.0/(m_clockTime - m_previousAnimTime));
+                       m_previousAnimTime = m_clockTime;
+                       for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); ++sceneit)
+                       {
+                               (*sceneit)->UpdateAnimations(m_frameTime);
+                       }
                }
+               m_previousClockTime = m_clockTime;
        }
-       m_previousClockTime = m_clockTime;
        
        // Start logging time spend outside main loop
        m_logger->StartLog(tc_outside, m_kxsystem->GetTimeInSeconds(), true);
@@ -1821,6 +1832,16 @@ void KX_KetsjiEngine::SetMaxPhysicsFrame(int frame)
        m_maxPhysicsFrame = frame;
 }
 
+bool KX_KetsjiEngine::GetRestrictAnimationFPS()
+{
+       return m_restrict_anim_fps;
+}
+
+void KX_KetsjiEngine::SetRestrictAnimationFPS(bool bRestrictAnimFPS)
+{
+       m_restrict_anim_fps = bRestrictAnimFPS;
+}
+
 double KX_KetsjiEngine::GetAnimFrameRate()
 {
        return m_anim_framerate;
index 89419bb77739591dda792ebe0806ccecc3f0b3a5..95a6b3401a7b04b89c63ea1b1b1a6bad406745f9 100644 (file)
@@ -116,6 +116,8 @@ private:
        static double                   m_ticrate;
        static double                   m_anim_framerate; /* for animation playback only - ipo and action */
 
+       static bool                             m_restrict_anim_fps;
+
        static double                   m_suspendedtime;
        static double                   m_suspendeddelta;
 
@@ -322,6 +324,16 @@ public:
         */
        static void SetMaxPhysicsFrame(int frame);
 
+       /**
+        * Gets whether or not to lock animation updates to the animframerate
+        */
+       static bool GetRestrictAnimationFPS();
+
+       /**
+        * Sets whether or not to lock animation updates to the animframerate
+        */
+       static void SetRestrictAnimationFPS(bool bRestrictAnimFPS);
+
        /**
         * Gets the framerate for playing animations. (actions and ipos)
         */