diff --git a/src/Jitter2/Collision/DynamicTree.cs b/src/Jitter2/Collision/DynamicTree.cs index d2b4369b..1877b20c 100644 --- a/src/Jitter2/Collision/DynamicTree.cs +++ b/src/Jitter2/Collision/DynamicTree.cs @@ -517,7 +517,7 @@ private int AllocateNode() if (nodePointer == Nodes.Length) { Array.Resize(ref Nodes, Nodes.Length * 2); - Trace.WriteLine($"Resized array of AABBTree to {Nodes.Length} elements."); + Trace.TraceInformation($"{nameof(DynamicTree)}: Resized array of tree to {Nodes.Length} elements."); } return nodePointer; diff --git a/src/Jitter2/Collision/NarrowPhase/NarrowPhase.cs b/src/Jitter2/Collision/NarrowPhase/NarrowPhase.cs index dd42a584..6410c0ee 100644 --- a/src/Jitter2/Collision/NarrowPhase/NarrowPhase.cs +++ b/src/Jitter2/Collision/NarrowPhase/NarrowPhase.cs @@ -263,7 +263,7 @@ private bool SolveMPREPA(in MinkowskiDifference mkd, ref JVector point1, ref JVe } } - Trace.WriteLine($"EPA: Could not converge within {MaxIter} iterations."); + Trace.TraceWarning($"{nameof(NarrowPhase)}: EPA, Could not converge within {MaxIter} iterations."); return false; @@ -434,7 +434,7 @@ 3. This notice may not be removed or altered from any source distribution. { // was: return true; // better not return a collision - Trace.WriteLine("MPR: This should not happen."); + Debug.Assert(false, "MPR: This should not happen."); return false; } @@ -649,7 +649,7 @@ public bool Collision(in MinkowskiDifference mkd, point1 = point2 = normal = JVector.Zero; penetration = (Real)0.0; - Trace.WriteLine($"EPA: Could not converge within {MaxIter} iterations."); + Trace.TraceWarning($"{nameof(NarrowPhase)}: EPA, Could not converge within {MaxIter} iterations."); return false; diff --git a/src/Jitter2/Collision/PairHashSet.cs b/src/Jitter2/Collision/PairHashSet.cs index fb6d7e8a..adf09484 100644 --- a/src/Jitter2/Collision/PairHashSet.cs +++ b/src/Jitter2/Collision/PairHashSet.cs @@ -135,7 +135,7 @@ private void Resize(int size) { if (Slots.Length == size) return; - Trace.WriteLine($"PairHashSet: Resizing {Slots.Length} -> {size}"); + Trace.TraceInformation($"{nameof(PairHashSet)}: Resizing {Slots.Length} -> {size}"); var newSlots = new Pair[size]; diff --git a/src/Jitter2/Dynamics/Constraints/AngularMotor.cs b/src/Jitter2/Dynamics/Constraints/AngularMotor.cs index d6a2a1b9..3eb60e1f 100644 --- a/src/Jitter2/Dynamics/Constraints/AngularMotor.cs +++ b/src/Jitter2/Dynamics/Constraints/AngularMotor.cs @@ -61,7 +61,8 @@ public struct AngularMotorData protected override void Create() { - Trace.Assert(sizeof(AngularMotorData) <= sizeof(ConstraintData)); + CheckDataSize(); + iterate = &Iterate; prepareForIteration = &PrepareForIteration; handle = JHandle.AsHandle(Handle); diff --git a/src/Jitter2/Dynamics/Constraints/BallSocket.cs b/src/Jitter2/Dynamics/Constraints/BallSocket.cs index 0c9abe8d..9b761a28 100644 --- a/src/Jitter2/Dynamics/Constraints/BallSocket.cs +++ b/src/Jitter2/Dynamics/Constraints/BallSocket.cs @@ -66,7 +66,7 @@ public struct BallSocketData protected override void Create() { - Trace.Assert(sizeof(BallSocketData) <= sizeof(ConstraintData)); + CheckDataSize(); iterate = &Iterate; prepareForIteration = &PrepareForIteration; diff --git a/src/Jitter2/Dynamics/Constraints/ConeLimit.cs b/src/Jitter2/Dynamics/Constraints/ConeLimit.cs index 1f5e8943..7d414a40 100644 --- a/src/Jitter2/Dynamics/Constraints/ConeLimit.cs +++ b/src/Jitter2/Dynamics/Constraints/ConeLimit.cs @@ -67,7 +67,8 @@ public struct ConeLimitData protected override void Create() { - Trace.Assert(sizeof(ConeLimitData) <= sizeof(ConstraintData)); + CheckDataSize(); + iterate = &Iterate; prepareForIteration = &PrepareForIteration; handle = JHandle.AsHandle(Handle); diff --git a/src/Jitter2/Dynamics/Constraints/Constraint.cs b/src/Jitter2/Dynamics/Constraints/Constraint.cs index 4bb3ac35..62708aec 100644 --- a/src/Jitter2/Dynamics/Constraints/Constraint.cs +++ b/src/Jitter2/Dynamics/Constraints/Constraint.cs @@ -27,11 +27,9 @@ namespace Jitter2.Dynamics.Constraints; -[StructLayout(LayoutKind.Sequential, Size = ConstraintSize)] +[StructLayout(LayoutKind.Sequential, Size = Precision.ConstraintSizeSmall)] public unsafe struct SmallConstraintData { - public const int ConstraintSize = Jitter2.Precision.ConstraintSizeSmall; - internal int _internal; public delegate* Iterate; public delegate* PrepareForIteration; @@ -40,11 +38,9 @@ public unsafe struct SmallConstraintData public JHandle Body2; } -[StructLayout(LayoutKind.Sequential, Size = ConstraintSize)] +[StructLayout(LayoutKind.Sequential, Size = Precision.ConstraintSizeFull)] public unsafe struct ConstraintData { - public const int ConstraintSize = Jitter2.Precision.ConstraintSizeFull; - internal int _internal; public delegate* Iterate; public delegate* PrepareForIteration; @@ -70,6 +66,17 @@ public abstract class Constraint : IDebugDrawable public JHandle SmallHandle => JHandle.AsHandle(Handle); + /// + /// Helper to check if the constraint data is small enough. + /// + protected static unsafe void CheckDataSize() where T : unmanaged + { + if (sizeof(T) > sizeof(ConstraintData)) + { + throw new InvalidOperationException("The size of the constraint data is too large."); + } + } + /// /// This method must be overridden. It initializes the function pointers for /// and . diff --git a/src/Jitter2/Dynamics/Constraints/DistanceLimit.cs b/src/Jitter2/Dynamics/Constraints/DistanceLimit.cs index ce90c0a7..ed7c826d 100644 --- a/src/Jitter2/Dynamics/Constraints/DistanceLimit.cs +++ b/src/Jitter2/Dynamics/Constraints/DistanceLimit.cs @@ -71,7 +71,8 @@ public struct DistanceLimitData protected override void Create() { - Trace.Assert(sizeof(DistanceLimitData) <= sizeof(ConstraintData)); + CheckDataSize(); + iterate = &Iterate; prepareForIteration = &PrepareForIteration; handle = JHandle.AsHandle(Handle); diff --git a/src/Jitter2/Dynamics/Constraints/FixedAngle.cs b/src/Jitter2/Dynamics/Constraints/FixedAngle.cs index a391649c..0f316778 100644 --- a/src/Jitter2/Dynamics/Constraints/FixedAngle.cs +++ b/src/Jitter2/Dynamics/Constraints/FixedAngle.cs @@ -66,7 +66,8 @@ public struct FixedAngleData protected override void Create() { - Trace.Assert(sizeof(FixedAngleData) <= sizeof(ConstraintData)); + CheckDataSize(); + iterate = &Iterate; prepareForIteration = &PrepareForIteration; handle = JHandle.AsHandle(Handle); diff --git a/src/Jitter2/Dynamics/Constraints/HingeAngle.cs b/src/Jitter2/Dynamics/Constraints/HingeAngle.cs index 6bc40681..a6bf063e 100644 --- a/src/Jitter2/Dynamics/Constraints/HingeAngle.cs +++ b/src/Jitter2/Dynamics/Constraints/HingeAngle.cs @@ -70,7 +70,8 @@ public struct HingeAngleData protected override void Create() { - Trace.Assert(sizeof(HingeAngleData) <= sizeof(ConstraintData)); + CheckDataSize(); + iterate = &Iterate; prepareForIteration = &PrepareForIteration; handle = JHandle.AsHandle(Handle); diff --git a/src/Jitter2/Dynamics/Constraints/LinearMotor.cs b/src/Jitter2/Dynamics/Constraints/LinearMotor.cs index cfa0be8c..189830a3 100644 --- a/src/Jitter2/Dynamics/Constraints/LinearMotor.cs +++ b/src/Jitter2/Dynamics/Constraints/LinearMotor.cs @@ -62,7 +62,8 @@ public struct LinearMotorData protected override void Create() { - Trace.Assert(sizeof(LinearMotorData) <= sizeof(ConstraintData)); + CheckDataSize(); + iterate = &Iterate; prepareForIteration = &PrepareForIteration; handle = JHandle.AsHandle(Handle); diff --git a/src/Jitter2/Dynamics/Constraints/PointOnLine.cs b/src/Jitter2/Dynamics/Constraints/PointOnLine.cs index f7477c40..c3a28ee8 100644 --- a/src/Jitter2/Dynamics/Constraints/PointOnLine.cs +++ b/src/Jitter2/Dynamics/Constraints/PointOnLine.cs @@ -74,7 +74,8 @@ public struct PointOnLineData protected override void Create() { - Trace.Assert(sizeof(PointOnLineData) <= sizeof(ConstraintData)); + CheckDataSize(); + iterate = &Iterate; prepareForIteration = &PrepareForIteration; handle = JHandle.AsHandle(Handle); diff --git a/src/Jitter2/Dynamics/Constraints/PointOnPlane.cs b/src/Jitter2/Dynamics/Constraints/PointOnPlane.cs index c4cc8453..8b7db51b 100644 --- a/src/Jitter2/Dynamics/Constraints/PointOnPlane.cs +++ b/src/Jitter2/Dynamics/Constraints/PointOnPlane.cs @@ -72,7 +72,8 @@ public struct SliderData protected override void Create() { - Trace.Assert(sizeof(SliderData) <= sizeof(ConstraintData)); + CheckDataSize(); + iterate = &Iterate; prepareForIteration = &PrepareForIteration; handle = JHandle.AsHandle(Handle); diff --git a/src/Jitter2/Dynamics/Constraints/TwistAngle.cs b/src/Jitter2/Dynamics/Constraints/TwistAngle.cs index 88a1fca8..752d4d69 100644 --- a/src/Jitter2/Dynamics/Constraints/TwistAngle.cs +++ b/src/Jitter2/Dynamics/Constraints/TwistAngle.cs @@ -67,7 +67,8 @@ public struct TwistLimitData protected override void Create() { - Trace.Assert(sizeof(TwistLimitData) <= sizeof(ConstraintData)); + CheckDataSize(); + iterate = &Iterate; prepareForIteration = &PrepareForIteration; handle = JHandle.AsHandle(Handle); diff --git a/src/Jitter2/Parallelization/ThreadPool.cs b/src/Jitter2/Parallelization/ThreadPool.cs index fcb98c21..4ae411b8 100644 --- a/src/Jitter2/Parallelization/ThreadPool.cs +++ b/src/Jitter2/Parallelization/ThreadPool.cs @@ -107,7 +107,7 @@ private ThreadPool() // To avoid this issue, multi-threading is disabled when a debugger is attached on non-Windows systems. if (!OperatingSystem.IsWindows() && Debugger.IsAttached) { - System.Diagnostics.Trace.WriteLine( + System.Diagnostics.Debug.WriteLine( "Multi-threading disabled to prevent potential hangups: Debugger attached, " + ".NET version < 9.0, non-Windows system detected."); initialThreadCount = 1; // Forces single-threading to avoid hangups diff --git a/src/Jitter2/SoftBodies/SpringConstraint.cs b/src/Jitter2/SoftBodies/SpringConstraint.cs index c2630c4c..65563b1b 100644 --- a/src/Jitter2/SoftBodies/SpringConstraint.cs +++ b/src/Jitter2/SoftBodies/SpringConstraint.cs @@ -66,13 +66,14 @@ public struct SpringData protected override void Create() { - Trace.Assert(sizeof(SpringData) <= sizeof(ConstraintData)); + CheckDataSize(); + iterate = &Iterate; prepareForIteration = &PrepareForIteration; handle = JHandle.AsHandle(Handle); } - public override bool IsSmallConstraint { get; } = sizeof(SpringData) <= SmallConstraintData.ConstraintSize; + public override bool IsSmallConstraint { get; } = sizeof(SpringData) <= sizeof(SmallConstraintData); /// /// Initializes the constraint. diff --git a/src/Jitter2/Unmanaged/PartitionedBuffer.cs b/src/Jitter2/Unmanaged/PartitionedBuffer.cs index 471550b4..3ce61b55 100644 --- a/src/Jitter2/Unmanaged/PartitionedBuffer.cs +++ b/src/Jitter2/Unmanaged/PartitionedBuffer.cs @@ -216,7 +216,7 @@ public JHandle Allocate(bool active = false, bool clear = false) size = Math.Min(2 * osize, maximumSize); - Trace.WriteLine($"{nameof(PartitionedBuffer)}: " + + Trace.TraceInformation($"{nameof(PartitionedBuffer)}: " + $"Resizing to {size}x{typeof(T)} ({size}x{sizeof(T)} Bytes)."); var oldmemory = memory; diff --git a/src/JitterDemo/Program.cs b/src/JitterDemo/Program.cs index ad31b972..ae21afe4 100644 --- a/src/JitterDemo/Program.cs +++ b/src/JitterDemo/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using JitterDemo.Renderer.OpenGL; namespace JitterDemo; @@ -17,6 +18,8 @@ private static void PrintException(Exception ex, string info) public static void Main() { + Trace.Listeners.Add(new ConsoleTraceListener()); + CreationSettings cs = new(1200, 800, "JitterDemo"); try