From 1e891f844aa02a59269d74d0dc0283e78a7ebda5 Mon Sep 17 00:00:00 2001 From: Willian Padovani Germano Date: Thu, 8 May 2003 03:06:46 +0000 Subject: [PATCH] * Added submodule Window, including FileSelector and ImageSelector: Most of the code comes from bpython/intern/opy_window.c, but two new functions were added, to access the file and image selector windows in Blender. * Added submodules Draw (gui) and BGL (OpenGL wrapper): The code comes from bpython/intern/opy_draw.c, with minor changes to integrate it in the new implementation. * Made changes to Camera, Lamp and Image submodules: The implementation was improved. These files should be good starting points for interested new coders to look at, now. * Renamed interface.[ch] to EXPP_interface.[ch] to avoid conflict: There is another interface.h file in source/blender/include. --- source/blender/python/api2_2x/BGL.c | 1486 +++++++++++++++++ source/blender/python/api2_2x/BGL.h | 424 +++++ source/blender/python/api2_2x/Blender.c | 7 +- source/blender/python/api2_2x/Camera.c | 779 +++------ source/blender/python/api2_2x/Camera.h | 2 - source/blender/python/api2_2x/Draw.c | 741 ++++++++ source/blender/python/api2_2x/Draw.h | 306 ++++ .../blender/python/api2_2x/EXPP_interface.c | 130 ++ .../blender/python/api2_2x/EXPP_interface.h | 35 + source/blender/python/api2_2x/Image.c | 358 ++-- source/blender/python/api2_2x/Image.h | 15 +- source/blender/python/api2_2x/Lamp.c | 1385 ++++++--------- source/blender/python/api2_2x/Lamp.h | 78 +- source/blender/python/api2_2x/Window.c | 200 +++ source/blender/python/api2_2x/Window.h | 129 ++ source/blender/python/api2_2x/gen_utils.c | 15 +- source/blender/python/api2_2x/gen_utils.h | 8 +- source/blender/python/api2_2x/modules.h | 16 +- 18 files changed, 4342 insertions(+), 1772 deletions(-) create mode 100644 source/blender/python/api2_2x/BGL.c create mode 100644 source/blender/python/api2_2x/BGL.h create mode 100644 source/blender/python/api2_2x/Draw.c create mode 100644 source/blender/python/api2_2x/Draw.h create mode 100644 source/blender/python/api2_2x/EXPP_interface.c create mode 100644 source/blender/python/api2_2x/EXPP_interface.h create mode 100644 source/blender/python/api2_2x/Window.c create mode 100644 source/blender/python/api2_2x/Window.h diff --git a/source/blender/python/api2_2x/BGL.c b/source/blender/python/api2_2x/BGL.c new file mode 100644 index 00000000000..858b343bfe8 --- /dev/null +++ b/source/blender/python/api2_2x/BGL.c @@ -0,0 +1,1486 @@ +/* + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * This is a new part of Blender. + * + * Contributor(s): Willian P. Germano + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** +*/ + +/* This file is the Blender.BGL part of opy_draw.c, from the old + * bpython/intern dir, with minor changes to adapt it to the new Python + * implementation. The BGL submodule "wraps" OpenGL functions and constants, + * allowing script writers to make OpenGL calls in their Python scripts. */ + +#include "BGL.h" + +static int type_size(int type) +{ + switch (type) { + case GL_BYTE: + return sizeof(char); + case GL_SHORT: + return sizeof(short); + case GL_INT: + return sizeof(int); + case GL_FLOAT: + return sizeof(float); + } + return -1; +} + +static Buffer *make_buffer(int type, int ndimensions, int *dimensions) +{ + Buffer *buffer; + void *buf= NULL; + int i, size, length; + + length= 1; + for (i=0; iparent= NULL; + buffer->ndimensions= ndimensions; + buffer->dimensions= dimensions; + buffer->type= type; + buffer->buf.asvoid= buf; + + for (i= 0; ibuf.asbyte[i]= 0; + + else if (type==GL_SHORT) + buffer->buf.asshort[i]= 0; + + else if (type==GL_INT) + buffer->buf.asint[i]= 0; + + else if (type==GL_FLOAT) + buffer->buf.asfloat[i]= 0.0; + } + + return buffer; +} + +static PyObject *Method_Buffer (PyObject *self, PyObject *args) +{ + PyObject *length_ob= NULL, *template= NULL; + Buffer *buffer; + + int i, type; + int *dimensions = 0, ndimensions = 0; + + if (!PyArg_ParseTuple(args, "iO|O", &type, &length_ob, &template)) + return EXPP_ReturnPyObjError(PyExc_AttributeError, + "expected an int and one or two PyObjects"); + + if (type!=GL_BYTE && type!=GL_SHORT && type!=GL_INT && type!=GL_FLOAT) { + PyErr_SetString(PyExc_AttributeError, "type"); + return NULL; + } + + if (PyNumber_Check(length_ob)) { + ndimensions= 1; + dimensions= MEM_mallocN(ndimensions*sizeof(int), "Buffer dimensions"); + dimensions[0]= PyInt_AsLong(length_ob); + + } else if (PySequence_Check(length_ob)) { + ndimensions= PySequence_Length(length_ob); + dimensions= MEM_mallocN(ndimensions*sizeof(int), "Buffer dimensions"); + + for (i=0; idimensions[0]; +} + +static PyObject *Buffer_item(PyObject *self, int i) +{ + Buffer *buf= (Buffer *) self; + + if (i >= buf->dimensions[0]) { + PyErr_SetString(PyExc_IndexError, "array index out of range"); + return NULL; + } + + if (buf->ndimensions==1) { + switch (buf->type) { + case GL_BYTE: return Py_BuildValue("b", buf->buf.asbyte[i]); + case GL_SHORT: return Py_BuildValue("h", buf->buf.asshort[i]); + case GL_INT: return Py_BuildValue("i", buf->buf.asint[i]); + case GL_FLOAT: return Py_BuildValue("f", buf->buf.asfloat[i]); + } + } else { + Buffer *newbuf; + int j, length, size; + + length= 1; + for (j=1; jndimensions; j++) { + length*= buf->dimensions[j]; + } + size= type_size(buf->type); + + newbuf= (Buffer *) PyObject_NEW(Buffer, &Buffer_Type); + + Py_INCREF(self); + newbuf->parent= self; + + newbuf->ndimensions= buf->ndimensions-1; + newbuf->type= buf->type; + newbuf->buf.asvoid= buf->buf.asbyte + i*length*size; + + newbuf->dimensions= MEM_mallocN(newbuf->ndimensions*sizeof(int), + "Buffer dimensions"); + memcpy(newbuf->dimensions, buf->dimensions+1, + newbuf->ndimensions*sizeof(int)); + + return (PyObject *) newbuf; + } + + return NULL; +} + +static PyObject *Buffer_slice(PyObject *self, int begin, int end) +{ + Buffer *buf= (Buffer *) self; + PyObject *list; + int count; + + if (begin<0) begin= 0; + if (end>buf->dimensions[0]) end= buf->dimensions[0]; + if (begin>end) begin= end; + + list= PyList_New(end-begin); + + for (count= begin; count= buf->dimensions[0]) { + PyErr_SetString(PyExc_IndexError, "array assignment index out of range"); + return -1; + } + + if (buf->ndimensions!=1) { + PyObject *row= Buffer_item(self, i); + int ret; + + if (!row) return -1; + + ret= Buffer_ass_slice(row, 0, buf->dimensions[1], v); + Py_DECREF(row); + + return ret; + } + + if (buf->type==GL_BYTE) { + if (!PyArg_Parse(v, "b;Coordinates must be ints", &buf->buf.asbyte[i])) + return -1; + + } else if (buf->type==GL_SHORT) { + if (!PyArg_Parse(v, "h;Coordinates must be ints", &buf->buf.asshort[i])) + return -1; + + } else if (buf->type==GL_INT) { + if (!PyArg_Parse(v, "i;Coordinates must be ints", &buf->buf.asint[i])) + return -1; + + } else if (buf->type==GL_FLOAT) { + if (!PyArg_Parse(v, "f;Coordinates must be floats", &buf->buf.asfloat[i])) + return -1; + } + + return 0; +} + +static int Buffer_ass_slice(PyObject *self, int begin, int end, PyObject *seq) +{ + Buffer *buf= (Buffer *) self; + PyObject *item; + int count, err=0; + + if (begin<0) begin= 0; + if (end>buf->dimensions[0]) end= buf->dimensions[0]; + if (begin>end) begin= end; + + if (!PySequence_Check(seq)) { + PyErr_SetString(PyExc_TypeError, + "illegal argument type for built-in operation"); + return -1; + } + + if (PySequence_Length(seq)!=(end-begin)) { + PyErr_SetString(PyExc_TypeError, "size mismatch in assignment"); + return -1; + } + + for (count= begin; countparent) Py_DECREF(buf->parent); + else MEM_freeN(buf->buf.asvoid); + + MEM_freeN(buf->dimensions); + + PyMem_DEL(self); +} + +static PyObject *Buffer_tolist(PyObject *self) +{ + int i, len= ((Buffer *)self)->dimensions[0]; + PyObject *list= PyList_New(len); + + for (i=0; indimensions); + int i; + + for (i= 0; indimensions; i++) { + PyList_SetItem(list, i, PyInt_FromLong(buffer->dimensions[i])); + } + + return list; +} + +static PyObject *Buffer_getattr(PyObject *self, char *name) +{ + if (strcmp(name, "list")==0) return Buffer_tolist(self); + else if (strcmp(name, "dimensions")==0) return Buffer_dimensions(self); + + PyErr_SetString(PyExc_AttributeError, name); + return NULL; +} + +static PyObject *Buffer_repr(PyObject *self) +{ + PyObject *list= Buffer_tolist(self); + PyObject *repr= PyObject_Repr(list); + Py_DECREF(list); + + return repr; +} + +/* BGL_Wrap defined in BGL.h */ +#ifndef __APPLE__ +BGL_Wrap(2, Accum, void, (GLenum, GLfloat)) +BGL_Wrap(2, AlphaFunc, void, (GLenum, GLclampf)) +BGL_Wrap(3, AreTexturesResident, GLboolean, (GLsizei, GLuintP, GLbooleanP)) +BGL_Wrap(1, Begin, void, (GLenum)) +BGL_Wrap(2, BindTexture, void, (GLenum, GLuint)) +BGL_Wrap(7, Bitmap, void, (GLsizei, GLsizei, GLfloat, + GLfloat, GLfloat, GLfloat, GLubyteP)) +BGL_Wrap(2, BlendFunc, void, (GLenum, GLenum)) +BGL_Wrap(1, CallList, void, (GLuint)) +BGL_Wrap(3, CallLists, void, (GLsizei, GLenum, GLvoidP)) +BGL_Wrap(1, Clear, void, (GLbitfield)) +BGL_Wrap(4, ClearAccum, void, (GLfloat, GLfloat, GLfloat, GLfloat)) +BGL_Wrap(4, ClearColor, void, (GLclampf, GLclampf, GLclampf, GLclampf)) +BGL_Wrap(1, ClearDepth, void, (GLclampd)) +BGL_Wrap(1, ClearIndex, void, (GLfloat)) +BGL_Wrap(1, ClearStencil, void, (GLint)) +BGL_Wrap(2, ClipPlane, void, (GLenum, GLdoubleP)) +BGL_Wrap(3, Color3b, void, (GLbyte, GLbyte, GLbyte)) +BGL_Wrap(1, Color3bv, void, (GLbyteP)) +BGL_Wrap(3, Color3d, void, (GLdouble, GLdouble, GLdouble)) +BGL_Wrap(1, Color3dv, void, (GLdoubleP)) +BGL_Wrap(3, Color3f, void, (GLfloat, GLfloat, GLfloat)) +BGL_Wrap(1, Color3fv, void, (GLfloatP)) +BGL_Wrap(3, Color3i, void, (GLint, GLint, GLint)) +BGL_Wrap(1, Color3iv, void, (GLintP)) +BGL_Wrap(3, Color3s, void, (GLshort, GLshort, GLshort)) +BGL_Wrap(1, Color3sv, void, (GLshortP)) +BGL_Wrap(3, Color3ub, void, (GLubyte, GLubyte, GLubyte)) +BGL_Wrap(1, Color3ubv, void, (GLubyteP)) +BGL_Wrap(3, Color3ui, void, (GLuint, GLuint, GLuint)) +BGL_Wrap(1, Color3uiv, void, (GLuintP)) +BGL_Wrap(3, Color3us, void, (GLushort, GLushort, GLushort)) +BGL_Wrap(1, Color3usv, void, (GLushortP)) +BGL_Wrap(4, Color4b, void, (GLbyte, GLbyte, GLbyte, GLbyte)) +BGL_Wrap(1, Color4bv, void, (GLbyteP)) +BGL_Wrap(4, Color4d, void, (GLdouble, GLdouble, GLdouble, GLdouble)) +BGL_Wrap(1, Color4dv, void, (GLdoubleP)) +BGL_Wrap(4, Color4f, void, (GLfloat, GLfloat, GLfloat, GLfloat)) +BGL_Wrap(1, Color4fv, void, (GLfloatP)) +BGL_Wrap(4, Color4i, void, (GLint, GLint, GLint, GLint)) +BGL_Wrap(1, Color4iv, void, (GLintP)) +BGL_Wrap(4, Color4s, void, (GLshort, GLshort, GLshort, GLshort)) +BGL_Wrap(1, Color4sv, void, (GLshortP)) +BGL_Wrap(4, Color4ub, void, (GLubyte, GLubyte, GLubyte, GLubyte)) +BGL_Wrap(1, Color4ubv, void, (GLubyteP)) +BGL_Wrap(4, Color4ui, void, (GLuint, GLuint, GLuint, GLuint)) +BGL_Wrap(1, Color4uiv, void, (GLuintP)) +BGL_Wrap(4, Color4us, void, (GLushort, GLushort, GLushort, GLushort)) +BGL_Wrap(1, Color4usv, void, (GLushortP)) +BGL_Wrap(4, ColorMask, void, (GLboolean, GLboolean, GLboolean, GLboolean)) +BGL_Wrap(2, ColorMaterial, void, (GLenum, GLenum)) +BGL_Wrap(5, CopyPixels, void, (GLint, GLint, GLsizei, GLsizei, GLenum)) +BGL_Wrap(1, CullFace, void, (GLenum)) +BGL_Wrap(2, DeleteLists, void, (GLuint, GLsizei)) +BGL_Wrap(2, DeleteTextures, void, (GLsizei, GLuintP)) +BGL_Wrap(1, DepthFunc, void, (GLenum)) +BGL_Wrap(1, DepthMask, void, (GLboolean)) +BGL_Wrap(2, DepthRange, void, (GLclampd, GLclampd)) +BGL_Wrap(1, Disable, void, (GLenum)) +BGL_Wrap(1, DrawBuffer, void, (GLenum)) +BGL_Wrap(5, DrawPixels, void, (GLsizei, GLsizei, GLenum, GLenum, GLvoidP)) +BGL_Wrap(1, EdgeFlag, void, (GLboolean)) +BGL_Wrap(1, EdgeFlagv, void, (GLbooleanP)) +BGL_Wrap(1, Enable, void, (GLenum)) +BGL_Wrap(1, End, void, (void)) +BGL_Wrap(1, EndList, void, (void)) +BGL_Wrap(1, EvalCoord1d, void, (GLdouble)) +BGL_Wrap(1, EvalCoord1dv, void, (GLdoubleP)) +BGL_Wrap(1, EvalCoord1f, void, (GLfloat)) +BGL_Wrap(1, EvalCoord1fv, void, (GLfloatP)) +BGL_Wrap(2, EvalCoord2d, void, (GLdouble, GLdouble)) +BGL_Wrap(1, EvalCoord2dv, void, (GLdoubleP)) +BGL_Wrap(2, EvalCoord2f, void, (GLfloat, GLfloat)) +BGL_Wrap(1, EvalCoord2fv, void, (GLfloatP)) +BGL_Wrap(3, EvalMesh1, void, (GLenum, GLint, GLint)) +BGL_Wrap(5, EvalMesh2, void, (GLenum, GLint, GLint, GLint, GLint)) +BGL_Wrap(1, EvalPoint1, void, (GLint)) +BGL_Wrap(2, EvalPoint2, void, (GLint, GLint)) +BGL_Wrap(3, FeedbackBuffer, void, (GLsizei, GLenum, GLfloatP)) +BGL_Wrap(1, Finish, void, (void)) +BGL_Wrap(1, Flush, void, (void)) +BGL_Wrap(2, Fogf, void, (GLenum, GLfloat)) +BGL_Wrap(2, Fogfv, void, (GLenum, GLfloatP)) +BGL_Wrap(2, Fogi, void, (GLenum, GLint)) +BGL_Wrap(2, Fogiv, void, (GLenum, GLintP)) +BGL_Wrap(1, FrontFace, void, (GLenum)) +BGL_Wrap(6, Frustum, void, (GLdouble, GLdouble, + GLdouble, GLdouble, GLdouble, GLdouble)) +BGL_Wrap(1, GenLists, GLuint, (GLsizei)) +BGL_Wrap(2, GenTextures, void, (GLsizei, GLuintP)) +BGL_Wrap(2, GetBooleanv, void, (GLenum, GLbooleanP)) +BGL_Wrap(2, GetClipPlane, void, (GLenum, GLdoubleP)) +BGL_Wrap(2, GetDoublev, void, (GLenum, GLdoubleP)) +BGL_Wrap(1, GetError, GLenum, (void)) +BGL_Wrap(2, GetFloatv, void, (GLenum, GLfloatP)) +BGL_Wrap(2, GetIntegerv, void, (GLenum, GLintP)) +BGL_Wrap(3, GetLightfv, void, (GLenum, GLenum, GLfloatP)) +BGL_Wrap(3, GetLightiv, void, (GLenum, GLenum, GLintP)) +BGL_Wrap(3, GetMapdv, void, (GLenum, GLenum, GLdoubleP)) +BGL_Wrap(3, GetMapfv, void, (GLenum, GLenum, GLfloatP)) +BGL_Wrap(3, GetMapiv, void, (GLenum, GLenum, GLintP)) +BGL_Wrap(3, GetMaterialfv, void, (GLenum, GLenum, GLfloatP)) +BGL_Wrap(3, GetMaterialiv, void, (GLenum, GLenum, GLintP)) +BGL_Wrap(2, GetPixelMapfv, void, (GLenum, GLfloatP)) +BGL_Wrap(2, GetPixelMapuiv, void, (GLenum, GLuintP)) +BGL_Wrap(2, GetPixelMapusv, void, (GLenum, GLushortP)) +BGL_Wrap(1, GetPolygonStipple,void, (GLubyteP)) +BGL_Wrap(1, GetString, GLstring, (GLenum)) +BGL_Wrap(3, GetTexEnvfv, void, (GLenum, GLenum, GLfloatP)) +BGL_Wrap(3, GetTexEnviv, void, (GLenum, GLenum, GLintP)) +BGL_Wrap(3, GetTexGendv, void, (GLenum, GLenum, GLdoubleP)) +BGL_Wrap(3, GetTexGenfv, void, (GLenum, GLenum, GLfloatP)) +BGL_Wrap(3, GetTexGeniv, void, (GLenum, GLenum, GLintP)) +BGL_Wrap(5, GetTexImage, void, (GLenum, GLint, GLenum, GLenum, GLvoidP)) +BGL_Wrap(4, GetTexLevelParameterfv, void, (GLenum, GLint, GLenum, GLfloatP)) +BGL_Wrap(4, GetTexLevelParameteriv, void, (GLenum, GLint, GLenum, GLintP)) +BGL_Wrap(3, GetTexParameterfv, void, (GLenum, GLenum, GLfloatP)) +BGL_Wrap(3, GetTexParameteriv, void, (GLenum, GLenum, GLintP)) +BGL_Wrap(2, Hint, void, (GLenum, GLenum)) +BGL_Wrap(1, IndexMask, void, (GLuint)) +BGL_Wrap(1, Indexd, void, (GLdouble)) +BGL_Wrap(1, Indexdv, void, (GLdoubleP)) +BGL_Wrap(1, Indexf, void, (GLfloat)) +BGL_Wrap(1, Indexfv, void, (GLfloatP)) +BGL_Wrap(1, Indexi, void, (GLint)) +BGL_Wrap(1, Indexiv, void, (GLintP)) +BGL_Wrap(1, Indexs, void, (GLshort)) +BGL_Wrap(1, Indexsv, void, (GLshortP)) +BGL_Wrap(1, InitNames, void, (void)) +BGL_Wrap(1, IsEnabled, GLboolean, (GLenum)) +BGL_Wrap(1, IsList, GLboolean, (GLuint)) +BGL_Wrap(1, IsTexture, GLboolean, (GLuint)) +BGL_Wrap(2, LightModelf, void, (GLenum, GLfloat)) +BGL_Wrap(2, LightModelfv, void, (GLenum, GLfloatP)) +BGL_Wrap(2, LightModeli, void, (GLenum, GLint)) +BGL_Wrap(2, LightModeliv, void, (GLenum, GLintP)) +BGL_Wrap(3, Lightf, void, (GLenum, GLenum, GLfloat)) +BGL_Wrap(3, Lightfv, void, (GLenum, GLenum, GLfloatP)) +BGL_Wrap(3, Lighti, void, (GLenum, GLenum, GLint)) +BGL_Wrap(3, Lightiv, void, (GLenum, GLenum, GLintP)) +BGL_Wrap(2, LineStipple, void, (GLint, GLushort)) +BGL_Wrap(1, LineWidth, void, (GLfloat)) +BGL_Wrap(1, ListBase, void, (GLuint)) +BGL_Wrap(1, LoadIdentity, void, (void)) +BGL_Wrap(1, LoadMatrixd, void, (GLdoubleP)) +BGL_Wrap(1, LoadMatrixf, void, (GLfloatP)) +BGL_Wrap(1, LoadName, void, (GLuint)) +BGL_Wrap(1, LogicOp, void, (GLenum)) +BGL_Wrap(6, Map1d, void, (GLenum, GLdouble, GLdouble, + GLint, GLint, GLdoubleP)) +BGL_Wrap(6, Map1f, void, (GLenum, GLfloat, GLfloat, + GLint, GLint, GLfloatP)) +BGL_Wrap(10, Map2d, void, (GLenum, GLdouble, GLdouble, + GLint, GLint, GLdouble, GLdouble, GLint, GLint, GLdoubleP)) +BGL_Wrap(10, Map2f, void, (GLenum, GLfloat, GLfloat, + GLint, GLint, GLfloat, GLfloat, GLint, GLint, GLfloatP)) +BGL_Wrap(3, MapGrid1d, void, (GLint, GLdouble, GLdouble)) +BGL_Wrap(3, MapGrid1f, void, (GLint, GLfloat, GLfloat)) +BGL_Wrap(6, MapGrid2d, void, (GLint, GLdouble, GLdouble, + GLint, GLdouble, GLdouble)) +BGL_Wrap(6, MapGrid2f, void, (GLint, GLfloat, GLfloat, + GLint, GLfloat, GLfloat)) +BGL_Wrap(3, Materialf, void, (GLenum, GLenum, GLfloat)) +BGL_Wrap(3, Materialfv, void, (GLenum, GLenum, GLfloatP)) +BGL_Wrap(3, Materiali, void, (GLenum, GLenum, GLint)) +BGL_Wrap(3, Materialiv, void, (GLenum, GLenum, GLintP)) +BGL_Wrap(1, MatrixMode, void, (GLenum)) +BGL_Wrap(1, MultMatrixd, void, (GLdoubleP)) +BGL_Wrap(1, MultMatrixf, void, (GLfloatP)) +BGL_Wrap(2, NewList, void, (GLuint, GLenum)) +BGL_Wrap(3, Normal3b, void, (GLbyte, GLbyte, GLbyte)) +BGL_Wrap(1, Normal3bv, void, (GLbyteP)) +BGL_Wrap(3, Normal3d, void, (GLdouble, GLdouble, GLdouble)) +BGL_Wrap(1, Normal3dv, void, (GLdoubleP)) +BGL_Wrap(3, Normal3f, void, (GLfloat, GLfloat, GLfloat)) +BGL_Wrap(1, Normal3fv, void, (GLfloatP)) +BGL_Wrap(3, Normal3i, void, (GLint, GLint, GLint)) +BGL_Wrap(1, Normal3iv, void, (GLintP)) +BGL_Wrap(3, Normal3s, void, (GLshort, GLshort, GLshort)) +BGL_Wrap(1, Normal3sv, void, (GLshortP)) +BGL_Wrap(6, Ortho, void, (GLdouble, GLdouble, + GLdouble, GLdouble, GLdouble, GLdouble)) +BGL_Wrap(1, PassThrough, void, (GLfloat)) +BGL_Wrap(3, PixelMapfv, void, (GLenum, GLint, GLfloatP)) +BGL_Wrap(3, PixelMapuiv, void, (GLenum, GLint, GLuintP)) +BGL_Wrap(3, PixelMapusv, void, (GLenum, GLint, GLushortP)) +BGL_Wrap(2, PixelStoref, void, (GLenum, GLfloat)) +BGL_Wrap(2, PixelStorei, void, (GLenum, GLint)) +BGL_Wrap(2, PixelTransferf, void, (GLenum, GLfloat)) +BGL_Wrap(2, PixelTransferi, void, (GLenum, GLint)) +BGL_Wrap(2, PixelZoom, void, (GLfloat, GLfloat)) +BGL_Wrap(1, PointSize, void, (GLfloat)) +BGL_Wrap(2, PolygonMode, void, (GLenum, GLenum)) +BGL_Wrap(2, PolygonOffset, void, (GLfloat, GLfloat)) +BGL_Wrap(1, PolygonStipple, void, (GLubyteP)) +BGL_Wrap(1, PopAttrib, void, (void)) +BGL_Wrap(1, PopMatrix, void, (void)) +BGL_Wrap(1, PopName, void, (void)) +BGL_Wrap(3, PrioritizeTextures, void, (GLsizei, GLuintP, GLclampfP)) +BGL_Wrap(1, PushAttrib, void, (GLbitfield)) +BGL_Wrap(1, PushMatrix, void, (void)) +BGL_Wrap(1, PushName, void, (GLuint)) +BGL_Wrap(2, RasterPos2d, void, (GLdouble, GLdouble)) +BGL_Wrap(1, RasterPos2dv, void, (GLdoubleP)) +BGL_Wrap(2, RasterPos2f, void, (GLfloat, GLfloat)) +BGL_Wrap(1, RasterPos2fv, void, (GLfloatP)) +BGL_Wrap(2, RasterPos2i, void, (GLint, GLint)) +BGL_Wrap(1, RasterPos2iv, void, (GLintP)) +BGL_Wrap(2, RasterPos2s, void, (GLshort, GLshort)) +BGL_Wrap(1, RasterPos2sv, void, (GLshortP)) +BGL_Wrap(3, RasterPos3d, void, (GLdouble, GLdouble, GLdouble)) +BGL_Wrap(1, RasterPos3dv, void, (GLdoubleP)) +BGL_Wrap(3, RasterPos3f, void, (GLfloat, GLfloat, GLfloat)) +BGL_Wrap(1, RasterPos3fv, void, (GLfloatP)) +BGL_Wrap(3, RasterPos3i, void, (GLint, GLint, GLint)) +BGL_Wrap(1, RasterPos3iv, void, (GLintP)) +BGL_Wrap(3, RasterPos3s, void, (GLshort, GLshort, GLshort)) +BGL_Wrap(1, RasterPos3sv, void, (GLshortP)) +BGL_Wrap(4, RasterPos4d, void, (GLdouble, GLdouble, GLdouble, GLdouble)) +BGL_Wrap(1, RasterPos4dv, void, (GLdoubleP)) +BGL_Wrap(4, RasterPos4f, void, (GLfloat, GLfloat, GLfloat, GLfloat)) +BGL_Wrap(1, RasterPos4fv, void, (GLfloatP)) +BGL_Wrap(4, RasterPos4i, void, (GLint, GLint, GLint, GLint)) +BGL_Wrap(1, RasterPos4iv, void, (GLintP)) +BGL_Wrap(4, RasterPos4s, void, (GLshort, GLshort, GLshort, GLshort)) +BGL_Wrap(1, RasterPos4sv, void, (GLshortP)) +BGL_Wrap(1, ReadBuffer, void, (GLenum)) +BGL_Wrap(7, ReadPixels, void, (GLint, GLint, GLsizei, + GLsizei, GLenum, GLenum, GLvoidP)) +BGL_Wrap(4, Rectd, void, (GLdouble, GLdouble, GLdouble, GLdouble)) +BGL_Wrap(2, Rectdv, void, (GLdoubleP, GLdoubleP)) +BGL_Wrap(4, Rectf, void, (GLfloat, GLfloat, GLfloat, GLfloat)) +BGL_Wrap(2, Rectfv, void, (GLfloatP, GLfloatP)) +BGL_Wrap(4, Recti, void, (GLint, GLint, GLint, GLint)) +BGL_Wrap(2, Rectiv, void, (GLintP, GLintP)) +BGL_Wrap(4, Rects, void, (GLshort, GLshort, GLshort, GLshort)) +BGL_Wrap(2, Rectsv, void, (GLshortP, GLshortP)) +BGL_Wrap(1, RenderMode, GLint, (GLenum)) +BGL_Wrap(4, Rotated, void, (GLdouble, GLdouble, GLdouble, GLdouble)) +BGL_Wrap(4, Rotatef, void, (GLfloat, GLfloat, GLfloat, GLfloat)) +BGL_Wrap(3, Scaled, void, (GLdouble, GLdouble, GLdouble)) +BGL_Wrap(3, Scalef, void, (GLfloat, GLfloat, GLfloat)) +BGL_Wrap(4, Scissor, void, (GLint, GLint, GLsizei, GLsizei)) +BGL_Wrap(2, SelectBuffer, void, (GLsizei, GLuintP)) +BGL_Wrap(1, ShadeModel, void, (GLenum)) +BGL_Wrap(3, StencilFunc, void, (GLenum, GLint, GLuint)) +BGL_Wrap(1, StencilMask, void, (GLuint)) +BGL_Wrap(3, StencilOp, void, (GLenum, GLenum, GLenum)) +BGL_Wrap(1, TexCoord1d, void, (GLdouble)) +BGL_Wrap(1, TexCoord1dv, void, (GLdoubleP)) +BGL_Wrap(1, TexCoord1f, void, (GLfloat)) +BGL_Wrap(1, TexCoord1fv, void, (GLfloatP)) +BGL_Wrap(1, TexCoord1i, void, (GLint)) +BGL_Wrap(1, TexCoord1iv, void, (GLintP)) +BGL_Wrap(1, TexCoord1s, void, (GLshort)) +BGL_Wrap(1, TexCoord1sv, void, (GLshortP)) +BGL_Wrap(2, TexCoord2d, void, (GLdouble, GLdouble)) +BGL_Wrap(1, TexCoord2dv, void, (GLdoubleP)) +BGL_Wrap(2, TexCoord2f, void, (GLfloat, GLfloat)) +BGL_Wrap(1, TexCoord2fv, void, (GLfloatP)) +BGL_Wrap(2, TexCoord2i, void, (GLint, GLint)) +BGL_Wrap(1, TexCoord2iv, void, (GLintP)) +BGL_Wrap(2, TexCoord2s, void, (GLshort, GLshort)) +BGL_Wrap(1, TexCoord2sv, void, (GLshortP)) +BGL_Wrap(3, TexCoord3d, void, (GLdouble, GLdouble, GLdouble)) +BGL_Wrap(1, TexCoord3dv, void, (GLdoubleP)) +BGL_Wrap(3, TexCoord3f, void, (GLfloat, GLfloat, GLfloat)) +BGL_Wrap(1, TexCoord3fv, void, (GLfloatP)) +BGL_Wrap(3, TexCoord3i, void, (GLint, GLint, GLint)) +BGL_Wrap(1, TexCoord3iv, void, (GLintP)) +BGL_Wrap(3, TexCoord3s, void, (GLshort, GLshort, GLshort)) +BGL_Wrap(1, TexCoord3sv, void, (GLshortP)) +BGL_Wrap(4, TexCoord4d, void, (GLdouble, GLdouble, GLdouble, GLdouble)) +BGL_Wrap(1, TexCoord4dv, void, (GLdoubleP)) +BGL_Wrap(4, TexCoord4f, void, (GLfloat, GLfloat, GLfloat, GLfloat)) +BGL_Wrap(1, TexCoord4fv, void, (GLfloatP)) +BGL_Wrap(4, TexCoord4i, void, (GLint, GLint, GLint, GLint)) +BGL_Wrap(1, TexCoord4iv, void, (GLintP)) +BGL_Wrap(4, TexCoord4s, void, (GLshort, GLshort, GLshort, GLshort)) +BGL_Wrap(1, TexCoord4sv, void, (GLshortP)) +BGL_Wrap(3, TexEnvf, void, (GLenum, GLenum, GLfloat)) +BGL_Wrap(3, TexEnvfv, void, (GLenum, GLenum, GLfloatP)) +BGL_Wrap(3, TexEnvi, void, (GLenum, GLenum, GLint)) +BGL_Wrap(3, TexEnviv, void, (GLenum, GLenum, GLintP)) +BGL_Wrap(3, TexGend, void, (GLenum, GLenum, GLdouble)) +BGL_Wrap(3, TexGendv, void, (GLenum, GLenum, GLdoubleP)) +BGL_Wrap(3, TexGenf, void, (GLenum, GLenum, GLfloat)) +BGL_Wrap(3, TexGenfv, void, (GLenum, GLenum, GLfloatP)) +BGL_Wrap(3, TexGeni, void, (GLenum, GLenum, GLint)) +BGL_Wrap(3, TexGeniv, void, (GLenum, GLenum, GLintP)) +BGL_Wrap(8, TexImage1D, void, (GLenum, GLint, GLint, + GLsizei, GLint, GLenum, GLenum, GLvoidP)) +BGL_Wrap(9, TexImage2D, void, (GLenum, GLint, GLint, + GLsizei, GLsizei, GLint, GLenum, GLenum, GLvoidP)) +BGL_Wrap(3, TexParameterf, void, (GLenum, GLenum, GLfloat)) +BGL_Wrap(3, TexParameterfv, void, (GLenum, GLenum, GLfloatP)) +BGL_Wrap(3, TexParameteri, void, (GLenum, GLenum, GLint)) +BGL_Wrap(3, TexParameteriv, void, (GLenum, GLenum, GLintP)) +BGL_Wrap(3, Translated, void, (GLdouble, GLdouble, GLdouble)) +BGL_Wrap(3, Translatef, void, (GLfloat, GLfloat, GLfloat)) +BGL_Wrap(2, Vertex2d, void, (GLdouble, GLdouble)) +BGL_Wrap(1, Vertex2dv, void, (GLdoubleP)) +BGL_Wrap(2, Vertex2f, void, (GLfloat, GLfloat)) +BGL_Wrap(1, Vertex2fv, void, (GLfloatP)) +BGL_Wrap(2, Vertex2i, void, (GLint, GLint)) +BGL_Wrap(1, Vertex2iv, void, (GLintP)) +BGL_Wrap(2, Vertex2s, void, (GLshort, GLshort)) +BGL_Wrap(1, Vertex2sv, void, (GLshortP)) +BGL_Wrap(3, Vertex3d, void, (GLdouble, GLdouble, GLdouble)) +BGL_Wrap(1, Vertex3dv, void, (GLdoubleP)) +BGL_Wrap(3, Vertex3f, void, (GLfloat, GLfloat, GLfloat)) +BGL_Wrap(1, Vertex3fv, void, (GLfloatP)) +BGL_Wrap(3, Vertex3i, void, (GLint, GLint, GLint)) +BGL_Wrap(1, Vertex3iv, void, (GLintP)) +BGL_Wrap(3, Vertex3s, void, (GLshort, GLshort, GLshort)) +BGL_Wrap(1, Vertex3sv, void, (GLshortP)) +BGL_Wrap(4, Vertex4d, void, (GLdouble, GLdouble, GLdouble, GLdouble)) +BGL_Wrap(1, Vertex4dv, void, (GLdoubleP)) +BGL_Wrap(4, Vertex4f, void, (GLfloat, GLfloat, GLfloat, GLfloat)) +BGL_Wrap(1, Vertex4fv, void, (GLfloatP)) +BGL_Wrap(4, Vertex4i, void, (GLint, GLint, GLint, GLint)) +BGL_Wrap(1, Vertex4iv, void, (GLintP)) +BGL_Wrap(4, Vertex4s, void, (GLshort, GLshort, GLshort, GLshort)) +BGL_Wrap(1, Vertex4sv, void, (GLshortP)) +BGL_Wrap(4, Viewport, void, (GLint, GLint, GLsizei, GLsizei)) +#endif + +#undef MethodDef +#define MethodDef(func) {"gl"#func, Method_##func, METH_VARARGS} + +/* So that MethodDef(Accum) becomes: + * {"glAccum", Method_Accumfunc, METH_VARARGS} */ + +static struct PyMethodDef BGL_methods[] = { + {"Buffer", Method_Buffer, METH_VARARGS, Method_Buffer_doc}, +#ifndef __APPLE__ + MethodDef( Accum), + MethodDef( AlphaFunc), + MethodDef( AreTexturesResident), + MethodDef( Begin), + MethodDef( BindTexture), + MethodDef( Bitmap), + MethodDef( BlendFunc), + MethodDef( CallList), + MethodDef( CallLists), + MethodDef( Clear), + MethodDef( ClearAccum), + MethodDef( ClearColor), + MethodDef( ClearDepth), + MethodDef( ClearIndex), + MethodDef( ClearStencil), + MethodDef( ClipPlane), + MethodDef( Color3b), + MethodDef( Color3bv), + MethodDef( Color3d), + MethodDef( Color3dv), + MethodDef( Color3f), + MethodDef( Color3fv), + MethodDef( Color3i), + MethodDef( Color3iv), + MethodDef( Color3s), + MethodDef( Color3sv), + MethodDef( Color3ub), + MethodDef( Color3ubv), + MethodDef( Color3ui), + MethodDef( Color3uiv), + MethodDef( Color3us), + MethodDef( Color3usv), + MethodDef( Color4b), + MethodDef( Color4bv), + MethodDef( Color4d), + MethodDef( Color4dv), + MethodDef( Color4f), + MethodDef( Color4fv), + MethodDef( Color4i), + MethodDef( Color4iv), + MethodDef( Color4s), + MethodDef( Color4sv), + MethodDef( Color4ub), + MethodDef( Color4ubv), + MethodDef( Color4ui), + MethodDef( Color4uiv), + MethodDef( Color4us), + MethodDef( Color4usv), + MethodDef( ColorMask), + MethodDef( ColorMaterial), + MethodDef( CopyPixels), + MethodDef( CullFace), + MethodDef( DeleteLists), + MethodDef( DeleteTextures), + MethodDef( DepthFunc), + MethodDef( DepthMask), + MethodDef( DepthRange), + MethodDef( Disable), + MethodDef( DrawBuffer), + MethodDef( DrawPixels), + MethodDef( EdgeFlag), + MethodDef( EdgeFlagv), + MethodDef( Enable), + MethodDef( End), + MethodDef( EndList), + MethodDef( EvalCoord1d), + MethodDef( EvalCoord1dv), + MethodDef( EvalCoord1f), + MethodDef( EvalCoord1fv), + MethodDef( EvalCoord2d), + MethodDef( EvalCoord2dv), + MethodDef( EvalCoord2f), + MethodDef( EvalCoord2fv), + MethodDef( EvalMesh1), + MethodDef( EvalMesh2), + MethodDef( EvalPoint1), + MethodDef( EvalPoint2), + MethodDef( FeedbackBuffer), + MethodDef( Finish), + MethodDef( Flush), + MethodDef( Fogf), + MethodDef( Fogfv), + MethodDef( Fogi), + MethodDef( Fogiv), + MethodDef( FrontFace), + MethodDef( Frustum), + MethodDef( GenLists), + MethodDef( GenTextures), + MethodDef( GetBooleanv), + MethodDef( GetClipPlane), + MethodDef( GetDoublev), + MethodDef( GetError), + MethodDef( GetFloatv), + MethodDef( GetIntegerv), + MethodDef( GetLightfv), + MethodDef( GetLightiv), + MethodDef( GetMapdv), + MethodDef( GetMapfv), + MethodDef( GetMapiv), + MethodDef( GetMaterialfv), + MethodDef( GetMaterialiv), + MethodDef( GetPixelMapfv), + MethodDef( GetPixelMapuiv), + MethodDef( GetPixelMapusv), + MethodDef( GetPolygonStipple), + MethodDef( GetString), + MethodDef( GetTexEnvfv), + MethodDef( GetTexEnviv), + MethodDef( GetTexGendv), + MethodDef( GetTexGenfv), + MethodDef( GetTexGeniv), + MethodDef( GetTexImage), + MethodDef( GetTexLevelParameterfv), + MethodDef( GetTexLevelParameteriv), + MethodDef( GetTexParameterfv), + MethodDef( GetTexParameteriv), + MethodDef( Hint), + MethodDef( IndexMask), + MethodDef( Indexd), + MethodDef( Indexdv), + MethodDef( Indexf), + MethodDef( Indexfv), + MethodDef( Indexi), + MethodDef( Indexiv), + MethodDef( Indexs), + MethodDef( Indexsv), + MethodDef( InitNames), + MethodDef( IsEnabled), + MethodDef( IsList), + MethodDef( IsTexture), + MethodDef( LightModelf), + MethodDef( LightModelfv), + MethodDef( LightModeli), + MethodDef( LightModeliv), + MethodDef( Lightf), + MethodDef( Lightfv), + MethodDef( Lighti), + MethodDef( Lightiv), + MethodDef( LineStipple), + MethodDef( LineWidth), + MethodDef( ListBase), + MethodDef( LoadIdentity), + MethodDef( LoadMatrixd), + MethodDef( LoadMatrixf), + MethodDef( LoadName), + MethodDef( LogicOp), + MethodDef( Map1d), + MethodDef( Map1f), + MethodDef( Map2d), + MethodDef( Map2f), + MethodDef( MapGrid1d), + MethodDef( MapGrid1f), + MethodDef( MapGrid2d), + MethodDef( MapGrid2f), + MethodDef( Materialf), + MethodDef( Materialfv), + MethodDef( Materiali), + MethodDef( Materialiv), + MethodDef( MatrixMode), + MethodDef( MultMatrixd), + MethodDef( MultMatrixf), + MethodDef( NewList), + MethodDef( Normal3b), + MethodDef( Normal3bv), + MethodDef( Normal3d), + MethodDef( Normal3dv), + MethodDef( Normal3f), + MethodDef( Normal3fv), + MethodDef( Normal3i), + MethodDef( Normal3iv), + MethodDef( Normal3s), + MethodDef( Normal3sv), + MethodDef( Ortho), + MethodDef( PassThrough), + MethodDef( PixelMapfv), + MethodDef( PixelMapuiv), + MethodDef( PixelMapusv), + MethodDef( PixelStoref), + MethodDef( PixelStorei), + MethodDef( PixelTransferf), + MethodDef( PixelTransferi), + MethodDef( PixelZoom), + MethodDef( PointSize), + MethodDef( PolygonMode), + MethodDef( PolygonOffset), + MethodDef( PolygonStipple), + MethodDef( PopAttrib), + MethodDef( PopMatrix), + MethodDef( PopName), + MethodDef( PrioritizeTextures), + MethodDef( PushAttrib), + MethodDef( PushMatrix), + MethodDef( PushName), + MethodDef( RasterPos2d), + MethodDef( RasterPos2dv), + MethodDef( RasterPos2f), + MethodDef( RasterPos2fv), + MethodDef( RasterPos2i), + MethodDef( RasterPos2iv), + MethodDef( RasterPos2s), + MethodDef( RasterPos2sv), + MethodDef( RasterPos3d), + MethodDef( RasterPos3dv), + MethodDef( RasterPos3f), + MethodDef( RasterPos3fv), + MethodDef( RasterPos3i), + MethodDef( RasterPos3iv), + MethodDef( RasterPos3s), + MethodDef( RasterPos3sv), + MethodDef( RasterPos4d), + MethodDef( RasterPos4dv), + MethodDef( RasterPos4f), + MethodDef( RasterPos4fv), + MethodDef( RasterPos4i), + MethodDef( RasterPos4iv), + MethodDef( RasterPos4s), + MethodDef( RasterPos4sv), + MethodDef( ReadBuffer), + MethodDef( ReadPixels), + MethodDef( Rectd), + MethodDef( Rectdv), + MethodDef( Rectf), + MethodDef( Rectfv), + MethodDef( Recti), + MethodDef( Rectiv), + MethodDef( Rects), + MethodDef( Rectsv), + MethodDef( RenderMode), + MethodDef( Rotated), + MethodDef( Rotatef), + MethodDef( Scaled), + MethodDef( Scalef), + MethodDef( Scissor), + MethodDef( SelectBuffer), + MethodDef( ShadeModel), + MethodDef( StencilFunc), + MethodDef( StencilMask), + MethodDef( StencilOp), + MethodDef( TexCoord1d), + MethodDef( TexCoord1dv), + MethodDef( TexCoord1f), + MethodDef( TexCoord1fv), + MethodDef( TexCoord1i), + MethodDef( TexCoord1iv), + MethodDef( TexCoord1s), + MethodDef( TexCoord1sv), + MethodDef( TexCoord2d), + MethodDef( TexCoord2dv), + MethodDef( TexCoord2f), + MethodDef( TexCoord2fv), + MethodDef( TexCoord2i), + MethodDef( TexCoord2iv), + MethodDef( TexCoord2s), + MethodDef( TexCoord2sv), + MethodDef( TexCoord3d), + MethodDef( TexCoord3dv), + MethodDef( TexCoord3f), + MethodDef( TexCoord3fv), + MethodDef( TexCoord3i), + MethodDef( TexCoord3iv), + MethodDef( TexCoord3s), + MethodDef( TexCoord3sv), + MethodDef( TexCoord4d), + MethodDef( TexCoord4dv), + MethodDef( TexCoord4f), + MethodDef( TexCoord4fv), + MethodDef( TexCoord4i), + MethodDef( TexCoord4iv), + MethodDef( TexCoord4s), + MethodDef( TexCoord4sv), + MethodDef( TexEnvf), + MethodDef( TexEnvfv), + MethodDef( TexEnvi), + MethodDef( TexEnviv), + MethodDef( TexGend), + MethodDef( TexGendv), + MethodDef( TexGenf), + MethodDef( TexGenfv), + MethodDef( TexGeni), + MethodDef( TexGeniv), + MethodDef( TexImage1D), + MethodDef( TexImage2D), + MethodDef( TexParameterf), + MethodDef( TexParameterfv), + MethodDef( TexParameteri), + MethodDef( TexParameteriv), + MethodDef( Translated), + MethodDef( Translatef), + MethodDef( Vertex2d), + MethodDef( Vertex2dv), + MethodDef( Vertex2f), + MethodDef( Vertex2fv), + MethodDef( Vertex2i), + MethodDef( Vertex2iv), + MethodDef( Vertex2s), + MethodDef( Vertex2sv), + MethodDef( Vertex3d), + MethodDef( Vertex3dv), + MethodDef( Vertex3f), + MethodDef( Vertex3fv), + MethodDef( Vertex3i), + MethodDef( Vertex3iv), + MethodDef( Vertex3s), + MethodDef( Vertex3sv), + MethodDef( Vertex4d), + MethodDef( Vertex4dv), + MethodDef( Vertex4f), + MethodDef( Vertex4fv), + MethodDef( Vertex4i), + MethodDef( Vertex4iv), + MethodDef( Vertex4s), + MethodDef( Vertex4sv), + MethodDef( Viewport), +#endif + + {NULL, NULL} +}; + +PyObject *M_BGL_Init(void) +{ + PyObject *mod= Py_InitModule("Blender.BGL", BGL_methods); + PyObject *dict= PyModule_GetDict(mod); + +#define EXPP_ADDCONST(x) PyDict_SetItemString(dict, #x, PyInt_FromLong(x)) + +/* So, for example: + * EXPP_ADDCONST(GL_CURRENT_BIT) becomes + * PyDict_SetItemString(dict, "GL_CURRENT_BIT", PyInt_FromLong(GL_CURRENT_BIT)) */ + + EXPP_ADDCONST(GL_CURRENT_BIT); + EXPP_ADDCONST(GL_POINT_BIT); + EXPP_ADDCONST(GL_LINE_BIT); + EXPP_ADDCONST(GL_POLYGON_BIT); + EXPP_ADDCONST(GL_POLYGON_STIPPLE_BIT); + EXPP_ADDCONST(GL_PIXEL_MODE_BIT); + EXPP_ADDCONST(GL_LIGHTING_BIT); + EXPP_ADDCONST(GL_FOG_BIT); + EXPP_ADDCONST(GL_DEPTH_BUFFER_BIT); + EXPP_ADDCONST(GL_ACCUM_BUFFER_BIT); + EXPP_ADDCONST(GL_STENCIL_BUFFER_BIT); + EXPP_ADDCONST(GL_VIEWPORT_BIT); + EXPP_ADDCONST(GL_TRANSFORM_BIT); + EXPP_ADDCONST(GL_ENABLE_BIT); + EXPP_ADDCONST(GL_COLOR_BUFFER_BIT); + EXPP_ADDCONST(GL_HINT_BIT); + EXPP_ADDCONST(GL_EVAL_BIT); + EXPP_ADDCONST(GL_LIST_BIT); + EXPP_ADDCONST(GL_TEXTURE_BIT); + EXPP_ADDCONST(GL_SCISSOR_BIT); + EXPP_ADDCONST(GL_ALL_ATTRIB_BITS); + + EXPP_ADDCONST(GL_FALSE); + EXPP_ADDCONST(GL_TRUE); + + EXPP_ADDCONST(GL_POINTS); + EXPP_ADDCONST(GL_LINES); + EXPP_ADDCONST(GL_LINE_LOOP); + EXPP_ADDCONST(GL_LINE_STRIP); + EXPP_ADDCONST(GL_TRIANGLES); + EXPP_ADDCONST(GL_TRIANGLE_STRIP); + EXPP_ADDCONST(GL_TRIANGLE_FAN); + EXPP_ADDCONST(GL_QUADS); + EXPP_ADDCONST(GL_QUAD_STRIP); + EXPP_ADDCONST(GL_POLYGON); + + EXPP_ADDCONST(GL_ACCUM); + EXPP_ADDCONST(GL_LOAD); + EXPP_ADDCONST(GL_RETURN); + EXPP_ADDCONST(GL_MULT); + EXPP_ADDCONST(GL_ADD); + + EXPP_ADDCONST(GL_NEVER); + EXPP_ADDCONST(GL_LESS); + EXPP_ADDCONST(GL_EQUAL); + EXPP_ADDCONST(GL_LEQUAL); + EXPP_ADDCONST(GL_GREATER); + EXPP_ADDCONST(GL_NOTEQUAL); + EXPP_ADDCONST(GL_GEQUAL); + EXPP_ADDCONST(GL_ALWAYS); + + EXPP_ADDCONST(GL_ZERO); + EXPP_ADDCONST(GL_ONE); + EXPP_ADDCONST(GL_SRC_COLOR); + EXPP_ADDCONST(GL_ONE_MINUS_SRC_COLOR); + EXPP_ADDCONST(GL_SRC_ALPHA); + EXPP_ADDCONST(GL_ONE_MINUS_SRC_ALPHA); + EXPP_ADDCONST(GL_DST_ALPHA); + EXPP_ADDCONST(GL_ONE_MINUS_DST_ALPHA); + + EXPP_ADDCONST(GL_DST_COLOR); + EXPP_ADDCONST(GL_ONE_MINUS_DST_COLOR); + EXPP_ADDCONST(GL_SRC_ALPHA_SATURATE); + + EXPP_ADDCONST(GL_NONE); + EXPP_ADDCONST(GL_FRONT_LEFT); + EXPP_ADDCONST(GL_FRONT_RIGHT); + EXPP_ADDCONST(GL_BACK_LEFT); + EXPP_ADDCONST(GL_BACK_RIGHT); + EXPP_ADDCONST(GL_FRONT); + EXPP_ADDCONST(GL_BACK); + EXPP_ADDCONST(GL_LEFT); + EXPP_ADDCONST(GL_RIGHT); + EXPP_ADDCONST(GL_FRONT_AND_BACK); + EXPP_ADDCONST(GL_AUX0); + EXPP_ADDCONST(GL_AUX1); + EXPP_ADDCONST(GL_AUX2); + EXPP_ADDCONST(GL_AUX3); + + EXPP_ADDCONST(GL_NO_ERROR); + EXPP_ADDCONST(GL_INVALID_ENUM); + EXPP_ADDCONST(GL_INVALID_VALUE); + EXPP_ADDCONST(GL_INVALID_OPERATION); + EXPP_ADDCONST(GL_STACK_OVERFLOW); + EXPP_ADDCONST(GL_STACK_UNDERFLOW); + EXPP_ADDCONST(GL_OUT_OF_MEMORY); + + EXPP_ADDCONST(GL_2D); + EXPP_ADDCONST(GL_3D); + EXPP_ADDCONST(GL_3D_COLOR); + EXPP_ADDCONST(GL_3D_COLOR_TEXTURE); + EXPP_ADDCONST(GL_4D_COLOR_TEXTURE); + + EXPP_ADDCONST(GL_PASS_THROUGH_TOKEN); + EXPP_ADDCONST(GL_POINT_TOKEN); + EXPP_ADDCONST(GL_LINE_TOKEN); + EXPP_ADDCONST(GL_POLYGON_TOKEN); + EXPP_ADDCONST(GL_BITMAP_TOKEN); + EXPP_ADDCONST(GL_DRAW_PIXEL_TOKEN); + EXPP_ADDCONST(GL_COPY_PIXEL_TOKEN); + EXPP_ADDCONST(GL_LINE_RESET_TOKEN); + + EXPP_ADDCONST(GL_EXP); + EXPP_ADDCONST(GL_EXP2); + + EXPP_ADDCONST(GL_CW); + EXPP_ADDCONST(GL_CCW); + + EXPP_ADDCONST(GL_COEFF); + EXPP_ADDCONST(GL_ORDER); + EXPP_ADDCONST(GL_DOMAIN); + + EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_I); + EXPP_ADDCONST(GL_PIXEL_MAP_S_TO_S); + EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_R); + EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_G); + EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_B); + EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_A); + EXPP_ADDCONST(GL_PIXEL_MAP_R_TO_R); + EXPP_ADDCONST(GL_PIXEL_MAP_G_TO_G); + EXPP_ADDCONST(GL_PIXEL_MAP_B_TO_B); + EXPP_ADDCONST(GL_PIXEL_MAP_A_TO_A); + + EXPP_ADDCONST(GL_CURRENT_COLOR); + EXPP_ADDCONST(GL_CURRENT_INDEX); + EXPP_ADDCONST(GL_CURRENT_NORMAL); + EXPP_ADDCONST(GL_CURRENT_TEXTURE_COORDS); + EXPP_ADDCONST(GL_CURRENT_RASTER_COLOR); + EXPP_ADDCONST(GL_CURRENT_RASTER_INDEX); + EXPP_ADDCONST(GL_CURRENT_RASTER_TEXTURE_COORDS); + EXPP_ADDCONST(GL_CURRENT_RASTER_POSITION); + EXPP_ADDCONST(GL_CURRENT_RASTER_POSITION_VALID); + EXPP_ADDCONST(GL_CURRENT_RASTER_DISTANCE); + EXPP_ADDCONST(GL_POINT_SMOOTH); + EXPP_ADDCONST(GL_POINT_SIZE); + EXPP_ADDCONST(GL_POINT_SIZE_RANGE); + EXPP_ADDCONST(GL_POINT_SIZE_GRANULARITY); + EXPP_ADDCONST(GL_LINE_SMOOTH); + EXPP_ADDCONST(GL_LINE_WIDTH); + EXPP_ADDCONST(GL_LINE_WIDTH_RANGE); + EXPP_ADDCONST(GL_LINE_WIDTH_GRANULARITY); + EXPP_ADDCONST(GL_LINE_STIPPLE); + EXPP_ADDCONST(GL_LINE_STIPPLE_PATTERN); + EXPP_ADDCONST(GL_LINE_STIPPLE_REPEAT); + EXPP_ADDCONST(GL_LIST_MODE); + EXPP_ADDCONST(GL_MAX_LIST_NESTING); + EXPP_ADDCONST(GL_LIST_BASE); + EXPP_ADDCONST(GL_LIST_INDEX); + EXPP_ADDCONST(GL_POLYGON_MODE); + EXPP_ADDCONST(GL_POLYGON_SMOOTH); + EXPP_ADDCONST(GL_POLYGON_STIPPLE); + EXPP_ADDCONST(GL_EDGE_FLAG); + EXPP_ADDCONST(GL_CULL_FACE); + EXPP_ADDCONST(GL_CULL_FACE_MODE); + EXPP_ADDCONST(GL_FRONT_FACE); + EXPP_ADDCONST(GL_LIGHTING); + EXPP_ADDCONST(GL_LIGHT_MODEL_LOCAL_VIEWER); + EXPP_ADDCONST(GL_LIGHT_MODEL_TWO_SIDE); + EXPP_ADDCONST(GL_LIGHT_MODEL_AMBIENT); + EXPP_ADDCONST(GL_SHADE_MODEL); + EXPP_ADDCONST(GL_COLOR_MATERIAL_FACE); + EXPP_ADDCONST(GL_COLOR_MATERIAL_PARAMETER); + EXPP_ADDCONST(GL_COLOR_MATERIAL); + EXPP_ADDCONST(GL_FOG); + EXPP_ADDCONST(GL_FOG_INDEX); + EXPP_ADDCONST(GL_FOG_DENSITY); + EXPP_ADDCONST(GL_FOG_START); + EXPP_ADDCONST(GL_FOG_END); + EXPP_ADDCONST(GL_FOG_MODE); + EXPP_ADDCONST(GL_FOG_COLOR); + EXPP_ADDCONST(GL_DEPTH_RANGE); + EXPP_ADDCONST(GL_DEPTH_TEST); + EXPP_ADDCONST(GL_DEPTH_WRITEMASK); + EXPP_ADDCONST(GL_DEPTH_CLEAR_VALUE); + EXPP_ADDCONST(GL_DEPTH_FUNC); + EXPP_ADDCONST(GL_ACCUM_CLEAR_VALUE); + EXPP_ADDCONST(GL_STENCIL_TEST); + EXPP_ADDCONST(GL_STENCIL_CLEAR_VALUE); + EXPP_ADDCONST(GL_STENCIL_FUNC); + EXPP_ADDCONST(GL_STENCIL_VALUE_MASK); + EXPP_ADDCONST(GL_STENCIL_FAIL); + EXPP_ADDCONST(GL_STENCIL_PASS_DEPTH_FAIL); + EXPP_ADDCONST(GL_STENCIL_PASS_DEPTH_PASS); + EXPP_ADDCONST(GL_STENCIL_REF); + EXPP_ADDCONST(GL_STENCIL_WRITEMASK); + EXPP_ADDCONST(GL_MATRIX_MODE); + EXPP_ADDCONST(GL_NORMALIZE); + EXPP_ADDCONST(GL_VIEWPORT); + EXPP_ADDCONST(GL_MODELVIEW_STACK_DEPTH); + EXPP_ADDCONST(GL_PROJECTION_STACK_DEPTH); + EXPP_ADDCONST(GL_TEXTURE_STACK_DEPTH); + EXPP_ADDCONST(GL_MODELVIEW_MATRIX); + EXPP_ADDCONST(GL_PROJECTION_MATRIX); + EXPP_ADDCONST(GL_TEXTURE_MATRIX); + EXPP_ADDCONST(GL_ATTRIB_STACK_DEPTH); + EXPP_ADDCONST(GL_ALPHA_TEST); + EXPP_ADDCONST(GL_ALPHA_TEST_FUNC); + EXPP_ADDCONST(GL_ALPHA_TEST_REF); + EXPP_ADDCONST(GL_DITHER); + EXPP_ADDCONST(GL_BLEND_DST); + EXPP_ADDCONST(GL_BLEND_SRC); + EXPP_ADDCONST(GL_BLEND); + EXPP_ADDCONST(GL_LOGIC_OP_MODE); + EXPP_ADDCONST(GL_LOGIC_OP); + EXPP_ADDCONST(GL_AUX_BUFFERS); + EXPP_ADDCONST(GL_DRAW_BUFFER); + EXPP_ADDCONST(GL_READ_BUFFER); + EXPP_ADDCONST(GL_SCISSOR_BOX); + EXPP_ADDCONST(GL_SCISSOR_TEST); + EXPP_ADDCONST(GL_INDEX_CLEAR_VALUE); + EXPP_ADDCONST(GL_INDEX_WRITEMASK); + EXPP_ADDCONST(GL_COLOR_CLEAR_VALUE); + EXPP_ADDCONST(GL_COLOR_WRITEMASK); + EXPP_ADDCONST(GL_INDEX_MODE); + EXPP_ADDCONST(GL_RGBA_MODE); + EXPP_ADDCONST(GL_DOUBLEBUFFER); + EXPP_ADDCONST(GL_STEREO); + EXPP_ADDCONST(GL_RENDER_MODE); + EXPP_ADDCONST(GL_PERSPECTIVE_CORRECTION_HINT); + EXPP_ADDCONST(GL_POINT_SMOOTH_HINT); + EXPP_ADDCONST(GL_LINE_SMOOTH_HINT); + EXPP_ADDCONST(GL_POLYGON_SMOOTH_HINT); + EXPP_ADDCONST(GL_FOG_HINT); + EXPP_ADDCONST(GL_TEXTURE_GEN_S); + EXPP_ADDCONST(GL_TEXTURE_GEN_T); + EXPP_ADDCONST(GL_TEXTURE_GEN_R); + EXPP_ADDCONST(GL_TEXTURE_GEN_Q); + EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_I_SIZE); + EXPP_ADDCONST(GL_PIXEL_MAP_S_TO_S_SIZE); + EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_R_SIZE); + EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_G_SIZE); + EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_B_SIZE); + EXPP_ADDCONST(GL_PIXEL_MAP_I_TO_A_SIZE); + EXPP_ADDCONST(GL_PIXEL_MAP_R_TO_R_SIZE); + EXPP_ADDCONST(GL_PIXEL_MAP_G_TO_G_SIZE); + EXPP_ADDCONST(GL_PIXEL_MAP_B_TO_B_SIZE); + EXPP_ADDCONST(GL_PIXEL_MAP_A_TO_A_SIZE); + EXPP_ADDCONST(GL_UNPACK_SWAP_BYTES); + EXPP_ADDCONST(GL_UNPACK_LSB_FIRST); + EXPP_ADDCONST(GL_UNPACK_ROW_LENGTH); + EXPP_ADDCONST(GL_UNPACK_SKIP_ROWS); + EXPP_ADDCONST(GL_UNPACK_SKIP_PIXELS); + EXPP_ADDCONST(GL_UNPACK_ALIGNMENT); + EXPP_ADDCONST(GL_PACK_SWAP_BYTES); + EXPP_ADDCONST(GL_PACK_LSB_FIRST); + EXPP_ADDCONST(GL_PACK_ROW_LENGTH); + EXPP_ADDCONST(GL_PACK_SKIP_ROWS); + EXPP_ADDCONST(GL_PACK_SKIP_PIXELS); + EXPP_ADDCONST(GL_PACK_ALIGNMENT); + EXPP_ADDCONST(GL_MAP_COLOR); + EXPP_ADDCONST(GL_MAP_STENCIL); + EXPP_ADDCONST(GL_INDEX_SHIFT); + EXPP_ADDCONST(GL_INDEX_OFFSET); + EXPP_ADDCONST(GL_RED_SCALE); + EXPP_ADDCONST(GL_RED_BIAS); + EXPP_ADDCONST(GL_ZOOM_X); + EXPP_ADDCONST(GL_ZOOM_Y); + EXPP_ADDCONST(GL_GREEN_SCALE); + EXPP_ADDCONST(GL_GREEN_BIAS); + EXPP_ADDCONST(GL_BLUE_SCALE); + EXPP_ADDCONST(GL_BLUE_BIAS); + EXPP_ADDCONST(GL_ALPHA_SCALE); + EXPP_ADDCONST(GL_ALPHA_BIAS); + EXPP_ADDCONST(GL_DEPTH_SCALE); + EXPP_ADDCONST(GL_DEPTH_BIAS); + EXPP_ADDCONST(GL_MAX_EVAL_ORDER); + EXPP_ADDCONST(GL_MAX_LIGHTS); + EXPP_ADDCONST(GL_MAX_CLIP_PLANES); + EXPP_ADDCONST(GL_MAX_TEXTURE_SIZE); + EXPP_ADDCONST(GL_MAX_PIXEL_MAP_TABLE); + EXPP_ADDCONST(GL_MAX_ATTRIB_STACK_DEPTH); + EXPP_ADDCONST(GL_MAX_MODELVIEW_STACK_DEPTH); + EXPP_ADDCONST(GL_MAX_NAME_STACK_DEPTH); + EXPP_ADDCONST(GL_MAX_PROJECTION_STACK_DEPTH); + EXPP_ADDCONST(GL_MAX_TEXTURE_STACK_DEPTH); + EXPP_ADDCONST(GL_MAX_VIEWPORT_DIMS); + EXPP_ADDCONST(GL_SUBPIXEL_BITS); + EXPP_ADDCONST(GL_INDEX_BITS); + EXPP_ADDCONST(GL_RED_BITS); + EXPP_ADDCONST(GL_GREEN_BITS); + EXPP_ADDCONST(GL_BLUE_BITS); + EXPP_ADDCONST(GL_ALPHA_BITS); + EXPP_ADDCONST(GL_DEPTH_BITS); + EXPP_ADDCONST(GL_STENCIL_BITS); + EXPP_ADDCONST(GL_ACCUM_RED_BITS); + EXPP_ADDCONST(GL_ACCUM_GREEN_BITS); + EXPP_ADDCONST(GL_ACCUM_BLUE_BITS); + EXPP_ADDCONST(GL_ACCUM_ALPHA_BITS); + EXPP_ADDCONST(GL_NAME_STACK_DEPTH); + EXPP_ADDCONST(GL_AUTO_NORMAL); + EXPP_ADDCONST(GL_MAP1_COLOR_4); + EXPP_ADDCONST(GL_MAP1_INDEX); + EXPP_ADDCONST(GL_MAP1_NORMAL); + EXPP_ADDCONST(GL_MAP1_TEXTURE_COORD_1); + EXPP_ADDCONST(GL_MAP1_TEXTURE_COORD_2); + EXPP_ADDCONST(GL_MAP1_TEXTURE_COORD_3); + EXPP_ADDCONST(GL_MAP1_TEXTURE_COORD_4); + EXPP_ADDCONST(GL_MAP1_VERTEX_3); + EXPP_ADDCONST(GL_MAP1_VERTEX_4); + EXPP_ADDCONST(GL_MAP2_COLOR_4); + EXPP_ADDCONST(GL_MAP2_INDEX); + EXPP_ADDCONST(GL_MAP2_NORMAL); + EXPP_ADDCONST(GL_MAP2_TEXTURE_COORD_1); + EXPP_ADDCONST(GL_MAP2_TEXTURE_COORD_2); + EXPP_ADDCONST(GL_MAP2_TEXTURE_COORD_3); + EXPP_ADDCONST(GL_MAP2_TEXTURE_COORD_4); + EXPP_ADDCONST(GL_MAP2_VERTEX_3); + EXPP_ADDCONST(GL_MAP2_VERTEX_4); + EXPP_ADDCONST(GL_MAP1_GRID_DOMAIN); + EXPP_ADDCONST(GL_MAP1_GRID_SEGMENTS); + EXPP_ADDCONST(GL_MAP2_GRID_DOMAIN); + EXPP_ADDCONST(GL_MAP2_GRID_SEGMENTS); + EXPP_ADDCONST(GL_TEXTURE_1D); + EXPP_ADDCONST(GL_TEXTURE_2D); + + EXPP_ADDCONST(GL_TEXTURE_WIDTH); + EXPP_ADDCONST(GL_TEXTURE_HEIGHT); + EXPP_ADDCONST(GL_TEXTURE_COMPONENTS); + EXPP_ADDCONST(GL_TEXTURE_BORDER_COLOR); + EXPP_ADDCONST(GL_TEXTURE_BORDER); + + EXPP_ADDCONST(GL_DONT_CARE); + EXPP_ADDCONST(GL_FASTEST); + EXPP_ADDCONST(GL_NICEST); + + EXPP_ADDCONST(GL_AMBIENT); + EXPP_ADDCONST(GL_DIFFUSE); + EXPP_ADDCONST(GL_SPECULAR); + EXPP_ADDCONST(GL_POSITION); + EXPP_ADDCONST(GL_SPOT_DIRECTION); + EXPP_ADDCONST(GL_SPOT_EXPONENT); + EXPP_ADDCONST(GL_SPOT_CUTOFF); + EXPP_ADDCONST(GL_CONSTANT_ATTENUATION); + EXPP_ADDCONST(GL_LINEAR_ATTENUATION); + EXPP_ADDCONST(GL_QUADRATIC_ATTENUATION); + + EXPP_ADDCONST(GL_COMPILE); + EXPP_ADDCONST(GL_COMPILE_AND_EXECUTE); + + EXPP_ADDCONST(GL_BYTE); + EXPP_ADDCONST(GL_UNSIGNED_BYTE); + EXPP_ADDCONST(GL_SHORT); + EXPP_ADDCONST(GL_UNSIGNED_SHORT); + EXPP_ADDCONST(GL_INT); + EXPP_ADDCONST(GL_UNSIGNED_INT); + EXPP_ADDCONST(GL_FLOAT); + EXPP_ADDCONST(GL_2_BYTES); + EXPP_ADDCONST(GL_3_BYTES); + EXPP_ADDCONST(GL_4_BYTES); + + EXPP_ADDCONST(GL_CLEAR); + EXPP_ADDCONST(GL_AND); + EXPP_ADDCONST(GL_AND_REVERSE); + EXPP_ADDCONST(GL_COPY); + EXPP_ADDCONST(GL_AND_INVERTED); + EXPP_ADDCONST(GL_NOOP); + EXPP_ADDCONST(GL_XOR); + EXPP_ADDCONST(GL_OR); + EXPP_ADDCONST(GL_NOR); + EXPP_ADDCONST(GL_EQUIV); + EXPP_ADDCONST(GL_INVERT); + EXPP_ADDCONST(GL_OR_REVERSE); + EXPP_ADDCONST(GL_COPY_INVERTED); + EXPP_ADDCONST(GL_OR_INVERTED); + EXPP_ADDCONST(GL_NAND); + EXPP_ADDCONST(GL_SET); + + EXPP_ADDCONST(GL_EMISSION); + EXPP_ADDCONST(GL_SHININESS); + EXPP_ADDCONST(GL_AMBIENT_AND_DIFFUSE); + EXPP_ADDCONST(GL_COLOR_INDEXES); + + EXPP_ADDCONST(GL_MODELVIEW); + EXPP_ADDCONST(GL_PROJECTION); + EXPP_ADDCONST(GL_TEXTURE); + + EXPP_ADDCONST(GL_COLOR); + EXPP_ADDCONST(GL_DEPTH); + EXPP_ADDCONST(GL_STENCIL); + + EXPP_ADDCONST(GL_COLOR_INDEX); + EXPP_ADDCONST(GL_STENCIL_INDEX); + EXPP_ADDCONST(GL_DEPTH_COMPONENT); + EXPP_ADDCONST(GL_RED); + EXPP_ADDCONST(GL_GREEN); + EXPP_ADDCONST(GL_BLUE); + EXPP_ADDCONST(GL_ALPHA); + EXPP_ADDCONST(GL_RGB); + EXPP_ADDCONST(GL_RGBA); + EXPP_ADDCONST(GL_LUMINANCE); + EXPP_ADDCONST(GL_LUMINANCE_ALPHA); + + EXPP_ADDCONST(GL_BITMAP); + + EXPP_ADDCONST(GL_POINT); + EXPP_ADDCONST(GL_LINE); + EXPP_ADDCONST(GL_FILL); + + EXPP_ADDCONST(GL_RENDER); + EXPP_ADDCONST(GL_FEEDBACK); + EXPP_ADDCONST(GL_SELECT); + + EXPP_ADDCONST(GL_FLAT); + EXPP_ADDCONST(GL_SMOOTH); + + EXPP_ADDCONST(GL_KEEP); + EXPP_ADDCONST(GL_REPLACE); + EXPP_ADDCONST(GL_INCR); + EXPP_ADDCONST(GL_DECR); + + EXPP_ADDCONST(GL_VENDOR); + EXPP_ADDCONST(GL_RENDERER); + EXPP_ADDCONST(GL_VERSION); + EXPP_ADDCONST(GL_EXTENSIONS); + + EXPP_ADDCONST(GL_S); + EXPP_ADDCONST(GL_T); + EXPP_ADDCONST(GL_R); + EXPP_ADDCONST(GL_Q); + + EXPP_ADDCONST(GL_MODULATE); + EXPP_ADDCONST(GL_DECAL); + + EXPP_ADDCONST(GL_TEXTURE_ENV_MODE); + EXPP_ADDCONST(GL_TEXTURE_ENV_COLOR); + + EXPP_ADDCONST(GL_TEXTURE_ENV); + + EXPP_ADDCONST(GL_EYE_LINEAR); + EXPP_ADDCONST(GL_OBJECT_LINEAR); + EXPP_ADDCONST(GL_SPHERE_MAP); + + EXPP_ADDCONST(GL_TEXTURE_GEN_MODE); + EXPP_ADDCONST(GL_OBJECT_PLANE); + EXPP_ADDCONST(GL_EYE_PLANE); + + EXPP_ADDCONST(GL_NEAREST); + EXPP_ADDCONST(GL_LINEAR); + + EXPP_ADDCONST(GL_NEAREST_MIPMAP_NEAREST); + EXPP_ADDCONST(GL_LINEAR_MIPMAP_NEAREST); + EXPP_ADDCONST(GL_NEAREST_MIPMAP_LINEAR); + EXPP_ADDCONST(GL_LINEAR_MIPMAP_LINEAR); + + EXPP_ADDCONST(GL_TEXTURE_MAG_FILTER); + EXPP_ADDCONST(GL_TEXTURE_MIN_FILTER); + EXPP_ADDCONST(GL_TEXTURE_WRAP_S); + EXPP_ADDCONST(GL_TEXTURE_WRAP_T); + + EXPP_ADDCONST(GL_CLAMP); + EXPP_ADDCONST(GL_REPEAT); + + EXPP_ADDCONST(GL_CLIP_PLANE0); + EXPP_ADDCONST(GL_CLIP_PLANE1); + EXPP_ADDCONST(GL_CLIP_PLANE2); + EXPP_ADDCONST(GL_CLIP_PLANE3); + EXPP_ADDCONST(GL_CLIP_PLANE4); + EXPP_ADDCONST(GL_CLIP_PLANE5); + + EXPP_ADDCONST(GL_LIGHT0); + EXPP_ADDCONST(GL_LIGHT1); + EXPP_ADDCONST(GL_LIGHT2); + EXPP_ADDCONST(GL_LIGHT3); + EXPP_ADDCONST(GL_LIGHT4); + EXPP_ADDCONST(GL_LIGHT5); + EXPP_ADDCONST(GL_LIGHT6); + EXPP_ADDCONST(GL_LIGHT7); + + EXPP_ADDCONST(GL_POLYGON_OFFSET_UNITS); + EXPP_ADDCONST(GL_POLYGON_OFFSET_POINT); + EXPP_ADDCONST(GL_POLYGON_OFFSET_LINE); + EXPP_ADDCONST(GL_POLYGON_OFFSET_FILL); + EXPP_ADDCONST(GL_POLYGON_OFFSET_FACTOR); + + EXPP_ADDCONST(GL_TEXTURE_PRIORITY); + EXPP_ADDCONST(GL_TEXTURE_RESIDENT); + EXPP_ADDCONST(GL_TEXTURE_BINDING_1D); + EXPP_ADDCONST(GL_TEXTURE_BINDING_2D); + + return mod; +} diff --git a/source/blender/python/api2_2x/BGL.h b/source/blender/python/api2_2x/BGL.h new file mode 100644 index 00000000000..2da80b4555c --- /dev/null +++ b/source/blender/python/api2_2x/BGL.h @@ -0,0 +1,424 @@ +/* + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * This is a new part of Blender. + * + * Contributor(s): Willian P. Germano + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** +*/ + +/* This is the Blender.BGL part of opy_draw.c, from the old bpython/intern + * dir, with minor changes to adapt it to the new Python implementation. + * The BGL submodule "wraps" OpenGL functions and constants, allowing script + * writers to make OpenGL calls in their Python scripts for Blender. The + * more important original comments are marked with an @ symbol. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef WIN32 +#include "BLI_winstuff.h" +#endif + +#include "MEM_guardedalloc.h" + +#include "BMF_Api.h" + +#include "DNA_screen_types.h" +#include "DNA_space_types.h" +#include "DNA_text_types.h" + +#include "BKE_global.h" + +#include "BIF_gl.h" +#include "BIF_screen.h" +#include "BIF_space.h" +#include "BIF_interface.h" +#include "BIF_mywindow.h" + +#include "interface.h" +#include "mydevice.h" /*@ for all the event constants */ + +#include "Python.h" + +#include "gen_utils.h" +#include "modules.h" + +/*@ Buffer Object */ +/*@ For Python access to OpenGL functions requiring a pointer. */ + +typedef struct _Buffer { + PyObject_VAR_HEAD + + PyObject *parent; + + int type; /* GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT */ + int ndimensions; + int *dimensions; + + union { + char *asbyte; + short *asshort; + int *asint; + float *asfloat; + + void *asvoid; + } buf; +} Buffer; + +static int type_size(int type); +static Buffer *make_buffer(int type, int ndimensions, int *dimensions); +static int Buffer_ass_slice(PyObject *self, int begin, int end, PyObject *seq); + +static char Method_Buffer_doc[]= +"(type, dimensions, [template]) - Create a new Buffer object\n\n\ +(type) - The format to store data in\n\ +(dimensions) - An int or sequence specifying the dimensions of the buffer\n\ +[template] - A sequence of matching dimensions to the buffer to be created\n\ + which will be used to initialize the Buffer.\n\n\ +If a template is not passed in all fields will be initialized to 0.\n\n\ +The type should be one of GL_BYTE, GL_SHORT, GL_INT, or GL_FLOAT.\n\ +If the dimensions are specified as an int a linear buffer will be\n\ +created. If a sequence is passed for the dimensions the buffer\n\ +will have len(sequence) dimensions, where the size for each dimension\n\ +is determined by the value in the sequence at that index.\n\n\ +For example, passing [100, 100] will create a 2 dimensional\n\ +square buffer. Passing [16, 16, 32] will create a 3 dimensional\n\ +buffer which is twice as deep as it is wide or high."; + +static PyObject *Method_Buffer (PyObject *self, PyObject *args); + +/* Buffer sequence methods */ + +static int Buffer_len(PyObject *self); +static PyObject *Buffer_item(PyObject *self, int i); +static PyObject *Buffer_slice(PyObject *self, int begin, int end); +static int Buffer_ass_item(PyObject *self, int i, PyObject *v); +static int Buffer_ass_slice(PyObject *self, int begin, int end, PyObject *seq); + +static PySequenceMethods Buffer_SeqMethods = { + (inquiry) Buffer_len, /*sq_length*/ + (binaryfunc) 0, /*sq_concat*/ + (intargfunc) 0, /*sq_repeat*/ + (intargfunc) Buffer_item, /*sq_item*/ + (intintargfunc) Buffer_slice, /*sq_slice*/ + (intobjargproc) Buffer_ass_item, /*sq_ass_item*/ + (intintobjargproc) Buffer_ass_slice, /*sq_ass_slice*/ +}; + +static void Buffer_dealloc(PyObject *self); +static PyObject *Buffer_tolist(PyObject *self); +static PyObject *Buffer_dimensions(PyObject *self); +static PyObject *Buffer_getattr(PyObject *self, char *name); +static PyObject *Buffer_repr(PyObject *self); + +PyTypeObject Buffer_Type = { + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "Buffer", /*tp_name*/ + sizeof(Buffer), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor) Buffer_dealloc, /*tp_dealloc*/ + (printfunc) 0, /*tp_print*/ + (getattrfunc) Buffer_getattr, /*tp_getattr*/ + (setattrfunc) 0, /*tp_setattr*/ + (cmpfunc) 0, /*tp_compare*/ + (reprfunc) Buffer_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + &Buffer_SeqMethods, /*tp_as_sequence*/ +}; + +#ifndef __APPLE__ +/*@ By golly George! It looks like fancy pants macro time!!! */ + +/* +#define int_str "i" +#define int_var(number) bgl_int##number +#define int_ref(number) &bgl_int##number +#define int_def(number) int int_var(number) + +#define float_str "f" +#define float_var(number) bgl_float##number +#define float_ref(number) &bgl_float##number +#define float_def(number) float float_var(number) +*/ + +/* TYPE_str is the string to pass to Py_ArgParse (for the format) */ +/* TYPE_var is the name to pass to the GL function */ +/* TYPE_ref is the pointer to pass to Py_ArgParse (to store in) */ +/* TYPE_def is the C initialization of the variable */ + +#define void_str "" +#define void_var(num) +#define void_ref(num) &bgl_var##num +#define void_def(num) char bgl_var##num + +#define buffer_str "O!" +#define buffer_var(number) (bgl_buffer##number)->buf.asvoid +#define buffer_ref(number) &Buffer_Type, &bgl_buffer##number +#define buffer_def(number) Buffer *bgl_buffer##number + +/* GL Pointer fields, handled by buffer type */ +/* GLdoubleP, GLfloatP, GLintP, GLuintP, GLshortP */ + +#define GLbooleanP_str "O!" +#define GLbooleanP_var(number) (bgl_buffer##number)->buf.asvoid +#define GLbooleanP_ref(number) &Buffer_Type, &bgl_buffer##number +#define GLbooleanP_def(number) Buffer *bgl_buffer##number + +#define GLbyteP_str "O!" +#define GLbyteP_var(number) (bgl_buffer##number)->buf.asvoid +#define GLbyteP_ref(number) &Buffer_Type, &bgl_buffer##number +#define GLbyteP_def(number) Buffer *bgl_buffer##number + +#define GLubyteP_str "O!" +#define GLubyteP_var(number) (bgl_buffer##number)->buf.asvoid +#define GLubyteP_ref(number) &Buffer_Type, &bgl_buffer##number +#define GLubyteP_def(number) Buffer *bgl_buffer##number + +#define GLintP_str "O!" +#define GLintP_var(number) (bgl_buffer##number)->buf.asvoid +#define GLintP_ref(number) &Buffer_Type, &bgl_buffer##number +#define GLintP_def(number) Buffer *bgl_buffer##number + +#define GLuintP_str "O!" +#define GLuintP_var(number) (bgl_buffer##number)->buf.asvoid +#define GLuintP_ref(number) &Buffer_Type, &bgl_buffer##number +#define GLuintP_def(number) Buffer *bgl_buffer##number + +#define GLshortP_str "O!" +#define GLshortP_var(number) (bgl_buffer##number)->buf.asvoid +#define GLshortP_ref(number) &Buffer_Type, &bgl_buffer##number +#define GLshortP_def(number) Buffer *bgl_buffer##number + +#define GLushortP_str "O!" +#define GLushortP_var(number) (bgl_buffer##number)->buf.asvoid +#define GLushortP_ref(number) &Buffer_Type, &bgl_buffer##number +#define GLushortP_def(number) Buffer *bgl_buffer##number + +#define GLfloatP_str "O!" +#define GLfloatP_var(number) (bgl_buffer##number)->buf.asvoid +#define GLfloatP_ref(number) &Buffer_Type, &bgl_buffer##number +#define GLfloatP_def(number) Buffer *bgl_buffer##number + +#define GLdoubleP_str "O!" +#define GLdoubleP_var(number) (bgl_buffer##number)->buf.asvoid +#define GLdoubleP_ref(number) &Buffer_Type, &bgl_buffer##number +#define GLdoubleP_def(number) Buffer *bgl_buffer##number + +#define GLclampfP_str "O!" +#define GLclampfP_var(number) (bgl_buffer##number)->buf.asvoid +#define GLclampfP_ref(number) &Buffer_Type, &bgl_buffer##number +#define GLclampfP_def(number) Buffer *bgl_buffer##number + +#define GLvoidP_str "O!" +#define GLvoidP_var(number) (bgl_buffer##number)->buf.asvoid +#define GLvoidP_ref(number) &Buffer_Type, &bgl_buffer##number +#define GLvoidP_def(number) Buffer *bgl_buffer##number + +#define buffer_str "O!" +#define buffer_var(number) (bgl_buffer##number)->buf.asvoid +#define buffer_ref(number) &Buffer_Type, &bgl_buffer##number +#define buffer_def(number) Buffer *bgl_buffer##number + +/*@The standard GL typedefs are used as prototypes, we can't + * use the GL type directly because Py_ArgParse expects normal + * C types. + * + * Py_ArgParse doesn't grok writing into unsigned variables, + * so we use signed everything (even stuff that should be unsigned. + */ + +/* typedef unsigned int GLenum; */ +#define GLenum_str "i" +#define GLenum_var(num) bgl_var##num +#define GLenum_ref(num) &bgl_var##num +#define GLenum_def(num) /* unsigned */ int GLenum_var(num) + +/* typedef unsigned int GLboolean; */ +#define GLboolean_str "b" +#define GLboolean_var(num) bgl_var##num +#define GLboolean_ref(num) &bgl_var##num +#define GLboolean_def(num) /* unsigned */ char GLboolean_var(num) + +/* typedef unsigned int GLbitfield; */ +#define GLbitfield_str "i" +#define GLbitfield_var(num) bgl_var##num +#define GLbitfield_ref(num) &bgl_var##num +#define GLbitfield_def(num) /* unsigned */ int GLbitfield_var(num) + +/* typedef signed char GLbyte; */ +#define GLbyte_str "b" +#define GLbyte_var(num) bgl_var##num +#define GLbyte_ref(num) &bgl_var##num +#define GLbyte_def(num) signed char GLbyte_var(num) + +/* typedef short GLshort; */ +#define GLshort_str "h" +#define GLshort_var(num) bgl_var##num +#define GLshort_ref(num) &bgl_var##num +#define GLshort_def(num) short GLshort_var(num) + +/* typedef int GLint; */ +#define GLint_str "i" +#define GLint_var(num) bgl_var##num +#define GLint_ref(num) &bgl_var##num +#define GLint_def(num) int GLint_var(num) + +/* typedef int GLsizei; */ +#define GLsizei_str "i" +#define GLsizei_var(num) bgl_var##num +#define GLsizei_ref(num) &bgl_var##num +#define GLsizei_def(num) int GLsizei_var(num) + +/* typedef unsigned char GLubyte; */ +#define GLubyte_str "b" +#define GLubyte_var(num) bgl_var##num +#define GLubyte_ref(num) &bgl_var##num +#define GLubyte_def(num) /* unsigned */ char GLubyte_var(num) + +/* typedef unsigned short GLushort; */ +#define GLushort_str "h" +#define GLushort_var(num) bgl_var##num +#define GLushort_ref(num) &bgl_var##num +#define GLushort_def(num) /* unsigned */ short GLushort_var(num) + +/* typedef unsigned int GLuint; */ +#define GLuint_str "i" +#define GLuint_var(num) bgl_var##num +#define GLuint_ref(num) &bgl_var##num +#define GLuint_def(num) /* unsigned */ int GLuint_var(num) + +/* typedef float GLfloat; */ +#define GLfloat_str "f" +#define GLfloat_var(num) bgl_var##num +#define GLfloat_ref(num) &bgl_var##num +#define GLfloat_def(num) float GLfloat_var(num) + +/* typedef float GLclampf; */ +#define GLclampf_str "f" +#define GLclampf_var(num) bgl_var##num +#define GLclampf_ref(num) &bgl_var##num +#define GLclampf_def(num) float GLclampf_var(num) + +/* typedef double GLdouble; */ +#define GLdouble_str "d" +#define GLdouble_var(num) bgl_var##num +#define GLdouble_ref(num) &bgl_var##num +#define GLdouble_def(num) double GLdouble_var(num) + +/* typedef double GLclampd; */ +#define GLclampd_str "d" +#define GLclampd_var(num) bgl_var##num +#define GLclampd_ref(num) &bgl_var##num +#define GLclampd_def(num) double GLclampd_var(num) + +/* typedef void GLvoid; */ +/* #define GLvoid_str "" */ +/* #define GLvoid_var(num) bgl_var##num */ +/* #define GLvoid_ref(num) &bgl_var##num */ +/* #define GLvoid_def(num) char bgl_var##num */ + +#define arg_def1(a1) a1##_def(1) +#define arg_def2(a1, a2) arg_def1(a1); a2##_def(2) +#define arg_def3(a1, a2, a3) arg_def2(a1, a2); a3##_def(3) +#define arg_def4(a1, a2, a3, a4) arg_def3(a1, a2, a3); a4##_def(4) +#define arg_def5(a1, a2, a3, a4, a5) arg_def4(a1, a2, a3, a4); a5##_def(5) +#define arg_def6(a1, a2, a3, a4, a5, a6)arg_def5(a1, a2, a3, a4, a5); a6##_def(6) +#define arg_def7(a1, a2, a3, a4, a5, a6, a7)arg_def6(a1, a2, a3, a4, a5, a6); a7##_def(7) +#define arg_def8(a1, a2, a3, a4, a5, a6, a7, a8)arg_def7(a1, a2, a3, a4, a5, a6, a7); a8##_def(8) +#define arg_def9(a1, a2, a3, a4, a5, a6, a7, a8, a9)arg_def8(a1, a2, a3, a4, a5, a6, a7, a8); a9##_def(9) +#define arg_def10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)arg_def9(a1, a2, a3, a4, a5, a6, a7, a8, a9); a10##_def(10) + +#define arg_var1(a1) a1##_var(1) +#define arg_var2(a1, a2) arg_var1(a1), a2##_var(2) +#define arg_var3(a1, a2, a3) arg_var2(a1, a2), a3##_var(3) +#define arg_var4(a1, a2, a3, a4) arg_var3(a1, a2, a3), a4##_var(4) +#define arg_var5(a1, a2, a3, a4, a5) arg_var4(a1, a2, a3, a4), a5##_var(5) +#define arg_var6(a1, a2, a3, a4, a5, a6)arg_var5(a1, a2, a3, a4, a5), a6##_var(6) +#define arg_var7(a1, a2, a3, a4, a5, a6, a7)arg_var6(a1, a2, a3, a4, a5, a6), a7##_var(7) +#define arg_var8(a1, a2, a3, a4, a5, a6, a7, a8)arg_var7(a1, a2, a3, a4, a5, a6, a7), a8##_var(8) +#define arg_var9(a1, a2, a3, a4, a5, a6, a7, a8, a9)arg_var8(a1, a2, a3, a4, a5, a6, a7, a8), a9##_var(9) +#define arg_var10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)arg_var9(a1, a2, a3, a4, a5, a6, a7, a8, a9), a10##_var(10) + +#define arg_ref1(a1) a1##_ref(1) +#define arg_ref2(a1, a2) arg_ref1(a1), a2##_ref(2) +#define arg_ref3(a1, a2, a3) arg_ref2(a1, a2), a3##_ref(3) +#define arg_ref4(a1, a2, a3, a4) arg_ref3(a1, a2, a3), a4##_ref(4) +#define arg_ref5(a1, a2, a3, a4, a5) arg_ref4(a1, a2, a3, a4), a5##_ref(5) +#define arg_ref6(a1, a2, a3, a4, a5, a6)arg_ref5(a1, a2, a3, a4, a5), a6##_ref(6) +#define arg_ref7(a1, a2, a3, a4, a5, a6, a7)arg_ref6(a1, a2, a3, a4, a5, a6), a7##_ref(7) +#define arg_ref8(a1, a2, a3, a4, a5, a6, a7, a8)arg_ref7(a1, a2, a3, a4, a5, a6, a7), a8##_ref(8) +#define arg_ref9(a1, a2, a3, a4, a5, a6, a7, a8, a9)arg_ref8(a1, a2, a3, a4, a5, a6, a7, a8), a9##_ref(9) +#define arg_ref10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)arg_ref9(a1, a2, a3, a4, a5, a6, a7, a8, a9), a10##_ref(10) + +#define arg_str1(a1) a1##_str +#define arg_str2(a1, a2) arg_str1(a1) a2##_str +#define arg_str3(a1, a2, a3) arg_str2(a1, a2) a3##_str +#define arg_str4(a1, a2, a3, a4) arg_str3(a1, a2, a3) a4##_str +#define arg_str5(a1, a2, a3, a4, a5) arg_str4(a1, a2, a3, a4) a5##_str +#define arg_str6(a1, a2, a3, a4, a5, a6)arg_str5(a1, a2, a3, a4, a5) a6##_str +#define arg_str7(a1, a2, a3, a4, a5, a6, a7)arg_str6(a1, a2, a3, a4, a5, a6) a7##_str +#define arg_str8(a1, a2, a3, a4, a5, a6, a7, a8)arg_str7(a1, a2, a3, a4, a5, a6, a7) a8##_str +#define arg_str9(a1, a2, a3, a4, a5, a6, a7, a8, a9)arg_str8(a1, a2, a3, a4, a5, a6, a7, a8) a9##_str +#define arg_str10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)arg_str9(a1, a2, a3, a4, a5, a6, a7, a8, a9) a10##_str + +#define ret_def_void +#define ret_set_void +#define ret_ret_void return EXPP_incr_ret(Py_None) + +#define ret_def_GLint int ret_int +#define ret_set_GLint ret_int= +#define ret_ret_GLint return PyInt_FromLong(ret_int); + +#define ret_def_GLuint unsigned int ret_uint +#define ret_set_GLuint ret_uint= +#define ret_ret_GLuint return PyInt_FromLong((long) ret_uint); + +#define ret_def_GLenum unsigned int ret_uint +#define ret_set_GLenum ret_uint= +#define ret_ret_GLenum return PyInt_FromLong((long) ret_uint); + +#define ret_def_GLboolean unsigned char ret_bool +#define ret_set_GLboolean ret_bool= +#define ret_ret_GLboolean return PyInt_FromLong((long) ret_bool); + +#define ret_def_GLstring const unsigned char *ret_str; +#define ret_set_GLstring ret_str= +#define ret_ret_GLstring return PyString_FromString(ret_str); + +#define BGL_Wrap(nargs, funcname, ret, arg_list) \ +static PyObject *Method_##funcname (PyObject *self, PyObject *args) {\ + arg_def##nargs arg_list; \ + ret_def_##ret; \ + if(!PyArg_ParseTuple(args, arg_str##nargs arg_list, arg_ref##nargs arg_list)) return NULL;\ + ret_set_##ret gl##funcname (arg_var##nargs arg_list);\ + ret_ret_##ret; \ +} + +#endif + +PyObject *M_BGL_Init(void); diff --git a/source/blender/python/api2_2x/Blender.c b/source/blender/python/api2_2x/Blender.c index 22dc43771ae..dcc4a0dfe7e 100644 --- a/source/blender/python/api2_2x/Blender.c +++ b/source/blender/python/api2_2x/Blender.c @@ -193,7 +193,10 @@ void initBlender (void) g_blenderdict = dict; PyDict_SetItemString (dict, "Object", initObject()); PyDict_SetItemString (dict, "Camera", M_Camera_Init()); - PyDict_SetItemString (dict, "Lamp", M_Lamp_Init()); - PyDict_SetItemString (dict, "Image", M_Image_Init()); + PyDict_SetItemString (dict, "Lamp", M_Lamp_Init()); + PyDict_SetItemString (dict, "Image", M_Image_Init()); + PyDict_SetItemString (dict, "Window", M_Window_Init()); + PyDict_SetItemString (dict, "Draw", M_Draw_Init()); + PyDict_SetItemString (dict, "BGL", M_BGL_Init()); } diff --git a/source/blender/python/api2_2x/Camera.c b/source/blender/python/api2_2x/Camera.c index f3f7ba6d4a8..81646cae727 100644 --- a/source/blender/python/api2_2x/Camera.c +++ b/source/blender/python/api2_2x/Camera.c @@ -38,78 +38,50 @@ static PyObject *M_Camera_New(PyObject *self, PyObject *args, PyObject *keywords) { char *type_str = "persp"; /* "persp" is type 0, "ortho" is type 1 */ - char *name_str = "Data"; + char *name_str = "CamData"; static char *kwlist[] = {"type_str", "name_str", NULL}; - C_Camera *cam; - PyObject *type, *name; - int type_int; + C_Camera *pycam; /* for Camera Data object wrapper in Python */ + Camera *blcam; /* for actual Camera Data we create in Blender */ char buf[21]; printf ("In Camera_New()\n"); if (!PyArg_ParseTupleAndKeywords(args, keywords, "|ss", kwlist, &type_str, &name_str)) - { - /* We expected string(s) (or nothing) as argument, but we didn't get it. */ - return (PythonReturnErrorObject (PyExc_AttributeError, + /* We expected string(s) (or nothing) as argument, but we didn't get that. */ + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected zero, one or two strings as arguments")); - } - if (strcmp (type_str, "persp") == 0) - type_int = EXPP_CAM_TYPE_PERSP; + blcam = add_camera(); /* first create the Camera Data in Blender */ + + if (blcam) /* now create the wrapper obj in Python */ + pycam = (C_Camera *)PyObject_NEW(C_Camera, &Camera_Type); else - { - if (strcmp (type_str, "ortho") == 0) - { - type_int = EXPP_CAM_TYPE_ORTHO; - } - else - { - return (PythonReturnErrorObject (PyExc_AttributeError, - "unknown camera type")); - } - } + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, + "couldn't create Camera Data in Blender")); - cam = (C_Camera *)CameraCreatePyObject(NULL); + if (pycam == NULL) + return (EXPP_ReturnPyObjError (PyExc_MemoryError, + "couldn't create Camera Data object")); - if (cam == NULL) - { - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create Camera Data object")); - } - cam->linked = 0; /* only Camera Data, not linked */ + pycam->camera = blcam; /* link Python camera wrapper to Blender Camera */ - type = PyInt_FromLong(type_int); - if (type) - { - CameraSetAttr(cam, "type", type); - } + if (strcmp (type_str, "persp") == 0) /* default, no need to set, so */ + /*blcam->type = (short)EXPP_CAM_TYPE_PERSP*/; /* we comment this line */ + else if (strcmp (type_str, "ortho") == 0) + blcam->type = (short)EXPP_CAM_TYPE_ORTHO; else - { - Py_DECREF((PyObject *)cam); - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyString")); + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "unknown camera type")); + + if (strcmp(name_str, "CamData") == 0) + return (PyObject *)pycam; + else { /* user gave us a name for the camera, use it */ + PyOS_snprintf(buf, sizeof(buf), "%s", name_str); + rename_id(&blcam->id, buf); /* proper way in Blender */ } - if (strcmp(name_str, "Data") == 0) - { - return (PyObject *)cam; - } - - PyOS_snprintf(buf, sizeof(buf), "%s", name_str); - name = PyString_FromString(buf); - if (name) - { - CameraSetAttr(cam, "name", name); - } - else - { - Py_DECREF((PyObject *)cam); - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyString")); - } - - return (PyObject *)cam; + return (PyObject *)pycam; } /*****************************************************************************/ @@ -124,35 +96,31 @@ static PyObject *M_Camera_Get(PyObject *self, PyObject *args) printf ("In Camera_Get()\n"); if (!PyArg_ParseTuple(args, "s", &name)) - { - return (PythonReturnErrorObject (PyExc_AttributeError, + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected string argument")); - } - /* Use the name to search for the camera requested. */ + /* Use the name to search for the camera requested */ wanted_cam = NULL; cam_iter = G.main->camera.first; - while ((cam_iter) && (wanted_cam == NULL)) - { - if (strcmp (name, GetIdName (&(cam_iter->id))) == 0) - { - wanted_cam = (C_Camera *)CameraCreatePyObject(cam_iter); - cam_iter = cam_iter->id.next; + while ((cam_iter) && (wanted_cam == NULL)) { + + if (strcmp (name, cam_iter->id.name+2) == 0) { + wanted_cam = (C_Camera *)PyObject_NEW(C_Camera, &Camera_Type); + if (wanted_cam) wanted_cam->camera = cam_iter; } + + cam_iter = cam_iter->id.next; } - if (wanted_cam == NULL) - { - /* No camera exists with the name specified in the argument name. */ + if (wanted_cam == NULL) { /* Requested camera doesn't exist */ char error_msg[64]; PyOS_snprintf(error_msg, sizeof(error_msg), "Camera \"%s\" not found", name); - return (PythonReturnErrorObject (PyExc_NameError, error_msg)); + return (EXPP_ReturnPyObjError (PyExc_NameError, error_msg)); } - wanted_cam->linked = 1; /* TRUE: linked to a Blender Camera Object */ - return ((PyObject*)wanted_cam); + return (PyObject*)wanted_cam; } /*****************************************************************************/ @@ -160,13 +128,13 @@ static PyObject *M_Camera_Get(PyObject *self, PyObject *args) /*****************************************************************************/ PyObject *M_Camera_Init (void) { - PyObject *module; + PyObject *submodule; printf ("In M_Camera_Init()\n"); + submodule = Py_InitModule3("Blender.Camera", + M_Camera_methods, M_Camera_doc); - module = Py_InitModule3("Camera", M_Camera_methods, M_Camera_doc); - - return (module); + return (submodule); } /*****************************************************************************/ @@ -174,137 +142,86 @@ PyObject *M_Camera_Init (void) /*****************************************************************************/ static PyObject *Camera_getName(C_Camera *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "name"); - if (attr) - { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyString_FromString(self->camera->id.name+2); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Camera.name attribute")); } static PyObject *Camera_getType(C_Camera *self) -{ - PyObject *attr; +{ + PyObject *attr = PyInt_FromLong(self->camera->type); - attr = PyDict_GetItemString(self->dict, "type"); - if (attr) - { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Camera.type attribute")); } static PyObject *Camera_getMode(C_Camera *self) { - PyObject *attr; + PyObject *attr = PyInt_FromLong(self->camera->flag); - attr = PyDict_GetItemString(self->dict, "mode"); - if (attr) - { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Camera.Mode attribute")); } static PyObject *Camera_getLens(C_Camera *self) { - PyObject *attr; + PyObject *attr = PyFloat_FromDouble(self->camera->lens); - attr = PyDict_GetItemString(self->dict, "lens"); - if (attr) - { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Camera.lens attribute")); } static PyObject *Camera_getClipStart(C_Camera *self) { - PyObject *attr; + PyObject *attr = PyFloat_FromDouble(self->camera->clipsta); - attr = PyDict_GetItemString(self->dict, "clipStart"); - if (attr) - { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Camera.clipStart attribute")); } static PyObject *Camera_getClipEnd(C_Camera *self) { - PyObject *attr; + PyObject *attr = PyFloat_FromDouble(self->camera->clipend); - attr = PyDict_GetItemString(self->dict, "clipEnd"); - if (attr) - { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Camera.clipEnd attribute")); } static PyObject *Camera_getDrawSize(C_Camera *self) { - PyObject *attr; + PyObject *attr = PyFloat_FromDouble(self->camera->drawsize); - attr = PyDict_GetItemString(self->dict, "drawSize"); - if (attr) - { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Camera.drawSize attribute")); } static PyObject *Camera_rename(C_Camera *self, PyObject *args) { - char *name_str; - char buf[21]; - PyObject *name; + char *name; + char buf[21]; - if (!PyArg_ParseTuple(args, "s", &name_str)) - { - return (PythonReturnErrorObject (PyExc_AttributeError, + if (!PyArg_ParseTuple(args, "s", &name)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected string argument")); - } - - PyOS_snprintf(buf, sizeof(buf), "%s", name_str); - - if (self->linked) - { - /* update the Blender Camera, too */ - ID *tmp_id = &self->camera->id; - rename_id(tmp_id, buf); - PyOS_snprintf(buf, sizeof(buf), "%s", tmp_id->name+2);/* may have changed */ - } - name = PyString_FromString(buf); + PyOS_snprintf(buf, sizeof(buf), "%s", name); - if (!name) - { - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyString Object")); - } - - if (PyDict_SetItemString(self->dict, "name", name) != 0) - { - Py_DECREF(name); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Camera.name attribute")); - } + rename_id(&self->camera->id, buf); Py_INCREF(Py_None); return Py_None; @@ -312,45 +229,19 @@ static PyObject *Camera_rename(C_Camera *self, PyObject *args) static PyObject *Camera_setType(C_Camera *self, PyObject *args) { - short value; - char *type_str; - PyObject *type; + char *type; - if (!PyArg_ParseTuple(args, "s", &type_str)) - { - return (PythonReturnErrorObject (PyExc_AttributeError, + if (!PyArg_ParseTuple(args, "s", &type)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected string argument")); - } - if (strcmp (type_str, "persp") == 0) - value = EXPP_CAM_TYPE_PERSP; - else if (strcmp (type_str, "ortho") == 0) - value = EXPP_CAM_TYPE_ORTHO; + if (strcmp (type, "persp") == 0) + self->camera->type = (short)EXPP_CAM_TYPE_PERSP; + else if (strcmp (type, "ortho") == 0) + self->camera->type = (short)EXPP_CAM_TYPE_ORTHO; else - { - return (PythonReturnErrorObject (PyExc_AttributeError, + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "unknown camera type")); - } - - type = PyInt_FromLong(value); - if (!type) - { - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyInt Object")); - } - - if (PyDict_SetItemString(self->dict, "type", type) != 0) - { - Py_DECREF(type); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Camera.type attribute")); - } - - if (self->linked) - { - /* update the Blender Camera, too */ - self->camera->type = value; - } Py_INCREF(Py_None); return Py_None; @@ -364,42 +255,16 @@ static PyObject *Camera_setType(C_Camera *self, PyObject *args) static PyObject *Camera_setIntType(C_Camera *self, PyObject *args) { short value; - PyObject *type; - if (!PyArg_ParseTuple(args, "i", &value)) - { - return (PythonReturnErrorObject (PyExc_AttributeError, + if (!PyArg_ParseTuple(args, "h", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected int argument: 0 or 1")); - } if (value == 0 || value == 1) - { - type = PyInt_FromLong(value); - } - else - { - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument: 0 or 1")); - } - - if (!type) - { - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyInt Object")); - } - - if (PyDict_SetItemString(self->dict, "type", type) != 0) - { - Py_DECREF(type); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "could not set Camera.type attribute")); - } - - if (self->linked) - { - /* update the Blender Camera, too */ self->camera->type = value; - } + else + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument: 0 or 1")); Py_INCREF(Py_None); return Py_None; @@ -409,56 +274,32 @@ static PyObject *Camera_setMode(C_Camera *self, PyObject *args) { char *mode_str1 = NULL, *mode_str2 = NULL; short flag = 0; - PyObject *mode; if (!PyArg_ParseTuple(args, "|ss", &mode_str1, &mode_str2)) - { - return (PythonReturnErrorObject (PyExc_AttributeError, + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected one or two strings as arguments")); - } - if (mode_str1 != NULL) - { + if (mode_str1 != NULL) { if (strcmp(mode_str1, "showLimits") == 0) - flag |= EXPP_CAM_MODE_SHOWLIMITS; + flag |= (short)EXPP_CAM_MODE_SHOWLIMITS; else if (strcmp(mode_str1, "showMist") == 0) - flag |= EXPP_CAM_MODE_SHOWMIST; + flag |= (short)EXPP_CAM_MODE_SHOWMIST; else - { - return (PythonReturnErrorObject (PyExc_AttributeError, + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "first argument is an unknown camera flag")); - } - if (mode_str2 != NULL) - { + if (mode_str2 != NULL) { if (strcmp(mode_str2, "showLimits") == 0) - flag |= EXPP_CAM_MODE_SHOWLIMITS; + flag |= (short)EXPP_CAM_MODE_SHOWLIMITS; else if (strcmp(mode_str2, "showMist") == 0) - flag |= EXPP_CAM_MODE_SHOWMIST; + flag |= (short)EXPP_CAM_MODE_SHOWMIST; else - { - return (PythonReturnErrorObject (PyExc_AttributeError, + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "second argument is an unknown camera flag")); - } } } - - mode = PyInt_FromLong(flag); - if (!mode) - { - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyInt Object")); - } - if (PyDict_SetItemString(self->dict, "mode", mode) != 0) - { - Py_DECREF(mode); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Camera.mode attribute")); - } - - if (self->linked) /* update the Blender Camera, too */ - self->camera->flag = flag; + self->camera->flag = flag; Py_INCREF(Py_None); return Py_None; @@ -469,42 +310,16 @@ static PyObject *Camera_setMode(C_Camera *self, PyObject *args) static PyObject *Camera_setIntMode(C_Camera *self, PyObject *args) { short value; - PyObject *mode; if (!PyArg_ParseTuple(args, "h", &value)) - { - return (PythonReturnErrorObject (PyExc_AttributeError, + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected int argument in [0,3]")); - } if (value >= 0 && value <= 3) - { - mode = PyInt_FromLong(value); - } - else - { - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument in [0,3]")); - } - - if (!mode) - { - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyInt object")); - } - - if (PyDict_SetItemString(self->dict, "mode", mode) != 0) - { - Py_DECREF(mode); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "could not set Camera.mode attribute")); - } - - if (self->linked) - { - /* update the Blender Camera, too */ self->camera->flag = value; - } + else + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument in [0,3]")); Py_INCREF(Py_None); return Py_None; @@ -513,35 +328,14 @@ static PyObject *Camera_setIntMode(C_Camera *self, PyObject *args) static PyObject *Camera_setLens(C_Camera *self, PyObject *args) { float value; - PyObject *lens; if (!PyArg_ParseTuple(args, "f", &value)) - { - return (PythonReturnErrorObject (PyExc_AttributeError, + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected float argument")); - } - value = EXPP_ClampFloat (value, EXPP_CAM_LENS_MIN, EXPP_CAM_LENS_MAX); - lens = PyFloat_FromDouble(value); - if (!lens) - { - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); - } - - if (PyDict_SetItemString(self->dict, "lens", lens) != 0) - { - Py_DECREF(lens); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Camera.lens attribute")); - } + self->camera->lens = EXPP_ClampFloat (value, + EXPP_CAM_LENS_MIN, EXPP_CAM_LENS_MAX); - if (self->linked) - { - /* update the Blender Camera, too */ - self->camera->lens = value; - } - Py_INCREF(Py_None); return Py_None; } @@ -549,37 +343,14 @@ static PyObject *Camera_setLens(C_Camera *self, PyObject *args) static PyObject *Camera_setClipStart(C_Camera *self, PyObject *args) { float value; - PyObject *clipStart; if (!PyArg_ParseTuple(args, "f", &value)) - { - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected a float number as argument")); - } - - value = EXPP_ClampFloat (value, EXPP_CAM_CLIPSTART_MIN, - EXPP_CAM_CLIPSTART_MAX); - - clipStart = PyFloat_FromDouble(value); - if (!clipStart) - { - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); - } + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected float argument")); - if (PyDict_SetItemString(self->dict, "clipStart", clipStart) != 0) - { - Py_DECREF(clipStart); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Camera.clipStart attribute")); - } + self->camera->clipsta = EXPP_ClampFloat (value, + EXPP_CAM_CLIPSTART_MIN, EXPP_CAM_CLIPSTART_MAX); - if (self->linked) - { - /* update the Blender Camera, too */ - self->camera->clipsta = value; - } - Py_INCREF(Py_None); return Py_None; } @@ -587,35 +358,13 @@ static PyObject *Camera_setClipStart(C_Camera *self, PyObject *args) static PyObject *Camera_setClipEnd(C_Camera *self, PyObject *args) { float value; - PyObject *clipEnd; if (!PyArg_ParseTuple(args, "f", &value)) - { - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected a float number as argument")); - } + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected float argument")); - value = EXPP_ClampFloat (value, EXPP_CAM_CLIPEND_MIN, EXPP_CAM_CLIPEND_MAX); - - clipEnd = PyFloat_FromDouble(value); - if (!clipEnd) - { - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); - } - - if (PyDict_SetItemString(self->dict, "clipEnd", clipEnd) != 0) - { - Py_DECREF(clipEnd); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Camera.clipEnd attribute")); - } - - if (self->linked) - { - /* update the Blender Camera, too */ - self->camera->clipend = value; - } + self->camera->clipend = EXPP_ClampFloat (value, + EXPP_CAM_CLIPEND_MIN, EXPP_CAM_CLIPEND_MAX); Py_INCREF(Py_None); return Py_None; @@ -624,162 +373,18 @@ static PyObject *Camera_setClipEnd(C_Camera *self, PyObject *args) static PyObject *Camera_setDrawSize(C_Camera *self, PyObject *args) { float value; - PyObject *drawSize; if (!PyArg_ParseTuple(args, "f", &value)) - { - return (PythonReturnErrorObject (PyExc_AttributeError, + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected a float number as argument")); - } - value = EXPP_ClampFloat (value, EXPP_CAM_DRAWSIZE_MIN, - EXPP_CAM_DRAWSIZE_MAX); - - drawSize = PyFloat_FromDouble(value); - if (!drawSize) - { - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); - } - - if (PyDict_SetItemString(self->dict, "drawSize", drawSize) != 0) - { - Py_DECREF(drawSize); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Camera.drawSize attribute")); - } - - if (self->linked) - { - /* update the Blender Camera, too */ - self->camera->drawsize = value; - } + self->camera->drawsize = EXPP_ClampFloat (value, + EXPP_CAM_DRAWSIZE_MIN, EXPP_CAM_DRAWSIZE_MAX); Py_INCREF(Py_None); return Py_None; } -/*****************************************************************************/ -/* Function: CameraCreatePyObject */ -/* Description: This function will create a new C_Camera. If the Camera */ -/* struct passed to it is not NULL, it'll use its attributes. */ -/*****************************************************************************/ -PyObject *CameraCreatePyObject (Camera *blenderCam) -{ - PyObject *name, *type, *mode; - PyObject *lens, *clipStart, *clipEnd, *drawSize; - PyObject *Types, *persp, *ortho; - PyObject *Modes, *showLimits, *showMist; - C_Camera *cam; - - printf ("In CameraCreatePyObject\n"); - - cam = (C_Camera *)PyObject_NEW(C_Camera, &Camera_Type); - - if (cam == NULL) - { - return NULL; - } - - cam->dict = PyDict_New(); - - if (cam->dict == NULL) - { - Py_DECREF((PyObject *)cam); - return NULL; - } - - if (blenderCam == NULL) - { - /* Not linked to a Camera Object yet */ - name = PyString_FromString("Data"); - type = PyInt_FromLong(EXPP_CAM_TYPE); - mode = PyInt_FromLong(EXPP_CAM_MODE); - lens = PyFloat_FromDouble(EXPP_CAM_LENS); - clipStart = PyFloat_FromDouble(EXPP_CAM_CLIPSTART); - clipEnd = PyFloat_FromDouble(EXPP_CAM_CLIPEND); - drawSize = PyFloat_FromDouble(EXPP_CAM_DRAWSIZE); - } - else - { - /* Camera Object available, get its attributes directly */ - name = PyString_FromString(blenderCam->id.name+2); - type = PyInt_FromLong(blenderCam->type); - mode = PyInt_FromLong(blenderCam->flag); - lens = PyFloat_FromDouble(blenderCam->lens); - clipStart = PyFloat_FromDouble(blenderCam->clipsta); - clipEnd = PyFloat_FromDouble(blenderCam->clipend); - drawSize = PyFloat_FromDouble(blenderCam->drawsize); - } - - Types = constant_New(); - persp = PyInt_FromLong(EXPP_CAM_TYPE_PERSP); - ortho = PyInt_FromLong(EXPP_CAM_TYPE_ORTHO); - - Modes = constant_New(); - showLimits = PyInt_FromLong(EXPP_CAM_MODE_SHOWLIMITS); - showMist = PyInt_FromLong(EXPP_CAM_MODE_SHOWMIST); - - if (name == NULL || type == NULL || mode == NULL|| lens == NULL || - clipStart == NULL || clipEnd == NULL || drawSize == NULL || - Types == NULL || persp == NULL || ortho == NULL || - Modes == NULL || showLimits == NULL || showMist == NULL) - { - /* Some object creation has gone wrong. Clean up. */ - goto fail; - } - - if ((PyDict_SetItemString(cam->dict, "name", name) != 0) || - (PyDict_SetItemString(cam->dict, "type", type) != 0) || - (PyDict_SetItemString(cam->dict, "mode", mode) != 0) || - (PyDict_SetItemString(cam->dict, "lens", lens) != 0) || - (PyDict_SetItemString(cam->dict, "clipStart", clipStart) != 0) || - (PyDict_SetItemString(cam->dict, "clipEnd", clipEnd) != 0) || - (PyDict_SetItemString(cam->dict, "drawSize", drawSize) != 0) || - (PyDict_SetItemString(cam->dict, "Types", Types) != 0) || - (PyDict_SetItemString(cam->dict, "Modes", Modes) != 0) || - (PyDict_SetItemString(cam->dict, "__members__", - PyDict_Keys(cam->dict)) != 0)) - { - /* One or more value setting actions has gone wwrong. Clean up. */ - goto fail; - } - - if ((PyDict_SetItemString(((C_constant *)Types)->dict, - "persp", persp) != 0) || - (PyDict_SetItemString(((C_constant *)Types)->dict, - "ortho", ortho) != 0) || - (PyDict_SetItemString(((C_constant *)Modes)->dict, - "showLimits", showLimits) != 0) || - (PyDict_SetItemString(((C_constant *)Modes)->dict, - "showMist", showMist) != 0)) - { - /* One or more value setting actions has gone wwrong. Clean up. */ - goto fail; - } - - cam->camera = blenderCam; /* it's NULL when creating only camera "data" */ - return ((PyObject*)cam); - -fail: - Py_XDECREF(name); - Py_XDECREF(type); - Py_XDECREF(mode); - Py_XDECREF(lens); - Py_XDECREF(clipStart); - Py_XDECREF(clipEnd); - Py_XDECREF(drawSize); - Py_XDECREF(Types); - Py_XDECREF(persp); - Py_XDECREF(ortho); - Py_XDECREF(Modes); - Py_XDECREF(showLimits); - Py_XDECREF(showMist); - Py_DECREF(cam->dict); - Py_DECREF((PyObject *)cam); - return NULL; -} - /*****************************************************************************/ /* Function: CameraDeAlloc */ /* Description: This is a callback function for the C_Camera type. It is */ @@ -787,70 +392,84 @@ fail: /*****************************************************************************/ static void CameraDeAlloc (C_Camera *self) { - Py_DECREF(self->dict); PyObject_DEL (self); } /*****************************************************************************/ /* Function: CameraGetAttr */ /* Description: This is a callback function for the C_Camera type. It is */ -/* the function that accesses C_Camera member variables and */ +/* the function that accesses C_Camera "member variables" and */ /* methods. */ /*****************************************************************************/ -static PyObject* CameraGetAttr (C_Camera *cam, char *name) +static PyObject *CameraGetAttr (C_Camera *self, char *name) { - /* first try the attributes dictionary */ - if (cam->dict) - { - PyObject *v = PyDict_GetItemString(cam->dict, name); - if (v) - { - Py_INCREF(v); /* was a borrowed ref */ - return v; - } + PyObject *attr = Py_None; + + if (strcmp(name, "name") == 0) + attr = PyString_FromString(self->camera->id.name+2); + else if (strcmp(name, "type") == 0) + attr = PyInt_FromLong(self->camera->type); + else if (strcmp(name, "mode") == 0) + attr = PyInt_FromLong(self->camera->flag); + else if (strcmp(name, "lens") == 0) + attr = PyFloat_FromDouble(self->camera->lens); + else if (strcmp(name, "clipStart") == 0) + attr = PyFloat_FromDouble(self->camera->clipsta); + else if (strcmp(name, "clipEnd") == 0) + attr = PyFloat_FromDouble(self->camera->clipend); + else if (strcmp(name, "drawSize") == 0) + attr = PyFloat_FromDouble(self->camera->drawsize); + + else if (strcmp(name, "Types") == 0) { + attr = Py_BuildValue("{s:h,s:h}", "persp", EXPP_CAM_TYPE_PERSP, + "ortho", EXPP_CAM_TYPE_ORTHO); } + else if (strcmp(name, "Modes") == 0) { + attr = Py_BuildValue("{s:h,s:h}", "showLimits", EXPP_CAM_MODE_SHOWLIMITS, + "showMist", EXPP_CAM_MODE_SHOWMIST); + } + + else if (strcmp(name, "__members__") == 0) { + attr = Py_BuildValue("[s,s,s,s,s,s,s,s,s]", + "name", "type", "mode", "lens", "clipStart", + "clipEnd", "drawSize", "Types", "Modes"); + } + + if (!attr) + return (EXPP_ReturnPyObjError (PyExc_MemoryError, + "couldn't create PyObject")); + + if (attr != Py_None) return attr; /* member attribute found, return it */ + /* not an attribute, search the methods table */ - return Py_FindMethod(C_Camera_methods, (PyObject *)cam, name); + return Py_FindMethod(C_Camera_methods, (PyObject *)self, name); } /*****************************************************************************/ /* Function: CameraSetAttr */ /* Description: This is a callback function for the C_Camera type. It is the */ -/* function that changes Camera Data members values. If this */ -/* data is linked to a Blender Camera, it also gets updated. */ +/* function that sets Camera Data attributes (member variables).*/ /*****************************************************************************/ static int CameraSetAttr (C_Camera *self, char *name, PyObject *value) { PyObject *valtuple; PyObject *error = NULL; - if (self->dict == NULL) - { - return -1; - } - /* We're playing a trick on the Python API users here. Even if they use - * Camera.member = val instead of Camera.setMember(value), we end up using the + * Camera.member = val instead of Camera.setMember(val), we end up using the * function anyway, since it already has error checking, clamps to the right * interval and updates the Blender Camera structure when necessary. */ - valtuple = PyTuple_New(1); /* the set* functions expect a tuple */ +/* First we put "value" in a tuple, because we want to pass it to functions + * that only accept PyTuples. Using "N" doesn't increment value's ref count */ + valtuple = Py_BuildValue("(N)", value); - if (!valtuple) - { - return EXPP_intError(PyExc_MemoryError, + if (!valtuple) /* everything OK with our PyObject? */ + return EXPP_ReturnIntError(PyExc_MemoryError, "CameraSetAttr: couldn't create PyTuple"); - } - - if (PyTuple_SetItem(valtuple, 0, value) != 0) - { - Py_DECREF(value); /* PyTuple_SetItem incref's value even when it fails */ - Py_DECREF(valtuple); - return EXPP_intError(PyExc_RuntimeError, - "CameraSetAttr: couldn't fill tuple"); - } +/* Now we just compare "name" with all possible C_Camera member variables */ if (strcmp (name, "name") == 0) error = Camera_rename (self, valtuple); else if (strcmp (name, "type") == 0) @@ -865,24 +484,30 @@ static int CameraSetAttr (C_Camera *self, char *name, PyObject *value) error = Camera_setClipEnd (self, valtuple); else if (strcmp (name, "drawSize") == 0) error = Camera_setDrawSize (self, valtuple); - else - { - /* Error: no such member in the Camera Data structure */ - Py_DECREF(value); + + else { /* Error */ Py_DECREF(valtuple); - return (EXPP_intError (PyExc_KeyError, - "attribute not found")); + + if ((strcmp (name, "Types") == 0) || /* user tried to change a */ + (strcmp (name, "Modes") == 0)) /* constant dict type ... */ + return (EXPP_ReturnIntError (PyExc_AttributeError, + "constant dictionary -- cannot be changed")); + + else /* ... or no member with the given name was found */ + return (EXPP_ReturnIntError (PyExc_KeyError, + "attribute not found")); } - if (error == Py_None) - { - return 0; /* normal exit */ - } - - Py_DECREF(value); +/* valtuple won't be returned to the caller, so we need to DECREF it */ Py_DECREF(valtuple); - return -1; + if (error != Py_None) return -1; + +/* Py_None was incref'ed by the called Camera_set* function. We probably + * don't need to decref Py_None (!), but since Python/C API manual tells us + * to treat it like any other PyObject regarding ref counting ... */ + Py_DECREF(Py_None); + return 0; /* normal exit */ } /*****************************************************************************/ @@ -892,18 +517,7 @@ static int CameraSetAttr (C_Camera *self, char *name, PyObject *value) /*****************************************************************************/ static int CameraPrint(C_Camera *self, FILE *fp, int flags) { - char *lstate = "unlinked"; - char *name; - - if (self->linked) - { - lstate = "linked"; - } - - name = PyString_AsString(Camera_getName(self)); - - fprintf(fp, "[Camera \"%s\" (%s)]", name, lstate); - + fprintf(fp, "[Camera \"%s\"]", self->camera->id.name+2); return 0; } @@ -914,18 +528,5 @@ static int CameraPrint(C_Camera *self, FILE *fp, int flags) /*****************************************************************************/ static PyObject *CameraRepr (C_Camera *self) { - char buf[64]; - char *lstate = "unlinked"; - char *name; - - if (self->linked) - { - lstate = "linked"; - } - - name = PyString_AsString(Camera_getName(self)); - - PyOS_snprintf(buf, sizeof(buf), "[Camera \"%s\" (%s)]", name, lstate); - - return PyString_FromString(buf); + return PyString_FromString(self->camera->id.name+2); } diff --git a/source/blender/python/api2_2x/Camera.h b/source/blender/python/api2_2x/Camera.h index 4f8d1a304b3..dd5b087924a 100644 --- a/source/blender/python/api2_2x/Camera.h +++ b/source/blender/python/api2_2x/Camera.h @@ -126,9 +126,7 @@ struct PyMethodDef M_Camera_methods[] = { /*****************************************************************************/ typedef struct { PyObject_HEAD - PyObject *dict; Camera *camera; - int linked; } C_Camera; /*****************************************************************************/ diff --git a/source/blender/python/api2_2x/Draw.c b/source/blender/python/api2_2x/Draw.c new file mode 100644 index 00000000000..04b26bf20be --- /dev/null +++ b/source/blender/python/api2_2x/Draw.c @@ -0,0 +1,741 @@ +/* + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * This is a new part of Blender. + * + * Contributor(s): Willian P. Germano + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** +*/ + +/* This file is the Blender.Draw part of opy_draw.c, from the old + * bpython/intern dir, with minor changes to adapt it to the new Python + * implementation. Non-trivial original comments are marked with an + * @ symbol at their beginning. */ + +#include "Draw.h" + +static void Button_dealloc(PyObject *self) +{ + Button *but= (Button*) self; + + if(but->type==3) MEM_freeN(but->val.asstr); + + PyMem_DEL(self); +} + +static PyObject *Button_getattr(PyObject *self, char *name) +{ + Button *but= (Button*) self; + + if(strcmp(name, "val") == 0) { + if (but->type==1) + return Py_BuildValue("i", but->val.asint); + else if (but->type==2) + return Py_BuildValue("f", but->val.asfloat); + else if (but->type==3) + return Py_BuildValue("s", but->val.asstr); + } + + PyErr_SetString(PyExc_AttributeError, name); + return NULL; +} + +static int Button_setattr(PyObject *self, char *name, PyObject *v) +{ + Button *but= (Button*) self; + + if(strcmp(name, "val") == 0) { + if (but->type==1) + PyArg_Parse(v, "i", &but->val.asint); + else if (but->type==2) + PyArg_Parse(v, "f", &but->val.asfloat); + else if (but->type==3) { + char *newstr; + + PyArg_Parse(v, "s", &newstr); + strncpy(but->val.asstr, newstr, but->slen); + } + } else { + PyErr_SetString(PyExc_AttributeError, name); + return -1; + } + + return 0; +} + +static PyObject *Button_repr(PyObject *self) +{ + return PyObject_Repr(Button_getattr(self, "val")); +} + +static Button *newbutton (void) +{ + Button *but= (Button *) PyObject_NEW(Button, &Button_Type); + + return but; +} + +/* GUI interface routines */ + +static void exit_pydraw(SpaceText *st) +{ + scrarea_queue_redraw(st->area); + + if (st) { + Py_XDECREF((PyObject *) st->py_draw); + Py_XDECREF((PyObject *) st->py_event); + Py_XDECREF((PyObject *) st->py_button); + + st->py_draw= st->py_event= st->py_button= NULL; + } +} + +static void exec_callback(SpaceText *st, PyObject *callback, PyObject *args) +{ + PyObject *result= PyEval_CallObject(callback, args); + + if (result==NULL) { + st->text->compiled= NULL; + PyErr_Print(); + exit_pydraw(st); + } + Py_XDECREF(result); + Py_DECREF(args); +} + +/*@ the handler for drawing routines (see Register method) */ + +void EXPP_spacetext_do_pywin_draw(SpaceText *st) +{ + uiBlock *block; + char butblock[20]; + + sprintf(butblock, "win %d", curarea->win); + block= uiNewBlock(&curarea->uiblocks, butblock, UI_EMBOSSX, + UI_HELV, curarea->win); + + if (st->py_draw) { + glPushAttrib(GL_ALL_ATTRIB_BITS); + exec_callback(st, st->py_draw, Py_BuildValue("()")); + glPopAttrib(); + } else { + glClearColor(0.4375, 0.4375, 0.4375, 0.0); + glClear(GL_COLOR_BUFFER_BIT); + } + + uiDrawBlock(block); + + curarea->win_swap= WIN_BACK_OK; +} + +/*@ the handler for button event routines (see Register method) */ + +static void spacetext_do_pywin_buttons(SpaceText *st, unsigned short event) +{ + if (st->py_button) { + exec_callback(st, st->py_button, Py_BuildValue("(i)", event)); + } +} + +/*@ calls the generic event handling methods registered with Register */ + +void EXPP_spacetext_do_pywin_event(SpaceText *st, unsigned short event, short val) +{ + if (event==QKEY && G.qual & (LR_ALTKEY|LR_CTRLKEY|LR_SHIFTKEY)) { + exit_pydraw(st); + return; + } + + if (val) { + if (uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0; + + if (event==UI_BUT_EVENT) { + spacetext_do_pywin_buttons(st, val); + } + } + + if (st->py_event) { + exec_callback(st, st->py_event, Py_BuildValue("(ii)", event, val)); + } +} + +int EXPP_spacetext_is_pywin(SpaceText *st) +{ + return (st->py_draw || st->py_event || st->py_button); +} + +#define EXPP_TRY(x) if((!(x))) \ + return EXPP_ReturnPyObjError(PyExc_AttributeError, "in module Blender.Draw") + +static PyObject *Method_Exit (PyObject *self, PyObject *args) +{ + SpaceText *st= curarea->spacedata.first; +#ifdef CLEAR_NAMESPACE + PyObject *d; +#endif + EXPP_TRY(PyArg_ParseTuple(args, "")); + + exit_pydraw(st); +#ifdef CLEAR_NAMESPACE + d = st->py_globaldict; /* The current window's global namespace dictionary */ + if (d) { + PyDict_Clear(d); + Py_DECREF(d); /* release dictionary */ + } +#endif + + return EXPP_incr_ret(Py_None); +} + +static PyObject *Method_Register (PyObject *self, PyObject *args) +{ + PyObject *newdrawc= NULL, *neweventc= NULL, *newbuttonc= NULL; + SpaceText *st= curarea->spacedata.first; + + EXPP_TRY(PyArg_ParseTuple(args, "O|OO", &newdrawc, + &neweventc, &newbuttonc)); + + /*@This is a hack again: + * Every python script should actually do a global variable cleanup at + * the end of execution. + * For scripts registering GUI callbacks, this does not work, because + * the global namespace of the interpreter still needs to be accessed + * from the callback. + * Workaround: a text object has a flag which allows the global name + * space to be cleared at the end of the script. This flag should be + * normally set when executed with Alt-P. For a script registering with + * the GUI though, clear the flag and set it when the GUI mode is left + * (Method_Exit). + */ + +/* EXPP_debug(("--- disable clear namespace")); */ + + st->flags &= ~ST_CLEAR_NAMESPACE; + + + if (!PyCallable_Check(newdrawc)) newdrawc= NULL; + if (!PyCallable_Check(neweventc)) neweventc= NULL; + if (!PyCallable_Check(newbuttonc)) newbuttonc= NULL; + + if (!(newdrawc || neweventc || newbuttonc)) + return EXPP_incr_ret(Py_None); + + exit_pydraw(st); + + Py_XINCREF(newdrawc); + Py_XINCREF(neweventc); + Py_XINCREF(newbuttonc); + + st->py_draw= newdrawc; + st->py_event= neweventc; + st->py_button= newbuttonc; + + scrarea_queue_redraw(st->area); + + return EXPP_incr_ret(Py_None); +} + +static PyObject *Method_Redraw (PyObject *self, PyObject *args) +{ + int after= 0; + + EXPP_TRY(PyArg_ParseTuple(args, "|i", &after)); + + if (after) addafterqueue(curarea->win, REDRAW, 1); + else scrarea_queue_winredraw(curarea); + + return EXPP_incr_ret(Py_None); +} + +static PyObject *Method_Draw (PyObject *self, PyObject *args) +{ + /*@ If forced drawing is disable queue a redraw event instead */ + if (EXPP_disable_force_draw) { + scrarea_queue_winredraw(curarea); + return EXPP_incr_ret(Py_None); + } + + EXPP_TRY(PyArg_ParseTuple(args, "")); + + scrarea_do_windraw(curarea); + + screen_swapbuffers(); + + return EXPP_incr_ret(Py_None); +} + +static PyObject *Method_Create (PyObject *self, PyObject *args) +{ + Button *but; + PyObject *in; + + EXPP_TRY(PyArg_ParseTuple(args, "O", &in)); + + but= newbutton(); + if(PyFloat_Check(in)) { + but->type= 2; + but->val.asfloat= PyFloat_AsDouble(in); + } else if (PyInt_Check(in)) { + but->type= 1; + but->val.asint= PyInt_AsLong(in); + } else if (PyString_Check(in)) { + char *newstr= PyString_AsString(in); + + but->type= 3; + but->slen= strlen(newstr); + but->val.asstr= MEM_mallocN(but->slen+1, "button string"); + + strcpy(but->val.asstr, newstr); + } + + return (PyObject *) but; +} + +static uiBlock *Get_uiBlock(void) +{ + char butblock[32]; + + sprintf(butblock, "win %d", curarea->win); + + return uiGetBlock(butblock, curarea); +} + +static PyObject *Method_Button (PyObject *self, PyObject *args) +{ + uiBlock *block; + char *name, *tip= NULL; + int event; + int x, y, w, h; + + EXPP_TRY(PyArg_ParseTuple(args, "siiiii|s", &name, &event, + &x, &y, &w, &h, &tip)); + + block= Get_uiBlock(); + + if(block) uiDefBut(block, BUT, event, name, x, y, w, h, + 0, 0, 0, 0, 0, tip); + + return EXPP_incr_ret(Py_None); +} + +static PyObject *Method_Menu (PyObject *self, PyObject *args) +{ + uiBlock *block; + char *name, *tip= NULL; + int event, def; + int x, y, w, h; + Button *but; + + EXPP_TRY(PyArg_ParseTuple(args, "siiiiii|s", &name, &event, + &x, &y, &w, &h, &def, &tip)); + + but= newbutton(); + but->type= 1; + but->val.asint= def; + + block= Get_uiBlock(); + if(block) uiDefButI(block, MENU, event, name, x, y, w, h, + &but->val.asint, 0, 0, 0, 0, tip); + + return (PyObject *) but; +} + +static PyObject *Method_Toggle (PyObject *self, PyObject *args) +{ + uiBlock *block; + char *name, *tip= NULL; + int event; + int x, y, w, h, def; + Button *but; + + EXPP_TRY(PyArg_ParseTuple(args, "siiiiii|s", &name, &event, + &x, &y, &w, &h, &def, &tip)); + + but= newbutton(); + but->type= 1; + but->val.asint= def; + + block= Get_uiBlock(); + if(block) uiDefButI(block, TOG, event, name, x, y, w, h, + &but->val.asint, 0, 0, 0, 0, tip); + + return (PyObject *) but; +} + +/*@DO NOT TOUCH THIS FUNCTION ! + Redrawing a slider inside its own callback routine is actually forbidden + with the current toolkit architecture (button routines are not reentrant). + But it works anyway. + XXX This is condemned to be dinosource in future - it's a hack. + */ + +static void py_slider_update(void *butv, void *data2_unused) +{ + uiBut *but= butv; + + EXPP_disable_force_draw= 1; + /*@ + Disable forced drawing, otherwise the button object which + is still being used might be deleted + */ + +/*@ UIfrontbuf = 0; + spacetext_do_pywin_buttons(curarea->spacedata.first, but->retval); */ + + g_window_redrawn = 0; + curarea->win_swap= WIN_BACK_OK; + UIfrontbuf = 1; + spacetext_do_pywin_buttons(curarea->spacedata.first, uiButGetRetVal(but)); + UIfrontbuf = 0; + + if (!g_window_redrawn) /*@ if Redraw already called */ + M_Window_Redraw(0, Py_BuildValue("(i)", SPACE_VIEW3D)); + + EXPP_disable_force_draw= 0; +} + +static PyObject *Method_Slider (PyObject *self, PyObject *args) +{ + uiBlock *block; + char *name, *tip= NULL; + int event; + int x, y, w, h, realtime=1; + Button *but; + PyObject *mino, *maxo, *inio; + + EXPP_TRY(PyArg_ParseTuple(args, "siiiiiOOO|is", &name, &event, + &x, &y, &w, &h, &inio, &mino, &maxo, &realtime, &tip)); + + + but= newbutton(); + if (PyFloat_Check(inio)) { + float ini, min, max; + + ini= PyFloat_AsDouble(inio); + min= PyFloat_AsDouble(mino); + max= PyFloat_AsDouble(maxo); + + but->type= 2; + but->val.asfloat= ini; + + block= Get_uiBlock(); + if(block) { + uiBut *ubut; + ubut= uiDefButF(block, NUMSLI, event, name, x, y, w, h, + &but->val.asfloat, min, max, 0, 0, tip); + if (realtime) uiButSetFunc(ubut, py_slider_update, ubut, NULL); + } + } + else { + int ini, min, max; + + ini= PyInt_AsLong(inio); + min= PyInt_AsLong(mino); + max= PyInt_AsLong(maxo); + + but->type= 1; + but->val.asint= ini; + + block= Get_uiBlock(); + if(block) { + uiBut *ubut; + ubut= uiDefButI(block, NUMSLI, event, name, x, y, w, h, + &but->val.asint, min, max, 0, 0, tip); + if (realtime) uiButSetFunc(ubut, py_slider_update, ubut, NULL); + } + } + return (PyObject *) but; +} + +static PyObject *Method_Scrollbar (PyObject *self, PyObject *args) +{ + char *tip= NULL; + uiBlock *block; + int event; + int x, y, w, h, realtime=1; + Button *but; + PyObject *mino, *maxo, *inio; + float ini, min, max; + + EXPP_TRY(PyArg_ParseTuple(args, "iiiiiOOO|is", &event, &x, &y, &w, &h, &inio, &mino, &maxo, &realtime, &tip)); + + if (!PyNumber_Check(inio) || !PyNumber_Check(inio) || !PyNumber_Check(inio)) + return EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected numbers for initial, min, and max"); + + but= newbutton(); + + if (PyFloat_Check(inio)) but->type= 2; + else but->type= 1; + + ini= PyFloat_AsDouble(inio); + min= PyFloat_AsDouble(mino); + max= PyFloat_AsDouble(maxo); + + if (but->type==2) { + but->val.asfloat= ini; + block= Get_uiBlock(); + if(block) { + uiBut *ubut; + ubut= uiDefButF(block, SCROLL, event, "", x, y, w, h, + &but->val.asfloat, min, max, 0, 0, tip); + if (realtime) uiButSetFunc(ubut, py_slider_update, ubut, NULL); + } + } else { + but->val.asint= ini; + block= Get_uiBlock(); + if(block) { + uiBut *ubut; + ubut= uiDefButI(block, SCROLL, event, "", x, y, w, h, + &but->val.asint, min, max, 0, 0, tip); + if (realtime) uiButSetFunc(ubut, py_slider_update, ubut, NULL); + } + } + + return (PyObject *) but; +} + +static PyObject *Method_Number (PyObject *self, PyObject *args) +{ + uiBlock *block; + char *name, *tip= NULL; + int event; + int x, y, w, h; + Button *but; + PyObject *mino, *maxo, *inio; + + EXPP_TRY(PyArg_ParseTuple(args, "siiiiiOOO|s", &name, &event, + &x, &y, &w, &h, &inio, &mino, &maxo, &tip)); + + but= newbutton(); + + if (PyFloat_Check(inio)) { + float ini, min, max; + + ini= PyFloat_AsDouble(inio); + min= PyFloat_AsDouble(mino); + max= PyFloat_AsDouble(maxo); + + but->type= 2; + but->val.asfloat= ini; + + block= Get_uiBlock(); + if(block) uiDefButF(block, NUM, event, name, x, y, w, h, + &but->val.asfloat, min, max, 0, 0, tip); + } else { + int ini, min, max; + + ini= PyInt_AsLong(inio); + min= PyInt_AsLong(mino); + max= PyInt_AsLong(maxo); + + but->type= 1; + but->val.asint= ini; + + block= Get_uiBlock(); + if(block) uiDefButI(block, NUM, event, name, x, y, w, h, + &but->val.asint, min, max, 0, 0, tip); + } + + return (PyObject *) but; +} + +static PyObject *Method_String (PyObject *self, PyObject *args) +{ + uiBlock *block; + char *name, *tip= NULL, *newstr; + int event; + int x, y, w, h, len; + Button *but; + + EXPP_TRY(PyArg_ParseTuple(args, "siiiiisi|s", &name, &event, + &x, &y, &w, &h, &newstr, &len, &tip)); + + but= newbutton(); + but->type= 3; + but->slen= len; + but->val.asstr= MEM_mallocN(len+1, "button string"); + + strncpy(but->val.asstr, newstr, len); + but->val.asstr[len]= 0; + + block= Get_uiBlock(); + if(block) uiDefBut(block, TEX, event, name, x, y, w, h, + but->val.asstr, 0, len, 0, 0, tip); + + return (PyObject *) but; +} + +static PyObject *Method_Text (PyObject *self, PyObject *args) +{ + char *text; + + EXPP_TRY(PyArg_ParseTuple(args, "s", &text)); + + BMF_DrawString(G.font, text); + + return EXPP_incr_ret(Py_None); +} + +PyObject *M_Draw_Init (void) +{ + PyObject *submodule, *dict; + + printf("In M_Draw_Init()\n"); + + submodule = Py_InitModule3("Blender.Draw", Draw_methods, Draw_doc); + + dict= PyModule_GetDict(submodule); + +#define EXPP_ADDCONST(x) \ + PyDict_SetItemString(dict, #x, PyInt_FromLong(x)) + +/* So, for example: + * EXPP_ADDCONST(LEFTMOUSE) becomes + * PyDict_SetItemString(dict, "LEFTMOUSE", PyInt_FromLong(LEFTMOUSE)) */ + + EXPP_ADDCONST(LEFTMOUSE); + EXPP_ADDCONST(MIDDLEMOUSE); + EXPP_ADDCONST(RIGHTMOUSE); + EXPP_ADDCONST(MOUSEX); + EXPP_ADDCONST(MOUSEY); + EXPP_ADDCONST(TIMER0); + EXPP_ADDCONST(TIMER1); + EXPP_ADDCONST(TIMER2); + EXPP_ADDCONST(TIMER3); + EXPP_ADDCONST(KEYBD); + EXPP_ADDCONST(RAWKEYBD); + EXPP_ADDCONST(REDRAW); + EXPP_ADDCONST(INPUTCHANGE); + EXPP_ADDCONST(QFULL); + EXPP_ADDCONST(WINFREEZE); + EXPP_ADDCONST(WINTHAW); + EXPP_ADDCONST(WINCLOSE); + EXPP_ADDCONST(WINQUIT); +#ifndef IRISGL + EXPP_ADDCONST(Q_FIRSTTIME); +#endif + EXPP_ADDCONST(AKEY); + EXPP_ADDCONST(BKEY); + EXPP_ADDCONST(CKEY); + EXPP_ADDCONST(DKEY); + EXPP_ADDCONST(EKEY); + EXPP_ADDCONST(FKEY); + EXPP_ADDCONST(GKEY); + EXPP_ADDCONST(HKEY); + EXPP_ADDCONST(IKEY); + EXPP_ADDCONST(JKEY); + EXPP_ADDCONST(KKEY); + EXPP_ADDCONST(LKEY); + EXPP_ADDCONST(MKEY); + EXPP_ADDCONST(NKEY); + EXPP_ADDCONST(OKEY); + EXPP_ADDCONST(PKEY); + EXPP_ADDCONST(QKEY); + EXPP_ADDCONST(RKEY); + EXPP_ADDCONST(SKEY); + EXPP_ADDCONST(TKEY); + EXPP_ADDCONST(UKEY); + EXPP_ADDCONST(VKEY); + EXPP_ADDCONST(WKEY); + EXPP_ADDCONST(XKEY); + EXPP_ADDCONST(YKEY); + EXPP_ADDCONST(ZKEY); + EXPP_ADDCONST(ZEROKEY); + EXPP_ADDCONST(ONEKEY); + EXPP_ADDCONST(TWOKEY); + EXPP_ADDCONST(THREEKEY); + EXPP_ADDCONST(FOURKEY); + EXPP_ADDCONST(FIVEKEY); + EXPP_ADDCONST(SIXKEY); + EXPP_ADDCONST(SEVENKEY); + EXPP_ADDCONST(EIGHTKEY); + EXPP_ADDCONST(NINEKEY); + EXPP_ADDCONST(CAPSLOCKKEY); + EXPP_ADDCONST(LEFTCTRLKEY); + EXPP_ADDCONST(LEFTALTKEY); + EXPP_ADDCONST(RIGHTALTKEY); + EXPP_ADDCONST(RIGHTCTRLKEY); + EXPP_ADDCONST(RIGHTSHIFTKEY); + EXPP_ADDCONST(LEFTSHIFTKEY); + EXPP_ADDCONST(ESCKEY); + EXPP_ADDCONST(TABKEY); + EXPP_ADDCONST(RETKEY); + EXPP_ADDCONST(SPACEKEY); + EXPP_ADDCONST(LINEFEEDKEY); + EXPP_ADDCONST(BACKSPACEKEY); + EXPP_ADDCONST(DELKEY); + EXPP_ADDCONST(SEMICOLONKEY); + EXPP_ADDCONST(PERIODKEY); + EXPP_ADDCONST(COMMAKEY); + EXPP_ADDCONST(QUOTEKEY); + EXPP_ADDCONST(ACCENTGRAVEKEY); + EXPP_ADDCONST(MINUSKEY); + EXPP_ADDCONST(SLASHKEY); + EXPP_ADDCONST(BACKSLASHKEY); + EXPP_ADDCONST(EQUALKEY); + EXPP_ADDCONST(LEFTBRACKETKEY); + EXPP_ADDCONST(RIGHTBRACKETKEY); + EXPP_ADDCONST(LEFTARROWKEY); + EXPP_ADDCONST(DOWNARROWKEY); + EXPP_ADDCONST(RIGHTARROWKEY); + EXPP_ADDCONST(UPARROWKEY); + EXPP_ADDCONST(PAD2); + EXPP_ADDCONST(PAD4); + EXPP_ADDCONST(PAD6); + EXPP_ADDCONST(PAD8); + EXPP_ADDCONST(PAD1); + EXPP_ADDCONST(PAD3); + EXPP_ADDCONST(PAD5); + EXPP_ADDCONST(PAD7); + EXPP_ADDCONST(PAD9); + EXPP_ADDCONST(PADPERIOD); + EXPP_ADDCONST(PADSLASHKEY); + EXPP_ADDCONST(PADASTERKEY); + EXPP_ADDCONST(PAD0); + EXPP_ADDCONST(PADMINUS); + EXPP_ADDCONST(PADENTER); + EXPP_ADDCONST(PADPLUSKEY); + EXPP_ADDCONST(F1KEY); + EXPP_ADDCONST(F2KEY); + EXPP_ADDCONST(F3KEY); + EXPP_ADDCONST(F4KEY); + EXPP_ADDCONST(F5KEY); + EXPP_ADDCONST(F6KEY); + EXPP_ADDCONST(F7KEY); + EXPP_ADDCONST(F8KEY); + EXPP_ADDCONST(F9KEY); + EXPP_ADDCONST(F10KEY); + EXPP_ADDCONST(F11KEY); + EXPP_ADDCONST(F12KEY); + EXPP_ADDCONST(PAUSEKEY); + EXPP_ADDCONST(INSERTKEY); + EXPP_ADDCONST(HOMEKEY); + EXPP_ADDCONST(PAGEUPKEY); + EXPP_ADDCONST(PAGEDOWNKEY); + EXPP_ADDCONST(ENDKEY); + + return submodule; +} diff --git a/source/blender/python/api2_2x/Draw.h b/source/blender/python/api2_2x/Draw.h new file mode 100644 index 00000000000..2220a48c4c4 --- /dev/null +++ b/source/blender/python/api2_2x/Draw.h @@ -0,0 +1,306 @@ +/* + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * This is a new part of Blender. + * + * Contributor(s): Willian P. Germano + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** +*/ + +/* The code in Draw.[ch] and BGL.[ch] comes from opy_draw.c in the old + * bpython/intern dir, with minor modifications to suit the current + * implementation. Important original comments are marked with an @ symbol. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef WIN32 +#include "BLI_winstuff.h" +#endif + +#include "MEM_guardedalloc.h" + +#include "BMF_Api.h" + +#include "DNA_screen_types.h" +#include "DNA_space_types.h" +#include "DNA_text_types.h" + +#include "BKE_global.h" + +#include "BIF_gl.h" +#include "BIF_screen.h" +#include "BIF_space.h" +#include "BIF_interface.h" +#include "BIF_mywindow.h" + +#include "interface.h" +#include "mydevice.h" /*@ for all the event constants */ + +#include "Python.h" + +#include "gen_utils.h" +#include "modules.h" + +/*@ hack to flag that window redraw has happened inside slider callback: */ +int EXPP_disable_force_draw; + +/* From Window.h, used here by py_slider_update() */ +PyObject *M_Window_Redraw(PyObject *self, PyObject *args); + +/* This one was an extern in BPY_main.h, but only opy_draw.c was using it */ +int g_window_redrawn; + +static char Draw_doc[] = +"Module Blender.Draw ... XXX improve this"; + +static void exit_pydraw (SpaceText *st); +static uiBlock *Get_uiBlock (void); +void initDraw (void); + +/* Button Object */ + +typedef struct _Button { + PyObject_VAR_HEAD + + int type; /*@ 1 == int, 2 == float, 3 == string */ + int slen; /*@ length of string (if type == 3) */ + union { + int asint; + float asfloat; + char *asstr; + } val; +} Button; + +static void Button_dealloc(PyObject *self); +static PyObject *Button_getattr(PyObject *self, char *name); +static int Button_setattr(PyObject *self, char *name, PyObject *v); +static PyObject *Button_repr(PyObject *self); + +PyTypeObject Button_Type = +{ + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "Button", /*tp_name*/ + sizeof(Button), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor) Button_dealloc, /*tp_dealloc*/ + (printfunc) 0, /*tp_print*/ + (getattrfunc) Button_getattr, /*tp_getattr*/ + (setattrfunc) Button_setattr, /*tp_setattr*/ + (cmpfunc) 0, /*tp_cmp*/ + (reprfunc) Button_repr, /*tp_repr*/ +}; + +static Button *newbutton (void); + +/* GUI interface routines */ + +static void exit_pydraw(SpaceText *st); +static void exec_callback(SpaceText *st, PyObject *callback, PyObject *args); +void EXPP_spacetext_do_pywin_draw(SpaceText *st); +static void spacetext_do_pywin_buttons(SpaceText *st, unsigned short event); +void EXPP_spacetext_do_pywin_event(SpaceText *st, unsigned short event, short val); +int EXPP_spacetext_is_pywin(SpaceText *st); + +static char Method_Exit_doc[] = +"() - Exit the windowing interface"; + +static PyObject *Method_Exit (PyObject *self, PyObject *args); + +static char Method_Register_doc[] = +"(draw, event, button) - Register callbacks for windowing\n\n\ +(draw) A function to draw the screen, taking no arguments\n\ +(event) A function to handle events, taking 2 arguments (evt, val)\n\ + (evt) The event number\n\ + (val) The value modifier (for key and mouse press/release)\n\ +(button) A function to handle button events, taking 1 argument (evt)\n\ + (evt) The button number\n\n\ +A None object can be passed if a callback is unused."; + +static PyObject *Method_Register (PyObject *self, PyObject *args); + +static char Method_Redraw_doc[] = +"([after]) - Queue a redraw event\n\n\ +[after=0] Determines whether the redraw is processed before\n\ +or after other input events.\n\n\ +Redraw events are buffered so that regardless of how many events\n\ +are queued the window only receives one redraw event."; + +static PyObject *Method_Redraw (PyObject *self, PyObject *args); + +static char Method_Draw_doc[] = +"() - Force an immediate redraw\n\n\ +Forced redraws are not buffered, in other words the window is redrawn\n\ +exactly once for everytime this function is called."; + +static PyObject *Method_Draw (PyObject *self, PyObject *args); + +static char Method_Create_doc[] = +"(value) - Create a default Button object\n\ +\n\ +(value) - The value to store in the button\n\ +\n\ +Valid values are ints, floats, and strings"; + +static PyObject *Method_Create (PyObject *self, PyObject *args); + +static uiBlock *Get_uiBlock(void); + +static char Method_Button_doc[] = +"(name, event, x, y, width, height, [tooltip]) - Create a new Button \ +(push) button\n\n\ +(name) A string to display on the button\n\ +(event) The event number to pass to the button event function when activated\n\ +(x, y) The lower left coordinate of the button\n\ +(width, height) The button width and height\n\ +[tooltip=""] The button's tooltip"; + +static PyObject *Method_Button (PyObject *self, PyObject *args); + +static char Method_Menu_doc[] = +"(name, event, x, y, width, height, default, [tooltip]) - Create a new Menu \ +button\n\n\ +(name) A string to display on the button\n\ +(event) The event number to pass to the button event function when activated\n\ +(x, y) The lower left coordinate of the button\n\ +(width, height) The button width and height\n\ +(default) The number of the option to be selected by default\n\ +[tooltip=""] The button's tooltip\n\n\ +The menu options are specified through the name of the\n\ +button. Options are followed by a format code and seperated\n\ +by the '|' (pipe) character.\n\ +Valid format codes are\n\ + %t - The option should be used as the title\n\ + %xN - The option should set the integer N in the button value."; + +static PyObject *Method_Menu (PyObject *self, PyObject *args); + +static char Method_Toggle_doc[] = +"(name, event, x, y, width, height, default, [tooltip]) - Create a new Toggle \ +button\n\n\ +(name) A string to display on the button\n\ +(event) The event number to pass to the button event function when activated\n\ +(x, y) The lower left coordinate of the button\n\ +(width, height) The button width and height\n\ +(default) An integer (0 or 1) specifying the default state\n\ +[tooltip=""] The button's tooltip"; + +static PyObject *Method_Toggle (PyObject *self, PyObject *args); +static void py_slider_update(void *butv, void *data2_unused); + +static char Method_Slider_doc[] = +"(name, event, x, y, width, height, initial, min, max, [update, tooltip]) - \ +Create a new Slider button\n\n\ +(name) A string to display on the button\n\ +(event) The event number to pass to the button event function when activated\n\ +(x, y) The lower left coordinate of the button\n\ +(width, height) The button width and height\n\ +(initial, min, max) Three values (int or float) specifying the initial \ + and limit values.\n\ +[update=1] A value controlling whether the slider will emit events as it \ +is edited.\n\ + A non-zero value (default) enables the events. A zero value supresses them.\n\ +[tooltip=""] The button's tooltip"; + +static PyObject *Method_Slider (PyObject *self, PyObject *args); + +static char Method_Scrollbar_doc[] = +"(event, x, y, width, height, initial, min, max, [update, tooltip]) - Create a \ +new Scrollbar\n\n\ +(event) The event number to pass to the button event function when activated\n\ +(x, y) The lower left coordinate of the button\n\ +(width, height) The button width and height\n\ +(initial, min, max) Three values (int or float) specifying the initial and limit values.\n\ +[update=1] A value controlling whether the slider will emit events as it is edited.\n\ + A non-zero value (default) enables the events. A zero value supresses them.\n\ +[tooltip=""] The button's tooltip"; + +static PyObject *Method_Scrollbar (PyObject *self, PyObject *args); + +static char Method_Number_doc[] = +"(name, event, x, y, width, height, initial, min, max, [tooltip]) - Create a \ +new Number button\n\n\ +(name) A string to display on the button\n\ +(event) The event number to pass to the button event function when activated\n\ +(x, y) The lower left coordinate of the button\n\ +(width, height) The button width and height\n\ +(initial, min, max) Three values (int or float) specifying the initial and \ +limit values.\n\ +[tooltip=""] The button's tooltip"; + +static PyObject *Method_Number (PyObject *self, PyObject *args); + +static char Method_String_doc[] = +"(name, event, x, y, width, height, initial, length, [tooltip]) - Create a \ +new String button\n\n\ +(name) A string to display on the button\n\ +(event) The event number to pass to the button event function when activated\n\ +(x, y) The lower left coordinate of the button\n\ +(width, height) The button width and height\n\ +(initial) The string to display initially\n\ +(length) The maximum input length\n\ +[tooltip=""] The button's tooltip"; + +static PyObject *Method_String (PyObject *self, PyObject *args); + +static char Method_Text_doc[] = +"(text) - Draw text onscreen\n\n\ +(text) The text to draw\n"; + +static PyObject *Method_Text (PyObject *self, PyObject *args); + +#define _MethodDef(func, prefix) \ + {#func, prefix##_##func, METH_VARARGS, prefix##_##func##_doc} + +/* So that _MethodDef(delete, Scene) expands to: + * {"delete", Scene_delete, METH_VARARGS, Scene_delete_doc} */ + +#undef MethodDef +#define MethodDef(func) _MethodDef(func, Method) + +static struct PyMethodDef Draw_methods[] = { + MethodDef(Create), + MethodDef(Button), + MethodDef(Toggle), + MethodDef(Menu), + MethodDef(Slider), + MethodDef(Scrollbar), + MethodDef(Number), + MethodDef(String), + + MethodDef(Text), + + MethodDef(Exit), + MethodDef(Redraw), + MethodDef(Draw), + MethodDef(Register), + + {NULL, NULL} +}; + +PyObject *M_Draw_Init (void); + diff --git a/source/blender/python/api2_2x/EXPP_interface.c b/source/blender/python/api2_2x/EXPP_interface.c new file mode 100644 index 00000000000..e879532864e --- /dev/null +++ b/source/blender/python/api2_2x/EXPP_interface.c @@ -0,0 +1,130 @@ +/* + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * This is a new part of Blender. + * + * Contributor(s): Michel Selten + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** +*/ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gen_utils.h" +#include "modules.h" + +void initBlenderApi2_2x (void) +{ + printf ("initBlenderApi2_2x\n"); + g_blenderdict = NULL; + initBlender (); +} + +ScriptLink * setScriptLinks(ID *id, short event) +{ + ScriptLink * scriptlink; + PyObject * link; + Object * object; + int obj_id; + + obj_id = MAKE_ID2 (id->name[0], id->name[1]); + printf ("In setScriptLinks (id=%s, event=%d)\n",id->name, event); + + switch (obj_id) + { + case ID_OB: + object = GetObjectByName (GetIdName (id)); + if (object == NULL) + { + return NULL; + } + link = ObjectCreatePyObject (object); + scriptlink = &(object->scriptlink); + break; + case ID_LA: + scriptlink = NULL; + Py_INCREF(Py_None); + link = Py_None; + break; + case ID_CA: + scriptlink = NULL; + Py_INCREF(Py_None); + link = Py_None; + break; + case ID_MA: + scriptlink = NULL; + Py_INCREF(Py_None); + link = Py_None; + break; + case ID_WO: + scriptlink = NULL; + Py_INCREF(Py_None); + link = Py_None; + break; + case ID_SCE: + scriptlink = NULL; + Py_INCREF(Py_None); + link = Py_None; + break; + default: + Py_INCREF(Py_None); + link = Py_None; + return NULL; + } + + if (scriptlink == NULL) + { + /* This is probably not an internal error anymore :) +TODO: Check this + printf ("Internal error, unable to create PyBlock for script link\n"); + */ + Py_INCREF(Py_False); + PyDict_SetItemString(g_blenderdict, "bylink", Py_False); + return NULL; + } + else + { + Py_INCREF(Py_True); + PyDict_SetItemString(g_blenderdict, "bylink", Py_True); + } + + PyDict_SetItemString(g_blenderdict, "link", link); + PyDict_SetItemString(g_blenderdict, "event", + Py_BuildValue("s", event_to_name(event))); + + return (scriptlink); +} diff --git a/source/blender/python/api2_2x/EXPP_interface.h b/source/blender/python/api2_2x/EXPP_interface.h new file mode 100644 index 00000000000..e61e6c2d2dc --- /dev/null +++ b/source/blender/python/api2_2x/EXPP_interface.h @@ -0,0 +1,35 @@ +/* + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * This is a new part of Blender. + * + * Contributor(s): Michel Selten + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** +*/ + +#include + +void initBlenderApi2_2x (void); +ScriptLink * setScriptLinks(ID *id, short event); diff --git a/source/blender/python/api2_2x/Image.c b/source/blender/python/api2_2x/Image.c index 4d8ae7480c2..03e9557c6e9 100644 --- a/source/blender/python/api2_2x/Image.c +++ b/source/blender/python/api2_2x/Image.c @@ -39,8 +39,8 @@ static PyObject *M_Image_New(PyObject *self, PyObject *args, PyObject *keywords) { printf ("In Image_New() - unimplemented in 2.25\n"); - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } /*****************************************************************************/ @@ -51,14 +51,12 @@ static PyObject *M_Image_Get(PyObject *self, PyObject *args) { char *name; Image *img_iter; - C_Image *wanted_img; + C_Image *wanted_img; printf ("In Image_Get()\n"); if (!PyArg_ParseTuple(args, "s", &name)) - { - return (PythonReturnErrorObject (PyExc_AttributeError, + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected string argument")); - } /* Use the name to search for the image requested. */ wanted_img = NULL; @@ -66,10 +64,12 @@ static PyObject *M_Image_Get(PyObject *self, PyObject *args) while ((img_iter) && (wanted_img == NULL)) { - if (strcmp (name, GetIdName (&(img_iter->id))) == 0) - wanted_img = (C_Image *)ImageCreatePyObject(img_iter); + if (strcmp (name, img_iter->id.name+2) == 0) { + wanted_img = (C_Image *)PyObject_NEW(C_Image, &Image_Type); + if (wanted_img) wanted_img->image = img_iter; + } - img_iter = img_iter->id.next; + img_iter = img_iter->id.next; } if (wanted_img == NULL) { @@ -77,34 +77,38 @@ static PyObject *M_Image_Get(PyObject *self, PyObject *args) char error_msg[64]; PyOS_snprintf(error_msg, sizeof(error_msg), "Image \"%s\" not found", name); - return (PythonReturnErrorObject (PyExc_NameError, error_msg)); + return (EXPP_ReturnPyObjError (PyExc_NameError, error_msg)); } - return ((PyObject*)wanted_img); + return (PyObject*)wanted_img; } static PyObject *M_Image_Load(PyObject *self, PyObject *args) { - char *fname; - Image *img_ptr; - C_Image *img; + char *fname; + Image *img_ptr; + C_Image *img; printf ("In Image_Load()\n"); - + if (!PyArg_ParseTuple(args, "s", &fname)) - { - return (PythonReturnErrorObject (PyExc_AttributeError, + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected string argument")); - } - - img_ptr = add_image(fname); - if (!img_ptr) - return (PythonReturnErrorObject (PyExc_IOError, - "couldn't load image")); + + img = (C_Image *)PyObject_NEW(C_Image, &Image_Type); - img = (C_Image *)ImageCreatePyObject(img_ptr); + if (!img) + return (EXPP_ReturnPyObjError (PyExc_MemoryError, + "couldn't create PyObject Image_Type")); - return (PyObject *)img; + img_ptr = add_image(fname); + if (!img_ptr) + return (EXPP_ReturnPyObjError (PyExc_IOError, + "couldn't load image")); + + img->image = img_ptr; + + return (PyObject *)img; } /*****************************************************************************/ @@ -126,186 +130,75 @@ PyObject *M_Image_Init (void) /*****************************************************************************/ static PyObject *Image_getName(C_Image *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "name"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't get Image.name attribute")); + PyObject *attr = PyString_FromString(self->image->id.name+2); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, + "couldn't get Image.name attribute")); } static PyObject *Image_getFilename(C_Image *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "filename"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't get Image.filename attribute")); + PyObject *attr = PyString_FromString(self->image->name); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, + "couldn't get Image.filename attribute")); } static PyObject *Image_rename(C_Image *self, PyObject *args) { - char *name_str; - char buf[21]; - ID *tmp_id; - PyObject *name; + char *name; + char buf[21]; - if (!PyArg_ParseTuple(args, "s", &name_str)) - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected string argument")); - - PyOS_snprintf(buf, sizeof(buf), "%s", name_str); - - /* update the Blender Image, too */ - tmp_id = &self->image->id; - rename_id(tmp_id, buf); - PyOS_snprintf(buf, sizeof(buf), "%s", tmp_id->name+2);/* may have changed */ + if (!PyArg_ParseTuple(args, "s", &name)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected string argument")); + + PyOS_snprintf(buf, sizeof(buf), "%s", name); + + rename_id(&self->image->id, buf); - name = PyString_FromString(buf); - - if (!name) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyString Object")); - - if (PyDict_SetItemString(self->dict, "name", name) != 0) { - Py_DECREF(name); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Image.name attribute")); - } - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Image_setXRep(C_Image *self, PyObject *args) { - short value; - PyObject *rep; + short value; - if (!PyArg_ParseTuple(args, "h", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument in [1,16]")); + if (!PyArg_ParseTuple(args, "h", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument in [1,16]")); - if (value >= EXPP_IMAGE_REP_MIN || value <= EXPP_IMAGE_REP_MAX) - rep = PyInt_FromLong(value); - else - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument in [1,16]")); + if (value >= EXPP_IMAGE_REP_MIN || value <= EXPP_IMAGE_REP_MAX) + self->image->xrep = value; + else + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument in [1,16]")); - if (!rep) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyInt Object")); - - if (PyDict_SetItemString(self->dict, "xrep", rep) != 0) { - Py_DECREF(rep); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "could not set Image.xrep attribute")); - } - - /* update the Blender Image, too */ - self->image->xrep = value; - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Image_setYRep(C_Image *self, PyObject *args) { - short value; - PyObject *rep; + short value; - if (!PyArg_ParseTuple(args, "h", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument in [1,16]")); + if (!PyArg_ParseTuple(args, "h", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument in [1,16]")); - if (value >= EXPP_IMAGE_REP_MIN || value <= EXPP_IMAGE_REP_MAX) - rep = PyInt_FromLong(value); - else - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument in [1,16]")); + if (value >= EXPP_IMAGE_REP_MIN || value <= EXPP_IMAGE_REP_MAX) + self->image->yrep = value; + else + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument in [1,16]")); - if (!rep) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyInt Object")); - - if (PyDict_SetItemString(self->dict, "yrep", rep) != 0) { - Py_DECREF(rep); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "could not set Image.yrep attribute")); - } - - /* update the Blender Image, too */ - self->image->yrep = value; - - Py_INCREF(Py_None); - return Py_None; -} - -/*****************************************************************************/ -/* Function: ImageCreatePyObject */ -/* Description: This function will create a new C_Image. If the Image */ -/* struct passed to it is not NULL, it'll use its attributes. */ -/*****************************************************************************/ -PyObject *ImageCreatePyObject (Image *blenderImage) -{ - PyObject *name, *filename, *xrep, *yrep; - C_Image *img; - - printf ("In ImageCreatePyObject\n"); - - img = (C_Image *)PyObject_NEW(C_Image, &Image_Type); - - if (img == NULL) - return NULL; - - img->dict = PyDict_New(); - - if (img->dict == NULL) { - Py_DECREF((PyObject *)img); - return NULL; - } - /*branch currently unused*/ - if (blenderImage == NULL) { /* Not linked to an Image Object yet */ - name = PyString_FromString("DATA"); - filename = PyString_FromString(""); - xrep = PyInt_FromLong(EXPP_IMAGE_REP); /* rep default is 1, of course */ - yrep = PyInt_FromLong(EXPP_IMAGE_REP); - } - else { /* Image Object available, get its attributes directly */ - name = PyString_FromString(blenderImage->id.name+2); - filename = PyString_FromString(blenderImage->name); - xrep = PyInt_FromLong(blenderImage->xrep); - yrep = PyInt_FromLong(blenderImage->yrep); - } - - if (name == NULL || filename == NULL || - xrep == NULL || yrep == NULL) - goto fail; - - if ((PyDict_SetItemString(img->dict, "name", name) != 0) || - (PyDict_SetItemString(img->dict, "filename", filename) != 0) || - (PyDict_SetItemString(img->dict, "xrep", xrep) != 0) || - (PyDict_SetItemString(img->dict, "yrep", yrep) != 0) || - (PyDict_SetItemString(img->dict, "__members__", - PyDict_Keys(img->dict)) != 0)) - goto fail; - - img->image = blenderImage; /* it's NULL when creating only image "data" */ - return ((PyObject*)img); - -fail: - Py_XDECREF(name); - Py_XDECREF(filename); - Py_XDECREF(xrep); - Py_XDECREF(yrep); - Py_DECREF(img->dict); - Py_DECREF((PyObject *)img); - return NULL; + Py_INCREF(Py_None); + return Py_None; } /*****************************************************************************/ @@ -315,7 +208,6 @@ fail: /*****************************************************************************/ static void ImageDeAlloc (C_Image *self) { - Py_DECREF(self->dict); PyObject_DEL (self); } @@ -325,18 +217,31 @@ static void ImageDeAlloc (C_Image *self) /* the function that accesses C_Image member variables and */ /* methods. */ /*****************************************************************************/ -static PyObject* ImageGetAttr (C_Image *img, char *name) -{/* first try the attributes dictionary */ - if (img->dict) { - PyObject *v = PyDict_GetItemString(img->dict, name); - if (v) { - Py_INCREF(v); /* was a borrowed ref */ - return v; - } - } +static PyObject* ImageGetAttr (C_Image *self, char *name) +{ + PyObject *attr = Py_None; -/* not an attribute, search the methods table */ - return Py_FindMethod(C_Image_methods, (PyObject *)img, name); + if (strcmp(name, "name") == 0) + attr = PyString_FromString(self->image->id.name+2); + else if (strcmp(name, "filename") == 0) + attr = PyString_FromString(self->image->name); + else if (strcmp(name, "xrep") == 0) + attr = PyInt_FromLong(self->image->xrep); + else if (strcmp(name, "yrep") == 0) + attr = PyInt_FromLong(self->image->yrep); + + else if (strcmp(name, "__members__") == 0) + attr = Py_BuildValue("[s,s,s,s]", + "name", "filename", "xrep", "yrep"); + + if (!attr) + return (EXPP_ReturnPyObjError (PyExc_MemoryError, + "couldn't create PyObject")); + + if (attr != Py_None) return attr; /* attribute found, return its value */ + + /* not an attribute, search the methods table */ + return Py_FindMethod(C_Image_methods, (PyObject *)self, name); } /*****************************************************************************/ @@ -347,48 +252,39 @@ static PyObject* ImageGetAttr (C_Image *img, char *name) /*****************************************************************************/ static int ImageSetAttr (C_Image *self, char *name, PyObject *value) { - PyObject *valtuple; - PyObject *error = NULL; - - if (self->dict == NULL) return -1; + PyObject *valtuple; + PyObject *error = NULL; /* We're playing a trick on the Python API users here. Even if they use * Image.member = val instead of Image.setMember(value), we end up using the * function anyway, since it already has error checking, clamps to the right * interval and updates the Blender Image structure when necessary. */ - valtuple = PyTuple_New(1); /* the set* functions expect a tuple */ + valtuple = Py_BuildValue("(N)", value); /* the set* functions expect a tuple */ - if (!valtuple) - return EXPP_intError(PyExc_MemoryError, - "ImageSetAttr: couldn't create PyTuple"); + if (!valtuple) + return EXPP_ReturnIntError(PyExc_MemoryError, + "ImageSetAttr: couldn't create PyTuple"); - if (PyTuple_SetItem(valtuple, 0, value) != 0) { - Py_DECREF(value); /* PyTuple_SetItem incref's value even when it fails */ - Py_DECREF(valtuple); - return EXPP_intError(PyExc_RuntimeError, - "ImageSetAttr: couldn't fill tuple"); - } - - if (strcmp (name, "name") == 0) + if (strcmp (name, "name") == 0) error = Image_rename (self, valtuple); - else if (strcmp (name, "xrep") == 0) - error = Image_setXRep (self, valtuple); - else if (strcmp (name, "yrep") == 0) - error = Image_setYRep (self, valtuple); - else { /* Error: no such member in the Image Data structure */ - Py_DECREF(value); - Py_DECREF(valtuple); - return (EXPP_intError (PyExc_KeyError, - "attribute not found or immutable")); - } + else if (strcmp (name, "xrep") == 0) + error = Image_setXRep (self, valtuple); + else if (strcmp (name, "yrep") == 0) + error = Image_setYRep (self, valtuple); + else { /* Error: no such member in the Image Data structure */ + Py_DECREF(value); + Py_DECREF(valtuple); + return (EXPP_ReturnIntError (PyExc_KeyError, + "attribute not found or immutable")); + } - if (error == Py_None) return 0; /* normal exit */ + Py_DECREF(valtuple); - Py_DECREF(value); - Py_DECREF(valtuple); + if (error != Py_None) return -1; - return -1; + Py_DECREF(Py_None); /* incref'ed by the called set* function */ + return 0; /* normal exit */ } /*****************************************************************************/ @@ -398,12 +294,7 @@ static int ImageSetAttr (C_Image *self, char *name, PyObject *value) /*****************************************************************************/ static int ImagePrint(C_Image *self, FILE *fp, int flags) { - char *name; - - name = PyString_AsString(Image_getName(self)); - - fprintf(fp, "[Image \"%s\"]", name); - + fprintf(fp, "[Image \"%s\"]", self->image->id.name+2); return 0; } @@ -414,12 +305,5 @@ static int ImagePrint(C_Image *self, FILE *fp, int flags) /*****************************************************************************/ static PyObject *ImageRepr (C_Image *self) { - char buf[64]; - char *name; - - name = PyString_AsString(Image_getName(self)); - - PyOS_snprintf(buf, sizeof(buf), "[Image \"%s\"]", name); - - return PyString_FromString(buf); + return PyString_FromString(self->image->id.name+2); } diff --git a/source/blender/python/api2_2x/Image.h b/source/blender/python/api2_2x/Image.h index e783a324796..c92a0f00b0a 100644 --- a/source/blender/python/api2_2x/Image.h +++ b/source/blender/python/api2_2x/Image.h @@ -55,7 +55,7 @@ /* Python API function prototypes for the Image module. */ /*****************************************************************************/ static PyObject *M_Image_New (PyObject *self, PyObject *args, - PyObject *keywords); + PyObject *keywords); static PyObject *M_Image_Get (PyObject *self, PyObject *args); static PyObject *M_Image_Load (PyObject *self, PyObject *args); @@ -96,8 +96,7 @@ struct PyMethodDef M_Image_methods[] = { /*****************************************************************************/ typedef struct { PyObject_HEAD - PyObject *dict; - Image *image; + Image *image; } C_Image; /*****************************************************************************/ @@ -115,15 +114,15 @@ static PyObject *Image_setYRep(C_Image *self, PyObject *args); static PyMethodDef C_Image_methods[] = { /* name, method, flags, doc */ {"getName", (PyCFunction)Image_getName, METH_NOARGS, - "() - Return Image Data name"}, + "() - Return Image Data name"}, {"getFilename", (PyCFunction)Image_getFilename, METH_VARARGS, - "() - Return Image Data filename"}, + "() - Return Image Data filename"}, {"rename", (PyCFunction)Image_rename, METH_VARARGS, - "(str) - Change Image Data name"}, + "(str) - Change Image Data name"}, {"setXRep", (PyCFunction)Image_setXRep, METH_VARARGS, - "(int) - Change Image Data x repetition value"}, + "(int) - Change Image Data x repetition value"}, {"setYRep", (PyCFunction)Image_setYRep, METH_VARARGS, - "(int) - Change Image Data y repetition value"}, + "(int) - Change Image Data y repetition value"}, {0} }; diff --git a/source/blender/python/api2_2x/Lamp.c b/source/blender/python/api2_2x/Lamp.c index 7247b411ef1..142323bb994 100644 --- a/source/blender/python/api2_2x/Lamp.c +++ b/source/blender/python/api2_2x/Lamp.c @@ -38,59 +38,52 @@ static PyObject *M_Lamp_New(PyObject *self, PyObject *args, PyObject *keywords) { char *type_str = "Lamp"; - char *name_str = "Data"; + char *name_str = "LampData"; static char *kwlist[] = {"type_str", "name_str", NULL}; - C_Lamp *lamp; - PyObject *type, *name; - int type_int; - char buf[21]; + C_Lamp *py_lamp; /* for Lamp Data object wrapper in Python */ + Lamp *bl_lamp; /* for actual Lamp Data we create in Blender */ + char buf[21]; printf ("In Lamp_New()\n"); if (!PyArg_ParseTupleAndKeywords(args, keywords, "|ss", kwlist, - &type_str, &name_str)) - return (PythonReturnErrorObject (PyExc_AttributeError, + &type_str, &name_str)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected string(s) or empty argument")); - if (!strcmp (type_str, "Lamp")) - type_int = EXPP_LAMP_TYPE_LAMP; - else if (!strcmp (type_str, "Sun")) - type_int = EXPP_LAMP_TYPE_SUN; - else if (!strcmp (type_str, "Spot")) - type_int = EXPP_LAMP_TYPE_SPOT; - else if (!strcmp (type_str, "Hemi")) - type_int = EXPP_LAMP_TYPE_HEMI; - else - return (PythonReturnErrorObject (PyExc_AttributeError, + bl_lamp = add_lamp(); /* first create in Blender */ + if (bl_lamp) /* now create the wrapper obj in Python */ + py_lamp = (C_Lamp *)PyObject_NEW(C_Lamp, &Lamp_Type); + else + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, + "couldn't create Lamp Data in Blender")); + + if (py_lamp == NULL) + return (EXPP_ReturnPyObjError (PyExc_MemoryError, + "couldn't create Lamp Data object")); + + py_lamp->lamp = bl_lamp; /* link Python lamp wrapper with Blender Lamp */ + + if (strcmp (type_str, "Lamp") == 0) + bl_lamp->type = (short)EXPP_LAMP_TYPE_LAMP; + else if (strcmp (type_str, "Sun") == 0) + bl_lamp->type = (short)EXPP_LAMP_TYPE_SUN; + else if (strcmp (type_str, "Spot") == 0) + bl_lamp->type = (short)EXPP_LAMP_TYPE_SPOT; + else if (strcmp (type_str, "Hemi") == 0) + bl_lamp->type = (short)EXPP_LAMP_TYPE_HEMI; + else + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "unknown lamp type")); - lamp = (C_Lamp *)LampCreatePyObject(NULL); + if (strcmp(name_str, "LampData") == 0) + return (PyObject *)py_lamp; + else { /* user gave us a name for the lamp, use it */ + PyOS_snprintf(buf, sizeof(buf), "%s", name_str); + rename_id(&bl_lamp->id, buf); + } - if (lamp == NULL) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create Lamp Data object")); - - type = PyInt_FromLong(type_int); - if (type) LampSetAttr(lamp, "type", type); - else { - Py_DECREF((PyObject *)lamp); - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create Python string")); - } - - if (strcmp(name_str, "Data") == 0) - return (PyObject *)lamp; - - PyOS_snprintf(buf, sizeof(buf), "%s", name_str); - name = PyString_FromString(buf); - if (name) LampSetAttr(lamp, "name", name); - else { - Py_DECREF((PyObject *)lamp); - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create Python string")); - } - - return (PyObject *)lamp; + return (PyObject *)py_lamp; } /*****************************************************************************/ @@ -99,14 +92,14 @@ static PyObject *M_Lamp_New(PyObject *self, PyObject *args, PyObject *keywords) /*****************************************************************************/ static PyObject *M_Lamp_Get(PyObject *self, PyObject *args) { - char *name; + char *name; Lamp *lamp_iter; - C_Lamp *wanted_lamp; + C_Lamp *wanted_lamp; printf ("In Lamp_Get()\n"); if (!PyArg_ParseTuple(args, "s", &name)) { - return (PythonReturnErrorObject (PyExc_AttributeError, + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected string argument")); } @@ -116,21 +109,22 @@ static PyObject *M_Lamp_Get(PyObject *self, PyObject *args) while ((lamp_iter) && (wanted_lamp == NULL)) { - if (strcmp (name, GetIdName (&(lamp_iter->id))) == 0) - wanted_lamp = (C_Lamp *)LampCreatePyObject(lamp_iter); + if (strcmp (name, lamp_iter->id.name+2) == 0) { + wanted_lamp = (C_Lamp *)PyObject_NEW(C_Lamp, &Lamp_Type); + if (wanted_lamp) wanted_lamp->lamp = lamp_iter; + } - lamp_iter = lamp_iter->id.next; + lamp_iter = lamp_iter->id.next; } - if (wanted_lamp == NULL) { - /* No lamp exists with the name specified in the argument name. */ + if (wanted_lamp == NULL) {/* Requested Lamp doesn't exist */ char error_msg[64]; PyOS_snprintf(error_msg, sizeof(error_msg), "Lamp \"%s\" not found", name); - return (PythonReturnErrorObject (PyExc_NameError, error_msg)); + return (EXPP_ReturnPyObjError (PyExc_NameError, error_msg)); } - wanted_lamp->linked = 1; /* TRUE: linked to a Blender Lamp Object */ - return ((PyObject*)wanted_lamp); + + return (PyObject*)wanted_lamp; } /*****************************************************************************/ @@ -152,256 +146,213 @@ PyObject *M_Lamp_Init (void) /*****************************************************************************/ static PyObject *Lamp_getName(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "name"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't get Lamp.name attribute")); + PyObject *attr = PyString_FromString(self->lamp->id.name+2); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, + "couldn't get Lamp.name attribute")); } static PyObject *Lamp_getType(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "type"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyInt_FromLong(self->lamp->type); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.type attribute")); } static PyObject *Lamp_getMode(C_Lamp *self) -{/* XXX improve this, add the constants to the Lamp dict */ - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "mode"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, +{ + PyObject *attr = PyInt_FromLong(self->lamp->mode); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.mode attribute")); } static PyObject *Lamp_getSamples(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "samples"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyInt_FromLong(self->lamp->samp); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.samples attribute")); } static PyObject *Lamp_getBufferSize(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "bufferSize"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyInt_FromLong(self->lamp->bufsize); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.bufferSize attribute")); } static PyObject *Lamp_getHaloStep(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "haloStep"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyInt_FromLong(self->lamp->shadhalostep); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.haloStep attribute")); } static PyObject *Lamp_getEnergy(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "energy"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyFloat_FromDouble(self->lamp->energy); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.energy attribute")); } static PyObject *Lamp_getDist(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "dist"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyFloat_FromDouble(self->lamp->dist); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.dist attribute")); } static PyObject *Lamp_getSpotSize(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "spotSize"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyFloat_FromDouble(self->lamp->spotsize); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.spotSize attribute")); } static PyObject *Lamp_getSpotBlend(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "spotBlend"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyFloat_FromDouble(self->lamp->spotblend); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.spotBlend attribute")); } static PyObject *Lamp_getClipStart(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "clipStart"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyFloat_FromDouble(self->lamp->clipsta); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.clipStart attribute")); } static PyObject *Lamp_getClipEnd(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "clipEnd"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyFloat_FromDouble(self->lamp->clipend); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.clipEnd attribute")); } static PyObject *Lamp_getBias(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "bias"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyFloat_FromDouble(self->lamp->bias); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.bias attribute")); } static PyObject *Lamp_getSoftness(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "softness"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyFloat_FromDouble(self->lamp->soft); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.softness attribute")); } static PyObject *Lamp_getHaloInt(C_Lamp *self) { - PyObject *attr; - attr = PyDict_GetItemString(self->dict, "haloInt"); - if (attr) { - Py_INCREF(attr); - return attr; - } - return (PythonReturnErrorObject (PyExc_RuntimeError, + PyObject *attr = PyFloat_FromDouble(self->lamp->haint); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, "couldn't get Lamp.haloInt attribute")); } - + +static PyObject *Lamp_getQuad1(C_Lamp *self) +{ /* should we complain if Lamp is not of type Quad? */ + PyObject *attr = PyFloat_FromDouble(self->lamp->att1); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, + "couldn't get Lamp.quad1 attribute")); +} + +static PyObject *Lamp_getQuad2(C_Lamp *self) +{ /* should we complain if Lamp is not of type Quad? */ + PyObject *attr = PyFloat_FromDouble(self->lamp->att2); + + if (attr) return attr; + + return (EXPP_ReturnPyObjError (PyExc_RuntimeError, + "couldn't get Lamp.quad2 attribute")); +} + static PyObject *Lamp_rename(C_Lamp *self, PyObject *args) { - char *name_str; - char buf[21]; - PyObject *name; + char *name; + char buf[21]; - if (!PyArg_ParseTuple(args, "s", &name_str)) - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected string argument")); - - PyOS_snprintf(buf, sizeof(buf), "%s", name_str); - - if (self->linked) { /* update the Blender Lamp, too */ - ID *tmp_id = &self->lamp->id; - rename_id(tmp_id, buf); - PyOS_snprintf(buf, sizeof(buf), "%s", tmp_id->name+2);/* may have changed */ - } + if (!PyArg_ParseTuple(args, "s", &name)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected string argument")); + + PyOS_snprintf(buf, sizeof(buf), "%s", name); - name = PyString_FromString(buf); + rename_id(&self->lamp->id, buf); - if (!name) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyString Object")); - - if (PyDict_SetItemString(self->dict, "name", name) != 0) { - Py_DECREF(name); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Lamp.name attribute")); - } - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setType(C_Lamp *self, PyObject *args) { - short value; - char *type_str; - PyObject *type; + char *type; - if (!PyArg_ParseTuple(args, "s", &type_str)) - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected one string argument")); + if (!PyArg_ParseTuple(args, "s", &type)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected string argument")); - if (strcmp (type_str, "Lamp") == 0) - value = EXPP_LAMP_TYPE_LAMP; - else if (strcmp (type_str, "Sun") == 0) - value = EXPP_LAMP_TYPE_SUN; - else if (strcmp (type_str, "Spot") == 0) - value = EXPP_LAMP_TYPE_SPOT; - else if (strcmp (type_str, "Hemi") == 0) - value = EXPP_LAMP_TYPE_HEMI; + if (strcmp (type, "Lamp") == 0) + self->lamp->type = (short)EXPP_LAMP_TYPE_LAMP; + else if (strcmp (type, "Sun") == 0) + self->lamp->type = (short)EXPP_LAMP_TYPE_SUN; + else if (strcmp (type, "Spot") == 0) + self->lamp->type = (short)EXPP_LAMP_TYPE_SPOT; + else if (strcmp (type, "Hemi") == 0) + self->lamp->type = (short)EXPP_LAMP_TYPE_HEMI; else - return (PythonReturnErrorObject (PyExc_AttributeError, + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "unknown lamp type")); - type = PyInt_FromLong(value); - if (!type) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyInt Object")); - - if (PyDict_SetItemString(self->dict, "type", type) != 0) { - Py_DECREF(type); - return (PythonReturnErrorObject (PyExc_AttributeError, - "couldn't set Lamp.type attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ - self->lamp->type = value; - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } /* This one is 'private'. It is not really a method, just a helper function for @@ -411,720 +362,332 @@ static PyObject *Lamp_setType(C_Lamp *self, PyObject *args) * argument, this function should receive an int (0 or 1). */ static PyObject *Lamp_setIntType(C_Lamp *self, PyObject *args) { - short value; - PyObject *type; + short value; - if (!PyArg_ParseTuple(args, "h", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument in [0,3]")); + if (!PyArg_ParseTuple(args, "h", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument in [0,3]")); - if (value >= 0 && value <= 3) - type = PyInt_FromLong(value); - else - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument in [0,3]")); - - if (!type) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyInt Object")); - - if (PyDict_SetItemString(self->dict, "type", type) != 0) { - Py_DECREF(type); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "could not set Lamp.type attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ + if (value >= 0 && value <= 3) self->lamp->type = value; + else + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument in [0,3]")); - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setMode(C_Lamp *self, PyObject *args) {/* Quad, Sphere, Shadows, Halo, Layer, Negative, OnlyShadow, Square */ - char *m[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; - short i, flag = 0; - PyObject *mode; + char *m[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + short i, flag = 0; - if (!PyArg_ParseTuple(args, "|ssssssss", &m[0], &m[1], &m[2], - &m[3], &m[4], &m[5], &m[6], &m[7])) - return (PythonReturnErrorObject (PyExc_AttributeError, + if (!PyArg_ParseTuple(args, "|ssssssss", &m[0], &m[1], &m[2], + &m[3], &m[4], &m[5], &m[6], &m[7])) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected string argument(s)")); - for (i = 0; i < 8; i++) { - if (m[i] == NULL) break; - if (strcmp(m[i], "Shadows") == 0) - flag |= EXPP_LAMP_MODE_SHADOWS; - else if (strcmp(m[i], "Halo") == 0) - flag |= EXPP_LAMP_MODE_HALO; - else if (strcmp(m[i], "Layer") == 0) - flag |= EXPP_LAMP_MODE_LAYER; - else if (strcmp(m[i], "Quad") == 0) - flag |= EXPP_LAMP_MODE_QUAD; - else if (strcmp(m[i], "Negative") == 0) - flag |= EXPP_LAMP_MODE_NEGATIVE; - else if (strcmp(m[i], "OnlyShadow") == 0) - flag |= EXPP_LAMP_MODE_ONLYSHADOW; - else if (strcmp(m[i], "Sphere") == 0) - flag |= EXPP_LAMP_MODE_SPHERE; - else if (strcmp(m[i], "Square") == 0) - flag |= EXPP_LAMP_MODE_SQUARE; - else - return (PythonReturnErrorObject (PyExc_AttributeError, - "unknown lamp flag argument")); - } + for (i = 0; i < 8; i++) { + if (m[i] == NULL) break; + if (strcmp(m[i], "Shadows") == 0) + flag |= (short)EXPP_LAMP_MODE_SHADOWS; + else if (strcmp(m[i], "Halo") == 0) + flag |= (short)EXPP_LAMP_MODE_HALO; + else if (strcmp(m[i], "Layer") == 0) + flag |= (short)EXPP_LAMP_MODE_LAYER; + else if (strcmp(m[i], "Quad") == 0) + flag |= (short)EXPP_LAMP_MODE_QUAD; + else if (strcmp(m[i], "Negative") == 0) + flag |= (short)EXPP_LAMP_MODE_NEGATIVE; + else if (strcmp(m[i], "OnlyShadow") == 0) + flag |= (short)EXPP_LAMP_MODE_ONLYSHADOW; + else if (strcmp(m[i], "Sphere") == 0) + flag |= (short)EXPP_LAMP_MODE_SPHERE; + else if (strcmp(m[i], "Square") == 0) + flag |= (short)EXPP_LAMP_MODE_SQUARE; + else + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "unknown lamp flag argument")); + } - mode = PyInt_FromLong(flag); - if (!mode) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyInt Object")); - - if (PyDict_SetItemString(self->dict, "mode", mode) != 0) { - Py_DECREF(mode); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Lamp.mode attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ - self->lamp->mode = flag; + self->lamp->mode = flag; - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } /* Another helper function, for the same reason. * (See comment before Lamp_setIntType above). */ static PyObject *Lamp_setIntMode(C_Lamp *self, PyObject *args) { - short value; - PyObject *mode; + short value; - if (!PyArg_ParseTuple(args, "h", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument")); + if (!PyArg_ParseTuple(args, "h", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument")); /* well, with so many flag bits, we just accept any short int, no checking */ - mode = PyInt_FromLong(value); + self->lamp->mode = value; - if (!mode) - return (PythonReturnErrorObject (PyExc_AttributeError, - "couldn't create PyInt object")); - - if (PyDict_SetItemString(self->dict, "mode", mode) != 0) { - Py_DECREF(mode); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "could not set Lamp.mode attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ - self->lamp->mode = value; - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setSamples(C_Lamp *self, PyObject *args) { - short value; - PyObject *samples; + short value; - if (!PyArg_ParseTuple(args, "h", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument in [1,16]")); + if (!PyArg_ParseTuple(args, "h", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument in [1,16]")); - if (value >= EXPP_LAMP_SAMPLES_MIN && - value <= EXPP_LAMP_SAMPLES_MAX) - samples = PyInt_FromLong(value); - else - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument in [1,16]")); - - if (!samples) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyInt Object")); - - if (PyDict_SetItemString(self->dict, "samples", samples) != 0) { - Py_DECREF(samples); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "could not set Lamp.samples attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ + if (value >= EXPP_LAMP_SAMPLES_MIN && + value <= EXPP_LAMP_SAMPLES_MAX) self->lamp->samp = value; + else + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument in [1,16]")); - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setBufferSize(C_Lamp *self, PyObject *args) { - short value; - PyObject *bufferSize; + short value; - if (!PyArg_ParseTuple(args, "h", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument, any of [512, 768, 1024, 1536, 2560]")); + if (!PyArg_ParseTuple(args, "h", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument, any of [512, 768, 1024, 1536, 2560]")); - switch (value) { - case 512: - case 768: - case 1024: - case 1536: - case 2560: - bufferSize = PyInt_FromLong(value); - break; - default: - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument, any of [512, 768, 1024, 1536, 2560]")); - } + switch (value) { + case 512: + case 768: + case 1024: + case 1536: + case 2560: + self->lamp->bufsize = value; + break; + default: + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument, any of [512, 768, 1024, 1536, 2560]")); + } - if (!bufferSize) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyInt Object")); - - if (PyDict_SetItemString(self->dict, "bufferSize", bufferSize) != 0) { - Py_DECREF(bufferSize); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "could not set Lamp.bufferSize attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ - self->lamp->bufsize = value; - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setHaloStep(C_Lamp *self, PyObject *args) { - short value; - PyObject *haloStep; + short value; - if (!PyArg_ParseTuple(args, "h", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, + if (!PyArg_ParseTuple(args, "h", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected int argument in [0,12]")); - if (value >= EXPP_LAMP_HALOSTEP_MIN && - value <= EXPP_LAMP_HALOSTEP_MAX) - haloStep = PyInt_FromLong(value); - else - return (PythonReturnErrorObject (PyExc_AttributeError, - "expected int argument in [0,12]")); - - if (!haloStep) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyInt Object")); - - if (PyDict_SetItemString(self->dict, "haloStep", haloStep) != 0) { - Py_DECREF(haloStep); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Lamp.haloStep attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ + if (value >= EXPP_LAMP_HALOSTEP_MIN && + value <= EXPP_LAMP_HALOSTEP_MAX) self->lamp->shadhalostep = value; - - Py_INCREF(Py_None); - return Py_None; + else + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument in [0,12]")); + + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setColorComponent(C_Lamp *self, char *key, PyObject *args) { - float value; - PyObject *component; - - if (!PyArg_ParseTuple(args, "f", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, + float value; + + if (!PyArg_ParseTuple(args, "f", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected float argument in [0.0, 1.0]")); - value = EXPP_ClampFloat (value, 0.0, 1.0); - component = PyFloat_FromDouble(value); + value = EXPP_ClampFloat (value, 0.0, 1.0); + + if (!strcmp(key, "R")) + self->lamp->r = value; + else if (!strcmp(key, "G")) + self->lamp->g = value; + else if (!strcmp(key, "B")) + self->lamp->b = value; - if (!component) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); - - if (PyDict_SetItemString(self->dict, key, component) != 0) { - Py_DECREF(component); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Lamp color component attribute")); - } - - if (self->linked) { /* update the Blender Lamp, too */ - if (!strcmp(key, "R")) - self->lamp->r = value; - else if (!strcmp(key, "G")) - self->lamp->g = value; - else if (!strcmp(key, "B")) - self->lamp->b = value; - } - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setEnergy(C_Lamp *self, PyObject *args) { - float value; - PyObject *energy; - - if (!PyArg_ParseTuple(args, "f", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, + float value; + + if (!PyArg_ParseTuple(args, "f", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected float argument")); - value = EXPP_ClampFloat (value, EXPP_LAMP_ENERGY_MIN, EXPP_LAMP_ENERGY_MAX); - energy = PyFloat_FromDouble(value); + value = EXPP_ClampFloat (value, EXPP_LAMP_ENERGY_MIN, EXPP_LAMP_ENERGY_MAX); + self->lamp->energy = value; - if (!energy) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); - - if (PyDict_SetItemString(self->dict, "energy", energy) != 0) { - Py_DECREF(energy); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Lamp.energy attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ - self->lamp->energy = value; - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setDist(C_Lamp *self, PyObject *args) { - float value; - PyObject *dist; - - if (!PyArg_ParseTuple(args, "f", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, + float value; + + if (!PyArg_ParseTuple(args, "f", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected float argument")); - value = EXPP_ClampFloat (value, EXPP_LAMP_DIST_MIN, EXPP_LAMP_DIST_MAX); - dist = PyFloat_FromDouble(value); - - if (!dist) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); + value = EXPP_ClampFloat (value, EXPP_LAMP_DIST_MIN, EXPP_LAMP_DIST_MAX); + self->lamp->dist = value; - if (PyDict_SetItemString(self->dict, "dist", dist) != 0) { - Py_DECREF(dist); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Lamp.dist attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ - self->lamp->dist = value; - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setSpotSize(C_Lamp *self, PyObject *args) { - float value; - PyObject *spotSize; - - if (!PyArg_ParseTuple(args, "f", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, + float value; + + if (!PyArg_ParseTuple(args, "f", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected float argument")); - value = EXPP_ClampFloat (value, EXPP_LAMP_SPOTSIZE_MIN, EXPP_LAMP_SPOTSIZE_MAX); - spotSize = PyFloat_FromDouble(value); - - if (!spotSize) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); + value = EXPP_ClampFloat (value, EXPP_LAMP_SPOTSIZE_MIN, EXPP_LAMP_SPOTSIZE_MAX); + self->lamp->spotsize = value; - if (PyDict_SetItemString(self->dict, "spotSize", spotSize) != 0) { - Py_DECREF(spotSize); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Lamp.spotSize attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ - self->lamp->spotsize = value; - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setSpotBlend(C_Lamp *self, PyObject *args) { - float value; - PyObject *spotBlend; - - if (!PyArg_ParseTuple(args, "f", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, + float value; + + if (!PyArg_ParseTuple(args, "f", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected float argument")); - value = EXPP_ClampFloat (value, EXPP_LAMP_SPOTBLEND_MIN, - EXPP_LAMP_SPOTBLEND_MAX); - spotBlend = PyFloat_FromDouble(value); - - if (!spotBlend) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); + value = EXPP_ClampFloat (value, EXPP_LAMP_SPOTBLEND_MIN, + EXPP_LAMP_SPOTBLEND_MAX); + self->lamp->spotblend = value; - if (PyDict_SetItemString(self->dict, "spotBlend", spotBlend) != 0) { - Py_DECREF(spotBlend); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Lamp.spotBlend attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ - self->lamp->spotblend = value; - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setClipStart(C_Lamp *self, PyObject *args) { - float value; - PyObject *clipStart; - - if (!PyArg_ParseTuple(args, "f", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, + float value; + + if (!PyArg_ParseTuple(args, "f", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected a float number as argument")); - - value = EXPP_ClampFloat (value, EXPP_LAMP_CLIPSTART_MIN, - EXPP_LAMP_CLIPSTART_MAX); - - clipStart = PyFloat_FromDouble(value); - - if (!clipStart) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); + + value = EXPP_ClampFloat (value, EXPP_LAMP_CLIPSTART_MIN, + EXPP_LAMP_CLIPSTART_MAX); + self->lamp->clipsta = value; - if (PyDict_SetItemString(self->dict, "clipStart", clipStart) != 0) { - Py_DECREF(clipStart); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Lamp.clipStart attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ - self->lamp->clipsta = value; - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setClipEnd(C_Lamp *self, PyObject *args) { - float value; - PyObject *clipEnd; - - if (!PyArg_ParseTuple(args, "f", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, + float value; + + if (!PyArg_ParseTuple(args, "f", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected a float number as argument")); value = EXPP_ClampFloat (value, EXPP_LAMP_CLIPEND_MIN, - EXPP_LAMP_CLIPEND_MAX); + EXPP_LAMP_CLIPEND_MAX); + self->lamp->clipend = value; - clipEnd = PyFloat_FromDouble(value); - - if (!clipEnd) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); - - if (PyDict_SetItemString(self->dict, "clipEnd", clipEnd) != 0) { - Py_DECREF(clipEnd); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Lamp.clipEnd attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ - self->lamp->clipend = value; - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setBias(C_Lamp *self, PyObject *args) { - float value; - PyObject *bias; - - if (!PyArg_ParseTuple(args, "f", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, + float value; + + if (!PyArg_ParseTuple(args, "f", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected a float number as argument")); value = EXPP_ClampFloat (value, EXPP_LAMP_BIAS_MIN, EXPP_LAMP_BIAS_MAX); + self->lamp->bias = value; - bias = PyFloat_FromDouble(value); - - if (!bias) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); - - if (PyDict_SetItemString(self->dict, "bias", bias) != 0) { - Py_DECREF(bias); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Lamp.bias attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ - self->lamp->bias = value; - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setSoftness(C_Lamp *self, PyObject *args) { - float value; - PyObject *softness; - - if (!PyArg_ParseTuple(args, "f", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, + float value; + + if (!PyArg_ParseTuple(args, "f", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected a float number as argument")); value = EXPP_ClampFloat (value, EXPP_LAMP_SOFTNESS_MIN, - EXPP_LAMP_SOFTNESS_MAX); + EXPP_LAMP_SOFTNESS_MAX); + self->lamp->soft = value; - softness = PyFloat_FromDouble(value); - - if (!softness) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); - - if (PyDict_SetItemString(self->dict, "softness", softness) != 0) { - Py_DECREF(softness); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Lamp.softness attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ - self->lamp->soft = value; - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } static PyObject *Lamp_setHaloInt(C_Lamp *self, PyObject *args) { - float value; - PyObject *haloInt; - - if (!PyArg_ParseTuple(args, "f", &value)) - return (PythonReturnErrorObject (PyExc_AttributeError, + float value; + + if (!PyArg_ParseTuple(args, "f", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, "expected a float number as argument")); value = EXPP_ClampFloat (value, EXPP_LAMP_HALOINT_MIN, - EXPP_LAMP_HALOINT_MAX); + EXPP_LAMP_HALOINT_MAX); + self->lamp->haint = value; - haloInt = PyFloat_FromDouble(value); - - if (!haloInt) - return (PythonReturnErrorObject (PyExc_MemoryError, - "couldn't create PyFloat Object")); - - if (PyDict_SetItemString(self->dict, "haloInt", haloInt) != 0) { - Py_DECREF(haloInt); - return (PythonReturnErrorObject (PyExc_RuntimeError, - "couldn't set Lamp.haloInt attribute")); - } - - if (self->linked) /* update the Blender Lamp, too */ - self->lamp->haint = value; - - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } -/*****************************************************************************/ -/* Function: LampCreatePyObject */ -/* Description: This function will create a new C_Lamp. If the Lamp */ -/* struct passed to it is not NULL, it'll use its attributes. */ -/*****************************************************************************/ -PyObject *LampCreatePyObject (Lamp *blenderLamp) +static PyObject *Lamp_setQuad1(C_Lamp *self, PyObject *args) { - PyObject *name, *type, *mode, *R, *G, *B, *energy, *dist; - PyObject *spotSize, *spotBlend, *clipStart, *clipEnd; - PyObject *bias, *softness, *samples, *bufferSize; - PyObject *haloInt, *haloStep; - PyObject *Types, *Lamp, *Sun, *Spot, *Hemi; - PyObject *Modes, *Shadows, *Halo, *Layer, *Quad; - PyObject *Negative, *OnlyShadow, *Sphere, *Square; - C_Lamp *lamp; + float value; - printf ("In LampCreatePyObject\n"); + if (!PyArg_ParseTuple(args, "f", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected a float number as argument")); - lamp = (C_Lamp *)PyObject_NEW(C_Lamp, &Lamp_Type); - - if (lamp == NULL) - return NULL; + value = EXPP_ClampFloat (value, EXPP_LAMP_QUAD1_MIN, + EXPP_LAMP_QUAD1_MAX); + self->lamp->att1 = value; - lamp->linked = 0; - lamp->dict = PyDict_New(); + Py_INCREF(Py_None); + return Py_None; +} - if (lamp->dict == NULL) { - Py_DECREF((PyObject *)lamp); - return NULL; - } +static PyObject *Lamp_setQuad2(C_Lamp *self, PyObject *args) +{ + float value; - if (blenderLamp == NULL) { /* Not linked to a Lamp Object yet */ - name = PyString_FromString("Data"); - type = PyInt_FromLong(EXPP_LAMP_TYPE); - mode = PyInt_FromLong(EXPP_LAMP_MODE); - samples = PyInt_FromLong(EXPP_LAMP_SAMPLES); - bufferSize = PyInt_FromLong(EXPP_LAMP_BUFFERSIZE); - haloStep = PyInt_FromLong(EXPP_LAMP_HALOSTEP); - R = PyFloat_FromDouble(1.0); - G = PyFloat_FromDouble(1.0); - B = PyFloat_FromDouble(1.0); - energy = PyFloat_FromDouble(EXPP_LAMP_ENERGY); - dist = PyFloat_FromDouble(EXPP_LAMP_DIST); - spotSize = PyFloat_FromDouble(EXPP_LAMP_SPOTSIZE); - spotBlend = PyFloat_FromDouble(EXPP_LAMP_SPOTBLEND); - clipStart = PyFloat_FromDouble(EXPP_LAMP_CLIPSTART); - clipEnd = PyFloat_FromDouble(EXPP_LAMP_CLIPEND); - bias = PyFloat_FromDouble(EXPP_LAMP_BIAS); - softness = PyFloat_FromDouble(EXPP_LAMP_SOFTNESS); - haloInt = PyFloat_FromDouble(EXPP_LAMP_HALOINT); - } - else { /* Lamp Object available, get its attributes directly */ - name = PyString_FromString(blenderLamp->id.name+2); - type = PyInt_FromLong(blenderLamp->type); - mode = PyInt_FromLong(blenderLamp->mode); - samples = PyInt_FromLong(blenderLamp->samp); - bufferSize = PyInt_FromLong(blenderLamp->bufsize); - haloStep = PyInt_FromLong(blenderLamp->shadhalostep); - R = PyFloat_FromDouble(blenderLamp->r); - G = PyFloat_FromDouble(blenderLamp->g); - B = PyFloat_FromDouble(blenderLamp->b); - energy = PyFloat_FromDouble(blenderLamp->energy); - dist = PyFloat_FromDouble(blenderLamp->dist); - spotSize = PyFloat_FromDouble(blenderLamp->spotsize); - spotBlend = PyFloat_FromDouble(blenderLamp->spotblend); - clipStart = PyFloat_FromDouble(blenderLamp->clipsta); - clipEnd = PyFloat_FromDouble(blenderLamp->clipend); - bias = PyFloat_FromDouble(blenderLamp->bias); - softness = PyFloat_FromDouble(blenderLamp->soft); - haloInt = PyFloat_FromDouble(blenderLamp->haint); - /*there's shadspotsize, too ... plus others, none in 2.25*/ - } + if (!PyArg_ParseTuple(args, "f", &value)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected a float number as argument")); - Types = constant_New(); - Lamp = PyInt_FromLong(EXPP_LAMP_TYPE_LAMP); - Sun = PyInt_FromLong(EXPP_LAMP_TYPE_SUN); - Spot = PyInt_FromLong(EXPP_LAMP_TYPE_SPOT); - Hemi = PyInt_FromLong(EXPP_LAMP_TYPE_HEMI); - - Modes = constant_New(); - Shadows = PyInt_FromLong(EXPP_LAMP_MODE_SHADOWS); - Halo = PyInt_FromLong(EXPP_LAMP_MODE_HALO); - Layer = PyInt_FromLong(EXPP_LAMP_MODE_LAYER); - Quad = PyInt_FromLong(EXPP_LAMP_MODE_QUAD); - Negative = PyInt_FromLong(EXPP_LAMP_MODE_NEGATIVE); - OnlyShadow = PyInt_FromLong(EXPP_LAMP_MODE_ONLYSHADOW); - Sphere = PyInt_FromLong(EXPP_LAMP_MODE_SPHERE); - Square = PyInt_FromLong(EXPP_LAMP_MODE_SQUARE); + value = EXPP_ClampFloat (value, EXPP_LAMP_QUAD2_MIN, + EXPP_LAMP_QUAD2_MAX); + self->lamp->att2 = value; - if (name == NULL || type == NULL || mode == NULL || - samples == NULL || bufferSize == NULL || haloStep == NULL || - R == NULL || G == NULL || B == NULL || energy == NULL || - dist == NULL || spotSize == NULL || spotBlend == NULL || - clipStart == NULL || clipEnd == NULL || bias == NULL || - softness == NULL || haloInt == NULL || Types == NULL || - Lamp == NULL || Sun == NULL || Spot == NULL || Hemi == NULL || - Modes == NULL || Shadows == NULL || Halo == NULL || - Layer == NULL || Quad == NULL || Negative == NULL || - OnlyShadow == NULL || Sphere == NULL || Square == NULL) /* ack! */ - goto fail; - - if ((PyDict_SetItemString(lamp->dict, "name", name) != 0) || - (PyDict_SetItemString(lamp->dict, "type", type) != 0) || - (PyDict_SetItemString(lamp->dict, "mode", mode) != 0) || - (PyDict_SetItemString(lamp->dict, "samples", samples) != 0) || - (PyDict_SetItemString(lamp->dict, "bufferSize", bufferSize) != 0) || - (PyDict_SetItemString(lamp->dict, "R", R) != 0) || - (PyDict_SetItemString(lamp->dict, "G", G) != 0) || - (PyDict_SetItemString(lamp->dict, "B", B) != 0) || - (PyDict_SetItemString(lamp->dict, "energy", energy) != 0) || - (PyDict_SetItemString(lamp->dict, "dist", dist) != 0) || - (PyDict_SetItemString(lamp->dict, "spotSize", spotSize) != 0) || - (PyDict_SetItemString(lamp->dict, "spotBlend", spotBlend) != 0) || - (PyDict_SetItemString(lamp->dict, "clipStart", clipStart) != 0) || - (PyDict_SetItemString(lamp->dict, "clipEnd", clipEnd) != 0) || - (PyDict_SetItemString(lamp->dict, "bias", bias) != 0) || - (PyDict_SetItemString(lamp->dict, "softness", softness) != 0) || - (PyDict_SetItemString(lamp->dict, "haloInt", haloInt) != 0) || - (PyDict_SetItemString(lamp->dict, "haloStep", haloStep) != 0) || - (PyDict_SetItemString(lamp->dict, "Types", Types) != 0) || - (PyDict_SetItemString(lamp->dict, "Modes", Modes) != 0) || - (PyDict_SetItemString(lamp->dict, "__members__", - PyDict_Keys(lamp->dict)) != 0)) - goto fail; - - if ((PyDict_SetItemString(((C_constant *)Types)->dict, - "Lamp", Lamp) != 0) || - (PyDict_SetItemString(((C_constant *)Types)->dict, - "Sun", Sun) != 0) || - (PyDict_SetItemString(((C_constant *)Types)->dict, - "Spot", Spot) != 0) || - (PyDict_SetItemString(((C_constant *)Types)->dict, - "Hemi", Hemi) != 0) || - (PyDict_SetItemString(((C_constant *)Modes)->dict, - "Shadows", Shadows) != 0) || - (PyDict_SetItemString(((C_constant *)Modes)->dict, - "Halo", Halo) != 0) || - (PyDict_SetItemString(((C_constant *)Modes)->dict, - "Layer", Layer) != 0) || - (PyDict_SetItemString(((C_constant *)Modes)->dict, - "Quad", Quad) != 0) || - (PyDict_SetItemString(((C_constant *)Modes)->dict, - "Negative", Negative) != 0) || - (PyDict_SetItemString(((C_constant *)Modes)->dict, - "OnlyShadow", OnlyShadow) != 0) || - (PyDict_SetItemString(((C_constant *)Modes)->dict, - "Sphere", Sphere) != 0) || - (PyDict_SetItemString(((C_constant *)Modes)->dict, - "Square", Square) != 0)) - goto fail; - - lamp->lamp = blenderLamp; /* it's NULL when creating only lamp "data" */ - return ((PyObject*)lamp); - -fail: - Py_XDECREF(name); - Py_XDECREF(type); - Py_XDECREF(mode); - Py_XDECREF(samples); - Py_XDECREF(bufferSize); - Py_XDECREF(R); - Py_XDECREF(G); - Py_XDECREF(B); - Py_XDECREF(energy); - Py_XDECREF(dist); - Py_XDECREF(spotSize); - Py_XDECREF(spotBlend); - Py_XDECREF(clipStart); - Py_XDECREF(clipEnd); - Py_XDECREF(bias); - Py_XDECREF(softness); - Py_XDECREF(haloInt); - Py_XDECREF(haloStep); - Py_XDECREF(Types); - Py_XDECREF(Lamp); - Py_XDECREF(Sun); - Py_XDECREF(Spot); - Py_XDECREF(Hemi); - Py_XDECREF(Modes); - Py_XDECREF(Shadows); - Py_XDECREF(Halo); - Py_XDECREF(Layer); - Py_XDECREF(Quad); - Py_XDECREF(Negative); - Py_XDECREF(OnlyShadow); - Py_XDECREF(Sphere); - Py_XDECREF(Square); - Py_DECREF(lamp->dict); - Py_DECREF((PyObject *)lamp); - return NULL; + Py_INCREF(Py_None); + return Py_None; } /*****************************************************************************/ @@ -1134,7 +697,6 @@ fail: /*****************************************************************************/ static void LampDeAlloc (C_Lamp *self) { - Py_DECREF(self->dict); PyObject_DEL (self); } @@ -1144,17 +706,89 @@ static void LampDeAlloc (C_Lamp *self) /* the function that accesses C_Lamp member variables and */ /* methods. */ /*****************************************************************************/ -static PyObject* LampGetAttr (C_Lamp *lamp, char *name) -{/* first try the attributes dictionary */ - if (lamp->dict) { - PyObject *v = PyDict_GetItemString(lamp->dict, name); - if (v) { - Py_INCREF(v); /* was a borrowed ref */ - return v; - } - } -/* not an attribute, search the methods table */ - return Py_FindMethod(C_Lamp_methods, (PyObject *)lamp, name); +static PyObject* LampGetAttr (C_Lamp *self, char *name) +{ + PyObject *attr = Py_None; + + if (strcmp(name, "name") == 0) + attr = PyString_FromString(self->lamp->id.name+2); + else if (strcmp(name, "type") == 0) + attr = PyInt_FromLong(self->lamp->type); + else if (strcmp(name, "mode") == 0) + attr = PyInt_FromLong(self->lamp->mode); + else if (strcmp(name, "samples") == 0) + attr = PyInt_FromLong(self->lamp->samp); + else if (strcmp(name, "bufferSize") == 0) + attr = PyInt_FromLong(self->lamp->bufsize); + else if (strcmp(name, "haloStep") == 0) + attr = PyInt_FromLong(self->lamp->shadhalostep); + else if (strcmp(name, "R") == 0) + attr = PyFloat_FromDouble(self->lamp->r); + else if (strcmp(name, "G") == 0) + attr = PyFloat_FromDouble(self->lamp->g); + else if (strcmp(name, "B") == 0) + attr = PyFloat_FromDouble(self->lamp->b); + else if (strcmp(name, "energy") == 0) + attr = PyFloat_FromDouble(self->lamp->energy); + else if (strcmp(name, "dist") == 0) + attr = PyFloat_FromDouble(self->lamp->dist); + else if (strcmp(name, "spotSize") == 0) + attr = PyFloat_FromDouble(self->lamp->spotsize); + else if (strcmp(name, "spotBlend") == 0) + attr = PyFloat_FromDouble(self->lamp->spotblend); + else if (strcmp(name, "clipStart") == 0) + attr = PyFloat_FromDouble(self->lamp->clipsta); + else if (strcmp(name, "clipEnd") == 0) + attr = PyFloat_FromDouble(self->lamp->clipend); + else if (strcmp(name, "bias") == 0) + attr = PyFloat_FromDouble(self->lamp->bias); + else if (strcmp(name, "softness") == 0) + attr = PyFloat_FromDouble(self->lamp->soft); + else if (strcmp(name, "haloInt") == 0) + attr = PyFloat_FromDouble(self->lamp->haint); + else if (strcmp(name, "quad1") == 0) + attr = PyFloat_FromDouble(self->lamp->att1); + else if (strcmp(name, "quad2") == 0) + attr = PyFloat_FromDouble(self->lamp->att2); + + else if (strcmp(name, "Types") == 0) { + attr = Py_BuildValue("{s:h,s:h,s:h,s:h}", + "Lamp", EXPP_LAMP_TYPE_LAMP, + "Sun" , EXPP_LAMP_TYPE_SUN, + "Spot", EXPP_LAMP_TYPE_SPOT, + "Hemi", EXPP_LAMP_TYPE_HEMI); + } + + else if (strcmp(name, "Modes") == 0) { + attr = Py_BuildValue("{s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h}", + "Shadows", EXPP_LAMP_MODE_SHADOWS, + "Halo", EXPP_LAMP_MODE_HALO, + "Layer", EXPP_LAMP_MODE_LAYER, + "Quad", EXPP_LAMP_MODE_QUAD, + "Negative", EXPP_LAMP_MODE_NEGATIVE, + "OnlyShadow", EXPP_LAMP_MODE_ONLYSHADOW, + "Sphere", EXPP_LAMP_MODE_SPHERE, + "Square", EXPP_LAMP_MODE_SQUARE); + } + + else if (strcmp(name, "__members__") == 0) { + /* 22 entries */ + attr = Py_BuildValue("[s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s]", + "name", "type", "mode", "samples", "bufferSize", + "haloStep", "R", "G", "B", "energy", "dist", + "spotSize", "spotBlend", "clipStart", "clipEnd", + "bias", "softness", "haloInt", "quad1", "quad2", + "Types", "Modes"); + } + + if (!attr) + return (EXPP_ReturnPyObjError (PyExc_MemoryError, + "couldn't create PyObject")); + + if (attr != Py_None) return attr; /* member attribute found, return it */ + + /* not an attribute, search the methods table */ + return Py_FindMethod(C_Lamp_methods, (PyObject *)self, name); } /*****************************************************************************/ @@ -1165,78 +799,75 @@ static PyObject* LampGetAttr (C_Lamp *lamp, char *name) /*****************************************************************************/ static int LampSetAttr (C_Lamp *self, char *name, PyObject *value) { - PyObject *valtuple; - PyObject *error = NULL; + PyObject *valtuple; + PyObject *error = NULL; - if (self->dict == NULL) return -1; + valtuple = Py_BuildValue("(N)", value); /* the set* functions expect a tuple */ -/* We're playing a trick on the Python API users here. Even if they use - * Lamp.member = val instead of Lamp.setMember(value), we end up using the - * function anyway, since it already has error checking, clamps to the right - * interval and updates the Blender Lamp structure when necessary. */ + if (!valtuple) + return EXPP_ReturnIntError(PyExc_MemoryError, + "LampSetAttr: couldn't create tuple"); - valtuple = PyTuple_New(1); /* the set* functions expect a tuple */ - - if (!valtuple) - return EXPP_intError(PyExc_MemoryError, - "LampSetAttr: couldn't create tuple"); - - if (PyTuple_SetItem(valtuple, 0, value) != 0) { - Py_DECREF(value); /* PyTuple_SetItem incref's value even when it fails */ - Py_DECREF(valtuple); - return EXPP_intError(PyExc_MemoryError, - "LampSetAttr: couldn't fill tuple"); - } - - if (strcmp (name, "name") == 0) + if (strcmp (name, "name") == 0) error = Lamp_rename (self, valtuple); - else if (strcmp (name, "type") == 0) + else if (strcmp (name, "type") == 0) error = Lamp_setIntType (self, valtuple); /* special case */ - else if (strcmp (name, "mode") == 0) + else if (strcmp (name, "mode") == 0) error = Lamp_setIntMode (self, valtuple); /* special case */ - else if (strcmp (name, "samples") == 0) + else if (strcmp (name, "samples") == 0) error = Lamp_setSamples (self, valtuple); - else if (strcmp (name, "bufferSize") == 0) + else if (strcmp (name, "bufferSize") == 0) error = Lamp_setBufferSize (self, valtuple); - else if (strcmp (name, "haloStep") == 0) + else if (strcmp (name, "haloStep") == 0) error = Lamp_setHaloStep (self, valtuple); - else if (strcmp (name, "R") == 0) + else if (strcmp (name, "R") == 0) error = Lamp_setColorComponent (self, "R", valtuple); - else if (strcmp (name, "G") == 0) + else if (strcmp (name, "G") == 0) error = Lamp_setColorComponent (self, "G", valtuple); - else if (strcmp (name, "B") == 0) + else if (strcmp (name, "B") == 0) error = Lamp_setColorComponent (self, "B", valtuple); - else if (strcmp (name, "energy") == 0) + else if (strcmp (name, "energy") == 0) error = Lamp_setEnergy (self, valtuple); - else if (strcmp (name, "dist") == 0) + else if (strcmp (name, "dist") == 0) error = Lamp_setDist (self, valtuple); - else if (strcmp (name, "spotSize") == 0) + else if (strcmp (name, "spotSize") == 0) error = Lamp_setSpotSize (self, valtuple); - else if (strcmp (name, "spotBlend") == 0) + else if (strcmp (name, "spotBlend") == 0) error = Lamp_setSpotBlend (self, valtuple); - else if (strcmp (name, "clipStart") == 0) + else if (strcmp (name, "clipStart") == 0) error = Lamp_setClipStart (self, valtuple); - else if (strcmp (name, "clipEnd") == 0) + else if (strcmp (name, "clipEnd") == 0) error = Lamp_setClipEnd (self, valtuple); - else if (strcmp (name, "bias") == 0) + else if (strcmp (name, "bias") == 0) error = Lamp_setBias (self, valtuple); - else if (strcmp (name, "softness") == 0) + else if (strcmp (name, "softness") == 0) error = Lamp_setSoftness (self, valtuple); - else if (strcmp (name, "haloInt") == 0) + else if (strcmp (name, "haloInt") == 0) error = Lamp_setHaloInt (self, valtuple); - else { /* Error: no such member in the Lamp Data structure */ - Py_DECREF(value); - Py_DECREF(valtuple); - return (EXPP_intError (PyExc_AttributeError, - "attribute not found")); - } + else if (strcmp (name, "quad1") == 0) + error = Lamp_setQuad1 (self, valtuple); + else if (strcmp (name, "quad2") == 0) + error = Lamp_setQuad2 (self, valtuple); + + else { /* Error */ + Py_DECREF(valtuple); + + if ((strcmp (name, "Types") == 0) || /* user tried to change a */ + (strcmp (name, "Modes") == 0)) /* constant dict type ... */ + return (EXPP_ReturnIntError (PyExc_AttributeError, + "constant dictionary -- cannot be changed")); - if (error == Py_None) return 0; /* normal exit */ + else /* ... or no member with the given name was found */ + return (EXPP_ReturnIntError (PyExc_KeyError, + "attribute not found")); + } - Py_DECREF(value); - Py_DECREF(valtuple); + Py_DECREF(valtuple); + + if (error != Py_None) return -1; - return -1; + Py_DECREF(Py_None); /* was incref'ed by the called Lamp_set* function */ + return 0; /* normal exit */ } /*****************************************************************************/ @@ -1246,16 +877,7 @@ static int LampSetAttr (C_Lamp *self, char *name, PyObject *value) /*****************************************************************************/ static int LampPrint(C_Lamp *self, FILE *fp, int flags) { - char *lstate = "unlinked"; - char *name; - - if (self->linked) - lstate = "linked"; - - name = PyString_AsString(Lamp_getName(self)); - - fprintf(fp, "[Lamp \"%s\" (%s)]", name, lstate); - + fprintf(fp, "[Lamp \"%s\"]", self->lamp->id.name+2); return 0; } @@ -1266,16 +888,5 @@ static int LampPrint(C_Lamp *self, FILE *fp, int flags) /*****************************************************************************/ static PyObject *LampRepr (C_Lamp *self) { - char buf[64]; - char *lstate = "unlinked"; - char *name; - - if (self->linked) - lstate = "linked"; - - name = PyString_AsString(Lamp_getName(self)); - - PyOS_snprintf(buf, sizeof(buf), "[Lamp \"%s\" (%s)]", name, lstate); - - return PyString_FromString(buf); + return PyString_FromString(self->lamp->id.name+2); } diff --git a/source/blender/python/api2_2x/Lamp.h b/source/blender/python/api2_2x/Lamp.h index 4139bea5b91..1e5913ece44 100644 --- a/source/blender/python/api2_2x/Lamp.h +++ b/source/blender/python/api2_2x/Lamp.h @@ -109,7 +109,7 @@ #define EXPP_LAMP_HALOSTEP 0 #define EXPP_LAMP_HALOSTEP_MIN 0 #define EXPP_LAMP_HALOSTEP_MAX 12 -#define EXPP_LAMP_QUAD1 0.0 /* Not implemented yet ( and not in 2.25) */ +#define EXPP_LAMP_QUAD1 0.0 #define EXPP_LAMP_QUAD1_MIN 0.0 #define EXPP_LAMP_QUAD1_MAX 1.0 #define EXPP_LAMP_QUAD2 1.0 @@ -162,9 +162,7 @@ struct PyMethodDef M_Lamp_methods[] = { /*****************************************************************************/ typedef struct { PyObject_HEAD - PyObject *dict; - Lamp *lamp; - int linked; + Lamp *lamp; } C_Lamp; /*****************************************************************************/ @@ -185,6 +183,8 @@ static PyObject *Lamp_getClipEnd(C_Lamp *self); static PyObject *Lamp_getBias(C_Lamp *self); static PyObject *Lamp_getSoftness(C_Lamp *self); static PyObject *Lamp_getHaloInt(C_Lamp *self); +static PyObject *Lamp_getQuad1(C_Lamp *self); +static PyObject *Lamp_getQuad2(C_Lamp *self); static PyObject *Lamp_rename(C_Lamp *self, PyObject *args); static PyObject *Lamp_setType(C_Lamp *self, PyObject *args); static PyObject *Lamp_setIntType(C_Lamp *self, PyObject *args); @@ -202,8 +202,10 @@ static PyObject *Lamp_setClipEnd(C_Lamp *self, PyObject *args); static PyObject *Lamp_setBias(C_Lamp *self, PyObject *args); static PyObject *Lamp_setSoftness(C_Lamp *self, PyObject *args); static PyObject *Lamp_setHaloInt(C_Lamp *self, PyObject *args); +static PyObject *Lamp_setQuad1(C_Lamp *self, PyObject *args); +static PyObject *Lamp_setQuad2(C_Lamp *self, PyObject *args); static PyObject *Lamp_setColorComponent(C_Lamp *self, char *key, - PyObject *args); + PyObject *args); /*****************************************************************************/ /* Python C_Lamp methods table: */ @@ -211,64 +213,72 @@ static PyObject *Lamp_setColorComponent(C_Lamp *self, char *key, static PyMethodDef C_Lamp_methods[] = { /* name, method, flags, doc */ {"getName", (PyCFunction)Lamp_getName, METH_NOARGS, - "() - return Lamp name"}, + "() - return Lamp name"}, {"getType", (PyCFunction)Lamp_getType, METH_NOARGS, - "() - return Lamp type -\n\t\ + "() - return Lamp type -\n\t\ 'Lamp':0, 'Sun':1, 'Spot':2, 'Hemi':3"}, {"getMode", (PyCFunction)Lamp_getMode, METH_NOARGS, - "() - return Lamp mode flags (or'ed value)"}, + "() - return Lamp mode flags (or'ed value)"}, {"getSamples", (PyCFunction)Lamp_getSamples, METH_NOARGS, - "() - return Lamp samples value"}, + "() - return Lamp samples value"}, {"getBufferSize", (PyCFunction)Lamp_getBufferSize, METH_NOARGS, - "() - return Lamp buffer size value"}, + "() - return Lamp buffer size value"}, {"getHaloStep", (PyCFunction)Lamp_getHaloStep, METH_NOARGS, - "() - return Lamp halo step value"}, + "() - return Lamp halo step value"}, {"getEnergy", (PyCFunction)Lamp_getEnergy, METH_NOARGS, - "() - return Lamp energy value"}, + "() - return Lamp energy value"}, {"getDist", (PyCFunction)Lamp_getDist, METH_NOARGS, - "() - return Lamp clipping distance value"}, + "() - return Lamp clipping distance value"}, {"getSpotSize", (PyCFunction)Lamp_getSpotSize, METH_NOARGS, - "() - return Lamp spot size value"}, + "() - return Lamp spot size value"}, {"getSpotBlend", (PyCFunction)Lamp_getSpotBlend, METH_NOARGS, - "() - return Lamp spot blend value"}, + "() - return Lamp spot blend value"}, {"getClipStart", (PyCFunction)Lamp_getClipStart, METH_NOARGS, - "() - return Lamp clip start value"}, + "() - return Lamp clip start value"}, {"getClipEnd", (PyCFunction)Lamp_getClipEnd, METH_NOARGS, - "() - return Lamp clip end value"}, + "() - return Lamp clip end value"}, {"getBias", (PyCFunction)Lamp_getBias, METH_NOARGS, - "() - return Lamp bias value"}, + "() - return Lamp bias value"}, {"getSoftness", (PyCFunction)Lamp_getSoftness, METH_NOARGS, - "() - return Lamp softness value"}, + "() - return Lamp softness value"}, {"getHaloInt", (PyCFunction)Lamp_getHaloInt, METH_NOARGS, - "() - return Lamp halo intensity value"}, + "() - return Lamp halo intensity value"}, + {"getQuad1", (PyCFunction)Lamp_getQuad1, METH_NOARGS, + "() - return light intensity value #1 for a Quad Lamp"}, + {"getQuad2", (PyCFunction)Lamp_getQuad2, METH_NOARGS, + "() - return light intensity value #2 for a Quad Lamp"}, {"rename", (PyCFunction)Lamp_rename, METH_VARARGS, - "(str) - rename Lamp"}, + "(str) - rename Lamp"}, {"setType", (PyCFunction)Lamp_setType, METH_VARARGS, - "(str) - change Lamp type, which can be 'persp' or 'ortho'"}, + "(str) - change Lamp type, which can be 'persp' or 'ortho'"}, {"setMode", (PyCFunction)Lamp_setMode, METH_VARARGS, - "([up to eight str's]) - Set Lamp mode flag(s)"}, + "([up to eight str's]) - Set Lamp mode flag(s)"}, {"setSamples", (PyCFunction)Lamp_setSamples, METH_VARARGS, - "(int) - change Lamp samples value"}, + "(int) - change Lamp samples value"}, {"setBufferSize", (PyCFunction)Lamp_setBufferSize, METH_VARARGS, - "(int) - change Lamp buffer size value"}, + "(int) - change Lamp buffer size value"}, {"setHaloStep", (PyCFunction)Lamp_setHaloStep, METH_VARARGS, - "(int) - change Lamp halo step value"}, + "(int) - change Lamp halo step value"}, {"setEnergy", (PyCFunction)Lamp_setEnergy, METH_VARARGS, - "(float) - change Lamp energy value"}, + "(float) - change Lamp energy value"}, {"setSpotSize", (PyCFunction)Lamp_setSpotSize, METH_VARARGS, - "(float) - change Lamp spot size value"}, + "(float) - change Lamp spot size value"}, {"setSpotBlend", (PyCFunction)Lamp_setHaloStep, METH_VARARGS, - "(float) - change Lamp spot blend value"}, + "(float) - change Lamp spot blend value"}, {"setClipStart", (PyCFunction)Lamp_setClipStart, METH_VARARGS, - "(float) - change Lamp clip start value"}, + "(float) - change Lamp clip start value"}, {"setClipEnd", (PyCFunction)Lamp_setClipEnd, METH_VARARGS, - "(float) - change Lamp clip end value"}, + "(float) - change Lamp clip end value"}, {"setBias", (PyCFunction)Lamp_setBias, METH_VARARGS, - "(float) - change Lamp draw size value"}, + "(float) - change Lamp draw size value"}, {"setSoftness", (PyCFunction)Lamp_setSoftness, METH_VARARGS, - "(float) - change Lamp softness value"}, + "(float) - change Lamp softness value"}, {"setHaloInt", (PyCFunction)Lamp_setHaloInt, METH_VARARGS, - "(float) - change Lamp halo intensity value"}, + "(float) - change Lamp halo intensity value"}, + {"setQuad1", (PyCFunction)Lamp_setQuad1, METH_VARARGS, + "(float) - change light intensity value #1 for a Quad Lamp"}, + {"setQuad2", (PyCFunction)Lamp_setQuad2, METH_VARARGS, + "(float) - change light intensity value #2 for a Quad Lamp"}, {0} }; diff --git a/source/blender/python/api2_2x/Window.c b/source/blender/python/api2_2x/Window.c new file mode 100644 index 00000000000..66374a3f992 --- /dev/null +++ b/source/blender/python/api2_2x/Window.c @@ -0,0 +1,200 @@ +/* + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * This is a new part of Blender. + * + * Contributor(s): Willian P. Germano + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** +*/ + +#include "Window.h" + +/* Many parts of the code here come from the older bpython implementation + * (file opy_window.c) */ + +/*****************************************************************************/ +/* Function: M_Window_Redraw */ +/* Python equivalent: Blender.Window.Redraw */ +/*****************************************************************************/ +PyObject *M_Window_Redraw(PyObject *self, PyObject *args) +{ /* not static so py_slider_update in Draw.[ch] can use it */ + ScrArea *tempsa, *sa; + SpaceText *st; + int wintype = SPACE_VIEW3D; + short redraw_all = 0; + + if (!PyArg_ParseTuple(args, "|i", &wintype)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected int argument (or nothing)")); + + if (wintype < 0) + redraw_all = 1; + + if (!during_script()) { /* XXX check this */ + tempsa= curarea; + sa = G.curscreen->areabase.first; + + while (sa) { + + if (sa->spacetype == wintype || redraw_all) { + /* don't force-redraw Text window (Python GUI) when + redraw is called out of a slider update */ + if (sa->spacetype == SPACE_TEXT) { + st = sa->spacedata.first; + if (st->text->flags & TXT_FOLLOW) /* follow cursor display */ + pop_space_text(st); + if (/*disable_force_draw*/0) { /* XXX Blender.Draw ... */ + scrarea_queue_redraw(sa); + } + + + } else { + scrarea_do_windraw(sa); + if (sa->headwin) scrarea_do_headdraw(sa); + } + } + + sa= sa->next; + } + + if (curarea != tempsa) areawinset (tempsa->win); + + if (curarea->headwin) scrarea_do_headdraw (curarea); + + screen_swapbuffers(); + } + + Py_INCREF(Py_None); + return Py_None; +} + +/*****************************************************************************/ +/* Function: M_Window_RedrawAll */ +/* Python equivalent: Blender.Window.RedrawAll */ +/*****************************************************************************/ +static PyObject *M_Window_RedrawAll(PyObject *self, PyObject *args) +{ + return M_Window_Redraw(self, Py_BuildValue("(i)", -1)); +} + +/*****************************************************************************/ +/* Function: M_Window_QRedrawAll */ +/* Python equivalent: Blender.Window.QRedrawAll */ +/*****************************************************************************/ +static PyObject *M_Window_QRedrawAll(PyObject *self, PyObject *args) +{ + allqueue(REDRAWALL, 0); + + Py_INCREF(Py_None); + return Py_None; +} + +/*****************************************************************************/ +/* Function: M_Window_FileSelector */ +/* Python equivalent: Blender.Window.FileSelector */ +/*****************************************************************************/ + +/* This is the callback to "activate_fileselect" below. It receives the + * selected filename and (using it as argument) calls the Python callback + * provided by the script writer and stored in EXPP_FS_PyCallback. */ + +static void getSelectedFile(char *name) +{ + if (EXPP_FS_PyCallback) { + PyObject_CallFunction((PyObject *)EXPP_FS_PyCallback, "s", name); + EXPP_FS_PyCallback = NULL; + } +} + +static PyObject *M_Window_FileSelector(PyObject *self, PyObject *args) +{ + char *title = "SELECT FILE"; + if (!PyArg_ParseTuple(args, "O!|s", + &PyFunction_Type, &EXPP_FS_PyCallback, &title)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "\nexpected a callback function (and optionally a string) as argument(s)")); + + activate_fileselect(FILE_BLENDER, title, G.sce, getSelectedFile); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject *M_Window_ImageSelector(PyObject *self, PyObject *args) +{ + char *title = "SELECT IMAGE"; + if (!PyArg_ParseTuple(args, "O!|s", + &PyFunction_Type, &EXPP_FS_PyCallback, &title)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "\nexpected a callback function (and optionally a string) as argument(s)")); + + activate_imageselect(FILE_BLENDER, title, G.sce, getSelectedFile); + + Py_INCREF(Py_None); + return Py_None; +} + +/*****************************************************************************/ +/* Function: M_Window_DrawProgressbar */ +/* Python equivalent: Blender.Window.DrawProgressbar */ +/*****************************************************************************/ +static PyObject *M_Window_DrawProgressbar(PyObject *self, PyObject *args) +{ + float done; + char *info = 0; + int retval; + + if(!PyArg_ParseTuple(args, "fs", &done, &info)) + return (EXPP_ReturnPyObjError (PyExc_AttributeError, + "expected a float and a string as arguments")); + + retval = progress_bar(done, info); + + return Py_BuildValue("i", retval); +} + +/*****************************************************************************/ +/* Function: M_Window_Init */ +/*****************************************************************************/ +PyObject *M_Window_Init (void) +{ + PyObject *submodule, *Types; + + printf ("In M_Window_Init()\n"); + + submodule = Py_InitModule3("Blender.Window", M_Window_methods, M_Window_doc); + + Types = Py_BuildValue("{s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h}", + "VIEW3D", SPACE_VIEW3D, "IPO", SPACE_IPO, "OOPS", SPACE_OOPS, + "BUTS", SPACE_BUTS, "FILE", SPACE_FILE, "IMAGE", SPACE_IMAGE, + "INFO", SPACE_INFO, "SEQ", SPACE_SEQ, "IMASEL", SPACE_IMASEL, + "SOUND", SPACE_SOUND, "ACTION", SPACE_ACTION, + "TEXT", SPACE_TEXT, "NLA", SPACE_NLA); + + if (Types) PyModule_AddObject(submodule, "Types", Types); + + return submodule; +} + diff --git a/source/blender/python/api2_2x/Window.h b/source/blender/python/api2_2x/Window.h new file mode 100644 index 00000000000..2fc649bd2a9 --- /dev/null +++ b/source/blender/python/api2_2x/Window.h @@ -0,0 +1,129 @@ +/* + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * This is a new part of Blender. + * + * Contributor(s): Willian P. Germano + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** +*/ + +#ifndef EXPP_WINDOW_H +#define EXPP_WINDOW_H + +#include +#include + +#include +#include /* for during_script() */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gen_utils.h" +#include "modules.h" + +/* Used in Draw.c */ +int EXPP_disable_force_draw= 0; + +/* Callback used by the file and image selector access functions */ +static PyObject *(*EXPP_FS_PyCallback)(PyObject *arg) = NULL; + +/*****************************************************************************/ +/* Python API function prototypes for the Window module. */ +/*****************************************************************************/ +PyObject *M_Window_Redraw (PyObject *self, PyObject *args); +static PyObject *M_Window_RedrawAll (PyObject *self, PyObject *args); +static PyObject *M_Window_QRedrawAll (PyObject *self, PyObject *args); +static PyObject *M_Window_FileSelector (PyObject *self, PyObject *args); +static PyObject *M_Window_ImageSelector (PyObject *self, PyObject *args); +static PyObject *M_Window_DrawProgressbar (PyObject *self, PyObject *args); + +/*****************************************************************************/ +/* The following string definitions are used for documentation strings. */ +/* In Python these will be written to the console when doing a */ +/* Blender.Window.__doc__ */ +/*****************************************************************************/ +char M_Window_doc[] = +"The Blender Window module\n\n"; + +char M_Window_Redraw_doc[] = +"() - Force a redraw of a specific Window Type (see Window.Types)"; + +char M_Window_RedrawAll_doc[] = +"() - Redraw all windows"; + +char M_Window_QRedrawAll_doc[] = +"() - Redraw all windows by queue event"; + +char M_Window_FileSelector_doc[] = +"(callback [, title]) - Open a file selector window.\n\ +The selected filename is used as argument to a function callback f(name)\n\ +that you must provide. 'title' is optional and defaults to 'SELECT FILE'.\n\n\ +Example:\n\n\ +import Blender\n\n\ +def my_function(filename):\n\ + print 'The selected file was: ', filename\n\n\ +Blender.Window.FileSelector(my_function, 'SAVE FILE')\n"; + +char M_Window_ImageSelector_doc[] = +"(callback [, title]) - Open an image selector window.\n\ +The selected filename is used as argument to a function callback f(name)\n\ +that you must provide. 'title' is optional and defaults to 'SELECT IMAGE'.\n\n\ +Example:\n\n\ +import Blender\n\n\ +def my_function(filename):\n\ + print 'The selected image file was: ', filename\n\n\ +Blender.Window.ImageSelector(my_function, 'LOAD IMAGE')\n"; + +char M_Window_DrawProgressbar_doc[] = +"(done, text) - Draw a progressbar.\n\ +'done' is a float value <= 1.0, 'text' contains info about what is\n\ +currently being done."; + +/*****************************************************************************/ +/* Python method structure definition for Blender.Window module: */ +/*****************************************************************************/ +struct PyMethodDef M_Window_methods[] = { + {"Redraw", M_Window_Redraw, METH_VARARGS, M_Window_Redraw_doc}, + {"RedrawAll", M_Window_RedrawAll, METH_VARARGS, M_Window_RedrawAll_doc}, + {"QRedrawAll", M_Window_QRedrawAll, METH_VARARGS, M_Window_QRedrawAll_doc}, + {"FileSelector", M_Window_FileSelector, METH_VARARGS, M_Window_FileSelector_doc}, + {"ImageSelector", M_Window_ImageSelector, METH_VARARGS, + M_Window_ImageSelector_doc}, + {"DrawProgressbar", M_Window_DrawProgressbar, METH_VARARGS, + M_Window_DrawProgressbar_doc}, + {NULL, NULL, 0, NULL} +}; + +#endif /* EXPP_WINDOW_H */ diff --git a/source/blender/python/api2_2x/gen_utils.c b/source/blender/python/api2_2x/gen_utils.c index a5ccb9cf620..3f6f34c28f6 100644 --- a/source/blender/python/api2_2x/gen_utils.c +++ b/source/blender/python/api2_2x/gen_utils.c @@ -78,7 +78,13 @@ PyObject * PythonReturnErrorObject (PyObject * type, char * error_msg) return (NULL); } -int EXPP_intError (PyObject *type, char *error_msg) +PyObject *EXPP_ReturnPyObjError (PyObject * type, char * error_msg) +{ /* same as above, just to change its name smoothly */ + PyErr_SetString (type, error_msg); + return NULL; +} + +int EXPP_ReturnIntError (PyObject *type, char *error_msg) { PyErr_SetString (type, error_msg); return -1; @@ -86,7 +92,7 @@ int EXPP_intError (PyObject *type, char *error_msg) /*****************************************************************************/ /* Description: This function increments the reference count of the given */ -/* Python object. */ +/* Python object (usually Py_None) and returns it. */ /*****************************************************************************/ PyObject * PythonIncRef (PyObject *object) { @@ -94,6 +100,11 @@ PyObject * PythonIncRef (PyObject *object) return (object); } +PyObject *EXPP_incr_ret (PyObject *object) +{ + Py_INCREF (object); + return (object); +} /*****************************************************************************/ /* Description: This function maps the event identifier to a string. */ /*****************************************************************************/ diff --git a/source/blender/python/api2_2x/gen_utils.h b/source/blender/python/api2_2x/gen_utils.h index c7ce089c07c..803cd64bca1 100644 --- a/source/blender/python/api2_2x/gen_utils.h +++ b/source/blender/python/api2_2x/gen_utils.h @@ -37,9 +37,11 @@ int StringEqual (char * string1, char * string2); char * GetIdName (ID *id); PyObject * PythonReturnErrorObject (PyObject * type, char * error_msg); PyObject * PythonIncRef (PyObject *object); -char * event_to_name(short event); -float EXPP_ClampFloat(float value, float min, float max); -int EXPP_intError(PyObject *type, char *error_msg); +PyObject * EXPP_incr_ret (PyObject *object); +char * event_to_name (short event); +float EXPP_ClampFloat (float value, float min, float max); +int EXPP_ReturnIntError (PyObject *type, char *error_msg); +PyObject *EXPP_ReturnPyObjError (PyObject * type, char * error_msg); /* The following functions may need to be moved to the respective BKE or */ /* DNA modules. */ diff --git a/source/blender/python/api2_2x/modules.h b/source/blender/python/api2_2x/modules.h index 639021ce5b2..20ea92cf2d7 100644 --- a/source/blender/python/api2_2x/modules.h +++ b/source/blender/python/api2_2x/modules.h @@ -41,11 +41,11 @@ extern PyObject *g_blenderdict; void initBlender (void); -PyObject* initObject (void); -PyObject* ObjectCreatePyObject (struct Object *obj); -PyObject* M_Camera_Init (void); -PyObject* CameraCreatePyObject (struct Camera *cam); -PyObject* M_Lamp_Init (void); -PyObject* LampCreatePyObject (struct Lamp *lamp); -PyObject* M_Image_Init (void); -PyObject* ImageCreatePyObject (struct Image *img); +PyObject *initObject (void); +PyObject *ObjectCreatePyObject (struct Object *obj); +PyObject *M_Camera_Init (void); +PyObject *M_Lamp_Init (void); +PyObject *M_Image_Init (void); +PyObject *M_Window_Init (void); +PyObject *M_Draw_Init (void); +PyObject *M_BGL_Init (void);