From 815bd2d2603c2169964aa28f6e4abb58d74c0902 Mon Sep 17 00:00:00 2001 From: maxwes08 Date: Thu, 3 Sep 2026 16:50:36 +0200 Subject: [PATCH] rigidbody, forces and collision testing --- PhysicsEngine/Assets/Fonts/Roboto-Regular.ttf | Bin 0 -> 159108 bytes PhysicsEngine/Core/Program.cs | 392 ++++++++++++++ PhysicsEngine/{ => Graphics}/Camera.cs | 9 +- PhysicsEngine/Physics/Bodies/Body.cs | 123 +++++ PhysicsEngine/Physics/Bodies/Box.cs | 78 +++ PhysicsEngine/Physics/Bodies/Circle.cs | 44 ++ PhysicsEngine/Physics/CollisionEngine.cs | 505 ++++++++++++++++++ .../Physics/Constraints/Constraint.cs | 24 + PhysicsEngine/Physics/Forces/DragForce.cs | 10 + PhysicsEngine/Physics/Forces/GlobalForce.cs | 4 + PhysicsEngine/Physics/Forces/GravityForce.cs | 12 + PhysicsEngine/Physics/Solver.cs | 62 +++ PhysicsEngine/Physics/WorldModel.cs | 50 ++ PhysicsEngine/PhysicsEngine.csproj | 6 + PhysicsEngine/Program.cs | 68 --- PhysicsEngine/UI/DrawHelper.cs | 63 +++ PhysicsEngine/{ => UI}/MuiDarkColor.cs | 0 .../bin/Debug/net10.0/PhysicsEngine.dll | Bin 9728 -> 29696 bytes .../bin/Debug/net10.0/PhysicsEngine.exe | Bin 162304 -> 162304 bytes .../bin/Debug/net10.0/PhysicsEngine.pdb | Bin 13456 -> 25228 bytes .../net10.0/PhysicsEngine.AssemblyInfo.cs | 2 +- .../PhysicsEngine.AssemblyInfoInputs.cache | 2 +- ...ysicsEngine.csproj.CoreCompileInputs.cache | 2 +- .../obj/Debug/net10.0/PhysicsEngine.dll | Bin 9728 -> 29696 bytes .../obj/Debug/net10.0/PhysicsEngine.pdb | Bin 13456 -> 25228 bytes PhysicsEngine/obj/Debug/net10.0/apphost.exe | Bin 162304 -> 162304 bytes .../obj/Debug/net10.0/ref/PhysicsEngine.dll | Bin 6656 -> 9728 bytes .../Debug/net10.0/refint/PhysicsEngine.dll | Bin 6656 -> 9728 bytes 28 files changed, 1381 insertions(+), 75 deletions(-) create mode 100644 PhysicsEngine/Assets/Fonts/Roboto-Regular.ttf create mode 100644 PhysicsEngine/Core/Program.cs rename PhysicsEngine/{ => Graphics}/Camera.cs (95%) create mode 100644 PhysicsEngine/Physics/Bodies/Body.cs create mode 100644 PhysicsEngine/Physics/Bodies/Box.cs create mode 100644 PhysicsEngine/Physics/Bodies/Circle.cs create mode 100644 PhysicsEngine/Physics/CollisionEngine.cs create mode 100644 PhysicsEngine/Physics/Constraints/Constraint.cs create mode 100644 PhysicsEngine/Physics/Forces/DragForce.cs create mode 100644 PhysicsEngine/Physics/Forces/GlobalForce.cs create mode 100644 PhysicsEngine/Physics/Forces/GravityForce.cs create mode 100644 PhysicsEngine/Physics/Solver.cs create mode 100644 PhysicsEngine/Physics/WorldModel.cs delete mode 100644 PhysicsEngine/Program.cs create mode 100644 PhysicsEngine/UI/DrawHelper.cs rename PhysicsEngine/{ => UI}/MuiDarkColor.cs (100%) diff --git a/PhysicsEngine/Assets/Fonts/Roboto-Regular.ttf b/PhysicsEngine/Assets/Fonts/Roboto-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3db0d1fb08249291cfe0cd08c762346844cdc45a GIT binary patch literal 159108 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 0.25f) + { + frameTime = 0.25f; + } + + // Update Camera + camera.Update(frameTime); + + // Update Physics accumulator + accumulator += frameTime; + while (accumulator >= physicsTimeStep) + { + UpdatePhysics(physicsTimeStep); + accumulator -= physicsTimeStep; + } + + // Render loop + Raylib.BeginDrawing(); + Raylib.ClearBackground(MuiDarkColor.BackgroundDefault.ToColor()); + + // Draw background screen-space elements (Grid) + camera.DrawGrid(); + + // Draw World Bodies inside the Camera's 2D World Transform + Raylib.BeginMode2D(camera.RaylibCamera); + RenderScene(); + Raylib.EndMode2D(); + + // Draw UI / HUD elements + camera.DrawHUD(); + DrawText("Physics Engine", 20, 20, 30, MuiDarkColor.TextPrimary.ToColor()); + + Raylib.EndDrawing(); + } + + Raylib.UnloadFont(robotoFont); + Raylib.CloseWindow(); + } + + public static void DrawText(string text, int posX, int posY, float fontSize, Color color) + { + Raylib.DrawTextEx(robotoFont, text, new Vector2(posX, posY), fontSize, 1.0f, color); + } + + private static void UpdatePhysics(float dt) + { + world.Step(dt); + } + + private static void RenderScene() + { + // Iterate and draw all bodies in the world + foreach (var body in world.Bodies) + { + body.Draw(); + } + } + + private static void Scenario() + { + float worldWidth = 12.8f; + float worldHeight = 7.2f; + float wallThickness = 1.0f; + + // 1. Static world borders + Box floor = new Box(new Vector2(worldWidth * 0.5f, worldHeight + (wallThickness * 0.5f)), new Vector2(worldWidth + wallThickness * 2, wallThickness), 0f); + floor.BaseColor = Color.DarkGray; + world.AddBody(floor); + + Box ceiling = new Box(new Vector2(worldWidth * 0.5f, -wallThickness * 0.5f), new Vector2(worldWidth + wallThickness * 2, wallThickness), 0f); + ceiling.BaseColor = Color.DarkGray; + world.AddBody(ceiling); + + Box leftWall = new Box(new Vector2(-wallThickness * 0.5f, worldHeight * 0.5f), new Vector2(wallThickness, worldHeight + wallThickness * 2), 0f); + leftWall.BaseColor = Color.DarkGray; + world.AddBody(leftWall); + + Box rightWall = new Box(new Vector2(worldWidth + wallThickness * 0.5f, worldHeight * 0.5f), new Vector2(wallThickness, worldHeight + wallThickness * 2), 0f); + rightWall.BaseColor = Color.DarkGray; + world.AddBody(rightWall); + + // 2. Static ramps and platforms (rotated boxes) + // Left ramp (slopes up to the right) + Box leftRamp = new Box(new Vector2(2.5f, 5.5f), new Vector2(4.0f, 0.4f), 0f); + leftRamp.Rotation = -0.4f; // tilt upward to the right + leftRamp.BaseColor = Color.Gray; + world.AddBody(leftRamp); + + // Right ramp (slopes down to the right) + Box rightRamp = new Box(new Vector2(10.5f, 5.5f), new Vector2(4.0f, 0.4f), 0f); + rightRamp.Rotation = 0.4f; // tilt downward to the right + rightRamp.BaseColor = Color.Gray; + world.AddBody(rightRamp); + + // Floating platform in the middle + Box platform = new Box(new Vector2(6.4f, 3.5f), new Vector2(3.0f, 0.4f), 0f); + platform.BaseColor = Color.LightGray; + world.AddBody(platform); + + // Small static circle bumper near the bottom center + Circle staticBumper = new Circle(new Vector2(6.4f, 6.0f), 0.3f, 0f); + staticBumper.BaseColor = Color.Orange; + world.AddBody(staticBumper); + + // 3. Dynamic bodies – a mix of boxes and circles with varied properties + + // Tall, thin box (will tip over when hitting the ground) + Box tallBox = new Box(new Vector2(2.0f, 1.0f), new Vector2(0.3f, 1.8f), 30f); + tallBox.BaseColor = Color.SkyBlue; + tallBox.Rotation = 0.3f; + tallBox.AngularVelocity = 0.5f; + tallBox.Friction = 0.8f; + tallBox.Restitution = 0.1f; + world.AddBody(tallBox); + + // Heavy square box + Box heavyBox = new Box(new Vector2(4.0f, 1.5f), new Vector2(0.8f, 0.8f), 80f); + heavyBox.BaseColor = Color.DarkGreen; + heavyBox.Friction = 0.9f; + heavyBox.Restitution = 0.0f; + heavyBox.Velocity = new Vector2(1.5f, -1.0f); + world.AddBody(heavyBox); + + // Long plank (will slide and possibly balance) + Box plank = new Box(new Vector2(8.0f, 0.5f), new Vector2(2.5f, 0.25f), 25f); + plank.BaseColor = Color.Brown; + plank.Rotation = -0.2f; + plank.AngularVelocity = -0.3f; + plank.Friction = 0.6f; + world.AddBody(plank); + + // Bouncy ball (high restitution, low friction) + Circle bouncyBall = new Circle(new Vector2(9.0f, 1.0f), 0.3f, 5f); + bouncyBall.BaseColor = Color.Red; + bouncyBall.Restitution = 0.9f; + bouncyBall.Friction = 0.05f; + bouncyBall.Velocity = new Vector2(-30.0f, -20.0f); + bouncyBall.AngularVelocity = 10f; + world.AddBody(bouncyBall); + + // Heavy circle (rolls slowly) + Circle heavyBall = new Circle(new Vector2(5.0f, 0.8f), 0.5f, 40f); + heavyBall.BaseColor = Color.Purple; + heavyBall.Friction = 0.7f; + heavyBall.Restitution = 0.1f; + heavyBall.Velocity = new Vector2(2.0f, -0.5f); + world.AddBody(heavyBall); + + // Small fast circle + Circle fastCircle = new Circle(new Vector2(1.0f, 2.0f), 0.2f, 2f); + fastCircle.BaseColor = Color.Yellow; + fastCircle.Restitution = 0.7f; + fastCircle.Friction = 0.2f; + fastCircle.Velocity = new Vector2(6.0f, 2.0f); + world.AddBody(fastCircle); + + // Another box with high drag (will slow down quickly) + Box dragBox = new Box(new Vector2(10.0f, 2.0f), new Vector2(0.6f, 0.6f), 15f); + dragBox.BaseColor = Color.Violet; + dragBox.DragCoefficient = 2.0f; + dragBox.Velocity = new Vector2(-2.0f, -1.0f); + dragBox.AngularVelocity = 2.0f; + world.AddBody(dragBox); + + // Circle with high drag (like a light ball in air) + Circle dragCircle = new Circle(new Vector2(3.0f, 3.0f), 0.4f, 8f); + dragCircle.BaseColor = Color.Pink; + dragCircle.DragCoefficient = 1.5f; + dragCircle.Velocity = new Vector2(1.0f, 3.0f); + world.AddBody(dragCircle); + + // A box launched with an impulse at an offset (will spin) + Box spinningBox = new Box(new Vector2(7.0f, 2.5f), new Vector2(0.5f, 0.5f), 10f); + spinningBox.BaseColor = Color.Beige; + spinningBox.ApplyImpulseAtOffset(new Vector2(3.0f, -5.0f), new Vector2(0.25f, 0.0f)); + world.AddBody(spinningBox); + + // A circle launched with angular impulse + Circle spinningCircle = new Circle(new Vector2(11.0f, 1.0f), 0.35f, 12f); + spinningCircle.BaseColor = Color.Lime; + spinningCircle.ApplyImpulseAtOffset(new Vector2(0.0f, -8.0f), new Vector2(0.1f, 0.0f)); + world.AddBody(spinningCircle); + } + + private static void ScenarioLarge() + { + // Larger world dimensions + float worldWidth = 20.0f; + float worldHeight = 12.0f; + float wallThickness = 1.0f; + + // 1. Static world borders + Box floor = new Box(new Vector2(worldWidth * 0.5f, worldHeight + (wallThickness * 0.5f)), new Vector2(worldWidth + wallThickness * 2, wallThickness), 0f); + floor.BaseColor = Color.DarkGray; + world.AddBody(floor); + + Box ceiling = new Box(new Vector2(worldWidth * 0.5f, -wallThickness * 0.5f), new Vector2(worldWidth + wallThickness * 2, wallThickness), 0f); + ceiling.BaseColor = Color.DarkGray; + world.AddBody(ceiling); + + Box leftWall = new Box(new Vector2(-wallThickness * 0.5f, worldHeight * 0.5f), new Vector2(wallThickness, worldHeight + wallThickness * 2), 0f); + leftWall.BaseColor = Color.DarkGray; + world.AddBody(leftWall); + + Box rightWall = new Box(new Vector2(worldWidth + wallThickness * 0.5f, worldHeight * 0.5f), new Vector2(wallThickness, worldHeight + wallThickness * 2), 0f); + rightWall.BaseColor = Color.DarkGray; + world.AddBody(rightWall); + + // 2. Static ramps (angled platforms) + Box ramp1 = new Box(new Vector2(4.0f, 9.0f), new Vector2(5.0f, 0.4f), 0f); + ramp1.Rotation = -0.35f; + ramp1.BaseColor = Color.Gray; + world.AddBody(ramp1); + + Box ramp2 = new Box(new Vector2(16.0f, 9.0f), new Vector2(5.0f, 0.4f), 0f); + ramp2.Rotation = 0.35f; + ramp2.BaseColor = Color.Gray; + world.AddBody(ramp2); + + // Static horizontal platforms + Box platform1 = new Box(new Vector2(7.0f, 6.0f), new Vector2(4.0f, 0.4f), 0f); + platform1.BaseColor = Color.LightGray; + world.AddBody(platform1); + + Box platform2 = new Box(new Vector2(13.0f, 6.0f), new Vector2(4.0f, 0.4f), 0f); + platform2.BaseColor = Color.LightGray; + world.AddBody(platform2); + + // Static vertical pillars to create obstacles + Box pillar1 = new Box(new Vector2(5.0f, 4.0f), new Vector2(0.3f, 3.0f), 0f); + pillar1.BaseColor = Color.DarkBrown; + world.AddBody(pillar1); + + Box pillar2 = new Box(new Vector2(15.0f, 4.0f), new Vector2(0.3f, 3.0f), 0f); + pillar2.BaseColor = Color.DarkBrown; + world.AddBody(pillar2); + + // Static circular bumpers + Circle bumper1 = new Circle(new Vector2(10.0f, 8.0f), 0.4f, 0f); + bumper1.BaseColor = Color.Orange; + world.AddBody(bumper1); + + Circle bumper2 = new Circle(new Vector2(10.0f, 3.0f), 0.4f, 0f); + bumper2.BaseColor = Color.Orange; + world.AddBody(bumper2); + + Circle bumper3 = new Circle(new Vector2(2.0f, 7.0f), 0.3f, 0f); + bumper3.BaseColor = Color.Orange; + world.AddBody(bumper3); + + Circle bumper4 = new Circle(new Vector2(18.0f, 7.0f), 0.3f, 0f); + bumper4.BaseColor = Color.Orange; + world.AddBody(bumper4); + + // 3. Dynamic bodies – many with high energy, low damping + + // High restitution balls (bouncy) + for (int i = 0; i < 6; i++) + { + Circle bouncyBall = new Circle(new Vector2(2.0f + i * 3.0f, 1.5f), 0.25f, 3.0f); + bouncyBall.BaseColor = Color.Red; + bouncyBall.Restitution = 0.95f; + bouncyBall.Friction = 0.05f; + bouncyBall.Velocity = new Vector2((i % 2 == 0 ? 3.0f : -3.0f), -2.0f); + bouncyBall.AngularVelocity = 5.0f; + world.AddBody(bouncyBall); + } + + // Heavy boxes (low restitution, high friction) + Box heavy1 = new Box(new Vector2(6.0f, 2.0f), new Vector2(1.0f, 0.8f), 60f); + heavy1.BaseColor = Color.DarkGreen; + heavy1.Friction = 0.9f; + heavy1.Restitution = 0.0f; + heavy1.Velocity = new Vector2(2.0f, -1.0f); + world.AddBody(heavy1); + + Box heavy2 = new Box(new Vector2(14.0f, 2.0f), new Vector2(1.0f, 0.8f), 60f); + heavy2.BaseColor = Color.DarkGreen; + heavy2.Friction = 0.9f; + heavy2.Restitution = 0.0f; + heavy2.Velocity = new Vector2(-2.0f, -1.0f); + world.AddBody(heavy2); + + // Long planks (will slide and rotate) + Box plank1 = new Box(new Vector2(8.0f, 10.5f), new Vector2(3.0f, 0.3f), 20f); + plank1.BaseColor = Color.Brown; + plank1.Rotation = 0.1f; + plank1.AngularVelocity = -0.4f; + plank1.Friction = 0.6f; + plank1.Velocity = new Vector2(1.0f, -0.5f); + world.AddBody(plank1); + + Box plank2 = new Box(new Vector2(12.0f, 10.5f), new Vector2(3.0f, 0.3f), 20f); + plank2.BaseColor = Color.Brown; + plank2.Rotation = -0.1f; + plank2.AngularVelocity = 0.4f; + plank2.Friction = 0.6f; + plank2.Velocity = new Vector2(-1.0f, -0.5f); + world.AddBody(plank2); + + // Spinning boxes (launched with off-center impulses) + Box spinBox1 = new Box(new Vector2(5.0f, 7.0f), new Vector2(0.6f, 0.6f), 10f); + spinBox1.BaseColor = Color.Beige; + spinBox1.ApplyImpulseAtOffset(new Vector2(4.0f, -6.0f), new Vector2(0.3f, 0.0f)); + world.AddBody(spinBox1); + + Box spinBox2 = new Box(new Vector2(15.0f, 7.0f), new Vector2(0.6f, 0.6f), 10f); + spinBox2.BaseColor = Color.Beige; + spinBox2.ApplyImpulseAtOffset(new Vector2(-4.0f, -6.0f), new Vector2(-0.3f, 0.0f)); + world.AddBody(spinBox2); + + // Small fast circles + Circle fast1 = new Circle(new Vector2(3.0f, 11.0f), 0.2f, 2f); + fast1.BaseColor = Color.Yellow; + fast1.Restitution = 0.8f; + fast1.Friction = 0.2f; + fast1.Velocity = new Vector2(8.0f, 1.0f); + world.AddBody(fast1); + + Circle fast2 = new Circle(new Vector2(17.0f, 11.0f), 0.2f, 2f); + fast2.BaseColor = Color.Yellow; + fast2.Restitution = 0.8f; + fast2.Friction = 0.2f; + fast2.Velocity = new Vector2(-8.0f, 1.0f); + world.AddBody(fast2); + + // High-drag objects that still move initially + Box dragBox = new Box(new Vector2(10.0f, 9.0f), new Vector2(0.8f, 0.8f), 15f); + dragBox.BaseColor = Color.Violet; + dragBox.DragCoefficient = 2.0f; + dragBox.Velocity = new Vector2(3.0f, -2.0f); + dragBox.AngularVelocity = 2.0f; + world.AddBody(dragBox); + + Circle dragCircle = new Circle(new Vector2(10.0f, 5.0f), 0.4f, 8f); + dragCircle.BaseColor = Color.Pink; + dragCircle.DragCoefficient = 1.5f; + dragCircle.Velocity = new Vector2(-2.0f, 3.0f); + world.AddBody(dragCircle); + + // A few more random objects to fill the space + Circle extra1 = new Circle(new Vector2(1.5f, 5.0f), 0.35f, 12f); + extra1.BaseColor = Color.Lime; + extra1.Restitution = 0.7f; + extra1.Velocity = new Vector2(5.0f, -3.0f); + extra1.AngularVelocity = 8.0f; + world.AddBody(extra1); + + Circle extra2 = new Circle(new Vector2(18.5f, 5.0f), 0.35f, 12f); + extra2.BaseColor = Color.Lime; + extra2.Restitution = 0.7f; + extra2.Velocity = new Vector2(-5.0f, -3.0f); + extra2.AngularVelocity = -8.0f; + world.AddBody(extra2); + + Box extraBox = new Box(new Vector2(10.0f, 1.0f), new Vector2(1.2f, 0.6f), 25f); + extraBox.BaseColor = Color.SkyBlue; + extraBox.Velocity = new Vector2(0.5f, -2.0f); + world.AddBody(extraBox); + } + } +} \ No newline at end of file diff --git a/PhysicsEngine/Camera.cs b/PhysicsEngine/Graphics/Camera.cs similarity index 95% rename from PhysicsEngine/Camera.cs rename to PhysicsEngine/Graphics/Camera.cs index b4adfba..63616e4 100644 --- a/PhysicsEngine/Camera.cs +++ b/PhysicsEngine/Graphics/Camera.cs @@ -12,7 +12,7 @@ namespace PhysicsEngine private const float MoveLerpSpeed = 20.0f; private const float ZoomFactor = 0.1f; private const float MinZoom = 0.2f; - private const float MaxZoom = 500000000000000000000000000000000000.0f; + private const float MaxZoom = 50.0f; public Camera2D RaylibCamera { get; private set; } public Vector2 Position => RaylibCamera.Target / PixelsPerMeter; @@ -82,6 +82,8 @@ namespace PhysicsEngine targetPosition = Vector2.Zero; targetZoom = 1.0f; isDragging = false; + cam.Target = Vector2.Zero; + cam.Zoom = 1.0f; } // zooming @@ -114,7 +116,6 @@ namespace PhysicsEngine { cam.Target.X += (targetPosition.X - cam.Target.X) * MoveLerpSpeed * frameTime; cam.Target.Y += (targetPosition.Y - cam.Target.Y) * MoveLerpSpeed * frameTime; - targetPosition = cam.Target; } RaylibCamera = cam; @@ -180,8 +181,8 @@ namespace PhysicsEngine public void DrawHUD() { float screenH = Raylib.GetScreenHeight(); - string hudText = $"X: {Position.X:F1}m Y: {Position.Y:F1}m Zoom: {Zoom:F2}x"; - Raylib.DrawText(hudText, 20, (int)screenH - 40, 20, MuiDarkColor.TextPrimary.ToColor()); + string hudText = $"X: {Position.X:F2}m Y: {Position.Y:F2}m Zoom: {Zoom:F2}x"; + Program.DrawText(hudText, 20, (int)screenH - 40, 20, MuiDarkColor.TextPrimary.ToColor()); } } } \ No newline at end of file diff --git a/PhysicsEngine/Physics/Bodies/Body.cs b/PhysicsEngine/Physics/Bodies/Body.cs new file mode 100644 index 0000000..804de86 --- /dev/null +++ b/PhysicsEngine/Physics/Bodies/Body.cs @@ -0,0 +1,123 @@ +using System; +using System.Numerics; +using Raylib_cs; + +namespace PhysicsEngine +{ + public class Body + { + public Vector2 Position; + public Vector2 Velocity; + public Vector2 ForceAccumulator; + public Color BaseColor = Color.Blue; + public float Rotation; + public float AngularVelocity; + public float TorqueAccumulator; + public float Mass; + public float InverseMass => Mass > 0.0f ? 1.0f / Mass : 0.0f; + public float MomentOfInertia; + public float InverseInertia => MomentOfInertia > 0.0f ? 1.0f / MomentOfInertia : 0.0f; + public float Restitution = 0.5f; + public float Friction = 0.2f; + public float DragCoefficient = 0.0f; // Drag per m^2 (ignored if 0.0) + public bool IsStatic => Mass == 0.0f; + + public void ApplyForce(Vector2 force) + { + if (IsStatic) return; + ForceAccumulator += force; + } + + public void ApplyTorque(float torque) + { + if (IsStatic) return; + TorqueAccumulator += torque; + } + + // --- Impulse Methods --- + + public void ApplyImpulse(Vector2 impulse) + { + if (IsStatic) return; + Velocity += impulse * InverseMass; + } + + public void ApplyImpulseAtOffset(Vector2 impulse, Vector2 localOffset) + { + if (IsStatic) return; + + // Direct linear velocity change + Velocity += impulse * InverseMass; + + // Rotate local offset into world space based on body rotation + float cos = MathF.Cos(Rotation); + float sin = MathF.Sin(Rotation); + Vector2 worldOffset = new Vector2( + localOffset.X * cos - localOffset.Y * sin, + localOffset.X * sin + localOffset.Y * cos + ); + + // 2D Cross product for torque: r x J + float torque = worldOffset.X * impulse.Y - worldOffset.Y * impulse.X; + AngularVelocity += torque * InverseInertia; + } + + public void ApplyImpulseAtWorldPosition(Vector2 impulse, Vector2 worldPosition) + { + if (IsStatic) return; + + // Direct linear velocity change + Velocity += impulse * InverseMass; + + // Offset from center of mass in world space + Vector2 worldOffset = worldPosition - Position; + + // 2D Cross product for torque: r x J + float torque = worldOffset.X * impulse.Y - worldOffset.Y * impulse.X; + AngularVelocity += torque * InverseInertia; + } + + // --- Other Useful Methods to Consider --- + + public void ApplyForceAtWorldPosition(Vector2 force, Vector2 worldPosition) + { + if (IsStatic) return; + + ForceAccumulator += force; + Vector2 worldOffset = worldPosition - Position; + float torque = worldOffset.X * force.Y - worldOffset.Y * force.X; + TorqueAccumulator += torque; + } + + public Vector2 GetWorldPointFromLocal(Vector2 localPoint) + { + float cos = MathF.Cos(Rotation); + float sin = MathF.Sin(Rotation); + Vector2 rotated = new Vector2( + localPoint.X * cos - localPoint.Y * sin, + localPoint.X * sin + localPoint.Y * cos + ); + return Position + rotated; + } + + public Vector2 GetLocalPointFromWorld(Vector2 worldPoint) + { + Vector2 delta = worldPoint - Position; + float cos = MathF.Cos(-Rotation); + float sin = MathF.Sin(-Rotation); + return new Vector2( + delta.X * cos - delta.Y * sin, + delta.X * sin + delta.Y * cos + ); + } + + public void ClearForces() + { + ForceAccumulator = Vector2.Zero; + TorqueAccumulator = 0.0f; + } + + public virtual void Draw(float pixelsPerMeter = 100.0f) {} + public virtual void ApplyAerodynamicDrag(float dt) {} + } +} \ No newline at end of file diff --git a/PhysicsEngine/Physics/Bodies/Box.cs b/PhysicsEngine/Physics/Bodies/Box.cs new file mode 100644 index 0000000..f04f053 --- /dev/null +++ b/PhysicsEngine/Physics/Bodies/Box.cs @@ -0,0 +1,78 @@ +using System; +using System.Numerics; +using Raylib_cs; + +namespace PhysicsEngine +{ + public class Box : Body + { + public Vector2 Size; + + public Box(Vector2 position, Vector2 size, float mass) + { + Position = position; + Size = size; + Mass = mass; + MomentOfInertia = (1.0f / 12.0f) * mass * (size.X * size.X + size.Y * size.Y); + } + + public override void Draw(float pixelsPerMeter = 100.0f) + { + DrawHelper.DrawRotatedBox(Position, Size, Rotation, BaseColor, pixelsPerMeter); + } + + private Vector2 RotatePoint(Vector2 point, float radians) + { + float cos = MathF.Cos(radians); + float sin = MathF.Sin(radians); + return new Vector2( + point.X * cos - point.Y * sin, + point.X * sin + point.Y * cos + ); + } + + public override void ApplyAerodynamicDrag(float dt) + { + if (DragCoefficient <= 0.0f) return; + + const float airDensity = 1.225f; + float speed = Velocity.Length(); + if (speed < 0.01f) return; + + // 1. Oncoming relative wind direction (opposite to velocity) + Vector2 windDir = -Velocity / speed; + + float cos = MathF.Cos(Rotation); + float sin = MathF.Sin(Rotation); + + // Box local axes transformed into world space (Assuming Size.Y is length/major axis) + Vector2 worldAxisY = new Vector2(-sin, cos); // Major axis vector + Vector2 worldAxisX = new Vector2(cos, sin); // Minor axis vector + + // 2. Calculate effective frontal width (projected area in 2D) based on current orientation + Vector2 windPerp = new Vector2(-windDir.Y, windDir.X); + float projX = MathF.Abs(Vector2.Dot(worldAxisX, windPerp)); + float projY = MathF.Abs(Vector2.Dot(worldAxisY, windPerp)); + float effectiveWidth = Size.X * projX + Size.Y * projY; + + // 3. Translational Drag Force (scales with dynamic pressure and current effective width) + float dragMagnitude = 0.5f * airDensity * speed * speed * DragCoefficient * effectiveWidth; + Vector2 dragForce = windDir * dragMagnitude; + ApplyForce(dragForce); + + // 4. Weathercock / Fin-Effect Restoring Torque + // Measures angular misalignment between the box's major axis and the wind direction + float cross = worldAxisY.X * windDir.Y - worldAxisY.Y * windDir.X; + float restoringTorque = cross * 0.5f * airDensity * speed * speed * DragCoefficient * Size.X * Size.Y; + ApplyTorque(restoringTorque); + + // 5. Angular Damping (Quadratic Rotational Drag) + float angularSpeed = MathF.Abs(AngularVelocity); + if (angularSpeed > 0.0001f) + { + float angularDragTorque = -MathF.Sign(AngularVelocity) * 0.5f * airDensity * angularSpeed * angularSpeed * DragCoefficient * (Size.X + Size.Y); + ApplyTorque(angularDragTorque); + } + } + } +} \ No newline at end of file diff --git a/PhysicsEngine/Physics/Bodies/Circle.cs b/PhysicsEngine/Physics/Bodies/Circle.cs new file mode 100644 index 0000000..5a9bb44 --- /dev/null +++ b/PhysicsEngine/Physics/Bodies/Circle.cs @@ -0,0 +1,44 @@ +using System; +using System.Numerics; +using Raylib_cs; + +namespace PhysicsEngine +{ + public class Circle : Body + { + public float Radius; + + public Circle(Vector2 position, float radius, float mass) + { + Position = position; + Radius = radius; + Mass = mass; + + if (mass > 0.0f) + { + MomentOfInertia = 0.5f * mass * radius * radius; + } + } + + public override void Draw(float pixelsPerMeter = 100.0f) + { + DrawHelper.DrawCircleBody(Position, Radius, Rotation, BaseColor, pixelsPerMeter); + } + + public override void ApplyAerodynamicDrag(float dt) + { + if (DragCoefficient <= 0.0f) return; + + const float airDensity = 1.225f; + float area = Radius * 2.0f; + float speed = Velocity.Length(); + + if (speed > 0.0001f) + { + Vector2 dragDir = -Vector2.Normalize(Velocity); + float dragMagnitude = 0.5f * airDensity * speed * speed * DragCoefficient * area; + ApplyForce(dragDir * dragMagnitude); + } + } + } +} \ No newline at end of file diff --git a/PhysicsEngine/Physics/CollisionEngine.cs b/PhysicsEngine/Physics/CollisionEngine.cs new file mode 100644 index 0000000..f9a28b3 --- /dev/null +++ b/PhysicsEngine/Physics/CollisionEngine.cs @@ -0,0 +1,505 @@ +using System; +using System.Collections.Generic; +using System.Numerics; + +namespace PhysicsEngine +{ + public static class CollisionEngine + { + private const float Slop = 0.01f; + private const float PositionCorrectionPercent = 0.1f; + private const float MaxCorrection = 0.2f; + private const int VelocityIterations = 5; + + private class Contact + { + public Vector2 Point; + public Vector2 Normal; // from BodyA to BodyB + public float Penetration; + public float AccumulatedNormalImpulse; + public float AccumulatedTangentImpulse; + public Body BodyA; + public Body BodyB; + public Vector2 RA; + public Vector2 RB; + public float NormalMass; + public float TangentMass; + public float Friction; + public float Restitution; + } + + public static void ResolveCollisions(List bodies, float dt) + { + List contacts = new List(); + + for (int i = 0; i < bodies.Count; i++) + { + for (int j = i + 1; j < bodies.Count; j++) + { + Body b1 = bodies[i]; + Body b2 = bodies[j]; + if (b1.IsStatic && b2.IsStatic) continue; + + if (b1 is Circle && b2 is Circle) + ResolveCircleCircle((Circle)b1, (Circle)b2, contacts); + else if (b1 is Box && b2 is Circle) + ResolveBoxCircle((Box)b1, (Circle)b2, contacts, false); + else if (b1 is Circle && b2 is Box) + ResolveBoxCircle((Box)b2, (Circle)b1, contacts, true); + else if (b1 is Box && b2 is Box) + ResolveBoxBox((Box)b1, (Box)b2, contacts); + } + } + + foreach (var contact in contacts) + { + contact.AccumulatedNormalImpulse = 0; + contact.AccumulatedTangentImpulse = 0; + contact.RA = contact.Point - contact.BodyA.Position; + contact.RB = contact.Point - contact.BodyB.Position; + + float invMassA = contact.BodyA.InverseMass; + float invMassB = contact.BodyB.InverseMass; + float invIA = contact.BodyA.InverseInertia; + float invIB = contact.BodyB.InverseInertia; + + float rnA = Cross(contact.RA, contact.Normal); + float rnB = Cross(contact.RB, contact.Normal); + float denom = invMassA + invMassB + rnA * rnA * invIA + rnB * rnB * invIB; + contact.NormalMass = denom > 0 ? 1.0f / denom : 0; + + Vector2 tangent = new Vector2(-contact.Normal.Y, contact.Normal.X); + float rtA = Cross(contact.RA, tangent); + float rtB = Cross(contact.RB, tangent); + denom = invMassA + invMassB + rtA * rtA * invIA + rtB * rtB * invIB; + contact.TangentMass = denom > 0 ? 1.0f / denom : 0; + + contact.Friction = (float)Math.Sqrt(contact.BodyA.Friction * contact.BodyB.Friction); + contact.Restitution = Math.Max(contact.BodyA.Restitution, contact.BodyB.Restitution); + } + + for (int iter = 0; iter < VelocityIterations; iter++) + { + foreach (var contact in contacts) + { + Vector2 rv = GetRelativeVelocity(contact); + float vn = Vector2.Dot(rv, contact.Normal); + float lambda = -contact.NormalMass * vn; + + float newImpulse = Math.Max(contact.AccumulatedNormalImpulse + lambda, 0); + lambda = newImpulse - contact.AccumulatedNormalImpulse; + contact.AccumulatedNormalImpulse = newImpulse; + + ApplyImpulse(contact, contact.Normal * lambda); + + rv = GetRelativeVelocity(contact); + Vector2 tangent = rv - contact.Normal * Vector2.Dot(rv, contact.Normal); + if (tangent.LengthSquared() > 1e-6f) + tangent = Vector2.Normalize(tangent); + else + tangent = new Vector2(-contact.Normal.Y, contact.Normal.X); + + float vt = Vector2.Dot(rv, tangent); + float lambdaT = -contact.TangentMass * vt; + float maxFriction = contact.Friction * contact.AccumulatedNormalImpulse; + float newImpulseT = Math.Clamp(contact.AccumulatedTangentImpulse + lambdaT, -maxFriction, maxFriction); + lambdaT = newImpulseT - contact.AccumulatedTangentImpulse; + contact.AccumulatedTangentImpulse = newImpulseT; + + ApplyImpulse(contact, tangent * lambdaT); + } + } + + var pairMap = new Dictionary<(Body, Body), Contact>(); + foreach (var contact in contacts) + { + var key = (contact.BodyA, contact.BodyB); + if (!pairMap.ContainsKey(key) || pairMap[key].Penetration < contact.Penetration) + pairMap[key] = contact; + } + + foreach (var kvp in pairMap) + { + var contact = kvp.Value; + float correctionMagnitude = Math.Max(contact.Penetration - Slop, 0) * PositionCorrectionPercent; + correctionMagnitude = Math.Min(correctionMagnitude, MaxCorrection); + if (correctionMagnitude <= 0) continue; + + Vector2 correction = contact.Normal * correctionMagnitude; + float totalInvMass = contact.BodyA.InverseMass + contact.BodyB.InverseMass; + if (totalInvMass <= 0) continue; + + float ratioA = contact.BodyA.InverseMass / totalInvMass; + float ratioB = contact.BodyB.InverseMass / totalInvMass; + + contact.BodyA.Position -= correction * ratioA; + contact.BodyB.Position += correction * ratioB; + } + } + + private static void ResolveCircleCircle(Circle c1, Circle c2, List contacts) + { + Vector2 d = c2.Position - c1.Position; + float distSq = d.LengthSquared(); + float radiusSum = c1.Radius + c2.Radius; + if (distSq >= radiusSum * radiusSum) return; + + float dist = (float)Math.Sqrt(distSq); + Vector2 normal; + if (dist < 1e-6f) + normal = new Vector2(1, 0); + else + normal = d / dist; + + float penetration = radiusSum - dist; + Vector2 contactPoint = c1.Position + normal * (c1.Radius - penetration * 0.5f); + + contacts.Add(new Contact + { + Point = contactPoint, + Normal = normal, + Penetration = penetration, + BodyA = c1, + BodyB = c2 + }); + } + + private static void ResolveBoxCircle(Box box, Circle circle, List contacts, bool swapped) + { + Vector2 localCircleCenter = circle.Position - box.Position; + float cos = (float)Math.Cos(box.Rotation); + float sin = (float)Math.Sin(box.Rotation); + Vector2 local = new Vector2( + localCircleCenter.X * cos + localCircleCenter.Y * sin, + -localCircleCenter.X * sin + localCircleCenter.Y * cos); + + float hx = box.Size.X * 0.5f; + float hy = box.Size.Y * 0.5f; + Vector2 closestLocal = new Vector2(Math.Clamp(local.X, -hx, hx), Math.Clamp(local.Y, -hy, hy)); + + Vector2 normalWorld; + Vector2 contactPointWorld; + float penetration; + + bool inside = (closestLocal == local); + if (inside) + { + float distLeft = local.X + hx; + float distRight = hx - local.X; + float distBottom = local.Y + hy; + float distTop = hy - local.Y; + float minDist = Math.Min(Math.Min(distLeft, distRight), Math.Min(distBottom, distTop)); + + Vector2 normalLocal; + if (minDist == distLeft) normalLocal = new Vector2(-1, 0); + else if (minDist == distRight) normalLocal = new Vector2(1, 0); + else if (minDist == distBottom) normalLocal = new Vector2(0, -1); + else normalLocal = new Vector2(0, 1); + + normalWorld = new Vector2(normalLocal.X * cos - normalLocal.Y * sin, + normalLocal.X * sin + normalLocal.Y * cos); + penetration = circle.Radius + minDist; + + Vector2 faceLocal = local; + if (normalLocal.X != 0) faceLocal.X = normalLocal.X > 0 ? hx : -hx; + else faceLocal.Y = normalLocal.Y > 0 ? hy : -hy; + contactPointWorld = box.Position + new Vector2(faceLocal.X * cos - faceLocal.Y * sin, + faceLocal.X * sin + faceLocal.Y * cos); + } + else + { + Vector2 closestWorld = box.Position + new Vector2(closestLocal.X * cos - closestLocal.Y * sin, + closestLocal.X * sin + closestLocal.Y * cos); + Vector2 delta = circle.Position - closestWorld; + float distSq = delta.LengthSquared(); + float radiusSq = circle.Radius * circle.Radius; + if (distSq >= radiusSq) return; + + float dist = (float)Math.Sqrt(distSq); + normalWorld = dist > 1e-6f ? delta / dist : new Vector2(1, 0); + penetration = circle.Radius - dist; + contactPointWorld = closestWorld; + } + + Contact contact = new Contact + { + Point = contactPointWorld, + Normal = normalWorld, + Penetration = penetration, + BodyA = box, + BodyB = circle + }; + + if (swapped) + { + contact.BodyA = circle; + contact.BodyB = box; + contact.Normal = -contact.Normal; + } + + contacts.Add(contact); + } + + private static void ResolveBoxBox(Box b1, Box b2, List contacts) + { + float h1x = b1.Size.X * 0.5f; + float h1y = b1.Size.Y * 0.5f; + float h2x = b2.Size.X * 0.5f; + float h2y = b2.Size.Y * 0.5f; + + float cos1 = (float)Math.Cos(b1.Rotation); + float sin1 = (float)Math.Sin(b1.Rotation); + float cos2 = (float)Math.Cos(b2.Rotation); + float sin2 = (float)Math.Sin(b2.Rotation); + + Vector2 axisX1 = new Vector2(cos1, sin1); + Vector2 axisY1 = new Vector2(-sin1, cos1); + Vector2 axisX2 = new Vector2(cos2, sin2); + Vector2 axisY2 = new Vector2(-sin2, cos2); + + Vector2 d = b2.Position - b1.Position; + float minOverlap = float.MaxValue; + Vector2 bestAxis = Vector2.Zero; + bool axisFromB1 = false; + + // Test axes. If one body is static, only test that body's axes for stability. + if (b1.IsStatic && !b2.IsStatic) + { + TestAxis(axisX1, b1, b2, h1x, h1y, h2x, h2y, axisX1, axisY1, axisX2, axisY2, d, ref minOverlap, ref bestAxis, true, ref axisFromB1); + TestAxis(axisY1, b1, b2, h1x, h1y, h2x, h2y, axisX1, axisY1, axisX2, axisY2, d, ref minOverlap, ref bestAxis, true, ref axisFromB1); + } + else if (b2.IsStatic && !b1.IsStatic) + { + TestAxis(axisX2, b1, b2, h1x, h1y, h2x, h2y, axisX1, axisY1, axisX2, axisY2, d, ref minOverlap, ref bestAxis, false, ref axisFromB1); + TestAxis(axisY2, b1, b2, h1x, h1y, h2x, h2y, axisX1, axisY1, axisX2, axisY2, d, ref minOverlap, ref bestAxis, false, ref axisFromB1); + } + else + { + TestAxis(axisX1, b1, b2, h1x, h1y, h2x, h2y, axisX1, axisY1, axisX2, axisY2, d, ref minOverlap, ref bestAxis, true, ref axisFromB1); + TestAxis(axisY1, b1, b2, h1x, h1y, h2x, h2y, axisX1, axisY1, axisX2, axisY2, d, ref minOverlap, ref bestAxis, true, ref axisFromB1); + TestAxis(axisX2, b1, b2, h1x, h1y, h2x, h2y, axisX1, axisY1, axisX2, axisY2, d, ref minOverlap, ref bestAxis, false, ref axisFromB1); + TestAxis(axisY2, b1, b2, h1x, h1y, h2x, h2y, axisX1, axisY1, axisX2, axisY2, d, ref minOverlap, ref bestAxis, false, ref axisFromB1); + } + + if (minOverlap <= 0 || minOverlap == float.MaxValue) return; + + Vector2 normal = Vector2.Dot(d, bestAxis) > 0 ? bestAxis : -bestAxis; + + Box refBox, incBox; + Vector2 refNormal, incNormal; + if (axisFromB1) + { + refBox = b1; + incBox = b2; + refNormal = normal; // outward normal of reference face points toward incident box + incNormal = -normal; // outward normal of incident face points toward reference box + } + else + { + refBox = b2; + incBox = b1; + refNormal = -normal; + incNormal = normal; + } + + Vector2[] refFace = GetFaceVertices(refBox, refNormal); + Vector2[] incFace = GetFaceVertices(incBox, incNormal); + if (refFace.Length < 2 || incFace.Length < 2) return; + + Vector2 refV1 = refFace[0]; + Vector2 refV2 = refFace[1]; + Vector2 edgeDir = refV2 - refV1; + if (edgeDir.LengthSquared() < 1e-8f) return; + edgeDir = Vector2.Normalize(edgeDir); + + int contactsBefore = contacts.Count; // to check if we added any new contacts + + // Clip incident face against reference face side planes + List clipped = new List { incFace[0], incFace[1] }; + ClipSegmentAgainstPlane(clipped, edgeDir, Vector2.Dot(edgeDir, refV1)); + ClipSegmentAgainstPlane(clipped, -edgeDir, -Vector2.Dot(edgeDir, refV2)); + + // Add contacts from clipped incident face points + foreach (var p in clipped) + { + float pen = -Vector2.Dot(p - refV1, refNormal); + if (pen > 0) + { + contacts.Add(new Contact + { + Point = p, + Normal = normal, + Penetration = pen, + BodyA = b1, + BodyB = b2 + }); + } + } + + // Check reference face vertices that penetrate the incident face + foreach (var refVertex in refFace) + { + // Penetration depth along incident face normal (positive if inside) + float pen = -Vector2.Dot(refVertex - incFace[0], incNormal); + if (pen > 0) + { + // Avoid duplicate contacts at nearly the same location + bool duplicate = false; + foreach (var c in contacts) + { + if (Vector2.DistanceSquared(c.Point, refVertex) < 1e-6f) + { + duplicate = true; + break; + } + } + if (!duplicate) + { + contacts.Add(new Contact + { + Point = refVertex, + Normal = normal, + Penetration = pen, + BodyA = b1, + BodyB = b2 + }); + } + } + } + + // Fallback: if no contacts were generated despite SAT overlap, create a single contact at the midpoint + // of the overlapping region along the normal. This prevents any missed collisions. + if (contacts.Count == contactsBefore) + { + // Compute the projection of both boxes onto the normal + float projB1 = h1x * Math.Abs(Vector2.Dot(axisX1, normal)) + h1y * Math.Abs(Vector2.Dot(axisY1, normal)); + float projB2 = h2x * Math.Abs(Vector2.Dot(axisX2, normal)) + h2y * Math.Abs(Vector2.Dot(axisY2, normal)); + float dist = Vector2.Dot(d, normal); // distance from b1 to b2 along normal + float min1 = -projB1; + float max1 = projB1; + float min2 = dist - projB2; + float max2 = dist + projB2; + + float overlapMin = Math.Max(min1, min2); + float overlapMax = Math.Min(max1, max2); + float overlapMid = (overlapMin + overlapMax) * 0.5f; + Vector2 contactPoint = b1.Position + normal * overlapMid; // rough position along normal + + contacts.Add(new Contact + { + Point = contactPoint, + Normal = normal, + Penetration = minOverlap, // use SAT overlap + BodyA = b1, + BodyB = b2 + }); + } + } + + private static void TestAxis(Vector2 axis, Box b1, Box b2, + float h1x, float h1y, float h2x, float h2y, + Vector2 axisX1, Vector2 axisY1, Vector2 axisX2, Vector2 axisY2, + Vector2 d, ref float minOverlap, ref Vector2 bestAxis, bool fromB1, ref bool axisFromB1) + { + float r1 = h1x * Math.Abs(Vector2.Dot(axisX1, axis)) + h1y * Math.Abs(Vector2.Dot(axisY1, axis)); + float r2 = h2x * Math.Abs(Vector2.Dot(axisX2, axis)) + h2y * Math.Abs(Vector2.Dot(axisY2, axis)); + float distance = Math.Abs(Vector2.Dot(d, axis)); + float overlap = r1 + r2 - distance; + + if (overlap <= 0) + { + minOverlap = overlap; + return; + } + + if (overlap < minOverlap) + { + minOverlap = overlap; + bestAxis = axis; + axisFromB1 = fromB1; + } + } + + private static Vector2[] GetBoxVertices(Box box) + { + float hx = box.Size.X * 0.5f; + float hy = box.Size.Y * 0.5f; + float cos = (float)Math.Cos(box.Rotation); + float sin = (float)Math.Sin(box.Rotation); + Vector2 axisX = new Vector2(cos, sin); + Vector2 axisY = new Vector2(-sin, cos); + + return new Vector2[] + { + box.Position - axisX * hx - axisY * hy, + box.Position + axisX * hx - axisY * hy, + box.Position + axisX * hx + axisY * hy, + box.Position - axisX * hx + axisY * hy + }; + } + + private static Vector2[] GetFaceVertices(Box box, Vector2 faceNormalWorld) + { + Vector2[] vertices = GetBoxVertices(box); + for (int i = 0; i < 4; i++) + { + Vector2 v1 = vertices[i]; + Vector2 v2 = vertices[(i + 1) % 4]; + Vector2 edge = v2 - v1; + Vector2 outwardNormal = new Vector2(edge.Y, -edge.X); + outwardNormal = Vector2.Normalize(outwardNormal); + if (Vector2.Dot(outwardNormal, faceNormalWorld) > 0.999f) + return new Vector2[] { v1, v2 }; + } + return new Vector2[] { vertices[0], vertices[1] }; + } + + private static void ClipSegmentAgainstPlane(List segment, Vector2 normal, float offset) + { + if (segment.Count == 0) return; + List result = new List(); + float d0 = Vector2.Dot(segment[0], normal) - offset; + float d1 = Vector2.Dot(segment[1], normal) - offset; + + if (d0 >= 0) result.Add(segment[0]); + if (d1 >= 0) result.Add(segment[1]); + + if (d0 * d1 < 0) + { + float t = d0 / (d0 - d1); + Vector2 intersection = segment[0] + t * (segment[1] - segment[0]); + result.Add(intersection); + } + + segment.Clear(); + segment.AddRange(result); + } + + private static Vector2 GetRelativeVelocity(Contact contact) + { + Body a = contact.BodyA; + Body b = contact.BodyB; + Vector2 va = a.Velocity + Cross(a.AngularVelocity, contact.RA); + Vector2 vb = b.Velocity + Cross(b.AngularVelocity, contact.RB); + return vb - va; + } + + private static void ApplyImpulse(Contact contact, Vector2 impulse) + { + if (!contact.BodyA.IsStatic) + contact.BodyA.ApplyImpulseAtWorldPosition(-impulse, contact.Point); + if (!contact.BodyB.IsStatic) + contact.BodyB.ApplyImpulseAtWorldPosition(impulse, contact.Point); + } + + private static float Cross(Vector2 a, Vector2 b) + { + return a.X * b.Y - a.Y * b.X; + } + + private static Vector2 Cross(float s, Vector2 a) + { + return new Vector2(-s * a.Y, s * a.X); + } + } +} \ No newline at end of file diff --git a/PhysicsEngine/Physics/Constraints/Constraint.cs b/PhysicsEngine/Physics/Constraints/Constraint.cs new file mode 100644 index 0000000..a8bfd15 --- /dev/null +++ b/PhysicsEngine/Physics/Constraints/Constraint.cs @@ -0,0 +1,24 @@ +using System.Numerics; + +namespace PhysicsEngine +{ + public abstract class Constraint + { + public Body BodyA; + public Body BodyB; + public Vector2 LocalAnchorA; + public Vector2 LocalAnchorB; + + public Vector2 GetWorldAnchorA() + { + return BodyA.Position + LocalAnchorA; + } + + public Vector2 GetWorldAnchorB() + { + return BodyB.Position + LocalAnchorB; + } + + public abstract void Solve(); + } +} \ No newline at end of file diff --git a/PhysicsEngine/Physics/Forces/DragForce.cs b/PhysicsEngine/Physics/Forces/DragForce.cs new file mode 100644 index 0000000..b199fb8 --- /dev/null +++ b/PhysicsEngine/Physics/Forces/DragForce.cs @@ -0,0 +1,10 @@ +namespace PhysicsEngine +{ + public static class DragForce + { + public static void Apply(Body body, float dt) + { + body.ApplyAerodynamicDrag(dt); + } + } +} \ No newline at end of file diff --git a/PhysicsEngine/Physics/Forces/GlobalForce.cs b/PhysicsEngine/Physics/Forces/GlobalForce.cs new file mode 100644 index 0000000..daa747e --- /dev/null +++ b/PhysicsEngine/Physics/Forces/GlobalForce.cs @@ -0,0 +1,4 @@ +namespace PhysicsEngine +{ + public delegate void GlobalForce(Body body, float dt); +} \ No newline at end of file diff --git a/PhysicsEngine/Physics/Forces/GravityForce.cs b/PhysicsEngine/Physics/Forces/GravityForce.cs new file mode 100644 index 0000000..ad9b6da --- /dev/null +++ b/PhysicsEngine/Physics/Forces/GravityForce.cs @@ -0,0 +1,12 @@ +using System.Numerics; + +namespace PhysicsEngine +{ + public static class GravityForce + { + public static void Apply(Body body, float dt) + { + body.ApplyForce(Vector2.UnitY * 9.81f * body.Mass); + } + } +} \ No newline at end of file diff --git a/PhysicsEngine/Physics/Solver.cs b/PhysicsEngine/Physics/Solver.cs new file mode 100644 index 0000000..852ba68 --- /dev/null +++ b/PhysicsEngine/Physics/Solver.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; +using System.Numerics; + +namespace PhysicsEngine +{ + public class Solver + { + // Optional: set a default number of sub‑steps (e.g. 8 for better stability) + private const int DefaultSubSteps = 8; + + public void Step(float dt, List bodies, List constraints, List globalForces, int subSteps = DefaultSubSteps) + { + // Avoid division by zero or negative subSteps + if (subSteps <= 0) subSteps = 1; + + float subDt = dt / subSteps; + + for (int step = 0; step < subSteps; step++) + { + // 1. Accumulate global forces (gravity, drag, etc.) + // They are applied each sub‑step using the sub‑step dt. + foreach (var body in bodies) + { + if (body.IsStatic) continue; + + foreach (var forceGenerator in globalForces) + { + forceGenerator(body, subDt); + } + } + + // 2. Numerical Integration (Velocity & Position updates) + foreach (var body in bodies) + { + if (body.IsStatic) continue; + + // Linear motion + Vector2 acceleration = body.ForceAccumulator * body.InverseMass; + body.Velocity += acceleration * subDt; + body.Position += body.Velocity * subDt; + + // Angular motion + float angularAcceleration = body.TorqueAccumulator * body.InverseInertia; + body.AngularVelocity += angularAcceleration * subDt; + body.Rotation += body.AngularVelocity * subDt; + + // Clear accumulators for the next sub‑step + body.ClearForces(); + } + + // 3. Resolve Collisions + CollisionEngine.ResolveCollisions(bodies, subDt); + + // 4. Resolve constraints + foreach (var constraint in constraints) + { + constraint.Solve(); + } + } + } + } +} \ No newline at end of file diff --git a/PhysicsEngine/Physics/WorldModel.cs b/PhysicsEngine/Physics/WorldModel.cs new file mode 100644 index 0000000..1bccd45 --- /dev/null +++ b/PhysicsEngine/Physics/WorldModel.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; + +namespace PhysicsEngine +{ + public class WorldModel + { + public List Bodies { get; private set; } = new(); + public List Constraints { get; private set; } = new(); + public List GlobalForces = new(); + + private readonly Solver _solver = new(); + + public WorldModel() + { + GlobalForces.Add(GravityForce.Apply); + //GlobalForces.Add(DragForce.Apply); + } + + public void AddBody(Body body) + { + if (!Bodies.Contains(body)) + { + Bodies.Add(body); + } + } + + public void RemoveBody(Body body) + { + Bodies.Remove(body); + } + + public void AddConstraint(Constraint constraint) + { + if (!Constraints.Contains(constraint)) + { + Constraints.Add(constraint); + } + } + + public void RemoveConstraint(Constraint constraint) + { + Constraints.Remove(constraint); + } + + public void Step(float dt) + { + _solver.Step(dt, Bodies, Constraints, GlobalForces, 8); + } + } +} \ No newline at end of file diff --git a/PhysicsEngine/PhysicsEngine.csproj b/PhysicsEngine/PhysicsEngine.csproj index c33b934..30e05c6 100644 --- a/PhysicsEngine/PhysicsEngine.csproj +++ b/PhysicsEngine/PhysicsEngine.csproj @@ -11,4 +11,10 @@ + + + PreserveNewest + + + diff --git a/PhysicsEngine/Program.cs b/PhysicsEngine/Program.cs deleted file mode 100644 index 62d3743..0000000 --- a/PhysicsEngine/Program.cs +++ /dev/null @@ -1,68 +0,0 @@ -using Raylib_cs; - -namespace PhysicsEngine -{ - class Program - { - static void Main(string[] args) - { - Raylib.SetConfigFlags(ConfigFlags.FullscreenMode | ConfigFlags.VSyncHint); - Raylib.InitWindow(0, 0, "Physics Engine"); - - Camera camera = new Camera(); - - const float physicsTimeStep = 1.0f / 60.0f; - float accumulator = 0.0f; - - // Main loop - while (!Raylib.WindowShouldClose()) - { - float frameTime = Raylib.GetFrameTime(); - if (frameTime > 0.25f) - { - frameTime = 0.25f; - } - - // Update Camera - camera.Update(frameTime); - - // Update Physics accumulator - accumulator += frameTime; - while (accumulator >= physicsTimeStep) - { - UpdatePhysics(physicsTimeStep); - accumulator -= physicsTimeStep; - } - - // Render loop - Raylib.BeginDrawing(); - Raylib.ClearBackground(MuiDarkColor.BackgroundDefault.ToColor()); - - // Draw background screen-space elements (Grid) - camera.DrawGrid(); - - // Draw world-space elements inside 2D mode - Raylib.BeginMode2D(camera.RaylibCamera); - Raylib.EndMode2D(); - - // Draw UI / HUD elements - RenderScene(); - camera.DrawHUD(); - - Raylib.EndDrawing(); - } - - Raylib.CloseWindow(); - } - - private static void UpdatePhysics(float dt) - { - // Physics simulation step - } - - private static void RenderScene() - { - Raylib.DrawText("Physics Engine", 20, 20, 20, MuiDarkColor.TextPrimary.ToColor()); - } - } -} \ No newline at end of file diff --git a/PhysicsEngine/UI/DrawHelper.cs b/PhysicsEngine/UI/DrawHelper.cs new file mode 100644 index 0000000..ff096b2 --- /dev/null +++ b/PhysicsEngine/UI/DrawHelper.cs @@ -0,0 +1,63 @@ +using System; +using System.Numerics; +using Raylib_cs; + +namespace PhysicsEngine +{ + public static class DrawHelper + { + public static Color GetDarkerColor(Color color, float factor = 0.5f) + { + return new Color( + (byte)(color.R * factor), + (byte)(color.G * factor), + (byte)(color.B * factor), + color.A + ); + } + + public static void DrawRotatedBox(Vector2 position, Vector2 size, float rotationRadians, Color fillColor, float pixelsPerMeter = 100.0f, float outlineThickness = 3.0f) + { + Vector2 sizePixels = size * pixelsPerMeter; + Vector2 positionPixels = position * pixelsPerMeter; + float rotationDegrees = rotationRadians * (180.0f / MathF.PI); + + Color outlineColor = GetDarkerColor(fillColor); + + // 1. Draw the outer outline rectangle (exact original size, outline colour) + Vector2 outerSizePixels = sizePixels; + Vector2 outerOrigin = outerSizePixels * 0.5f; + Rectangle outerRec = new Rectangle(positionPixels.X, positionPixels.Y, outerSizePixels.X, outerSizePixels.Y); + Raylib.DrawRectanglePro(outerRec, outerOrigin, rotationDegrees, outlineColor); + + // 2. Draw the inner fill rectangle, reduced by outlineThickness on all sides + Vector2 innerSizePixels = new Vector2( + MathF.Max(0, sizePixels.X - outlineThickness), + MathF.Max(0, sizePixels.Y - outlineThickness) + ); + Vector2 innerOrigin = innerSizePixels * 0.5f; + Rectangle innerRec = new Rectangle(positionPixels.X, positionPixels.Y, innerSizePixels.X, innerSizePixels.Y); + Raylib.DrawRectanglePro(innerRec, innerOrigin, rotationDegrees, fillColor); + } + + public static void DrawCircleBody(Vector2 position, float radius, float rotationRadians, Color fillColor, float pixelsPerMeter = 100.0f, float outlineThickness = 3.0f) + { + Vector2 positionPixels = position * pixelsPerMeter; + float radiusPixels = radius * pixelsPerMeter; + Color outlineColor = GetDarkerColor(fillColor); + + // 1. Draw outer circle (outline colour, exact radius) + Raylib.DrawCircleV(positionPixels, radiusPixels, outlineColor); + + // 2. Draw inner circle (fill colour, radius reduced by outlineThickness) + float innerRadius = MathF.Max(0, radiusPixels - outlineThickness); + Raylib.DrawCircleV(positionPixels, innerRadius, fillColor); + + // Draw rotation indicator line inside the fill (same as before, but from centre to inner edge) + float cos = MathF.Cos(rotationRadians); + float sin = MathF.Sin(rotationRadians); + Vector2 edge = positionPixels + new Vector2(cos, sin) * innerRadius; + Raylib.DrawLineEx(positionPixels, edge, 2.0f, outlineColor); + } + } +} \ No newline at end of file diff --git a/PhysicsEngine/MuiDarkColor.cs b/PhysicsEngine/UI/MuiDarkColor.cs similarity index 100% rename from PhysicsEngine/MuiDarkColor.cs rename to PhysicsEngine/UI/MuiDarkColor.cs diff --git a/PhysicsEngine/bin/Debug/net10.0/PhysicsEngine.dll b/PhysicsEngine/bin/Debug/net10.0/PhysicsEngine.dll index b3385642de683dc5853093fa80dbcca55932e051..dba7cc1a4a9f5522360b360b52f121a659b928f5 100644 GIT binary patch literal 29696 zcmeHwd3+qlac<4*?9A+e1!k87z!OVQ6juZYf~P==Bo2a7fdRPYVi($7 zP^3vvU~I`pd`PyVSWcWrTX{a8Y{gc5#Ii)$u_D>BpU-E<)^ijeN&J#LDT(cuI1c%~ zs-D?hfYgy+{!A7`Pgi$!RdscBRZY(3J{Tj-z!&$K8q`Vx}<#hVjA7Cray_% zqoJ=Y`K-3{YfBEC$P|+kh5T3{J)Rs+=W_W{^0=EUOy-iAT(Wmhe{wuO;dPgfDB!2>B|1>u{z~;^S#-g)0pC(Jrmf_j zE&-l%0tNbHuAbb0bGMh5?Ce7f~_so5gR{rwa;cE4bM_5Ls5bgkPprz;D&3 zi>RjxlokpW^Hy3B;0BlIj<^Ce3V1|p3)SSj7j1*)rVG;O5I{pV=QuV-#+Gv{IdReat zwc6Z0y){avov&eR%N~fd%%$cxzv)ezQ!sC|NPRHkRW1kXFKY?IF;@N{)xcbnSK{$_ z>QWe-oVtSwqj?%*0m^ zEoj$iJ9L3os8~AlThW)txNx|oK2E8nsPTMZyghly0X?D>8!x=_FMm`Ur_1#iydb}f z89WD)q+zS*z*)MUFgqe%%W;f?0v&4p+Os>m!_A|kf7KNM$?49hi3@cOS-cRq4v5^Q zKwU!vwt(D4MaYrygU(Ju~}psL(%aG@O&YS(6NAX5Zren?~WGX_CBiV)GkuIP4bQhHP>{cK26qB$Vi`yTc!X_{r z>-_Q=YI3YHxm5S7A!j?buubc{#0Kap1=g0? zOfy~btP2dqy1bdyId$h(mD$uOHZrq1mTjw=Sse&mV!eA*s@AEl%qH1gK@c@d;Ty(; zw@!}ZoJUIH8HOW6rr_iaN9vc*P;CsVwW~^fPMKjBOVm}K*RwLOZl%7s6FbtKj~?2BPW5BN3=Cn zgmDsOM(wOL-|E(`{S*)A^5!tdnR9+^nLNivA}*A5i4{njaH}RiN0H}P#Ifi5A*fek z4`f5^VGjQldsv&wSG{cPnPy9<>-Jal;L0_o)i*=U}9yVd?`2zt@F)Uxxz|R znP4eikpxGTStKfPLirzWrC1H1=m$}b4zq%2#q-NRU*1^*+4IjDSn=P)^L~EjynT-B zzh@1sc;x$dwl6V|J@Tx9o{z0hEbe$G&xt42QD# zHNmEeohtG+v3K|4R+F>1@%C1WsaOeQ)B?%l0DoKJ zB@Ras6|k?0=#{9^^{SY2{HQRW!_2>+m`i=DN{QxFG3OXF{RE1u(+Mx8pzk8DZN+%! zb3Y6UMR0hDjLdc-oywm!KTq^tYXtx z#YXBLn?`2yGAF$Cndi)_%ERU{;VzXRaa}Yr!vlC2e5auH z-n^L%FM4~=_n%%4GvAqCm50p-X+IC+I`K+%sgYGGn_nhC1YJ62$5;84<zw1D3dFA1k z-r8xUa1<9F@=U>R7Z-d>PwE!*Nf(TmNveT^sXo-38$R>Rj>~!iDcZ&lG7DKVGxZwu zC2%fxjt4B;t%j)KgAnD#?jhE0+@r|Okuyb~nXD@>zDKCevl*w>sgtGV!^!Z~>#eLQ zft03o9@KShlcScr!ed<^8EHL+W5RQ6F5b#3GdRm;pmwcPS?r6x*a}@OtcT8khtAb1 zbke;IhixwRf_Ljg7Vj&yg~Mw1^4;LmJyl*|NREXsb{(mag;zbPogkhtl2;ZlUMxqn ziD2Axf@gQ38JFGavIm!@TT^>+iCfp~O+LVj#R!fe^9$Y1n*cJvO!Nd>oaxx1L2gXc zwA?{XjfXhMiybpyh z6B=NPG%p9d^;r3CFk%%#B5XHbBHZUgq7WoPV`2_VG{-|6Od!#zNQ7iWNrZSV63y`? zk_>^I26ZfL`W0qTCD9y6gtX045+O#5L~IWB?R*mGON6iriNf|EHzpReY#?WW&j|sm zdhQD=bMNYMEPw6`?12O#s5f`SoRyDxQvxTr2A>mhdvJCefl zptYJ)6FA{U#GBI+XUWRPR){Tr40A_#f-Oo23CH!O#Jp5LCL7la@IVu(1H4XgL

w zDW+0@u}!4l$Xd`|0PbugUcH$}=^03HJm$>)$*TU;Aq@jlQ%dcl>ZcJa?$yuY zF^3`ZZdZ=2g%2^OJ5|RK#%O#g4DL9xVpA23%NjOjqCG%K=mL?E<6RsQhD}%xCVm!x z5l}9NtB8#O!ZV1gaAUx&XWW4)zDNvhxdz@M;PD}AKu_T*g_$~x`6}|HH)N10=r^-5HdDWLQ>TUc`RA<;cs5YUpP%dll8;IeCA1Y|R;L zBOY68Hd|RU=icRXQ?<)C{0q)nIuIzIN4= zZCUJ^77FoN8}cj`364X7YLzHvuB>Im2Y4}~N?F#B(vv+js2Xgq!SWsv34`N)+Q16o zv;p~`7$;Iy{QH)Eeh4JxNtX1gqX}IivYb16WB7E~PjUG?6A6QSbbj=QBoWyzucmHH zVP_b6aEiC6-u$tTesoI^CdR9)O3&Vu84e8$P4R|Y@m}aw#-EkpqG$bV0$l;f+||X& zhCC}|eZf-^Qb5NybR#7;{>p1mOtSh~$Y#9<=+kgvNI!X9d3vH8<@6EMT7w-AqF+D9 zdopzd1H)!>_gC9VN!lAV+^zM&}U7{eCB?mFZQnuVy}!sL`F86#NZt zE5u1C@sTO`86u|#xB8uTKwwt_q|d{N4dI_BbrqMY84e63;<^)8T==;$uOaSj#1CI> zhsf)FJLK~;PHW)N6LQ-_oiIxLi1AUC^~s>Ct?xBreasJmir>Px+GfP#-L9Wy3e2u+ zC|qSbNWfL5j9Z-!-)fHXGPCI?Yz;XF1a6 zLJ$-bwad*g@=Z^3v&rw8gcCI#k3)Cyn$!qGF_MRd>h75zF=E0rg?n4no!D92d!up| zcNj(`icNLT>h7A^-BTHqhYgv?onvPiM?rNS!8}J-q|;uXKyg5d`dN5CBh}6*2{d{% zD~)sbCTYMyx;*4KLjy>X=L|V<_=dR{=_sG% z1MIn#XYwSdSIirH<{sRr_~NKe@kR3e%6#Ftls-j~^3+?+`YhLnvMCqbPfl&0fi_Pd zQQTRsr$&J^wF5O?y)girHeg-xT1d_1dZY4MNPS{n$0U{*s#7aIzoUm&e7;)o1xVjh zZLC)$@6H0H=i5Oou?P@r$aNMC;hcTJ*)1%=Vm|Z7Jrr~2+}dj&WDKW?4_ypY6dh-= z+Q+Lv{u*p%@>8f-?QkL)Po_?w()@)R?_H1EvSrS))`*i#vFAu6ThQ$+s9rMns^cGy@Qws;LYmmZCvyyLrG_>N-p1oIMol1_8g zd{~2`^-n6T&!3@na^~Ub1n#01U@KnlT)$}wSj7w`5b@VxdCP(LapS|jLoQu%QpU}2YwSSufbB`lvQ zlab zhRPh)I&0xnKL8jscsDt1qN>Cyz-;BR*HQ2C>jQ~)r@e~8I%gen=iwRX?MD);tH(HK zSmR+V69?q1a#mLiM{+T5K)HX7>c162OFvJ%0ASOcpC^8iaG5^E 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 literal 9728 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 PA^)bTe%tQ&uxMnE)&a6Al0X delta 99 zcmZqp!r1^sEsR^349fjY8O#_g7z`Ma7*c^S4ahQLNMtZ&NMY9B2bqh5GMj*()RjtrbZ?JDb5pr diff --git a/PhysicsEngine/bin/Debug/net10.0/PhysicsEngine.pdb b/PhysicsEngine/bin/Debug/net10.0/PhysicsEngine.pdb index 7ff6390be17aaafa6c79e391d9223469f042ea04..e7dda7cccc684908f361ec609c70ac471328df72 100644 GIT binary patch delta 13872 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 K61oi82mD_U=X*y0 diff --git a/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.AssemblyInfo.cs b/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.AssemblyInfo.cs index 3f5cdad..b9339c5 100644 --- a/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.AssemblyInfo.cs +++ b/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("PhysicsEngine")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+5680beef02a5c7a4cdc1dc725326855b4af1faab")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+cf1f083cc54031dbb6bf827cde69ef08608683e9")] [assembly: System.Reflection.AssemblyProductAttribute("PhysicsEngine")] [assembly: System.Reflection.AssemblyTitleAttribute("PhysicsEngine")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.AssemblyInfoInputs.cache b/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.AssemblyInfoInputs.cache index 6b1a841..d4cfcc1 100644 --- a/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.AssemblyInfoInputs.cache +++ b/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.AssemblyInfoInputs.cache @@ -1 +1 @@ -65813feab20f3482f44a4d97f31d1282ff5b6ec731137cac82a3e7db08a5bb63 +44a2f7ef34c114c65155ce102612520c953e6a96d159fd0c9c3838e4efb4baeb diff --git a/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.csproj.CoreCompileInputs.cache b/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.csproj.CoreCompileInputs.cache index a98e6da..6e391c0 100644 --- a/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.csproj.CoreCompileInputs.cache +++ b/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -6b2f1f27b472d9ef51ad7745525496297fe0832151173bc3df4acdae2fd1d6fe +baeac40138d8aced527e9be06cd30c4fff093062425aa1213346799e177123c4 diff --git a/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.dll b/PhysicsEngine/obj/Debug/net10.0/PhysicsEngine.dll index b3385642de683dc5853093fa80dbcca55932e051..dba7cc1a4a9f5522360b360b52f121a659b928f5 100644 GIT binary patch literal 29696 zcmeHwd3+qlac<4*?9A+e1!k87z!OVQ6juZYf~P==Bo2a7fdRPYVi($7 zP^3vvU~I`pd`PyVSWcWrTX{a8Y{gc5#Ii)$u_D>BpU-E<)^ijeN&J#LDT(cuI1c%~ zs-D?hfYgy+{!A7`Pgi$!RdscBRZY(3J{Tj-z!&$K8q`Vx}<#hVjA7Cray_% zqoJ=Y`K-3{YfBEC$P|+kh5T3{J)Rs+=W_W{^0=EUOy-iAT(Wmhe{wuO;dPgfDB!2>B|1>u{z~;^S#-g)0pC(Jrmf_j zE&-l%0tNbHuAbb0bGMh5?Ce7f~_so5gR{rwa;cE4bM_5Ls5bgkPprz;D&3 zi>RjxlokpW^Hy3B;0BlIj<^Ce3V1|p3)SSj7j1*)rVG;O5I{pV=QuV-#+Gv{IdReat zwc6Z0y){avov&eR%N~fd%%$cxzv)ezQ!sC|NPRHkRW1kXFKY?IF;@N{)xcbnSK{$_ z>QWe-oVtSwqj?%*0m^ zEoj$iJ9L3os8~AlThW)txNx|oK2E8nsPTMZyghly0X?D>8!x=_FMm`Ur_1#iydb}f z89WD)q+zS*z*)MUFgqe%%W;f?0v&4p+Os>m!_A|kf7KNM$?49hi3@cOS-cRq4v5^Q zKwU!vwt(D4MaYrygU(Ju~}psL(%aG@O&YS(6NAX5Zren?~WGX_CBiV)GkuIP4bQhHP>{cK26qB$Vi`yTc!X_{r z>-_Q=YI3YHxm5S7A!j?buubc{#0Kap1=g0? zOfy~btP2dqy1bdyId$h(mD$uOHZrq1mTjw=Sse&mV!eA*s@AEl%qH1gK@c@d;Ty(; zw@!}ZoJUIH8HOW6rr_iaN9vc*P;CsVwW~^fPMKjBOVm}K*RwLOZl%7s6FbtKj~?2BPW5BN3=Cn zgmDsOM(wOL-|E(`{S*)A^5!tdnR9+^nLNivA}*A5i4{njaH}RiN0H}P#Ifi5A*fek z4`f5^VGjQldsv&wSG{cPnPy9<>-Jal;L0_o)i*=U}9yVd?`2zt@F)Uxxz|R znP4eikpxGTStKfPLirzWrC1H1=m$}b4zq%2#q-NRU*1^*+4IjDSn=P)^L~EjynT-B zzh@1sc;x$dwl6V|J@Tx9o{z0hEbe$G&xt42QD# zHNmEeohtG+v3K|4R+F>1@%C1WsaOeQ)B?%l0DoKJ zB@Ras6|k?0=#{9^^{SY2{HQRW!_2>+m`i=DN{QxFG3OXF{RE1u(+Mx8pzk8DZN+%! zb3Y6UMR0hDjLdc-oywm!KTq^tYXtx z#YXBLn?`2yGAF$Cndi)_%ERU{;VzXRaa}Yr!vlC2e5auH z-n^L%FM4~=_n%%4GvAqCm50p-X+IC+I`K+%sgYGGn_nhC1YJ62$5;84<zw1D3dFA1k z-r8xUa1<9F@=U>R7Z-d>PwE!*Nf(TmNveT^sXo-38$R>Rj>~!iDcZ&lG7DKVGxZwu zC2%fxjt4B;t%j)KgAnD#?jhE0+@r|Okuyb~nXD@>zDKCevl*w>sgtGV!^!Z~>#eLQ zft03o9@KShlcScr!ed<^8EHL+W5RQ6F5b#3GdRm;pmwcPS?r6x*a}@OtcT8khtAb1 zbke;IhixwRf_Ljg7Vj&yg~Mw1^4;LmJyl*|NREXsb{(mag;zbPogkhtl2;ZlUMxqn ziD2Axf@gQ38JFGavIm!@TT^>+iCfp~O+LVj#R!fe^9$Y1n*cJvO!Nd>oaxx1L2gXc zwA?{XjfXhMiybpyh z6B=NPG%p9d^;r3CFk%%#B5XHbBHZUgq7WoPV`2_VG{-|6Od!#zNQ7iWNrZSV63y`? zk_>^I26ZfL`W0qTCD9y6gtX045+O#5L~IWB?R*mGON6iriNf|EHzpReY#?WW&j|sm zdhQD=bMNYMEPw6`?12O#s5f`SoRyDxQvxTr2A>mhdvJCefl zptYJ)6FA{U#GBI+XUWRPR){Tr40A_#f-Oo23CH!O#Jp5LCL7la@IVu(1H4XgL

w zDW+0@u}!4l$Xd`|0PbugUcH$}=^03HJm$>)$*TU;Aq@jlQ%dcl>ZcJa?$yuY zF^3`ZZdZ=2g%2^OJ5|RK#%O#g4DL9xVpA23%NjOjqCG%K=mL?E<6RsQhD}%xCVm!x z5l}9NtB8#O!ZV1gaAUx&XWW4)zDNvhxdz@M;PD}AKu_T*g_$~x`6}|HH)N10=r^-5HdDWLQ>TUc`RA<;cs5YUpP%dll8;IeCA1Y|R;L zBOY68Hd|RU=icRXQ?<)C{0q)nIuIzIN4= zZCUJ^77FoN8}cj`364X7YLzHvuB>Im2Y4}~N?F#B(vv+js2Xgq!SWsv34`N)+Q16o zv;p~`7$;Iy{QH)Eeh4JxNtX1gqX}IivYb16WB7E~PjUG?6A6QSbbj=QBoWyzucmHH zVP_b6aEiC6-u$tTesoI^CdR9)O3&Vu84e8$P4R|Y@m}aw#-EkpqG$bV0$l;f+||X& zhCC}|eZf-^Qb5NybR#7;{>p1mOtSh~$Y#9<=+kgvNI!X9d3vH8<@6EMT7w-AqF+D9 zdopzd1H)!>_gC9VN!lAV+^zM&}U7{eCB?mFZQnuVy}!sL`F86#NZt zE5u1C@sTO`86u|#xB8uTKwwt_q|d{N4dI_BbrqMY84e63;<^)8T==;$uOaSj#1CI> zhsf)FJLK~;PHW)N6LQ-_oiIxLi1AUC^~s>Ct?xBreasJmir>Px+GfP#-L9Wy3e2u+ zC|qSbNWfL5j9Z-!-)fHXGPCI?Yz;XF1a6 zLJ$-bwad*g@=Z^3v&rw8gcCI#k3)Cyn$!qGF_MRd>h75zF=E0rg?n4no!D92d!up| zcNj(`icNLT>h7A^-BTHqhYgv?onvPiM?rNS!8}J-q|;uXKyg5d`dN5CBh}6*2{d{% zD~)sbCTYMyx;*4KLjy>X=L|V<_=dR{=_sG% z1MIn#XYwSdSIirH<{sRr_~NKe@kR3e%6#Ftls-j~^3+?+`YhLnvMCqbPfl&0fi_Pd zQQTRsr$&J^wF5O?y)girHeg-xT1d_1dZY4MNPS{n$0U{*s#7aIzoUm&e7;)o1xVjh zZLC)$@6H0H=i5Oou?P@r$aNMC;hcTJ*)1%=Vm|Z7Jrr~2+}dj&WDKW?4_ypY6dh-= z+Q+Lv{u*p%@>8f-?QkL)Po_?w()@)R?_H1EvSrS))`*i#vFAu6ThQ$+s9rMns^cGy@Qws;LYmmZCvyyLrG_>N-p1oIMol1_8g zd{~2`^-n6T&!3@na^~Ub1n#01U@KnlT)$}wSj7w`5b@VxdCP(LapS|jLoQu%QpU}2YwSSufbB`lvQ zlab zhRPh)I&0xnKL8jscsDt1qN>Cyz-;BR*HQ2C>jQ~)r@e~8I%gen=iwRX?MD);tH(HK zSmR+V69?q1a#mLiM{+T5K)HX7>c162OFvJ%0ASOcpC^8iaG5^E z>$)s3)rCvG2yqdqd0u;=A4KkJ%}Zs5*;EPGC%v38n?iCCJ{gS%W+(Uqs==+w@MSJl zc@i5?=TO3^%9p$*oDYRmzKG3l$j%Oli+6%9@{3!*Q~7u3w? z35EfLxAhO~bCnkGB&gpn_s2zgT&#A!)5kgUGA};TKJi)?w3$h2@F?8b) z$M2T2cCWh~-L>e(v5wa*r?}HksO5Bopla%rCY*T1Wx^H$kjxafNM4ieH{m8pkd;X} z4sz!Z0;(D)!l}bj#Ix4L@fjWM$fn#DWM>>U!z~M?7rs>;452s3y}>DN@~kW2%abU} zqnaR(YVvQ|e|v;i_ro@J6+foJMtIJ}*8`c2Q!!nyo5_ zaP&0aS)le2&Ypa?HQ(Dv90p}8we!PYZwtvCR7=R2=PXp4$nq4pkk92BA-K0!Y;Uhv z-d+h^W3MD4L4IuAx{RDiKsJ#R(PbAo$k|i?=JZ%dU~fje&9$Jtjy?=ug4+$`;guUA zW$;M57h)rdqE$;IFdHZ8wfL*nIaD)aM`9nzO@Oy06TyH7%6?6lJ}4VDVa07p)sv7l zjtrZ(nbgCMiNijrMjXqgXet`7iN_k^wJEr4WEY{A?WT?&5Z;3I$SXD;dA5Nba>CadUtcC4 zdD(7iIsYFN@IT1ksgcdQI)Vx-l{MEORu=5I3;x)N!bfpNBxvm+Kx|^zurWBWT2ACz z8%R$$0X!S1gGZ=ScW846?_dWKj?T@h34Mt<1n-ncwQ|}x*NHoGRJGoj`}R!ZnvheE zi%L)MVg`2DFLa17xBemIty-eNncJXhNS2+3nVYrwu4h};AZ5Z?Eyg{@(z`s=Q->(wSk#BWZW1GSY8AU$io zT#tm!e}5YqN?c!`Sl;n%n5uKVvs@`DMNZ0}tmq2bR`T57+~CWDEO6uRU>MaWS`dwg zc?zv9t;p;~xVnE&PmPm9wg~ zGUe2)Dc|riQzmCQa^dC9a_9QDXF6e@SJYBE^FbC_;KuK=p|A z)f=4-XQSNNAe+D`xg9ow)c!wc% zKGVAo6Q7IKreF*Qy_LzwjF?>w4}@dE7*3$8Fw9uE8XkzmB2{qIv5ctI;p;?u^yOV*3ea_$K`uM&iu$)x{b=a7d)^P5`|y zf-^w>peY{ZZ;@%D*~$9vWJur8ZyaEWLfs$k%Z;Za4ZkogGGI*3y{al3E>wM zA;|w*XvTS0{`GuSYZD-T76LQD{Nzp($!8ZlUBr|#YEzD7bvZ>!t;W&`)u<(%me<(> z{7PqK4PgQDTq;2Oz+--eho7F{WEDo&iQxf>EV?+^JS>F|gjoz9Gh*R|2Wi364)(+f z$)Cd#&|jeFbAszV5z@tg{0C9t7V_*-J%@v9!JJ(m*F%$3RZtV{x;(E_cxSN)>d;O< zdmXBxhil<2t>7)2fmeRlX9XU6!biF90Rp(mcb{rn4#flV-KT_s6%ZAQtI}JxP|V2R z1BTe1^>H(GFIO#Cx?`C64i<^f`bM~6+4zQq#sfSm-A0aL<IJ5;m0s^vr|4AdaAms;+ba1l*^Dr2muPu|>bTi^A=4H>Amtm%^7p!3Z zO{}V#mIMw9-^^7$>dmiHBx+J`VZHnm<8gS1hfHOa$>DJ<2*-nmLz{+hWU@lTAf0Zd zr8#w+q0{v={AR!Ye!7&_yjXWZOTJ&#%eI5}#Fk?+@}8Jf(2(*Qq$1BZZewe}M=$<1 z1e;<^z4%tHGLBxv(MNdd2B~hr6sE9`{O5Goc-(RRW)#a-Ca#}z*~GbpS-cU&vT1J3 zza67F#_0re@SkVnAkYlt-+?ZeCpLC1Ok1_x$LO?TYqdzZ`~=#{F04&I;NhO zd5_P$z?OOd^l+=k&-H#6Rf?-Xq3+RR!NJsf(8|>C0!1&Xev^uXg6#3JYxs6G;>Gn7Qj<p{nawR}Ppb3wGD*1L|rXtfyK&>a8N(fc)q0?;r+Bee|G;fJB?0M#L; zHwpA`fT2ZLn+y2b?*fA{7sD4{0On0GhMH-O^vwlkH+nXZ2L4TerU2b2eH*;Kn}p_Q zSYd7!=)Z|%%W11%wn|?MzGu!*%jGvf*`)78xjY44CS^ig z{y=a7F|L2fP&jgpyc=($^(>$Vm7qfn}=KCm{!d(79>L07+`un8(SB>kF(z{pZ`maJ< zj@w)wm9kIDEmHQQG-*7>GQ8g6@&TDkx50B6lCoObw}`ZlNclz4!`Gx#8enbI(>rUQ z3+_#_iQZ2o`+3aejY}AMfF6zgRZyo733NZTM_vqC^jQz8HTJ<~cqATa-MgM#w92A|(9zVlvM1{(>}Un|J|Wb{ToOd+J;ki{O>7;5pLuV^0! z=4J&^OCW59>4XQp%?z3my3d13M%awf(;jrLrp~OP(;N`!UaAk(nYHwy2mQvbGaWjB zc+P!UtItLeB~G0DUyvX1UZj#55nENbLq|jDF!k zduq2?<5W7L`aTfeV-@N10;w65(4o;kAeL+N1*8Hx-3(tJz+ZzwT1!vh<|Ig;Lp;{# z5F!Hn2wF7y5fTWEwn_P*v|K>?pb?ikO$er{uL=2>I;r{zaM5UAtgcR@9aWT%0aK@M zfm(q6JX+~3id2iDJW9!+Fjs@iOib1LL(E0@FgId$I-NoppkE4w6tXUz9);wp#UPs# zDa2K7=UmChw1KZndqCO^`Z**C67DJxll~rci`r4Q`AI46K<1-_=Rp~vZ78FZ0GAs2 z3g#7~E0C&I@%^K2&|>r&^u9=4U6Ae<9V#18C67|v zv6_(IFO?*p3)j`@q=|J^uWt?L81x?W24Mqrbte5tC|9rSOW_~`CyqZ3${*d^Ce}f3 zrj5o{)DMQYq5NiG7s`~i59MY3Aj;p+5tRRkGo~flB58lKk*03#!!=`Q`K?$EtG8%4nK$|feT_ELHV)R$Ei>IJwt;(URV1Z${s1VNI4MTmPwOK$L8|= zAufNYartHG{c()znHny~EH3+`{aGpB2mA{%$0zAHa;|6SjD4NuSNMm za~GwxKZ_N$jP`@j87-~Zk!iI51>FP8pUBv_c8_*HZPY%4a;=o#A+Em|{u7M)XZ?%7 z|A*M0Y2QT4pQF6rs>3PhQT;Da|5@m7LFeAu>p*!bI*oFpJ&m!ap`T}{4>`s&bdP-# z$`8bP^t9G)zXtWE&71UvqJb!V#rl~ZrT4`C7A?FA*U2hmv=7F<2<}#GQM*o7+}In<7_k=CPJNSjb5@#<<6n(jq; zP%tx6o~AyuoD-aB;MnvA+KrZb(2M+&`hy{Qga%MPD&=SCcGMrE<0voD7|K7TEXt?p zPL$8mDU{!!vnanq(@^-h%RZdI!p%(z`)10CO9~P~M7rn>Ol~_9G~_ z(Mj54Z$lKh!~TiXe+%4sPtS&Z|%lw@-~Ddk_Gy_<7?q?q(kG#>RoWKq z?b^4r7qoxUexn8Ss6JO;sPEAS_1gk>2L5|sp3!Wy8@)!xIAxqQ?l#_FJZpT@_%}S4 z3Lq93_^IJfk6U@SbU0tg zj&$dSPvi^Tv@<`P&iX)4e&kFy?eCd|)l-etLyXl!+tMuZnqJ23A1=6V?m%8BqiK6? z1T0IeJuD`f{h-LecHZxrI_DO}p~rZmzUv)Q5S{{`8q_ z=D3oainAM3FZG`(mfZ2SZTV~#`h!Y~Z8y6hni*DXiv6W@2|)MA2<>-A!042_(=AN& zPq=`F^7-)!#8d9g6nSMwsCZX;Vggq*l+w9jxBt$`bOG>AH#b%~;X{4JUHQqP+cQ}z z<#T%rZm|fIz9LrJ2f9V7ewW2VUpI*6Mt0;29J*j~?ww51+)L z1Ld4rn9P!xn$3H&4u)-OvwXA1+&M^jJd4${plPk zdkS*tA9i8&nf%Ul0gW&{7()J}t4z>h(Ui>1BUbdLGw zM%)5R4ICI*rU)C`p2I!?mlJ1-nc<=bc^ihhhleM}C$nj+u2O#A_{3zk2vt-%4zMnA zrE(7|(g!jg`r%A&B!5@`iTq@CWLq{50!l3|9h?{eb=ozVg=MFUrCu1<7`ODg$0x_e z+(J(wf0w9_ji2QnpU7n0f@}CApO)?%eyDMpa@yV>+1AP^NAOC66N{2s!DW`L1 zDjlAkNqZ@CJd?$4sr2@rJktZ;C@xFFgz}Z_Euh+b;ZF1+IPj&Pw*wosIG)2NTsO-; z4Td_-mr+R6pLv~2%J#TcFM`;{FQS0z^X0LKBANd<_*nGt}>QBrsDOm28vI-5NXuR;i4s~oig3lo;J9GQBjbyX5ttXFn_pw_1Cv}zoM{tnX(Z?0F=cR)^ zKkdro&(q}D$h5qpH-fk?(B493+^^>+j`n6wiGLx~4{~y_oA)(Lp7z53 zz|Bj2f1X1c8iCb6c^u6WV#>?rj(VXG;raBoe4(HMBke#?^vA(1XQYl@dUS8TsDO$? z@Aem_y2tZSv->1|lxg^uS#D6uErSz2GkEq=rZg#1R0UB)&nl=le^*Y$Q>pPD&lhDD_VkIIQkXPcSy8L2j0-do!oqY;mt!*yUm&F@u@OAbX?3>7DKWYc)2i@jf@12D#JM~NQcu$oZ(4kB|>y`*=NoV(rjv~QV zL8|O!yvDrhgBdB0dkgZ)6CgZs6qwlzl!`6mC#;_GsIQyD4qOa2Ga)VKi??+TA^l9} zO5}T_iigDRg;y!@wjSG-cSlD-oZ+I%3&pCoO~Rj|4Gy%T7ccl$HB|IOo_j>fjU1cv zF^P6+-l{sm`8e*{(zq```>%;nBPN$zEKBmEFR#Qudi z84(Dxy9*8vS))oLsSkHxUUksTX3=|M^=Ue>=Cq*igiUN$Ri=X~LWlGykw>s&eOpJB zq2u^HvHA>1obf_r`V10oEX~aY)Sw^iI&{HBsw`bVm8D1(yYUR)79Y>23nREH3&N)2 zI#yTGTckgM~w!mpVhM=>{J8u2uzvgfK?XkB;4?gwy zKT;q`nvv8rJBY%W%hebcL4gNDmKl#mqq?q}g#PK@F)5(gb}UGmvpr^*&h&#gZb8R` z&h-0mA`<0i3h30FJ}J}qE{ik$ehk)ek*4jzq^^M`nM}fQqfw_XZ0U2IeOkOOUT4mY z??MIVOWcwmQ*{_gO0cl{4c1%?j?bC#)968sasHX3egme{*J&-e8e5H3xc&BaB@HZ6FbE3xe;UZpLw$-lb+G2_Y!deu{iv=uAx2+(vz;vttUu??|mM$u?8ZMIn2Byb&EDld! z1Y?OH0cc?c!V=mM49Ht!W-=f=mexOeKjxba@w<|``-A6eSocrVk& zhnd)Zn{ZTYD~LWFjGU|@I@dW<1%aN7gO-#8Fy#c6lTX%y(h`)=FhGap zVHm(LTjC_(gch60R(j6(J=G$xwQ4adXZ`h*jC%46_ zgB8lUvuQ{r6;JsMEVI;;@uat+DYcHcu&+oeD9M|%ufYn-bg_TfY^UGsU3k0jJR-bP zxD{R}YFX;a)5Cc(6oppUaELdS(`P@@dGv1QyWvgP@lW@lnC?XJVmFG5-3EVQ8pY17 z0B`9r`0u9}@OEV2H9Ru-|EVzeFPRy5W%r8lDK4hDn8U>lTr_cUpcWMY>ZD9cnX);= z$Q1BanKv1~DOqkxvR>kKQYP81#V>R0Vzsc3#&`Vzz=Tj|3HzMQ2ENag=E4o65E4^( zppo);`4yNWRv3R;k*x*q{%UyOa6qp=Tu4vs#xdXNVRwRW%nqF312qkJ7UNT=M)TTs zZ$E(4(M4j?iklfewc2uOb$eSoD8%N-i6b(^?g@7 z)|lS>PkjB4PM`muZ~nJMU!MH*PcQ}l^KV>F`q0el3srb{y%;OJ{j@7*HRHu$EVnBM zO)}=nGD>#M9Q|L=e_0v(5+i{oDPks0wx^@HZL%Bo!Z(Z~S?7&@77I#2>xHlTb-3))OBOY}CcSC8k7Uj;U1iU;T^?AhjeK;2lGT|0n z?yJTi(QHbm1*e_-pLMwFg5Sd%S}}~>CihMg!s85Pl*XNuE97V1z0J6Hqh1;7^XkP2 z9C3&Y6Og4M`4B)B=qnyr%frFpf{ z2r#pl6+#qf?8Nvn8O^hwz&$E!Zwz;<{1#vmzdME39_4uZE}6^Ip)( zLyk%4sZ=F3+jaF_@=QJd7QP9f0i$~CY)w`4)B@V0c>8M^|N1%xfcvB3IHDt^NujJ7#+WFHV>(q_4DWYv0bw2%}IV5Jd)1l zbMBVrGj6fDb8AhwCcGJkYw{c{2@<*DmgdPqZc}migo{(Rm3Z8OQ?~qQY2|Q!d{eqO z-gatrb8|p;VYG;uL!{|0?BK(=6k_yXX#27QoYk(Nb{n+zC(FM{w413eV`q+~TXGy4I(f z#HT_B5p`J3{dc;j+-x$-<(B4jQ9b@GG$$uBIIqU(fXS&=%AA_ZQRrz9@1ZIQ9Sf{O8la{|C5UeAWN} literal 9728 zcmeHMe{dZ2b$`2ew|6?7WUWp%HvXaY8JokBWl6UDE0V3BwiPTR`()WN26=V2k{93I z9=mt46yc&Y{7MF1&An!cVU6(J1F_-7Vy`Dc~sXn z{#7kKUG>WP??{JUSwC{dbhLtPP1$-*OY8Z(Rn#U7%`W9NGq3gEl+tom#%QUjiC*Wa z9v&b%Bn9YCfA;7-esBLo396P_iPnG+rMA-i@16ZUgS^LWAMCqSp~ zCaM$vOQlD;B6JRVZ(_Wg=u*gImKUdqVxaHZO*B%@|KD(J(R3jh0e!HnO-s?3DT03O zS^(6Ev3hoc5|2i7y2W(PHxLEyI=p31H>_{5jjRPhwv|rfWnI3Lf%4N$)GLrO z@D27W9=1)U5dAz!bOA1tKu6u)xcU=6>*P5^EVwx#2hI!Rq@08zUXBxN3%j9PH2xT`WF&turZ&GFVCbzx#aQYE+c6ZN?=iGW6v zs{vw>W{u=)ys;pcqvsJF^fkvloUZ{Od5%X~Q`J04E0b&emhqq(Y#yK_w~2?;kUYl? zlL&h>uAn_PRTX892P51ms)XV7P$|^2lc=eRJZBQ^`Z_xUWB#Zw9@Z2%I@!qW+0=MM zjWoyQJGkW?8WlE@x%K7xsw(BG)#|Irjg3;H zmV~LEbul&8+=wWM=(COGp>vakk{cji9Y!Of%hHO=QoKg3Y3?AnizA$P<uSZ>c zSv}ps4K^Njo4C!#V9EzQC)tbjo<%YvQV^ zHm`zPuAW-dH0R2(FY49$<}ATZP75!>Zn)<(?q5t#fwI|;`DVM~ZU8-TCOmOQ%fw}u zEzBj^n`E2eE1uhT%Df(9F1gb->dx3|boNqj*-~&a7UBN8Z>|x+c59M1prd$DTUfVl zT@t}m;-Pv)4b4G!6h)I;G^1#|F}VdrefX-i+9Mn|7Eps?tW~#g;-f>Pj2!1IQ`AV+ z7&GHFO}CO-;|Y#&;Hz%VCR@gt}b7)Xob4M zwP>ZfQdrdBTXc<3re1Sa7^3*d6&5wXq6W1g>{_%+T_r5iU{U0jI3}}i(Y5NeuqYZC zV`hAH(+*Ns`#r5u*OZTa&C=MryVbBi_SKOS@zv^TZ|rN;wOgL^hJ>E59QZx0Q`e!V zYV-tVypelq^n23WF=_soJOteGo*L0pquS_=X}!9B%X6DWE8Cu;)VUiNVzj$Wk@mh&=A=uoktcS*_4vijsU zG_MXfHYjFea;&joxybY6cD6(8MW2GrIG$iHiYkpOGp|=Gjdd9f2R0giJ*KSl(Hh0$ z#e?BUl^S$7+vA}oQbRoU0KI`0I6|n@*qiKN?JHK;&|OIGV8THciW}_eU0;MKC1E9Y zGPrhr?`0VqRfM;Y`MohxA{G=W6poyzZdy)>&);`nXA-*^I07H5_K?dV&T?#NTYj9} z#l2_?_4W1c0CB2{l46CqnPS1cN^%dglCTL7+aB|AkWeVu$t+5Cp%9xEYsKcc=fuLo zLUJ!xZpQy4iSaZx@Lz=+6W)Phb8qU?y^=WLxaXzm?Jcb>+gi7^!5a2*7VtHAV#Dtc zbz+P$n71KSw9WjK!x9Iv|DHm*;aG|u2aYwBHXJxM*pKpQ&~M40d$ZOAXnsIS$Jc&M zs=_$vBWW8U?J!hvj6*l#=!a$;U&1&D2OGlC2V-{Skc6DCq7CERmgwbxTPoBh|653* zzY*|;0OPMqe;zKG*T3c{z4j^e?<8f;BbiH zlLDtOA>nbE%aNgkU+XTu*rJp^MVXsLNdEQc>s#&{L#?; z;ID<=i}ZwOyC3*h$)vvpoD#5Jzz0GvqE(ypD&+rB`4N2`R{bmBbAdX*kLW$X6`^0C z_8H~B0aqxir03~1r4jIeGzZQf1U3QRDQyPaL#=?V#GDI)f3LIy_zTJ=DTY;`A233L zfH67@SVt+q208(_l5PQ9LlaUJbYvH4S1^Q!2gWukluBSBpNN%BO;4N6Ceh#>rehIjN)_~tc8v(bG z0r)AJ0qmpC0p3U#08@g0GhnyS_Bo+Pl324OIrOruNvydWetALOind=yghJ9XWIV5S z_tQ^Nyb*i{urBzX;0915BkTDM0R|~d!FkTo@@Ez#c8|s9Q_`)K0;1+?AucNAdUz_3 zLI1@C(WsFwT6Q~i4q2H}*4T?r>OMVZ*m`?E9WaWiv~3vq5$m{RXER_8;q6`gOTYeVn3fK zEw*5%T*)ibvQ*UrN9886vm<7)yv2xaBSvCO=Pdi|lKj9-(a1Y+>~8X7gtLaehb#D=VzBHyci08(VQ@|X0fbR+Pavbi{3FN zd8&E>J(-Lta9%owEypE%k1sOZ(JYc>YeMA;(Qlp0gM;NkV660{VOyBkdagiN$Heit zCy&{PnNDmorY@%Aq+ZGv2az>)!OHT?b0rVz`3&YGrAqdso;HT{0*GOA#>hIuhCO6J zp4g8A6yREZxqaByN`S^HWe>eiDUG;Jl*Y z!(~6teN>YJu3^&>ytqr9BnyAJMY(od1I-Yv9me@$mK>a?(tsKbP#&i$6VMRb?BV9( zRkOrZc^EJ)Di zOARK&31*__BmBoWWFrwM_Y2@LyhJcRzh}Ejc*v?2K+$zb^ zI;sssr5HwCTZIEqZ6p#=k5q+~DsC>Y`UpCbW!NmKv#<;;Yhfx*^H0UX*JV@E6GMH!3z~BZ3 zjSLn(eEC9f;mwC$4K56)-VZL&m%zL2*-6AhLy85H5M?kFNJ2HwE}3+9pwpAeuUM>}s7bjLFt^y(7I--=5B-+cN2$?H$|NckJru znAomQwoU5#1g43&bl{tE@c_YfiT~Wz@D-AVhGo#0AM_^fBHqN+y#H_`z7yb&xnW$9 z4CB(b{NX!@^5b zN_N^fWg7*{IpvLhi+jxSNsqE7ZaXD>aVl>V*o56T(`^ln zAMV}tyT8`bUkBg6%=+DzTe~{H76TmP|+-OPorse&xAo`fah;&fyo>#diR_=)XqOEUrKUz50IoXCng^j;X zM=O?7Y0=(M=&;2O?2oUFT41OD67}N;BT0CuC}i`nHCtx!ukNb_cL-Vh;kp)I{03G-=(dvx3cY(o?7x#6LruI%!gJ)*udW;uy)wmfj)Pl+>SDXw@tvEsO!MpNV{m$ z0ek`yI$E{i)$un0PvDnY5vLx+#(~ZpxLJ5i!+fZW*peL_Gu%7(5xwh91EJ^rXTR6E zZzh-3aDe6yh^_>7tb}Id(^dvY*RI5|k^NhCB{Zjq!?>Qc@?j-swt|?ED@lea6V?&X$~+wk^k+EN)3#xjnj*Yng6KXgNJ^P8v?p-*-iSP^M{% z$_6tAzU_;%6*lpfn$Ysti@Op-v)H+Dsuf>4EqbAl*y?I1+9d}c5|h>^w5L5G+M#d9 zNSAE%>CxcW#_c88X=HGeoyJ%Al;M0rt=oL98lELR*p<>HK9U?Vrj4wYW!RO_ox%LH zb=I>FLAYpL<=2Nj>Wr-k^k%tyi(eH+^e`?VVc}odAK(t$u{~M}yz=LE_+77P?fn PA^)bTe%tQu%kv)>@ZVU$xr$Dk^QQ)rvl~_NlG!d*=5GxuWln_j&h|IluYNoS8Xu z=FFMp_sc5r_Yj;@(cCmeJ4@o|IKl~ppCH_i@H>Rh5Ynf|QD{BLeuSqH zK19eYjid1h(-F!`EwlmQN`wOlcb8ge_Y5mNh49-MHX1Y2M(*=%^diE#xi&gfW}~kW z=9b&&UWAzyHu51HMfgdDot{K^MTT1c9Q1Alh5C{COrZD$iIlrQpp$ABI%yk10HF;b zjBq=`O9*cvaHW&dE0bVCNi+@NXk{{eAf^C~#UaQ@6G3$v$3a)?fcp>>@-3jc{Q@M! znF)w$BeBF_k)|IHLOct>ihL_7kYBwGW(k~Y;y2P$M$|)%Rm*Ffj%@ft@k912`!LSD_KXvr*p;)*P6g0R2SbldPq(X%knRpm*+BrBq2FpCph`}!4K`}TVI1@P3 zU*UKpWW_Mt2%HVP(QMEQoCEAOu^7@|;2ING1Lp#7G4UGUJYcVhbAa<>uykt(#f8o? zNW#z{+_ zj*MYwHt|l_{%pic5k`?6Q%0O8(WS6@!4Y6F;JIi-a1=NN*k$5&VCg-aqt5RHUW54K zfLeJnTh`eJOTJi6aUo2Ujd5)3W@&{hOdzzPNg1UA~3O0;VUMN z1MWh6Cc-4-Tg`l#1(Si}O}q+tN(>$bToi+4+7-uQ@qbfe6M#$L3;Qd?I#07=@<#yA zj=|4hNCYQ90P&J{nm7@74DbaezY};F;=&{RNx!ut4+ma^ zY1`j`YznGk@UMXv1Lv6?kR8$ztR}-XhW^EI$S(mF&Ga5@SkWLDBhzu|3?0<*4=~#m zT@4yX?|{cbyOD0CVNi>W#(~;tJklLB4K$vrkdi<(h$m7P>T%Km&?Nc^N+pvMxha%w zf&HaYJd)BVi0pJa10gc#a>NJGmx%vgnqLiWhn~doddLzmaiw{gc1{vgPNGeq$@F{B z6vF0;LaF4$BaJ$cluj~XGH5#JAd<J^|C z^6SFSgU3d9f!gU&PzN=EGoF41nt)BH^z~PuNpuZ_NTvgbr_ep1skA|B^dZnpdKD>I z^aW@(h5C?`rwin3rUDWs7fCv4QJ5y_cn3sbx(T9Sr>ljFKy=b^rtijM`8VmI90JND z=}Ol_)Db#cDbZ@3eFQzjmRdI;jald~kkm>)2DQ;b-TNyMchJ+I@$^FokwDL(Y$81f z>ZF@cHi@<)J((6DC7m{EL9M!eX~jY(P>&U*^#1EMEyP#4XEJhe)CX#T=MpCI5Xtlm zcv5I2noOl~&@>tZnoh-_8I%h;NbiI)2^(do_ut^prb$T8p{1aMDU2rbbUpc00*wx# ze~SGNrGF#4faah{mo7Gp#v^+;tw;I@`ViF>(k8^m=)z;^7UWK#6{v2aPML&5g}7l^ z^QO>lG+abO!Cy?XL5Z%{{k|CdidKUsjz*yd3w?tYLr?;eV3SB9>I75l2*uIsS`!x_ z*Gjj6+UR+t*eQrg9kPAI5J(LP^mD`$wLnSq282kaceKvtAUBofpyo6hiW<`Canz7O z_krew=n#qxCNYg%5*hQT8Z=+ah&3JsaQFgMbUtVtT@PxZItXjk9^HoJR0Mh!)PZs$ z&iXgg5oH*43V^f?&^K3V@Q^fy#wrS~8y(HELY_^~kuwbL|I?VwX4JQaeI zX*8&!5xV(NpxDcyl%i1(#iCaYJAI0HypAW(BPg3lCqR?QhT5>;=~n7&XkSqxKpefQ z3r|DbN=LwIBOGJVd?8XCv==GyG*&l;Vh~~nsM4k4=pMu^+Gkj`W3lNj5mlp0=!)jt zk9eFG-GXjpS*J|A%f5IHfZN`inGxp(_Nsar_Td*mbxr9y1jHB=*k(JK%ba#95j38lb}z}ejD`O z^T}$XujaTw-h2+_^#UH3IqIz#b5e0<=-1Uv%@cMl2 z0Qj5h8$Ec|_=82X#T{%aq84zwTfyDvZ7B02Qs;5Ew4sQ|QLGy;*3zsu9vg~{#*1ll zvC*=AG;Il?GMIJC#nN)IZn>CR!0m1Yx6yL3(Q-fQRI|u5@;0)|h$gDA?oZBT(B!UZTIu&TG?^(rf6x=u zAXJN1YZkg|JTj*GS?fj58<0>NaBp4c4end-1~`TM99-H zFxm}<-K;=OUL=d@m~l+FeqGJ4sqy$cdZr*P7BqSqJn$Majxj@uI#Ey17+;x?3j;G4Z9hbw*6OxW?Z| zJ1~V-dIF8Ktp(XeAGd1-RBxAg)#R-y(@uiw{mns-HsJZiTOb^Hh3FwMY^vNNGV2;E zya5thl&6?+g}1lJIywa9z#cs1exE-;TYP>{=%TqEGYb|&u)Z2kCG-Jx0HSAT-4iq> z81z%&*$TH2q|LB4@dAe8tGz$)tn{{ed_hC`F*rDo6>Q#I9`g8nCMQOtKicRIdPVzY zj-i8oHh++sFui?MhI6AGu$eV=-kNO3 zJxyAz@&xTQ%o!Gw$1l8}+>ntXnl zYgp^lKc?5;@X0T3XdLhU=*tU-AG%_Ce$V44-pv2<&^MQyUgxL`xEnDf!T55xw16AM z6Z?y|g`+O}Kc4+ktvo&NZ%@5E{MI8=pZ$$}uWh@r6Ce6Z8W--$f8^gczIu7h&*L$9Lh#k! zDLUQN`B3Hr&zX%MRZZXV;_pxP-1X~O30)mk$JTD?UVY$`+-cr)OeCK-2-{uI0N*23 zI0uA|YKYnu&!W| z2@wCbERlO6kGo!5(=%+}scY_!FMMX>>EX#QzH#xvN7q-M*)?L($yY=FxaFWtuT(*& zEDAb$P90xI<6QgSJ-K-M?)xSV{l&ib|8z^{f2KIb4?lePr88-vnfreK_UXU2CRgIk znA`XL<>$F>ex}y?qi^1{=iYc`^>Yz3wy{#NO4uJT(yvX_ni&0j*nMSD;D;a{QnYQGO&=i7RWKH+kv zymHf55AM76nG0{3{CcGPv0Gnnt9WGF6*t|pbN-p0y4&7K(r$5?ADfAD%6{Qm^z|p% z*T%hEcJ+TJTh=YUbZ_^^;g;X-b$qjb$m7ENqbyB+*IREs_5PTYWzF6ScVL@#s^^sMz1%ju z_f^|0NBd9P?`wa!{i)t;`-LXx7}VQlUo_ds>1c5k&K;ZiyYkoejQw(D#>L^+cmCH` zuEFc)3_p=r_nW7O-tuxQCv$xC%HEIcO{!@6y)};LsIg(WoMdM_(_-at&^U!#iK%io zUZHU09Ad#)VX(qEHMRGdsh3SnR=^oT(rh^PEKxXM4iX+#xOW~g1LcrBbSX|!nZkwS z-Y+LLhEl5Au!z-9THcJ=Ez^9pyUpj_ys;*j$9;Ra?-2L(ao+>n_Z0X22lt)kzAyRC z1go=q_wL#09GSz>c#a-a(PvcqpH*~WDjXA6LgqEfF+>{C2}_ZXq8xbRrrP9n4X;9i z-Qr*hIcXeN6wYW~2eSQ4PLq*IU0#S|b_%g$t;JTwRguT!Kz1R@4pul@p!YV)6B548 zh6{{gI15VW@S<-YUIEAn(@EK)w(vp0IDI-PN8@7_Ty=~D4oNLZv<&*CT*-HxWy0N= znTCp;CZD89IisEm8xC|h!a6Bm*OGwT;byKA?{E!1rwD0EvixiXXcxtB1L7o{9J7oH zmrC|fliO*;vIL@ANmM4yX<;-A+H}e(H_J$a_$G_)xb6+^MVvHASadga1zHWd0*D3u z>ug=hm%sNR!b4fDzvpI{;=UNWm z&yl-1dNYUGujkG|ylXCZUBxL77E2#s8&0`OGS$7rf;4nJHchKYkGL+jLRbc%9zLxJt+8d2 zI{@dM9X_2q&w|kmX?1HnSMUJT*#j^>Apyp3g%Wq*idQ+t8LWDEv>`0Sm5O0}dMu%A zyu|iTvZ0LJjoWEyj(gnMIpH*{eLU4CIP_`fb59ZLJ!-{xvID zE){4Nt;Yc?9;ju&z*dP>fG?CpT8Fx$)n;N6%@I}Uy7V;BQvkO&S;jojnmQ*J?$OL0 zXhgH<)^$v4xm>h7V8x-yQci135091_&?)b=v(8SyB$_Yf266{#)ymU-(8?Q_%NPMS z&tVUT_i^|wj{Je6FLC=XxZ@k{e2I7clDopZJJiD6V|kB*_w@1JmAv;;J}{RLw(z0T z+&iDI`V(LM4?a@F*RJBDeSF>Le0>!kYvCW=#QV~D-%_;?S1Gu=N*f~&XWB%06s8yc zFRuH}1bA;@Ny`{oi2E|v;P`QNN|E=kjITs&7Uft^>8bFdaB*oeUn5bl^EgbneAWBL zxjA$ncbws_#k~7* z75zK6PviEz-2NPQEL9y@s(q~L9K)S{?tGSa#qq8#wQH5?tW{kR?)oL~&Q)EHs@j#xg;rvJ3zZQ`&{Komy$}QY6jQ24Ef5FEDSn#%(=P4l}E3RCAbshNk%RNl#$4{ z(r_Dcak&O7l;tSSqHrI)0IP)5 zx9yD8L*l|-=!{P!msl#?b)xv#LK(Hhc*Bxukc^cRpIRAYxhN2I>dnX?w6sDw3MC;I zAA0a$Bos&icnSMi@oXH*;_@sGAHmLvM}Q|^Ins?WnrX%G$j3vn|I(v|yX!*RMd{>{ z7vXvjF~NpBj8{CB*ziJN7QX8;$aIC*H5b`1kZ>Xi;(X(&%z?Bm3K#q6PdrVLLCXtC z*HF96O$r}Sj(H+syvPkjz-pZ@y?FiH>DtVv=f4{>$ayThxP`#Ri#?B8grnL zRi+xtk-|d^6{Q(-WTwK45`0sob%Bj2S~F{#ENX=RA0)$;dbT&I=tua+BH#-galk;M zp&;sFnOPHMyBBYfSIp)Ln55FN7cc=vJ03%hHlQDvhqN|N-Yw6^ha(m$Q4S0Ip@ZpHCl`9~ZS^5esn34Jn0;V+DDyt*L*hy1F?_({-dI7PP7-Dhh z3cR&ma51*&v_$VeO6I}n?PAM@fMVVK8iP;H#I6P(5TW60wQPhN)u z1C7y&w$nCK(K#aFCapHnEanbWA|08HkKZf{Qso$wCo{}UhOSF3)oD~JU4ZsoqJ5WP zg33Ky>ywAC%P~$qq3<4joN{|HpM;iC_S^u+tKh7#_rUal15OtQ?2zG4mI2m&#ZHT@G|Dm^Uzb=6Kb9vG9V3pp6_4?^v{_}L z9AURv@ZynE+j0z-&EXF?GK?cna^!OrzD-3+A`|hU3x`jlv02g>3?*3;)hgb8hyyQ1 zF*+HvQNf5uIni9A!br)i5{norLypM{r!GW0^>wiS!IWcz*x(#S#agt%YJm2~ zLkeYMi*3|Ms+59NVw!l>DNddvr6<&FxI6bT$vn`Inx;*wj=Jd$6pu?u?EQGl$6zFfRR5?UhC<|%QL^C!82DWTR zOF^Thl++qDV(^?RjiERjsj5lX_s^@w_RefIRQf!TXAM-}Ah`RkdHEIx|%FV714ldJe07>ud*ZXZia; z9UNsp^j`d-_ZWYNcd5g_=H9io-ksdLQ}zBzUG<dt{7~ATmhzu5v0o|E1NQ8 zAxCder@K(^w2DSu;xL?OB9&;bmQ0tJ@?=0qA(Q>`DW*VG5MlBnS-m#u9VM@+p3LE> zTFT+OZILdHbg9UTwkUCwZ0(BW?>6qZLA6)fb{*qg$5i;F9PTalLU}mtV>NQ%hz#VI zHWm-7eJ1`>LS-dF=n&4B+P~pe!*q!l+|jaS7!LKZ93-)0!ho448+c!R%c&io9>;vJ z;B=x>b(vvEfXNJ$f#T08GZrj3j^g|cZRuL%f?&FGxI`bRL(y_VJX>*DGXYl7R#{+* zGG2xmCk1@HDx;5GjFWJg5hqJsGSw?=p_c301bo;-6CM3&*dptD`F!k1R&n^Cb}DTg z>En%&_w`ZoE$+xW--T8tK#r->3Tm{<-pEP#w;h~bZ5R?9aN((BkTLoWIk#lfY}sT$ y=nT}oj>CsJ@(4$t=IB4Uee&30y_ZfMH}-qqG2EGug88~eyUHgx{Ld_G(f$WN`U z!|(HmZKTMzmxv0twpyU*63`L@ewb*51~$Vsd0e*6cDIZV#}dI!h1*Ru0(-BtYqr-_ zLr;M}Uk<*}?v%}L-8k{!g;m#U)ydJtt+ACq(7v?i5{R@rb6@0m9T8en9?}SPWB}#? z(q0SbfmA>X$VAL3GH}Fx^y_?|49J2^pahTsS&YV11GbF>1)+zb&qBWooz6_fET|iL z2>Jr_m(WaqE@7GmVoI3a1l|HJ0go?bsxu0*8)Il3@R!HXFxE&u6v;uQB#HwBFw5m6 zV(^>g>EN0@ALBy(}@mTPWVTUn(BtZ*DDn@<@&N!s&z~$qE zPx3VIli)5uay|I#uv?-$6MQvFX5(4lYr$vZ2Jnx-H%Iex!9N9Gj`1T6^Wa#4!DbWk z!S4iLj<^m37J$p=6(AmKUKr&S;0fTxQ9cpnCD_Me*pC5;h?hq8b!K;y=5SvY66A9Z zU^)XCOXHAQ@<7Jn-4i9#DC7eA4N?w2`+`JdjWM(wbJNgg@W)a%Y%Se@9Y;y9b(9jR zSqGUwIgp7|2RV(7Md+E23m&=H?)MhMzJY`%D>5%8xZFMP1XKhsPB)7-x@|e69_1V;XldZE= z>2CSYw`<0#H`_XQkxQ|gJ+=c%v$N4?l(Yq!;FP^tf$SceBl*m^?}s>b!1cr_*I`-O%Py z)QcI#iDs+S>+oW5r%Tlu%=YxZQSjq;mi!aWCBEBM9DQbsY3i7MS?Gj|r+S~}+S9+D z?fXNW&aKe-FZ+M;U-4g6*X8Ywl0dEcLSC(LCK7nH;M#86!ed#Bn!fnGqx8x6A?26A zhUEKl4yBylbnmL~I}A5i1P`g1`5s<5_Hcf1v0h$)nv^9{C8ZdpDoQI-CpLA}#y6RJ z>^93Dt2^1$qqpg<}MEH z5P@wXSdTe#aFTn=xL*{sQi_oALI>isg@e!RkGAWKG1{!efu|GIw zXf(6$4EIg(;1&*zi{KURy`6i9x%VRX)r-Ci(OW9|OSr#_`#Kr&<)Jk^^oSU`#elDa{pYZX5}}KuMnV1|YQZ0ZoNp|ra|4y&&x3D9MxoFN zD%7Yo7Q>qV*{x*Ob2Iz<*+0(yztY)%5}U_56mJ$f9hC~)61nOfoAz07H*0CW79vI9 zVoB4$ifmS41uhSG^qXfqu}MRr(3+drALhV(4m=?O7e(-A5!jN5*TNNO%^F-Zu-C(G K61oi82mD_U=X*y0 diff --git a/PhysicsEngine/obj/Debug/net10.0/apphost.exe b/PhysicsEngine/obj/Debug/net10.0/apphost.exe index 3cb9bbd3ff3fd27503560810df92ed5e49ff16a7..e21da492c535c8d518ce0ceaa75a9364a12bc297 100644 GIT binary patch delta 99 zcmZqp!r1^sEsR^349fkJ8PXUGf!Kh-g29*}83;`oOn^LNplAw15)hgJaT-w8h`}5v do5GL^6tM)75ItsKon~O&sSK9e>&uxMnE)&a6Al0X delta 99 zcmZqp!r1^sEsR^349fjY8O#_g7z`Ma7*c^S4ahQLNMtZ&NMY9B2bqh5GMj*()RjtrbZ?JDb5pr diff --git a/PhysicsEngine/obj/Debug/net10.0/ref/PhysicsEngine.dll b/PhysicsEngine/obj/Debug/net10.0/ref/PhysicsEngine.dll index e7b76a4b0f08441e8e81e46c2d3d2e83b17c0541..291dbc573e03f9ee5c310871bbc19d8d244bd1b9 100644 GIT binary patch literal 9728 zcmeHNYiu0Xbw0B@yIj&MnxrH@R9hZVPNG=WiV`K6QYnecm&{s}7`_y{ZK&bw-PKsL zGxW?XP0B&Vw0;zbi>L`K*nyD>G2#Y6TN}38Dla4{3ONp(8bQ$_ty@HZQ}>m^fQzEA z+lKwlnVH?CA}2=vHT6()?s?sF&$)B&xsTQOedj1mL^|HpRiaBM`56%S)4>YF?YDiU zoi4V1cgrR1=y$hFpRxmE!S^b@Sv4%vb-mD-SB7764cj$_k53s@ucQj=*0tRpo1PdU zI;!dP!XJF@pOen@;z{Gzp=>lF322Yw!K0?$X z{~BdXMk;h^mgqR+Cy8Fk#LVVmg(wgDY3SY3%>P;V08y? z??i2YXs{5fr4Wpc8v($OKFOkNdJK49@B`lhPhvO;gmpIKZF&Y^q2MdWgCfU7D|pd| zlza@J{0yL7LEZ>UeH>B z&^uZ$#r|&s*@br(UT%66FWcf}r5i7=dz_>B<#=_xYyvBi&NPSrNNPNrrLHu?Ck5_I z9muYy&!A_rR1%JpdMll!v+3{YS$ZwS@JWGxEO58*X9RyotlcBEh6I12rL4En-)0Qh z-vCYY#SoBvegf>Uz4BK7sNHP$Q^e&?gv5y$;$Uvh5<$HJBD6*rm><+Q{M24+wpzT5x#j_2xLo^+cZKS2WWQX!ORkRW>4lJz;ERkz9IM*GiQN+TW9H4at!}dH1BR<{P&3A zsBm5vo&Og8U#8i@S;5g3@Hv5Z67weoRsUl90D z#Q4)9{SU!U2>!gz{Lc$~T;Php^MLS5qBx*)i(eDpUewszR|GbDb+h<$Sl~YKxhOD- zh@-oKp2(f2i2-yN{Vx5f{#ks5h&oS4a~CiUBI?nbTC*CpBvkG>`cf11BmKE1s;XaX zP;2Yae`%K*GSV?Pa*0iH(RQ86eX!+X6ZJSXQ?Jq28!{?t-)f@%Bz=im>o(tjtgTMH z(DD+-bsQ0`&%8wI>eSo%OBmUSY^(k%b=IkM+N;!6ryfI3tdFV7+I_i8P1N6`^$m%p z#J;hK`fH5dsD;bK^=_(DT<_*4%^zUKHEZ5lr&x1yOr58fv;Ro9CH1iHd=B$3iD6JE z{<1`uGcTvLy6j=`EYUnqpUu4m89!;_Fa0)cjj79;tF2-dN3zSBt!1@n=}*&TZBFad zw%2`OD|gmgpUm8-6%tC?>rJTK=d(MJd}BXzR!d)lTB}KJuGo;#BcS#q^(db^qV26y zn?UWWQ3>9%wv{Uq1Gr^0ntkJ$) zM~6m_iu4)LKL|WU--op{jkjD|`Y1H7CH+JAoTA9iIq^KgpN4*lZWrI0`3*cxo3Lu= z#F`qtA+RCU#Ab@vewqSEbvl#n=*Uo}uBj30YqY%yMy+4TbabTXdg;&R=)Me&PTznu zgC6MUKsFU?kxmrjyXh?It;G4M6EK5$#P}A#Hmm`R?+5IlqQEhM9}#%3KvSSC@BzRK zEdy@Es>bjsKn74VnodT0(&H{d?!Sa;k+)KG}?1hX^o}N2>y)V=@hrVHO2g)6xX_-v*s0nKg9avrUo+1 zIVtc$hIPIva7&hJQ43p0W1Q&tTZff_=tZhwWbVnF0enC|3wTEh!*j&&2Uy>Up3Oc6 zSZO(@rBE-8(TuSNn1u!2xwHc2QKn#X9pDaR_7oK`KJ*nHmCer=K*m=G!rnxWu2m53 z4H%tQ>$S7HSJiz>^g7{37h0C*s2zkSchRh}LeJk#{o`J#=BPt7S)?N>JmL9Hspwj# zJikasJD1KR992{}H|8!XKTu!JjX!4^Mg=Pq18rKiQc3{psszgQ6oKjo`Bztwl$2A55mKY~I+YLv3uPWhFRfVTK zQLBu4zNP30_Uxt;;l+goXE|p3=As?OL|HUP+!7-4PAeKz72A#RA=|ecMP=MBscE~a zk|-u?Zpb7@V+ROk#6=}V6Q`B~+X`Z;Xj!#t%`xHnG0(4>&RBJ!<^&31)dkb0TS3Rw zCG2EE*s=P|LJ2l#yyl>T%pe>_e^i(=QaR?5U`_JGvk4zF#R?l0lYT&Z zeA(3ype5xi*HTH+(}cMmA($0159+f*<_JY& zk3@u|p`5kDv`})uiLOxNHf2WM=Xq7KJje4#+**}Rn7)g)$4%R%5#RTG!KP}KrGg;B zmF2l5(_a>9!ndn+91}f^J}XUnJkLG19-b=434unD3`E4qW5Nq;AsX|xn1t6Xi6_g| zGK^cNRJVcb6&agUL1>4y$bnET(6EhbQRUNA%`cmlnlKkYNcK|>qZ9U$a)JrvkE;;m z!dg>?>gd1OlYi#EPzbKVT7 z(nz8K4LQp6#mgYhF+3f~b234R?M)>a zK&UtaP|>Ym5%g#IcK{^EXg5PYaSxm}NYf2X%VhvMH!|AJAd`Fk@Z8zXziK;xv&6Rt z_0_JfE`4?L=FR#l9{oiID-1R;_%MUp7_7eiopbu?_doL&`s&2goBAp}3Eur*E$cW+ zV7Etf7+_!^mCdKKoiljH(%G(#mh8r^d$q1@scb7){a|g&kfz<*-bxv*J(tUOj_C$< zeuTjcT+XwLc_1lqd#1%mX`M5jGg(85oRO9?-y%pp-$p4-TIk5*o=xlO$Y)UFmYcGG zAleMQ%S73wZee>}=8Z;1%SROi8j*XsoIw#cK@8FF5NKfg+Bw!amd{f*YM$}ygvcX; zJlfWv(64XfPylAq+bEAWmD`rsjS)j`CUbnH!p~;D`LZkmoB5kUQhm>)_(9og{#?&Twwy@fzQ`*x%P=}Ivczzvkm+m#s?a7GnU+MN4z=2KeD7`MXUxE zIz!2N%hJ^kVE9F9|8HRmcdkSR(F)&@PoPB6^h7t!eb?Z#(n^zNghu+OenJ!-#a_Yv z$GMY4{V0>CKfMR&EY7lXfFm>sYz)899s@lFI2!$0OJCRD{Bd;Vi)L6C0(T6{XxAnSa73(g8!R1`x{24r;9)@& z9~Rd5_|t6kAZciIe`jICm)4T_cHu1DQ-8Tl{sn@2C=^{6zB)}Fzk6E++;=$mBiyB= zVB;w2SEM#azkn#Y_bP~&f7>?j9+kF^$9#^O+e+ePD(a>8(q`1p6R_pMj~e<5hM?30@Nq_zT|pFa6cMSPn8dR5eS&|?PX!`d&_@Poe_(cf7_|I#$*-~8$~`VTKv z9RnL-J_sJ{MqchVaH7I~(5)Qoo|zuq(bsJRp^1ZnDpy%>66t(+JiB}s2dwA zVaJ4R#~Pn_;pjGS)Pe)!%e;ZX!J3z`g1NBJy)&{9`n4eBlk0o*XLq;ML)(F}YChVG zX>fdnqaQ9nO4t-F;-p+r!F#mYn^-mQH0)qevE&$YR4ppUa2Ou!HiPKm!tXX}HVzHg z)gJ6Fo49j`gAyYTiMWQ3KZQR=L+4XpkdtJ-j=ei7jIi+ zpmYQ!ydcc0#zaXpF(iP-=y)^HH{yd5Ux-f{qlq!bs87c5OjXCpuGtp(qqLD88%s z1*Fwf{vYcp%GFB@U5`ez=?zT1m7$MnDXktW^ft;j=_;3?c0{|Z0mN_$kJmJ=@E`3I z#<=&DI4c4;qf1+mn%wUwZBp}LYW{mI53jca1 zX=pNm6Gow8O;00dm8TCFbA^1m=HhN_+_Ej}(0w95YaumPDqFMN2P(y~RFg;NN_n%i zub9ghEleKIxI>}d#fu?BxZ9f6xvw@I->^Kx$`-hYyj@f&l6EOC75DY#=ALB!q*W*- zEoaOsTMl+Bw;}rk<*`aWVK_5;?Sk!K!mjn*?(muy8WUE!l4IT+_hgk|I5{`i(!S-H z3U|geb=US>!g%@^6Jw8I&g2}sQp_Z*tl@^&hIUL?C(9|zw2K+TnS<1lPJUL(s{H?@ zbz9cu2Q;r=^ZIme&|lY%;690Ay&cqq@bj?>?hpDs5TdQ2u2b5HVZDCij8M7y2_D5sA(VYXaSh~;1_GAqs&DWC;k9)bb#l70v*qB&)+vTbb zOF6y}Zq||`i$Aq?2{)p>x7e^Ds*lI8ljk{tG%VIEr6})Y3?{FG!SinNe4D&}lKr&B l&`ZiWG1fFa49@CdGg#A$m%@(bi`V|2jz6mYXBHwW{snu-Kq~+M diff --git a/PhysicsEngine/obj/Debug/net10.0/refint/PhysicsEngine.dll b/PhysicsEngine/obj/Debug/net10.0/refint/PhysicsEngine.dll index e7b76a4b0f08441e8e81e46c2d3d2e83b17c0541..291dbc573e03f9ee5c310871bbc19d8d244bd1b9 100644 GIT binary patch literal 9728 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