/// <summary> /// Obtiene los contactos para el momento actual /// </summary> private void GenerateContacts() { // Preparar datos de colisión m_ContactData.Reset(); m_ContactData.Friction = 0.9f; m_ContactData.Restitution = 0.2f; m_ContactData.Tolerance = 0.1f; // Generadores de contactos foreach (ContactGenerator contactGenerator in m_ContactGenerators) { contactGenerator.AddContact(ref m_ContactData, 0); } // Chequear colisiones de las cajas foreach (CollisionBox box in m_BoxData) { // Comprobar si se pueden almacenar más contactos if (m_ContactData.HasMoreContacts()) { // Colisión contra el suelo de cada caja //if (CollisionDetector.BoxAndHalfSpace(box, m_Plane, ref m_ContactData)) if (CollisionDetector.BoxAndTriangleSoup(box, m_TriangleSoup, ref m_ContactData)) { // Informar de la colisión entre la caja y el suelo box.PrimitiveContacted(null); } // Colisiones contra cada bala foreach (AmmoRound shot in m_AmmoData) { if (shot.ShotType != ShotType.UnUsed) { if (m_ContactData.HasMoreContacts()) { // Colisión de bala y suelo if (CollisionDetector.SphereAndTriangleSoup(shot, m_TriangleSoup, ref m_ContactData)) { if (shot.ShotType == ShotType.Artillery) { // Explosión m_ExplosionData.Add(Explosion.CreateArtilleryExplosion(shot.Position)); } // Informar de la colisión entre la bala y el suelo shot.PrimitiveContacted(null); } else { // Comprobar si se pueden almacenar más colisiones if (m_ContactData.HasMoreContacts()) { if (CollisionDetector.BoxAndSphere(box, shot, ref m_ContactData)) { if (shot.ShotType == ShotType.Artillery) { // Explosión m_ExplosionData.Add(Explosion.CreateArtilleryExplosion(shot.Position)); } // Informar de la colisión entre la caja y la bala box.PrimitiveContacted(shot); shot.PrimitiveContacted(box); } } } } } } } } // Chequear colisiones entre cajas for (int i = 0; i < m_BoxData.Count; i++) { for (int x = i + 1; x < m_BoxData.Count; x++) { if (CollisionDetector.BoxAndBox(m_BoxData[i], m_BoxData[x], ref m_ContactData)) { // Informar de la colisión entre cajas m_BoxData[i].PrimitiveContacted(m_BoxData[x]); m_BoxData[x].PrimitiveContacted(m_BoxData[i]); } } } }