diff --git a/Simulacion/BEPU.cs b/Simulacion/BEPU.cs index 96b817a..f11fd1f 100644 --- a/Simulacion/BEPU.cs +++ b/Simulacion/BEPU.cs @@ -1402,7 +1402,9 @@ namespace CtrEditor.Simulacion // ✅ EVENTO para actualización de motores public event Action 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); } + /// + /// ✅ NUEVO: Configura la velocidad de la curva en metros por segundo + /// Valores positivos mueven en sentido horario, negativos en sentido antihorario + /// + /// Velocidad en m/s (típicamente entre -5.0 y 5.0) + public void SetCurveSpeed(float speedMeterPerSecond) + { + SetSpeed(speedMeterPerSecond * simBase.SPEED_CONVERSION_FACTOR); + } + + /// + /// ✅ NUEVO: Detiene completamente la curva + /// + public void StopCurve() + { + SetSpeed(0f); + } + + /// + /// ✅ NUEVO: Invierte la dirección de la curva manteniendo la misma velocidad + /// + public void ReverseCurve() + { + SetSpeed(-Speed); + } + /// /// ✅ NUEVO: Actualiza tanto posición como rotación desde parámetros WPF /// @@ -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 _barrierHandles; private HashSet _discardHandles; private HashSet _bottleHandles; - - - // ✅ NUEVO - contador de frames para optimizaciones @@ -2109,12 +2137,6 @@ namespace CtrEditor.Simulacion private Dictionary> _descarteContacts; private HashSet _botellasParaEliminar; - // ✅ NUEVO - sistema de eliminación diferida para evitar problemas de sincronización - private Queue _pendingRemovals; - private object _removalLock = new object(); - - - private object _contactsLock = new object(); /// @@ -2256,9 +2278,6 @@ namespace CtrEditor.Simulacion _discardHandles = new HashSet(); _bottleHandles = new HashSet(); - // ✅ NUEVO - inicializar sistema de eliminación diferida - _pendingRemovals = new Queue(); - // ✅ 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(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 } - - - - - - - - - /// /// Registra un contacto entre una barrera y una botella para detección de paso ///