[Bf-python] getMatrix('worldspace') patch for bf-blender

Campbell Barton cbarton at metavr.com
Sat Jun 26 04:01:58 CEST 2004


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




More information about the Bf-python mailing list