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:
parent
f431ede7bd
commit
ab8066d1e8
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue