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(); universe.Modules.Register(); universe.Modules.Register(); var window = Window.Create(WindowOptions.Default with { Title = "gæmstone", Size = new(1280, 720), PreferredDepthBufferBits = 24, }); window.Initialize(); window.Center(); // universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); 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().Build(); var swordMesh = universe.New("/Immersion/Resources/sword.glb").Add().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) .Build(); } universe.Modules.Register(); universe.Modules.Register(); universe.Modules.Register(); var texture = universe.New("/Immersion/Resources/terrain.png").Add().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) .Build(); } // universe.Modules.Register(); 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"); });