[Bf-python] getMatrix('worldspace') patch for bf-blender
Joseph Gilbert
models at paposo.com
Sat Jun 26 05:15:51 CEST 2004
This will work with a single getMatrix() function:
if (StringEqual (name, "mat") || StringEqual (name, "matrix"))
return (Object_getMatrix (obj, Py_BuildValue("(s)","localspace")));
if (StringEqual (name, "matrixWorld"))
return (Object_getMatrix (obj, Py_BuildValue("(s)","worldspace")));
if (StringEqual (name, "matrixLocal"))
return (Object_getMatrix (obj, Py_BuildValue("(s)","localspace")));
The cvars mat/matrix do the same as now and the new cvars matrixWorld and
matrixLocal return world/local matrix.
static PyObject *Object_getMatrix (BPy_Object *self, PyObject *args)
{
PyObject *matrix;
char *space = "localespace"; /* default to locale */
if (!PyArg_ParseTuple(args, "|s", &space)){
return (EXPP_ReturnPyObjError (PyExc_AttributeError,
"expected a string or nothing"));
}
//new matrix
matrix = newMatrixObject(NULL, 4, 4);
if (BLI_streq(space, "worldspace")){ /* Worldspace matrix */
where_is_object(self->object);
Mat4CpyMat4(*((MatrixObject*)matrix)->matrix, self->object->obmat);
} else if (BLI_streq(space, "localespace")) { /* Localespace matrix*/
object_to_mat4(self->object, *((MatrixObject*)matrix)->matrix);
} else {
return (EXPP_ReturnPyObjError (PyExc_RuntimeError,
"correct spaces are 'worldspace' and 'localespace', none defaults to
localespace"));
}
return matrix;
}
Oh, by the way locale is the english spelling!!! :) In my neck of the wood
we call it localspace. *_*
-----Original Message-----
From: bf-python-admin at blender.org [mailto:bf-python-admin at blender.org]On
Behalf Of Campbell Barton
Sent: Friday, June 25, 2004 10:02 PM
To: bf-python at blender.org
Subject: Re: [Bf-python] getMatrix('worldspace') patch for bf-blender
How about this?
/* This is only used by the wrapper function Object_getMatrix */
static PyObject *Object_getMatrixLocalespace (BPy_Object *self)
{
PyObject *matrix;
matrix = newMatrixObject(NULL, 4, 4);
object_to_mat4(self->object, *((MatrixObject*)matrix)->matrix);
return matrix;
}
/* This is only used by the wrapper function Object_getMatrix */
static PyObject *Object_getMatrixWorldspace (BPy_Object *self)
{
PyObject *matrix;
where_is_object(self->object);
matrix = newMatrixObject(NULL, 4, 4);
Mat4CpyMat4(*((MatrixObject*)matrix)->matrix,
self->object->obmat);
return matrix;
}
static PyObject *Object_getMatrix (BPy_Object *self, PyObject *args)
{
char *space = "localespace"; /* default to locale */
if (!PyArg_ParseTuple(args, "|s", &space))
{
return (EXPP_ReturnPyObjError (PyExc_AttributeError,
"expected a string or nothing"));
}
if (BLI_streq(space, "worldspace")) { /* Worldspace matrix */
return (Object_getMatrixWorldspace (self));
} else if (BLI_streq(space, "localespace")) { /* Localespace matrix */
return (Object_getMatrixLocalespace (self));
} else {
return (EXPP_ReturnPyObjError (PyExc_RuntimeError,
"correct spaces are 'worldspace' and 'localespace', none
defaults to localespace"));
}
}
Campbell Barton wrote:
> Hi Yall
> This is a bigger issue then I expected.
>
> getLocation(), getMatrix, getScale, getRot all can have the
> 'worldspace' option BUT.
>
> what happens to the class variables?
>
> they need to sent an arg to the functions above.
>
> I made it so they sent a null python object and made getMatrix account
> for this but its a messy solution.
>
> Another solution could be to use a wrapper function, this would work
> cleanly for all functions above.
>
>
> getMatrix(ob, arg)
> {
> if (arg == worldspace) {
> return getMatrixWorldSpace(ob);
> } elif (arg == localespace) {
> return getMatrixLocaleSpace(ob);
> }
> }
>
>
> getMatrixWorldSpace(ob)
> {
> ... do the real stuff here
> }
>
>
> getMatrixLocaleSpace(ob)
> {
> ... do the real stuff here
> }
>
>
>
>
> Campbell Barton wrote:
>
>> Hi, have you compiled this?
>>
>> if (StringEqual (name, "mat"))
>> return (Object_getMatrix (obj));
>> if (StringEqual (name, "matrix"))
>> return (Object_getMatrix (obj));
>>
>> This wont work since the new Object_getMatrix wants 2 args.
>> Object_getMatrix (obj, PyArgs)
>>
>> Even if the arg is an empty python object it needs to be there.
>> As I sead b4, I dobnt know how to do this.
>>
>> I need to create an empty Python arg and the problem will be solved.
>>
>> - Cam
>>
>>
>>
>>
>> Gilbert, Joseph wrote:
>>
>>> Hi, :)
>>> Looks good but I don't think it's necessary to have an internal
>>> function because the getMatrix() will be backwards compatible anyway
>>> (when no arg is used). The extra stringcompare functions in getattr
>>> will
>>> never get called. Everything minus the internal function is perfect :)
>>> Oh, I was thinking that this also needs to be done on the bone module
>>> for rot/loc/size I think. Not sure where else this is applicable.
>>>
>>> static PyObject *Object_getMatrix (BPy_Object *self, PyObject *args);
>>> ....
>>> {"getMatrix", (PyCFunction)Object_getMatrix, METH_VARARGS,"Returns the
>>> object matrix"},
>>> .....
>>> static PyObject *Object_getMatrix (BPy_Object *self, PyObject *args)
>>> {
>>> PyObject *matrix;
>>> char *space = "localespace"; /* default to locale */
>>> if (!PyArg_ParseTuple(args, "|s", &space))
>>> {
>>> return (EXPP_ReturnPyObjError (PyExc_AttributeError,
>>> "expected a string or nothing"));
>>> }
>>> matrix = newMatrixObject(NULL, 4, 4);
>>> if (BLI_streq(space, "worldspace")) /* Worldspace
>>> matrix */
>>> {
>>> where_is_object(self->object);
>>> Mat4CpyMat4(*((MatrixObject*)matrix)->matrix,
>>> self->object->obmat);
>>> } else if (BLI_streq(space, "localespace")) { /* Localespace matrix
>>> */
>>> object_to_mat4(self->object, *((MatrixObject*)matrix)->matrix);
>>> } else {
>>> return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "correct
>>> spaces are 'worldspace' and 'localespace', none defaults to
>>> localespace"));
>>> }
>>> return matrix;
>>> }
>>> ....
>>> if (StringEqual (name, "mat"))
>>> return (Object_getMatrix (obj));
>>> if (StringEqual (name, "matrix"))
>>> return (Object_getMatrix (obj));
>>> ....
>>>
>>> _______________________________________________
>>> Bf-python mailing list
>>> Bf-python at blender.org
>>> http://www.blender.org/mailman/listinfo/bf-python
>>>
>>>
>>>
>>>
>>
>>
>> _______________________________________________
>> Bf-python mailing list
>> Bf-python at blender.org
>> http://www.blender.org/mailman/listinfo/bf-python
>>
>>
>
>
--
Campbell J Barton
133 Hope Street
Geelong West, Victoria 3218 Australia
URL: http://www.metavr.com
e-mail: cbarton at metavr.com
phone: AU (03) 5229 0241
_______________________________________________
Bf-python mailing list
Bf-python at blender.org
http://www.blender.org/mailman/listinfo/bf-python
More information about the Bf-python
mailing list