Commit: 1b6f5ecbf4aad9c6d4c58460b3e5596cd5f12399
Author: Lukas Tönne
Date:   Mon Dec 22 11:54:24 2014 +0100
Branches: master
https://developer.blender.org/rB1b6f5ecbf4aad9c6d4c58460b3e5596cd5f12399

Fix for invalid access to undefined hair data in edge-only cloth meshes.

Cloth data is used both for hair and actual cloth, which makes things
really difficult. The face number was used for distinguishing the two
types (no faces == hair mesh), but the extra hair data necessary for
hair sim is generated by particles and not available for edge-only cloth
meshes. This really needs to be sanitized ...

Conflicts:
        source/blender/physics/intern/BPH_mass_spring.cpp

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

M       source/blender/blenkernel/intern/cloth.c
M       source/blender/physics/intern/BPH_mass_spring.cpp

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

diff --git a/source/blender/blenkernel/intern/cloth.c 
b/source/blender/blenkernel/intern/cloth.c
index 98da1cf..14f9473 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -1054,13 +1054,16 @@ static void cloth_free_errorsprings(Cloth *cloth,  
LinkNode **edgelist)
        }
 }
 
-static void cloth_update_bending_targets(ClothModifierData *clmd)
+static void cloth_hair_update_bending_targets(ClothModifierData *clmd)
 {
        Cloth *cloth = clmd->clothObject;
        LinkNode *search = NULL;
        float hair_frame[3][3], dir_old[3], dir_new[3];
        int prev_mn; /* to find hair chains */
        
+       if (!clmd->hairdata)
+               return;
+       
        /* XXX Note: we need to propagate frames from the root up,
         * but structural hair springs are stored in reverse order.
         * The bending springs however are then inserted in the same
@@ -1126,13 +1129,16 @@ static void 
cloth_update_bending_targets(ClothModifierData *clmd)
        }
 }
 
-static void cloth_update_bending_rest_targets(ClothModifierData *clmd)
+static void cloth_hair_update_bending_rest_targets(ClothModifierData *clmd)
 {
        Cloth *cloth = clmd->clothObject;
        LinkNode *search = NULL;
        float hair_frame[3][3], dir_old[3], dir_new[3];
        int prev_mn; /* to find hair roots */
        
+       if (!clmd->hairdata)
+               return;
+       
        /* XXX Note: we need to propagate frames from the root up,
         * but structural hair springs are stored in reverse order.
         * The bending springs however are then inserted in the same
@@ -1225,7 +1231,7 @@ static void cloth_update_springs( ClothModifierData *clmd 
)
                search = search->next;
        }
        
-       cloth_update_bending_targets(clmd);
+       cloth_hair_update_bending_targets(clmd);
 }
 
 BLI_INLINE void cross_identity_v3(float r[3][3], const float v[3])
@@ -1504,7 +1510,7 @@ static int cloth_build_springs ( ClothModifierData *clmd, 
DerivedMesh *dm )
                        }
                }
                
-               cloth_update_bending_rest_targets(clmd);
+               cloth_hair_update_bending_rest_targets(clmd);
        }
        
        /* note: the edges may already exist so run reinsert */
diff --git a/source/blender/physics/intern/BPH_mass_spring.cpp 
b/source/blender/physics/intern/BPH_mass_spring.cpp
index 9e58a13..a77593d 100644
--- a/source/blender/physics/intern/BPH_mass_spring.cpp
+++ b/source/blender/physics/intern/BPH_mass_spring.cpp
@@ -51,6 +51,8 @@ extern "C" {
 #include "BPH_mass_spring.h"
 #include "implicit.h"
 
+static float I3[3][3] = {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}};
+
 /* Number of off-diagonal non-zero matrix blocks.
  * Basically there is one of these for each vertex-vertex interaction.
  */
@@ -118,10 +120,16 @@ void BKE_cloth_solver_set_positions(ClothModifierData 
*clmd)
        Implicit_Data *id = cloth->implicit;
        
        for (i = 0; i < numverts; i++) {
-               ClothHairData *root = &cloth_hairdata[i];
-               
                BPH_mass_spring_set_rest_transform(id, i, root->rot);
                BPH_mass_spring_set_motion_state(id, i, verts[i].x, verts[i].v);
+               if (cloth_hairdata) {
+                       ClothHairData *root = &cloth_hairdata[i];
+                       BPH_mass_spring_set_rest_transform(id, i, root->rot);
+               }
+               else
+                       BPH_mass_spring_set_rest_transform(id, i, I3);
+               
+               BPH_mass_spring_set_motion_state(id, i, verts[i].x, verts[i].v);
        }
 }
 
@@ -504,19 +512,29 @@ static void cloth_calc_force(ClothModifierData *clmd, 
float UNUSED(frame), ListB
                        for (LinkNode *link = cloth->springs; link; link = 
link->next) {
                                ClothSpring *spring = (ClothSpring *)link->link;
                                if (spring->type == 
CLOTH_SPRING_TYPE_STRUCTURAL)
-                                       hair_ij = &hairdata[spring->ij];
-                                       hair_kl = &hairdata[spring->kl];
-                                       BPH_mass_spring_force_edge_wind(data, 
spring->ij, spring->kl, hair_ij->radius, hair_kl->radius, winvec);
-                       }
+                                       if (hairdata) {
+                                               hair_ij = &hairdata[spring->ij];
+                                               hair_kl = &hairdata[spring->kl];
+                                               
BPH_mass_spring_force_edge_wind(data, spring->ij, spring->kl, hair_ij->radius, 
hair_kl->radius, winvec);
+                                       }
+                                       else
+                                               
BPH_mass_spring_force_edge_wind(data, spring->ij, spring->kl, 1.0f, 1.0f, 
winvec);
+                               }
                }
 #else
                        ClothHairData *hairdata = clmd->hairdata;
                        
                        vert = cloth->verts;
                        for (i = 0; i < cloth->numverts; i++, vert++) {
-                               ClothHairData *hair = &hairdata[i];
+                               if (vert->solver_index < 0)
+                                       continue;
                                
-                               BPH_mass_spring_force_vertex_wind(data, i, 
hair->radius, winvec);
+                               if (hairdata) {
+                                       ClothHairData *hair = &hairdata[i];
+                                       BPH_mass_spring_force_vertex_wind(data, 
i, hair->radius, winvec);
+                               }
+                               else
+                                       BPH_mass_spring_force_vertex_wind(data, 
i, 1.0f, winvec);
                        }
 #endif

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to