BGE: added bge.logic.{get,set}AnimRecordFrame functions
authorSybren A. Stüvel <sybren@stuvel.eu>
Tue, 25 Aug 2015 11:42:09 +0000 (13:42 +0200)
committerSybren A. Stüvel <sybren@stuvel.eu>
Tue, 25 Aug 2015 11:42:09 +0000 (13:42 +0200)
By using getAnimRecordFrame(), game developers have access to the frame
number used by the "Record animation" feature. This enables them to
record additional information in Blender's F-Curves and ensuring perfect
synchronization with the information already recorded by Blender.

The setAnimRecordFrame() can be used to change the frame number at which
animations are recorded, for example to introduce delays the recording that
do not require delays in the actual game/simulation run.

The getter/setter functions in KX_KetsjiEngine are not directly named after
property they access (m_currentFrame). I found "current frame" to be too
vague for a public interface, hence chose a more descriptive name.

Reviewers: moguri, hg1, campbellbarton, panzergame, aligorith

Reviewed By: panzergame, aligorith

Differential Revision: https://developer.blender.org/D1449

doc/python_api/rst/bge.logic.rst
source/gameengine/Ketsji/KX_KetsjiEngine.cpp
source/gameengine/Ketsji/KX_KetsjiEngine.h
source/gameengine/Ketsji/KX_PythonInit.cpp

index ab1f647f7c860902a97ac442e8bf62a8662d3430..57d9f1ab5e5b2d0f0190cf6cd6ebea1aee219cdd 100644 (file)
@@ -337,6 +337,28 @@ General functions
 
    .. warning: Not implimented yet
 
+.. function:: getAnimRecordFrame()
+
+    Gets the current frame number used for recording animations. This
+    number is incremented automatically by Blender when the "Record
+    animation" feature is turned on.
+
+    :rtype: int
+
+.. function:: setAnimRecordFrame(framenr)
+
+    Sets the current frame number used for recording animations. This
+    number is automatically incremented by Blender when the "Record
+    animation" feature is turned on.
+
+    The frame number Must be non-negative, unless Blender has
+    :attr:`bpy.types.UserPreferencesEdit.use_negative_frames` enabled
+    in its user preferences. Only use non-negative numbers to be on
+    the safe side, unless you know what you are doing.
+
+    :arg framenr: The new frame number.
+    :type framenr: int
+
 .. function:: getExitKey()
 
    Gets the key used to exit the game engine
index c7cf556a2d3b627d3aebc10168f5695ecc014a82..72c512589a41ae2ea5ae2b7400f755e9b1e4183e 100644 (file)
@@ -1750,6 +1750,16 @@ void     KX_KetsjiEngine::SetAnimRecordMode(bool animation_record, int startFrame)
        m_currentFrame = startFrame;
 }
 
+int KX_KetsjiEngine::getAnimRecordFrame() const
+{
+       return m_currentFrame;
+}
+
+void KX_KetsjiEngine::setAnimRecordFrame(int framenr)
+{
+       m_currentFrame = framenr;
+}
+
 bool KX_KetsjiEngine::GetUseFixedTime(void) const
 {
        return m_bFixedTime;
index 6c9fed5781f37d53ac8aa7782c19c9c04b0caa05..04e09c8db1528932fe0de94ae3f9eede7b9c0e3b 100644 (file)
@@ -225,6 +225,9 @@ public:
        KX_ISceneConverter* GetSceneConverter() { return m_sceneconverter; }
        void                    SetAnimRecordMode(bool animation_record, int startFrame);
 
+       int getAnimRecordFrame() const;
+       void setAnimRecordFrame(int framenr);
+
        RAS_IRasterizer*                GetRasterizer() { return m_rasterizer; }
        RAS_ICanvas*                GetCanvas() { return m_canvas; }
        SCA_IInputDevice*               GetKeyboardDevice() { return m_keyboarddevice; }
index 4cb632ed73939bb7471c3608d21b237c64c51f31..2fef74ca33dfd1455b588449b3d87dff111471b7 100644 (file)
@@ -526,6 +526,27 @@ static PyObject *gPyGetPhysicsTicRate(PyObject *)
        return PyFloat_FromDouble(PHY_GetActiveEnvironment()->GetFixedTimeStep());
 }
 
+static PyObject *gPySetAnimRecordFrame(PyObject *, PyObject *args)
+{
+       int anim_record_frame;
+
+       if (!PyArg_ParseTuple(args, "i:setAnimRecordFrame", &anim_record_frame))
+               return NULL;
+
+       if (anim_record_frame < 0 && (U.flag & USER_NONEGFRAMES)) {
+               PyErr_Format(PyExc_ValueError, "Frame number must be non-negative (was %i).", anim_record_frame);
+               return NULL;
+       }
+
+       gp_KetsjiEngine->setAnimRecordFrame(anim_record_frame);
+       Py_RETURN_NONE;
+}
+
+static PyObject *gPyGetAnimRecordFrame(PyObject *)
+{
+       return PyLong_FromLong(gp_KetsjiEngine->getAnimRecordFrame());
+}
+
 static PyObject *gPyGetAverageFrameRate(PyObject *)
 {
        return PyFloat_FromDouble(KX_KetsjiEngine::GetAverageFrameRate());
@@ -887,6 +908,8 @@ static struct PyMethodDef game_methods[] = {
        {"setLogicTicRate", (PyCFunction) gPySetLogicTicRate, METH_VARARGS, (const char *)"Sets the logic tic rate"},
        {"getPhysicsTicRate", (PyCFunction) gPyGetPhysicsTicRate, METH_NOARGS, (const char *)"Gets the physics tic rate"},
        {"setPhysicsTicRate", (PyCFunction) gPySetPhysicsTicRate, METH_VARARGS, (const char *)"Sets the physics tic rate"},
+       {"getAnimRecordFrame", (PyCFunction) gPyGetAnimRecordFrame, METH_NOARGS, (const char *)"Gets the current frame number used for animation recording"},
+       {"setAnimRecordFrame", (PyCFunction) gPySetAnimRecordFrame, METH_VARARGS, (const char *)"Sets the current frame number used for animation recording"},
        {"getExitKey", (PyCFunction) gPyGetExitKey, METH_NOARGS, (const char *)"Gets the key used to exit the game engine"},
        {"setExitKey", (PyCFunction) gPySetExitKey, METH_VARARGS, (const char *)"Sets the key used to exit the game engine"},
        {"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, (const char *)"Gets the estimated average frame rate"},