|
|
|
/*==LICENSE==*
|
|
|
|
|
|
|
|
CyanWorlds.com Engine - MMOG client, server and tools
|
|
|
|
Copyright (C) 2011 Cyan Worlds, Inc.
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
Additional permissions under GNU GPL version 3 section 7
|
|
|
|
|
|
|
|
If you modify this Program, or any covered work, by linking or
|
|
|
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
|
|
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
|
|
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
|
|
|
(or a modified version of those libraries),
|
|
|
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
|
|
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
|
|
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
|
|
|
licensors of this Program grant you additional
|
|
|
|
permission to convey the resulting work. Corresponding Source for a
|
|
|
|
non-source form of such a combination shall include the source code for
|
|
|
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
|
|
|
work.
|
|
|
|
|
|
|
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
|
|
|
or by snail mail at:
|
|
|
|
Cyan Worlds, Inc.
|
|
|
|
14617 N Newport Hwy
|
|
|
|
Mead, WA 99021
|
|
|
|
|
|
|
|
*==LICENSE==*/
|
|
|
|
#include "cyAnimation.h"
|
|
|
|
#include "hsUtils.h"
|
|
|
|
|
|
|
|
#include <python.h>
|
|
|
|
|
|
|
|
// glue functions
|
|
|
|
PYTHON_CLASS_DEFINITION(ptAnimation, cyAnimation);
|
|
|
|
|
|
|
|
PYTHON_DEFAULT_NEW_DEFINITION(ptAnimation, cyAnimation)
|
|
|
|
PYTHON_DEFAULT_DEALLOC_DEFINITION(ptAnimation)
|
|
|
|
|
|
|
|
PYTHON_INIT_DEFINITION(ptAnimation, args, keywords)
|
|
|
|
{
|
|
|
|
PyObject *keyObject = NULL;
|
|
|
|
if (!PyArg_ParseTuple(args, "|O", &keyObject))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "__init__ expects an optional ptKey");
|
|
|
|
PYTHON_RETURN_INIT_ERROR;
|
|
|
|
}
|
|
|
|
if (keyObject == NULL) // no parameter was passed
|
|
|
|
PYTHON_RETURN_INIT_OK; // nothing to init
|
|
|
|
|
|
|
|
if (!pyKey::Check(keyObject))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "__init__ expects an optional ptKey");
|
|
|
|
PYTHON_RETURN_INIT_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
pyKey *key = pyKey::ConvertFrom(keyObject);
|
|
|
|
self->fThis->SetSender(*key);
|
|
|
|
|
|
|
|
PYTHON_RETURN_INIT_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION(ptAnimation, sender, args)
|
|
|
|
{
|
|
|
|
PyObject *keyObject = NULL;
|
|
|
|
if (!PyArg_ParseTuple(args, "O", &keyObject))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "sender requires a ptKey argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
if (!pyKey::Check(keyObject))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "sender requires a ptKey argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
pyKey *key = pyKey::ConvertFrom(keyObject);
|
|
|
|
self->fThis->SetSender(*key);
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION(ptAnimation, addKey, args)
|
|
|
|
{
|
|
|
|
PyObject *keyObject = NULL;
|
|
|
|
if (!PyArg_ParseTuple(args, "O", &keyObject))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "addKey requires a ptKey argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
if (!pyKey::Check(keyObject))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "addKey requires a ptKey argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
pyKey *key = pyKey::ConvertFrom(keyObject);
|
|
|
|
self->fThis->AddRecvr(*key);
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION(ptAnimation, netForce, args)
|
|
|
|
{
|
|
|
|
char forceFlag;
|
|
|
|
if (!PyArg_ParseTuple(args, "b", &forceFlag))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "netForce requires a boolean argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
self->fThis->SetNetForce(forceFlag != 0);
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION(ptAnimation, setAnimName, args)
|
|
|
|
{
|
|
|
|
char *name = NULL;
|
|
|
|
if (!PyArg_ParseTuple(args, "s", &name)) // name points at the internal buffer SO DON'T DELETE IT
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "setAnimName requires a string argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
self->fThis->SetAnimName(name);
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_BASIC_METHOD_DEFINITION(ptAnimation, play, Play)
|
|
|
|
PYTHON_BASIC_METHOD_DEFINITION(ptAnimation, stop, Stop)
|
|
|
|
PYTHON_BASIC_METHOD_DEFINITION(ptAnimation, resume, Resume)
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION(ptAnimation, playRange, args)
|
|
|
|
{
|
|
|
|
float start, end;
|
|
|
|
if (!PyArg_ParseTuple(args, "ff", &start, &end))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "playRange requires two floating-point arguments");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
self->fThis->PlayRange(start, end);
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION(ptAnimation, playToTime, args)
|
|
|
|
{
|
|
|
|
float time;
|
|
|
|
if (!PyArg_ParseTuple(args, "f", &time))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "playToTime requires one floating-point argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
self->fThis->PlayToTime(time);
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION(ptAnimation, playToPercentage, args)
|
|
|
|
{
|
|
|
|
float percent;
|
|
|
|
if (!PyArg_ParseTuple(args, "f", &percent))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "playToPercentage requires one floating-point argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
self->fThis->PlayToPercentage(percent);
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION(ptAnimation, skipToTime, args)
|
|
|
|
{
|
|
|
|
float time;
|
|
|
|
if (!PyArg_ParseTuple(args, "f", &time))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "skipToTime requires one floating-point argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
self->fThis->SkipToTime(time);
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION(ptAnimation, looped, args)
|
|
|
|
{
|
|
|
|
char looped;
|
|
|
|
if (!PyArg_ParseTuple(args, "b", &looped))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "looped requires a boolean argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
self->fThis->Looped(looped != 0);
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION(ptAnimation, backwards, args)
|
|
|
|
{
|
|
|
|
char backwards;
|
|
|
|
if (!PyArg_ParseTuple(args, "b", &backwards))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "backwards requires a boolean argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
self->fThis->Backwards(backwards != 0);
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION(ptAnimation, setLoopStart, args)
|
|
|
|
{
|
|
|
|
float time;
|
|
|
|
if (!PyArg_ParseTuple(args, "f", &time))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "setLoopStart requires one floating-point argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
self->fThis->SetLoopStart(time);
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION(ptAnimation, setLoopEnd, args)
|
|
|
|
{
|
|
|
|
float time;
|
|
|
|
if (!PyArg_ParseTuple(args, "f", &time))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "setLoopEnd requires one floating-point argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
self->fThis->SetLoopEnd(time);
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION(ptAnimation, speed, args)
|
|
|
|
{
|
|
|
|
float speed;
|
|
|
|
if (!PyArg_ParseTuple(args, "f", &speed))
|
|
|
|
{
|
|
|
|
PyErr_SetString(PyExc_TypeError, "speed requires one floating-point argument");
|
|
|
|
PYTHON_RETURN_ERROR;
|
|
|
|
}
|
|
|
|
self->fThis->Speed(speed);
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_BASIC_METHOD_DEFINITION(ptAnimation, skipToBegin, SkipToBegin)
|
|
|
|
PYTHON_BASIC_METHOD_DEFINITION(ptAnimation, skipToEnd, SkipToEnd)
|
|
|
|
PYTHON_BASIC_METHOD_DEFINITION(ptAnimation, skipToLoopBegin, SkipToLoopBegin)
|
|
|
|
PYTHON_BASIC_METHOD_DEFINITION(ptAnimation, skipToLoopEnd, SkipToLoopEnd)
|
|
|
|
PYTHON_BASIC_METHOD_DEFINITION(ptAnimation, incrementForward, IncrementForward)
|
|
|
|
PYTHON_BASIC_METHOD_DEFINITION(ptAnimation, incrementBackward, IncrementBackward)
|
|
|
|
|
|
|
|
PYTHON_METHOD_DEFINITION_NOARGS(ptAnimation, getFirstKey)
|
|
|
|
{
|
|
|
|
PyObject *key = self->fThis->GetFirstRecvr();
|
|
|
|
if (key == NULL)
|
|
|
|
PYTHON_RETURN_NONE;
|
|
|
|
return key;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_START_METHODS_TABLE(ptAnimation)
|
|
|
|
PYTHON_METHOD(ptAnimation, sender, "Params: selfKey\nSets the sender of the messages being sent to the animation modifier"),
|
|
|
|
PYTHON_METHOD(ptAnimation, addKey, "Params: key\nAdds an animation modifier to the list of receiver keys"),
|
|
|
|
PYTHON_METHOD(ptAnimation, netForce, "Params: forceFlag\nSpecify whether this object needs to use messages that are forced to the network\n"
|
|
|
|
"- This is to be used if your Python program is running on only one client\n"
|
|
|
|
"Such as a game master, only running on the client that owns a particular object"),
|
|
|
|
PYTHON_METHOD(ptAnimation, setAnimName, "Params: name\nSets the animation notetrack name (or (Entire Animation))"),
|
|
|
|
PYTHON_BASIC_METHOD(ptAnimation, play, "Plays the animation"),
|
|
|
|
PYTHON_BASIC_METHOD(ptAnimation, stop, "Stops the animation"),
|
|
|
|
PYTHON_BASIC_METHOD(ptAnimation, resume, "Resumes the animation from where it was stopped last"),
|
|
|
|
PYTHON_METHOD(ptAnimation, playRange, "Params: start,end\nPlay the animation from start to end"),
|
|
|
|
PYTHON_METHOD(ptAnimation, playToTime, "Params: time\nPlay the animation to the specified time"),
|
|
|
|
PYTHON_METHOD(ptAnimation, playToPercentage, "Params: zeroToOne\nPlay the animation to the specified percentage (0 to 1)"),
|
|
|
|
PYTHON_METHOD(ptAnimation, skipToTime, "Params: time\nSkip the animation to time (don't play)"),
|
|
|
|
PYTHON_METHOD(ptAnimation, looped, "Params: loopedFlag\nTurn on and off looping of the animation"),
|
|
|
|
PYTHON_METHOD(ptAnimation, backwards, "Params: backwardsFlag\nTurn on and off playing the animation backwards"),
|
|
|
|
PYTHON_METHOD(ptAnimation, setLoopStart, "Params: loopStart\nSets the loop starting position\n"
|
|
|
|
"- 'loopStart' is the number of seconds from the absolute beginning of the animation"),
|
|
|
|
PYTHON_METHOD(ptAnimation, setLoopEnd, "Params: loopEnd\nSets the loop ending position\n"
|
|
|
|
"- 'loopEnd' is the number of seconds from the absolute beginning of the animation"),
|
|
|
|
PYTHON_METHOD(ptAnimation, speed, "Params: speed\nSets the animation playback speed"),
|
|
|
|
PYTHON_BASIC_METHOD(ptAnimation, skipToBegin, "Skip to the beginning of the animation (don't play)"),
|
|
|
|
PYTHON_BASIC_METHOD(ptAnimation, skipToEnd, "Skip to the end of the animation (don't play)"),
|
|
|
|
PYTHON_BASIC_METHOD(ptAnimation, skipToLoopBegin, "Skip to the beginning of the animation loop (don't play)"),
|
|
|
|
PYTHON_BASIC_METHOD(ptAnimation, skipToLoopEnd, "Skip to the end of the animation loop (don't play)"),
|
|
|
|
PYTHON_BASIC_METHOD(ptAnimation, incrementForward, "Step the animation forward a frame"),
|
|
|
|
PYTHON_BASIC_METHOD(ptAnimation, incrementBackward, "Step the animation backward a frame"),
|
|
|
|
PYTHON_METHOD_NOARGS(ptAnimation, getFirstKey, "This will return a ptKey object that is the first receiver (target)\n"
|
|
|
|
"However, if the parent is not a modifier or not loaded, then None is returned."),
|
|
|
|
PYTHON_END_METHODS_TABLE;
|
|
|
|
|
|
|
|
// Type structure definition
|
|
|
|
PLASMA_DEFAULT_TYPE(ptAnimation, "Params: key=None\nPlasma animation class");
|
|
|
|
|
|
|
|
// required functions for PyObject interoperability
|
|
|
|
PYTHON_CLASS_NEW_IMPL(ptAnimation, cyAnimation)
|
|
|
|
|
|
|
|
PyObject *cyAnimation::New(PyObject *sender)
|
|
|
|
{
|
|
|
|
ptAnimation *newObj = (ptAnimation*)ptAnimation_type.tp_new(&ptAnimation_type, NULL, NULL);
|
|
|
|
pyKey *key = pyKey::ConvertFrom(sender);
|
|
|
|
newObj->fThis->SetSender(*key);
|
|
|
|
newObj->fThis->fAnimName = nil;
|
|
|
|
newObj->fThis->fNetForce = false;
|
|
|
|
return (PyObject*)newObj;
|
|
|
|
}
|
|
|
|
|
|
|
|
PyObject *cyAnimation::New(cyAnimation &obj)
|
|
|
|
{
|
|
|
|
ptAnimation *newObj = (ptAnimation*)ptAnimation_type.tp_new(&ptAnimation_type, NULL, NULL);
|
|
|
|
newObj->fThis->fSender = obj.fSender;
|
|
|
|
newObj->fThis->fRecvr = obj.fRecvr;
|
|
|
|
newObj->fThis->fAnimName = hsStrcpy(obj.fAnimName);
|
|
|
|
newObj->fThis->fNetForce = obj.fNetForce;
|
|
|
|
return (PyObject*)newObj;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYTHON_CLASS_CHECK_IMPL(ptAnimation, cyAnimation)
|
|
|
|
PYTHON_CLASS_CONVERT_FROM_IMPL(ptAnimation, cyAnimation)
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// AddPlasmaClasses - the python module definitions
|
|
|
|
//
|
|
|
|
void cyAnimation::AddPlasmaClasses(PyObject *m)
|
|
|
|
{
|
|
|
|
PYTHON_CLASS_IMPORT_START(m);
|
|
|
|
PYTHON_CLASS_IMPORT(m, ptAnimation);
|
|
|
|
PYTHON_CLASS_IMPORT_END(m);
|
|
|
|
}
|