Index: source/blender/python/api2_2x/Blender.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/python/api2_2x/Blender.c,v retrieving revision 1.99 diff -b -u -r1.99 Blender.c --- source/blender/python/api2_2x/Blender.c 1 Mar 2007 21:30:48 -0000 1.99 +++ source/blender/python/api2_2x/Blender.c 9 Mar 2007 15:10:57 -0000 @@ -38,6 +38,7 @@ #include "BDR_editobject.h" /* exit_editmode() */ #include "BIF_usiblender.h" #include "BLI_blenlib.h" +#include "BLI_threads.h" #include "BLO_writefile.h" #include "BKE_blender.h" #include "BKE_exotic.h" @@ -93,7 +94,7 @@ #include "World.h" #include "Types.h" #include "Main.h" - +#include "Blender_Trace.h" /**********************************************************/ /* Python API function prototypes for the Blender module. */ /**********************************************************/ @@ -219,6 +220,123 @@ /*****************************************************************************/ PyObject *g_blenderdict; + +PyObject *g_blender_trace_callback = NULL; +uint8_t g_blender_trace_filter[ btfm_MAX ]; +uint8_t const g_blender_trace_filter_defaults[ btfm_MAX ] + = { 0 /* btfm_Debug */ + , 1 /* btfm_RenderProgress */ + , 1 /* btfm_UnpackProgress */ + , 1 /* btfm_FluidsProgress */ + /* btfm_MAX */ }; + +/*****************************************************************************/ +/* Function: Blender_Trace */ +/* Purpose: */ +/* Calls into a python script that was previously registered with */ +/* Blender.Set( "traceCallback" , object ) */ +/* Essentially pilfered from http://docs.python.org/ext/callingPython.html */ +/* With a little sprintf magic from source/blender/src/toolbox.c +/*****************************************************************************/ +void Blender_Trace + ( blenderTraceFilterModes filterMode + , const char* fileName + , unsigned long lineNumber + , const char* format + , ... ) +{ + PyObject *arglist; + PyObject *result; + + va_list ap; + char message[1024]; + + /* Escape quickly if there is no callback or the user is filtering out this trace */ + if ( ( !g_blender_trace_callback ) + || ( 0 == g_blender_trace_filter[filterMode] ) ) + return; + + /* format the message */ + va_start( ap, format ); + vsnprintf( message , sizeof( message ) , format , ap ); + va_end( ap ); + + BLI_lock_thread( LOCK_TRACE ); + + if ( g_blender_trace_callback && g_blender_trace_filter[ filterMode ] ) { + /* It may seem superfluous to perform this check, since we already performed + it just a few lines back. The reason for the additional check is that + it is conceivable that another thread could have modified the filter + or callback pointer after our initial "quick exit check" and before + we entered the LOCK_TRACE lock. */ + + /* Make a python argument list to pass to the traceCallback */ + arglist = Py_BuildValue("(s,i,s,i)" , fileName , lineNumber , message , filterMode ); + + /* Call the traceCallback function */ + result = PyEval_CallObject(g_blender_trace_callback, arglist); + + Py_DECREF(arglist); /* release the python argument list */ + + if(result){ + /*success*/ + Py_DECREF(result); + + } else { + /*handle error*/ + fprintf( stderr , "%s(%d) - There was an error tracing something\n" , __FILE__ , __LINE__ ); + } + } + + BLI_unlock_thread( LOCK_TRACE ); +} /* Blender_Trace */ + +/*****************************************************************************/ +/* Function: Set_Blender_Trace */ +/* Purpose: */ +/* Register a callback for use with Blender_Trace */ +/* Essentially pilfered from http://docs.python.org/ext/callingPython.html */ +/*****************************************************************************/ +static PyObject* Set_Blender_Trace(PyObject *dummy, PyObject *args) +{ + PyObject* result = NULL; + PyObject* temp; + char* argname = NULL; + + if (PyArg_ParseTuple(args, "sO:traceCallback", &argname , &temp)) { + if ( temp == Py_None ) { + Blender_Trace( btfm_Debug , __FILE__ , __LINE__ , "Disconnecting traceCallback\n" ); + + BLI_lock_thread( LOCK_TRACE ); + + Py_XDECREF(g_blender_trace_callback); /* Dispose of previous callback */ + g_blender_trace_callback = NULL; + + BLI_unlock_thread( LOCK_TRACE ); + + Py_INCREF(Py_None); + return Py_None; + } + if (!PyCallable_Check(temp)) { + PyErr_SetString(PyExc_TypeError, "traceCallback parameter must be callable"); + return NULL; + } + + BLI_lock_thread( LOCK_TRACE ); + Py_XINCREF(temp); /* Add a reference to new callback */ + Blender_Trace( btfm_Debug , __FILE__ , __LINE__ , "Disconnecting traceCallback\n" ); + Py_XDECREF(g_blender_trace_callback); /* Dispose of previous callback */ + g_blender_trace_callback = temp; /* Remember new callback */ + Blender_Trace( btfm_Debug , __FILE__ , __LINE__ , "Connecting traceCallback\n" ); + BLI_unlock_thread( LOCK_TRACE ); + + /* Boilerplate to return "None" */ + Py_INCREF(Py_None); + result = Py_None; + } + return result; +} /* Set_Blender_Trace */ + /*****************************************************************************/ /* Function: Blender_Set */ /* Python equivalent: Blender.Set */ @@ -278,6 +396,32 @@ if ( !PyArg_Parse( arg , "s" , &dir )) return EXPP_ReturnPyObjError( PyExc_ValueError, "expected a string" ); BLI_strncpy(U.tempdir, dir, FILE_MAXDIR); + } else if ( StringEqual( name , "traceCallback" ) ) { + return Set_Blender_Trace( self, args ); + } else if ( StringEqual( name , "traceFilterOn" ) ) { + int new_filter = 0x0; + if ( !PyArg_Parse( arg , "i" , &new_filter )) + return EXPP_ReturnPyObjError( PyExc_ValueError, "expected an integer" ); + /* check for overflow */ + if ( new_filter < 0 || new_filter >= btfm_MAX ) + return EXPP_ReturnPyObjError( PyExc_ValueError, "index out of range" ); + BLI_lock_thread( LOCK_TRACE ); + g_blender_trace_filter[ new_filter ] = 1; + BLI_unlock_thread( LOCK_TRACE ); + Py_INCREF(Py_None); + return Py_None; + } else if ( StringEqual( name , "traceFilterOff" ) ) { + int new_filter = 0x0; + if ( !PyArg_Parse( arg , "i" , &new_filter )) + return EXPP_ReturnPyObjError( PyExc_ValueError, "expected an integer" ); + /* check for overflow */ + if ( new_filter < 0 || new_filter >= btfm_MAX ) + return EXPP_ReturnPyObjError( PyExc_ValueError, "index out of range" ); + BLI_lock_thread( LOCK_TRACE ); + g_blender_trace_filter[ new_filter ] = 0; + BLI_unlock_thread( LOCK_TRACE ); + Py_INCREF(Py_None); + return Py_None; } else return ( EXPP_ReturnPyObjError( PyExc_AttributeError, "value given is not a blender setting" ) ); @@ -898,6 +1042,17 @@ { PyObject *module; PyObject *dict, *smode, *SpaceHandlers, *UnpackModes; + int idx; + + + BLI_lock_thread( LOCK_TRACE ); + if ( g_blender_trace_callback ) { + Py_XDECREF(g_blender_trace_callback); /* Dispose of callback */ + g_blender_trace_callback = NULL; + } + assert( btfm_Debug == 0 ); + memcpy( g_blender_trace_filter , g_blender_trace_filter_defaults , sizeof( g_blender_trace_filter ) ); + BLI_unlock_thread( LOCK_TRACE ); /* G.scene should only aver be NULL if blender is executed in background mode, not loading a blend file and executing a python script eg. Index: source/blender/python/api2_2x/sceneRender.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/python/api2_2x/sceneRender.c,v retrieving revision 1.52 diff -b -u -r1.52 sceneRender.c --- source/blender/python/api2_2x/sceneRender.c 30 Jan 2007 03:02:58 -0000 1.52 +++ source/blender/python/api2_2x/sceneRender.c 9 Mar 2007 15:10:58 -0000 @@ -55,6 +55,8 @@ #include "Scene.h" +#include "../../../source/blender/python/api2_2x/Blender_Trace.h" + /* local defines */ #define PY_NONE 0 #define PY_LOW 1 @@ -384,6 +386,8 @@ { Scene *oldsce; + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "RenderData_Render called" ); + if (!G.background) { oldsce = G.scene; set_scene( self->scene ); @@ -451,6 +455,8 @@ PyObject *RenderData_RenderAnim( BPy_RenderData * self ) { Scene *oldsce; + + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "RenderData_RenderAnim called" ); if (!G.background) { oldsce = G.scene; Index: projectfiles_vc7/blender/BPY_python/BPY_python.vcproj =================================================================== RCS file: /cvsroot/bf-blender/blender/projectfiles_vc7/blender/BPY_python/BPY_python.vcproj,v retrieving revision 1.33 diff -b -u -r1.33 BPY_python.vcproj --- projectfiles_vc7/blender/BPY_python/BPY_python.vcproj 1 Mar 2007 20:49:43 -0000 1.33 +++ projectfiles_vc7/blender/BPY_python/BPY_python.vcproj 9 Mar 2007 15:10:59 -0000 @@ -32,6 +32,7 @@ AssemblerListingLocation="..\..\..\..\build\msvc_7\source\blender\python\debug\" ObjectFile="..\..\..\..\build\msvc_7\source\blender\python\debug\" ProgramDataBaseFileName="..\..\..\..\build\msvc_7\source\blender\python\debug\" + BrowseInformation="1" WarningLevel="4" SuppressStartupBanner="TRUE" Detect64BitPortabilityProblems="FALSE" @@ -335,6 +336,9 @@ RelativePath="..\..\..\source\blender\python\api2_2x\Blender.h"> + + name, localname, ima->packedfile, how); if (newname != NULL) { ret_value = RET_OK; Index: source/blender/render/intern/source/initrender.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/render/intern/source/initrender.c,v retrieving revision 1.86 diff -b -u -r1.86 initrender.c --- source/blender/render/intern/source/initrender.c 28 Dec 2006 11:14:08 -0000 1.86 +++ source/blender/render/intern/source/initrender.c 9 Mar 2007 15:10:59 -0000 @@ -79,6 +79,7 @@ /* Own includes */ #include "initrender.h" +#include "../../../source/blender/python/api2_2x/Blender_Trace.h" /* ********************** */ @@ -623,6 +624,8 @@ rcti disprect; int rectx, recty; + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "initparts: part %d of %d" , nr , xparts * yparts ); + xd= (nr % xparts); yd= (nr-xd)/xparts; Index: source/blender/render/intern/source/pipeline.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/render/intern/source/pipeline.c,v retrieving revision 1.115 diff -b -u -r1.115 pipeline.c --- source/blender/render/intern/source/pipeline.c 28 Jan 2007 05:43:12 -0000 1.115 +++ source/blender/render/intern/source/pipeline.c 9 Mar 2007 15:11:00 -0000 @@ -80,6 +80,7 @@ #include "shadbuf.h" #include "zbuf.h" +#include "../../../source/blender/python/api2_2x/Blender_Trace.h" /* render flow @@ -1161,6 +1162,12 @@ { RenderPart *pa= pa_v; + Blender_Trace + ( btfm_RenderProgress + , __FILE__ , __LINE__ , "Rendering Tile [%d,%d]-[%d-%d]\n" + , pa->disprect.xmin , pa->disprect.ymin + , pa->disprect.xmax , pa->disprect.ymax ); + /* need to return nicely all parts on esc */ if(R.test_break()==0) { @@ -1188,6 +1195,8 @@ { RenderPart *pa; + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "render_tile_processor( ... )" ); + if(re->test_break()) return; @@ -1202,6 +1211,8 @@ if(re->result==NULL) return; + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "" ); + initparts(re); /* assuming no new data gets added to dbase... */ @@ -1364,6 +1375,8 @@ // if(re->re->test_break()) // return; + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "" ); + initparts(re); if(rr->exrhandle) { @@ -1784,6 +1797,8 @@ { Render *resc= RE_NewRender(sce->id.name); + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "render_scene called" ); + sce->r.cfra= cfra; /* initial setup */ @@ -1981,6 +1996,8 @@ /* main loop: doing sequence + fields + blur + 3d render + compositing */ static void do_render_all_options(Render *re) { + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "do_render_all_options() called" ); + re->i.starttime= PIL_check_seconds_timer(); /* ensure no images are in memory from previous animated sequences */ @@ -2115,6 +2132,8 @@ int winx, winy; rcti disprect; + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "render_initialize_from_scene called" ); + /* r.xsch and r.ysch has the actual view window size r.border is the clipping rect */ @@ -2171,6 +2190,10 @@ /* general Blender frame render call */ void RE_BlenderFrame(Render *re, Scene *scene, int frame) { + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ + , "RE_BlenderFrame(re=%x, scene=0x%x, frame= %d )" + , re , scene , frame ); + /* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */ /* is also set by caller renderwin.c */ G.rendering= 1; @@ -2262,6 +2285,10 @@ bMovieHandle *mh= BKE_get_movie_handle(scene->r.imtype); int cfrao= scene->r.cfra; + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ + , "RE_BlenderAnim(re=%x, scene=0x%x, sfra = %d , efra = %d )" + , re , scene , sfra , efra ); + /* do not call for each frame, it initializes & pops output window */ if(!render_initialize_from_scene(re, scene)) return; Index: source/blender/render/intern/source/ray.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/render/intern/source/ray.c,v retrieving revision 1.96 diff -b -u -r1.96 ray.c --- source/blender/render/intern/source/ray.c 12 Feb 2007 13:16:30 -0000 1.96 +++ source/blender/render/intern/source/ray.c 9 Mar 2007 15:11:01 -0000 @@ -55,6 +55,8 @@ #include "shading.h" #include "texture.h" +#include "../../../source/blender/python/api2_2x/Blender_Trace.h" + #define DDA_SHADOW 0 #define DDA_MIRROR 1 #define DDA_SHADOW_TRA 2 @@ -471,6 +473,7 @@ short rts[4][3], ocmin[6], *ocmax; char *ocface; // front, top, size view of face, to fill in double lasttime= PIL_check_seconds_timer(); + double lasttrace = lasttime; oc= &re->oc; oc->adrbranch= MEM_callocN(sizeof(void *)*BRANCH_ARRAY, "octree branches"); @@ -544,6 +547,10 @@ re->stats_draw(&re->i); re->i.infostr= NULL; lasttime= time; + if ( time-lasttrace> 5.0 ) { + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "%s/%d" , str , re->totvlak ); + lasttrace = time; + } } } else vlr++; Index: source/blender/render/intern/source/rendercore.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/render/intern/source/rendercore.c,v retrieving revision 1.203 diff -b -u -r1.203 rendercore.c --- source/blender/render/intern/source/rendercore.c 23 Feb 2007 15:06:27 -0000 1.203 +++ source/blender/render/intern/source/rendercore.c 9 Mar 2007 15:11:03 -0000 @@ -71,6 +71,7 @@ /* own include */ #include "rendercore.h" +#include "../../../source/blender/python/api2_2x/Blender_Trace.h" /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* defined in pipeline.c, is hardcopy of active dynamic allocated Render */ @@ -521,6 +522,7 @@ long *rd, *rectdaps= pa->rectdaps; int samp; int x, y, seed, crop=0, offs=0, od, addpassflag; + int pnd = 0; if(R.test_break()) return; @@ -553,6 +555,9 @@ rd= rectdaps; od= offs; + if ( ++pnd % 10 == 0 ) { + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "Scanline %d" , y ); + } for(x=pa->disprect.xmin+crop; xdisprect.xmax-crop; x++, rd++, rf+=4, od++) { BLI_thread_srandom(pa->thread, seed++); @@ -576,6 +581,7 @@ if(y&1) if(R.test_break()) break; } + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "" ); /* disable scanline updating */ rr->renlay= NULL; @@ -841,6 +847,7 @@ RenderLayer *rl; ListBase psmlist= {NULL, NULL}; float *edgerect= NULL; + int lyr = 0; set_part_zbuf_clipflag(pa); @@ -850,6 +857,7 @@ pa->rectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectz"); for(rl= rr->layers.first; rl; rl= rl->next) { + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "Rendering layer %d\n" , ++lyr ); /* initialize pixelstructs and edge buffer */ addpsmain(&psmlist); @@ -976,6 +984,7 @@ PixStr ps; float *edgerect= NULL; int addpassflag; + int lyr = 0; /* fake pixel struct, to comply to osa render */ ps.next= NULL; @@ -988,6 +997,7 @@ pa->rectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectz"); for(rl= rr->layers.first; rl; rl= rl->next) { + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "Rendering layer %d\n" , ++lyr ); /* general shader info, passes */ shade_sample_initialize(&ssamp, pa, rl); @@ -1012,6 +1022,7 @@ if(rl->layflag & SCE_LAY_SOLID) { float *fcol= rl->rectf; int x, y, *rp= pa->rectp, *rz= pa->rectz, offs=0, seed; + int pnd = 0; /* we set per pixel a fixed seed, for random AO and shadow samples */ seed= pa->rectx*pa->disprect.ymin; @@ -1021,6 +1032,8 @@ ISB_create(pa, NULL); for(y=pa->disprect.ymin; ydisprect.ymax; y++, rr->renrect.ymax++) { + if ( ++pnd % 10 == 0 ) + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "#" ); for(x=pa->disprect.xmin; xdisprect.xmax; x++, rz++, rp++, fcol+=4, offs++) { /* per pixel fixed seed */ BLI_thread_srandom(pa->thread, seed++); @@ -1040,7 +1053,7 @@ if(y&1) if(R.test_break()) break; } - + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "#" ); if(R.r.mode & R_SHADOW) ISB_free(pa); } Index: source/blender/src/sequence.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/src/sequence.c,v retrieving revision 1.63 diff -b -u -r1.63 sequence.c --- source/blender/src/sequence.c 4 Feb 2007 09:18:15 -0000 1.63 +++ source/blender/src/sequence.c 9 Mar 2007 15:11:03 -0000 @@ -71,6 +71,8 @@ #include "blendef.h" +#include "../../../source/blender/python/api2_2x/Blender_Trace.h" + int seqrectx, seqrecty; void free_stripdata(int len, StripElem *se) @@ -1142,6 +1144,8 @@ int count; ListBase *seqbasep; + Blender_Trace( btfm_Debug , __FILE__ , __LINE__ , "" ); + ed= G.scene->ed; if(ed==0) return 0; @@ -1325,6 +1329,8 @@ void do_render_seq(RenderResult *rr, int cfra) { ImBuf *ibuf; + + Blender_Trace( btfm_RenderProgress , __FILE__ , __LINE__ , "" ); G.f |= G_PLAYANIM; /* waitcursor patch */