[Bf-extensions-cvs] [e09160d] master: Randomized vertex group selection for samples, based on the relative weights.

Lukas Tönne noreply at git.blender.org
Wed Dec 10 10:52:24 CET 2014


Commit: e09160d70510118e7c30c6b6d0650cabd123b525
Author: Lukas Tönne
Date:   Wed Dec 10 10:51:39 2014 +0100
Branches: master
https://developer.blender.org/rBACe09160d70510118e7c30c6b6d0650cabd123b525

Randomized vertex group selection for samples, based on the relative
weights.

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

M	object_physics_meadow/blob.py

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

diff --git a/object_physics_meadow/blob.py b/object_physics_meadow/blob.py
index e4d7605..f979f82 100644
--- a/object_physics_meadow/blob.py
+++ b/object_physics_meadow/blob.py
@@ -216,20 +216,31 @@ def assign_sample_patches(groundob, blob):
         verts = [vertices[i] for i in face.vertices]
         assert(len(verts) in {3, 4})
         
+        # accumulate weights for each vertex group,
+        # by interpolating the face and 
         fweight, findex = interp_weights_face(tuple(v.co for v in verts[0:4]), loc)
-        
         weights = [ 0.0 for vg in vgroups ]
-        for v in verts:
+        for v, fac in zip(verts, fweight):
             for vg in v.groups:
-                weights[vg.group] += 0.25 * vg.weight # TODO
+                weights[vg.group] += vg.weight * fac
         
-        # XXX testing
-        if weights:
-            select, (vg, w) = max(enumerate(zip(vgroups, weights)), key=lambda x: x[1][1])
-            if w > 0.0:
-                vgroup_samples[vg.name].append((loc, nor))
-            else:
-                vgroup_samples[""].append((loc, nor))
+        def select_vgroup():
+            if not weights:
+                return None
+            totweight = sum(weights)
+            # using 1.0 as the minimum total weight means we select
+            # the default "non-group" in uncovered areas:
+            # there is a 1.0-totweight chance of selecting no vgroup at all
+            u = random.uniform(0.0, max(totweight, 1.0))
+            for vg, w in zip(vgroups, weights):
+                if u < w:
+                    return vg
+                u -= w
+            return None
+        
+        vg = select_vgroup()
+        if vg:
+            vgroup_samples[vg.name].append((loc, nor))
         else:
             vgroup_samples[""].append((loc, nor))



More information about the Bf-extensions-cvs mailing list