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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/bpython/intern/BPY_csg.c')
-rw-r--r--source/blender/bpython/intern/BPY_csg.c239
1 files changed, 239 insertions, 0 deletions
diff --git a/source/blender/bpython/intern/BPY_csg.c b/source/blender/bpython/intern/BPY_csg.c
new file mode 100644
index 00000000000..7237a843428
--- /dev/null
+++ b/source/blender/bpython/intern/BPY_csg.c
@@ -0,0 +1,239 @@
+
+/** CSG wrapper module
+ *
+ * ***** 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.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ * $Id$
+ */
+
+// TODO
+
+
+#include "Python.h"
+
+#include "BPY_csg.h"
+
+#include "BKE_booleanops_mesh.h"
+#include "BKE_booleanops.h"
+#include "MEM_guardedalloc.h"
+
+#include "b_interface.h"
+
+#ifdef DEBUG
+ #define CSG_DEBUG(str) \
+ { printf str; }
+#else
+ #define CSG_DEBUG(str) \
+ {}
+#endif
+
+
+///////////////////////////////////////////////////////////////
+// CSG python object struct
+
+
+typedef struct _CSGMesh {
+ PyObject_VAR_HEAD
+ CSG_MeshDescriptor *imesh;
+} PyCSGMesh;
+
+// PROTOS
+
+static PyObject *newPyCSGMesh(CSG_MeshDescriptor *imesh);
+
+static void CSGMesh_dealloc(PyObject *self);
+static PyObject *CSGMesh_getattr(PyObject *self, char *attr);
+
+
+static char CSGMesh_Type_doc[] = "CSG mesh type";
+
+static PyTypeObject PyCSGMesh_Type = {
+ PyObject_HEAD_INIT(NULL)
+ 0, /*ob_size*/
+ "CSGMesh", /*tp_name*/
+ sizeof(PyCSGMesh), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ /* methods */
+ (destructor) CSGMesh_dealloc, /*tp_dealloc*/
+ (printfunc)0, /*tp_print*/
+ (getattrfunc)CSGMesh_getattr, /*tp_getattr*/
+ (setattrfunc)0, /*tp_setattr*/
+ (cmpfunc)0, /*tp_compare*/
+ (reprfunc)0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ (hashfunc)0, /*tp_hash*/
+ (ternaryfunc)0, /*tp_call*/
+ (reprfunc)0, /*tp_str*/
+
+ /* Space for future expansion */
+ 0L,0L,0L,0L,
+ CSGMesh_Type_doc /* Documentation string */
+};
+
+///////////////////////////////////////////////////////////////
+// CSG object methods
+
+
+static PyObject *CSGMesh_add(PyObject *self, PyObject *args)
+{
+ CSG_MeshDescriptor *new_imesh =
+ (CSG_MeshDescriptor *) MEM_mallocN(sizeof(CSG_MeshDescriptor),
+ "CSG_IMesh");
+
+ PyCSGMesh *c2;
+ int success = 0;
+
+ PyCSGMesh *c1 = (PyCSGMesh *) self;
+ if (!PyArg_ParseTuple(args, "O!", &PyCSGMesh_Type, &c2)) return NULL;
+
+ success = CSG_PerformOp(c1->imesh, c2->imesh, 2, new_imesh);
+
+ if (!success) {
+ PyErr_SetString(PyExc_RuntimeError, "Sorry. Didn't work");
+ return NULL; // exception
+ }
+ return newPyCSGMesh(new_imesh);
+}
+
+
+static PyMethodDef CSGMesh_methods[] = {
+ {"union", CSGMesh_add, METH_VARARGS, 0 },
+ // add more methods here
+ {NULL, NULL, 0, NULL}
+};
+
+
+static void CSGMesh_dealloc(PyObject *self)
+{
+ CSG_MeshDescriptor *imesh = ((PyCSGMesh *) self)->imesh;
+ CSG_DEBUG(("object was destroyed\n"));
+ // TODO: delete (free) struct ptr
+ CSG_DestroyMeshDescriptor(imesh);
+ MEM_freeN(imesh);
+ PyMem_DEL(self);
+}
+
+static PyObject *CSGMesh_getattr(PyObject *self, char *attr)
+{
+ return Py_FindMethod(CSGMesh_methods, (PyObject *) self, attr);
+}
+///////////////////////////////////////////////////////////////
+// CSG module methods
+
+static PyObject *newPyCSGMesh(CSG_MeshDescriptor *imesh)
+{
+ PyCSGMesh *c = PyObject_NEW(PyCSGMesh, &PyCSGMesh_Type);
+ CSG_DEBUG(("object was created\n"));
+ c->imesh = imesh;
+ // add init bla here
+ return (PyObject *) c;
+}
+
+static PyObject *CSGmodule_CSGMesh(PyObject *self, PyObject *args)
+{
+ char *name;
+
+ Object *obj;
+ CSG_MeshDescriptor *new_imesh;
+
+ if (!PyArg_ParseTuple(args, "s", &name)) return NULL;
+ new_imesh = (CSG_MeshDescriptor *) MEM_mallocN(
+ sizeof(CSG_MeshDescriptor),
+ "CSG_IMesh");
+
+ // get object by name, return its mesh data
+ // and do the conversion
+ // CSG_LoadBlenderMesh(name, new_imesh);
+
+ obj = (Object *) getFromList(getObjectList(), name);
+
+ if (!obj) {
+ PyErr_SetString(PyExc_AttributeError,
+ "requested Object does not exist");
+ return NULL;
+ }
+
+ if (obj->type != OB_MESH) {
+ PyErr_SetString(PyExc_TypeError, "Mesh object expected");
+ return NULL;
+ }
+
+ if (!CSG_LoadBlenderMesh(obj, new_imesh)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "FATAL: Could not acquire mesh data");
+ return NULL;
+ }
+ return newPyCSGMesh(new_imesh);
+}
+
+static PyObject *CSGmodule_toBlenderMeshObject(PyObject *self,
+ PyObject *args)
+{
+ Object *new_object;
+ PyCSGMesh *pmesh;
+ CSG_MeshDescriptor *c;
+
+ float identity[4][4] = { {1.0, 0.0, 0.0, 0.0},
+ {0.0, 1.0, 0.0, 0.0},
+ {0.0, 0.0, 1.0, 0.0},
+ {0.0, 0.0, 0.0, 1.0}};
+
+
+ if (!PyArg_ParseTuple(args, "O!", &PyCSGMesh_Type, &pmesh)) return NULL;
+ c = pmesh->imesh;
+ new_object = object_new(OB_MESH);
+
+ if (!PyArg_ParseTuple(self, "")) return NULL;
+ // TODO: blender mesh conversion
+ ConvertCSGDescriptorsToMeshObject(new_object, &c->m_descriptor,
+ &c->m_face_iterator,
+ &c->m_vertex_iterator,
+ identity);
+
+ // return resulting object
+ return DataBlock_fromData(new_object);
+}
+
+static PyMethodDef CSGmodule_methods[] = {
+ {"CSGMesh", CSGmodule_CSGMesh , METH_VARARGS, 0 },
+ {"toObject", CSGmodule_toBlenderMeshObject, METH_VARARGS, 0 },
+ {NULL, NULL, 0, NULL}
+};
+
+// MODULE INITIALIZATION
+
+void initcsg()
+{
+ PyObject *mod;
+ PyCSGMesh_Type.ob_type = &PyType_Type;
+ mod = Py_InitModule("csg", CSGmodule_methods);
+
+}
+