copy of docs from 2.4x for python modules that have been kept
[blender-staging.git] / source / blender / render / intern / include / rayobject.h
index 337f9ca3fddb0bc6a084faa0189625ea5f844412..309048d8efbb928e396743d826c1131d0bb91174 100644 (file)
@@ -35,6 +35,7 @@ extern "C" {
 
 #include "RE_raytrace.h"
 #include "render_types.h"
+#include <stdio.h>
 #include <float.h>
 
 
@@ -93,6 +94,21 @@ extern "C" {
 #define RE_rayobject_isVlakPrimitive(o)        ((((intptr_t)o)&3) == 3)
 
 
+
+/*
+ * This class is intended as a place holder for control, configuration of the rayobject like:
+ *     - stop building (TODO maybe when porting build to threads this could be implemented with some thread_cancel function)
+ *  - max number of threads and threads callback to use during build
+ *     ...
+ */    
+typedef int  (*RE_rayobjectcontrol_test_break_callback)(void *data);
+typedef struct RayObjectControl RayObjectControl;
+struct RayObjectControl
+{
+       void *data;
+       RE_rayobjectcontrol_test_break_callback test_break;     
+};
+
 /*
  * This rayobject represents a generic object. With it's own callbacks for raytrace operations.
  * It's suitable to implement things like LOD.
@@ -100,9 +116,13 @@ extern "C" {
 struct RayObject
 {
        struct RayObjectAPI *api;
+
+       struct RayObjectControl control;
 };
 
 
+
+
 typedef int  (*RE_rayobject_raycast_callback)(RayObject *, Isect *);
 typedef void (*RE_rayobject_add_callback)(RayObject *raytree, RayObject *rayobject);
 typedef void (*RE_rayobject_done_callback)(RayObject *);
@@ -144,20 +164,24 @@ int RE_rayobject_bb_intersect_test(const Isect *i, const float *bb); /* same as
 float RE_rayobject_cost(RayObject *r);
 
 
+/*
+ * Returns true if for some reason a heavy processing function should stop
+ * (eg.: user asked to stop during a tree a build)
+ */
+int RE_rayobjectcontrol_test_break(RayObjectControl *c);
 
 
 #define ISECT_EPSILON ((float)FLT_EPSILON)
 
 
 
-#if !defined(_WIN32)
+#if !defined(_WIN32) && !defined(_WIN64)
 
 #include <sys/time.h>
 #include <time.h>
-#include <stdio.h>
 
 #define BENCH(a,name)  \
-       do {                    \
+       {                       \
                double _t1, _t2;                                \
                struct timeval _tstart, _tend;  \
                clock_t _clock_init = clock();  \
@@ -167,10 +191,10 @@ float RE_rayobject_cost(RayObject *r);
                _t1 = ( double ) _tstart.tv_sec + ( double ) _tstart.tv_usec/ ( 1000*1000 );    \
                _t2 = ( double )   _tend.tv_sec + ( double )   _tend.tv_usec/ ( 1000*1000 );    \
                printf("BENCH:%s: %fs (real) %fs (cpu)\n", #name, _t2-_t1, (float)(clock()-_clock_init)/CLOCKS_PER_SEC);\
-       } while(0)
+       }
 #else
 
-#define BENCH(a)       (a)
+#define BENCH(a,name)  (a)
 
 #endif