diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2010-11-27 15:48:35 +0300 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2010-11-27 15:48:35 +0300 |
commit | a04603d2a0ffed1b3030167449687b893711da32 (patch) | |
tree | 95a529f8fb0914add4ea596962b11d6be2f31573 /source/blender/render | |
parent | 5c26fd6c4cd3e05c70b5473cc045127b615a592d (diff) | |
parent | 02cc80691d71ea305780655d3b0d4cd4530db9c7 (diff) |
Merged changes in the trunk up to revision 33348.
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/CMakeLists.txt | 4 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_pipeline.h | 9 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 51 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 39 | ||||
-rw-r--r-- | source/blender/render/intern/source/rayshade.c | 4 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadeoutput.c | 45 | ||||
-rw-r--r-- | source/blender/render/intern/source/texture.c | 17 | ||||
-rw-r--r-- | source/blender/render/intern/source/voxeldata.c | 18 |
8 files changed, 87 insertions, 100 deletions
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index b65aefeb162..0be9796fabd 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -78,10 +78,6 @@ SET(SRC intern/source/zbuf.c ) -IF(WIN32) - LIST(APPEND INC ${PTHREADS_INC}) -ENDIF(WIN32) - IF(WITH_IMAGE_OPENEXR) ADD_DEFINITIONS(-DWITH_OPENEXR) ENDIF(WITH_IMAGE_OPENEXR) diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 265788830bc..58b3cec82c9 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -145,7 +145,8 @@ typedef struct RenderStats { int totface, totvert, totstrand, tothalo, totlamp, totpart; short curfield, curblur, curpart, partsdone, convertdone; double starttime, lastframetime; - char *infostr, *statstr, scenename[32]; + const char *infostr, *statstr; + char scenename[32]; } RenderStats; @@ -288,15 +289,15 @@ typedef struct RenderEngine { ListBase fullresult; } RenderEngine; -void RE_layer_load_from_file(RenderLayer *layer, struct ReportList *reports, char *filename); -void RE_result_load_from_file(RenderResult *result, struct ReportList *reports, char *filename); +void RE_layer_load_from_file(RenderLayer *layer, struct ReportList *reports, const char *filename); +void RE_result_load_from_file(RenderResult *result, struct ReportList *reports, const char *filename); struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h); void RE_engine_update_result(RenderEngine *engine, struct RenderResult *result); void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result); int RE_engine_test_break(RenderEngine *engine); -void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info); +void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info); void RE_engines_init(void); void RE_engines_exit(void); diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index a908133a7ce..76befcaeb12 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -2786,7 +2786,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) float len, *data, *fp, *orco=NULL, *orcobase= NULL; float n[3], mat[4][4]; int nr, startvert, startvlak, a, b; - int frontside, need_orco=0, totmat; + int need_orco=0, totmat; cu= ob->data; if(ob->type==OB_FONT && cu->str==NULL) return; @@ -2844,15 +2844,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) ver= RE_findOrAddVert(obr, obr->totvert++); VECCOPY(ver->co, data); - /* flip normal if face is backfacing, also used in face loop below */ - if(ver->co[2] < 0.0) { - VECCOPY(ver->n, n); - ver->flag = 1; - } - else { - ver->n[0]= -n[0]; ver->n[1]= -n[1]; ver->n[2]= -n[2]; - ver->flag = 0; - } + negate_v3_v3(ver->n, n); mul_m4_v3(mat, ver->co); @@ -2873,12 +2865,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) vlr->v3= RE_findOrAddVert(obr, startvert+index[2]); vlr->v4= NULL; - if(vlr->v1->flag) { - VECCOPY(vlr->n, n); - } - else { - vlr->n[0]= -n[0]; vlr->n[1]= -n[1]; vlr->n[2]= -n[2]; - } + negate_v3_v3(vlr->n, n); vlr->mat= matar[ dl->col ]; vlr->flag= 0; @@ -2917,8 +2904,6 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) for(a=0; a<dl->parts; a++) { - frontside= (a >= dl->nr/2); - if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0) break; @@ -2929,25 +2914,16 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) for(; b<dl->nr; b++) { vlr= RE_findOrAddVlak(obr, obr->totvlak++); - vlr->v1= RE_findOrAddVert(obr, p2); - vlr->v2= RE_findOrAddVert(obr, p1); - vlr->v3= RE_findOrAddVert(obr, p3); - vlr->v4= RE_findOrAddVert(obr, p4); - vlr->ec= ME_V2V3+ME_V3V4; + vlr->v1= RE_findOrAddVert(obr, p1); + vlr->v2= RE_findOrAddVert(obr, p2); + vlr->v3= RE_findOrAddVert(obr, p4); + vlr->v4= RE_findOrAddVert(obr, p3); + vlr->ec= ME_V4V1+ME_V3V4; if(a==0) vlr->ec+= ME_V1V2; vlr->flag= dl->rt; - /* this is not really scientific: the vertices - * 2, 3 en 4 seem to give better vertexnormals than 1 2 3: - * front and backside treated different!! - */ - - if(frontside) - normal_tri_v3( vlr->n,vlr->v2->co, vlr->v3->co, vlr->v4->co); - else - normal_tri_v3( vlr->n,vlr->v1->co, vlr->v2->co, vlr->v3->co); - + normal_quad_v3(vlr->n, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co); vlr->mat= matar[ dl->col ]; p4= p3; @@ -2975,15 +2951,6 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) for(a=startvert; a<obr->totvert; a++) { ver= RE_findOrAddVert(obr, a); len= normalize_v3(ver->n); - if(len==0.0) ver->flag= 1; /* flag abuse, its only used in zbuf now */ - else ver->flag= 0; - } - for(a= startvlak; a<obr->totvlak; a++) { - vlr= RE_findOrAddVlak(obr, a); - if(vlr->v1->flag) VECCOPY(vlr->v1->n, vlr->n); - if(vlr->v2->flag) VECCOPY(vlr->v2->n, vlr->n); - if(vlr->v3->flag) VECCOPY(vlr->v3->n, vlr->n); - if(vlr->v4->flag) VECCOPY(vlr->v4->n, vlr->n); } } } diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 0bd8858d9d4..46377bc4831 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -930,7 +930,7 @@ static void renderresult_add_names(RenderResult *rr) } /* called for reading temp files, and for external engines */ -static int read_render_result_from_file(char *filename, RenderResult *rr) +static int read_render_result_from_file(const char *filename, RenderResult *rr) { RenderLayer *rl; RenderPass *rpass; @@ -2548,6 +2548,7 @@ static void do_render_seq(Render * re) struct ImBuf *ibuf; RenderResult *rr; /* don't assign re->result here as it might change during give_ibuf_seq */ int cfra = re->r.cfra; + SeqRenderData context; re->i.cfra= cfra; @@ -2558,7 +2559,11 @@ static void do_render_seq(Render * re) recurs_depth++; - ibuf= give_ibuf_seq(re->main, re->scene, re->result->rectx, re->result->recty, cfra, 0, 100.0); + context = seq_new_render_data(re->main, re->scene, + re->result->rectx, re->result->recty, + 100); + + ibuf = give_ibuf_seq(context, cfra, 0); recurs_depth--; @@ -2931,19 +2936,19 @@ void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *sr if(render_initialize_from_main(re, bmain, scene, srl, lay, 0, 0)) { MEM_reset_peak_memory(); do_render_all_options(re); - } - if(write_still) { - if(BKE_imtype_is_movie(scene->r.imtype)) { - /* operator checks this but incase its called from elsewhere */ - printf("Error: cant write single images with a movie format!\n"); - } - else { - char name[FILE_MAX]; - BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, FALSE); - - /* reports only used for Movie */ - do_write_image_or_movie(re, scene, NULL, NULL, name); + if(write_still && !G.afbreek) { + if(BKE_imtype_is_movie(scene->r.imtype)) { + /* operator checks this but incase its called from elsewhere */ + printf("Error: cant write single images with a movie format!\n"); + } + else { + char name[FILE_MAX]; + BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, FALSE); + + /* reports only used for Movie */ + do_write_image_or_movie(re, scene, NULL, NULL, name); + } } } @@ -3324,7 +3329,7 @@ int RE_engine_test_break(RenderEngine *engine) return re->test_break(re->tbh); } -void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info) +void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info) { Render *re= engine->re; @@ -3337,7 +3342,7 @@ void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info) /* loads in image into a result, size must match * x/y offsets are only used on a partial copy when dimensions dont match */ -void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, char *filename) +void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, const char *filename) { ImBuf *ibuf = IMB_loadiffname(filename, IB_rect); @@ -3377,7 +3382,7 @@ void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, char *file } } -void RE_result_load_from_file(RenderResult *result, ReportList *reports, char *filename) +void RE_result_load_from_file(RenderResult *result, ReportList *reports, const char *filename) { if(!read_render_result_from_file(filename, result)) { BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to load '%s'\n", filename); diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c index 17ec48c8422..d2e9765c722 100644 --- a/source/blender/render/intern/source/rayshade.c +++ b/source/blender/render/intern/source/rayshade.c @@ -468,7 +468,9 @@ void makeraytree(Render *re) max[i] += 0.01f; sub[i] = max[i]-min[i]; } - re->maxdist = sqrt( sub[0]*sub[0] + sub[1]*sub[1] + sub[2]*sub[2] ); + + re->maxdist= sub[0]*sub[0] + sub[1]*sub[1] + sub[2]*sub[2]; + if(re->maxdist > 0.0f) re->maxdist= sqrt(re->maxdist); re->i.infostr= "Raytree finished"; re->stats_draw(re->sdh, &re->i); diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index 814c4413525..5eb91845dc2 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -1415,10 +1415,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int } if(i_noshad>0.0f) { if(passflag & (SCE_PASS_DIFFUSE|SCE_PASS_SHADOW)) { - if(ma->mode & MA_SHADOW_TRA) - add_to_diffuse(shr->diff, shi, is, i_noshad*shadfac[0]*lacol[0], i_noshad*shadfac[1]*lacol[1], i_noshad*shadfac[2]*lacol[2]); - else - add_to_diffuse(shr->diff, shi, is, i_noshad*lacol[0], i_noshad*lacol[1], i_noshad*lacol[2]); + add_to_diffuse(shr->diff, shi, is, i_noshad*lacol[0], i_noshad*lacol[1], i_noshad*lacol[2]); } else VECCOPY(shr->diff, shr->shad); @@ -1649,12 +1646,14 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr) if(R.wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) { if(((passflag & SCE_PASS_COMBINED) && (shi->combinedflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT))) || (passflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT))) { - /* AO was calculated for scanline already */ - if(shi->depth || shi->volume_depth) - ambient_occlusion(shi); - VECCOPY(shr->ao, shi->ao); - VECCOPY(shr->env, shi->env); // XXX multiply - VECCOPY(shr->indirect, shi->indirect); // XXX multiply + if(R.r.mode & R_SHADOW) { + /* AO was calculated for scanline already */ + if(shi->depth || shi->volume_depth) + ambient_occlusion(shi); + VECCOPY(shr->ao, shi->ao); + VECCOPY(shr->env, shi->env); // XXX multiply + VECCOPY(shr->indirect, shi->indirect); // XXX multiply + } } } @@ -1770,18 +1769,20 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr) /* from now stuff everything in shr->combined: ambient, AO, radio, ramps, exposure */ if(!(ma->sss_flag & MA_DIFF_SSS) || !sss_pass_done(&R, ma)) { - /* add AO in combined? */ - if(R.wrld.mode & WO_AMB_OCC) - if(shi->combinedflag & SCE_PASS_AO) - ambient_occlusion_apply(shi, shr); - - if(R.wrld.mode & WO_ENV_LIGHT) - if(shi->combinedflag & SCE_PASS_ENVIRONMENT) - environment_lighting_apply(shi, shr); - - if(R.wrld.mode & WO_INDIRECT_LIGHT) - if(shi->combinedflag & SCE_PASS_INDIRECT) - indirect_lighting_apply(shi, shr); + if(R.r.mode & R_SHADOW) { + /* add AO in combined? */ + if(R.wrld.mode & WO_AMB_OCC) + if(shi->combinedflag & SCE_PASS_AO) + ambient_occlusion_apply(shi, shr); + + if(R.wrld.mode & WO_ENV_LIGHT) + if(shi->combinedflag & SCE_PASS_ENVIRONMENT) + environment_lighting_apply(shi, shr); + + if(R.wrld.mode & WO_INDIRECT_LIGHT) + if(shi->combinedflag & SCE_PASS_INDIRECT) + indirect_lighting_apply(shi, shr); + } shr->combined[0]+= shi->ambr; shr->combined[1]+= shi->ambg; diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c index 843f05f3766..7bc1a0611f0 100644 --- a/source/blender/render/intern/source/texture.c +++ b/source/blender/render/intern/source/texture.c @@ -2689,10 +2689,19 @@ void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, f case TEXCO_ANGMAP: /* only works with texture being "real" */ /* use saacos(), fixes bug [#22398], float precission caused lo[2] to be slightly less then -1.0 */ - fact= (1.0/M_PI)*saacos(lo[2])/(sqrt(lo[0]*lo[0] + lo[1]*lo[1])); - tempvec[0]= lo[0]*fact; - tempvec[1]= lo[1]*fact; - tempvec[2]= 0.0; + if(lo[0] || lo[1]) { /* check for zero case [#24807] */ + fact= (1.0/M_PI)*saacos(lo[2])/(sqrt(lo[0]*lo[0] + lo[1]*lo[1])); + tempvec[0]= lo[0]*fact; + tempvec[1]= lo[1]*fact; + tempvec[2]= 0.0; + } + else { + /* this value has no angle, the vector is directly along the view. + * avoide divide by zero and use a dummy value. */ + tempvec[0]= 1.0f; + tempvec[1]= 0.0; + tempvec[2]= 0.0; + } co= tempvec; break; diff --git a/source/blender/render/intern/source/voxeldata.c b/source/blender/render/intern/source/voxeldata.c index 914092f6c41..ac4aba3e4de 100644 --- a/source/blender/render/intern/source/voxeldata.c +++ b/source/blender/render/intern/source/voxeldata.c @@ -39,6 +39,7 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" +#include "BKE_global.h" #include "BKE_image.h" #include "BKE_main.h" #include "BKE_modifier.h" @@ -262,11 +263,12 @@ static void init_frame_smoke(VoxelData *vd) return; } -static void cache_voxeldata(struct Render *re,Tex *tex) +static void cache_voxeldata(struct Render *re, Tex *tex) { VoxelData *vd = tex->vd; FILE *fp; int curframe; + char path[FILE_MAX]; if (!vd) return; @@ -285,6 +287,8 @@ static void cache_voxeldata(struct Render *re,Tex *tex) else curframe = re->r.cfra; + BLI_strncpy(path, vd->source_path, FILE_MAX); + switch(vd->file_format) { case TEX_VD_IMAGE_SEQUENCE: load_frame_image_sequence(vd, tex); @@ -293,8 +297,9 @@ static void cache_voxeldata(struct Render *re,Tex *tex) init_frame_smoke(vd); return; case TEX_VD_BLENDERVOXEL: - if (!BLI_exists(vd->source_path)) return; - fp = fopen(vd->source_path,"rb"); + BLI_path_abs(path, G.main->name); + if (!BLI_exists(path)) return; + fp = fopen(path,"rb"); if (!fp) return; if(read_voxeldata_header(fp, vd)) @@ -304,8 +309,9 @@ static void cache_voxeldata(struct Render *re,Tex *tex) return; case TEX_VD_RAW_8BIT: - if (!BLI_exists(vd->source_path)) return; - fp = fopen(vd->source_path,"rb"); + BLI_path_abs(path, G.main->name); + if (!BLI_exists(path)) return; + fp = fopen(path,"rb"); if (!fp) return; if (load_frame_raw8(vd, fp, curframe)) @@ -355,7 +361,7 @@ int voxeldatatex(struct Tex *tex, float *texvec, struct TexResult *texres) add_v3_v3(co, offset); /* co is now in the range 0.0, 1.0 */ - switch (tex->extend) { + switch (vd->extend) { case TEX_CLIP: { if ((co[0] < 0.f || co[0] > 1.f) || (co[1] < 0.f || co[1] > 1.f) || (co[2] < 0.f || co[2] > 1.f)) { |