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.
This commit is contained in:
@@ -77,7 +77,7 @@ void calctrackballvecfirst(struct rcti *area, short *mval, float *vec);
|
|||||||
void calctrackballvec(struct rcti *area, short *mval, float *vec);
|
void calctrackballvec(struct rcti *area, short *mval, float *vec);
|
||||||
void viewmove(int mode);
|
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 setwinmatrixview3d(int winx, int winy, struct rctf *rect);
|
||||||
|
|
||||||
void obmat_to_viewmat(struct Object *ob, short smooth);
|
void obmat_to_viewmat(struct Object *ob, short smooth);
|
||||||
|
|||||||
@@ -158,6 +158,7 @@ void RE_SetDispRect (struct Render *re, rcti *disprect);
|
|||||||
void RE_SetCamera(struct Render *re, struct Object *camera);
|
void RE_SetCamera(struct Render *re, struct Object *camera);
|
||||||
void RE_SetWindow (struct Render *re, rctf *viewplane, float clipsta, float clipend);
|
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_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 */
|
/* option to set viewmatrix before making dbase */
|
||||||
void RE_SetView (struct Render *re, float mat[][4]);
|
void RE_SetView (struct Render *re, float mat[][4]);
|
||||||
|
|||||||
@@ -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 ~~~~~~~~~~~~~~~~~~~~~~ */
|
/* ~~~~~~~~~~~~~~~~ part (tile) calculus ~~~~~~~~~~~~~~~~~~~~~~ */
|
||||||
|
|
||||||
|
|||||||
@@ -1126,28 +1126,35 @@ static void addps_sss(void *cb_handle, int facenr, int x, int y, int z)
|
|||||||
ZBufSSSHandle *handle = cb_handle;
|
ZBufSSSHandle *handle = cb_handle;
|
||||||
RenderPart *pa= handle->pa;
|
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;
|
long *rs= pa->rectall + pa->rectx*y + x;
|
||||||
|
|
||||||
addps(&handle->psmlist, rs, facenr, z, 0);
|
addps(&handle->psmlist, rs, facenr, z, 0);
|
||||||
handle->totps++;
|
handle->totps++;
|
||||||
}
|
}
|
||||||
if (pa->rectz) {
|
if(pa->rectz) {
|
||||||
int *rz= pa->rectz + pa->rectx*y + x;
|
int *rz= pa->rectz + pa->rectx*y + x;
|
||||||
int *rp= pa->rectp + pa->rectx*y + x;
|
int *rp= pa->rectp + pa->rectx*y + x;
|
||||||
|
|
||||||
if (z < *rz) {
|
if(z < *rz) {
|
||||||
if(*rp == 0)
|
if(*rp == 0)
|
||||||
handle->totps++;
|
handle->totps++;
|
||||||
*rz= z;
|
*rz= z;
|
||||||
*rp= facenr;
|
*rp= facenr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pa->rectbackz) {
|
if(pa->rectbackz) {
|
||||||
int *rz= pa->rectbackz + pa->rectx*y + x;
|
int *rz= pa->rectbackz + pa->rectx*y + x;
|
||||||
int *rp= pa->rectbackp + pa->rectx*y + x;
|
int *rp= pa->rectbackp + pa->rectx*y + x;
|
||||||
|
|
||||||
if (z >= *rz) {
|
if(z >= *rz) {
|
||||||
if(*rp == 0)
|
if(*rp == 0)
|
||||||
handle->totps++;
|
handle->totps++;
|
||||||
*rz= z;
|
*rz= z;
|
||||||
|
|||||||
@@ -841,7 +841,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
|
|||||||
SSSPoints *p;
|
SSSPoints *p;
|
||||||
ListBase layers, points;
|
ListBase layers, points;
|
||||||
float (*co)[3] = NULL, (*color)[3] = NULL, *area = NULL;
|
float (*co)[3] = NULL, (*color)[3] = NULL, *area = NULL;
|
||||||
int totpoint = 0, osa, osaflag;
|
int totpoint = 0, osa, osaflag, partsdone;
|
||||||
|
|
||||||
if(re->test_break())
|
if(re->test_break())
|
||||||
return;
|
return;
|
||||||
@@ -852,12 +852,14 @@ static void sss_create_tree_mat(Render *re, Material *mat)
|
|||||||
layers= re->r.layers;
|
layers= re->r.layers;
|
||||||
osa= re->osa;
|
osa= re->osa;
|
||||||
osaflag= re->r.mode & R_OSA;
|
osaflag= re->r.mode & R_OSA;
|
||||||
|
partsdone= re->i.partsdone;
|
||||||
|
|
||||||
re->r.layers.first= re->r.layers.last= NULL;
|
re->r.layers.first= re->r.layers.last= NULL;
|
||||||
re->osa= 0;
|
re->osa= 0;
|
||||||
re->r.mode &= ~R_OSA;
|
re->r.mode &= ~R_OSA;
|
||||||
re->sss_points= &points;
|
re->sss_points= &points;
|
||||||
re->sss_mat= mat;
|
re->sss_mat= mat;
|
||||||
|
re->i.partsdone= 0;
|
||||||
|
|
||||||
RE_TileProcessor(re, 0, 1);
|
RE_TileProcessor(re, 0, 1);
|
||||||
|
|
||||||
@@ -866,6 +868,7 @@ static void sss_create_tree_mat(Render *re, Material *mat)
|
|||||||
re->r.layers= layers;
|
re->r.layers= layers;
|
||||||
re->osa= osa;
|
re->osa= osa;
|
||||||
if (osaflag) re->r.mode |= R_OSA;
|
if (osaflag) re->r.mode |= R_OSA;
|
||||||
|
re->i.partsdone= partsdone;
|
||||||
|
|
||||||
/* no points? no tree */
|
/* no points? no tree */
|
||||||
if(!points.first)
|
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 ior= mat->sss_ior, cfac= mat->sss_colfac;
|
||||||
float *col= mat->sss_col, *radius= mat->sss_radius;
|
float *col= mat->sss_col, *radius= mat->sss_radius;
|
||||||
float fw= mat->sss_front, bw= mat->sss_back;
|
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[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[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->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);
|
co, color, area, totpoint);
|
||||||
|
|
||||||
MEM_freeN(co);
|
MEM_freeN(co);
|
||||||
|
|||||||
@@ -3326,15 +3326,15 @@ static void material_panel_sss(Material *ma)
|
|||||||
uiDefButF(block, NUM, B_MATPRV, "Scale:", 10,150,145,20,
|
uiDefButF(block, NUM, B_MATPRV, "Scale:", 10,150,145,20,
|
||||||
&ma->sss_scale, 0.001, 1000, 1, 3, "Object scale");
|
&ma->sss_scale, 0.001, 1000, 1, 3, "Object scale");
|
||||||
bt=uiDefButF(block, NUM, B_MATPRV, "Radius R", 10,130,145,20,
|
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");
|
"Mean red scattering path length");
|
||||||
uiButSetFunc(bt, material_sss_custom_set_cb, ma, NULL);
|
uiButSetFunc(bt, material_sss_custom_set_cb, ma, NULL);
|
||||||
bt=uiDefButF(block, NUM, B_MATPRV, "Radius G", 10,110,145,20,
|
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");
|
"Mean green scattering path length");
|
||||||
uiButSetFunc(bt, material_sss_custom_set_cb, ma, NULL);
|
uiButSetFunc(bt, material_sss_custom_set_cb, ma, NULL);
|
||||||
bt=uiDefButF(block, NUM, B_MATPRV, "Radius B", 10,90,145,20,
|
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");
|
"Mean blue scattering path length");
|
||||||
uiButSetFunc(bt, material_sss_custom_set_cb, ma, NULL);
|
uiButSetFunc(bt, material_sss_custom_set_cb, ma, NULL);
|
||||||
uiBlockEndAlign(block);
|
uiBlockEndAlign(block);
|
||||||
|
|||||||
@@ -673,7 +673,7 @@ void BIF_view3d_previewrender_free(View3D *v3d)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* returns 1 if OK, do not call while in panel space! */
|
/* 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;
|
int rectx, recty;
|
||||||
uiBlock *block;
|
uiBlock *block;
|
||||||
@@ -690,7 +690,7 @@ static int view3d_previewrender_get_rects(ScrArea *sa, rctf *viewplane, RenderIn
|
|||||||
/* correction for gla draw */
|
/* correction for gla draw */
|
||||||
BLI_translate_rcti(&ri->disprect, -sa->winrct.xmin, -sa->winrct.ymin);
|
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;
|
rectx= ri->disprect.xmax - ri->disprect.xmin;
|
||||||
recty= ri->disprect.ymax - ri->disprect.ymin;
|
recty= ri->disprect.ymax - ri->disprect.ymin;
|
||||||
@@ -732,7 +732,7 @@ void BIF_view3d_previewrender(ScrArea *sa)
|
|||||||
RenderStats *rstats;
|
RenderStats *rstats;
|
||||||
RenderData rdata;
|
RenderData rdata;
|
||||||
rctf viewplane;
|
rctf viewplane;
|
||||||
float clipsta, clipend;
|
float clipsta, clipend, pixsize;
|
||||||
int orth;
|
int orth;
|
||||||
|
|
||||||
/* first get the render info right */
|
/* first get the render info right */
|
||||||
@@ -742,7 +742,7 @@ void BIF_view3d_previewrender(ScrArea *sa)
|
|||||||
}
|
}
|
||||||
ri= v3d->ri;
|
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;
|
return;
|
||||||
|
|
||||||
/* render is finished, so return */
|
/* render is finished, so return */
|
||||||
@@ -779,6 +779,7 @@ void BIF_view3d_previewrender(ScrArea *sa)
|
|||||||
RE_SetOrtho(re, &viewplane, clipsta, clipend);
|
RE_SetOrtho(re, &viewplane, clipsta, clipend);
|
||||||
else
|
else
|
||||||
RE_SetWindow(re, &viewplane, clipsta, clipend);
|
RE_SetWindow(re, &viewplane, clipsta, clipend);
|
||||||
|
RE_SetPixelSize(re, pixsize);
|
||||||
|
|
||||||
/* until here are no escapes */
|
/* until here are no escapes */
|
||||||
ri->status |= PR_DISPRECT;
|
ri->status |= PR_DISPRECT;
|
||||||
@@ -798,6 +799,7 @@ void BIF_view3d_previewrender(ScrArea *sa)
|
|||||||
RE_SetOrtho(ri->re, &viewplane, clipsta, clipend);
|
RE_SetOrtho(ri->re, &viewplane, clipsta, clipend);
|
||||||
else
|
else
|
||||||
RE_SetWindow(ri->re, &viewplane, clipsta, clipend);
|
RE_SetWindow(ri->re, &viewplane, clipsta, clipend);
|
||||||
|
RE_SetPixelSize(re, pixsize);
|
||||||
ri->status |= PR_DISPRECT;
|
ri->status |= PR_DISPRECT;
|
||||||
ri->curtile= 0;
|
ri->curtile= 0;
|
||||||
//printf("disprect update\n");
|
//printf("disprect update\n");
|
||||||
|
|||||||
@@ -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;
|
Camera *cam=NULL;
|
||||||
float lens, fac, x1, y1, x2, y2;
|
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;
|
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->xmin= x1;
|
||||||
viewplane->ymin= y1;
|
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;
|
float clipsta, clipend, x1, y1, x2, y2;
|
||||||
int orth;
|
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);
|
// 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;
|
x1= viewplane.xmin;
|
||||||
y1= viewplane.ymin;
|
y1= viewplane.ymin;
|
||||||
|
|||||||
Reference in New Issue
Block a user