diff options
Diffstat (limited to 'source/blender/render')
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++) { |