Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/CMakeLists.txt5
-rw-r--r--source/blender/render/SConscript2
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h24
-rw-r--r--source/blender/render/extern/include/RE_render_ext.h5
-rw-r--r--source/blender/render/intern/include/render_types.h26
-rw-r--r--source/blender/render/intern/source/Makefile2
-rw-r--r--source/blender/render/intern/source/convertblender.c1088
-rw-r--r--source/blender/render/intern/source/envmap.c24
-rw-r--r--source/blender/render/intern/source/initrender.c4
-rw-r--r--source/blender/render/intern/source/occlusion.c17
-rw-r--r--source/blender/render/intern/source/pipeline.c239
-rw-r--r--source/blender/render/intern/source/rayshade.c14
-rw-r--r--source/blender/render/intern/source/raytrace.c2
-rw-r--r--source/blender/render/intern/source/rendercore.c28
-rw-r--r--source/blender/render/intern/source/renderdatabase.c4
-rw-r--r--source/blender/render/intern/source/shadbuf.c12
-rw-r--r--source/blender/render/intern/source/sss.c8
-rw-r--r--source/blender/render/intern/source/strand.c8
-rw-r--r--source/blender/render/intern/source/texture.c8
-rw-r--r--source/blender/render/intern/source/zbuf.c14
20 files changed, 746 insertions, 788 deletions
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt
index 0b659554d1a..5465600d22b 100644
--- a/source/blender/render/CMakeLists.txt
+++ b/source/blender/render/CMakeLists.txt
@@ -32,6 +32,11 @@ SET(INC
../quicktime ../include ../../kernel/gen_messaging ../yafray ../blenloader
)
+IF(NOT WITH_YAFRAY)
+ ADD_DEFINITIONS(-DDISABLE_YAFRAY)
+ENDIF(NOT WITH_YAFRAY)
+
+
IF(WITH_OPENEXR)
ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript
index 50c4b554193..c3fdc632ce4 100644
--- a/source/blender/render/SConscript
+++ b/source/blender/render/SConscript
@@ -28,4 +28,4 @@ if env['WITH_BF_OPENEXR']:
if env['OURPLATFORM']=='linux2':
cflags='-pthread'
-env.BlenderLib ( libname = 'blender_render', sources = sources, includes = Split(incs), defines=defs, libtype='core', priority=45, compileflags=cflags )
+env.BlenderLib ( libname = 'bf_render', sources = sources, includes = Split(incs), defines=defs, libtype='core', priority=145, compileflags=cflags )
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 60557403143..04f7d264229 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -124,10 +124,11 @@ typedef struct RenderResult {
typedef struct RenderStats {
+ int cfra;
int totface, totvert, totstrand, tothalo, totlamp, totpart;
short curfield, curblur, curpart, partsdone, convertdone;
double starttime, lastframetime;
- char *infostr;
+ char *infostr, scenename[32];
} RenderStats;
@@ -138,6 +139,9 @@ typedef struct RenderStats {
struct Render *RE_NewRender (const char *name);
struct Render *RE_GetRender(const char *name);
+/* returns 1 while render is working (or renders called from within render) */
+int RE_RenderInProgress(struct Render *re);
+
/* use free render as signal to do everything over (previews) */
void RE_FreeRender (struct Render *re);
/* only called on exit */
@@ -195,18 +199,17 @@ struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty)
void RE_MergeFullSample(struct Render *re, struct Scene *sce, struct bNodeTree *ntree);
/* ancient stars function... go away! */
-void RE_make_stars(struct Render *re, void (*initfunc)(void),
+void RE_make_stars(struct Render *re, struct Scene *scenev3d, void (*initfunc)(void),
void (*vertexfunc)(float*), void (*termfunc)(void));
/* display and event callbacks */
-void RE_display_init_cb (struct Render *re, void (*f)(RenderResult *rr));
-void RE_display_clear_cb(struct Render *re, void (*f)(RenderResult *rr));
-void RE_display_draw_cb (struct Render *re, void (*f)(RenderResult *rr, volatile struct rcti *rect));
-void RE_stats_draw_cb (struct Render *re, void (*f)(RenderStats *rs));
-void RE_timecursor_cb (struct Render *re, void (*f)(int));
-void RE_test_break_cb (struct Render *re, int (*f)(void));
-void RE_test_return_cb (struct Render *re, int (*f)(void));
-void RE_error_cb (struct Render *re, void (*f)(char *str));
+void RE_display_init_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
+void RE_display_clear_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr));
+void RE_display_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
+void RE_stats_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
+void RE_timecursor_cb (struct Render *re, void *handle, void (*f)(void *handle, int));
+void RE_test_break_cb (struct Render *re, void *handle, int (*f)(void *handle));
+void RE_error_cb (struct Render *re, void *handle, void (*f)(void *handle, char *str));
/* should move to kernel once... still unsure on how/where */
float RE_filter_value(int type, float x);
@@ -226,6 +229,7 @@ void RE_Database_Baking(struct Render *re, struct Scene *scene, int type, struct
void RE_DataBase_GetView(struct Render *re, float mat[][4]);
void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[][4]);
+struct Scene *RE_GetScene(struct Render *re);
#endif /* RE_PIPELINE_H */
diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h
index e61de5bc3e6..20eea0c98bd 100644
--- a/source/blender/render/extern/include/RE_render_ext.h
+++ b/source/blender/render/extern/include/RE_render_ext.h
@@ -35,7 +35,10 @@
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* called by meshtools */
-void RE_make_sticky(void);
+struct View3D;
+struct Scene;
+
+void RE_make_sticky(struct Scene *scene, struct View3D *v3d);
/* for radiosity module */
struct RadView;
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 1768b052b54..ab3758781ce 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -113,7 +113,7 @@ struct Render
char name[RE_MAXNAME];
/* state settings */
- short flag, osa, ok, do_gamma;
+ short flag, osa, ok, result_ok;
/* result of rendering */
RenderResult *result;
@@ -208,16 +208,23 @@ struct Render
struct MemArena *memArena;
/* callbacks */
- void (*display_init)(RenderResult *rr);
- void (*display_clear)(RenderResult *rr);
- void (*display_draw)(RenderResult *rr, volatile rcti *rect);
+ void (*display_init)(void *handle, RenderResult *rr);
+ void *dih;
+ void (*display_clear)(void *handle, RenderResult *rr);
+ void *dch;
+ void (*display_draw)(void *handle, RenderResult *rr, volatile rcti *rect);
+ void *ddh;
- void (*stats_draw)(RenderStats *ri);
- void (*timecursor)(int i);
+ void (*stats_draw)(void *handle, RenderStats *ri);
+ void *sdh;
+ void (*timecursor)(void *handle, int i);
+ void *tch;
- int (*test_break)(void);
- int (*test_return)(void);
- void (*error)(char *str);
+ int (*test_break)(void *handle);
+ void *tbh;
+
+ void (*error)(void *handle, char *str);
+ void *erh;
RenderStats i;
};
@@ -505,7 +512,6 @@ typedef struct LampRen {
#define R_LAMPHALO 8
#define R_GLOB_NOPUNOFLIP 16
#define R_NEED_TANGENT 32
-#define R_SKIP_MULTIRES 64
#define R_BAKE_TRACE 128
#define R_BAKING 256
diff --git a/source/blender/render/intern/source/Makefile b/source/blender/render/intern/source/Makefile
index a86da71e40d..eb12c7637f7 100644
--- a/source/blender/render/intern/source/Makefile
+++ b/source/blender/render/intern/source/Makefile
@@ -49,7 +49,7 @@ CPPFLAGS += -I../../../yafray
CPPFLAGS += -I../../../../kernel/gen_messaging
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
# not very neat: the rest of blender..
-CPPFLAGS += -I../../../include
+CPPFLAGS += -I../../../editors/include
CPPFLAGS += $(NAN_SDLCFLAGS)
ifeq ($(WITH_QUICKTIME), true)
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 4e4e27fe286..ce324239492 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -31,7 +31,6 @@
#include <string.h>
#include <limits.h>
-#include "blendef.h"
#include "MTC_matrixops.h"
#include "MEM_guardedalloc.h"
@@ -100,7 +99,6 @@
#include "IMB_imbuf_types.h"
#include "envmap.h"
-#include "multires.h"
#include "occlusion.h"
#include "render_types.h"
#include "rendercore.h"
@@ -164,7 +162,7 @@ static HaloRen *initstar(Render *re, ObjectRen *obr, float *vec, float hasize)
* differ in clarity/color
*/
-void RE_make_stars(Render *re, void (*initfunc)(void),
+void RE_make_stars(Render *re, Scene *scenev3d, void (*initfunc)(void),
void (*vertexfunc)(float*), void (*termfunc)(void))
{
extern unsigned char hash[512];
@@ -180,8 +178,8 @@ void RE_make_stars(Render *re, void (*initfunc)(void),
int x, y, z, sx, sy, sz, ex, ey, ez, done = 0;
if(initfunc) {
- scene= G.scene;
- wrld= G.scene->world;
+ scene= scenev3d;
+ wrld= scene->world;
}
else {
scene= re->scene;
@@ -871,7 +869,7 @@ static float *get_object_orco(Render *re, Object *ob)
if (!orco) {
if (ELEM(ob->type, OB_CURVE, OB_FONT)) {
- orco = make_orco_curve(ob);
+ orco = make_orco_curve(re->scene, ob);
} else if (ob->type==OB_SURF) {
orco = make_orco_surf(ob);
} else if (ob->type==OB_MBALL) {
@@ -947,14 +945,20 @@ static Material *give_render_material(Render *re, Object *ob, int nr)
/* ------------------------------------------------------------------------- */
/* Particles */
/* ------------------------------------------------------------------------- */
-
+typedef struct ParticleStrandData
+{
+ struct MCol *mcol;
+ float *orco, *uvco, *surfnor;
+ float time, adapt_angle, adapt_pix, size;
+ int totuv, totcol;
+ int first, line, adapt, override_uv;
+}
+ParticleStrandData;
/* future thread problem... */
-static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, float *orco, float *surfnor,
- float *uvco, int totuv, MCol *mcol, int totcol, float *vec, float *vec1, float ctime,
- int first, int line, int adapt, float adapt_angle, float adapt_pix, int override_uv)
+static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, ParticleStrandData *sd, float *vec, float *vec1)
{
static VertRen *v1= NULL, *v2= NULL;
- VlakRen *vlr;
+ VlakRen *vlr= NULL;
float nor[3], cross[3], crosslen, w, dx, dy, width;
static float anor[3], avec[3];
int flag, i;
@@ -974,11 +978,11 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, flo
float fac;
if(ma->strand_ease!=0.0f) {
if(ma->strand_ease<0.0f)
- fac= pow(ctime, 1.0+ma->strand_ease);
+ fac= pow(sd->time, 1.0+ma->strand_ease);
else
- fac= pow(ctime, 1.0/(1.0f-ma->strand_ease));
+ fac= pow(sd->time, 1.0/(1.0f-ma->strand_ease));
}
- else fac= ctime;
+ else fac= sd->time;
width= ((1.0f-fac)*ma->strand_sta + (fac)*ma->strand_end);
@@ -1010,7 +1014,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, flo
flag |= R_STRAND;
/* single face line */
- if(line) {
+ if(sd->line) {
vlr= RE_findOrAddVlak(obr, obr->totvlak++);
vlr->flag= flag;
vlr->v1= RE_findOrAddVert(obr, obr->totvert++);
@@ -1021,25 +1025,25 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, flo
VECCOPY(vlr->v1->co, vec);
VecAddf(vlr->v1->co, vlr->v1->co, cross);
VECCOPY(vlr->v1->n, nor);
- vlr->v1->orco= orco;
+ vlr->v1->orco= sd->orco;
vlr->v1->accum= -1.0f; // accum abuse for strand texco
VECCOPY(vlr->v2->co, vec);
VecSubf(vlr->v2->co, vlr->v2->co, cross);
VECCOPY(vlr->v2->n, nor);
- vlr->v2->orco= orco;
+ vlr->v2->orco= sd->orco;
vlr->v2->accum= vlr->v1->accum;
VECCOPY(vlr->v4->co, vec1);
VecAddf(vlr->v4->co, vlr->v4->co, cross);
VECCOPY(vlr->v4->n, nor);
- vlr->v4->orco= orco;
+ vlr->v4->orco= sd->orco;
vlr->v4->accum= 1.0f; // accum abuse for strand texco
VECCOPY(vlr->v3->co, vec1);
VecSubf(vlr->v3->co, vlr->v3->co, cross);
VECCOPY(vlr->v3->n, nor);
- vlr->v3->orco= orco;
+ vlr->v3->orco= sd->orco;
vlr->v3->accum= vlr->v4->accum;
CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
@@ -1047,23 +1051,23 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, flo
vlr->mat= ma;
vlr->ec= ME_V2V3;
- if(surfnor) {
+ if(sd->surfnor) {
float *snor= RE_vlakren_get_surfnor(obr, vlr, 1);
- VECCOPY(snor, surfnor);
+ VECCOPY(snor, sd->surfnor);
}
- if(uvco){
- for(i=0; i<totuv; i++){
+ if(sd->uvco){
+ for(i=0; i<sd->totuv; i++){
MTFace *mtf;
mtf=RE_vlakren_get_tface(obr,vlr,i,NULL,1);
mtf->uv[0][0]=mtf->uv[1][0]=
- mtf->uv[2][0]=mtf->uv[3][0]=(uvco+2*i)[0];
+ mtf->uv[2][0]=mtf->uv[3][0]=(sd->uvco+2*i)[0];
mtf->uv[0][1]=mtf->uv[1][1]=
- mtf->uv[2][1]=mtf->uv[3][1]=(uvco+2*i)[1];
+ mtf->uv[2][1]=mtf->uv[3][1]=(sd->uvco+2*i)[1];
}
- if(override_uv>=0){
+ if(sd->override_uv>=0){
MTFace *mtf;
- mtf=RE_vlakren_get_tface(obr,vlr,override_uv,NULL,0);
+ mtf=RE_vlakren_get_tface(obr,vlr,sd->override_uv,NULL,0);
mtf->uv[0][0]=mtf->uv[3][0]=0.0f;
mtf->uv[1][0]=mtf->uv[2][0]=1.0f;
@@ -1072,18 +1076,18 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, flo
mtf->uv[2][1]=mtf->uv[3][1]=1.0f;
}
}
- if(mcol){
- for(i=0; i<totcol; i++){
+ if(sd->mcol){
+ for(i=0; i<sd->totcol; i++){
MCol *mc;
mc=RE_vlakren_get_mcol(obr,vlr,i,NULL,1);
- mc[0]=mc[1]=mc[2]=mc[3]=mcol[i];
- mc[0]=mc[1]=mc[2]=mc[3]=mcol[i];
+ mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
+ mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
}
}
}
/* first two vertices of a strand */
- else if(first) {
- if(adapt){
+ else if(sd->first) {
+ if(sd->adapt){
VECCOPY(anor, nor);
VECCOPY(avec, vec);
second=1;
@@ -1095,18 +1099,18 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, flo
VECCOPY(v1->co, vec);
VecAddf(v1->co, v1->co, cross);
VECCOPY(v1->n, nor);
- v1->orco= orco;
+ v1->orco= sd->orco;
v1->accum= -1.0f; // accum abuse for strand texco
VECCOPY(v2->co, vec);
VecSubf(v2->co, v2->co, cross);
VECCOPY(v2->n, nor);
- v2->orco= orco;
+ v2->orco= sd->orco;
v2->accum= v1->accum;
}
/* more vertices & faces to strand */
else {
- if(adapt==0 || second){
+ if(sd->adapt==0 || second){
vlr= RE_findOrAddVlak(obr, obr->totvlak++);
vlr->flag= flag;
vlr->v1= v1;
@@ -1118,14 +1122,14 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, flo
v2= vlr->v3; // cycle
- if(adapt){
+ if(sd->adapt){
second=0;
VECCOPY(anor,nor);
VECCOPY(avec,vec);
}
}
- else if(adapt){
+ else if(sd->adapt){
float dvec[3],pvec[3];
VecSubf(dvec,avec,vec);
Projf(pvec,dvec,vec);
@@ -1135,7 +1139,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, flo
dx= re->winx*dvec[0]*re->winmat[0][0]/w;
dy= re->winy*dvec[1]*re->winmat[1][1]/w;
w= sqrt(dx*dx + dy*dy);
- if(Inpf(anor,nor)<adapt_angle && w>adapt_pix){
+ if(Inpf(anor,nor)<sd->adapt_angle && w>sd->adapt_pix){
vlr= RE_findOrAddVlak(obr, obr->totvlak++);
vlr->flag= flag;
vlr->v1= v1;
@@ -1157,13 +1161,13 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, flo
VECCOPY(vlr->v4->co, vec);
VecAddf(vlr->v4->co, vlr->v4->co, cross);
VECCOPY(vlr->v4->n, nor);
- vlr->v4->orco= orco;
- vlr->v4->accum= -1.0f + 2.0f*ctime; // accum abuse for strand texco
+ vlr->v4->orco= sd->orco;
+ vlr->v4->accum= -1.0f + 2.0f*sd->time; // accum abuse for strand texco
VECCOPY(vlr->v3->co, vec);
VecSubf(vlr->v3->co, vlr->v3->co, cross);
VECCOPY(vlr->v3->n, nor);
- vlr->v3->orco= orco;
+ vlr->v3->orco= sd->orco;
vlr->v3->accum= vlr->v4->accum;
CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
@@ -1171,23 +1175,23 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, flo
vlr->mat= ma;
vlr->ec= ME_V2V3;
- if(surfnor) {
+ if(sd->surfnor) {
float *snor= RE_vlakren_get_surfnor(obr, vlr, 1);
- VECCOPY(snor, surfnor);
+ VECCOPY(snor, sd->surfnor);
}
- if(uvco){
- for(i=0; i<totuv; i++){
+ if(sd->uvco){
+ for(i=0; i<sd->totuv; i++){
MTFace *mtf;
mtf=RE_vlakren_get_tface(obr,vlr,i,NULL,1);
mtf->uv[0][0]=mtf->uv[1][0]=
- mtf->uv[2][0]=mtf->uv[3][0]=(uvco+2*i)[0];
+ mtf->uv[2][0]=mtf->uv[3][0]=(sd->uvco+2*i)[0];
mtf->uv[0][1]=mtf->uv[1][1]=
- mtf->uv[2][1]=mtf->uv[3][1]=(uvco+2*i)[1];
+ mtf->uv[2][1]=mtf->uv[3][1]=(sd->uvco+2*i)[1];
}
- if(override_uv>=0){
+ if(sd->override_uv>=0){
MTFace *mtf;
- mtf=RE_vlakren_get_tface(obr,vlr,override_uv,NULL,0);
+ mtf=RE_vlakren_get_tface(obr,vlr,sd->override_uv,NULL,0);
mtf->uv[0][0]=mtf->uv[3][0]=0.0f;
mtf->uv[1][0]=mtf->uv[2][0]=1.0f;
@@ -1196,12 +1200,12 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, flo
mtf->uv[2][1]=mtf->uv[3][1]=(vlr->v3->accum+1.0f)/2.0f;
}
}
- if(mcol){
- for(i=0; i<totcol; i++){
+ if(sd->mcol){
+ for(i=0; i<sd->totcol; i++){
MCol *mc;
mc=RE_vlakren_get_mcol(obr,vlr,i,NULL,1);
- mc[0]=mc[1]=mc[2]=mc[3]=mcol[i];
- mc[0]=mc[1]=mc[2]=mc[3]=mcol[i];
+ mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
+ mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
}
}
}
@@ -1254,17 +1258,13 @@ static void static_particle_wire(ObjectRen *obr, Material *ma, float *vec, float
}
}
-static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Object *bb_ob, float *vec, float *vel, float size, float tilt, short align,
- int lock, int p, int totpart, short uv_split, short anim, short split_offset, float random, float pa_time, float offset[2], int uv[3])
+
+static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, ParticleBillboardData *bb)
{
VlakRen *vlr;
MTFace *mtf;
- float xvec[3]={1.0f,0.0f,0.0f}, yvec[3]={0.0f,1.0f,0.0f}, zvec[3];
- float onevec[3]={0.0f,0.0f,0.0f}, tvec[3],tvec2[3], bb_center[3];
- float uvx=0.0f, uvy=0.0f, uvdx=1.0f, uvdy=1.0f, time=0.0f;
-
- if(align<PART_BB_VIEW)
- onevec[align]=1.0f;
+ float xvec[3], yvec[3], zvec[3], bb_center[3];
+ float uvx = 0.0f, uvy = 0.0f, uvdx = 1.0f, uvdy = 1.0f, time = 0.0f;
vlr= RE_findOrAddVlak(obr, obr->totvlak++);
vlr->v1= RE_findOrAddVert(obr, obr->totvert++);
@@ -1272,74 +1272,23 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Object
vlr->v3= RE_findOrAddVert(obr, obr->totvert++);
vlr->v4= RE_findOrAddVert(obr, obr->totvert++);
- if(lock && align==PART_BB_VIEW){
- VECCOPY(xvec,bb_ob->obmat[0]);
- Normalize(xvec);
- VECCOPY(yvec,bb_ob->obmat[1]);
- Normalize(yvec);
- VECCOPY(zvec,bb_ob->obmat[2]);
- Normalize(zvec);
- }
- else if(align==PART_BB_VEL){
- float temp[3];
- VECCOPY(temp,vel);
- Normalize(temp);
- VECSUB(zvec,bb_ob->obmat[3],vec);
- if(lock){
- float fac=-Inpf(zvec,temp);
- VECADDFAC(zvec,zvec,temp,fac);
- }
- Normalize(zvec);
- Crossf(xvec,temp,zvec);
- Normalize(xvec);
- Crossf(yvec,zvec,xvec);
- }
- else{
- VECSUB(zvec,bb_ob->obmat[3],vec);
- if(lock)
- zvec[align]=0.0f;
- Normalize(zvec);
-
- if(align<PART_BB_VIEW)
- Crossf(xvec,onevec,zvec);
- else
- Crossf(xvec,bb_ob->obmat[1],zvec);
- Normalize(xvec);
- Crossf(yvec,zvec,xvec);
- }
-
- VECCOPY(tvec,xvec);
- VECCOPY(tvec2,yvec);
-
- VecMulf(xvec,cos(tilt*(float)M_PI));
- VecMulf(tvec2,sin(tilt*(float)M_PI));
- VECADD(xvec,xvec,tvec2);
-
- VecMulf(yvec,cos(tilt*(float)M_PI));
- VecMulf(tvec,-sin(tilt*(float)M_PI));
- VECADD(yvec,yvec,tvec);
-
- VecMulf(xvec,size);
- VecMulf(yvec,size);
+ psys_make_billboard(bb, xvec, yvec, zvec, bb_center);
- VECADDFAC(bb_center,vec,xvec,offset[0]);
- VECADDFAC(bb_center,bb_center,yvec,offset[1]);
+ VECADD(vlr->v1->co, bb_center, xvec);
+ VECADD(vlr->v1->co, vlr->v1->co, yvec);
+ MTC_Mat4MulVecfl(re->viewmat, vlr->v1->co);
- VECADD(vlr->v1->co,bb_center,xvec);
- VECADD(vlr->v1->co,vlr->v1->co,yvec);
- MTC_Mat4MulVecfl(re->viewmat,vlr->v1->co);
+ VECSUB(vlr->v2->co, bb_center, xvec);
+ VECADD(vlr->v2->co, vlr->v2->co, yvec);
+ MTC_Mat4MulVecfl(re->viewmat, vlr->v2->co);
- VECSUB(vlr->v2->co,bb_center,xvec);
- VECADD(vlr->v2->co,vlr->v2->co,yvec);
- MTC_Mat4MulVecfl(re->viewmat,vlr->v2->co);
+ VECSUB(vlr->v3->co, bb_center, xvec);
+ VECSUB(vlr->v3->co, vlr->v3->co, yvec);
+ MTC_Mat4MulVecfl(re->viewmat, vlr->v3->co);
- VECSUB(vlr->v3->co,bb_center,xvec);
- VECSUB(vlr->v3->co,vlr->v3->co,yvec);
- MTC_Mat4MulVecfl(re->viewmat,vlr->v3->co);
-
- VECADD(vlr->v4->co,bb_center,xvec);
- VECSUB(vlr->v4->co,vlr->v4->co,yvec);
- MTC_Mat4MulVecfl(re->viewmat,vlr->v4->co);
+ VECADD(vlr->v4->co, bb_center, xvec);
+ VECSUB(vlr->v4->co, vlr->v4->co, yvec);
+ MTC_Mat4MulVecfl(re->viewmat, vlr->v4->co);
CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
VECCOPY(vlr->v1->n,vlr->n);
@@ -1350,115 +1299,142 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Object
vlr->mat= ma;
vlr->ec= ME_V2V3;
- if(uv_split>1){
- uvdx=uvdy=1.0f/(float)uv_split;
- if(anim==PART_BB_ANIM_TIME){
- if(split_offset==PART_BB_OFF_NONE)
- time=pa_time;
- else if(split_offset==PART_BB_OFF_LINEAR)
- time=(float)fmod(pa_time+(float)p/(float)(uv_split*uv_split),1.0f);
+ if(bb->uv_split > 1){
+ uvdx = uvdy = 1.0f / (float)bb->uv_split;
+ if(bb->anim == PART_BB_ANIM_TIME) {
+ if(bb->split_offset == PART_BB_OFF_NONE)
+ time = bb->time;
+ else if(bb->split_offset == PART_BB_OFF_LINEAR)
+ time = (float)fmod(bb->time + (float)bb->num / (float)(bb->uv_split * bb->uv_split), 1.0f);
else /* split_offset==PART_BB_OFF_RANDOM */
- time=(float)fmod(pa_time+random,1.0f);
+ time = (float)fmod(bb->time + bb->random, 1.0f);
}
- else if(anim==PART_BB_ANIM_ANGLE){
- if(align==PART_BB_VIEW){
- time=(float)fmod((tilt+1.0f)/2.0f,1.0);
+ else if(bb->anim == PART_BB_ANIM_ANGLE) {
+ if(bb->align == PART_BB_VIEW) {
+ time = (float)fmod((bb->tilt + 1.0f) / 2.0f, 1.0);
}
else{
- float axis1[3]={0.0f,0.0f,0.0f};
- float axis2[3]={0.0f,0.0f,0.0f};
- axis1[(align+1)%3]=1.0f;
- axis2[(align+2)%3]=1.0f;
- if(lock==0){
- zvec[align]=0.0f;
+ float axis1[3] = {0.0f,0.0f,0.0f};
+ float axis2[3] = {0.0f,0.0f,0.0f};
+ axis1[(bb->align + 1) % 3] = 1.0f;
+ axis2[(bb->align + 2) % 3] = 1.0f;
+ if(bb->lock == 0) {
+ zvec[bb->align] = 0.0f;
Normalize(zvec);
}
- time=saacos(Inpf(zvec,axis1))/(float)M_PI;
- if(Inpf(zvec,axis2)<0.0f)
- time=1.0f-time/2.0f;
+ time = saacos(Inpf(zvec, axis1)) / (float)M_PI;
+ if(Inpf(zvec, axis2) < 0.0f)
+ time = 1.0f - time / 2.0f;
else
- time=time/2.0f;
+ time = time / 2.0f;
}
- if(split_offset==PART_BB_OFF_LINEAR)
- time=(float)fmod(pa_time+(float)p/(float)(uv_split*uv_split),1.0f);
- else if(split_offset==PART_BB_OFF_RANDOM)
- time=(float)fmod(pa_time+random,1.0f);
+ if(bb->split_offset == PART_BB_OFF_LINEAR)
+ time = (float)fmod(bb->time + (float)bb->num / (float)(bb->uv_split * bb->uv_split), 1.0f);
+ else if(bb->split_offset == PART_BB_OFF_RANDOM)
+ time = (float)fmod(bb->time + bb->random, 1.0f);
}
else{
- if(split_offset==PART_BB_OFF_NONE)
- time=0.0f;
- else if(split_offset==PART_BB_OFF_LINEAR)
- time=(float)fmod((float)p/(float)(uv_split*uv_split),1.0f);
+ if(bb->split_offset == PART_BB_OFF_NONE)
+ time = 0.0f;
+ else if(bb->split_offset == PART_BB_OFF_LINEAR)
+ time = (float)fmod((float)bb->num /(float)(bb->uv_split * bb->uv_split) , 1.0f);
else /* split_offset==PART_BB_OFF_RANDOM */
- time=random;
+ time = bb->random;
}
- uvx=uvdx*floor((float)(uv_split*uv_split)*(float)fmod((double)time,(double)uvdx));
- uvy=uvdy*floor((1.0f-time)*(float)uv_split);
- if(fmod(time,1.0f/uv_split)==0.0f)
- uvy-=uvdy;
+ uvx = uvdx * floor((float)(bb->uv_split * bb->uv_split) * (float)fmod((double)time, (double)uvdx));
+ uvy = uvdy * floor((1.0f - time) * (float)bb->uv_split);
+ if(fmod(time, 1.0f / bb->uv_split) == 0.0f)
+ uvy -= uvdy;
}
/* normal UVs */
- if(uv[0]>=0){
- mtf=RE_vlakren_get_tface(obr,vlr,uv[0],NULL,1);
- mtf->uv[0][0]=1.0f;
- mtf->uv[0][1]=1.0f;
- mtf->uv[1][0]=0.0f;
- mtf->uv[1][1]=1.0f;
- mtf->uv[2][0]=0.0f;
- mtf->uv[2][1]=0.0f;
- mtf->uv[3][0]=1.0f;
- mtf->uv[3][1]=0.0f;
+ if(bb->uv[0] >= 0){
+ mtf = RE_vlakren_get_tface(obr, vlr, bb->uv[0], NULL, 1);
+ mtf->uv[0][0] = 1.0f;
+ mtf->uv[0][1] = 1.0f;
+ mtf->uv[1][0] = 0.0f;
+ mtf->uv[1][1] = 1.0f;
+ mtf->uv[2][0] = 0.0f;
+ mtf->uv[2][1] = 0.0f;
+ mtf->uv[3][0] = 1.0f;
+ mtf->uv[3][1] = 0.0f;
}
/* time-index UVs */
- if(uv[1]>=0){
- mtf=RE_vlakren_get_tface(obr,vlr,uv[1],NULL,1);
- mtf->uv[0][0]=mtf->uv[1][0]=mtf->uv[2][0]=mtf->uv[3][0]=pa_time;
- mtf->uv[0][1]=mtf->uv[1][1]=mtf->uv[2][1]=mtf->uv[3][1]=(float)p/(float)totpart;
+ if(bb->uv[1] >= 0){
+ mtf = RE_vlakren_get_tface(obr, vlr, bb->uv[1], NULL, 1);
+ mtf->uv[0][0] = mtf->uv[1][0] = mtf->uv[2][0] = mtf->uv[3][0] = bb->time;
+ mtf->uv[0][1] = mtf->uv[1][1] = mtf->uv[2][1] = mtf->uv[3][1] = (float)bb->num/(float)bb->totnum;
}
/* split UVs */
- if(uv_split>1 && uv[2]>=0){
- mtf=RE_vlakren_get_tface(obr,vlr,uv[2],NULL,1);
- mtf->uv[0][0]=uvx+uvdx;
- mtf->uv[0][1]=uvy+uvdy;
- mtf->uv[1][0]=uvx;
- mtf->uv[1][1]=uvy+uvdy;
- mtf->uv[2][0]=uvx;
- mtf->uv[2][1]=uvy;
- mtf->uv[3][0]=uvx+uvdx;
- mtf->uv[3][1]=uvy;
+ if(bb->uv_split > 1 && bb->uv[2] >= 0){
+ mtf = RE_vlakren_get_tface(obr, vlr, bb->uv[2], NULL, 1);
+ mtf->uv[0][0] = uvx + uvdx;
+ mtf->uv[0][1] = uvy + uvdy;
+ mtf->uv[1][0] = uvx;
+ mtf->uv[1][1] = uvy + uvdy;
+ mtf->uv[2][0] = uvx;
+ mtf->uv[2][1] = uvy;
+ mtf->uv[3][0] = uvx + uvdx;
+ mtf->uv[3][1] = uvy;
}
}
-static void render_new_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, int path, int first, int line,
- float time, float *loc, float *loc1, float *orco, float *surfnor, int totuv, float *uvco,
- int totcol, MCol *mcol, float size, int seed, int override_uv,
- int adapt, float adapt_angle, float adapt_pix)
+static void render_new_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, ParticleStrandData *sd, float *loc, float *loc1, int seed)
{
HaloRen *har=0;
- if(path){
- if(ma->mode&MA_WIRE)
- static_particle_wire(obr, ma, loc, loc1, first, line);
- else if(ma->mode & MA_HALO){
- har= RE_inithalo_particle(re, obr, dm, ma, loc, loc1, orco, uvco, size, 1.0, seed);
- if(har) har->lay= obr->ob->lay;
+
+ if(ma->mode&MA_WIRE)
+ static_particle_wire(obr, ma, loc, loc1, sd->first, sd->line);
+ else if(ma->mode & MA_HALO){
+ har= RE_inithalo_particle(re, obr, dm, ma, loc, loc1, sd->orco, sd->uvco, sd->size, 1.0, seed);
+ if(har) har->lay= obr->ob->lay;
+ }
+ else
+ static_particle_strand(re, obr, ma, sd, loc, loc1);
+}
+static void get_particle_uvco_mcol(short from, DerivedMesh *dm, float *fuv, int num, ParticleStrandData *sd)
+{
+ int i;
+
+ /* get uvco */
+ if(sd->uvco && ELEM(from,PART_FROM_FACE,PART_FROM_VOLUME)) {
+ for(i=0; i<sd->totuv; i++) {
+ if(num != DMCACHE_NOTFOUND) {
+ MFace *mface = dm->getFaceData(dm, num, CD_MFACE);
+ MTFace *mtface = (MTFace*)CustomData_get_layer_n(&dm->faceData, CD_MTFACE, i);
+ mtface += num;
+
+ psys_interpolate_uvs(mtface, mface->v4, fuv, sd->uvco + 2 * i);
+ }
+ else {
+ sd->uvco[2*i] = 0.0f;
+ sd->uvco[2*i + 1] = 0.0f;
+ }
}
- else
- static_particle_strand(re, obr, ma, orco, surfnor, uvco, totuv, mcol, totcol, loc, loc1, time, first, line, adapt, adapt_angle, adapt_pix, override_uv);
}
- else{
- har= RE_inithalo_particle(re, obr, dm, ma, loc, NULL, orco, uvco, size, 0.0, seed);
- if(har) har->lay= obr->ob->lay;
+
+ /* get mcol */
+ if(sd->mcol && ELEM(from,PART_FROM_FACE,PART_FROM_VOLUME)) {
+ for(i=0; i<sd->totcol; i++) {
+ if(num != DMCACHE_NOTFOUND) {
+ MFace *mface = dm->getFaceData(dm, num, CD_MFACE);
+ MCol *mc = (MCol*)CustomData_get_layer_n(&dm->faceData, CD_MCOL, i);
+ mc += num * 4;
+
+ psys_interpolate_mcol(mc, mface->v4, fuv, sd->mcol + i);
+ }
+ else
+ memset(&sd->mcol[i], 0, sizeof(MCol));
+ }
}
}
static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem *psys, int timeoffset)
{
Object *ob= obr->ob;
- Object *tob=0, *bb_ob=re->scene->camera;
+ Object *tob=0;
Material *ma=0;
- MTFace *mtface;
ParticleSystemModifierData *psmd;
ParticleSystem *tpsys=0;
ParticleSettings *part, *tpart=0;
@@ -1466,19 +1442,20 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
ParticleKey *states=0;
ParticleKey state;
ParticleCacheKey *cache=0;
+ ParticleBillboardData bb;
+ ParticleStrandData sd;
StrandBuffer *strandbuf=0;
StrandVert *svert=0;
StrandBound *sbound= 0;
StrandRen *strand=0;
RNG *rng= 0;
- MCol *mcol= 0;
float loc[3],loc1[3],loc0[3],vel[3],mat[4][4],nmat[3][3],co[3],nor[3],time;
- float *orco=0,*surfnor=0,*uvco=0, strandlen=0.0f, curlen=0.0f;
- float hasize, pa_size, pa_time, r_tilt, cfra=bsystem_time(ob,(float)CFRA,0.0);
- float adapt_angle=0.0, adapt_pix=0.0, random, simplify[2];
- int i, a, k, max_k=0, totpart, totuv=0, totcol=0, override_uv=-1, dosimplify = 0, dosurfacecache = 0;
- int path_possible=0, keys_possible=0, baked_keys=0, totchild=0;
- int seed, path_nbr=0, path=0, orco1=0, adapt=0, uv[3]={0,0,0}, num;
+ float strandlen=0.0f, curlen=0.0f;
+ float hasize, pa_size, pa_time, r_tilt, cfra=bsystem_time(re->scene, ob, (float)re->scene->r.cfra, 0.0);
+ float random, simplify[2];
+ int i, a, k, max_k=0, totpart, dosimplify = 0, dosurfacecache = 0;
+ int totchild=0;
+ int seed, path_nbr=0, orco1=0, num;
int totface, *origindex = 0;
char **uv_name=0;
@@ -1505,6 +1482,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
return 1;
}
+ /* last possibility to bail out! */
psmd= psys_get_modifier(ob,psys);
if(!(psmd->modifier.mode & eModifierMode_Render))
return 0;
@@ -1513,182 +1491,187 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
totchild = (int)((float)totchild * (float)part->disp / 100.0f);
}
- psys->flag|=PSYS_DRAWING;
+ psys->flag |= PSYS_DRAWING;
rng= rng_new(psys->seed);
-
- ma= give_render_material(re, ob, part->omat);
- if(part->bb_ob)
- bb_ob=part->bb_ob;
+ totpart=psys->totpart;
+
+ memset(&sd, 0, sizeof(ParticleStrandData));
+ sd.override_uv = -1;
+
+/* 2.1 setup material stff */
+ ma= give_render_material(re, ob, part->omat);
+#if 0 // XXX old animation system
if(ma->ipo){
calc_ipo(ma->ipo, cfra);
execute_ipo((ID *)ma, ma->ipo);
}
+#endif // XXX old animation system
+
+ hasize = ma->hasize;
+ seed = ma->seed1;
+
+ re->flag |= R_HALO;
RE_set_customdata_names(obr, &psmd->dm->faceData);
- totuv=CustomData_number_of_layers(&psmd->dm->faceData,CD_MTFACE);
- totcol=CustomData_number_of_layers(&psmd->dm->faceData,CD_MCOL);
+ sd.totuv = CustomData_number_of_layers(&psmd->dm->faceData, CD_MTFACE);
+ sd.totcol = CustomData_number_of_layers(&psmd->dm->faceData, CD_MCOL);
- if(ma->texco & TEXCO_UV && totuv) {
- uvco = MEM_callocN(totuv*2*sizeof(float),"particle_uvs");
+ if(ma->texco & TEXCO_UV && sd.totuv) {
+ sd.uvco = MEM_callocN(sd.totuv * 2 * sizeof(float), "particle_uvs");
if(ma->strand_uvname[0]) {
- override_uv= CustomData_get_named_layer_index(&psmd->dm->faceData,CD_MTFACE,ma->strand_uvname);
- override_uv-= CustomData_get_layer_index(&psmd->dm->faceData,CD_MTFACE);
+ sd.override_uv = CustomData_get_named_layer_index(&psmd->dm->faceData, CD_MTFACE, ma->strand_uvname);
+ sd.override_uv -= CustomData_get_layer_index(&psmd->dm->faceData, CD_MTFACE);
}
}
+ else
+ sd.uvco = NULL;
- if(totcol)
- mcol = MEM_callocN(totcol*sizeof(MCol),"particle_mcols");
+ if(sd.totcol)
+ sd.mcol = MEM_callocN(sd.totcol * sizeof(MCol), "particle_mcols");
- if(part->draw_as==PART_DRAW_BB){
- int first_uv=CustomData_get_layer_index(&psmd->dm->faceData,CD_MTFACE);
+/* 2.2 setup billboards */
+ if(part->draw_as == PART_DRAW_BB) {
+ int first_uv = CustomData_get_layer_index(&psmd->dm->faceData, CD_MTFACE);
- uv[0]=CustomData_get_named_layer_index(&psmd->dm->faceData,CD_MTFACE,psys->bb_uvname[0]);
- if(uv[0]<0)
- uv[0]=CustomData_get_active_layer_index(&psmd->dm->faceData,CD_MTFACE);
+ bb.uv[0] = CustomData_get_named_layer_index(&psmd->dm->faceData, CD_MTFACE, psys->bb_uvname[0]);
+ if(bb.uv[0] < 0)
+ bb.uv[0] = CustomData_get_active_layer_index(&psmd->dm->faceData, CD_MTFACE);
- uv[1]=CustomData_get_named_layer_index(&psmd->dm->faceData,CD_MTFACE,psys->bb_uvname[1]);
- //if(uv[1]<0)
- // uv[1]=CustomData_get_active_layer_index(&psmd->dm->faceData,CD_MTFACE);
+ bb.uv[1] = CustomData_get_named_layer_index(&psmd->dm->faceData, CD_MTFACE, psys->bb_uvname[1]);
- uv[2]=CustomData_get_named_layer_index(&psmd->dm->faceData,CD_MTFACE,psys->bb_uvname[2]);
- //if(uv[2]<0)
- // uv[2]=CustomData_get_active_layer_index(&psmd->dm->faceData,CD_MTFACE);
+ bb.uv[2] = CustomData_get_named_layer_index(&psmd->dm->faceData, CD_MTFACE, psys->bb_uvname[2]);
- if(first_uv>=0){
- uv[0]-=first_uv;
- uv[1]-=first_uv;
- uv[2]-=first_uv;
+ if(first_uv >= 0) {
+ bb.uv[0] -= first_uv;
+ bb.uv[1] -= first_uv;
+ bb.uv[2] -= first_uv;
}
+
+ bb.align = part->bb_align;
+ bb.anim = part->bb_anim;
+ bb.lock = part->draw & PART_DRAW_BB_LOCK;
+ bb.ob = (part->bb_ob ? part->bb_ob : re->scene->camera);
+ bb.offset[0] = part->bb_offset[0];
+ bb.offset[1] = part->bb_offset[1];
+ bb.split_offset = part->bb_split_offset;
+ bb.totnum = totpart+totchild;
+ bb.uv_split = part->bb_uv_split;
}
- if(part->flag&PART_ABS_TIME && part->ipo){
+#if 0 // XXX old animation system
+/* 2.3 setup time */
+ if(part->flag&PART_ABS_TIME && part->ipo) {
calc_ipo(part->ipo, cfra);
execute_ipo((ID *)part, part->ipo);
}
+#endif // XXX old animation system
- if(part->flag&PART_GLOB_TIME)
- cfra=bsystem_time(0,(float)CFRA,0.0);
+ if(part->flag & PART_GLOB_TIME)
+ cfra = bsystem_time(re->scene, 0, (float)re->scene->r.cfra, 0.0);
- if(part->type==PART_REACTOR){
+/* 2.4 setup reactors */
+ if(part->type == PART_REACTOR){
psys_get_reactor_target(ob, psys, &tob, &tpsys);
if(tpsys && (part->from==PART_FROM_PARTICLE || part->phystype==PART_PHYS_NO)){
- psmd=psys_get_modifier(tob,tpsys);
- tpart=tpsys->part;
+ psmd = psys_get_modifier(tob,tpsys);
+ tpart = tpsys->part;
}
}
-
- hasize = ma->hasize;
- seed = ma->seed1;
-
- re->flag |= R_HALO;
+/* 2.5 setup matrices */
MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
MTC_Mat4Invert(ob->imat, mat); /* need to be that way, for imat texture */
Mat3CpyMat4(nmat, ob->imat);
Mat3Transp(nmat);
- totpart=psys->totpart;
-
- if(psys->pathcache){
- path_possible=1;
- keys_possible=1;
- }
- if(part->draw_as==PART_DRAW_PATH){
- if(path_possible){
- path_nbr=(int)pow(2.0,(double) part->ren_step);
- //if(part->phystype==PART_PHYS_KEYED && (psys->flag&PSYS_BAKED)==0)
- // path_nbr*=psys->totkeyed;
+/* 2.6 setup strand rendering */
+ if(part->draw_as == PART_DRAW_PATH && psys->pathcache){
+ path_nbr=(int)pow(2.0,(double) part->ren_step);
- if(path_nbr) {
- if((ma->mode & (MA_HALO|MA_WIRE))==0) {
- orco= MEM_mallocN(3*sizeof(float)*(totpart+totchild), "particle orcos");
- set_object_orco(re, psys, orco);
- }
- path=1;
+ if(path_nbr) {
+ if((ma->mode & (MA_HALO|MA_WIRE))==0) {
+ sd.orco = MEM_mallocN(3*sizeof(float)*(totpart+totchild), "particle orcos");
+ set_object_orco(re, psys, sd.orco);
}
+ }
- if(part->draw&PART_DRAW_REN_ADAPT) {
- adapt=1;
- adapt_pix=(float)part->adapt_pix;
- adapt_angle=cos((float)part->adapt_angle*(float)(M_PI/180.0));
- }
+ if(part->draw & PART_DRAW_REN_ADAPT) {
+ sd.adapt = 1;
+ sd.adapt_pix = (float)part->adapt_pix;
+ sd.adapt_angle = cos((float)part->adapt_angle * (float)(M_PI / 180.0));
+ }
- if(re->r.renderer==R_INTERN && part->draw&PART_DRAW_REN_STRAND) {
- strandbuf= RE_addStrandBuffer(obr, (totpart+totchild)*(path_nbr+1));
- strandbuf->ma= ma;
- strandbuf->lay= ob->lay;
- Mat4CpyMat4(strandbuf->winmat, re->winmat);
- strandbuf->winx= re->winx;
- strandbuf->winy= re->winy;
- strandbuf->maxdepth= 2;
- strandbuf->adaptcos= cos((float)part->adapt_angle*(float)(M_PI/180.0));
- strandbuf->overrideuv= override_uv;
- strandbuf->minwidth= ma->strand_min;
-
- if(ma->strand_widthfade == 0.0f)
- strandbuf->widthfade= 0.0f;
- else if(ma->strand_widthfade >= 1.0f)
- strandbuf->widthfade= 2.0f - ma->strand_widthfade;
- else
- strandbuf->widthfade= 1.0f/MAX2(ma->strand_widthfade, 1e-5f);
+ if(re->r.renderer==R_INTERN && part->draw&PART_DRAW_REN_STRAND) {
+ strandbuf= RE_addStrandBuffer(obr, (totpart+totchild)*(path_nbr+1));
+ strandbuf->ma= ma;
+ strandbuf->lay= ob->lay;
+ Mat4CpyMat4(strandbuf->winmat, re->winmat);
+ strandbuf->winx= re->winx;
+ strandbuf->winy= re->winy;
+ strandbuf->maxdepth= 2;
+ strandbuf->adaptcos= cos((float)part->adapt_angle*(float)(M_PI/180.0));
+ strandbuf->overrideuv= sd.override_uv;
+ strandbuf->minwidth= ma->strand_min;
+
+ if(ma->strand_widthfade == 0.0f)
+ strandbuf->widthfade= 0.0f;
+ else if(ma->strand_widthfade >= 1.0f)
+ strandbuf->widthfade= 2.0f - ma->strand_widthfade;
+ else
+ strandbuf->widthfade= 1.0f/MAX2(ma->strand_widthfade, 1e-5f);
- if(part->flag & PART_HAIR_BSPLINE)
- strandbuf->flag |= R_STRAND_BSPLINE;
- if(ma->mode & MA_STR_B_UNITS)
- strandbuf->flag |= R_STRAND_B_UNITS;
+ if(part->flag & PART_HAIR_BSPLINE)
+ strandbuf->flag |= R_STRAND_BSPLINE;
+ if(ma->mode & MA_STR_B_UNITS)
+ strandbuf->flag |= R_STRAND_B_UNITS;
- svert= strandbuf->vert;
+ svert= strandbuf->vert;
- if(re->r.mode & R_SPEED)
+ if(re->r.mode & R_SPEED)
+ dosurfacecache= 1;
+ else if((re->wrld.mode & WO_AMB_OCC) && (re->wrld.ao_gather_method == WO_AOGATHER_APPROX))
+ if(ma->amb != 0.0f)
dosurfacecache= 1;
- else if((re->wrld.mode & WO_AMB_OCC) && (re->wrld.ao_gather_method == WO_AOGATHER_APPROX))
- if(ma->amb != 0.0f)
- dosurfacecache= 1;
-
- totface= psmd->dm->getNumFaces(psmd->dm);
- origindex= psmd->dm->getFaceDataArray(psmd->dm, CD_ORIGINDEX);
- if(origindex) {
- for(a=0; a<totface; a++)
- strandbuf->totbound= MAX2(strandbuf->totbound, origindex[a]);
- strandbuf->totbound++;
- }
+
+ totface= psmd->dm->getNumFaces(psmd->dm);
+ origindex= psmd->dm->getFaceDataArray(psmd->dm, CD_ORIGINDEX);
+ if(origindex) {
+ for(a=0; a<totface; a++)
+ strandbuf->totbound= MAX2(strandbuf->totbound, origindex[a]);
strandbuf->totbound++;
- strandbuf->bound= MEM_callocN(sizeof(StrandBound)*strandbuf->totbound, "StrandBound");
- sbound= strandbuf->bound;
- sbound->start= sbound->end= 0;
}
+ strandbuf->totbound++;
+ strandbuf->bound= MEM_callocN(sizeof(StrandBound)*strandbuf->totbound, "StrandBound");
+ sbound= strandbuf->bound;
+ sbound->start= sbound->end= 0;
}
}
- else if(keys_possible && part->draw&PART_DRAW_KEYS){
- path_nbr=part->keys_step;
- if(path_nbr==0)
- baked_keys=1;
- }
- if(orco==0){
- orco=MEM_mallocN(3*sizeof(float),"particle orco");
- orco1=1;
+ if(sd.orco == 0) {
+ sd.orco = MEM_mallocN(3 * sizeof(float), "particle orco");
+ orco1 = 1;
}
- if(path_nbr==0)
- psys->lattice=psys_get_lattice(ob,psys);
+ if(path_nbr == 0)
+ psys->lattice = psys_get_lattice(re->scene, ob, psys);
/* 3. start creating renderable things */
for(a=0,pa=pars; a<totpart+totchild; a++, pa++, seed++) {
random = rng_getFloat(rng);
-
+ /* setup per particle individual stuff */
if(a<totpart){
if(pa->flag & PARS_UNEXIST) continue;
pa_time=(cfra-pa->time)/pa->lifetime;
- if((part->flag&PART_ABS_TIME)==0){
- if(ma->ipo){
+ if((part->flag&PART_ABS_TIME) == 0){
+#if 0 // XXX old animation system
+ if(ma->ipo) {
/* correction for lifetime */
- calc_ipo(ma->ipo, 100.0f*pa_time);
+ calc_ipo(ma->ipo, 100.0f * pa_time);
execute_ipo((ID *)ma, ma->ipo);
}
if(part->ipo){
@@ -1696,6 +1679,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
calc_ipo(part->ipo, 100.0f*pa_time);
execute_ipo((ID *)part, part->ipo);
}
+#endif // XXX old animation system
}
hasize = ma->hasize;
@@ -1703,51 +1687,25 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
/* get orco */
if(tpsys && (part->from==PART_FROM_PARTICLE || part->phystype==PART_PHYS_NO)){
tpa=tpsys->particles+pa->num;
- psys_particle_on_emitter(psmd,tpart->from,tpa->num,pa->num_dmcache,tpa->fuv,tpa->foffset,co,nor,0,0,orco,0);
+ psys_particle_on_emitter(psmd,tpart->from,tpa->num,pa->num_dmcache,tpa->fuv,tpa->foffset,co,nor,0,0,sd.orco,0);
}
else
- psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,nor,0,0,orco,0);
+ psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,nor,0,0,sd.orco,0);
+ /* get uvco & mcol */
num= pa->num_dmcache;
if(num == DMCACHE_NOTFOUND)
if(pa->num < psmd->dm->getNumFaces(psmd->dm))
num= pa->num;
- if(uvco && ELEM(part->from,PART_FROM_FACE,PART_FROM_VOLUME)){
- for(i=0; i<totuv; i++){
- if(num != DMCACHE_NOTFOUND) {
- MFace *mface=psmd->dm->getFaceData(psmd->dm,num,CD_MFACE);
- mtface=(MTFace*)CustomData_get_layer_n(&psmd->dm->faceData,CD_MTFACE,i);
- mtface+=num;
-
- psys_interpolate_uvs(mtface,mface->v4,pa->fuv,uvco+2*i);
- }
- else {
- uvco[2*i]= 0.0f;
- uvco[2*i + 1]= 0.0f;
- }
- }
- }
- if(mcol && ELEM(part->from,PART_FROM_FACE,PART_FROM_VOLUME)){
- for(i=0; i<totcol; i++){
- if(num != DMCACHE_NOTFOUND) {
- MFace *mface=psmd->dm->getFaceData(psmd->dm,num,CD_MFACE);
- MCol *mc=(MCol*)CustomData_get_layer_n(&psmd->dm->faceData,CD_MCOL,i);
- mc+=num*4;
-
- psys_interpolate_mcol(mc,mface->v4,pa->fuv,mcol+i);
- }
- else
- memset(&mcol[i], 0, sizeof(MCol));
- }
- }
+ get_particle_uvco_mcol(part->from, psmd->dm, pa->fuv, num, &sd);
- pa_size=pa->size;
+ pa_size = pa->size;
- r_tilt=1.0f+pa->r_ave[0];
+ r_tilt = 1.0f + pa->r_ave[0];
- if(path_nbr){
+ if(path_nbr) {
cache = psys->pathcache[a];
max_k = (int)cache->steps;
}
@@ -1756,123 +1714,69 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
}
else {
ChildParticle *cpa= psys->child+a-totpart;
+
+ if(path_nbr) {
+ cache = psys->childcache[a-totpart];
+
+ if(cache->steps < 0)
+ continue;
+
+ max_k = (int)cache->steps;
+ }
- pa_time=psys_get_child_time(psys, cpa, cfra);
+ pa_time = psys_get_child_time(psys, cpa, cfra);
- if((part->flag&PART_ABS_TIME)==0){
+ if((part->flag & PART_ABS_TIME) == 0) {
+#if 0 // XXX old animation system
if(ma->ipo){
/* correction for lifetime */
- calc_ipo(ma->ipo, 100.0f*pa_time);
+ calc_ipo(ma->ipo, 100.0f * pa_time);
execute_ipo((ID *)ma, ma->ipo);
}
- if(part->ipo){
+ if(part->ipo) {
/* correction for lifetime */
- calc_ipo(part->ipo, 100.0f*pa_time);
+ calc_ipo(part->ipo, 100.0f * pa_time);
execute_ipo((ID *)part, part->ipo);
}
+#endif // XXX old animation system
}
- pa_size=psys_get_child_size(psys, cpa, cfra, &pa_time);
+ pa_size = psys_get_child_size(psys, cpa, cfra, &pa_time);
- r_tilt=2.0f*cpa->rand[2];
+ r_tilt = 2.0f * cpa->rand[2];
- num= cpa->num;
+ num = cpa->num;
/* get orco */
if(part->childtype == PART_CHILD_FACES) {
psys_particle_on_emitter(psmd,
PART_FROM_FACE, cpa->num,DMCACHE_ISCHILD,
- cpa->fuv,cpa->foffset,co,nor,0,0,orco,0);
+ cpa->fuv,cpa->foffset,co,nor,0,0,sd.orco,0);
}
else {
ParticleData *par = psys->particles + cpa->parent;
psys_particle_on_emitter(psmd, part->from,
par->num,DMCACHE_ISCHILD,par->fuv,
- par->foffset,co,nor,0,0,orco,0);
- }
-
- if(uvco){
- if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
- for(i=0; i<totuv; i++){
- if(part->childtype==PART_CHILD_FACES){
- MFace *mface=psmd->dm->getFaceData(psmd->dm,cpa->num,CD_MFACE);
-
- mtface=(MTFace*)CustomData_get_layer_n(&psmd->dm->faceData,CD_MTFACE,i);
- mtface+=cpa->num;
-
- psys_interpolate_uvs(mtface,mface->v4,cpa->fuv,uvco+2*i);
- }
- else{
- uvco[2*i]=uvco[2*i+1]=0.0f;
- }
- }
- }
- else if(ELEM(part->from,PART_FROM_FACE,PART_FROM_VOLUME)){
- ParticleData *parent = psys->particles + cpa->parent;
- num= parent->num_dmcache;
-
- if(num == DMCACHE_NOTFOUND)
- if(parent->num < psmd->dm->getNumFaces(psmd->dm))
- num= parent->num;
-
- for(i=0; i<totuv; i++) {
- if(num != DMCACHE_NOTFOUND) {
- MFace *mface=psmd->dm->getFaceData(psmd->dm,num,CD_MFACE);
- mtface=(MTFace*)CustomData_get_layer_n(&psmd->dm->faceData,CD_MTFACE,i);
- mtface+=num;
- psys_interpolate_uvs(mtface,mface->v4,parent->fuv,uvco+2*i);
- }
- else {
- uvco[2*i]= 0.0f;
- uvco[2*i + 1]= 0.0f;
- }
- }
- }
+ par->foffset,co,nor,0,0,sd.orco,0);
}
- if(mcol){
- if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
- for(i=0; i<totcol; i++){
- if(part->childtype==PART_CHILD_FACES){
- MFace *mface=psmd->dm->getFaceData(psmd->dm,cpa->num,CD_MFACE);
- MCol *mc=(MCol*)CustomData_get_layer_n(&psmd->dm->faceData,CD_MCOL,i);
- mc+=cpa->num*4;
-
- psys_interpolate_mcol(mc,mface->v4,cpa->fuv,mcol+i);
- }
- else
- memset(&mcol[i], 0, sizeof(MCol));
- }
- }
- else if(ELEM(part->from,PART_FROM_FACE,PART_FROM_VOLUME)){
- ParticleData *parent = psys->particles + cpa->parent;
- num= parent->num_dmcache;
-
- if(num == DMCACHE_NOTFOUND)
- if(parent->num < psmd->dm->getNumFaces(psmd->dm))
- num= parent->num;
-
- for(i=0; i<totcol; i++){
- if(num != DMCACHE_NOTFOUND) {
- MFace *mface=psmd->dm->getFaceData(psmd->dm,num,CD_MFACE);
- MCol *mc=(MCol*)CustomData_get_layer_n(&psmd->dm->faceData,CD_MCOL,i);
- mc+=num*4;
-
- psys_interpolate_mcol(mc,mface->v4,parent->fuv,mcol+i);
- }
- else
- memset(&mcol[i], 0, sizeof(MCol));
- }
- }
+ /* get uvco & mcol */
+ if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES) {
+ get_particle_uvco_mcol(PART_FROM_FACE, psmd->dm, cpa->fuv, cpa->num, &sd);
}
+ else {
+ ParticleData *parent = psys->particles + cpa->parent;
+ num = parent->num_dmcache;
- dosimplify= psys_render_simplify_params(psys, cpa, simplify);
+ if(num == DMCACHE_NOTFOUND)
+ if(parent->num < psmd->dm->getNumFaces(psmd->dm))
+ num = parent->num;
- if(path_nbr && psys->childcache) {
- cache = psys->childcache[a-totpart];
- max_k = (int)cache->steps;
+ get_particle_uvco_mcol(part->from, psmd->dm, pa->fuv, num, &sd);
}
+ dosimplify = psys_render_simplify_params(psys, cpa, simplify);
+
if(strandbuf) {
if(origindex[cpa->num]+1 > sbound - strandbuf->bound) {
sbound= strandbuf->bound + origindex[cpa->num]+1;
@@ -1884,17 +1788,17 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
/* surface normal shading setup */
if(ma->mode_l & MA_STR_SURFDIFF) {
Mat3MulVecfl(nmat, nor);
- surfnor= nor;
+ sd.surfnor= nor;
}
else
- surfnor= NULL;
+ sd.surfnor= NULL;
/* strand render setup */
if(strandbuf) {
strand= RE_findOrAddStrand(obr, obr->totstrand++);
strand->buffer= strandbuf;
strand->vert= svert;
- VECCOPY(strand->orco, orco);
+ VECCOPY(strand->orco, sd.orco);
if(dosimplify) {
float *ssimplify= RE_strandren_get_simplify(obr, strand, 1);
@@ -1902,9 +1806,9 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
ssimplify[1]= simplify[1];
}
- if(surfnor) {
+ if(sd.surfnor) {
float *snor= RE_strandren_get_surfnor(obr, strand, 1);
- VECCOPY(snor, surfnor);
+ VECCOPY(snor, sd.surfnor);
}
if(dosurfacecache && num >= 0) {
@@ -1912,20 +1816,20 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
*facenum= num;
}
- if(uvco) {
- for(i=0; i<totuv; i++) {
- if(i != override_uv) {
+ if(sd.uvco) {
+ for(i=0; i<sd.totuv; i++) {
+ if(i != sd.override_uv) {
float *uv= RE_strandren_get_uv(obr, strand, i, NULL, 1);
- uv[0]= uvco[2*i];
- uv[1]= uvco[2*i+1];
+ uv[0]= sd.uvco[2*i];
+ uv[1]= sd.uvco[2*i+1];
}
}
}
- if(mcol) {
- for(i=0; i<totcol; i++) {
+ if(sd.mcol) {
+ for(i=0; i<sd.totcol; i++) {
MCol *mc= RE_strandren_get_mcol(obr, strand, i, NULL, 1);
- *mc = mcol[i];
+ *mc = sd.mcol[i];
}
}
@@ -1941,11 +1845,10 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
strandlen += VecLenf((cache+k-1)->co, (cache+k)->co);
}
- for(k=0; k<=path_nbr; k++){
- if(path_nbr){
+ if(path_nbr) {
+ /* render strands */
+ for(k=0; k<=path_nbr; k++){
if(k<=max_k){
- //bti->convert_bake_key(bsys,cache+k,0,(void*)&state);
- //copy_particle_key(&state,cache+k,0);
VECCOPY(state.co,(cache+k)->co);
VECCOPY(state.vel,(cache+k)->vel);
}
@@ -1955,67 +1858,97 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(k > 0)
curlen += VecLenf((cache+k-1)->co, (cache+k)->co);
time= curlen/strandlen;
- }
- else{
- time=0.0f;
- state.time=cfra;
- if(psys_get_particle_state(ob,psys,a,&state,0)==0)
- continue;
+
+ VECCOPY(loc,state.co);
+ MTC_Mat4MulVecfl(re->viewmat,loc);
+
+ if(strandbuf) {
+ VECCOPY(svert->co, loc);
+ svert->strandco= -1.0f + 2.0f*time;
+ svert++;
+ strand->totvert++;
+ }
+ else{
+ sd.first = 0;
+ sd.time = time;
+ sd.size = hasize;
+
+ if(k==1){
+ sd.first = 1;
+ sd.time = 0.0f;
+ VECSUB(loc0,loc1,loc);
+ VECADD(loc0,loc1,loc0);
+ }
+
+ if(k)
+ render_new_particle(re, obr, psmd->dm, ma, &sd, loc, loc1, seed);
+
+ VECCOPY(loc1,loc);
+ }
}
+ }
+ else {
+ /* render normal particles */
+ time=0.0f;
+ state.time=cfra;
+ if(psys_get_particle_state(re->scene,ob,psys,a,&state,0)==0)
+ continue;
+
VECCOPY(loc,state.co);
if(part->draw_as!=PART_DRAW_BB)
MTC_Mat4MulVecfl(re->viewmat,loc);
- if(part->draw_as==PART_DRAW_LINE) {
- VECCOPY(vel,state.vel);
- //VECADD(vel,vel,state.co);
- MTC_Mat4Mul3Vecfl(re->viewmat,vel);
- //VECSUB(vel,vel,loc);
- Normalize(vel);
- if(part->draw & PART_DRAW_VEL_LENGTH)
- VecMulf(vel,VecLength(state.vel));
- VECADDFAC(loc0,loc,vel,-part->draw_line[0]);
- VECADDFAC(loc1,loc,vel,part->draw_line[1]);
-
- render_new_particle(re,obr,psmd->dm,ma,1,0,1,0.0f,loc0,loc1,
- orco,surfnor,totuv,uvco,totcol,mcol,hasize,seed,override_uv,0,0,0);
- }
- else if(part->draw_as==PART_DRAW_BB) {
- VECCOPY(vel,state.vel);
- //MTC_Mat4Mul3Vecfl(re->viewmat,vel);
- particle_billboard(re,obr,ma,bb_ob,loc,vel,pa_size,part->bb_tilt*(1.0f-part->bb_rand_tilt*r_tilt),
- part->bb_align,part->draw&PART_DRAW_BB_LOCK,
- a,totpart+totchild,part->bb_uv_split,part->bb_anim,part->bb_split_offset,random,pa_time,part->bb_offset,uv);
- }
- else if(strandbuf) {
- VECCOPY(svert->co, loc);
- svert->strandco= -1.0f + 2.0f*time;
- svert++;
- strand->totvert++;
- }
- else{
- if(k==1){
- VECSUB(loc0,loc1,loc);
- VECADD(loc0,loc1,loc0);
- render_new_particle(re,obr,psmd->dm,ma,path,1,0,0.0f,loc1,loc0,
- orco,surfnor,totuv,uvco,totcol,mcol,hasize,seed,override_uv,
- adapt,adapt_angle,adapt_pix);
- }
+ switch(part->draw_as) {
+ case PART_DRAW_LINE:
+ sd.line = 1;
+ sd.time = 0.0f;
+ sd.size = hasize;
+
+ VECCOPY(vel,state.vel);
+ MTC_Mat4Mul3Vecfl(re->viewmat,vel);
+ Normalize(vel);
+
+ if(part->draw & PART_DRAW_VEL_LENGTH)
+ VecMulf(vel,VecLength(state.vel));
+
+ VECADDFAC(loc0,loc,vel,-part->draw_line[0]);
+ VECADDFAC(loc1,loc,vel,part->draw_line[1]);
+
+ render_new_particle(re,obr,psmd->dm,ma,&sd,loc0,loc1,seed);
+
+ break;
+
+ case PART_DRAW_BB:
+ bb.random = random;
+ bb.size = pa_size;
+ bb.tilt = part->bb_tilt * (1.0f - part->bb_rand_tilt * r_tilt);
+ bb.time = pa_time;
+ bb.num = a;
+ VECCOPY(bb.vec, loc);
+ VECCOPY(bb.vel, state.vel);
+
+ particle_billboard(re, obr, ma, &bb);
- if(path_nbr==0 || k)
- render_new_particle(re,obr,psmd->dm,ma,path,0,0,time,loc,loc1,
- orco,surfnor,totuv,uvco,totcol,mcol,hasize,seed,override_uv,
- adapt,adapt_angle,adapt_pix);
+ break;
- VECCOPY(loc1,loc);
+ default:
+ {
+ HaloRen *har=0;
+
+ har = RE_inithalo_particle(re, obr, psmd->dm, ma, loc, NULL, sd.orco, sd.uvco, hasize, 0.0, seed);
+
+ if(har) har->lay= obr->ob->lay;
+
+ break;
+ }
}
}
if(orco1==0)
- orco+=3;
+ sd.orco+=3;
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
@@ -2023,16 +1956,18 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
strandbuf->surface= cache_strand_surface(re, obr, psmd->dm, mat, timeoffset);
/* 4. clean up */
- if(ma) do_mat_ipo(ma);
-
+#if 0 // XXX old animation system
+ if(ma) do_mat_ipo(re->scene, ma);
+#endif // XXX old animation system
+
if(orco1)
- MEM_freeN(orco);
+ MEM_freeN(sd.orco);
- if(uvco)
- MEM_freeN(uvco);
+ if(sd.uvco)
+ MEM_freeN(sd.uvco);
- if(mcol)
- MEM_freeN(mcol);
+ if(sd.mcol)
+ MEM_freeN(sd.mcol);
if(uv_name)
MEM_freeN(uv_name);
@@ -2045,11 +1980,11 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
psys->flag &= ~PSYS_DRAWING;
if(psys->lattice){
- end_latt_deform();
- psys->lattice=0;
+ end_latt_deform(psys->lattice);
+ psys->lattice= NULL;
}
- if(path && (ma->mode_l & MA_TANGENT_STR)==0)
+ if(path_nbr && (ma->mode_l & MA_TANGENT_STR)==0)
calc_vertexnormals(re, obr, 0, 0);
return 1;
@@ -2349,7 +2284,7 @@ static void init_render_mball(Render *re, ObjectRen *obr)
float *data, *nors, *orco, mat[4][4], imat[3][3], xn, yn, zn;
int a, need_orco, vlakindex, *index;
- if (ob!=find_basis_mball(ob))
+ if (ob!=find_basis_mball(re->scene, ob))
return;
MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
@@ -2363,7 +2298,7 @@ static void init_render_mball(Render *re, ObjectRen *obr)
need_orco= 1;
}
- makeDispListMBall(ob);
+ makeDispListMBall(re->scene, ob);
dl= ob->disp.first;
if(dl==0) return;
@@ -2635,7 +2570,7 @@ static void init_render_surf(Render *re, ObjectRen *obr)
if(need_orco) orcobase= orco= get_object_orco(re, ob);
displist.first= displist.last= 0;
- makeDispListSurf(ob, &displist, 1);
+ makeDispListSurf(re->scene, ob, &displist, 1);
dl= displist.first;
/* walk along displaylist and create rendervertices/-faces */
@@ -2675,7 +2610,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
/* test displist */
if(cu->disp.first==NULL)
- makeDispListCurveTypes(ob, 0);
+ makeDispListCurveTypes(re->scene, ob, 0);
dl= cu->disp.first;
if(cu->disp.first==NULL) return;
@@ -3078,14 +3013,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
if(need_orco)
mask |= CD_MASK_ORCO;
- if(me->mr) {
- if(re->flag & R_SKIP_MULTIRES)
- me->mr->flag |= MULTIRES_NO_RENDER;
- else
- me->mr->flag &= ~MULTIRES_NO_RENDER;
- }
-
- dm= mesh_create_derived_render(ob, mask);
+ dm= mesh_create_derived_render(re->scene, ob, mask);
if(dm==NULL) return; /* in case duplicated object fails? */
if(mask & CD_MASK_ORCO) {
@@ -4234,7 +4162,7 @@ static void init_render_object_data(Render *re, ObjectRen *obr, int timeoffset)
/* the emitter mesh wasn't rendered so the modifier stack wasn't
* evaluated with render settings */
DerivedMesh *dm;
- dm = mesh_create_derived_render(ob, CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL);
+ dm = mesh_create_derived_render(re->scene, ob, CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL);
dm->release(dm);
}
@@ -4356,7 +4284,7 @@ static void init_render_object(Render *re, Object *ob, Object *par, DupliObject
re->i.totstrand= re->totstrand;
re->i.tothalo= re->tothalo;
re->i.totlamp= re->totlamp;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
}
ob->flag |= OB_DONE;
@@ -4446,24 +4374,8 @@ void RE_Database_Free(Render *re)
static int allow_render_object(Object *ob, int nolamps, int onlyselected, Object *actob)
{
/* override not showing object when duplis are used with particles */
- if(ob->transflag & OB_DUPLIPARTS){
- int allow= 0;
-
- if(ob->particlesystem.first) {
- ParticleSystem *psys;
- ParticleSettings *part;
-
- for(psys=ob->particlesystem.first; psys; psys=psys->next){
- part=psys->part;
-
- if(part->draw & PART_DRAW_EMITTER)
- allow= 1;
- }
- }
-
- if(!allow)
- return 0;
- }
+ if(ob->transflag & OB_DUPLIPARTS)
+ ; /* let particle system(s) handle showing vs. not showing */
else if((ob->transflag & OB_DUPLI) && !(ob->transflag & OB_DUPLIFRAMES))
return 0;
@@ -4530,7 +4442,7 @@ static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, in
/* this is to make sure we get render level duplis in groups:
* the derivedmesh must be created before init_render_mesh,
* since object_duplilist does dupliparticles before that */
- dm = mesh_create_derived_render(ob, CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL);
+ dm = mesh_create_derived_render(re->scene, ob, CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL);
dm->release(dm);
for(psys=ob->particlesystem.first; psys; psys=psys->next)
@@ -4726,7 +4638,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
else
init_render_object(re, obd, ob, dob, timeoffset, vectorlay);
- if(re->test_break()) break;
+ if(re->test_break(re->tbh)) break;
}
free_object_duplilist(lb);
@@ -4737,7 +4649,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
init_render_object(re, ob, NULL, 0, timeoffset, vectorlay);
}
- if(re->test_break()) break;
+ if(re->test_break(re->tbh)) break;
}
/* objects in groups with OB_RENDER_DUPLI set still need to be created,
@@ -4754,7 +4666,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
}
}
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
RE_makeRenderInstances(re);
}
@@ -4770,7 +4682,9 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
/* per second, per object, stats print this */
re->i.infostr= "Preparing Scene data";
-
+ re->i.cfra= scene->r.cfra;
+ strncpy(re->i.scenename, scene->id.name+2, 20);
+
/* XXX add test if dbase was filled already? */
re->memArena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
@@ -4814,7 +4728,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
/* MAKE RENDER DATA */
database_init_objects(re, lay, 0, 0, 0, 0);
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
int tothalo;
set_material_lightgroups(re);
@@ -4829,17 +4743,17 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
re->i.totstrand= re->totstrand;
re->i.tothalo= re->tothalo;
re->i.totlamp= re->totlamp;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
/* don't sort stars */
tothalo= re->tothalo;
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
if(re->wrld.mode & WO_STARS)
- RE_make_stars(re, NULL, NULL, NULL);
+ RE_make_stars(re, NULL, NULL, NULL, NULL);
sort_halos(re, tothalo);
re->i.infostr= "Creating Shadowbuffers";
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
/* SHADOW BUFFER */
threaded_makeshadowbufs(re);
@@ -4848,43 +4762,43 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
/* although radio mode could be useful at some point, later */
if (re->r.renderer==R_INTERN) {
/* RADIO (uses no R anymore) */
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
if(re->r.mode & R_RADIO) do_radio_render(re);
/* raytree */
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
if(re->r.mode & R_RAYTRACE) {
makeraytree(re);
}
}
/* ENVIRONMENT MAPS */
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
make_envmaps(re);
}
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
project_renderdata(re, projectverto, re->r.mode & R_PANORAMA, 0, 1);
/* Occlusion */
- if((re->wrld.mode & WO_AMB_OCC) && !re->test_break())
+ if((re->wrld.mode & WO_AMB_OCC) && !re->test_break(re->tbh))
if(re->wrld.ao_gather_method == WO_AOGATHER_APPROX)
if(re->r.renderer==R_INTERN)
if(re->r.mode & R_SHADOW)
make_occ_tree(re);
/* SSS */
- if((re->r.mode & R_SSS) && !re->test_break())
+ if((re->r.mode & R_SSS) && !re->test_break(re->tbh))
if(re->r.renderer==R_INTERN)
make_sss_tree(re);
}
- if(re->test_break())
+ if(re->test_break(re->tbh))
RE_Database_Free(re);
else
re->i.convertdone= 1;
re->i.infostr= NULL;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
}
/* exported call to recalculate hoco for vertices, when winmat changed */
@@ -4923,8 +4837,8 @@ static void database_fromscene_vectors(Render *re, Scene *scene, int timeoffset)
if(re->scene->lay & 0xFF000000) lay= re->scene->lay & 0xFF000000;
else lay= re->scene->lay;
- /* applies changes fully, still using G.scene for timing... */
- G.scene->r.cfra+=timeoffset;
+ /* applies changes fully */
+ scene->r.cfra += timeoffset;
scene_update_for_newframe(re->scene, lay);
/* if no camera, viewmat should have been set! */
@@ -4937,11 +4851,11 @@ static void database_fromscene_vectors(Render *re, Scene *scene, int timeoffset)
/* MAKE RENDER DATA */
database_init_objects(re, lay, 0, 0, 0, timeoffset);
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
project_renderdata(re, projectverto, re->r.mode & R_PANORAMA, 0, 1);
/* do this in end, particles for example need cfra */
- G.scene->r.cfra-=timeoffset;
+ scene->r.cfra -= timeoffset;
}
/* choose to use static, to prevent giving too many args to this call */
@@ -5310,7 +5224,7 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
RE_Database_Free(re);
re->strandsurface= strandsurface;
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
/* creates entire dbase */
re->i.infostr= "Calculating next frame vectors";
@@ -5325,10 +5239,10 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
RE_Database_Free(re);
re->strandsurface= strandsurface;
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
RE_Database_FromScene(re, sce, 1);
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
for(step= 0; step<2; step++) {
if(step)
@@ -5397,7 +5311,7 @@ void RE_Database_FromScene_Vectors(Render *re, Scene *sce)
}
re->i.infostr= NULL;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
}
@@ -5431,8 +5345,6 @@ void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob)
re->flag |= R_GLOB_NOPUNOFLIP;
re->flag |= R_BAKING;
re->excludeob= actob;
- if(type == RE_BAKE_LIGHT)
- re->flag |= R_SKIP_MULTIRES;
if(actob)
re->flag |= R_BAKE_TRACE;
@@ -5498,12 +5410,12 @@ void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob)
threaded_makeshadowbufs(re);
/* raytree */
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
if(re->r.mode & R_RAYTRACE)
makeraytree(re);
/* occlusion */
- if((re->wrld.mode & WO_AMB_OCC) && !re->test_break())
+ if((re->wrld.mode & WO_AMB_OCC) && !re->test_break(re->tbh))
if(re->wrld.ao_gather_method == WO_AOGATHER_APPROX)
if(re->r.mode & R_SHADOW)
make_occ_tree(re);
@@ -5513,7 +5425,7 @@ void RE_Database_Baking(Render *re, Scene *scene, int type, Object *actob)
/* Sticky texture coords */
/* ------------------------------------------------------------------------- */
-void RE_make_sticky(void)
+void RE_make_sticky(Scene *scene, View3D *v3d)
{
Object *ob;
Base *base;
@@ -5524,33 +5436,33 @@ void RE_make_sticky(void)
float ho[4], mat[4][4];
int a;
- if(G.vd==NULL) {
+ if(v3d==NULL) {
printf("Need a 3d view to make sticky\n");
return;
}
- if(G.scene->camera==NULL) {
+ if(scene->camera==NULL) {
printf("Need camera to make sticky\n");
return;
}
- if(G.obedit) {
+ if(scene->obedit) {
printf("Unable to make sticky in Edit Mode\n");
return;
}
re= RE_NewRender("_make sticky_");
- RE_InitState(re, NULL, &G.scene->r, G.scene->r.xsch, G.scene->r.ysch, NULL);
+ RE_InitState(re, NULL, &scene->r, scene->r.xsch, scene->r.ysch, NULL);
/* use renderdata and camera to set viewplane */
- RE_SetCamera(re, G.scene->camera);
+ RE_SetCamera(re, scene->camera);
/* and set view matrix */
- Mat4Ortho(G.scene->camera->obmat);
- Mat4Invert(mat, G.scene->camera->obmat);
+ Mat4Ortho(scene->camera->obmat);
+ Mat4Invert(mat, scene->camera->obmat);
RE_SetView(re, mat);
for(base= FIRSTBASE; base; base= base->next) {
- if TESTBASELIB(base) {
+ if TESTBASELIB(v3d, base) {
if(base->object->type==OB_MESH) {
ob= base->object;
@@ -5561,7 +5473,7 @@ void RE_make_sticky(void)
me->msticky= CustomData_add_layer(&me->vdata, CD_MSTICKY,
CD_CALLOC, NULL, me->totvert);
- where_is_object(ob);
+ where_is_object(scene, ob);
Mat4MulMat4(mat, ob->obmat, re->viewmat);
ms= me->msticky;
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index 13fa9b17b71..a57e38f47c8 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -142,7 +142,9 @@ static Render *envmap_render_copy(Render *re, EnvMap *env)
/* callbacks */
envre->display_draw= re->display_draw;
+ envre->ddh= re->ddh;
envre->test_break= re->test_break;
+ envre->tbh= re->tbh;
/* and for the evil stuff; copy the database... */
envre->totvlak= re->totvlak;
@@ -369,7 +371,7 @@ static void env_set_imats(Render *re)
Base *base;
float mat[4][4];
- base= G.scene->base.first;
+ base= re->scene->base.first;
while(base) {
MTC_Mat4MulMat4(mat, base->object->obmat, re->viewmat);
MTC_Mat4Invert(base->object->imat, mat);
@@ -408,7 +410,7 @@ static void render_envmap(Render *re, EnvMap *env)
if(env->type==ENV_PLANE && part!=1)
continue;
- re->display_clear(envre->result);
+ re->display_clear(re->dch, envre->result);
MTC_Mat4CpyMat4(tmat, orthmat);
envmap_transmatrix(tmat, part);
@@ -429,7 +431,7 @@ static void render_envmap(Render *re, EnvMap *env)
env_hideobject(envre, env->object);
env_set_imats(envre);
- if(re->test_break()==0) {
+ if(re->test_break(re->tbh)==0) {
RE_TileProcessor(envre, 0, 0);
}
@@ -437,7 +439,7 @@ static void render_envmap(Render *re, EnvMap *env)
env_showobjects(envre);
env_rotate_scene(envre, tmat, 0);
- if(re->test_break()==0) {
+ if(re->test_break(re->tbh)==0) {
RenderLayer *rl= envre->result->layers.first;
int y;
char *alpha;
@@ -455,15 +457,15 @@ static void render_envmap(Render *re, EnvMap *env)
env->cube[part]= ibuf;
}
- if(re->test_break()) break;
+ if(re->test_break(re->tbh)) break;
}
- if(re->test_break()) BKE_free_envmapdata(env);
+ if(re->test_break(re->tbh)) BKE_free_envmapdata(env);
else {
if(envre->r.mode & R_OSA) env->ok= ENV_OSA;
else env->ok= ENV_NORMAL;
- env->lastframe= G.scene->r.cfra; /* hurmf */
+ env->lastframe= re->scene->r.cfra;
}
/* restore */
@@ -486,7 +488,7 @@ void make_envmaps(Render *re)
re->r.mode &= ~R_RAYTRACE;
re->i.infostr= "Creating Environment maps";
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
/* 5 = hardcoded max recursion level */
while(depth<5) {
@@ -496,7 +498,7 @@ void make_envmaps(Render *re)
if(tex->env && tex->env->object) {
EnvMap *env= tex->env;
- if(env->object->lay & G.scene->lay) {
+ if(env->object->lay & re->scene->lay) {
if(env->stype==ENV_LOAD) {
float orthmat[4][4], mat[4][4], tmat[4][4];
@@ -547,8 +549,8 @@ void make_envmaps(Render *re)
}
if(do_init) {
- re->display_init(re->result);
- re->display_clear(re->result);
+ re->display_init(re->dih, re->result);
+ re->display_clear(re->dch, re->result);
// re->flag |= R_REDRAW_PRV;
}
// restore
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c
index 40c0edb6e5f..a0185a64659 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -458,10 +458,12 @@ void RE_SetCamera(Render *re, Object *camera)
* Need to update the camera early because it's used for projection matrices
* and other stuff BEFORE the animation update loop is done
* */
+#if 0 // XXX old animation system
if(cam->ipo) {
- calc_ipo(cam->ipo, frame_to_float(re->r.cfra));
+ calc_ipo(cam->ipo, frame_to_float(re->scene, re->r.cfra));
execute_ipo(&cam->id, cam->ipo);
}
+#endif // XXX old animation system
lens= cam->lens;
shiftx=cam->shiftx;
shifty=cam->shifty;
diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c
index 494feb96c18..c75de189b10 100644
--- a/source/blender/render/intern/source/occlusion.c
+++ b/source/blender/render/intern/source/occlusion.c
@@ -514,10 +514,6 @@ static void occ_build_recursive(OcclusionTree *tree, OccNode *node, int begin, i
OccFace *face;
int a, b, totthread=0, offset[TOTCHILD], count[TOTCHILD];
- /* keep track of maximum depth for stack */
- if(depth > tree->maxdepth)
- tree->maxdepth= depth;
-
/* add a new node */
node->occlusion= 1.0f;
@@ -552,6 +548,10 @@ static void occ_build_recursive(OcclusionTree *tree, OccNode *node, int begin, i
child= BLI_memarena_alloc(tree->arena, sizeof(OccNode));
node->child[b].node= child;
+ /* keep track of maximum depth for stack */
+ if(depth+1 > tree->maxdepth)
+ tree->maxdepth= depth+1;
+
if(tree->dothreadedbuild)
BLI_unlock_thread(LOCK_CUSTOM1);
@@ -679,6 +679,7 @@ static OcclusionTree *occ_tree_build(Render *re)
/* recurse */
tree->root= BLI_memarena_alloc(tree->arena, sizeof(OccNode));
+ tree->maxdepth= 1;
occ_build_recursive(tree, tree->root, 0, totface, 1);
#if 0
@@ -1292,11 +1293,11 @@ static void occ_compute_passes(Render *re, OcclusionTree *tree, int totpass)
VECADDFAC(co, co, n, 1e-8f);
occ_lookup(tree, 0, &tree->face[i], co, n, &occ[i], NULL);
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
for(i=0; i<tree->totface; i++) {
@@ -1546,7 +1547,7 @@ void make_occ_tree(Render *re)
R= *re;
re->i.infostr= "Occlusion preprocessing";
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
re->occlusiontree= occ_tree_build(re);
@@ -1738,7 +1739,7 @@ void cache_occ_samples(Render *re, RenderPart *pa, ShadeSample *ssamp)
sample->filled= 1;
}
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
}
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 5c3c954aa8e..cc2cf290795 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -63,8 +63,6 @@
#include "RE_pipeline.h"
#include "radio.h"
-#include "BSE_sequence.h" /* <----------------- bad!!! */
-
#ifndef DISABLE_YAFRAY
/* yafray: include for yafray export/render */
#include "YafRay_Api.h"
@@ -124,26 +122,31 @@ static int commandline_threads= -1;
static volatile int g_break= 0;
-static int thread_break(void)
+static int thread_break(void *unused)
{
return g_break;
}
/* default callbacks, set in each new render */
-static void result_nothing(RenderResult *rr) {}
-static void result_rcti_nothing(RenderResult *rr, volatile struct rcti *rect) {}
-static void stats_nothing(RenderStats *rs) {}
-static void int_nothing(int val) {}
-static int void_nothing(void) {return 0;}
-static void print_error(char *str) {printf("ERROR: %s\n", str);}
+static void result_nothing(void *unused, RenderResult *rr) {}
+static void result_rcti_nothing(void *unused, RenderResult *rr, volatile struct rcti *rect) {}
+static void stats_nothing(void *unused, RenderStats *rs) {}
+static void int_nothing(void *unused, int val) {}
+static int void_nothing(void *unused) {return 0;}
+static void print_error(void *unused, char *str) {printf("ERROR: %s\n", str);}
-static void stats_background(RenderStats *rs)
+int RE_RenderInProgress(Render *re)
+{
+ return re->result_ok==0;
+}
+
+static void stats_background(void *unused, RenderStats *rs)
{
uintptr_t mem_in_use= MEM_get_memory_in_use();
float megs_used_memory= mem_in_use/(1024.0*1024.0);
char str[400], *spos= str;
- spos+= sprintf(spos, "Fra:%d Mem:%.2fM ", G.scene->r.cfra, megs_used_memory);
+ spos+= sprintf(spos, "Fra:%d Mem:%.2fM ", rs->cfra, megs_used_memory);
if(rs->curfield)
spos+= sprintf(spos, "Field %d ", rs->curfield);
@@ -155,11 +158,11 @@ static void stats_background(RenderStats *rs)
}
else {
if(rs->tothalo)
- spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d Ha:%d La:%d", G.scene->id.name+2, rs->totvert, rs->totface, rs->tothalo, rs->totlamp);
+ spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d Ha:%d La:%d", rs->scenename, rs->totvert, rs->totface, rs->tothalo, rs->totlamp);
else
- spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d La:%d", G.scene->id.name+2, rs->totvert, rs->totface, rs->totlamp);
+ spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d La:%d", rs->scenename, rs->totvert, rs->totface, rs->totlamp);
}
- printf(str); printf("\n");
+ printf("%s\n", str);
}
void RE_FreeRenderResult(RenderResult *res)
@@ -924,6 +927,14 @@ RenderResult *RE_GetResult(Render *re)
return NULL;
}
+/* displist.c util.... */
+Scene *RE_GetScene(Render *re)
+{
+ if(re)
+ return re->scene;
+ return NULL;
+}
+
RenderLayer *render_get_active_layer(Render *re, RenderResult *rr)
{
RenderLayer *rl= BLI_findlink(&rr->layers, re->r.actlay);
@@ -993,7 +1004,6 @@ RenderStats *RE_GetStats(Render *re)
return &re->i;
}
-/* Note, when rendering from a scene, ALWAYS use G.scene->id.name, else compositing wont work */
Render *RE_NewRender(const char *name)
{
Render *re;
@@ -1008,18 +1018,24 @@ Render *RE_NewRender(const char *name)
strncpy(re->name, name, RE_MAXNAME);
}
+ /* prevent UI to draw old results */
+ RE_FreeRenderResult(re->result);
+ re->result= NULL;
+ re->result_ok= 0;
+
/* set default empty callbacks */
re->display_init= result_nothing;
re->display_clear= result_nothing;
re->display_draw= result_rcti_nothing;
re->timecursor= int_nothing;
re->test_break= void_nothing;
- re->test_return= void_nothing;
re->error= print_error;
if(G.background)
re->stats_draw= stats_background;
else
re->stats_draw= stats_nothing;
+ /* clear callback handles */
+ re->dih= re->dch= re->ddh= re->sdh= re->tch= re->tbh= re->erh= NULL;
/* init some variables */
re->ycor= 1.0f;
@@ -1078,7 +1094,7 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, int winx, int winy
if(re->rectx < 2 || re->recty < 2 || (BKE_imtype_is_movie(rd->imtype) &&
(re->rectx < 16 || re->recty < 16) )) {
- re->error("Image too small");
+ re->error(re->erh, "Image too small");
re->ok= 0;
}
else {
@@ -1168,39 +1184,41 @@ void RE_SetView(Render *re, float mat[][4])
}
/* image and movie output has to move to either imbuf or kernel */
-void RE_display_init_cb(Render *re, void (*f)(RenderResult *rr))
+void RE_display_init_cb(Render *re, void *handle, void (*f)(void *handle, RenderResult *rr))
{
re->display_init= f;
+ re->dih= handle;
}
-void RE_display_clear_cb(Render *re, void (*f)(RenderResult *rr))
+void RE_display_clear_cb(Render *re, void *handle, void (*f)(void *handle, RenderResult *rr))
{
re->display_clear= f;
+ re->dch= handle;
}
-void RE_display_draw_cb(Render *re, void (*f)(RenderResult *rr, volatile rcti *rect))
+void RE_display_draw_cb(Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile rcti *rect))
{
re->display_draw= f;
+ re->ddh= handle;
}
-
-void RE_stats_draw_cb(Render *re, void (*f)(RenderStats *rs))
+void RE_stats_draw_cb(Render *re, void *handle, void (*f)(void *handle, RenderStats *rs))
{
re->stats_draw= f;
+ re->sdh= handle;
}
-void RE_timecursor_cb(Render *re, void (*f)(int))
+void RE_timecursor_cb(Render *re, void *handle, void (*f)(void *handle, int))
{
re->timecursor= f;
+ re->tch= handle;
}
-void RE_test_break_cb(Render *re, int (*f)(void))
+void RE_test_break_cb(Render *re, void *handle, int (*f)(void *handle))
{
re->test_break= f;
+ re->tbh= handle;
}
-void RE_test_return_cb(Render *re, int (*f)(void))
-{
- re->test_return= f;
-}
-void RE_error_cb(Render *re, void (*f)(char *str))
+void RE_error_cb(Render *re, void *handle, void (*f)(void *handle, char *str))
{
re->error= f;
+ re->erh= handle;
}
@@ -1248,7 +1266,7 @@ static void *do_part_thread(void *pa_v)
RenderPart *pa= pa_v;
/* need to return nicely all parts on esc */
- if(R.test_break()==0) {
+ if(R.test_break(R.tbh)==0) {
if(!R.sss_points && (R.r.scemode & R_FULL_SAMPLE))
pa->result= new_full_sample_buffers(&R, &pa->fullresult, &pa->disprect, pa->crop);
@@ -1284,7 +1302,7 @@ static void render_tile_processor(Render *re, int firsttile)
{
RenderPart *pa;
- if(re->test_break())
+ if(re->test_break(re->tbh))
return;
/* hrmf... exception, this is used for preview render, re-entrant, so render result has to be re-used */
@@ -1293,7 +1311,7 @@ static void render_tile_processor(Render *re, int firsttile)
re->result= new_render_result(re, &re->disprect, 0, RR_USEMEM);
}
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
if(re->result==NULL)
return;
@@ -1312,17 +1330,17 @@ static void render_tile_processor(Render *re, int firsttile)
do_part_thread(pa);
if(pa->result) {
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
if(render_display_draw_enabled(re))
- re->display_draw(pa->result, NULL);
+ re->display_draw(re->ddh, pa->result, NULL);
re->i.partsdone++;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
}
RE_FreeRenderResult(pa->result);
pa->result= NULL;
}
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
}
@@ -1439,7 +1457,7 @@ static void print_part_stats(Render *re, RenderPart *pa)
sprintf(str, "Part %d-%d", pa->nr, re->i.totpart);
re->i.infostr= str;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
re->i.infostr= NULL;
}
@@ -1509,7 +1527,7 @@ static void threaded_tile_processor(Render *re)
while(rendering) {
- if(re->test_break())
+ if(re->test_break(re->tbh))
PIL_sleep_ms(50);
else if(nextpa && BLI_available_threads(&threads)) {
drawtimer= 0;
@@ -1542,7 +1560,7 @@ static void threaded_tile_processor(Render *re)
if(pa->result) {
if(render_display_draw_enabled(re))
- re->display_draw(pa->result, NULL);
+ re->display_draw(re->ddh, pa->result, NULL);
print_part_stats(re, pa);
free_render_result(&pa->fullresult, pa->result);
@@ -1555,7 +1573,7 @@ static void threaded_tile_processor(Render *re)
rendering= 1;
if(pa->nr && pa->result && drawtimer>20) {
if(render_display_draw_enabled(re))
- re->display_draw(pa->result, &pa->result->renrect);
+ re->display_draw(re->ddh, pa->result, &pa->result->renrect);
hasdrawn= 1;
}
}
@@ -1564,7 +1582,7 @@ static void threaded_tile_processor(Render *re)
drawtimer= 0;
/* on break, wait for all slots to get freed */
- if( (g_break=re->test_break()) && BLI_available_threads(&threads)==re->r.threads)
+ if( (g_break=re->test_break(re->tbh)) && BLI_available_threads(&threads)==re->r.threads)
rendering= 0;
}
@@ -1610,7 +1628,7 @@ void RE_TileProcessor(Render *re, int firsttile, int threaded)
if(!re->sss_points)
re->i.lastframetime= PIL_check_seconds_timer()- re->i.starttime;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
}
@@ -1631,7 +1649,7 @@ static void do_render_3d(Render *re)
/* do left-over 3d post effects (flares) */
if(re->flag & R_HALO)
- if(!re->test_break())
+ if(!re->test_break(re->tbh))
add_halo_flare(re);
@@ -1704,7 +1722,7 @@ static void do_render_blur_3d(Render *re)
blurfac= 1.0f/(float)(re->r.osa-blur);
merge_renderresult_blur(rres, re->result, blurfac);
- if(re->test_break()) break;
+ if(re->test_break(re->tbh)) break;
}
/* swap results */
@@ -1716,7 +1734,7 @@ static void do_render_blur_3d(Render *re)
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay= render_get_active_layer(re, re->result);
- re->display_draw(re->result, NULL);
+ re->display_draw(re->ddh, re->result, NULL);
}
@@ -1783,7 +1801,7 @@ static void do_render_fields_3d(Render *re)
re->result= NULL;
/* second field */
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
re->i.curfield= 2; /* stats */
@@ -1822,7 +1840,7 @@ static void do_render_fields_3d(Render *re)
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay= render_get_active_layer(re, re->result);
- re->display_draw(re->result, NULL);
+ re->display_draw(re->ddh, re->result, NULL);
}
static void load_backbuffer(Render *re)
@@ -1841,7 +1859,7 @@ static void load_backbuffer(Render *re)
BKE_image_signal(re->backbuf, NULL, IMA_SIGNAL_RELOAD);
}
- re->backbuf= BKE_add_image_file(name);
+ re->backbuf= BKE_add_image_file(name, re->r.cfra);
ibuf= BKE_image_get_ibuf(re->backbuf, NULL);
if(ibuf==NULL) {
// error() doesnt work with render window open
@@ -1905,8 +1923,8 @@ static void do_render_fields_blur_3d(Render *re)
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay= render_get_active_layer(re, re->result);
- re->display_init(re->result);
- re->display_draw(re->result, NULL);
+ re->display_init(re->dih, re->result);
+ re->display_draw(re->ddh, re->result, NULL);
}
}
}
@@ -1935,13 +1953,16 @@ static void render_scene(Render *re, Scene *sce, int cfra)
/* still unsure entity this... */
resc->scene= sce;
- /* ensure scene has depsgraph, base flags etc OK. Warning... also sets G.scene */
+ /* ensure scene has depsgraph, base flags etc OK */
set_scene_bg(sce);
/* copy callbacks */
resc->display_draw= re->display_draw;
+ resc->ddh= re->ddh;
resc->test_break= re->test_break;
+ resc->tbh= re->tbh;
resc->stats_draw= re->stats_draw;
+ resc->sdh= re->sdh;
do_render_fields_blur_3d(resc);
}
@@ -1991,11 +2012,6 @@ static void ntree_render_scenes(Render *re)
}
}
}
-
- /* still the global... */
- if(G.scene!=re->scene)
- set_scene_bg(re->scene);
-
}
/* helper call to detect if theres a composite with render-result node */
@@ -2017,10 +2033,10 @@ static int composite_needs_render(Scene *sce)
}
/* bad call... need to think over proper method still */
-static void render_composit_stats(char *str)
+static void render_composit_stats(void *unused, char *str)
{
R.i.infostr= str;
- R.stats_draw(&R.i);
+ R.stats_draw(R.sdh, &R.i);
R.i.infostr= NULL;
}
@@ -2086,10 +2102,10 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
if(sample!=re->osa-1) {
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay= render_get_active_layer(re, re->result);
- re->display_draw(re->result, NULL);
+ re->display_draw(re->ddh, re->result, NULL);
}
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
@@ -2123,12 +2139,12 @@ void RE_MergeFullSample(Render *re, Scene *sce, bNodeTree *ntree)
}
/* own render result should be read/allocated */
- if(G.scene->id.flag & LIB_DOIT)
- RE_ReadRenderResult(G.scene, G.scene);
+ if(re->scene->id.flag & LIB_DOIT)
+ RE_ReadRenderResult(re->scene, re->scene);
/* and now we can draw (result is there) */
- re->display_init(re->result);
- re->display_clear(re->result);
+ re->display_init(re->dih, re->result);
+ re->display_clear(re->dch, re->result);
do_merge_fullsample(re, ntree);
}
@@ -2152,7 +2168,7 @@ static void do_render_composite_fields_blur_3d(Render *re)
if(re->r.scemode & R_SINGLE_LAYER)
pop_render_result(re);
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
if(ntree) {
ntreeCompositTagRender(re->scene);
@@ -2165,9 +2181,11 @@ static void do_render_composite_fields_blur_3d(Render *re)
if((re->r.scemode & R_SINGLE_LAYER)==0)
ntree_render_scenes(re);
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
ntree->stats_draw= render_composit_stats;
ntree->test_break= re->test_break;
+ ntree->sdh= re->sdh;
+ ntree->tbh= re->tbh;
/* in case it was never initialized */
R.stats_draw= re->stats_draw;
@@ -2178,6 +2196,7 @@ static void do_render_composite_fields_blur_3d(Render *re)
ntree->stats_draw= NULL;
ntree->test_break= NULL;
+ ntree->tbh= ntree->sdh= NULL;
}
}
else if(re->r.scemode & R_FULL_SAMPLE)
@@ -2187,7 +2206,7 @@ static void do_render_composite_fields_blur_3d(Render *re)
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay= render_get_active_layer(re, re->result);
- re->display_draw(re->result, NULL);
+ re->display_draw(re->ddh, re->result, NULL);
}
#ifndef DISABLE_YAFRAY
@@ -2237,14 +2256,14 @@ static void yafrayRender(Render *re)
RE_FreeRenderResult(re->result);
re->result= rres;
- re->display_init(re->result);
- re->display_draw(re->result, NULL);
+ re->display_init(re->dih, re->result);
+ re->display_draw(re->ddh, re->result, NULL);
}
}
}
re->i.lastframetime = PIL_check_seconds_timer()- re->i.starttime;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
RE_Database_Free(re);
}
@@ -2253,12 +2272,12 @@ static void yafrayRender(Render *re)
#endif /* disable yafray */
-static void renderresult_stampinfo()
+static void renderresult_stampinfo(Scene *scene)
{
RenderResult rres;
/* this is the basic trick to get the displayed float or char rect from render result */
- RE_GetResultImage(RE_GetRender(G.scene->id.name), &rres);
- BKE_stamp_buf((unsigned char *)rres.rect32, rres.rectf, rres.rectx, rres.recty, 4);
+ RE_GetResultImage(RE_GetRender(scene->id.name), &rres);
+ BKE_stamp_buf(scene, (unsigned char *)rres.rect32, rres.rectf, rres.rectx, rres.recty, 4);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -2273,11 +2292,11 @@ static void do_render_all_options(Render *re)
if(re->r.scemode & R_DOSEQ) {
/* note: do_render_seq() frees rect32 when sequencer returns float images */
- if(!re->test_break())
- do_render_seq(re->result, re->r.cfra);
+ if(!re->test_break(re->tbh))
+ ; //XXX do_render_seq(re->result, re->r.cfra);
- re->stats_draw(&re->i);
- re->display_draw(re->result, NULL);
+ re->stats_draw(re->sdh, &re->i);
+ re->display_draw(re->ddh, re->result, NULL);
}
else {
@@ -2296,12 +2315,12 @@ static void do_render_all_options(Render *re)
re->i.lastframetime= PIL_check_seconds_timer()- re->i.starttime;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
/* stamp image info here */
- if((G.scene->r.scemode & R_STAMP_INFO) && (G.scene->r.stamp & R_STAMP_DRAW)) {
- renderresult_stampinfo();
- re->display_draw(re->result, NULL);
+ if((re->r.scemode & R_STAMP_INFO) && (re->r.stamp & R_STAMP_DRAW)) {
+ renderresult_stampinfo(re->scene);
+ re->display_draw(re->ddh, re->result, NULL);
}
}
@@ -2312,11 +2331,11 @@ static int is_rendering_allowed(Render *re)
/* forbidden combinations */
if(re->r.mode & R_PANORAMA) {
if(re->r.mode & R_BORDER) {
- re->error("No border supported for Panorama");
+ re->error(re->erh, "No border supported for Panorama");
return 0;
}
if(re->r.mode & R_ORTHO) {
- re->error("No Ortho render possible for Panorama");
+ re->error(re->erh, "No Ortho render possible for Panorama");
return 0;
}
}
@@ -2324,11 +2343,11 @@ static int is_rendering_allowed(Render *re)
if(re->r.mode & R_BORDER) {
if(re->r.border.xmax <= re->r.border.xmin ||
re->r.border.ymax <= re->r.border.ymin) {
- re->error("No border area selected.");
+ re->error(re->erh, "No border area selected.");
return 0;
}
if(re->r.scemode & R_EXR_TILE_FILE) {
- re->error("Border render and Buffer-save not supported yet");
+ re->error(re->erh, "Border render and Buffer-save not supported yet");
return 0;
}
}
@@ -2339,7 +2358,7 @@ static int is_rendering_allowed(Render *re)
render_unique_exr_name(re, str, 0);
if (BLI_is_writable(str)==0) {
- re->error("Can not save render buffers, check the temp default path");
+ re->error(re->erh, "Can not save render buffers, check the temp default path");
return 0;
}
@@ -2349,7 +2368,7 @@ static int is_rendering_allowed(Render *re)
/* no fullsample and edge */
if((re->r.scemode & R_FULL_SAMPLE) && (re->r.mode & R_EDGE)) {
- re->error("Full Sample doesn't support Edge Enhance");
+ re->error(re->erh, "Full Sample doesn't support Edge Enhance");
return 0;
}
@@ -2363,7 +2382,7 @@ static int is_rendering_allowed(Render *re)
bNode *node;
if(ntree==NULL) {
- re->error("No Nodetree in Scene");
+ re->error(re->erh, "No Nodetree in Scene");
return 0;
}
@@ -2373,7 +2392,7 @@ static int is_rendering_allowed(Render *re)
if(node==NULL) {
- re->error("No Render Output Node in Scene");
+ re->error(re->erh, "No Render Output Node in Scene");
return 0;
}
}
@@ -2385,7 +2404,7 @@ static int is_rendering_allowed(Render *re)
if(!(re->r.scemode & (R_DOSEQ|R_DOCOMP))) {
if(re->scene->camera==NULL) {
- re->error("No camera");
+ re->error(re->erh, "No camera");
return 0;
}
}
@@ -2401,13 +2420,13 @@ static int is_rendering_allowed(Render *re)
if(!(srl->layflag & SCE_LAY_DISABLE))
break;
if(srl==NULL) {
- re->error("All RenderLayers are disabled");
+ re->error(re->erh, "All RenderLayers are disabled");
return 0;
}
/* renderer */
if(!ELEM(re->r.renderer, R_INTERN, R_YAFRAY)) {
- re->error("Unknown render engine set");
+ re->error(re->erh, "Unknown render engine set");
return 0;
}
return 1;
@@ -2464,8 +2483,8 @@ static int render_initialize_from_scene(Render *re, Scene *scene, int anim)
if(!is_rendering_allowed(re))
return 0;
- re->display_init(re->result);
- re->display_clear(re->result);
+ re->display_init(re->dih, re->result);
+ re->display_clear(re->dch, re->result);
return 1;
}
@@ -2474,8 +2493,8 @@ static int render_initialize_from_scene(Render *re, Scene *scene, int anim)
void RE_BlenderFrame(Render *re, Scene *scene, int 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;
+ re->result_ok= 0;
scene->r.cfra= frame;
@@ -2485,6 +2504,7 @@ void RE_BlenderFrame(Render *re, Scene *scene, int frame)
/* UGLY WARNING */
G.rendering= 0;
+ re->result_ok= 1;
}
static void do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh)
@@ -2503,14 +2523,14 @@ static void do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh)
dofree = 1;
}
RE_ResultGet32(re, (unsigned int *)rres.rect32);
- mh->append_movie(scene->r.cfra, rres.rect32, rres.rectx, rres.recty);
+ mh->append_movie(&re->r, scene->r.cfra, rres.rect32, rres.rectx, rres.recty);
if(dofree) {
MEM_freeN(rres.rect32);
}
printf("Append frame %d", scene->r.cfra);
}
else {
- BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype);
+ BKE_makepicstring(scene, name, scene->r.pic, scene->r.cfra, scene->r.imtype);
if(re->r.imtype==R_MULTILAYER) {
if(re->result) {
@@ -2530,7 +2550,7 @@ static void do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh)
/* float factor for random dither, imbuf takes care of it */
ibuf->dither= scene->r.dither_intensity;
- ok= BKE_write_ibuf(ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
+ ok= BKE_write_ibuf(scene, ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
if(ok==0) {
printf("Render error: cannot save %s\n", name);
@@ -2542,9 +2562,9 @@ static void do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh)
if(ok && scene->r.imtype==R_OPENEXR && (scene->r.subimtype & R_PREVIEW_JPG)) {
if(BLI_testextensie(name, ".exr"))
name[strlen(name)-4]= 0;
- BKE_add_image_extension(name, R_JPEG90);
+ BKE_add_image_extension(scene, name, R_JPEG90);
ibuf->depth= 24;
- BKE_write_ibuf(ibuf, name, R_JPEG90, scene->r.subimtype, scene->r.quality);
+ BKE_write_ibuf(scene, ibuf, name, R_JPEG90, scene->r.subimtype, scene->r.quality);
printf("\nSaved: %s", name);
}
@@ -2573,23 +2593,24 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra)
/* 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;
+ re->result_ok= 0;
if(BKE_imtype_is_movie(scene->r.imtype))
mh->start_movie(&re->r, re->rectx, re->recty);
if (mh->get_next_frame) {
while (!(G.afbreek == 1)) {
- int nf = mh->get_next_frame();
+ int nf = mh->get_next_frame(&re->r);
if (nf >= 0 && nf >= scene->r.sfra && nf <= scene->r.efra) {
scene->r.cfra = re->r.cfra = nf;
do_render_all_options(re);
- if(re->test_break() == 0) {
+ if(re->test_break(re->tbh) == 0) {
do_write_image_or_movie(re, scene, mh);
}
} else {
- re->test_break();
+ re->test_break(re->tbh);
}
}
} else {
@@ -2618,15 +2639,14 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra)
/* Touch/NoOverwrite options are only valid for image's */
if(BKE_imtype_is_movie(scene->r.imtype) == 0) {
- if (scene->r.mode & (R_NO_OVERWRITE | R_TOUCH) ) {
- BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype);
- }
+ if(scene->r.mode & (R_NO_OVERWRITE | R_TOUCH))
+ BKE_makepicstring(scene, name, scene->r.pic, scene->r.cfra, scene->r.imtype);
- if (scene->r.mode & R_NO_OVERWRITE && BLI_exist(name)) {
+ if(scene->r.mode & R_NO_OVERWRITE && BLI_exist(name)) {
printf("skipping existing frame \"%s\"\n", name);
continue;
}
- if (scene->r.mode & R_TOUCH && !BLI_exist(name)) {
+ if(scene->r.mode & R_TOUCH && !BLI_exist(name)) {
BLI_make_existing_file(name); /* makes the dir if its not there */
BLI_touch(name);
}
@@ -2636,7 +2656,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra)
do_render_all_options(re);
- if(re->test_break() == 0) {
+ if(re->test_break(re->tbh) == 0) {
do_write_image_or_movie(re, scene, mh);
}
@@ -2661,6 +2681,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra)
/* UGLY WARNING */
G.rendering= 0;
+ re->result_ok= 1;
}
/* note; repeated win/disprect calc... solve that nicer, also in compo */
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
index 46a7a1c556c..e89cf20e4b1 100644
--- a/source/blender/render/intern/source/rayshade.c
+++ b/source/blender/render/intern/source/rayshade.c
@@ -180,13 +180,13 @@ void makeraytree(Render *re)
double time= PIL_check_seconds_timer();
vlr= obr->vlaknodes[v>>8].vlak;
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
if(time-lasttime>1.0f) {
char str[32];
sprintf(str, "Filling Octree: %d", totv);
re->i.infostr= str;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
re->i.infostr= NULL;
lasttime= time;
}
@@ -202,7 +202,7 @@ void makeraytree(Render *re)
RE_ray_tree_done(re->raytree);
re->i.infostr= NULL;
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
}
static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
@@ -1536,8 +1536,8 @@ static void ray_ao_qmc(ShadeInput *shi, float *shadfac)
float maxdist = R.wrld.aodist;
float fac=0.0f, prev=0.0f;
- float adapt_thresh = G.scene->world->ao_adapt_thresh;
- float adapt_speed_fac = G.scene->world->ao_adapt_speed_fac;
+ float adapt_thresh = R.wrld.ao_adapt_thresh;
+ float adapt_speed_fac = R.wrld.ao_adapt_speed_fac;
int samples=0;
int max_samples = R.wrld.aosamp*R.wrld.aosamp;
@@ -1684,7 +1684,7 @@ static void ray_ao_spheresamp(ShadeInput *shi, float *shadfac)
/* bias prevents smoothed faces to appear flat */
if(shi->vlr->flag & R_SMOOTH) {
- bias= G.scene->world->aobias;
+ bias= R.wrld.aobias;
nrm= shi->vn;
}
else {
@@ -2140,6 +2140,7 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
}
+#if 0
/* only when face points away from lamp, in direction of lamp, trace ray and find first exit point */
static void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float *co)
{
@@ -2182,4 +2183,5 @@ static void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float
*distfac= 0.0f;
}
+#endif
diff --git a/source/blender/render/intern/source/raytrace.c b/source/blender/render/intern/source/raytrace.c
index ec47df74d04..09d3711885a 100644
--- a/source/blender/render/intern/source/raytrace.c
+++ b/source/blender/render/intern/source/raytrace.c
@@ -1,5 +1,5 @@
/**
- * $Id: $
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 5dfb509939b..deb6f0db743 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -314,7 +314,7 @@ static void halo_tile(RenderPart *pa, RenderLayer *rl)
}
}
}
- if(R.test_break() ) break;
+ if(R.test_break(R.tbh) ) break;
}
}
@@ -430,7 +430,7 @@ static void lamphalo_tile(RenderPart *pa, RenderLayer *rl)
if(rd) rd++;
}
if(y&1)
- if(R.test_break()) break;
+ if(R.test_break(R.tbh)) break;
}
}
@@ -662,7 +662,7 @@ static void sky_tile(RenderPart *pa, RenderLayer *rl)
}
if(y&1)
- if(R.test_break()) break;
+ if(R.test_break(R.tbh)) break;
}
}
@@ -760,7 +760,7 @@ static void shadeDA_tile(RenderPart *pa, RenderLayer *rl)
int samp;
int x, y, seed, crop=0, offs=0, od;
- if(R.test_break()) return;
+ if(R.test_break(R.tbh)) return;
/* irregular shadowb buffer creation */
if(R.r.mode & R_SHADOW)
@@ -821,7 +821,7 @@ static void shadeDA_tile(RenderPart *pa, RenderLayer *rl)
rectdaps+= pa->rectx;
offs+= pa->rectx;
- if(y&1) if(R.test_break()) break;
+ if(y&1) if(R.test_break(R.tbh)) break;
}
/* disable scanline updating */
@@ -1142,7 +1142,7 @@ void zbufshadeDA_tile(RenderPart *pa)
sdata.psmlist= &psmlist;
sdata.edgerect= edgerect;
zbuffer_solid(pa, rl, make_pixelstructs, &sdata);
- if(R.test_break()) break;
+ if(R.test_break(R.tbh)) break;
}
/* shades solid */
@@ -1280,7 +1280,7 @@ void zbufshade_tile(RenderPart *pa)
zbuffer_solid(pa, rl, NULL, NULL);
- if(!R.test_break()) { /* NOTE: this if() is not consistant */
+ if(!R.test_break(R.tbh)) { /* NOTE: this if() is not consistant */
/* edges only for solid part, ztransp doesn't support it yet anti-aliased */
if(rl->layflag & SCE_LAY_EDGE) {
@@ -1325,7 +1325,7 @@ void zbufshade_tile(RenderPart *pa)
}
}
if(y&1)
- if(R.test_break()) break;
+ if(R.test_break(R.tbh)) break;
}
if(R.occlusiontree)
@@ -1377,7 +1377,7 @@ void zbufshade_tile(RenderPart *pa)
if(rl->layflag & SCE_LAY_SKY)
sky_tile(pa, rl);
- if(!R.test_break()) {
+ if(!R.test_break(R.tbh)) {
if(rl->layflag & SCE_LAY_EDGE)
if(R.r.mode & R_EDGE)
edge_enhance_add(pa, rl->rectf, edgerect);
@@ -1717,7 +1717,7 @@ void zbufshade_sss_tile(RenderPart *pa)
}
if(y&1)
- if(re->test_break()) break;
+ if(re->test_break(re->tbh)) break;
}
/* note: after adding we do not free these arrays, sss keeps them */
@@ -1797,7 +1797,7 @@ static void renderhalo_post(RenderResult *rr, float *rectf, HaloRen *har) /* pos
rectft+= 4*rr->rectx;
- if(R.test_break()) break;
+ if(R.test_break(R.tbh)) break;
}
}
}
@@ -1915,7 +1915,7 @@ void add_halo_flare(Render *re)
if(do_draw) {
/* weak... the display callback wants an active renderlayer pointer... */
rr->renlay= rl;
- re->display_draw(rr, NULL);
+ re->display_draw(re->ddh, rr, NULL);
}
R.r.mode= mode;
@@ -2334,7 +2334,7 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
ShadeInput *shi= ssamp->shi;
/* fast threadsafe break test */
- if(R.test_break())
+ if(R.test_break(R.tbh))
return;
/* setup render coordinates */
@@ -2567,7 +2567,7 @@ static void *do_bake_thread(void *bs_v)
shade_tface(bs);
/* fast threadsafe break test */
- if(R.test_break())
+ if(R.test_break(R.tbh))
break;
}
bs->ready= 1;
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index d44b49cc706..621831fb341 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -1032,9 +1032,11 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma, float *vec, f
har->g= (yn*tg+ zn*ma->g);
har->b= (yn*tb+ zn*ma->b);
}
- if(mtex->texco & 16) {
+ if(mtex->texco & TEXCO_UV) {
har->alfa= tin;
}
+ if(mtex->mapto & MAP_ALPHA)
+ har->alfa= tin;
}
}
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index c53a2b68c9c..71cd678233d 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -425,7 +425,7 @@ void makeshadowbuf(Render *re, LampRen *lar)
/* create Z tiles (for compression): this system is 24 bits!!! */
compress_shadowbuf(shb, rectz, lar->mode & LA_SQUARE);
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
@@ -457,13 +457,13 @@ static void *do_shadow_thread(void *re_v)
lar->thread_ready= 1;
BLI_unlock_thread(LOCK_CUSTOM1);
}
- } while(lar && !re->test_break());
+ } while(lar && !re->test_break(re->tbh));
return NULL;
}
static volatile int g_break= 0;
-static int thread_break(void)
+static int thread_break(void *unused)
{
return g_break;
}
@@ -473,7 +473,7 @@ void threaded_makeshadowbufs(Render *re)
ListBase threads;
LampRen *lar;
int a, totthread= 0;
- int (*test_break)(void);
+ int (*test_break)(void *);
/* count number of threads to use */
if(G.rendering) {
@@ -488,7 +488,7 @@ void threaded_makeshadowbufs(Render *re)
if(totthread <= 1) {
for(lar=re->lampren.first; lar; lar= lar->next) {
- if(re->test_break()) break;
+ if(re->test_break(re->tbh)) break;
if(lar->shb) {
/* if type is irregular, this only sets the perspective matrix and autoclips */
makeshadowbuf(re, lar);
@@ -512,7 +512,7 @@ void threaded_makeshadowbufs(Render *re)
/* keep rendering as long as there are shadow buffers not ready */
do {
- if((g_break=test_break()))
+ if((g_break=test_break(re->tbh)))
break;
PIL_sleep_ms(50);
diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c
index 9bde6675798..7bb2aef2e6e 100644
--- a/source/blender/render/intern/source/sss.c
+++ b/source/blender/render/intern/source/sss.c
@@ -852,7 +852,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
float (*co)[3] = NULL, (*color)[3] = NULL, *area = NULL;
int totpoint = 0, osa, osaflag, partsdone;
- if(re->test_break())
+ if(re->test_break(re->tbh))
return;
points.first= points.last= NULL;
@@ -888,7 +888,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
return;
/* merge points together into a single buffer */
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
for(totpoint=0, p=points.first; p; p=p->next)
totpoint += p->totpoint;
@@ -913,7 +913,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
BLI_freelistN(&points);
/* build tree */
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
SSSData *sss= MEM_callocN(sizeof(*sss), "SSSData");
float ior= mat->sss_ior, cfac= mat->sss_colfac;
float *col= mat->sss_col, *radius= mat->sss_radius;
@@ -981,7 +981,7 @@ void make_sss_tree(Render *re)
re->sss_hash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
re->i.infostr= "SSS preprocessing";
- re->stats_draw(&re->i);
+ re->stats_draw(re->sdh, &re->i);
for(mat= G.main->mat.first; mat; mat= mat->id.next)
if(mat->id.us && (mat->flag & MA_IS_USED) && (mat->sss_flag & MA_DIFF_SSS))
diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c
index 05e36160f0e..3c8c1640b75 100644
--- a/source/blender/render/intern/source/strand.c
+++ b/source/blender/render/intern/source/strand.c
@@ -773,7 +773,7 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, RenderLayer *rl, APixstrand
float z[4], bounds[4], winmat[4][4];
int a, b, c, i, totsegment, clip[4];
- if(re->test_break())
+ if(re->test_break(re->tbh))
return 0;
if(re->totstrand == 0)
return 0;
@@ -881,7 +881,7 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, RenderLayer *rl, APixstrand
}
}
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
/* convert list to array and sort */
sortsegments= MEM_mallocN(sizeof(StrandSortSegment)*totsegment, "StrandSortSegment");
for(a=0, sortseg=firstseg; a<totsegment; a++, sortseg=sortseg->next)
@@ -893,11 +893,11 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, RenderLayer *rl, APixstrand
spart.totapixbuf= MEM_callocN(sizeof(int)*pa->rectx*pa->recty, "totapixbuf");
- if(!re->test_break()) {
+ if(!re->test_break(re->tbh)) {
/* render segments in sorted order */
sortseg= sortsegments;
for(a=0; a<totsegment; a++, sortseg++) {
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
obi= &re->objectinstance[sortseg->obi];
diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c
index 61e9d9cf412..afe732d885b 100644
--- a/source/blender/render/intern/source/texture.c
+++ b/source/blender/render/intern/source/texture.c
@@ -79,11 +79,9 @@ extern struct Render R;
-/* note; this is called WITH RENDER IS NULL in src/drawview.c for animated
- background image, option should move to kernel */
void init_render_texture(Render *re, Tex *tex)
{
- int cfra= G.scene->r.cfra;
+ int cfra= re->scene->r.cfra;
if(re) cfra= re->r.cfra;
@@ -95,7 +93,7 @@ void init_render_texture(Render *re, Tex *tex)
if(tex->type==TEX_PLUGIN) {
if(tex->plugin && tex->plugin->doit) {
if(tex->plugin->cfra) {
- *(tex->plugin->cfra)= frame_to_float(cfra);
+ *(tex->plugin->cfra)= (float)cfra; //frame_to_float(re->scene, cfra); // XXX old animsys - timing stuff to be fixed
}
}
}
@@ -718,7 +716,7 @@ static int evalnodes(Tex *tex, float *texvec, TexResult *texres, short thread, s
short rv = TEX_INT;
bNodeTree *nodes = tex->nodetree;
- ntreeTexExecTree(nodes, texres, texvec, 0, thread, tex, which_output);
+ ntreeTexExecTree(nodes, texres, texvec, 0, thread, tex, which_output, R.r.cfra);
if(texres->nor) rv |= TEX_NOR;
rv |= TEX_RGB;
diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c
index 509ac81c58b..b68cecce7bd 100644
--- a/source/blender/render/intern/source/zbuf.c
+++ b/source/blender/render/intern/source/zbuf.c
@@ -2495,7 +2495,7 @@ void zbuffer_shadow(Render *re, float winmat[][4], LampRen *lar, int *rectz, int
}
}
- if((a & 255)==255 && re->test_break())
+ if((a & 255)==255 && re->test_break(re->tbh))
break;
}
@@ -2544,13 +2544,13 @@ void zbuffer_shadow(Render *re, float winmat[][4], LampRen *lar, int *rectz, int
}
}
- if((a & 255)==255 && re->test_break())
+ if((a & 255)==255 && re->test_break(re->tbh))
break;
}
}
}
- if(re->test_break())
+ if(re->test_break(re->tbh))
break;
}
@@ -3512,13 +3512,13 @@ static int zbuffer_abuf(RenderPart *pa, APixstr *APixbuf, ListBase *apsmbase, Re
}
}
if((v & 255)==255)
- if(R.test_break())
+ if(R.test_break(R.tbh))
break;
}
}
}
- if(R.test_break()) break;
+ if(R.test_break(R.tbh)) break;
}
for(zsample=0; zsample<samples; zsample++) {
@@ -4013,7 +4013,7 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
unsigned short *ztramask= NULL, filled;
/* looks nicer for calling code */
- if(R.test_break())
+ if(R.test_break(R.tbh))
return NULL;
if(R.osa>16) { /* MAX_OSA */
@@ -4096,7 +4096,7 @@ unsigned short *zbuffer_transp_shade(RenderPart *pa, RenderLayer *rl, float *pas
apstrand= aprectstrand;
od= offs;
- if(R.test_break())
+ if(R.test_break(R.tbh))
break;
for(x=pa->disprect.xmin+crop; x<pa->disprect.xmax-crop; x++, ap++, apstrand++, pass+=4, od++) {