diff options
author | Campbell Barton <ideasman42@gmail.com> | 2008-02-12 17:47:55 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2008-02-12 17:47:55 +0300 |
commit | 3974a0a3c1a19aaa2a06df1bad7f96f827088319 (patch) | |
tree | b8a139e3f896aca0eae155b4d14ca039dacafaeb /source/blender/python/api2_2x/sceneRender.c | |
parent | c371346601276d9ae72ace5f4a877b42107bea78 (diff) |
Added python access for baking
http://www.blender.org/documentation/246PythonDoc/
http://www.blender.org/documentation/246PythonDoc/Render.RenderData-class.html
http://www.blender.org/documentation/246PythonDoc/bpy_api_2_46.zip
Diffstat (limited to 'source/blender/python/api2_2x/sceneRender.c')
-rw-r--r-- | source/blender/python/api2_2x/sceneRender.c | 163 |
1 files changed, 160 insertions, 3 deletions
diff --git a/source/blender/python/api2_2x/sceneRender.c b/source/blender/python/api2_2x/sceneRender.c index 581c6132581..bf940512f67 100644 --- a/source/blender/python/api2_2x/sceneRender.c +++ b/source/blender/python/api2_2x/sceneRender.c @@ -47,6 +47,7 @@ struct View3D; /* keep me up here */ #include "BIF_drawscene.h" #include "BIF_renderwin.h" #include "BIF_writeimage.h" +#include "BIF_meshtools.h" #include "BLI_blenlib.h" @@ -86,6 +87,10 @@ enum rend_constants { EXPP_RENDER_ATTR_SIZEY, EXPP_RENDER_ATTR_GAUSSFILTER, EXPP_RENDER_ATTR_MBLURFACTOR, + EXPP_RENDER_ATTR_BAKEMARGIN, + EXPP_RENDER_ATTR_BAKEMODE, + EXPP_RENDER_ATTR_BAKEDIST, + EXPP_RENDER_ATTR_BAKENORMALSPACE }; #define EXPP_RENDER_ATTR_CFRA 2 @@ -133,6 +138,7 @@ static PyObject *RenderData_SetRenderer( BPy_RenderData * self, static PyObject *RenderData_SetImageType( BPy_RenderData * self, PyObject * args ); static PyObject *RenderData_Render( BPy_RenderData * self ); +static PyObject *RenderData_Bake( BPy_RenderData * self ); /* BPy_RenderData Internal Protocols */ @@ -492,6 +498,28 @@ PyObject *RenderData_Render( BPy_RenderData * self ) Py_RETURN_NONE; } +/***************************************************************************/ +/* BPy_Bake Function Definitions */ +/***************************************************************************/ + +PyObject *RenderData_Bake( BPy_RenderData * self ) +{ + char *error_msg = NULL; + Scene *oldsce; + + oldsce = G.scene; + set_scene( self->scene ); + + objects_bake_render(0, &error_msg); + + set_scene( oldsce ); + + if (error_msg) + return EXPP_ReturnPyObjError( PyExc_RuntimeError, error_msg ); + + Py_RETURN_NONE; +} + /* * This will save the rendered image to an output file path already defined. */ @@ -1849,6 +1877,9 @@ static PyObject *RenderData_getFloatAttr( BPy_RenderData *self, void *type ) case EXPP_RENDER_ATTR_FPS_BASE: param = self->renderContext->frs_sec_base; break; + case EXPP_RENDER_ATTR_BAKEDIST: + param = self->renderContext->bake_maxdist; + break; default: return EXPP_ReturnPyObjError( PyExc_RuntimeError, "undefined type constant in RenderData_getFloatAttr" ); @@ -1882,6 +1913,13 @@ static int RenderData_setFloatAttrClamp( BPy_RenderData *self, PyObject *value, max = 120.0f; param = &self->renderContext->frs_sec_base; break; + + case EXPP_RENDER_ATTR_BAKEDIST: + min = 0.0f; + max = 10.0f; + param = &self->renderContext->bake_maxdist; + break; + default: return EXPP_ReturnIntError( PyExc_RuntimeError, "undefined type constant in RenderData_setFloatAttrClamp" ); @@ -1928,6 +1966,15 @@ static PyObject *RenderData_getIValueAttr( BPy_RenderData *self, void *type ) case EXPP_RENDER_ATTR_SIZEY: param = self->renderContext->ysch; break; + case EXPP_RENDER_ATTR_BAKEMARGIN: + param = self->renderContext->bake_filter; + break; + case EXPP_RENDER_ATTR_BAKEMODE: + param = self->renderContext->bake_mode; + break; + case EXPP_RENDER_ATTR_BAKENORMALSPACE: + param = self->renderContext->bake_normal_space; + break; default: return EXPP_ReturnPyObjError( PyExc_RuntimeError, "undefined type constant in RenderData_setIValueAttrClamp" ); @@ -2006,6 +2053,24 @@ static int RenderData_setIValueAttrClamp( BPy_RenderData *self, PyObject *value, size = 'h'; param = &self->renderContext->ysch; break; + case EXPP_RENDER_ATTR_BAKEMARGIN: + min = 0; + max = 32; + size = 'h'; + param = &self->renderContext->bake_filter; + break; + case EXPP_RENDER_ATTR_BAKEMODE: + min = RE_BAKE_LIGHT; + max = RE_BAKE_DISPLACEMENT; + size = 'h'; + param = &self->renderContext->bake_mode; + break; + case EXPP_RENDER_ATTR_BAKENORMALSPACE: + min = R_BAKE_SPACE_CAMERA; + max = R_BAKE_SPACE_TANGENT; + size = 'h'; + param = &self->renderContext->bake_normal_space; + break; default: return EXPP_ReturnIntError( PyExc_RuntimeError, "undefined type constant in RenderData_setIValueAttrClamp" ); @@ -2451,6 +2516,32 @@ static int RenderData_setActiveLayer( BPy_RenderData *self, PyObject *value ) return 0; } +static int RenderData_setBakeMode( BPy_RenderData *self, PyObject *value, + void *type ) +{ + /* use negative numbers to flip truth */ + int param = PyObject_IsTrue( value ); + + if( param == -1 ) + return EXPP_ReturnIntError( PyExc_TypeError, + "expected True/False or 0/1" ); + + if (param) { + self->renderContext->bake_flag |= (int)type; + } else { + self->renderContext->bake_flag &= ~(int)type; + } + return 0; +} + +static PyObject *RenderData_getBakeMode( BPy_RenderData *self, void *type ) +{ + int itype = (int)type; + /* use negative numbers to flip truth */ + if (self->renderContext->bake_flag & itype) Py_RETURN_TRUE; + else Py_RETURN_FALSE; +} + /***************************************************************************/ /* BPy_RenderData attribute def */ /***************************************************************************/ @@ -2791,7 +2882,32 @@ static PyGetSetDef BPy_RenderData_getseters[] = { (getter)RenderData_getYafrayGITunePhotons, (setter)RenderData_setYafrayGITunePhotons, "If true the photonmap is shown directly in the render for tuning", NULL}, - + + /* Bake stuff */ + {"bakeClear", + (getter)RenderData_getBakeMode, (setter)RenderData_setBakeMode, + "Clear the image before baking", + (void *)R_BAKE_CLEAR}, + {"bakeToActive", + (getter)RenderData_getBakeMode, (setter)RenderData_setBakeMode, + "Bake selection to active", + (void *)R_BAKE_TO_ACTIVE}, + {"bakeMargin", + (getter)RenderData_getIValueAttr, (setter)RenderData_setIValueAttrClamp, + "number of pixels to use as a margin for the edges of the image", + (void *)EXPP_RENDER_ATTR_BAKEMARGIN}, + {"bakeMode", + (getter)RenderData_getIValueAttr, (setter)RenderData_setIValueAttrClamp, + "The mode for baking, see Blender.Scene.Render.BakeModes", + (void *)EXPP_RENDER_ATTR_BAKEMODE}, + {"bakeNormalSpace", + (getter)RenderData_getIValueAttr, (setter)RenderData_setIValueAttrClamp, + "The mode for baking, see Blender.Scene.Render.BakeNormalSpaceModes", + (void *)EXPP_RENDER_ATTR_BAKENORMALSPACE}, + {"bakeDist", + (getter)RenderData_getFloatAttr, (setter)RenderData_setFloatAttrClamp, + "Distance in blender units", + (void *)EXPP_RENDER_ATTR_BAKEDIST}, {NULL,NULL,NULL,NULL,NULL} }; @@ -2801,6 +2917,8 @@ static PyGetSetDef BPy_RenderData_getseters[] = { static PyMethodDef BPy_RenderData_methods[] = { {"render", ( PyCFunction ) RenderData_Render, METH_NOARGS, "() - render the scene"}, + {"bake", ( PyCFunction ) RenderData_Bake, METH_NOARGS, + "() - bake current selection"}, {"saveRenderedImage", (PyCFunction)RenderData_SaveRenderedImage, METH_VARARGS, "(filename) - save an image generated by a call to render() (set output path first)"}, {"renderAnim", ( PyCFunction ) RenderData_RenderAnim, METH_NOARGS, @@ -3660,6 +3778,39 @@ static PyObject *M_Render_GameFramingDict( void ) return M; } +static PyObject *M_Render_BakeModesDict( void ) +{ + PyObject *M = PyConstant_New( ); + + if( M ) { + BPy_constant *d = ( BPy_constant * ) M; + + PyConstant_Insert( d, "LIGHT", PyInt_FromLong( RE_BAKE_LIGHT ) ); + PyConstant_Insert( d, "ALL", PyInt_FromLong( RE_BAKE_ALL ) ); + PyConstant_Insert( d, "AO", PyInt_FromLong( RE_BAKE_AO ) ); + PyConstant_Insert( d, "NORMALS", PyInt_FromLong( RE_BAKE_NORMALS ) ); + PyConstant_Insert( d, "TEXTURE", PyInt_FromLong( RE_BAKE_TEXTURE ) ); + PyConstant_Insert( d, "DISPLACEMENT", PyInt_FromLong( RE_BAKE_DISPLACEMENT ) ); + } + return M; +} + + +static PyObject *M_Render_BakeNormalSpaceDict( void ) +{ + PyObject *M = PyConstant_New( ); + + if( M ) { + BPy_constant *d = ( BPy_constant * ) M; + + PyConstant_Insert( d, "CAMERA", PyInt_FromLong( R_BAKE_SPACE_CAMERA ) ); + PyConstant_Insert( d, "WORLS", PyInt_FromLong( R_BAKE_SPACE_WORLD ) ); + PyConstant_Insert( d, "OBJECT", PyInt_FromLong( R_BAKE_SPACE_OBJECT ) ); + PyConstant_Insert( d, "TANGENT", PyInt_FromLong( R_BAKE_SPACE_TANGENT ) ); + } + return M; +} + /***************************************************************************/ /* Render Module Init */ /***************************************************************************/ @@ -3669,7 +3820,9 @@ PyObject *Render_Init( void ) PyObject *ModesDict = M_Render_ModesDict( ); PyObject *SceModesDict = M_Render_SceModesDict( ); PyObject *GFramingDict = M_Render_GameFramingDict( ); - + PyObject *BakeModesDict = M_Render_BakeModesDict( ); + PyObject *BakeNormalSpaceDict = M_Render_BakeNormalSpaceDict( ); + if( PyType_Ready( &RenderData_Type ) < 0 ) return NULL; @@ -3685,7 +3838,11 @@ PyObject *Render_Init( void ) PyModule_AddObject( submodule, "SceModes", SceModesDict ); if( GFramingDict ) PyModule_AddObject( submodule, "FramingModes", GFramingDict ); - + if( BakeModesDict ) + PyModule_AddObject( submodule, "BakeModes", BakeModesDict ); + if( BakeNormalSpaceDict ) + PyModule_AddObject( submodule, "BakeNormalSpaceModes", BakeNormalSpaceDict ); + /* ugh: why aren't these in a constant dict? */ PyModule_AddIntConstant( submodule, "INTERNAL", R_INTERN ); |