[Bf-blender-cvs] [ee6a257cabd] greasepencil-object: WIP: Render mixing GP and Eevee or Cycles

Antonio Vazquez noreply at git.blender.org
Fri Feb 9 20:05:40 CET 2018


Commit: ee6a257cabd29c76cd1445ff406908a259256585
Author: Antonio Vazquez
Date:   Fri Feb 9 20:05:26 2018 +0100
Branches: greasepencil-object
https://developer.blender.org/rBee6a257cabd29c76cd1445ff406908a259256585

WIP: Render mixing GP and Eevee or Cycles

Still there are problems with AA, but now it's possible to get a composed result with Cycle/Eevee and Grease Pencil.

===================================================================

M	source/blender/draw/engines/gpencil/gpencil_engine.c

===================================================================

diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 5b036922b3c..3ce4868afe7 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -1021,7 +1021,7 @@ static void GPENCIL_render_result_z(RenderResult *rr, const char *viewname,	GPEN
 		GPENCIL_render_update_vecs(vedata);
 
 		/* Convert ogl depth [0..1] to view Z [near..far] */
-		for (int i = 0; i < rr->rectx * rr->recty; ++i) {
+		for (int i = 0; i < rr->rectx * rr->recty; i++) {
 			if (rp->rect[i] == 1.0f) {
 				rp->rect[i] = 1e10f; /* Background */
 			}
@@ -1053,6 +1053,16 @@ static void GPENCIL_render_result_combined(RenderResult *rr, const char *viewnam
 static void GPENCIL_render_to_image(void *vedata, struct RenderEngine *engine, struct Depsgraph *depsgraph)
 {
 	const char *viewname = RE_GetActiveRenderView(engine->re);
+	
+	/* save previous render data */
+	RenderResult *rr_src = RE_engine_get_result(engine);
+	RenderLayer *rl_src = rr_src->layers.first;
+	RenderPass *rp_color_src = RE_pass_find_by_name(rl_src, RE_PASSNAME_COMBINED, viewname);
+	RenderPass *rp_depth_src = RE_pass_find_by_name(rl_src, RE_PASSNAME_Z, viewname);
+	float *rect_color_src = MEM_dupallocN(rp_color_src->rect);
+	float *rect_depth_src = MEM_dupallocN(rp_depth_src->rect);
+	int imgsize = rr_src->rectx * rr_src->recty;
+
 	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);
 
@@ -1087,6 +1097,37 @@ static void GPENCIL_render_to_image(void *vedata, struct RenderEngine *engine, s
 	}
 
 	RE_engine_end_result(engine, rr, false, false, false);
+
+	/* merge previous render image with new GP image */ 
+	rl_src = rr_src->layers.first;
+	RenderPass *rp_color_gp = RE_pass_find_by_name(rl_src, RE_PASSNAME_COMBINED, viewname);
+	RenderPass *rp_depth_gp = RE_pass_find_by_name(rl_src, RE_PASSNAME_Z, viewname);
+	float *rect_color_gp = rp_color_gp->rect;
+	float *rect_depth_gp = rp_depth_gp->rect;
+
+	for (int i = 0; i < imgsize; i++) {
+		float *frgba = &rect_color_gp[i * 4];
+		float *srgba = &rect_color_src[i * 4];
+		float *gp_depth = &rect_depth_gp[i];
+		float *sdepth = &rect_depth_src[i];
+		/* check transparency */
+		if (frgba[3] > 0.0f) {
+			if (gp_depth[0] > sdepth[0]){
+				/* copy source color */
+				copy_v4_v4(frgba, srgba);
+				/* copy source z-depth */
+				gp_depth[0] = sdepth[0];
+			}
+		}
+		else {
+			/* transparent grease pencil, so copy source render data */
+			copy_v4_v4(frgba, srgba);
+		}
+	}
+
+	/* free memory */
+	MEM_SAFE_FREE(rect_color_src);
+	MEM_SAFE_FREE(rect_depth_src);
 }
 
 static const DrawEngineDataSize GPENCIL_data_size = DRW_VIEWPORT_DATA_SIZE(GPENCIL_Data);



More information about the Bf-blender-cvs mailing list