Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/cloth.c
| Context not available. | |||||
| clmd->sim_parms->timescale = 1.0f; /* speed factor, describes how fast cloth moves */ | clmd->sim_parms->timescale = 1.0f; /* speed factor, describes how fast cloth moves */ | ||||
| clmd->sim_parms->time_scale = 1.0f; /* multiplies cloth speed */ | clmd->sim_parms->time_scale = 1.0f; /* multiplies cloth speed */ | ||||
| clmd->sim_parms->reset = 0; | clmd->sim_parms->reset = 0; | ||||
| clmd->sim_parms->vel_damping = 1.0f; /* 1.0 = no damping, 0.0 = fully dampened */ | |||||
| clmd->coll_parms->self_friction = 5.0; | clmd->coll_parms->self_friction = 5.0; | ||||
| clmd->coll_parms->friction = 5.0; | clmd->coll_parms->friction = 5.0; | ||||
| Context not available. | |||||
| /* Support for dynamic vertex groups, changing from frame to frame */ | /* Support for dynamic vertex groups, changing from frame to frame */ | ||||
| cloth_apply_vgroup ( clmd, result ); | cloth_apply_vgroup ( clmd, result ); | ||||
| if ( clmd->sim_parms->flags & (CLOTH_SIMSETTINGS_FLAG_SEW | CLOTH_SIMSETTINGS_FLAG_DYNAMIC_BASEMESH) ) | if ((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_DYNAMIC_BASEMESH) || | ||||
| (clmd->sim_parms->vgroup_shrink > 0) || (clmd->sim_parms->shrink_min > 0.0f)) | |||||
| { | |||||
| cloth_update_spring_lengths ( clmd, result ); | cloth_update_spring_lengths ( clmd, result ); | ||||
| } | |||||
| cloth_update_springs( clmd ); | cloth_update_springs( clmd ); | ||||
| Context not available. | |||||
| int cloth_uses_vgroup(ClothModifierData *clmd) | int cloth_uses_vgroup(ClothModifierData *clmd) | ||||
| { | { | ||||
| return (((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SCALING ) || | return (((clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF) && (clmd->coll_parms->vgroup_selfcol > 0)) || | ||||
| (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL ) || | (clmd->sim_parms->vgroup_struct > 0) || | ||||
| (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SEW) || | (clmd->sim_parms->vgroup_bend > 0) || | ||||
| (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF)) && | (clmd->sim_parms->vgroup_shrink > 0) || | ||||
| ((clmd->sim_parms->vgroup_mass>0) || | (clmd->sim_parms->vgroup_mass > 0)); | ||||
| (clmd->sim_parms->vgroup_struct>0)|| | |||||
| (clmd->sim_parms->vgroup_bend>0) || | |||||
| (clmd->sim_parms->vgroup_shrink>0) || | |||||
| (clmd->coll_parms->vgroup_selfcol>0))); | |||||
| } | } | ||||
| /** | /** | ||||
| Context not available. | |||||
| for (i = 0; i < mvert_num; i++, verts++) { | for (i = 0; i < mvert_num; i++, verts++) { | ||||
| /* Reset Goal values to standard */ | /* Reset Goal values to standard */ | ||||
| if ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL ) | if (clmd->sim_parms->vgroup_mass > 0) | ||||
| verts->goal= clmd->sim_parms->defgoal; | verts->goal= clmd->sim_parms->defgoal; | ||||
| else | else | ||||
| verts->goal= 0.0f; | verts->goal= 0.0f; | ||||
| Context not available. | |||||
| dvert = CustomData_get(&mesh->vdata, i, CD_MDEFORMVERT); | dvert = CustomData_get(&mesh->vdata, i, CD_MDEFORMVERT); | ||||
| if ( dvert ) { | if ( dvert ) { | ||||
| for ( j = 0; j < dvert->totweight; j++ ) { | for ( j = 0; j < dvert->totweight; j++ ) { | ||||
| if (( dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_mass-1)) && (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL )) { | if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_mass - 1)) { | ||||
| verts->goal = dvert->dw [j].weight; | verts->goal = dvert->dw [j].weight; | ||||
| /* goalfac= 1.0f; */ /* UNUSED */ | /* goalfac= 1.0f; */ /* UNUSED */ | ||||
| Context not available. | |||||
| verts->flags |= CLOTH_VERT_FLAG_PINNED; | verts->flags |= CLOTH_VERT_FLAG_PINNED; | ||||
| } | } | ||||
| if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SCALING ) { | if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_struct - 1)) { | ||||
| if ( dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_struct-1)) { | verts->struct_stiff = dvert->dw[j].weight; | ||||
| verts->struct_stiff = dvert->dw [j].weight; | } | ||||
| } | |||||
| if ( dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_shear-1)) { | if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_shear - 1)) { | ||||
| verts->shear_stiff = dvert->dw [j].weight; | verts->shear_stiff = dvert->dw[j].weight; | ||||
| } | } | ||||
| if ( dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_bend-1)) { | if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_bend - 1)) { | ||||
| verts->bend_stiff = dvert->dw [j].weight; | verts->bend_stiff = dvert->dw[j].weight; | ||||
| } | |||||
| } | } | ||||
| if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF ) { | if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF ) { | ||||
| Context not available. | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SEW ) { | if (clmd->sim_parms->vgroup_shrink > 0) { | ||||
| if (clmd->sim_parms->vgroup_shrink > 0) { | if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_shrink - 1)) { | ||||
| if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_shrink - 1)) { | /* Used for linear interpolation between min and max shrink factor based on weight. */ | ||||
| /* used for linear interpolation between min and max shrink factor based on weight */ | verts->shrink_factor = dvert->dw[j].weight; | ||||
| verts->shrink_factor = dvert->dw[j].weight; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| Context not available. | |||||
| static float cloth_shrink_factor(ClothModifierData *clmd, ClothVertex *verts, int i1, int i2) | static float cloth_shrink_factor(ClothModifierData *clmd, ClothVertex *verts, int i1, int i2) | ||||
| { | { | ||||
| if ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SEW ) { | /* Linear interpolation between min and max shrink factor based on weight. */ | ||||
| /* linear interpolation between min and max shrink factor based on weight */ | float base = 1.0f - clmd->sim_parms->shrink_min; | ||||
| float base = 1.0f - clmd->sim_parms->shrink_min; | float delta = clmd->sim_parms->shrink_min - clmd->sim_parms->shrink_max; | ||||
| float delta = clmd->sim_parms->shrink_min - clmd->sim_parms->shrink_max; | |||||
| float k1 = base + delta * verts[i1].shrink_factor; | float k1 = base + delta * verts[i1].shrink_factor; | ||||
| float k2 = base + delta * verts[i2].shrink_factor; | float k2 = base + delta * verts[i2].shrink_factor; | ||||
| /* Use geometrical mean to average two factors since it behaves better | /* Use geometrical mean to average two factors since it behaves better | ||||
| for diagonals when a rectangle transforms into a trapezoid. */ | for diagonals when a rectangle transforms into a trapezoid. */ | ||||
| return sqrtf(k1 * k2); | return sqrtf(k1 * k2); | ||||
| } | |||||
| else | |||||
| return 1.0f; | |||||
| } | } | ||||
| static int cloth_from_object(Object *ob, ClothModifierData *clmd, Mesh *mesh, float UNUSED(framenr), int first) | static int cloth_from_object(Object *ob, ClothModifierData *clmd, Mesh *mesh, float UNUSED(framenr), int first) | ||||
| Context not available. | |||||
| verts->mass = clmd->sim_parms->mass; | verts->mass = clmd->sim_parms->mass; | ||||
| verts->impulse_count = 0; | verts->impulse_count = 0; | ||||
| if ( clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL ) | if (clmd->sim_parms->vgroup_mass > 0) | ||||
| verts->goal= clmd->sim_parms->defgoal; | verts->goal= clmd->sim_parms->defgoal; | ||||
| else | else | ||||
| verts->goal= 0.0f; | verts->goal= 0.0f; | ||||
| Context not available. | |||||