[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