diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2017-08-03 22:27:33 +0300 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2017-08-03 22:27:33 +0300 |
commit | 9feec51214d811537f7fb9fe0af579117ee007f7 (patch) | |
tree | f26dbb36e074751dae69c74b55daa1dc93a87bcd /source/blender/draw | |
parent | e34ba9fb7a91ef9be9109eaae5242cd4b3d7a22c (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.c | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache.c | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache.h | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl.h | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_strands.c | 16 |
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) { |