├── .gitignore ├── LICENSE.md ├── README.md ├── Xenko.ClientServerSample.Server ├── Assets │ ├── NavigationMesh.xknavmesh │ └── ServerScene.xkscene ├── HeadlessGame.cs ├── Xenko.ClientServerSample.Server.csproj └── Xenko.ClientServerSample.Server.xkpkg ├── Xenko.ClientServerSample.Windows ├── Resources │ └── Icon.ico ├── Xenko.ClientServerSample.Windows.csproj ├── Xenko.ClientServerSample.Windows.xkpkg └── Xenko_ClientServerSampleApp.cs ├── Xenko.ClientServerSample.sln └── Xenko.ClientServerSample ├── Assets ├── Crosshair256.xktex ├── GameSettings.xkgamesettings ├── GraphicsCompositor.xkgfxcomp ├── Ground Material.xkmat ├── Ground.xkpromodel ├── MainScene.xkscene ├── Skybox texture.xktex ├── Skybox.xksky ├── Sphere Material.xkmat └── Sphere.xkpromodel ├── BasicCameraController.cs ├── NetworkClient.cs ├── Resources ├── Crosshair256.png └── skybox_texture_hdr.dds ├── Xenko.ClientServerSample.csproj └── Xenko.ClientServerSample.xkpkg /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | *.user 3 | *.lock 4 | *.lock.json 5 | .vs/ 6 | _ReSharper* 7 | *.suo 8 | *.VC.db 9 | *.vshost.exe 10 | *.manifest 11 | *.sdf 12 | [Bb]in/ 13 | obj/ 14 | Cache/ 15 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Xenko contributors (https://xenko.com) 4 | 5 | All rights reserved. 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all 15 | copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Xenko.ClientServerSample 2 | 3 | Simple Xenko Game and its .NET Core server that process remotely physics raycasts. 4 | 5 | Press space or right click to "fire" and server will check if the sphere is hit. 6 | 7 | ## Build 8 | 9 | Make sure to run the server first then the game. 10 | 11 | Setting both projects as startup projects works fine too (right click on solution -> `Set Startup Projects`). 12 | 13 | ## Future 14 | 15 | Right now the server uses Xenko API manually to load a scene, as a quick proof of concept. 16 | 17 | Later it might be easier to have a `HeadlessGame` type to automatize loading of scene without graphics API and still be able to process specific C# scripts. -------------------------------------------------------------------------------- /Xenko.ClientServerSample.Server/Assets/NavigationMesh.xknavmesh: -------------------------------------------------------------------------------- 1 | !NavigationMeshAsset 2 | Id: 355e2ef3-1b55-42be-af1d-ce219d71f584 3 | SerializedVersion: {Xenko: 2.0.0.0} 4 | Tags: [] 5 | Scene: 50be6bd0-3731-42cd-9cfe-ddc2aa5a0090:MainScene 6 | IncludedCollisionGroups: AllFilter 7 | BuildSettings: 8 | CellHeight: 0.2 9 | CellSize: 0.3 10 | TileSize: 32 11 | MinRegionArea: 2 12 | RegionMergeArea: 20 13 | MaxEdgeLen: 12.0 14 | MaxEdgeError: 1.3 15 | DetailSamplingDistance: 6.0 16 | MaxDetailSamplingError: 1.0 17 | SelectedGroups: 18 | 7775d21025e6b7948d7766e1638e1c1f: 64bf3a66-881e-438a-bed0-ed06c0361615 19 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample.Server/Assets/ServerScene.xkscene: -------------------------------------------------------------------------------- 1 | !SceneAsset 2 | Id: 412503d3-04f6-49be-a8b4-27571fdd49f6 3 | SerializedVersion: {Xenko: 3.1.0.1} 4 | Tags: [] 5 | ChildrenIds: [] 6 | Offset: {X: 0.0, Y: 0.0, Z: 0.0} 7 | Hierarchy: 8 | RootParts: 9 | - ref!! 1333765e-2f79-49b0-814b-ea962963db0c 10 | Parts: 11 | - Entity: 12 | Id: 1333765e-2f79-49b0-814b-ea962963db0c 13 | Name: Navigation 14 | Components: 15 | ac96f4ddde9276b1759ff8198e02b700: !TransformComponent 16 | Id: ece640a1-5436-4536-a59e-8950288f37df 17 | Position: {X: 0.0, Y: 0.0, Z: 0.0} 18 | Rotation: {X: 0.0, Y: 0.0, Z: 0.0, W: 1.0} 19 | Scale: {X: 1.0, Y: 1.0, Z: 1.0} 20 | Children: {} 21 | af3440157275870a893b5946a3170568: !NavigationComponent 22 | Id: 9d103b8d-94c5-4590-b42a-0e9cd9daaa75 23 | NavigationMesh: 355e2ef3-1b55-42be-af1d-ce219d71f584:NavigationMesh 24 | GroupId: 64bf3a66-881e-438a-bed0-ed06c0361615 25 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample.Server/HeadlessGame.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Xenko contributors (https://xenko.com) 2 | // Distributed under the MIT license. See the LICENSE.md file in the project root for more information. 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | using Xenko.Core; 9 | using Xenko.Core.IO; 10 | using Xenko.Core.Mathematics; 11 | using Xenko.Core.Serialization; 12 | using Xenko.Core.Serialization.Contents; 13 | using Xenko.Core.Storage; 14 | using Xenko.Engine; 15 | using Xenko.Engine.Design; 16 | using Xenko.Engine.Network; 17 | using Xenko.Games; 18 | using Xenko.Physics; 19 | 20 | namespace Xenko.ClientServerSample.Server 21 | { 22 | class HeadlessGame 23 | { 24 | public ServiceRegistry Services { get; private set; } 25 | 26 | public ContentManager Content { get; private set; } 27 | 28 | static void Main(string[] args) 29 | { 30 | new HeadlessGame().Run().Wait(); 31 | } 32 | 33 | public async Task Run() 34 | { 35 | Services = new ServiceRegistry(); 36 | 37 | // Database file provider 38 | Services.AddService(new DatabaseFileProviderService(new DatabaseFileProvider(ObjectDatabase.CreateDefaultDatabase()))); 39 | 40 | // Content manager 41 | Content = new ContentManager(Services); 42 | Services.AddService(Content); 43 | Services.AddService(Content); 44 | 45 | //Services.AddService(new GraphicsDeviceServiceLocal(null)); 46 | 47 | // Game systems 48 | var gameSystems = new GameSystemCollection(Services); 49 | Services.AddService(gameSystems); 50 | gameSystems.Initialize(); 51 | 52 | // Load scene (physics only) 53 | var loadSettings = new ContentManagerLoaderSettings 54 | { 55 | // Ignore all references (Model, etc...) 56 | ContentFilter = ContentManagerLoaderSettings.NewContentFilterByType() 57 | }; 58 | var scene = await Content.LoadAsync("MainScene", loadSettings); 59 | var sceneInstance = new SceneInstance(Services, scene, ExecutionMode.None); 60 | var sceneSystem = new SceneSystem(Services) 61 | { 62 | SceneInstance = sceneInstance, 63 | }; 64 | Services.AddService(sceneSystem); 65 | 66 | var physics = new PhysicsProcessor(); 67 | sceneInstance.Processors.Add(physics); 68 | 69 | var socket = new SimpleSocket(); 70 | socket.Connected += clientSocket => 71 | { 72 | Console.WriteLine("Client connected"); 73 | 74 | var reader = new BinarySerializationReader(clientSocket.ReadStream); 75 | while (true) 76 | { 77 | // Receive ray start/end 78 | var start = reader.Read(); 79 | var end = reader.Read(); 80 | // Raycast 81 | var result = physics.Simulation.Raycast(start, end); 82 | Console.WriteLine($"Performing raycast: {(result.Succeeded ? "hit" : "miss")}"); 83 | // Send result 84 | clientSocket.WriteStream.WriteByte((byte)(result.Succeeded ? 1 : 0)); 85 | clientSocket.WriteStream.Flush(); 86 | } 87 | }; 88 | await socket.StartServer(2655, false); 89 | Console.WriteLine("Server listening, press a key to exit"); 90 | Console.ReadKey(); 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample.Server/Xenko.ClientServerSample.Server.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Exe 5 | netcoreapp2.1 6 | win-x64 7 | ..\Bin\Server\$(Configuration)\ 8 | false 9 | 10 | 11 | true 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample.Server/Xenko.ClientServerSample.Server.xkpkg: -------------------------------------------------------------------------------- 1 | !Package 2 | SerializedVersion: {Assets: 3.1.0.0} 3 | Meta: 4 | Name: Xenko.ClientServerSample.Server 5 | Version: 1.0.0 6 | Authors: [] 7 | Owners: [] 8 | Dependencies: null 9 | AssetFolders: 10 | - Path: !dir Assets 11 | ResourceFolders: 12 | - !dir Resources 13 | OutputGroupDirectories: {} 14 | ExplicitFolders: [] 15 | Bundles: [] 16 | TemplateFolders: [] 17 | RootAssets: [] 18 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample.Windows/Resources/Icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xen2/Xenko.ClientServerSample/fb31e2de630c1e2c357e9e6c8a88bad0c370e50c/Xenko.ClientServerSample.Windows/Resources/Icon.ico -------------------------------------------------------------------------------- /Xenko.ClientServerSample.Windows/Xenko.ClientServerSample.Windows.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net461 5 | Resources\Icon.ico 6 | WinExe 7 | Xenko.ClientServerSample.Windows 8 | 9 | ..\Bin\Windows\$(Configuration)\ 10 | false 11 | 12 | 13 | true 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample.Windows/Xenko.ClientServerSample.Windows.xkpkg: -------------------------------------------------------------------------------- 1 | !Package 2 | SerializedVersion: {Assets: 3.1.0.0} 3 | Meta: 4 | Name: Xenko.ClientServerSample.Windows 5 | Version: 1.0.0 6 | Authors: [] 7 | Owners: [] 8 | Dependencies: null 9 | AssetFolders: 10 | - Path: !dir Assets 11 | ResourceFolders: 12 | - !dir Resources 13 | OutputGroupDirectories: {} 14 | ExplicitFolders: [] 15 | Bundles: [] 16 | TemplateFolders: [] 17 | RootAssets: [] 18 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample.Windows/Xenko_ClientServerSampleApp.cs: -------------------------------------------------------------------------------- 1 | using Xenko.Engine; 2 | 3 | namespace Xenko.ClientServerSample.Windows 4 | { 5 | class Xenko_ClientServerSampleApp 6 | { 7 | static void Main(string[] args) 8 | { 9 | using (var game = new Game()) 10 | { 11 | game.Run(); 12 | } 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.28307.168 5 | MinimumVisualStudioVersion = 14.0.23107.0 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xenko.ClientServerSample.Windows", "Xenko.ClientServerSample.Windows\Xenko.ClientServerSample.Windows.csproj", "{4212B7B9-65D7-4245-82A7-8BF1C3509D14}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xenko.ClientServerSample", "Xenko.ClientServerSample\Xenko.ClientServerSample.csproj", "{C38A8FBA-B7EF-4091-9EB8-474E908F3E9E}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xenko.ClientServerSample.Server", "Xenko.ClientServerSample.Server\Xenko.ClientServerSample.Server.csproj", "{6A22FF31-253D-48C9-9072-4DA76ECFC355}" 11 | EndProject 12 | Global 13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 14 | Debug|Any CPU = Debug|Any CPU 15 | Release|Any CPU = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {4212B7B9-65D7-4245-82A7-8BF1C3509D14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {4212B7B9-65D7-4245-82A7-8BF1C3509D14}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {4212B7B9-65D7-4245-82A7-8BF1C3509D14}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {4212B7B9-65D7-4245-82A7-8BF1C3509D14}.Release|Any CPU.Build.0 = Release|Any CPU 22 | {C38A8FBA-B7EF-4091-9EB8-474E908F3E9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 23 | {C38A8FBA-B7EF-4091-9EB8-474E908F3E9E}.Debug|Any CPU.Build.0 = Debug|Any CPU 24 | {C38A8FBA-B7EF-4091-9EB8-474E908F3E9E}.Release|Any CPU.ActiveCfg = Release|Any CPU 25 | {C38A8FBA-B7EF-4091-9EB8-474E908F3E9E}.Release|Any CPU.Build.0 = Release|Any CPU 26 | {6A22FF31-253D-48C9-9072-4DA76ECFC355}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 27 | {6A22FF31-253D-48C9-9072-4DA76ECFC355}.Debug|Any CPU.Build.0 = Debug|Any CPU 28 | {6A22FF31-253D-48C9-9072-4DA76ECFC355}.Release|Any CPU.ActiveCfg = Release|Any CPU 29 | {6A22FF31-253D-48C9-9072-4DA76ECFC355}.Release|Any CPU.Build.0 = Release|Any CPU 30 | EndGlobalSection 31 | GlobalSection(SolutionProperties) = preSolution 32 | HideSolutionNode = FALSE 33 | EndGlobalSection 34 | GlobalSection(ExtensibilityGlobals) = postSolution 35 | SolutionGuid = {37203760-FD9C-4C1D-9DDD-99CC5C288EBE} 36 | EndGlobalSection 37 | EndGlobal 38 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Assets/Crosshair256.xktex: -------------------------------------------------------------------------------- 1 | !Texture 2 | Id: b531eaf3-212c-4bfb-8793-ce0b8a93a505 3 | SerializedVersion: {Xenko: 2.0.0.0} 4 | Tags: [] 5 | Source: !file ../Resources/Crosshair256.png 6 | Type: !ColorTextureType 7 | ColorKeyColor: {R: 255, G: 0, B: 255, A: 255} 8 | IsStreamable: false 9 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Assets/GameSettings.xkgamesettings: -------------------------------------------------------------------------------- 1 | !GameSettingsAsset 2 | Id: 4e8cfd29-c437-4a0e-8eae-6d95384f5ebb 3 | SerializedVersion: {Xenko: 2.1.0.3} 4 | Tags: [] 5 | DefaultScene: 50be6bd0-3731-42cd-9cfe-ddc2aa5a0090:MainScene 6 | GraphicsCompositor: d929a46b-ada5-4f56-9498-acee739ab4f7:GraphicsCompositor 7 | Defaults: 8 | - !Xenko.Audio.AudioEngineSettings,Xenko.Audio 9 | HrtfSupport: false 10 | - !Xenko.Assets.EditorSettings,Xenko.Assets 11 | RenderingMode: HDR 12 | - !Xenko.Navigation.NavigationSettings,Xenko.Navigation 13 | EnableDynamicNavigationMesh: false 14 | IncludedCollisionGroups: AllFilter 15 | BuildSettings: 16 | CellHeight: 0.2 17 | CellSize: 0.3 18 | TileSize: 32 19 | MinRegionArea: 2 20 | RegionMergeArea: 20 21 | MaxEdgeLen: 12.0 22 | MaxEdgeError: 1.3 23 | DetailSamplingDistance: 6.0 24 | MaxDetailSamplingError: 1.0 25 | Groups: 26 | - Id: 64bf3a66-881e-438a-bed0-ed06c0361615 27 | Name: Group0 28 | AgentSettings: 29 | Height: 1.0 30 | MaxClimb: 0.25 31 | MaxSlope: {Radians: 0.7853982} 32 | Radius: 0.5 33 | - !Xenko.Physics.PhysicsSettings,Xenko.Physics 34 | Flags: None 35 | MaxSubSteps: 1 36 | FixedTimeStep: 0.0166666675 37 | - !Xenko.Graphics.RenderingSettings,Xenko.Graphics 38 | DefaultBackBufferWidth: 1280 39 | DefaultBackBufferHeight: 720 40 | AdaptBackBufferToScreen: false 41 | DefaultGraphicsProfile: Level_10_0 42 | ColorSpace: Linear 43 | DisplayOrientation: LandscapeRight 44 | - !Xenko.Streaming.StreamingSettings,Xenko.Engine 45 | ManagerUpdatesInterval: 0:00:00:00.0330000 46 | ResourceLiveTimeout: 0:00:00:08.0000000 47 | - !Xenko.Assets.Textures.TextureSettings,Xenko.Assets 48 | TextureQuality: Fast 49 | Overrides: [] 50 | PlatformFilters: 51 | - PowerVR SGX 54[0-9] 52 | - Adreno \(TM\) 2[0-9][0-9] 53 | - Adreno (TM) 320 54 | - Adreno (TM) 330 55 | - Adreno \(TM\) 4[0-9][0-9] 56 | - NVIDIA Tegra 57 | - Intel(R) HD Graphics 58 | - ^Mali\-4 59 | - ^Mali\-T6 60 | - ^Mali\-T7 61 | SplashScreenTexture: d26edb11-10bd-403c-b3c2-9c7fcccf25e5:XenkoDefaultSplashScreen 62 | SplashScreenColor: {R: 0, G: 0, B: 0, A: 255} 63 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Assets/GraphicsCompositor.xkgfxcomp: -------------------------------------------------------------------------------- 1 | !GraphicsCompositorAsset 2 | Id: d929a46b-ada5-4f56-9498-acee739ab4f7 3 | SerializedVersion: {Xenko: 2.1.0.2} 4 | Tags: [] 5 | Archetype: 823a81bf-bac0-4552-9267-aeed499c40df:DefaultGraphicsCompositorLevel10 6 | Cameras: 7 | de2e75c3b2b23e54162686363f3f138e: 8 | Id: be0ec0e3-f3a9-49e2-806c-0b48cbdaf73c 9 | Name: Main 10 | RenderStages: 11 | 47116750c1a5d449b4ad3625f71439b3: 12 | Id: 6fedebbd-2f24-4df4-af1d-ac43221ec612 13 | Name: Opaque 14 | EffectSlotName: Main 15 | SortMode: !SortModeStateChange {} 16 | 9105a30fee026d4893472b6aee83d035: 17 | Id: 701bdf1e-bf1f-4c35-b1b2-2654361fa475 18 | Name: Transparent 19 | EffectSlotName: Main 20 | SortMode: !BackToFrontSortMode {} 21 | 554e52c061404d4684dd7c4c70f70e0e: 22 | Id: fff2cbe1-e0d2-40d9-bcec-0f390369e073 23 | Name: ShadowMapCaster 24 | EffectSlotName: ShadowMapCaster 25 | SortMode: !FrontToBackSortMode {} 26 | 5a50638f5c514dc490c8c4f57cc88b57: 27 | Id: 4060e88c-3863-4894-a94b-270d688379a8 28 | Name: ShadowMapCasterParaboloid 29 | EffectSlotName: ShadowMapCasterParaboloid 30 | SortMode: !FrontToBackSortMode {} 31 | bc1a77d2ab254a6e920f86cff65cd75e: 32 | Id: 186ac318-7343-4225-be78-62660958a7fd 33 | Name: ShadowMapCasterCubeMap 34 | EffectSlotName: ShadowMapCasterCubeMap 35 | SortMode: !FrontToBackSortMode {} 36 | 33d9d311a1a65601da9ef56775477f95: 37 | Id: ef56e681-97d0-4d78-9088-2b20d3e77c7a 38 | Name: GBuffer 39 | EffectSlotName: GBuffer 40 | SortMode: !FrontToBackSortMode {} 41 | RenderFeatures: 42 | d8fb80b0e7995140a46bca8dc36ee8a2: !Xenko.Rendering.MeshRenderFeature,Xenko.Engine 43 | RenderStageSelectors: 44 | 44cf4a95ef82544e9ce3c6507d5569a9: !Xenko.Rendering.MeshTransparentRenderStageSelector,Xenko.Engine 45 | OpaqueRenderStage: ref!! 6fedebbd-2f24-4df4-af1d-ac43221ec612 46 | TransparentRenderStage: ref!! 701bdf1e-bf1f-4c35-b1b2-2654361fa475 47 | EffectName: XenkoForwardShadingEffect 48 | 6f7224048750e7260ea87c444f74b32c: !Xenko.Rendering.Shadows.ShadowMapRenderStageSelector,Xenko.Engine 49 | ShadowMapRenderStage: ref!! fff2cbe1-e0d2-40d9-bcec-0f390369e073 50 | EffectName: XenkoForwardShadingEffect.ShadowMapCaster 51 | b60663d7cb46417a94341a39c3bc1a12: !Xenko.Rendering.Shadows.ShadowMapRenderStageSelector,Xenko.Engine 52 | ShadowMapRenderStage: ref!! 4060e88c-3863-4894-a94b-270d688379a8 53 | EffectName: XenkoForwardShadingEffect.ShadowMapCasterParaboloid 54 | f5533b1249b942df8a8aba311cd79532: !Xenko.Rendering.Shadows.ShadowMapRenderStageSelector,Xenko.Engine 55 | ShadowMapRenderStage: ref!! 186ac318-7343-4225-be78-62660958a7fd 56 | EffectName: XenkoForwardShadingEffect.ShadowMapCasterCubeMap 57 | 106341b76db9fcda6a033dad16aa708b: !Xenko.Rendering.MeshTransparentRenderStageSelector,Xenko.Engine 58 | OpaqueRenderStage: ref!! ef56e681-97d0-4d78-9088-2b20d3e77c7a 59 | EffectName: XenkoForwardShadingEffect.ShadowMapCaster 60 | PipelineProcessors: 61 | d70f5aee0616e4ab25081ceaf643290c: !Xenko.Rendering.MeshPipelineProcessor,Xenko.Engine 62 | TransparentRenderStage: ref!! 701bdf1e-bf1f-4c35-b1b2-2654361fa475 63 | 26c899b17f88c21ab13bf60a7220ccd1: !Xenko.Rendering.ShadowMeshPipelineProcessor,Xenko.Engine 64 | ShadowMapRenderStage: ref!! fff2cbe1-e0d2-40d9-bcec-0f390369e073 65 | ff51170a7d1a4761b73ef6a5c9f0cba2: !Xenko.Rendering.ShadowMeshPipelineProcessor,Xenko.Engine 66 | ShadowMapRenderStage: ref!! 4060e88c-3863-4894-a94b-270d688379a8 67 | DepthClipping: true 68 | ae4336b0a9514e8488e8e0ccbcef25f4: !Xenko.Rendering.ShadowMeshPipelineProcessor,Xenko.Engine 69 | ShadowMapRenderStage: ref!! 186ac318-7343-4225-be78-62660958a7fd 70 | DepthClipping: true 71 | RenderFeatures: 72 | 86b959cbdf51a1438d4973177c77c627: !Xenko.Rendering.TransformRenderFeature,Xenko.Engine {} 73 | 8e0351fee9883922648a11016224b195: !Xenko.Rendering.SkinningRenderFeature,Xenko.Engine {} 74 | f5a2017030ba4b28784e804807ce7628: !Xenko.Rendering.Materials.MaterialRenderFeature,Xenko.Engine {} 75 | 83fea7526ebe4893a5bad953d0502bfd: !Xenko.Rendering.Shadows.ShadowCasterRenderFeature,Xenko.Engine {} 76 | 65743b4380f4cc43b2b4bdc23cd0c07c: !Xenko.Rendering.Lights.ForwardLightingRenderFeature,Xenko.Engine 77 | LightRenderers: 78 | 7ac2775468f53c4399b2f3f6357c85c9: !Xenko.Rendering.Lights.LightAmbientRenderer,Xenko.Engine {} 79 | 7b68f9cd17404a4ba9e5f7df72e3b48d: !Xenko.Rendering.Lights.LightDirectionalGroupRenderer,Xenko.Engine {} 80 | 411fdcfb9fc388449a0443173dfa3f27: !Xenko.Rendering.Lights.LightSkyboxRenderer,Xenko.Engine {} 81 | facdcd5b543cf1c6bdf2138aab6cc473: !Xenko.Rendering.Lights.LightClusteredPointSpotGroupRenderer,Xenko.Engine {} 82 | 79582329a9cf466e960f8920f579de9b: !Xenko.Rendering.Lights.LightPointGroupRenderer,Xenko.Engine {} 83 | cf0c6bd4198b4cc4aaaab5b54870bdfd: !Xenko.Rendering.Lights.LightSpotGroupRenderer,Xenko.Engine {} 84 | 451af18f3f5c4187cf3fe5f33feb46b1: !Xenko.Rendering.LightProbes.LightProbeRenderer,Xenko.Engine {} 85 | ShadowMapRenderer: !Xenko.Rendering.Shadows.ShadowMapRenderer,Xenko.Engine 86 | Renderers: 87 | 7c3d3d4c86834c3551bacde2527b3836: !Xenko.Rendering.Shadows.LightDirectionalShadowMapRenderer,Xenko.Engine 88 | ShadowCasterRenderStage: ref!! fff2cbe1-e0d2-40d9-bcec-0f390369e073 89 | 1c204b09435636256a3fcfd6f9ddb347: !Xenko.Rendering.Shadows.LightSpotShadowMapRenderer,Xenko.Engine 90 | ShadowCasterRenderStage: ref!! fff2cbe1-e0d2-40d9-bcec-0f390369e073 91 | 7c8c69ce27034b4c8bbcab0bcdfe954b: !Xenko.Rendering.Shadows.LightPointShadowMapRendererParaboloid,Xenko.Engine 92 | ShadowCasterRenderStage: ref!! 4060e88c-3863-4894-a94b-270d688379a8 93 | d59ef45dd99e49d3af3887763d153aa7: !Xenko.Rendering.Shadows.LightPointShadowMapRendererCubeMap,Xenko.Engine 94 | ShadowCasterRenderStage: ref!! 186ac318-7343-4225-be78-62660958a7fd 95 | 28e9bf54a5adbe063f59fb17acb2723e: !Xenko.Rendering.Sprites.SpriteRenderFeature,Xenko.Engine 96 | RenderStageSelectors: 97 | d74665cff080638a2439c4422e542d85: !Xenko.Rendering.Sprites.SpriteTransparentRenderStageSelector,Xenko.Engine 98 | OpaqueRenderStage: ref!! 6fedebbd-2f24-4df4-af1d-ac43221ec612 99 | TransparentRenderStage: ref!! 701bdf1e-bf1f-4c35-b1b2-2654361fa475 100 | EffectName: Test 101 | 60780391e205770513fdd53e07279a01: !Xenko.Rendering.Background.BackgroundRenderFeature,Xenko.Engine 102 | RenderStageSelectors: 103 | 11c8b8ccb522e3cd1dd6688016062a6d: !Xenko.Rendering.SimpleGroupToRenderStageSelector,Xenko.Engine 104 | RenderStage: ref!! 6fedebbd-2f24-4df4-af1d-ac43221ec612 105 | EffectName: Test 106 | 93933ad00d0c357d4915ad462cbfd04c: !Xenko.Rendering.UI.UIRenderFeature,Xenko.UI 107 | RenderStageSelectors: 108 | 14a071694411235038a102ac3794bb4d: !Xenko.Rendering.SimpleGroupToRenderStageSelector,Xenko.Engine 109 | RenderStage: ref!! 701bdf1e-bf1f-4c35-b1b2-2654361fa475 110 | EffectName: Test 111 | 9013eab3ea0ef6c98bf133b86c173d45: !Xenko.Particles.Rendering.ParticleEmitterRenderFeature,Xenko.Particles 112 | RenderStageSelectors: 113 | af1bd241305893ef8ff7952184e1cb0b: !Xenko.Particles.Rendering.ParticleEmitterTransparentRenderStageSelector,Xenko.Particles 114 | OpaqueRenderStage: ref!! 6fedebbd-2f24-4df4-af1d-ac43221ec612 115 | TransparentRenderStage: ref!! 701bdf1e-bf1f-4c35-b1b2-2654361fa475 116 | EffectName: null 117 | PipelineProcessors: {} 118 | SharedRenderers: 119 | 60459475d3a3adaf2d1ba5d99913ca75: !Xenko.Rendering.Compositing.ForwardRenderer,Xenko.Engine 120 | Id: c6087b4f-bb5d-4005-81c7-3464698119ca 121 | Clear: 122 | Id: 4bc4b2ca-027e-4e4a-94cb-2912709bef5f 123 | Color: {R: 0.40491876, G: 0.411895424, B: 0.43775, A: 1.0} 124 | LightProbes: true 125 | OpaqueRenderStage: ref!! 6fedebbd-2f24-4df4-af1d-ac43221ec612 126 | TransparentRenderStage: ref!! 701bdf1e-bf1f-4c35-b1b2-2654361fa475 127 | ShadowMapRenderStages: 128 | fc4d1e0de5c2b0bbc27bcf96e9a848fd: ref!! fff2cbe1-e0d2-40d9-bcec-0f390369e073 129 | GBufferRenderStage: ref!! ef56e681-97d0-4d78-9088-2b20d3e77c7a 130 | PostEffects: !PostProcessingEffects ref!! 12ea1063-9851-498a-b572-2a8a255adf08 131 | LightShafts: null 132 | VRSettings: 133 | Enabled: false 134 | RequiredApis: {} 135 | Overlays: {} 136 | SubsurfaceScatteringBlurEffect: null 137 | MSAALevel: None 138 | MSAAResolver: {} 139 | d5b2e71c088247e21556decdce138d96: !Xenko.Rendering.Compositing.ForwardRenderer,Xenko.Engine 140 | Id: 077f01fd-528b-4d6b-a4cf-08fa68ff3542 141 | Clear: 142 | Id: 66a42307-1985-4316-871a-768449238c11 143 | Color: {R: 0.40491876, G: 0.411895424, B: 0.43775, A: 1.0} 144 | LightProbes: true 145 | OpaqueRenderStage: ref!! 6fedebbd-2f24-4df4-af1d-ac43221ec612 146 | TransparentRenderStage: ref!! 701bdf1e-bf1f-4c35-b1b2-2654361fa475 147 | ShadowMapRenderStages: 148 | 2323a99a8a983e182f318e55604659b0: ref!! fff2cbe1-e0d2-40d9-bcec-0f390369e073 149 | GBufferRenderStage: ref!! ef56e681-97d0-4d78-9088-2b20d3e77c7a 150 | PostEffects: null 151 | LightShafts: null 152 | VRSettings: 153 | Enabled: false 154 | RequiredApis: {} 155 | Overlays: {} 156 | SubsurfaceScatteringBlurEffect: null 157 | MSAALevel: None 158 | MSAAResolver: {} 159 | 34ecb9b2633eacfc439ba8744fe05102: !PostProcessingEffects 160 | Id: 12ea1063-9851-498a-b572-2a8a255adf08 161 | AmbientOcclusion: 162 | Enabled: false 163 | LocalReflections: 164 | Enabled: false 165 | ResolvePassResolution: Full 166 | DepthResolution: Half 167 | DepthOfField: 168 | Enabled: false 169 | DOFAreas: {X: 0.5, Y: 6.0, Z: 50.0, W: 200.0} 170 | BrightFilter: 171 | Color: {R: 1.0, G: 1.0, B: 1.0} 172 | Bloom: 173 | Distortion: {X: 1.0, Y: 1.0} 174 | Afterimage: 175 | Enabled: false 176 | LightStreak: 177 | Attenuation: 0.7 178 | LensFlare: {} 179 | ColorTransforms: 180 | Transforms: 181 | 1e06f805f8b2e949a06c30d45fe413ef: !ToneMap 182 | Operator: !ToneMapHejl2Operator {} 183 | c57351444609d14ea258b3f511ec8a74: !FilmGrain 184 | Enabled: false 185 | e86e22e9a5d65545b8b55fca26e0afee: !Vignetting 186 | Enabled: false 187 | Color: {R: 0.0, G: 0.0, B: 0.0} 188 | Antialiasing: !FXAAEffect {} 189 | ee80a20a9bd99f2d70711114e15fe7ca: !Xenko.Rendering.Compositing.DebugRenderer,Xenko.Engine 190 | Id: 57b39075-2482-494e-93f4-04263a850f23 191 | DebugRenderStages: {} 192 | Game: !Xenko.Rendering.Compositing.SceneCameraRenderer,Xenko.Engine 193 | Id: 76fe87cf-f574-4ad6-85b8-e9a9586be0e2 194 | Camera: ref!! be0ec0e3-f3a9-49e2-806c-0b48cbdaf73c 195 | Child: !Xenko.Rendering.Compositing.SceneRendererCollection,Xenko.Engine 196 | Id: 82568e46-92e7-421a-8dca-114a74e0cd69 197 | Children: 198 | d39c5ddbf8b7d5ca02bafb6496b1cc3c: !Xenko.Rendering.Compositing.ForwardRenderer,Xenko.Engine ref!! c6087b4f-bb5d-4005-81c7-3464698119ca 199 | 01d338078e9b21121ead0868932613dd: !Xenko.Rendering.Compositing.DebugRenderer,Xenko.Engine ref!! 57b39075-2482-494e-93f4-04263a850f23 200 | RenderMask: All 201 | SingleView: !Xenko.Rendering.Compositing.ForwardRenderer,Xenko.Engine ref!! 077f01fd-528b-4d6b-a4cf-08fa68ff3542 202 | Editor: !Xenko.Rendering.Compositing.ForwardRenderer,Xenko.Engine ref!! c6087b4f-bb5d-4005-81c7-3464698119ca 203 | BlockPositions: {} 204 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Assets/Ground Material.xkmat: -------------------------------------------------------------------------------- 1 | !MaterialAsset 2 | Id: d4d7f8f4-004e-43f9-a5bc-e1cf1c05d098 3 | SerializedVersion: {Xenko: 2.0.0.0} 4 | Tags: [] 5 | Attributes: 6 | MicroSurface: !MaterialGlossinessMapFeature 7 | GlossinessMap: !ComputeFloat 8 | Value: 0.1 9 | Diffuse: !MaterialDiffuseMapFeature 10 | DiffuseMap: !ComputeColor 11 | Value: {R: 0.141176477, G: 0.141176477, B: 0.141176477, A: 1.0} 12 | DiffuseModel: !MaterialDiffuseLambertModelFeature {} 13 | Specular: !MaterialMetalnessMapFeature 14 | MetalnessMap: !ComputeFloat 15 | Value: 0.0 16 | SpecularModel: !MaterialSpecularMicrofacetModelFeature 17 | Fresnel: !MaterialSpecularMicrofacetFresnelSchlick {} 18 | Visibility: !MaterialSpecularMicrofacetVisibilitySmithSchlickGGX {} 19 | NormalDistribution: !MaterialSpecularMicrofacetNormalDistributionGGX {} 20 | Environment: !MaterialSpecularMicrofacetEnvironmentGGXLUT {} 21 | Overrides: 22 | UVScale: {X: 1.0, Y: 1.0} 23 | Layers: {} 24 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Assets/Ground.xkpromodel: -------------------------------------------------------------------------------- 1 | !ProceduralModelAsset 2 | Id: 9ad38b10-73da-435b-afd5-c5f9a59ee487 3 | SerializedVersion: {Xenko: 2.0.0.0} 4 | Tags: [] 5 | Type: !PlaneProceduralModel 6 | Size: {X: 10.0, Y: 10.0} 7 | Tessellation: {X: 1, Y: 1} 8 | Scale: {X: 1.0, Y: 1.0, Z: 1.0} 9 | UvScale: {X: 1.0, Y: 1.0} 10 | LocalOffset: {X: 0.0, Y: 0.0, Z: 0.0} 11 | MaterialInstance: 12 | Material: d4d7f8f4-004e-43f9-a5bc-e1cf1c05d098:Ground Material 13 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Assets/MainScene.xkscene: -------------------------------------------------------------------------------- 1 | !SceneAsset 2 | Id: 50be6bd0-3731-42cd-9cfe-ddc2aa5a0090 3 | SerializedVersion: {Xenko: 3.1.0.1} 4 | Tags: [] 5 | ChildrenIds: [] 6 | Offset: {X: 0.0, Y: 0.0, Z: 0.0} 7 | Hierarchy: 8 | RootParts: 9 | - ref!! 37f679d3-6799-4cd4-b0fa-508cb0e506e8 10 | - ref!! 8c1cad0d-865b-447e-830c-727af2d37bcf 11 | - ref!! 5f82f5c5-f4bc-48de-a1a6-8ded24053e13 12 | - ref!! a3ccd981-fad7-4e6a-a487-ba4ae4cf1f8b 13 | - ref!! ffc1b51b-53f5-44e2-8d46-9ad4120e5600 14 | - ref!! ed3d7b00-6e93-4b5c-98a4-c7f47b83cc92 15 | Parts: 16 | - Entity: 17 | Id: 0cc02474-6a47-486e-9819-bce73abacfc1 18 | Name: Crosshair256 19 | Components: 20 | 363dfd50bc1faf4cb198d55bc4959a6c: !TransformComponent 21 | Id: dcae95b1-1eb5-46cb-8ffe-0b970ce33b2f 22 | Position: {X: 0.0, Y: 0.0, Z: -3.04115772} 23 | Rotation: {X: 0.0, Y: 0.0, Z: 0.0, W: 1.0} 24 | Scale: {X: 0.1, Y: 0.1, Z: 0.1} 25 | Children: {} 26 | 3db80bf6f7a64d469c3a78e1338ba404: !SpriteComponent 27 | Id: 3ad23aa5-5452-4cfb-a418-11359c72de96 28 | SpriteProvider: !SpriteFromTexture 29 | Texture: b531eaf3-212c-4bfb-8793-ce0b8a93a505:Crosshair256 30 | Center: {X: 0.0, Y: 0.0} 31 | Color: {R: 1.0, G: 1.0, B: 1.0, A: 1.0} 32 | PremultipliedAlpha: false 33 | IgnoreDepth: true 34 | - Entity: 35 | Id: 37f679d3-6799-4cd4-b0fa-508cb0e506e8 36 | Name: Camera 37 | Components: 38 | 5cc49d193b6c68fa5be5bf2f81d499f5: !TransformComponent 39 | Id: 69c6c29e-d839-4b9f-92fa-09c6eb4d6736 40 | Position: {X: 2.6, Y: 0.6, Z: -1.0} 41 | Rotation: {X: 0.0, Y: 0.829037547, Z: 0.0, W: 0.5591929} 42 | Scale: {X: 1.0, Y: 1.0, Z: 1.0} 43 | Children: 44 | 81adba5e12f56f8ee9420873c69e09ec: ref!! dcae95b1-1eb5-46cb-8ffe-0b970ce33b2f 45 | 0c17432c729bb6a2a5f95893fa0f1b62: !CameraComponent 46 | Id: 78d58745-62fa-4b32-880b-076932023572 47 | Name: null 48 | Projection: Perspective 49 | Slot: be0ec0e3-f3a9-49e2-806c-0b48cbdaf73c 50 | 9100393ae6307583fccaa59fd3dfe1e9: !Xenko.ClientServerSample.BasicCameraController,Xenko.ClientServerSample 51 | Id: 013bc941-227e-402c-8a0c-0888582addb9 52 | KeyboardMovementSpeed: {X: 5.0, Y: 5.0, Z: 5.0} 53 | TouchMovementSpeed: {X: 40.0, Y: 40.0, Z: 20.0} 54 | SpeedFactor: 5.0 55 | KeyboardRotationSpeed: {X: 3.0, Y: 3.0} 56 | MouseRotationSpeed: {X: 90.0, Y: 60.0} 57 | TouchRotationSpeed: {X: 60.0, Y: 40.0} 58 | ffc363f2ec7c2a31d153d26559b3c6f0: !Xenko.ClientServerSample.NetworkClient,Xenko.ClientServerSample 59 | Id: e834730c-a58c-4b0c-a258-91077a641e08 60 | - Entity: 61 | Id: 5f82f5c5-f4bc-48de-a1a6-8ded24053e13 62 | Name: Skybox 63 | Components: 64 | fa16125012f8b4d6bb9da7f2a3e67e8b: !TransformComponent 65 | Id: 4a2afe40-123b-4f20-b0ad-9c1af3346ef5 66 | Position: {X: 0.0, Y: 2.0, Z: -2.0} 67 | Rotation: {X: 0.0, Y: 0.0, Z: 0.0, W: 1.0} 68 | Scale: {X: 1.0, Y: 1.0, Z: 1.0} 69 | Children: {} 70 | 712da608d562e517be3ed33dd32f619b: !BackgroundComponent 71 | Id: 03996709-8da5-4960-906a-00239e65ebef 72 | Texture: f124e4d6-9581-425a-9d90-7015764674da:Skybox texture 73 | 9c0661cafd79088a70ba11a330a35f9a: !LightComponent 74 | Id: 5a3b0e28-89f5-4501-b2eb-9612ccd3b44e 75 | Type: !LightSkybox 76 | Skybox: df711eb6-ed7f-4da1-8f55-5412a6382dd4:Skybox 77 | - Entity: 78 | Id: 8c1cad0d-865b-447e-830c-727af2d37bcf 79 | Name: Directional light 80 | Components: 81 | afab81a9d01d1ca7b0d77573f9f71379: !TransformComponent 82 | Id: 20b556bb-e87d-40e6-8bf1-c8f4df604ef2 83 | Position: {X: 0.0, Y: 2.0, Z: 0.0} 84 | Rotation: {X: 1.131334E-08, Y: -0.9659258, Z: -0.258819044, W: -4.222196E-08} 85 | Scale: {X: 1.0, Y: 1.0, Z: 1.0} 86 | Children: {} 87 | a9db986fbf5b69b0a06890a7266bd492: !LightComponent 88 | Id: fcf7a754-7f42-4aa8-bd36-0064e672d189 89 | Type: !LightDirectional 90 | Color: !ColorRgbProvider 91 | Value: {R: 1.0, G: 1.0, B: 1.0} 92 | Shadow: 93 | Enabled: true 94 | Filter: !LightShadowMapFilterTypePcf 95 | FilterSize: Filter5x5 96 | Size: Large 97 | DepthRange: {} 98 | PartitionMode: !LightDirectionalShadowMap.PartitionLogarithmic {} 99 | BiasParameters: {} 100 | ComputeTransmittance: false 101 | Intensity: 20.0 102 | - Entity: 103 | Id: a3ccd981-fad7-4e6a-a487-ba4ae4cf1f8b 104 | Name: Ground 105 | Components: 106 | da887f68543cdb674515158788e74313: !TransformComponent 107 | Id: b26f20a5-682f-4967-9a97-73e7daa5f0af 108 | Position: {X: 0.0, Y: 0.0, Z: 0.0} 109 | Rotation: {X: 0.0, Y: 0.0, Z: 0.0, W: 1.0} 110 | Scale: {X: 1.0, Y: 1.0, Z: 1.0} 111 | Children: {} 112 | 472a82a4b20aaa01dc538d0b8a04e01b: !ModelComponent 113 | Id: 718e2483-ef76-43b1-9f43-dbb41b224e59 114 | Model: 9ad38b10-73da-435b-afd5-c5f9a59ee487:Ground 115 | Materials: {} 116 | 702ffd1e333346d8b250194c20f7ee1e: !StaticColliderComponent 117 | Id: 3a242fa8-e94e-491d-a112-48713f0e6f4f 118 | CanSleep: false 119 | Restitution: 0.0 120 | Friction: 0.5 121 | RollingFriction: 0.0 122 | CcdMotionThreshold: 0.0 123 | CcdSweptSphereRadius: 0.0 124 | IsTrigger: false 125 | ColliderShapes: {} 126 | - Entity: 127 | Id: ed3d7b00-6e93-4b5c-98a4-c7f47b83cc92 128 | Name: Navigation bounding box 129 | Components: 130 | 37c1541aa6884eef96f68b7d1153cbaf: !TransformComponent 131 | Id: eb3f04a6-7500-471c-8689-667c1563d2fa 132 | Position: {X: 0.0, Y: 0.0, Z: 0.0} 133 | Rotation: {X: 0.0, Y: 0.0, Z: 0.0, W: 0.0} 134 | Scale: {X: 1.0, Y: 1.0, Z: 1.0} 135 | Children: {} 136 | 2efac89a247a4430959bf2a450fec2a2: !Xenko.Navigation.NavigationBoundingBoxComponent,Xenko.Navigation 137 | Id: 5f614701-5b34-4052-88a3-333a6be53994 138 | Size: {X: 25.0, Y: 20.0, Z: 25.0} 139 | - Entity: 140 | Id: ffc1b51b-53f5-44e2-8d46-9ad4120e5600 141 | Name: Sphere 142 | Components: 143 | 78357e21882ac6ce81169c5b405775e7: !TransformComponent 144 | Id: b2cf37f3-5a6a-49b2-bf9e-d8b26ec319f8 145 | Position: {X: 0.0, Y: 0.5, Z: 0.0} 146 | Rotation: {X: 0.0, Y: 0.0, Z: 0.0, W: 1.0} 147 | Scale: {X: 1.0, Y: 1.0, Z: 1.0} 148 | Children: {} 149 | f2c8525335732030ff59594ab4a46340: !ModelComponent 150 | Id: b0ff0d72-b70e-497e-b3ae-312f7f7ea999 151 | Model: 524ab6f8-058b-4139-a7fc-21f81d3e8c39:Sphere 152 | Materials: {} 153 | 7918f774e3f8842246a11aa8634e5f4f: !StaticColliderComponent 154 | Id: fa00ed2b-d46c-4f15-a737-6c6b396ff5bb 155 | CanSleep: false 156 | Restitution: 0.0 157 | Friction: 0.5 158 | RollingFriction: 0.0 159 | CcdMotionThreshold: 0.0 160 | CcdSweptSphereRadius: 0.0 161 | IsTrigger: false 162 | ColliderShapes: 163 | 8444226d17deb10eb37280a4aa44af5f: !SphereColliderShapeDesc 164 | Is2D: false 165 | LocalOffset: {X: 0.0, Y: 0.0, Z: 0.0} 166 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Assets/Skybox texture.xktex: -------------------------------------------------------------------------------- 1 | !Texture 2 | Id: f124e4d6-9581-425a-9d90-7015764674da 3 | SerializedVersion: {Xenko: 2.0.0.0} 4 | Tags: [] 5 | Source: !file ../Resources/skybox_texture_hdr.dds 6 | Type: !ColorTextureType 7 | UseSRgbSampling: false 8 | ColorKeyColor: {R: 255, G: 0, B: 255, A: 255} 9 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Assets/Skybox.xksky: -------------------------------------------------------------------------------- 1 | !SkyboxAsset 2 | Id: df711eb6-ed7f-4da1-8f55-5412a6382dd4 3 | SerializedVersion: {Xenko: 2.0.0.0} 4 | Tags: [] 5 | CubeMap: f124e4d6-9581-425a-9d90-7015764674da:Skybox texture 6 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Assets/Sphere Material.xkmat: -------------------------------------------------------------------------------- 1 | !MaterialAsset 2 | Id: 80218beb-0be0-475a-a01b-4da81b10f7d9 3 | SerializedVersion: {Xenko: 2.0.0.0} 4 | Tags: [] 5 | Attributes: 6 | MicroSurface: !MaterialGlossinessMapFeature 7 | GlossinessMap: !ComputeFloat 8 | Value: 0.65 9 | Diffuse: !MaterialDiffuseMapFeature 10 | DiffuseMap: !ComputeColor 11 | Value: {R: 0.549019635, G: 0.549019635, B: 0.549019635, A: 1.0} 12 | DiffuseModel: !MaterialDiffuseLambertModelFeature {} 13 | Specular: !MaterialMetalnessMapFeature 14 | MetalnessMap: !ComputeFloat 15 | Value: 1.0 16 | SpecularModel: !MaterialSpecularMicrofacetModelFeature 17 | Fresnel: !MaterialSpecularMicrofacetFresnelSchlick {} 18 | Visibility: !MaterialSpecularMicrofacetVisibilitySmithSchlickGGX {} 19 | NormalDistribution: !MaterialSpecularMicrofacetNormalDistributionGGX {} 20 | Environment: !MaterialSpecularMicrofacetEnvironmentGGXLUT {} 21 | Overrides: 22 | UVScale: {X: 1.0, Y: 1.0} 23 | Layers: {} 24 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Assets/Sphere.xkpromodel: -------------------------------------------------------------------------------- 1 | !ProceduralModelAsset 2 | Id: 524ab6f8-058b-4139-a7fc-21f81d3e8c39 3 | SerializedVersion: {Xenko: 2.0.0.0} 4 | Tags: [] 5 | Type: !SphereProceduralModel 6 | Tessellation: 30 7 | Scale: {X: 1.0, Y: 1.0, Z: 1.0} 8 | UvScale: {X: 1.0, Y: 1.0} 9 | LocalOffset: {X: 0.0, Y: 0.0, Z: 0.0} 10 | MaterialInstance: 11 | Material: 80218beb-0be0-475a-a01b-4da81b10f7d9:Sphere Material 12 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/BasicCameraController.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Xenko contributors (https://xenko.com) 2 | // Distributed under the MIT license. See the LICENSE.md file in the project root for more information. 3 | using System; 4 | using Xenko.Core; 5 | using Xenko.Core.Mathematics; 6 | using Xenko.Engine; 7 | using Xenko.Input; 8 | 9 | namespace Xenko.ClientServerSample 10 | { 11 | /// 12 | /// A script that allows to move and rotate an entity through keyboard, mouse and touch input to provide basic camera navigation. 13 | /// 14 | /// 15 | /// The entity can be moved using W, A, S, D, Q and E, arrow keys or dragging/scaling using multi-touch. 16 | /// Rotation is achieved using the Numpad, the mouse while holding the right mouse button, or dragging using single-touch. 17 | /// 18 | public class BasicCameraController : SyncScript 19 | { 20 | private const float MaximumPitch = MathUtil.PiOverTwo * 0.99f; 21 | 22 | private Vector3 upVector; 23 | private Vector3 translation; 24 | private float yaw; 25 | private float pitch; 26 | 27 | public Vector3 KeyboardMovementSpeed { get; set; } = new Vector3(5.0f); 28 | 29 | public Vector3 TouchMovementSpeed { get; set; } = new Vector3(40, 40, 20); 30 | 31 | public float SpeedFactor { get; set; } = 5.0f; 32 | 33 | public Vector2 KeyboardRotationSpeed { get; set; } = new Vector2(3.0f); 34 | 35 | public Vector2 MouseRotationSpeed { get; set; } = new Vector2(90.0f, 60.0f); 36 | 37 | public Vector2 TouchRotationSpeed { get; set; } = new Vector2(60.0f, 40.0f); 38 | 39 | public override void Start() 40 | { 41 | base.Start(); 42 | 43 | // Default up-direction 44 | upVector = Vector3.UnitY; 45 | 46 | // Configure touch input 47 | if (!Platform.IsWindowsDesktop) 48 | { 49 | Input.Gestures.Add(new GestureConfigDrag()); 50 | Input.Gestures.Add(new GestureConfigComposite()); 51 | } 52 | } 53 | 54 | public override void Update() 55 | { 56 | ProcessInput(); 57 | UpdateTransform(); 58 | } 59 | 60 | private void ProcessInput() 61 | { 62 | translation = Vector3.Zero; 63 | yaw = 0; 64 | pitch = 0; 65 | 66 | // Move with keyboard 67 | if (Input.IsKeyDown(Keys.W) || Input.IsKeyDown(Keys.Up)) 68 | { 69 | translation.Z = -KeyboardMovementSpeed.Z; 70 | } 71 | else if (Input.IsKeyDown(Keys.S) || Input.IsKeyDown(Keys.Down)) 72 | { 73 | translation.Z = KeyboardMovementSpeed.Z; 74 | } 75 | 76 | if (Input.IsKeyDown(Keys.A) || Input.IsKeyDown(Keys.Left)) 77 | { 78 | translation.X = -KeyboardMovementSpeed.X; 79 | } 80 | else if (Input.IsKeyDown(Keys.D) || Input.IsKeyDown(Keys.Right)) 81 | { 82 | translation.X = KeyboardMovementSpeed.X; 83 | } 84 | 85 | if (Input.IsKeyDown(Keys.Q)) 86 | { 87 | translation.Y = -KeyboardMovementSpeed.Y; 88 | } 89 | else if (Input.IsKeyDown(Keys.E)) 90 | { 91 | translation.Y = KeyboardMovementSpeed.Y; 92 | } 93 | 94 | // Alternative translation speed 95 | if (Input.IsKeyDown(Keys.LeftShift) || Input.IsKeyDown(Keys.RightShift)) 96 | { 97 | translation *= SpeedFactor; 98 | } 99 | 100 | // Rotate with keyboard 101 | if (Input.IsKeyDown(Keys.NumPad2)) 102 | { 103 | pitch = KeyboardRotationSpeed.X; 104 | } 105 | else if (Input.IsKeyDown(Keys.NumPad8)) 106 | { 107 | pitch = -KeyboardRotationSpeed.X; 108 | } 109 | 110 | if (Input.IsKeyDown(Keys.NumPad4)) 111 | { 112 | yaw = KeyboardRotationSpeed.Y; 113 | } 114 | else if (Input.IsKeyDown(Keys.NumPad6)) 115 | { 116 | yaw = -KeyboardRotationSpeed.Y; 117 | } 118 | 119 | // Rotate with mouse 120 | if (Input.IsMouseButtonDown(MouseButton.Right)) 121 | { 122 | Input.LockMousePosition(); 123 | Game.IsMouseVisible = false; 124 | 125 | yaw = -Input.MouseDelta.X * MouseRotationSpeed.X; 126 | pitch = -Input.MouseDelta.Y * MouseRotationSpeed.Y; 127 | } 128 | else 129 | { 130 | Input.UnlockMousePosition(); 131 | Game.IsMouseVisible = true; 132 | } 133 | 134 | // Handle gestures 135 | foreach (var gestureEvent in Input.GestureEvents) 136 | { 137 | switch (gestureEvent.Type) 138 | { 139 | // Rotate by dragging 140 | case GestureType.Drag: 141 | var drag = (GestureEventDrag)gestureEvent; 142 | var dragDistance = drag.DeltaTranslation; 143 | yaw = -dragDistance.X * TouchRotationSpeed.X; 144 | pitch = -dragDistance.Y * TouchRotationSpeed.Y; 145 | break; 146 | 147 | // Move along z-axis by scaling and in xy-plane by multi-touch dragging 148 | case GestureType.Composite: 149 | var composite = (GestureEventComposite)gestureEvent; 150 | translation.X = -composite.DeltaTranslation.X * TouchMovementSpeed.X; 151 | translation.Y = -composite.DeltaTranslation.Y * TouchMovementSpeed.Y; 152 | translation.Z = -(float)Math.Log(composite.DeltaScale + 1) * TouchMovementSpeed.Z; 153 | break; 154 | } 155 | } 156 | } 157 | 158 | private void UpdateTransform() 159 | { 160 | var elapsedTime = (float)Game.UpdateTime.Elapsed.TotalSeconds; 161 | 162 | translation *= elapsedTime; 163 | yaw *= elapsedTime; 164 | pitch *= elapsedTime; 165 | 166 | // Get the local coordinate system 167 | var rotation = Matrix.RotationQuaternion(Entity.Transform.Rotation); 168 | 169 | // Enforce the global up-vector by adjusting the local x-axis 170 | var right = Vector3.Cross(rotation.Forward, upVector); 171 | var up = Vector3.Cross(right, rotation.Forward); 172 | 173 | // Stabilize 174 | right.Normalize(); 175 | up.Normalize(); 176 | 177 | // Adjust pitch. Prevent it from exceeding up and down facing. Stabilize edge cases. 178 | var currentPitch = MathUtil.PiOverTwo - (float)Math.Acos(Vector3.Dot(rotation.Forward, upVector)); 179 | pitch = MathUtil.Clamp(currentPitch + pitch, -MaximumPitch, MaximumPitch) - currentPitch; 180 | 181 | // Move in local coordinates 182 | Entity.Transform.Position += Vector3.TransformCoordinate(translation, rotation); 183 | 184 | // Yaw around global up-vector, pitch and roll in local space 185 | Entity.Transform.Rotation *= Quaternion.RotationAxis(right, pitch) * Quaternion.RotationAxis(upVector, yaw); 186 | } 187 | } 188 | } 189 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/NetworkClient.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Xenko contributors (https://xenko.com) 2 | // Distributed under the MIT license. See the LICENSE.md file in the project root for more information. 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Threading.Tasks; 8 | using Xenko.Core.Mathematics; 9 | using Xenko.Input; 10 | using Xenko.Engine; 11 | using Xenko.Engine.Network; 12 | using Xenko.Core.Serialization; 13 | 14 | namespace Xenko.ClientServerSample 15 | { 16 | public class NetworkClient : AsyncScript 17 | { 18 | private bool? lastResult; 19 | private TimeSpan lastResultTime; 20 | 21 | public override async Task Execute() 22 | { 23 | var socket = new SimpleSocket(); 24 | await socket.StartClient("localhost", 2655, true); 25 | var writer = new BinarySerializationWriter(socket.WriteStream); 26 | 27 | while (Game.IsRunning) 28 | { 29 | // Do stuff every new frame 30 | await Script.NextFrame(); 31 | 32 | if (Input.IsMouseButtonPressed(MouseButton.Left) || Input.IsKeyPressed(Keys.Space)) 33 | { 34 | var rotation = Matrix.RotationQuaternion(Entity.Transform.Rotation); 35 | 36 | // Ask server 37 | lastResult = await Task.Run(() => 38 | { 39 | writer.Write(Entity.Transform.Position); 40 | writer.Write(Entity.Transform.Position + rotation.Forward * 1000.0f); 41 | writer.Flush(); 42 | 43 | // Get result 44 | return socket.ReadStream.ReadByte() == 1; 45 | }); 46 | lastResultTime = Game.UpdateTime.Total; 47 | } 48 | 49 | // Display last result (max 2 seconds) 50 | if (lastResult.HasValue) 51 | { 52 | DebugText.Print(lastResult.Value ? "Hit!" : "Miss...", new Int2(GraphicsDevice.Presenter.BackBuffer.Width / 2, (int)(GraphicsDevice.Presenter.BackBuffer.Height * 0.6f))); 53 | if ((Game.UpdateTime.Total - lastResultTime) > TimeSpan.FromSeconds(2.0f)) 54 | lastResult = null; 55 | } 56 | } 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Resources/Crosshair256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xen2/Xenko.ClientServerSample/fb31e2de630c1e2c357e9e6c8a88bad0c370e50c/Xenko.ClientServerSample/Resources/Crosshair256.png -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Resources/skybox_texture_hdr.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xen2/Xenko.ClientServerSample/fb31e2de630c1e2c357e9e6c8a88bad0c370e50c/Xenko.ClientServerSample/Resources/skybox_texture_hdr.dds -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Xenko.ClientServerSample.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | netstandard2.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Xenko.ClientServerSample/Xenko.ClientServerSample.xkpkg: -------------------------------------------------------------------------------- 1 | !Package 2 | SerializedVersion: {Assets: 3.1.0.0} 3 | Meta: 4 | Name: Xenko.ClientServerSample 5 | Version: 1.0.0 6 | Authors: [] 7 | Owners: [] 8 | Dependencies: null 9 | AssetFolders: 10 | - Path: !dir Assets 11 | - Path: !dir Effects 12 | ResourceFolders: 13 | - !dir Resources 14 | OutputGroupDirectories: {} 15 | ExplicitFolders: [] 16 | Bundles: [] 17 | TemplateFolders: [] 18 | RootAssets: 19 | - FF02239B-3697-4EBB-9F37-FE880659E64B:XenkoDebugSpriteFont 20 | --------------------------------------------------------------------------------