[Bf-blender-cvs] [ae84236ac38] hair_guides: Additional pass in object mode for drawing hair follicles and guide curves.

Lukas Tönne noreply at git.blender.org
Sun Nov 19 18:24:36 CET 2017


Commit: ae84236ac38fa4b61277a79340a9a9f3965323de
Author: Lukas Tönne
Date:   Sun Nov 19 17:23:49 2017 +0000
Branches: hair_guides
https://developer.blender.org/rBae84236ac38fa4b61277a79340a9a9f3965323de

Additional pass in object mode for drawing hair follicles and guide curves.

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

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/intern/draw_common.h
M	source/blender/draw/intern/draw_hair.c
M	source/blender/draw/modes/object_mode.c

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

diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index 83eae9f98c2..dd6f17872d8 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -2599,3 +2599,23 @@ Gwn_Batch *DRW_cache_hair_get_fibers(struct HairSystem *hsys, struct DerivedMesh
 {
 	return DRW_hair_batch_cache_get_fibers(hsys, scalp, subdiv, r_buffer);
 }
+
+Gwn_Batch *DRW_cache_hair_get_follicle_points(struct HairSystem *hsys, struct DerivedMesh *scalp)
+{
+	return DRW_hair_batch_cache_get_follicle_points(hsys, scalp);
+}
+
+Gwn_Batch *DRW_cache_hair_get_follicle_axes(struct HairSystem *hsys, struct DerivedMesh *scalp)
+{
+	return DRW_hair_batch_cache_get_follicle_axes(hsys, scalp);
+}
+
+Gwn_Batch *DRW_cache_hair_get_guide_curve_points(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv)
+{
+	return DRW_hair_batch_cache_get_guide_curve_points(hsys, scalp, subdiv);
+}
+
+Gwn_Batch *DRW_cache_hair_get_guide_curve_edges(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv)
+{
+	return DRW_hair_batch_cache_get_guide_curve_edges(hsys, scalp, subdiv);
+}
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 21bdab2150b..2e05534a1d8 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -163,6 +163,10 @@ struct Gwn_Batch *DRW_cache_particles_get_prim(int type);
 /* Hair */
 struct Gwn_Batch *DRW_cache_hair_get_fibers(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv,
                                             const struct DRWHairFiberTextureBuffer **r_buffer);
+struct Gwn_Batch *DRW_cache_hair_get_follicle_points(struct HairSystem *hsys, struct DerivedMesh *scalp);
+struct Gwn_Batch *DRW_cache_hair_get_follicle_axes(struct HairSystem *hsys, struct DerivedMesh *scalp);
+struct Gwn_Batch *DRW_cache_hair_get_guide_curve_points(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv);
+struct Gwn_Batch *DRW_cache_hair_get_guide_curve_edges(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv);
 
 /* Metaball */
 struct Gwn_Batch *DRW_cache_mball_surface_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 d24fe69dd6b..3ac421dc98c 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -123,5 +123,9 @@ struct Gwn_Batch *DRW_particles_batch_cache_get_dots(struct ParticleSystem *psys
 /* Hair */
 struct Gwn_Batch *DRW_hair_batch_cache_get_fibers(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv,
                                                   const struct DRWHairFiberTextureBuffer **r_buffer);
+struct Gwn_Batch *DRW_hair_batch_cache_get_follicle_points(struct HairSystem *hsys, struct DerivedMesh *scalp);
+struct Gwn_Batch *DRW_hair_batch_cache_get_follicle_axes(struct HairSystem *hsys, struct DerivedMesh *scalp);
+struct Gwn_Batch *DRW_hair_batch_cache_get_guide_curve_points(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv);
+struct Gwn_Batch *DRW_hair_batch_cache_get_guide_curve_edges(struct HairSystem *hsys, struct DerivedMesh *scalp, int subdiv);
 
 #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 bf218bc58a8..b25d6986b81 100644
--- a/source/blender/draw/intern/draw_cache_impl_hair.c
+++ b/source/blender/draw/intern/draw_cache_impl_hair.c
@@ -39,6 +39,7 @@
 #include "DNA_scene_types.h"
 
 #include "BKE_hair.h"
+#include "BKE_mesh_sample.h"
 
 #include "DEG_depsgraph.h"
 
@@ -70,13 +71,19 @@
 /* Hair Gwn_Batch Cache */
 
 typedef struct HairBatchCache {
-	Gwn_VertBuf *verts;
-	Gwn_IndexBuf *segments;
-	
+	Gwn_VertBuf *fiber_verts;
+	Gwn_IndexBuf *fiber_edges;
 	Gwn_Batch *fibers;
-	
 	DRWHairFiberTextureBuffer texbuffer;
 	
+	Gwn_VertBuf *follicle_verts;
+	Gwn_IndexBuf *follicle_edges;
+	Gwn_Batch *follicles;
+	
+	Gwn_VertBuf *guide_curve_verts;
+	Gwn_IndexBuf *guide_curve_edges;
+	Gwn_Batch *guide_curves;
+	
 	/* settings to determine if cache is invalid */
 	bool is_dirty;
 } HairBatchCache;
@@ -149,8 +156,16 @@ static void hair_batch_cache_clear(HairSystem *hsys)
 	
 	if (cache) {
 		GWN_BATCH_DISCARD_SAFE(cache->fibers);
-		GWN_VERTBUF_DISCARD_SAFE(cache->verts);
-		GWN_INDEXBUF_DISCARD_SAFE(cache->segments);
+		GWN_VERTBUF_DISCARD_SAFE(cache->fiber_verts);
+		GWN_INDEXBUF_DISCARD_SAFE(cache->fiber_edges);
+		
+		GWN_BATCH_DISCARD_SAFE(cache->follicles);
+		GWN_VERTBUF_DISCARD_SAFE(cache->follicle_verts);
+		GWN_INDEXBUF_DISCARD_SAFE(cache->follicle_edges);
+		
+		GWN_BATCH_DISCARD_SAFE(cache->guide_curves);
+		GWN_VERTBUF_DISCARD_SAFE(cache->guide_curve_verts);
+		GWN_INDEXBUF_DISCARD_SAFE(cache->guide_curve_edges);
 		
 		{
 			DRWHairFiberTextureBuffer *buffer = &cache->texbuffer;
@@ -177,8 +192,8 @@ static void hair_batch_cache_ensure_fibers(HairSystem *hsys, int subdiv, HairBat
 {
 	TIMEIT_START(hair_batch_cache_ensure_fibers);
 
-	GWN_VERTBUF_DISCARD_SAFE(cache->verts);
-	GWN_INDEXBUF_DISCARD_SAFE(cache->segments);
+	GWN_VERTBUF_DISCARD_SAFE(cache->fiber_verts);
+	GWN_INDEXBUF_DISCARD_SAFE(cache->fiber_edges);
 	
 	const int totfibers = hsys->pattern ? hsys->pattern->num_follicles : 0;
 	int *fiber_lengths = BKE_hair_get_fiber_lengths(hsys, subdiv);
@@ -197,7 +212,7 @@ static void hair_batch_cache_ensure_fibers(HairSystem *hsys, int subdiv, HairBat
 		curve_param_id = GWN_vertformat_attr_add(&format, "curve_param", GWN_COMP_F32, 1, GWN_FETCH_FLOAT);
 	}
 	
-	cache->verts = GWN_vertbuf_create_with_format(&format);
+	cache->fiber_verts = GWN_vertbuf_create_with_format(&format);
 
 	Gwn_IndexBufBuilder elb;
 	{
@@ -208,7 +223,7 @@ static void hair_batch_cache_ensure_fibers(HairSystem *hsys, int subdiv, HairBat
 		prim_ct = 2 * totseg;
 		vert_ct = 2 * totpoint;
 		
-		GWN_vertbuf_data_alloc(cache->verts, vert_ct);
+		GWN_vertbuf_data_alloc(cache->fiber_verts, vert_ct);
 		GWN_indexbuf_init(&elb, prim_type, prim_ct, vert_ct);
 		TIMEIT_END(data_alloc);
 	}
@@ -224,10 +239,10 @@ static void hair_batch_cache_ensure_fibers(HairSystem *hsys, int subdiv, HairBat
 		float a = 0.0f;
 		for (int k = 0; k < fiblen; ++k) {
 			TIMEIT_BLOCK_START(GWN_vertbuf_attr_set);
-			GWN_vertbuf_attr_set(cache->verts, fiber_index_id, vi, &i);
-			GWN_vertbuf_attr_set(cache->verts, curve_param_id, vi, &a);
-			GWN_vertbuf_attr_set(cache->verts, fiber_index_id, vi+1, &i);
-			GWN_vertbuf_attr_set(cache->verts, curve_param_id, vi+1, &a);
+			GWN_vertbuf_attr_set(cache->fiber_verts, fiber_index_id, vi, &i);
+			GWN_vertbuf_attr_set(cache->fiber_verts, curve_param_id, vi, &a);
+			GWN_vertbuf_attr_set(cache->fiber_verts, fiber_index_id, vi+1, &i);
+			GWN_vertbuf_attr_set(cache->fiber_verts, curve_param_id, vi+1, &a);
 			TIMEIT_BLOCK_END(GWN_vertbuf_attr_set);
 			
 			if (k > 0) {
@@ -254,12 +269,12 @@ static void hair_batch_cache_ensure_fibers(HairSystem *hsys, int subdiv, HairBat
 		MEM_freeN(fiber_lengths);
 	}
 	
-	TIMEIT_BENCH(cache->segments = GWN_indexbuf_build(&elb), indexbuf_build);
+	TIMEIT_BENCH(cache->fiber_edges = GWN_indexbuf_build(&elb), indexbuf_build);
 
 	TIMEIT_END(hair_batch_cache_ensure_fibers);
 }
 
-static void hair_batch_cache_ensure_texbuffer(HairSystem *hsys, struct DerivedMesh *scalp, int subdiv, HairBatchCache *cache)
+static void hair_batch_cache_ensure_fiber_texbuffer(HairSystem *hsys, struct DerivedMesh *scalp, int subdiv, HairBatchCache *cache)
 {
 	DRWHairFiberTextureBuffer *buffer = &cache->texbuffer;
 	static const int elemsize = 8;
@@ -287,8 +302,11 @@ static void hair_batch_cache_ensure_texbuffer(HairSystem *hsys, struct DerivedMe
 	buffer->fiber_start = b_fiber_start / elemsize;
 }
 
-Gwn_Batch *DRW_hair_batch_cache_get_fibers(HairSystem *hsys, struct DerivedMesh *scalp, int subdiv,
-                                           const DRWHairFiberTextureBuffer **r_buffer)
+Gwn_Batch *DRW_hair_batch_cache_get_fibers(
+        HairSystem *hsys,
+        struct DerivedMesh *scalp,
+        int subdiv,
+        const DRWHairFiberTextureBuffer **r_buffer)
 {
 	HairBatchCache *cache = hair_batch_cache_get(hsys);
 
@@ -298,11 +316,11 @@ Gwn_Batch *DRW_hair_batch_cache_get_fibers(HairSystem *hsys, struct DerivedMesh
 		TIMEIT_BENCH(hair_batch_cache_ensure_fibers(hsys, subdiv, cache),
 		             hair_batch_cache_ensure_fibers);
 		
-		TIMEIT_BENCH(cache->fibers = GWN_batch_create(GWN_PRIM_TRIS, cache->verts, cache->segments),
+		TIMEIT_BENCH(cache->fibers = GWN_batch_create(GWN_PRIM_TRIS, cache->fiber_verts, cache->fiber_edges),
 		             GWN_batch_create);
 
-		TIMEIT_BENCH(hair_batch_cache_ensure_texbuffer(hsys, scalp, subdiv, cache),
-		             hair_batch_cache_ensure_texbuffer);
+		TIMEIT_BENCH(hair_batch_cache_ensure_fiber_texbuffer(hsys, scalp, subdiv, cache),
+		             hair_batch_cache_ensure_fiber_texbuffer);
 	}
 
 	if (r_buffer) {
@@ -313,3 +331,74 @@ Gwn_Batch *DRW_hair_batch_cache_get_fibers(HairSystem *hsys, struct DerivedMesh
 
 	return cache->fibers;
 }
+
+static void hair_batch_cache_ensure_follicles(
+        HairSystem *hsys,
+        struct DerivedMesh *scalp,
+        eHairDrawFollicleMode mode,
+        HairBatchCache *cache)
+{
+	GWN_VERTBUF_DISCARD_SAFE(cache->follicle_verts);
+	GWN_INDEXBUF_DISCARD_SAFE(cache->follicle_edges);
+	
+	const HairPattern *pattern = hsys->pattern;
+	
+	static Gwn_VertFormat format = { 0 };
+	static unsigned pos_id;
+	
+	/* initialize vertex format */
+	if (format.attrib_ct == 0) {
+		pos_id = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
+	}
+	
+	cache->follicle_verts = GWN_vertbuf_create_with_format(&format);
+	
+	GWN_vertbuf_data_alloc(cache->follicle_verts, pattern->num_follicles);
+	
+	HairFollicle *follicle = pattern->follicles;
+	for (int i = 0; i < pattern->num_follicles; ++i, ++follicle) {
+		float co[3], nor[3], tang[3];
+		BKE_mesh_sample_eval(scalp, &follicle->mesh_sample, co, nor, tang);
+		
+		GWN_vertbuf_attr_set(cache->follicle_verts, pos_id, (unsigned int)i, co);
+	}
+}
+
+Gwn_Batch *DRW_hair_batch_cache_get_follicle_points(
+        HairSystem *hsys,
+        struct 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list