Added GLTF submodule and start of ModelLoader

This commit is contained in:
Simon Lübeß
2021-08-06 12:22:46 +02:00
parent 5c0ee3bae0
commit 80e0bae347
8 changed files with 505 additions and 4 deletions
+87 -2
View File
@@ -8,6 +8,8 @@ using ImGui;
using GlitchyEngine.Renderer;
using GlitchyEngine.Math;
using GlitchyEngine.World;
using System.Collections;
using GlitchyEngine.Content;
namespace Sandbox
{
@@ -55,8 +57,10 @@ namespace Sandbox
GeometryBinding _quadGeometryBinding ~ _?.ReleaseRef();
RasterizerState _rasterizerState ~ _?.ReleaseRef();
RasterizerState _rasterizerStateClockWise ~ _?.ReleaseRef();
GraphicsContext _context ~ _?.ReleaseRef();
DepthStencilTarget _depthTarget ~ _?.ReleaseRef();
Texture2D _texture ~ _?.ReleaseRef();
Texture2D _ge_logo ~ _?.ReleaseRef();
@@ -84,9 +88,13 @@ namespace Sandbox
_effectLibrary = new EffectLibrary(_context);
_effectLibrary.LoadNoRefInc("content\\Shaders\\basicShader.hlsl");
_effectLibrary.LoadNoRefInc("content\\Shaders\\testShader.hlsl");
var textureEffect = _effectLibrary.Load("content\\Shaders\\textureShader.hlsl");
_depthTarget = new DepthStencilTarget(_context, _context.SwapChain.Width, _context.SwapChain.Height);
// Create Input Layout
VertexLayout vertexLayout = new VertexLayout(_context, VertexColorTexture.VertexElements, false, textureEffect.VertexShader);
@@ -163,6 +171,9 @@ namespace Sandbox
RasterizerStateDescription rsDesc = .(.Solid, .Back, true);
_rasterizerState = new RasterizerState(_context, rsDesc);
rsDesc.FrontCounterClockwise = false;
_rasterizerStateClockWise = new RasterizerState(_context, rsDesc);
_texture = new Texture2D(_context, "content/Textures/Checkerboard.dds");
_ge_logo = new Texture2D(_context, "content/Textures/GE_Logo.dds");
@@ -190,6 +201,53 @@ namespace Sandbox
_cameraController = new .(Application.Get().Window.Context.SwapChain.BackbufferViewport.Width /
Application.Get().Window.Context.SwapChain.BackbufferViewport.Height);
_cameraController.CameraPosition = .(0, 0, -5);
TestLoadModel();
}
//GeometryBinding _modelTest ~ _?.ReleaseRef();
List<(Matrix Transform, GeometryBinding Model)> _modelTest = new .() ~ UnloadModelTest!();
mixin UnloadModelTest()
{
for(var entry in _modelTest)
{
entry.Model?.ReleaseRef();
}
delete _modelTest;
}
void TestLoadModel()
{
var testEffect = _effectLibrary.Get("testShader");
ModelLoader.LoadModel("content\\Models\\box.gltf", _context, testEffect, _modelTest);
testEffect.ReleaseRef();
/*
CGLTF.Options options = .();
CGLTF.Data* data;
CGLTF.Result result = CGLTF.ParseFile(options, "content\\Models\\box.gltf", out data);
CGLTF.LoadBuffers(options, data, "content\\Models\\box.gltf");
Log.EngineLogger.Assert(result == .Success, "Failed to load model");
var mesh = data.Meshes[0];
var primitive = mesh.Primitives[0];
var testEffect = _effectLibrary.Get("testShader");
_modelTest = ModelLoader.PrimitiveToGeoBinding(_context, primitive, testEffect);
testEffect.ReleaseRef();
/* TODO make awesome stuff */
CGLTF.Free(data);
*/
}
void InitEcs()
@@ -217,13 +275,13 @@ namespace Sandbox
_cameraController.Update(gameTime);
RenderCommand.Clear(null, .(0.2f, 0.2f, 0.2f));
_depthTarget.Clear(1.0f, 0, .Depth);
// Draw test geometry
_context.SetRenderTarget(null);
_depthTarget.Bind();
_context.BindRenderTargets();
_context.SetRasterizerState(_rasterizerState);
_context.SetViewport(_context.SwapChain.BackbufferViewport);
Renderer.BeginScene(_cameraController.Camera);
@@ -233,6 +291,24 @@ namespace Sandbox
var basicEffect = _effectLibrary.Get("basicShader");
var textureEffect = _effectLibrary.Get("textureShader");
// Model test
{
_context.SetRasterizerState(_rasterizerStateClockWise);
var testEffect = _effectLibrary.Get("testShader");
testEffect.Variables["BaseColor"].SetData(Color.White);
testEffect.Variables["LightDir"].SetData(Vector3(-1, 1, -0.5f).Normalized());
for(var entry in _modelTest)
{
Renderer.Submit(entry.Model, testEffect, entry.Transform);
}
testEffect.ReleaseRef();
}
_context.SetRasterizerState(_rasterizerState);
for(var entity in _world.Enumerate(typeof(TransformComponent)))
{
var transform = _world.GetComponent<TransformComponent>(entity);
@@ -281,6 +357,7 @@ namespace Sandbox
EventDispatcher dispatcher = EventDispatcher(event);
dispatcher.Dispatch<ImGuiRenderEvent>(scope (e) => OnImGuiRender(e));
dispatcher.Dispatch<WindowResizeEvent>(scope (e) => OnWindowResize(e));
}
private bool OnImGuiRender(ImGuiRenderEvent e)
@@ -295,6 +372,14 @@ namespace Sandbox
return false;
}
private bool OnWindowResize(WindowResizeEvent e)
{
_depthTarget.ReleaseRef();
_depthTarget = new DepthStencilTarget(_context, _context.SwapChain.Width, _context.SwapChain.Height);
return false;
}
}
class SandboxApp : Application