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 _deferredActions; public List ListSimBotellaContact; public simDescarte(Simulation simulation, List deferredActions, float diameter, Vector2 position) { _simulation = simulation; _deferredActions = deferredActions; _radius = diameter / 2f; ListSimBotellaContact = new List(); // ✅ 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); } /// /// ✅ NUEVO: Actualiza posición usando coordenadas WPF apropiadas /// 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 } } }