|
|
|
|
using System;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.Globalization;
|
|
|
|
|
using System.Numerics;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using gaemstone;
|
|
|
|
|
using gaemstone.Bloxel;
|
|
|
|
|
using gaemstone.ECS;
|
|
|
|
|
using gaemstone.Utility;
|
|
|
|
|
using Silk.NET.Windowing;
|
|
|
|
|
using static gaemstone.Bloxel.Components.CoreComponents;
|
|
|
|
|
using static gaemstone.Client.Components.CameraComponents;
|
|
|
|
|
using static gaemstone.Client.Components.RenderingComponents;
|
|
|
|
|
using static gaemstone.Client.Components.ResourceComponents;
|
|
|
|
|
using static gaemstone.Client.Systems.FreeCameraController;
|
|
|
|
|
using static gaemstone.Client.Systems.Windowing;
|
|
|
|
|
using static gaemstone.Components.TransformComponents;
|
|
|
|
|
|
|
|
|
|
var culture = CultureInfo.InvariantCulture;
|
|
|
|
|
Thread.CurrentThread.CurrentCulture = culture;
|
|
|
|
|
CultureInfo.DefaultThreadCurrentCulture = culture;
|
|
|
|
|
|
|
|
|
|
var universe = new Universe();
|
|
|
|
|
var game = universe.LookupByTypeOrThrow<Game>();
|
|
|
|
|
|
|
|
|
|
universe.Modules.Register<gaemstone.Flecs.Systems.Rest>();
|
|
|
|
|
universe.Modules.Register<gaemstone.Flecs.Systems.Monitor>();
|
|
|
|
|
|
|
|
|
|
var window = Window.Create(WindowOptions.Default with {
|
|
|
|
|
Title = "gæmstone",
|
|
|
|
|
Size = new(1280, 720),
|
|
|
|
|
PreferredDepthBufferBits = 24,
|
|
|
|
|
});
|
|
|
|
|
window.Initialize();
|
|
|
|
|
window.Center();
|
|
|
|
|
|
|
|
|
|
// universe.Modules.Register<ObserverTest>();
|
|
|
|
|
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Systems.Windowing>();
|
|
|
|
|
universe.Modules.Register<gaemstone.Components.TransformComponents>();
|
|
|
|
|
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Components.RenderingComponents>();
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Systems.Renderer>();
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Systems.ImGuiManager>();
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Systems.ImGuiDemoWindow>();
|
|
|
|
|
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Components.ResourceComponents>();
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Systems.TextureManager>();
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Systems.MeshManager>();
|
|
|
|
|
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Components.InputComponents>();
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Systems.InputManager>();
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Systems.ImGuiInputDebug>();
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Systems.EntityInspector>();
|
|
|
|
|
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Components.CameraComponents>();
|
|
|
|
|
universe.Modules.Register<gaemstone.Client.Systems.FreeCameraController>();
|
|
|
|
|
|
|
|
|
|
game.Set(new Canvas(Silk.NET.OpenGL.ContextSourceExtensions.CreateOpenGL(window)));
|
|
|
|
|
game.Set(new GameWindow(window));
|
|
|
|
|
|
|
|
|
|
universe.New("MainCamera")
|
|
|
|
|
.Set(Camera.Default3D)
|
|
|
|
|
.Set((GlobalTransform)Matrix4x4.CreateTranslation(0.0F, 2.0F, 0.0F))
|
|
|
|
|
.Set(new CameraController { MouseSensitivity = 12.0F })
|
|
|
|
|
.Build();
|
|
|
|
|
|
|
|
|
|
var heartMesh = universe.New("/Immersion/Resources/heart.glb").Add<Mesh>().Build();
|
|
|
|
|
var swordMesh = universe.New("/Immersion/Resources/sword.glb").Add<Mesh>().Build();
|
|
|
|
|
|
|
|
|
|
var entities = universe.New("Entities").Build();
|
|
|
|
|
var rnd = new Random();
|
|
|
|
|
for (var x = -12; x <= 12; x++)
|
|
|
|
|
for (var z = -12; z <= 12; z++) {
|
|
|
|
|
var position = Matrix4x4.CreateTranslation(x * 2, 0.0F, z * 2);
|
|
|
|
|
var rotation = Matrix4x4.CreateRotationY(rnd.NextFloat(MathF.PI * 2));
|
|
|
|
|
var (type, mesh) = rnd.Pick(("Heart", heartMesh), ("Sword", swordMesh));
|
|
|
|
|
entities.NewChild()
|
|
|
|
|
.Set((GlobalTransform)(rotation * position))
|
|
|
|
|
.Add<Mesh>(mesh)
|
|
|
|
|
.Build();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
universe.Modules.Register<gaemstone.Bloxel.Components.CoreComponents>();
|
|
|
|
|
universe.Modules.Register<gaemstone.Bloxel.Systems.BasicWorldGenerator>();
|
|
|
|
|
universe.Modules.Register<gaemstone.Bloxel.Client.Systems.ChunkMeshGenerator>();
|
|
|
|
|
|
|
|
|
|
var texture = universe.New("/Immersion/Resources/terrain.png").Add<Texture>().Build();
|
|
|
|
|
|
|
|
|
|
var stone = universe.New("Stone").Set(TextureCoords4.FromGrid(4, 4, 1, 0)).Build();
|
|
|
|
|
var dirt = universe.New("Dirt" ).Set(TextureCoords4.FromGrid(4, 4, 2, 0)).Build();
|
|
|
|
|
var grass = universe.New("Grass").Set(TextureCoords4.FromGrid(4, 4, 3, 0)).Build();
|
|
|
|
|
|
|
|
|
|
var chunks = universe.New("Chunks").Build();
|
|
|
|
|
var sizeH = 4; var sizeY = 2;
|
|
|
|
|
for (var cx = -sizeH; cx < sizeH; cx++)
|
|
|
|
|
for (var cy = -sizeY; cy < sizeY; cy++)
|
|
|
|
|
for (var cz = -sizeH; cz < sizeH; cz++) {
|
|
|
|
|
var pos = new ChunkPos(cx, cy - 2, cz);
|
|
|
|
|
var storage = new ChunkStoreBlocks();
|
|
|
|
|
chunks.NewChild()
|
|
|
|
|
.Set((GlobalTransform)Matrix4x4.CreateTranslation(pos.GetOrigin()))
|
|
|
|
|
.Set(new Chunk(pos))
|
|
|
|
|
.Set(storage)
|
|
|
|
|
.Add<Texture>(texture)
|
|
|
|
|
.Build();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// universe.Modules.Register<ObserverTest>();
|
|
|
|
|
|
|
|
|
|
var stopwatch = Stopwatch.StartNew();
|
|
|
|
|
var minFrameTime = TimeSpan.FromSeconds(1) / 30;
|
|
|
|
|
window.Run(() => {
|
|
|
|
|
var delta = stopwatch.Elapsed;
|
|
|
|
|
stopwatch.Restart();
|
|
|
|
|
|
|
|
|
|
if (!universe.Progress(delta))
|
|
|
|
|
window.Close();
|
|
|
|
|
|
|
|
|
|
var requiredTime = stopwatch.Elapsed;
|
|
|
|
|
while (stopwatch.Elapsed < minFrameTime) Thread.Sleep(0);
|
|
|
|
|
var totalTime = stopwatch.Elapsed;
|
|
|
|
|
// Console.WriteLine($"Frame time: req={requiredTime.TotalMilliseconds:F2}ms, total={totalTime.TotalMilliseconds:F2}ms");
|
|
|
|
|
});
|