[Bf-blender-cvs] [f1dfddd723c] greasepencil-object: WIP: More work on render
Antonio Vazquez
noreply at git.blender.org
Wed Feb 7 18:19:04 CET 2018
Commit: f1dfddd723cb06c61e50a3d5d8c7110358f9158c
Author: Antonio Vazquez
Date: Wed Feb 7 18:18:56 2018 +0100
Branches: greasepencil-object
https://developer.blender.org/rBf1dfddd723cb06c61e50a3d5d8c7110358f9158c
WIP: More work on render
Now get a result, but still the stroke is missing and replace any other render image.
===================================================================
M source/blender/draw/engines/gpencil/gpencil_engine.c
M source/blender/draw/engines/gpencil/gpencil_engine.h
===================================================================
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 6519ff65c73..09fdcd4de95 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -692,7 +692,7 @@ static void GPENCIL_draw_scene(void *vedata)
bool is_render = stl->storage->is_render;
/* paper pass to display a confortable area to draw over complex scenes with geometry */
- if ((obact) && (obact->type == OB_GPENCIL)) {
+ if ((!is_render) && (obact) && (obact->type == OB_GPENCIL)) {
if ((v3d->flag3 & V3D_GP_SHOW_PAPER) && (stl->g_data->gp_cache_used > 0)) {
DRW_draw_pass(psl->paper_pass);
}
@@ -783,7 +783,7 @@ static void GPENCIL_draw_scene(void *vedata)
MULTISAMPLE_GP_SYNC_DISABLE(dfbl, fbl);
}
/* Current buffer drawing */
- if (gpd->sbuffer_size > 0) {
+ if ((!is_render) && (gpd->sbuffer_size > 0)) {
DRW_draw_pass(psl->drawing_pass);
}
@@ -791,7 +791,7 @@ static void GPENCIL_draw_scene(void *vedata)
* if any vfx modifier exist, the init_vfx_wave_sh will be not NULL.
*/
if ((cache->vfx_wave_sh) && (!GP_SIMPLIFY_VFX(ts, playing))) {
- /* add vfx and combine result with default framebuffer */
+ /* add vfx passes */
gpencil_vfx_passes(vedata, cache);
e_data.input_depth_tx = e_data.vfx_fbcolor_depth_tx_a;
@@ -801,8 +801,13 @@ static void GPENCIL_draw_scene(void *vedata)
e_data.input_depth_tx = e_data.temp_fbcolor_depth_tx;
e_data.input_color_tx = e_data.temp_fbcolor_color_tx;
}
- /* Combine with scene buffer without more passes */
- DRW_framebuffer_bind(dfbl->default_fb);
+ /* Combine with scene buffer */
+ if ((!is_render) || (fbl->main == NULL)) {
+ DRW_framebuffer_bind(dfbl->default_fb);
+ }
+ else {
+ DRW_framebuffer_bind(fbl->main);
+ }
DRW_draw_pass(psl->mix_pass);
/* prepare for fast drawing */
if (!is_render) {
@@ -833,7 +838,9 @@ static void GPENCIL_draw_scene(void *vedata)
DRW_framebuffer_texture_detach(e_data.painting_color_tx);
/* attach again default framebuffer after detach textures */
- DRW_framebuffer_bind(dfbl->default_fb);
+ if (!is_render) {
+ DRW_framebuffer_bind(dfbl->default_fb);
+ }
/* the temp texture is ready. Now we can use fast screen drawing */
if (stl->g_data->session_flag & GP_DRW_PAINT_FILLING) {
@@ -870,7 +877,6 @@ void GPENCIL_render_init(GPENCIL_Data *ved, RenderEngine *engine, struct Depsgra
if (!stl->g_data) {
stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__);
}
- stl->storage->background_alpha = DRW_state_draw_background() ? 1.0f : 0.0f;
/* Set the pers & view matrix. */
struct Object *camera = RE_GetCamera(engine->re);
@@ -908,16 +914,53 @@ void GPENCIL_render_cache(
}
}
+/* read render result */
+static void GPENCIL_render_result_combined( RenderResult *rr, const char *viewname, GPENCIL_Data *vedata)
+{
+ RenderLayer *rl = rr->layers.first;
+ RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_COMBINED, viewname);
+ GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
+
+ DRW_framebuffer_bind(fbl->main);
+ DRW_framebuffer_read_data(rr->xof, rr->yof, rr->rectx, rr->recty, 4, 0, rp->rect);
+}
+
/* render grease pencil to image */
static void GPENCIL_render_to_image(void *vedata, struct RenderEngine *engine, struct Depsgraph *depsgraph)
{
+ const char *viewname = RE_GetActiveRenderView(engine->re);
+ const float *render_size = DRW_viewport_size_get();
+ RenderResult *rr = RE_engine_begin_result(engine, 0, 0, (int)render_size[0], (int)render_size[1], NULL, viewname);
+
GPENCIL_engine_init(vedata);
GPENCIL_render_init(vedata, engine, depsgraph);
+ GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
+ if (fbl->main) {
+ DRW_framebuffer_texture_attach(fbl->main, e_data.render_depth_tx, 0, 0);
+ DRW_framebuffer_texture_attach(fbl->main, e_data.render_color_tx, 0, 0);
+ /* clean first time the buffer */
+ float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
+ DRW_framebuffer_bind(fbl->main);
+ DRW_framebuffer_clear(true, true, false, clearcol, 1.0f);
+ }
+
+ /* loop all objects and draw */
DRW_render_object_iter(vedata, engine, depsgraph, GPENCIL_render_cache);
GPENCIL_cache_finish(vedata);
GPENCIL_draw_scene(vedata);
+
+ /* read result */
+ GPENCIL_render_result_combined(rr, viewname, vedata);
+
+ /* detach textures */
+ if (fbl->main) {
+ DRW_framebuffer_texture_detach(e_data.render_depth_tx);
+ DRW_framebuffer_texture_detach(e_data.render_color_tx);
+ }
+
+ RE_engine_end_result(engine, rr, false, false, false);
}
static const DrawEngineDataSize GPENCIL_data_size = DRW_VIEWPORT_DATA_SIZE(GPENCIL_Data);
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 221af1f6802..13909e5c07e 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -169,7 +169,6 @@ typedef struct GPENCIL_Storage {
float gridcolor[3];
/* Render Matrices and data */
- float background_alpha;
float persmat[4][4], persinv[4][4];
float viewmat[4][4], viewinv[4][4];
float winmat[4][4], wininv[4][4];
More information about the Bf-blender-cvs
mailing list