diff options
Diffstat (limited to 'source/blender/blenkernel/intern/collision.c')
-rw-r--r-- | source/blender/blenkernel/intern/collision.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c index 20fc1708454..8c664bc1a57 100644 --- a/source/blender/blenkernel/intern/collision.c +++ b/source/blender/blenkernel/intern/collision.c @@ -1392,6 +1392,97 @@ Object **get_collisionobjects(Scene *scene, Object *self, int *numcollobj) return objs; } +ListBase *get_collider_cache(Scene *scene, Object *self) +{ + Base *base=NULL; + ListBase *objs = NULL; + Object *coll_ob = NULL; + CollisionModifierData *collmd = NULL; + ColliderCache *col; + + // check all collision objects + for ( base = scene->base.first; base; base = base->next ) + { + /*Only proceed for mesh object in same layer */ + if(base->object->type!=OB_MESH) + continue; + + if(self && (base->lay & self->lay)==0) + continue; + + + coll_ob = base->object; + + if(coll_ob == self) + continue; + + if(coll_ob->pd && coll_ob->pd->deflect) + { + collmd = ( CollisionModifierData * ) modifiers_findByType ( coll_ob, eModifierType_Collision ); + } + else + collmd = NULL; + + if ( collmd ) + { + if(objs == NULL) + objs = MEM_callocN(sizeof(ListBase), "ColliderCache array"); + + col = MEM_callocN(sizeof(ColliderCache), "ColliderCache"); + col->ob = coll_ob; + col->collmd = collmd; + /* make sure collider is properly set up */ + collision_move_object(collmd, 1.0, 0.0); + BLI_addtail(objs, col); + } + else if ( coll_ob->dup_group ) + { + GroupObject *go; + Group *group = coll_ob->dup_group; + + for ( go= group->gobject.first; go; go= go->next ) + { + coll_ob = go->ob; + collmd = NULL; + + if(coll_ob == self) + continue; + + if(coll_ob->pd && coll_ob->pd->deflect) + { + collmd = ( CollisionModifierData * ) modifiers_findByType ( coll_ob, eModifierType_Collision ); + } + else + collmd = NULL; + + if ( !collmd ) + continue; + + if( !collmd->bvhtree) + continue; + + if(objs == NULL) + objs = MEM_callocN(sizeof(ListBase), "ColliderCache array"); + + col = MEM_callocN(sizeof(ColliderCache), "ColliderCache"); + col->ob = coll_ob; + col->collmd = collmd; + /* make sure collider is properly set up */ + collision_move_object(collmd, 1.0, 0.0); + BLI_addtail(objs, col); + } + } + } + return objs; +} +void free_collider_cache(ListBase **colliders) +{ + if(*colliders) { + BLI_freelistN(*colliders); + MEM_freeN(*colliders); + *colliders = NULL; + } +} static void cloth_bvh_objcollisions_nearcheck ( ClothModifierData * clmd, CollisionModifierData *collmd, CollPair **collisions, CollPair **collisions_index, int numresult, BVHTreeOverlap *overlap) { int i; |