public void Remove(CollisionInfo info) { if (infoList.Remove(info)) { // ヒット回数をリセット ResetCollisionCount(info.ID); // IDをストックに返す availableIDList.Add(info.ID); info.ID = 0; } }
public void Add(CollisionInfo info) { // 未登録ならID発行 if (info.ID == 0) { if (availableIDList.Count == 0) { // 新ID発行 info.ID = ++objectIDCount; } else { // IDストックから発行 info.ID = availableIDList[availableIDList.Count - 1]; availableIDList.RemoveAt(availableIDList.Count - 1); } infoList.Add(info); if (!collisionMatrix.ContainsKey(info.ID)) { collisionMatrix[info.ID] = new Dictionary<int, int>(); } } }
int UpdateCollisionMatrix(CollisionInfo a, CollisionInfo b) { if (!collisionMatrix[a.ID].ContainsKey(b.ID)) { collisionMatrix[a.ID][b.ID] = 0; } if (!collisionMatrix[b.ID].ContainsKey(a.ID)) { collisionMatrix[b.ID][a.ID] = 0; } var ab = ++collisionMatrix[a.ID][b.ID]; var ba = ++collisionMatrix[b.ID][a.ID]; if (ab < ba) { collisionMatrix[b.ID][a.ID] = ba = ab; } if (ba < ab) { collisionMatrix[a.ID][b.ID] = ab = ba; } return ab; }
bool Detect(CollisionInfo a, CollisionInfo b, CollisionResult result) { foreach (var primitiveA in a.Primitives) { foreach (var primitiveB in b.Primitives) { if (DetectorFactory.Create(primitiveA, primitiveB).Detect(result)) { return true; } } } return false; }