Commit: 938cd6c7fb37f3b1dec56ae9f0fb31c26f21b116
Author: Lukas Tönne
Date:   Tue Mar 4 15:39:48 2014 +0100
Branches: hair_system
https://developer.blender.org/rB938cd6c7fb37f3b1dec56ae9f0fb31c26f21b116

Changed mesh sample definition to use 3 vertex weights instead of a
face index. This is easier to sample uniformly and avoids the need for
tesselation for evaluating.

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

M       source/blender/blenkernel/intern/mesh_sample.c
M       source/blender/makesdna/DNA_meshdata_types.h
M       source/blender/makesrna/intern/rna_mesh_sample.c

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

diff --git a/source/blender/blenkernel/intern/mesh_sample.c 
b/source/blender/blenkernel/intern/mesh_sample.c
index 51de927..c105ffa 100644
--- a/source/blender/blenkernel/intern/mesh_sample.c
+++ b/source/blender/blenkernel/intern/mesh_sample.c
@@ -44,21 +44,21 @@
 bool BKE_mesh_sample_eval(DerivedMesh *dm, const MSurfaceSample *sample, float 
loc[3], float nor[3])
 {
        MVert *mverts = dm->getVertArray(dm);
-       MVert *v1, *v2, *v3, *v4;
-       MFace *mfaces = dm->getTessFaceArray(dm);
-       int totfaces = dm->getNumTessFaces(dm);
-       MFace *mface = &mfaces[sample->orig_face];
+       int totverts = dm->getNumVerts(dm);
+       MVert *v1, *v2, *v3;
        float vnor[3];
        
        zero_v3(loc);
        zero_v3(nor);
        
-       if (sample->orig_face >= totfaces)
+       if (sample->orig_verts[0] >= totverts ||
+           sample->orig_verts[1] >= totverts ||
+           sample->orig_verts[2] >= totverts)
                return false;
        
-       v1 = &mverts[mface->v1];
-       v2 = &mverts[mface->v2];
-       v3 = &mverts[mface->v3];
+       v1 = &mverts[sample->orig_verts[0]];
+       v2 = &mverts[sample->orig_verts[1]];
+       v3 = &mverts[sample->orig_verts[2]];
        
        madd_v3_v3fl(loc, v1->co, sample->orig_weights[0]);
        madd_v3_v3fl(loc, v2->co, sample->orig_weights[1]);
@@ -71,15 +71,6 @@ bool BKE_mesh_sample_eval(DerivedMesh *dm, const 
MSurfaceSample *sample, float l
        normal_short_to_float_v3(vnor, v3->no);
        madd_v3_v3fl(nor, vnor, sample->orig_weights[2]);
        
-       if (mface->v4) {
-               v4 = &mverts[mface->v4];
-               
-               madd_v3_v3fl(loc, v4->co, sample->orig_weights[3]);
-               
-               normal_short_to_float_v3(vnor, v4->no);
-               madd_v3_v3fl(nor, vnor, sample->orig_weights[3]);
-       }
-       
        normalize_v3(nor);
        
        return true;
@@ -138,25 +129,30 @@ static void mesh_sample_surface_random(const 
MSurfaceSampleInfo *info, MSurfaceS
        MFace *mfaces = info->dm->getTessFaceArray(info->dm);
        int totfaces = info->dm->getNumTessFaces(info->dm);
        MFace *mface;
-       float sum, inv_sum;
+       float a, b;
        
-       sample->orig_face = BLI_rng_get_int(info->rng) % totfaces;
+       mface = &mfaces[BLI_rng_get_int(info->rng) % totfaces];
        
-       mface = &mfaces[sample->orig_face];
-       sample->orig_weights[0] = BLI_rng_get_float(info->rng);
-       sample->orig_weights[1] = BLI_rng_get_float(info->rng);
-       sample->orig_weights[2] = BLI_rng_get_float(info->rng);
-       sample->orig_weights[3] = mface->v4 ? BLI_rng_get_float(info->rng) : 
0.0f;
+       if (mface->v4 && BLI_rng_get_int(info->rng) % 2 == 0) {
+               sample->orig_verts[0] = mface->v3;
+               sample->orig_verts[1] = mface->v4;
+               sample->orig_verts[2] = mface->v1;
+       }
+       else {
+               sample->orig_verts[0] = mface->v1;
+               sample->orig_verts[1] = mface->v2;
+               sample->orig_verts[2] = mface->v3;
+       }
        
-       sum = sample->orig_weights[0] +
-             sample->orig_weights[1] +
-             sample->orig_weights[2] +
-             sample->orig_weights[3];
-       inv_sum = sum > 0.0f ? 1.0f/sum : 0.0f;
-       sample->orig_weights[0] *= inv_sum;
-       sample->orig_weights[1] *= inv_sum;
-       sample->orig_weights[2] *= inv_sum;
-       sample->orig_weights[3] *= inv_sum;
+       a = BLI_rng_get_float(info->rng);
+       b = BLI_rng_get_float(info->rng);
+       if (a + b > 1.0f) {
+               a = 1.0f - a;
+               b = 1.0f - b;
+       }
+       sample->orig_weights[0] = 1.0f - (a + b);
+       sample->orig_weights[1] = a;
+       sample->orig_weights[2] = b;
 }
 
 void BKE_mesh_sample_surface_array(const MSurfaceSampleInfo *info, 
MSurfaceSample *samples, int totsample)
diff --git a/source/blender/makesdna/DNA_meshdata_types.h 
b/source/blender/makesdna/DNA_meshdata_types.h
index 97afcb0..03be48b 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -301,9 +301,10 @@ enum {
 };
 
 typedef struct MSurfaceSample {
-       int orig_face;
-       int pad;
-       float orig_weights[4];
+       unsigned int orig_verts[3];
+       float orig_weights[3];
+       int orig_poly;
+       unsigned int orig_loops[3];
 } MSurfaceSample;
 
 /* mvert->flag */
diff --git a/source/blender/makesrna/intern/rna_mesh_sample.c 
b/source/blender/makesrna/intern/rna_mesh_sample.c
index e5793a5..81a3f4b 100644
--- a/source/blender/makesrna/intern/rna_mesh_sample.c
+++ b/source/blender/makesrna/intern/rna_mesh_sample.c
@@ -59,10 +59,10 @@ static void rna_def_mesh_sample(BlenderRNA *brna)
        RNA_def_struct_sdna(srna, "MSurfaceSample");
        RNA_def_struct_ui_text(srna, "Mesh Sample", "Point on a mesh that 
follows deformation");
 
-       prop = RNA_def_property(srna, "face_index", PROP_INT, PROP_UNSIGNED);
-       RNA_def_property_int_sdna(prop, NULL, "orig_face");
+       prop = RNA_def_property(srna, "vertex_indices", PROP_INT, 
PROP_UNSIGNED);
+       RNA_def_property_int_sdna(prop, NULL, "orig_verts");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-       RNA_def_property_ui_text(prop, "Face Index", "Index of the mesh face");
+       RNA_def_property_ui_text(prop, "Vertex Indices", "Index of the mesh 
vertices used for interpolation");
 }
 
 void RNA_def_mesh_sample(BlenderRNA *brna)

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

Reply via email to