diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-06-13 21:25:07 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-06-13 21:25:07 +0400 |
commit | 8957609f353f93475d79706cf2d6b306ed197beb (patch) | |
tree | 72d0711c98f6867f2d5c4dc86525708571de140b /source/blender/editors/render/render_opengl.c | |
parent | f37c971878307d4f618bbbc50574293de9e09141 (diff) |
Sequencer: add support for grease pencil rendering in previews
Diffstat (limited to 'source/blender/editors/render/render_opengl.c')
-rw-r--r-- | source/blender/editors/render/render_opengl.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index 94dbf2eed8c..ecf5e962c80 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -36,6 +36,7 @@ #include "MEM_guardedalloc.h" #include "BLI_math.h" +#include "BLI_math_color_blend.h" #include "BLI_blenlib.h" #include "BLI_utildefines.h" #include "BLI_jitter.h" @@ -57,6 +58,7 @@ #include "ED_screen.h" #include "ED_view3d.h" +#include "ED_gpencil.h" #include "RE_pipeline.h" #include "IMB_imbuf_types.h" @@ -139,7 +141,9 @@ static void screen_opengl_render_apply(OGLRender *oglrender) if (oglrender->is_sequencer) { SeqRenderData context; - int chanshown = oglrender->sseq ? oglrender->sseq->chanshown : 0; + SpaceSeq *sseq = oglrender->sseq; + int chanshown = sseq ? sseq->chanshown : 0; + struct bGPdata *gpd = (sseq && (sseq->flag & SEQ_SHOW_GPENCIL)) ? sseq->gpd : NULL; context = BKE_sequencer_new_render_data(oglrender->bmain->eval_ctx, oglrender->bmain, scene, oglrender->sizex, oglrender->sizey, 100.0f); @@ -171,6 +175,33 @@ static void screen_opengl_render_apply(OGLRender *oglrender) IMB_freeImBuf(linear_ibuf); } + + if (gpd) { + int i; + unsigned char *gp_rect; + + GPU_offscreen_bind(oglrender->ofs); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + wmOrtho2(0, sizex, 0, sizey); + glTranslatef(sizex / 2, sizey / 2, 0.0f); + + ED_gpencil_draw_ex(gpd, sizex, sizey, scene->r.cfra); + + gp_rect = MEM_mallocN(sizex * sizey * sizeof(unsigned char) * 4, "offscreen rect"); + GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, gp_rect); + + for (i = 0; i < sizex * sizey * 4; i += 4) { + float col_src[4]; + rgba_uchar_to_float(col_src, &gp_rect[i]); + blend_color_mix_float(&rr->rectf[i], &rr->rectf[i], col_src); + } + GPU_offscreen_unbind(oglrender->ofs); + + MEM_freeN(gp_rect); + } } else if (view_context) { ED_view3d_draw_offscreen_init(scene, v3d); |