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:
Diffstat (limited to 'source/blender/python/api2_2x/point.c')
-rw-r--r--source/blender/python/api2_2x/point.c523
1 files changed, 0 insertions, 523 deletions
diff --git a/source/blender/python/api2_2x/point.c b/source/blender/python/api2_2x/point.c
deleted file mode 100644
index 0bdedfecdd6..00000000000
--- a/source/blender/python/api2_2x/point.c
+++ /dev/null
@@ -1,523 +0,0 @@
-/*
- * $Id$
- *
- * ***** 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,
- * 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.
- *
- * Contributor(s): Joseph Gilbert
- *
- * ***** END GPL LICENSE BLOCK *****
-*/
-#include "Mathutils.h"
-
-#include "BLI_blenlib.h"
-#include "BKE_utildefines.h"
-#include "gen_utils.h"
-
-//-------------------------DOC STRINGS ---------------------------
-char Point_Zero_doc[] = "() - set all values in the point to 0";
-char Point_toVector_doc[] = "() - create a vector representation of this point";
-//-----------------------METHOD DEFINITIONS ----------------------
-struct PyMethodDef Point_methods[] = {
- {"zero", (PyCFunction) Point_Zero, METH_NOARGS, Point_Zero_doc},
- {"toVector", (PyCFunction) Point_toVector, METH_NOARGS, Point_toVector_doc},
- {NULL, NULL, 0, NULL}
-};
-//-----------------------------METHODS----------------------------
-//--------------------------Vector.toPoint()----------------------
-//create a new point object to represent this vector
-PyObject *Point_toVector(PointObject * self)
-{
- float vec[3];
- int x;
-
- for(x = 0; x < self->size; x++){
- vec[x] = self->coord[x];
- }
-
- return newVectorObject(vec, self->size, Py_NEW);
-}
-//----------------------------Point.zero() ----------------------
-//set the point data to 0,0,0
-PyObject *Point_Zero(PointObject * self)
-{
- int x;
- for(x = 0; x < self->size; x++) {
- self->coord[x] = 0.0f;
- }
- return EXPP_incr_ret((PyObject*)self);
-}
-//----------------------------dealloc()(internal) ----------------
-//free the py_object
-static void Point_dealloc(PointObject * self)
-{
- Py_XDECREF(self->coerced_object);
- //only free py_data
- if(self->data.py_data){
- PyMem_Free(self->data.py_data);
- }
- PyObject_DEL(self);
-}
-//----------------------------getattr()(internal) ----------------
-//object.attribute access (get)
-static PyObject *Point_getattr(PointObject * self, char *name)
-{
- if(STREQ(name,"x")){
- return PyFloat_FromDouble(self->coord[0]);
- }else if(STREQ(name, "y")){
- return PyFloat_FromDouble(self->coord[1]);
- }else if(STREQ(name, "z")){
- if(self->size > 2){
- return PyFloat_FromDouble(self->coord[2]);
- }else{
- return EXPP_ReturnPyObjError(PyExc_AttributeError,
- "point.z: illegal attribute access\n");
- }
- }
- if(STREQ(name, "wrapped")){
- if(self->wrapped == Py_WRAP)
- return EXPP_incr_ret((PyObject *)Py_True);
- else
- return EXPP_incr_ret((PyObject *)Py_False);
- }
- return Py_FindMethod(Point_methods, (PyObject *) self, name);
-}
-//----------------------------setattr()(internal) ----------------
-//object.attribute access (set)
-static int Point_setattr(PointObject * self, char *name, PyObject * v)
-{
- PyObject *f = NULL;
-
- f = PyNumber_Float(v);
- if(f == NULL) { // parsed item not a number
- return EXPP_ReturnIntError(PyExc_TypeError,
- "point.attribute = x: argument not a number\n");
- }
-
- if(STREQ(name,"x")){
- self->coord[0] = (float)PyFloat_AS_DOUBLE(f);
- }else if(STREQ(name, "y")){
- self->coord[1] = (float)PyFloat_AS_DOUBLE(f);
- }else if(STREQ(name, "z")){
- if(self->size > 2){
- self->coord[2] = (float)PyFloat_AS_DOUBLE(f);
- }else{
- Py_DECREF(f);
- return EXPP_ReturnIntError(PyExc_AttributeError,
- "point.z = x: illegal attribute access\n");
- }
- }else{
- Py_DECREF(f);
- return EXPP_ReturnIntError(PyExc_AttributeError,
- "point.attribute = x: unknown attribute\n");
- }
-
- Py_DECREF(f);
- return 0;
-}
-//----------------------------print object (internal)-------------
-//print the object to screen
-static PyObject *Point_repr(PointObject * self)
-{
- int i;
- char buffer[48], str[1024];
-
- BLI_strncpy(str,"[",1024);
- for(i = 0; i < self->size; i++){
- if(i < (self->size - 1)){
- sprintf(buffer, "%.6f, ", self->coord[i]);
- strcat(str,buffer);
- }else{
- sprintf(buffer, "%.6f", self->coord[i]);
- strcat(str,buffer);
- }
- }
- strcat(str, "](point)");
-
- return PyString_FromString(str);
-}
-//---------------------SEQUENCE PROTOCOLS------------------------
-//----------------------------len(object)------------------------
-//sequence length
-static int Point_len(PointObject * self)
-{
- return self->size;
-}
-//----------------------------object[]---------------------------
-//sequence accessor (get)
-static PyObject *Point_item(PointObject * self, int i)
-{
- if(i < 0 || i >= self->size)
- return EXPP_ReturnPyObjError(PyExc_IndexError,
- "point[attribute]: array index out of range\n");
-
- return PyFloat_FromDouble( (double)self->coord[i] );
-
-}
-//----------------------------object[]-------------------------
-//sequence accessor (set)
-static int Point_ass_item(PointObject * self, int i, PyObject * ob)
-{
- PyObject *f = NULL;
-
- f = PyNumber_Float(ob);
- if(f == NULL) { // parsed item not a number
- return EXPP_ReturnIntError(PyExc_TypeError,
- "point[attribute] = x: argument not a number\n");
- }
-
- if(i < 0 || i >= self->size){
- Py_DECREF(f);
- return EXPP_ReturnIntError(PyExc_IndexError,
- "point[attribute] = x: array assignment index out of range\n");
- }
- self->coord[i] = (float)PyFloat_AS_DOUBLE(f);
- Py_DECREF(f);
- return 0;
-}
-//----------------------------object[z:y]------------------------
-//sequence slice (get)
-static PyObject *Point_slice(PointObject * self, int begin, int end)
-{
- PyObject *list = NULL;
- int count;
-
- CLAMP(begin, 0, self->size);
- CLAMP(end, 0, self->size);
- begin = MIN2(begin,end);
-
- list = PyList_New(end - begin);
- for(count = begin; count < end; count++) {
- PyList_SetItem(list, count - begin,
- PyFloat_FromDouble(self->coord[count]));
- }
-
- return list;
-}
-//----------------------------object[z:y]------------------------
-//sequence slice (set)
-static int Point_ass_slice(PointObject * self, int begin, int end,
- PyObject * seq)
-{
- int i, y, size = 0;
- float coord[3];
- PyObject *v, *f;
-
- CLAMP(begin, 0, self->size);
- CLAMP(end, 0, self->size);
- begin = MIN2(begin,end);
-
- size = PySequence_Length(seq);
- if(size != (end - begin)){
- return EXPP_ReturnIntError(PyExc_TypeError,
- "point[begin:end] = []: size mismatch in slice assignment\n");
- }
-
- for (i = 0; i < size; i++) {
- v = PySequence_GetItem(seq, i);
- if (v == NULL) { // Failed to read sequence
- return EXPP_ReturnIntError(PyExc_RuntimeError,
- "point[begin:end] = []: unable to read sequence\n");
- }
- f = PyNumber_Float(v);
- if(f == NULL) { // parsed item not a number
- Py_DECREF(v);
- return EXPP_ReturnIntError(PyExc_TypeError,
- "point[begin:end] = []: sequence argument not a number\n");
- }
-
- coord[i] = (float)PyFloat_AS_DOUBLE(f);
- EXPP_decr2(f,v);
- }
- //parsed well - now set in point
- for(y = 0; y < size; y++){
- self->coord[begin + y] = coord[y];
- }
- return 0;
-}
-//------------------------NUMERIC PROTOCOLS----------------------
-//------------------------obj + obj------------------------------
-//addition
-static PyObject *Point_add(PyObject * v1, PyObject * v2)
-{
- int x, size;
- float coord[3];
- PointObject *coord1 = NULL, *coord2 = NULL;
- VectorObject *vec = NULL;
-
- coord1 = (PointObject*)v1;
- coord2 = (PointObject*)v2;
-
- if(!coord1->coerced_object){
- if(coord2->coerced_object){
- if(VectorObject_Check(coord2->coerced_object)){ //POINT + VECTOR
- //Point translation
- vec = (VectorObject*)coord2->coerced_object;
- size = coord1->size;
- if(vec->size == size){
- for(x = 0; x < size; x++){
- coord[x] = coord1->coord[x] + vec->vec[x];
- }
- }else{
- return EXPP_ReturnPyObjError(PyExc_AttributeError,
- "Point addition: arguments are the wrong size....\n");
- }
- return newPointObject(coord, size, Py_NEW);
- }
- }else{ //POINT + POINT
- size = coord1->size;
- if(coord2->size == size){
- for(x = 0; x < size; x++) {
- coord[x] = coord1->coord[x] + coord2->coord[x];
- }
- }else{
- return EXPP_ReturnPyObjError(PyExc_AttributeError,
- "Point addition: arguments are the wrong size....\n");
- }
- return newPointObject(coord, size, Py_NEW);
- }
- }
-
- return EXPP_ReturnPyObjError(PyExc_AttributeError,
- "Point addition: arguments not valid for this operation....\n");
-}
-//------------------------obj - obj------------------------------
-//subtraction
-static PyObject *Point_sub(PyObject * v1, PyObject * v2)
-{
- int x, size;
- float coord[3];
- PointObject *coord1 = NULL, *coord2 = NULL;
-
- coord1 = (PointObject*)v1;
- coord2 = (PointObject*)v2;
-
- if(coord1->coerced_object || coord2->coerced_object){
- return EXPP_ReturnPyObjError(PyExc_AttributeError,
- "Point subtraction: arguments not valid for this operation....\n");
- }
- if(coord1->size != coord2->size){
- return EXPP_ReturnPyObjError(PyExc_AttributeError,
- "Point subtraction: points must have the same dimensions for this operation\n");
- }
-
- size = coord1->size;
- for(x = 0; x < size; x++) {
- coord[x] = coord1->coord[x] - coord2->coord[x];
- }
-
- //Point - Point = Vector
- return newVectorObject(coord, size, Py_NEW);
-}
-//------------------------obj * obj------------------------------
-//mulplication
-static PyObject *Point_mul(PyObject * p1, PyObject * p2)
-{
- int x, size;
- float coord[3], scalar;
- PointObject *coord1 = NULL, *coord2 = NULL;
- PyObject *f = NULL;
- MatrixObject *mat = NULL;
- QuaternionObject *quat = NULL;
-
- coord1 = (PointObject*)p1;
- coord2 = (PointObject*)p2;
-
- if(coord1->coerced_object){
- if (PyFloat_Check(coord1->coerced_object) ||
- PyInt_Check(coord1->coerced_object)){ // FLOAT/INT * POINT
- f = PyNumber_Float(coord1->coerced_object);
- if(f == NULL) { // parsed item not a number
- return EXPP_ReturnPyObjError(PyExc_TypeError,
- "Point multiplication: arguments not acceptable for this operation\n");
- }
-
- scalar = (float)PyFloat_AS_DOUBLE(f);
- size = coord2->size;
- for(x = 0; x < size; x++) {
- coord[x] = coord2->coord[x] * scalar;
- }
- Py_DECREF(f);
- return newPointObject(coord, size, Py_NEW);
- }
- }else{
- if(coord2->coerced_object){
- if (PyFloat_Check(coord2->coerced_object) ||
- PyInt_Check(coord2->coerced_object)){ // POINT * FLOAT/INT
- f = PyNumber_Float(coord2->coerced_object);
- if(f == NULL) { // parsed item not a number
- return EXPP_ReturnPyObjError(PyExc_TypeError,
- "Point multiplication: arguments not acceptable for this operation\n");
- }
-
- scalar = (float)PyFloat_AS_DOUBLE(f);
- size = coord1->size;
- for(x = 0; x < size; x++) {
- coord[x] = coord1->coord[x] * scalar;
- }
- Py_DECREF(f);
- return newPointObject(coord, size, Py_NEW);
- }else if(MatrixObject_Check(coord2->coerced_object)){ //POINT * MATRIX
- mat = (MatrixObject*)coord2->coerced_object;
- return row_point_multiplication(coord1, mat);
- }else if(QuaternionObject_Check(coord2->coerced_object)){ //POINT * QUATERNION
- quat = (QuaternionObject*)coord2->coerced_object;
- if(coord1->size != 3){
- return EXPP_ReturnPyObjError(PyExc_TypeError,
- "Point multiplication: only 3D point rotations (with quats) currently supported\n");
- }
- return quat_rotation((PyObject*)coord1, (PyObject*)quat);
- }
- }
- }
-
- return EXPP_ReturnPyObjError(PyExc_TypeError,
- "Point multiplication: arguments not acceptable for this operation\n");
-}
-//-------------------------- -obj -------------------------------
-//returns the negative of this object
-static PyObject *Point_neg(PointObject *self)
-{
- int x;
- float coord[3];
-
- for(x = 0; x < self->size; x++)
- coord[x] = -self->coord[x];
-
- return newPointObject(coord, self->size, Py_NEW);
-}
-
-//------------------------coerce(obj, obj)-----------------------
-//coercion of unknown types to type PointObject for numeric protocols
-/*Coercion() is called whenever a math operation has 2 operands that
- it doesn't understand how to evaluate. 2+Matrix for example. We want to
- evaluate some of these operations like: (vector * 2), however, for math
- to proceed, the unknown operand must be cast to a type that python math will
- understand. (e.g. in the case above case, 2 must be cast to a vector and
- then call vector.multiply(vector, scalar_cast_as_vector)*/
-static int Point_coerce(PyObject ** p1, PyObject ** p2)
-{
- if(VectorObject_Check(*p2) || PyFloat_Check(*p2) || PyInt_Check(*p2) ||
- MatrixObject_Check(*p2) || QuaternionObject_Check(*p2)) {
- PyObject *coerced = EXPP_incr_ret(*p2);
- *p2 = newPointObject(NULL,3,Py_NEW);
- ((PointObject*)*p2)->coerced_object = coerced;
- Py_INCREF (*p1);
- return 0;
- }
-
- return EXPP_ReturnIntError(PyExc_TypeError,
- "point.coerce(): unknown operand - can't coerce for numeric protocols");
-}
-//-----------------PROTOCOL DECLARATIONS--------------------------
-static PySequenceMethods Point_SeqMethods = {
- (inquiry) Point_len, /* sq_length */
- (binaryfunc) 0, /* sq_concat */
- (intargfunc) 0, /* sq_repeat */
- (intargfunc) Point_item, /* sq_item */
- (intintargfunc) Point_slice, /* sq_slice */
- (intobjargproc) Point_ass_item, /* sq_ass_item */
- (intintobjargproc) Point_ass_slice, /* sq_ass_slice */
-};
-static PyNumberMethods Point_NumMethods = {
- (binaryfunc) Point_add, /* __add__ */
- (binaryfunc) Point_sub, /* __sub__ */
- (binaryfunc) Point_mul, /* __mul__ */
- (binaryfunc) 0, /* __div__ */
- (binaryfunc) 0, /* __mod__ */
- (binaryfunc) 0, /* __divmod__ */
- (ternaryfunc) 0, /* __pow__ */
- (unaryfunc) Point_neg, /* __neg__ */
- (unaryfunc) 0, /* __pos__ */
- (unaryfunc) 0, /* __abs__ */
- (inquiry) 0, /* __nonzero__ */
- (unaryfunc) 0, /* __invert__ */
- (binaryfunc) 0, /* __lshift__ */
- (binaryfunc) 0, /* __rshift__ */
- (binaryfunc) 0, /* __and__ */
- (binaryfunc) 0, /* __xor__ */
- (binaryfunc) 0, /* __or__ */
- (coercion) Point_coerce, /* __coerce__ */
- (unaryfunc) 0, /* __int__ */
- (unaryfunc) 0, /* __long__ */
- (unaryfunc) 0, /* __float__ */
- (unaryfunc) 0, /* __oct__ */
- (unaryfunc) 0, /* __hex__ */
-
-};
-//------------------PY_OBECT DEFINITION--------------------------
-PyTypeObject point_Type = {
- PyObject_HEAD_INIT(NULL)
- 0, /*ob_size */
- "point", /*tp_name */
- sizeof(PointObject), /*tp_basicsize */
- 0, /*tp_itemsize */
- (destructor) Point_dealloc, /*tp_dealloc */
- (printfunc) 0, /*tp_print */
- (getattrfunc) Point_getattr, /*tp_getattr */
- (setattrfunc) Point_setattr, /*tp_setattr */
- 0, /*tp_compare */
- (reprfunc) Point_repr, /*tp_repr */
- &Point_NumMethods, /*tp_as_number */
- &Point_SeqMethods, /*tp_as_sequence */
-};
-//------------------------newPointObject (internal)-------------
-//creates a new point object
-/*pass Py_WRAP - if point is a WRAPPER for data allocated by BLENDER
- (i.e. it was allocated elsewhere by MEM_mallocN())
- pass Py_NEW - if point is not a WRAPPER and managed by PYTHON
- (i.e. it must be created here with PyMEM_malloc())*/
-PyObject *newPointObject(float *coord, int size, int type)
-{
- PointObject *self;
- int x;
-
- point_Type.ob_type = &PyType_Type;
- self = PyObject_NEW(PointObject, &point_Type);
- self->data.blend_data = NULL;
- self->data.py_data = NULL;
- if(size > 3 || size < 2)
- return NULL;
- self->size = size;
- self->coerced_object = NULL;
-
- if(type == Py_WRAP){
- self->data.blend_data = coord;
- self->coord = self->data.blend_data;
- self->wrapped = Py_WRAP;
- }else if (type == Py_NEW){
- self->data.py_data = PyMem_Malloc(size * sizeof(float));
- self->coord = self->data.py_data;
- if(!coord) { //new empty
- for(x = 0; x < size; x++){
- self->coord[x] = 0.0f;
- }
- }else{
- for(x = 0; x < size; x++){
- self->coord[x] = coord[x];
- }
- }
- self->wrapped = Py_NEW;
- }else{ //bad type
- return NULL;
- }
- return (PyObject *) self;
-}