|
|
|
|
using System;
|
|
|
|
|
using gaemstone;
|
|
|
|
|
using gaemstone.Bloxel;
|
|
|
|
|
using gaemstone.Client;
|
|
|
|
|
using gaemstone.ECS;
|
|
|
|
|
using gaemstone.Utility;
|
|
|
|
|
using Silk.NET.Maths;
|
|
|
|
|
using Silk.NET.OpenGL;
|
|
|
|
|
using Silk.NET.Windowing;
|
|
|
|
|
using static flecs_hub.flecs;
|
|
|
|
|
using static gaemstone.Client.CameraModule;
|
|
|
|
|
using static gaemstone.Client.Input;
|
|
|
|
|
using static gaemstone.Client.Windowing;
|
|
|
|
|
|
|
|
|
|
var universe = new Universe();
|
|
|
|
|
var game = universe.Lookup<Game>();
|
|
|
|
|
Resources.ResourceAssembly = typeof(Program).Assembly;
|
|
|
|
|
|
|
|
|
|
var window = Window.Create(WindowOptions.Default with {
|
|
|
|
|
Title = "gæmstone",
|
|
|
|
|
Size = new(1280, 720),
|
|
|
|
|
FramesPerSecond = 60.0,
|
|
|
|
|
PreferredDepthBufferBits = 24,
|
|
|
|
|
});
|
|
|
|
|
window.Initialize();
|
|
|
|
|
window.Center();
|
|
|
|
|
|
|
|
|
|
universe.RegisterModule<Windowing>();
|
|
|
|
|
|
|
|
|
|
game.Set(new Canvas(window.CreateOpenGL()));
|
|
|
|
|
game.Set(new GameWindow(window));
|
|
|
|
|
|
|
|
|
|
TextureManager.Initialize(universe);
|
|
|
|
|
|
|
|
|
|
universe.RegisterComponent<Mesh>();
|
|
|
|
|
universe.RegisterComponent<gaemstone.Client.Texture>();
|
|
|
|
|
universe.RegisterComponent<TextureCoords4>();
|
|
|
|
|
|
|
|
|
|
universe.RegisterModule<Input>();
|
|
|
|
|
universe.RegisterModule<CameraModule>();
|
|
|
|
|
universe.RegisterModule<Renderer>();
|
|
|
|
|
|
|
|
|
|
game.Set(new RawInput());
|
|
|
|
|
|
|
|
|
|
// TODO: Find a way to automatically register this chunk storage.
|
|
|
|
|
universe.RegisterComponent<ChunkPaletteStorage<ecs_entity_t>>();
|
|
|
|
|
universe.RegisterAll(typeof(Chunk).Assembly);
|
|
|
|
|
|
|
|
|
|
universe.Create("MainCamera")
|
|
|
|
|
.Set(Camera.Default3D)
|
|
|
|
|
.Set((GlobalTransform)Matrix4X4.CreateTranslation(0.0F, 2.0F, 0.0F))
|
|
|
|
|
.Set(new CameraController { MouseSensitivity = 12.0F });
|
|
|
|
|
|
|
|
|
|
var heartMesh = MeshManager.Load(universe, "heart.glb");
|
|
|
|
|
var swordMesh = MeshManager.Load(universe, "sword.glb");
|
|
|
|
|
|
|
|
|
|
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));
|
|
|
|
|
universe.Create()
|
|
|
|
|
.Set((GlobalTransform)(rotation * position))
|
|
|
|
|
.Set(rnd.Pick(heartMesh, swordMesh));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var texture = TextureManager.Load(universe, "terrain.png");
|
|
|
|
|
|
|
|
|
|
var stone = universe.Create("Stone").Set(TextureCoords4.FromGrid(4, 4, 1, 0));
|
|
|
|
|
var dirt = universe.Create("Dirt" ).Set(TextureCoords4.FromGrid(4, 4, 2, 0));
|
|
|
|
|
var grass = universe.Create("Grass").Set(TextureCoords4.FromGrid(4, 4, 3, 0));
|
|
|
|
|
|
|
|
|
|
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 ChunkPaletteStorage<ecs_entity_t>(default);
|
|
|
|
|
universe.Create()
|
|
|
|
|
.Set((GlobalTransform)Matrix4X4.CreateTranslation(pos.GetOrigin()))
|
|
|
|
|
.Set(new Chunk(pos))
|
|
|
|
|
.Set(storage)
|
|
|
|
|
.Set(texture);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
window.Render += (delta) => {
|
|
|
|
|
if (!universe.Progress(TimeSpan.FromSeconds(delta)))
|
|
|
|
|
window.Close();
|
|
|
|
|
};
|
|
|
|
|
window.Run();
|