Commit: ef8c8a8b665b50ee41b7310d15383c7353ca1292
Author: Lukas Tönne
Date:   Sat Jul 2 14:16:46 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rBef8c8a8b665b50ee41b7310d15383c7353ca1292

Modified the guide strand creation operator to allow shorter-than-max strands.

The guide strand format may change, but it should allow varying numbers of 
control
points.

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

M       source/blender/blenkernel/intern/strands.c
M       source/blender/gpu/intern/gpu_buffers.c

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

diff --git a/source/blender/blenkernel/intern/strands.c 
b/source/blender/blenkernel/intern/strands.c
index 0489831..53ed820 100644
--- a/source/blender/blenkernel/intern/strands.c
+++ b/source/blender/blenkernel/intern/strands.c
@@ -35,6 +35,7 @@
 
 #include "BLI_kdtree.h"
 #include "BLI_math.h"
+#include "BLI_rand.h"
 
 #include "BKE_DerivedMesh.h"
 #include "BKE_mesh_sample.h"
@@ -153,29 +154,24 @@ void BKE_strands_test_init(struct Strands *strands, 
struct DerivedMesh *scalp,
                            int totcurves, int maxverts,
                            unsigned int seed)
 {
-       const unsigned int totverts = totcurves * maxverts;
+       unsigned int seed2 = seed ^ 0xdeadbeef;
+       RNG *rng = BLI_rng_new(seed2);
        
        MeshSampleGenerator *gen = BKE_mesh_sample_gen_surface_random(scalp, 
seed);
        unsigned int i, k;
        
+       /* First generate all curves, to define vertex counts */
        StrandCurve *curves = MEM_mallocN(sizeof(StrandCurve) * totcurves, 
"StrandCurve buffer");
-       StrandVertex *verts = MEM_mallocN(sizeof(StrandVertex) * totverts, 
"StrandVertex buffer");
-       
        StrandCurve *c = curves;
-       StrandVertex *v = verts;
-       unsigned int verts_begin = 0;
+       unsigned int totverts = 0;
        for (i = 0; i < totcurves; ++i, ++c) {
+               int num_verts = (int)(BLI_rng_get_float(rng) * (float)(maxverts 
+ 1));
+               CLAMP(num_verts, 2, maxverts);
+               
                if (BKE_mesh_sample_generate(gen, &c->root)) {
-                       c->verts_begin = verts_begin;
-                       c->num_verts = maxverts;
-                       
-                       for (k = 0; k < c->num_verts; ++k, ++v) {
-                               v->co[0] = 0.0f;
-                               v->co[1] = 0.0f;
-                               v->co[2] = (c->num_verts > 1) ? (float)k / 
(c->num_verts - 1) : 0.0f;
-                       }
-                       
-                       verts_begin += c->num_verts;
+                       c->verts_begin = totverts;
+                       c->num_verts = num_verts;
+                       totverts += num_verts;
                }
                else {
                        /* clear remaining samples */
@@ -184,6 +180,20 @@ void BKE_strands_test_init(struct Strands *strands, struct 
DerivedMesh *scalp,
                }
        }
        
+       /* Now generate vertices */
+       float segment_length = (maxverts > 1) ? 1.0f / (maxverts - 1) : 0.0f;
+       
+       StrandVertex *verts = MEM_mallocN(sizeof(StrandVertex) * totverts, 
"StrandVertex buffer");
+       c = curves;
+       StrandVertex *v = verts;
+       for (i = 0; i < totcurves; ++i, ++c) {
+               for (k = 0; k < c->num_verts; ++k, ++v) {
+                       v->co[0] = 0.0f;
+                       v->co[1] = 0.0f;
+                       v->co[2] = segment_length * k;
+               }
+       }
+       
        BKE_mesh_sample_free_generator(gen);
        
        if (strands->curves)
@@ -194,6 +204,8 @@ void BKE_strands_test_init(struct Strands *strands, struct 
DerivedMesh *scalp,
        strands->verts = verts;
        strands->totcurves = totcurves;
        strands->totverts = totverts;
+       
+       BLI_rng_free(rng);
 }
 
 static void strands_calc_weights(const Strands *strands, struct DerivedMesh 
*scalp, StrandRoot *roots, int num_roots)
diff --git a/source/blender/gpu/intern/gpu_buffers.c 
b/source/blender/gpu/intern/gpu_buffers.c
index abe59d2..3728119 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -2193,6 +2193,7 @@ static void strands_copy_edge_buffer(StrandData *strands, 
unsigned int (*varray)
        StrandCurveData *curve = strands->curves;
        for (c = 0; c < totcurves; ++c, ++curve) {
                int verts_begin = curve->verts_begin, num_verts = 
curve->num_verts, v;
+               BLI_assert(num_verts >= 2);
                
                StrandVertexData *vert = strands->verts + verts_begin;
                for (v = 0; v < num_verts - 1; ++v, ++vert) {

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

Reply via email to