Bug fixes, own collection.

While examining icons, I noticed material icons were too dark.
It appeared a lot of bad hacks were added for colormanagement in preview render.

Removed them all, and things look smooth (yes, color management is OK!).

However! It is now very clear that Procedural Textures miss getting inverse
color managed in render - a reason why they show so bright washed out, already
since introduction of Color Management in Blender.

Try render a plane with linear black-white blend, shadeless!
http://www.blender.org/bf/Untitled.png

Todo: add colormanaged procedurals (optional).
This commit is contained in:
Ton Roosendaal
2013-01-01 19:02:08 +00:00
parent 6ea766be0e
commit 247c7078bc

View File

@@ -280,11 +280,6 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
sce->r.tiley = sce->r.ysch / 4; sce->r.tiley = sce->r.ysch / 4;
} }
/* exception: don't apply render part of display transform for texture previews or icons */
if ((id && sp->pr_method == PR_ICON_RENDER) || id_type == ID_TE) {
BKE_scene_disable_color_management(sce);
}
if ((id && sp->pr_method == PR_ICON_RENDER) && id_type != ID_WO) if ((id && sp->pr_method == PR_ICON_RENDER) && id_type != ID_WO)
sce->r.alphamode = R_ALPHAPREMUL; sce->r.alphamode = R_ALPHAPREMUL;
else else
@@ -488,24 +483,15 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
/* new UI convention: draw is in pixel space already. */ /* new UI convention: draw is in pixel space already. */
/* uses ROUNDBOX button in block to get the rect */ /* uses ROUNDBOX button in block to get the rect */
static int ed_preview_draw_rect(ScrArea *sa, Scene *sce, ID *id, int split, int first, rcti *rect, rcti *newrect) static int ed_preview_draw_rect(ScrArea *sa, int split, int first, rcti *rect, rcti *newrect)
{ {
Render *re; Render *re;
RenderResult rres; RenderResult rres;
char name[32]; char name[32];
int do_gamma_correct = FALSE, do_predivide = FALSE;
int offx = 0; int offx = 0;
int newx = BLI_rcti_size_x(rect); int newx = BLI_rcti_size_x(rect);
int newy = BLI_rcti_size_y(rect); int newy = BLI_rcti_size_y(rect);
if (id && GS(id->name) != ID_TE) {
/* exception: don't color manage texture previews - show the raw values */
if (sce) {
do_gamma_correct = TRUE;
do_predivide = TRUE;
}
}
if (!split || first) sprintf(name, "Preview %p", (void *)sa); if (!split || first) sprintf(name, "Preview %p", (void *)sa);
else sprintf(name, "SecondPreview %p", (void *)sa); else sprintf(name, "SecondPreview %p", (void *)sa);
@@ -520,8 +506,10 @@ static int ed_preview_draw_rect(ScrArea *sa, Scene *sce, ID *id, int split, int
} }
} }
/* test if something rendered ok */
re = RE_GetRender(name); re = RE_GetRender(name);
RE_AcquireResultImage(re, &rres); RE_AcquireResultImage(re, &rres);
RE_ReleaseResultImage(re);
if (rres.rectf) { if (rres.rectf) {
@@ -531,40 +519,20 @@ static int ed_preview_draw_rect(ScrArea *sa, Scene *sce, ID *id, int split, int
newrect->ymax = max_ii(newrect->ymax, rect->ymin + rres.recty); newrect->ymax = max_ii(newrect->ymax, rect->ymin + rres.recty);
if (rres.rectx && rres.recty) { if (rres.rectx && rres.recty) {
/* temporary conversion to byte for drawing */ unsigned char *rect_byte = MEM_mallocN(rres.rectx * rres.recty * sizeof(int), "ed_preview_draw_rect");
float fx = rect->xmin + offx; float fx = rect->xmin + offx;
float fy = rect->ymin; float fy = rect->ymin;
int dither = 0;
unsigned char *rect_byte; RE_ResultGet32(re, (unsigned int *)rect_byte);
rect_byte = MEM_mallocN(rres.rectx * rres.recty * sizeof(int), "ed_preview_draw_rect");
if (do_gamma_correct) {
IMB_display_buffer_transform_apply(rect_byte, rres.rectf, rres.rectx, rres.recty, 4,
&sce->view_settings, &sce->display_settings, do_predivide);
}
else {
/* OCIO_TODO: currently seems an exception for textures (came fro mlegacish time),
* but is it indeed expected behavior, or textures should be
* color managed as well?
*/
IMB_buffer_byte_from_float(rect_byte, rres.rectf,
4, dither, IB_PROFILE_SRGB, IB_PROFILE_SRGB, do_predivide,
rres.rectx, rres.recty, rres.rectx, rres.rectx);
}
glaDrawPixelsSafe(fx, fy, rres.rectx, rres.recty, rres.rectx, GL_RGBA, GL_UNSIGNED_BYTE, rect_byte); glaDrawPixelsSafe(fx, fy, rres.rectx, rres.recty, rres.rectx, GL_RGBA, GL_UNSIGNED_BYTE, rect_byte);
MEM_freeN(rect_byte); MEM_freeN(rect_byte);
return 1;
} }
RE_ReleaseResultImage(re);
return 1;
} }
} }
RE_ReleaseResultImage(re);
return 0; return 0;
} }
@@ -572,7 +540,6 @@ void ED_preview_draw(const bContext *C, void *idp, void *parentp, void *slotp, r
{ {
if (idp) { if (idp) {
ScrArea *sa = CTX_wm_area(C); ScrArea *sa = CTX_wm_area(C);
Scene *sce = CTX_data_scene(C);
ID *id = (ID *)idp; ID *id = (ID *)idp;
ID *parent = (ID *)parentp; ID *parent = (ID *)parentp;
MTex *slot = (MTex *)slotp; MTex *slot = (MTex *)slotp;
@@ -588,11 +555,11 @@ void ED_preview_draw(const bContext *C, void *idp, void *parentp, void *slotp, r
newrect.ymax = rect->ymin; newrect.ymax = rect->ymin;
if (parent) { if (parent) {
ok = ed_preview_draw_rect(sa, sce, id, 1, 1, rect, &newrect); ok = ed_preview_draw_rect(sa, 1, 1, rect, &newrect);
ok &= ed_preview_draw_rect(sa, sce, parent, 1, 0, rect, &newrect); ok &= ed_preview_draw_rect(sa, 1, 0, rect, &newrect);
} }
else else
ok = ed_preview_draw_rect(sa, sce, id, 0, 0, rect, &newrect); ok = ed_preview_draw_rect(sa, 0, 0, rect, &newrect);
if (ok) if (ok)
*rect = newrect; *rect = newrect;