[Bf-blender-cvs] [13ac2a49b04] greasepencil-object: WIP: First step to fix z-depth problem

Antonio Vazquez noreply at git.blender.org
Thu Jun 22 19:09:36 CEST 2017


Commit: 13ac2a49b04ed129e7cd41af0b60bf8c96e1b72e
Author: Antonio Vazquez
Date:   Thu Jun 22 19:08:34 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB13ac2a49b04ed129e7cd41af0b60bf8c96e1b72e

WIP: First step to fix z-depth problem

Need a change in draw manager to allow writting zdepth without checking adding DRW_STATE_DEPTH_ALWAYS

Thanks to Clement Foucault for all the help fixing this bug.

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

M	source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
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_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index 4728267fd4f..a136c5d434a 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -194,7 +194,8 @@ static GpencilBatchCache *gpencil_batch_cache_get(bGPdata *gpd, int cfra)
 }
 
  /* create shading group for filling */
-static DRWShadingGroup *DRW_gpencil_shgroup_fill_create(GPENCIL_Data *vedata, DRWPass *pass, GPUShader *shader, Object *ob, 
+static DRWShadingGroup *DRW_gpencil_shgroup_fill_create(GPENCIL_e_data *e_data, GPENCIL_Data *vedata, DRWPass *pass, 
+	GPUShader *shader, Object *ob,
 	bGPdata *gpd, PaletteColor *palcolor, int id)
 {
 	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
@@ -248,6 +249,12 @@ static DRWShadingGroup *DRW_gpencil_shgroup_fill_create(GPENCIL_Data *vedata, DR
 			BKE_image_release_ibuf(image, ibuf, NULL);
 		}
 	}
+	else {
+		/* if no texture defined, need a blank texture to avoid errors in draw manager */
+		DRW_shgroup_uniform_texture(grp, "myTexture", e_data->gpencil_blank_texture);
+		stl->shgroups[id].t_clamp = 0;
+		DRW_shgroup_uniform_int(grp, "t_clamp", &stl->shgroups[id].t_clamp, 1);
+	}
 
 	/* object scale */
 	if ((ob) && (id > -1)) {
@@ -457,7 +464,7 @@ static void gpencil_draw_strokes(GpencilBatchCache *cache, GPENCIL_e_data *e_dat
 #endif
 		if (gps->totpoints > 1) {
 			int id = stl->storage->pal_id;
-			stl->shgroups[id].shgrps_fill = DRW_gpencil_shgroup_fill_create(vedata, psl->stroke_pass, e_data->gpencil_fill_sh, ob, gpd, gps->palcolor, id);
+			stl->shgroups[id].shgrps_fill = DRW_gpencil_shgroup_fill_create(e_data, vedata, psl->stroke_pass, e_data->gpencil_fill_sh, ob, gpd, gps->palcolor, id);
 			stl->shgroups[id].shgrps_stroke = DRW_gpencil_shgroup_stroke_create(vedata, psl->stroke_pass, e_data->gpencil_stroke_sh, ob, gpd, id);
 			++stl->storage->pal_id;
 
@@ -639,3 +646,15 @@ void DRW_gpencil_batch_cache_free(bGPdata *gpd)
 	MEM_SAFE_FREE(gpd->batch_cache);
 }
 
+struct GPUTexture *DRW_gpencil_create_blank_texture(int width, int height)
+{
+	struct GPUTexture *tex;
+	int w = width;
+	int h = height;
+	float *final_rect = MEM_callocN(sizeof(float) * 4 * w * h, "Gpencil Blank Texture");
+
+	tex = DRW_texture_create_2D(w, h, DRW_TEX_RGBA_8, DRW_TEX_FILTER, final_rect);
+	MEM_freeN(final_rect);
+
+	return tex;
+}
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 1054943ecde..2d93ae7ad98 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -94,6 +94,12 @@ static void GPENCIL_engine_init(void *vedata)
 	}
 
 	unit_m4(stl->storage->unit_matrix);
+
+	/* blank texture used if no texture defined for fill shader*/
+	if (!e_data.gpencil_blank_texture) {
+		e_data.gpencil_blank_texture = DRW_gpencil_create_blank_texture(64, 64);
+	}
+
 }
 
 static void GPENCIL_engine_free(void)
@@ -102,6 +108,7 @@ static void GPENCIL_engine_free(void)
 	DRW_SHADER_FREE_SAFE(e_data.gpencil_fill_sh);
 	DRW_SHADER_FREE_SAFE(e_data.gpencil_stroke_sh);
 	DRW_SHADER_FREE_SAFE(e_data.gpencil_fullscreen_sh);
+	DRW_TEXTURE_FREE_SAFE(e_data.gpencil_blank_texture);
 }
 
 static void GPENCIL_cache_init(void *vedata)
@@ -224,6 +231,9 @@ static void GPENCIL_draw_scene(void *vedata)
 		/* detach temp textures */
 		DRW_framebuffer_texture_detach(e_data.temp_fbcolor_depth_tx);
 		DRW_framebuffer_texture_detach(e_data.temp_fbcolor_color_tx);
+		
+		/* attach again default framebuffer */
+		DRW_framebuffer_bind(dfbl->default_fb);
 	}
 	/* free memory */
 	MEM_SAFE_FREE(stl->g_data->gp_object_cache);
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index f1408e52483..29193c7f443 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -112,6 +112,7 @@ typedef struct GPENCIL_e_data {
 	/* temp depth texture */
 	struct GPUTexture *temp_fbcolor_depth_tx;
 	struct GPUTexture *temp_fbcolor_color_tx;
+	struct GPUTexture *gpencil_blank_texture;
 } GPENCIL_e_data; /* Engine data */
 
 /* Gwn_Batch Cache */
@@ -154,6 +155,8 @@ struct Gwn_Batch *DRW_gpencil_get_buffer_stroke_geom(struct bGPdata *gpd, float
 struct Gwn_Batch *DRW_gpencil_get_buffer_fill_geom(const struct tGPspoint *points, int totpoints, float ink[4]);
 struct Gwn_Batch *DRW_gpencil_get_buffer_point_geom(struct bGPdata *gpd, short thickness);
 
+struct GPUTexture *DRW_gpencil_create_blank_texture(int width, int height);
+
 void gpencil_batch_cache_clear(struct bGPdata *gpd);
 
 bool gpencil_can_draw_stroke(const struct bGPDstroke *gps, const bool onion);




More information about the Bf-blender-cvs mailing list