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
|
// Entity_CheckCollisions
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -166,6 +166,13 @@ void CollisionInfo_Add(CollisionInfo *collInfo,
|
|||||||
int responseType,Entity ent1,Entity ent2,float t,vec2 n,int applyFriction);
|
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
|
// Entity_CheckCollision
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -215,14 +215,21 @@ int GameLib_ProcLoop(){
|
|||||||
do{
|
do{
|
||||||
repeat=0;
|
repeat=0;
|
||||||
CollisionInfo collInfo=NULL;
|
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)
|
if(!(_entity[i]->flags&EntityFlag_Collision) || _entity[i]->mass<0.0f)
|
||||||
continue;
|
continue;
|
||||||
for(j=i;j<_n_entities;j++){
|
if(_entity[i]->vel[0]<=0.0f && _entity[i]->vel[0]>=-0.0f &&
|
||||||
if(!(_entity[j]->flags&EntityFlag_Collision))
|
_entity[i]->vel[1]<=0.0f && _entity[i]->vel[1]>=-0.0f)
|
||||||
continue;
|
{
|
||||||
if(!Entity_BBoxIntersect(_entity[i],_entity[j]))
|
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;
|
continue;
|
||||||
|
}
|
||||||
Entity_CheckCollision(_entity[i],_entity[j],&collInfo);
|
Entity_CheckCollision(_entity[i],_entity[j],&collInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user