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/rendercore.c')
-rw-r--r--source/blender/render/intern/source/rendercore.c117
1 files changed, 81 insertions, 36 deletions
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 0d894073cee..9fe2620747c 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -59,6 +59,7 @@
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_texture.h"
+#include "BKE_scene.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -93,7 +94,7 @@ extern struct Render R;
/* x and y are current pixels in rect to be rendered */
/* do not normalize! */
-void calc_view_vector(float *view, float x, float y)
+void calc_view_vector(float view[3], float x, float y)
{
view[2]= -ABS(R.clipsta);
@@ -184,7 +185,8 @@ static void halo_pixelstruct(HaloRen *har, RenderLayer **rlpp, int totsample, in
fullsample= (totsample > 1);
amount= 0;
- accol[0]=accol[1]=accol[2]=accol[3]= 0.0f;
+ accol[0] = accol[1] = accol[2] = accol[3]= 0.0f;
+ col[0] = col[1] = col[2] = col[3]= 0.0f;
flarec= har->flarec;
while (ps) {
@@ -271,23 +273,33 @@ static void halo_tile(RenderPart *pa, RenderLayer *rl)
har= R.sortedhalos[a];
/* layer test, clip halo with y */
- if ((har->lay & lay)==0);
- else if (testrect.ymin > har->maxy);
- else if (testrect.ymax < har->miny);
+ if ((har->lay & lay) == 0) {
+ /* pass */
+ }
+ else if (testrect.ymin > har->maxy) {
+ /* pass */
+ }
+ else if (testrect.ymax < har->miny) {
+ /* pass */
+ }
else {
minx= floor(har->xs-har->rad);
maxx= ceil(har->xs+har->rad);
- if (testrect.xmin > maxx);
- else if (testrect.xmax < minx);
+ if (testrect.xmin > maxx) {
+ /* pass */
+ }
+ else if (testrect.xmax < minx) {
+ /* pass */
+ }
else {
- minx= MAX2(minx, testrect.xmin);
- maxx= MIN2(maxx, testrect.xmax);
+ minx = max_ii(minx, testrect.xmin);
+ maxx = min_ii(maxx, testrect.xmax);
- miny= MAX2(har->miny, testrect.ymin);
- maxy= MIN2(har->maxy, testrect.ymax);
+ miny = max_ii(har->miny, testrect.ymin);
+ maxy = min_ii(har->maxy, testrect.ymax);
for (y=miny; y<maxy; y++) {
int rectofs= (y-disprect.ymin)*pa->rectx + (minx - disprect.xmin);
@@ -660,7 +672,7 @@ int get_sample_layers(RenderPart *pa, RenderLayer *rl, RenderLayer **rlpp)
RenderResult *rr= BLI_findlink(&pa->fullresult, sample);
rlpp[sample]= BLI_findlink(&rr->layers, nr);
- }
+ }
return R.osa;
}
else {
@@ -703,7 +715,7 @@ static void sky_tile(RenderPart *pa, RenderLayer *rl)
addAlphaUnderFloat(pass, col);
}
}
- }
+ }
}
if (y&1)
@@ -761,8 +773,8 @@ static void atm_tile(RenderPart *pa, RenderLayer *rl)
if (*zrect >= 9.9e10f || rgbrect[3]==0.0f) {
continue;
}
-
- if ((lar->sunsky->effect_type & LA_SUN_EFFECT_AP)) {
+
+ if ((lar->sunsky->effect_type & LA_SUN_EFFECT_AP)) {
float tmp_rgb[3];
/* skip if worldspace lamp vector is below horizon */
@@ -917,7 +929,7 @@ static void addps(ListBase *lb, intptr_t *rd, int obi, int facenr, int z, int ma
PixStrMain *psm;
PixStr *ps, *last= NULL;
- if (*rd) {
+ if (*rd) {
ps= (PixStr *)(*rd);
while (ps) {
@@ -980,7 +992,9 @@ static void convert_to_key_alpha(RenderPart *pa, RenderLayer *rl)
float *rectf= rlpp[sample]->rectf;
for (y= pa->rectx*pa->recty; y>0; y--, rectf+=4) {
- if (rectf[3] >= 1.0f);
+ if (rectf[3] >= 1.0f) {
+ /* pass */
+ }
else if (rectf[3] > 0.0f) {
rectf[0] /= rectf[3];
rectf[1] /= rectf[3];
@@ -1569,7 +1583,7 @@ static void shade_sample_sss(ShadeSample *ssamp, Material *mat, ObjectInstanceRe
copy_v3_v3(shi->facenor, nor);
shade_input_set_viewco(shi, x, y, sx, sy, z);
- *area = minf(len_v3(shi->dxco) * len_v3(shi->dyco), 2.0f * orthoarea);
+ *area = min_ff(len_v3(shi->dxco) * len_v3(shi->dyco), 2.0f * orthoarea);
shade_input_set_uv(shi);
shade_input_set_normals(shi);
@@ -1833,16 +1847,23 @@ static void renderhalo_post(RenderResult *rr, float *rectf, HaloRen *har) /* pos
har->miny= miny= haloys - har->rad/R.ycor;
har->maxy= maxy= haloys + har->rad/R.ycor;
- if (maxy<0);
- else if (rr->recty<miny);
+ if (maxy < 0) {
+ /* pass */
+ }
+ else if (rr->recty < miny) {
+ /* pass */
+ }
else {
- minx= floor(haloxs-har->rad);
- maxx= ceil(haloxs+har->rad);
+ minx = floor(haloxs - har->rad);
+ maxx = ceil(haloxs + har->rad);
- if (maxx<0);
- else if (rr->rectx<minx);
+ if (maxx < 0) {
+ /* pass */
+ }
+ else if (rr->rectx < minx) {
+ /* pass */
+ }
else {
-
if (minx<0) minx= 0;
if (maxx>=rr->rectx) maxx= rr->rectx-1;
if (miny<0) miny= 0;
@@ -1992,7 +2013,7 @@ void add_halo_flare(Render *re)
re->display_draw(re->ddh, rr, NULL);
}
- R.r.mode= mode;
+ R.r.mode= mode;
}
/* ************************* bake ************************ */
@@ -2099,7 +2120,9 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int UNUSED(qua
copy_v3_v3(nor, shi->vn);
- if (R.r.bake_normal_space == R_BAKE_SPACE_CAMERA);
+ if (R.r.bake_normal_space == R_BAKE_SPACE_CAMERA) {
+ /* pass */
+ }
else if (R.r.bake_normal_space == R_BAKE_SPACE_TANGENT) {
float mat[3][3], imat[3][3];
@@ -2202,7 +2225,8 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int UNUSED(qua
float rgb[3];
copy_v3_v3(rgb, shr.combined);
- IMB_colormanagement_scene_linear_to_colorspace_v3(rgb, bs->rect_colorspace);
+ if (R.scene_color_manage)
+ IMB_colormanagement_scene_linear_to_colorspace_v3(rgb, bs->rect_colorspace);
rgb_float_to_uchar(col, rgb);
}
else {
@@ -2352,10 +2376,28 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
v2= vlr->v2->co;
v3= vlr->v3->co;
}
-
- /* renderco */
+
l= 1.0f-u-v;
+
+ /* shrink barycentric coordinates inwards slightly to avoid some issues
+ * where baking selected to active might just miss the other face at the
+ * near the edge of a face */
+ if (bs->actob) {
+ const float eps = 1.0f - 1e-4f;
+ float invsum;
+
+ u = (u - 0.5f)*eps + 0.5f;
+ v = (v - 0.5f)*eps + 0.5f;
+ l = (l - 0.5f)*eps + 0.5f;
+
+ invsum = 1.0f/(u + v + l);
+
+ u *= invsum;
+ v *= invsum;
+ l *= invsum;
+ }
+ /* renderco */
shi->co[0]= l*v3[0]+u*v1[0]+v*v2[0];
shi->co[1]= l*v3[1]+u*v1[1]+v*v2[1];
shi->co[2]= l*v3[2]+u*v1[2]+v*v2[2];
@@ -2451,7 +2493,7 @@ static int get_next_bake_face(BakeShade *bs)
return 0;
}
- BLI_lock_thread(LOCK_CUSTOM1);
+ BLI_lock_thread(LOCK_CUSTOM1);
for (; obi; obi=obi->next, v=0) {
obr= obi->obr;
@@ -2492,11 +2534,13 @@ static int get_next_bake_face(BakeShade *bs)
/* clear image */
if (R.r.bake_flag & R_BAKE_CLEAR)
IMB_rectfill(ibuf, (ibuf->planes == R_IMF_PLANES_RGBA) ? vec_alpha : vec_solid);
-
+
/* might be read by UI to set active image for display */
R.bakebuf= ima;
- }
-
+ }
+
+ ibuf->userflags |= IB_DISPLAY_BUFFER_INVALID;
+
bs->obi= obi;
bs->vlr= vlr;
@@ -2532,7 +2576,7 @@ static void shade_tface(BakeShade *bs)
/* note, these calls only free/fill contents of zspan struct, not zspan itself */
zbuf_free_span(bs->zspan);
zbuf_alloc_span(bs->zspan, bs->ibuf->x, bs->ibuf->y, R.clipcrop);
- }
+ }
bs->rectx= bs->ibuf->x;
bs->recty= bs->ibuf->y;
@@ -2630,6 +2674,8 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up
Image *ima;
int a, vdone = FALSE, use_mask = FALSE, result = BAKE_RESULT_OK;
+ re->scene_color_manage = BKE_scene_check_color_management_enabled(re->scene);
+
/* initialize render global */
R= *re;
R.bakebuf= NULL;
@@ -2712,7 +2758,6 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up
RE_bake_ibuf_filter(ibuf, (char *)ibuf->userdata, re->r.bake_filter);
ibuf->userflags |= IB_BITMAPDIRTY;
- if (ibuf->rect_float) IMB_rect_from_float(ibuf);
}
}