diff --git a/src/Detach.Demos.Collisions/Services/CollisionScenes/CollisionScene.cs b/src/Detach.Demos.Collisions/Services/CollisionScenes/CollisionScene.cs new file mode 100644 index 0000000..9b56e64 --- /dev/null +++ b/src/Detach.Demos.Collisions/Services/CollisionScenes/CollisionScene.cs @@ -0,0 +1,21 @@ +namespace Detach.Demos.Collisions.Services.CollisionScenes; + +public abstract class CollisionScene : ICollisionScene + where T1 : struct + where T2 : struct +{ + protected bool HasCollision { get; set; } + + protected float TotalTime { get; private set; } + + protected T1 A { get; set; } + + protected T2 B { get; set; } + + public virtual void Update(float dt) + { + TotalTime += dt; + } + + public abstract void Render(); +} diff --git a/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInCircle.cs b/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInCircle.cs index 3ac1811..db445f8 100644 --- a/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInCircle.cs +++ b/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInCircle.cs @@ -5,44 +5,40 @@ namespace Detach.Demos.Collisions.Services.CollisionScenes; -public sealed class PointInCircle : ICollisionScene +public sealed class PointInCircle : CollisionScene { private const float _pointOffset = 64; private const float _circleOffset = 128; - private float _totalTime; - private Vector2 _point; - private Circle _circle; - private bool _collision; - - public void Update(float dt) + public override void Update(float dt) { - _totalTime += dt; - float doubleTime = _totalTime * 2; + base.Update(dt); + + float doubleTime = TotalTime * 2; - _point = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset); - _circle = new Circle( - CollisionSceneConstants.Origin + new Vector2(MathF.Cos(_totalTime) * _circleOffset, MathF.Sin(_totalTime) * _circleOffset), - 64 + MathF.Sin(_totalTime) * 32); + A = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset); + B = new Circle( + CollisionSceneConstants.Origin + new Vector2(MathF.Cos(TotalTime) * _circleOffset, MathF.Sin(TotalTime) * _circleOffset), + 64 + MathF.Sin(TotalTime) * 32); - _collision = Geometry2D.PointInCircle(_point, _circle); + HasCollision = Geometry2D.PointInCircle(A, B); } - public void Render() + public override void Render() { const uint textColor = 0xFFFFFFFF; const uint backgroundColor = 0xFF000000; - uint foregroundColor = _collision ? 0xFF00FF00 : 0xFFFFFFFF; + uint foregroundColor = HasCollision ? 0xFF00FF00 : 0xFFFFFFFF; Vector2 origin = ImGui.GetCursorScreenPos(); ImDrawListPtr drawList = ImGui.GetWindowDrawList(); drawList.AddRectFilled(origin, origin + CollisionSceneConstants.Size, backgroundColor); - drawList.AddCircleFilled(origin + _point, 3, foregroundColor); - drawList.AddCircle(origin + _circle.Position, _circle.Radius, foregroundColor); + drawList.AddCircleFilled(origin + A, 3, foregroundColor); + drawList.AddCircle(origin + B.Position, B.Radius, foregroundColor); - drawList.AddText(origin + _point, textColor, Inline.Span($"Point: {_point.X:0.00} {_point.Y:0.00}")); - drawList.AddText(origin + _circle.Position, textColor, Inline.Span($"Circle position: {_circle.Position.X:0.00} {_circle.Position.Y:0.00}")); - drawList.AddText(origin + _circle.Position + new Vector2(0, _circle.Radius), textColor, Inline.Span($"Circle radius: {_circle.Radius:0.00}")); + drawList.AddText(origin + A, textColor, Inline.Span($"Point: {A.X:0.00} {A.Y:0.00}")); + drawList.AddText(origin + B.Position, textColor, Inline.Span($"Circle position: {B.Position.X:0.00} {B.Position.Y:0.00}")); + drawList.AddText(origin + B.Position + new Vector2(0, B.Radius), textColor, Inline.Span($"Circle radius: {B.Radius:0.00}")); } } diff --git a/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInOrientedRectangle.cs b/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInOrientedRectangle.cs index 3638651..b7f65aa 100644 --- a/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInOrientedRectangle.cs +++ b/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInOrientedRectangle.cs @@ -6,48 +6,44 @@ namespace Detach.Demos.Collisions.Services.CollisionScenes; -public sealed class PointInOrientedRectangle : ICollisionScene +public sealed class PointInOrientedRectangle : CollisionScene { private const float _pointOffset = 64; private const float _rectangleOffset = 128; - private float _totalTime; - private Vector2 _point; - private OrientedRectangle _orientedRectangle; - private bool _collision; - - public void Update(float dt) + public override void Update(float dt) { - _totalTime += dt; - float doubleTime = _totalTime * 2; + base.Update(dt); + + float doubleTime = TotalTime * 2; - _point = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset); + A = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset); - Vector2 center = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(_totalTime) * _rectangleOffset, MathF.Sin(_totalTime) * _rectangleOffset); - Vector2 halfExtents = new(64 + MathF.Sin(_totalTime) * 32, 32 + MathF.Cos(_totalTime) * 16); - float rotationInRadians = _totalTime * 1.5f; - _orientedRectangle = new OrientedRectangle(center, halfExtents, rotationInRadians); + Vector2 center = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(TotalTime) * _rectangleOffset, MathF.Sin(TotalTime) * _rectangleOffset); + Vector2 halfExtents = new(64 + MathF.Sin(TotalTime) * 32, 32 + MathF.Cos(TotalTime) * 16); + float rotationInRadians = TotalTime * 1.5f; + B = new OrientedRectangle(center, halfExtents, rotationInRadians); - _collision = Geometry2D.PointInOrientedRectangle(_point, _orientedRectangle); + HasCollision = Geometry2D.PointInOrientedRectangle(A, B); } - public void Render() + public override void Render() { const uint textColor = 0xFFFFFFFF; const uint backgroundColor = 0xFF000000; - uint foregroundColor = _collision ? 0xFF00FF00 : 0xFFFFFFFF; + uint foregroundColor = HasCollision ? 0xFF00FF00 : 0xFFFFFFFF; Vector2 origin = ImGui.GetCursorScreenPos(); ImDrawListPtr drawList = ImGui.GetWindowDrawList(); drawList.AddRectFilled(origin, origin + CollisionSceneConstants.Size, backgroundColor); - drawList.AddCircleFilled(origin + _point, 3, foregroundColor); - Buffer4 vertices = _orientedRectangle.GetVertices(); + drawList.AddCircleFilled(origin + A, 3, foregroundColor); + Buffer4 vertices = B.GetVertices(); drawList.AddQuad(origin + vertices[0], origin + vertices[1], origin + vertices[2], origin + vertices[3], foregroundColor); - drawList.AddText(origin + _point, textColor, Inline.Span($"Point: {_point.X:0.00} {_point.Y:0.00}")); - drawList.AddText(origin + _orientedRectangle.Center, textColor, Inline.Span($"Rectangle center: {_orientedRectangle.Center.X:0.00} {_orientedRectangle.Center.Y:0.00}")); - drawList.AddText(origin + _orientedRectangle.Center + _orientedRectangle.HalfExtents, textColor, Inline.Span($"Rectangle half extents: {_orientedRectangle.HalfExtents.X:0.00} {_orientedRectangle.HalfExtents.Y:0.00}")); - drawList.AddText(origin + _orientedRectangle.Center + _orientedRectangle.HalfExtents with { X = 0 }, textColor, Inline.Span($"Rectangle rotation: {_orientedRectangle.RotationInRadians:0.00}")); + drawList.AddText(origin + A, textColor, Inline.Span($"Point: {A.X:0.00} {A.Y:0.00}")); + drawList.AddText(origin + B.Center, textColor, Inline.Span($"Rectangle center: {B.Center.X:0.00} {B.Center.Y:0.00}")); + drawList.AddText(origin + B.Center + B.HalfExtents, textColor, Inline.Span($"Rectangle half extents: {B.HalfExtents.X:0.00} {B.HalfExtents.Y:0.00}")); + drawList.AddText(origin + B.Center + B.HalfExtents with { X = 0 }, textColor, Inline.Span($"Rectangle rotation: {B.RotationInRadians:0.00}")); } } diff --git a/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInRectangle.cs b/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInRectangle.cs index e33febb..cbcf305 100644 --- a/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInRectangle.cs +++ b/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInRectangle.cs @@ -5,45 +5,41 @@ namespace Detach.Demos.Collisions.Services.CollisionScenes; -public sealed class PointInRectangle : ICollisionScene +public sealed class PointInRectangle : CollisionScene { private const float _pointOffset = 64; private const float _rectangleOffset = 128; - private float _totalTime; - private Vector2 _point; - private Rectangle _rectangle; - private bool _collision; - - public void Update(float dt) + public override void Update(float dt) { - _totalTime += dt; - float doubleTime = _totalTime * 2; + base.Update(dt); + + float doubleTime = TotalTime * 2; - _point = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset); + A = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset); - Vector2 center = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(_totalTime) * _rectangleOffset, MathF.Sin(_totalTime) * _rectangleOffset); - Vector2 size = new(160 + MathF.Sin(_totalTime) * 32); - _rectangle = Rectangle.FromCenter(center, size); + Vector2 center = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(TotalTime) * _rectangleOffset, MathF.Sin(TotalTime) * _rectangleOffset); + Vector2 size = new(160 + MathF.Sin(TotalTime) * 32); + B = Rectangle.FromCenter(center, size); - _collision = Geometry2D.PointInRectangle(_point, _rectangle); + HasCollision = Geometry2D.PointInRectangle(A, B); } - public void Render() + public override void Render() { const uint textColor = 0xFFFFFFFF; const uint backgroundColor = 0xFF000000; - uint foregroundColor = _collision ? 0xFF00FF00 : 0xFFFFFFFF; + uint foregroundColor = HasCollision ? 0xFF00FF00 : 0xFFFFFFFF; Vector2 origin = ImGui.GetCursorScreenPos(); ImDrawListPtr drawList = ImGui.GetWindowDrawList(); drawList.AddRectFilled(origin, origin + CollisionSceneConstants.Size, backgroundColor); - drawList.AddCircleFilled(origin + _point, 3, foregroundColor); - drawList.AddRect(origin + _rectangle.Position, origin + _rectangle.Position + _rectangle.Size, foregroundColor); + drawList.AddCircleFilled(origin + A, 3, foregroundColor); + drawList.AddRect(origin + B.Position, origin + B.Position + B.Size, foregroundColor); - drawList.AddText(origin + _point, textColor, Inline.Span($"Point: {_point.X:0.00} {_point.Y:0.00}")); - drawList.AddText(origin + _rectangle.Position, textColor, Inline.Span($"Rectangle position: {_rectangle.Position.X:0.00} {_rectangle.Position.Y:0.00}")); - drawList.AddText(origin + _rectangle.Position + _rectangle.Size, textColor, Inline.Span($"Rectangle size: {_rectangle.Size.X:0.00} {_rectangle.Size.Y:0.00}")); + drawList.AddText(origin + A, textColor, Inline.Span($"Point: {A.X:0.00} {A.Y:0.00}")); + drawList.AddText(origin + B.Position, textColor, Inline.Span($"Rectangle position: {B.Position.X:0.00} {B.Position.Y:0.00}")); + drawList.AddText(origin + B.Position + B.Size, textColor, Inline.Span($"Rectangle size: {B.Size.X:0.00} {B.Size.Y:0.00}")); } } diff --git a/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInTriangle.cs b/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInTriangle.cs index c65456d..b34b5c8 100644 --- a/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInTriangle.cs +++ b/src/Detach.Demos.Collisions/Services/CollisionScenes/PointInTriangle.cs @@ -5,48 +5,44 @@ namespace Detach.Demos.Collisions.Services.CollisionScenes; -public sealed class PointInTriangle : ICollisionScene +public sealed class PointInTriangle : CollisionScene { private const float _pointOffset = 96; private const float _triangleSize = 128; - private float _totalTime; - private Vector2 _point; - private Triangle2D _triangle; - private bool _collision; - - public void Update(float dt) + public override void Update(float dt) { - _totalTime += dt; - float doubleTime = _totalTime * 2; + base.Update(dt); + + float doubleTime = TotalTime * 2; - _point = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset); + A = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(doubleTime) * _pointOffset, MathF.Sin(doubleTime) * _pointOffset); Vector2 triangleOffset = new(48, 24); - Vector2 a = CollisionSceneConstants.Origin + triangleOffset + new Vector2(MathF.Cos(_totalTime) * _triangleSize, MathF.Sin(_totalTime) * _triangleSize); - Vector2 b = CollisionSceneConstants.Origin + triangleOffset + new Vector2(MathF.Cos(_totalTime + MathF.PI * 2 / 3) * _triangleSize, MathF.Sin(_totalTime + MathF.PI * 2 / 3) * _triangleSize); - Vector2 c = CollisionSceneConstants.Origin + triangleOffset + new Vector2(MathF.Cos(_totalTime + MathF.PI * 4 / 3) * _triangleSize, MathF.Sin(_totalTime + MathF.PI * 4 / 3) * _triangleSize); - _triangle = new Triangle2D(a, b, c); + Vector2 a = CollisionSceneConstants.Origin + triangleOffset + new Vector2(MathF.Cos(TotalTime) * _triangleSize, MathF.Sin(TotalTime) * _triangleSize); + Vector2 b = CollisionSceneConstants.Origin + triangleOffset + new Vector2(MathF.Cos(TotalTime + MathF.PI * 2 / 3) * _triangleSize, MathF.Sin(TotalTime + MathF.PI * 2 / 3) * _triangleSize); + Vector2 c = CollisionSceneConstants.Origin + triangleOffset + new Vector2(MathF.Cos(TotalTime + MathF.PI * 4 / 3) * _triangleSize, MathF.Sin(TotalTime + MathF.PI * 4 / 3) * _triangleSize); + B = new Triangle2D(a, b, c); - _collision = Geometry2D.PointInTriangle(_point, _triangle); + HasCollision = Geometry2D.PointInTriangle(A, B); } - public void Render() + public override void Render() { const uint textColor = 0xFFFFFFFF; const uint backgroundColor = 0xFF000000; - uint foregroundColor = _collision ? 0xFF00FF00 : 0xFFFFFFFF; + uint foregroundColor = HasCollision ? 0xFF00FF00 : 0xFFFFFFFF; Vector2 origin = ImGui.GetCursorScreenPos(); ImDrawListPtr drawList = ImGui.GetWindowDrawList(); drawList.AddRectFilled(origin, origin + CollisionSceneConstants.Size, backgroundColor); - drawList.AddCircleFilled(origin + _point, 3, foregroundColor); - drawList.AddTriangle(origin + _triangle.A, origin + _triangle.B, origin + _triangle.C, foregroundColor); + drawList.AddCircleFilled(origin + A, 3, foregroundColor); + drawList.AddTriangle(origin + B.A, origin + B.B, origin + B.C, foregroundColor); - drawList.AddText(origin + _point, textColor, Inline.Span($"Point: {_point.X:0.00} {_point.Y:0.00}")); - drawList.AddText(origin + _triangle.A, textColor, Inline.Span($"Triangle A: {_triangle.A.X:0.00} {_triangle.A.Y:0.00}")); - drawList.AddText(origin + _triangle.B, textColor, Inline.Span($"Triangle B: {_triangle.B.X:0.00} {_triangle.B.Y:0.00}")); - drawList.AddText(origin + _triangle.C, textColor, Inline.Span($"Triangle C: {_triangle.C.X:0.00} {_triangle.C.Y:0.00}")); + drawList.AddText(origin + A, textColor, Inline.Span($"Point: {A.X:0.00} {A.Y:0.00}")); + drawList.AddText(origin + B.A, textColor, Inline.Span($"Triangle A: {B.A.X:0.00} {B.A.Y:0.00}")); + drawList.AddText(origin + B.B, textColor, Inline.Span($"Triangle B: {B.B.X:0.00} {B.B.Y:0.00}")); + drawList.AddText(origin + B.C, textColor, Inline.Span($"Triangle C: {B.C.X:0.00} {B.C.Y:0.00}")); } } diff --git a/src/Detach.Demos.Collisions/Services/CollisionScenes/PointOnLine.cs b/src/Detach.Demos.Collisions/Services/CollisionScenes/PointOnLine.cs index 38f30cc..6466027 100644 --- a/src/Detach.Demos.Collisions/Services/CollisionScenes/PointOnLine.cs +++ b/src/Detach.Demos.Collisions/Services/CollisionScenes/PointOnLine.cs @@ -5,45 +5,41 @@ namespace Detach.Demos.Collisions.Services.CollisionScenes; -public sealed class PointOnLine : ICollisionScene +public sealed class PointOnLine : CollisionScene { private const float _pointOffset = 64; private const float _linePointOffset = 128; - private float _totalTime; - private Vector2 _point; - private LineSegment2D _line; - private bool _collision; - - public void Update(float dt) + public override void Update(float dt) { - _totalTime += dt; - _point = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(_totalTime) * _pointOffset, MathF.Sin(_totalTime) * _pointOffset); + base.Update(dt); + + A = CollisionSceneConstants.Origin + new Vector2(MathF.Cos(TotalTime) * _pointOffset, MathF.Sin(TotalTime) * _pointOffset); - float halfTime = _totalTime / 2; - float quarterTime = _totalTime / 4; - _line = new LineSegment2D( + float halfTime = TotalTime / 2; + float quarterTime = TotalTime / 4; + B = new LineSegment2D( CollisionSceneConstants.Origin + new Vector2(MathF.Cos(halfTime) * _linePointOffset, MathF.Sin(halfTime) * _linePointOffset), CollisionSceneConstants.Origin + new Vector2(MathF.Cos(quarterTime) * _linePointOffset, MathF.Sin(quarterTime) * _linePointOffset)); - _collision = Geometry2D.PointOnLine(_point, _line, 1f); + HasCollision = Geometry2D.PointOnLine(A, B, 1f); } - public void Render() + public override void Render() { const uint textColor = 0xFFFFFFFF; const uint backgroundColor = 0xFF000000; - uint foregroundColor = _collision ? 0xFF00FF00 : 0xFFFFFFFF; + uint foregroundColor = HasCollision ? 0xFF00FF00 : 0xFFFFFFFF; Vector2 origin = ImGui.GetCursorScreenPos(); ImDrawListPtr drawList = ImGui.GetWindowDrawList(); drawList.AddRectFilled(origin, origin + CollisionSceneConstants.Size, backgroundColor); - drawList.AddCircleFilled(origin + _point, 3, foregroundColor); - drawList.AddLine(origin + _line.Start, origin + _line.End, foregroundColor); + drawList.AddCircleFilled(origin + A, 3, foregroundColor); + drawList.AddLine(origin + B.Start, origin + B.End, foregroundColor); - drawList.AddText(origin + _point, textColor, Inline.Span($"Point: {_point.X:0.00} {_point.Y:0.00}")); - drawList.AddText(origin + _line.Start, textColor, Inline.Span($"Line start: {_line.Start.X:0.00} {_line.Start.Y:0.00}")); - drawList.AddText(origin + _line.End, textColor, Inline.Span($"Line end: {_line.End.X:0.00} {_line.End.Y:0.00}")); + drawList.AddText(origin + A, textColor, Inline.Span($"Point: {A.X:0.00} {A.Y:0.00}")); + drawList.AddText(origin + B.Start, textColor, Inline.Span($"Line start: {B.Start.X:0.00} {B.Start.Y:0.00}")); + drawList.AddText(origin + B.End, textColor, Inline.Span($"Line end: {B.End.X:0.00} {B.End.Y:0.00}")); } }