This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/python/api2_2x/Ipo.c
Stephen Swaney f3feb77918 General housekeeping and cleanup. Move static declarations and
data definitions from .h files into corresponding .c files.
Blame zr for this since he's the one who pointed out that our
bpy headers were a mish-mash of stuff that belonged in the .c files!

In a nutshell, the headers should contain the declarations necessary
to use a module or class.  The implementation files ( .c in this case )
should contain statements that allocate storage ( definitions in
the C sense ) and executable code.

When used at file scope, the keyword 'static' means "don't tell
anyone else about this".  Since headers describe a public
interface, static declarations and definitions belong in the
implementation files.

The net result of all this is that after stuff has moved out
into the .c files, the .h files are empty or mostly empty.
I didn't delete them since there seem to be some public
declarations and because I did not want to cause too much
disruption at one time. Time enough for that later!
2004-03-29 08:16:18 +00:00

988 lines
28 KiB
C

/*
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* 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 2
* of the License, or (at your option) any later version. The Blender
* Foundation also sells licenses for use in proprietary software under
* the Blender License. See http://www.blender.org/BL/ for information
* about this.
*
* 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, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
* This is a new part of Blender.
*
* Contributor(s): Jacques Guignot
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
#include "Ipo.h"
#include <BKE_main.h>
#include <BKE_global.h>
#include <BKE_object.h>
#include <BKE_library.h>
#include <BLI_blenlib.h>
#include "constant.h"
#include "gen_utils.h"
#include "modules.h"
/* forward declarations */
void GetIpoCurveName (IpoCurve * icu, char *s);
void getname_mat_ei (int nr, char *str);
void getname_world_ei (int nr, char *str);
void getname_cam_ei (int nr, char *str);
void getname_ob_ei (int nr, char *str);
/*****************************************************************************/
/* Python API function prototypes for the Ipo module. */
/*****************************************************************************/
static PyObject *M_Ipo_New (PyObject * self, PyObject * args);
static PyObject *M_Ipo_Get (PyObject * self, PyObject * args);
static PyObject *M_Ipo_Recalc (PyObject * self, PyObject * args);
/*****************************************************************************/
/* The following string definitions are used for documentation strings. */
/* In Python these will be written to the console when doing a */
/* Blender.Ipo.__doc__ */
/*****************************************************************************/
char M_Ipo_doc[] = "";
char M_Ipo_New_doc[] = "";
char M_Ipo_Get_doc[] = "";
/*****************************************************************************/
/* Python method structure definition for Blender.Ipo module: */
/*****************************************************************************/
struct PyMethodDef M_Ipo_methods[] = {
{"New", (PyCFunction) M_Ipo_New, METH_VARARGS | METH_KEYWORDS,
M_Ipo_New_doc},
{"Get", M_Ipo_Get, METH_VARARGS, M_Ipo_Get_doc},
{"get", M_Ipo_Get, METH_VARARGS, M_Ipo_Get_doc},
{"Recalc", M_Ipo_Recalc, METH_VARARGS, M_Ipo_Get_doc},
{NULL, NULL, 0, NULL}
};
/*****************************************************************************/
/* Python BPy_Ipo methods declarations: */
/*****************************************************************************/
static PyObject *Ipo_getName (BPy_Ipo * self);
static PyObject *Ipo_setName (BPy_Ipo * self, PyObject * args);
static PyObject *Ipo_getBlocktype (BPy_Ipo * self);
static PyObject *Ipo_setBlocktype (BPy_Ipo * self, PyObject * args);
static PyObject *Ipo_getRctf (BPy_Ipo * self);
static PyObject *Ipo_setRctf (BPy_Ipo * self, PyObject * args);
static PyObject *Ipo_getCurve (BPy_Ipo * self, PyObject * args);
static PyObject *Ipo_getCurves (BPy_Ipo * self);
static PyObject *Ipo_addCurve (BPy_Ipo * self, PyObject * args);
static PyObject *Ipo_getNcurves (BPy_Ipo * self);
static PyObject *Ipo_getNBezPoints (BPy_Ipo * self, PyObject * args);
static PyObject *Ipo_DeleteBezPoints (BPy_Ipo * self, PyObject * args);
static PyObject *Ipo_getCurveBP (BPy_Ipo * self, PyObject * args);
static PyObject *Ipo_getCurvecurval (BPy_Ipo * self, PyObject * args);
static PyObject *Ipo_EvaluateCurveOn (BPy_Ipo * self, PyObject * args);
static PyObject *Ipo_setCurveBeztriple (BPy_Ipo * self, PyObject * args);
static PyObject *Ipo_getCurveBeztriple (BPy_Ipo * self, PyObject * args);
/*****************************************************************************/
/* Python BPy_Ipo methods table: */
/*****************************************************************************/
static PyMethodDef BPy_Ipo_methods[] = {
/* name, method, flags, doc */
{"getName", (PyCFunction) Ipo_getName, METH_NOARGS,
"() - Return Ipo Data name"},
{"setName", (PyCFunction) Ipo_setName, METH_VARARGS,
"(str) - Change Ipo Data name"},
{"getBlocktype", (PyCFunction) Ipo_getBlocktype, METH_NOARGS,
"() - Return Ipo blocktype -"},
{"setBlocktype", (PyCFunction) Ipo_setBlocktype, METH_VARARGS,
"(str) - Change Ipo blocktype"},
{"getRctf", (PyCFunction) Ipo_getRctf, METH_NOARGS,
"() - Return Ipo rctf - "},
{"setRctf", (PyCFunction) Ipo_setRctf, METH_VARARGS,
"(str) - Change Ipo rctf"},
{"addCurve", (PyCFunction) Ipo_addCurve, METH_VARARGS,
"() - Return Ipo ncurves"},
{"getNcurves", (PyCFunction) Ipo_getNcurves, METH_NOARGS,
"() - Return Ipo ncurves"},
{"getNBezPoints", (PyCFunction) Ipo_getNBezPoints, METH_VARARGS,
"() - Return curve number of Bez points"},
{"delBezPoint", (PyCFunction) Ipo_DeleteBezPoints, METH_VARARGS,
"() - Return curve number of Bez points"},
{"getCurveBP", (PyCFunction) Ipo_getCurveBP, METH_VARARGS,
"() - Return Ipo ncurves"},
{"EvaluateCurveOn", (PyCFunction) Ipo_EvaluateCurveOn, METH_VARARGS,
"() - Return curve value at given time"},
{"getCurveCurval", (PyCFunction) Ipo_getCurvecurval, METH_VARARGS,
"() - Return curval"},
{"getCurveBeztriple", (PyCFunction) Ipo_getCurveBeztriple, METH_VARARGS,
"() - Return Ipo ncurves"},
{"setCurveBeztriple", (PyCFunction) Ipo_setCurveBeztriple, METH_VARARGS,
"() - Return curval"},
{"getCurves", (PyCFunction) Ipo_getCurves, METH_NOARGS,
"() - Return curval"},
{"getCurve", (PyCFunction) Ipo_getCurve, METH_VARARGS,
"() - Return curval"},
{NULL, NULL, 0, NULL}
};
/*****************************************************************************/
/* Python Ipo_Type callback function prototypes: */
/*****************************************************************************/
static void IpoDeAlloc (BPy_Ipo * self);
//static int IpoPrint (BPy_Ipo *self, FILE *fp, int flags);
static int IpoSetAttr (BPy_Ipo * self, char *name, PyObject * v);
static PyObject *IpoGetAttr (BPy_Ipo * self, char *name);
static PyObject *IpoRepr (BPy_Ipo * self);
/*****************************************************************************/
/* Python Ipo_Type structure definition: */
/*****************************************************************************/
PyTypeObject Ipo_Type = {
PyObject_HEAD_INIT (NULL) 0, /* ob_size */
"Ipo", /* tp_name */
sizeof (BPy_Ipo), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
(destructor) IpoDeAlloc, /* tp_dealloc */
0, /* tp_print */
(getattrfunc) IpoGetAttr, /* tp_getattr */
(setattrfunc) IpoSetAttr, /* tp_setattr */
0, /* tp_compare */
(reprfunc) IpoRepr, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_as_hash */
0, 0, 0, 0, 0, 0,
0, /* tp_doc */
0, 0, 0, 0, 0, 0,
BPy_Ipo_methods, /* tp_methods */
0, /* tp_members */
};
/*****************************************************************************/
/* Function: M_Ipo_New */
/* Python equivalent: Blender.Ipo.New */
/*****************************************************************************/
static PyObject *
M_Ipo_New (PyObject * self, PyObject * args)
{
Ipo *add_ipo (char *name, int idcode);
char *name = NULL, *code = NULL;
int idcode = -1;
BPy_Ipo *pyipo;
Ipo *blipo;
if (!PyArg_ParseTuple (args, "ss", &code, &name))
return (EXPP_ReturnPyObjError
(PyExc_TypeError, "expected string string arguments"));
if (!strcmp (code, "Object"))
idcode = ID_OB;
if (!strcmp (code, "Camera"))
idcode = ID_CA;
if (!strcmp (code, "World"))
idcode = ID_WO;
if (!strcmp (code, "Material"))
idcode = ID_MA;
if (idcode == -1)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "Bad code"));
blipo = add_ipo (name, idcode);
if (blipo)
{
/* return user count to zero because add_ipo() inc'd it */
blipo->id.us = 0;
/* create python wrapper obj */
pyipo = (BPy_Ipo *) PyObject_NEW (BPy_Ipo, &Ipo_Type);
}
else
return (EXPP_ReturnPyObjError (PyExc_RuntimeError,
"couldn't create Ipo Data in Blender"));
if (pyipo == NULL)
return (EXPP_ReturnPyObjError (PyExc_MemoryError,
"couldn't create Ipo Data object"));
pyipo->ipo = blipo;
return (PyObject *) pyipo;
}
/*****************************************************************************/
/* Function: M_Ipo_Get */
/* Python equivalent: Blender.Ipo.Get */
/* Description: Receives a string and returns the ipo data obj */
/* whose name matches the string. If no argument is */
/* passed in, a list of all ipo data names in the */
/* current scene is returned. */
/*****************************************************************************/
static PyObject *
M_Ipo_Get (PyObject * self, PyObject * args)
{
char *name = NULL;
Ipo *ipo_iter;
PyObject *ipolist, *pyobj;
BPy_Ipo *wanted_ipo = NULL;
char error_msg[64];
if (!PyArg_ParseTuple (args, "|s", &name))
return (EXPP_ReturnPyObjError (PyExc_TypeError,
"expected string argument (or nothing)"));
ipo_iter = G.main->ipo.first;
if (name)
{ /* (name) - Search ipo by name */
while ((ipo_iter) && (wanted_ipo == NULL))
{
if (strcmp (name, ipo_iter->id.name + 2) == 0)
{
wanted_ipo = (BPy_Ipo *) PyObject_NEW (BPy_Ipo, &Ipo_Type);
if (wanted_ipo)
wanted_ipo->ipo = ipo_iter;
}
ipo_iter = ipo_iter->id.next;
}
if (wanted_ipo == NULL)
{ /* Requested ipo doesn't exist */
PyOS_snprintf (error_msg, sizeof (error_msg),
"Ipo \"%s\" not found", name);
return (EXPP_ReturnPyObjError (PyExc_NameError, error_msg));
}
return (PyObject *) wanted_ipo;
}
else
{ /* () - return a list with all ipos in the scene */
int index = 0;
ipolist = PyList_New (BLI_countlist (&(G.main->ipo)));
if (ipolist == NULL)
return (PythonReturnErrorObject (PyExc_MemoryError,
"couldn't create PyList"));
while (ipo_iter)
{
pyobj = Ipo_CreatePyObject (ipo_iter);
if (!pyobj)
return (PythonReturnErrorObject (PyExc_MemoryError,
"couldn't create PyString"));
PyList_SET_ITEM (ipolist, index, pyobj);
ipo_iter = ipo_iter->id.next;
index++;
}
return (ipolist);
}
}
static PyObject *
M_Ipo_Recalc (PyObject * self, PyObject * args)
{
void testhandles_ipocurve (IpoCurve * icu);
PyObject *a;
IpoCurve *icu;
if (!PyArg_ParseTuple (args, "O", &a))
return (EXPP_ReturnPyObjError
(PyExc_TypeError, "expected ipo argument)"));
icu = IpoCurve_FromPyObject (a);
testhandles_ipocurve (icu);
Py_INCREF (Py_None);
return Py_None;
}
/*****************************************************************************/
/* Function: Ipo_Init */
/*****************************************************************************/
PyObject *
Ipo_Init (void)
{
PyObject *submodule;
Ipo_Type.ob_type = &PyType_Type;
submodule = Py_InitModule3 ("Blender.Ipo", M_Ipo_methods, M_Ipo_doc);
return (submodule);
}
/*****************************************************************************/
/* Python BPy_Ipo methods: */
/*****************************************************************************/
static PyObject *
Ipo_getName (BPy_Ipo * self)
{
PyObject *attr = PyString_FromString (self->ipo->id.name + 2);
if (attr)
return attr;
Py_INCREF (Py_None);
return Py_None;
}
static PyObject *
Ipo_setName (BPy_Ipo * self, PyObject * args)
{
char *name;
char buf[21];
if (!PyArg_ParseTuple (args, "s", &name))
return (EXPP_ReturnPyObjError
(PyExc_TypeError, "expected string argument"));
PyOS_snprintf (buf, sizeof (buf), "%s", name);
rename_id (&self->ipo->id, buf);
Py_INCREF (Py_None);
return Py_None;
}
static PyObject *
Ipo_getBlocktype (BPy_Ipo * self)
{
PyObject *attr = PyInt_FromLong (self->ipo->blocktype);
if (attr)
return attr;
return (EXPP_ReturnPyObjError
(PyExc_RuntimeError, "couldn't get Ipo.blocktype attribute"));
}
static PyObject *
Ipo_setBlocktype (BPy_Ipo * self, PyObject * args)
{
int blocktype = 0;
if (!PyArg_ParseTuple (args, "i", &blocktype))
return (EXPP_ReturnPyObjError
(PyExc_TypeError, "expected string argument"));
self->ipo->blocktype = (short) blocktype;
Py_INCREF (Py_None);
return Py_None;
}
static PyObject *
Ipo_getRctf (BPy_Ipo * self)
{
PyObject *l = PyList_New (0);
PyList_Append (l, PyFloat_FromDouble (self->ipo->cur.xmin));
PyList_Append (l, PyFloat_FromDouble (self->ipo->cur.xmax));
PyList_Append (l, PyFloat_FromDouble (self->ipo->cur.ymin));
PyList_Append (l, PyFloat_FromDouble (self->ipo->cur.ymax));
return l;
}
static PyObject *
Ipo_setRctf (BPy_Ipo * self, PyObject * args)
{
float v[4];
if (!PyArg_ParseTuple (args, "ffff", v, v + 1, v + 2, v + 3))
return (EXPP_ReturnPyObjError
(PyExc_TypeError, "expected 4 float argument"));
self->ipo->cur.xmin = v[0];
self->ipo->cur.xmax = v[1];
self->ipo->cur.ymin = v[2];
self->ipo->cur.ymax = v[3];
Py_INCREF (Py_None);
return Py_None;
}
static PyObject *
Ipo_getNcurves (BPy_Ipo * self)
{
int i = 0;
IpoCurve *icu;
for (icu = self->ipo->curve.first; icu; icu = icu->next)
{
i++;
}
return (PyInt_FromLong (i));
}
static PyObject *
Ipo_addCurve (BPy_Ipo * self, PyObject * args)
{
IpoCurve *get_ipocurve (ID * from, short type, int adrcode, Ipo * useipo);
void allspace (unsigned short event, short val);
void allqueue (unsigned short event, short val);
int param = 0, ok = 0;
char *s = 0;
IpoCurve *icu;
Link *link;
struct Object *object = NULL;
if (!PyArg_ParseTuple (args, "s", &s))
return (EXPP_ReturnPyObjError
(PyExc_TypeError, "expected string argument"));
/* insertkey demande un pointeur sur l'objet pour lequel on veut ajouter
une courbe IPO */
link = G.main->object.first;
while (link)
{
object = (Object *) link;
if (object->ipo == self->ipo)
break;
link = link->next;
}
/* todo : what kind of object....
#define GS(a) (*((short *)(a)))
printf("object %p\n",object);
printf("type %d\n",GS(object->id.name));
*/
if (!strcmp (s, "LocX"))
{
param = OB_LOC_X;
ok = 1;
}
if (!strcmp (s, "LocY"))
{
param = OB_LOC_Y;
ok = 1;
}
if (!strcmp (s, "LocZ"))
{
param = OB_LOC_Z;
ok = 1;
}
if (!strcmp (s, "RotX"))
{
param = OB_ROT_X;
ok = 1;
}
if (!strcmp (s, "RotY"))
{
param = OB_ROT_Y;
ok = 1;
}
if (!strcmp (s, "RotZ"))
{
param = OB_ROT_Z;
ok = 1;
}
if (!strcmp (s, "SizeX"))
{
param = OB_SIZE_X;
ok = 1;
}
if (!strcmp (s, "SizeY"))
{
param = OB_SIZE_Y;
ok = 1;
}
if (!strcmp (s, "SizeZ"))
{
param = OB_SIZE_Z;
ok = 1;
}
if (!strcmp (s, "DLocX"))
{
param = OB_DLOC_X;
ok = 1;
}
if (!strcmp (s, "DLocY"))
{
param = OB_DLOC_Y;
ok = 1;
}
if (!strcmp (s, "DLocZ"))
{
param = OB_DLOC_Z;
ok = 1;
}
if (!strcmp (s, "DRotX"))
{
param = OB_DROT_X;
ok = 1;
}
if (!strcmp (s, "DRotY"))
{
param = OB_DROT_Y;
ok = 1;
}
if (!strcmp (s, "DRotZ"))
{
param = OB_DROT_Z;
ok = 1;
}
if (!strcmp (s, "DSizeX"))
{
param = OB_DSIZE_X;
ok = 1;
}
if (!strcmp (s, "DSizeY"))
{
param = OB_DSIZE_Y;
ok = 1;
}
if (!strcmp (s, "DSizeZ"))
{
param = OB_DSIZE_Z;
ok = 1;
}
if (!strcmp (s, "Layer"))
{
param = OB_LAY;
ok = 1;
}
if (!strcmp (s, "Time"))
{
param = OB_TIME;
ok = 1;
}
if (!strcmp (s, "ColR"))
{
param = OB_COL_R;
ok = 1;
}
if (!strcmp (s, "ColG"))
{
param = OB_COL_G;
ok = 1;
}
if (!strcmp (s, "ColB"))
{
param = OB_COL_B;
ok = 1;
}
if (!strcmp (s, "ColA"))
{
param = OB_COL_A;
ok = 1;
}
if (!ok)
return (EXPP_ReturnPyObjError (PyExc_ValueError, "Not a valid param."));
icu = get_ipocurve (&(object->id), ID_OB, param, 0);
#define REMAKEIPO 1
#define REDRAWIPO 0x4023
allspace (REMAKEIPO, 0);
allqueue (REDRAWIPO, 0);
return IpoCurve_CreatePyObject (icu);
}
static PyObject *
Ipo_getCurve (BPy_Ipo * self, PyObject * args)
{
//int num = 0 , i = 0;
char *str;
IpoCurve *icu = 0;
if (!PyArg_ParseTuple (args, "s", &str))
return (EXPP_ReturnPyObjError
(PyExc_TypeError, "expected string argument"));
for (icu = self->ipo->curve.first; icu; icu = icu->next)
{
char str1[80];
GetIpoCurveName (icu, str1);
if (!strcmp (str1, str))
return IpoCurve_CreatePyObject (icu);
}
Py_INCREF (Py_None);
return Py_None;
}
void
GetIpoCurveName (IpoCurve * icu, char *s)
{
switch (icu->blocktype)
{
case ID_MA:
{
getname_mat_ei (icu->adrcode, s);
break;
}
case ID_WO:
{
getname_world_ei (icu->adrcode, s);
break;
}
case ID_CA:
{
getname_cam_ei (icu->adrcode, s);
break;
}
case ID_OB:
{
getname_ob_ei (icu->adrcode, s);
break;
}
}
}
static PyObject *
Ipo_getCurves (BPy_Ipo * self)
{
PyObject *attr = PyList_New (0);
IpoCurve *icu;
for (icu = self->ipo->curve.first; icu; icu = icu->next)
{
PyList_Append (attr, IpoCurve_CreatePyObject (icu));
}
return attr;
}
static PyObject *
Ipo_getNBezPoints (BPy_Ipo * self, PyObject * args)
{
int num = 0, i = 0;
IpoCurve *icu = 0;
if (!PyArg_ParseTuple (args, "i", &num))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
icu = self->ipo->curve.first;
if (!icu)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "No IPO curve"));
for (i = 0; i < num; i++)
{
if (!icu)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "Bad curve number"));
icu = icu->next;
}
return (PyInt_FromLong (icu->totvert));
}
static PyObject *
Ipo_DeleteBezPoints (BPy_Ipo * self, PyObject * args)
{
int num = 0, i = 0;
IpoCurve *icu = 0;
if (!PyArg_ParseTuple (args, "i", &num))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
icu = self->ipo->curve.first;
if (!icu)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "No IPO curve"));
for (i = 0; i < num; i++)
{
if (!icu)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "Bad curve number"));
icu = icu->next;
}
icu->totvert--;
return (PyInt_FromLong (icu->totvert));
}
static PyObject *
Ipo_getCurveBP (BPy_Ipo * self, PyObject * args)
{
struct BPoint *ptrbpoint;
int num = 0, i;
IpoCurve *icu;
PyObject *l;
if (!PyArg_ParseTuple (args, "i", &num))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
icu = self->ipo->curve.first;
if (!icu)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "No IPO curve"));
for (i = 0; i < num; i++)
{
if (!icu)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "Bad curve number"));
icu = icu->next;
}
ptrbpoint = icu->bp;
if (!ptrbpoint)
return EXPP_ReturnPyObjError (PyExc_TypeError, "No base point");
l = PyList_New (0);
for (i = 0; i < 4; i++)
PyList_Append (l, PyFloat_FromDouble (ptrbpoint->vec[i]));
return l;
}
static PyObject *
Ipo_getCurveBeztriple (BPy_Ipo * self, PyObject * args)
{
struct BezTriple *ptrbt;
int num = 0, pos, i, j;
IpoCurve *icu;
PyObject *l = PyList_New (0);
if (!PyArg_ParseTuple (args, "ii", &num, &pos))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
icu = self->ipo->curve.first;
if (!icu)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "No IPO curve"));
for (i = 0; i < num; i++)
{
if (!icu)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "Bad ipo number"));
icu = icu->next;
}
if (pos >= icu->totvert)
return EXPP_ReturnPyObjError (PyExc_TypeError, "Bad bezt number");
ptrbt = icu->bezt + pos;
if (!ptrbt)
return EXPP_ReturnPyObjError (PyExc_TypeError, "No bez triple");
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
PyList_Append (l, PyFloat_FromDouble (ptrbt->vec[i][j]));
return l;
}
static PyObject *
Ipo_setCurveBeztriple (BPy_Ipo * self, PyObject * args)
{
struct BezTriple *ptrbt;
int num = 0, pos, i;
IpoCurve *icu;
PyObject *listargs = 0;
if (!PyArg_ParseTuple (args, "iiO", &num, &pos, &listargs))
return (EXPP_ReturnPyObjError
(PyExc_TypeError, "expected int int object argument"));
if (!PyTuple_Check (listargs))
return (EXPP_ReturnPyObjError
(PyExc_TypeError, "3rd arg should be a tuple"));
icu = self->ipo->curve.first;
if (!icu)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "No IPO curve"));
for (i = 0; i < num; i++)
{
if (!icu)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "Bad ipo number"));
icu = icu->next;
}
if (pos >= icu->totvert)
return EXPP_ReturnPyObjError (PyExc_TypeError, "Bad bezt number");
ptrbt = icu->bezt + pos;
if (!ptrbt)
return EXPP_ReturnPyObjError (PyExc_TypeError, "No bez triple");
for (i = 0; i < 9; i++)
{
PyObject *xx = PyTuple_GetItem (listargs, i);
ptrbt->vec[i / 3][i % 3] = PyFloat_AsDouble (xx);
}
Py_INCREF (Py_None);
return Py_None;
}
static PyObject *
Ipo_EvaluateCurveOn (BPy_Ipo * self, PyObject * args)
{
float eval_icu (IpoCurve * icu, float ipotime);
int num = 0, i;
IpoCurve *icu;
float time = 0;
if (!PyArg_ParseTuple (args, "if", &num, &time))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
icu = self->ipo->curve.first;
if (!icu)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "No IPO curve"));
for (i = 0; i < num; i++)
{
if (!icu)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "Bad ipo number"));
icu = icu->next;
}
return PyFloat_FromDouble (eval_icu (icu, time));
}
static PyObject *
Ipo_getCurvecurval (BPy_Ipo * self, PyObject * args)
{
int numcurve = 0, i;
IpoCurve *icu;
char *stringname = 0;
icu = self->ipo->curve.first;
if (!icu)
return (EXPP_ReturnPyObjError (PyExc_TypeError, "No IPO curve"));
if (PyNumber_Check (PySequence_GetItem (args, 0))) // args is an integer
{
if (!PyArg_ParseTuple (args, "i", &numcurve))
return (EXPP_ReturnPyObjError
(PyExc_TypeError, "expected int or string argument"));
for (i = 0; i < numcurve; i++)
{
if (!icu)
return (EXPP_ReturnPyObjError
(PyExc_TypeError, "Bad ipo number"));
icu = icu->next;
}
}
else // args is a string
{
if (!PyArg_ParseTuple (args, "s", &stringname))
return (EXPP_ReturnPyObjError
(PyExc_TypeError, "expected int or string argument"));
while (icu)
{
char str1[10];
GetIpoCurveName (icu, str1);
if (!strcmp (str1, stringname))
break;
icu = icu->next;
}
}
if (icu)
return PyFloat_FromDouble (icu->curval);
Py_INCREF (Py_None);
return Py_None;
}
/*****************************************************************************/
/* Function: IpoDeAlloc */
/* Description: This is a callback function for the BPy_Ipo type. It is */
/* the destructor function. */
/*****************************************************************************/
static void
IpoDeAlloc (BPy_Ipo * self)
{
PyObject_DEL (self);
}
/*****************************************************************************/
/* Function: IpoGetAttr */
/* Description: This is a callback function for the BPy_Ipo type. It is */
/* the function that accesses BPy_Ipo "member variables" and */
/* methods. */
/*****************************************************************************/
static PyObject *
IpoGetAttr (BPy_Ipo * self, char *name)
{
if (strcmp (name, "curves") == 0)
return Ipo_getCurves (self);
return Py_FindMethod (BPy_Ipo_methods, (PyObject *) self, name);
}
/*****************************************************************************/
/* Function: IpoSetAttr */
/* Description: This is a callback function for the BPy_Ipo type. It is the */
/* function that sets Ipo Data attributes (member variables).*/
/*****************************************************************************/
static int
IpoSetAttr (BPy_Ipo * self, char *name, PyObject * value)
{
return 0; /* normal exit */
}
/*****************************************************************************/
/* Function: IpoRepr */
/* Description: This is a callback function for the BPy_Ipo type. It */
/* builds a meaninful string to represent ipo objects. */
/*****************************************************************************/
static PyObject *
IpoRepr (BPy_Ipo * self)
{
return PyString_FromFormat ("[Ipo \"%s\" %d]", self->ipo->id.name + 2,
self->ipo->blocktype);
}
/* Three Python Ipo_Type helper functions needed by the Object module: */
/*****************************************************************************/
/* Function: Ipo_CreatePyObject */
/* Description: This function will create a new BPy_Ipo from an existing */
/* Blender ipo structure. */
/*****************************************************************************/
PyObject *
Ipo_CreatePyObject (Ipo * ipo)
{
BPy_Ipo *pyipo;
pyipo = (BPy_Ipo *) PyObject_NEW (BPy_Ipo, &Ipo_Type);
if (!pyipo)
return EXPP_ReturnPyObjError (PyExc_MemoryError,
"couldn't create BPy_Ipo object");
pyipo->ipo = ipo;
return (PyObject *) pyipo;
}
/*****************************************************************************/
/* Function: Ipo_CheckPyObject */
/* Description: This function returns true when the given PyObject is of the */
/* type Ipo. Otherwise it will return false. */
/*****************************************************************************/
int
Ipo_CheckPyObject (PyObject * pyobj)
{
return (pyobj->ob_type == &Ipo_Type);
}
/*****************************************************************************/
/* Function: Ipo_FromPyObject */
/* Description: This function returns the Blender ipo from the given */
/* PyObject. */
/*****************************************************************************/
Ipo *
Ipo_FromPyObject (PyObject * pyobj)
{
return ((BPy_Ipo *) pyobj)->ipo;
}