[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29219] branches/render25/source/blender: Render Branch: post-sim correction for hair bendiness, doesn't work
Brecht Van Lommel
brecht at blender.org
Fri Jun 4 17:41:54 CEST 2010
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)
More information about the Bf-blender-cvs
mailing list