@@ -61,6 +61,7 @@ class CollisionEntitySystem : public EntitySystem {
6161 ColliderComponent sourceColliderComponent = componentManager->GetComponent <ColliderComponent>(sourceEntity);
6262 return std::find (sourceColliderComponent.collisionExceptions .begin (), sourceColliderComponent.collisionExceptions .end (), targetEntity) != sourceColliderComponent.collisionExceptions .end ();
6363 }
64+
6465 public:
6566 CollisionEntitySystem () {
6667 collisionContext = GD::GetContainer ()->collisionContext ;
@@ -82,31 +83,6 @@ class CollisionEntitySystem : public EntitySystem {
8283
8384 void OnEntityDestroyed (Entity entity) override {}
8485
85- // void ProcessCollisions() {
86- // collisionContext->ClearCollisionData();
87- // // TODO: Come up with a better more efficient solution
88- // for (Entity sourceEntity : entities) {
89- // std::vector<Entity> collidedEntities;
90- // for (Entity targetEntity : entities) {
91- // if (!IsTargetCollisionEntityInExceptionList(sourceEntity, targetEntity)) {
92- // Rect2 sourceCollisionRectangle = GetCollisionRectangle(sourceEntity);
93- // Rect2 targetCollisionRectangle = GetCollisionRectangle(targetEntity);
94- // if (CollisionResolver::DoesRectanglesCollide(sourceCollisionRectangle, targetCollisionRectangle)) {
95- // collidedEntities.emplace_back(targetEntity);
96- // // TODO: emit signal if Area2D like functionality for entering and exiting is required
97- // }
98- // }
99- // }
100- // if (collidedEntities.size() > 0) {
101- // collisionContext->RegisterCollisionResult(
102- // CollisionResult{
103- // .sourceEntity = sourceEntity,
104- // .collidedEntities = collidedEntities
105- // });
106- // }
107- // }
108- // }
109-
11086 void ProcessEntityCollisions (Entity sourceEntity, Vector2 offset = Vector2(0 .0f , 0 .0f )) {
11187 collisionContext->ClearCollisionData ();
11288 std::vector<Entity> collidedEntities;
@@ -129,6 +105,28 @@ class CollisionEntitySystem : public EntitySystem {
129105 }
130106 }
131107
108+ void ProcessEntityCollisionsByTag (Entity sourceEntity, const std::string& tag, Vector2 offset = Vector2(0 .0f , 0 .0f )) {
109+ collisionContext->ClearCollisionData ();
110+ std::vector<Entity> collidedEntities;
111+ for (Entity targetEntity : entityTagCache.GetTaggedEntities (tag)) {
112+ if (!IsTargetCollisionEntityInExceptionList (sourceEntity, targetEntity)) {
113+ Rect2 sourceCollisionRectangle = GetCollisionRectangle (sourceEntity) + offset;
114+ Rect2 targetCollisionRectangle = GetCollisionRectangle (targetEntity);
115+ if (CollisionResolver::DoesRectanglesCollide (sourceCollisionRectangle, targetCollisionRectangle)) {
116+ collidedEntities.emplace_back (targetEntity);
117+ // TODO: emit signal if Area2D like functionality for entering and exiting is required
118+ }
119+ }
120+ }
121+ if (collidedEntities.size () > 0 ) {
122+ collisionContext->RegisterCollisionResult (
123+ CollisionResult{
124+ .sourceEntity = sourceEntity,
125+ .collidedEntities = collidedEntities
126+ });
127+ }
128+ }
129+
132130 std::vector<Entity> GetEntitiesOnMouse (const Vector2 mousePosition) {
133131 std::vector<Entity> entitiesOnMouse;
134132 Rect2 mouseRectangle = Rect2 (mousePosition, Vector2 (1 .0f , 1 .0f ));
0 commit comments