diff options
-rw-r--r-- | source/blender/imbuf/IMB_imbuf_types.h | 3 | ||||
-rw-r--r-- | source/blender/imbuf/intern/divers.c | 37 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 9 | ||||
-rw-r--r-- | source/blender/src/writeimage.c | 3 |
4 files changed, 42 insertions, 10 deletions
diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h index fe82b852eaa..db178841979 100644 --- a/source/blender/imbuf/IMB_imbuf_types.h +++ b/source/blender/imbuf/IMB_imbuf_types.h @@ -96,7 +96,8 @@ typedef struct ImBuf{ unsigned int encodedbuffersize; /**< Size of encodedbuffer */ float *rect_float; /**< floating point Rect equivilant */ - + float dither; /**< random dither value, for conversion from float -> byte rect */ + struct MEM_CacheLimiterHandle_s * c_handle; /**< handle for cache limiter */ int refcounter; /**< Refcounter for multiple users */ } ImBuf; diff --git a/source/blender/imbuf/intern/divers.c b/source/blender/imbuf/intern/divers.c index 71292e27611..2fc80f6ddcb 100644 --- a/source/blender/imbuf/intern/divers.c +++ b/source/blender/imbuf/intern/divers.c @@ -33,6 +33,7 @@ */ #include "BLI_blenlib.h" +#include "BLI_rand.h" #include "imbuf.h" #include "imbuf_patch.h" @@ -172,6 +173,7 @@ void IMB_rect_from_float(struct ImBuf *ibuf) { /* quick method to convert floatbuf to byte */ float *tof = ibuf->rect_float; + float dither= ibuf->dither; int i; unsigned char *to = (unsigned char *) ibuf->rect; @@ -181,14 +183,33 @@ void IMB_rect_from_float(struct ImBuf *ibuf) to = (unsigned char *) ibuf->rect; } - for (i = ibuf->x * ibuf->y; i > 0; i--) - { - to[0] = FTOCHAR(tof[0]); - to[1] = FTOCHAR(tof[1]); - to[2] = FTOCHAR(tof[2]); - to[3] = FTOCHAR(tof[3]); - to += 4; - tof += 4; + if(dither==0.0f) { + for (i = ibuf->x * ibuf->y; i > 0; i--) { + to[0] = FTOCHAR(tof[0]); + to[1] = FTOCHAR(tof[1]); + to[2] = FTOCHAR(tof[2]); + to[3] = FTOCHAR(tof[3]); + to += 4; + tof += 4; + } + } + else { + float dither_value, col; + dither= dither/255.0f; + for (i = ibuf->x * ibuf->y; i > 0; i--) { + dither_value = (BLI_frand()-0.5)*dither; + col= tof[0] + dither_value; + to[0] = FTOCHAR(col); + col= tof[1] + dither_value; + to[1] = FTOCHAR(col); + col= tof[2] + dither_value; + to[2] = FTOCHAR(col); + col= tof[3] + dither_value; + to[3] = FTOCHAR(col); + + to += 4; + tof += 4; + } } } diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index c14ee2ece8e..552a241ea6f 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -936,6 +936,9 @@ static void do_render_scene_node(Render *re, Scene *sce, int cfra) /* makes render result etc */ RE_InitState(resc, &sce->r, re->winx, re->winy, &re->disprect); + /* this to enable this scene to create speed vectors */ + resc->r.scemode |= R_DOCOMP; + /* now use renderdata and camera to set viewplane */ if(sce->camera==NULL) return; RE_SetCamera(resc, sce->camera); @@ -1222,10 +1225,14 @@ static void do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh) /* if not exists, BKE_write_ibuf makes one */ ibuf->rect= rres.rect32; - ibuf->rect_float= rres.rectf; ibuf->zbuf_float= rres.rectz; + + /* float factor for random dither, imbuf takes care of it */ + ibuf->dither= scene->r.dither_intensity; + ok= BKE_write_ibuf(ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality); + if(ok==0) { printf("Render error: cannot save %s\n", name); G.afbreek=1; diff --git a/source/blender/src/writeimage.c b/source/blender/src/writeimage.c index 8bafd14d0e0..ae0717f6726 100644 --- a/source/blender/src/writeimage.c +++ b/source/blender/src/writeimage.c @@ -136,6 +136,9 @@ static void save_rendered_image_cb_real(char *name, int zbuf) ibuf->zbuf_float= rres.rectz; } + /* float factor for random dither, imbuf takes care of it */ + ibuf->dither= G.scene->r.dither_intensity; + BKE_write_ibuf(ibuf, str, G.scene->r.imtype, G.scene->r.subimtype, G.scene->r.quality); IMB_freeImBuf(ibuf); /* imbuf knows rects are not part of ibuf */ |