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