Se añadieron nuevas propiedades y métodos en BEPU para gestionar la velocidad de las curvas en metros por segundo, incluyendo la capacidad de invertir y detener la curva. Se simplificó la lógica de configuración de velocidad y se corrigió el uso de la propiedad SpeedMetersPerSecond en la creación de motores dinámicos. Además, se eliminaron comentarios y código obsoleto, optimizando la estructura del archivo.

This commit is contained in:
Miguel 2025-07-03 23:50:20 +02:00
parent f431ede7bd
commit ab8066d1e8
1 changed files with 36 additions and 39 deletions

View File

@ -1402,7 +1402,9 @@ namespace CtrEditor.Simulacion
// ✅ EVENTO para actualización de motores
public event Action<simCurve> OnSpeedChanged;
// ✅ NUEVO: Propiedad para velocidad convertida (similar a simTransporte)
public float SpeedMetersPerSecond { get; private set; }
// ✅ NUEVO: Almacenar triángulos creados para acceso directo
private Triangle[] _storedTriangles;
@ -1433,15 +1435,45 @@ namespace CtrEditor.Simulacion
// ✅ SIMPLIFICADO: Crear la curva directamente
Create(innerRadius, outerRadius, startAngle, endAngle, topLeft, 0);
// ✅ NUEVO: Inicializar SpeedMetersPerSecond
SpeedMetersPerSecond = Speed / simBase.SPEED_CONVERSION_FACTOR;
}
// ✅ SIMPLIFICADO: Configurar velocidad angular para AngularAxisMotor
public void SetSpeed(float speed)
{
Speed = speed; // Velocidad angular directa (sin inversión)
SpeedMetersPerSecond = Speed / simBase.SPEED_CONVERSION_FACTOR; // ✅ NUEVO: Calcular velocidad convertida
OnSpeedChanged?.Invoke(this);
}
/// <summary>
/// ✅ NUEVO: Configura la velocidad de la curva en metros por segundo
/// Valores positivos mueven en sentido horario, negativos en sentido antihorario
/// </summary>
/// <param name="speedMeterPerSecond">Velocidad en m/s (típicamente entre -5.0 y 5.0)</param>
public void SetCurveSpeed(float speedMeterPerSecond)
{
SetSpeed(speedMeterPerSecond * simBase.SPEED_CONVERSION_FACTOR);
}
/// <summary>
/// ✅ NUEVO: Detiene completamente la curva
/// </summary>
public void StopCurve()
{
SetSpeed(0f);
}
/// <summary>
/// ✅ NUEVO: Invierte la dirección de la curva manteniendo la misma velocidad
/// </summary>
public void ReverseCurve()
{
SetSpeed(-Speed);
}
/// <summary>
/// ✅ NUEVO: Actualiza tanto posición como rotación desde parámetros WPF
/// </summary>
@ -1908,7 +1940,7 @@ namespace CtrEditor.Simulacion
// ✅ CREAR O ACTUALIZAR MOTOR DINÁMICO INMEDIATAMENTE
var direction = _simulationManager.CalculateCurveDirectionFromBottlePosition(curve, botella);
var speed = curve.Speed;
var speed = curve.SpeedMetersPerSecond; // ✅ CORREGIDO: Usar SpeedMetersPerSecond como simTransporte
botella.CreateOrUpdateMotor(curve, direction, speed);
// Fricción alta para curvas
@ -2074,7 +2106,6 @@ namespace CtrEditor.Simulacion
}
public class SimulationManagerBEPU
{
public Simulation simulation;
@ -2096,9 +2127,6 @@ namespace CtrEditor.Simulacion
private HashSet<BodyHandle> _barrierHandles;
private HashSet<BodyHandle> _discardHandles;
private HashSet<BodyHandle> _bottleHandles;
// ✅ NUEVO - contador de frames para optimizaciones
@ -2109,12 +2137,6 @@ namespace CtrEditor.Simulacion
private Dictionary<simDescarte, List<simBotella>> _descarteContacts;
private HashSet<simBotella> _botellasParaEliminar;
// ✅ NUEVO - sistema de eliminación diferida para evitar problemas de sincronización
private Queue<simBase> _pendingRemovals;
private object _removalLock = new object();
private object _contactsLock = new object();
/// <summary>
@ -2256,9 +2278,6 @@ namespace CtrEditor.Simulacion
_discardHandles = new HashSet<BodyHandle>();
_bottleHandles = new HashSet<BodyHandle>();
// ✅ NUEVO - inicializar sistema de eliminación diferida
_pendingRemovals = new Queue<simBase>();
// ✅ CONSERVAR - resto del constructor igual
bufferPool = new BufferPool();
@ -2311,12 +2330,6 @@ namespace CtrEditor.Simulacion
_barrierHandles.Clear();
_discardHandles.Clear();
_bottleHandles.Clear();
// ✅ NUEVO - limpiar eliminaciones pendientes
lock (_removalLock)
{
_pendingRemovals.Clear();
}
// ✅ CONSERVAR - resto del método igual
var cuerposToRemove = new List<simBase>(Cuerpos);
@ -2517,15 +2530,11 @@ namespace CtrEditor.Simulacion
{
// ✅ SIMPLIFICADO - eliminar lógica de masa especial
UnregisterObjectHandle(Objeto); // ✅ NUEVO
Objeto.RemoverBody(); // ✅ CONSERVAR - remover el cuerpo de BEPU
// ✅ NUEVO - Limpiar dimensiones almacenadas en osBase
CtrEditor.ObjetosSim.osBase.ClearStoredDimensions(Objeto);
// ✅ NUEVO - Agregar a cola de eliminación diferida
lock (_removalLock)
{
_pendingRemovals.Enqueue(Objeto);
}
// ✅ REMOVER de la lista inmediatamente para evitar referencias colgantes
Cuerpos.Remove(Objeto);
@ -2785,9 +2794,6 @@ namespace CtrEditor.Simulacion
}
public void Dispose()
{
Clear();
@ -2796,15 +2802,6 @@ namespace CtrEditor.Simulacion
}
/// <summary>
/// Registra un contacto entre una barrera y una botella para detección de paso
/// </summary>