Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/python/api2_2x/NMesh.c6
-rw-r--r--source/blender/python/api2_2x/NMesh.h12
-rw-r--r--source/blender/python/api2_2x/matrix.c14
-rw-r--r--source/blender/python/api2_2x/vector.c33
-rw-r--r--source/blender/python/api2_2x/vector.h1
5 files changed, 53 insertions, 13 deletions
diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c
index 541638c86e1..53bceb23cd8 100644
--- a/source/blender/python/api2_2x/NMesh.c
+++ b/source/blender/python/api2_2x/NMesh.c
@@ -685,12 +685,12 @@ static PyObject *NMVert_getattr( PyObject * self, char *name )
BPy_NMVert *mv = ( BPy_NMVert * ) self;
if( !strcmp( name, "co" ) || !strcmp( name, "loc" ) )
- return newVectorObject( mv->co, 3 );
+ return newVectorProxy( mv->co, 3 );
else if( strcmp( name, "no" ) == 0 )
- return newVectorObject( mv->no, 3 );
+ return newVectorProxy( mv->no, 3 );
else if( strcmp( name, "uvco" ) == 0 )
- return newVectorObject( mv->uvco, 3 );
+ return newVectorProxy( mv->uvco, 3 );
else if( strcmp( name, "index" ) == 0 )
return PyInt_FromLong( mv->index );
else if( strcmp( name, "sel" ) == 0 )
diff --git a/source/blender/python/api2_2x/NMesh.h b/source/blender/python/api2_2x/NMesh.h
index a9c21ac23b2..3742ef72e07 100644
--- a/source/blender/python/api2_2x/NMesh.h
+++ b/source/blender/python/api2_2x/NMesh.h
@@ -75,12 +75,14 @@ void remove_vert_def_nr( Object * ob, int def_nr, int vertnum );
/* Typedefs for the new types */
typedef struct {
- PyObject_HEAD unsigned char r, g, b, a;
+ PyObject_HEAD /* required python macro */
+ unsigned char r, g, b, a;
} BPy_NMCol; /* an NMesh color: [r,g,b,a] */
typedef struct {
- PyObject_VAR_HEAD float co[3];
+ PyObject_VAR_HEAD /* required python macro */
+ float co[3];
float no[3];
float uvco[3];
int index;
@@ -89,7 +91,8 @@ typedef struct {
} BPy_NMVert; /* an NMesh vertex */
typedef struct {
- PyObject_HEAD PyObject * v;
+ PyObject_HEAD /* required python macro */
+ PyObject * v;
PyObject *uv;
PyObject *col;
short mode;
@@ -101,7 +104,8 @@ typedef struct {
} BPy_NMFace; /* an NMesh face */
typedef struct {
- PyObject_HEAD Mesh * mesh;
+ PyObject_HEAD /* required python macro */
+ Mesh * mesh;
Object *object; /* for vertex grouping info, since it's stored on the object */
PyObject *name;
PyObject *materials;
diff --git a/source/blender/python/api2_2x/matrix.c b/source/blender/python/api2_2x/matrix.c
index efefa337d8a..d515e06c672 100644
--- a/source/blender/python/api2_2x/matrix.c
+++ b/source/blender/python/api2_2x/matrix.c
@@ -262,7 +262,8 @@ PyObject *Matrix_Resize4x4( MatrixObject * self )
PyObject *Matrix_TranslationPart( MatrixObject * self )
{
- float *vec;
+ float *vec = NULL;
+ PyObject *retval;
if( self->colSize < 3 ) {
return EXPP_ReturnPyObjError( PyExc_AttributeError,
@@ -282,7 +283,9 @@ PyObject *Matrix_TranslationPart( MatrixObject * self )
vec[2] = self->matrix[3][2];
}
- return ( PyObject * ) newVectorObject( vec, 3 );
+ retval = ( PyObject * ) newVectorObject( vec, 3 );
+ PyMem_Free( vec );
+ return retval;
}
PyObject *Matrix_RotationPart( MatrixObject * self )
@@ -556,7 +559,8 @@ static PyObject *Matrix_repr( MatrixObject * self )
//compatability
static PyObject *Matrix_item( MatrixObject * self, int i )
{
- float *vec;
+ float *vec = NULL;
+ PyObject *retval;
int x;
if( i < 0 || i >= self->rowSize )
@@ -572,7 +576,9 @@ static PyObject *Matrix_item( MatrixObject * self, int i )
vec[x] = self->matrix[i][x];
}
- return ( PyObject * ) newVectorObject( vec, self->colSize );
+ retval =( PyObject * ) newVectorObject( vec, self->colSize );
+ PyMem_Free( vec );
+ return retval;
}
static PyObject *Matrix_slice( MatrixObject * self, int begin, int end )
diff --git a/source/blender/python/api2_2x/vector.c b/source/blender/python/api2_2x/vector.c
index 83da130b8fd..ba527352786 100644
--- a/source/blender/python/api2_2x/vector.c
+++ b/source/blender/python/api2_2x/vector.c
@@ -222,8 +222,8 @@ static PyObject *Vector_getattr( VectorObject * self, char *name )
self->vec[1] *
self->vec[1] ) );
} else
- EXPP_ReturnPyObjError( PyExc_AttributeError,
- "can only return the length of a 2D ,3D or 4D vector\n" );
+ return EXPP_ReturnPyObjError( PyExc_AttributeError,
+ "can only return the length of a 2D ,3D or 4D vector\n" );
}
return Py_FindMethod( Vector_methods, ( PyObject * ) self, name );
@@ -696,3 +696,32 @@ PyObject *newVectorObject( float *vec, int size )
return ( PyObject * ) self;
}
+
+
+/*
+ create a Vector that is a proxy for blender data.
+ we do not own this data, we NEVER free it.
+ Note: users must deal with bad pointer issue
+*/
+
+PyObject *newVectorProxy( float *vec, int size)
+{
+ VectorObject *proxy;
+ int x;
+
+ proxy = PyObject_NEW( VectorObject, &vector_Type );
+
+ proxy->delete_pymem = 0; /* must NOT free this alloc later */
+
+ if( !vec || size < 1 ) {
+ return EXPP_ReturnPyObjError( PyExc_AttributeError,
+ "cannot creat zero length vector proxy" );
+ }
+
+ proxy->vec = vec;
+ proxy->size = size;
+ proxy->flag = 0;
+
+ return ( PyObject * ) proxy;
+}
+
diff --git a/source/blender/python/api2_2x/vector.h b/source/blender/python/api2_2x/vector.h
index cf07b5ce78e..40e5851359a 100644
--- a/source/blender/python/api2_2x/vector.h
+++ b/source/blender/python/api2_2x/vector.h
@@ -61,6 +61,7 @@ typedef struct {
//prototypes
PyObject *newVectorObject( float *vec, int size );
+PyObject *newVectorProxy( float *vec, int size );
PyObject *Vector_Zero( VectorObject * self );
PyObject *Vector_Normalize( VectorObject * self );
PyObject *Vector_Negate( VectorObject * self );