Skip to content

Commit d2e80fb

Browse files
committed
Add TCP networking, scene system, and shear matrix support
- Introduced async TCP client/server classes using IAsyncEnumerable - Added IScene, SceneBase, and Scene - Enhanced Transform with shear matrix and related structs - Added Rotation to TransformComponent - Made Game fields protected for extensibility - Reconfigured Serilog logging with thread ID enrichment - Applied shear matrix in a OpenGL model transform - Enabled ImGui sample integration in WindowEventHandler - Added MenuStrip to App window - Miscellaneous code cleanups and typo fixes
1 parent 7b01319 commit d2e80fb

14 files changed

Lines changed: 168 additions & 15 deletions

File tree

CoreLibrary/Services/Game.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ namespace CoreLibrary.Services;
99

1010
public class Game : IGame, IDisposable
1111
{
12-
private readonly EntitySystem _entitySystem;
13-
private readonly ComponentSystem<TransformComponent> _transformComponentSystem;
14-
private readonly ILogger<Game> _logger;
15-
private readonly IEventHandler _eventHandler;
12+
protected readonly EntitySystem _entitySystem;
13+
protected readonly ComponentSystem<TransformComponent> _transformComponentSystem;
14+
protected readonly ILogger<Game> _logger;
15+
protected readonly IEventHandler _eventHandler;
1616
public Game(EntitySystem entitySystem,
1717
ComponentSystem<TransformComponent> transformComponent,
1818
ILogger<Game> logger,

SharedLibrary/Components/TransformComponent.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ namespace SharedLibrary.Components;
44

55
public struct TransformComponent : IComponent
66
{
7-
public Vector3 Position { get; set; }
7+
public Vector3 Position { get; set; }
8+
public Quaternion Rotation { get; set; }
89
}

SharedLibrary/Extensions/SerilogServiceExtension.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public static IServiceCollection AddSerilog(this IServiceCollection services)
1616
.MinimumLevel.Verbose()
1717
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
1818
.Enrich.FromLogContext()
19+
.Enrich.WithThreadId()
1920
.WriteTo.File("Logs/log.txt",
2021
fileSizeLimitBytes: 1_000_000,
2122
rollOnFileSizeLimit: true,
@@ -24,7 +25,7 @@ public static IServiceCollection AddSerilog(this IServiceCollection services)
2425
rollingInterval: RollingInterval.Hour)
2526
.WriteTo.Async(configure=>configure.Console(
2627
outputTemplate: "[{Timestamp:MM/dd/HH:mm:ss}({ThreadId}){Level:u3}]{Message:lj}{NewLine}{Exception}",
27-
theme: SystemConsoleTheme.Literate).Enrich.WithThreadId())
28+
theme: SystemConsoleTheme.Literate))
2829
.WriteTo.Async(configure => configure.File("Logs/log.txt",
2930
fileSizeLimitBytes: 1_000_000,
3031
rollOnFileSizeLimit: true,

SharedLibrary/Networks/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# TCP Classes in .NET
2+
3+
https://learn.microsoft.com/en-us/dotnet/fundamentals/networking/sockets/tcp-classes
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Net;
4+
using System.Net.Sockets;
5+
using System.Runtime.CompilerServices;
6+
using System.Text;
7+
using System.Threading;
8+
9+
namespace SharedLibrary.Networking
10+
{
11+
public class TransmissionControlProtocolClient
12+
{
13+
public async IAsyncEnumerable<string> ListenAsync(long ipAddress,
14+
short port = 13,
15+
[EnumeratorCancellation] CancellationToken cancellationToken = default)
16+
{
17+
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, Convert.ToInt32(port));
18+
19+
using TcpClient client = new();
20+
await client.ConnectAsync(ipEndPoint);
21+
22+
while (client.Connected)
23+
{
24+
if (cancellationToken.IsCancellationRequested)
25+
{
26+
yield break;
27+
}
28+
await using NetworkStream stream = client.GetStream();
29+
30+
byte[] buffer = new byte[1_024];
31+
int received = await stream.ReadAsync(buffer, cancellationToken);
32+
if (cancellationToken.IsCancellationRequested)
33+
{
34+
yield break;
35+
}
36+
string message = Encoding.UTF8.GetString(buffer, 0, received);
37+
Console.WriteLine($"Message received: \"{message}\"");
38+
// Sample output:
39+
// Message received: "📅 8/22/2022 9:07:17 AM 🕛"
40+
41+
yield return message;
42+
}
43+
}
44+
}
45+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Net;
4+
using System.Net.Sockets;
5+
using System.Runtime.CompilerServices;
6+
using System.Text;
7+
using System.Threading;
8+
using System.Threading.Tasks;
9+
10+
namespace SharedLibrary.Networking
11+
{
12+
public class TransmissionControlProtocolListener
13+
{
14+
public async IAsyncEnumerable<string> ListenAsync(IPAddress iPAddress,
15+
short port = 13, [EnumeratorCancellation] CancellationToken cancellationToken = default)
16+
{
17+
var ipEndPoint = new IPEndPoint(iPAddress, Convert.ToInt32(port));
18+
TcpListener listener = new(ipEndPoint);
19+
20+
try
21+
{
22+
listener.Start();
23+
24+
using TcpClient handler = await listener.AcceptTcpClientAsync(cancellationToken);
25+
if(cancellationToken.IsCancellationRequested)
26+
{
27+
yield break;
28+
}
29+
await using NetworkStream stream = handler.GetStream();
30+
31+
var message = $"📅 {DateTime.Now} 🕛";
32+
var dateTimeBytes = Encoding.UTF8.GetBytes(message);
33+
34+
yield return message;
35+
36+
await stream.WriteAsync(dateTimeBytes, cancellationToken);
37+
if(cancellationToken.IsCancellationRequested)
38+
{
39+
yield break;
40+
}
41+
Console.WriteLine($"Sent message: \"{message}\"");
42+
// Sample output:
43+
// Sent message: "📅 8/22/2022 9:07:17 AM 🕛"
44+
}
45+
finally
46+
{
47+
listener.Stop();
48+
}
49+
}
50+
}
51+
}

SharedLibrary/Scenes/IScene.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace SharedLibrary.Scenes
2+
{
3+
public interface IScene
4+
{
5+
6+
}
7+
}

SharedLibrary/Scenes/Scene.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace SharedLibrary.Scenes
2+
{
3+
public abstract class SceneBase : IScene
4+
{
5+
6+
}
7+
8+
public class Scene : SceneBase
9+
{
10+
11+
}
12+
}

SharedLibrary/Transforms/Transform.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,19 @@ public Transform()
1515
public float Scale { get; set; } = 1f;
1616

1717
public Quaternion Rotation { get; set; } = Quaternion.Identity;
18+
public LowerTriangular ShearLowerTriangular { get; set; } = new LowerTriangular(1f,3f,4f);
19+
public UpperTriangular ShearUpperTriangular { get; set; } = new UpperTriangular();
20+
public readonly Matrix4x4 ShearMatrix => new Matrix4x4(
21+
1, ShearUpperTriangular.XY, ShearUpperTriangular.XZ, 0,
22+
ShearLowerTriangular.YX, 1, ShearUpperTriangular.YZ, 0,
23+
ShearLowerTriangular.ZX, ShearLowerTriangular.ZY, 1, 0,
24+
0, 0, 0, 1);
1825

1926
/// <summary>
2027
/// MVP Matrix
2128
/// </summary>
2229
public readonly Matrix4x4 ViewMatrix => Matrix4x4.Identity * Matrix4x4.CreateFromQuaternion(Rotation) * Matrix4x4.CreateScale(Scale) * Matrix4x4.CreateTranslation(Position);
2330
}
31+
32+
public readonly record struct UpperTriangular(float XY, float XZ, float YZ);
33+
public readonly record struct LowerTriangular(float YX, float ZX, float ZY);

SilkDotNetWindowApp/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using SharedLibrary.Extensions;
77
using SilkDotNetLibrary.OpenGL.Apps;
88
using System;
9+
using System.Threading.Tasks;
910

1011
var builder = Host.CreateDefaultBuilder(args);
1112

0 commit comments

Comments
 (0)