[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13425] trunk/blender/source/blender/ python/api2_2x: renderLayer access for the render api, no epydocs yet

Campbell Barton ideasman42 at gmail.com
Sun Jan 27 23:22:41 CET 2008


Revision: 13425
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13425
Author:   campbellbarton
Date:     2008-01-27 23:22:41 +0100 (Sun, 27 Jan 2008)

Log Message:
-----------
renderLayer access for the render api, no epydocs yet

Modified Paths:
--------------
    trunk/blender/source/blender/python/api2_2x/sceneRender.c
    trunk/blender/source/blender/python/api2_2x/sceneRender.h

Modified: trunk/blender/source/blender/python/api2_2x/sceneRender.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/sceneRender.c	2008-01-27 19:26:17 UTC (rev 13424)
+++ trunk/blender/source/blender/python/api2_2x/sceneRender.c	2008-01-27 22:22:41 UTC (rev 13425)
@@ -33,12 +33,16 @@
 
 #include "sceneRender.h" /*This must come first*/
 
+#include "MEM_guardedalloc.h"
+				 
 #include "DNA_image_types.h"
+#include "DNA_node_types.h"
 
 #include "BKE_image.h"
 #include "BKE_global.h"
 #include "BKE_screen.h"
 #include "BKE_scene.h"
+#include "BKE_node.h"
 
 #include "BIF_drawscene.h"
 #include "BIF_renderwin.h"
@@ -52,8 +56,10 @@
 #include "butspace.h"
 #include "blendef.h"
 #include "gen_utils.h"
+#include "gen_library.h"
 
 #include "Scene.h"
+#include "Group.h"
 
 /* local defines */
 #define PY_NONE		     0
@@ -1758,7 +1764,68 @@
 	return PyString_FromString(tc);
 }            
 
+
 /***************************************************************************/
+/* Render layer functions                                                  */
+/***************************************************************************/
+PyObject *RenderData_getRenderLayers(BPy_RenderData * self)
+{
+	PyObject *list, *layer;
+	SceneRenderLayer *srl;
+	
+	list = PyList_New(0);
+	
+	for(srl= self->renderContext->layers.first; srl; srl= srl->next) {	
+		layer = RenderLayer_CreatePyObject( srl );
+		PyList_Append(list, layer);
+		Py_DECREF(layer);
+	}
+	return list;
+}
+
+PyObject *RenderData_removeRenderLayer(BPy_RenderData * self, BPy_RenderLayer *value)
+{
+	int index;
+	if (!BPy_RenderLayer_Check(value))
+		return EXPP_ReturnPyObjError( PyExc_TypeError,
+			"can only remove a render layer" );
+	
+	index = BLI_findindex(&self->renderContext->layers, value->renderLayer);
+	
+	if (index == -1)
+		return EXPP_ReturnPyObjError( PyExc_ValueError,
+			"render layer is not in this scene" );
+	
+	if (BLI_countlist(&self->renderContext->layers)<=1)
+		return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+			"cannot remove the last render layer" );
+	
+	BLI_remlink(&self->scene->r.layers, value->renderLayer);
+	MEM_freeN(value->renderLayer);
+	self->scene->r.actlay= 0;
+	
+	if(self->scene->nodetree) {
+		bNode *node;
+		for(node= self->scene->nodetree->nodes.first; node; node= node->next) {
+			if(node->type==CMP_NODE_R_LAYERS && node->id==NULL) {
+				if(node->custom1==index)
+					node->custom1= 0;
+				else if(node->custom1 > index)
+					node->custom1--;
+			}
+		}
+	}
+	
+	value->renderLayer = NULL;
+}
+
+PyObject *RenderData_addRenderLayer(BPy_RenderData * self ) {
+	scene_add_render_layer(self->scene);
+	return RenderLayer_CreatePyObject( self->renderContext->layers.last );
+	
+}
+
+/***************************************************************************/
 /* generic handlers for getting/setting attributes                         */
 /***************************************************************************/
 
@@ -2631,11 +2698,16 @@
 	 "Scene link 'set' value",
 	 NULL},
 
+	/* renderlayers */
 	{"activeLayer",
 	 (getter)RenderData_getActiveLayer, (setter)RenderData_setActiveLayer,
 	 "Active rendering layer",
 	 NULL},
-
+	{"renderLayers",
+	 (getter)RenderData_getRenderLayers, (setter)NULL,
+	 "Active rendering layer",
+	 NULL},
+  
 	{"halfFloat",
      (getter)RenderData_getSubImTypeBits, (setter)RenderData_setSubImTypeBits,
      "'Half' openexr option enabled",
@@ -2960,6 +3032,11 @@
 	 "(int) - get/set specify old map value in frames"},
 	{"newMapValue", ( PyCFunction ) RenderData_NewMapValue, METH_VARARGS,
 	 "(int) - get/set specify new map value in frames"},
+  /* renderlayers */
+	{"addRenderLayer", ( PyCFunction ) RenderData_addRenderLayer, METH_VARARGS,
+	 "(string) - add a new render layer"},
+	{"removeRenderLayer", ( PyCFunction ) RenderData_removeRenderLayer, METH_O,
+	 "(renderLayer) - remove a render layer from this scene"},
 	{NULL, NULL, 0, NULL}
 };
  
@@ -3046,7 +3123,470 @@
 	NULL
 };
 
+
+
+
+/* render layers */
+
+static PyObject *RenderLayer_repr( BPy_RenderLayer * self )
+{
+	if( self->renderLayer )
+		return PyString_FromFormat( "[RenderLayer \"%s\"]",
+					    self->renderLayer->name  );
+	else
+		return PyString_FromString( "NULL" );
+}
+
+static PyObject *RenderLayer_getName( BPy_RenderLayer * self )
+{
+	if( !self->renderLayer )
+		return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+				"This render layer has been removed!" );
+	
+	return PyString_FromString( self->renderLayer->name );
+}
+
+static int RenderLayer_setName( BPy_RenderLayer * self, PyObject *value )
+{
+	char *name = NULL;
+	int index = BLI_findindex(&self->scene->r.layers, self->renderLayer);
+	
+	if( !self->renderLayer )
+		return EXPP_ReturnIntError( PyExc_RuntimeError,
+				"This render layer has been removed!" );
+	
+	name = PyString_AsString ( value );
+	if( !name )
+		return EXPP_ReturnIntError( PyExc_TypeError,
+					      "expected string argument" );
+	
+	/* No check for doubles? - blender dosnt so we dont have to! */
+	BLI_strncpy( self->renderLayer->name, name, sizeof( self->renderLayer->name ) );
+	
+	if(self->scene->nodetree) {
+		bNode *node;
+		for(node= self->scene->nodetree->nodes.first; node; node= node->next) {
+			if(node->type==CMP_NODE_R_LAYERS && node->id==NULL) {
+				if(node->custom1==index)
+					BLI_strncpy(node->name, self->renderLayer->name, NODE_MAXSTR);
+			}
+		}
+	}
+	
+	return 0;
+}
+
+static PyObject *RenderLayer_getLightGroup( BPy_RenderLayer * self )
+{
+	if( !self->renderLayer )
+		return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+				"This render layer has been removed!" );
+	return Group_CreatePyObject( self->renderLayer->light_override );
+}
+static int RenderLayer_setLightGroup( BPy_RenderLayer * self, PyObject * value )
+{
+	if( !self->renderLayer )
+		return EXPP_ReturnIntError( PyExc_RuntimeError,
+				"This render layer has been removed!" );
+	return GenericLib_assignData(value, (void **) &self->renderLayer->light_override, NULL, 1, ID_GR, 0);
+}
+
+
+/*****************************************************************************/
+/* Python BPy_Render getsetattr funcs:                                       */
+/*****************************************************************************/
+static int RenderLayer_setLayers( BPy_RenderLayer * self, PyObject * value, void *zlay )
+{
+	unsigned int laymask = 0;
+	
+	if( !self->renderLayer )
+		return EXPP_ReturnIntError( PyExc_RuntimeError,
+				"This render layer has been removed!" );
+	
+	if( !PyInt_Check( value ) )
+		return EXPP_ReturnIntError( PyExc_TypeError,
+			"expected an integer (bitmask) as argument" );
+	
+	laymask = ( unsigned int )PyInt_AS_LONG( value );
+	
+	if( laymask <= 0 )
+		return EXPP_ReturnIntError( PyExc_ValueError,
+					      "layer value cannot be zero or below" );
+	
+	if (zlay) {
+		self->renderLayer->lay_zmask= laymask & ((1<<20) - 1);
+	} else {
+		self->renderLayer->lay= laymask & ((1<<20) - 1);
+	}
+	return 0;
+}
+
+static PyObject *RenderLayer_getLayers( BPy_RenderLayer * self, void *zlay )
+{
+	if (zlay) {
+		return PyInt_FromLong( self->renderLayer->lay_zmask );
+	} else {
+		return PyInt_FromLong( self->renderLayer->lay );
+	}
+}
+
+static PyObject *RenderLayer_getLayflagBits( BPy_RenderLayer *self, void *type )
+{
+	int itype = (int)type;
+	if( !self->renderLayer )
+		return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+				"This render layer has been removed!" );
+	
+	/* use negative numbers to flip truth */
+	if (self->renderLayer->lay & itype)	Py_RETURN_TRUE;
+	else								Py_RETURN_FALSE;
+}
+
+static int RenderLayer_setLayflagBits( BPy_RenderLayer *self, PyObject *value,
+		void *type )
+{
+	/* use negative numbers to flip truth */
+	int param = PyObject_IsTrue( value );
+		
+	if( !self->renderLayer )
+		return EXPP_ReturnIntError( PyExc_RuntimeError,
+				"This render layer has been removed!" );
+	
+	if( param == -1 )
+		return EXPP_ReturnIntError( PyExc_TypeError,
+				"expected True/False or 0/1" );
+	
+	if (param) {
+		self->renderLayer->lay |= (int)type;
+	} else {
+		self->renderLayer->lay &= ~(int)type;
+	}
+	return 0;
+}
+
+static PyObject *RenderLayer_getPassBits( BPy_RenderLayer *self, void *type )
+{
+	int itype = (int)type;
+	if( !self->renderLayer )
+		return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+				"This render layer has been removed!" );
+	
+	/* use negative numbers to flip truth */
+	if (self->renderLayer->passflag & itype)	Py_RETURN_TRUE;
+	else										Py_RETURN_FALSE;
+}
+
+static int RenderLayer_setPassBits( BPy_RenderLayer *self, PyObject *value,
+		void *type )
+{
+	/* use negative numbers to flip truth */
+	int param = PyObject_IsTrue( value );
+		
+	if( !self->renderLayer )
+		return EXPP_ReturnIntError( PyExc_RuntimeError,
+				"This render layer has been removed!" );
+	
+	if( param == -1 )
+		return EXPP_ReturnIntError( PyExc_TypeError,
+				"expected True/False or 0/1" );
+	
+	if (param) {
+		self->renderLayer->passflag |= ((int)type);
+	} else {
+		self->renderLayer->passflag &= ~((int)type);
+	}
+	return 0;
+}
+
+static PyObject *RenderLayer_getPassXorBits( BPy_RenderLayer *self, void *type )
+{
+	if( !self->renderLayer )
+		return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+				"This render layer has been removed!" );
+	
+	/* use negative numbers to flip truth */
+	if (self->renderLayer->pass_xor & (int)type)	Py_RETURN_TRUE;
+	else										Py_RETURN_FALSE;
+}
+
+static int RenderLayer_setPassXorBits( BPy_RenderLayer *self, PyObject *value,
+		void *type )
+{
+	int param = PyObject_IsTrue( value );
+		
+	if( !self->renderLayer )
+		return EXPP_ReturnIntError( PyExc_RuntimeError,
+				"This render layer has been removed!" );
+	
+	if( param == -1 )
+		return EXPP_ReturnIntError( PyExc_TypeError,
+				"expected True/False or 0/1" );
+	
+	if (param) {
+		self->renderLayer->passflag |= (int)type;
+	} else {
+		self->renderLayer->passflag &= ~(int)type;
+	}
+	return 0;
+}
+
 /***************************************************************************/
+/* BPy_RenderData attribute def                                            */
+/***************************************************************************/
+static PyGetSetDef BPy_RenderLayer_getseters[] = {
+	{"name",
+	 (getter)RenderLayer_getName, (setter)RenderLayer_setName,
+	 "",
+	 (void *)NULL},
+	{"lightGroup",
+	 (getter)RenderLayer_getLightGroup, (setter)RenderLayer_setLightGroup,
+	 "",
+	 (void *)NULL},
+	/*{"material",
+	 (getter)RenderLayer_getMaterial, (setter)RenderLayer_setMaterial,
+	 "",
+	 (void *)NULL},*/

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list