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:
authorMichel Selten <michel@mselten.demon.nl>2003-03-25 22:16:13 +0300
committerMichel Selten <michel@mselten.demon.nl>2003-03-25 22:16:13 +0300
commit92d292f8d39a255b3ca2cc57ce7cdf1388f898ed (patch)
tree1da667aebe78114698ec192d13347520bf872dd4
parent7c5d4a12d1f04b0d2e128878f8a2ea9905de02f2 (diff)
* Added the Camera module.
This one has been implemented by Willian (IanWill).
-rw-r--r--source/blender/python/api2_2x/Blender.c1
-rw-r--r--source/blender/python/api2_2x/Camera.c289
-rw-r--r--source/blender/python/api2_2x/modules.h2
3 files changed, 292 insertions, 0 deletions
diff --git a/source/blender/python/api2_2x/Blender.c b/source/blender/python/api2_2x/Blender.c
index d099d9ba3f7..a258e31be2b 100644
--- a/source/blender/python/api2_2x/Blender.c
+++ b/source/blender/python/api2_2x/Blender.c
@@ -241,5 +241,6 @@ void initBlender (void)
dict = PyModule_GetDict (module);
g_blenderdict = dict;
PyDict_SetItemString (dict, "Object", initObject());
+ PyDict_SetItemString (dict, "Camera", initCamera());
}
diff --git a/source/blender/python/api2_2x/Camera.c b/source/blender/python/api2_2x/Camera.c
new file mode 100644
index 00000000000..20d74ea3c18
--- /dev/null
+++ b/source/blender/python/api2_2x/Camera.c
@@ -0,0 +1,289 @@
+/* TODO: 'print dir(CameraObject)' doesn't work, attribs are not recognized;
+ * how to assign methods to objects? PyMethod_New() ? Maybe separate
+ * CameraModule and Camera; found: check Extending ... section 2.2.3
+ * correctly handle references;
+ * Make all functions but module init's static ?
+ * 'print Blender.Camera.__doc__' doesn't work (still gives 'None')*/
+
+#include <Python.h>
+#include <stdio.h>
+
+#include <BKE_main.h>
+#include <BKE_global.h>
+#include <BKE_object.h>
+#include <DNA_camera_types.h>
+
+#include "gen_utils.h"
+#include "modules.h"
+
+/*****************************************************************************/
+/* Python API function prototypes for the Camera module. */
+/******************************************************************************/
+PyObject *Camera_New (PyObject *self, PyObject *args, PyObject *keywords);
+PyObject *Camera_Get (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.Camera.__doc__ */
+/*****************************************************************************/
+char CameraModule_doc[] =
+"The Blender Camera module\n\n\
+This module provides access to **Camera** objects in Blender\n\n\
+Example::\n\n\
+ from Blender import Camera, Object, Scene\n\
+ c = Camera.New('ortho') # create new ortho camera data\n\
+ c.lens = 35.0 # set lens value\n\
+ cur = Scene.getCurrent() # get current Scene\n\
+ ob = Object.New('Camera') # make camera object\n\
+ ob.link(c) # link camera data with this object\n\
+ cur.link(ob) # link object into scene\n\
+ cur.setCurrentCamera(ob) # make this camera the active\n";
+
+char Camera_New_doc[] =
+"(type) - returns a new Camera object of type 'type', \
+which can be 'persp' or 'ortho'.\n\
+() - returns a new Camera object of type 'persp'.";
+
+char Camera_Get_doc[] =
+"(name) - return the camera with the name 'name', \
+returns None if not found.\n If 'name' is not specified, \
+it returns a list of all cameras in the\ncurrent scene.";
+
+/*****************************************************************************/
+/* Python BlenderCamera structure definition. */
+/*****************************************************************************/
+typedef struct {
+ PyObject_HEAD
+ struct Camera *camera;
+} BlenCamera;
+
+/*****************************************************************************/
+/* PythonTypeCamera callback function prototypes */
+/*****************************************************************************/
+void CameraDeAlloc (BlenCamera *cam);
+PyObject* CameraGetAttr (BlenCamera *cam, char *name);
+int CameraSetAttr (BlenCamera *cam, char *name, PyObject *v);
+PyObject* CameraRepr (BlenCamera *cam);
+
+/*****************************************************************************/
+/* Python TypeCamera structure definition. */
+/*****************************************************************************/
+static PyTypeObject camera_type =
+{
+ PyObject_HEAD_INIT(&PyType_Type)
+ 0, /* ob_size */
+ "Camera", /* tp_name */
+ sizeof (BlenCamera), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor)CameraDeAlloc, /* tp_dealloc */
+ 0, /* tp_print */
+ (getattrfunc)CameraGetAttr, /* tp_getattr */
+ (setattrfunc)CameraSetAttr, /* tp_setattr */
+ 0, /* tp_compare */
+ (reprfunc)CameraRepr, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_as_hash */
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ CameraModule_doc, /* tp_doc Isn't working for some reason */
+ 0,
+};
+
+/*****************************************************************************/
+/* Python method structure definition. */
+/*****************************************************************************/
+struct PyMethodDef Camera_methods[] = {
+ {"New",(PyCFunction)Camera_New, METH_VARARGS|METH_KEYWORDS, Camera_New_doc},
+ {"Get", Camera_Get, METH_VARARGS, Camera_Get_doc},
+ {"get", Camera_Get, METH_VARARGS, Camera_Get_doc},
+ {NULL, NULL, 0, NULL}
+};
+
+/*****************************************************************************/
+/* Function: Camera_New */
+/* Python equivalent: Blender.Camera.New */
+/*****************************************************************************/
+PyObject *Camera_New(PyObject *self, PyObject *args, PyObject *keywords)
+{
+ char *type_str = "persp"; /* "persp" is type 0, "ortho" is type 1 */
+ static char *kwlist[] = {"type_str", NULL};
+ Camera * cam;
+ BlenCamera * blen_camera;
+
+ printf ("In Camera_New()\n");
+
+ if (!PyArg_ParseTupleAndKeywords(args, keywords, "|s", kwlist, &type_str))
+ /* We expected a string (or nothing) as an argument, but we didn't get one. */
+ return (PythonReturnErrorObject (PyExc_AttributeError,
+ "expected string (or empty) argument"));
+
+ cam = add_camera();
+ cam->id.us = 0; /* new camera: no user yet */
+
+ if (StringEqual (type_str, "persp"))
+ cam->type = 0;
+ else if (StringEqual (type_str, "ortho"))
+ cam->type = 1;
+ else
+ return (PythonReturnErrorObject (PyExc_AttributeError,
+ "unknown camera type"));
+
+ blen_camera = (BlenCamera*)PyObject_NEW(BlenCamera, &camera_type);
+ blen_camera->camera = cam;
+
+ return ((PyObject*)blen_camera);
+}
+
+/*****************************************************************************/
+/* Function: Camera_Get */
+/* Python equivalent: Blender.Camera.Get */
+/*****************************************************************************/
+PyObject *Camera_Get(PyObject *self, PyObject *args)
+{
+ char * name;
+ struct Camera * cam_iter;
+ BlenCamera * blen_camera;
+
+ printf ("In Camera_Get()\n");
+ if (!PyArg_ParseTuple(args, "s", &name))
+ {
+ return (PythonReturnErrorObject (PyExc_AttributeError,
+ "expected string argument"));
+ }
+
+ /* Use the name to search for the camera requested. */
+ blen_camera = NULL;
+ cam_iter = G.main->camera.first;
+ while ((cam_iter) && (blen_camera == NULL))
+ {
+ if (StringEqual (name, GetIdName (&(cam_iter->id))))
+ {
+ blen_camera = (BlenCamera*)PyObject_NEW(BlenCamera, &camera_type);
+ blen_camera->camera = cam_iter;
+ }
+ cam_iter = cam_iter->id.next;
+ }
+
+ if (blen_camera == NULL)
+ {
+ /* No camera exists with the name specified in the argument name. */
+ char error_msg[256];
+ sprintf(error_msg, "camera \"%s\" not found", name);
+ return (PythonReturnErrorObject (PyExc_AttributeError, error_msg));
+ }
+
+ return ((PyObject*)blen_camera);
+}
+
+/*****************************************************************************/
+/* Function: initCamera */
+/*****************************************************************************/
+PyObject *initCamera (void)
+{
+ PyObject * module;
+
+ printf ("In initCamera()\n");
+
+ module = Py_InitModule("Camera", Camera_methods);
+
+ return (module);
+}
+
+/*****************************************************************************/
+/* Function: CameraCreatePyObject */
+/* Description: This function will create a new BlenCamera from an existing */
+/* Camera structure. */
+/*****************************************************************************/
+PyObject* CameraCreatePyObject (struct Camera *cam)
+{
+ BlenCamera * blen_camera;
+
+ printf ("In CameraCreatePyObject\n");
+
+ blen_camera = (BlenCamera*)PyObject_NEW(BlenCamera, &camera_type);
+
+ blen_camera->camera = cam;
+ return ((PyObject*)blen_camera);
+}
+
+/*****************************************************************************/
+/* Function: CameraDeAlloc */
+/* Description: This is a callback function for the BlenCamera type. It is */
+/* the destructor function. */
+/*****************************************************************************/
+void CameraDeAlloc (BlenCamera *cam)
+{
+ PyObject_DEL (cam);
+}
+
+/*****************************************************************************/
+/* Function: CameraGetAttr */
+/* Description: This is a callback function for the BlenCamera type. It is */
+/* the function that retrieves any value from Blender and */
+/* passes it to Python. */
+/*****************************************************************************/
+PyObject* CameraGetAttr (BlenCamera *cam, char *name)
+{
+ struct Camera * camera;
+
+ camera = cam->camera;
+ if (StringEqual (name, "lens"))
+ return (PyFloat_FromDouble(camera->lens));
+ if (StringEqual (name, "clipStart"))
+ return (PyFloat_FromDouble(camera->clipsta));
+ if (StringEqual (name, "clipEnd"))
+ return (PyFloat_FromDouble(camera->clipend));
+ if (StringEqual (name, "type"))
+ return (PyInt_FromLong(camera->type));
+ if (StringEqual (name, "mode"))
+ return (PyInt_FromLong(camera->flag));
+
+ printf ("Unknown variable.\n");
+ Py_INCREF (Py_None);
+ return (Py_None);
+}
+
+/*****************************************************************************/
+/* Function: CameraSetAttr */
+/* Description: This is a callback function for the BlenCamera type. It is */
+/* the function that retrieves any value from Python and sets */
+/* it accordingly in Blender. */
+/*****************************************************************************/
+int CameraSetAttr (BlenCamera *cam, char *name, PyObject *value)
+{
+ struct Camera * camera;
+
+ camera = cam->camera;
+ if (StringEqual (name, "lens"))
+ return (!PyArg_Parse (value, "f", &(camera->lens)));
+ if (StringEqual (name, "clipStart"))
+ return (!PyArg_Parse (value, "f", &(camera->clipsta)));
+ if (StringEqual (name, "clipEnd"))
+ return (!PyArg_Parse (value, "f", &(camera->clipend)));
+ if (StringEqual (name, "type"))
+ return (!PyArg_Parse (value, "i", &(camera->type)));
+ if (StringEqual (name, "mode"))
+ return (!PyArg_Parse (value, "i", &(camera->flag)));
+
+ printf ("Unknown variable.\n");
+ return (0);
+}
+/*****************************************************************************/
+/* Function: CameraRepr */
+/* Description: This is a callback function for the BlenCamera type. It */
+/* builds a meaninful string to represent camera objects. */
+/*****************************************************************************/
+PyObject* CameraRepr (BlenCamera *self)
+{
+ static char s[256];
+ sprintf (s, "[Camera \"%s\"]", self->camera->id.name+2);
+ return Py_BuildValue("s", s);
+}
diff --git a/source/blender/python/api2_2x/modules.h b/source/blender/python/api2_2x/modules.h
index 575a142a552..ce6c4be6bf3 100644
--- a/source/blender/python/api2_2x/modules.h
+++ b/source/blender/python/api2_2x/modules.h
@@ -40,3 +40,5 @@ PyObject *g_blenderdict;
void initBlender (void);
PyObject* initObject (void);
PyObject* ObjectCreatePyObject (struct Object *obj);
+PyObject* initCamera (void);
+PyObject* CameraCreatePyObject (struct Camera *cam);