Get it on the Microsoft Store
Documentation
Discord
The 3D Engine is currently in an early stage of development and is not yet equipped with the essential features required for a production-ready game engine. However, a clear and forward-looking development roadmap has been established, with active work being done to implement advanced systems such as virtualized geometry and radiance cascades for fully dynamic global illumination. As development progresses, I plan to foster a community starting next year, with the aim of building a C# game engine that integrates seamlessly with Unity workflows. With your support, we can create a powerful and user-friendly engine, complete with an editor, that meets the demands of modern game development.
- Use the WinAppSDK to create beautiful, modern apps for Windows 11.
- Vortice.Windows provides bindings for key Windows libraries including:
- DXGI, WIC, DirectWrite, Direct2D, Direct3D9, Direct3D11, Direct3D12, XInput, XAudio2, X3DAudio, DirectInput, DirectStorage, DirectML, UIAnimation, and DirectSound.
- ECS is a design pattern for high-performance and flexible game development. It emphasizes separation of data from behavior and supports the "composition over inheritance" principle, improving performance and code reusability.
- OpenUSD is a framework for interchange of 3D computer graphics data. The framework focuses on collaboration, non-destructive editing, and enabling multiple views and opinions about graphics data.
A 3D Engine sample project demonstrating the capabilities of the 3D Engine. Voxel Sandbox implements the following features:
- Chunk Generation: Procedurally generates voxel-based chunks for an expansive world.
- Noise Sampling: Utilizes noise algorithms to create realistic terrain variations.
- Mesh Generation: Dynamically generates meshes based on voxel data for efficient rendering.
- Character Controller: Implements a responsive character controller for player movement and interaction.
- Optimized Shader: Features custom shaders optimized for performance and and targeted for voxels and low memory usage.
All components are written in C#, showcasing how to leverage the 3D Engine's functionalities to build a fully-featured application.
Install the package via NuGet Package Manager for integration into your project.
dotnet new console -n Project
cd Project
dotnet add package 3DEngine
dotnet add package Costura.Fody
./Project.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows10.0.22621.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
<PlatformTarget>x64</PlatformTarget>
<PublishAot>true</PublishAot>
</PropertyGroup>
<ItemGroup>
<None Remove="FodyWeavers.xml" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="3DEngine" Version="3.1.0" />
<PackageReference Include="Costura.Fody" Version="5.7.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<Content Update="$(NuGetPackageRoot)\3dengine\3.1.0\contentFiles\any\net8.0-windows10.0.22621\Assets\Resources\**\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<None Update="Assets\Generators\FileNamesEnumGenerator.tt">
<Generator>TextTemplatingFileGenerator</Generator>
<LastGenOutput>FileNamesEnumGenerator.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" />
</ItemGroup>
<ItemGroup>
<Compile Update="Assets\Generators\FileNamesEnumGenerator.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>FileNamesEnumGenerator.tt</DependentUpon>
</Compile>
</ItemGroup>
</Project>
Ensure "PreserveNewest" is set for files in the Assets folder in Visual Studio. Replace the Path to the NuGet Package 3DEngine\3.1.0
class Program
{
[STAThread]
private static void Main() =>
new Engine.Program().Run(
config: Engine.Config.GetDefault(
windowCommand: Engine.WindowCommand.Show,
presentInterval: Engine.PresentInterval.Immediate,
multiSample: Engine.MultiSample.x4,
resolutionScale: 1,
title: "3D Engine",
width: 2560, height: 1440,
renderGUI: true, defaultBoot: true),
initialization: () =>
Engine.Kernel.Instance.SystemManager.MainEntityManager.CreateEntity().AddComponent<GameManager>(),
frame: () => { });
}
using System;
using System.Collections;
using System.Numerics;
using Engine;
using Engine.Buffer;
using Engine.Components;
using Engine.DataStructures;
using Engine.ECS;
using Engine.Editor;
using Engine.Framework;
using Engine.Graphics;
using Engine.GUI;
using Engine.Helper;
using Engine.Runtime;
using Engine.Utilities;
public class Example : Component
{
[ToolTip("This is a ToolTip")]
[Show]
private string _visibleString = "This field is private";
[Hide]
public string HiddenString = "This field is public";
[ShowOnly]
public string ShowOnlyString = "This string is not editable";
public int Int;
public float Float;
public Vector2 Vector2;
public Vector3 Vector3;
public Vector4 Vector4;
[Slider(1, 100)]
public float Slider;
public bool Bool;
[If("Bool", "True")]
[ShowOnly]
public string IfField = "This field is only visible if the bool is true";
[IfNot("Bool", "True")]
[ShowOnly]
public string IfNotField = "This field is only visible if the bool is not true";
[Color]
public Vector4 Color;
public Entity? _Entity;
[Space]
[Header("Header")]
public event Action? Event;
// This is the base function of OnRegister.
public override void OnRegister() =>
ScriptSystem.Register(this);
public override void OnAwake() { }
public override void OnStart() { }
public override void OnUpdate() { }
public override void OnLateUpdate() { }
public override void OnFixedUpdate() { }
public override void OnRender() { }
public override void OnGUI() { }
public override void OnDestroy() { }
}
Engine.Loader.ModelLoader.LoadFile(Engine.ModelFiles.Model);
Engine.Loader.ModelLoader.LoadFile(Engine.Utilities.AssetPaths.MESHES + "Model.obj");
Engine.Loader.ImageLoader.LoadFile(Engine.TextureFiles.TextureAtlas);
Engine.Loader.ImageLoader.LoadFile(Engine.Utilities.AssetPaths.TEXTURES + "Texture.png");
Engine.Kernel.Instance.Context.CreateShader(Engine.Utilities.AssetPaths.SHADERS + "Shader");
Engine.Kernel.Instance.Context.CreateComputeShader(Engine.Utilities.AssetPaths.COMPUTESHADERS + "ComputeShader");
Entity.AddComponent<Example>();
Entity.Manager.CreateEntity(name: "Controller").AddComponent<PlayerController>().Initialize(this);
Entity.Manager.CreateEntity(name: "Sky").AddComponent<DefaultSky>().Initialize();
var mesh = Entity.Manager.CreateEntity().AddComponent<Mesh>();
mesh.SetMeshData(ModelFiles.Model);
mesh.SetMeshData(Assets.Meshes["Model.obj"]);
mesh.SetMeshData(vertices, indices, positions, new InputLayoutHelper().AddPosition3D().AddUV());
mesh.SetRootSignature();
mesh.SetRootSignature(new RootSignatureHelper().AddConstantBufferView(2).AddShaderResourceViewTable());
mesh.SetMaterialTextures(TextureFiles.Texture);
mesh.SetMaterialTextures(textureEntries: [new("Texture.png", 0)]);
mesh.SetMaterialPipeline(ShaderFiles.Shader);
mesh.SetMaterialPipeline("Shader");
Engine.Utilities.Output.Log(Entity.Transform.Position);
if (Input.GetKey(Key.Escape, InputState.Down))
{
PAUSED = !PAUSED;
if (PAUSED)
Input.SetMouseLockState(MouseLockState.Unlocked);
else
Input.SetMouseLockState(MouseLockState.LockedInvisible, 0.5, 0.5);
}
if (!PAUSED)
Input.SetCursorIcon(SystemCursor.IDC_CROSS);
The 3D Engine repository includes:
- 3DEngine (Package)
- Editor
- Engine
You can build the 3DEngine (Package) for both the Editor and Engine as a MSIX Application or the Engine as a portable Win32 Application.
- USD Integration
- Materials
- Render Textures
- Compute Shaders
- Post Processing
- Gizmos
- Asynchronous Reprojection
- Radiance Cascade (Alexander Sannikov)
- Virtualized Geometry (Nano Tech, Chris K)
- Networking
- Spatial Audio
- PhysX 5
- Export Build to the Xbox Platform
To compile the 3D Engine, ensure you have Visual Studio 2022 with the following components: