[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13961] trunk/blender/source/blender/ blenkernel/intern/collision.c: Cloth bugfix for linked deflector groups ( reported by alchibal on #blendercoders incl.
Daniel Genrich
daniel.genrich at gmx.net
Mon Mar 3 20:02:01 CET 2008
Revision: 13961
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13961
Author: genscher
Date: 2008-03-03 20:02:01 +0100 (Mon, 03 Mar 2008)
Log Message:
-----------
Cloth bugfix for linked deflector groups (reported by alchibal on #blendercoders incl. source) - please verify
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/collision.c
Modified: trunk/blender/source/blender/blenkernel/intern/collision.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/collision.c 2008-03-03 18:53:06 UTC (rev 13960)
+++ trunk/blender/source/blender/blenkernel/intern/collision.c 2008-03-03 19:02:01 UTC (rev 13961)
@@ -36,6 +36,7 @@
#include "MEM_guardedalloc.h"
/* types */
#include "DNA_curve_types.h"
+#include "DNA_group_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
#include "DNA_cloth_types.h"
@@ -957,20 +958,85 @@
cloth_collision_moving_tris(coll_clmd, clmd, tree2, tree1);
}
-void cloth_collision_self_static(ModifierData *md1, ModifierData *md2, CollisionTree *tree1, CollisionTree *tree2)
+void cloth_free_collision_list(ClothModifierData *clmd)
{
-/*
- ClothModifierData *clmd = (ClothModifierData *)md1;
- CollisionModifierData *collmd = (CollisionModifierData *)md2;
- CollPair *collpair = NULL;
- Cloth *cloth1=NULL;
- MFace *face1=NULL, *face2=NULL;
- ClothVertex *verts1=NULL;
- double distance = 0;
- float epsilon = clmd->coll_parms->epsilon;
- unsigned int i = 0;
-*/
+ // free collision list
+ if(clmd->coll_parms->collision_list)
+ {
+ LinkNode *search = clmd->coll_parms->collision_list;
+ while(search)
+ {
+ CollPair *coll_pair = search->link;
+
+ MEM_freeN(coll_pair);
+ search = search->next;
+ }
+ BLI_linklist_free(clmd->coll_parms->collision_list,NULL);
+
+ clmd->coll_parms->collision_list = NULL;
+ }
+}
+
+int cloth_bvh_objcollisions_do(ClothModifierData * clmd, CollisionModifierData *collmd, float step, float dt)
+{
+ Cloth *cloth = clmd->clothObject;
+ BVH *cloth_bvh=(BVH *) cloth->tree;
+ long i=0, j = 0, numfaces = 0, numverts = 0;
+ ClothVertex *verts = NULL;
+ int ret = 0;
+ unsigned int result = 0;
+ float tnull[3] = {0,0,0};
+ numfaces = clmd->clothObject->numfaces;
+ numverts = clmd->clothObject->numverts;
+
+ verts = cloth->verts;
+
+ if (collmd->tree)
+ {
+ BVH *coll_bvh = collmd->tree;
+
+ collision_move_object(collmd, step + dt, step);
+
+ bvh_traverse((ModifierData *)clmd, (ModifierData *)collmd, cloth_bvh->root, coll_bvh->root, step, cloth_collision_static, 0);
+ }
+ else
+ {
+ if(G.rt > 0)
+ printf ("cloth_bvh_objcollision: found a collision object with clothObject or collData NULL.\n");
+ }
+
+ // process all collisions (calculate impulses, TODO: also repulses if distance too short)
+ result = 1;
+ for(j = 0; j < 5; j++) // 5 is just a value that ensures convergence
+ {
+ result = 0;
+
+ if (collmd->tree)
+ result += cloth_collision_response_static(clmd, collmd);
+
+ // apply impulses in parallel
+ if(result)
+ for(i = 0; i < numverts; i++)
+ {
+ // calculate "velocities" (just xnew = xold + v; no dt in v)
+ if(verts[i].impulse_count)
+ {
+ VECADDMUL(verts[i].tv, verts[i].impulse, 1.0f / verts[i].impulse_count);
+ VECCOPY(verts[i].impulse, tnull);
+ verts[i].impulse_count = 0;
+
+ ret++;
+ }
+ }
+
+ if(!result)
+ break;
+ }
+
+ cloth_free_collision_list(clmd);
+
+ return ret;
}
// cloth - object collisions
@@ -982,9 +1048,8 @@
Object *coll_ob=NULL;
BVH *cloth_bvh=NULL;
long i=0, j = 0, numfaces = 0, numverts = 0;
- unsigned int result = 0, ic = 0, rounds = 0; // result counts applied collisions; ic is for debug output;
+ unsigned int result = 0, rounds = 0; // result counts applied collisions; ic is for debug output;
ClothVertex *verts = NULL;
- float tnull[3] = {0,0,0};
int ret = 0;
ClothModifierData *tclmd;
int collisions = 0, count = 0;
@@ -1010,7 +1075,6 @@
do
{
result = 0;
- ic = 0;
clmd->coll_parms->collision_list = NULL;
// check all collision objects
@@ -1020,67 +1084,36 @@
collmd = (CollisionModifierData *) modifiers_findByType (coll_ob, eModifierType_Collision);
if (!collmd)
- continue;
-
- tclmd = (ClothModifierData *) modifiers_findByType (coll_ob, eModifierType_Cloth);
- if(tclmd == clmd)
- continue;
-
- if (collmd->tree)
{
- BVH *coll_bvh = collmd->tree;
-
- collision_move_object(collmd, step + dt, step);
-
- bvh_traverse((ModifierData *)clmd, (ModifierData *)collmd, cloth_bvh->root, coll_bvh->root, step, cloth_collision_static, 0);
- }
- else
- {
- if(G.rt > 0)
- printf ("cloth_bvh_objcollision: found a collision object with clothObject or collData NULL.\n");
- }
-
-
- // process all collisions (calculate impulses, TODO: also repulses if distance too short)
- result = 1;
- for(j = 0; j < 5; j++) // 5 is just a value that ensures convergence
- {
- result = 0;
-
- if (collmd->tree)
- result += cloth_collision_response_static(clmd, collmd);
-
- // apply impulses in parallel
- ic=0;
- for(i = 0; i < numverts; i++)
+ if(coll_ob->dup_group)
{
- // calculate "velocities" (just xnew = xold + v; no dt in v)
- if(verts[i].impulse_count)
+ GroupObject *go;
+ Group *group = coll_ob->dup_group;
+
+ for(go= group->gobject.first; go; go= go->next)
{
- VECADDMUL(verts[i].tv, verts[i].impulse, 1.0f / verts[i].impulse_count);
- VECCOPY(verts[i].impulse, tnull);
- verts[i].impulse_count = 0;
-
- ic++;
- ret++;
+ coll_ob = go->ob;
+
+ collmd = (CollisionModifierData *) modifiers_findByType (coll_ob, eModifierType_Collision);
+
+ if (!collmd)
+ continue;
+
+ tclmd = (ClothModifierData *) modifiers_findByType (coll_ob, eModifierType_Cloth);
+ if(tclmd == clmd)
+ continue;
+
+ ret += cloth_bvh_objcollisions_do(clmd, collmd, step, dt);
}
}
}
-
- // free collision list
- if(clmd->coll_parms->collision_list)
+ else
{
- LinkNode *search = clmd->coll_parms->collision_list;
- while(search)
- {
- CollPair *coll_pair = search->link;
-
- MEM_freeN(coll_pair);
- search = search->next;
- }
- BLI_linklist_free(clmd->coll_parms->collision_list,NULL);
-
- clmd->coll_parms->collision_list = NULL;
+ tclmd = (ClothModifierData *) modifiers_findByType (coll_ob, eModifierType_Cloth);
+ if(tclmd == clmd)
+ continue;
+
+ ret += cloth_bvh_objcollisions_do(clmd, collmd, step, dt);
}
}
rounds++;
@@ -1203,153 +1236,5 @@
}
while(result && (clmd->coll_parms->loop_count>rounds));
- ////////////////////////////////////////////////////////////
- // moving collisions
- //
- // response code is just missing itm
- ////////////////////////////////////////////////////////////
-
- /*
- // update cloth bvh
- bvh_update_from_cloth(clmd, 1); // 0 means STATIC, 1 means MOVING
-
- // update moving bvh for collision object once
- for (base = G.scene->base.first; base; base = base->next)
- {
-
- coll_ob = base->object;
- coll_clmd = (ClothModifierData *) modifiers_findByType (coll_ob, eModifierType_Cloth);
- if (!coll_clmd)
- continue;
-
- if(!coll_clmd->clothObject)
- continue;
-
- // if collision object go on
- if (coll_clmd->clothObject && coll_clmd->clothObject->tree)
- {
- BVH *coll_bvh = coll_clmd->clothObject->tree;
-
- bvh_update_from_cloth(coll_clmd, 1); // 0 means STATIC, 1 means MOVING
-}
-}
-
-
- do
- {
- result = 0;
- ic = 0;
- clmd->coll_parms->collision_list = NULL;
-
- // check all collision objects
- for (base = G.scene->base.first; base; base = base->next)
- {
- coll_ob = base->object;
- coll_clmd = (ClothModifierData *) modifiers_findByType (coll_ob, eModifierType_Cloth);
-
- if (!coll_clmd)
- continue;
-
- // if collision object go on
- if (coll_clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_COLLOBJ)
- {
- if (coll_clmd->clothObject && coll_clmd->clothObject->tree)
- {
- BVH *coll_bvh = coll_clmd->clothObject->tree;
-
- bvh_traverse(clmd, coll_clmd, cloth_bvh->root, coll_bvh->root, step, cloth_collision_moving, 0);
-}
- else
- printf ("cloth_bvh_objcollision: found a collision object with clothObject or collData NULL.\n");
-}
-}
-
- // process all collisions (calculate impulses, TODO: also repulses if distance too short)
- result = 1;
- for(j = 0; j < 10; j++) // 10 is just a value that ensures convergence
- {
- result = 0;
-
- // handle all collision objects
- for (base = G.scene->base.first; base; base = base->next)
- {
-
- coll_ob = base->object;
- coll_clmd = (ClothModifierData *) modifiers_findByType (coll_ob, eModifierType_Cloth);
-
- if (!coll_clmd)
- continue;
-
- // if collision object go on
- if (coll_clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_COLLOBJ)
- {
- if (coll_clmd->clothObject)
- result += cloth_collision_response_moving_tris(clmd, coll_clmd);
- else
- printf ("cloth_bvh_objcollision: found a collision object with clothObject or collData NULL.\n");
-}
-}
-
- // apply impulses in parallel
- ic=0;
- for(i = 0; i < numverts; i++)
- {
- // calculate "velocities" (just xnew = xold + v; no dt in v)
- if(verts[i].impulse_count)
- {
- VECADDMUL(verts[i].tv, verts[i].impulse, 1.0f / verts[i].impulse_count);
- VECCOPY(verts[i].impulse, tnull);
- verts[i].impulse_count = 0;
-
- ic++;
- ret++;
-}
-}
-}
-
-
- // verts come from clmd
- for(i = 0; i < numverts; i++)
- {
- VECADD(verts[i].tx, verts[i].txold, verts[i].tv);
-}
-
- // update cloth bvh
- bvh_update_from_cloth(clmd, 1); // 0 means STATIC, 1 means MOVING
-
-
- // free collision list
- if(clmd->coll_parms->collision_list)
- {
- LinkNode *search = clmd->coll_parms->collision_list;
- while(search)
- {
- CollPair *coll_pair = search->link;
-
- MEM_freeN(coll_pair);
- search = search->next;
-}
- BLI_linklist_free(clmd->coll_parms->collision_list,NULL);
-
- clmd->coll_parms->collision_list = NULL;
-}
-
- // printf("ic: %d\n", ic);
- rounds++;
-}
- while(result && (CLOTH_MAX_THRESHOLD>rounds));
-
- ////////////////////////////////////////////////////////////
- // update positions + velocities
- ////////////////////////////////////////////////////////////
-
- // verts come from clmd
- for(i = 0; i < numverts; i++)
- {
- VECADD(verts[i].tx, verts[i].txold, verts[i].tv);
-}
- ////////////////////////////////////////////////////////////
- */
-
return MIN2(ret, 1);
}
More information about the Bf-blender-cvs
mailing list