Revision: 29219
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29219
Author:   blendix
Date:     2010-06-04 17:41:53 +0200 (Fri, 04 Jun 2010)

Log Message:
-----------
Render Branch: post-sim correction for hair bendiness, doesn't work
very well in my tests, but perhaps better than nothing.

Modified Paths:
--------------
    branches/render25/source/blender/blenkernel/intern/particle_system.c
    branches/render25/source/blender/makesdna/DNA_cloth_types.h
    branches/render25/source/blender/makesrna/intern/rna_cloth.c

Modified: branches/render25/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/particle_system.c        
2010-06-04 13:47:56 UTC (rev 29218)
+++ branches/render25/source/blender/blenkernel/intern/particle_system.c        
2010-06-04 15:41:53 UTC (rev 29219)
@@ -3092,6 +3092,101 @@
                psys_free_path_cache(psys, NULL);
 }
 
+/* Crappy hair sim bendiness correction */
+
+static void hair_key_tangent(ParticleData *pa, MVert *keys, int k, float T[3])
+{
+       /* tangent at hair key k */
+       MVert *key = keys + k;
+
+       if(k == -1) {
+               T[0]= 0.0f;
+               T[1]= 0.0f;
+               T[2]= 1.0f;
+       }
+       else if(k == 0)
+               sub_v3_v3v3(T, (key+1)->co, key->co);
+       /*else if(k < pa->totkey-1)
+               sub_v3_v3v3(T, (key+1)->co, (key-1)->co);*/
+       else
+               sub_v3_v3v3(T, key->co, (key-1)->co);
+       
+       normalize_v3(T);
+}
+
+static void hair_key_rotation(ParticleData *pa, MVert *keys, int k, float 
axis[3], float *angle)
+{
+       /* minimal rotation from hair key k-1 to k */
+       float T0[3], T1[3];
+
+       hair_key_tangent(pa, keys, k-1, T0);
+       hair_key_tangent(pa, keys, k, T1);
+       
+       cross_v3_v3v3(axis, T0, T1);
+       *angle = angle_normalized_v3v3(T0, T1);
+}
+
+static void hair_key_apply_rotation(ParticleData *pa, MVert *keys, int k, 
float axis[3], float angle)
+{
+       float M[3][3], co[3];
+       int j;
+
+       axis_angle_to_mat3(M, axis, angle);
+
+       for(j=k; j<pa->totkey; j++) {
+               sub_v3_v3v3(co, keys[j].co, keys[k-1].co);
+               mul_m3_v3(M, co);
+               add_v3_v3v3(keys[j].co, keys[k-1].co, co);
+       }
+}
+
+static void hair_correct_bendiness(ParticleData *pa, MVert *in, MVert *out, 
float fac, float falloff, int offset)
+{
+       float (*aa_in)[4], (*aa_out)[4];
+       int k;
+
+       aa_in = MEM_callocN(sizeof(float)*4*pa->totkey, "hair restore frames");
+       aa_out = MEM_callocN(sizeof(float)*4*pa->totkey, "hair restore frames");
+
+       for(k=offset; k<pa->totkey; k++) {
+               hair_key_rotation(pa, in, k, aa_in[k], &aa_in[k][3]);
+               hair_key_rotation(pa, out, k, aa_out[k], &aa_out[k][3]);
+       }
+
+       for(k=pa->totkey-1; k>=offset; k--) {
+               float w = CLAMPIS(1.0f - pow(pa->hair[k].weight, falloff), 
0.0f, 1.0f);
+               hair_key_apply_rotation(pa, out, k, aa_in[k], 
aa_in[k][3]*fac*w);
+       }
+
+       for(k=offset; k<pa->totkey; k++)
+               hair_key_rotation(pa, out, k, aa_out[k], &aa_out[k][3]);
+
+       MEM_freeN(aa_in);
+       MEM_freeN(aa_out);
+}
+
+static void hair_dynamics_correct_bendiness(ParticleSystem *psys)
+{
+       ParticleData *pa;
+       MVert *in, *out;
+       float fac, falloff;
+       int a, offset;
+
+       fac = psys->clmd->sim_parms->fix_bending_factor;
+       falloff = psys->clmd->sim_parms->fix_bending_falloff;
+       offset = psys->clmd->sim_parms->fix_bending_offset;
+
+       if(fac == 0.0f)
+               return;
+
+       for(a=0, pa=psys->particles; a<psys->totpart; a++, pa++) {
+               in = CDDM_get_vert(psys->hair_in_dm, pa->hair_index);
+               out = CDDM_get_vert(psys->hair_out_dm, pa->hair_index);
+
+               hair_correct_bendiness(pa, in, out, fac, falloff, offset);
+       }
+}
+
 static void do_hair_dynamics(ParticleSimulationData *sim)
 {
        ParticleSystem *psys = sim->psys;
@@ -3223,6 +3318,8 @@
        sim_parms->hair_spring_offset = NULL;
 
        psys_free_path_cache(psys, NULL);
+
+       hair_dynamics_correct_bendiness(psys);
 }
 static void hair_step(ParticleSimulationData *sim, float cfra)
 {

Modified: branches/render25/source/blender/makesdna/DNA_cloth_types.h
===================================================================
--- branches/render25/source/blender/makesdna/DNA_cloth_types.h 2010-06-04 
13:47:56 UTC (rev 29218)
+++ branches/render25/source/blender/makesdna/DNA_cloth_types.h 2010-06-04 
15:41:53 UTC (rev 29219)
@@ -87,7 +87,10 @@
        /* passing some data from particles to cloth solver */
        int *hair_vert_offset;
        int *hair_spring_offset;
-       int tothair, pad2;
+       int tothair;
+       int fix_bending_offset;
+       float fix_bending_factor;
+       float fix_bending_falloff;
 } ClothSimSettings;
 
 /*clothsimsettings->hackmode*/

Modified: branches/render25/source/blender/makesrna/intern/rna_cloth.c
===================================================================
--- branches/render25/source/blender/makesrna/intern/rna_cloth.c        
2010-06-04 13:47:56 UTC (rev 29218)
+++ branches/render25/source/blender/makesrna/intern/rna_cloth.c        
2010-06-04 15:41:53 UTC (rev 29219)
@@ -404,6 +404,20 @@
        RNA_def_property_int_sdna(prop, NULL, "maxspringlen");
        RNA_def_property_range(prop, 1.0, 1000.0);
        RNA_def_property_ui_text(prop, "Maximum Spring Extension", "Maximum 
extension before spring gets cut"); */
+
+       prop= RNA_def_property(srna, "fix_bending_factor", PROP_FLOAT, 
PROP_FACTOR);
+       RNA_def_property_ui_range(prop, 0.0f, 1.0f, 10, 3);
+       RNA_def_property_ui_text(prop, "Fix Bending Factor", "");
+       RNA_def_property_update(prop, 0, "rna_cloth_update");
+
+       prop= RNA_def_property(srna, "fix_bending_falloff", PROP_FLOAT, 
PROP_FACTOR);
+       RNA_def_property_range(prop, 0.0f, 1.0f);
+       RNA_def_property_ui_text(prop, "Fix Bending Falloff", "");
+       RNA_def_property_update(prop, 0, "rna_cloth_update");
+
+       prop= RNA_def_property(srna, "fix_bending_offset", PROP_INT, 
PROP_UNSIGNED);
+       RNA_def_property_ui_text(prop, "Fix Bending Offset", "Number of keys to 
skip for applying correction.");
+       RNA_def_property_update(prop, 0, "rna_cloth_update");
 }
 
 static void rna_def_cloth_collision_settings(BlenderRNA *brna)


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

Reply via email to