Commit: e34ba9fb7a91ef9be9109eaae5242cd4b3d7a22c
Author: Lukas Tönne
Date:   Thu Aug 3 08:11:48 2017 +0100
Branches: strand_editmode
https://developer.blender.org/rBe34ba9fb7a91ef9be9109eaae5242cd4b3d7a22c

Use a 2D texture for the hair interpolation data instead of 1D for larger 
number of hairs.

It turns out that 1D textures have the same size limit on their 1 axis as 2D 
textures.
This limits the potential number of hair dramatically, even though the actual 
size of
the texture is very small. Using a 2D texture and wrapping the index avoids 
this problem.

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

M       source/blender/blenkernel/BKE_editstrands.h
M       source/blender/blenkernel/BKE_hair.h
M       source/blender/blenkernel/intern/editstrands.c
M       source/blender/blenkernel/intern/hair.c
M       source/blender/draw/CMakeLists.txt
M       source/blender/draw/engines/eevee/eevee_materials.c
M       source/blender/draw/engines/eevee/shaders/hair_lib.glsl
M       source/blender/draw/intern/draw_cache_impl_strands.c
M       source/blender/draw/intern/draw_common.h
A       source/blender/draw/intern/draw_hair.c

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

diff --git a/source/blender/blenkernel/BKE_editstrands.h 
b/source/blender/blenkernel/BKE_editstrands.h
index 9199668fb9e..e5858160f65 100644
--- a/source/blender/blenkernel/BKE_editstrands.h
+++ b/source/blender/blenkernel/BKE_editstrands.h
@@ -85,10 +85,11 @@ bool BKE_editstrands_hair_ensure(struct BMEditStrands *es);
 void BKE_editstrands_hair_free(struct BMEditStrands *es);
 
 int* BKE_editstrands_hair_get_fiber_lengths(struct BMEditStrands *es);
-void BKE_editstrands_hair_get_texture_buffer(struct BMEditStrands *es, void 
**texbuffer, int *r_size,
-                                             int *strand_map_start,
-                                             int *strand_vertex_start,
-                                             int *fiber_start);
+void BKE_editstrands_hair_get_texture_buffer_size(struct BMEditStrands *es, 
int *r_size,
+                                                  int *r_strand_map_start,
+                                                  int *r_strand_vertex_start,
+                                                  int *r_fiber_start);
+void BKE_editstrands_hair_get_texture_buffer(struct BMEditStrands *es, void 
*texbuffer);
 
 /* === Constraints === */
 
diff --git a/source/blender/blenkernel/BKE_hair.h 
b/source/blender/blenkernel/BKE_hair.h
index 4169a3b6f16..5eafc14e66f 100644
--- a/source/blender/blenkernel/BKE_hair.h
+++ b/source/blender/blenkernel/BKE_hair.h
@@ -68,9 +68,11 @@ struct HairFiber* BKE_hair_fibers_create(const struct 
StrandsView *strands,
 int* BKE_hair_get_fiber_lengths(const struct HairFiber *fibers, int totfibers,
                                  const struct StrandsView *strands);
 
+void BKE_hair_get_texture_buffer_size(const struct StrandsView *strands, int 
totfibers,
+                                      int *r_size, int *r_strand_map_start,
+                                      int *r_strand_vertex_start, int 
*r_fiber_start);
 void BKE_hair_get_texture_buffer(const struct StrandsView *strands, struct 
DerivedMesh *scalp,
                                  const struct HairFiber *fibers, int totfibers,
-                                 void **r_texbuffer, int *r_size, int 
*r_strand_map_start,
-                                 int *r_strand_vertex_start, int 
*r_fiber_start);
+                                 void *texbuffer);
 
 #endif
diff --git a/source/blender/blenkernel/intern/editstrands.c 
b/source/blender/blenkernel/intern/editstrands.c
index 16e47aabf91..0fe286a5d3a 100644
--- a/source/blender/blenkernel/intern/editstrands.c
+++ b/source/blender/blenkernel/intern/editstrands.c
@@ -239,14 +239,20 @@ int* BKE_editstrands_hair_get_fiber_lengths(BMEditStrands 
*es)
        return BKE_hair_get_fiber_lengths(es->hair_fibers, es->hair_totfibers, 
&strands.base);
 }
 
-void BKE_editstrands_hair_get_texture_buffer(BMEditStrands *es, void 
**r_texbuffer, int *r_size,
-                                             int *r_strand_map_start,
-                                             int *r_strand_vertex_start,
-                                             int *r_fiber_start)
+void BKE_editstrands_hair_get_texture_buffer_size(BMEditStrands *es, int 
*r_size,
+                                                  int *r_strand_map_start,
+                                                  int *r_strand_vertex_start,
+                                                  int *r_fiber_start)
 {
        EditStrandsView strands = editstrands_get_view(es);
-       BKE_hair_get_texture_buffer(&strands.base, es->root_dm, 
es->hair_fibers, es->hair_totfibers,
-                                   r_texbuffer, r_size, r_strand_map_start, 
r_strand_vertex_start, r_fiber_start);
+       BKE_hair_get_texture_buffer_size(&strands.base, es->hair_totfibers,
+                                        r_size, r_strand_map_start, 
r_strand_vertex_start, r_fiber_start);
+}
+
+void BKE_editstrands_hair_get_texture_buffer(BMEditStrands *es, void 
*texbuffer)
+{
+       EditStrandsView strands = editstrands_get_view(es);
+       BKE_hair_get_texture_buffer(&strands.base, es->root_dm, 
es->hair_fibers, es->hair_totfibers, texbuffer);
 }
 
 /* === Constraints === */
diff --git a/source/blender/blenkernel/intern/hair.c 
b/source/blender/blenkernel/intern/hair.c
index 838956ea843..59677a25bc1 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -374,60 +374,60 @@ static void hair_get_fiber_buffer(const HairFiber 
*fibers, int totfibers, Derive
        }
 }
 
+void BKE_hair_get_texture_buffer_size(const StrandsView *strands, int 
totfibers,
+                                      int *r_size, int *r_strand_map_start,
+                                      int *r_strand_vertex_start, int 
*r_fiber_start)
+{
+       const int totstrands = strands->get_num_strands(strands);
+       const int totverts = strands->get_num_verts(strands);
+       *r_strand_map_start = 0;
+       *r_strand_vertex_start = *r_strand_map_start + totstrands * 
sizeof(HairStrandMapTextureBuffer);
+       *r_fiber_start = *r_strand_vertex_start + totverts * 
sizeof(HairStrandVertexTextureBuffer);
+       *r_size = *r_fiber_start + totfibers * sizeof(HairFiberTextureBuffer);
+}
+
 void BKE_hair_get_texture_buffer(const StrandsView *strands, DerivedMesh 
*scalp,
                                  const HairFiber *fibers, int totfibers,
-                                 void **r_texbuffer, int *r_size, int 
*r_strand_map_start,
-                                 int *r_strand_vertex_start, int 
*r_fiber_start)
+                                 void *buffer)
 {
        const int totstrands = strands->get_num_strands(strands);
        const int totverts = strands->get_num_verts(strands);
        const int strand_map_start = 0;
        const int strand_vertex_start = strand_map_start + totstrands * 
sizeof(HairStrandMapTextureBuffer);
        const int fiber_start = strand_vertex_start + totverts * 
sizeof(HairStrandVertexTextureBuffer);
-       const int size = fiber_start + totfibers * 
sizeof(HairFiberTextureBuffer);
        
-       void *buffer = MEM_mallocN(size, "hair texture buffer");
+       int *lengths = MEM_mallocN(sizeof(int) * totstrands, "strand lengths");
+       MeshSample *roots = MEM_mallocN(sizeof(MeshSample) * totstrands, 
"strand roots");
+       float (*positions)[3] = MEM_mallocN(sizeof(float[3]) * totverts, 
"strand vertex positions");
        
-       {
-               int *lengths = MEM_mallocN(sizeof(int) * totstrands, "strand 
lengths");
-               MeshSample *roots = MEM_mallocN(sizeof(MeshSample) * 
totstrands, "strand roots");
-               float (*positions)[3] = MEM_mallocN(sizeof(float[3]) * 
totverts, "strand vertex positions");
-               
-               strands->get_strand_lengths(strands, lengths);
-               strands->get_strand_roots(strands, roots);
-               strands->get_strand_vertices(strands, positions);
+       strands->get_strand_lengths(strands, lengths);
+       strands->get_strand_roots(strands, roots);
+       strands->get_strand_vertices(strands, positions);
+       
+       HairStrandMapTextureBuffer *smap = 
(HairStrandMapTextureBuffer*)((char*)buffer + strand_map_start);
+       HairStrandVertexTextureBuffer *svert = 
(HairStrandVertexTextureBuffer*)((char*)buffer + strand_vertex_start);
+       unsigned int vertex_start = 0;
+       for (int i = 0; i < totstrands; ++i) {
+               const unsigned int len = lengths[i];
+               smap->vertex_start = vertex_start;
+               smap->vertex_count = len;
                
-               HairStrandMapTextureBuffer *smap = 
(HairStrandMapTextureBuffer*)((char*)buffer + strand_map_start);
-               HairStrandVertexTextureBuffer *svert = 
(HairStrandVertexTextureBuffer*)((char*)buffer + strand_vertex_start);
-               unsigned int vertex_start = 0;
-               for (int i = 0; i < totstrands; ++i) {
-                       const unsigned int len = lengths[i];
-                       smap->vertex_start = vertex_start;
-                       smap->vertex_count = len;
-                       
-                       {
-                               float pos[3];
-                               float matrix[3][3];
-                               BKE_mesh_sample_eval(scalp, &roots[i], pos, 
matrix[2], matrix[0]);
-                               cross_v3_v3v3(matrix[1], matrix[2], matrix[0]);
-                               hair_strand_calc_verts(positions + 
vertex_start, len, matrix, svert);
-                       }
-                       
-                       vertex_start += len;
-                       ++smap;
-                       svert += len;
+               {
+                       float pos[3];
+                       float matrix[3][3];
+                       BKE_mesh_sample_eval(scalp, &roots[i], pos, matrix[2], 
matrix[0]);
+                       cross_v3_v3v3(matrix[1], matrix[2], matrix[0]);
+                       hair_strand_calc_verts(positions + vertex_start, len, 
matrix, svert);
                }
                
-               MEM_freeN(lengths);
-               MEM_freeN(roots);
-               MEM_freeN(positions);
+               vertex_start += len;
+               ++smap;
+               svert += len;
        }
        
-       hair_get_fiber_buffer(fibers, totfibers, scalp, 
(HairFiberTextureBuffer*)((char*)buffer + fiber_start));
+       MEM_freeN(lengths);
+       MEM_freeN(roots);
+       MEM_freeN(positions);
        
-       *r_strand_map_start = strand_map_start;
-       *r_strand_vertex_start = strand_vertex_start;
-       *r_fiber_start = fiber_start;
-       *r_texbuffer = buffer;
-       *r_size = size;
+       hair_get_fiber_buffer(fibers, totfibers, scalp, 
(HairFiberTextureBuffer*)((char*)buffer + fiber_start));
 }
diff --git a/source/blender/draw/CMakeLists.txt 
b/source/blender/draw/CMakeLists.txt
index b4527361615..1fada0e6f93 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -62,6 +62,7 @@ set(SRC
        intern/draw_cache_impl_particles.c
        intern/draw_cache_impl_strands.c
        intern/draw_common.c
+       intern/draw_hair.c
        intern/draw_manager.c
        intern/draw_manager_text.c
        intern/draw_view.c
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c 
b/source/blender/draw/engines/eevee/eevee_materials.c
index 1c937cac92e..a50b5b62e62 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -196,7 +196,7 @@ static char *eevee_get_defines(int options)
                BLI_dynstr_appendf(ds, "#define HAIR_SHADER\n");
        }
        if ((options & VAR_MAT_HAIR_FIBERS) != 0) {
-               BLI_dynstr_appendf(ds, "#define HAIR_SHADER_FIBERS\n");
+               BLI_dynstr_append(ds, DRW_hair_shader_defines());
        }
        if ((options & VAR_MAT_PROBE) != 0) {
                BLI_dynstr_appendf(ds, "#define PROBE_CAPTURE\n");
@@ -381,12 +381,15 @@ void EEVEE_materials_init(EEVEE_StorageList *stl)
                        "#define CLIP_PLANES\n");
 
                e_data.default_prepass_hair_fiber_sh = DRW_shader_create(
-                       hair_fiber_vert_str, NULL, datatoc_prepass_frag_glsl,
-                       "#define HAIR_SHADER\n#define HAIR_SHADER_FIBERS\n");
+                       hair_fiber_vert_str, NULL, datatoc_prepass_frag_glsl, 
DRW_hair_shader_defines());
 
-               e_data.default_prepass_hair_fiber

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to