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