Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Tönne <lukas.toenne@gmail.com>2017-08-03 22:27:33 +0300
committerLukas Tönne <lukas.toenne@gmail.com>2017-08-03 22:27:33 +0300
commit9feec51214d811537f7fb9fe0af579117ee007f7 (patch)
treef26dbb36e074751dae69c74b55daa1dc93a87bcd /source/blender/draw
parente34ba9fb7a91ef9be9109eaae5242cd4b3d7a22c (diff)
Subdivision of hair fibers for smoother shading.
Subdivision works on the parent strands for efficiency. The fibers lengths are based on the final subdivided length of parents, so no changes to the shader are required. This would be nicer with a tesselation shader, but this feature is not available in Blender 2.8.
Diffstat (limited to 'source/blender/draw')
-rw-r--r--source/blender/draw/engines/eevee/eevee_materials.c2
-rw-r--r--source/blender/draw/intern/draw_cache.c4
-rw-r--r--source/blender/draw/intern/draw_cache.h2
-rw-r--r--source/blender/draw/intern/draw_cache_impl.h2
-rw-r--r--source/blender/draw/intern/draw_cache_impl_strands.c16
5 files changed, 13 insertions, 13 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index a50b5b62e62..9772666d3ae 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -1136,7 +1136,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
use_fibers = true;
copy_m4_m4(mat, ob->obmat);
- hair_geom = DRW_cache_editstrands_get_hair_fibers(edit, true, &fiber_buffer);
+ hair_geom = DRW_cache_editstrands_get_hair_fibers(edit, true, tsettings->hair_draw_subdiv, &fiber_buffer);
if (!edit->texture) {
edit->texture = DRW_texture_create_2D(fiber_buffer->width, fiber_buffer->height,
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index f2772c47d67..a4753c9b55b 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -2610,8 +2610,8 @@ Gwn_Batch *DRW_cache_editstrands_get_wires(struct BMEditStrands *es)
return DRW_editstrands_batch_cache_get_wires(es);
}
-Gwn_Batch *DRW_cache_editstrands_get_hair_fibers(struct BMEditStrands *es, bool use_ribbons,
+Gwn_Batch *DRW_cache_editstrands_get_hair_fibers(struct BMEditStrands *es, bool use_ribbons, int subdiv,
const struct DRWHairFiberTextureBuffer **r_buffer)
{
- return DRW_editstrands_batch_cache_get_hair_fibers(es, use_ribbons, r_buffer);
+ return DRW_editstrands_batch_cache_get_hair_fibers(es, use_ribbons, subdiv, r_buffer);
}
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index ebf4dbafe2c..c536bd81084 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -164,7 +164,7 @@ struct Gwn_Batch *DRW_cache_editstrands_get_roots(struct BMEditStrands *es);
struct Gwn_Batch *DRW_cache_editstrands_get_points(struct BMEditStrands *es);
struct Gwn_Batch *DRW_cache_editstrands_get_wires(struct BMEditStrands *es);
-struct Gwn_Batch *DRW_cache_editstrands_get_hair_fibers(struct BMEditStrands *es, bool use_ribbons,
+struct Gwn_Batch *DRW_cache_editstrands_get_hair_fibers(struct BMEditStrands *es, bool use_ribbons, int subdiv,
const struct DRWHairFiberTextureBuffer **r_buffer);
#endif /* __DRAW_CACHE_H__ */
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index 9c1ad374de1..a6f4c486e2f 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -112,7 +112,7 @@ struct Gwn_Batch *DRW_editstrands_batch_cache_get_wires(struct BMEditStrands *es
struct Gwn_Batch *DRW_editstrands_batch_cache_get_tips(struct BMEditStrands *es);
struct Gwn_Batch *DRW_editstrands_batch_cache_get_roots(struct BMEditStrands *es);
struct Gwn_Batch *DRW_editstrands_batch_cache_get_points(struct BMEditStrands *es);
-struct Gwn_Batch *DRW_editstrands_batch_cache_get_hair_fibers(struct BMEditStrands *es, bool use_ribbons,
+struct Gwn_Batch *DRW_editstrands_batch_cache_get_hair_fibers(struct BMEditStrands *es, bool use_ribbons, int subdiv,
const struct DRWHairFiberTextureBuffer **r_buffer);
#endif /* __DRAW_CACHE_IMPL_H__ */
diff --git a/source/blender/draw/intern/draw_cache_impl_strands.c b/source/blender/draw/intern/draw_cache_impl_strands.c
index 2d57d7e20ac..d3e9406fcfb 100644
--- a/source/blender/draw/intern/draw_cache_impl_strands.c
+++ b/source/blender/draw/intern/draw_cache_impl_strands.c
@@ -364,12 +364,12 @@ Gwn_Batch *DRW_editstrands_batch_cache_get_points(BMEditStrands *es)
return cache->points;
}
-static void editstrands_batch_cache_ensure_hair_fibers(BMEditStrands *es, StrandsBatchCache *cache, bool use_ribbons)
+static void editstrands_batch_cache_ensure_hair_fibers(BMEditStrands *es, StrandsBatchCache *cache, bool use_ribbons, int subdiv)
{
GWN_VERTBUF_DISCARD_SAFE(cache->hair.verts);
GWN_INDEXBUF_DISCARD_SAFE(cache->hair.segments);
- int *fiber_lengths = BKE_editstrands_hair_get_fiber_lengths(es);
+ int *fiber_lengths = BKE_editstrands_hair_get_fiber_lengths(es, subdiv);
int totpoint = 0;
for (int i = 0; i < es->hair_totfibers; ++i) {
totpoint += fiber_lengths[i];
@@ -446,7 +446,7 @@ static void editstrands_batch_cache_ensure_hair_fibers(BMEditStrands *es, Strand
cache->hair.segments = GWN_indexbuf_build(&elb);
}
-static void editstrands_batch_cache_ensure_hair_fiber_texbuffer(BMEditStrands *es, StrandsBatchCache *cache, bool UNUSED(use_ribbons))
+static void editstrands_batch_cache_ensure_hair_fiber_texbuffer(BMEditStrands *es, StrandsBatchCache *cache, bool UNUSED(use_ribbons), int subdiv)
{
DRWHairFiberTextureBuffer *buffer = &cache->hair.texbuffer;
static const int elemsize = 8;
@@ -455,7 +455,7 @@ static void editstrands_batch_cache_ensure_hair_fiber_texbuffer(BMEditStrands *e
// Offsets in bytes
int b_size, b_strand_map_start, b_strand_vertex_start, b_fiber_start;
- BKE_editstrands_hair_get_texture_buffer_size(es, &b_size,
+ BKE_editstrands_hair_get_texture_buffer_size(es, subdiv, &b_size,
&b_strand_map_start, &b_strand_vertex_start, &b_fiber_start);
// Pad for alignment
b_size += align - b_size % align;
@@ -465,7 +465,7 @@ static void editstrands_batch_cache_ensure_hair_fiber_texbuffer(BMEditStrands *e
const int height = size / width;
buffer->data = MEM_mallocN(b_size, "hair fiber texture buffer");
- BKE_editstrands_hair_get_texture_buffer(es, buffer->data);
+ BKE_editstrands_hair_get_texture_buffer(es, subdiv, buffer->data);
buffer->width = width;
buffer->height = height;
@@ -474,7 +474,7 @@ static void editstrands_batch_cache_ensure_hair_fiber_texbuffer(BMEditStrands *e
buffer->fiber_start = b_fiber_start / elemsize;
}
-Gwn_Batch *DRW_editstrands_batch_cache_get_hair_fibers(BMEditStrands *es, bool use_ribbons,
+Gwn_Batch *DRW_editstrands_batch_cache_get_hair_fibers(BMEditStrands *es, bool use_ribbons, int subdiv,
const DRWHairFiberTextureBuffer **r_buffer)
{
StrandsBatchCache *cache = editstrands_batch_cache_get(es);
@@ -484,13 +484,13 @@ Gwn_Batch *DRW_editstrands_batch_cache_get_hair_fibers(BMEditStrands *es, bool u
}
if (cache->hair.fibers == NULL) {
- editstrands_batch_cache_ensure_hair_fibers(es, cache, use_ribbons);
+ editstrands_batch_cache_ensure_hair_fibers(es, cache, use_ribbons, subdiv);
Gwn_PrimType prim_type = use_ribbons ? GWN_PRIM_TRIS : GWN_PRIM_LINES;
cache->hair.fibers = GWN_batch_create(prim_type, cache->hair.verts, cache->hair.segments);
cache->hair.use_ribbons = use_ribbons;
- editstrands_batch_cache_ensure_hair_fiber_texbuffer(es, cache, use_ribbons);
+ editstrands_batch_cache_ensure_hair_fiber_texbuffer(es, cache, use_ribbons, subdiv);
}
if (r_buffer) {