|
|
|
@ -1,31 +1,42 @@ |
|
|
|
|
using System; |
|
|
|
|
using System.IO; |
|
|
|
|
using gaemstone.ECS; |
|
|
|
|
using Silk.NET.Maths; |
|
|
|
|
using Silk.NET.OpenGL; |
|
|
|
|
using static gaemstone.Client.Components.RenderingComponents; |
|
|
|
|
using static gaemstone.Client.Components.ResourceComponents; |
|
|
|
|
using static gaemstone.Client.Systems.Windowing; |
|
|
|
|
using ModelRoot = SharpGLTF.Schema2.ModelRoot; |
|
|
|
|
|
|
|
|
|
namespace gaemstone.Client; |
|
|
|
|
namespace gaemstone.Client.Systems; |
|
|
|
|
|
|
|
|
|
public static class MeshManager |
|
|
|
|
[Module] |
|
|
|
|
public class MeshManager |
|
|
|
|
{ |
|
|
|
|
private const uint PositionAttribIndex = 0; |
|
|
|
|
private const uint NormalAttribIndex = 1; |
|
|
|
|
private const uint UvAttribIndex = 2; |
|
|
|
|
|
|
|
|
|
public static MeshHandle Load(Universe universe, EntityPath path) |
|
|
|
|
[System] |
|
|
|
|
public static void LoadMeshWhenDefined( |
|
|
|
|
[Game] Canvas canvas, EntityRef entity, |
|
|
|
|
Mesh _1, [Not] MeshHandle _2) |
|
|
|
|
{ |
|
|
|
|
ModelRoot root; |
|
|
|
|
using (var stream = Resources.GetStream(path)) |
|
|
|
|
root = ModelRoot.ReadGLB(stream, new()); |
|
|
|
|
var path = entity.GetFullPath(); |
|
|
|
|
using var stream = Resources.GetStream(path); |
|
|
|
|
var handle = CreateFromStream(canvas.GL, stream); |
|
|
|
|
entity.Set(handle); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static MeshHandle CreateFromStream(GL GL, Stream stream) |
|
|
|
|
{ |
|
|
|
|
var root = ModelRoot.ReadGLB(stream); |
|
|
|
|
var primitive = root.LogicalMeshes[0].Primitives[0]; |
|
|
|
|
|
|
|
|
|
var indices = primitive.IndexAccessor; |
|
|
|
|
var vertices = primitive.VertexAccessors["POSITION"]; |
|
|
|
|
var normals = primitive.VertexAccessors["NORMAL"]; |
|
|
|
|
|
|
|
|
|
var GL = universe.LookupOrThrow<Game>().Get<Canvas>().GL; |
|
|
|
|
var vao = GL.GenVertexArray(); |
|
|
|
|
GL.BindVertexArray(vao); |
|
|
|
|
|
|
|
|
@ -48,11 +59,10 @@ public static class MeshManager |
|
|
|
|
return new(vao, numVertices); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static MeshHandle Create(Universe universe, |
|
|
|
|
public static MeshHandle Create(GL GL, |
|
|
|
|
ReadOnlySpan<ushort> indices, ReadOnlySpan<Vector3D<float>> vertices, |
|
|
|
|
ReadOnlySpan<Vector3D<float>> normals, ReadOnlySpan<Vector2D<float>> uvs) |
|
|
|
|
{ |
|
|
|
|
var GL = universe.LookupOrThrow<Game>().Get<Canvas>().GL; |
|
|
|
|
var vao = GL.GenVertexArray(); |
|
|
|
|
GL.BindVertexArray(vao); |
|
|
|
|
|
|
|
|
@ -77,10 +87,9 @@ public static class MeshManager |
|
|
|
|
return new(vao, indices.Length); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static MeshHandle Create(Universe universe, ReadOnlySpan<Vector3D<float>> vertices, |
|
|
|
|
public static MeshHandle Create(GL GL, ReadOnlySpan<Vector3D<float>> vertices, |
|
|
|
|
ReadOnlySpan<Vector3D<float>> normals, ReadOnlySpan<Vector2D<float>> uvs) |
|
|
|
|
{ |
|
|
|
|
var GL = universe.LookupOrThrow<Game>().Get<Canvas>().GL; |
|
|
|
|
var vao = GL.GenVertexArray(); |
|
|
|
|
GL.BindVertexArray(vao); |
|
|
|
|
|
|
|
|
|