Improve collision testing performance, checking only with at least one moving entity

This commit is contained in:
2014-06-25 23:25:42 +02:00
committed by Valeriano A.R
parent 3d57a6f452
commit 4fd5af74bc
3 changed files with 37 additions and 5 deletions

View File

@@ -357,6 +357,24 @@ void CollisionInfo_Add(CollisionInfo *collInfoRef,
}
/////////////////////////////
// CollisionInfo_CheckRepetition
//
//
int CollisionInfo_CheckRepetition(CollisionInfo collInfo,Entity ent1,Entity ent2)
{
while(collInfo!=NULL){
if((collInfo->ent1==ent1 && collInfo->ent2==ent2) ||
(collInfo->ent1==ent2 && collInfo->ent2==ent1))
{
return(1);
}
collInfo=collInfo->next;
}
return(0);
}
/////////////////////////////
// Entity_CheckCollisions
//

View File

@@ -166,6 +166,13 @@ void CollisionInfo_Add(CollisionInfo *collInfo,
int responseType,Entity ent1,Entity ent2,float t,vec2 n,int applyFriction);
/////////////////////////////
// CollisionInfo_CheckRepetition
//
//
int CollisionInfo_CheckRepetition(CollisionInfo collInfo,Entity ent1,Entity ent2);
/////////////////////////////
// Entity_CheckCollision
//

View File

@@ -215,14 +215,21 @@ int GameLib_ProcLoop(){
do{
repeat=0;
CollisionInfo collInfo=NULL;
for(i=0;i<(_n_entities-1);i++){
for(i=0;i<_n_entities;i++){
if(!(_entity[i]->flags&EntityFlag_Collision) || _entity[i]->mass<0.0f)
continue;
for(j=i;j<_n_entities;j++){
if(!(_entity[j]->flags&EntityFlag_Collision))
continue;
if(!Entity_BBoxIntersect(_entity[i],_entity[j]))
if(_entity[i]->vel[0]<=0.0f && _entity[i]->vel[0]>=-0.0f &&
_entity[i]->vel[1]<=0.0f && _entity[i]->vel[1]>=-0.0f)
{
continue;
}
for(j=0;j<_n_entities;j++){
if(!(_entity[j]->flags&EntityFlag_Collision) ||
!Entity_BBoxIntersect(_entity[i],_entity[j]) ||
CollisionInfo_CheckRepetition(collInfo,_entity[i],_entity[j]))
{
continue;
}
Entity_CheckCollision(_entity[i],_entity[j],&collInfo);
}
}