2003-07-19 08:29:55 +00:00
|
|
|
/*
|
2004-04-07 22:42:02 +00:00
|
|
|
* $Id$
|
2003-07-19 08:29:55 +00:00
|
|
|
* ***** 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.
|
|
|
|
|
*
|
2005-06-13 19:15:02 +00:00
|
|
|
* Contributor(s): Jacques Guignot RIP 2005,
|
|
|
|
|
* Stephen Swaney
|
2003-07-19 08:29:55 +00:00
|
|
|
*
|
|
|
|
|
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
|
|
|
|
*/
|
|
|
|
|
|
2005-07-18 03:50:37 +00:00
|
|
|
#include "BezTriple.h" /*This must come first */
|
2005-12-17 04:57:48 +00:00
|
|
|
#include "DNA_ipo_types.h"
|
2003-07-19 08:29:55 +00:00
|
|
|
|
2005-07-18 03:50:37 +00:00
|
|
|
#include "MEM_guardedalloc.h"
|
2004-03-29 08:16:18 +00:00
|
|
|
#include "gen_utils.h"
|
2004-10-07 19:25:40 +00:00
|
|
|
|
2004-03-29 08:16:18 +00:00
|
|
|
|
2005-06-13 19:15:02 +00:00
|
|
|
/***************************************************************************
|
|
|
|
|
Python API function prototypes for the BezTriple module.
|
|
|
|
|
***************************************************************************/
|
2004-09-25 20:30:40 +00:00
|
|
|
static PyObject *M_BezTriple_New( PyObject * self, PyObject * args );
|
|
|
|
|
static PyObject *M_BezTriple_Get( PyObject * self, PyObject * args );
|
2004-03-29 08:16:18 +00:00
|
|
|
|
2005-06-13 19:15:02 +00:00
|
|
|
/*************************************
|
|
|
|
|
Doc strings for the BezTriple module
|
|
|
|
|
*************************************/
|
2004-03-29 08:16:18 +00:00
|
|
|
|
2005-06-13 19:15:02 +00:00
|
|
|
static char M_BezTriple_doc[] = "The Blender BezTriple module\n";
|
2004-03-29 08:16:18 +00:00
|
|
|
|
2005-06-13 19:15:02 +00:00
|
|
|
/****************************************************************************
|
|
|
|
|
Python BPy_BezTriple instance methods declarations:
|
|
|
|
|
****************************************************************************/
|
|
|
|
|
static PyObject *BezTriple_setPoints( BPy_BezTriple * self, PyObject * args );
|
|
|
|
|
static PyObject *BezTriple_getPoints( BPy_BezTriple * self );
|
|
|
|
|
static PyObject *BezTriple_getTriple( BPy_BezTriple * self );
|
|
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
|
Python BezTriple_Type callback function prototypes:
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
static void BezTripleDeAlloc( BPy_BezTriple * self );
|
|
|
|
|
static int BezTripleSetAttr( BPy_BezTriple * self, char *name, PyObject * v );
|
|
|
|
|
static PyObject *BezTripleGetAttr( BPy_BezTriple * self, char *name );
|
|
|
|
|
static PyObject *BezTripleRepr( BPy_BezTriple * self );
|
2005-07-18 03:50:37 +00:00
|
|
|
//static PyObject *BezTriple_Str( BPy_BezTriple * self );
|
2005-06-13 19:15:02 +00:00
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
|
Python method structure definition for Blender.BezTriple module:
|
|
|
|
|
****************************************************************************/
|
2004-03-29 08:16:18 +00:00
|
|
|
|
|
|
|
|
struct PyMethodDef M_BezTriple_methods[] = {
|
2004-09-25 20:30:40 +00:00
|
|
|
{"New", ( PyCFunction ) M_BezTriple_New, METH_VARARGS | METH_KEYWORDS,
|
|
|
|
|
0},
|
2005-06-13 19:15:02 +00:00
|
|
|
/* {"New", ( PyCFunction ) M_BezTriple_New, METH_O, 0}, */
|
2004-09-25 20:30:40 +00:00
|
|
|
{"Get", M_BezTriple_Get, METH_VARARGS, 0},
|
|
|
|
|
{"get", M_BezTriple_Get, METH_VARARGS, 0},
|
|
|
|
|
{NULL, NULL, 0, NULL}
|
2004-03-29 08:16:18 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
2005-06-13 19:15:02 +00:00
|
|
|
/* Python BPy_BezTriple methods table: */
|
2004-03-29 08:16:18 +00:00
|
|
|
/*****************************************************************************/
|
2005-06-13 19:15:02 +00:00
|
|
|
static PyMethodDef BPy_BezTriple_methods[] = {
|
2004-09-25 20:30:40 +00:00
|
|
|
/* name, method, flags, doc */
|
|
|
|
|
{"setPoints", ( PyCFunction ) BezTriple_setPoints, METH_VARARGS,
|
|
|
|
|
"(str) - Change BezTriple point coordinates"},
|
|
|
|
|
{"getPoints", ( PyCFunction ) BezTriple_getPoints, METH_NOARGS,
|
|
|
|
|
"() - return BezTriple knot point x and y coordinates"},
|
|
|
|
|
{"getTriple", ( PyCFunction ) BezTriple_getTriple, METH_NOARGS,
|
|
|
|
|
"() - return list of 3 floating point triplets. order is H1, knot, H2"},
|
|
|
|
|
{NULL, NULL, 0, NULL}
|
2004-03-29 08:16:18 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
2004-09-25 20:30:40 +00:00
|
|
|
/* Python BezTriple_Type structure definition: */
|
2004-03-29 08:16:18 +00:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
PyTypeObject BezTriple_Type = {
|
2005-06-13 19:15:02 +00:00
|
|
|
PyObject_HEAD_INIT( NULL ) /* required python macro */
|
|
|
|
|
0, /* ob_size */
|
2004-09-25 20:30:40 +00:00
|
|
|
"BezTriple", /* tp_name */
|
2005-06-13 19:15:02 +00:00
|
|
|
sizeof( BPy_BezTriple ), /* tp_basicsize */
|
2004-09-25 20:30:40 +00:00
|
|
|
0, /* tp_itemsize */
|
|
|
|
|
/* methods */
|
|
|
|
|
( destructor ) BezTripleDeAlloc, /* tp_dealloc */
|
|
|
|
|
0, /* tp_print */
|
|
|
|
|
( getattrfunc ) BezTripleGetAttr, /* tp_getattr */
|
|
|
|
|
( setattrfunc ) BezTripleSetAttr, /* tp_setattr */
|
|
|
|
|
0, /* tp_compare */
|
|
|
|
|
( reprfunc ) BezTripleRepr, /* tp_repr */
|
|
|
|
|
0, /* tp_as_number */
|
|
|
|
|
0, /* tp_as_sequence */
|
|
|
|
|
0, /* tp_as_mapping */
|
|
|
|
|
0, /* tp_as_hash */
|
2005-06-13 19:15:02 +00:00
|
|
|
0, /* tp_call */
|
|
|
|
|
0, /* ( reprfunc) BezTriple_Str, tp_str */
|
|
|
|
|
0, /* tp_getattro */
|
|
|
|
|
0, /* tp_setattro */
|
|
|
|
|
0, /* tp_as_buffer */
|
|
|
|
|
0, /* tp_flags */
|
2004-09-25 20:30:40 +00:00
|
|
|
0, /* tp_doc */
|
|
|
|
|
0, 0, 0, 0, 0, 0,
|
2005-06-13 19:15:02 +00:00
|
|
|
BPy_BezTriple_methods, /* tp_methods */
|
2004-09-25 20:30:40 +00:00
|
|
|
0, /* tp_members */
|
|
|
|
|
0, /* tm_getset */
|
|
|
|
|
0
|
2004-03-29 08:16:18 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2005-06-13 19:15:02 +00:00
|
|
|
/****************************************************************************
|
|
|
|
|
Function: M_BezTriple_New
|
|
|
|
|
Python equivalent: Blender.BezTriple.New
|
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
|
|
static PyObject *M_BezTriple_New( PyObject* self, PyObject * args )
|
2003-07-19 08:29:55 +00:00
|
|
|
{
|
2005-11-28 05:03:26 +00:00
|
|
|
float numbuf[9];
|
2005-06-13 19:15:02 +00:00
|
|
|
PyObject* in_args = NULL;
|
2006-01-01 15:50:53 +00:00
|
|
|
int length;
|
2005-06-13 19:15:02 +00:00
|
|
|
|
2006-01-01 15:50:53 +00:00
|
|
|
/* accept list, tuple, or 3 or 9 args (which better be floats) */
|
|
|
|
|
|
|
|
|
|
length = PyTuple_Size( args );
|
|
|
|
|
if( length == 3 || length == 9 )
|
|
|
|
|
in_args = args;
|
|
|
|
|
else if( !PyArg_ParseTuple( args, "|O", &in_args) )
|
|
|
|
|
goto TypeError;
|
2005-06-13 19:15:02 +00:00
|
|
|
|
|
|
|
|
if( !in_args ) {
|
2005-11-28 05:03:26 +00:00
|
|
|
numbuf[0] = 0.0f; numbuf[1] = 0.0f; numbuf[2] = 0.0f;
|
|
|
|
|
numbuf[3] = 0.0f; numbuf[4] = 0.0f; numbuf[5] = 0.0f;
|
|
|
|
|
numbuf[6] = 0.0f; numbuf[7] = 0.0f; numbuf[8] = 0.0f;
|
|
|
|
|
} else {
|
2006-01-01 15:50:53 +00:00
|
|
|
int i, length;
|
2005-11-28 05:03:26 +00:00
|
|
|
if( !PySequence_Check( in_args ) )
|
2006-01-01 15:50:53 +00:00
|
|
|
goto TypeError;
|
|
|
|
|
|
2005-11-28 05:03:26 +00:00
|
|
|
length = PySequence_Length( in_args );
|
2006-01-01 15:50:53 +00:00
|
|
|
if( length != 9 && length != 3 )
|
|
|
|
|
goto TypeError;
|
|
|
|
|
|
|
|
|
|
for(i=0; i<length; i++) {
|
|
|
|
|
PyObject *item, *pyfloat;
|
|
|
|
|
item=PySequence_ITEM(in_args, i);
|
|
|
|
|
if( !item )
|
|
|
|
|
goto TypeError;
|
|
|
|
|
pyfloat=PyNumber_Float(item);
|
|
|
|
|
Py_DECREF(item);
|
|
|
|
|
if( !pyfloat )
|
|
|
|
|
goto TypeError;
|
2006-01-03 16:27:34 +00:00
|
|
|
numbuf[i]=(float)PyFloat_AS_DOUBLE(pyfloat);
|
2006-01-01 15:50:53 +00:00
|
|
|
Py_DECREF(pyfloat);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( length == 3 ) {
|
2005-11-28 05:03:26 +00:00
|
|
|
numbuf[3] = numbuf[0]; numbuf[6] = numbuf[0];
|
|
|
|
|
numbuf[4] = numbuf[1]; numbuf[7] = numbuf[1];
|
|
|
|
|
numbuf[5] = numbuf[2]; numbuf[8] = numbuf[2];
|
2006-01-01 15:50:53 +00:00
|
|
|
}
|
2005-11-28 05:03:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return newBezTriple( numbuf );
|
2006-01-01 15:50:53 +00:00
|
|
|
|
|
|
|
|
TypeError:
|
|
|
|
|
return EXPP_ReturnPyObjError( PyExc_TypeError,
|
|
|
|
|
"expected sequence of 3 or 9 floats or nothing" );
|
2003-07-19 08:29:55 +00:00
|
|
|
}
|
|
|
|
|
|
2005-06-13 19:15:02 +00:00
|
|
|
/****************************************************************************
|
|
|
|
|
Function: M_BezTriple_Get
|
|
|
|
|
Python equivalent: Blender.BezTriple.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.
|
|
|
|
|
****************************************************************************/
|
2004-09-25 20:30:40 +00:00
|
|
|
static PyObject *M_BezTriple_Get( PyObject * self, PyObject * args )
|
2003-07-19 08:29:55 +00:00
|
|
|
{
|
2004-09-25 20:30:40 +00:00
|
|
|
return 0;
|
2003-07-19 08:29:55 +00:00
|
|
|
}
|
|
|
|
|
|
2005-06-13 19:15:02 +00:00
|
|
|
/****************************************************************************
|
|
|
|
|
Function: BezTripleDeAlloc
|
|
|
|
|
Description: This is a callback function for the BPy_BezTriple type. It is
|
|
|
|
|
the destructor function.
|
|
|
|
|
****************************************************************************/
|
|
|
|
|
static void BezTripleDeAlloc( BPy_BezTriple * self )
|
2003-07-19 08:29:55 +00:00
|
|
|
{
|
2005-06-13 19:15:02 +00:00
|
|
|
|
|
|
|
|
if( self->own_memory)
|
|
|
|
|
MEM_freeN( self->beztriple );
|
|
|
|
|
|
2004-09-25 20:30:40 +00:00
|
|
|
PyObject_DEL( self );
|
2003-07-19 08:29:55 +00:00
|
|
|
}
|
|
|
|
|
|
2005-06-13 19:15:02 +00:00
|
|
|
static PyObject *BezTriple_getPoints( BPy_BezTriple * self )
|
2004-03-29 08:16:18 +00:00
|
|
|
{
|
2004-09-25 20:30:40 +00:00
|
|
|
struct BezTriple *bezt = self->beztriple;
|
|
|
|
|
PyObject *l = PyList_New( 0 );
|
|
|
|
|
int i;
|
|
|
|
|
for( i = 0; i < 2; i++ ) {
|
|
|
|
|
PyList_Append( l, PyFloat_FromDouble( bezt->vec[1][i] ) );
|
|
|
|
|
}
|
|
|
|
|
return l;
|
2003-07-19 08:29:55 +00:00
|
|
|
}
|
|
|
|
|
|
2003-07-21 00:08:30 +00:00
|
|
|
|
2004-04-06 21:13:12 +00:00
|
|
|
/*
|
|
|
|
|
* BezTriple_getTriple
|
|
|
|
|
*
|
|
|
|
|
* get the coordinate data for a BezTriple.
|
|
|
|
|
* returns a list of 3 points.
|
|
|
|
|
* list order is handle1, knot, handle2.
|
|
|
|
|
* each point consists of a list of x,y,z float values.
|
|
|
|
|
*/
|
|
|
|
|
|
2005-06-13 19:15:02 +00:00
|
|
|
static PyObject *BezTriple_getTriple( BPy_BezTriple * self )
|
2004-03-29 08:16:18 +00:00
|
|
|
{
|
2004-09-25 20:30:40 +00:00
|
|
|
int i;
|
|
|
|
|
struct BezTriple *bezt = self->beztriple;
|
|
|
|
|
PyObject *retlist = PyList_New( 0 );
|
|
|
|
|
PyObject *point;
|
2003-07-19 08:29:55 +00:00
|
|
|
|
2004-09-25 20:30:40 +00:00
|
|
|
for( i = 0; i < 3; i++ ) {
|
|
|
|
|
point = Py_BuildValue( "[fff]",
|
|
|
|
|
bezt->vec[i][0],
|
|
|
|
|
bezt->vec[i][1], bezt->vec[i][2] );
|
2004-03-29 08:16:18 +00:00
|
|
|
|
2004-09-25 20:30:40 +00:00
|
|
|
PyList_Append( retlist, point );
|
|
|
|
|
}
|
2004-03-29 08:16:18 +00:00
|
|
|
|
2004-09-25 20:30:40 +00:00
|
|
|
return retlist;
|
2004-03-29 08:16:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2005-06-13 19:15:02 +00:00
|
|
|
static PyObject *BezTriple_setPoints( BPy_BezTriple * self, PyObject * args )
|
2004-03-29 08:16:18 +00:00
|
|
|
{
|
2004-09-25 20:30:40 +00:00
|
|
|
int i;
|
|
|
|
|
struct BezTriple *bezt = self->beztriple;
|
|
|
|
|
PyObject *popo = 0;
|
|
|
|
|
|
2006-01-15 17:14:58 +00:00
|
|
|
if( !PyArg_ParseTuple( args, "O", &popo ) || !PySequence_Check( popo ) )
|
|
|
|
|
return EXPP_ReturnPyObjError( PyExc_TypeError,
|
|
|
|
|
"expected sequence argument" );
|
2004-09-25 20:30:40 +00:00
|
|
|
|
|
|
|
|
for( i = 0; i < 2; i++ ) {
|
2006-01-15 17:14:58 +00:00
|
|
|
PyObject *o = PySequence_ITEM( popo, i );
|
2005-07-18 03:50:37 +00:00
|
|
|
bezt->vec[1][i] = (float)PyFloat_AsDouble( o );
|
2004-09-25 20:30:40 +00:00
|
|
|
bezt->vec[0][i] = bezt->vec[1][i] - 1;
|
|
|
|
|
bezt->vec[2][i] = bezt->vec[1][i] + 1;
|
2006-01-15 17:14:58 +00:00
|
|
|
Py_DECREF( o );
|
2004-09-25 20:30:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* experimental fussing with handles - ipo.c: calchandles_ipocurve */
|
|
|
|
|
if( bezt->vec[0][0] > bezt->vec[1][0] )
|
|
|
|
|
bezt->vec[0][0] = bezt->vec[1][0];
|
|
|
|
|
|
|
|
|
|
if( bezt->vec[2][0] < bezt->vec[1][0] )
|
|
|
|
|
bezt->vec[2][0] = bezt->vec[1][0];
|
|
|
|
|
|
2006-01-15 17:14:58 +00:00
|
|
|
Py_RETURN_NONE;
|
2003-07-19 08:29:55 +00:00
|
|
|
}
|
|
|
|
|
|
2003-07-21 00:08:30 +00:00
|
|
|
|
2003-07-19 08:29:55 +00:00
|
|
|
/*****************************************************************************/
|
2004-09-25 20:30:40 +00:00
|
|
|
/* Function: BezTripleGetAttr */
|
2005-06-13 19:15:02 +00:00
|
|
|
/* Description: This is a callback function for the BPy_BezTriple type. It */
|
|
|
|
|
/* taccesses BPy_BezTriple "member variables" and methods. */
|
2003-07-19 08:29:55 +00:00
|
|
|
/*****************************************************************************/
|
2005-06-13 19:15:02 +00:00
|
|
|
static PyObject *BezTripleGetAttr( BPy_BezTriple * self, char *name )
|
2003-07-19 08:29:55 +00:00
|
|
|
{
|
2004-09-25 20:30:40 +00:00
|
|
|
if( strcmp( name, "pt" ) == 0 )
|
|
|
|
|
return BezTriple_getPoints( self );
|
|
|
|
|
else if( strcmp( name, "vec" ) == 0 )
|
|
|
|
|
return BezTriple_getTriple( self );
|
2005-06-13 19:15:02 +00:00
|
|
|
else if( strcmp( name, "tilt" ) == 0 )
|
|
|
|
|
return PyFloat_FromDouble(self->beztriple->alfa);
|
2005-12-17 04:57:48 +00:00
|
|
|
else if( strcmp( name, "hide" ) == 0 )
|
|
|
|
|
return PyFloat_FromDouble(self->beztriple->hide);
|
2005-06-13 19:15:02 +00:00
|
|
|
else if( strcmp( name, "__members__" ) == 0 )
|
|
|
|
|
return Py_BuildValue( "[s,s,s]", "pt", "vec", "tilt" );
|
2004-04-06 21:13:12 +00:00
|
|
|
|
2004-09-25 20:30:40 +00:00
|
|
|
/* look for default methods */
|
2005-06-13 19:15:02 +00:00
|
|
|
return Py_FindMethod( BPy_BezTriple_methods, ( PyObject * ) self, name );
|
2003-07-19 08:29:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
2004-09-25 20:30:40 +00:00
|
|
|
/* Function: BezTripleSetAttr */
|
2005-06-13 19:15:02 +00:00
|
|
|
/* Description: This is a callback function for the BPy_BezTriple type. It */
|
2004-09-25 20:30:40 +00:00
|
|
|
/* sets BezTriple Data attributes (member variables). */
|
2003-07-19 08:29:55 +00:00
|
|
|
/*****************************************************************************/
|
2005-06-13 19:15:02 +00:00
|
|
|
static int BezTripleSetAttr( BPy_BezTriple * self, char *name, PyObject * value )
|
2003-07-19 08:29:55 +00:00
|
|
|
{
|
2004-04-07 22:42:02 +00:00
|
|
|
#if 0
|
2004-09-25 20:30:40 +00:00
|
|
|
/*
|
|
|
|
|
this does not work at the moment: Wed Apr 7 2004
|
|
|
|
|
when the necessary code to make pt act like a sequence is
|
|
|
|
|
available, it will be reenabled
|
|
|
|
|
*/
|
2004-04-07 22:42:02 +00:00
|
|
|
|
2004-09-25 20:30:40 +00:00
|
|
|
if( strcmp( name, "pt" ) == 0 )
|
|
|
|
|
BezTriple_setPoints( self, value );
|
2004-04-07 22:42:02 +00:00
|
|
|
|
2004-09-25 20:30:40 +00:00
|
|
|
return 0; /* normal exit */
|
2004-04-07 22:42:02 +00:00
|
|
|
#endif
|
2005-12-17 04:57:48 +00:00
|
|
|
if( !strcmp( name, "hide" ) ) {
|
|
|
|
|
int param;
|
|
|
|
|
if( !PyInt_CheckExact( value ) )
|
|
|
|
|
return EXPP_ReturnIntError( PyExc_TypeError,
|
|
|
|
|
"expected int argument" );
|
|
|
|
|
|
|
|
|
|
param = (int)PyInt_AS_LONG( value );
|
|
|
|
|
self->beztriple->hide = (param == 0) ? 0 : IPO_BEZ;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
if( !strcmp( name, "tilt" ) ) {
|
2005-06-13 19:15:02 +00:00
|
|
|
if (!PyFloat_Check( value ) )
|
|
|
|
|
return EXPP_ReturnIntError( PyExc_TypeError, "expected a float" );
|
|
|
|
|
|
|
|
|
|
self->beztriple->alfa = (float)PyFloat_AsDouble( value );
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2004-04-07 22:42:02 +00:00
|
|
|
|
2005-12-17 04:57:48 +00:00
|
|
|
return EXPP_ReturnIntError( PyExc_AttributeError,
|
|
|
|
|
"cannot set a read-only attribute" );
|
2003-07-19 08:29:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/* Function: BezTripleRepr */
|
2005-06-13 19:15:02 +00:00
|
|
|
/* Description: This is a callback function for the BPy_BezTriple type. It */
|
2003-07-19 08:29:55 +00:00
|
|
|
/* builds a meaninful string to represent BezTriple objects. */
|
|
|
|
|
/*****************************************************************************/
|
2005-06-13 19:15:02 +00:00
|
|
|
static PyObject *BezTripleRepr( BPy_BezTriple * self )
|
2003-07-19 08:29:55 +00:00
|
|
|
{
|
2004-09-25 20:30:40 +00:00
|
|
|
/* float vec[3][3];
|
|
|
|
|
float alfa;
|
|
|
|
|
short s[3][2];
|
|
|
|
|
short h1, h2;
|
|
|
|
|
char f1, f2, f3, hide;
|
|
|
|
|
*/
|
|
|
|
|
char str[1000];
|
|
|
|
|
sprintf( str,
|
2005-12-17 04:57:48 +00:00
|
|
|
"BezTriple (%f %f) (%f %f) (%f %f) %f\n (%d %d %d) (%d %d) %d\n",
|
2004-09-25 20:30:40 +00:00
|
|
|
self->beztriple->vec[0][0], self->beztriple->vec[0][1],
|
2005-12-17 04:57:48 +00:00
|
|
|
self->beztriple->vec[1][0], self->beztriple->vec[1][1],
|
2004-09-25 20:30:40 +00:00
|
|
|
self->beztriple->vec[2][0], self->beztriple->vec[2][1],
|
2005-12-17 04:57:48 +00:00
|
|
|
self->beztriple->alfa,
|
2004-09-25 20:30:40 +00:00
|
|
|
self->beztriple->h1, self->beztriple->h2, self->beztriple->f1,
|
|
|
|
|
self->beztriple->f2, self->beztriple->f3,
|
|
|
|
|
self->beztriple->hide );
|
|
|
|
|
return PyString_FromString( str );
|
2003-07-19 08:29:55 +00:00
|
|
|
}
|
|
|
|
|
|
2005-06-13 19:15:02 +00:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
BezTriple_Str
|
|
|
|
|
display object as string.
|
|
|
|
|
equivalent to python str(o)
|
|
|
|
|
*/
|
2005-07-18 03:50:37 +00:00
|
|
|
/*
|
2005-06-13 19:15:02 +00:00
|
|
|
static PyObject *BezTriple_Str( BPy_BezTriple * self )
|
|
|
|
|
{
|
|
|
|
|
BezTriple *p = self->beztriple;
|
|
|
|
|
|
2005-07-18 03:50:37 +00:00
|
|
|
// fixme:
|
2005-06-13 19:15:02 +00:00
|
|
|
return PyString_FromFormat(
|
Big commit, had to rework lots of selection stuff so that things
worked properly with modifiers. Needs more testing I am sure.
No, honestly, I wasn't just cleaning for the hell of it, it
was *necessary* (I would never do such a thing). Selection should
work completely with cage options of modifiers now.
- added DerivedMesh foreach functions to iterate over mapped
verts/edges/face centers. These replaced some of the drawing
functions and are more general anyway. Special edge drawing
functions remain for performance reasons.
- removed EditFace xs, ys fields
- added general functions to iterate over screen coordinates of
mesh/curve/lattice objects
- removed all calc_*verts* functions that were used for storing
screen coordinates in objects. they were recalc'd on the fly
for most situations anyway, so now we just always do that.
calc_*verts_ext was one of those calls that did dirty things
deep down in the callstack (changing curarea and poking at
matrices)
- rewrote all vertex level selection routines (circle, lasso, bbox)
and closest vertex routines (rightmouse select) to use the new
system. This cleaned up the selection code a lot and the structure
of selection is much easier to see now. This is good for future
work on allowing modifiers to completely override the selection
system. It also points out some discrepancies in the way selection
is handled that might be nice to resolve (mesh vertex selection has
fancy stuff to try to help with selecting overlapping, but it only
works w/o bbuf select, and curves/lattices don't have at all).
- had to remove ton's code to move Manipulator to cage location, this
is not reliable (can come up with a different method if requested)
- as it happens BezTriple.s and BPoint.s are basically available to
be removed, just need to rewrite editipo code that still does
background calc of screen coordinates
- MVert.{xs,ys} are still around because they are abused in some places
for other info (not sure if this is safe actually, since they are
short's and the mvert limit went up).
And did I mention this commit is comes out to -305 lines? Well it does.
2005-08-09 08:12:36 +00:00
|
|
|
"BezTriple (%f %f %f) (%f %f %f) (%f %f %f) alpha %f\n h1:%d h2:%d f1:%d f2:%d f3:%d hide:%d",
|
2005-06-13 19:15:02 +00:00
|
|
|
p->vec[0][0], p->vec[0][1], p->vec[0][2],
|
|
|
|
|
p->vec[1][0], p->vec[1][1], p->vec[1][2],
|
|
|
|
|
p->vec[2][0], p->vec[2][1], p->vec[2][2],
|
|
|
|
|
p->alfa,
|
|
|
|
|
p->h1, p->h2, p->f1,
|
|
|
|
|
p->f2, p->f3,
|
|
|
|
|
p->hide );
|
|
|
|
|
|
|
|
|
|
}
|
2005-07-18 03:50:37 +00:00
|
|
|
*/
|
2005-06-13 19:15:02 +00:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
BezTriple_Init
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
PyObject *BezTriple_Init( void )
|
|
|
|
|
{
|
|
|
|
|
PyObject *submodule;
|
|
|
|
|
|
|
|
|
|
BezTriple_Type.ob_type = &PyType_Type;
|
|
|
|
|
|
|
|
|
|
submodule = Py_InitModule3( "Blender.BezTriple",
|
|
|
|
|
M_BezTriple_methods,
|
|
|
|
|
M_BezTriple_doc );
|
|
|
|
|
|
|
|
|
|
return submodule;
|
|
|
|
|
}
|
|
|
|
|
|
2003-07-19 08:29:55 +00:00
|
|
|
/* Three Python BezTriple_Type helper functions needed by the Object module: */
|
|
|
|
|
|
2005-06-13 19:15:02 +00:00
|
|
|
/****************************************************************************
|
|
|
|
|
Function: BezTriple_CreatePyObject
|
|
|
|
|
Description: This function will create a new BPy_BezTriple from an existing
|
|
|
|
|
Blender ipo structure.
|
|
|
|
|
****************************************************************************/
|
2004-09-25 20:30:40 +00:00
|
|
|
PyObject *BezTriple_CreatePyObject( BezTriple * bzt )
|
2003-07-19 08:29:55 +00:00
|
|
|
{
|
2005-06-13 19:15:02 +00:00
|
|
|
BPy_BezTriple *pybeztriple;
|
2003-07-19 08:29:55 +00:00
|
|
|
|
2004-09-25 20:30:40 +00:00
|
|
|
pybeztriple =
|
2005-06-13 19:15:02 +00:00
|
|
|
( BPy_BezTriple * ) PyObject_NEW( BPy_BezTriple, &BezTriple_Type );
|
2003-07-19 08:29:55 +00:00
|
|
|
|
2004-09-25 20:30:40 +00:00
|
|
|
if( !pybeztriple )
|
|
|
|
|
return EXPP_ReturnPyObjError( PyExc_MemoryError,
|
2005-06-13 19:15:02 +00:00
|
|
|
"couldn't create BPy_BezTriple object" );
|
2003-07-19 08:29:55 +00:00
|
|
|
|
2004-09-25 20:30:40 +00:00
|
|
|
pybeztriple->beztriple = bzt;
|
2005-09-14 13:59:43 +00:00
|
|
|
pybeztriple->own_memory = 0;
|
2003-07-19 08:29:55 +00:00
|
|
|
|
2004-09-25 20:30:40 +00:00
|
|
|
return ( PyObject * ) pybeztriple;
|
2003-07-19 08:29:55 +00:00
|
|
|
}
|
|
|
|
|
|
2005-06-13 19:15:02 +00:00
|
|
|
|
2003-07-19 08:29:55 +00:00
|
|
|
/*****************************************************************************/
|
2004-09-25 20:30:40 +00:00
|
|
|
/* Function: BezTriple_CheckPyObject */
|
2003-07-19 08:29:55 +00:00
|
|
|
/* Description: This function returns true when the given PyObject is of the */
|
2004-09-25 20:30:40 +00:00
|
|
|
/* type BezTriple. Otherwise it will return false. */
|
2003-07-19 08:29:55 +00:00
|
|
|
/*****************************************************************************/
|
2004-09-25 20:30:40 +00:00
|
|
|
int BezTriple_CheckPyObject( PyObject * pyobj )
|
2003-07-19 08:29:55 +00:00
|
|
|
{
|
2004-09-25 20:30:40 +00:00
|
|
|
return ( pyobj->ob_type == &BezTriple_Type );
|
2003-07-19 08:29:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
2004-09-25 20:30:40 +00:00
|
|
|
/* Function: BezTriple_FromPyObject */
|
|
|
|
|
/* Description: This function returns the Blender beztriple from the given */
|
2003-07-19 08:29:55 +00:00
|
|
|
/* PyObject. */
|
|
|
|
|
/*****************************************************************************/
|
2004-09-25 20:30:40 +00:00
|
|
|
BezTriple *BezTriple_FromPyObject( PyObject * pyobj )
|
2003-07-19 08:29:55 +00:00
|
|
|
{
|
2005-06-13 19:15:02 +00:00
|
|
|
return ( ( BPy_BezTriple * ) pyobj )->beztriple;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Create a new BezTriple
|
|
|
|
|
input args is a sequence - either 3 or 9 floats
|
|
|
|
|
*/
|
|
|
|
|
|
2005-11-28 05:03:26 +00:00
|
|
|
PyObject *newBezTriple( float *numbuf )
|
2005-06-13 19:15:02 +00:00
|
|
|
{
|
2005-11-28 05:03:26 +00:00
|
|
|
int i, j, num;
|
|
|
|
|
PyObject *pyobj = NULL;
|
|
|
|
|
BezTriple *bzt = NULL;
|
2005-06-13 19:15:02 +00:00
|
|
|
|
2005-11-28 05:03:26 +00:00
|
|
|
/* create our own beztriple data */
|
|
|
|
|
bzt = MEM_callocN( sizeof( BezTriple ), "new bpytriple");
|
2005-06-13 19:15:02 +00:00
|
|
|
|
|
|
|
|
/* check malloc */
|
2005-11-28 05:03:26 +00:00
|
|
|
if( !bzt )
|
|
|
|
|
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
|
|
|
|
|
"MEM_callocN failed");
|
2005-06-13 19:15:02 +00:00
|
|
|
|
2005-11-28 05:03:26 +00:00
|
|
|
/* copy the data */
|
|
|
|
|
num = 0;
|
|
|
|
|
for( i = 0; i < 3; i++ ) {
|
|
|
|
|
for( j = 0; j < 3; j++) {
|
|
|
|
|
bzt->vec[i][j] = numbuf[num++];
|
2005-06-13 19:15:02 +00:00
|
|
|
}
|
|
|
|
|
}
|
2005-11-28 05:03:26 +00:00
|
|
|
bzt->h1 = HD_ALIGN;
|
|
|
|
|
bzt->h2 = HD_ALIGN;
|
2005-06-13 19:15:02 +00:00
|
|
|
|
2005-11-28 05:03:26 +00:00
|
|
|
/* wrap it */
|
|
|
|
|
pyobj = BezTriple_CreatePyObject( bzt );
|
2005-06-13 19:15:02 +00:00
|
|
|
|
2005-11-28 05:03:26 +00:00
|
|
|
/* we own it. must free later */
|
|
|
|
|
( ( BPy_BezTriple * )pyobj)->own_memory = 1;
|
2005-06-13 19:15:02 +00:00
|
|
|
|
2005-11-28 05:03:26 +00:00
|
|
|
return pyobj;
|
2003-07-19 08:29:55 +00:00
|
|
|
}
|