Improve collision testing performance, checking only with at least one moving entity
This commit is contained in:
@@ -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
|
||||
//
|
||||
|
||||
@@ -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
|
||||
//
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user