several bug fixes

This commit is contained in:
2003-06-21 20:44:44 +00:00
parent e4bbc590a4
commit 9392d5662a
4 changed files with 204 additions and 656 deletions

View File

@@ -31,10 +31,6 @@
#include "Metaball.h"
#ifndef FP_INFINITE
#define FP_INFINITE 1
#endif
/*****************************************************************************/
/* Function: M_Metaball_New */
/* Python equivalent: Blender.Metaball.New */
@@ -114,26 +110,19 @@ static PyObject *M_Metaball_Get(PyObject *self, PyObject *args)
}
else { /* () - return a list of all mballs in the scene */
int index = 0;
PyObject *mballlist, *pyobj;
PyObject *mballlist;
mballlist = PyList_New (BLI_countlist (&(G.main->mball)));
mballlist = PyList_New (0);
if (mballlist == NULL)
return (PythonReturnErrorObject (PyExc_MemoryError,
"couldn't create PyList"));
while (mball_iter) {
pyobj = Metaball_CreatePyObject (mball_iter);
if (!pyobj)
return (PythonReturnErrorObject (PyExc_MemoryError,
"couldn't create PyString"));
PyList_SET_ITEM (mballlist, index, pyobj);
C_Metaball *found_mball=(C_Metaball*)PyObject_NEW(C_Metaball,&Metaball_Type);
found_mball->metaball = mball_iter;
PyList_Append (mballlist, (PyObject *)found_mball);
mball_iter = mball_iter->id.next;
index++;
}
return (mballlist);
@@ -148,8 +137,7 @@ PyObject *M_Metaball_Init (void)
{
PyObject *submodule;
Metaball_Type.ob_type = &PyType_Type;
Metaball_Type.ob_type = &PyType_Type;
printf ("In M_Metaball_Init()\n");
submodule = Py_InitModule3("Blender.Metaball",
M_Metaball_methods, M_Metaball_doc);
@@ -219,18 +207,6 @@ static PyObject *Metaball_getNMetaElems(C_Metaball *self)
return (PyInt_FromLong(i) );
}
static PyObject *Metaball_getNMetaElems1(C_Metaball *self)
{
int i = 0;
MetaElem*ptr = self->metaball->disp.first;
if(!ptr) return (PyInt_FromLong(0) );
while(ptr)
{
i++;
ptr = ptr->next;
}
return (PyInt_FromLong(i) );
}
static PyObject *Metaball_getloc(C_Metaball *self)
@@ -244,18 +220,18 @@ static PyObject *Metaball_getloc(C_Metaball *self)
static PyObject *Metaball_setloc(C_Metaball *self,PyObject*args)
{
float val[3];
if (!PyArg_ParseTuple(args, "fff", val,val+1,val+2))
return (EXPP_ReturnPyObjError(PyExc_TypeError,"expected three float args"));
self->metaball->loc[0] = val[0];
self->metaball->loc[1] = val[1];
self->metaball->loc[2] = val[2];
PyObject *listargs=0;
int i;
if (!PyArg_ParseTuple(args, "O", &listargs))
return (EXPP_ReturnPyObjError(PyExc_TypeError,"expected a list"));
if (!PyList_Check(listargs))
return (EXPP_ReturnPyObjError(PyExc_TypeError,"expected a list"));
for(i=0;i<3;i++){
PyObject * xx = PyList_GetItem(listargs,i);
self->metaball->loc[i] = PyFloat_AsDouble(xx);
}
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *Metaball_getrot(C_Metaball *self)
@@ -269,18 +245,18 @@ static PyObject *Metaball_getrot(C_Metaball *self)
static PyObject *Metaball_setrot(C_Metaball *self,PyObject*args)
{
float val[3];
if (!PyArg_ParseTuple(args, "fff", val,val+1,val+2))
return (EXPP_ReturnPyObjError (PyExc_TypeError,"expected three float args"));
self->metaball->rot[0] = val[0];
self->metaball->rot[1] = val[1];
self->metaball->rot[2] = val[2];
PyObject *listargs=0;
int i;
if (!PyArg_ParseTuple(args, "O", &listargs))
return (EXPP_ReturnPyObjError(PyExc_TypeError,"expected a list"));
if (!PyList_Check(listargs))
return (EXPP_ReturnPyObjError(PyExc_TypeError,"expected a list"));
for(i=0;i<3;i++){
PyObject * xx = PyList_GetItem(listargs,i);
self->metaball->rot[i] = PyFloat_AsDouble(xx);
}
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *Metaball_getsize(C_Metaball *self)
@@ -294,19 +270,20 @@ static PyObject *Metaball_getsize(C_Metaball *self)
static PyObject *Metaball_setsize(C_Metaball *self,PyObject*args)
{
float val[3];
if (!PyArg_ParseTuple(args, "fff", val,val+1,val+2))
return (EXPP_ReturnPyObjError (PyExc_TypeError,"expected three float args"));
self->metaball->size[0] = val[0];
self->metaball->size[1] = val[1];
self->metaball->size[2] = val[2];
PyObject *listargs=0;
int i;
if (!PyArg_ParseTuple(args, "O", &listargs))
return (EXPP_ReturnPyObjError(PyExc_TypeError,"expected a list"));
if (!PyList_Check(listargs))
return (EXPP_ReturnPyObjError(PyExc_TypeError,"expected a list"));
for(i=0;i<3;i++){
PyObject * xx = PyList_GetItem(listargs,i);
self->metaball->size[i] = PyFloat_AsDouble(xx);
}
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *Metaball_getWiresize(C_Metaball *self)
{
return PyFloat_FromDouble(self->metaball->wiresize);
@@ -389,14 +366,6 @@ static PyObject *Metaball_getMetadata(C_Metaball *self,PyObject*args)
}
if(!strcmp(name,"type"))
return (PyInt_FromLong(ptr->type));
if(!strcmp(name,"lay"))
return (PyInt_FromLong(ptr->lay));
if(!strcmp(name,"selcol"))
return (PyInt_FromLong(ptr->selcol));
if(!strcmp(name,"flag"))
return (PyInt_FromLong(ptr->flag));
if(!strcmp(name,"pad"))
return (PyInt_FromLong(ptr->pad));
if(!strcmp(name,"x"))
return (PyFloat_FromDouble(ptr->x));
if(!strcmp(name,"y"))
@@ -417,11 +386,6 @@ static PyObject *Metaball_getMetadata(C_Metaball *self,PyObject*args)
return (PyFloat_FromDouble(ptr->s));
if(!strcmp(name,"len"))
return (PyFloat_FromDouble(ptr->len));
if(!strcmp(name,"maxrad2"))
return (PyFloat_FromDouble(ptr->maxrad2));
return (EXPP_ReturnPyObjError (PyExc_TypeError, "unknown name "));
}
@@ -435,19 +399,12 @@ static PyObject *Metaball_setMetadata(C_Metaball *self,PyObject*args)
char*name = NULL;
int intval=-1;
float floatval=FP_INFINITE;
int ok = 0;
MetaElem *ptr;
/* XXX: This won't work. PyArg_ParseTuple will unpack 'args' in its first
* call, so it can't be called again. Better get the value as a float then
* compare it with its int part and, if equal, consider it an int. Note
* that 'ok' isn't used in this function at all, whatever it was meant for */
if (PyArg_ParseTuple(args, "sii", &name,&num,&intval))ok=1;
if (PyArg_ParseTuple(args, "sif", &name,&num,&floatval)) ok = 2;
if (!ok)
if (!PyArg_ParseTuple(args, "sif", &name,&num,&floatval))
return (EXPP_ReturnPyObjError (PyExc_TypeError, \
"expected string,int,int or float arguments"));
if (floatval == FP_INFINITE) floatval = (float)intval;
"expected string,int,int float arguments"));
intval = (int)floatval;
/*jump to the num-th MetaElem*/
ptr = self->metaball->elems.first;
if(!ptr)
@@ -460,15 +417,7 @@ return (EXPP_ReturnPyObjError (PyExc_TypeError, \
}
if(!strcmp(name,"type"))
{ptr->type=intval;return (PyInt_FromLong(intval));}
if(!strcmp(name,"lay"))
{ptr->lay=intval;return (PyInt_FromLong(intval));}
if(!strcmp(name,"selcol"))
{ptr->selcol=intval;return (PyInt_FromLong(intval));}
if(!strcmp(name,"flag"))
{ptr->flag=intval;return (PyInt_FromLong(intval));}
if(!strcmp(name,"pad"))
{ptr->pad=intval;return (PyInt_FromLong(intval));}
if(!strcmp(name,"x"))
{ptr->x=floatval;return (PyFloat_FromDouble(floatval));}
if(!strcmp(name,"y"))
@@ -489,12 +438,8 @@ return (EXPP_ReturnPyObjError (PyExc_TypeError, \
{ptr->s=floatval;return (PyFloat_FromDouble(floatval));}
if(!strcmp(name,"len"))
{ptr->len=floatval;return (PyFloat_FromDouble(floatval));}
if(!strcmp(name,"maxrad2"))
{ptr->maxrad2=floatval;return (PyFloat_FromDouble(floatval));}
return (EXPP_ReturnPyObjError (PyExc_TypeError, "unknown name "));
return (EXPP_ReturnPyObjError (PyExc_TypeError, "unknown field "));
}
static PyObject *Metaball_getMetatype(C_Metaball *self,PyObject*args)
@@ -527,121 +472,6 @@ static PyObject *Metaball_setMetatype(C_Metaball *self,PyObject*args)
}
static PyObject *Metaball_getMetalay(C_Metaball *self,PyObject*args)
{
int num;
int i = 0;
MetaElem*ptr = self->metaball->elems.first;
if (!PyArg_ParseTuple(args, "i", &num))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
if(!ptr) return (PyInt_FromLong(0));
for(i = 0;i<num;i++){ptr = ptr->next;}
return (PyInt_FromLong(ptr->lay));
}
static PyObject *Metaball_setMetalay(C_Metaball *self,PyObject*args)
{
int num,val, i = 0;
MetaElem*ptr = self->metaball->elems.first;
if (!PyArg_ParseTuple(args, "ii", &num,&val))
return (EXPP_ReturnPyObjError(PyExc_TypeError,"expected int int arguments"));
if(!ptr) return (EXPP_ReturnPyObjError (PyExc_TypeError, "No MetaElem"));
for(i = 0;i<num;i++){ptr = ptr->next;}
ptr->lay = val;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *Metaball_getMetaflag(C_Metaball *self,PyObject*args)
{
int num;
int i = 0;
MetaElem*ptr = self->metaball->elems.first;
if (!PyArg_ParseTuple(args, "i", &num))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
if(!ptr) return (PyInt_FromLong(0));
for(i = 0;i<num;i++){ptr = ptr->next;}
return (PyInt_FromLong(ptr->flag));
}
static PyObject *Metaball_setMetaflag(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num,val, i = 0;
if (!PyArg_ParseTuple(args, "ii", &num,&val))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int int argnts"));
if(!ptr) return (EXPP_ReturnPyObjError (PyExc_TypeError, "No MetaElem"));
for(i = 0;i<num;i++){ptr = ptr->next;}
ptr->flag = val;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *Metaball_getMetaselcol(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num;
int i = 0;
if (!PyArg_ParseTuple(args, "i", &num))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
if(!ptr) return (PyInt_FromLong(0));
for(i = 0;i<num;i++){ptr = ptr->next;}
return (PyInt_FromLong(ptr->selcol));
}
static PyObject *Metaball_setMetaselcol(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num,val, i = 0;
if (!PyArg_ParseTuple(args, "ii", &num,&val))
return (EXPP_ReturnPyObjError(PyExc_TypeError,"expected int int arguments"));
if(!ptr) return (EXPP_ReturnPyObjError (PyExc_TypeError, "No MetaElem"));
for(i = 0;i<num;i++){ptr = ptr->next;}
ptr->selcol = val;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *Metaball_getMetapad(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num;
int i = 0;
if (!PyArg_ParseTuple(args, "i", &num))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
if(!ptr) return (PyInt_FromLong(0));
for(i = 0;i<num;i++){ptr = ptr->next;}
return (PyInt_FromLong(ptr->pad));
}
static PyObject *Metaball_setMetapad(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num,val, i = 0;
if (!PyArg_ParseTuple(args, "ii", &num,&val))
return (EXPP_ReturnPyObjError(PyExc_TypeError,"expected int int arguments"));
if(!ptr) return (EXPP_ReturnPyObjError (PyExc_TypeError, "No MetaElem"));
for(i = 0;i<num;i++){ptr = ptr->next;}
ptr->pad = val;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *Metaball_getMetax(C_Metaball *self,PyObject*args)
{
@@ -731,148 +561,6 @@ static PyObject *Metaball_setMetaz(C_Metaball *self,PyObject*args)
}
static PyObject *Metaball_getMetaexpx(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num;
int i = 0;
if (!PyArg_ParseTuple(args, "i", &num))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
if(!ptr) return (PyFloat_FromDouble(0));
for(i = 0;i<num;i++){ptr = ptr->next;}
return (PyFloat_FromDouble(ptr->expx));
}
static PyObject *Metaball_setMetaexpx(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num, i = 0;
float val;
if (!PyArg_ParseTuple(args, "if", &num,&val))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int float args"));
if(!ptr) return (EXPP_ReturnPyObjError (PyExc_TypeError, "No MetaElem"));
for(i = 0;i<num;i++){ptr = ptr->next;}
ptr->expx = val;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *Metaball_getMetaexpy(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num;
int i = 0;
if (!PyArg_ParseTuple(args, "i", &num))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
if(!ptr) return (PyFloat_FromDouble(0));
for(i = 0;i<num;i++){ptr = ptr->next;}
return (PyFloat_FromDouble(ptr->expy));
}
static PyObject *Metaball_setMetaexpy(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num, i = 0;
float val;
if (!PyArg_ParseTuple(args, "if", &num,&val))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int float argts"));
if(!ptr) return (EXPP_ReturnPyObjError (PyExc_TypeError, "No MetaElem"));
for(i = 0;i<num;i++){ptr = ptr->next;}
ptr->expy = val;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *Metaball_getMetaexpz(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num;
int i = 0;
if (!PyArg_ParseTuple(args, "i", &num))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
if(!ptr) return (PyFloat_FromDouble(0));
for(i = 0;i<num;i++){ptr = ptr->next;}
return (PyFloat_FromDouble(ptr->expz));
}
static PyObject *Metaball_setMetaexpz(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num, i = 0;
float val;
if (!PyArg_ParseTuple(args, "if", &num,&val))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int float argts"));
if(!ptr) return (EXPP_ReturnPyObjError (PyExc_TypeError, "No MetaElem"));
for(i = 0;i<num;i++){ptr = ptr->next;}
ptr->expz = val;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *Metaball_getMetarad(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num;
int i = 0;
if (!PyArg_ParseTuple(args, "i", &num))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
if(!ptr) return (PyFloat_FromDouble(0));
for(i = 0;i<num;i++){ptr = ptr->next;}
return (PyFloat_FromDouble(ptr->rad));
}
static PyObject *Metaball_setMetarad(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num, i = 0;
float val;
if (!PyArg_ParseTuple(args, "if", &num,&val))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int float args"));
if(!ptr) return (EXPP_ReturnPyObjError (PyExc_TypeError, "No MetaElem"));
for(i = 0;i<num;i++){ptr = ptr->next;}
ptr->rad = val;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *Metaball_getMetarad2(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num;
int i = 0;
if (!PyArg_ParseTuple(args, "i", &num))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
if(!ptr) return (PyFloat_FromDouble(0));
for(i = 0;i<num;i++){ptr = ptr->next;}
return (PyFloat_FromDouble(ptr->rad2));
}
static PyObject *Metaball_setMetarad2(C_Metaball *self,PyObject*args)
{
MetaElem*ptr = self->metaball->elems.first;
int num, i = 0;
float val;
if (!PyArg_ParseTuple(args, "if", &num,&val))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int float args"));
if(!ptr) return (EXPP_ReturnPyObjError (PyExc_TypeError, "No MetaElem"));
for(i = 0;i<num;i++){ptr = ptr->next;}
ptr->rad2 = val;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *Metaball_getMetas(C_Metaball *self,PyObject*args)
{
@@ -889,12 +577,10 @@ static PyObject *Metaball_getMetas(C_Metaball *self,PyObject*args)
static PyObject *Metaball_setMetas(C_Metaball *self,PyObject*args)
{
int num, i = 0;
MetaElem*ptr = self->metaball->elems.first;
float val;
MetaElem *ptr;
if (!PyArg_ParseTuple(args, "if", &num,&val))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int float args"));
ptr = self->metaball->elems.first;
if(!ptr) return (EXPP_ReturnPyObjError (PyExc_TypeError, "No MetaElem"));
for(i = 0;i<num;i++){ptr = ptr->next;}
ptr->s = val;
@@ -906,6 +592,9 @@ static PyObject *Metaball_setMetas(C_Metaball *self,PyObject*args)
static PyObject *Metaball_getMetalen(C_Metaball *self,PyObject*args)
{
int num;
@@ -940,38 +629,6 @@ static PyObject *Metaball_setMetalen(C_Metaball *self,PyObject*args)
static PyObject *Metaball_getMetamaxrad2(C_Metaball *self,PyObject*args)
{
int num;
int i = 0;
MetaElem *ptr;
if (!PyArg_ParseTuple(args, "i", &num))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int argument"));
ptr = self->metaball->elems.first;
if(!ptr) return (PyFloat_FromDouble(0));
for(i = 0;i<num;i++){ptr = ptr->next;}
return (PyFloat_FromDouble(ptr->maxrad2));
}
static PyObject *Metaball_setMetamaxrad2(C_Metaball *self,PyObject*args)
{
int num, i = 0;
float val;
MetaElem *ptr;
if (!PyArg_ParseTuple(args, "if", &num,&val))
return (EXPP_ReturnPyObjError (PyExc_TypeError, "expected int float args"));
ptr = self->metaball->elems.first;
if(!ptr) return (EXPP_ReturnPyObjError (PyExc_TypeError, "No MetaElem"));
for(i = 0;i<num;i++){ptr = ptr->next;}
ptr->maxrad2 = val;
Py_INCREF(Py_None);
return Py_None;
}
@@ -1004,6 +661,8 @@ static PyObject *MetaballGetAttr (C_Metaball *self, char *name)
if (strcmp (name, "name") == 0)return Metaball_getName (self);
if (strcmp (name, "rot") == 0)return Metaball_getrot (self);
if (strcmp (name, "loc") == 0)return Metaball_getloc (self);
if (strcmp (name, "size") == 0)return Metaball_getsize (self);
return Py_FindMethod(C_Metaball_methods, (PyObject *)self, name);
}
@@ -1031,7 +690,17 @@ static int MetaballSetAttr (C_Metaball *self, char *name, PyObject *value)
Metaball_setrot (self, valtuple);
return 0;
}
if (strcmp (name, "loc") == 0)
{
Metaball_setloc (self, valtuple);
return 0;
}
if (strcmp (name, "size") == 0)
{
Metaball_setsize (self, valtuple);
return 0;
}
return (EXPP_ReturnIntError (PyExc_KeyError,"attribute not found"));
}
@@ -1045,44 +714,3 @@ static PyObject *MetaballRepr (C_Metaball *self)
return PyString_FromString(self->metaball->id.name+2);
}
/* Three Python Metaball_Type helper functions needed by the Object module: */
/*****************************************************************************/
/* Function: Metaball_CreatePyObject */
/* Description: This function will create a new C_Metaball from an existing */
/* Blender metaball structure. */
/*****************************************************************************/
PyObject *Metaball_CreatePyObject (MetaBall *metaball)
{
C_Metaball *pymetaball;
pymetaball = (C_Metaball *)PyObject_NEW (C_Metaball, &Metaball_Type);
if (!pymetaball)
return EXPP_ReturnPyObjError (PyExc_MemoryError,
"couldn't create C_Metaball object");
pymetaball->metaball = metaball;
return (PyObject *)pymetaball;
}
/*****************************************************************************/
/* Function: Metaball_CheckPyObject */
/* Description: This function returns true when the given PyObject is of the */
/* type Metaball. Otherwise it will return false. */
/*****************************************************************************/
int Metaball_CheckPyObject (PyObject *pyobj)
{
return (pyobj->ob_type == &Metaball_Type);
}
/*****************************************************************************/
/* Function: Metaball_FromPyObject */
/* Description: This function returns the Blender metaball from the given */
/* PyObject. */
/*****************************************************************************/
MetaBall *Metaball_FromPyObject (PyObject *pyobj)
{
return ((C_Metaball *)pyobj)->metaball;
}