[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