diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2007-05-08 14:15:51 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2007-05-08 14:15:51 +0400 |
commit | 15e79ef4c834ea31b14ef72d522fb0a5d00dc76e (patch) | |
tree | f1718381a9b83a7cb3edbb19657d74e162344862 /source | |
parent | ad30c0b48b2d8f1adc32bcccc3f27ef1ef76a42d (diff) |
SSS fixes:
- Radius R, G, B sliders had too small number increase on clicking.
- Preview render now renders with higher SSS error setting to speed it up a
bit.
- bug #6664: 3d preview render had artifacts. re->viewdx/dy wasn't set then,
which is needed to estimate the area of each point. Have set this now, not
in the nicest way, there is some bit duplicated code, but I don't want to
refactor existing code with the chance of breaking it at this point.
- bug #6665: grid like artifacts with parts rendering. The two extra pixels
around parts used for filtering were used as well, leading to double points.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/include/BSE_view.h | 2 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_pipeline.h | 1 | ||||
-rw-r--r-- | source/blender/render/intern/source/initrender.c | 5 | ||||
-rw-r--r-- | source/blender/render/intern/source/rendercore.c | 17 | ||||
-rw-r--r-- | source/blender/render/intern/source/sss.c | 11 | ||||
-rw-r--r-- | source/blender/src/buttons_shading.c | 6 | ||||
-rw-r--r-- | source/blender/src/previewrender.c | 10 | ||||
-rw-r--r-- | source/blender/src/view.c | 17 |
8 files changed, 52 insertions, 17 deletions
diff --git a/source/blender/include/BSE_view.h b/source/blender/include/BSE_view.h index 5943e265f4f..91f360338e9 100644 --- a/source/blender/include/BSE_view.h +++ b/source/blender/include/BSE_view.h @@ -77,7 +77,7 @@ void calctrackballvecfirst(struct rcti *area, short *mval, float *vec); void calctrackballvec(struct rcti *area, short *mval, float *vec); void viewmove(int mode); -int get_view3d_viewplane(int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend); +int get_view3d_viewplane(int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize); void setwinmatrixview3d(int winx, int winy, struct rctf *rect); void obmat_to_viewmat(struct Object *ob, short smooth); diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 824050d802f..9abc873172f 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -158,6 +158,7 @@ void RE_SetDispRect (struct Render *re, rcti *disprect); void RE_SetCamera(struct Render *re, struct Object *camera); void RE_SetWindow (struct Render *re, rctf *viewplane, float clipsta, float clipend); void RE_SetOrtho (struct Render *re, rctf *viewplane, float clipsta, float clipend); +void RE_SetPixelSize(struct Render *re, float pixsize); /* option to set viewmatrix before making dbase */ void RE_SetView (struct Render *re, float mat[][4]); diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index 199212988a7..83c0be6283b 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -551,6 +551,11 @@ void RE_SetCamera(Render *re, Object *camera) } +void RE_SetPixelSize(Render *re, float pixsize) +{ + re->viewdx= pixsize; + re->viewdy= re->ycor*pixsize; +} /* ~~~~~~~~~~~~~~~~ part (tile) calculus ~~~~~~~~~~~~~~~~~~~~~~ */ diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index e9de6d08d74..ba904ff8cee 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -1126,28 +1126,35 @@ static void addps_sss(void *cb_handle, int facenr, int x, int y, int z) ZBufSSSHandle *handle = cb_handle; RenderPart *pa= handle->pa; - if (pa->rectall) { + /* extra border for filter gives double samples on part edges, + don't use those */ + if(x<pa->crop || x>=pa->rectx-pa->crop) + return; + if(y<pa->crop || y>=pa->recty-pa->crop) + return; + + if(pa->rectall) { long *rs= pa->rectall + pa->rectx*y + x; addps(&handle->psmlist, rs, facenr, z, 0); handle->totps++; } - if (pa->rectz) { + if(pa->rectz) { int *rz= pa->rectz + pa->rectx*y + x; int *rp= pa->rectp + pa->rectx*y + x; - if (z < *rz) { + if(z < *rz) { if(*rp == 0) handle->totps++; *rz= z; *rp= facenr; } } - if (pa->rectbackz) { + if(pa->rectbackz) { int *rz= pa->rectbackz + pa->rectx*y + x; int *rp= pa->rectbackp + pa->rectx*y + x; - if (z >= *rz) { + if(z >= *rz) { if(*rp == 0) handle->totps++; *rz= z; diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c index 2586beb7bb9..a6132c0c062 100644 --- a/source/blender/render/intern/source/sss.c +++ b/source/blender/render/intern/source/sss.c @@ -841,7 +841,7 @@ static void sss_create_tree_mat(Render *re, Material *mat) SSSPoints *p; ListBase layers, points; float (*co)[3] = NULL, (*color)[3] = NULL, *area = NULL; - int totpoint = 0, osa, osaflag; + int totpoint = 0, osa, osaflag, partsdone; if(re->test_break()) return; @@ -852,12 +852,14 @@ static void sss_create_tree_mat(Render *re, Material *mat) layers= re->r.layers; osa= re->osa; osaflag= re->r.mode & R_OSA; + partsdone= re->i.partsdone; re->r.layers.first= re->r.layers.last= NULL; re->osa= 0; re->r.mode &= ~R_OSA; re->sss_points= &points; re->sss_mat= mat; + re->i.partsdone= 0; RE_TileProcessor(re, 0, 1); @@ -866,6 +868,7 @@ static void sss_create_tree_mat(Render *re, Material *mat) re->r.layers= layers; re->osa= osa; if (osaflag) re->r.mode |= R_OSA; + re->i.partsdone= partsdone; /* no points? no tree */ if(!points.first) @@ -902,11 +905,15 @@ static void sss_create_tree_mat(Render *re, Material *mat) float ior= mat->sss_ior, cfac= mat->sss_colfac; float *col= mat->sss_col, *radius= mat->sss_radius; float fw= mat->sss_front, bw= mat->sss_back; + float error = mat->sss_error; + + if((R.r.scemode & R_PREVIEWBUTS) && error < 0.5f) + error= 0.5f; sss->ss[0]= scatter_settings_new(col[0], radius[0], ior, cfac, fw, bw); sss->ss[1]= scatter_settings_new(col[1], radius[1], ior, cfac, fw, bw); sss->ss[2]= scatter_settings_new(col[2], radius[2], ior, cfac, fw, bw); - sss->tree= scatter_tree_new(sss->ss, mat->sss_scale, mat->sss_error, + sss->tree= scatter_tree_new(sss->ss, mat->sss_scale, error, co, color, area, totpoint); MEM_freeN(co); diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c index 35277030857..0d1a783ddea 100644 --- a/source/blender/src/buttons_shading.c +++ b/source/blender/src/buttons_shading.c @@ -3326,15 +3326,15 @@ static void material_panel_sss(Material *ma) uiDefButF(block, NUM, B_MATPRV, "Scale:", 10,150,145,20, &ma->sss_scale, 0.001, 1000, 1, 3, "Object scale"); bt=uiDefButF(block, NUM, B_MATPRV, "Radius R", 10,130,145,20, - &ma->sss_radius[0], 0.00001, 10000, 0, 0, + &ma->sss_radius[0], 0.0001, 10000, 1, 3, "Mean red scattering path length"); uiButSetFunc(bt, material_sss_custom_set_cb, ma, NULL); bt=uiDefButF(block, NUM, B_MATPRV, "Radius G", 10,110,145,20, - &ma->sss_radius[1], 0.00001, 10000, 0, 0, + &ma->sss_radius[1], 0.0001, 10000, 1, 3, "Mean green scattering path length"); uiButSetFunc(bt, material_sss_custom_set_cb, ma, NULL); bt=uiDefButF(block, NUM, B_MATPRV, "Radius B", 10,90,145,20, - &ma->sss_radius[2], 0.00001, 10000, 0, 0, + &ma->sss_radius[2], 0.0001, 10000, 1, 3, "Mean blue scattering path length"); uiButSetFunc(bt, material_sss_custom_set_cb, ma, NULL); uiBlockEndAlign(block); diff --git a/source/blender/src/previewrender.c b/source/blender/src/previewrender.c index 1526de1b74d..fb9ea19742f 100644 --- a/source/blender/src/previewrender.c +++ b/source/blender/src/previewrender.c @@ -673,7 +673,7 @@ void BIF_view3d_previewrender_free(View3D *v3d) } /* returns 1 if OK, do not call while in panel space! */ -static int view3d_previewrender_get_rects(ScrArea *sa, rctf *viewplane, RenderInfo *ri, float *clipsta, float *clipend, int *ortho) +static int view3d_previewrender_get_rects(ScrArea *sa, rctf *viewplane, RenderInfo *ri, float *clipsta, float *clipend, int *ortho, float *pixsize) { int rectx, recty; uiBlock *block; @@ -690,7 +690,7 @@ static int view3d_previewrender_get_rects(ScrArea *sa, rctf *viewplane, RenderIn /* correction for gla draw */ BLI_translate_rcti(&ri->disprect, -sa->winrct.xmin, -sa->winrct.ymin); - *ortho= get_view3d_viewplane(sa->winx, sa->winy, viewplane, clipsta, clipend); + *ortho= get_view3d_viewplane(sa->winx, sa->winy, viewplane, clipsta, clipend, pixsize); rectx= ri->disprect.xmax - ri->disprect.xmin; recty= ri->disprect.ymax - ri->disprect.ymin; @@ -732,7 +732,7 @@ void BIF_view3d_previewrender(ScrArea *sa) RenderStats *rstats; RenderData rdata; rctf viewplane; - float clipsta, clipend; + float clipsta, clipend, pixsize; int orth; /* first get the render info right */ @@ -742,7 +742,7 @@ void BIF_view3d_previewrender(ScrArea *sa) } ri= v3d->ri; - if(0==view3d_previewrender_get_rects(sa, &viewplane, ri, &clipsta, &clipend, &orth)) + if(0==view3d_previewrender_get_rects(sa, &viewplane, ri, &clipsta, &clipend, &orth, &pixsize)) return; /* render is finished, so return */ @@ -779,6 +779,7 @@ void BIF_view3d_previewrender(ScrArea *sa) RE_SetOrtho(re, &viewplane, clipsta, clipend); else RE_SetWindow(re, &viewplane, clipsta, clipend); + RE_SetPixelSize(re, pixsize); /* until here are no escapes */ ri->status |= PR_DISPRECT; @@ -798,6 +799,7 @@ void BIF_view3d_previewrender(ScrArea *sa) RE_SetOrtho(ri->re, &viewplane, clipsta, clipend); else RE_SetWindow(ri->re, &viewplane, clipsta, clipend); + RE_SetPixelSize(re, pixsize); ri->status |= PR_DISPRECT; ri->curtile= 0; //printf("disprect update\n"); diff --git a/source/blender/src/view.c b/source/blender/src/view.c index d5cfef5d590..c501dbb8f73 100644 --- a/source/blender/src/view.c +++ b/source/blender/src/view.c @@ -825,7 +825,7 @@ void object_view_settings(Object *ob, float *lens, float *clipsta, float *clipen } -int get_view3d_viewplane(int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend) +int get_view3d_viewplane(int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize) { Camera *cam=NULL; float lens, fac, x1, y1, x2, y2; @@ -922,6 +922,19 @@ int get_view3d_viewplane(int winxi, int winyi, rctf *viewplane, float *clipsta, y2+= dy; } } + + if(pixsize) { + float viewfac; + + if(orth) { + viewfac= (winx >= winy)? winx: winy; + *pixsize= 1.0f/viewfac; + } + else { + viewfac= (((winx >= winy)? winx: winy)*lens)/32.0; + *pixsize= *clipsta/viewfac; + } + } viewplane->xmin= x1; viewplane->ymin= y1; @@ -938,7 +951,7 @@ void setwinmatrixview3d(int winx, int winy, rctf *rect) /* rect: for picking */ float clipsta, clipend, x1, y1, x2, y2; int orth; - orth= get_view3d_viewplane(winx, winy, &viewplane, &clipsta, &clipend); + orth= get_view3d_viewplane(winx, winy, &viewplane, &clipsta, &clipend, NULL); // printf("%d %d %f %f %f %f %f %f\n", winx, winy, viewplane.xmin, viewplane.ymin, viewplane.xmax, viewplane.ymax, clipsta, clipend); x1= viewplane.xmin; y1= viewplane.ymin; |