/// <summary> /// Obtiene los contactos para el momento actual /// </summary> private void GenerateContacts() { // Preparar datos de colisión this.m_ContactData.Reset(); this.m_ContactData.Friction = 0.75f; this.m_ContactData.Restitution = 0.1f; this.m_ContactData.Tolerance = 0.1f; // Generadores de contactos foreach (ContactGenerator contactGenerator in this.m_ContactGenerators) { if (this.m_ContactData.HasFreeContacts()) { contactGenerator.AddContact(ref this.m_ContactData, 0); } else { return; } } // Colisiones de cada proyectil y cada vehículo contra el suelo if (this.m_SceneryPrimitive != null) { // Recorrer los proyectiles foreach (AmmoRound projectileObj in this.m_ProjectileData) { // Si hay contactos libres if (this.m_ContactData.HasFreeContacts()) { // Comprobar si el proyectil está activo if (projectileObj.IsActive) { // Obtener las primitivas del proyectil y del terreno CollisionPrimitive projectileObjPrimitive = projectileObj.Primitive; CollisionPrimitive sceneryPrimitive = this.m_SceneryPrimitive.GetContactedPrimitive(projectileObj); if (CollisionDetector.BetweenObjects(ref projectileObjPrimitive, ref sceneryPrimitive, ref m_ContactData)) { // Generar la explosión if (projectileObj.GenerateExplosion) { // Explosión Explosion explosion = Explosion.CreateArtilleryExplosion(projectileObjPrimitive.Position); this.m_ExplosionData.Add(explosion); this.FireExplosionStartsEvent(explosion); } // Informar de la colisión entre la bala y el suelo projectileObj.SetContactedWith(this.m_SceneryPrimitive); } } } else { // Fin de la detección return; } } // Recorrer los vehículos foreach (IPhysicObject vehicleObj in this.m_ObjectData) { // Si hay contactos libres if (this.m_ContactData.HasFreeContacts()) { // Comprobar si el vehículo está activo if (vehicleObj.IsActive) { // Obtener las primitivas del vehículo y del terreno CollisionPrimitive vehicleObjPrimitive = vehicleObj.Primitive; CollisionPrimitive sceneryPrimitive = this.m_SceneryPrimitive.GetContactedPrimitive(vehicleObj); if (CollisionDetector.BetweenObjects(ref vehicleObjPrimitive, ref sceneryPrimitive, ref this.m_ContactData)) { // Informar de la colisión entre el vehículo y el terreno vehicleObj.SetContactedWith(this.m_SceneryPrimitive); } } } else { // Fin de la detección return; } } } // Chequear colisiones de los vehículos y los proyectiles foreach (AmmoRound projectileObj in this.m_ProjectileData) { // Si hay contactos libres if (this.m_ContactData.HasFreeContacts()) { if (projectileObj.IsActive) { CollisionPrimitive projectileObjPrimitive = projectileObj.Primitive; // Recorrer los vehículos foreach (IPhysicObject vehicleObj in this.m_ObjectData) { // Si hay contactos libres if (this.m_ContactData.HasFreeContacts()) { CollisionPrimitive vehicleObjPrimitive = vehicleObj.GetContactedPrimitive(projectileObj); if (CollisionDetector.BetweenObjects(ref vehicleObjPrimitive, ref projectileObjPrimitive, ref m_ContactData)) { if (projectileObj.GenerateExplosion) { // Explosión Explosion explosion = Explosion.CreateArtilleryExplosion(projectileObjPrimitive.Position); this.m_ExplosionData.Add(explosion); this.FireExplosionStartsEvent(explosion); } // Informar de la colisión entre la caja y la bala vehicleObj.SetContactedWith(projectileObj); projectileObj.SetContactedWith(vehicleObj); } } else { // Fin de la detección return; } } } } else { // Fin de la detección return; } } // Chequear colisiones entre vehículos for (int i = 0; i < this.m_ObjectData.Count; i++) { if (this.m_ContactData.HasFreeContacts()) { // Obtener la primitiva de colisión CollisionPrimitive primitive1 = this.m_ObjectData[i].Primitive; for (int x = i + 1; x < this.m_ObjectData.Count; x++) { if (this.m_ContactData.HasFreeContacts()) { if (this.m_ObjectData[i].IsActive || this.m_ObjectData[x].IsActive) { // Obtener la segunda primitiva de colisión CollisionPrimitive primitive2 = this.m_ObjectData[x].GetContactedPrimitive(this.m_ObjectData[i]); if (CollisionDetector.BetweenObjects(ref primitive1, ref primitive2, ref this.m_ContactData)) { // Informar de la colisión entre cajas this.m_ObjectData[i].SetContactedWith(this.m_ObjectData[x]); this.m_ObjectData[x].SetContactedWith(this.m_ObjectData[i]); } } } else { return; } } } else { return; } } }