[Bf-blender-cvs] [6a81f686eb1] hair_object: Draw function for hair follicles.

Lukas Tönne noreply at git.blender.org
Sun Sep 23 10:31:39 CEST 2018


Commit: 6a81f686eb110eb513fc3d2a74ed3c3bfe8c4449
Author: Lukas Tönne
Date:   Sun Sep 23 09:31:10 2018 +0100
Branches: hair_object
https://developer.blender.org/rB6a81f686eb110eb513fc3d2a74ed3c3bfe8c4449

Draw function for hair follicles.

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

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_hair.c
M	source/blender/draw/modes/edit_hair_mode.c
M	source/blender/editors/hair/edithair_test.c

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

diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index c39ec47101a..2d831c6e6d7 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -3370,19 +3370,19 @@ GPUBatch *DRW_cache_particles_get_prim(int type)
 
 /** \name Hair */
 
-GPUBatch *DRW_cache_hair_get_fibers(struct Object *ob, struct HairSystem *hsys, const struct HairExportCache *hair_export)
+GPUBatch *DRW_cache_hair_get_edit_follicle_points(struct Object *ob, struct HairSystem *hsys)
 {
-	return DRW_hair_batch_cache_get_fibers(ob, hsys, hair_export);
+	return DRW_hair_batch_cache_get_edit_follicle_points(ob, hsys);
 }
 
-GPUBatch *DRW_cache_hair_get_follicle_points(struct Object *ob, struct HairSystem *hsys)
+GPUBatch *DRW_cache_hair_get_edit_follicle_normals(struct Object *ob, struct HairSystem *hsys)
 {
-	return DRW_hair_batch_cache_get_follicle_points(ob, hsys);
+	return DRW_hair_batch_cache_get_edit_follicle_normals(ob, hsys);
 }
 
-GPUBatch *DRW_cache_hair_get_verts(struct Object *ob, struct HairSystem *hsys)
+GPUBatch *DRW_cache_hair_get_edit_follicle_axes(struct Object *ob, struct HairSystem *hsys)
 {
-	return DRW_hair_batch_cache_get_verts(ob, hsys);
+	return DRW_hair_batch_cache_get_edit_follicle_axes(ob, hsys);
 }
 
 GPUBatch *DRW_cache_hair_get_edit_strands(struct Object *ob, struct HairSystem *hsys)
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index d57fd2528a5..510f4bb5fb1 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -196,9 +196,9 @@ struct GPUBatch *DRW_cache_particles_get_edit_tip_points(
 struct GPUBatch *DRW_cache_particles_get_prim(int type);
 
 /* Hair */
-struct GPUBatch *DRW_cache_hair_get_fibers(struct Object *ob, struct HairSystem *hsys, const struct HairExportCache *hair_export);
-struct GPUBatch *DRW_cache_hair_get_follicle_points(struct Object *ob, struct HairSystem *hsys);
-struct GPUBatch *DRW_cache_hair_get_verts(struct Object *ob, struct HairSystem *hsys);
+struct GPUBatch *DRW_cache_hair_get_edit_follicle_points(struct Object *ob, struct HairSystem *hsys);
+struct GPUBatch *DRW_cache_hair_get_edit_follicle_normals(struct Object *ob, struct HairSystem *hsys);
+struct GPUBatch *DRW_cache_hair_get_edit_follicle_axes(struct Object *ob, struct HairSystem *hsys);
 struct GPUBatch *DRW_cache_hair_get_edit_strands(struct Object *ob, struct HairSystem *hsys);
 
 /* Metaball */
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index b0f01244f52..035d06b7ebd 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -152,9 +152,9 @@ struct GPUBatch *DRW_particles_batch_cache_get_edit_tip_points(
         struct Object *object, struct ParticleSystem *psys, struct PTCacheEdit *edit);
 
 /* Hair */
-struct GPUBatch *DRW_hair_batch_cache_get_fibers(struct Object *ob, struct HairSystem *hsys, const struct HairExportCache *hair_export);
-struct GPUBatch *DRW_hair_batch_cache_get_follicle_points(struct Object *ob, struct HairSystem *hsys);
-struct GPUBatch *DRW_hair_batch_cache_get_verts(struct Object *ob, struct HairSystem *hsys);
+struct GPUBatch *DRW_hair_batch_cache_get_edit_follicle_points(struct Object *ob, struct HairSystem *hsys);
+struct GPUBatch *DRW_hair_batch_cache_get_edit_follicle_normals(struct Object *ob, struct HairSystem *hsys);
+struct GPUBatch *DRW_hair_batch_cache_get_edit_follicle_axes(struct Object *ob, struct HairSystem *hsys);
 struct GPUBatch *DRW_hair_batch_cache_get_edit_strands(struct Object *ob, struct HairSystem *hsys);
 
 #endif /* __DRAW_CACHE_IMPL_H__ */
diff --git a/source/blender/draw/intern/draw_cache_impl_hair.c b/source/blender/draw/intern/draw_cache_impl_hair.c
index 5718f14106c..2673cc354f5 100644
--- a/source/blender/draw/intern/draw_cache_impl_hair.c
+++ b/source/blender/draw/intern/draw_cache_impl_hair.c
@@ -67,6 +67,10 @@ typedef struct HairBatchCache {
 	/* Control points when in edit mode. */
 	ParticleHairCache edit_hair;
 
+	GPUVertBuf *edit_follicle_pos;
+	GPUBatch *edit_follicle_points;
+	int edit_follicle_point_len;
+
 	bool is_dirty;
 	bool is_editmode;
 } HairBatchCache;
@@ -143,6 +147,9 @@ static void hair_batch_cache_clear(HairSystem *hsys)
 	if (cache) {
 		particle_batch_cache_clear_hair(&cache->hair);
 		particle_batch_cache_clear_hair(&cache->edit_hair);
+
+		GPU_BATCH_DISCARD_SAFE(cache->edit_follicle_points);
+		GPU_VERTBUF_DISCARD_SAFE(cache->edit_follicle_pos);
 	}
 }
 
@@ -734,21 +741,86 @@ static void hair_batch_cache_ensure_pos_and_seg(
 	hair_cache->indices = GPU_indexbuf_build(&elb);
 }
 
-GPUBatch *DRW_hair_batch_cache_get_fibers(Object *ob, HairSystem *hsys, const HairExportCache *hair_export)
+static void ensure_edit_follicle_points_count(
+        const HairPattern *pattern,
+        HairBatchCache *cache)
 {
-	// TODO
-	UNUSED_VARS(ob, hsys, hair_export);
-	return NULL;
+	if (cache->edit_follicle_pos != NULL) {
+		return;
+	}
+	cache->edit_follicle_point_len = pattern->num_follicles;
+}
+
+static void hair_batch_cache_ensure_edit_follicle_pos(
+        const HairPattern *pattern,
+        const Mesh *scalp,
+        HairBatchCache *cache)
+{
+	if (cache->edit_follicle_pos != NULL) {
+		return;
+	}
+
+	static GPUVertFormat format = { 0 };
+	static uint pos_id, data_id;
+
+	GPU_VERTBUF_DISCARD_SAFE(cache->edit_follicle_pos);
+
+	if (format.attr_len == 0) {
+		/* initialize vertex format */
+		pos_id = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+		data_id = GPU_vertformat_attr_add(&format, "data", GPU_COMP_U8, 1, GPU_FETCH_INT);
+	}
+
+	cache->edit_follicle_pos = GPU_vertbuf_create_with_format(&format);
+	GPU_vertbuf_data_alloc(cache->edit_follicle_pos, cache->edit_follicle_point_len);
+
+	const HairFollicle *follicle;
+	HairIterator iter;
+	int point_index;
+	BKE_HAIR_ITER_FOLLICLES_INDEX(follicle, &iter, pattern, point_index) {
+		float loc[3], nor[3], tang[3];
+		BKE_mesh_sample_eval(scalp, &follicle->mesh_sample, loc, nor, tang);
+
+		GPU_vertbuf_attr_set(cache->edit_follicle_pos, pos_id, point_index, loc);
+
+		unsigned char flag = 0;
+		GPU_vertbuf_attr_set(cache->edit_follicle_pos, data_id, point_index, &flag);
+	}
+}
+
+GPUBatch *DRW_hair_batch_cache_get_edit_follicle_points(Object *ob, HairSystem *hsys)
+{
+	HairBatchCache *cache = hair_batch_cache_get(hsys);
+	if (cache->edit_follicle_points != NULL) {
+		return cache->edit_follicle_points;
+	}
+
+	Mesh *scalp = BKE_hair_get_scalp(DRW_context_state_get()->depsgraph, ob, hsys);
+	const HairPattern *pattern;
+	if (hsys->edithair) {
+		pattern = hsys->edithair->pattern;
+	}
+	else {
+		pattern = hsys->pattern;
+	}
+
+	ensure_edit_follicle_points_count(pattern, cache);
+	hair_batch_cache_ensure_edit_follicle_pos(pattern, scalp, cache);
+	cache->edit_follicle_points = GPU_batch_create(
+	        GPU_PRIM_POINTS,
+	        cache->edit_follicle_pos,
+	        NULL);
+	return cache->edit_follicle_points;
 }
 
-GPUBatch *DRW_hair_batch_cache_get_follicle_points(Object *ob, HairSystem *hsys)
+GPUBatch *DRW_hair_batch_cache_get_edit_follicle_normals(Object *ob, HairSystem *hsys)
 {
 	// TODO
 	UNUSED_VARS(ob, hsys);
 	return NULL;
 }
 
-GPUBatch *DRW_hair_batch_cache_get_verts(Object *ob, HairSystem *hsys)
+GPUBatch *DRW_hair_batch_cache_get_edit_follicle_axes(Object *ob, HairSystem *hsys)
 {
 	// TODO
 	UNUSED_VARS(ob, hsys);
diff --git a/source/blender/draw/modes/edit_hair_mode.c b/source/blender/draw/modes/edit_hair_mode.c
index b20ca7a10d4..690756dbc4d 100644
--- a/source/blender/draw/modes/edit_hair_mode.c
+++ b/source/blender/draw/modes/edit_hair_mode.c
@@ -54,6 +54,7 @@ extern char datatoc_edit_hair_overlay_frag_glsl[];
 extern char datatoc_gpu_shader_3D_vert_glsl[];
 extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
 extern char datatoc_gpu_shader_point_uniform_color_frag_glsl[];
+extern char datatoc_gpu_shader_flat_color_frag_glsl[];
 
 /* *********** LISTS *********** */
 /* All lists are per viewport specific datas.
@@ -67,7 +68,8 @@ typedef struct EDIT_HAIR_PassList {
 	 * EDIT_GROOM_cache_init().
 	 * Only contains (DRWPass *) */
 	struct DRWPass *wire_pass;
-	struct DRWPass *vert_pass;
+	struct DRWPass *overlay_vert_pass;
+	struct DRWPass *overlay_edge_pass;
 } EDIT_HAIR_PassList;
 
 typedef struct EDIT_HAIR_FramebufferList {
@@ -113,6 +115,7 @@ static struct {
 	GPUShader *wire_sh;
 
 	GPUShader *overlay_vert_sh;
+	GPUShader *overlay_edge_sh;
 
 } e_data = {NULL}; /* Engine data */
 
@@ -120,7 +123,8 @@ typedef struct EDIT_HAIR_PrivateData {
 	/* This keeps the references of the shading groups for
 	 * easy access in EDIT_GROOM_cache_populate() */
 	DRWShadingGroup *wire_shgrp;
-	DRWShadingGroup *vert_shgrp;
+	DRWShadingGroup *overlay_verts_shgrp;
+	DRWShadingGroup *overlay_edges_shgrp;
 } EDIT_HAIR_PrivateData; /* Transient data */
 
 /* *********** FUNCTIONS *********** */
@@ -161,6 +165,13 @@ static void EDIT_HAIR_engine_init(void *vedata)
 		        datatoc_edit_hair_overlay_frag_glsl,
 		        datatoc_common_globals_lib_glsl, NULL);
 	}
+
+	if (!e_data.overlay_edge_sh) {
+		e_data.overlay_edge_sh = DRW_shader_create_with_lib(
+		        datatoc_edit_hair_overlay_loosevert_vert_glsl, NULL,
+		        datatoc_edit_hair_overlay_frag_glsl,
+		        datatoc_common_globals_lib_glsl, NULL);
+	}
 }
 
 /* Here init all passes and shading groups
@@ -181,12 +192,18 @@ static void EDIT_HAIR_cache_init(void *vedata)
 		        DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_WIRE);
 		stl->g_data->wire_shgrp = DRW_shgroup_create(e_data.wire_sh, psl->wire_pass);
 
-		psl->vert_pass = DRW_pass_create(
-		        "Hair Verts",
+		psl->overlay_vert_pass = DRW_pass_create(
+		        "Hair Overlay Verts",
 		        DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_POINT);
-		stl->g_data->vert_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, psl->vert_pass);
+		stl->g_data->overlay_verts_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, psl->overlay_vert_pass);
+
+		psl->overlay_edge_pass = DRW_pass_create(
+		        "Hair Overlay Edges",
+		        DRW_STATE_WRIT

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list