CtrEditor/Simulacion/simDescarte.cs

95 lines
3.2 KiB
C#

using BepuPhysics.Collidables;
using BepuPhysics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
namespace CtrEditor.Simulacion
{
public class simDescarte : simBase
{
private float _radius;
private List<Action> _deferredActions;
public List<simBotella> ListSimBotellaContact;
public simDescarte(Simulation simulation, List<Action> deferredActions, float diameter, Vector2 position)
{
_simulation = simulation;
_deferredActions = deferredActions;
_radius = diameter / 2f;
ListSimBotellaContact = new List<simBotella>();
// ✅ USAR COORDINATECONVERTER para conversión centralizada
var position3D = new Vector3(position.X, CoordinateConverter.WpfYToBepuY(position.Y), zPos_Descarte + _radius);
Create(position3D);
}
public float Radius
{
get { return _radius; }
set
{
_radius = Math.Max(value, 0.01f); // Mínimo 1cm
// Recrear el cuerpo con el nuevo radio
var currentPos = GetPosition();
Create(currentPos);
}
}
public void SetDiameter(float diameter)
{
Radius = diameter / 2f;
}
public float GetDiameter()
{
return _radius * 2f;
}
public void Create(Vector2 position)
{
// ✅ USAR COORDINATECONVERTER para conversión centralizada
var position3D = new Vector3(position.X, CoordinateConverter.WpfYToBepuY(position.Y), zPos_Descarte + _radius);
Create(position3D);
}
/// <summary>
/// ✅ NUEVO: Actualiza posición usando coordenadas WPF apropiadas
/// </summary>
internal void UpdateFromWpfCenter(Vector2 wpfCenter)
{
var position3D = new Vector3(wpfCenter.X, CoordinateConverter.WpfYToBepuY(wpfCenter.Y), zPos_Descarte + _radius);
// Actualizar solo posición manteniendo orientación
CoordinateConverter.UpdateBepuBodyPosition(_simulation, BodyHandle, position3D);
}
private void Create(Vector3 position)
{
RemoverBody();
// Crear esfera sensor para detección
var sphere = new BepuPhysics.Collidables.Sphere(_radius);
var shapeIndex = _simulation.Shapes.Add(sphere);
// Crear como SENSOR (Kinematic con speculative margin 0 para detección pura)
// Configurar actividad para NUNCA dormir - los sensores deben estar siempre activos
var activityDescription = new BodyActivityDescription(-1f); // -1 = nunca dormir
var bodyDescription = BodyDescription.CreateKinematic(
new RigidPose(position),
new CollidableDescription(shapeIndex, 0f), // Speculative margin 0 para sensores
activityDescription
);
BodyHandle = _simulation.Bodies.Add(bodyDescription);
_bodyCreated = true; // Marcar que hemos creado un cuerpo
}
}
}