[Bf-blender-cvs] [1b837226ce1] strand_editmode: Store the scalp mesh as part of the hair drawing interface.

Lukas Tönne noreply at git.blender.org
Fri Aug 18 17:15:13 CEST 2017


Commit: 1b837226ce1fa03c2e9f9265ea53cd4840be38bb
Author: Lukas Tönne
Date:   Mon Aug 14 08:46:10 2017 +0100
Branches: strand_editmode
https://developer.blender.org/rB1b837226ce1fa03c2e9f9265ea53cd4840be38bb

Store the scalp mesh as part of the hair drawing interface.

The scalp mesh is always needed for evaluating root positions anyway.

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

M	source/blender/blenkernel/BKE_hair.h
M	source/blender/blenkernel/intern/hair.c
M	source/blender/blenkernel/intern/hair_draw.c
M	source/blender/draw/intern/draw_cache_impl_hair.c

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

diff --git a/source/blender/blenkernel/BKE_hair.h b/source/blender/blenkernel/BKE_hair.h
index b5dc42b0974..94ec9ff80cc 100644
--- a/source/blender/blenkernel/BKE_hair.h
+++ b/source/blender/blenkernel/BKE_hair.h
@@ -61,6 +61,7 @@ void BKE_hair_update_groups(struct HairPattern *hair);
 
 typedef struct HairDrawDataInterface {
 	const struct HairGroup *group;
+	struct DerivedMesh *scalp;
 	
 	int (*get_num_strands)(const struct HairDrawDataInterface* hairdata);
 	int (*get_num_verts)(const struct HairDrawDataInterface* hairdata);
@@ -74,8 +75,7 @@ int* BKE_hair_strands_get_fiber_lengths(const struct HairDrawDataInterface *hair
 void BKE_hair_strands_get_texture_buffer_size(const struct HairDrawDataInterface *hairdata, int subdiv,
                                               int *r_size, int *r_strand_map_start,
                                               int *r_strand_vertex_start, int *r_fiber_start);
-void BKE_hair_strands_get_texture_buffer(const struct HairDrawDataInterface *hairdata, int subdiv, struct DerivedMesh *scalp,
-                                         void *texbuffer);
+void BKE_hair_strands_get_texture_buffer(const struct HairDrawDataInterface *hairdata, int subdiv, void *texbuffer);
 
 /* === Draw Cache === */
 
@@ -86,9 +86,9 @@ void BKE_hair_batch_cache_dirty(struct HairGroup *group, int mode);
 void BKE_hair_batch_cache_all_dirty(struct HairPattern *hair, int mode);
 void BKE_hair_batch_cache_free(struct HairGroup *group);
 
-int* BKE_hair_group_get_fiber_lengths(struct HairGroup *group, int subdiv);
-void BKE_hair_group_get_texture_buffer_size(struct HairGroup *group, int subdiv, int *r_size,
-                                            int *r_strand_map_start, int *r_strand_vertex_start, int *r_fiber_start);
-void BKE_hair_group_get_texture_buffer(struct HairGroup *group, int subdiv, struct DerivedMesh *scalp, void *texbuffer);
+int* BKE_hair_group_get_fiber_lengths(struct HairGroup *group, struct DerivedMesh *scalp, int subdiv);
+void BKE_hair_group_get_texture_buffer_size(struct HairGroup *group, struct DerivedMesh *scalp, int subdiv,
+                                            int *r_size, int *r_strand_map_start, int *r_strand_vertex_start, int *r_fiber_start);
+void BKE_hair_group_get_texture_buffer(struct HairGroup *group, struct DerivedMesh *scalp, int subdiv, void *texbuffer);
 
 #endif
diff --git a/source/blender/blenkernel/intern/hair.c b/source/blender/blenkernel/intern/hair.c
index 7dc1916d29c..6da66029640 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -336,10 +336,11 @@ static void get_strand_vertices(const HairDrawDataInterface* hairdata_, float (*
 	}
 }
 
-static HairGroupStrandsView hair_strands_get_view(HairGroup *group)
+static HairGroupStrandsView hair_strands_get_view(HairGroup *group, DerivedMesh *scalp)
 {
 	HairGroupStrandsView hairdata;
 	hairdata.base.group = group;
+	hairdata.base.scalp = scalp;
 	hairdata.base.get_num_strands = get_num_strands;
 	hairdata.base.get_num_verts = get_num_verts;
 	hairdata.base.get_strand_lengths = get_strand_lengths;
@@ -363,23 +364,23 @@ static HairGroupStrandsView hair_strands_get_view(HairGroup *group)
 	return hairdata;
 }
 
-int* BKE_hair_group_get_fiber_lengths(HairGroup *group, int subdiv)
+int* BKE_hair_group_get_fiber_lengths(HairGroup *group, DerivedMesh *scalp, int subdiv)
 {
-	HairGroupStrandsView hairdata = hair_strands_get_view(group);
+	HairGroupStrandsView hairdata = hair_strands_get_view(group, scalp);
 	return BKE_hair_strands_get_fiber_lengths(&hairdata.base, subdiv);
 }
 
-void BKE_hair_group_get_texture_buffer_size(HairGroup *group, int subdiv,
+void BKE_hair_group_get_texture_buffer_size(HairGroup *group, DerivedMesh *scalp, int subdiv,
                                             int *r_size, int *r_strand_map_start,
                                             int *r_strand_vertex_start, int *r_fiber_start)
 {
-	HairGroupStrandsView hairdata = hair_strands_get_view(group);
+	HairGroupStrandsView hairdata = hair_strands_get_view(group, scalp);
 	BKE_hair_strands_get_texture_buffer_size(&hairdata.base, subdiv,
 	                                         r_size, r_strand_map_start, r_strand_vertex_start, r_fiber_start);
 }
 
-void BKE_hair_group_get_texture_buffer(HairGroup *group, int subdiv, DerivedMesh *scalp, void *buffer)
+void BKE_hair_group_get_texture_buffer(HairGroup *group, DerivedMesh *scalp, int subdiv, void *buffer)
 {
-	HairGroupStrandsView hairdata = hair_strands_get_view(group);
-	BKE_hair_strands_get_texture_buffer(&hairdata.base, subdiv, scalp, buffer);
+	HairGroupStrandsView hairdata = hair_strands_get_view(group, scalp);
+	BKE_hair_strands_get_texture_buffer(&hairdata.base, subdiv, buffer);
 }
diff --git a/source/blender/blenkernel/intern/hair_draw.c b/source/blender/blenkernel/intern/hair_draw.c
index 7bd88c02658..c2cc17d1c38 100644
--- a/source/blender/blenkernel/intern/hair_draw.c
+++ b/source/blender/blenkernel/intern/hair_draw.c
@@ -551,8 +551,7 @@ void BKE_hair_strands_get_texture_buffer_size(const HairDrawDataInterface *haird
 	                             r_size, r_strand_map_start, r_strand_vertex_start, r_fiber_start);
 }
 
-void BKE_hair_strands_get_texture_buffer(const HairDrawDataInterface *hairdata, int subdiv, DerivedMesh *scalp,
-                                         void *buffer)
+void BKE_hair_strands_get_texture_buffer(const HairDrawDataInterface *hairdata, int subdiv, void *buffer)
 {
 	const int totstrands = hairdata->get_num_strands(hairdata);
 	const int totverts_orig = hairdata->get_num_verts(hairdata);
@@ -567,11 +566,11 @@ void BKE_hair_strands_get_texture_buffer(const HairDrawDataInterface *hairdata,
 	hairdata->get_strand_vertices(hairdata, vertco_orig);
 	hairdata->get_strand_roots(hairdata, roots);
 	
-	hair_get_strand_buffer(scalp, totstrands, totverts_orig, subdiv,
+	hair_get_strand_buffer(hairdata->scalp, totstrands, totverts_orig, subdiv,
 	                       lengths_orig, vertco_orig, roots,
 	                       (HairStrandMapTextureBuffer*)((char*)buffer + strand_map_start),
 	                       (HairStrandVertexTextureBuffer*)((char*)buffer + strand_vertex_start));
-	hair_get_fiber_buffer(hairdata->group, scalp, (HairFiberTextureBuffer*)((char*)buffer + fiber_start));
+	hair_get_fiber_buffer(hairdata->group, hairdata->scalp, (HairFiberTextureBuffer*)((char*)buffer + fiber_start));
 	
 	MEM_freeN(lengths_orig);
 	MEM_freeN(vertco_orig);
diff --git a/source/blender/draw/intern/draw_cache_impl_hair.c b/source/blender/draw/intern/draw_cache_impl_hair.c
index 94a22a610e1..fbcce57e3b8 100644
--- a/source/blender/draw/intern/draw_cache_impl_hair.c
+++ b/source/blender/draw/intern/draw_cache_impl_hair.c
@@ -171,7 +171,7 @@ void DRW_hair_batch_cache_free(HairGroup *group)
 	MEM_SAFE_FREE(group->draw_batch_cache);
 }
 
-static void hair_batch_cache_ensure_fibers(HairGroup *group, HairBatchCache *cache, int subdiv)
+static void hair_batch_cache_ensure_fibers(HairGroup *group, struct DerivedMesh *scalp, int subdiv, HairBatchCache *cache)
 {
 	TIMEIT_START(hair_batch_cache_ensure_fibers);
 
@@ -179,7 +179,7 @@ static void hair_batch_cache_ensure_fibers(HairGroup *group, HairBatchCache *cac
 	GWN_INDEXBUF_DISCARD_SAFE(cache->segments);
 	
 	const int totfibers = group->num_follicles;
-	int *fiber_lengths = BKE_hair_group_get_fiber_lengths(group, subdiv);
+	int *fiber_lengths = BKE_hair_group_get_fiber_lengths(group, scalp, subdiv);
 	int totpoint = 0;
 	for (int i = 0; i < totfibers; ++i) {
 		totpoint += fiber_lengths[i];
@@ -254,7 +254,7 @@ static void hair_batch_cache_ensure_fibers(HairGroup *group, HairBatchCache *cac
 	TIMEIT_END(hair_batch_cache_ensure_fibers);
 }
 
-static void hair_batch_cache_ensure_texbuffer(HairGroup *group, HairBatchCache *cache, int subdiv, struct DerivedMesh *scalp)
+static void hair_batch_cache_ensure_texbuffer(HairGroup *group, struct DerivedMesh *scalp, int subdiv, HairBatchCache *cache)
 {
 	DRWHairFiberTextureBuffer *buffer = &cache->texbuffer;
 	static const int elemsize = 8;
@@ -263,7 +263,7 @@ static void hair_batch_cache_ensure_texbuffer(HairGroup *group, HairBatchCache *
 	
 	// Offsets in bytes
 	int b_size, b_strand_map_start, b_strand_vertex_start, b_fiber_start;
-	BKE_hair_group_get_texture_buffer_size(group, subdiv, &b_size, 
+	BKE_hair_group_get_texture_buffer_size(group, scalp, subdiv, &b_size, 
 	        &b_strand_map_start, &b_strand_vertex_start, &b_fiber_start);
 	// Pad for alignment
 	b_size += align - b_size % align;
@@ -273,7 +273,7 @@ static void hair_batch_cache_ensure_texbuffer(HairGroup *group, HairBatchCache *
 	const int height = size / width;
 	
 	buffer->data = MEM_mallocN(b_size, "hair fiber texture buffer");
-	BKE_hair_group_get_texture_buffer(group, subdiv, scalp, buffer->data);
+	BKE_hair_group_get_texture_buffer(group, scalp, subdiv, buffer->data);
 	
 	buffer->width = width;
 	buffer->height = height;
@@ -290,13 +290,13 @@ Gwn_Batch *DRW_hair_batch_cache_get_fibers(HairGroup *group, int subdiv, struct
 	TIMEIT_START(DRW_hair_batch_cache_get_fibers);
 
 	if (cache->fibers == NULL) {
-		TIMEIT_BENCH(hair_batch_cache_ensure_fibers(group, cache, subdiv),
+		TIMEIT_BENCH(hair_batch_cache_ensure_fibers(group, scalp, subdiv, cache),
 		             hair_batch_cache_ensure_fibers);
 		
 		TIMEIT_BENCH(cache->fibers = GWN_batch_create(GWN_PRIM_TRIS, cache->verts, cache->segments),
 		             GWN_batch_create);
 
-		TIMEIT_BENCH(hair_batch_cache_ensure_texbuffer(group, cache, subdiv, scalp),
+		TIMEIT_BENCH(hair_batch_cache_ensure_texbuffer(group, scalp, subdiv, cache),
 		             hair_batch_cache_ensure_texbuffer);
 	}



More information about the Bf-blender-cvs mailing list