[Bf-blender-cvs] [02273441dc2] blender2.8: Draw Manager: lattice editmode drawing

Campbell Barton noreply at git.blender.org
Thu Apr 13 20:34:22 CEST 2017


Commit: 02273441dc2cebab122d6f6d1b0642a500a67409
Author: Campbell Barton
Date:   Thu Apr 13 23:29:45 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB02273441dc2cebab122d6f6d1b0642a500a67409

Draw Manager: lattice editmode drawing

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

M	source/blender/blenkernel/BKE_lattice_render.h
M	source/blender/blenkernel/intern/lattice_render.c
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/modes/edit_lattice_mode.c
A	source/blender/draw/modes/shaders/edit_lattice_overlay_frag.glsl
A	source/blender/draw/modes/shaders/edit_lattice_overlay_loosevert_vert.glsl
M	source/blender/editors/space_view3d/space_view3d.c

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

diff --git a/source/blender/blenkernel/BKE_lattice_render.h b/source/blender/blenkernel/BKE_lattice_render.h
index aceb5b5eace..e748191a51d 100644
--- a/source/blender/blenkernel/BKE_lattice_render.h
+++ b/source/blender/blenkernel/BKE_lattice_render.h
@@ -33,5 +33,6 @@ void BKE_lattice_batch_cache_clear(struct Lattice *lt);
 void BKE_lattice_batch_cache_free(struct Lattice *lt);
 struct Batch *BKE_lattice_batch_cache_get_all_edges(struct Lattice *lt);
 struct Batch *BKE_lattice_batch_cache_get_all_verts(struct Lattice *lt);
+struct Batch *BKE_lattice_batch_cache_get_overlay_verts(struct Lattice *me);
 
 #endif /* __BKE_LATTICE_RENDER_H__ */
diff --git a/source/blender/blenkernel/intern/lattice_render.c b/source/blender/blenkernel/intern/lattice_render.c
index 9967daacb80..46ab1e6a30b 100644
--- a/source/blender/blenkernel/intern/lattice_render.c
+++ b/source/blender/blenkernel/intern/lattice_render.c
@@ -129,7 +129,7 @@ typedef struct LatticeRenderData {
 	bool show_only_outside;
 
 	struct EditLatt *edit_latt;
-	struct BPoint *bp;
+	BPoint *bp;
 
 	int actbp;
 } LatticeRenderData;
@@ -164,20 +164,21 @@ static LatticeRenderData *lattice_render_data_create(Lattice *lt, const int type
 	else {
 		if (types & (MR_DATATYPE_VERT)) {
 			lrdata->totvert = lattice_render_verts_num_get(lt);
-			lrdata->bp = lt->def;
 		}
 		if (types & (MR_DATATYPE_EDGE)) {
 			lrdata->totedge = lattice_render_edges_num_get(lt);
-			lrdata->bp = lt->def;
 			/*no edge data */
 		}
 	}
 
+	lrdata->bp = lt->def;
+
 	lrdata->dims.u_len = lt->pntsu;
 	lrdata->dims.v_len = lt->pntsv;
 	lrdata->dims.w_len = lt->pntsw;
 
 	lrdata->show_only_outside = (lt->flag & LT_OUTSIDE) != 0;
+	lrdata->actbp = lt->actbp;
 
 	return lrdata;
 }
@@ -204,52 +205,17 @@ static int lattice_render_data_edges_num_get(const LatticeRenderData *lrdata)
 	return lrdata->totedge;
 }
 
-static float *lattice_render_data_vert_co(const LatticeRenderData *lrdata, const int vert_idx)
+static const BPoint *lattice_render_data_vert_bpoint(const LatticeRenderData *lrdata, const int vert_idx)
 {
 	BLI_assert(lrdata->types & MR_DATATYPE_VERT);
-
-	if (lrdata->edit_latt) {
-		Lattice *lt = lrdata->edit_latt->latt;
-		BPoint *bp = &lt->def[vert_idx];
-		return bp->vec;
-	}
-	else {
-		return lrdata->bp[vert_idx].vec;
-	}
+	return &lrdata->bp[vert_idx];
 }
 
-/* First 2 bytes are bit flags
- * 3rd is for sharp edges
- * 4rd is for creased edges */
 enum {
-	VFLAG_VERTEX_ACTIVE   = 1 << 0,
-	VFLAG_VERTEX_SELECTED = 1 << 1,
+	VFLAG_VERTEX_SELECTED = 1 << 0,
+	VFLAG_VERTEX_ACTIVE   = 1 << 1,
 };
 
-#if 0
-static unsigned char lattice_render_data_vertex_flag(LatticeRenderData *lrdata, const int v)
-{
-
-	unsigned char vflag = 0;
-
-	if (lrdata->edit_latt) {
-		Lattice *lt = lrdata->edit_latt->latt;
-		BPoint *bp = &lt->def[v];
-
-		/* Current vertex */
-		if (v == lrdata->actbp) {
-			vflag |= VFLAG_VERTEX_ACTIVE;
-		}
-
-		if (bp->f1 & SELECT) {
-			vflag |= VFLAG_VERTEX_SELECTED;
-		}
-	}
-
-	return vflag;
-}
-#endif
-
 /* ---------------------------------------------------------------------- */
 /* Lattice Batch Cache */
 
@@ -260,6 +226,8 @@ typedef struct LatticeBatchCache {
 	Batch *all_verts;
 	Batch *all_edges;
 
+	Batch *overlay_verts;
+
 	/* settings to determine if cache is invalid */
 	bool is_dirty;
 
@@ -334,7 +302,7 @@ static LatticeBatchCache *lattice_batch_cache_get(Lattice *lt)
 	return lt->batch_cache;
 }
 
-void BKE_lattice_batch_cache_dirty(struct Lattice *lt)
+void BKE_lattice_batch_cache_dirty(Lattice *lt)
 {
 	LatticeBatchCache *cache = lt->batch_cache;
 	if (cache) {
@@ -342,17 +310,12 @@ void BKE_lattice_batch_cache_dirty(struct Lattice *lt)
 	}
 }
 
-void BKE_lattice_batch_selection_dirty(struct Lattice *lt)
+void BKE_lattice_batch_selection_dirty(Lattice *lt)
 {
 	LatticeBatchCache *cache = lt->batch_cache;
 	if (cache) {
 		/* TODO Separate Flag vbo */
-#if 0
-		if (cache->overlay_loose_verts) {
-			Batch_discard_all(cache->overlay_loose_verts);
-			cache->overlay_loose_verts = NULL;
-		}
-#endif
+		BATCH_DISCARD_ALL_SAFE(cache->overlay_verts);
 	}
 }
 
@@ -365,6 +328,7 @@ void BKE_lattice_batch_cache_clear(Lattice *lt)
 
 	BATCH_DISCARD_SAFE(cache->all_verts);
 	BATCH_DISCARD_SAFE(cache->all_edges);
+	BATCH_DISCARD_ALL_SAFE(cache->overlay_verts);
 
 	VERTEXBUFFER_DISCARD_SAFE(cache->pos);
 	ELEMENTLIST_DISCARD_SAFE(cache->edges);
@@ -394,7 +358,8 @@ static VertexBuffer *lattice_batch_cache_get_pos(LatticeRenderData *lrdata, Latt
 		cache->pos = VertexBuffer_create_with_format(&format);
 		VertexBuffer_allocate_data(cache->pos, vertex_ct);
 		for (int i = 0; i < vertex_ct; ++i) {
-			VertexBuffer_set_attrib(cache->pos, pos_id, i, lattice_render_data_vert_co(lrdata, i));
+			const BPoint *bp = lattice_render_data_vert_bpoint(lrdata, i);
+			VertexBuffer_set_attrib(cache->pos, pos_id, i, bp->vec);
 		}
 	}
 
@@ -406,7 +371,6 @@ static ElementList *lattice_batch_cache_get_edges(LatticeRenderData *lrdata, Lat
 	BLI_assert(lrdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_EDGE));
 
 	if (cache->edges == NULL) {
-		printf("Caching edges in order...\n");
 		const int vertex_ct = lattice_render_data_verts_num_get(lrdata);
 		const int edge_len = lattice_render_data_edges_num_get(lrdata);
 		int edge_len_real = 0;
@@ -458,6 +422,50 @@ static ElementList *lattice_batch_cache_get_edges(LatticeRenderData *lrdata, Lat
 	return cache->edges;
 }
 
+static void lattice_batch_cache_create_overlay_batches(Lattice *lt)
+{
+	/* Since MR_DATATYPE_OVERLAY is slow to generate, generate them all at once */
+	int options = MR_DATATYPE_VERT | MR_DATATYPE_OVERLAY;
+
+	LatticeBatchCache *cache = lattice_batch_cache_get(lt);
+	LatticeRenderData *lrdata = lattice_render_data_create(lt, options);
+
+	if (cache->overlay_verts == NULL) {
+		static VertexFormat format = { 0 };
+		static unsigned pos_id, data_id;
+		if (format.attrib_ct == 0) {
+			/* initialize vertex format */
+			pos_id = VertexFormat_add_attrib(&format, "pos", COMP_F32, 3, KEEP_FLOAT);
+			data_id = VertexFormat_add_attrib(&format, "data", COMP_U8, 1, KEEP_INT);
+		}
+
+		const int vertex_ct = lattice_render_data_verts_num_get(lrdata);
+
+		VertexBuffer *vbo = VertexBuffer_create_with_format(&format);
+		VertexBuffer_allocate_data(vbo, vertex_ct);
+		for (int i = 0; i < vertex_ct; ++i) {
+			const BPoint *bp = lattice_render_data_vert_bpoint(lrdata, i);
+
+			char vflag = 0;
+			if (bp->f1 & SELECT) {
+				if (i == lrdata->actbp) {
+					vflag |= VFLAG_VERTEX_ACTIVE;
+				}
+				else {
+					vflag |= VFLAG_VERTEX_SELECTED;
+				}
+			}
+
+			VertexBuffer_set_attrib(vbo, pos_id, i, bp->vec);
+			VertexBuffer_set_attrib(vbo, data_id, i, &vflag);
+		}
+
+		cache->overlay_verts = Batch_create(PRIM_POINTS, vbo, NULL);
+	}	
+
+	lattice_render_data_free(lrdata);
+}
+
 Batch *BKE_lattice_batch_cache_get_all_edges(Lattice *lt)
 {
 	LatticeBatchCache *cache = lattice_batch_cache_get(lt);
@@ -480,7 +488,6 @@ Batch *BKE_lattice_batch_cache_get_all_verts(Lattice *lt)
 	LatticeBatchCache *cache = lattice_batch_cache_get(lt);
 
 	if (cache->all_verts == NULL) {
-		/* create batch from DM */
 		LatticeRenderData *lrdata = lattice_render_data_create(lt, MR_DATATYPE_VERT);
 
 		cache->all_verts = Batch_create(PRIM_POINTS, lattice_batch_cache_get_pos(lrdata, cache), NULL);
@@ -491,4 +498,15 @@ Batch *BKE_lattice_batch_cache_get_all_verts(Lattice *lt)
 	return cache->all_verts;
 }
 
+Batch *BKE_lattice_batch_cache_get_overlay_verts(Lattice *lt)
+{
+	LatticeBatchCache *cache = lattice_batch_cache_get(lt);
+
+	if (cache->overlay_verts == NULL) {
+		lattice_batch_cache_create_overlay_batches(lt);
+	}
+
+	return cache->overlay_verts;
+}
+
 #undef MESH_RENDER_FUNCTION
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 8c3c5b8e679..06d152fe46e 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -122,6 +122,8 @@ data_to_c_simple(modes/shaders/edit_mesh_overlay_facedot_vert.glsl SRC)
 data_to_c_simple(modes/shaders/edit_mesh_overlay_mix_frag.glsl SRC)
 data_to_c_simple(modes/shaders/edit_mesh_overlay_facefill_vert.glsl SRC)
 data_to_c_simple(modes/shaders/edit_mesh_overlay_facefill_frag.glsl SRC)
+data_to_c_simple(modes/shaders/edit_lattice_overlay_frag.glsl SRC)
+data_to_c_simple(modes/shaders/edit_lattice_overlay_loosevert_vert.glsl SRC)
 data_to_c_simple(modes/shaders/edit_normals_vert.glsl SRC)
 data_to_c_simple(modes/shaders/edit_normals_geom.glsl SRC)
 data_to_c_simple(modes/shaders/object_outline_resolve_frag.glsl SRC)
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index 7d5e6c60adc..73de39814d7 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -1558,6 +1558,18 @@ Batch *DRW_cache_lattice_wire_get(Object *ob)
 	return surface;
 }
 
+Batch *DRW_cache_lattice_vert_overlay_get(Object *ob)
+{
+	Batch *surface = NULL;
+
+	BLI_assert(ob->type == OB_LATTICE);
+
+	struct Lattice *lt = ob->data;
+	surface = BKE_lattice_batch_cache_get_overlay_verts(lt);
+
+	return surface;
+}
+
 #if 0 /* TODO */
 struct Batch *DRW_cache_surface_material_get(Object *ob, int nr) {
 	/* TODO */
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index eac6495e182..b23992914bd 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -90,5 +90,6 @@ struct Batch *DRW_cache_mesh_verts_get(struct Object *ob);
 /* Lattice */
 struct Batch *DRW_cache_lattice_verts_get(struct Object *ob);
 struct Batch *DRW_cache_lattice_wire_get(struct Object *ob);
+struct Batch *DRW_cache_lattice_vert_overlay_get(struct Object *ob);
 
 #endif /* __DRAW_CACHE_H__ */
\ No newline at end of file
diff --git a/source/blender/draw/modes/edit_lattice_mode.c b/source/blender/draw/modes/edit_lattice_mode.c
index ea6dbb65475..b641b22186a 100644
--- a/source/blender/draw/modes/edit_lattice_mode.c
+++ b/source/blender/draw/modes/edit_lattice_mode.c
@@ -39,6 +39,14 @@
 extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */
 extern struct GlobalsUboStorage ts; /* draw_common.c */
 
+extern char datatoc_common_globals_lib_glsl[];
+extern char datatoc_edit_lattice_overl

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list