2011-02-23 10:52:22 +00:00
/*
2010-01-16 15:20:27 +00:00
* $ Id $
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
*
* * * * * * BEGIN GPL 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 .
*
* 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 ,
2010-02-12 13:34:04 +00:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
*
* Contributor ( s ) : Arystanbek Dyussenov
*
* * * * * * END GPL LICENSE BLOCK * * * * *
*/
2011-02-27 20:10:08 +00:00
/** \file blender/python/intern/bpy_rna_array.c
* \ ingroup pythonintern
*/
2011-02-14 04:15:25 +00:00
# include <Python.h>
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
2011-03-02 04:51:43 +00:00
# include "RNA_types.h"
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
# include "bpy_rna.h"
2009-09-06 15:13:57 +00:00
# include "BKE_global.h"
2010-08-31 11:31:21 +00:00
# include "MEM_guardedalloc.h"
2009-09-06 15:13:57 +00:00
2011-03-02 04:51:43 +00:00
# include "RNA_access.h"
2009-09-06 15:13:57 +00:00
# define MAX_ARRAY_DIMENSION 10
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
typedef void ( * ItemConvertFunc ) ( PyObject * , char * ) ;
2009-09-06 15:13:57 +00:00
typedef int ( * ItemTypeCheckFunc ) ( PyObject * ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
typedef void ( * RNA_SetArrayFunc ) ( PointerRNA * , PropertyRNA * , const char * ) ;
2009-09-06 15:13:57 +00:00
typedef void ( * RNA_SetIndexFunc ) ( PointerRNA * , PropertyRNA * , int index , void * ) ;
/*
arr [ 3 ] [ 4 ] [ 5 ]
2010-03-22 09:30:00 +00:00
0 1 2 < - dimension index
2009-09-06 15:13:57 +00:00
*/
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
2009-09-06 15:13:57 +00:00
/*
2011-03-19 11:12:48 +00:00
arr [ 2 ] = x
2009-09-06 15:13:57 +00:00
py_to_array_index ( arraydim = 0 , arrayoffset = 0 , index = 2 )
2010-03-22 09:30:00 +00:00
validate_array ( lvalue_dim = 0 )
. . . make real index . . .
2009-09-06 15:13:57 +00:00
*/
/* arr[3]=x, self->arraydim is 0, lvalue_dim is 1 */
/* Ensures that a python sequence has expected number of items/sub-items and items are of desired type. */
2009-09-09 19:40:46 +00:00
static int validate_array_type ( PyObject * seq , int dim , int totdim , int dimsize [ ] ,
2009-09-06 15:13:57 +00:00
ItemTypeCheckFunc check_item_type , const char * item_type_str , const char * error_prefix )
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
{
int i ;
2009-09-06 15:13:57 +00:00
/* not the last dimension */
if ( dim + 1 < totdim ) {
/* check that a sequence contains dimsize[dim] items */
2011-01-13 21:44:18 +00:00
const int seq_size = PySequence_Size ( seq ) ;
2011-03-05 05:02:37 +00:00
if ( seq_size = = - 1 ) {
PyErr_Format ( PyExc_ValueError , " %s sequence expected at dimension %d, not %s " , error_prefix , ( int ) dim + 1 , Py_TYPE ( seq ) - > tp_name ) ;
return 0 ;
}
2011-01-13 21:44:18 +00:00
for ( i = 0 ; i < seq_size ; i + + ) {
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
PyObject * item ;
int ok = 1 ;
item = PySequence_GetItem ( seq , i ) ;
if ( ! PySequence_Check ( item ) ) {
2009-09-06 15:13:57 +00:00
/* BLI_snprintf(error_str, error_str_size, "expected a sequence of %s", item_type_str); */
2011-01-13 21:44:18 +00:00
PyErr_Format ( PyExc_TypeError , " %s expected a sequence of %s, not %s " , error_prefix , item_type_str , Py_TYPE ( item ) - > tp_name ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
ok = 0 ;
}
2009-09-06 15:13:57 +00:00
/* arr[3][4][5]
2009-09-09 19:40:46 +00:00
dimsize [ 1 ] = 4
dimsize [ 2 ] = 5
2009-09-06 15:13:57 +00:00
dim = 0 */
2011-01-09 14:53:18 +00:00
else if ( PySequence_Size ( item ) ! = dimsize [ dim + 1 ] ) {
2009-09-09 19:40:46 +00:00
/* BLI_snprintf(error_str, error_str_size, "sequences of dimension %d should contain %d items", (int)dim + 1, (int)dimsize[dim + 1]); */
PyErr_Format ( PyExc_ValueError , " %s sequences of dimension %d should contain %d items " , error_prefix , ( int ) dim + 1 , ( int ) dimsize [ dim + 1 ] ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
ok = 0 ;
}
2009-09-06 15:13:57 +00:00
else if ( ! validate_array_type ( item , dim + 1 , totdim , dimsize , check_item_type , item_type_str , error_prefix ) ) {
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
ok = 0 ;
}
Py_DECREF ( item ) ;
if ( ! ok )
return 0 ;
}
}
else {
2009-09-06 15:13:57 +00:00
/* check that items are of correct type */
2011-01-13 21:44:18 +00:00
const int seq_size = PySequence_Size ( seq ) ;
2011-03-05 05:02:37 +00:00
if ( seq_size = = - 1 ) {
PyErr_Format ( PyExc_ValueError , " %s sequence expected at dimension %d, not %s " , error_prefix , ( int ) dim + 1 , Py_TYPE ( seq ) - > tp_name ) ;
return 0 ;
}
2011-01-13 21:44:18 +00:00
for ( i = 0 ; i < seq_size ; i + + ) {
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
PyObject * item = PySequence_GetItem ( seq , i ) ;
if ( ! check_item_type ( item ) ) {
Py_DECREF ( item ) ;
2009-09-06 15:13:57 +00:00
/* BLI_snprintf(error_str, error_str_size, "sequence items should be of type %s", item_type_str); */
2011-02-24 07:25:47 +00:00
PyErr_Format ( PyExc_TypeError , " %s expected sequence items of type %s, not %s " , error_prefix , item_type_str , Py_TYPE ( item ) - > tp_name ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
return 0 ;
}
Py_DECREF ( item ) ;
}
}
return 1 ;
}
/* Returns the number of items in a single- or multi-dimensional sequence. */
2011-02-24 08:47:58 +00:00
static int count_items ( PyObject * seq , int dim )
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
{
int totitem = 0 ;
2011-02-24 08:47:58 +00:00
if ( dim > 1 ) {
2011-01-13 21:44:18 +00:00
const int seq_size = PySequence_Size ( seq ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
int i ;
2011-01-13 21:44:18 +00:00
for ( i = 0 ; i < seq_size ; i + + ) {
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
PyObject * item = PySequence_GetItem ( seq , i ) ;
2011-02-24 08:47:58 +00:00
totitem + = count_items ( item , dim - 1 ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
Py_DECREF ( item ) ;
}
}
2011-02-24 08:47:58 +00:00
else {
totitem = PySequence_Size ( seq ) ;
}
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
return totitem ;
}
2009-09-06 15:13:57 +00:00
/* Modifies property array length if needed and PROP_DYNAMIC flag is set. */
static int validate_array_length ( PyObject * rvalue , PointerRNA * ptr , PropertyRNA * prop , int lvalue_dim , int * totitem , const char * error_prefix )
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
{
2009-09-09 19:40:46 +00:00
int dimsize [ MAX_ARRAY_DIMENSION ] ;
2009-09-06 15:13:57 +00:00
int tot , totdim , len ;
2009-09-09 19:40:46 +00:00
totdim = RNA_property_array_dimension ( ptr , prop , dimsize ) ;
2011-02-26 12:26:01 +00:00
tot = count_items ( rvalue , totdim - lvalue_dim ) ;
2009-09-06 15:13:57 +00:00
if ( ( RNA_property_flag ( prop ) & PROP_DYNAMIC ) & & lvalue_dim = = 0 ) {
if ( RNA_property_array_length ( ptr , prop ) ! = tot ) {
2009-09-09 19:40:46 +00:00
#if 0
/* length is flexible */
2009-09-06 15:13:57 +00:00
if ( ! RNA_property_dynamic_array_set_length ( ptr , prop , tot ) ) {
/* BLI_snprintf(error_str, error_str_size, "%s.%s: array length cannot be changed to %d", RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), tot); */
PyErr_Format ( PyExc_ValueError , " %s %s.%s: array length cannot be changed to %d " , error_prefix , RNA_struct_identifier ( ptr - > type ) , RNA_property_identifier ( prop ) , tot ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
return 0 ;
}
2009-09-09 19:40:46 +00:00
# else
2010-08-31 11:31:21 +00:00
* totitem = tot ;
return 1 ;
2009-09-09 19:40:46 +00:00
# endif
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
}
2009-09-09 19:40:46 +00:00
len = tot ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
}
else {
/* length is a constraint */
2009-09-06 15:13:57 +00:00
if ( ! lvalue_dim ) {
len = RNA_property_array_length ( ptr , prop ) ;
}
/* array item assignment */
else {
int i ;
len = 1 ;
/* arr[3][4][5]
2011-03-19 11:12:48 +00:00
arr [ 2 ] = x
2009-09-06 15:13:57 +00:00
dimsize = { 4 , 5 }
2011-03-19 11:12:48 +00:00
dimsize [ 1 ] = 4
dimsize [ 2 ] = 5
2009-09-06 15:13:57 +00:00
lvalue_dim = 0 , totdim = 3
2011-03-19 11:12:48 +00:00
arr [ 2 ] [ 3 ] = x
2009-09-06 15:13:57 +00:00
lvalue_dim = 1
2011-03-19 11:12:48 +00:00
arr [ 2 ] [ 3 ] [ 4 ] = x
2009-09-06 15:13:57 +00:00
lvalue_dim = 2 */
for ( i = lvalue_dim ; i < totdim ; i + + )
2009-09-09 19:40:46 +00:00
len * = dimsize [ i ] ;
2009-09-06 15:13:57 +00:00
}
if ( tot ! = len ) {
/* BLI_snprintf(error_str, error_str_size, "sequence must have length of %d", len); */
2011-02-24 07:25:47 +00:00
PyErr_Format ( PyExc_ValueError , " %s %.200s.%.200s, sequence must have %d items total, not %d " , error_prefix , RNA_struct_identifier ( ptr - > type ) , RNA_property_identifier ( prop ) , len , tot ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
return 0 ;
}
}
2009-09-06 15:13:57 +00:00
* totitem = len ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
return 1 ;
}
2009-09-06 15:13:57 +00:00
static int validate_array ( PyObject * rvalue , PointerRNA * ptr , PropertyRNA * prop , int lvalue_dim , ItemTypeCheckFunc check_item_type , const char * item_type_str , int * totitem , const char * error_prefix )
{
2009-09-09 19:40:46 +00:00
int dimsize [ MAX_ARRAY_DIMENSION ] ;
int totdim = RNA_property_array_dimension ( ptr , prop , dimsize ) ;
2009-09-06 15:13:57 +00:00
/* validate type first because length validation may modify property array length */
if ( ! validate_array_type ( rvalue , lvalue_dim , totdim , dimsize , check_item_type , item_type_str , error_prefix ) )
return 0 ;
return validate_array_length ( rvalue , ptr , prop , lvalue_dim , totitem , error_prefix ) ;
}
2011-01-13 16:00:14 +00:00
static char * copy_value_single ( PyObject * item , PointerRNA * ptr , PropertyRNA * prop , char * data , unsigned int item_size , int * index , ItemConvertFunc convert_item , RNA_SetIndexFunc rna_set_index )
{
if ( ! data ) {
char value [ sizeof ( int ) ] ;
convert_item ( item , value ) ;
rna_set_index ( ptr , prop , * index , value ) ;
2011-03-19 11:12:48 +00:00
* index = * index + 1 ;
2011-01-13 16:00:14 +00:00
}
else {
convert_item ( item , data ) ;
data + = item_size ;
}
return data ;
}
2009-09-09 19:40:46 +00:00
static char * copy_values ( PyObject * seq , PointerRNA * ptr , PropertyRNA * prop , int dim , char * data , unsigned int item_size , int * index , ItemConvertFunc convert_item , RNA_SetIndexFunc rna_set_index )
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
{
unsigned int i ;
2009-09-09 19:40:46 +00:00
int totdim = RNA_property_array_dimension ( ptr , prop , NULL ) ;
2011-01-13 21:44:18 +00:00
const int seq_size = PySequence_Size ( seq ) ;
2009-09-06 15:13:57 +00:00
2011-02-27 08:31:10 +00:00
assert ( seq_size ! = - 1 ) ;
2011-01-13 21:44:18 +00:00
for ( i = 0 ; i < seq_size ; i + + ) {
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
PyObject * item = PySequence_GetItem ( seq , i ) ;
2009-09-06 15:13:57 +00:00
if ( dim + 1 < totdim ) {
data = copy_values ( item , ptr , prop , dim + 1 , data , item_size , index , convert_item , rna_set_index ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
}
else {
2011-01-13 16:00:14 +00:00
data = copy_value_single ( item , ptr , prop , data , item_size , index , convert_item , rna_set_index ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
}
2011-01-13 16:00:14 +00:00
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
Py_DECREF ( item ) ;
}
return data ;
}
2010-10-13 23:25:08 +00:00
static int py_to_array ( PyObject * py , PointerRNA * ptr , PropertyRNA * prop , char * param_data , ItemTypeCheckFunc check_item_type , const char * item_type_str , int item_size , ItemConvertFunc convert_item , RNA_SetArrayFunc rna_set_array , const char * error_prefix )
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
{
2011-01-13 04:53:55 +00:00
/*int totdim, dim_size[MAX_ARRAY_DIMENSION];*/
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
int totitem ;
char * data = NULL ;
2011-01-13 04:53:55 +00:00
/*totdim= RNA_property_array_dimension(ptr, prop, dim_size);*/ /*UNUSED*/
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
2009-09-09 19:40:46 +00:00
if ( ! validate_array ( py , ptr , prop , 0 , check_item_type , item_type_str , & totitem , error_prefix ) ) {
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
return 0 ;
2009-09-09 19:40:46 +00:00
}
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
if ( totitem ) {
2010-08-31 11:31:21 +00:00
/* note: this code is confusing */
if ( param_data & & RNA_property_flag ( prop ) & PROP_DYNAMIC ) {
/* not freeing allocated mem, RNA_parameter_list_free() will do this */
ParameterDynAlloc * param_alloc = ( ParameterDynAlloc * ) param_data ;
param_alloc - > array_tot = ( int ) totitem ;
param_alloc - > array = MEM_callocN ( item_size * totitem , " py_to_array dyn " ) ; /* freeing param list will free */
data = param_alloc - > array ;
}
else if ( param_data ) {
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
data = param_data ;
2010-08-31 11:31:21 +00:00
}
else {
data = PyMem_MALLOC ( item_size * totitem ) ;
}
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
2009-09-06 15:13:57 +00:00
copy_values ( py , ptr , prop , 0 , data , item_size , NULL , convert_item , NULL ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
2010-08-31 11:31:21 +00:00
if ( param_data = = NULL ) {
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
/* NULL can only pass through in case RNA property arraylength is 0 (impossible?) */
rna_set_array ( ptr , prop , data ) ;
2009-12-08 09:40:30 +00:00
PyMem_FREE ( data ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
}
}
return 1 ;
}
2009-09-06 15:13:57 +00:00
static int py_to_array_index ( PyObject * py , PointerRNA * ptr , PropertyRNA * prop , int lvalue_dim , int arrayoffset , int index , ItemTypeCheckFunc check_item_type , const char * item_type_str , ItemConvertFunc convert_item , RNA_SetIndexFunc rna_set_index , const char * error_prefix )
{
2009-09-09 19:40:46 +00:00
int totdim , dimsize [ MAX_ARRAY_DIMENSION ] ;
2009-09-06 15:13:57 +00:00
int totitem , i ;
2009-09-09 19:40:46 +00:00
totdim = RNA_property_array_dimension ( ptr , prop , dimsize ) ;
2009-09-06 15:13:57 +00:00
/* convert index */
/* arr[3][4][5]
2011-03-19 11:12:48 +00:00
arr [ 2 ] = x
lvalue_dim = 0 , index = 0 + 2 * 4 * 5
2009-09-06 15:13:57 +00:00
2011-03-19 11:12:48 +00:00
arr [ 2 ] [ 3 ] = x
lvalue_dim = 1 , index = 40 + 3 * 5 */
2009-09-06 15:13:57 +00:00
lvalue_dim + + ;
for ( i = lvalue_dim ; i < totdim ; i + + )
2009-09-09 19:40:46 +00:00
index * = dimsize [ i ] ;
2009-09-06 15:13:57 +00:00
index + = arrayoffset ;
2011-01-13 16:00:14 +00:00
if ( lvalue_dim = = totdim ) { /* single item, assign directly */
2011-01-13 21:44:18 +00:00
if ( ! check_item_type ( py ) ) {
2011-02-24 07:25:47 +00:00
PyErr_Format ( PyExc_TypeError , " %s %.200s.%.200s, expected a %s type, not %s " , error_prefix , RNA_struct_identifier ( ptr - > type ) , RNA_property_identifier ( prop ) , item_type_str , Py_TYPE ( py ) - > tp_name ) ;
2011-01-13 21:44:18 +00:00
return 0 ;
}
2011-01-13 16:00:14 +00:00
copy_value_single ( py , ptr , prop , NULL , 0 , & index , convert_item , rna_set_index ) ;
}
else {
if ( ! validate_array ( py , ptr , prop , lvalue_dim , check_item_type , item_type_str , & totitem , error_prefix ) ) {
return 0 ;
}
2009-09-06 15:13:57 +00:00
2011-01-13 16:00:14 +00:00
if ( totitem ) {
copy_values ( py , ptr , prop , lvalue_dim , NULL , 0 , & index , convert_item , rna_set_index ) ;
}
}
2009-09-06 15:13:57 +00:00
return 1 ;
}
static void py_to_float ( PyObject * py , char * data )
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
{
* ( float * ) data = ( float ) PyFloat_AsDouble ( py ) ;
}
2009-09-06 15:13:57 +00:00
static void py_to_int ( PyObject * py , char * data )
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
{
* ( int * ) data = ( int ) PyLong_AsSsize_t ( py ) ;
}
2009-09-06 15:13:57 +00:00
static void py_to_bool ( PyObject * py , char * data )
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
{
* ( int * ) data = ( int ) PyObject_IsTrue ( py ) ;
}
static int py_float_check ( PyObject * py )
{
2009-09-06 15:13:57 +00:00
/* accept both floats and integers */
2011-01-13 21:44:18 +00:00
return PyNumber_Check ( py ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
}
static int py_int_check ( PyObject * py )
{
2009-09-06 15:13:57 +00:00
/* accept only integers */
return PyLong_Check ( py ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
}
static int py_bool_check ( PyObject * py )
{
2009-09-06 15:13:57 +00:00
return PyBool_Check ( py ) ;
}
static void float_set_index ( PointerRNA * ptr , PropertyRNA * prop , int index , void * value )
{
RNA_property_float_set_index ( ptr , prop , index , * ( float * ) value ) ;
}
static void int_set_index ( PointerRNA * ptr , PropertyRNA * prop , int index , void * value )
{
RNA_property_int_set_index ( ptr , prop , index , * ( int * ) value ) ;
}
static void bool_set_index ( PointerRNA * ptr , PropertyRNA * prop , int index , void * value )
{
RNA_property_boolean_set_index ( ptr , prop , index , * ( int * ) value ) ;
}
2010-10-13 23:25:08 +00:00
int pyrna_py_to_array ( PointerRNA * ptr , PropertyRNA * prop , char * param_data , PyObject * py , const char * error_prefix )
2009-09-06 15:13:57 +00:00
{
int ret ;
switch ( RNA_property_type ( prop ) ) {
case PROP_FLOAT :
2010-10-13 23:25:08 +00:00
ret = py_to_array ( py , ptr , prop , param_data , py_float_check , " float " , sizeof ( float ) , py_to_float , ( RNA_SetArrayFunc ) RNA_property_float_set_array , error_prefix ) ;
2009-09-06 15:13:57 +00:00
break ;
case PROP_INT :
2010-10-13 23:25:08 +00:00
ret = py_to_array ( py , ptr , prop , param_data , py_int_check , " int " , sizeof ( int ) , py_to_int , ( RNA_SetArrayFunc ) RNA_property_int_set_array , error_prefix ) ;
2009-09-06 15:13:57 +00:00
break ;
case PROP_BOOLEAN :
2010-10-13 23:25:08 +00:00
ret = py_to_array ( py , ptr , prop , param_data , py_bool_check , " boolean " , sizeof ( int ) , py_to_bool , ( RNA_SetArrayFunc ) RNA_property_boolean_set_array , error_prefix ) ;
2009-09-06 15:13:57 +00:00
break ;
default :
PyErr_SetString ( PyExc_TypeError , " not an array type " ) ;
ret = 0 ;
}
return ret ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
}
2009-09-06 15:13:57 +00:00
int pyrna_py_to_array_index ( PointerRNA * ptr , PropertyRNA * prop , int arraydim , int arrayoffset , int index , PyObject * py , const char * error_prefix )
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
{
2009-09-06 15:13:57 +00:00
int ret ;
switch ( RNA_property_type ( prop ) ) {
case PROP_FLOAT :
ret = py_to_array_index ( py , ptr , prop , arraydim , arrayoffset , index , py_float_check , " float " , py_to_float , float_set_index , error_prefix ) ;
break ;
case PROP_INT :
ret = py_to_array_index ( py , ptr , prop , arraydim , arrayoffset , index , py_int_check , " int " , py_to_int , int_set_index , error_prefix ) ;
break ;
case PROP_BOOLEAN :
ret = py_to_array_index ( py , ptr , prop , arraydim , arrayoffset , index , py_bool_check , " boolean " , py_to_bool , bool_set_index , error_prefix ) ;
break ;
default :
PyErr_SetString ( PyExc_TypeError , " not an array type " ) ;
ret = 0 ;
}
return ret ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
}
2010-09-23 02:12:33 +00:00
PyObject * pyrna_array_index ( PointerRNA * ptr , PropertyRNA * prop , int index )
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
{
2009-09-06 15:13:57 +00:00
PyObject * item ;
switch ( RNA_property_type ( prop ) ) {
case PROP_FLOAT :
item = PyFloat_FromDouble ( RNA_property_float_get_index ( ptr , prop , index ) ) ;
break ;
case PROP_BOOLEAN :
item = PyBool_FromLong ( RNA_property_boolean_get_index ( ptr , prop , index ) ) ;
break ;
case PROP_INT :
item = PyLong_FromSsize_t ( RNA_property_int_get_index ( ptr , prop , index ) ) ;
break ;
default :
PyErr_SetString ( PyExc_TypeError , " not an array type " ) ;
item = NULL ;
}
return item ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
}
2009-09-06 15:13:57 +00:00
#if 0
/* XXX this is not used (and never will?) */
/* Given an array property, creates an N-dimensional tuple of values. */
static PyObject * pyrna_py_from_array_internal ( PointerRNA * ptr , PropertyRNA * prop , int dim , int * index )
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
{
2009-09-06 15:13:57 +00:00
PyObject * tuple ;
int i , len ;
2009-09-09 19:40:46 +00:00
int totdim = RNA_property_array_dimension ( ptr , prop , NULL ) ;
2009-09-06 15:13:57 +00:00
2009-09-09 19:40:46 +00:00
len = RNA_property_multi_array_length ( ptr , prop , dim ) ;
2009-09-06 15:13:57 +00:00
tuple = PyTuple_New ( len ) ;
for ( i = 0 ; i < len ; i + + ) {
PyObject * item ;
if ( dim + 1 < totdim )
item = pyrna_py_from_array_internal ( ptr , prop , dim + 1 , index ) ;
else {
2010-09-23 02:12:33 +00:00
item = pyrna_array_index ( ptr , prop , * index ) ;
2009-09-06 15:13:57 +00:00
* index = * index + 1 ;
}
if ( ! item ) {
Py_DECREF ( tuple ) ;
return NULL ;
}
2011-01-02 11:06:50 +00:00
PyTuple_SET_ITEM ( tuple , i , item ) ;
2009-09-06 15:13:57 +00:00
}
return tuple ;
}
# endif
2010-09-02 06:35:00 +00:00
PyObject * pyrna_py_from_array_index ( BPy_PropertyArrayRNA * self , PointerRNA * ptr , PropertyRNA * prop , int index )
2009-09-06 15:13:57 +00:00
{
2010-01-20 14:06:38 +00:00
int totdim , arraydim , arrayoffset , dimsize [ MAX_ARRAY_DIMENSION ] , i , len ;
2010-09-02 06:35:00 +00:00
BPy_PropertyArrayRNA * ret = NULL ;
2009-09-06 15:13:57 +00:00
2010-01-20 14:06:38 +00:00
arraydim = self ? self - > arraydim : 0 ;
2011-03-19 11:12:48 +00:00
arrayoffset = self ? self - > arrayoffset : 0 ;
2010-01-20 14:06:38 +00:00
2009-09-06 15:13:57 +00:00
/* just in case check */
2010-01-20 14:06:38 +00:00
len = RNA_property_multi_array_length ( ptr , prop , arraydim ) ;
2009-09-06 15:13:57 +00:00
if ( index > = len | | index < 0 ) {
/* this shouldn't happen because higher level funcs must check for invalid index */
if ( G . f & G_DEBUG ) printf ( " pyrna_py_from_array_index: invalid index %d for array with length=%d \n " , index , len ) ;
PyErr_SetString ( PyExc_IndexError , " out of range " ) ;
return NULL ;
}
2010-01-20 14:06:38 +00:00
totdim = RNA_property_array_dimension ( ptr , prop , dimsize ) ;
2009-09-06 15:13:57 +00:00
2010-01-20 14:06:38 +00:00
if ( arraydim + 1 < totdim ) {
2010-09-02 06:35:00 +00:00
ret = ( BPy_PropertyArrayRNA * ) pyrna_prop_CreatePyObject ( ptr , prop ) ;
2010-01-20 14:06:38 +00:00
ret - > arraydim = arraydim + 1 ;
2009-09-06 15:13:57 +00:00
/* arr[3][4][5]
2011-03-19 11:12:48 +00:00
x = arr [ 2 ]
index = 0 + 2 * 4 * 5
2009-09-06 15:13:57 +00:00
2011-03-19 11:12:48 +00:00
x = arr [ 2 ] [ 3 ]
index = offset + 3 * 5 */
2009-09-06 15:13:57 +00:00
2010-01-20 14:06:38 +00:00
for ( i = arraydim + 1 ; i < totdim ; i + + )
2009-09-09 19:40:46 +00:00
index * = dimsize [ i ] ;
2009-09-06 15:13:57 +00:00
2010-01-20 14:06:38 +00:00
ret - > arrayoffset = arrayoffset + index ;
2009-09-06 15:13:57 +00:00
}
else {
2011-03-19 11:12:48 +00:00
index = arrayoffset + index ;
2010-09-23 02:12:33 +00:00
ret = ( BPy_PropertyArrayRNA * ) pyrna_array_index ( ptr , prop , index ) ;
2009-09-06 15:13:57 +00:00
}
return ( PyObject * ) ret ;
}
PyObject * pyrna_py_from_array ( PointerRNA * ptr , PropertyRNA * prop )
{
PyObject * ret ;
ret = pyrna_math_object_from_array ( ptr , prop ) ;
/* is this a maths object? */
if ( ret ) return ret ;
return pyrna_prop_CreatePyObject ( ptr , prop ) ;
Implemented dynamic and multidimensional array support in RNA.
Example code: http://www.pasteall.org/7332/c.
New API functions: http://www.pasteall.org/7330/c.
Maximum number of dimensions is currently limited to 3, but can be increased arbitrarily if needed.
What this means for ID property access:
* MeshFace.verts - dynamic array, size 3 or 4 depending on MFace.v4
* MeshTextureFace.uv - dynamic, 2-dimensional array, size depends on MFace.v4
* Object.matrix - 2-dimensional array
What this means for functions:
* more intuitive API possibility, for example:
Mesh.add_vertices([(x, y, z), (x, y, z), ...])
Mesh.add_faces([(1, 2, 3), (4, 5, 6), ...])
Python part is not complete yet, e.g. it is possible to:
MeshFace.verts = (1, 2, 3) # even if Mesh.verts is (1, 2, 3, 4) and vice-versa
MeshTextureFace.uv = [(0.0, 0.0)] * 4 # only if a corresponding MFace is a quad
but the following won't work:
MeshTextureFace.uv[3] = (0.0, 0.0) # setting uv[3] modifies MTFace.uv[1][0] instead of MTFace.uv[3]
2009-08-25 17:06:36 +00:00
}
2009-12-08 09:40:30 +00:00
/* TODO, multi-dimensional arrays */
int pyrna_array_contains_py ( PointerRNA * ptr , PropertyRNA * prop , PyObject * value )
{
int len = RNA_property_array_length ( ptr , prop ) ;
int type ;
int i ;
if ( len = = 0 ) /* possible with dynamic arrays */
return 0 ;
if ( RNA_property_array_dimension ( ptr , prop , NULL ) > 1 ) {
PyErr_SetString ( PyExc_TypeError , " PropertyRNA - multi dimensional arrays not supported yet " ) ;
return - 1 ;
}
type = RNA_property_type ( prop ) ;
switch ( type ) {
case PROP_FLOAT :
{
float value_f = PyFloat_AsDouble ( value ) ;
if ( value_f = = - 1 & & PyErr_Occurred ( ) ) {
PyErr_Clear ( ) ;
return 0 ;
}
else {
float tmp [ 32 ] ;
float * tmp_arr ;
if ( len * sizeof ( float ) > sizeof ( tmp ) ) {
tmp_arr = PyMem_MALLOC ( len * sizeof ( float ) ) ;
}
else {
tmp_arr = tmp ;
}
RNA_property_float_get_array ( ptr , prop , tmp_arr ) ;
for ( i = 0 ; i < len ; i + + )
if ( tmp_arr [ i ] = = value_f )
break ;
if ( tmp_arr ! = tmp )
PyMem_FREE ( tmp_arr ) ;
return i < len ? 1 : 0 ;
}
break ;
}
case PROP_BOOLEAN :
case PROP_INT :
{
int value_i = PyLong_AsSsize_t ( value ) ;
if ( value_i = = - 1 & & PyErr_Occurred ( ) ) {
PyErr_Clear ( ) ;
return 0 ;
}
else {
int tmp [ 32 ] ;
int * tmp_arr ;
if ( len * sizeof ( int ) > sizeof ( tmp ) ) {
tmp_arr = PyMem_MALLOC ( len * sizeof ( int ) ) ;
}
else {
tmp_arr = tmp ;
}
if ( type = = PROP_BOOLEAN )
RNA_property_boolean_get_array ( ptr , prop , tmp_arr ) ;
else
RNA_property_int_get_array ( ptr , prop , tmp_arr ) ;
for ( i = 0 ; i < len ; i + + )
if ( tmp_arr [ i ] = = value_i )
break ;
if ( tmp_arr ! = tmp )
PyMem_FREE ( tmp_arr ) ;
return i < len ? 1 : 0 ;
}
break ;
}
}
/* should never reach this */
PyErr_SetString ( PyExc_TypeError , " PropertyRNA - type not in float/bool/int " ) ;
return - 1 ;
}