[Bf-blender-cvs] [1ec21ed41a4] blender2.8: DRW: Support Wireframe for cruve/surface/text objects

Clément Foucault noreply at git.blender.org
Fri Nov 23 16:44:56 CET 2018


Commit: 1ec21ed41a48ba41410edee229be06be82ccec2d
Author: Clément Foucault
Date:   Fri Nov 23 16:44:16 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB1ec21ed41a48ba41410edee229be06be82ccec2d

DRW: Support Wireframe for cruve/surface/text objects

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

M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_cache_impl.h
M	source/blender/draw/intern/draw_cache_impl_curve.c
M	source/blender/draw/intern/draw_cache_impl_displist.c

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

diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index f2f99953418..a2430d12f41 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -698,9 +698,18 @@ void DRW_cache_object_face_wireframe_get(
 {
 	switch (ob->type) {
 		case OB_MESH:
-			DRW_mesh_batch_cache_get_wireframes_face_texbuf(ob->data, r_vert_tx, r_faceid_tx, r_tri_count);
-
-		/* TODO, should match 'DRW_cache_object_surface_get' */
+			DRW_cache_mesh_face_wireframe_get(ob, r_vert_tx, r_faceid_tx, r_tri_count);
+			break;
+		case OB_CURVE:
+			DRW_cache_curve_face_wireframe_get(ob, r_vert_tx, r_faceid_tx, r_tri_count);
+			break;
+		case OB_SURF:
+			DRW_cache_surf_face_wireframe_get(ob, r_vert_tx, r_faceid_tx, r_tri_count);
+			break;
+		case OB_FONT:
+			DRW_cache_text_face_wireframe_get(ob, r_vert_tx, r_faceid_tx, r_tri_count);
+			break;
+		/* TODO, metaballs' */
 	}
 }
 
@@ -3046,6 +3055,15 @@ GPUBatch *DRW_cache_mesh_surface_get(Object *ob)
 	return DRW_mesh_batch_cache_get_triangles_with_normals(me);
 }
 
+void DRW_cache_mesh_face_wireframe_get(
+        Object *ob, struct GPUTexture **r_vert_tx, struct GPUTexture **r_faceid_tx, int *r_tri_count)
+{
+	BLI_assert(ob->type == OB_MESH);
+
+	Mesh *me = ob->data;
+	DRW_mesh_batch_cache_get_wireframes_face_texbuf(me, r_vert_tx, r_faceid_tx, r_tri_count);
+}
+
 GPUBatch *DRW_cache_mesh_loose_edges_get(Object *ob)
 {
 	BLI_assert(ob->type == OB_MESH);
@@ -3237,6 +3255,15 @@ GPUBatch *DRW_cache_curve_surface_get(Object *ob)
 	return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->runtime.curve_cache);
 }
 
+void DRW_cache_curve_face_wireframe_get(
+        Object *ob, struct GPUTexture **r_vert_tx, struct GPUTexture **r_faceid_tx, int *r_tri_count)
+{
+	BLI_assert(ob->type == OB_CURVE);
+
+	struct Curve *cu = ob->data;
+	DRW_curve_batch_cache_get_wireframes_face_texbuf(cu, ob->runtime.curve_cache, r_vert_tx, r_faceid_tx, r_tri_count);
+}
+
 /* Return list of batches */
 GPUBatch **DRW_cache_curve_surface_shaded_get(
         Object *ob, struct GPUMaterial **gpumat_array, uint gpumat_array_len)
@@ -3293,6 +3320,21 @@ GPUBatch *DRW_cache_text_surface_get(Object *ob)
 	return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->runtime.curve_cache);
 }
 
+void DRW_cache_text_face_wireframe_get(
+        Object *ob,
+        struct GPUTexture **r_vert_tx, struct GPUTexture **r_faceid_tx, int *r_tri_count)
+{
+	BLI_assert(ob->type == OB_FONT);
+	struct Curve *cu = ob->data;
+	if (cu->editfont && (cu->flag & CU_FAST)) {
+		*r_vert_tx = NULL;
+		*r_faceid_tx = NULL;
+		*r_tri_count = 0;
+		return;
+	}
+	DRW_curve_batch_cache_get_wireframes_face_texbuf(cu, ob->runtime.curve_cache, r_vert_tx, r_faceid_tx, r_tri_count);
+}
+
 GPUBatch **DRW_cache_text_surface_shaded_get(
         Object *ob, struct GPUMaterial **gpumat_array, uint gpumat_array_len)
 {
@@ -3333,6 +3375,15 @@ GPUBatch *DRW_cache_surf_surface_get(Object *ob)
 	return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->runtime.curve_cache);
 }
 
+void DRW_cache_surf_face_wireframe_get(
+        Object *ob, struct GPUTexture **r_vert_tx, struct GPUTexture **r_faceid_tx, int *r_tri_count)
+{
+	BLI_assert(ob->type == OB_SURF);
+
+	struct Curve *cu = ob->data;
+	DRW_curve_batch_cache_get_wireframes_face_texbuf(cu, ob->runtime.curve_cache, r_vert_tx, r_faceid_tx, r_tri_count);
+}
+
 /* Return list of batches */
 GPUBatch **DRW_cache_surf_surface_shaded_get(
         Object *ob, struct GPUMaterial **gpumat_array, uint gpumat_array_len)
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 0656783ea29..39bbcf2c93a 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -152,6 +152,8 @@ struct GPUBatch **DRW_cache_mesh_surface_shaded_get(
         char **auto_layer_names, int **auto_layer_is_srgb, int *auto_layer_count);
 struct GPUBatch **DRW_cache_mesh_surface_texpaint_get(struct Object *ob);
 struct GPUBatch *DRW_cache_mesh_surface_texpaint_single_get(struct Object *ob);
+void DRW_cache_mesh_face_wireframe_get(
+        Object *ob, struct GPUTexture **r_vert_tx, struct GPUTexture **r_faceid_tx, int *r_tri_count);
 
 void DRW_cache_mesh_sculpt_coords_ensure(struct Object *ob);
 
@@ -161,6 +163,8 @@ struct GPUBatch **DRW_cache_curve_surface_shaded_get(
         struct Object *ob, struct GPUMaterial **gpumat_array, uint gpumat_array_len);
 struct GPUBatch *DRW_cache_curve_surface_verts_get(struct Object *ob);
 struct GPUBatch *DRW_cache_curve_edge_wire_get(struct Object *ob);
+void DRW_cache_curve_face_wireframe_get(
+        Object *ob, struct GPUTexture **r_vert_tx, struct GPUTexture **r_faceid_tx, int *r_tri_count);
 /* edit-mode */
 struct GPUBatch *DRW_cache_curve_edge_normal_get(struct Object *ob, float normal_size);
 struct GPUBatch *DRW_cache_curve_edge_overlay_get(struct Object *ob);
@@ -171,6 +175,8 @@ struct GPUBatch *DRW_cache_text_edge_wire_get(struct Object *ob);
 struct GPUBatch *DRW_cache_text_surface_get(struct Object *ob);
 struct GPUBatch **DRW_cache_text_surface_shaded_get(
         struct Object *ob, struct GPUMaterial **gpumat_array, uint gpumat_array_len);
+void DRW_cache_text_face_wireframe_get(
+        Object *ob, struct GPUTexture **r_vert_tx, struct GPUTexture **r_faceid_tx, int *r_tri_count);
 /* edit-mode */
 struct GPUBatch *DRW_cache_text_cursor_overlay_get(struct Object *ob);
 struct GPUBatch *DRW_cache_text_select_overlay_get(struct Object *ob);
@@ -179,6 +185,8 @@ struct GPUBatch *DRW_cache_text_select_overlay_get(struct Object *ob);
 struct GPUBatch *DRW_cache_surf_surface_get(struct Object *ob);
 struct GPUBatch **DRW_cache_surf_surface_shaded_get(
         struct Object *ob, struct GPUMaterial **gpumat_array, uint gpumat_array_len);
+void DRW_cache_surf_face_wireframe_get(
+        Object *ob, struct GPUTexture **r_vert_tx, struct GPUTexture **r_faceid_tx, int *r_tri_count);
 
 /* Lattice */
 struct GPUBatch *DRW_cache_lattice_verts_get(struct Object *ob);
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index 3805cccd9c0..97e7cd240ff 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -75,6 +75,9 @@ struct GPUBatch *DRW_curve_batch_cache_get_triangles_with_normals(
 struct GPUBatch **DRW_curve_batch_cache_get_surface_shaded(
         struct Curve *cu, struct CurveCache *ob_curve_cache,
         struct GPUMaterial **gpumat_array, uint gpumat_array_len);
+void DRW_curve_batch_cache_get_wireframes_face_texbuf(
+        struct Curve *cu, struct CurveCache *ob_curve_cache,
+        struct GPUTexture **verts_data, struct GPUTexture **face_indices, int *tri_count);
 
 /* Metaball */
 struct GPUBatch *DRW_metaball_batch_cache_get_triangles_with_normals(struct Object *ob);
@@ -91,6 +94,7 @@ struct GPUIndexBuf **DRW_displist_indexbuf_calc_triangles_in_order_split_by_mate
         struct ListBase *lb, uint gpumat_array_len);
 struct GPUBatch **DRW_displist_batch_calc_tri_pos_normals_and_uv_split_by_material(
         struct ListBase *lb, uint gpumat_array_len);
+struct GPUVertBuf *DRW_displist_create_edges_overlay_texture_buf(ListBase *lb);
 
 /* Lattice */
 struct GPUBatch *DRW_lattice_batch_cache_get_all_edges(struct Lattice *lt, bool use_weight, const int actdef);
diff --git a/source/blender/draw/intern/draw_cache_impl_curve.c b/source/blender/draw/intern/draw_cache_impl_curve.c
index 4702319364c..f214f722c0b 100644
--- a/source/blender/draw/intern/draw_cache_impl_curve.c
+++ b/source/blender/draw/intern/draw_cache_impl_curve.c
@@ -39,9 +39,12 @@
 #include "BKE_font.h"
 
 #include "GPU_batch.h"
+#include "GPU_texture.h"
 
 #include "UI_resources.h"
 
+#include "DRW_render.h"
+
 #include "draw_cache_impl.h"  /* own include */
 
 #define SELECT            1
@@ -320,6 +323,14 @@ typedef struct CurveBatchCache {
 		int mat_len;
 	} surface;
 
+	/* Wireframes */
+	struct {
+		GPUVertBuf *elem_vbo;
+		GPUTexture *elem_tx;
+		GPUTexture *verts_tx;
+		uint tri_count;
+	} face_wire;
+
 	/* 3d text */
 	struct {
 		GPUBatch *select;
@@ -439,6 +450,11 @@ static void curve_batch_cache_clear(Curve *cu)
 	GPU_BATCH_DISCARD_ARRAY_SAFE(cache->surface.shaded_triangles, cache->surface.mat_len);
 	GPU_BATCH_DISCARD_SAFE(cache->surface.batch);
 
+	GPU_VERTBUF_DISCARD_SAFE(cache->face_wire.elem_vbo);
+	DRW_TEXTURE_FREE_SAFE(cache->face_wire.elem_tx);
+	DRW_TEXTURE_FREE_SAFE(cache->face_wire.verts_tx);
+	cache->face_wire.tri_count = 0;
+
 	/* don't own vbo & elems */
 	GPU_BATCH_DISCARD_SAFE(cache->wire.batch);
 	GPU_VERTBUF_DISCARD_SAFE(cache->wire.verts);
@@ -785,6 +801,40 @@ static GPUBatch *curve_batch_cache_get_pos_and_normals(CurveRenderData *rdata, C
 	return cache->surface.batch;
 }
 
+static GPUTexture *curve_batch_cache_get_edges_overlay_texture_buf(CurveRenderData *rdata, CurveBatchCache *cache)
+{
+	BLI_assert(rdata->types & CU_DATATYPE_SURFACE);
+
+	if (cache->face_wire.elem_tx != NULL) {
+		return cache->face_wire.elem_tx;
+	}
+
+	ListBase *lb = &rdata->ob_curve_cache->disp;
+
+	/* We need a special index buffer. */
+	GPUVertBuf *vbo = cache->face_wire.elem_vbo = DRW_displist_create_edges_overlay_texture_buf(lb);
+
+	/* Upload data early because we need to create the texture for it. */
+	GPU_vertbuf_use(vbo);
+	cache->face_wire.elem_tx = GPU_texture_create_from_vertbuf(vbo);
+	cache->face_wire.tri_count = vbo->vertex_alloc / 3;
+
+	return cache->face_wire.elem_tx;
+}
+
+static GPUTexture *curve_batch_cache_get_vert_pos_and_nor_in_order_buf(CurveRenderData *rdata, CurveBatchCache *cache)
+{
+	BLI_assert(rdata->types & CU_DATATYPE_SURFACE);
+
+	if (cache->face_wire.verts_tx == NULL) {
+		curve_batch_cache_get_pos_and_normals(rdata, cache);
+		GPU_vertbuf_use(cache->surface.verts); /* Upload early for buffer texture creation. */
+		cache->face_wire.verts_tx = GPU_texture_create_buffer(GPU_R32F, cache->surface.verts->vbo_id);
+	}
+
+	return cache->face_wire.verts_tx;
+}
+
 /** \} */
 
 
@@ -1024,6 +1074,25 @@ GPUBatch **DRW_curve_batch_cache_get_surface_shaded(
 	return cache->surface.shaded_triangles;
 }
 
+void DRW_curve_batch_cache_get_wireframes_face_te

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list