95 lines
3.2 KiB
C#
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
|
|
}
|
|
}
|
|
|
|
}
|