Revision: 15519
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15519
Author: campbellbarton
Date: 2008-07-10 16:23:19 +0200 (Thu, 10 Jul 2008)
Log Message:
-----------
Adding an option for action actuator - "Continue" this means animations always
play from where they left off. Continue was the 2.46 operation too, so new
functionality is the option to disable.
When using states, an action like kick or throw can often switch out before
finishing playing the action, and there was no way to play from the start frame
the second time round. (even setting the actions current frame through python
doesn't work work)
Modified Paths:
--------------
trunk/blender/source/blender/makesdna/DNA_actuator_types.h
trunk/blender/source/blender/src/buttons_logic.c
trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
trunk/blender/source/gameengine/Converter/BL_ActionActuator.h
trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
trunk/blender/source/gameengine/PyDoc/BL_ActionActuator.py
Modified: trunk/blender/source/blender/makesdna/DNA_actuator_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_actuator_types.h 2008-07-10
12:49:55 UTC (rev 15518)
+++ trunk/blender/source/blender/makesdna/DNA_actuator_types.h 2008-07-10
14:23:19 UTC (rev 15519)
@@ -51,8 +51,9 @@
int sta, end; /* Start & End frames */
char name[32]; /* For property-driven playback */
char frameProp[32]; /* Set this property to the actions current
frame */
- int blendin; /* Number of frames of blending */
- short priority; /* Execution priority */
+ short blendin; /* Number of frames of blending */
+ short priority; /* Execution priority */
+ short end_reset; /* Ending the actuator (negative pulse) wont
reset the the action to its starting frame */
short strideaxis; /* Displacement axis */
float stridelength; /* Displacement incurred by cycle */
} bActionActuator;
Modified: trunk/blender/source/blender/src/buttons_logic.c
===================================================================
--- trunk/blender/source/blender/src/buttons_logic.c 2008-07-10 12:49:55 UTC
(rev 15518)
+++ trunk/blender/source/blender/src/buttons_logic.c 2008-07-10 14:23:19 UTC
(rev 15519)
@@ -1769,23 +1769,27 @@
#else
str= "Action types %t|Play %x0|Flipper %x2|Loop Stop
%x3|Loop End %x4|Property %x6";
#endif
- uiDefButS(block, MENU, B_REDR, str, xco+30, yco-24,
(width-60)/2, 19, &aa->type, 0.0, 0.0, 0.0, 0.0, "Action playback type");
- uiDefIDPoinBut(block, test_actionpoin_but, ID_AC, 1,
"AC: ", xco+30 + ((width-60)/2), yco-24, (width-60)/2, 19, &aa->act, "Action
name");
+ uiDefButS(block, MENU, B_REDR, str, xco+10, yco-24,
width/3, 19, &aa->type, 0.0, 0.0, 0.0, 0.0, "Action playback type");
+ uiDefIDPoinBut(block, test_actionpoin_but, ID_AC, 1,
"AC: ", xco+10+ (width/3), yco-24, ((width/3)*2) - (20 + 60), 19, &aa->act,
"Action name");
+ uiDefButBitS(block, TOGN, 1, 0, "Continue",
xco+((width/3)*2)+20, yco-24, 60, 19,
+ &aa->end_reset, 0.0, 0.0, 0, 0,
"Restore last frame when switching on/off, otherwise play from the start each
time");
+
+
if(aa->type == ACT_ACTION_FROM_PROP)
{
- uiDefBut(block, TEX, 0, "Prop: ",xco+30,
yco-44, width-60, 19, aa->name, 0.0, 31.0, 0, 0, "Use this property to define
the Action position");
+ uiDefBut(block, TEX, 0, "Prop: ",xco+10,
yco-44, width-20, 19, aa->name, 0.0, 31.0, 0, 0, "Use this property to define
the Action position");
}
else
{
- uiDefButI(block, NUM, 0, "Sta: ",xco+30,
yco-44, (width-60)/2, 19, &aa->sta, 0.0, MAXFRAMEF, 0, 0, "Start frame");
- uiDefButI(block, NUM, 0, "End:
",xco+30+(width-60)/2, yco-44, (width-60)/2, 19, &aa->end, 0.0, MAXFRAMEF, 0,
0, "End frame");
+ uiDefButI(block, NUM, 0, "Sta: ",xco+10,
yco-44, (width-20)/2, 19, &aa->sta, 0.0, MAXFRAMEF, 0, 0, "Start frame");
+ uiDefButI(block, NUM, 0, "End:
",xco+10+(width-20)/2, yco-44, (width-20)/2, 19, &aa->end, 0.0, MAXFRAMEF, 0,
0, "End frame");
}
- uiDefButI(block, NUM, 0, "Blendin: ", xco+30, yco-64,
(width-60)/2, 19, &aa->blendin, 0.0, MAXFRAMEF, 0.0, 0.0, "Number of frames of
motion blending");
- uiDefButS(block, NUM, 0, "Priority: ",
xco+30+(width-60)/2, yco-64, (width-60)/2, 19, &aa->priority, 0.0, 100.0, 0.0,
0.0, "Execution priority - lower numbers will override actions with higher
numbers, With 2 or more actions at once, the overriding channels must be lower
in the stack");
+ uiDefButS(block, NUM, 0, "Blendin: ", xco+10, yco-64,
(width-20)/2, 19, &aa->blendin, 0.0, 32767, 0.0, 0.0, "Number of frames of
motion blending");
+ uiDefButS(block, NUM, 0, "Priority: ",
xco+10+(width-20)/2, yco-64, (width-20)/2, 19, &aa->priority, 0.0, 100.0, 0.0,
0.0, "Execution priority - lower numbers will override actions with higher
numbers, With 2 or more actions at once, the overriding channels must be lower
in the stack");
- uiDefBut(block, TEX, 0, "FrameProp: ",xco+30, yco-84,
width-60, 19, aa->frameProp, 0.0, 31.0, 0, 0, "Assign this property this
actions current frame number");
+ uiDefBut(block, TEX, 0, "FrameProp: ",xco+10, yco-84,
width-20, 19, aa->frameProp, 0.0, 31.0, 0, 0, "Assign this property this
actions current frame number");
#ifdef __NLA_ACTION_BY_MOTION_ACTUATOR
Modified: trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
2008-07-10 12:49:55 UTC (rev 15518)
+++ trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
2008-07-10 14:23:19 UTC (rev 15519)
@@ -184,6 +184,11 @@
if (bNegativeEvent)
{
+ // dont continue where we left off when restarting
+ if (m_end_reset) {
+ m_flag &= ~ACT_FLAG_LOCKINPUT;
+ }
+
if (!(m_flag & ACT_FLAG_ACTIVE))
return false;
m_flag &= ~ACT_FLAG_ACTIVE;
@@ -472,8 +477,10 @@
{"getFrameProperty", (PyCFunction)
BL_ActionActuator::sPyGetFrameProperty, METH_VARARGS, GetFrameProperty_doc},
{"setChannel", (PyCFunction) BL_ActionActuator::sPySetChannel,
METH_VARARGS, SetChannel_doc},
// {"getChannel", (PyCFunction) BL_ActionActuator::sPyGetChannel,
METH_VARARGS},
- {"getType", (PyCFunction) BL_ActionActuator::sPyGetType, METH_VARARGS,
GetType_doc},
+ {"getType", (PyCFunction) BL_ActionActuator::sPyGetType, METH_VARARGS,
GetType_doc},
{"setType", (PyCFunction) BL_ActionActuator::sPySetType, METH_VARARGS,
SetType_doc},
+ {"getContinue", (PyCFunction) BL_ActionActuator::sPyGetContinue,
METH_NOARGS, 0},
+ {"setContinue", (PyCFunction) BL_ActionActuator::sPySetContinue,
METH_O, 0},
{NULL,NULL} //Sentinel
};
@@ -978,7 +985,26 @@
default:
printf("Invalid type for action actuator: %d\n", typeArg); /*
error */
}
+ Py_RETURN_NONE;
+}
+
+PyObject* BL_ActionActuator::PyGetContinue(PyObject* self) {
+ return PyInt_FromLong((long)(m_end_reset==0));
+}
+
+PyObject* BL_ActionActuator::PySetContinue(PyObject* self, PyObject* value) {
+ int param = PyObject_IsTrue( value );
- Py_Return;
+ if( param == -1 ) {
+ PyErr_SetString( PyExc_TypeError, "expected True/False or 0/1"
);
+ return NULL;
+ }
+
+ if (param) {
+ m_end_reset = 0;
+ } else {
+ m_end_reset = 1;
+ }
+ Py_RETURN_NONE;
}
Modified: trunk/blender/source/gameengine/Converter/BL_ActionActuator.h
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ActionActuator.h
2008-07-10 12:49:55 UTC (rev 15518)
+++ trunk/blender/source/gameengine/Converter/BL_ActionActuator.h
2008-07-10 14:23:19 UTC (rev 15519)
@@ -47,6 +47,7 @@
short playtype,
short blendin,
short priority,
+ short end_reset,
float stride,
PyTypeObject* T=&Type)
: SCA_IActuator(gameobj,T),
@@ -64,6 +65,7 @@
m_stridelength(stride),
m_playtype(playtype),
m_priority(priority),
+ m_end_reset(end_reset),
m_pose(NULL),
m_blendpose(NULL),
m_userpose(NULL),
@@ -101,6 +103,8 @@
// KX_PYMETHOD(BL_ActionActuator,GetChannel);
KX_PYMETHOD_DOC(BL_ActionActuator,GetType);
KX_PYMETHOD_DOC(BL_ActionActuator,SetType);
+ KX_PYMETHOD_NOARGS(BL_ActionActuator,GetContinue);
+ KX_PYMETHOD_O(BL_ActionActuator,SetContinue);
virtual PyObject* _getattr(const STR_String& attr);
@@ -137,6 +141,7 @@
float m_stridelength;
short m_playtype;
short m_priority;
+ short m_end_reset;
struct bPose* m_pose;
struct bPose* m_blendpose;
struct bPose* m_userpose;
Modified: trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
2008-07-10 12:49:55 UTC (rev 15518)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
2008-07-10 14:23:19 UTC (rev 15519)
@@ -193,6 +193,7 @@
actact->type, // + 1, because
Blender starts to count at zero,
actact->blendin,
actact->priority,
+ actact->end_reset,
actact->stridelength
// Ketsji at 1, because zero is
reserved for "NoDef"
);
Modified: trunk/blender/source/gameengine/PyDoc/BL_ActionActuator.py
===================================================================
--- trunk/blender/source/gameengine/PyDoc/BL_ActionActuator.py 2008-07-10
12:49:55 UTC (rev 15518)
+++ trunk/blender/source/gameengine/PyDoc/BL_ActionActuator.py 2008-07-10
14:23:19 UTC (rev 15519)
@@ -86,7 +86,15 @@
@param mode: KX_ACTIONACT_PLAY, KX_ACTIONACT_PROPERTY,
KX_ACTIONACT_FLIPPER, KX_ACTIONACT_LOOPSTOP, KX_ACTIONACT_LOOPEND
@type mode: integer
"""
+
+ def setContinue(cont):
+ """
+ Set the actions continue option True or False. see getContinue.
+ @param cont: The continue option.
+ @type cont: bool
+ """
+
def getType():
"""
Returns the operation mode of the actuator
@@ -94,6 +102,13 @@
@rtype: integer
@return: KX_ACTIONACT_PLAY, KX_ACTIONACT_PROPERTY,
KX_ACTIONACT_FLIPPER, KX_ACTIONACT_LOOPSTOP, KX_ACTIONACT_LOOPEND
"""
+
+ def getContinue():
+ """
+ When True, the action will always play from where last left
off, otherwise negative events to this actuator will reset it to its start
frame.
+
+ @rtype: bool
+ """
def getAction():
"""
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs