diff options
author | Antonio Vazquez <blendergit@gmail.com> | 2016-08-04 00:31:48 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2016-08-04 00:39:36 +0300 |
commit | eaea4ea51f665945e44ff2ffa534a594e9fb1938 (patch) | |
tree | 0791ec0d78a4506eebf3bcf3800a5b1423143494 /source/blender/editors/render/render_opengl.c | |
parent | 9d4ea8427770e8ca68149fc7f7760fe2273e5ce3 (diff) |
Grease Pencil v2 Branch
Improve current Grease Pencil in order to get a better 2D animation tool.
More info in WIKI pages: https://wiki.blender.org/index.php/User:Antoniov
Reviewed By: Severin, aligorith, campbellbarton
Patch by @antoniov, with edits by @Severin.
Differential Revision: https://developer.blender.org/D2115
Diffstat (limited to 'source/blender/editors/render/render_opengl.c')
-rw-r--r-- | source/blender/editors/render/render_opengl.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index 992b827113d..85c05ab0e5c 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -43,6 +43,7 @@ #include "DNA_scene_types.h" #include "DNA_object_types.h" +#include "DNA_gpencil_types.h" #include "BKE_camera.h" #include "BKE_context.h" @@ -414,6 +415,99 @@ static void screen_opengl_render_write(OGLRender *oglrender) else printf("OpenGL Render failed to write '%s'\n", name); } +static void addAlphaOverFloat(float dest[4], const float source[4]) +{ + /* d = s + (1-alpha_s)d*/ + float mul; + + mul = 1.0f - source[3]; + + dest[0] = (mul * dest[0]) + source[0]; + dest[1] = (mul * dest[1]) + source[1]; + dest[2] = (mul * dest[2]) + source[2]; + dest[3] = (mul * dest[3]) + source[3]; + +} + +/* add renderlayer and renderpass for each grease pencil layer for using in composition */ +static void add_gpencil_renderpass(OGLRender *oglrender, RenderResult *rr, RenderView *rv) +{ + bGPdata *gpd = oglrender->scene->gpd; + Scene *scene = oglrender->scene; + + /* sanity checks */ + if (gpd == NULL) { + return; + } + if (scene == NULL) { + return; + } + if (BLI_listbase_is_empty(&gpd->layers)) { + return; + } + + /* save old alpha mode */ + short oldalphamode = scene->r.alphamode; + /* set alpha transparent for gp */ + scene->r.alphamode = R_ALPHAPREMUL; + + /* saves layer status */ + short *oldsts = MEM_mallocN(BLI_listbase_count(&gpd->layers) * sizeof(short), "temp_gplayers_flag"); + int i = 0; + for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) { + oldsts[i] = gpl->flag; + ++i; + } + /* loop all layers to create separate render */ + for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) { + /* dont draw layer if hidden */ + if (gpl->flag & GP_LAYER_HIDE) + continue; + /* hide all layer except current */ + for (bGPDlayer *gph = gpd->layers.first; gph; gph = gph->next) { + if (gpl != gph) { + gph->flag |= GP_LAYER_HIDE; + } + } + + /* render this gp layer */ + screen_opengl_render_doit(oglrender, rr); + + /* add RendePass composite */ + RenderPass *rp = RE_create_gp_pass(rr, gpl->info, rv->name); + + /* copy image data from rectf */ + float *src = RE_RenderViewGetById(rr, oglrender->view_id)->rectf; + float *dest = rp->rect; + + float *pixSrc, *pixDest; + int x, y, rectx, recty; + rectx = rr->rectx; + recty = rr->recty; + for (y = 0; y < recty; y++) { + for (x = 0; x < rectx; x++) { + pixSrc = src + 4 * (rectx * y + x); + if (pixSrc[3] > 0.0) { + pixDest = dest + 4 * (rectx * y + x); + addAlphaOverFloat(pixDest, pixSrc); + } + } + } + + /* back layer status */ + i = 0; + for (bGPDlayer *gph = gpd->layers.first; gph; gph = gph->next) { + gph->flag = oldsts[i]; + ++i; + } + } + /* free memory */ + MEM_freeN(oldsts); + + /* back default alpha mode */ + scene->r.alphamode = oldalphamode; +} + static void screen_opengl_render_apply(OGLRender *oglrender) { RenderResult *rr; @@ -449,6 +543,9 @@ static void screen_opengl_render_apply(OGLRender *oglrender) BLI_assert(view_id < oglrender->views_len); RE_SetActiveRenderView(oglrender->re, rv->name); oglrender->view_id = view_id; + /* add grease pencil passes */ + add_gpencil_renderpass(oglrender, rr, rv); + /* render composite */ screen_opengl_render_doit(oglrender, rr); } |