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 */