From ccff80eece4868bebd4b54281f612b088bee481f Mon Sep 17 00:00:00 2001 From: MarcLohfink Date: Thu, 9 Feb 2023 12:54:19 +0100 Subject: [PATCH 01/17] Basic Framework: SLIRP Controller + Frame History + Data Transformation + RenderServer --- Fusee.sln | 155 +++++++++++ src/SLIRP/Common/BufferSet.cs | 30 +++ src/SLIRP/Common/Fusee.SLIRP.Common.csproj | 9 + src/SLIRP/Common/StackBuffer.cs | 93 +++++++ src/SLIRP/Core/FrameHistoryController.cs | 83 ++++++ src/SLIRP/Core/FrameHistorySnapshoter.cs | 65 +++++ src/SLIRP/Core/Fusee.SLIRP.Desktop.csproj | 18 ++ src/SLIRP/Core/SLIRPRenderer.cs | 33 +++ src/SLIRP/Core/SLIRPer.cs | 255 ++++++++++++++++++ src/SLIRP/Core/SnapshotController.cs | 20 ++ .../EncodingMeta.cs | 12 + .../Fusee.SLIRP.DataTransformation.csproj | 13 + .../IEncoder.cs | 18 ++ .../SixLabsEncodingMeta.cs | 21 ++ .../SixLabsJPEGTransformer.cs | 67 +++++ .../Fusee.SLIRP.Network.Common.csproj | 9 + .../IConnectHandler.cs | 14 + .../IConnectionHandler.cs | 25 ++ .../IConnectionHandlingThread.cs | 60 +++++ .../IConnectionRequestHandler.cs | 16 ++ .../IDisconnectHandler.cs | 15 ++ .../Fusee.SLIRP.Network/ClientHandler.cs | 12 + .../Fusee.SLIRP.Network/ConnectionHandler.cs | 91 +++++++ .../ConnectionHandlingThread.cs | 32 +++ .../ConnectionRequestHandler.cs | 45 ++++ .../Fusee.SLIRP.Network.csproj | 9 + .../Fusee.SLIRP.Network/IConnectHandler.cs | 14 + .../Fusee.SLIRP.Network/IConnectionHandler.cs | 25 ++ .../IConnectionHandlingThread.cs | 60 +++++ .../IConnectionRequestHandler.cs | 16 ++ .../Fusee.SLIRP.Network/IDisconnectHandler.cs | 15 ++ .../Fusee.SLIRP.Network/IRenderServer.cs | 19 ++ .../RenderServerMetaData.cs | 25 ++ .../Fusee.SLIRP.Network/SLIRPRenderServer.cs | 98 +++++++ .../ServerConnectionMetaData.cs | 29 ++ .../Fusee.SLIRP.Network/UDPClientThread.cs | 25 ++ src/Tests/Render/Desktop/Run.cs | 3 + .../Fusee.Tests.SLIRP.SLIRPTest.csproj | 32 +++ src/Tests/SLIRP/SLIRPTest/Program.cs | 110 ++++++++ src/Tests/SLIRP/SLIRPTest/Run.cs | 79 ++++++ 40 files changed, 1770 insertions(+) create mode 100644 src/SLIRP/Common/BufferSet.cs create mode 100644 src/SLIRP/Common/Fusee.SLIRP.Common.csproj create mode 100644 src/SLIRP/Common/StackBuffer.cs create mode 100644 src/SLIRP/Core/FrameHistoryController.cs create mode 100644 src/SLIRP/Core/FrameHistorySnapshoter.cs create mode 100644 src/SLIRP/Core/Fusee.SLIRP.Desktop.csproj create mode 100644 src/SLIRP/Core/SLIRPRenderer.cs create mode 100644 src/SLIRP/Core/SLIRPer.cs create mode 100644 src/SLIRP/Core/SnapshotController.cs create mode 100644 src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/EncodingMeta.cs create mode 100644 src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/Fusee.SLIRP.DataTransformation.csproj create mode 100644 src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/IEncoder.cs create mode 100644 src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsEncodingMeta.cs create mode 100644 src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsJPEGTransformer.cs create mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/Fusee.SLIRP.Network.Common.csproj create mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectHandler.cs create mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandler.cs create mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandlingThread.cs create mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequestHandler.cs create mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IDisconnectHandler.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/ClientHandler.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandler.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandlingThread.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionRequestHandler.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.csproj create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/IConnectHandler.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandler.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandlingThread.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionRequestHandler.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/IDisconnectHandler.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/IRenderServer.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/RenderServerMetaData.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/SLIRPRenderServer.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/ServerConnectionMetaData.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/UDPClientThread.cs create mode 100644 src/Tests/SLIRP/SLIRPTest/Fusee.Tests.SLIRP.SLIRPTest.csproj create mode 100644 src/Tests/SLIRP/SLIRPTest/Program.cs create mode 100644 src/Tests/SLIRP/SLIRPTest/Run.cs diff --git a/Fusee.sln b/Fusee.sln index 0803971ea..532e12c52 100644 --- a/Fusee.sln +++ b/Fusee.sln @@ -302,6 +302,37 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ImGui", "ImGui", "{D1853E25 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.Examples.PointCloudPotree2.Gui", "Examples\Complete\PointCloudPotree2\ImGui\Fusee.Examples.PointCloudPotree2.Gui.csproj", "{DF33EBD9-9CD9-409C-A10F-AC6FA8FA851D}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SLIRP", "SLIRP", "{EC28C91A-2067-494C-BE18-B2057BBB6516}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SLIRP", "SLIRP", "{C8163C6A-2273-4FEF-A426-D908451BC776}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.Tests.SLIRP.SLIRPTest", "src\Tests\SLIRP\SLIRPTest\Fusee.Tests.SLIRP.SLIRPTest.csproj", "{2D40C8B1-DA7B-45C5-B841-1CED3245CC40}" + ProjectSection(ProjectDependencies) = postProject + {1B99F3FD-C685-4D72-8EBA-94A1214469B5} = {1B99F3FD-C685-4D72-8EBA-94A1214469B5} + {28C06484-229D-44C6-B463-C29762D586BD} = {28C06484-229D-44C6-B463-C29762D586BD} + {5906ABE0-1D62-4F9A-9ABA-B7D301615BB0} = {5906ABE0-1D62-4F9A-9ABA-B7D301615BB0} + {72974011-C264-4D3D-979A-A4E750C5787A} = {72974011-C264-4D3D-979A-A4E750C5787A} + {76FE409A-DCA8-4714-8E95-4FE189751EE7} = {76FE409A-DCA8-4714-8E95-4FE189751EE7} + {7DC4C82A-CBE1-4564-9B62-733545DB892B} = {7DC4C82A-CBE1-4564-9B62-733545DB892B} + {7E0C9336-7A38-4C87-97E2-A8D2A90AA29D} = {7E0C9336-7A38-4C87-97E2-A8D2A90AA29D} + {F28634E7-52B8-4935-B19E-CB8A6844E6F1} = {F28634E7-52B8-4935-B19E-CB8A6844E6F1} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.Desktop", "src\SLIRP\Core\Fusee.SLIRP.Desktop.csproj", "{070A34B2-E8E2-498E-B472-677E28A057BB}" + ProjectSection(ProjectDependencies) = postProject + {5906ABE0-1D62-4F9A-9ABA-B7D301615BB0} = {5906ABE0-1D62-4F9A-9ABA-B7D301615BB0} + {7E0C9336-7A38-4C87-97E2-A8D2A90AA29D} = {7E0C9336-7A38-4C87-97E2-A8D2A90AA29D} + {DFD770F6-4222-4255-AAE0-DCACDC7B21EB} = {DFD770F6-4222-4255-AAE0-DCACDC7B21EB} + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.Common", "src\SLIRP\Common\Fusee.SLIRP.Common.csproj", "{17E70A4F-1E6C-496F-ACC8-00FA29C199BB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.DataTransformation", "src\SLIRP\DataTransformation\Fusee.SLIRP.DataTransformation\Fusee.SLIRP.DataTransformation.csproj", "{0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.Network", "src\SLIRP\Network\Fusee.SLIRP.Network\Fusee.SLIRP.Network.csproj", "{1D85235B-44A2-4E0C-B6D5-699C902EFEB0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fusee.SLIRP.Network.Common", "src\SLIRP\Network\Common\Fusee.SLIRP.Network.Common\Fusee.SLIRP.Network.Common.csproj", "{DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1702,6 +1733,15 @@ Global {3AFEF2ED-6325-4C11-9B87-A32514FD5AE1}.Release-Blazor|Any CPU.Build.0 = Release|Any CPU {3AFEF2ED-6325-4C11-9B87-A32514FD5AE1}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU {3AFEF2ED-6325-4C11-9B87-A32514FD5AE1}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU + {7638E21E-193F-4AC7-8F01-B595FE8B3CAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7638E21E-193F-4AC7-8F01-B595FE8B3CAA}.Debug-Android|Any CPU.ActiveCfg = Debug|Any CPU + {7638E21E-193F-4AC7-8F01-B595FE8B3CAA}.Debug-Blazor|Any CPU.ActiveCfg = Debug|Any CPU + {7638E21E-193F-4AC7-8F01-B595FE8B3CAA}.Debug-Desktop|Any CPU.ActiveCfg = Debug|Any CPU + {7638E21E-193F-4AC7-8F01-B595FE8B3CAA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7638E21E-193F-4AC7-8F01-B595FE8B3CAA}.Release-Android|Any CPU.ActiveCfg = Release|Any CPU + {7638E21E-193F-4AC7-8F01-B595FE8B3CAA}.Release-Blazor|Any CPU.ActiveCfg = Release|Any CPU + {7638E21E-193F-4AC7-8F01-B595FE8B3CAA}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU + {7638E21E-193F-4AC7-8F01-B595FE8B3CAA}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU {4BA48469-D4D3-4562-B1E7-FB4F522D3F00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4BA48469-D4D3-4562-B1E7-FB4F522D3F00}.Debug|Any CPU.Build.0 = Debug|Any CPU {4BA48469-D4D3-4562-B1E7-FB4F522D3F00}.Debug-Android|Any CPU.ActiveCfg = Debug|Any CPU @@ -1742,6 +1782,114 @@ Global {DF33EBD9-9CD9-409C-A10F-AC6FA8FA851D}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU {DF33EBD9-9CD9-409C-A10F-AC6FA8FA851D}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU {DF33EBD9-9CD9-409C-A10F-AC6FA8FA851D}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Debug-Android|Any CPU.ActiveCfg = Debug|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Debug-Android|Any CPU.Build.0 = Debug|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Debug-Blazor|Any CPU.ActiveCfg = Debug|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Debug-Blazor|Any CPU.Build.0 = Debug|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Debug-Desktop|Any CPU.ActiveCfg = Debug|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Debug-Desktop|Any CPU.Build.0 = Debug|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Release|Any CPU.Build.0 = Release|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Release-Android|Any CPU.ActiveCfg = Release|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Release-Android|Any CPU.Build.0 = Release|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Release-Blazor|Any CPU.ActiveCfg = Release|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Release-Blazor|Any CPU.Build.0 = Release|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40}.Release-NuGet|Any CPU.Build.0 = Release|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Debug-Android|Any CPU.ActiveCfg = Debug|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Debug-Android|Any CPU.Build.0 = Debug|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Debug-Blazor|Any CPU.ActiveCfg = Debug|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Debug-Blazor|Any CPU.Build.0 = Debug|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Debug-Desktop|Any CPU.ActiveCfg = Debug|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Debug-Desktop|Any CPU.Build.0 = Debug|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Release|Any CPU.Build.0 = Release|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Release-Android|Any CPU.ActiveCfg = Release|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Release-Android|Any CPU.Build.0 = Release|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Release-Blazor|Any CPU.ActiveCfg = Release|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Release-Blazor|Any CPU.Build.0 = Release|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU + {070A34B2-E8E2-498E-B472-677E28A057BB}.Release-NuGet|Any CPU.Build.0 = Release|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Debug-Android|Any CPU.ActiveCfg = Debug|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Debug-Android|Any CPU.Build.0 = Debug|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Debug-Blazor|Any CPU.ActiveCfg = Debug|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Debug-Blazor|Any CPU.Build.0 = Debug|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Debug-Desktop|Any CPU.ActiveCfg = Debug|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Debug-Desktop|Any CPU.Build.0 = Debug|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Release|Any CPU.Build.0 = Release|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Release-Android|Any CPU.ActiveCfg = Release|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Release-Android|Any CPU.Build.0 = Release|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Release-Blazor|Any CPU.ActiveCfg = Release|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Release-Blazor|Any CPU.Build.0 = Release|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB}.Release-NuGet|Any CPU.Build.0 = Release|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Debug-Android|Any CPU.ActiveCfg = Debug|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Debug-Android|Any CPU.Build.0 = Debug|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Debug-Blazor|Any CPU.ActiveCfg = Debug|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Debug-Blazor|Any CPU.Build.0 = Debug|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Debug-Desktop|Any CPU.ActiveCfg = Debug|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Debug-Desktop|Any CPU.Build.0 = Debug|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Release|Any CPU.Build.0 = Release|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Release-Android|Any CPU.ActiveCfg = Release|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Release-Android|Any CPU.Build.0 = Release|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Release-Blazor|Any CPU.ActiveCfg = Release|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Release-Blazor|Any CPU.Build.0 = Release|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}.Release-NuGet|Any CPU.Build.0 = Release|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Debug-Android|Any CPU.ActiveCfg = Debug|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Debug-Android|Any CPU.Build.0 = Debug|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Debug-Blazor|Any CPU.ActiveCfg = Debug|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Debug-Blazor|Any CPU.Build.0 = Debug|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Debug-Desktop|Any CPU.ActiveCfg = Debug|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Debug-Desktop|Any CPU.Build.0 = Debug|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Release|Any CPU.Build.0 = Release|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Release-Android|Any CPU.ActiveCfg = Release|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Release-Android|Any CPU.Build.0 = Release|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Release-Blazor|Any CPU.ActiveCfg = Release|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Release-Blazor|Any CPU.Build.0 = Release|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0}.Release-NuGet|Any CPU.Build.0 = Release|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Debug-Android|Any CPU.ActiveCfg = Debug|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Debug-Android|Any CPU.Build.0 = Debug|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Debug-Blazor|Any CPU.ActiveCfg = Debug|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Debug-Blazor|Any CPU.Build.0 = Debug|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Debug-Desktop|Any CPU.ActiveCfg = Debug|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Debug-Desktop|Any CPU.Build.0 = Debug|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Release|Any CPU.Build.0 = Release|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Release-Android|Any CPU.ActiveCfg = Release|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Release-Android|Any CPU.Build.0 = Release|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Release-Blazor|Any CPU.ActiveCfg = Release|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Release-Blazor|Any CPU.Build.0 = Release|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Release-NuGet|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1875,6 +2023,13 @@ Global {A1E5AC7E-97B2-4BED-AB75-780416E422A5} = {D1853E25-C274-44E7-8AB6-9BE3A4E61928} {D1853E25-C274-44E7-8AB6-9BE3A4E61928} = {E68628DA-312F-4171-A5ED-08072B5CCA3C} {DF33EBD9-9CD9-409C-A10F-AC6FA8FA851D} = {B2C0746D-E5CC-45F1-BD88-3E0D5A2A7191} + {C8163C6A-2273-4FEF-A426-D908451BC776} = {E1BC200B-7234-4037-9421-E65FD4D915B0} + {2D40C8B1-DA7B-45C5-B841-1CED3245CC40} = {C8163C6A-2273-4FEF-A426-D908451BC776} + {070A34B2-E8E2-498E-B472-677E28A057BB} = {EC28C91A-2067-494C-BE18-B2057BBB6516} + {17E70A4F-1E6C-496F-ACC8-00FA29C199BB} = {EC28C91A-2067-494C-BE18-B2057BBB6516} + {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366} = {EC28C91A-2067-494C-BE18-B2057BBB6516} + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0} = {EC28C91A-2067-494C-BE18-B2057BBB6516} + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C} = {EC28C91A-2067-494C-BE18-B2057BBB6516} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CC1775C2-579F-4897-8770-592966D00E3D} diff --git a/src/SLIRP/Common/BufferSet.cs b/src/SLIRP/Common/BufferSet.cs new file mode 100644 index 000000000..966c02f6f --- /dev/null +++ b/src/SLIRP/Common/BufferSet.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Common +{ + public struct BufferSet + { + public int x; + public int y; + + public int width; + public int height; + + public byte[] frameBuffer; + public byte[] depthBuffer; + + public BufferSet(int x, int y, int width, int height, byte[] frameBuffer, byte[] depthBuffer) + { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.frameBuffer = frameBuffer; + this.depthBuffer = depthBuffer; + } + } +} diff --git a/src/SLIRP/Common/Fusee.SLIRP.Common.csproj b/src/SLIRP/Common/Fusee.SLIRP.Common.csproj new file mode 100644 index 000000000..cfadb03dd --- /dev/null +++ b/src/SLIRP/Common/Fusee.SLIRP.Common.csproj @@ -0,0 +1,9 @@ + + + + net7.0 + enable + enable + + + diff --git a/src/SLIRP/Common/StackBuffer.cs b/src/SLIRP/Common/StackBuffer.cs new file mode 100644 index 000000000..28db738d7 --- /dev/null +++ b/src/SLIRP/Common/StackBuffer.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Common +{ + /// + /// Works like a stack but pushes down all older elements if the stack is full when pushed. + /// The oldest item is the overwritten. + /// + /// + public class StackBuffer + { + private T[] stack; + private int top; + + private int depth; + + public StackBuffer(int depth) + { + this.depth = depth; + stack = new T[depth]; + } + + public void Push(T item) + { + //if the stack is full, push all older elements down the stack + if (top == depth - 1) + { + for (int i = 0; i < top; i++) + { + stack[i] = stack[i + 1]; + } + top--; + } + + stack[++top] = item; + } + + + public T Pop() + { + if (top == -1) + throw new InvalidOperationException("Stack is empty"); + + return stack[top--]; + } + + /// + /// Pop at a specific position "n" and all younger items in the stack. + /// + /// The position at which the item should be poped + /// + /// + public T Pop(int n) + { + if (n > top + 1) + throw new InvalidOperationException("Not enough elements in the stack"); + + var item = stack[top - n + 1]; + top = top - n; + return item; + } + + public T Peek() + { + if(top == -1) + throw new InvalidOperationException("Stack is empty"); + + return stack[top]; + } + + /// + /// Peek at a specific position "i" without altering the stack. + /// + /// The position at which the item should be peeked. 0 = latest, "depth"-1 = oldest. + /// + /// + public T PeekAt(int i) + { + if(i >= depth) + throw new ArgumentOutOfRangeException("Passed index is bigger or equal to the depth:\ndepth: "+depth+"\ti: "+i); + + int realIndex = depth -1 - i; + + return stack[i]; + } + + + } +} diff --git a/src/SLIRP/Core/FrameHistoryController.cs b/src/SLIRP/Core/FrameHistoryController.cs new file mode 100644 index 000000000..d9521187a --- /dev/null +++ b/src/SLIRP/Core/FrameHistoryController.cs @@ -0,0 +1,83 @@ +using Fusee.Base.Common; +using Fusee.Base.Core; +using Fusee.Base.Imp.Desktop; +using Fusee.Engine.Common; +using Fusee.Engine.Core; +using Fusee.Engine.Core.Scene; +using Fusee.Engine.Imp.Graphics.Desktop; +using Fusee.SLIRP.Common; + +namespace Fusee.SLIRP.Core +{ + /// + /// Stores a passed amount of BufferSets. If the stored BufferSets reach the capacity, the oldest is discarded + /// and the new BufferSet can be stored. + /// Can be used to run automatically on the render loop or by calling it manually per frame. + /// + public class FrameHistoryController + { + private int capacity; + + private StackBuffer recordedFrames; + private RenderCanvasImp canvasImp; + + public int Capacity { get => capacity; } + + public FrameHistoryController(RenderCanvasImp canvasImp, int capacity = 25, bool autoPostRender = true) + { + this.capacity = capacity; + this.canvasImp = canvasImp; + + recordedFrames = new StackBuffer(capacity); + + if(autoPostRender) + this.canvasImp.PostRender += OnPostRender; + } + + public BufferSet PopLastBufferSet() + { + return recordedFrames.Pop(); + } + + public BufferSet PopBufferSet(int n) + { + return recordedFrames.Pop(n); + } + + public BufferSet PeekLastBufferSet() + { + return recordedFrames.Peek(); + } + + /// + /// Peek at a specific position "i" without altering the history. + /// + /// The position to peek at. 0 is the latest, "capacity"-1 the oldest. + /// + public BufferSet PeekBufferSetAt(int i) + { + return recordedFrames.PeekAt(i); + } + + + public void Destroy() + { + canvasImp.PostRender -= OnPostRender; + } + + public void OnPostRender(object sender, PostRenderEventArgs args) + { + PushCurrentBuffers(); + } + + public void PushCurrentBuffers() + { + var frameBuffer = canvasImp.GetFrameBuffer(canvasImp.Width, canvasImp.Height); + var depthBuffer = canvasImp.GetDepthBuffer(canvasImp.Width, canvasImp.Height); + + BufferSet newSet = new BufferSet(0, 0, canvasImp.Width, canvasImp.Height, frameBuffer, depthBuffer); + + recordedFrames.Push(newSet); + } + } +} \ No newline at end of file diff --git a/src/SLIRP/Core/FrameHistorySnapshoter.cs b/src/SLIRP/Core/FrameHistorySnapshoter.cs new file mode 100644 index 000000000..ed08422f3 --- /dev/null +++ b/src/SLIRP/Core/FrameHistorySnapshoter.cs @@ -0,0 +1,65 @@ +using Fusee.SLIRP.Common; +using Fusee.SLIRP.Core; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.PortableExecutable; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Desktop +{ + public class FrameHistorySnapshoter + { + string snapshotPath; + + FrameHistoryController gbReader; + + public FrameHistorySnapshoter(FrameHistoryController gbReader, string snapshotPath) + { + this.gbReader = gbReader; + this.snapshotPath = snapshotPath; + } + + public void SnapshotRandomFrameOfHistory() + { + Random rndmGen = new Random(); + + int rndm = rndmGen.Next(0, gbReader.Capacity); + + Console.WriteLine("Save random BufferSet of the history at " + rndm); + SnapshotBufferSetAt(rndm); + } + + public void SnapshotFrameHistory() + { + Console.WriteLine("Save all BufferSets of the history"); + for (int i = 0; i < gbReader.Capacity; i++) + { + SnapshotBufferSetAt(i); + } + } + + public void SnapshotBufferSetAt(int i) + { + BufferSet latest = gbReader.PeekBufferSetAt(i); + + string dateTime = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"); + string filename = "RGBframe_" + i + "_" + dateTime + ".png"; + SnapshotController.SaveSnapshotAsPng(latest.frameBuffer, latest.width, latest.height, snapshotPath, filename); + filename = "Depth_" + i + "_" + dateTime + ".png"; + SnapshotController.SaveSnapshotAsPng(latest.depthBuffer, latest.width, latest.height, snapshotPath, filename); + } + + public void SnapshotLastBufferSet() + { + BufferSet latest = gbReader.PeekLastBufferSet(); + + string dateTime = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"); + string filename = "RGBframe_" + dateTime + ".png"; + SnapshotController.SaveSnapshotAsPng(latest.frameBuffer, latest.width, latest.height, snapshotPath, filename); + filename = "Depth_" + dateTime + ".png"; + SnapshotController.SaveSnapshotAsPng(latest.depthBuffer, latest.width, latest.height, snapshotPath, filename); + } + } +} diff --git a/src/SLIRP/Core/Fusee.SLIRP.Desktop.csproj b/src/SLIRP/Core/Fusee.SLIRP.Desktop.csproj new file mode 100644 index 000000000..eb5376690 --- /dev/null +++ b/src/SLIRP/Core/Fusee.SLIRP.Desktop.csproj @@ -0,0 +1,18 @@ + + + + net7.0 + $(DefineConstants);PLATFORM_DESKTOP + enable + enable + + + + + + + + + + + diff --git a/src/SLIRP/Core/SLIRPRenderer.cs b/src/SLIRP/Core/SLIRPRenderer.cs new file mode 100644 index 000000000..40279253c --- /dev/null +++ b/src/SLIRP/Core/SLIRPRenderer.cs @@ -0,0 +1,33 @@ +using Fusee.Engine.Common; +using Fusee.Engine.Core; +using Fusee.SLIRP.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.PortableExecutable; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Core +{ + public class SLIRPRenderer : RenderCanvas + { + + //public override void Init() + //{ + // base.Init(); + + //} + + //public override void RenderAFrame() + //{ + // Console.WriteLine("Start Render"); + // CanvasImplementor.DoRender(); + // Console.WriteLine("Rendered"); + // //CanvasImplementor.DoPostRender(); + + + //} + + } +} diff --git a/src/SLIRP/Core/SLIRPer.cs b/src/SLIRP/Core/SLIRPer.cs new file mode 100644 index 000000000..9fa43c093 --- /dev/null +++ b/src/SLIRP/Core/SLIRPer.cs @@ -0,0 +1,255 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Fusee.Base.Common; +using Fusee.Base.Core; +using Fusee.Base.Imp.Desktop; +using Fusee.Engine.Common; +using Fusee.Engine.Core; +using Fusee.Engine.Core.Scene; +using Fusee.Engine.Imp.Graphics.Desktop; +using Fusee.SLIRP.Common; +using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp; +using Fusee.SLIRP.Desktop; +using OpenTK.Windowing.Desktop; +using System.Data; +using OpenTK.Graphics.ES11; +using Fusee.SLIRP.DataTransformation; + +namespace Fusee.SLIRP.Core +{ + [FuseeApplication(Name = "SLIRP Example", Description = " ")] + public class SLIRPer + { + + private string snapshotRoot = "C:\\Users\\Marc\\Daten\\00_SLIRP\\Snapshots"; + private DirectoryInfo snapshotCurDir; + + private const int height = 512; + private const int width = 512; + + FrameHistorySnapshoter gbSnapshoter; + private FrameHistoryController gbReader; + private RenderCanvas renderer; + + IEncoder encoder; + EncodingMeta encoderMeta; + + private int historyDepth = 75; + + int debugIndex = 0; + int debugSnapshotIndex = 100; + + #region Init + public void Init(RenderCanvas renderCanvas = null) + { + Console.WriteLine("Init SLIRPer " + (renderCanvas == null ? "new" : "with " + renderCanvas.ToString())); + + if (renderCanvas == null) + { + Console.WriteLine("Create Renderer"); + renderer = new SLIRPRenderer(); + } + else + renderer = renderCanvas; + + var cimp = (RenderCanvasImp)renderer.CanvasImplementor; + + //Render Context und Canvas für die Injection + InitRenderCanvas(); + + //create a frame history + InitFrameHistory(cimp); + + //create the posibility to save the frame history to disc as images + InitFrameHistorySnapshoter(); + + //create encoder + InitEncoding(cimp); + + //irgendwas mit Input + Input.AddDriverImp(new Engine.Imp.Graphics.Desktop.RenderCanvasInputDriverImp(renderer.CanvasImplementor)); + Input.AddDriverImp(new Engine.Imp.Graphics.Desktop.WindowsTouchInputDriverImp(renderer.CanvasImplementor)); + + //initialize render app + InitAppAndRendering(); + + renderer.EndOfFrame += OnEndOffFrame; + + renderer.Run(); + + } + + #region Init Methods + private void InitAppAndRendering() + { + Console.WriteLine("App initialize SLIRPer"); + renderer.InitApp(); + + renderer.CanvasImplementor.DoInit(); + renderer.CanvasImplementor.DoResize(width, height); + renderer.CanvasImplementor.DoUpdate(); + + SpinWait.SpinUntil(() => renderer.IsLoaded); + } + + private void InitEncoding(RenderCanvasImp cimp) + { + encoder = new SixLabsJPEGTransformer(); + encoderMeta = new SixLabsEncodingMeta(Configuration.Default, cimp.Width * cimp.Height); + encoder.Init(encoderMeta); + } + + private void InitFrameHistorySnapshoter() + { + string snapshotFolderName = "Testshots_" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"); + snapshotCurDir = Directory.CreateDirectory(Path.Combine(snapshotRoot, snapshotFolderName)); + gbSnapshoter = new FrameHistorySnapshoter(gbReader, snapshotCurDir.FullName); + } + + private void InitFrameHistory(RenderCanvasImp cimp) + { + Console.WriteLine("Create GraphicBufferController and pass CanvasImplementor."); + gbReader = new FrameHistoryController(cimp, historyDepth, false); + } + + private void InitRenderCanvas() + { + Console.WriteLine("Do Canvas and Context Stuff"); + var icon = AssetStorage.Get("FuseeIconTop32.png"); + renderer.CanvasImplementor = new Engine.Imp.Graphics.Desktop.RenderCanvasImp(icon); + renderer.ContextImplementor = new Engine.Imp.Graphics.Desktop.RenderContextImp(renderer.CanvasImplementor); + + renderer.CanvasImplementor.PostRender += OnPostRender; + } + #endregion Init Methods + + #endregion Init + + public void OnEndOffFrame(object sender, EventArgs args) + { + Process(); + } + + public void Process() + { + //Console.WriteLine("Process SLIRPer"); + //Console.WriteLine("Start Render"); + //renderer.CanvasImplementor.DoRender(); + //Console.WriteLine("Rendered"); + //Console.WriteLine("Present -->"); + //renderer.Present(); + // renderer.RenderAFrame(); + OnPostRender(this, null); + + TestEncoding(); + } + + private void TestEncoding() + { + debugIndex++; + + if (debugIndex > debugSnapshotIndex) + { + debugIndex = 0; + + Console.WriteLine("Save latest BufferSet"); + gbSnapshoter.SnapshotLastBufferSet(); + + lock (gbReader) + { + BufferSet latestSet = gbReader.PeekLastBufferSet(); + + Console.WriteLine("\nTest Encoding"); + + Console.WriteLine("Byte length: " + latestSet.frameBuffer.Length); + + string dateTime = DateTime.Now.ToString("yyyy_MM_dd-HH_mm_ss"); + string filename = "RGB_" + dateTime + ".jpeg"; + string realPath = Path.Combine(snapshotCurDir.FullName, filename); + + Console.WriteLine("Save as jpeg"); + var loadedImg = Image.LoadPixelData(latestSet.frameBuffer, latestSet.width, latestSet.height); + loadedImg.SaveAsJpeg(realPath); + + Console.WriteLine("Save raw image"); + filename = "RawRGB_" + dateTime + ".raw"; + realPath = Path.Combine(snapshotCurDir.FullName, filename); + using (FileStream fs = new FileStream(realPath, System.IO.FileMode.Create, FileAccess.Write)) + { + fs.Write(latestSet.frameBuffer, 0, latestSet.frameBuffer.Length); + } + Console.WriteLine("Raw image saved!"); + + Console.WriteLine("\nStart encoding"); + + using (MemoryStream dataStream = new MemoryStream()) + { + Console.WriteLine("Benchmark: Start at " + DateTime.Now.ToString("yyyy_MM_dd-HH_mm_ss")); + DateTime start = DateTime.Now; + encoder.Encode(latestSet.frameBuffer, dataStream, latestSet.width, latestSet.height); + DateTime end = DateTime.Now; + Console.WriteLine("Benchmark: End at " + DateTime.Now.ToString("yyyy_MM_dd-HH_mm_ss")); + Console.WriteLine("Encoding finished!"); + + int duration = (end - start).Milliseconds; + Console.WriteLine("Encoding took " + duration + "ns"); + + + Console.WriteLine("\nSave encoded image"); + filename = "EncodedRGB_" + dateTime + ".jpeg"; + realPath = Path.Combine(snapshotCurDir.FullName, filename); + + dataStream.Seek(0, SeekOrigin.Begin); + using (FileStream fs = File.Create(realPath)) + { + dataStream.CopyTo(fs); + } + dataStream.Seek(0, SeekOrigin.Begin); + + Console.WriteLine("Encoded image saved!"); + + + Console.WriteLine("\nTest Decoding"); + + Console.WriteLine("Start decoding"); + Console.WriteLine("Benchmark: Start at " + DateTime.Now.ToString("yyyy_MM_dd-HH_mm_ss")); + start = DateTime.Now; + byte[] decodedImg = encoder.Decode(dataStream, latestSet.width, latestSet.height); + end = DateTime.Now; + Console.WriteLine("Benchmark: End at " + DateTime.Now.ToString("yyyy_MM_dd-HH_mm_ss")); + Console.WriteLine("Decoding finished!"); + + duration = (end - start).Milliseconds; + Console.WriteLine("Decoding took " + duration + "ns"); + + Console.WriteLine("Byte length: " + decodedImg.Length); + + Console.WriteLine("Save decoded image"); + filename = "DecodedRGB_" + dateTime + ".raw"; + realPath = Path.Combine(snapshotCurDir.FullName, filename); + using (FileStream fs = new FileStream(realPath, System.IO.FileMode.Create, FileAccess.Write)) + { + fs.Write(decodedImg, 0, decodedImg.Length); + } + Console.WriteLine("Decoded image saved!"); + } + Console.WriteLine("Finish Encoding Test"); + } + } + } + + public void OnPostRender(object sender, PostRenderEventArgs args) + { + //Console.WriteLine("OnPostRender SLIRPer"); + gbReader.PushCurrentBuffers(); + //BufferSet lastBufferSet = gbReader.PeekLastBufferSet(); + + } + + } +} diff --git a/src/SLIRP/Core/SnapshotController.cs b/src/SLIRP/Core/SnapshotController.cs new file mode 100644 index 000000000..14c9197e9 --- /dev/null +++ b/src/SLIRP/Core/SnapshotController.cs @@ -0,0 +1,20 @@ +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Desktop +{ + public static class SnapshotController + { + public static void SaveSnapshotAsPng(byte[] frame, int width, int height, string path, string filename) + { + var img = SixLabors.ImageSharp.Image.LoadPixelData(frame, width, height); + img.SaveAsPng(Path.Combine(path, filename)); + } + + } +} diff --git a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/EncodingMeta.cs b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/EncodingMeta.cs new file mode 100644 index 000000000..78778ec34 --- /dev/null +++ b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/EncodingMeta.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.DataTransformation +{ + public abstract class EncodingMeta + { + } +} diff --git a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/Fusee.SLIRP.DataTransformation.csproj b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/Fusee.SLIRP.DataTransformation.csproj new file mode 100644 index 000000000..02f6d3ae9 --- /dev/null +++ b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/Fusee.SLIRP.DataTransformation.csproj @@ -0,0 +1,13 @@ + + + + net7.0 + enable + enable + + + + + + + diff --git a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/IEncoder.cs b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/IEncoder.cs new file mode 100644 index 000000000..c85f86fec --- /dev/null +++ b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/IEncoder.cs @@ -0,0 +1,18 @@ +using Fusee.SLIRP.DataTransformation; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Common +{ + public interface IEncoder + { + public void Init(EncodingMeta metaData); + + public Stream Encode(byte[] data, Stream dataStream, int width, int height); + + public byte[] Decode(Stream data, int width, int height); + } +} diff --git a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsEncodingMeta.cs b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsEncodingMeta.cs new file mode 100644 index 000000000..6bc6a8f7e --- /dev/null +++ b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsEncodingMeta.cs @@ -0,0 +1,21 @@ +using SixLabors.ImageSharp; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.DataTransformation +{ + public class SixLabsEncodingMeta : EncodingMeta + { + public Configuration configuration; + public int byteLength = 0; + + public SixLabsEncodingMeta(Configuration configuration, int byteLength) + { + this.configuration = configuration; + this.byteLength = byteLength; + } + } +} diff --git a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsJPEGTransformer.cs b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsJPEGTransformer.cs new file mode 100644 index 000000000..bc716885d --- /dev/null +++ b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsJPEGTransformer.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Fusee.SLIRP.Common; +using Fusee.SLIRP.DataTransformation; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Advanced; +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.Formats.Jpeg; +using SixLabors.ImageSharp.PixelFormats; + +namespace Fusee.SLIRP.Desktop +{ + public class SixLabsJPEGTransformer : IEncoder + { + Configuration configuration; + int byteLength = 0; + + public void Init(EncodingMeta metaData) + { + if (!(metaData is SixLabsEncodingMeta sixLabsMetaData)) + throw new InvalidCastException("Passed the wriong meta data to this encoder"); + + configuration = sixLabsMetaData.configuration; + byteLength = sixLabsMetaData.byteLength; + + } + + public Stream Encode(byte[] data, Stream dataStream, int width, int height) + { + if (configuration == null) + throw new NullReferenceException("Configuration is null. Call \"Init()\" before using the encoding!"); + + byteLength = data.Length; + var img = SixLabors.ImageSharp.Image.LoadPixelData(data, width, height); + + JpegEncoder encoder = new JpegEncoder(); + encoder.Encode(img, dataStream); + + return dataStream; + + } + + public byte[] Decode(Stream data, int width, int height) + { + if (configuration == null) + throw new NullReferenceException("No configuration set!"); + + JpegDecoder decoder = new JpegDecoder(); + CancellationToken token = new CancellationToken(); + + var img = decoder.Decode(configuration, data, token); + byte[] decodedData = new byte[byteLength]; + Span byteImg = new Span(decodedData); + img.CopyPixelDataTo(byteImg); + + decodedData = byteImg.ToArray(); + + return decodedData; + + } + + + } +} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/Fusee.SLIRP.Network.Common.csproj b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/Fusee.SLIRP.Network.Common.csproj new file mode 100644 index 000000000..cfadb03dd --- /dev/null +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/Fusee.SLIRP.Network.Common.csproj @@ -0,0 +1,9 @@ + + + + net7.0 + enable + enable + + + diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectHandler.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectHandler.cs new file mode 100644 index 000000000..a9dc5177d --- /dev/null +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectHandler.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + internal interface IConnectHandler + { + public void OnClientConnected(IConnectHandler sender, Socket clientSocket); + } +} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandler.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandler.cs new file mode 100644 index 000000000..96e78c93b --- /dev/null +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandler.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + internal interface IConnectionHandler + { + /// + /// Initialize the Handler so that he is able to handle accepted connections and disconnected clients. + /// + /// The handler which accepts incoming connections. + /// What kind of handling thread will be instantiated when a new client connects. + public void Init(IConnectionRequestHandler requestHandler); + + public void Shutdown(); + + //public void HandleClient(IConnectionRequestHandler sender, Socket clientSocket); + + + } +} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandlingThread.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandlingThread.cs new file mode 100644 index 000000000..027883637 --- /dev/null +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandlingThread.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Net.WebSockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + internal abstract class IConnectionHandlingThread + { + private Socket _clientSocket; + private IDisconnectHandler _connectionHandler; + + private bool _isInitialized; + + //workaround to be able to assign a socket to the thread. See instantiation at ClientHandlers method "HandleClient". + public Socket ClientSocket + { + get => _clientSocket; + set + { + if (_clientSocket == null) _clientSocket = value; + else Console.WriteLine("Dont assign clients sockets when already constructed."); + } + } + + + public IDisconnectHandler ConnectionHandler + { + protected get => _connectionHandler; + set + { + if (_connectionHandler == null) + { + _connectionHandler = value; + } + else Console.WriteLine("Dont assign a disconnect handler when already initialized."); + } + } + + public event Action OnClientClosed; + + public IConnectionHandlingThread() + { } + + public void Init(Socket clientSocket, IDisconnectHandler connectionHandler) + { + _clientSocket = clientSocket; + _connectionHandler = connectionHandler; + + _isInitialized = true; + } + + public abstract void RunHandleConnection(); + + public abstract void OnClientDisconnected(IConnectionHandlingThread handler, Socket disconnectedClient); + } +} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequestHandler.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequestHandler.cs new file mode 100644 index 000000000..23fe8a9ea --- /dev/null +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequestHandler.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + internal interface IConnectionRequestHandler + { + public event Action OnClientConnect; + + public void Run(); + } +} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IDisconnectHandler.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IDisconnectHandler.cs new file mode 100644 index 000000000..ee443dc8e --- /dev/null +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IDisconnectHandler.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + internal interface IDisconnectHandler + { + + public void OnClientDisconnected(IConnectionHandlingThread sender, Socket clientSocket); + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/ClientHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/ClientHandler.cs new file mode 100644 index 000000000..36b204a07 --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/ClientHandler.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + internal class ClientHandler + { + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandler.cs new file mode 100644 index 000000000..4ea914346 --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandler.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + /// + /// Handles all accepted connections by the and also the disconnecting connections. + /// + /// + internal class ConnectionHandler : IConnectionHandler, IConnectHandler, IDisconnectHandler, IDisposable where T : IConnectionHandlingThread, new () + { + private IConnectionRequestHandler _requestHandler; + private bool _isInitialized; + + Dictionary handlingThreads = new Dictionary(); + + public void Init(IConnectionRequestHandler requestHandler) + { + //make sure that it is not already registered + DeregisterFromRequestHandler(); + + _requestHandler = requestHandler; + + //set first so incomming connectioncan be handled directly + _isInitialized = true; + + RegisterAtRequestHandler(); + } + + public void Shutdown() + { + DeregisterFromRequestHandler(); + + _isInitialized = false; + } + + private void RegisterAtRequestHandler() + { + if (_requestHandler == null) throw new NullReferenceException("Client Handler initialization was called without an IConnectionRequestHandler!"); + + _requestHandler.OnClientConnect += HandleClient; + } + + private void DeregisterFromRequestHandler() + { + if (_requestHandler != null) + { + _requestHandler.OnClientConnect -= HandleClient; + } + } + + private void HandleClient(Socket clientSocket) + { + if (!_isInitialized) + return; + + if (clientSocket == null) throw new NullReferenceException("Client Handler was called without an argument"); + + T clientHandling = new T(); + clientHandling.Init(clientSocket, this); + + Thread clientThread = new Thread(new ThreadStart(clientHandling.RunHandleConnection)); + + handlingThreads.Add(clientSocket, clientThread); + + clientThread.Start(); + } + + public void OnClientConnected(IConnectHandler sender, Socket clientSocket) + { + if (sender != _requestHandler) + return; + + HandleClient(clientSocket); + } + + public void OnClientDisconnected(IConnectionHandlingThread sender, Socket clientSocket) + { + + } + + public void Dispose() + { + Shutdown(); + } + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandlingThread.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandlingThread.cs new file mode 100644 index 000000000..15f08ce00 --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandlingThread.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + /// + /// Controls what happens while a client is connected. + /// + internal class ConnectionHandlingThread : IConnectionHandlingThread, IDisposable + { + public ConnectionHandlingThread():base() { } + + public void Dispose() + { + + } + + public override void RunHandleConnection() + { + throw new NotImplementedException(); + } + + public override void OnClientDisconnected(IConnectionHandlingThread handler, Socket disconnectedClient) + { + + } + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionRequestHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionRequestHandler.cs new file mode 100644 index 000000000..e1b3dcf33 --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionRequestHandler.cs @@ -0,0 +1,45 @@ +using System.Net; +using System.Net.Sockets; + +namespace Fusee.SLIRP.Network +{ + internal class ConnectionRequestHandler : IConnectionRequestHandler + { + private RenderServerMetaData serverMetaData; + + IPEndPoint listeningEndPoint; + + List connectedClients; + + bool threadContinue = false; + + public event Action OnClientConnect; + + public ConnectionRequestHandler(RenderServerMetaData serverMetaData) + { + this.serverMetaData = serverMetaData; + connectedClients = new List(); + } + + public void Run() + { + threadContinue = true; + + Socket workingSocket = serverMetaData.RenderSocket; + + listeningEndPoint = new IPEndPoint(serverMetaData.ConnectionData.ValidIPAdress, serverMetaData.ConnectionData.Port); + + workingSocket.Bind(listeningEndPoint); + workingSocket.Listen(serverMetaData.MaxConnections); + + while (threadContinue) + { + Socket clientSocket = workingSocket.Accept(); + connectedClients.Add(clientSocket); + + OnClientConnect?.Invoke(this, clientSocket); + } + } + + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.csproj b/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.csproj new file mode 100644 index 000000000..cfadb03dd --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.csproj @@ -0,0 +1,9 @@ + + + + net7.0 + enable + enable + + + diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectHandler.cs new file mode 100644 index 000000000..a9dc5177d --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectHandler.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + internal interface IConnectHandler + { + public void OnClientConnected(IConnectHandler sender, Socket clientSocket); + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandler.cs new file mode 100644 index 000000000..96e78c93b --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandler.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + internal interface IConnectionHandler + { + /// + /// Initialize the Handler so that he is able to handle accepted connections and disconnected clients. + /// + /// The handler which accepts incoming connections. + /// What kind of handling thread will be instantiated when a new client connects. + public void Init(IConnectionRequestHandler requestHandler); + + public void Shutdown(); + + //public void HandleClient(IConnectionRequestHandler sender, Socket clientSocket); + + + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandlingThread.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandlingThread.cs new file mode 100644 index 000000000..027883637 --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandlingThread.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Net.WebSockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + internal abstract class IConnectionHandlingThread + { + private Socket _clientSocket; + private IDisconnectHandler _connectionHandler; + + private bool _isInitialized; + + //workaround to be able to assign a socket to the thread. See instantiation at ClientHandlers method "HandleClient". + public Socket ClientSocket + { + get => _clientSocket; + set + { + if (_clientSocket == null) _clientSocket = value; + else Console.WriteLine("Dont assign clients sockets when already constructed."); + } + } + + + public IDisconnectHandler ConnectionHandler + { + protected get => _connectionHandler; + set + { + if (_connectionHandler == null) + { + _connectionHandler = value; + } + else Console.WriteLine("Dont assign a disconnect handler when already initialized."); + } + } + + public event Action OnClientClosed; + + public IConnectionHandlingThread() + { } + + public void Init(Socket clientSocket, IDisconnectHandler connectionHandler) + { + _clientSocket = clientSocket; + _connectionHandler = connectionHandler; + + _isInitialized = true; + } + + public abstract void RunHandleConnection(); + + public abstract void OnClientDisconnected(IConnectionHandlingThread handler, Socket disconnectedClient); + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionRequestHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionRequestHandler.cs new file mode 100644 index 000000000..23fe8a9ea --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionRequestHandler.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + internal interface IConnectionRequestHandler + { + public event Action OnClientConnect; + + public void Run(); + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/IDisconnectHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/IDisconnectHandler.cs new file mode 100644 index 000000000..ee443dc8e --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/IDisconnectHandler.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + internal interface IDisconnectHandler + { + + public void OnClientDisconnected(IConnectionHandlingThread sender, Socket clientSocket); + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/IRenderServer.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/IRenderServer.cs new file mode 100644 index 000000000..847eb2fce --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/IRenderServer.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + internal interface IRenderServer + { + public void Init(in ServerConnectionMetaData? metaData = null, int maxConnections = 6); + + public void Shutdown(); + + public void StartServer(in ServerConnectionMetaData? metaData = null); + + public void StopServer(); + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/RenderServerMetaData.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/RenderServerMetaData.cs new file mode 100644 index 000000000..5519a2690 --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/RenderServerMetaData.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + public struct RenderServerMetaData + { + public SLIRPRenderServer RenderServer; + public Socket RenderSocket; + public int MaxConnections; + public ServerConnectionMetaData ConnectionData; + + public RenderServerMetaData(SLIRPRenderServer server, Socket socket, int maxConnections, ServerConnectionMetaData connectionData) + { + RenderServer = server; + RenderSocket = socket; + MaxConnections = maxConnections; + ConnectionData = connectionData; + } + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/SLIRPRenderServer.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/SLIRPRenderServer.cs new file mode 100644 index 000000000..05f74a8cf --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/SLIRPRenderServer.cs @@ -0,0 +1,98 @@ +using System.Net; +using System.Net.Sockets; + +namespace Fusee.SLIRP.Network +{ + public class SLIRPRenderServer : IRenderServer + { + public static ServerConnectionMetaData DefaultSLIRP = new ServerConnectionMetaData(IPAddress.Any, 1300, AddressFamily.InterNetwork, ProtocolType.Udp); + + private bool _isInitialized; + private bool _isRunning; + private IConnectionRequestHandler? _connRequestHandler; + private IConnectionHandler? _clientHandler; + private Thread? _connRequestHandlerThread; + + private ServerConnectionMetaData curServerConnectionMetaData; + private RenderServerMetaData serverMetaData; + + private Socket? renderSocket; + private int maxConnections = 10; + + public void Init(in ServerConnectionMetaData? metaData = null, int maxConnections = 10) + { + if (_isRunning || _isInitialized) return; + + _isInitialized = true; + + this.maxConnections = maxConnections; + + if (metaData != null) + { + curServerConnectionMetaData = metaData.Value; + } + else + { + curServerConnectionMetaData = DefaultSLIRP; + } + + renderSocket = new Socket(curServerConnectionMetaData.AddressFamily, curServerConnectionMetaData.SocketType, curServerConnectionMetaData.ProtocolType); + serverMetaData = new RenderServerMetaData(this, renderSocket, this.maxConnections, curServerConnectionMetaData); + + _connRequestHandler = new ConnectionRequestHandler(serverMetaData); + + _clientHandler = new ConnectionHandler(); + _clientHandler.Init(_connRequestHandler); + + } + + public void Shutdown() + { + if (!_isInitialized) + return; + + if (_isRunning) + { + Console.WriteLine("Stop server before calling \"Shutdown()\"."); + return; + } + + _isInitialized = false; + } + + public void StartServer(in ServerConnectionMetaData? metaData = null) + { + if (!_isInitialized) + Init(metaData); + + if (_isRunning) + { + Console.WriteLine("Server is already running."); + return; + } + + _isRunning = true; + + _connRequestHandlerThread = new Thread(new ThreadStart(_connRequestHandler.Run)); + + _connRequestHandlerThread.Start(); + + } + + public void StopServer() + { + if (!_isRunning) + { + Console.WriteLine("Server is not running."); + return; + } + + if (_connRequestHandlerThread != null) + _connRequestHandlerThread.Interrupt(); + + _isRunning = false; + + } + + } +} \ No newline at end of file diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/ServerConnectionMetaData.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/ServerConnectionMetaData.cs new file mode 100644 index 000000000..631261931 --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/ServerConnectionMetaData.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + public struct ServerConnectionMetaData + { + public IPAddress ValidIPAdress = IPAddress.Any; + public Int32 Port = 1300; + public AddressFamily AddressFamily = AddressFamily.InterNetwork; + public ProtocolType ProtocolType = ProtocolType.Udp; + + public SocketType SocketType = SocketType.Stream; + + public ServerConnectionMetaData(IPAddress validIPAdress, int port, AddressFamily addressFamily,ProtocolType protocolType) + { + ValidIPAdress = validIPAdress; + Port = port; + AddressFamily = addressFamily; + ProtocolType = protocolType; + + } + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/UDPClientThread.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/UDPClientThread.cs new file mode 100644 index 000000000..3abd46fe8 --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/UDPClientThread.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network +{ + + internal class UDPClientThread + { + + + public UDPClientThread(SLIRPRenderServer server) + { + + } + + public void Run() + { + + } + } +} diff --git a/src/Tests/Render/Desktop/Run.cs b/src/Tests/Render/Desktop/Run.cs index ed59d93fb..42637f4f7 100644 --- a/src/Tests/Render/Desktop/Run.cs +++ b/src/Tests/Render/Desktop/Run.cs @@ -1,4 +1,5 @@ using NUnitLite; +using System; namespace Fusee.Tests.Render.Desktop { @@ -6,6 +7,8 @@ internal static class Run { public static int Main(string[] args) { + Console.WriteLine("Start Render"); + Program.Example = new Fusee.Examples.AdvancedUI.Core.AdvancedUI() { rnd = new System.Random(12345) }; Program.Init("AdvancedUI.png"); diff --git a/src/Tests/SLIRP/SLIRPTest/Fusee.Tests.SLIRP.SLIRPTest.csproj b/src/Tests/SLIRP/SLIRPTest/Fusee.Tests.SLIRP.SLIRPTest.csproj new file mode 100644 index 000000000..f8b1d3fc7 --- /dev/null +++ b/src/Tests/SLIRP/SLIRPTest/Fusee.Tests.SLIRP.SLIRPTest.csproj @@ -0,0 +1,32 @@ + + + + net7.0 + $(DefineConstants);PLATFORM_DESKTOP + + $(BaseOutputPath)\Tests\SLIRP\ + Exe + Fusee.Tests.SLIRP.SLIRPTest.Run + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + diff --git a/src/Tests/SLIRP/SLIRPTest/Program.cs b/src/Tests/SLIRP/SLIRPTest/Program.cs new file mode 100644 index 000000000..14c2d7334 --- /dev/null +++ b/src/Tests/SLIRP/SLIRPTest/Program.cs @@ -0,0 +1,110 @@ +using Fusee.Base.Common; +using Fusee.Base.Core; +using Fusee.Base.Imp.Desktop; +using Fusee.Engine.Core; +using Fusee.Engine.Core.Scene; +using Fusee.Serialization; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Fusee.Tests.SLIRP.SLIRPTest +{ + public static class Program + { + private const int height = 512; + private const int width = 512; + + public static RenderCanvas Example { get; set; } + + public static string FilePath; + + public static void Init(string arg) + { + if (!string.IsNullOrEmpty(arg)) + { + // Inject Fusee.Engine.Base InjectMe dependencies + IO.IOImp = new IOImp(); + AssetStorage.Instance.Dispose(); + + var baseDirOfExample = new Uri(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)); + FilePath = baseDirOfExample.LocalPath; + + var fap = new FileAssetProvider(Path.Combine(baseDirOfExample.LocalPath, "Assets")); + fap.RegisterTypeHandler( + new AssetHandler + { + ReturnedType = typeof(Font), + DecoderAsync = async (id, storage) => + { + if (!Path.GetExtension(id).Contains("ttf", StringComparison.OrdinalIgnoreCase)) return null; + return await Task.Run(() => new Font { _fontImp = new FontImp((Stream)storage) }); + }, + Decoder = (id, storage) => + { + if (!Path.GetExtension(id).Contains("ttf", StringComparison.OrdinalIgnoreCase)) return null; + return new Font { _fontImp = new FontImp((Stream)storage) }; + }, + + Checker = id => Path.GetExtension(id).Contains("ttf", StringComparison.OrdinalIgnoreCase) + }); + fap.RegisterTypeHandler( + new AssetHandler + { + ReturnedType = typeof(SceneContainer), + DecoderAsync = async (id, storage) => + { + if (!Path.GetExtension(id).Contains("fus", StringComparison.OrdinalIgnoreCase)) return null; + return await FusSceneConverter.ConvertFromAsync(ProtoBuf.Serializer.Deserialize((Stream)storage), id); + }, + Decoder = (id, storage) => + { + if (!Path.GetExtension(id).Contains("fus", StringComparison.OrdinalIgnoreCase)) return null; + return FusSceneConverter.ConvertFrom(ProtoBuf.Serializer.Deserialize((Stream)storage), id); + }, + Checker = id => Path.GetExtension(id).Contains("fus", StringComparison.OrdinalIgnoreCase) + }); + AssetStorage.RegisterProvider(fap); + + var app = Example; + + // Inject Fusee.Engine InjectMe dependencies (hard coded) + var cimp = new Engine.Imp.Graphics.Desktop.RenderCanvasImp(null, false, width, height, width, height) + { + EnableBlending = true + }; + app.CanvasImplementor = cimp; + app.ContextImplementor = new Engine.Imp.Graphics.Desktop.RenderContextImp(cimp, Engine.Common.FuseePlatformId.Mesa); + Input.AddDriverImp(new Engine.Imp.Graphics.Desktop.RenderCanvasInputDriverImp(cimp)); + Input.AddDriverImp(new Engine.Imp.Graphics.Desktop.WindowsTouchInputDriverImp(cimp)); + + // Initialize canvas/app and canvas implementor + app.InitApp(); + + ((Engine.Imp.Graphics.Desktop.RenderCanvasImp)app.CanvasImplementor).DoInit(); + ((Engine.Imp.Graphics.Desktop.RenderCanvasImp)app.CanvasImplementor).DoResize(width, height); + ((Engine.Imp.Graphics.Desktop.RenderCanvasImp)app.CanvasImplementor).DoUpdate(); + + SpinWait.SpinUntil(() => app.IsLoaded); + + // skip the first frame, empty, skip the second as deferred needs three, second pass has an empty frame, too + for (var i = 0; i < 3; i++) + { + ((Engine.Imp.Graphics.Desktop.RenderCanvasImp)app.CanvasImplementor).DoRender(); + } + + // Render a single frame and save it + using var img = cimp.ShootCurrentFrame(width, height) as Image; + img.SaveAsPng(Path.Combine(FilePath, arg)); + + // Done + Console.Error.WriteLine($"SUCCESS: Image {Path.Combine(FilePath, arg)} generated."); + + app.CloseGameWindow(); + } + } + } +} diff --git a/src/Tests/SLIRP/SLIRPTest/Run.cs b/src/Tests/SLIRP/SLIRPTest/Run.cs new file mode 100644 index 000000000..6226b5df2 --- /dev/null +++ b/src/Tests/SLIRP/SLIRPTest/Run.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Fusee.Base.Common; +using Fusee.Base.Core; +using Fusee.Base.Imp.Desktop; +using Fusee.Engine.Core; +using Fusee.Engine.Core.Scene; +using Fusee.Serialization; +using Fusee.SLIRP.Core; + + + +namespace Fusee.Tests.SLIRP.SLIRPTest +{ + internal static class Run + { + public static void Main(string[] args) + { + Console.WriteLine("Fusee Initialization Stuff"); + // Inject Fusee.Engine.Base InjectMe dependencies + IO.IOImp = new IOImp(); + + //Irgendwas mit Assets, keine Ahnung + var fap = new FileAssetProvider("Assets"); + fap.RegisterTypeHandler( + new AssetHandler + { + ReturnedType = typeof(Font), + DecoderAsync = async (string id, object storage) => + { + if (!Path.GetExtension(id).Contains("ttf", StringComparison.OrdinalIgnoreCase)) return null; + return await Task.FromResult(new Font { _fontImp = new FontImp((Stream)storage) }); + }, + Decoder = (string id, object storage) => + { + if (!Path.GetExtension(id).Contains("ttf", StringComparison.OrdinalIgnoreCase)) return null; + return new Font { _fontImp = new FontImp((Stream)storage) }; + }, + Checker = id => Path.GetExtension(id).Contains("ttf", StringComparison.OrdinalIgnoreCase) + }); + fap.RegisterTypeHandler( + new AssetHandler + { + ReturnedType = typeof(SceneContainer), + DecoderAsync = async (string id, object storage) => + { + if (!Path.GetExtension(id).Contains("fus", StringComparison.OrdinalIgnoreCase)) return null; + return await FusSceneConverter.ConvertFromAsync(ProtoBuf.Serializer.Deserialize((Stream)storage), id); + }, + Decoder = (string id, object storage) => + { + if (!Path.GetExtension(id).Contains("fus", StringComparison.OrdinalIgnoreCase)) return null; + return FusSceneConverter.ConvertFrom(ProtoBuf.Serializer.Deserialize((Stream)storage), id); + }, + Checker = id => Path.GetExtension(id).Contains("fus", StringComparison.OrdinalIgnoreCase) + }); + + AssetStorage.RegisterProvider(fap); + + //Erstellen der "Applikation" + Console.WriteLine("Create SLIRPer"); + SLIRPer slirper = new SLIRPer(); + + Console.WriteLine("Create PC SLIRPer"); + SLIRPer pcSlirper = new SLIRPer(); + var pcApp = new Fusee.Examples.PointCloudPotree2.Core.PointCloudPotree2(); + + //Console.WriteLine("Init empty SLIRPer"); + //slirper.Init(); + + Console.WriteLine("Init PC SLIRPer"); + slirper.Init(pcApp); + } + } +} From 5ae960c2257d9e390df6b4d991103e6749f68644 Mon Sep 17 00:00:00 2001 From: MarcLohfink Date: Thu, 9 Feb 2023 17:33:25 +0100 Subject: [PATCH 02/17] Server Concept --- Fusee.sln | 46 +++++++++++++- .../Fusee.SLIRP.Network.Client/Client.cs | 19 ++++++ .../Fusee.SLIRP.Network.Client.csproj} | 4 ++ .../Fusee.SLIRP.Network.Client/IClient.cs | 21 +++++++ .../IConnectHandler.cs | 18 +++--- .../IConnectionHandler.cs | 10 ++-- .../IConnectionHandlingThread.cs | 31 ++++------ .../IConnectionRequestHandler.cs | 6 +- .../IConnectionRequester.cs | 18 ++++++ .../IDisconnectHandler.cs | 4 +- .../NetworkPackageMeta.cs | 25 ++++++++ .../ServerConnectionMetaData.cs | 15 ++--- .../ServerMetaData.cs | 20 +++++++ .../Fusee.SLIRP.Network.RenderServer.csproj | 14 +++++ .../RenderServer.cs | 7 +++ .../BasicPingPongHandler.cs | 50 ++++++++++++++++ .../Fusee.SLIRP.Network/ConnectionHandler.cs | 52 +++++++++++----- .../ConnectionHandlingThread.cs | 32 ---------- .../ConnectionRequestHandler.cs | 44 +++++++++----- .../Fusee.SLIRP.Network.Server.csproj | 14 +++++ .../Fusee.SLIRP.Network/IConnectHandler.cs | 14 ----- .../Fusee.SLIRP.Network/IConnectionHandler.cs | 25 -------- .../IConnectionHandlingThread.cs | 60 ------------------- .../IConnectionRequestHandler.cs | 16 ----- .../Fusee.SLIRP.Network/IDisconnectHandler.cs | 15 ----- .../{IRenderServer.cs => IServer.cs} | 7 ++- .../RenderServerMetaData.cs | 25 -------- .../Fusee.SLIRP.Network/SLIRPRenderServer.cs | 20 ++++--- 28 files changed, 357 insertions(+), 275 deletions(-) create mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Client.cs rename src/SLIRP/Network/{Fusee.SLIRP.Network/Fusee.SLIRP.Network.csproj => Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.csproj} (59%) create mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IClient.cs create mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequester.cs create mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/NetworkPackageMeta.cs rename src/SLIRP/Network/{Fusee.SLIRP.Network => Common/Fusee.SLIRP.Network.Common}/ServerConnectionMetaData.cs (76%) create mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerMetaData.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/Fusee.SLIRP.Network.RenderServer.csproj create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/RenderServer.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/BasicPingPongHandler.cs delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandlingThread.cs create mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.csproj delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/IConnectHandler.cs delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandler.cs delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandlingThread.cs delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionRequestHandler.cs delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/IDisconnectHandler.cs rename src/SLIRP/Network/Fusee.SLIRP.Network/{IRenderServer.cs => IServer.cs} (75%) delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/RenderServerMetaData.cs diff --git a/Fusee.sln b/Fusee.sln index 532e12c52..c1e52b4bd 100644 --- a/Fusee.sln +++ b/Fusee.sln @@ -329,9 +329,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.Common", "src\S EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.DataTransformation", "src\SLIRP\DataTransformation\Fusee.SLIRP.DataTransformation\Fusee.SLIRP.DataTransformation.csproj", "{0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.Network", "src\SLIRP\Network\Fusee.SLIRP.Network\Fusee.SLIRP.Network.csproj", "{1D85235B-44A2-4E0C-B6D5-699C902EFEB0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.Network.Server", "src\SLIRP\Network\Fusee.SLIRP.Network\Fusee.SLIRP.Network.Server.csproj", "{1D85235B-44A2-4E0C-B6D5-699C902EFEB0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fusee.SLIRP.Network.Common", "src\SLIRP\Network\Common\Fusee.SLIRP.Network.Common\Fusee.SLIRP.Network.Common.csproj", "{DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.Network.Common", "src\SLIRP\Network\Common\Fusee.SLIRP.Network.Common\Fusee.SLIRP.Network.Common.csproj", "{DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fusee.SLIRP.Network.RenderServer", "src\SLIRP\Network\Fusee.SLIRP.Network.RenderServer\Fusee.SLIRP.Network.RenderServer.csproj", "{B902C801-1BC6-4054-976F-099E0571ABC6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fusee.SLIRP.Network.Client", "src\SLIRP\Network\Client\Fusee.SLIRP.Network.Client\Fusee.SLIRP.Network.Client.csproj", "{B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -1890,6 +1894,42 @@ Global {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}.Release-NuGet|Any CPU.Build.0 = Release|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Debug-Android|Any CPU.ActiveCfg = Debug|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Debug-Android|Any CPU.Build.0 = Debug|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Debug-Blazor|Any CPU.ActiveCfg = Debug|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Debug-Blazor|Any CPU.Build.0 = Debug|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Debug-Desktop|Any CPU.ActiveCfg = Debug|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Debug-Desktop|Any CPU.Build.0 = Debug|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Release|Any CPU.Build.0 = Release|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Release-Android|Any CPU.ActiveCfg = Release|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Release-Android|Any CPU.Build.0 = Release|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Release-Blazor|Any CPU.ActiveCfg = Release|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Release-Blazor|Any CPU.Build.0 = Release|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU + {B902C801-1BC6-4054-976F-099E0571ABC6}.Release-NuGet|Any CPU.Build.0 = Release|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Debug-Android|Any CPU.ActiveCfg = Debug|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Debug-Android|Any CPU.Build.0 = Debug|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Debug-Blazor|Any CPU.ActiveCfg = Debug|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Debug-Blazor|Any CPU.Build.0 = Debug|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Debug-Desktop|Any CPU.ActiveCfg = Debug|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Debug-Desktop|Any CPU.Build.0 = Debug|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Release|Any CPU.Build.0 = Release|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Release-Android|Any CPU.ActiveCfg = Release|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Release-Android|Any CPU.Build.0 = Release|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Release-Blazor|Any CPU.ActiveCfg = Release|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Release-Blazor|Any CPU.Build.0 = Release|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Release-NuGet|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2030,6 +2070,8 @@ Global {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366} = {EC28C91A-2067-494C-BE18-B2057BBB6516} {1D85235B-44A2-4E0C-B6D5-699C902EFEB0} = {EC28C91A-2067-494C-BE18-B2057BBB6516} {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C} = {EC28C91A-2067-494C-BE18-B2057BBB6516} + {B902C801-1BC6-4054-976F-099E0571ABC6} = {EC28C91A-2067-494C-BE18-B2057BBB6516} + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08} = {EC28C91A-2067-494C-BE18-B2057BBB6516} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CC1775C2-579F-4897-8770-592966D00E3D} diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Client.cs b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Client.cs new file mode 100644 index 000000000..a2e4a4988 --- /dev/null +++ b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Client.cs @@ -0,0 +1,19 @@ +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/9/2023 5:08:56 PM + +using Fusee.SLIRP.Network.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client +{ + public class Client : IClient + { + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.csproj b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.csproj similarity index 59% rename from src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.csproj rename to src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.csproj index cfadb03dd..f4be3a830 100644 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.csproj +++ b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.csproj @@ -6,4 +6,8 @@ enable + + + + diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IClient.cs b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IClient.cs new file mode 100644 index 000000000..06d335957 --- /dev/null +++ b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IClient.cs @@ -0,0 +1,21 @@ +using Fusee.SLIRP.Network.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client +{ + public interface IClient + { + public void Init(in ServerConnectionMetaData? metaData = null, int maxConnections = 6); + + public void Shutdown(); + + public void StartServer(in ServerConnectionMetaData? metaData = null); + + public void StopServer(); + + } +} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectHandler.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectHandler.cs index a9dc5177d..6cb42cac9 100644 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectHandler.cs +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectHandler.cs @@ -1,14 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq; +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/9/2023 4:58:00 PM + + using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; -namespace Fusee.SLIRP.Network +namespace Fusee.SLIRP.Network.Common { - internal interface IConnectHandler + public interface IConnectHandler { - public void OnClientConnected(IConnectHandler sender, Socket clientSocket); + public void OnClientConnected(IConnectionRequestHandler sender, Socket clientSocket); } } diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandler.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandler.cs index 96e78c93b..b07be8dca 100644 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandler.cs +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandler.cs @@ -5,10 +5,13 @@ using System.Text; using System.Threading.Tasks; -namespace Fusee.SLIRP.Network +namespace Fusee.SLIRP.Network.Common { - internal interface IConnectionHandler + public interface IConnectionHandler { + public event Action EventClientConnected; + public event Action EventClientDisconnected; + /// /// Initialize the Handler so that he is able to handle accepted connections and disconnected clients. /// @@ -18,8 +21,5 @@ internal interface IConnectionHandler public void Shutdown(); - //public void HandleClient(IConnectionRequestHandler sender, Socket clientSocket); - - } } diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandlingThread.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandlingThread.cs index 027883637..b3446b68f 100644 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandlingThread.cs +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandlingThread.cs @@ -6,50 +6,39 @@ using System.Text; using System.Threading.Tasks; -namespace Fusee.SLIRP.Network +namespace Fusee.SLIRP.Network.Common { - internal abstract class IConnectionHandlingThread + public abstract class IConnectionHandlingThread { private Socket _clientSocket; private IDisconnectHandler _connectionHandler; + private NetworkPackageMeta _packageMeta; private bool _isInitialized; //workaround to be able to assign a socket to the thread. See instantiation at ClientHandlers method "HandleClient". - public Socket ClientSocket + protected Socket ClientSocket { get => _clientSocket; - set - { - if (_clientSocket == null) _clientSocket = value; - else Console.WriteLine("Dont assign clients sockets when already constructed."); - } } - - public IDisconnectHandler ConnectionHandler + protected IDisconnectHandler ConnectionHandler { - protected get => _connectionHandler; - set - { - if (_connectionHandler == null) - { - _connectionHandler = value; - } - else Console.WriteLine("Dont assign a disconnect handler when already initialized."); - } + get => _connectionHandler; } + protected NetworkPackageMeta NetworkPackageMeta => _packageMeta; + public event Action OnClientClosed; public IConnectionHandlingThread() { } - public void Init(Socket clientSocket, IDisconnectHandler connectionHandler) + public void Init(IDisconnectHandler connectionHandler, Socket clientSocket, NetworkPackageMeta packageMeta) { _clientSocket = clientSocket; _connectionHandler = connectionHandler; - + _packageMeta = packageMeta; _isInitialized = true; } diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequestHandler.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequestHandler.cs index 23fe8a9ea..d6cd14113 100644 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequestHandler.cs +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequestHandler.cs @@ -5,12 +5,14 @@ using System.Text; using System.Threading.Tasks; -namespace Fusee.SLIRP.Network +namespace Fusee.SLIRP.Network.Common { - internal interface IConnectionRequestHandler + public interface IConnectionRequestHandler { public event Action OnClientConnect; + public void Shutdown(); + public void Run(); } } diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequester.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequester.cs new file mode 100644 index 000000000..c7df62163 --- /dev/null +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequester.cs @@ -0,0 +1,18 @@ +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/9/2023 5:06:32 PM + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client +{ + internal interface IConnectionRequester + { + } +} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IDisconnectHandler.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IDisconnectHandler.cs index ee443dc8e..ea5045ce4 100644 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IDisconnectHandler.cs +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IDisconnectHandler.cs @@ -5,9 +5,9 @@ using System.Text; using System.Threading.Tasks; -namespace Fusee.SLIRP.Network +namespace Fusee.SLIRP.Network.Common { - internal interface IDisconnectHandler + public interface IDisconnectHandler { public void OnClientDisconnected(IConnectionHandlingThread sender, Socket clientSocket); diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/NetworkPackageMeta.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/NetworkPackageMeta.cs new file mode 100644 index 000000000..d99d16807 --- /dev/null +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/NetworkPackageMeta.cs @@ -0,0 +1,25 @@ +/* + Copyright (c) 2023 All Rights Reserved + + Marc-Alexander Lohfink + 2/9/2023 2:23:32 PM +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Common +{ + public struct NetworkPackageMeta + { + public int BufferSize; + + public NetworkPackageMeta(int bufferSize) + { + BufferSize = bufferSize; + } + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/ServerConnectionMetaData.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerConnectionMetaData.cs similarity index 76% rename from src/SLIRP/Network/Fusee.SLIRP.Network/ServerConnectionMetaData.cs rename to src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerConnectionMetaData.cs index 631261931..12ac9e8af 100644 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/ServerConnectionMetaData.cs +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerConnectionMetaData.cs @@ -1,12 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; +using System.Net; using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; -namespace Fusee.SLIRP.Network +namespace Fusee.SLIRP.Network.Common { public struct ServerConnectionMetaData { @@ -17,13 +12,15 @@ public struct ServerConnectionMetaData public SocketType SocketType = SocketType.Stream; - public ServerConnectionMetaData(IPAddress validIPAdress, int port, AddressFamily addressFamily,ProtocolType protocolType) + public NetworkPackageMeta NetworkPackageMeta; + + public ServerConnectionMetaData(IPAddress validIPAdress, int port, AddressFamily addressFamily,ProtocolType protocolType, NetworkPackageMeta networkPackageMeta) { ValidIPAdress = validIPAdress; Port = port; AddressFamily = addressFamily; ProtocolType = protocolType; - + NetworkPackageMeta = networkPackageMeta; } } } diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerMetaData.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerMetaData.cs new file mode 100644 index 000000000..cf49eaebc --- /dev/null +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerMetaData.cs @@ -0,0 +1,20 @@ +using System.Net.Sockets; + +namespace Fusee.SLIRP.Network.Common +{ + public struct ServerMetaData + { + public IServer Server; + public Socket ServerSocket; + public int MaxConnections; + public ServerConnectionMetaData ConnectionData; + + public ServerMetaData(IServer server, Socket socket, int maxConnections, ServerConnectionMetaData connectionData) + { + Server = server; + ServerSocket = socket; + MaxConnections = maxConnections; + ConnectionData = connectionData; + } + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/Fusee.SLIRP.Network.RenderServer.csproj b/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/Fusee.SLIRP.Network.RenderServer.csproj new file mode 100644 index 000000000..4230af7b8 --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/Fusee.SLIRP.Network.RenderServer.csproj @@ -0,0 +1,14 @@ + + + + net7.0 + enable + enable + + + + + + + + diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/RenderServer.cs b/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/RenderServer.cs new file mode 100644 index 000000000..2551f3a50 --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/RenderServer.cs @@ -0,0 +1,7 @@ +namespace Fusee.SLIRP.Network.RenderServer +{ + public class RenderServer + { + + } +} \ No newline at end of file diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/BasicPingPongHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/BasicPingPongHandler.cs new file mode 100644 index 000000000..b3d399d06 --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/BasicPingPongHandler.cs @@ -0,0 +1,50 @@ +using Fusee.SLIRP.Network.Common; +using System.Net.Sockets; +using System.Text; + +namespace Fusee.SLIRP.Network +{ + /// + /// Controls what happens while a client is connected. + /// + internal class BasicPingPongHandler : IConnectionHandlingThread, IDisposable + { + public BasicPingPongHandler():base() { } + + public void Dispose() + { + OnClientDisconnected(this, ClientSocket); + } + + public override void RunHandleConnection() + { + while (true) + { + byte[] buffer = new byte[NetworkPackageMeta.BufferSize]; + int bytesReceived = ClientSocket.Receive(buffer); + + string messageReceived = ASCIIEncoding.ASCII.GetString(buffer, 0, bytesReceived); + Console.WriteLine("[Basic Ping Pong] Received: "+messageReceived); + + buffer = ASCIIEncoding.ASCII.GetBytes("Pong"); + Console.WriteLine("[Basic Ping Pong] Send: " + "Pong"); + ClientSocket.Send(buffer); + + buffer = ASCIIEncoding.ASCII.GetBytes("Ping"); + Console.WriteLine("[Basic Ping Pong] Send: " + "Ping"); + ClientSocket.Send(buffer); + + bytesReceived = ClientSocket.Receive(buffer); + messageReceived = ASCIIEncoding.ASCII.GetString(buffer, 0, bytesReceived); + Console.WriteLine("[Basic Ping Pong] Received: " + messageReceived); + + break; + } + } + + public override void OnClientDisconnected(IConnectionHandlingThread handler, Socket disconnectedClient) + { + + } + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandler.cs index 4ea914346..6fda5cb5d 100644 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandler.cs +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandler.cs @@ -1,9 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; +using System.Net.Sockets; +using Fusee.SLIRP.Network.Common; namespace Fusee.SLIRP.Network { @@ -14,12 +10,20 @@ namespace Fusee.SLIRP.Network internal class ConnectionHandler : IConnectionHandler, IConnectHandler, IDisconnectHandler, IDisposable where T : IConnectionHandlingThread, new () { private IConnectionRequestHandler _requestHandler; + private NetworkPackageMeta _packageMeta; + private bool _isInitialized; - Dictionary handlingThreads = new Dictionary(); + private Dictionary _handlingThreads = new Dictionary(); + + public event Action EventClientConnected; + + public event Action EventClientDisconnected; - public void Init(IConnectionRequestHandler requestHandler) + public void Init(IConnectionRequestHandler requestHandler, NetworkPackageMeta packageMeta) { + _packageMeta = packageMeta; + //make sure that it is not already registered DeregisterFromRequestHandler(); @@ -42,14 +46,14 @@ private void RegisterAtRequestHandler() { if (_requestHandler == null) throw new NullReferenceException("Client Handler initialization was called without an IConnectionRequestHandler!"); - _requestHandler.OnClientConnect += HandleClient; + _requestHandler.OnClientConnect += OnClientConnected; } private void DeregisterFromRequestHandler() { if (_requestHandler != null) { - _requestHandler.OnClientConnect -= HandleClient; + _requestHandler.OnClientConnect -= OnClientConnected; } } @@ -61,26 +65,46 @@ private void HandleClient(Socket clientSocket) if (clientSocket == null) throw new NullReferenceException("Client Handler was called without an argument"); T clientHandling = new T(); - clientHandling.Init(clientSocket, this); + clientHandling.Init(this, clientSocket, _packageMeta); Thread clientThread = new Thread(new ThreadStart(clientHandling.RunHandleConnection)); - handlingThreads.Add(clientSocket, clientThread); + AddSocketToDictionary(clientSocket, clientThread); clientThread.Start(); } - public void OnClientConnected(IConnectHandler sender, Socket clientSocket) + public void OnClientConnected(IConnectionRequestHandler sender, Socket clientSocket) { if (sender != _requestHandler) return; HandleClient(clientSocket); + + EventClientConnected?.Invoke(this, clientSocket); } public void OnClientDisconnected(IConnectionHandlingThread sender, Socket clientSocket) { - + if (sender != _requestHandler) + return; + + RemoveSocketFromDictionary(clientSocket); + + EventClientDisconnected?.Invoke(this, clientSocket); + } + + private void AddSocketToDictionary(Socket clientSocket, Thread clientThread) + { + _handlingThreads.Add(clientSocket, clientThread); + } + + private void RemoveSocketFromDictionary(Socket clientSocket) + { + if (_handlingThreads.ContainsKey(clientSocket)) + { + _handlingThreads.Remove(clientSocket); + } } public void Dispose() diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandlingThread.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandlingThread.cs deleted file mode 100644 index 15f08ce00..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandlingThread.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network -{ - /// - /// Controls what happens while a client is connected. - /// - internal class ConnectionHandlingThread : IConnectionHandlingThread, IDisposable - { - public ConnectionHandlingThread():base() { } - - public void Dispose() - { - - } - - public override void RunHandleConnection() - { - throw new NotImplementedException(); - } - - public override void OnClientDisconnected(IConnectionHandlingThread handler, Socket disconnectedClient) - { - - } - } -} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionRequestHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionRequestHandler.cs index e1b3dcf33..df68d27c0 100644 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionRequestHandler.cs +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionRequestHandler.cs @@ -1,45 +1,59 @@ -using System.Net; +using Fusee.SLIRP.Network.Common; +using System.Net; using System.Net.Sockets; namespace Fusee.SLIRP.Network { internal class ConnectionRequestHandler : IConnectionRequestHandler { - private RenderServerMetaData serverMetaData; + private ServerMetaData serverMetaData; + private Socket serverSocket; IPEndPoint listeningEndPoint; - List connectedClients; - bool threadContinue = false; public event Action OnClientConnect; - public ConnectionRequestHandler(RenderServerMetaData serverMetaData) + public ConnectionRequestHandler(ServerMetaData serverMetaData) { this.serverMetaData = serverMetaData; - connectedClients = new List(); } - + + + public void Shutdown() + { + threadContinue = false; + + if(serverSocket != null) + serverSocket.Close(); + } + public void Run() { threadContinue = true; - Socket workingSocket = serverMetaData.RenderSocket; + serverSocket = serverMetaData.ServerSocket; listeningEndPoint = new IPEndPoint(serverMetaData.ConnectionData.ValidIPAdress, serverMetaData.ConnectionData.Port); - workingSocket.Bind(listeningEndPoint); - workingSocket.Listen(serverMetaData.MaxConnections); - + serverSocket.Bind(listeningEndPoint); + serverSocket.Listen(serverMetaData.MaxConnections); + while (threadContinue) { - Socket clientSocket = workingSocket.Accept(); - connectedClients.Add(clientSocket); + try + { + Socket clientSocket = serverSocket.Accept(); - OnClientConnect?.Invoke(this, clientSocket); + OnClientConnect?.Invoke(this, clientSocket); + + } + catch (System.Exception) + { + throw; + } } } - } } diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.csproj b/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.csproj new file mode 100644 index 000000000..b36a00b50 --- /dev/null +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.csproj @@ -0,0 +1,14 @@ + + + + net7.0 + enable + enable + + + + + + + + diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectHandler.cs deleted file mode 100644 index a9dc5177d..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectHandler.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network -{ - internal interface IConnectHandler - { - public void OnClientConnected(IConnectHandler sender, Socket clientSocket); - } -} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandler.cs deleted file mode 100644 index 96e78c93b..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandler.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network -{ - internal interface IConnectionHandler - { - /// - /// Initialize the Handler so that he is able to handle accepted connections and disconnected clients. - /// - /// The handler which accepts incoming connections. - /// What kind of handling thread will be instantiated when a new client connects. - public void Init(IConnectionRequestHandler requestHandler); - - public void Shutdown(); - - //public void HandleClient(IConnectionRequestHandler sender, Socket clientSocket); - - - } -} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandlingThread.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandlingThread.cs deleted file mode 100644 index 027883637..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionHandlingThread.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Net.WebSockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network -{ - internal abstract class IConnectionHandlingThread - { - private Socket _clientSocket; - private IDisconnectHandler _connectionHandler; - - private bool _isInitialized; - - //workaround to be able to assign a socket to the thread. See instantiation at ClientHandlers method "HandleClient". - public Socket ClientSocket - { - get => _clientSocket; - set - { - if (_clientSocket == null) _clientSocket = value; - else Console.WriteLine("Dont assign clients sockets when already constructed."); - } - } - - - public IDisconnectHandler ConnectionHandler - { - protected get => _connectionHandler; - set - { - if (_connectionHandler == null) - { - _connectionHandler = value; - } - else Console.WriteLine("Dont assign a disconnect handler when already initialized."); - } - } - - public event Action OnClientClosed; - - public IConnectionHandlingThread() - { } - - public void Init(Socket clientSocket, IDisconnectHandler connectionHandler) - { - _clientSocket = clientSocket; - _connectionHandler = connectionHandler; - - _isInitialized = true; - } - - public abstract void RunHandleConnection(); - - public abstract void OnClientDisconnected(IConnectionHandlingThread handler, Socket disconnectedClient); - } -} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionRequestHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionRequestHandler.cs deleted file mode 100644 index 23fe8a9ea..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/IConnectionRequestHandler.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network -{ - internal interface IConnectionRequestHandler - { - public event Action OnClientConnect; - - public void Run(); - } -} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/IDisconnectHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/IDisconnectHandler.cs deleted file mode 100644 index ee443dc8e..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/IDisconnectHandler.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network -{ - internal interface IDisconnectHandler - { - - public void OnClientDisconnected(IConnectionHandlingThread sender, Socket clientSocket); - } -} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/IRenderServer.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/IServer.cs similarity index 75% rename from src/SLIRP/Network/Fusee.SLIRP.Network/IRenderServer.cs rename to src/SLIRP/Network/Fusee.SLIRP.Network/IServer.cs index 847eb2fce..44205d578 100644 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/IRenderServer.cs +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/IServer.cs @@ -1,12 +1,13 @@ -using System; +using Fusee.SLIRP.Network.Common; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Fusee.SLIRP.Network +namespace Fusee.SLIRP.Network.Client { - internal interface IRenderServer + public interface IServer { public void Init(in ServerConnectionMetaData? metaData = null, int maxConnections = 6); diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/RenderServerMetaData.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/RenderServerMetaData.cs deleted file mode 100644 index 5519a2690..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/RenderServerMetaData.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network -{ - public struct RenderServerMetaData - { - public SLIRPRenderServer RenderServer; - public Socket RenderSocket; - public int MaxConnections; - public ServerConnectionMetaData ConnectionData; - - public RenderServerMetaData(SLIRPRenderServer server, Socket socket, int maxConnections, ServerConnectionMetaData connectionData) - { - RenderServer = server; - RenderSocket = socket; - MaxConnections = maxConnections; - ConnectionData = connectionData; - } - } -} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/SLIRPRenderServer.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/SLIRPRenderServer.cs index 05f74a8cf..ed156ea53 100644 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/SLIRPRenderServer.cs +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/SLIRPRenderServer.cs @@ -1,11 +1,13 @@ -using System.Net; +using Fusee.SLIRP.Network.Common; +using System.Net; using System.Net.Sockets; namespace Fusee.SLIRP.Network { - public class SLIRPRenderServer : IRenderServer + public class SLIRPRenderServer : IServer { - public static ServerConnectionMetaData DefaultSLIRP = new ServerConnectionMetaData(IPAddress.Any, 1300, AddressFamily.InterNetwork, ProtocolType.Udp); + public const int BUFFERSIZE = 1024; + public static ServerConnectionMetaData DefaultSLIRP = new ServerConnectionMetaData(IPAddress.Any, 1300, AddressFamily.InterNetwork, ProtocolType.Udp, new NetworkPackageMeta(BUFFERSIZE)); private bool _isInitialized; private bool _isRunning; @@ -14,7 +16,7 @@ public class SLIRPRenderServer : IRenderServer private Thread? _connRequestHandlerThread; private ServerConnectionMetaData curServerConnectionMetaData; - private RenderServerMetaData serverMetaData; + private ServerMetaData serverMetaData; private Socket? renderSocket; private int maxConnections = 10; @@ -34,18 +36,19 @@ public void Init(in ServerConnectionMetaData? metaData = null, int maxConnection else { curServerConnectionMetaData = DefaultSLIRP; + //curServerConnectionMetaData.NetworkPackageMeta = new NetworkPackageMeta(BUFFERSIZE); } renderSocket = new Socket(curServerConnectionMetaData.AddressFamily, curServerConnectionMetaData.SocketType, curServerConnectionMetaData.ProtocolType); - serverMetaData = new RenderServerMetaData(this, renderSocket, this.maxConnections, curServerConnectionMetaData); + serverMetaData = new ServerMetaData(this, renderSocket, this.maxConnections, curServerConnectionMetaData); _connRequestHandler = new ConnectionRequestHandler(serverMetaData); - _clientHandler = new ConnectionHandler(); + _clientHandler = new ConnectionHandler(); _clientHandler.Init(_connRequestHandler); - } + public void Shutdown() { if (!_isInitialized) @@ -57,6 +60,9 @@ public void Shutdown() return; } + if(_connRequestHandler!= null) + _connRequestHandler.Shutdown(); + _isInitialized = false; } From d899a2936417e30ee9159040567f01f11201655f Mon Sep 17 00:00:00 2001 From: MarcLohfink Date: Fri, 10 Feb 2023 14:11:19 +0100 Subject: [PATCH 03/17] Server/ Client Framework & Example not tested --- Fusee.sln | 84 +++++++- .../ClientConnectionMetaData.cs | 42 ++++ .../EstablishedConnectionData.cs | 35 ++++ .../Fusee.SLIRP.Network.Client.Common.csproj} | 2 +- .../IClient.cs | 21 ++ .../IClientConnectionHandlingThread.cs} | 9 +- .../IConnToServerHandlingThread.cs | 58 ++++++ .../IConnToServerReceiver.cs | 16 ++ .../IConnectToServerHandler.cs | 12 ++ .../IConnectionRequester.cs | 30 +++ .../IConnectionToServerHandler.cs | 36 ++++ .../IDisconnectFromServerHandler.cs | 12 ++ .../Fusee.SLIRP.Network.Client/BasicClient.cs | 116 +++++++++++ .../BasicConnectionRequester.cs | 96 +++++++++ .../BasicConnectionToServerHandler.cs | 160 +++++++++++++++ .../BasicPingPongWithServerHandling.cs | 51 +++++ .../Fusee.SLIRP.Network.Client.Core.csproj | 14 ++ .../Fusee.SLIRP.Network.Client/IClient.cs | 21 -- .../IDisposableConnToServerHandlingThread.cs | 26 +++ .../ConnectionAddressData.cs | 28 +++ .../ConnectionMetaData.cs | 38 ++++ .../IConnectionHandler.cs | 25 --- .../IConnectionRequester.cs | 18 -- .../IDisconnectHandler.cs | 15 -- .../NetworkPackageMeta.cs | 2 +- .../ServerConnectionMetaData.cs | 26 --- .../Fusee.SLIRP.Network.RenderServer.csproj | 2 +- .../Fusee.SLIRP.Network/ClientHandler.cs | 2 +- .../Fusee.SLIRP.Network/ConnectionHandler.cs | 115 ----------- .../ConnectionRequestHandler.cs | 59 ------ ...=> Fusee.SLIRP.Network.Server.Core.csproj} | 1 + .../Fusee.SLIRP.Network/UDPClientThread.cs | 25 --- .../Fusee.SLIRP.Network.Server.Common.csproj | 13 ++ .../IConnectHandler.cs | 6 +- .../IConnectionHandler.cs | 33 +++ .../IConnectionHandlingThread.cs | 15 +- .../IConnectionRequestHandler.cs | 4 +- .../IDisconnectHandler.cs | 15 ++ .../IDisposableConnectionHandling.cs | 29 +++ .../IServer.cs | 2 +- .../ServerConnectionMetaData.cs | 33 +++ .../ServerMetaData.cs | 6 +- .../BasicPingPongHandling.cs} | 32 +-- .../BasicServer.cs} | 46 ++++- .../ConnectionHandler.cs | 193 ++++++++++++++++++ .../ConnectionRequestHandler.cs | 85 ++++++++ ...Fusee.SLIRP.Network.Server.Examples.csproj | 15 ++ 47 files changed, 1367 insertions(+), 357 deletions(-) create mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/ClientConnectionMetaData.cs create mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/EstablishedConnectionData.cs rename src/SLIRP/Network/Client/{Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.csproj => Common/Fusee.SLIRP.Network.Client.Common/Fusee.SLIRP.Network.Client.Common.csproj} (67%) create mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClient.cs rename src/SLIRP/Network/Client/{Fusee.SLIRP.Network.Client/Client.cs => Common/Fusee.SLIRP.Network.Client.Common/IClientConnectionHandlingThread.cs} (51%) create mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerHandlingThread.cs create mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerReceiver.cs create mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectToServerHandler.cs create mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionRequester.cs create mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionToServerHandler.cs create mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IDisconnectFromServerHandler.cs create mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicClient.cs create mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionRequester.cs create mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionToServerHandler.cs create mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicPingPongWithServerHandling.cs create mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.Core.csproj delete mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IClient.cs create mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IDisposableConnToServerHandlingThread.cs create mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionAddressData.cs create mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionMetaData.cs delete mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandler.cs delete mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequester.cs delete mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IDisconnectHandler.cs delete mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerConnectionMetaData.cs delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandler.cs delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionRequestHandler.cs rename src/SLIRP/Network/Fusee.SLIRP.Network/{Fusee.SLIRP.Network.Server.csproj => Fusee.SLIRP.Network.Server.Core.csproj} (78%) delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/UDPClientThread.cs create mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/Fusee.SLIRP.Network.Server.Common.csproj rename src/SLIRP/Network/{Common/Fusee.SLIRP.Network.Common => Server/Common/Fusee.SLIRP.Network.Server.Common}/IConnectHandler.cs (69%) create mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandler.cs rename src/SLIRP/Network/{Common/Fusee.SLIRP.Network.Common => Server/Common/Fusee.SLIRP.Network.Server.Common}/IConnectionHandlingThread.cs (87%) rename src/SLIRP/Network/{Common/Fusee.SLIRP.Network.Common => Server/Common/Fusee.SLIRP.Network.Server.Common}/IConnectionRequestHandler.cs (66%) create mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisconnectHandler.cs create mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisposableConnectionHandling.cs rename src/SLIRP/Network/{Fusee.SLIRP.Network => Server/Common/Fusee.SLIRP.Network.Server.Common}/IServer.cs (90%) create mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerConnectionMetaData.cs rename src/SLIRP/Network/{Common/Fusee.SLIRP.Network.Common => Server/Common/Fusee.SLIRP.Network.Server.Common}/ServerMetaData.cs (80%) rename src/SLIRP/Network/{Fusee.SLIRP.Network/BasicPingPongHandler.cs => Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicPingPongHandling.cs} (68%) rename src/SLIRP/Network/{Fusee.SLIRP.Network/SLIRPRenderServer.cs => Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicServer.cs} (66%) create mode 100644 src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionHandler.cs create mode 100644 src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionRequestHandler.cs create mode 100644 src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/Fusee.SLIRP.Network.Server.Examples.csproj diff --git a/Fusee.sln b/Fusee.sln index c1e52b4bd..272da6a72 100644 --- a/Fusee.sln +++ b/Fusee.sln @@ -329,13 +329,25 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.Common", "src\S EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.DataTransformation", "src\SLIRP\DataTransformation\Fusee.SLIRP.DataTransformation\Fusee.SLIRP.DataTransformation.csproj", "{0234DB19-DE7E-4C79-8DA0-9E71CA4C9366}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.Network.Server", "src\SLIRP\Network\Fusee.SLIRP.Network\Fusee.SLIRP.Network.Server.csproj", "{1D85235B-44A2-4E0C-B6D5-699C902EFEB0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.Network.Server.Core", "src\SLIRP\Network\Fusee.SLIRP.Network\Fusee.SLIRP.Network.Server.Core.csproj", "{1D85235B-44A2-4E0C-B6D5-699C902EFEB0}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fusee.SLIRP.Network.Common", "src\SLIRP\Network\Common\Fusee.SLIRP.Network.Common\Fusee.SLIRP.Network.Common.csproj", "{DDFE5FE3-74B4-48F1-B354-64F0407FFB4C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fusee.SLIRP.Network.RenderServer", "src\SLIRP\Network\Fusee.SLIRP.Network.RenderServer\Fusee.SLIRP.Network.RenderServer.csproj", "{B902C801-1BC6-4054-976F-099E0571ABC6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fusee.SLIRP.Network.Client", "src\SLIRP\Network\Client\Fusee.SLIRP.Network.Client\Fusee.SLIRP.Network.Client.csproj", "{B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fusee.SLIRP.Network.Client.Core", "src\SLIRP\Network\Client\Fusee.SLIRP.Network.Client\Fusee.SLIRP.Network.Client.Core.csproj", "{B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Network", "Network", "{9A397829-D9DE-4D77-9348-4D301E841F63}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fusee.SLIRP.Network.Server.Common", "src\SLIRP\Network\Server\Common\Fusee.SLIRP.Network.Server.Common\Fusee.SLIRP.Network.Server.Common.csproj", "{D1A6CC87-12D7-44CF-800A-A82AB27425F1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Server", "Server", "{797820E5-77CF-4B31-85F1-08FEA6555951}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Client", "Client", "{176B5BD9-DFAB-4FAF-BE61-067124AEC79B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fusee.SLIRP.Network.Client.Common", "src\SLIRP\Network\Client\Common\Fusee.SLIRP.Network.Client.Common\Fusee.SLIRP.Network.Client.Common.csproj", "{814616B6-04D3-47BB-8BFE-92D1063E558D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fusee.SLIRP.Network.Server.Examples", "src\SLIRP\Network\Server\Examples\Fusee.SLIRP.Network.Server.Examples\Fusee.SLIRP.Network.Server.Examples.csproj", "{6BAB1317-AF97-4CFD-806C-98D8510A95E3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -1930,6 +1942,60 @@ Global {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08}.Release-NuGet|Any CPU.Build.0 = Release|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Debug-Android|Any CPU.ActiveCfg = Debug|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Debug-Android|Any CPU.Build.0 = Debug|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Debug-Blazor|Any CPU.ActiveCfg = Debug|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Debug-Blazor|Any CPU.Build.0 = Debug|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Debug-Desktop|Any CPU.ActiveCfg = Debug|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Debug-Desktop|Any CPU.Build.0 = Debug|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Release|Any CPU.Build.0 = Release|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Release-Android|Any CPU.ActiveCfg = Release|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Release-Android|Any CPU.Build.0 = Release|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Release-Blazor|Any CPU.ActiveCfg = Release|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Release-Blazor|Any CPU.Build.0 = Release|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU + {D1A6CC87-12D7-44CF-800A-A82AB27425F1}.Release-NuGet|Any CPU.Build.0 = Release|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Debug-Android|Any CPU.ActiveCfg = Debug|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Debug-Android|Any CPU.Build.0 = Debug|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Debug-Blazor|Any CPU.ActiveCfg = Debug|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Debug-Blazor|Any CPU.Build.0 = Debug|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Debug-Desktop|Any CPU.ActiveCfg = Debug|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Debug-Desktop|Any CPU.Build.0 = Debug|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Release|Any CPU.Build.0 = Release|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Release-Android|Any CPU.ActiveCfg = Release|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Release-Android|Any CPU.Build.0 = Release|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Release-Blazor|Any CPU.ActiveCfg = Release|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Release-Blazor|Any CPU.Build.0 = Release|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU + {814616B6-04D3-47BB-8BFE-92D1063E558D}.Release-NuGet|Any CPU.Build.0 = Release|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Debug-Android|Any CPU.ActiveCfg = Debug|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Debug-Android|Any CPU.Build.0 = Debug|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Debug-Blazor|Any CPU.ActiveCfg = Debug|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Debug-Blazor|Any CPU.Build.0 = Debug|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Debug-Desktop|Any CPU.ActiveCfg = Debug|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Debug-Desktop|Any CPU.Build.0 = Debug|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Release|Any CPU.Build.0 = Release|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Release-Android|Any CPU.ActiveCfg = Release|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Release-Android|Any CPU.Build.0 = Release|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Release-Blazor|Any CPU.ActiveCfg = Release|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Release-Blazor|Any CPU.Build.0 = Release|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Release-Desktop|Any CPU.ActiveCfg = Release|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Release-Desktop|Any CPU.Build.0 = Release|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Release-NuGet|Any CPU.ActiveCfg = Release|Any CPU + {6BAB1317-AF97-4CFD-806C-98D8510A95E3}.Release-NuGet|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2068,10 +2134,16 @@ Global {070A34B2-E8E2-498E-B472-677E28A057BB} = {EC28C91A-2067-494C-BE18-B2057BBB6516} {17E70A4F-1E6C-496F-ACC8-00FA29C199BB} = {EC28C91A-2067-494C-BE18-B2057BBB6516} {0234DB19-DE7E-4C79-8DA0-9E71CA4C9366} = {EC28C91A-2067-494C-BE18-B2057BBB6516} - {1D85235B-44A2-4E0C-B6D5-699C902EFEB0} = {EC28C91A-2067-494C-BE18-B2057BBB6516} - {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C} = {EC28C91A-2067-494C-BE18-B2057BBB6516} - {B902C801-1BC6-4054-976F-099E0571ABC6} = {EC28C91A-2067-494C-BE18-B2057BBB6516} - {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08} = {EC28C91A-2067-494C-BE18-B2057BBB6516} + {1D85235B-44A2-4E0C-B6D5-699C902EFEB0} = {797820E5-77CF-4B31-85F1-08FEA6555951} + {DDFE5FE3-74B4-48F1-B354-64F0407FFB4C} = {9A397829-D9DE-4D77-9348-4D301E841F63} + {B902C801-1BC6-4054-976F-099E0571ABC6} = {9A397829-D9DE-4D77-9348-4D301E841F63} + {B8FC3064-B9E8-46A8-A2DF-DD448DD5CB08} = {176B5BD9-DFAB-4FAF-BE61-067124AEC79B} + {9A397829-D9DE-4D77-9348-4D301E841F63} = {EC28C91A-2067-494C-BE18-B2057BBB6516} + {D1A6CC87-12D7-44CF-800A-A82AB27425F1} = {797820E5-77CF-4B31-85F1-08FEA6555951} + {797820E5-77CF-4B31-85F1-08FEA6555951} = {9A397829-D9DE-4D77-9348-4D301E841F63} + {176B5BD9-DFAB-4FAF-BE61-067124AEC79B} = {9A397829-D9DE-4D77-9348-4D301E841F63} + {814616B6-04D3-47BB-8BFE-92D1063E558D} = {176B5BD9-DFAB-4FAF-BE61-067124AEC79B} + {6BAB1317-AF97-4CFD-806C-98D8510A95E3} = {797820E5-77CF-4B31-85F1-08FEA6555951} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CC1775C2-579F-4897-8770-592966D00E3D} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/ClientConnectionMetaData.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/ClientConnectionMetaData.cs new file mode 100644 index 000000000..f3778b631 --- /dev/null +++ b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/ClientConnectionMetaData.cs @@ -0,0 +1,42 @@ +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/10/2023 8:41:06 AM + +using Fusee.SLIRP.Network.Common; +using System.Net; +using System.Net.Sockets; + + +namespace Fusee.SLIRP.Network.Client.Common +{ + public struct ClientConnectionMetaData + { + public ConnectionMetaData connData; + + /// + /// The IP address to connect to. + /// + public IPAddress ServerIPAddress; + + + public int Port => connData.Port; + public AddressFamily AddressFamily => connData.AddressFamily; + public ProtocolType ProtocolType => connData.ProtocolType; + public SocketType SocketType => connData.SocketType; + public NetworkPackageMeta NetworkPackageMeta => connData.NetworkPackageMeta; + + public ClientConnectionMetaData (IPAddress serverIpAddress, int port, AddressFamily addressFamily, ProtocolType protocolType, SocketType socketType, NetworkPackageMeta networkPackageMeta) + { + ServerIPAddress = serverIpAddress; + connData = new ConnectionMetaData (port,addressFamily,protocolType,socketType,networkPackageMeta); + } + + public ClientConnectionMetaData(IPAddress serverIpAddress, ConnectionMetaData connectionMetaData, NetworkPackageMeta networkPackageMeta) + { + ServerIPAddress = serverIpAddress; + connData = new ConnectionMetaData(connectionMetaData); + } + } +} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/EstablishedConnectionData.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/EstablishedConnectionData.cs new file mode 100644 index 000000000..50c22bc4c --- /dev/null +++ b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/EstablishedConnectionData.cs @@ -0,0 +1,35 @@ +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/10/2023 10:22:35 AM + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client.Common +{ + public class EstablishedConnectionData + { + private IPAddress _connectionAddress; + private int _port; + private Socket _clientSocket; + + public IPAddress ConnectionAddress => _connectionAddress; + public int Port => _port; + + public Socket ClientSocket => _clientSocket; + + public EstablishedConnectionData(IPAddress connectionAddress, int port, Socket clientSocket) + { + _connectionAddress = connectionAddress; + _port = port; + _clientSocket = clientSocket; + } + } +} diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.csproj b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/Fusee.SLIRP.Network.Client.Common.csproj similarity index 67% rename from src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.csproj rename to src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/Fusee.SLIRP.Network.Client.Common.csproj index f4be3a830..f083dda8f 100644 --- a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.csproj +++ b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/Fusee.SLIRP.Network.Client.Common.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClient.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClient.cs new file mode 100644 index 000000000..d87d7e43a --- /dev/null +++ b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClient.cs @@ -0,0 +1,21 @@ +using Fusee.SLIRP.Network.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client.Common +{ + public interface IClient + { + public void Init(in ClientConnectionMetaData? metaData = null); + + public void Shutdown(); + + public void StartClient(); + + public void StopClient(); + + } +} diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Client.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClientConnectionHandlingThread.cs similarity index 51% rename from src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Client.cs rename to src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClientConnectionHandlingThread.cs index a2e4a4988..279e08408 100644 --- a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Client.cs +++ b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClientConnectionHandlingThread.cs @@ -1,19 +1,18 @@ -// +// // Copyright (c) 2023 All Rights Reserved // // Marc-Alexander Lohfink -// 2/9/2023 5:08:56 PM +// 2/10/2023 10:44:23 AM -using Fusee.SLIRP.Network.Common; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Fusee.SLIRP.Network.Client +namespace Fusee.SLIRP.Network.Client.Common { - public class Client : IClient + internal class IClientConnectionHandlingThread { } } diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerHandlingThread.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerHandlingThread.cs new file mode 100644 index 000000000..aef724eb1 --- /dev/null +++ b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerHandlingThread.cs @@ -0,0 +1,58 @@ +using Fusee.SLIRP.Network.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client.Common +{ + public abstract class IConnToServerHandlingThread + { + private EstablishedConnectionData _connectionData; + private IDisconnectFromServerHandler _diconnectHandler; + private NetworkPackageMeta _packageMeta; + private Socket socketToServer; + + private bool _isInitialized; + + public event Action OnDisconnectedFromServer; + + protected EstablishedConnectionData ConnData + { + get => _connectionData; + } + + protected IDisconnectFromServerHandler DisconnectHandler + { + get => _diconnectHandler; + } + + protected NetworkPackageMeta NetworkPackageMeta => _packageMeta; + + protected Socket SocketToServer => ConnData.ClientSocket; + + protected IConnToServerHandlingThread() + { + } + + public void Init(IDisconnectFromServerHandler disconnectHandler, EstablishedConnectionData connData, NetworkPackageMeta packageMeta) + { + _connectionData = connData; + _diconnectHandler = disconnectHandler; + _packageMeta = packageMeta; + _isInitialized = true; + } + + public virtual void Shutdown() + { + _isInitialized = false; + } + + public abstract void RunHandleConnection(); + + public abstract void OnClientDisconnected(IConnToServerHandlingThread handler, EstablishedConnectionData connData); + + } +} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerReceiver.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerReceiver.cs new file mode 100644 index 000000000..122ddafdf --- /dev/null +++ b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerReceiver.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client.Common +{ + public interface IConnToServerReceiver + { + public void OnConnectionEstablished(EstablishedConnectionData connData); + + public void OnConnectionFailed(EstablishedConnectionData connData); + + } +} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectToServerHandler.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectToServerHandler.cs new file mode 100644 index 000000000..a545f945f --- /dev/null +++ b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectToServerHandler.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client.Common +{ + public interface IConnectToServerHandler + { + } +} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionRequester.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionRequester.cs new file mode 100644 index 000000000..dd9e2c4ba --- /dev/null +++ b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionRequester.cs @@ -0,0 +1,30 @@ +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/9/2023 5:06:32 PM + +using Fusee.SLIRP.Network.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client.Common +{ + public interface IConnectionRequester + { + public void Init(ClientConnectionMetaData connectionMetaData, IConnToServerReceiver connectionToServerHandler); + + public void Shutdown(); + + public void StartRequesting(); + + public void StopRequesting(); + + public void RequestConnection(); + + } +} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionToServerHandler.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionToServerHandler.cs new file mode 100644 index 000000000..82188918f --- /dev/null +++ b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionToServerHandler.cs @@ -0,0 +1,36 @@ +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/10/2023 10:44:41 AM + +using Fusee.SLIRP.Network.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client.Common +{ + public interface IConnectionToServerHandler : IConnToServerReceiver + { + + public event Action EventOnConnectedToServer; + public event Action EventOnDisconnectedFromServer; + + /// + /// Initialize the Handler so that he is able to handle the running connection handling threads. + /// + /// What kind of handling thread will be instantiated when a new client connects. + public void Init(NetworkPackageMeta networkPackageMeta); + + public void Shutdown(); + + public void StartHandling(); + + public void StopHandling(); + + } +} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IDisconnectFromServerHandler.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IDisconnectFromServerHandler.cs new file mode 100644 index 000000000..93d5d2810 --- /dev/null +++ b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IDisconnectFromServerHandler.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client.Common +{ + public interface IDisconnectFromServerHandler + { + } +} diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicClient.cs b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicClient.cs new file mode 100644 index 000000000..19915fece --- /dev/null +++ b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicClient.cs @@ -0,0 +1,116 @@ +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/9/2023 5:08:56 PM + +using Fusee.SLIRP.Network.Common; +using System; +using System.Collections.Generic; +using System.Net.Sockets; +using System.Net; +using Fusee.SLIRP.Network.Client.Common; + +namespace Fusee.SLIRP.Network.Client.Core +{ + public class BasicClient : IClient + { + public const int BUFFERSIZE = 1024; + public static IPAddress serverIP = IPAddress.Parse("127.0.0.1"); + public static ClientConnectionMetaData DefaultSLIRP = new ClientConnectionMetaData(IPAddress.Any, 1300, AddressFamily.InterNetwork, ProtocolType.Udp, SocketType.Stream, new NetworkPackageMeta(BUFFERSIZE)); + + private bool _isInitialized; + private bool _isRunning; + + private Socket _socket; + + private IConnectionRequester _requester; + private IConnectionToServerHandler? _connToServerHandler; + + private Thread? _connRequesterThread; + private Thread? _connToServerHandlerThread; + + private ClientConnectionMetaData curClientConnectionMetaData; + + + public void Init(in ClientConnectionMetaData? metaData = null) + { + if (_isRunning || _isInitialized) return; + + _isInitialized = true; + + if (metaData != null) + { + curClientConnectionMetaData = metaData.Value; + } + else + { + curClientConnectionMetaData = DefaultSLIRP; + //curServerConnectionMetaData.NetworkPackageMeta = new NetworkPackageMeta(BUFFERSIZE); + } + + _socket = new Socket(curClientConnectionMetaData.AddressFamily, curClientConnectionMetaData.SocketType, curClientConnectionMetaData.ProtocolType); + + _requester = new BasicConnectionRequester(); + _connToServerHandler = new BasicConnectionToServerHandler(); + + _connToServerHandler.Init(curClientConnectionMetaData.NetworkPackageMeta); + _requester.Init(curClientConnectionMetaData, _connToServerHandler); + + _connRequesterThread = new Thread(new ThreadStart(_requester.StartRequesting)); + _connToServerHandlerThread = new Thread(new ThreadStart(_connToServerHandler.StartHandling)); + } + + public void Shutdown() + { + if (!_isInitialized) + return; + + StopClient(); + + _requester.Shutdown(); + _connToServerHandler.Shutdown(); + } + + public void StartClient() + { + if (!_isInitialized) + return; + + if (_isRunning) return; + + _connToServerHandlerThread.Start(); + _connRequesterThread.Start(); + } + + public void StopClient() + { + if (!_isInitialized) + return; + + if(!_isRunning) return; + + _requester.StopRequesting(); + _connToServerHandler.StopHandling(); + + InterruptThread(_connRequesterThread); + + InterruptThread(_connToServerHandlerThread); + } + + public static void InterruptThread(Thread threadToInterrupt) + { + if (threadToInterrupt.ThreadState == ThreadState.Running) + { + try + { + threadToInterrupt.Interrupt(); + } + catch (Exception e) + { + Console.WriteLine("There was a problem interrupting the thread! " + e.Message); + } + } + } + } +} diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionRequester.cs b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionRequester.cs new file mode 100644 index 000000000..80ba9f77b --- /dev/null +++ b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionRequester.cs @@ -0,0 +1,96 @@ +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/10/2023 9:51:54 AM + +using Fusee.SLIRP.Network.Client.Common; +using Fusee.SLIRP.Network.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Reflection.Metadata.Ecma335; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client.Core +{ + public class BasicConnectionRequester : IConnectionRequester + { + private int _port; + private IPAddress _serverAddress; + private AddressFamily _addressFamily = AddressFamily.InterNetwork; + private ProtocolType _protocolType; + private SocketType _socketType; + + private Socket _clientSocket; + private IConnToServerReceiver _connectionToServerReceiver; + + private bool _isInitialized; + private bool _isRunning; + + + public void Init(ClientConnectionMetaData connectionMetaData, IConnToServerReceiver connectionToServerHandler) + { + _port= connectionMetaData.Port; + _serverAddress= connectionMetaData.ServerIPAddress; + _addressFamily = connectionMetaData.AddressFamily; + _protocolType = connectionMetaData.ProtocolType; + _socketType = connectionMetaData.SocketType; + + _isInitialized = true; + } + + public void Shutdown() + { + if(!_isInitialized) return; + + if(_isRunning) + StopRequesting(); + + _isInitialized = false; + } + + public void StartRequesting() + { + if (!_isInitialized) return; + + if (_isRunning) return; + + _isRunning = true; + + RequestConnection(); + + } + + public void StopRequesting() + { + _isRunning= false; + } + + public virtual void RequestConnection() + { + _clientSocket = new Socket(_addressFamily,_socketType,_protocolType); + + EstablishedConnectionData establishedUdpConnectionData = new EstablishedConnectionData(_serverAddress, _port, _clientSocket); + + try + { + _clientSocket.Connect(_serverAddress, _port); + _connectionToServerReceiver.OnConnectionEstablished(establishedUdpConnectionData); + + } + catch(Exception e) + { + Console.WriteLine("Verbindung fehlgeschlagen: " + e.Message); + Console.WriteLine(e.StackTrace); + + _connectionToServerReceiver.OnConnectionFailed(establishedUdpConnectionData); + } + + StopRequesting(); + } + } +} diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionToServerHandler.cs b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionToServerHandler.cs new file mode 100644 index 000000000..f870dedfa --- /dev/null +++ b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionToServerHandler.cs @@ -0,0 +1,160 @@ +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/10/2023 10:46:34 AM + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using Fusee.SLIRP.Network.Client.Common; +using Fusee.SLIRP.Network.Common; + +namespace Fusee.SLIRP.Network.Client.Core +{ + public class BasicConnectionToServerHandler : IConnectionToServerHandler, IDisconnectFromServerHandler where T : IConnToServerHandlingThread, new() + { + private NetworkPackageMeta _packageMeta; + + private bool _isInitialized; + private bool _isRunning; + + private Dictionary _handlingThreads = new Dictionary(); + + + public event Action EventOnConnectedToServer; + public event Action EventOnConnectionToServerFailed; + public event Action EventOnDisconnectedFromServer; + + public void Init( NetworkPackageMeta networkPackageMeta) + { + _packageMeta = networkPackageMeta; + + + //set first so incomming connectioncan be handled directly + _isInitialized = true; + + } + public void Shutdown() + { + if (!_isInitialized) + return; + + StopHandling(); + + _isInitialized = false; + } + + private void ShutdownAllHandlings() + { + foreach (var connData in _handlingThreads) + { + AbortThreadHandling(connData.Value); + + ShutdownSocket(connData.Key.ClientSocket); + } + } + + private static void ShutdownSocket(Socket socket, SocketShutdown how = SocketShutdown.Both) + { + if (socket != null) + { + try + { + socket.Shutdown(how); + } + catch (Exception e) + { + Console.WriteLine("Could not shutdown socket! " + e.Message); + } + } + } + + private static void AbortThreadHandling(Thread handlingThread) + { + try + { + if (handlingThread.ThreadState == ThreadState.Running) + { + handlingThread.Abort(); + } + } + catch (Exception e) + { + Console.WriteLine("Could not abort thread! " + e.Message); + } + } + + public void StartHandling() + { + if (_isInitialized) return; + + if(_isRunning) return; + + _isRunning = true; + } + + public void StopHandling() + { + if (!_isInitialized) return; + + if(!_isRunning) return; + + ShutdownAllHandlings(); + + _isRunning = false; + } + + private void HandleConnection(EstablishedConnectionData connData) + { + if (!_isInitialized) + return; + + if (connData.ClientSocket == null) throw new NullReferenceException("_connectionToServerReceiver was called without an argument"); + + T connectionToServerHandling = new T(); + connectionToServerHandling.Init(this, connData, _packageMeta); + + Thread clientThread = new Thread(new ThreadStart(connectionToServerHandling.RunHandleConnection)); + + AddSocketToDictionary(connData, clientThread); + + clientThread.Start(); + } + + public void OnConnectionEstablished(EstablishedConnectionData connData) + { + HandleConnection(connData); + + EventOnConnectedToServer?.Invoke(this, connData); + } + + public void OnConnectionFailed(EstablishedConnectionData connData) + { + EventOnConnectionToServerFailed?.Invoke(this, connData); + } + + private void AddSocketToDictionary(EstablishedConnectionData connData, Thread handledThread) + { + _handlingThreads.Add(connData, handledThread); + } + + private void RemoveSocketFromDictionary(EstablishedConnectionData connData) + { + if (_handlingThreads.ContainsKey(connData)) + { + _handlingThreads.Remove(connData); + } + } + + + + + + } + + +} + diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicPingPongWithServerHandling.cs b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicPingPongWithServerHandling.cs new file mode 100644 index 000000000..b1f56a759 --- /dev/null +++ b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicPingPongWithServerHandling.cs @@ -0,0 +1,51 @@ +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/10/2023 11:21:17 AM + +using Fusee.SLIRP.Network.Client.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client.Core +{ + internal class BasicPingPongWithServerHandling : IDisposableConnToServerHandlingThread + { + + public override void OnClientDisconnected(IConnToServerHandlingThread handler, EstablishedConnectionData connData) + { + throw new NotImplementedException(); + } + + public override void RunHandleConnection() + { + while (true) + { + byte[] buffer = new byte[NetworkPackageMeta.BufferSize]; + int bytesReceived = SocketToServer.Receive(buffer); + + buffer = ASCIIEncoding.ASCII.GetBytes("Ping"); + Console.WriteLine("[Basic Ping Pong] Send: " + "Ping"); + SocketToServer.Send(buffer); + + string messageReceived = ASCIIEncoding.ASCII.GetString(buffer, 0, bytesReceived); + Console.WriteLine("[Basic Ping Pong] Received: " + messageReceived); + + bytesReceived = SocketToServer.Receive(buffer); + messageReceived = ASCIIEncoding.ASCII.GetString(buffer, 0, bytesReceived); + Console.WriteLine("[Basic Ping Pong] Received: " + messageReceived); + + buffer = ASCIIEncoding.ASCII.GetBytes("Pong"); + Console.WriteLine("[Basic Ping Pong] Send: " + "Pong"); + SocketToServer.Send(buffer); + + break; + } + } + } +} diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.Core.csproj b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.Core.csproj new file mode 100644 index 000000000..c9fb0d631 --- /dev/null +++ b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.Core.csproj @@ -0,0 +1,14 @@ + + + + net7.0 + enable + enable + + + + + + + + diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IClient.cs b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IClient.cs deleted file mode 100644 index 06d335957..000000000 --- a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IClient.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Fusee.SLIRP.Network.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client -{ - public interface IClient - { - public void Init(in ServerConnectionMetaData? metaData = null, int maxConnections = 6); - - public void Shutdown(); - - public void StartServer(in ServerConnectionMetaData? metaData = null); - - public void StopServer(); - - } -} diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IDisposableConnToServerHandlingThread.cs b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IDisposableConnToServerHandlingThread.cs new file mode 100644 index 000000000..85201867a --- /dev/null +++ b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IDisposableConnToServerHandlingThread.cs @@ -0,0 +1,26 @@ +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/10/2023 11:22:19 AM + +using Fusee.SLIRP.Network.Client.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Client.Core +{ + internal abstract class IDisposableConnToServerHandlingThread : IConnToServerHandlingThread, IDisposable + { + public void Dispose() + { + OnDispose(); + OnClientDisconnected(this, ConnData); + } + + protected virtual void OnDispose() { } + } +} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionAddressData.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionAddressData.cs new file mode 100644 index 000000000..88a8aa71e --- /dev/null +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionAddressData.cs @@ -0,0 +1,28 @@ +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/10/2023 10:03:36 AM + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Common +{ + public class ConnectionAddressData + { + + public IPAddress ConnectionAddress; + public int Port = 1337; + + public ConnectionAddressData(IPAddress connectionAddress, int port) + { + ConnectionAddress = connectionAddress; + Port = port; + } + } +} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionMetaData.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionMetaData.cs new file mode 100644 index 000000000..804b6d9b7 --- /dev/null +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionMetaData.cs @@ -0,0 +1,38 @@ +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/10/2023 9:02:23 AM + + +using System.Net.Sockets; + +namespace Fusee.SLIRP.Network.Common +{ public struct ConnectionMetaData + { + public int Port = 1337; + + public AddressFamily AddressFamily = AddressFamily.InterNetwork; + public ProtocolType ProtocolType = ProtocolType.Udp; + public SocketType SocketType = SocketType.Stream; + public NetworkPackageMeta NetworkPackageMeta; + + public ConnectionMetaData(int port, AddressFamily addressFamily, ProtocolType protocolType, SocketType socketType, NetworkPackageMeta networkPackageMeta) + { + Port = port; + AddressFamily = addressFamily; + ProtocolType = protocolType; + SocketType = socketType; + NetworkPackageMeta = networkPackageMeta; + } + + public ConnectionMetaData(ConnectionMetaData connectionMetaData) + { + Port = connectionMetaData.Port; + AddressFamily = connectionMetaData.AddressFamily; + ProtocolType = connectionMetaData.ProtocolType; + SocketType = connectionMetaData.SocketType; + NetworkPackageMeta = connectionMetaData.NetworkPackageMeta; + } + } +} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandler.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandler.cs deleted file mode 100644 index b07be8dca..000000000 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandler.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Common -{ - public interface IConnectionHandler - { - public event Action EventClientConnected; - public event Action EventClientDisconnected; - - /// - /// Initialize the Handler so that he is able to handle accepted connections and disconnected clients. - /// - /// The handler which accepts incoming connections. - /// What kind of handling thread will be instantiated when a new client connects. - public void Init(IConnectionRequestHandler requestHandler); - - public void Shutdown(); - - } -} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequester.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequester.cs deleted file mode 100644 index c7df62163..000000000 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequester.cs +++ /dev/null @@ -1,18 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/9/2023 5:06:32 PM - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client -{ - internal interface IConnectionRequester - { - } -} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IDisconnectHandler.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IDisconnectHandler.cs deleted file mode 100644 index ea5045ce4..000000000 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IDisconnectHandler.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Common -{ - public interface IDisconnectHandler - { - - public void OnClientDisconnected(IConnectionHandlingThread sender, Socket clientSocket); - } -} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/NetworkPackageMeta.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/NetworkPackageMeta.cs index d99d16807..f244d5497 100644 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/NetworkPackageMeta.cs +++ b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/NetworkPackageMeta.cs @@ -15,7 +15,7 @@ namespace Fusee.SLIRP.Network.Common { public struct NetworkPackageMeta { - public int BufferSize; + public int BufferSize = 1024; public NetworkPackageMeta(int bufferSize) { diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerConnectionMetaData.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerConnectionMetaData.cs deleted file mode 100644 index 12ac9e8af..000000000 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerConnectionMetaData.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Net; -using System.Net.Sockets; - -namespace Fusee.SLIRP.Network.Common -{ - public struct ServerConnectionMetaData - { - public IPAddress ValidIPAdress = IPAddress.Any; - public Int32 Port = 1300; - public AddressFamily AddressFamily = AddressFamily.InterNetwork; - public ProtocolType ProtocolType = ProtocolType.Udp; - - public SocketType SocketType = SocketType.Stream; - - public NetworkPackageMeta NetworkPackageMeta; - - public ServerConnectionMetaData(IPAddress validIPAdress, int port, AddressFamily addressFamily,ProtocolType protocolType, NetworkPackageMeta networkPackageMeta) - { - ValidIPAdress = validIPAdress; - Port = port; - AddressFamily = addressFamily; - ProtocolType = protocolType; - NetworkPackageMeta = networkPackageMeta; - } - } -} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/Fusee.SLIRP.Network.RenderServer.csproj b/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/Fusee.SLIRP.Network.RenderServer.csproj index 4230af7b8..4fe8f2ccc 100644 --- a/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/Fusee.SLIRP.Network.RenderServer.csproj +++ b/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/Fusee.SLIRP.Network.RenderServer.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/ClientHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/ClientHandler.cs index 36b204a07..6dc97404e 100644 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/ClientHandler.cs +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/ClientHandler.cs @@ -4,7 +4,7 @@ using System.Text; using System.Threading.Tasks; -namespace Fusee.SLIRP.Network +namespace Fusee.SLIRP.Network.Server { internal class ClientHandler { diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandler.cs deleted file mode 100644 index 6fda5cb5d..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionHandler.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System.Net.Sockets; -using Fusee.SLIRP.Network.Common; - -namespace Fusee.SLIRP.Network -{ - /// - /// Handles all accepted connections by the and also the disconnecting connections. - /// - /// - internal class ConnectionHandler : IConnectionHandler, IConnectHandler, IDisconnectHandler, IDisposable where T : IConnectionHandlingThread, new () - { - private IConnectionRequestHandler _requestHandler; - private NetworkPackageMeta _packageMeta; - - private bool _isInitialized; - - private Dictionary _handlingThreads = new Dictionary(); - - public event Action EventClientConnected; - - public event Action EventClientDisconnected; - - public void Init(IConnectionRequestHandler requestHandler, NetworkPackageMeta packageMeta) - { - _packageMeta = packageMeta; - - //make sure that it is not already registered - DeregisterFromRequestHandler(); - - _requestHandler = requestHandler; - - //set first so incomming connectioncan be handled directly - _isInitialized = true; - - RegisterAtRequestHandler(); - } - - public void Shutdown() - { - DeregisterFromRequestHandler(); - - _isInitialized = false; - } - - private void RegisterAtRequestHandler() - { - if (_requestHandler == null) throw new NullReferenceException("Client Handler initialization was called without an IConnectionRequestHandler!"); - - _requestHandler.OnClientConnect += OnClientConnected; - } - - private void DeregisterFromRequestHandler() - { - if (_requestHandler != null) - { - _requestHandler.OnClientConnect -= OnClientConnected; - } - } - - private void HandleClient(Socket clientSocket) - { - if (!_isInitialized) - return; - - if (clientSocket == null) throw new NullReferenceException("Client Handler was called without an argument"); - - T clientHandling = new T(); - clientHandling.Init(this, clientSocket, _packageMeta); - - Thread clientThread = new Thread(new ThreadStart(clientHandling.RunHandleConnection)); - - AddSocketToDictionary(clientSocket, clientThread); - - clientThread.Start(); - } - - public void OnClientConnected(IConnectionRequestHandler sender, Socket clientSocket) - { - if (sender != _requestHandler) - return; - - HandleClient(clientSocket); - - EventClientConnected?.Invoke(this, clientSocket); - } - - public void OnClientDisconnected(IConnectionHandlingThread sender, Socket clientSocket) - { - if (sender != _requestHandler) - return; - - RemoveSocketFromDictionary(clientSocket); - - EventClientDisconnected?.Invoke(this, clientSocket); - } - - private void AddSocketToDictionary(Socket clientSocket, Thread clientThread) - { - _handlingThreads.Add(clientSocket, clientThread); - } - - private void RemoveSocketFromDictionary(Socket clientSocket) - { - if (_handlingThreads.ContainsKey(clientSocket)) - { - _handlingThreads.Remove(clientSocket); - } - } - - public void Dispose() - { - Shutdown(); - } - } -} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionRequestHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionRequestHandler.cs deleted file mode 100644 index df68d27c0..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/ConnectionRequestHandler.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Fusee.SLIRP.Network.Common; -using System.Net; -using System.Net.Sockets; - -namespace Fusee.SLIRP.Network -{ - internal class ConnectionRequestHandler : IConnectionRequestHandler - { - private ServerMetaData serverMetaData; - private Socket serverSocket; - - IPEndPoint listeningEndPoint; - - bool threadContinue = false; - - public event Action OnClientConnect; - - public ConnectionRequestHandler(ServerMetaData serverMetaData) - { - this.serverMetaData = serverMetaData; - } - - - public void Shutdown() - { - threadContinue = false; - - if(serverSocket != null) - serverSocket.Close(); - } - - public void Run() - { - threadContinue = true; - - serverSocket = serverMetaData.ServerSocket; - - listeningEndPoint = new IPEndPoint(serverMetaData.ConnectionData.ValidIPAdress, serverMetaData.ConnectionData.Port); - - serverSocket.Bind(listeningEndPoint); - serverSocket.Listen(serverMetaData.MaxConnections); - - while (threadContinue) - { - try - { - Socket clientSocket = serverSocket.Accept(); - - OnClientConnect?.Invoke(this, clientSocket); - - } - catch (System.Exception) - { - throw; - } - } - } - } -} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.csproj b/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.Core.csproj similarity index 78% rename from src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.csproj rename to src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.Core.csproj index b36a00b50..837f33dc8 100644 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.csproj +++ b/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.Core.csproj @@ -9,6 +9,7 @@ + diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/UDPClientThread.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/UDPClientThread.cs deleted file mode 100644 index 3abd46fe8..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/UDPClientThread.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network -{ - - internal class UDPClientThread - { - - - public UDPClientThread(SLIRPRenderServer server) - { - - } - - public void Run() - { - - } - } -} diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/Fusee.SLIRP.Network.Server.Common.csproj b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/Fusee.SLIRP.Network.Server.Common.csproj new file mode 100644 index 000000000..f083dda8f --- /dev/null +++ b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/Fusee.SLIRP.Network.Server.Common.csproj @@ -0,0 +1,13 @@ + + + + net7.0 + enable + enable + + + + + + + diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectHandler.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectHandler.cs similarity index 69% rename from src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectHandler.cs rename to src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectHandler.cs index 6cb42cac9..cc4ea3928 100644 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectHandler.cs +++ b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectHandler.cs @@ -7,10 +7,14 @@ using System.Net.Sockets; -namespace Fusee.SLIRP.Network.Common +namespace Fusee.SLIRP.Network.Server.Common { public interface IConnectHandler { + public bool IsHandlingConnections { get; } + + public event Action EventClientConnected; + public void OnClientConnected(IConnectionRequestHandler sender, Socket clientSocket); } } diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandler.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandler.cs new file mode 100644 index 000000000..607589b6a --- /dev/null +++ b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandler.cs @@ -0,0 +1,33 @@ +using Fusee.SLIRP.Network.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace Fusee.SLIRP.Network.Server.Common +{ + + /// + /// Interface for connection handlers who should notice connections and disconnections. + /// + public interface IConnectionHandler : IConnectHandler, IDisconnectHandler + { + + public bool IsRunning { get; } + + /// + /// Initialize the Handler so that he is able to handle accepted connections and disconnected clients. + /// + /// What kind of handling thread will be instantiated when a new client connects. + public void Init(NetworkPackageMeta networkPackageMeta); + + public void StartHandling(); + + public void StopHandling(); + + public void Shutdown(); + + } +} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandlingThread.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandlingThread.cs similarity index 87% rename from src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandlingThread.cs rename to src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandlingThread.cs index b3446b68f..97427b656 100644 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionHandlingThread.cs +++ b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandlingThread.cs @@ -1,12 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using Fusee.SLIRP.Network.Common; using System.Net.Sockets; -using System.Net.WebSockets; -using System.Text; -using System.Threading.Tasks; -namespace Fusee.SLIRP.Network.Common + +namespace Fusee.SLIRP.Network.Server.Common { public abstract class IConnectionHandlingThread { @@ -42,6 +38,11 @@ public void Init(IDisconnectHandler connectionHandler, Socket clientSocket, Net _isInitialized = true; } + public virtual void Shutdown() + { + _isInitialized = false; + } + public abstract void RunHandleConnection(); public abstract void OnClientDisconnected(IConnectionHandlingThread handler, Socket disconnectedClient); diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequestHandler.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionRequestHandler.cs similarity index 66% rename from src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequestHandler.cs rename to src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionRequestHandler.cs index d6cd14113..2092839a2 100644 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/IConnectionRequestHandler.cs +++ b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionRequestHandler.cs @@ -5,11 +5,11 @@ using System.Text; using System.Threading.Tasks; -namespace Fusee.SLIRP.Network.Common +namespace Fusee.SLIRP.Network.Server.Common { public interface IConnectionRequestHandler { - public event Action OnClientConnect; + public void Init(ServerMetaData serverMetaData, IConnectionHandler connectHandler); public void Shutdown(); diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisconnectHandler.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisconnectHandler.cs new file mode 100644 index 000000000..054f1bb56 --- /dev/null +++ b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisconnectHandler.cs @@ -0,0 +1,15 @@ +using Fusee.SLIRP.Network.Common; +using System.Net.Sockets; + +namespace Fusee.SLIRP.Network.Server.Common +{ + public interface IDisconnectHandler + { + + public bool IsHandlingDisconnecs { get; } + + public event Action EventClientDisconnected; + + public void OnClientDisconnected(IConnectionHandlingThread sender, Socket clientSocket); + } +} diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisposableConnectionHandling.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisposableConnectionHandling.cs new file mode 100644 index 000000000..d5997d8f3 --- /dev/null +++ b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisposableConnectionHandling.cs @@ -0,0 +1,29 @@ +using Fusee.SLIRP.Network.Common; +using Fusee.SLIRP.Network.Server.Common; +using System.Net.Sockets; +using System.Text; + +namespace Fusee.SLIRP.Network.Server.Examples +{ + /// + /// Controls what happens while a client is connected. + /// Calls when disposed. + /// + public abstract class IDisposableConnectionHandling : IConnectionHandlingThread, IDisposable + { + public IDisposableConnectionHandling():base() { } + + /// + /// Called when disposed. + /// Calls first then + /// + public void Dispose() + { + OnDispose(); + OnClientDisconnected(this, ClientSocket); + } + + + protected virtual void OnDispose() { } + } +} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/IServer.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IServer.cs similarity index 90% rename from src/SLIRP/Network/Fusee.SLIRP.Network/IServer.cs rename to src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IServer.cs index 44205d578..6875e8d46 100644 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/IServer.cs +++ b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IServer.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; -namespace Fusee.SLIRP.Network.Client +namespace Fusee.SLIRP.Network.Server.Common { public interface IServer { diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerConnectionMetaData.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerConnectionMetaData.cs new file mode 100644 index 000000000..2f488d939 --- /dev/null +++ b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerConnectionMetaData.cs @@ -0,0 +1,33 @@ +using Fusee.SLIRP.Network.Common; +using System.Net; +using System.Net.Sockets; + +namespace Fusee.SLIRP.Network.Server.Common +{ + public struct ServerConnectionMetaData + { + /// + /// Which IP addresses will be accepted. + /// + public IPAddress ValidIPAdress = IPAddress.Any; + public ConnectionMetaData connData; + + public int Port => connData.Port; + public AddressFamily AddressFamily => connData.AddressFamily; + public ProtocolType ProtocolType => connData.ProtocolType; + public SocketType SocketType => connData.SocketType; + public NetworkPackageMeta NetworkPackageMeta=> connData.NetworkPackageMeta; + + public ServerConnectionMetaData(IPAddress validIPAdress, int port, AddressFamily addressFamily,ProtocolType protocolType, SocketType socketType, NetworkPackageMeta networkPackageMeta) + { + ValidIPAdress = validIPAdress; + connData = new ConnectionMetaData(port, addressFamily, protocolType, socketType, networkPackageMeta); + } + + public ServerConnectionMetaData(IPAddress validIPAdress, ConnectionMetaData connectionMetaData, NetworkPackageMeta networkPackageMeta) + { + ValidIPAdress = validIPAdress; + connData = new ConnectionMetaData(connectionMetaData); + } + } +} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerMetaData.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerMetaData.cs similarity index 80% rename from src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerMetaData.cs rename to src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerMetaData.cs index cf49eaebc..035632f6a 100644 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ServerMetaData.cs +++ b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerMetaData.cs @@ -1,7 +1,11 @@ using System.Net.Sockets; -namespace Fusee.SLIRP.Network.Common +namespace Fusee.SLIRP.Network.Server.Common { + + /// + /// The data of a server with references. + /// public struct ServerMetaData { public IServer Server; diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/BasicPingPongHandler.cs b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicPingPongHandling.cs similarity index 68% rename from src/SLIRP/Network/Fusee.SLIRP.Network/BasicPingPongHandler.cs rename to src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicPingPongHandling.cs index b3d399d06..95f138f65 100644 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/BasicPingPongHandler.cs +++ b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicPingPongHandling.cs @@ -1,31 +1,35 @@ -using Fusee.SLIRP.Network.Common; +// +// Copyright (c) 2023 All Rights Reserved +// +// Marc-Alexander Lohfink +// 2/10/2023 9:36:43 AM + +using Fusee.SLIRP.Network.Server.Common; using System.Net.Sockets; using System.Text; -namespace Fusee.SLIRP.Network +namespace Fusee.SLIRP.Network.Server.Examples { /// - /// Controls what happens while a client is connected. + /// Basic example for a who just follows a ping pong. /// - internal class BasicPingPongHandler : IConnectionHandlingThread, IDisposable + public class BasicPingPongHandling : IDisposableConnectionHandling { - public BasicPingPongHandler():base() { } - - public void Dispose() + public override void OnClientDisconnected(IConnectionHandlingThread handler, Socket disconnectedClient) { - OnClientDisconnected(this, ClientSocket); + throw new NotImplementedException(); } public override void RunHandleConnection() { - while (true) + while (true) { byte[] buffer = new byte[NetworkPackageMeta.BufferSize]; int bytesReceived = ClientSocket.Receive(buffer); - + string messageReceived = ASCIIEncoding.ASCII.GetString(buffer, 0, bytesReceived); - Console.WriteLine("[Basic Ping Pong] Received: "+messageReceived); - + Console.WriteLine("[Basic Ping Pong] Received: " + messageReceived); + buffer = ASCIIEncoding.ASCII.GetBytes("Pong"); Console.WriteLine("[Basic Ping Pong] Send: " + "Pong"); ClientSocket.Send(buffer); @@ -42,9 +46,5 @@ public override void RunHandleConnection() } } - public override void OnClientDisconnected(IConnectionHandlingThread handler, Socket disconnectedClient) - { - - } } } diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/SLIRPRenderServer.cs b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicServer.cs similarity index 66% rename from src/SLIRP/Network/Fusee.SLIRP.Network/SLIRPRenderServer.cs rename to src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicServer.cs index ed156ea53..66ce0d8f3 100644 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/SLIRPRenderServer.cs +++ b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicServer.cs @@ -1,18 +1,19 @@ using Fusee.SLIRP.Network.Common; +using Fusee.SLIRP.Network.Server.Common; using System.Net; using System.Net.Sockets; -namespace Fusee.SLIRP.Network +namespace Fusee.SLIRP.Network.Server.Examples { - public class SLIRPRenderServer : IServer + public class BasicServer : IServer { public const int BUFFERSIZE = 1024; - public static ServerConnectionMetaData DefaultSLIRP = new ServerConnectionMetaData(IPAddress.Any, 1300, AddressFamily.InterNetwork, ProtocolType.Udp, new NetworkPackageMeta(BUFFERSIZE)); + public static ServerConnectionMetaData DefaultSLIRP = new ServerConnectionMetaData(IPAddress.Any, 1300, AddressFamily.InterNetwork, ProtocolType.Udp, SocketType.Stream, new NetworkPackageMeta(BUFFERSIZE)); private bool _isInitialized; private bool _isRunning; private IConnectionRequestHandler? _connRequestHandler; - private IConnectionHandler? _clientHandler; + private IConnectionHandler? _connectionHandler; private Thread? _connRequestHandlerThread; private ServerConnectionMetaData curServerConnectionMetaData; @@ -42,10 +43,13 @@ public void Init(in ServerConnectionMetaData? metaData = null, int maxConnection renderSocket = new Socket(curServerConnectionMetaData.AddressFamily, curServerConnectionMetaData.SocketType, curServerConnectionMetaData.ProtocolType); serverMetaData = new ServerMetaData(this, renderSocket, this.maxConnections, curServerConnectionMetaData); - _connRequestHandler = new ConnectionRequestHandler(serverMetaData); + _connectionHandler = new ConnectionHandler(); + _connRequestHandler = new ConnectionRequestHandler(); - _clientHandler = new ConnectionHandler(); - _clientHandler.Init(_connRequestHandler); + _connectionHandler.Init(curServerConnectionMetaData.NetworkPackageMeta); + _connRequestHandler.Init(serverMetaData, _connectionHandler); + + _connRequestHandlerThread = new Thread(new ThreadStart(_connRequestHandler.Run)); } @@ -60,8 +64,23 @@ public void Shutdown() return; } - if(_connRequestHandler!= null) + if (_connRequestHandler != null) + { _connRequestHandler.Shutdown(); + } + + if(_connRequestHandlerThread.ThreadState == ThreadState.Running) + { + try + { + _connRequestHandlerThread.Abort(); + }catch(Exception e) + { + Console.WriteLine("There was a problem aborting request handler thread!" + e.Message); + } + } + + _isInitialized = false; } @@ -79,9 +98,9 @@ public void StartServer(in ServerConnectionMetaData? metaData = null) _isRunning = true; - _connRequestHandlerThread = new Thread(new ThreadStart(_connRequestHandler.Run)); + _connectionHandler.StartHandling(); - _connRequestHandlerThread.Start(); + _connRequestHandlerThread.Start(); } @@ -96,6 +115,13 @@ public void StopServer() if (_connRequestHandlerThread != null) _connRequestHandlerThread.Interrupt(); + //if the server is stopped, all running connection handlings + //should shutdown. + if (_connectionHandler != null) + { + _connectionHandler.Shutdown(); + } + _isRunning = false; } diff --git a/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionHandler.cs b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionHandler.cs new file mode 100644 index 000000000..ab4666fb0 --- /dev/null +++ b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionHandler.cs @@ -0,0 +1,193 @@ +using System.Net.Sockets; +using Fusee.SLIRP.Network.Common; +using Fusee.SLIRP.Network.Server.Common; + +namespace Fusee.SLIRP.Network.Server.Examples +{ + /// + /// Handles all accepted connections by the and also the disconnecting connections. + /// + /// + internal class ConnectionHandler : IConnectionHandler, IDisposable where T : IConnectionHandlingThread, new() + { + private IConnectionRequestHandler _requestHandler; + private NetworkPackageMeta _packageMeta; + + private bool _isInitialized; + private bool _isHandling; + + private Dictionary _handlingThreads = new Dictionary(); + + public bool IsRunning => _isHandling; + + public bool IsHandlingConnections => _isHandling; + public bool IsHandlingDisconnecs => _isHandling; + + public event Action EventClientConnected; + + public event Action EventClientDisconnected; + + public void Init(NetworkPackageMeta networkPackageMeta) + { + _packageMeta = networkPackageMeta; + + //set first so incomming connectioncan be handled directly + _isInitialized = true; + } + + public void StartHandling() + { + if (!_isInitialized) + return; + + if (_isHandling) + return; + + _isHandling = true; + } + + public void StopHandling() + { + if (!_isHandling) + return; + + //if a handler stops handling, all handlings have to be shutdown + //e.g. if a server stops, the connections have to be closed. + // if the server starts all clients have to reconnect. + ShutdownAllHandlings(); + + _isHandling = false; + } + + public void Shutdown() + { + //DeregisterFromRequestHandler(); + + ShutdownAllHandlings(); + + _isInitialized = false; + } + + private void ShutdownAllHandlings() + { + if (_handlingThreads != null && _handlingThreads.Count > 0) + foreach (var handling in _handlingThreads) + { + Thread handlingThread = handling.Value; + Socket handlingSocket = handling.Key; + + ShutdownThread(handlingThread); + + ShutdownSocket(handlingSocket); + + } + } + + private static void ShutdownSocket(Socket handlingSocket) + { + if (handlingSocket != null) + { + try + { + + handlingSocket.Close(); + handlingSocket.Shutdown(SocketShutdown.Both); + } + catch (Exception e) + { + Console.WriteLine("There was a problem closing and shutingdown socket! " + e.Message); + } + } + } + + private static void ShutdownThread(Thread handlingThread) + { + if (handlingThread != null) + { + try + { + if (handlingThread.ThreadState == ThreadState.Running) + { + + handlingThread.Abort(); + } + } + catch (Exception e) + { + Console.WriteLine("There was a problem aborting connection handling thread! " + e.Message); + } + + } + } + + //private void RegisterAtRequestHandler() + //{ + // if (_requestHandler == null) throw new NullReferenceException("Client Handler initialization was called without an IConnectionRequestHandler!"); + + // _requestHandler.OnClientConnect += OnClientConnected; + //} + + //private void DeregisterFromRequestHandler() + //{ + // if (_requestHandler != null) + // { + // _requestHandler.OnClientConnect -= OnClientConnected; + // } + //} + + private void HandleClient(Socket clientSocket) + { + if (!_isInitialized) + return; + + if (clientSocket == null) throw new NullReferenceException("Client Handler was called without an argument"); + + T clientHandling = new T(); + clientHandling.Init(this, clientSocket, _packageMeta); + + Thread clientThread = new Thread(new ThreadStart(clientHandling.RunHandleConnection)); + + AddSocketToDictionary(clientSocket, clientThread); + + clientThread.Start(); + } + + public void OnClientConnected(IConnectionRequestHandler sender, Socket clientSocket) + { + if (sender != _requestHandler) + return; + + HandleClient(clientSocket); + + EventClientConnected?.Invoke(this, clientSocket); + } + + public void OnClientDisconnected(IConnectionHandlingThread sender, Socket clientSocket) + { + if (sender != _requestHandler) + return; + + RemoveSocketFromDictionary(clientSocket); + + EventClientDisconnected?.Invoke(this, clientSocket); + } + + private void AddSocketToDictionary(Socket clientSocket, Thread clientThread) + { + _handlingThreads.Add(clientSocket, clientThread); + } + + private void RemoveSocketFromDictionary(Socket clientSocket) + { + if (_handlingThreads.ContainsKey(clientSocket)) + { + _handlingThreads.Remove(clientSocket); + } + } + + public void Dispose() + { + Shutdown(); + } + } +} diff --git a/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionRequestHandler.cs b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionRequestHandler.cs new file mode 100644 index 000000000..633d180b9 --- /dev/null +++ b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionRequestHandler.cs @@ -0,0 +1,85 @@ +using Fusee.SLIRP.Network.Common; +using Fusee.SLIRP.Network.Server.Common; +using System.Net; +using System.Net.Sockets; + +namespace Fusee.SLIRP.Network.Server.Examples +{ + /// + /// Binds the socket and listens on it for new connections. + /// In order to be able to accept connections, the passed + /// has to be running. + /// + internal class ConnectionRequestHandler : IConnectionRequestHandler + { + private IConnectionHandler _connectHandler; + private ServerMetaData serverMetaData; + private Socket serverSocket; + + private IPEndPoint listeningEndPoint; + + bool threadContinue = false; + + private bool _isInitialized; + + public void Init (ServerMetaData serverMetaData, IConnectionHandler connectHandler) + { + this.serverMetaData = serverMetaData; + _connectHandler = connectHandler; + _isInitialized = true; + } + + + public void Shutdown() + { + if (!_isInitialized && !threadContinue) + return; + + threadContinue = false; + + if (serverSocket != null) + { + try + { + serverSocket.Close(); + serverSocket.Shutdown(SocketShutdown.Both); + } + catch(Exception e) + { + Console.WriteLine("There was a problem closing and shutting down the socket! " + e.Message); + } + } + + _isInitialized = false; + } + + public void Run() + { + threadContinue = true; + + serverSocket = serverMetaData.ServerSocket; + + listeningEndPoint = new IPEndPoint(serverMetaData.ConnectionData.ValidIPAdress, serverMetaData.ConnectionData.Port); + + serverSocket.Bind(listeningEndPoint); + serverSocket.Listen(serverMetaData.MaxConnections); + + while (threadContinue) + { + if (!_connectHandler.IsRunning) + continue; + + try + { + Socket clientSocket = serverSocket.Accept(); + + _connectHandler.OnClientConnected(this, clientSocket); + } + catch (System.Exception) + { + throw; + } + } + } + } +} diff --git a/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/Fusee.SLIRP.Network.Server.Examples.csproj b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/Fusee.SLIRP.Network.Server.Examples.csproj new file mode 100644 index 000000000..832c4e21b --- /dev/null +++ b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/Fusee.SLIRP.Network.Server.Examples.csproj @@ -0,0 +1,15 @@ + + + + net7.0 + enable + enable + + + + + + + + + From 08c03b666d1b9819490a38acb4a6763c5350b00f Mon Sep 17 00:00:00 2001 From: MarcLohfink Date: Thu, 16 Mar 2023 10:00:58 +0100 Subject: [PATCH 04/17] Post Render Event --- src/Engine/Common/IRenderCanvasImp.cs | 9 +++ src/Engine/Common/PostRenderEventArgs.cs | 11 +++ src/Engine/Core/RenderCanvas.cs | 10 +++ .../Imp/Graphics/Android/RenderCanvasImp.cs | 11 +++ .../Imp/Graphics/Blazor/RenderCanvasImp.cs | 15 ++++ .../Imp/Graphics/Desktop/RenderCanvasImp.cs | 81 +++++++++++++++++++ 6 files changed, 137 insertions(+) create mode 100644 src/Engine/Common/PostRenderEventArgs.cs diff --git a/src/Engine/Common/IRenderCanvasImp.cs b/src/Engine/Common/IRenderCanvasImp.cs index 1a32ab71e..37013f2b0 100644 --- a/src/Engine/Common/IRenderCanvasImp.cs +++ b/src/Engine/Common/IRenderCanvasImp.cs @@ -135,6 +135,11 @@ public interface IRenderCanvasImp /// public void DoRender(); + /// + /// Does the postrender of this instance. + /// + public void DoPostRender(); + /// /// Does the resize on this instance. /// @@ -163,6 +168,10 @@ public interface IRenderCanvasImp /// event EventHandler Render; /// + /// Occurs when [PostRender] is called. + /// + event EventHandler PostRender; + /// /// Occurs when [Resize] is called. /// event EventHandler Resize; diff --git a/src/Engine/Common/PostRenderEventArgs.cs b/src/Engine/Common/PostRenderEventArgs.cs new file mode 100644 index 000000000..59812d542 --- /dev/null +++ b/src/Engine/Common/PostRenderEventArgs.cs @@ -0,0 +1,11 @@ +using System; + +namespace Fusee.Engine.Common +{ + /// + /// Post-Render arguments for events. + /// + public class PostRenderEventArgs + { + } +} diff --git a/src/Engine/Core/RenderCanvas.cs b/src/Engine/Core/RenderCanvas.cs index d655673b6..a2f990908 100644 --- a/src/Engine/Core/RenderCanvas.cs +++ b/src/Engine/Core/RenderCanvas.cs @@ -232,6 +232,15 @@ public void InitApp() EndOfFrame?.Invoke(this, EventArgs.Empty); }; + //Wäre meine Idee gewesen. Dann müssten die Methoden "GetFrameBuffer" und "GetDepthBuffer" + //im Interface und damit für alle Implementierungen erstellt werden. Weiß nicht, ob das so gewollt ist. + //CanvasImplementor.PostRender += delegate + //{ + //var frameBuffer = CanvasImplementor.GetFrameBuffer(Width,Heigth); + //var depthBuffer = CanvasImplementor.GetDepthBuffer(Width,Heigth); + //}; + + CanvasImplementor.Resize += (s, e) => { if (IsShuttingDown) return; @@ -243,6 +252,7 @@ public void InitApp() }; } + /// /// Callback method to invoke user code for updating a frame. /// diff --git a/src/Engine/Imp/Graphics/Android/RenderCanvasImp.cs b/src/Engine/Imp/Graphics/Android/RenderCanvasImp.cs index 06b25b941..82cdad440 100644 --- a/src/Engine/Imp/Graphics/Android/RenderCanvasImp.cs +++ b/src/Engine/Imp/Graphics/Android/RenderCanvasImp.cs @@ -303,6 +303,11 @@ public void Run() /// public event EventHandler Render; + /// + /// Occurs when [postrender]. + /// + public event EventHandler PostRender; + /// /// Occurs when [resize]. /// @@ -342,6 +347,11 @@ public void DoRender() Render?.Invoke(this, new RenderEventArgs()); } + public void DoPostRender() + { + PostRender?.Invoke(this, new PostRenderEventArgs()); + } + /// /// Does the resize on this instance. /// @@ -350,6 +360,7 @@ public void DoResize(int width, int height) Resize?.Invoke(this, new ResizeEventArgs(width, height)); } + } internal class RenderCanvasGameView : AndroidGameView diff --git a/src/Engine/Imp/Graphics/Blazor/RenderCanvasImp.cs b/src/Engine/Imp/Graphics/Blazor/RenderCanvasImp.cs index 065104bac..d6f0552a3 100644 --- a/src/Engine/Imp/Graphics/Blazor/RenderCanvasImp.cs +++ b/src/Engine/Imp/Graphics/Blazor/RenderCanvasImp.cs @@ -93,6 +93,11 @@ public RenderCanvasImp(IJSObjectReference canvas, IJSRuntime runtime, WebGL2Rend /// public event EventHandler Render; + /// + /// Occurs when [postrender]. + /// + public event EventHandler PostRender; + /// /// Occurs when resizing. /// @@ -187,6 +192,14 @@ public void DoRender() Render?.Invoke(this, new RenderEventArgs()); } + /// + /// Does the postrender of this instance. + /// + public void DoPostRender() + { + throw new NotImplementedException(); + } + /// /// Does initialize this instance. /// @@ -223,5 +236,7 @@ public void DoResize(int w, int h) Resize?.Invoke(this, new ResizeEventArgs(w, h)); } + + } } \ No newline at end of file diff --git a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs index 7564bcaa9..36603528f 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs @@ -309,6 +309,10 @@ public RenderCanvasImp(int width, int height) /// public event EventHandler Render; /// + /// Occurs when [postrender]. + /// + public event EventHandler PostRender; + /// /// Occurs when [resize]. /// public event EventHandler Resize; @@ -366,6 +370,14 @@ public virtual void DoRender() Render?.Invoke(this, new RenderEventArgs()); } + /// + /// Does the postrender of this instance. + /// + public virtual void DoPostRender() + { + PostRender?.Invoke(this, new PostRenderEventArgs()); + } + /// /// Does the resize on this instance. /// @@ -518,6 +530,75 @@ public SixLabors.ImageSharp.Image ShootCurrentFrame(int width, int height) return img; } + /// + /// Return the framebuffer. + /// + /// Width of the frame. + /// Heigth of the frame. + /// First pixel to start with on the x axis. + /// First pixel to start with on the x axis. + /// Can return an empty array if the width or height are smaller than x or y. + public byte[] GetFrameBuffer(int width, int height, int x = 0, int y = 0) + { + if (width <= x || height <= y) + return new byte[0]; + + var mem = new byte[(width-x) * (height-y) * 4]; + + GL.Flush(); + + GL.ReadPixels(x, y, width, height, PixelFormat.Bgra, PixelType.UnsignedByte, mem); + + return mem; + } + + /// + /// Return the depthbuffer. + /// + /// Width of the frame. + /// Heigth of the frame. + /// First pixel to start with on the x axis. + /// First pixel to start with on the x axis. + /// Can return an empty array if the width or height are smaller than x or y. + public byte[] GetDepthBuffer(int width, int height, int x = 0, int y = 0) + { + if (width <= x || height <= y) + return new byte[0]; + + // + GL.Enable(EnableCap.DepthTest); + + var mem = new byte[width * height * 4]; + + GL.Flush(); + + GL.ReadPixels(x, y, width, height, PixelFormat.DepthComponent, PixelType.UnsignedInt, mem); + + return mem; + } + + /// + /// Return the stencilbuffer. + /// + /// Width of the frame. + /// Heigth of the frame. + /// First pixel to start with on the x axis. + /// First pixel to start with on the x axis. + /// Can return an empty array if the width or height are smaller than x or y. + public byte[] GetStencilBuffer(int width, int height, int x = 0, int y = 0) + { + // + GL.Enable(EnableCap.StencilTest); + + var mem = new byte[width * height * 4]; + + GL.Flush(); + + GL.ReadPixels(0, 0, width, height, PixelFormat.StencilIndex, PixelType.UnsignedInt, mem); + + return mem; + } + #endregion } } \ No newline at end of file From 013c669f460cb4c8a3272ac8a04bac5a00a32c0d Mon Sep 17 00:00:00 2001 From: MarcLohfink Date: Thu, 16 Mar 2023 10:06:10 +0100 Subject: [PATCH 05/17] Removed SLIRP Stuff SLIRP Stuff has been pushed into its own repo: https://github.com/FUSEEProjectTeam/SLIRP --- src/SLIRP/Common/BufferSet.cs | 30 --- src/SLIRP/Common/Fusee.SLIRP.Common.csproj | 9 - src/SLIRP/Common/StackBuffer.cs | 93 ------- src/SLIRP/Core/FrameHistoryController.cs | 83 ------ src/SLIRP/Core/FrameHistorySnapshoter.cs | 65 ----- src/SLIRP/Core/Fusee.SLIRP.Desktop.csproj | 18 -- src/SLIRP/Core/SLIRPRenderer.cs | 33 --- src/SLIRP/Core/SLIRPer.cs | 255 ------------------ src/SLIRP/Core/SnapshotController.cs | 20 -- .../EncodingMeta.cs | 12 - .../Fusee.SLIRP.DataTransformation.csproj | 13 - .../IEncoder.cs | 18 -- .../SixLabsEncodingMeta.cs | 21 -- .../SixLabsJPEGTransformer.cs | 67 ----- .../ClientConnectionMetaData.cs | 42 --- .../EstablishedConnectionData.cs | 35 --- .../Fusee.SLIRP.Network.Client.Common.csproj | 13 - .../IClient.cs | 21 -- .../IClientConnectionHandlingThread.cs | 18 -- .../IConnToServerHandlingThread.cs | 58 ---- .../IConnToServerReceiver.cs | 16 -- .../IConnectToServerHandler.cs | 12 - .../IConnectionRequester.cs | 30 --- .../IConnectionToServerHandler.cs | 36 --- .../IDisconnectFromServerHandler.cs | 12 - .../Fusee.SLIRP.Network.Client/BasicClient.cs | 116 -------- .../BasicConnectionRequester.cs | 96 ------- .../BasicConnectionToServerHandler.cs | 160 ----------- .../BasicPingPongWithServerHandling.cs | 51 ---- .../Fusee.SLIRP.Network.Client.Core.csproj | 14 - .../IDisposableConnToServerHandlingThread.cs | 26 -- .../ConnectionAddressData.cs | 28 -- .../ConnectionMetaData.cs | 38 --- .../Fusee.SLIRP.Network.Common.csproj | 9 - .../NetworkPackageMeta.cs | 25 -- .../Fusee.SLIRP.Network.RenderServer.csproj | 14 - .../RenderServer.cs | 7 - .../Fusee.SLIRP.Network/ClientHandler.cs | 12 - .../Fusee.SLIRP.Network.Server.Core.csproj | 15 -- .../Fusee.SLIRP.Network.Server.Common.csproj | 13 - .../IConnectHandler.cs | 20 -- .../IConnectionHandler.cs | 33 --- .../IConnectionHandlingThread.cs | 50 ---- .../IConnectionRequestHandler.cs | 18 -- .../IDisconnectHandler.cs | 15 -- .../IDisposableConnectionHandling.cs | 29 -- .../IServer.cs | 20 -- .../ServerConnectionMetaData.cs | 33 --- .../ServerMetaData.cs | 24 -- .../BasicPingPongHandling.cs | 50 ---- .../BasicServer.cs | 130 --------- .../ConnectionHandler.cs | 193 ------------- .../ConnectionRequestHandler.cs | 85 ------ ...Fusee.SLIRP.Network.Server.Examples.csproj | 15 -- 54 files changed, 2369 deletions(-) delete mode 100644 src/SLIRP/Common/BufferSet.cs delete mode 100644 src/SLIRP/Common/Fusee.SLIRP.Common.csproj delete mode 100644 src/SLIRP/Common/StackBuffer.cs delete mode 100644 src/SLIRP/Core/FrameHistoryController.cs delete mode 100644 src/SLIRP/Core/FrameHistorySnapshoter.cs delete mode 100644 src/SLIRP/Core/Fusee.SLIRP.Desktop.csproj delete mode 100644 src/SLIRP/Core/SLIRPRenderer.cs delete mode 100644 src/SLIRP/Core/SLIRPer.cs delete mode 100644 src/SLIRP/Core/SnapshotController.cs delete mode 100644 src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/EncodingMeta.cs delete mode 100644 src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/Fusee.SLIRP.DataTransformation.csproj delete mode 100644 src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/IEncoder.cs delete mode 100644 src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsEncodingMeta.cs delete mode 100644 src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsJPEGTransformer.cs delete mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/ClientConnectionMetaData.cs delete mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/EstablishedConnectionData.cs delete mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/Fusee.SLIRP.Network.Client.Common.csproj delete mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClient.cs delete mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClientConnectionHandlingThread.cs delete mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerHandlingThread.cs delete mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerReceiver.cs delete mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectToServerHandler.cs delete mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionRequester.cs delete mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionToServerHandler.cs delete mode 100644 src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IDisconnectFromServerHandler.cs delete mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicClient.cs delete mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionRequester.cs delete mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionToServerHandler.cs delete mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicPingPongWithServerHandling.cs delete mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.Core.csproj delete mode 100644 src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IDisposableConnToServerHandlingThread.cs delete mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionAddressData.cs delete mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionMetaData.cs delete mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/Fusee.SLIRP.Network.Common.csproj delete mode 100644 src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/NetworkPackageMeta.cs delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/Fusee.SLIRP.Network.RenderServer.csproj delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/RenderServer.cs delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/ClientHandler.cs delete mode 100644 src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.Core.csproj delete mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/Fusee.SLIRP.Network.Server.Common.csproj delete mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectHandler.cs delete mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandler.cs delete mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandlingThread.cs delete mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionRequestHandler.cs delete mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisconnectHandler.cs delete mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisposableConnectionHandling.cs delete mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IServer.cs delete mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerConnectionMetaData.cs delete mode 100644 src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerMetaData.cs delete mode 100644 src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicPingPongHandling.cs delete mode 100644 src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicServer.cs delete mode 100644 src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionHandler.cs delete mode 100644 src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionRequestHandler.cs delete mode 100644 src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/Fusee.SLIRP.Network.Server.Examples.csproj diff --git a/src/SLIRP/Common/BufferSet.cs b/src/SLIRP/Common/BufferSet.cs deleted file mode 100644 index 966c02f6f..000000000 --- a/src/SLIRP/Common/BufferSet.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Common -{ - public struct BufferSet - { - public int x; - public int y; - - public int width; - public int height; - - public byte[] frameBuffer; - public byte[] depthBuffer; - - public BufferSet(int x, int y, int width, int height, byte[] frameBuffer, byte[] depthBuffer) - { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.frameBuffer = frameBuffer; - this.depthBuffer = depthBuffer; - } - } -} diff --git a/src/SLIRP/Common/Fusee.SLIRP.Common.csproj b/src/SLIRP/Common/Fusee.SLIRP.Common.csproj deleted file mode 100644 index cfadb03dd..000000000 --- a/src/SLIRP/Common/Fusee.SLIRP.Common.csproj +++ /dev/null @@ -1,9 +0,0 @@ - - - - net7.0 - enable - enable - - - diff --git a/src/SLIRP/Common/StackBuffer.cs b/src/SLIRP/Common/StackBuffer.cs deleted file mode 100644 index 28db738d7..000000000 --- a/src/SLIRP/Common/StackBuffer.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Common -{ - /// - /// Works like a stack but pushes down all older elements if the stack is full when pushed. - /// The oldest item is the overwritten. - /// - /// - public class StackBuffer - { - private T[] stack; - private int top; - - private int depth; - - public StackBuffer(int depth) - { - this.depth = depth; - stack = new T[depth]; - } - - public void Push(T item) - { - //if the stack is full, push all older elements down the stack - if (top == depth - 1) - { - for (int i = 0; i < top; i++) - { - stack[i] = stack[i + 1]; - } - top--; - } - - stack[++top] = item; - } - - - public T Pop() - { - if (top == -1) - throw new InvalidOperationException("Stack is empty"); - - return stack[top--]; - } - - /// - /// Pop at a specific position "n" and all younger items in the stack. - /// - /// The position at which the item should be poped - /// - /// - public T Pop(int n) - { - if (n > top + 1) - throw new InvalidOperationException("Not enough elements in the stack"); - - var item = stack[top - n + 1]; - top = top - n; - return item; - } - - public T Peek() - { - if(top == -1) - throw new InvalidOperationException("Stack is empty"); - - return stack[top]; - } - - /// - /// Peek at a specific position "i" without altering the stack. - /// - /// The position at which the item should be peeked. 0 = latest, "depth"-1 = oldest. - /// - /// - public T PeekAt(int i) - { - if(i >= depth) - throw new ArgumentOutOfRangeException("Passed index is bigger or equal to the depth:\ndepth: "+depth+"\ti: "+i); - - int realIndex = depth -1 - i; - - return stack[i]; - } - - - } -} diff --git a/src/SLIRP/Core/FrameHistoryController.cs b/src/SLIRP/Core/FrameHistoryController.cs deleted file mode 100644 index d9521187a..000000000 --- a/src/SLIRP/Core/FrameHistoryController.cs +++ /dev/null @@ -1,83 +0,0 @@ -using Fusee.Base.Common; -using Fusee.Base.Core; -using Fusee.Base.Imp.Desktop; -using Fusee.Engine.Common; -using Fusee.Engine.Core; -using Fusee.Engine.Core.Scene; -using Fusee.Engine.Imp.Graphics.Desktop; -using Fusee.SLIRP.Common; - -namespace Fusee.SLIRP.Core -{ - /// - /// Stores a passed amount of BufferSets. If the stored BufferSets reach the capacity, the oldest is discarded - /// and the new BufferSet can be stored. - /// Can be used to run automatically on the render loop or by calling it manually per frame. - /// - public class FrameHistoryController - { - private int capacity; - - private StackBuffer recordedFrames; - private RenderCanvasImp canvasImp; - - public int Capacity { get => capacity; } - - public FrameHistoryController(RenderCanvasImp canvasImp, int capacity = 25, bool autoPostRender = true) - { - this.capacity = capacity; - this.canvasImp = canvasImp; - - recordedFrames = new StackBuffer(capacity); - - if(autoPostRender) - this.canvasImp.PostRender += OnPostRender; - } - - public BufferSet PopLastBufferSet() - { - return recordedFrames.Pop(); - } - - public BufferSet PopBufferSet(int n) - { - return recordedFrames.Pop(n); - } - - public BufferSet PeekLastBufferSet() - { - return recordedFrames.Peek(); - } - - /// - /// Peek at a specific position "i" without altering the history. - /// - /// The position to peek at. 0 is the latest, "capacity"-1 the oldest. - /// - public BufferSet PeekBufferSetAt(int i) - { - return recordedFrames.PeekAt(i); - } - - - public void Destroy() - { - canvasImp.PostRender -= OnPostRender; - } - - public void OnPostRender(object sender, PostRenderEventArgs args) - { - PushCurrentBuffers(); - } - - public void PushCurrentBuffers() - { - var frameBuffer = canvasImp.GetFrameBuffer(canvasImp.Width, canvasImp.Height); - var depthBuffer = canvasImp.GetDepthBuffer(canvasImp.Width, canvasImp.Height); - - BufferSet newSet = new BufferSet(0, 0, canvasImp.Width, canvasImp.Height, frameBuffer, depthBuffer); - - recordedFrames.Push(newSet); - } - } -} \ No newline at end of file diff --git a/src/SLIRP/Core/FrameHistorySnapshoter.cs b/src/SLIRP/Core/FrameHistorySnapshoter.cs deleted file mode 100644 index ed08422f3..000000000 --- a/src/SLIRP/Core/FrameHistorySnapshoter.cs +++ /dev/null @@ -1,65 +0,0 @@ -using Fusee.SLIRP.Common; -using Fusee.SLIRP.Core; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection.PortableExecutable; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Desktop -{ - public class FrameHistorySnapshoter - { - string snapshotPath; - - FrameHistoryController gbReader; - - public FrameHistorySnapshoter(FrameHistoryController gbReader, string snapshotPath) - { - this.gbReader = gbReader; - this.snapshotPath = snapshotPath; - } - - public void SnapshotRandomFrameOfHistory() - { - Random rndmGen = new Random(); - - int rndm = rndmGen.Next(0, gbReader.Capacity); - - Console.WriteLine("Save random BufferSet of the history at " + rndm); - SnapshotBufferSetAt(rndm); - } - - public void SnapshotFrameHistory() - { - Console.WriteLine("Save all BufferSets of the history"); - for (int i = 0; i < gbReader.Capacity; i++) - { - SnapshotBufferSetAt(i); - } - } - - public void SnapshotBufferSetAt(int i) - { - BufferSet latest = gbReader.PeekBufferSetAt(i); - - string dateTime = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"); - string filename = "RGBframe_" + i + "_" + dateTime + ".png"; - SnapshotController.SaveSnapshotAsPng(latest.frameBuffer, latest.width, latest.height, snapshotPath, filename); - filename = "Depth_" + i + "_" + dateTime + ".png"; - SnapshotController.SaveSnapshotAsPng(latest.depthBuffer, latest.width, latest.height, snapshotPath, filename); - } - - public void SnapshotLastBufferSet() - { - BufferSet latest = gbReader.PeekLastBufferSet(); - - string dateTime = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"); - string filename = "RGBframe_" + dateTime + ".png"; - SnapshotController.SaveSnapshotAsPng(latest.frameBuffer, latest.width, latest.height, snapshotPath, filename); - filename = "Depth_" + dateTime + ".png"; - SnapshotController.SaveSnapshotAsPng(latest.depthBuffer, latest.width, latest.height, snapshotPath, filename); - } - } -} diff --git a/src/SLIRP/Core/Fusee.SLIRP.Desktop.csproj b/src/SLIRP/Core/Fusee.SLIRP.Desktop.csproj deleted file mode 100644 index eb5376690..000000000 --- a/src/SLIRP/Core/Fusee.SLIRP.Desktop.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - net7.0 - $(DefineConstants);PLATFORM_DESKTOP - enable - enable - - - - - - - - - - - diff --git a/src/SLIRP/Core/SLIRPRenderer.cs b/src/SLIRP/Core/SLIRPRenderer.cs deleted file mode 100644 index 40279253c..000000000 --- a/src/SLIRP/Core/SLIRPRenderer.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Fusee.Engine.Common; -using Fusee.Engine.Core; -using Fusee.SLIRP.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection.PortableExecutable; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Core -{ - public class SLIRPRenderer : RenderCanvas - { - - //public override void Init() - //{ - // base.Init(); - - //} - - //public override void RenderAFrame() - //{ - // Console.WriteLine("Start Render"); - // CanvasImplementor.DoRender(); - // Console.WriteLine("Rendered"); - // //CanvasImplementor.DoPostRender(); - - - //} - - } -} diff --git a/src/SLIRP/Core/SLIRPer.cs b/src/SLIRP/Core/SLIRPer.cs deleted file mode 100644 index 9fa43c093..000000000 --- a/src/SLIRP/Core/SLIRPer.cs +++ /dev/null @@ -1,255 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using Fusee.Base.Common; -using Fusee.Base.Core; -using Fusee.Base.Imp.Desktop; -using Fusee.Engine.Common; -using Fusee.Engine.Core; -using Fusee.Engine.Core.Scene; -using Fusee.Engine.Imp.Graphics.Desktop; -using Fusee.SLIRP.Common; -using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp; -using Fusee.SLIRP.Desktop; -using OpenTK.Windowing.Desktop; -using System.Data; -using OpenTK.Graphics.ES11; -using Fusee.SLIRP.DataTransformation; - -namespace Fusee.SLIRP.Core -{ - [FuseeApplication(Name = "SLIRP Example", Description = " ")] - public class SLIRPer - { - - private string snapshotRoot = "C:\\Users\\Marc\\Daten\\00_SLIRP\\Snapshots"; - private DirectoryInfo snapshotCurDir; - - private const int height = 512; - private const int width = 512; - - FrameHistorySnapshoter gbSnapshoter; - private FrameHistoryController gbReader; - private RenderCanvas renderer; - - IEncoder encoder; - EncodingMeta encoderMeta; - - private int historyDepth = 75; - - int debugIndex = 0; - int debugSnapshotIndex = 100; - - #region Init - public void Init(RenderCanvas renderCanvas = null) - { - Console.WriteLine("Init SLIRPer " + (renderCanvas == null ? "new" : "with " + renderCanvas.ToString())); - - if (renderCanvas == null) - { - Console.WriteLine("Create Renderer"); - renderer = new SLIRPRenderer(); - } - else - renderer = renderCanvas; - - var cimp = (RenderCanvasImp)renderer.CanvasImplementor; - - //Render Context und Canvas für die Injection - InitRenderCanvas(); - - //create a frame history - InitFrameHistory(cimp); - - //create the posibility to save the frame history to disc as images - InitFrameHistorySnapshoter(); - - //create encoder - InitEncoding(cimp); - - //irgendwas mit Input - Input.AddDriverImp(new Engine.Imp.Graphics.Desktop.RenderCanvasInputDriverImp(renderer.CanvasImplementor)); - Input.AddDriverImp(new Engine.Imp.Graphics.Desktop.WindowsTouchInputDriverImp(renderer.CanvasImplementor)); - - //initialize render app - InitAppAndRendering(); - - renderer.EndOfFrame += OnEndOffFrame; - - renderer.Run(); - - } - - #region Init Methods - private void InitAppAndRendering() - { - Console.WriteLine("App initialize SLIRPer"); - renderer.InitApp(); - - renderer.CanvasImplementor.DoInit(); - renderer.CanvasImplementor.DoResize(width, height); - renderer.CanvasImplementor.DoUpdate(); - - SpinWait.SpinUntil(() => renderer.IsLoaded); - } - - private void InitEncoding(RenderCanvasImp cimp) - { - encoder = new SixLabsJPEGTransformer(); - encoderMeta = new SixLabsEncodingMeta(Configuration.Default, cimp.Width * cimp.Height); - encoder.Init(encoderMeta); - } - - private void InitFrameHistorySnapshoter() - { - string snapshotFolderName = "Testshots_" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"); - snapshotCurDir = Directory.CreateDirectory(Path.Combine(snapshotRoot, snapshotFolderName)); - gbSnapshoter = new FrameHistorySnapshoter(gbReader, snapshotCurDir.FullName); - } - - private void InitFrameHistory(RenderCanvasImp cimp) - { - Console.WriteLine("Create GraphicBufferController and pass CanvasImplementor."); - gbReader = new FrameHistoryController(cimp, historyDepth, false); - } - - private void InitRenderCanvas() - { - Console.WriteLine("Do Canvas and Context Stuff"); - var icon = AssetStorage.Get("FuseeIconTop32.png"); - renderer.CanvasImplementor = new Engine.Imp.Graphics.Desktop.RenderCanvasImp(icon); - renderer.ContextImplementor = new Engine.Imp.Graphics.Desktop.RenderContextImp(renderer.CanvasImplementor); - - renderer.CanvasImplementor.PostRender += OnPostRender; - } - #endregion Init Methods - - #endregion Init - - public void OnEndOffFrame(object sender, EventArgs args) - { - Process(); - } - - public void Process() - { - //Console.WriteLine("Process SLIRPer"); - //Console.WriteLine("Start Render"); - //renderer.CanvasImplementor.DoRender(); - //Console.WriteLine("Rendered"); - //Console.WriteLine("Present -->"); - //renderer.Present(); - // renderer.RenderAFrame(); - OnPostRender(this, null); - - TestEncoding(); - } - - private void TestEncoding() - { - debugIndex++; - - if (debugIndex > debugSnapshotIndex) - { - debugIndex = 0; - - Console.WriteLine("Save latest BufferSet"); - gbSnapshoter.SnapshotLastBufferSet(); - - lock (gbReader) - { - BufferSet latestSet = gbReader.PeekLastBufferSet(); - - Console.WriteLine("\nTest Encoding"); - - Console.WriteLine("Byte length: " + latestSet.frameBuffer.Length); - - string dateTime = DateTime.Now.ToString("yyyy_MM_dd-HH_mm_ss"); - string filename = "RGB_" + dateTime + ".jpeg"; - string realPath = Path.Combine(snapshotCurDir.FullName, filename); - - Console.WriteLine("Save as jpeg"); - var loadedImg = Image.LoadPixelData(latestSet.frameBuffer, latestSet.width, latestSet.height); - loadedImg.SaveAsJpeg(realPath); - - Console.WriteLine("Save raw image"); - filename = "RawRGB_" + dateTime + ".raw"; - realPath = Path.Combine(snapshotCurDir.FullName, filename); - using (FileStream fs = new FileStream(realPath, System.IO.FileMode.Create, FileAccess.Write)) - { - fs.Write(latestSet.frameBuffer, 0, latestSet.frameBuffer.Length); - } - Console.WriteLine("Raw image saved!"); - - Console.WriteLine("\nStart encoding"); - - using (MemoryStream dataStream = new MemoryStream()) - { - Console.WriteLine("Benchmark: Start at " + DateTime.Now.ToString("yyyy_MM_dd-HH_mm_ss")); - DateTime start = DateTime.Now; - encoder.Encode(latestSet.frameBuffer, dataStream, latestSet.width, latestSet.height); - DateTime end = DateTime.Now; - Console.WriteLine("Benchmark: End at " + DateTime.Now.ToString("yyyy_MM_dd-HH_mm_ss")); - Console.WriteLine("Encoding finished!"); - - int duration = (end - start).Milliseconds; - Console.WriteLine("Encoding took " + duration + "ns"); - - - Console.WriteLine("\nSave encoded image"); - filename = "EncodedRGB_" + dateTime + ".jpeg"; - realPath = Path.Combine(snapshotCurDir.FullName, filename); - - dataStream.Seek(0, SeekOrigin.Begin); - using (FileStream fs = File.Create(realPath)) - { - dataStream.CopyTo(fs); - } - dataStream.Seek(0, SeekOrigin.Begin); - - Console.WriteLine("Encoded image saved!"); - - - Console.WriteLine("\nTest Decoding"); - - Console.WriteLine("Start decoding"); - Console.WriteLine("Benchmark: Start at " + DateTime.Now.ToString("yyyy_MM_dd-HH_mm_ss")); - start = DateTime.Now; - byte[] decodedImg = encoder.Decode(dataStream, latestSet.width, latestSet.height); - end = DateTime.Now; - Console.WriteLine("Benchmark: End at " + DateTime.Now.ToString("yyyy_MM_dd-HH_mm_ss")); - Console.WriteLine("Decoding finished!"); - - duration = (end - start).Milliseconds; - Console.WriteLine("Decoding took " + duration + "ns"); - - Console.WriteLine("Byte length: " + decodedImg.Length); - - Console.WriteLine("Save decoded image"); - filename = "DecodedRGB_" + dateTime + ".raw"; - realPath = Path.Combine(snapshotCurDir.FullName, filename); - using (FileStream fs = new FileStream(realPath, System.IO.FileMode.Create, FileAccess.Write)) - { - fs.Write(decodedImg, 0, decodedImg.Length); - } - Console.WriteLine("Decoded image saved!"); - } - Console.WriteLine("Finish Encoding Test"); - } - } - } - - public void OnPostRender(object sender, PostRenderEventArgs args) - { - //Console.WriteLine("OnPostRender SLIRPer"); - gbReader.PushCurrentBuffers(); - //BufferSet lastBufferSet = gbReader.PeekLastBufferSet(); - - } - - } -} diff --git a/src/SLIRP/Core/SnapshotController.cs b/src/SLIRP/Core/SnapshotController.cs deleted file mode 100644 index 14c9197e9..000000000 --- a/src/SLIRP/Core/SnapshotController.cs +++ /dev/null @@ -1,20 +0,0 @@ -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.PixelFormats; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Desktop -{ - public static class SnapshotController - { - public static void SaveSnapshotAsPng(byte[] frame, int width, int height, string path, string filename) - { - var img = SixLabors.ImageSharp.Image.LoadPixelData(frame, width, height); - img.SaveAsPng(Path.Combine(path, filename)); - } - - } -} diff --git a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/EncodingMeta.cs b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/EncodingMeta.cs deleted file mode 100644 index 78778ec34..000000000 --- a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/EncodingMeta.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.DataTransformation -{ - public abstract class EncodingMeta - { - } -} diff --git a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/Fusee.SLIRP.DataTransformation.csproj b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/Fusee.SLIRP.DataTransformation.csproj deleted file mode 100644 index 02f6d3ae9..000000000 --- a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/Fusee.SLIRP.DataTransformation.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net7.0 - enable - enable - - - - - - - diff --git a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/IEncoder.cs b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/IEncoder.cs deleted file mode 100644 index c85f86fec..000000000 --- a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/IEncoder.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Fusee.SLIRP.DataTransformation; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Common -{ - public interface IEncoder - { - public void Init(EncodingMeta metaData); - - public Stream Encode(byte[] data, Stream dataStream, int width, int height); - - public byte[] Decode(Stream data, int width, int height); - } -} diff --git a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsEncodingMeta.cs b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsEncodingMeta.cs deleted file mode 100644 index 6bc6a8f7e..000000000 --- a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsEncodingMeta.cs +++ /dev/null @@ -1,21 +0,0 @@ -using SixLabors.ImageSharp; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.DataTransformation -{ - public class SixLabsEncodingMeta : EncodingMeta - { - public Configuration configuration; - public int byteLength = 0; - - public SixLabsEncodingMeta(Configuration configuration, int byteLength) - { - this.configuration = configuration; - this.byteLength = byteLength; - } - } -} diff --git a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsJPEGTransformer.cs b/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsJPEGTransformer.cs deleted file mode 100644 index bc716885d..000000000 --- a/src/SLIRP/DataTransformation/Fusee.SLIRP.DataTransformation/SixLabsJPEGTransformer.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Fusee.SLIRP.Common; -using Fusee.SLIRP.DataTransformation; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.Advanced; -using SixLabors.ImageSharp.Formats; -using SixLabors.ImageSharp.Formats.Jpeg; -using SixLabors.ImageSharp.PixelFormats; - -namespace Fusee.SLIRP.Desktop -{ - public class SixLabsJPEGTransformer : IEncoder - { - Configuration configuration; - int byteLength = 0; - - public void Init(EncodingMeta metaData) - { - if (!(metaData is SixLabsEncodingMeta sixLabsMetaData)) - throw new InvalidCastException("Passed the wriong meta data to this encoder"); - - configuration = sixLabsMetaData.configuration; - byteLength = sixLabsMetaData.byteLength; - - } - - public Stream Encode(byte[] data, Stream dataStream, int width, int height) - { - if (configuration == null) - throw new NullReferenceException("Configuration is null. Call \"Init()\" before using the encoding!"); - - byteLength = data.Length; - var img = SixLabors.ImageSharp.Image.LoadPixelData(data, width, height); - - JpegEncoder encoder = new JpegEncoder(); - encoder.Encode(img, dataStream); - - return dataStream; - - } - - public byte[] Decode(Stream data, int width, int height) - { - if (configuration == null) - throw new NullReferenceException("No configuration set!"); - - JpegDecoder decoder = new JpegDecoder(); - CancellationToken token = new CancellationToken(); - - var img = decoder.Decode(configuration, data, token); - byte[] decodedData = new byte[byteLength]; - Span byteImg = new Span(decodedData); - img.CopyPixelDataTo(byteImg); - - decodedData = byteImg.ToArray(); - - return decodedData; - - } - - - } -} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/ClientConnectionMetaData.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/ClientConnectionMetaData.cs deleted file mode 100644 index f3778b631..000000000 --- a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/ClientConnectionMetaData.cs +++ /dev/null @@ -1,42 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/10/2023 8:41:06 AM - -using Fusee.SLIRP.Network.Common; -using System.Net; -using System.Net.Sockets; - - -namespace Fusee.SLIRP.Network.Client.Common -{ - public struct ClientConnectionMetaData - { - public ConnectionMetaData connData; - - /// - /// The IP address to connect to. - /// - public IPAddress ServerIPAddress; - - - public int Port => connData.Port; - public AddressFamily AddressFamily => connData.AddressFamily; - public ProtocolType ProtocolType => connData.ProtocolType; - public SocketType SocketType => connData.SocketType; - public NetworkPackageMeta NetworkPackageMeta => connData.NetworkPackageMeta; - - public ClientConnectionMetaData (IPAddress serverIpAddress, int port, AddressFamily addressFamily, ProtocolType protocolType, SocketType socketType, NetworkPackageMeta networkPackageMeta) - { - ServerIPAddress = serverIpAddress; - connData = new ConnectionMetaData (port,addressFamily,protocolType,socketType,networkPackageMeta); - } - - public ClientConnectionMetaData(IPAddress serverIpAddress, ConnectionMetaData connectionMetaData, NetworkPackageMeta networkPackageMeta) - { - ServerIPAddress = serverIpAddress; - connData = new ConnectionMetaData(connectionMetaData); - } - } -} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/EstablishedConnectionData.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/EstablishedConnectionData.cs deleted file mode 100644 index 50c22bc4c..000000000 --- a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/EstablishedConnectionData.cs +++ /dev/null @@ -1,35 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/10/2023 10:22:35 AM - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client.Common -{ - public class EstablishedConnectionData - { - private IPAddress _connectionAddress; - private int _port; - private Socket _clientSocket; - - public IPAddress ConnectionAddress => _connectionAddress; - public int Port => _port; - - public Socket ClientSocket => _clientSocket; - - public EstablishedConnectionData(IPAddress connectionAddress, int port, Socket clientSocket) - { - _connectionAddress = connectionAddress; - _port = port; - _clientSocket = clientSocket; - } - } -} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/Fusee.SLIRP.Network.Client.Common.csproj b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/Fusee.SLIRP.Network.Client.Common.csproj deleted file mode 100644 index f083dda8f..000000000 --- a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/Fusee.SLIRP.Network.Client.Common.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net7.0 - enable - enable - - - - - - - diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClient.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClient.cs deleted file mode 100644 index d87d7e43a..000000000 --- a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClient.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Fusee.SLIRP.Network.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client.Common -{ - public interface IClient - { - public void Init(in ClientConnectionMetaData? metaData = null); - - public void Shutdown(); - - public void StartClient(); - - public void StopClient(); - - } -} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClientConnectionHandlingThread.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClientConnectionHandlingThread.cs deleted file mode 100644 index 279e08408..000000000 --- a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IClientConnectionHandlingThread.cs +++ /dev/null @@ -1,18 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/10/2023 10:44:23 AM - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client.Common -{ - internal class IClientConnectionHandlingThread - { - } -} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerHandlingThread.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerHandlingThread.cs deleted file mode 100644 index aef724eb1..000000000 --- a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerHandlingThread.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Fusee.SLIRP.Network.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client.Common -{ - public abstract class IConnToServerHandlingThread - { - private EstablishedConnectionData _connectionData; - private IDisconnectFromServerHandler _diconnectHandler; - private NetworkPackageMeta _packageMeta; - private Socket socketToServer; - - private bool _isInitialized; - - public event Action OnDisconnectedFromServer; - - protected EstablishedConnectionData ConnData - { - get => _connectionData; - } - - protected IDisconnectFromServerHandler DisconnectHandler - { - get => _diconnectHandler; - } - - protected NetworkPackageMeta NetworkPackageMeta => _packageMeta; - - protected Socket SocketToServer => ConnData.ClientSocket; - - protected IConnToServerHandlingThread() - { - } - - public void Init(IDisconnectFromServerHandler disconnectHandler, EstablishedConnectionData connData, NetworkPackageMeta packageMeta) - { - _connectionData = connData; - _diconnectHandler = disconnectHandler; - _packageMeta = packageMeta; - _isInitialized = true; - } - - public virtual void Shutdown() - { - _isInitialized = false; - } - - public abstract void RunHandleConnection(); - - public abstract void OnClientDisconnected(IConnToServerHandlingThread handler, EstablishedConnectionData connData); - - } -} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerReceiver.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerReceiver.cs deleted file mode 100644 index 122ddafdf..000000000 --- a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnToServerReceiver.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client.Common -{ - public interface IConnToServerReceiver - { - public void OnConnectionEstablished(EstablishedConnectionData connData); - - public void OnConnectionFailed(EstablishedConnectionData connData); - - } -} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectToServerHandler.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectToServerHandler.cs deleted file mode 100644 index a545f945f..000000000 --- a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectToServerHandler.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client.Common -{ - public interface IConnectToServerHandler - { - } -} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionRequester.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionRequester.cs deleted file mode 100644 index dd9e2c4ba..000000000 --- a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionRequester.cs +++ /dev/null @@ -1,30 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/9/2023 5:06:32 PM - -using Fusee.SLIRP.Network.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client.Common -{ - public interface IConnectionRequester - { - public void Init(ClientConnectionMetaData connectionMetaData, IConnToServerReceiver connectionToServerHandler); - - public void Shutdown(); - - public void StartRequesting(); - - public void StopRequesting(); - - public void RequestConnection(); - - } -} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionToServerHandler.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionToServerHandler.cs deleted file mode 100644 index 82188918f..000000000 --- a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IConnectionToServerHandler.cs +++ /dev/null @@ -1,36 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/10/2023 10:44:41 AM - -using Fusee.SLIRP.Network.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client.Common -{ - public interface IConnectionToServerHandler : IConnToServerReceiver - { - - public event Action EventOnConnectedToServer; - public event Action EventOnDisconnectedFromServer; - - /// - /// Initialize the Handler so that he is able to handle the running connection handling threads. - /// - /// What kind of handling thread will be instantiated when a new client connects. - public void Init(NetworkPackageMeta networkPackageMeta); - - public void Shutdown(); - - public void StartHandling(); - - public void StopHandling(); - - } -} diff --git a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IDisconnectFromServerHandler.cs b/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IDisconnectFromServerHandler.cs deleted file mode 100644 index 93d5d2810..000000000 --- a/src/SLIRP/Network/Client/Common/Fusee.SLIRP.Network.Client.Common/IDisconnectFromServerHandler.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client.Common -{ - public interface IDisconnectFromServerHandler - { - } -} diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicClient.cs b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicClient.cs deleted file mode 100644 index 19915fece..000000000 --- a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicClient.cs +++ /dev/null @@ -1,116 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/9/2023 5:08:56 PM - -using Fusee.SLIRP.Network.Common; -using System; -using System.Collections.Generic; -using System.Net.Sockets; -using System.Net; -using Fusee.SLIRP.Network.Client.Common; - -namespace Fusee.SLIRP.Network.Client.Core -{ - public class BasicClient : IClient - { - public const int BUFFERSIZE = 1024; - public static IPAddress serverIP = IPAddress.Parse("127.0.0.1"); - public static ClientConnectionMetaData DefaultSLIRP = new ClientConnectionMetaData(IPAddress.Any, 1300, AddressFamily.InterNetwork, ProtocolType.Udp, SocketType.Stream, new NetworkPackageMeta(BUFFERSIZE)); - - private bool _isInitialized; - private bool _isRunning; - - private Socket _socket; - - private IConnectionRequester _requester; - private IConnectionToServerHandler? _connToServerHandler; - - private Thread? _connRequesterThread; - private Thread? _connToServerHandlerThread; - - private ClientConnectionMetaData curClientConnectionMetaData; - - - public void Init(in ClientConnectionMetaData? metaData = null) - { - if (_isRunning || _isInitialized) return; - - _isInitialized = true; - - if (metaData != null) - { - curClientConnectionMetaData = metaData.Value; - } - else - { - curClientConnectionMetaData = DefaultSLIRP; - //curServerConnectionMetaData.NetworkPackageMeta = new NetworkPackageMeta(BUFFERSIZE); - } - - _socket = new Socket(curClientConnectionMetaData.AddressFamily, curClientConnectionMetaData.SocketType, curClientConnectionMetaData.ProtocolType); - - _requester = new BasicConnectionRequester(); - _connToServerHandler = new BasicConnectionToServerHandler(); - - _connToServerHandler.Init(curClientConnectionMetaData.NetworkPackageMeta); - _requester.Init(curClientConnectionMetaData, _connToServerHandler); - - _connRequesterThread = new Thread(new ThreadStart(_requester.StartRequesting)); - _connToServerHandlerThread = new Thread(new ThreadStart(_connToServerHandler.StartHandling)); - } - - public void Shutdown() - { - if (!_isInitialized) - return; - - StopClient(); - - _requester.Shutdown(); - _connToServerHandler.Shutdown(); - } - - public void StartClient() - { - if (!_isInitialized) - return; - - if (_isRunning) return; - - _connToServerHandlerThread.Start(); - _connRequesterThread.Start(); - } - - public void StopClient() - { - if (!_isInitialized) - return; - - if(!_isRunning) return; - - _requester.StopRequesting(); - _connToServerHandler.StopHandling(); - - InterruptThread(_connRequesterThread); - - InterruptThread(_connToServerHandlerThread); - } - - public static void InterruptThread(Thread threadToInterrupt) - { - if (threadToInterrupt.ThreadState == ThreadState.Running) - { - try - { - threadToInterrupt.Interrupt(); - } - catch (Exception e) - { - Console.WriteLine("There was a problem interrupting the thread! " + e.Message); - } - } - } - } -} diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionRequester.cs b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionRequester.cs deleted file mode 100644 index 80ba9f77b..000000000 --- a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionRequester.cs +++ /dev/null @@ -1,96 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/10/2023 9:51:54 AM - -using Fusee.SLIRP.Network.Client.Common; -using Fusee.SLIRP.Network.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Net.Sockets; -using System.Reflection.Metadata.Ecma335; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client.Core -{ - public class BasicConnectionRequester : IConnectionRequester - { - private int _port; - private IPAddress _serverAddress; - private AddressFamily _addressFamily = AddressFamily.InterNetwork; - private ProtocolType _protocolType; - private SocketType _socketType; - - private Socket _clientSocket; - private IConnToServerReceiver _connectionToServerReceiver; - - private bool _isInitialized; - private bool _isRunning; - - - public void Init(ClientConnectionMetaData connectionMetaData, IConnToServerReceiver connectionToServerHandler) - { - _port= connectionMetaData.Port; - _serverAddress= connectionMetaData.ServerIPAddress; - _addressFamily = connectionMetaData.AddressFamily; - _protocolType = connectionMetaData.ProtocolType; - _socketType = connectionMetaData.SocketType; - - _isInitialized = true; - } - - public void Shutdown() - { - if(!_isInitialized) return; - - if(_isRunning) - StopRequesting(); - - _isInitialized = false; - } - - public void StartRequesting() - { - if (!_isInitialized) return; - - if (_isRunning) return; - - _isRunning = true; - - RequestConnection(); - - } - - public void StopRequesting() - { - _isRunning= false; - } - - public virtual void RequestConnection() - { - _clientSocket = new Socket(_addressFamily,_socketType,_protocolType); - - EstablishedConnectionData establishedUdpConnectionData = new EstablishedConnectionData(_serverAddress, _port, _clientSocket); - - try - { - _clientSocket.Connect(_serverAddress, _port); - _connectionToServerReceiver.OnConnectionEstablished(establishedUdpConnectionData); - - } - catch(Exception e) - { - Console.WriteLine("Verbindung fehlgeschlagen: " + e.Message); - Console.WriteLine(e.StackTrace); - - _connectionToServerReceiver.OnConnectionFailed(establishedUdpConnectionData); - } - - StopRequesting(); - } - } -} diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionToServerHandler.cs b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionToServerHandler.cs deleted file mode 100644 index f870dedfa..000000000 --- a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicConnectionToServerHandler.cs +++ /dev/null @@ -1,160 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/10/2023 10:46:34 AM - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using Fusee.SLIRP.Network.Client.Common; -using Fusee.SLIRP.Network.Common; - -namespace Fusee.SLIRP.Network.Client.Core -{ - public class BasicConnectionToServerHandler : IConnectionToServerHandler, IDisconnectFromServerHandler where T : IConnToServerHandlingThread, new() - { - private NetworkPackageMeta _packageMeta; - - private bool _isInitialized; - private bool _isRunning; - - private Dictionary _handlingThreads = new Dictionary(); - - - public event Action EventOnConnectedToServer; - public event Action EventOnConnectionToServerFailed; - public event Action EventOnDisconnectedFromServer; - - public void Init( NetworkPackageMeta networkPackageMeta) - { - _packageMeta = networkPackageMeta; - - - //set first so incomming connectioncan be handled directly - _isInitialized = true; - - } - public void Shutdown() - { - if (!_isInitialized) - return; - - StopHandling(); - - _isInitialized = false; - } - - private void ShutdownAllHandlings() - { - foreach (var connData in _handlingThreads) - { - AbortThreadHandling(connData.Value); - - ShutdownSocket(connData.Key.ClientSocket); - } - } - - private static void ShutdownSocket(Socket socket, SocketShutdown how = SocketShutdown.Both) - { - if (socket != null) - { - try - { - socket.Shutdown(how); - } - catch (Exception e) - { - Console.WriteLine("Could not shutdown socket! " + e.Message); - } - } - } - - private static void AbortThreadHandling(Thread handlingThread) - { - try - { - if (handlingThread.ThreadState == ThreadState.Running) - { - handlingThread.Abort(); - } - } - catch (Exception e) - { - Console.WriteLine("Could not abort thread! " + e.Message); - } - } - - public void StartHandling() - { - if (_isInitialized) return; - - if(_isRunning) return; - - _isRunning = true; - } - - public void StopHandling() - { - if (!_isInitialized) return; - - if(!_isRunning) return; - - ShutdownAllHandlings(); - - _isRunning = false; - } - - private void HandleConnection(EstablishedConnectionData connData) - { - if (!_isInitialized) - return; - - if (connData.ClientSocket == null) throw new NullReferenceException("_connectionToServerReceiver was called without an argument"); - - T connectionToServerHandling = new T(); - connectionToServerHandling.Init(this, connData, _packageMeta); - - Thread clientThread = new Thread(new ThreadStart(connectionToServerHandling.RunHandleConnection)); - - AddSocketToDictionary(connData, clientThread); - - clientThread.Start(); - } - - public void OnConnectionEstablished(EstablishedConnectionData connData) - { - HandleConnection(connData); - - EventOnConnectedToServer?.Invoke(this, connData); - } - - public void OnConnectionFailed(EstablishedConnectionData connData) - { - EventOnConnectionToServerFailed?.Invoke(this, connData); - } - - private void AddSocketToDictionary(EstablishedConnectionData connData, Thread handledThread) - { - _handlingThreads.Add(connData, handledThread); - } - - private void RemoveSocketFromDictionary(EstablishedConnectionData connData) - { - if (_handlingThreads.ContainsKey(connData)) - { - _handlingThreads.Remove(connData); - } - } - - - - - - } - - -} - diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicPingPongWithServerHandling.cs b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicPingPongWithServerHandling.cs deleted file mode 100644 index b1f56a759..000000000 --- a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/BasicPingPongWithServerHandling.cs +++ /dev/null @@ -1,51 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/10/2023 11:21:17 AM - -using Fusee.SLIRP.Network.Client.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client.Core -{ - internal class BasicPingPongWithServerHandling : IDisposableConnToServerHandlingThread - { - - public override void OnClientDisconnected(IConnToServerHandlingThread handler, EstablishedConnectionData connData) - { - throw new NotImplementedException(); - } - - public override void RunHandleConnection() - { - while (true) - { - byte[] buffer = new byte[NetworkPackageMeta.BufferSize]; - int bytesReceived = SocketToServer.Receive(buffer); - - buffer = ASCIIEncoding.ASCII.GetBytes("Ping"); - Console.WriteLine("[Basic Ping Pong] Send: " + "Ping"); - SocketToServer.Send(buffer); - - string messageReceived = ASCIIEncoding.ASCII.GetString(buffer, 0, bytesReceived); - Console.WriteLine("[Basic Ping Pong] Received: " + messageReceived); - - bytesReceived = SocketToServer.Receive(buffer); - messageReceived = ASCIIEncoding.ASCII.GetString(buffer, 0, bytesReceived); - Console.WriteLine("[Basic Ping Pong] Received: " + messageReceived); - - buffer = ASCIIEncoding.ASCII.GetBytes("Pong"); - Console.WriteLine("[Basic Ping Pong] Send: " + "Pong"); - SocketToServer.Send(buffer); - - break; - } - } - } -} diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.Core.csproj b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.Core.csproj deleted file mode 100644 index c9fb0d631..000000000 --- a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/Fusee.SLIRP.Network.Client.Core.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - net7.0 - enable - enable - - - - - - - - diff --git a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IDisposableConnToServerHandlingThread.cs b/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IDisposableConnToServerHandlingThread.cs deleted file mode 100644 index 85201867a..000000000 --- a/src/SLIRP/Network/Client/Fusee.SLIRP.Network.Client/IDisposableConnToServerHandlingThread.cs +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/10/2023 11:22:19 AM - -using Fusee.SLIRP.Network.Client.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Client.Core -{ - internal abstract class IDisposableConnToServerHandlingThread : IConnToServerHandlingThread, IDisposable - { - public void Dispose() - { - OnDispose(); - OnClientDisconnected(this, ConnData); - } - - protected virtual void OnDispose() { } - } -} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionAddressData.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionAddressData.cs deleted file mode 100644 index 88a8aa71e..000000000 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionAddressData.cs +++ /dev/null @@ -1,28 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/10/2023 10:03:36 AM - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Common -{ - public class ConnectionAddressData - { - - public IPAddress ConnectionAddress; - public int Port = 1337; - - public ConnectionAddressData(IPAddress connectionAddress, int port) - { - ConnectionAddress = connectionAddress; - Port = port; - } - } -} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionMetaData.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionMetaData.cs deleted file mode 100644 index 804b6d9b7..000000000 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/ConnectionMetaData.cs +++ /dev/null @@ -1,38 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/10/2023 9:02:23 AM - - -using System.Net.Sockets; - -namespace Fusee.SLIRP.Network.Common -{ public struct ConnectionMetaData - { - public int Port = 1337; - - public AddressFamily AddressFamily = AddressFamily.InterNetwork; - public ProtocolType ProtocolType = ProtocolType.Udp; - public SocketType SocketType = SocketType.Stream; - public NetworkPackageMeta NetworkPackageMeta; - - public ConnectionMetaData(int port, AddressFamily addressFamily, ProtocolType protocolType, SocketType socketType, NetworkPackageMeta networkPackageMeta) - { - Port = port; - AddressFamily = addressFamily; - ProtocolType = protocolType; - SocketType = socketType; - NetworkPackageMeta = networkPackageMeta; - } - - public ConnectionMetaData(ConnectionMetaData connectionMetaData) - { - Port = connectionMetaData.Port; - AddressFamily = connectionMetaData.AddressFamily; - ProtocolType = connectionMetaData.ProtocolType; - SocketType = connectionMetaData.SocketType; - NetworkPackageMeta = connectionMetaData.NetworkPackageMeta; - } - } -} diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/Fusee.SLIRP.Network.Common.csproj b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/Fusee.SLIRP.Network.Common.csproj deleted file mode 100644 index cfadb03dd..000000000 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/Fusee.SLIRP.Network.Common.csproj +++ /dev/null @@ -1,9 +0,0 @@ - - - - net7.0 - enable - enable - - - diff --git a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/NetworkPackageMeta.cs b/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/NetworkPackageMeta.cs deleted file mode 100644 index f244d5497..000000000 --- a/src/SLIRP/Network/Common/Fusee.SLIRP.Network.Common/NetworkPackageMeta.cs +++ /dev/null @@ -1,25 +0,0 @@ -/* - Copyright (c) 2023 All Rights Reserved - - Marc-Alexander Lohfink - 2/9/2023 2:23:32 PM -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Common -{ - public struct NetworkPackageMeta - { - public int BufferSize = 1024; - - public NetworkPackageMeta(int bufferSize) - { - BufferSize = bufferSize; - } - } -} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/Fusee.SLIRP.Network.RenderServer.csproj b/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/Fusee.SLIRP.Network.RenderServer.csproj deleted file mode 100644 index 4fe8f2ccc..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/Fusee.SLIRP.Network.RenderServer.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - net7.0 - enable - enable - - - - - - - - diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/RenderServer.cs b/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/RenderServer.cs deleted file mode 100644 index 2551f3a50..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network.RenderServer/RenderServer.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Fusee.SLIRP.Network.RenderServer -{ - public class RenderServer - { - - } -} \ No newline at end of file diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/ClientHandler.cs b/src/SLIRP/Network/Fusee.SLIRP.Network/ClientHandler.cs deleted file mode 100644 index 6dc97404e..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/ClientHandler.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Server -{ - internal class ClientHandler - { - } -} diff --git a/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.Core.csproj b/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.Core.csproj deleted file mode 100644 index 837f33dc8..000000000 --- a/src/SLIRP/Network/Fusee.SLIRP.Network/Fusee.SLIRP.Network.Server.Core.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - net7.0 - enable - enable - - - - - - - - - diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/Fusee.SLIRP.Network.Server.Common.csproj b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/Fusee.SLIRP.Network.Server.Common.csproj deleted file mode 100644 index f083dda8f..000000000 --- a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/Fusee.SLIRP.Network.Server.Common.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net7.0 - enable - enable - - - - - - - diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectHandler.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectHandler.cs deleted file mode 100644 index cc4ea3928..000000000 --- a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectHandler.cs +++ /dev/null @@ -1,20 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/9/2023 4:58:00 PM - - -using System.Net.Sockets; - -namespace Fusee.SLIRP.Network.Server.Common -{ - public interface IConnectHandler - { - public bool IsHandlingConnections { get; } - - public event Action EventClientConnected; - - public void OnClientConnected(IConnectionRequestHandler sender, Socket clientSocket); - } -} diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandler.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandler.cs deleted file mode 100644 index 607589b6a..000000000 --- a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandler.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Fusee.SLIRP.Network.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Server.Common -{ - - /// - /// Interface for connection handlers who should notice connections and disconnections. - /// - public interface IConnectionHandler : IConnectHandler, IDisconnectHandler - { - - public bool IsRunning { get; } - - /// - /// Initialize the Handler so that he is able to handle accepted connections and disconnected clients. - /// - /// What kind of handling thread will be instantiated when a new client connects. - public void Init(NetworkPackageMeta networkPackageMeta); - - public void StartHandling(); - - public void StopHandling(); - - public void Shutdown(); - - } -} diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandlingThread.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandlingThread.cs deleted file mode 100644 index 97427b656..000000000 --- a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionHandlingThread.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Fusee.SLIRP.Network.Common; -using System.Net.Sockets; - - -namespace Fusee.SLIRP.Network.Server.Common -{ - public abstract class IConnectionHandlingThread - { - private Socket _clientSocket; - private IDisconnectHandler _connectionHandler; - private NetworkPackageMeta _packageMeta; - - private bool _isInitialized; - - //workaround to be able to assign a socket to the thread. See instantiation at ClientHandlers method "HandleClient". - protected Socket ClientSocket - { - get => _clientSocket; - } - - protected IDisconnectHandler ConnectionHandler - { - get => _connectionHandler; - } - - protected NetworkPackageMeta NetworkPackageMeta => _packageMeta; - - public event Action OnClientClosed; - - public IConnectionHandlingThread() - { } - - public void Init(IDisconnectHandler connectionHandler, Socket clientSocket, NetworkPackageMeta packageMeta) - { - _clientSocket = clientSocket; - _connectionHandler = connectionHandler; - _packageMeta = packageMeta; - _isInitialized = true; - } - - public virtual void Shutdown() - { - _isInitialized = false; - } - - public abstract void RunHandleConnection(); - - public abstract void OnClientDisconnected(IConnectionHandlingThread handler, Socket disconnectedClient); - } -} diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionRequestHandler.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionRequestHandler.cs deleted file mode 100644 index 2092839a2..000000000 --- a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IConnectionRequestHandler.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Server.Common -{ - public interface IConnectionRequestHandler - { - public void Init(ServerMetaData serverMetaData, IConnectionHandler connectHandler); - - public void Shutdown(); - - public void Run(); - } -} diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisconnectHandler.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisconnectHandler.cs deleted file mode 100644 index 054f1bb56..000000000 --- a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisconnectHandler.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Fusee.SLIRP.Network.Common; -using System.Net.Sockets; - -namespace Fusee.SLIRP.Network.Server.Common -{ - public interface IDisconnectHandler - { - - public bool IsHandlingDisconnecs { get; } - - public event Action EventClientDisconnected; - - public void OnClientDisconnected(IConnectionHandlingThread sender, Socket clientSocket); - } -} diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisposableConnectionHandling.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisposableConnectionHandling.cs deleted file mode 100644 index d5997d8f3..000000000 --- a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IDisposableConnectionHandling.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Fusee.SLIRP.Network.Common; -using Fusee.SLIRP.Network.Server.Common; -using System.Net.Sockets; -using System.Text; - -namespace Fusee.SLIRP.Network.Server.Examples -{ - /// - /// Controls what happens while a client is connected. - /// Calls when disposed. - /// - public abstract class IDisposableConnectionHandling : IConnectionHandlingThread, IDisposable - { - public IDisposableConnectionHandling():base() { } - - /// - /// Called when disposed. - /// Calls first then - /// - public void Dispose() - { - OnDispose(); - OnClientDisconnected(this, ClientSocket); - } - - - protected virtual void OnDispose() { } - } -} diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IServer.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IServer.cs deleted file mode 100644 index 6875e8d46..000000000 --- a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/IServer.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Fusee.SLIRP.Network.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Fusee.SLIRP.Network.Server.Common -{ - public interface IServer - { - public void Init(in ServerConnectionMetaData? metaData = null, int maxConnections = 6); - - public void Shutdown(); - - public void StartServer(in ServerConnectionMetaData? metaData = null); - - public void StopServer(); - } -} diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerConnectionMetaData.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerConnectionMetaData.cs deleted file mode 100644 index 2f488d939..000000000 --- a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerConnectionMetaData.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Fusee.SLIRP.Network.Common; -using System.Net; -using System.Net.Sockets; - -namespace Fusee.SLIRP.Network.Server.Common -{ - public struct ServerConnectionMetaData - { - /// - /// Which IP addresses will be accepted. - /// - public IPAddress ValidIPAdress = IPAddress.Any; - public ConnectionMetaData connData; - - public int Port => connData.Port; - public AddressFamily AddressFamily => connData.AddressFamily; - public ProtocolType ProtocolType => connData.ProtocolType; - public SocketType SocketType => connData.SocketType; - public NetworkPackageMeta NetworkPackageMeta=> connData.NetworkPackageMeta; - - public ServerConnectionMetaData(IPAddress validIPAdress, int port, AddressFamily addressFamily,ProtocolType protocolType, SocketType socketType, NetworkPackageMeta networkPackageMeta) - { - ValidIPAdress = validIPAdress; - connData = new ConnectionMetaData(port, addressFamily, protocolType, socketType, networkPackageMeta); - } - - public ServerConnectionMetaData(IPAddress validIPAdress, ConnectionMetaData connectionMetaData, NetworkPackageMeta networkPackageMeta) - { - ValidIPAdress = validIPAdress; - connData = new ConnectionMetaData(connectionMetaData); - } - } -} diff --git a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerMetaData.cs b/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerMetaData.cs deleted file mode 100644 index 035632f6a..000000000 --- a/src/SLIRP/Network/Server/Common/Fusee.SLIRP.Network.Server.Common/ServerMetaData.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Net.Sockets; - -namespace Fusee.SLIRP.Network.Server.Common -{ - - /// - /// The data of a server with references. - /// - public struct ServerMetaData - { - public IServer Server; - public Socket ServerSocket; - public int MaxConnections; - public ServerConnectionMetaData ConnectionData; - - public ServerMetaData(IServer server, Socket socket, int maxConnections, ServerConnectionMetaData connectionData) - { - Server = server; - ServerSocket = socket; - MaxConnections = maxConnections; - ConnectionData = connectionData; - } - } -} diff --git a/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicPingPongHandling.cs b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicPingPongHandling.cs deleted file mode 100644 index 95f138f65..000000000 --- a/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicPingPongHandling.cs +++ /dev/null @@ -1,50 +0,0 @@ -// -// Copyright (c) 2023 All Rights Reserved -// -// Marc-Alexander Lohfink -// 2/10/2023 9:36:43 AM - -using Fusee.SLIRP.Network.Server.Common; -using System.Net.Sockets; -using System.Text; - -namespace Fusee.SLIRP.Network.Server.Examples -{ - /// - /// Basic example for a who just follows a ping pong. - /// - public class BasicPingPongHandling : IDisposableConnectionHandling - { - public override void OnClientDisconnected(IConnectionHandlingThread handler, Socket disconnectedClient) - { - throw new NotImplementedException(); - } - - public override void RunHandleConnection() - { - while (true) - { - byte[] buffer = new byte[NetworkPackageMeta.BufferSize]; - int bytesReceived = ClientSocket.Receive(buffer); - - string messageReceived = ASCIIEncoding.ASCII.GetString(buffer, 0, bytesReceived); - Console.WriteLine("[Basic Ping Pong] Received: " + messageReceived); - - buffer = ASCIIEncoding.ASCII.GetBytes("Pong"); - Console.WriteLine("[Basic Ping Pong] Send: " + "Pong"); - ClientSocket.Send(buffer); - - buffer = ASCIIEncoding.ASCII.GetBytes("Ping"); - Console.WriteLine("[Basic Ping Pong] Send: " + "Ping"); - ClientSocket.Send(buffer); - - bytesReceived = ClientSocket.Receive(buffer); - messageReceived = ASCIIEncoding.ASCII.GetString(buffer, 0, bytesReceived); - Console.WriteLine("[Basic Ping Pong] Received: " + messageReceived); - - break; - } - } - - } -} diff --git a/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicServer.cs b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicServer.cs deleted file mode 100644 index 66ce0d8f3..000000000 --- a/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/BasicServer.cs +++ /dev/null @@ -1,130 +0,0 @@ -using Fusee.SLIRP.Network.Common; -using Fusee.SLIRP.Network.Server.Common; -using System.Net; -using System.Net.Sockets; - -namespace Fusee.SLIRP.Network.Server.Examples -{ - public class BasicServer : IServer - { - public const int BUFFERSIZE = 1024; - public static ServerConnectionMetaData DefaultSLIRP = new ServerConnectionMetaData(IPAddress.Any, 1300, AddressFamily.InterNetwork, ProtocolType.Udp, SocketType.Stream, new NetworkPackageMeta(BUFFERSIZE)); - - private bool _isInitialized; - private bool _isRunning; - private IConnectionRequestHandler? _connRequestHandler; - private IConnectionHandler? _connectionHandler; - private Thread? _connRequestHandlerThread; - - private ServerConnectionMetaData curServerConnectionMetaData; - private ServerMetaData serverMetaData; - - private Socket? renderSocket; - private int maxConnections = 10; - - public void Init(in ServerConnectionMetaData? metaData = null, int maxConnections = 10) - { - if (_isRunning || _isInitialized) return; - - _isInitialized = true; - - this.maxConnections = maxConnections; - - if (metaData != null) - { - curServerConnectionMetaData = metaData.Value; - } - else - { - curServerConnectionMetaData = DefaultSLIRP; - //curServerConnectionMetaData.NetworkPackageMeta = new NetworkPackageMeta(BUFFERSIZE); - } - - renderSocket = new Socket(curServerConnectionMetaData.AddressFamily, curServerConnectionMetaData.SocketType, curServerConnectionMetaData.ProtocolType); - serverMetaData = new ServerMetaData(this, renderSocket, this.maxConnections, curServerConnectionMetaData); - - _connectionHandler = new ConnectionHandler(); - _connRequestHandler = new ConnectionRequestHandler(); - - _connectionHandler.Init(curServerConnectionMetaData.NetworkPackageMeta); - _connRequestHandler.Init(serverMetaData, _connectionHandler); - - _connRequestHandlerThread = new Thread(new ThreadStart(_connRequestHandler.Run)); - } - - - public void Shutdown() - { - if (!_isInitialized) - return; - - if (_isRunning) - { - Console.WriteLine("Stop server before calling \"Shutdown()\"."); - return; - } - - if (_connRequestHandler != null) - { - _connRequestHandler.Shutdown(); - } - - if(_connRequestHandlerThread.ThreadState == ThreadState.Running) - { - try - { - _connRequestHandlerThread.Abort(); - }catch(Exception e) - { - Console.WriteLine("There was a problem aborting request handler thread!" + e.Message); - } - } - - - - _isInitialized = false; - } - - public void StartServer(in ServerConnectionMetaData? metaData = null) - { - if (!_isInitialized) - Init(metaData); - - if (_isRunning) - { - Console.WriteLine("Server is already running."); - return; - } - - _isRunning = true; - - _connectionHandler.StartHandling(); - - _connRequestHandlerThread.Start(); - - } - - public void StopServer() - { - if (!_isRunning) - { - Console.WriteLine("Server is not running."); - return; - } - - if (_connRequestHandlerThread != null) - _connRequestHandlerThread.Interrupt(); - - //if the server is stopped, all running connection handlings - //should shutdown. - if (_connectionHandler != null) - { - _connectionHandler.Shutdown(); - } - - _isRunning = false; - - } - - } -} \ No newline at end of file diff --git a/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionHandler.cs b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionHandler.cs deleted file mode 100644 index ab4666fb0..000000000 --- a/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionHandler.cs +++ /dev/null @@ -1,193 +0,0 @@ -using System.Net.Sockets; -using Fusee.SLIRP.Network.Common; -using Fusee.SLIRP.Network.Server.Common; - -namespace Fusee.SLIRP.Network.Server.Examples -{ - /// - /// Handles all accepted connections by the and also the disconnecting connections. - /// - /// - internal class ConnectionHandler : IConnectionHandler, IDisposable where T : IConnectionHandlingThread, new() - { - private IConnectionRequestHandler _requestHandler; - private NetworkPackageMeta _packageMeta; - - private bool _isInitialized; - private bool _isHandling; - - private Dictionary _handlingThreads = new Dictionary(); - - public bool IsRunning => _isHandling; - - public bool IsHandlingConnections => _isHandling; - public bool IsHandlingDisconnecs => _isHandling; - - public event Action EventClientConnected; - - public event Action EventClientDisconnected; - - public void Init(NetworkPackageMeta networkPackageMeta) - { - _packageMeta = networkPackageMeta; - - //set first so incomming connectioncan be handled directly - _isInitialized = true; - } - - public void StartHandling() - { - if (!_isInitialized) - return; - - if (_isHandling) - return; - - _isHandling = true; - } - - public void StopHandling() - { - if (!_isHandling) - return; - - //if a handler stops handling, all handlings have to be shutdown - //e.g. if a server stops, the connections have to be closed. - // if the server starts all clients have to reconnect. - ShutdownAllHandlings(); - - _isHandling = false; - } - - public void Shutdown() - { - //DeregisterFromRequestHandler(); - - ShutdownAllHandlings(); - - _isInitialized = false; - } - - private void ShutdownAllHandlings() - { - if (_handlingThreads != null && _handlingThreads.Count > 0) - foreach (var handling in _handlingThreads) - { - Thread handlingThread = handling.Value; - Socket handlingSocket = handling.Key; - - ShutdownThread(handlingThread); - - ShutdownSocket(handlingSocket); - - } - } - - private static void ShutdownSocket(Socket handlingSocket) - { - if (handlingSocket != null) - { - try - { - - handlingSocket.Close(); - handlingSocket.Shutdown(SocketShutdown.Both); - } - catch (Exception e) - { - Console.WriteLine("There was a problem closing and shutingdown socket! " + e.Message); - } - } - } - - private static void ShutdownThread(Thread handlingThread) - { - if (handlingThread != null) - { - try - { - if (handlingThread.ThreadState == ThreadState.Running) - { - - handlingThread.Abort(); - } - } - catch (Exception e) - { - Console.WriteLine("There was a problem aborting connection handling thread! " + e.Message); - } - - } - } - - //private void RegisterAtRequestHandler() - //{ - // if (_requestHandler == null) throw new NullReferenceException("Client Handler initialization was called without an IConnectionRequestHandler!"); - - // _requestHandler.OnClientConnect += OnClientConnected; - //} - - //private void DeregisterFromRequestHandler() - //{ - // if (_requestHandler != null) - // { - // _requestHandler.OnClientConnect -= OnClientConnected; - // } - //} - - private void HandleClient(Socket clientSocket) - { - if (!_isInitialized) - return; - - if (clientSocket == null) throw new NullReferenceException("Client Handler was called without an argument"); - - T clientHandling = new T(); - clientHandling.Init(this, clientSocket, _packageMeta); - - Thread clientThread = new Thread(new ThreadStart(clientHandling.RunHandleConnection)); - - AddSocketToDictionary(clientSocket, clientThread); - - clientThread.Start(); - } - - public void OnClientConnected(IConnectionRequestHandler sender, Socket clientSocket) - { - if (sender != _requestHandler) - return; - - HandleClient(clientSocket); - - EventClientConnected?.Invoke(this, clientSocket); - } - - public void OnClientDisconnected(IConnectionHandlingThread sender, Socket clientSocket) - { - if (sender != _requestHandler) - return; - - RemoveSocketFromDictionary(clientSocket); - - EventClientDisconnected?.Invoke(this, clientSocket); - } - - private void AddSocketToDictionary(Socket clientSocket, Thread clientThread) - { - _handlingThreads.Add(clientSocket, clientThread); - } - - private void RemoveSocketFromDictionary(Socket clientSocket) - { - if (_handlingThreads.ContainsKey(clientSocket)) - { - _handlingThreads.Remove(clientSocket); - } - } - - public void Dispose() - { - Shutdown(); - } - } -} diff --git a/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionRequestHandler.cs b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionRequestHandler.cs deleted file mode 100644 index 633d180b9..000000000 --- a/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/ConnectionRequestHandler.cs +++ /dev/null @@ -1,85 +0,0 @@ -using Fusee.SLIRP.Network.Common; -using Fusee.SLIRP.Network.Server.Common; -using System.Net; -using System.Net.Sockets; - -namespace Fusee.SLIRP.Network.Server.Examples -{ - /// - /// Binds the socket and listens on it for new connections. - /// In order to be able to accept connections, the passed - /// has to be running. - /// - internal class ConnectionRequestHandler : IConnectionRequestHandler - { - private IConnectionHandler _connectHandler; - private ServerMetaData serverMetaData; - private Socket serverSocket; - - private IPEndPoint listeningEndPoint; - - bool threadContinue = false; - - private bool _isInitialized; - - public void Init (ServerMetaData serverMetaData, IConnectionHandler connectHandler) - { - this.serverMetaData = serverMetaData; - _connectHandler = connectHandler; - _isInitialized = true; - } - - - public void Shutdown() - { - if (!_isInitialized && !threadContinue) - return; - - threadContinue = false; - - if (serverSocket != null) - { - try - { - serverSocket.Close(); - serverSocket.Shutdown(SocketShutdown.Both); - } - catch(Exception e) - { - Console.WriteLine("There was a problem closing and shutting down the socket! " + e.Message); - } - } - - _isInitialized = false; - } - - public void Run() - { - threadContinue = true; - - serverSocket = serverMetaData.ServerSocket; - - listeningEndPoint = new IPEndPoint(serverMetaData.ConnectionData.ValidIPAdress, serverMetaData.ConnectionData.Port); - - serverSocket.Bind(listeningEndPoint); - serverSocket.Listen(serverMetaData.MaxConnections); - - while (threadContinue) - { - if (!_connectHandler.IsRunning) - continue; - - try - { - Socket clientSocket = serverSocket.Accept(); - - _connectHandler.OnClientConnected(this, clientSocket); - } - catch (System.Exception) - { - throw; - } - } - } - } -} diff --git a/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/Fusee.SLIRP.Network.Server.Examples.csproj b/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/Fusee.SLIRP.Network.Server.Examples.csproj deleted file mode 100644 index 832c4e21b..000000000 --- a/src/SLIRP/Network/Server/Examples/Fusee.SLIRP.Network.Server.Examples/Fusee.SLIRP.Network.Server.Examples.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - net7.0 - enable - enable - - - - - - - - - From 46eeaad607574dbf866b7f5a344d5a07d0262750 Mon Sep 17 00:00:00 2001 From: Marc Date: Mon, 11 Mar 2024 10:30:51 +0100 Subject: [PATCH 06/17] Exposing Camera and PC Core for SLIRP program --- .../Complete/PointCloudPotree2/Core/PointCloudPotree2.cs | 9 +++++++-- .../PointCloudPotree2/Core/PointCloudPotree2Core.cs | 7 ++++++- src/Base/Core/Fusee.Base.Core.csproj | 1 + src/Engine/Common/IRenderCanvasImp.cs | 1 + src/Engine/Core/RenderCanvas.cs | 3 ++- src/Engine/Core/RenderContext.cs | 1 + src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs | 1 + 7 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs index d9774fcf3..326eeb2af 100644 --- a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs +++ b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs @@ -1,5 +1,6 @@ using Fusee.Engine.Common; using Fusee.Engine.Core; +using Fusee.Engine.Core.Scene; using Fusee.PointCloud.Common; namespace Fusee.Examples.PointCloudPotree2.Core @@ -22,9 +23,13 @@ public bool ClosingRequested private PointCloudPotree2Core _pointRenderingCore; + //Changed for SLIRP + public Camera MainCamera => _pointRenderingCore?.MainCamera; + public PointCloudPotree2Core Core => _pointRenderingCore; + public PointCloudPotree2() { - + } public override void Init() @@ -32,7 +37,7 @@ public override void Init() VSync = false; _pointRenderingCore = new PointCloudPotree2Core(RC) { - RenderToTexture = false + RenderToTexture = false }; _pointRenderingCore.Init(); diff --git a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs index 98bca57ab..9b4595a42 100644 --- a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs +++ b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs @@ -1,4 +1,5 @@ using Fusee.Base.Common; +using Fusee.Engine.Common; using Fusee.Engine.Core; using Fusee.Engine.Core.Scene; using Fusee.Math.Core; @@ -52,6 +53,9 @@ public bool ClosingRequested private readonly RenderContext _rc; + //Expose camera to use it in SLIRP + public Camera MainCamera => _cam; + public void OnLoadNewFile(object sender, EventArgs e) { var path = PointRenderingParams.Instance.PathToOocFile; @@ -111,7 +115,8 @@ public void Init() _cam = new(ProjectionMethod.Perspective, ZNear, ZFar, _fovy) { - BackgroundColor = float4.One, + //SLIRP + BackgroundColor = float4.Zero, RenderTexture = RenderTexture }; diff --git a/src/Base/Core/Fusee.Base.Core.csproj b/src/Base/Core/Fusee.Base.Core.csproj index de028f72d..aa800a965 100644 --- a/src/Base/Core/Fusee.Base.Core.csproj +++ b/src/Base/Core/Fusee.Base.Core.csproj @@ -6,6 +6,7 @@ true Fusee Base Core + AnyCPU;x64 diff --git a/src/Engine/Common/IRenderCanvasImp.cs b/src/Engine/Common/IRenderCanvasImp.cs index 37013f2b0..2ec9a2ed9 100644 --- a/src/Engine/Common/IRenderCanvasImp.cs +++ b/src/Engine/Common/IRenderCanvasImp.cs @@ -137,6 +137,7 @@ public interface IRenderCanvasImp /// /// Does the postrender of this instance. + /// SLIRP /// public void DoPostRender(); diff --git a/src/Engine/Core/RenderCanvas.cs b/src/Engine/Core/RenderCanvas.cs index a2f990908..55a8ee692 100644 --- a/src/Engine/Core/RenderCanvas.cs +++ b/src/Engine/Core/RenderCanvas.cs @@ -24,7 +24,8 @@ public class RenderCanvas /// The canvas implementor. /// [InjectMe] - public IRenderCanvasImp CanvasImplementor { set; get; } + public IRenderCanvasImp CanvasImplementor { + set; get; } /// /// Gets and sets the RenderContext implementor. diff --git a/src/Engine/Core/RenderContext.cs b/src/Engine/Core/RenderContext.cs index 3e1d3c176..65d5074f0 100644 --- a/src/Engine/Core/RenderContext.cs +++ b/src/Engine/Core/RenderContext.cs @@ -6,6 +6,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Fusee.ImGuiImp.Desktop")] diff --git a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs index 36603528f..692e7125e 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs @@ -372,6 +372,7 @@ public virtual void DoRender() /// /// Does the postrender of this instance. + /// SLIRP /// public virtual void DoPostRender() { From 4f6450c84a4ca5da80d569501e92793ab6814e7a Mon Sep 17 00:00:00 2001 From: Marc Date: Mon, 11 Mar 2024 16:23:09 +0100 Subject: [PATCH 07/17] Update RenderContext.cs --- src/Engine/Core/RenderContext.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Engine/Core/RenderContext.cs b/src/Engine/Core/RenderContext.cs index 65d5074f0..3e1d3c176 100644 --- a/src/Engine/Core/RenderContext.cs +++ b/src/Engine/Core/RenderContext.cs @@ -6,7 +6,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Net; using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Fusee.ImGuiImp.Desktop")] From 20a6f4a77bc90ad6be4b4c53fe1f95e294c655d1 Mon Sep 17 00:00:00 2001 From: Marc Date: Mon, 25 Mar 2024 11:02:01 +0100 Subject: [PATCH 08/17] Expose GameWindow --- src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs index 692e7125e..45485d808 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs @@ -206,6 +206,9 @@ public int TryptMonitorSetupHorizontal internal RenderCanvasGameWindow _gameWindow; + //SLIRP + public GameWindow GW => _gameWindow; + #endregion #region Constructors From c71a447452a2f2106178d02d20eb22d96b48459c Mon Sep 17 00:00:00 2001 From: Marc Date: Tue, 14 May 2024 15:52:00 +0200 Subject: [PATCH 09/17] Update Input.cs --- src/Engine/Core/Input.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Engine/Core/Input.cs b/src/Engine/Core/Input.cs index 2cdfe70f1..026e0eef7 100644 --- a/src/Engine/Core/Input.cs +++ b/src/Engine/Core/Input.cs @@ -403,8 +403,6 @@ public void AddInputDriverImp(IInputDriverImp inputDriver) /// public static void AddDriverImp(IInputDriverImp inputDriver) => Instance.AddInputDriverImp(inputDriver); - - private void OnNewDeviceImpConnected(object sender, NewDeviceImpConnectedArgs args) { if (sender == null) throw new ArgumentNullException(nameof(sender)); From bd75122eed43958f13981ab16d35cb744529be36 Mon Sep 17 00:00:00 2001 From: Marc Date: Mon, 27 May 2024 10:03:28 +0200 Subject: [PATCH 10/17] Refactoring --- .../Core/PointCloudPotree2.cs | 2 +- src/Engine/Common/IRenderCanvasImp.cs | 9 -- src/Engine/Common/PostRenderEventArgs.cs | 11 --- src/Engine/Core/RenderCanvas.cs | 13 --- .../Imp/Graphics/Desktop/RenderCanvasImp.cs | 88 +------------------ 5 files changed, 4 insertions(+), 119 deletions(-) delete mode 100644 src/Engine/Common/PostRenderEventArgs.cs diff --git a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs index 326eeb2af..20ec899bd 100644 --- a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs +++ b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs @@ -23,7 +23,7 @@ public bool ClosingRequested private PointCloudPotree2Core _pointRenderingCore; - //Changed for SLIRP + // Changed for SLIRP public Camera MainCamera => _pointRenderingCore?.MainCamera; public PointCloudPotree2Core Core => _pointRenderingCore; diff --git a/src/Engine/Common/IRenderCanvasImp.cs b/src/Engine/Common/IRenderCanvasImp.cs index 2ec9a2ed9..313563cc4 100644 --- a/src/Engine/Common/IRenderCanvasImp.cs +++ b/src/Engine/Common/IRenderCanvasImp.cs @@ -135,11 +135,6 @@ public interface IRenderCanvasImp /// public void DoRender(); - /// - /// Does the postrender of this instance. - /// SLIRP - /// - public void DoPostRender(); /// /// Does the resize on this instance. @@ -169,10 +164,6 @@ public interface IRenderCanvasImp /// event EventHandler Render; /// - /// Occurs when [PostRender] is called. - /// - event EventHandler PostRender; - /// /// Occurs when [Resize] is called. /// event EventHandler Resize; diff --git a/src/Engine/Common/PostRenderEventArgs.cs b/src/Engine/Common/PostRenderEventArgs.cs deleted file mode 100644 index 59812d542..000000000 --- a/src/Engine/Common/PostRenderEventArgs.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace Fusee.Engine.Common -{ - /// - /// Post-Render arguments for events. - /// - public class PostRenderEventArgs - { - } -} diff --git a/src/Engine/Core/RenderCanvas.cs b/src/Engine/Core/RenderCanvas.cs index 55a8ee692..db7d1bb71 100644 --- a/src/Engine/Core/RenderCanvas.cs +++ b/src/Engine/Core/RenderCanvas.cs @@ -64,10 +64,6 @@ public IRenderCanvasImp CanvasImplementor { #endregion - #region Constructors - - #endregion - #region Members /// @@ -233,15 +229,6 @@ public void InitApp() EndOfFrame?.Invoke(this, EventArgs.Empty); }; - //Wäre meine Idee gewesen. Dann müssten die Methoden "GetFrameBuffer" und "GetDepthBuffer" - //im Interface und damit für alle Implementierungen erstellt werden. Weiß nicht, ob das so gewollt ist. - //CanvasImplementor.PostRender += delegate - //{ - //var frameBuffer = CanvasImplementor.GetFrameBuffer(Width,Heigth); - //var depthBuffer = CanvasImplementor.GetDepthBuffer(Width,Heigth); - //}; - - CanvasImplementor.Resize += (s, e) => { if (IsShuttingDown) return; diff --git a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs index 45485d808..fa292a285 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs @@ -206,9 +206,9 @@ public int TryptMonitorSetupHorizontal internal RenderCanvasGameWindow _gameWindow; - //SLIRP - public GameWindow GW => _gameWindow; - + // SLIRP + // has to be exposed so that the SLIRP program can map new input resources + protected GameWindow GW => _gameWindow; #endregion #region Constructors @@ -312,10 +312,6 @@ public RenderCanvasImp(int width, int height) /// public event EventHandler Render; /// - /// Occurs when [postrender]. - /// - public event EventHandler PostRender; - /// /// Occurs when [resize]. /// public event EventHandler Resize; @@ -373,15 +369,6 @@ public virtual void DoRender() Render?.Invoke(this, new RenderEventArgs()); } - /// - /// Does the postrender of this instance. - /// SLIRP - /// - public virtual void DoPostRender() - { - PostRender?.Invoke(this, new PostRenderEventArgs()); - } - /// /// Does the resize on this instance. /// @@ -534,75 +521,6 @@ public SixLabors.ImageSharp.Image ShootCurrentFrame(int width, int height) return img; } - /// - /// Return the framebuffer. - /// - /// Width of the frame. - /// Heigth of the frame. - /// First pixel to start with on the x axis. - /// First pixel to start with on the x axis. - /// Can return an empty array if the width or height are smaller than x or y. - public byte[] GetFrameBuffer(int width, int height, int x = 0, int y = 0) - { - if (width <= x || height <= y) - return new byte[0]; - - var mem = new byte[(width-x) * (height-y) * 4]; - - GL.Flush(); - - GL.ReadPixels(x, y, width, height, PixelFormat.Bgra, PixelType.UnsignedByte, mem); - - return mem; - } - - /// - /// Return the depthbuffer. - /// - /// Width of the frame. - /// Heigth of the frame. - /// First pixel to start with on the x axis. - /// First pixel to start with on the x axis. - /// Can return an empty array if the width or height are smaller than x or y. - public byte[] GetDepthBuffer(int width, int height, int x = 0, int y = 0) - { - if (width <= x || height <= y) - return new byte[0]; - - // - GL.Enable(EnableCap.DepthTest); - - var mem = new byte[width * height * 4]; - - GL.Flush(); - - GL.ReadPixels(x, y, width, height, PixelFormat.DepthComponent, PixelType.UnsignedInt, mem); - - return mem; - } - - /// - /// Return the stencilbuffer. - /// - /// Width of the frame. - /// Heigth of the frame. - /// First pixel to start with on the x axis. - /// First pixel to start with on the x axis. - /// Can return an empty array if the width or height are smaller than x or y. - public byte[] GetStencilBuffer(int width, int height, int x = 0, int y = 0) - { - // - GL.Enable(EnableCap.StencilTest); - - var mem = new byte[width * height * 4]; - - GL.Flush(); - - GL.ReadPixels(0, 0, width, height, PixelFormat.StencilIndex, PixelType.UnsignedInt, mem); - - return mem; - } - #endregion } } \ No newline at end of file From b97119c2b91253e7ee14404362255d4b64e0cd9f Mon Sep 17 00:00:00 2001 From: Marc Date: Tue, 28 May 2024 07:26:43 +0200 Subject: [PATCH 11/17] Expose Main Camera and related Components in Potree --- Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs | 2 +- .../Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs index 20ec899bd..a5c6ff664 100644 --- a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs +++ b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs @@ -24,7 +24,7 @@ public bool ClosingRequested private PointCloudPotree2Core _pointRenderingCore; // Changed for SLIRP - public Camera MainCamera => _pointRenderingCore?.MainCamera; + public SceneNode MainCameraSceneNode => _pointRenderingCore?.MainCameraNode; public PointCloudPotree2Core Core => _pointRenderingCore; public PointCloudPotree2() diff --git a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs index 9b4595a42..742598048 100644 --- a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs +++ b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs @@ -55,6 +55,8 @@ public bool ClosingRequested //Expose camera to use it in SLIRP public Camera MainCamera => _cam; + public Transform MainCameraTransform => _camTransform; + public SceneNode MainCameraNode => _camNode; public void OnLoadNewFile(object sender, EventArgs e) { From f8c019443a634d50fc49e38330d25028e72e4087 Mon Sep 17 00:00:00 2001 From: Marc Date: Tue, 28 May 2024 13:07:42 +0200 Subject: [PATCH 12/17] Disabled Camera Input --- .../Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs index 742598048..e21476cdd 100644 --- a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs +++ b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs @@ -206,6 +206,9 @@ public void Update(bool allowInput) OocLoader.IsUserMoving = false;*/ //-------------------------------------------------------------------------------------------- + // SLIRP + // in SLIRP we take the input from the SLIRP Client + /* // Mouse and keyboard movement if (Input.Keyboard.LeftRightAxis != 0 || Input.Keyboard.UpDownAxis != 0) _keys = true; @@ -234,6 +237,8 @@ public void Update(bool allowInput) _angleVelVert = 0; _camTransform.FpsView(_angleHorz, _angleVert, Input.Keyboard.WSAxis, Input.Keyboard.ADAxis, Time.DeltaTimeUpdate * 20); + */ + } private void OnThresholdChanged(int newValue) From 45efcd2a56e303cbe0e8c12fcfba19488912afd3 Mon Sep 17 00:00:00 2001 From: Marc Date: Thu, 13 Jun 2024 13:45:03 +0200 Subject: [PATCH 13/17] Comments for directly rendering in YUV --- src/Base/Common/ColorFormat.cs | 6 ++++++ src/Base/Common/ImagePixelFormat.cs | 4 +++- src/Base/Common/ScanLine.cs | 3 +++ src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs | 4 ++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Base/Common/ColorFormat.cs b/src/Base/Common/ColorFormat.cs index a04962943..f06a79873 100644 --- a/src/Base/Common/ColorFormat.cs +++ b/src/Base/Common/ColorFormat.cs @@ -59,5 +59,11 @@ public enum ColorFormat /// RGBA int, 32bit. /// iRGBA32, + + /// + /// SLIRP + /// YUV 420, 32bit. + /// + //YUV420, } } \ No newline at end of file diff --git a/src/Base/Common/ImagePixelFormat.cs b/src/Base/Common/ImagePixelFormat.cs index ff57f0b07..aec294a0e 100644 --- a/src/Base/Common/ImagePixelFormat.cs +++ b/src/Base/Common/ImagePixelFormat.cs @@ -37,7 +37,9 @@ public int BytesPerPixel ColorFormat == ColorFormat.Depth24 || ColorFormat == ColorFormat.uiRgb8 ? 3 : - ColorFormat == ColorFormat.RGBA + ColorFormat == ColorFormat.RGBA + // SLIRP + //|| ColorFormat == ColorFormat.YUV420 ? 4 : ColorFormat == ColorFormat.fRGB16 ? 6 : diff --git a/src/Base/Common/ScanLine.cs b/src/Base/Common/ScanLine.cs index 3c8c77a99..19fd1ca01 100644 --- a/src/Base/Common/ScanLine.cs +++ b/src/Base/Common/ScanLine.cs @@ -64,6 +64,9 @@ public int BytesPerPixel ColorFormat.Depth24 => 3, ColorFormat.uiRgb8 => 3, ColorFormat.RGBA => 4, + // SLIRP + // ColorFormat.YUV420 => 4, + // SLIRP close ColorFormat.fRGB16 => 6, ColorFormat.fRGBA16 => 8, ColorFormat.fRGB32 => 12, diff --git a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs index 74792d954..5165c6eda 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs @@ -204,7 +204,11 @@ private SizedInternalFormat GetSizedInteralFormat(ImagePixelFormat format) ColorFormat.Depth16 => (SizedInternalFormat)All.DepthComponent16, ColorFormat.RGB => (SizedInternalFormat)All.Rgb8, ColorFormat.Intensity => (SizedInternalFormat)All.R8, + // SLIRP + // ColorFormat.YUV420 => (SizedInternalFormat)All.YUV420, + // SLIRP close _ => throw new ArgumentOutOfRangeException("SizedInternalFormat not supported. Try to use a format with r,g,b and a components."), + }; } From b402cdc8c1f64e7a3b0432062c3b16f7917059b8 Mon Sep 17 00:00:00 2001 From: Marc Date: Tue, 18 Jun 2024 09:19:20 +0200 Subject: [PATCH 14/17] Expose Render Members --- .../Core/PointCloudPotree2.cs | 21 ++++++++++++++++++- .../Core/PointCloudPotree2Core.cs | 9 ++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs index a5c6ff664..705fd015f 100644 --- a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs +++ b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2.cs @@ -24,9 +24,26 @@ public bool ClosingRequested private PointCloudPotree2Core _pointRenderingCore; // Changed for SLIRP + public Camera MainCamera => _pointRenderingCore?.MainCamera; + public Transform MainCameraTransform => _pointRenderingCore?.MainCameraTransform; public SceneNode MainCameraSceneNode => _pointRenderingCore?.MainCameraNode; public PointCloudPotree2Core Core => _pointRenderingCore; + public bool RenderToTexture + { + get => _pointRenderingCore?.RenderToTexture ?? false; + set + { + if (_pointRenderingCore != null) _pointRenderingCore.RenderToTexture = value; + } + } + + public WritableTexture CurRenderTexture + { + get => _pointRenderingCore.RenderTexture; + set => _pointRenderingCore.RenderTexture = value; + } + public PointCloudPotree2() { @@ -37,7 +54,9 @@ public override void Init() VSync = false; _pointRenderingCore = new PointCloudPotree2Core(RC) { - RenderToTexture = false + // SLIRP + // RenderToTexture = true + RenderToTexture = false }; _pointRenderingCore.Init(); diff --git a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs index e21476cdd..fdf55b9f4 100644 --- a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs +++ b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs @@ -16,7 +16,12 @@ public class PointCloudPotree2Core { public bool RenderToTexture { get; set; } - public WritableTexture RenderTexture { get; private set; } + public WritableTexture RenderTexture + { + get; + // SLIRP + set; + } public bool ClosingRequested { @@ -119,7 +124,7 @@ public void Init() { //SLIRP BackgroundColor = float4.Zero, - RenderTexture = RenderTexture + //RenderTexture = RenderTexture }; _camNode = new SceneNode() From eb2af46f33bd22f72a394c49061e50dbec1628a3 Mon Sep 17 00:00:00 2001 From: Marc Date: Wed, 19 Jun 2024 11:21:40 +0200 Subject: [PATCH 15/17] Comments for directly rendering in BGRA --- src/Base/Common/ColorFormat.cs | 8 +++++++- src/Base/Common/ImagePixelFormat.cs | 5 +++-- src/Base/Common/ScanLine.cs | 3 ++- src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs | 1 + 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Base/Common/ColorFormat.cs b/src/Base/Common/ColorFormat.cs index f06a79873..7697519a5 100644 --- a/src/Base/Common/ColorFormat.cs +++ b/src/Base/Common/ColorFormat.cs @@ -1,4 +1,4 @@ -namespace Fusee.Base.Common +namespace Fusee.Base.Common { /// /// ColorFormat information in enum representation. Entries are hints for Color channel encoding. @@ -60,6 +60,12 @@ public enum ColorFormat /// iRGBA32, + /// + /// SLIRP + /// BGRA, 32bit. + /// + //BGRA, + /// /// SLIRP /// YUV 420, 32bit. diff --git a/src/Base/Common/ImagePixelFormat.cs b/src/Base/Common/ImagePixelFormat.cs index aec294a0e..c474a0cc2 100644 --- a/src/Base/Common/ImagePixelFormat.cs +++ b/src/Base/Common/ImagePixelFormat.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace Fusee.Base.Common { @@ -37,8 +37,9 @@ public int BytesPerPixel ColorFormat == ColorFormat.Depth24 || ColorFormat == ColorFormat.uiRgb8 ? 3 : - ColorFormat == ColorFormat.RGBA + ColorFormat == ColorFormat.RGBA // SLIRP + //|| ColorFormat == ColorFormat.BGRA //|| ColorFormat == ColorFormat.YUV420 ? 4 : ColorFormat == ColorFormat.fRGB16 diff --git a/src/Base/Common/ScanLine.cs b/src/Base/Common/ScanLine.cs index 19fd1ca01..ae80554d5 100644 --- a/src/Base/Common/ScanLine.cs +++ b/src/Base/Common/ScanLine.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace Fusee.Base.Common { @@ -65,6 +65,7 @@ public int BytesPerPixel ColorFormat.uiRgb8 => 3, ColorFormat.RGBA => 4, // SLIRP + // ColorFormat.BGRA => 4, // ColorFormat.YUV420 => 4, // SLIRP close ColorFormat.fRGB16 => 6, diff --git a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs index 5165c6eda..3422edd68 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs @@ -205,6 +205,7 @@ private SizedInternalFormat GetSizedInteralFormat(ImagePixelFormat format) ColorFormat.RGB => (SizedInternalFormat)All.Rgb8, ColorFormat.Intensity => (SizedInternalFormat)All.R8, // SLIRP + // ColorFormat.BGRA => (SizedInternalFormat)All.Bgra, // ColorFormat.YUV420 => (SizedInternalFormat)All.YUV420, // SLIRP close _ => throw new ArgumentOutOfRangeException("SizedInternalFormat not supported. Try to use a format with r,g,b and a components."), From c02b9b3e693794561d6ea12a884f95633b3224a9 Mon Sep 17 00:00:00 2001 From: MarcLohfink <77617650+MarcLohfink@users.noreply.github.com> Date: Wed, 25 Sep 2024 13:13:21 +0200 Subject: [PATCH 16/17] config projects to x64 --- .../Core/Fusee.Examples.PointCloudPotree2.Core.csproj | 1 + .../Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs | 4 ++-- src/Base/Common/Fusee.Base.Common.csproj | 1 + src/Base/Imp/Desktop/Fusee.Base.Imp.Desktop.csproj | 1 + src/Engine/Common/Fusee.Engine.Common.csproj | 1 + src/Engine/Core/Fusee.Engine.Core.csproj | 1 + src/Engine/GUI/Fusee.Engine.Gui.csproj | 1 + .../Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj | 2 ++ src/Jometri/Fusee.Jometri.csproj | 1 + src/Math/Core/Fusee.Math.Core.csproj | 1 + src/PointCloud/Common/Fusee.PointCloud.Common.csproj | 1 + src/PointCloud/Core/Fusee.PointCloud.Core.csproj | 1 + src/PointCloud/Potree/Fusee.PointCloud.Potree.csproj | 1 + src/Serialization/Fusee.Serialization.csproj | 1 + src/Structures/Fusee.Structures.csproj | 1 + src/Xene/Fusee.Xene.csproj | 1 + src/Xirkit/Fusee.Xirkit.csproj | 1 + 17 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Examples/Complete/PointCloudPotree2/Core/Fusee.Examples.PointCloudPotree2.Core.csproj b/Examples/Complete/PointCloudPotree2/Core/Fusee.Examples.PointCloudPotree2.Core.csproj index 146556704..0dade75fb 100644 --- a/Examples/Complete/PointCloudPotree2/Core/Fusee.Examples.PointCloudPotree2.Core.csproj +++ b/Examples/Complete/PointCloudPotree2/Core/Fusee.Examples.PointCloudPotree2.Core.csproj @@ -2,6 +2,7 @@ net7.0 $(BaseOutputPath)\Examples\PointCloudPotree2\Core\ + AnyCPU;x64 diff --git a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs index fdf55b9f4..563b501a3 100644 --- a/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs +++ b/Examples/Complete/PointCloudPotree2/Core/PointCloudPotree2Core.cs @@ -240,9 +240,9 @@ public void Update(bool allowInput) _angleVert += _angleVelVert; _angleVelHorz = 0; _angleVelVert = 0; - + _camTransform.FpsView(_angleHorz, _angleVert, Input.Keyboard.WSAxis, Input.Keyboard.ADAxis, Time.DeltaTimeUpdate * 20); - */ + ´*/ } diff --git a/src/Base/Common/Fusee.Base.Common.csproj b/src/Base/Common/Fusee.Base.Common.csproj index 072241484..436483fc0 100644 --- a/src/Base/Common/Fusee.Base.Common.csproj +++ b/src/Base/Common/Fusee.Base.Common.csproj @@ -6,6 +6,7 @@ true Fusee Base Common + AnyCPU;x64 diff --git a/src/Base/Imp/Desktop/Fusee.Base.Imp.Desktop.csproj b/src/Base/Imp/Desktop/Fusee.Base.Imp.Desktop.csproj index 194a9415d..972344d37 100644 --- a/src/Base/Imp/Desktop/Fusee.Base.Imp.Desktop.csproj +++ b/src/Base/Imp/Desktop/Fusee.Base.Imp.Desktop.csproj @@ -7,6 +7,7 @@ true Fusee Base Imp Desktop + AnyCPU;x64 diff --git a/src/Engine/Common/Fusee.Engine.Common.csproj b/src/Engine/Common/Fusee.Engine.Common.csproj index 63569d1ea..58bfe06ad 100644 --- a/src/Engine/Common/Fusee.Engine.Common.csproj +++ b/src/Engine/Common/Fusee.Engine.Common.csproj @@ -6,6 +6,7 @@ true Fusee Engine Common + AnyCPU;x64 diff --git a/src/Engine/Core/Fusee.Engine.Core.csproj b/src/Engine/Core/Fusee.Engine.Core.csproj index 33b1c9a3a..826f6fc93 100644 --- a/src/Engine/Core/Fusee.Engine.Core.csproj +++ b/src/Engine/Core/Fusee.Engine.Core.csproj @@ -6,6 +6,7 @@ true Fusee Engine Core enable + AnyCPU;x64 diff --git a/src/Engine/GUI/Fusee.Engine.Gui.csproj b/src/Engine/GUI/Fusee.Engine.Gui.csproj index 5037618e2..d33000d1c 100644 --- a/src/Engine/GUI/Fusee.Engine.Gui.csproj +++ b/src/Engine/GUI/Fusee.Engine.Gui.csproj @@ -6,6 +6,7 @@ true Fusee Engine GUI + AnyCPU;x64 diff --git a/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj b/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj index b2701eb43..d7b38b3c3 100644 --- a/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj +++ b/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj @@ -9,6 +9,8 @@ Fusee Engine Imp Graphics Desktop true + + AnyCPU;x64 diff --git a/src/Jometri/Fusee.Jometri.csproj b/src/Jometri/Fusee.Jometri.csproj index 56e25e1d9..f127dda46 100644 --- a/src/Jometri/Fusee.Jometri.csproj +++ b/src/Jometri/Fusee.Jometri.csproj @@ -6,6 +6,7 @@ true Fusee Jometri + AnyCPU;x64 diff --git a/src/Math/Core/Fusee.Math.Core.csproj b/src/Math/Core/Fusee.Math.Core.csproj index 7dac979e0..9847c6b9a 100644 --- a/src/Math/Core/Fusee.Math.Core.csproj +++ b/src/Math/Core/Fusee.Math.Core.csproj @@ -9,6 +9,7 @@ enable true + AnyCPU;x64 diff --git a/src/PointCloud/Common/Fusee.PointCloud.Common.csproj b/src/PointCloud/Common/Fusee.PointCloud.Common.csproj index ef134cf84..6309a22ac 100644 --- a/src/PointCloud/Common/Fusee.PointCloud.Common.csproj +++ b/src/PointCloud/Common/Fusee.PointCloud.Common.csproj @@ -3,6 +3,7 @@ netstandard2.1;net7.0 $(OutputPath)\$(RootNamespace).xml + AnyCPU;x64 diff --git a/src/PointCloud/Core/Fusee.PointCloud.Core.csproj b/src/PointCloud/Core/Fusee.PointCloud.Core.csproj index 7a280dd13..fcddfa8cd 100644 --- a/src/PointCloud/Core/Fusee.PointCloud.Core.csproj +++ b/src/PointCloud/Core/Fusee.PointCloud.Core.csproj @@ -3,6 +3,7 @@ netstandard2.1;net7.0 $(OutputPath)\$(RootNamespace).xml + AnyCPU;x64 diff --git a/src/PointCloud/Potree/Fusee.PointCloud.Potree.csproj b/src/PointCloud/Potree/Fusee.PointCloud.Potree.csproj index 52c49bd00..c167bb884 100644 --- a/src/PointCloud/Potree/Fusee.PointCloud.Potree.csproj +++ b/src/PointCloud/Potree/Fusee.PointCloud.Potree.csproj @@ -4,6 +4,7 @@ netstandard2.1;net7.0 $(OutputPath)\$(RootNamespace).xml enable + AnyCPU;x64 diff --git a/src/Serialization/Fusee.Serialization.csproj b/src/Serialization/Fusee.Serialization.csproj index 8c44d05f9..f0c4f74a3 100644 --- a/src/Serialization/Fusee.Serialization.csproj +++ b/src/Serialization/Fusee.Serialization.csproj @@ -6,6 +6,7 @@ true Fusee Serialization + AnyCPU;x64 diff --git a/src/Structures/Fusee.Structures.csproj b/src/Structures/Fusee.Structures.csproj index df0631a63..1cb022fdf 100644 --- a/src/Structures/Fusee.Structures.csproj +++ b/src/Structures/Fusee.Structures.csproj @@ -6,6 +6,7 @@ true Fusee Structures + AnyCPU;x64 diff --git a/src/Xene/Fusee.Xene.csproj b/src/Xene/Fusee.Xene.csproj index c49397bdf..0e81ad3c8 100644 --- a/src/Xene/Fusee.Xene.csproj +++ b/src/Xene/Fusee.Xene.csproj @@ -6,6 +6,7 @@ true Fusee Xene + AnyCPU;x64 diff --git a/src/Xirkit/Fusee.Xirkit.csproj b/src/Xirkit/Fusee.Xirkit.csproj index 7e4b3f541..ec0daa03f 100644 --- a/src/Xirkit/Fusee.Xirkit.csproj +++ b/src/Xirkit/Fusee.Xirkit.csproj @@ -6,6 +6,7 @@ true Fusee Xirkit + AnyCPU;x64 From 6a8e66333074fc971b69fd37397fc3f4856741fd Mon Sep 17 00:00:00 2001 From: MarcLohfink <77617650+MarcLohfink@users.noreply.github.com> Date: Wed, 25 Sep 2024 13:13:26 +0200 Subject: [PATCH 17/17] Update PointRenderParams.cs --- Examples/Complete/PointCloudPotree2/Core/PointRenderParams.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/Complete/PointCloudPotree2/Core/PointRenderParams.cs b/Examples/Complete/PointCloudPotree2/Core/PointRenderParams.cs index c69eaa1fc..9a0173ad7 100644 --- a/Examples/Complete/PointCloudPotree2/Core/PointRenderParams.cs +++ b/Examples/Complete/PointCloudPotree2/Core/PointRenderParams.cs @@ -15,7 +15,7 @@ public sealed class PointRenderingParams public PointThresholdHandler PointThresholdHandler; public ProjectedSizeModifierHandler ProjectedSizeModifierHandler; - public string PathToOocFile = Path.Combine("Assets", "Cube1030301", "Potree"); + public string PathToOocFile = Path.Combine("Assets", "Rose", "Potree"); public ShaderEffect DepthPassEf; public SurfaceEffectPointCloud ColorPassEf;