diff options
Diffstat (limited to 'source/blender/render/intern/source')
-rw-r--r-- | source/blender/render/intern/source/bake.c | 28 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 282 | ||||
-rw-r--r-- | source/blender/render/intern/source/initrender.c | 4 | ||||
-rw-r--r-- | source/blender/render/intern/source/multires_bake.c | 10 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 22 | ||||
-rw-r--r-- | source/blender/render/intern/source/pixelshading.c | 1 | ||||
-rw-r--r-- | source/blender/render/intern/source/render_result.c | 8 | ||||
-rw-r--r-- | source/blender/render/intern/source/render_texture.c | 14 | ||||
-rw-r--r-- | source/blender/render/intern/source/rendercore.c | 130 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadeoutput.c | 26 | ||||
-rw-r--r-- | source/blender/render/intern/source/sss.c | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/volume_precache.c | 4 |
12 files changed, 118 insertions, 413 deletions
diff --git a/source/blender/render/intern/source/bake.c b/source/blender/render/intern/source/bake.c index 72e47f89bb2..c150133b276 100644 --- a/source/blender/render/intern/source/bake.c +++ b/source/blender/render/intern/source/bake.c @@ -322,6 +322,10 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int UNUSED(qua if (bs->rect_mask) { bs->rect_mask[bs->rectx * y + x] = FILTER_MASK_USED; } + + if (bs->do_update) { + *bs->do_update = true; + } } static void bake_displacement(void *handle, ShadeInput *UNUSED(shi), float dist, int x, int y) @@ -1141,7 +1145,7 @@ struct Image *RE_bake_shade_get_image(void) static void add_single_heights_margin(const ImBuf *ibuf, const char *mask, float *heights_buffer) { - int x ,y; + int x, y; for (y = 0; y < ibuf->y; y++) { for (x = 0; x < ibuf->x; x++) { @@ -1200,11 +1204,11 @@ float RE_bake_make_derivative(ImBuf *ibuf, float *heights_buffer, const char *ma if (auto_range_fit) { /* If automatic range fitting is enabled. */ for (y = 0; y < ibuf->y; y++) { - const int Yu = y == (ibuf->y - 1) ? (ibuf->y - 1) : (y+1); + const int Yu = y == (ibuf->y - 1) ? (ibuf->y - 1) : (y + 1); const int Yc = y; const int Yd = y == 0 ? 0 : (y - 1); - for (x= 0; x < ibuf->x; x++) { + for (x = 0; x < ibuf->x; x++) { const int Xl = x == 0 ? 0 : (x - 1); const int Xc = x; const int Xr = x == (ibuf->x - 1) ? (ibuf->x - 1) : (x + 1); @@ -1244,11 +1248,11 @@ float RE_bake_make_derivative(ImBuf *ibuf, float *heights_buffer, const char *ma /* Output derivatives. */ auto_range_fit &= (max_num_deriv > 0); for (y = 0; y < ibuf->y; y++) { - const int Yu= y==(ibuf->y-1) ? (ibuf->y-1) : (y+1); - const int Yc= y; - const int Yd= y==0 ? 0 : (y-1); + const int Yu = y == (ibuf->y - 1) ? (ibuf->y - 1) : (y + 1); + const int Yc = y; + const int Yd = y == 0 ? 0 : (y - 1); - for(x= 0; x<ibuf->x; x++) { + for (x = 0; x < ibuf->x; x++) { const int Xl = x == 0 ? 0 : (x - 1); const int Xc = x; const int Xr = x == (ibuf->x - 1) ? (ibuf->x - 1) : (x + 1); @@ -1269,14 +1273,15 @@ float RE_bake_make_derivative(ImBuf *ibuf, float *heights_buffer, const char *ma /* Early out. */ index = ibuf->x * y + x; - if (mask[index] != FILTER_MASK_USED){ + if (mask[index] != FILTER_MASK_USED) { continue; } if (auto_range_fit) { deriv_x /= max_num_deriv; deriv_y /= max_num_deriv; - } else { + } + else { deriv_x *= (fmult / denom); deriv_y *= (fmult / denom); } @@ -1296,8 +1301,9 @@ float RE_bake_make_derivative(ImBuf *ibuf, float *heights_buffer, const char *ma rrgbf[1] = deriv_y; rrgbf[2] = 0.0f; rrgbf[3] = 1.0f; - } else { - char *rrgb = (char*)ibuf->rect + index * 4; + } + else { + char *rrgb = (char *)ibuf->rect + index * 4; rrgb[0] = FTOCHAR(deriv_x); rrgb[1] = FTOCHAR(deriv_y); diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 18f658fb169..fb9f96b0ef7 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -135,206 +135,11 @@ #endif /* ------------------------------------------------------------------------- */ - -/* Stuff for stars. This sits here because it uses gl-things. Part of - * this code may move down to the converter. */ -/* ------------------------------------------------------------------------- */ -/* this is a bad beast, since it is misused by the 3d view drawing as well. */ - -static HaloRen *initstar(Render *re, ObjectRen *obr, const float vec[3], float hasize) -{ - HaloRen *har; - float hoco[4]; - - projectverto(vec, re->winmat, hoco); - - har= RE_findOrAddHalo(obr, obr->tothalo++); - - /* projectvert is done in function zbufvlaggen again, because of parts */ - copy_v3_v3(har->co, vec); - har->hasize= hasize; - - har->zd= 0.0; - har->pool = re->pool; - - return har; -} - -/* there must be a 'fixed' amount of stars generated between - * near and far - * all stars must by preference lie on the far and solely - * differ in clarity/color - */ - -void RE_make_stars(Render *re, Scene *scenev3d, void (*initfunc)(void), - void (*vertexfunc)(const float *), void (*termfunc)(void)) -{ - extern unsigned char hash[512]; - ObjectRen *obr= NULL; - World *wrld= NULL; - HaloRen *har; - Scene *scene; - Object *camera; - Camera *cam; - RNG *rng; - double dblrand, hlfrand; - float vec[4], fx, fy, fz; - float fac, starmindist, clipend; - float mat[4][4], stargrid, maxrand, maxjit, force, alpha; - int x, y, z, sx, sy, sz, ex, ey, ez, done = FALSE; - unsigned int totstar= 0; - - if (initfunc) { - scene= scenev3d; - wrld= scene->world; - } - else { - scene= re->scene; - wrld= &(re->wrld); - } - - stargrid = wrld->stardist; /* distance between stars */ - maxrand = 2.0; /* amount a star can be shifted (in grid units) */ - maxjit = (wrld->starcolnoise); /* amount a color is being shifted */ - - /* size of stars */ - force = ( wrld->starsize ); - - /* minimal free space (starting at camera) */ - starmindist= wrld->starmindist; - - if (stargrid <= 0.10f) return; - - if (re) re->flag |= R_HALO; - else stargrid *= 1.0f; /* then it draws fewer */ - - if (re) invert_m4_m4(mat, re->viewmat); - else unit_m4(mat); - - /* BOUNDING BOX CALCULATION - * bbox goes from z = loc_near_var | loc_far_var, - * x = -z | +z, - * y = -z | +z - */ - - camera= re ? RE_GetCamera(re) : scene->camera; - - if (camera==NULL || camera->type != OB_CAMERA) - return; - - cam = camera->data; - clipend = cam->clipend; - - /* convert to grid coordinates */ - - sx = ((mat[3][0] - clipend) / stargrid) - maxrand; - sy = ((mat[3][1] - clipend) / stargrid) - maxrand; - sz = ((mat[3][2] - clipend) / stargrid) - maxrand; - - ex = ((mat[3][0] + clipend) / stargrid) + maxrand; - ey = ((mat[3][1] + clipend) / stargrid) + maxrand; - ez = ((mat[3][2] + clipend) / stargrid) + maxrand; - - dblrand = maxrand * stargrid; - hlfrand = 2.0 * dblrand; - - if (initfunc) { - initfunc(); - } - - if (re) /* add render object for stars */ - obr= RE_addRenderObject(re, NULL, NULL, 0, 0, 0); - - rng = BLI_rng_new(0); - - for (x = sx, fx = sx * stargrid; x <= ex; x++, fx += stargrid) { - for (y = sy, fy = sy * stargrid; y <= ey; y++, fy += stargrid) { - for (z = sz, fz = sz * stargrid; z <= ez; z++, fz += stargrid) { - - BLI_rng_seed(rng, (hash[z & 0xff] << 24) + (hash[y & 0xff] << 16) + (hash[x & 0xff] << 8)); - vec[0] = fx + (hlfrand * BLI_rng_get_double(rng)) - dblrand; - vec[1] = fy + (hlfrand * BLI_rng_get_double(rng)) - dblrand; - vec[2] = fz + (hlfrand * BLI_rng_get_double(rng)) - dblrand; - vec[3] = 1.0; - - if (vertexfunc) { - if (done & 1) vertexfunc(vec); - done++; - } - else { - if (re) - mul_m4_v3(re->viewmat, vec); - - /* in vec are global coordinates - * calculate distance to camera - * and using that, define the alpha - */ - alpha = len_v3(vec); - - if (alpha >= clipend) alpha = 0.0; - else if (alpha <= starmindist) alpha = 0.0; - else if (alpha <= 2.0f * starmindist) { - alpha = (alpha - starmindist) / starmindist; - } - else { - alpha -= 2.0f * starmindist; - alpha /= (clipend - 2.0f * starmindist); - alpha = 1.0f - alpha; - } - - - if (alpha != 0.0f) { - fac = force * BLI_rng_get_double(rng); - - har = initstar(re, obr, vec, fac); - - if (har) { - har->alfa = sqrt(sqrt(alpha)); - har->add= 255; - har->r = har->g = har->b = 1.0; - if (maxjit) { - har->r += ((maxjit * BLI_rng_get_double(rng)) ) - maxjit; - har->g += ((maxjit * BLI_rng_get_double(rng)) ) - maxjit; - har->b += ((maxjit * BLI_rng_get_double(rng)) ) - maxjit; - } - har->hard = 32; - har->lay= -1; - har->type |= HA_ONLYSKY; - done++; - } - } - } - - /* break out of the loop if generating stars takes too long */ - if (re && !(totstar % 1000000)) { - if (re->test_break(re->tbh)) { - x= ex + 1; - y= ey + 1; - z= ez + 1; - } - } - - totstar++; - } - /* do not call blender_test_break() here, since it is used in UI as well, confusing the callback system */ - /* main cause is G.is_break of course, a global again... (ton) */ - } - } - if (termfunc) termfunc(); - - if (obr) - re->tothalo += obr->tothalo; - - BLI_rng_free(rng); -} - - -/* ------------------------------------------------------------------------- */ /* tool functions/defines for ad hoc simplification and possible future * cleanup */ /* ------------------------------------------------------------------------- */ -#define UVTOINDEX(u,v) (startvlak + (u) * sizev + (v)) +#define UVTOINDEX(u, v) (startvlak + (u) * sizev + (v)) /* * * NOTE THAT U/V COORDINATES ARE SOMETIMES SWAPPED !! @@ -860,28 +665,13 @@ static void autosmooth(Render *UNUSED(re), ObjectRen *obr, float mat[4][4], int /* Orco hash and Materials */ /* ------------------------------------------------------------------------- */ -static float *get_object_orco(Render *re, Object *ob) +static float *get_object_orco(Render *re, void *ob) { - float *orco; - - if (!re->orco_hash) - re->orco_hash = BLI_ghash_ptr_new("get_object_orco gh"); - - orco = BLI_ghash_lookup(re->orco_hash, ob); - - if (!orco) { - if (ELEM(ob->type, OB_CURVE, OB_FONT)) { - orco = BKE_curve_make_orco(re->scene, ob, NULL); - } - else if (ob->type==OB_SURF) { - orco = BKE_curve_surf_make_orco(ob); - } - - if (orco) - BLI_ghash_insert(re->orco_hash, ob, orco); + if (!re->orco_hash) { + return NULL; } - return orco; + return BLI_ghash_lookup(re->orco_hash, ob); } static void set_object_orco(Render *re, void *ob, float *orco) @@ -1676,8 +1466,11 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if (path_nbr) { if (!ELEM(ma->material_type, MA_TYPE_HALO, MA_TYPE_WIRE)) { - sd.orco = MEM_mallocN(3*sizeof(float)*(totpart+totchild), "particle orcos"); - set_object_orco(re, psys, sd.orco); + sd.orco = get_object_orco(re, psys); + if (!sd.orco) { + sd.orco = MEM_mallocN(3*sizeof(float)*(totpart+totchild), "particle orcos"); + set_object_orco(re, psys, sd.orco); + } } } @@ -1848,9 +1641,11 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if (strandbuf) { int orignum = (index_mf_to_mpoly) ? DM_origindex_mface_mpoly(index_mf_to_mpoly, index_mp_to_orig, cpa->num) : cpa->num; - if (orignum > sbound - strandbuf->bound) { - sbound= strandbuf->bound + orignum; - sbound->start= sbound->end= obr->totstrand; + if ((orignum > sbound - strandbuf->bound) && + (orignum < strandbuf->totbound)) + { + sbound = &strandbuf->bound[orignum]; + sbound->start = sbound->end = obr->totstrand; } } } @@ -2829,9 +2624,12 @@ static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset) if (dm) { if (need_orco) { - orco= BKE_displist_make_orco(re->scene, ob, dm, 1, 1); - if (orco) { - set_object_orco(re, ob, orco); + orco = get_object_orco(re, ob); + if (!orco) { + orco= BKE_displist_make_orco(re->scene, ob, dm, 1, 1); + if (orco) { + set_object_orco(re, ob, orco); + } } } @@ -2840,7 +2638,11 @@ static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset) } else { if (need_orco) { - orco= get_object_orco(re, ob); + orco = get_object_orco(re, ob); + if (!orco) { + orco = BKE_curve_surf_make_orco(ob); + set_object_orco(re, ob, orco); + } } /* walk along displaylist and create rendervertices/-faces */ @@ -2900,9 +2702,12 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) if (dm) { if (need_orco) { - orco= BKE_displist_make_orco(re->scene, ob, dm, 1, 1); - if (orco) { - set_object_orco(re, ob, orco); + orco = get_object_orco(re, ob); + if (!orco) { + orco = BKE_displist_make_orco(re->scene, ob, dm, 1, 1); + if (orco) { + set_object_orco(re, ob, orco); + } } } @@ -2912,6 +2717,10 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) else { if (need_orco) { orco = get_object_orco(re, ob); + if (!orco) { + orco = BKE_curve_make_orco(re->scene, ob, NULL); + set_object_orco(re, ob, orco); + } } while (dl) { @@ -3401,10 +3210,13 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) if (dm==NULL) return; /* in case duplicated object fails? */ if (mask & CD_MASK_ORCO) { - orco= dm->getVertDataArray(dm, CD_ORCO); - if (orco) { - orco= MEM_dupallocN(orco); - set_object_orco(re, ob, orco); + orco = get_object_orco(re, ob); + if (!orco) { + orco= dm->getVertDataArray(dm, CD_ORCO); + if (orco) { + orco= MEM_dupallocN(orco); + set_object_orco(re, ob, orco); + } } } @@ -5361,15 +5173,7 @@ void RE_Database_Preprocess(Render *re) if (!re->test_break(re->tbh)) { int tothalo; - /* don't sort stars */ tothalo= re->tothalo; - if (!re->test_break(re->tbh)) { - if (re->wrld.mode & WO_STARS) { - re->i.infostr = IFACE_("Creating Starfield"); - re->stats_draw(re->sdh, &re->i); - RE_make_stars(re, NULL, NULL, NULL, NULL); - } - } sort_halos(re, tothalo); init_camera_inside_volumes(re); diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index 6cac2fa3fa6..28932d0e93b 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -555,7 +555,7 @@ void RE_parts_init(Render *re, int do_crop) /* this is render info for caller, is not reset when parts are freed! */ re->i.totpart = 0; re->i.curpart = 0; - re->i.partsdone = FALSE; + re->i.partsdone = 0; /* just for readable code.. */ xminb = re->disprect.xmin; @@ -608,7 +608,7 @@ void RE_parts_init(Render *re, int do_crop) RenderPart *pa = MEM_callocN(sizeof(RenderPart), "new part"); /* Non-box filters need 2 pixels extra to work */ - if (do_crop && (re->r.filtertype || (re->r.mode & R_EDGE))) { + if (do_crop && re->r.filtertype) { pa->crop = 2; disprect.xmin -= pa->crop; disprect.ymin -= pa->crop; diff --git a/source/blender/render/intern/source/multires_bake.c b/source/blender/render/intern/source/multires_bake.c index 3259608c18f..3ae075b4936 100644 --- a/source/blender/render/intern/source/multires_bake.c +++ b/source/blender/render/intern/source/multires_bake.c @@ -95,6 +95,7 @@ typedef struct { char *texels; const MResolvePixelData *data; MFlushPixel flush_pixel; + short *do_update; } MBakeRast; typedef struct { @@ -162,7 +163,8 @@ static void multiresbake_get_normal(const MResolvePixelData *data, float norm[], } } -static void init_bake_rast(MBakeRast *bake_rast, const ImBuf *ibuf, const MResolvePixelData *data, MFlushPixel flush_pixel) +static void init_bake_rast(MBakeRast *bake_rast, const ImBuf *ibuf, const MResolvePixelData *data, + MFlushPixel flush_pixel, short *do_update) { BakeImBufuserData *userdata = (BakeImBufuserData *) ibuf->userdata; @@ -173,6 +175,7 @@ static void init_bake_rast(MBakeRast *bake_rast, const ImBuf *ibuf, const MResol bake_rast->h = ibuf->y; bake_rast->data = data; bake_rast->flush_pixel = flush_pixel; + bake_rast->do_update = do_update; } static void flush_pixel(const MResolvePixelData *data, const int x, const int y) @@ -240,6 +243,9 @@ static void set_rast_triangle(const MBakeRast *bake_rast, const int x, const int if ((bake_rast->texels[y * w + x]) == 0) { bake_rast->texels[y * w + x] = FILTER_MASK_USED; flush_pixel(bake_rast->data, x, y); + if (bake_rast->do_update) { + *bake_rast->do_update = true; + } } } } @@ -529,7 +535,7 @@ static void do_multires_bake(MultiresBakeRender *bkr, Image *ima, int require_ta handle->height_min = FLT_MAX; handle->height_max = -FLT_MAX; - init_bake_rast(&handle->bake_rast, ibuf, &handle->data, flush_pixel); + init_bake_rast(&handle->bake_rast, ibuf, &handle->data, flush_pixel, bkr->do_update); if (tot_thread > 1) BLI_insert_thread(&threads, handle); diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index fa05f8dd18d..d11f4615698 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1600,6 +1600,7 @@ static void tag_scenes_for_render(Render *re) /* check for render-layers nodes using other scenes, we tag them LIB_DOIT */ for (node = re->scene->nodetree->nodes.first; node; node = node->next) { + node->flag &= ~NODE_TEST; if (node->type == CMP_NODE_R_LAYERS) { if (node->id) { if (!MAIN_VERSION_ATLEAST(re->main, 265, 5)) { @@ -1617,8 +1618,12 @@ static void tag_scenes_for_render(Render *re) } } - if (node->id != (ID *)re->scene) - node->id->flag |= LIB_DOIT; + if (node->id != (ID *)re->scene) { + if ((node->id->flag & LIB_DOIT) == 0) { + node->flag |= NODE_TEST; + node->id->flag |= LIB_DOIT; + } + } } } } @@ -1640,12 +1645,12 @@ static void ntree_render_scenes(Render *re) for (node = re->scene->nodetree->nodes.first; node; node = node->next) { if (node->type == CMP_NODE_R_LAYERS) { if (node->id && node->id != (ID *)re->scene) { - if (node->id->flag & LIB_DOIT) { + if (node->flag & NODE_TEST) { Scene *scene = (Scene *)node->id; render_scene(re, scene, cfra); restore_scene = (scene != re->scene); - node->id->flag &= ~LIB_DOIT; + node->flag &= ~NODE_TEST; nodeUpdate(re->scene->nodetree, node); } @@ -1679,7 +1684,7 @@ static void add_freestyle(Render *re, int render) * real bmain uses. This is needed because freestyle's * bmain could be used to tag scenes for update, which * implies call of ED_render_scene_update in some cases - * and that function requires proper windoew manager + * and that function requires proper window manager * to present (sergey) */ re->freestyle_bmain.wm = re->main->wm; @@ -2288,13 +2293,6 @@ int RE_is_rendering_allowed(Scene *scene, Object *camera_override, ReportList *r BKE_report(reports, RPT_ERROR, "Cannot save render buffers, check the temp default path"); return 0; } - - /* no fullsample and edge */ - if ((scemode & R_FULL_SAMPLE) && (scene->r.mode & R_EDGE)) { - BKE_report(reports, RPT_ERROR, "Full sample does not support edge enhance"); - return 0; - } - } if (scemode & R_DOCOMP) { diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c index 43e052a6efc..feaf68a8c4a 100644 --- a/source/blender/render/intern/source/pixelshading.c +++ b/source/blender/render/intern/source/pixelshading.c @@ -289,7 +289,6 @@ int shadeHaloFloat(HaloRen *har, float col[4], int zz, if (R.wrld.mode & WO_MIST) { if (har->type & HA_ONLYSKY) { - /* stars but no mist */ alpha= har->alfa; } else { diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c index 37587d89ce0..487de42515d 100644 --- a/source/blender/render/intern/source/render_result.c +++ b/source/blender/render/intern/source/render_result.c @@ -1124,7 +1124,13 @@ ImBuf *render_result_rect_to_ibuf(RenderResult *rr, RenderData *rd) */ if (ibuf->rect) { if (BKE_imtype_valid_depths(rd->im_format.imtype) & (R_IMF_CHAN_DEPTH_12 | R_IMF_CHAN_DEPTH_16 | R_IMF_CHAN_DEPTH_24 | R_IMF_CHAN_DEPTH_32)) { - IMB_float_from_rect(ibuf); + if (rd->im_format.depth == R_IMF_CHAN_DEPTH_8) { + /* Higher depth bits are supported but not needed for current file output. */ + ibuf->rect_float = NULL; + } + else { + IMB_float_from_rect(ibuf); + } } else { /* ensure no float buffer remained from previous frame */ diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index 49052150fe3..049d7e5a732 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -1724,7 +1724,7 @@ static int compatible_bump_compute(CompatibleBump *compat_bump, ShadeInput *shi, const float bf = -0.04f*Tnor*mtex->norfac; int rgbnor; /* disable internal bump eval */ - float* nvec = texres->nor; + float *nvec = texres->nor; texres->nor = NULL; /* du & dv estimates, constant value defaults */ du = dv = 0.01f; @@ -3558,12 +3558,15 @@ Material *RE_init_sample_material(Material *orig_mat, Scene *scene) /* strip material copy from unsupported flags */ for (tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) { - if (mat->septex & (1<<tex_nr)) continue; if (mat->mtex[tex_nr]) { MTex *mtex = mat->mtex[tex_nr]; - if (!mtex->tex) continue; + /* just in case make all non-used mtexes empty*/ + Tex *cur_tex = mtex->tex; + mtex->tex = NULL; + + if (mat->septex & (1<<tex_nr) || !cur_tex) continue; /* only keep compatible texflags */ mtex->texflag = mtex->texflag & (MTEX_RGBTOINT | MTEX_STENCIL | MTEX_NEGATIVE | MTEX_ALPHAMIX); @@ -3598,7 +3601,7 @@ Material *RE_init_sample_material(Material *orig_mat, Scene *scene) } /* copy texture */ - tex= mtex->tex = localize_texture(mtex->tex); + tex= mtex->tex = localize_texture(cur_tex); /* update texture anims */ BKE_animsys_evaluate_animdata(scene, &tex->id, tex->adt, BKE_scene_frame_get(scene), ADT_RECALC_ANIM); @@ -3646,7 +3649,8 @@ void RE_free_sample_material(Material *mat) } } - BKE_material_free(mat); + /* don't update user counts as we are freeing a duplicate */ + BKE_material_free_ex(mat, false); MEM_freeN(mat); } diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 89d8345a0d7..8791af55792 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -967,25 +967,6 @@ static void addps(ListBase *lb, intptr_t *rd, int obi, int facenr, int z, int ma ps->shadfac= 0; } -static void edge_enhance_add(RenderPart *pa, float *rectf, float *arect) -{ - float addcol[4]; - int pix; - - if (arect==NULL) - return; - - for (pix= pa->rectx*pa->recty; pix>0; pix--, arect++, rectf+=4) { - if (*arect != 0.0f) { - addcol[0]= *arect * R.r.edgeR; - addcol[1]= *arect * R.r.edgeG; - addcol[2]= *arect * R.r.edgeB; - addcol[3]= *arect; - addAlphaOverFloat(rectf, addcol); - } - } -} - /* clamp alpha and RGB to 0..1 and 0..inf, can go outside due to filter */ static void clamp_alpha_rgb_range(RenderPart *pa, RenderLayer *rl) { @@ -1010,67 +991,6 @@ static void clamp_alpha_rgb_range(RenderPart *pa, RenderLayer *rl) } } -/* adds only alpha values */ -static void edge_enhance_tile(RenderPart *pa, float *rectf, int *rectz) -{ - /* use zbuffer to define edges, add it to the image */ - int y, x, col, *rz, *rz1, *rz2, *rz3; - int zval1, zval2, zval3; - float *rf; - - /* shift values in zbuffer 4 to the right (anti overflows), for filter we need multiplying with 12 max */ - rz= rectz; - if (rz==NULL) return; - - for (y=0; y<pa->recty; y++) - for (x=0; x<pa->rectx; x++, rz++) (*rz)>>= 4; - - rz1= rectz; - rz2= rz1+pa->rectx; - rz3= rz2+pa->rectx; - - rf= rectf+pa->rectx+1; - - for (y=0; y<pa->recty-2; y++) { - for (x=0; x<pa->rectx-2; x++, rz1++, rz2++, rz3++, rf++) { - - /* prevent overflow with sky z values */ - zval1= rz1[0] + 2*rz1[1] + rz1[2]; - zval2= 2*rz2[0] + 2*rz2[2]; - zval3= rz3[0] + 2*rz3[1] + rz3[2]; - - col= ( 4*rz2[1] - (zval1 + zval2 + zval3)/3 ); - if (col<0) col= -col; - - col >>= 5; - if (col > (1<<16)) col= (1<<16); - else col= (R.r.edgeint*col)>>8; - - if (col>0) { - float fcol; - - if (col>255) fcol= 1.0f; - else fcol= (float)col/255.0f; - - if (R.osa) - *rf+= fcol/(float)R.osa; - else - *rf= fcol; - } - } - rz1+= 2; - rz2+= 2; - rz3+= 2; - rf+= 2; - } - - /* shift back zbuf values, we might need it still */ - rz= rectz; - for (y=0; y<pa->recty; y++) - for (x=0; x<pa->rectx; x++, rz++) (*rz)<<= 4; - -} - static void reset_sky_speed(RenderPart *pa, RenderLayer *rl) { /* for all pixels with max speed, set to zero */ @@ -1149,7 +1069,6 @@ static void addAlphaOverFloatMask(float *dest, float *source, unsigned short dma typedef struct ZbufSolidData { RenderLayer *rl; ListBase *psmlist; - float *edgerect; } ZbufSolidData; static void make_pixelstructs(RenderPart *pa, ZSpan *zspan, int sample, void *data) @@ -1171,10 +1090,6 @@ static void make_pixelstructs(RenderPart *pa, ZSpan *zspan, int sample, void *da } } } - - if (sdata->rl->layflag & SCE_LAY_EDGE) - if (R.r.mode & R_EDGE) - edge_enhance_tile(pa, sdata->edgerect, zspan->rectz); } /* main call for shading Delta Accum, for OSA */ @@ -1184,7 +1099,6 @@ void zbufshadeDA_tile(RenderPart *pa) RenderResult *rr= pa->result; RenderLayer *rl; ListBase psmlist= {NULL, NULL}; - float *edgerect= NULL; /* allocate the necessary buffers */ /* zbuffer inits these rects */ @@ -1195,21 +1109,16 @@ void zbufshadeDA_tile(RenderPart *pa) if ((rl->layflag & SCE_LAY_ZMASK) && (rl->layflag & SCE_LAY_NEG_ZMASK)) pa->rectmask= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectmask"); - /* initialize pixelstructs and edge buffer */ + /* initialize pixelstructs */ addpsmain(&psmlist); pa->rectdaps= MEM_callocN(sizeof(intptr_t)*pa->rectx*pa->recty+4, "zbufDArectd"); - if (rl->layflag & SCE_LAY_EDGE) - if (R.r.mode & R_EDGE) - edgerect= MEM_callocN(sizeof(float)*pa->rectx*pa->recty, "rectedge"); - /* always fill visibility */ for (pa->sample=0; pa->sample<R.osa; pa->sample+=4) { ZbufSolidData sdata; sdata.rl= rl; sdata.psmlist= &psmlist; - sdata.edgerect= edgerect; zbuffer_solid(pa, rl, make_pixelstructs, &sdata); if (R.test_break(R.tbh)) break; } @@ -1276,18 +1185,12 @@ void zbufshadeDA_tile(RenderPart *pa) } /* sun/sky */ - if (rl->layflag & SCE_LAY_SKY) + if (rl->layflag & SCE_LAY_SKY) { atm_tile(pa, rl); - - /* sky before edge */ - if (rl->layflag & SCE_LAY_SKY) sky_tile(pa, rl); + } - /* extra layers */ - if (rl->layflag & SCE_LAY_EDGE) - if (R.r.mode & R_EDGE) - edge_enhance_add(pa, rl->rectf, edgerect); - + /* extra layers */ if (rl->passflag & SCE_PASS_VECTOR) reset_sky_speed(pa, rl); @@ -1297,9 +1200,6 @@ void zbufshadeDA_tile(RenderPart *pa) /* free stuff within loop! */ MEM_freeN(pa->rectdaps); pa->rectdaps= NULL; freeps(&psmlist); - - if (edgerect) MEM_freeN(edgerect); - edgerect= NULL; if (pa->rectmask) { MEM_freeN(pa->rectmask); @@ -1328,7 +1228,6 @@ void zbufshade_tile(RenderPart *pa) RenderResult *rr= pa->result; RenderLayer *rl; PixStr ps; - float *edgerect= NULL; /* fake pixel struct, to comply to osa render */ ps.next= NULL; @@ -1350,14 +1249,6 @@ void zbufshade_tile(RenderPart *pa) if (!R.test_break(R.tbh)) { /* NOTE: this if () is not consistent */ - /* edges only for solid part, ztransp doesn't support it yet anti-aliased */ - if (rl->layflag & SCE_LAY_EDGE) { - if (R.r.mode & R_EDGE) { - edgerect= MEM_callocN(sizeof(float)*pa->rectx*pa->recty, "rectedge"); - edge_enhance_tile(pa, edgerect, pa->rectz); - } - } - /* initialize scanline updates for main thread */ rr->renrect.ymin = 0; rr->renlay= rl; @@ -1438,24 +1329,13 @@ void zbufshade_tile(RenderPart *pa) } /* sun/sky */ - if (rl->layflag & SCE_LAY_SKY) + if (rl->layflag & SCE_LAY_SKY) { atm_tile(pa, rl); - - /* sky before edge */ - if (rl->layflag & SCE_LAY_SKY) sky_tile(pa, rl); - - 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); } if (rl->passflag & SCE_PASS_VECTOR) reset_sky_speed(pa, rl); - - if (edgerect) MEM_freeN(edgerect); - edgerect= NULL; if (pa->rectmask) { MEM_freeN(pa->rectmask); diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index 114961394c4..dbc9c47446f 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -1789,18 +1789,20 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr) } /* AO pass */ - 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))) - { - if (R.r.mode & R_SHADOW) { - /* AO was calculated for scanline already */ - if (shi->depth || shi->volume_depth) - ambient_occlusion(shi); - copy_v3_v3(shr->ao, shi->ao); - copy_v3_v3(shr->env, shi->env); /* XXX multiply */ - copy_v3_v3(shr->indirect, shi->indirect); /* XXX multiply */ - } + 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))) { + if ((R.wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) && (R.r.mode & R_SHADOW)) { + /* AO was calculated for scanline already */ + if (shi->depth || shi->volume_depth) + ambient_occlusion(shi); + copy_v3_v3(shr->ao, shi->ao); + copy_v3_v3(shr->env, shi->env); /* XXX multiply */ + copy_v3_v3(shr->indirect, shi->indirect); /* XXX multiply */ + } + else { + shr->ao[0]= shr->ao[1]= shr->ao[2]= 1.0f; + zero_v3(shr->env); + zero_v3(shr->indirect); } } diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c index 732892ed357..3ec487f63dc 100644 --- a/source/blender/render/intern/source/sss.c +++ b/source/blender/render/intern/source/sss.c @@ -878,7 +878,7 @@ static void sss_create_tree_mat(Render *re, Material *mat) re->r.mode &= ~R_OSA; re->sss_points= &points; re->sss_mat= mat; - re->i.partsdone = FALSE; + re->i.partsdone = 0; if (!(re->r.scemode & (R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW))) re->result= NULL; diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c index 6912f998e7a..e5e3aff573d 100644 --- a/source/blender/render/intern/source/volume_precache.c +++ b/source/blender/render/intern/source/volume_precache.c @@ -495,7 +495,7 @@ typedef struct VolPrecacheState { int totparts; } VolPrecacheState; -static void vol_precache_part(TaskPool *pool, void *taskdata, int threadid) +static void vol_precache_part(TaskPool *pool, void *taskdata, int UNUSED(threadid)) { VolPrecacheState *state = (VolPrecacheState *)BLI_task_pool_userdata(pool); VolPrecachePart *pa = (VolPrecachePart *)taskdata; @@ -513,7 +513,7 @@ static void vol_precache_part(TaskPool *pool, void *taskdata, int threadid) if (re->test_break && re->test_break(re->tbh)) return; - printf("thread id %d\n", threadid); + //printf("thread id %d\n", threadid); res[0]= pa->res[0]; res[1]= pa->res[1]; |