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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/render/intern/source')
-rw-r--r--source/blender/render/intern/source/bake.c28
-rw-r--r--source/blender/render/intern/source/convertblender.c282
-rw-r--r--source/blender/render/intern/source/initrender.c4
-rw-r--r--source/blender/render/intern/source/multires_bake.c10
-rw-r--r--source/blender/render/intern/source/pipeline.c22
-rw-r--r--source/blender/render/intern/source/pixelshading.c1
-rw-r--r--source/blender/render/intern/source/render_result.c8
-rw-r--r--source/blender/render/intern/source/render_texture.c14
-rw-r--r--source/blender/render/intern/source/rendercore.c130
-rw-r--r--source/blender/render/intern/source/shadeoutput.c26
-rw-r--r--source/blender/render/intern/source/sss.c2
-rw-r--r--source/blender/render/intern/source/volume_precache.c4
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];