From a2db0774f83cdf671312ed3b07a935c825cabb4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Sun, 13 Feb 2022 02:14:56 +0100 Subject: [PATCH] Cleanup --- GlitchyEngine/src/Content/ModelLoader.bf | 22 +- .../src/Platform/DX11/Renderer/Dx11Buffer.bf | 2 +- Sandbox/BeefProj.toml | 2 +- .../Models/RiggedFigure/RiggedFigure.glb | Bin 0 -> 50116 bytes Sandbox/src/ExampleLayer.bf | 521 ++++++++++++++++++ Sandbox/src/ExampleLayer2D.bf | 10 +- Sandbox/src/SandboxApp.bf | 511 ----------------- 7 files changed, 541 insertions(+), 527 deletions(-) create mode 100644 Sandbox/content/Models/RiggedFigure/RiggedFigure.glb create mode 100644 Sandbox/src/ExampleLayer.bf diff --git a/GlitchyEngine/src/Content/ModelLoader.bf b/GlitchyEngine/src/Content/ModelLoader.bf index 1fb46ea..5d5912f 100644 --- a/GlitchyEngine/src/Content/ModelLoader.bf +++ b/GlitchyEngine/src/Content/ModelLoader.bf @@ -39,7 +39,15 @@ namespace GlitchyEngine.Content #if DEBUG var nameComponent = world.AssignComponent(entity); - nameComponent.SetName(StringView(node.Name)); + + if (node.Name != null) + { + nameComponent.SetName(StringView(node.Name)); + } + else + { + nameComponent.SetName("Unnamed Node"); + } #endif if(parentEntity.HasValue) @@ -120,16 +128,16 @@ namespace GlitchyEngine.Content meshParent.Entity = entity; var mesh = world.AssignComponent(meshEntity); - mesh.Mesh = ModelLoader.PrimitiveToGeoBinding(node.Mesh.Primitives[0], validationEffect); + mesh.Mesh = PrimitiveToGeoBinding(primitive, validationEffect); if(skeleton == null) { - var meshRenderer = world.AssignComponent(entity); + var meshRenderer = world.AssignComponent(meshEntity); meshRenderer.Material = material; } else { - var meshRenderer = world.AssignComponent(entity); + var meshRenderer = world.AssignComponent(meshEntity); meshRenderer.Material = material; meshRenderer.Skeleton = skeleton; } @@ -179,6 +187,7 @@ namespace GlitchyEngine.Content uint8* bufferData = (uint8*)indices.BufferView.Buffer.Data; bufferData += indices.BufferView.Offset; + // TODO: this is a mess ib.SetData(bufferData, (.)indices.BufferView.Size); binding.SetIndexBuffer(ib); @@ -388,7 +397,8 @@ namespace GlitchyEngine.Content joint.InverseBindPose = GetEntry(skin.InverseBindMatrices, i); - joint.Name = new String(skin.Joints[i].Name); + if (skin.Joints[i].Name != null) + joint.Name = new String(skin.Joints[i].Name); int parentId = skin.Joints.IndexOf(skin.Joints[i].Parent); @@ -528,6 +538,8 @@ namespace GlitchyEngine.Content CGLTF.AccessorReadFloat(accessor, (uint)index, (float*)&result, 4); case typeof(Matrix): CGLTF.AccessorReadFloat(accessor, (uint)index, (float*)&result, 16); + case typeof(uint16): + CGLTF.AccessorReadUint(accessor, (uint)index, (uint32*)&result, 2); case default: uint8* data = (uint8*)accessor.BufferView.Buffer.Data; diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Buffer.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Buffer.bf index 3111556..8a9ad71 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Buffer.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Buffer.bf @@ -70,7 +70,7 @@ namespace GlitchyEngine.Renderer { byteData = new uint8[nativeDescription.ByteWidth]*; defer:: delete byteData; - Internal.MemCpy(byteData + dstByteOffset, data, byteLength); + Internal.MemCpy(byteData + dstByteOffset, data, Math.Min(nativeDescription.ByteWidth, byteLength)); } SubresourceData srData = .(byteData, byteLength, 0); diff --git a/Sandbox/BeefProj.toml b/Sandbox/BeefProj.toml index 6ebf7a4..7551d14 100644 --- a/Sandbox/BeefProj.toml +++ b/Sandbox/BeefProj.toml @@ -5,4 +5,4 @@ Dependencies = {GlitchyEngine = "*", corlib = "*", msdfgen-beef = "*", LodePng = Name = "Sandbox" TargetType = "BeefGUIApplication" StartupObject = "GlitchyEngine.Program" -ProcessorMacros = ["GAMMA_TEST", "NOT_SANDBOX_2D"] +ProcessorMacros = ["NOT_GAMMA_TEST", "SANDBOX_2D"] diff --git a/Sandbox/content/Models/RiggedFigure/RiggedFigure.glb b/Sandbox/content/Models/RiggedFigure/RiggedFigure.glb new file mode 100644 index 0000000000000000000000000000000000000000..c505a33dfa5ba84bd5f3dd0a85f74ee4c9978322 GIT binary patch literal 50116 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 literal 0 HcmV?d00001 diff --git a/Sandbox/src/ExampleLayer.bf b/Sandbox/src/ExampleLayer.bf new file mode 100644 index 0000000..97b09d4 --- /dev/null +++ b/Sandbox/src/ExampleLayer.bf @@ -0,0 +1,521 @@ +using GlitchyEngine.Renderer; +using GlitchyEngine.Events; +using GlitchyEngine.ImGui; +using GlitchyEngine.Math; +using GlitchyEngine; +using System; +using GlitchyEngine.World; +using GlitchyEngine.Renderer.Animation; +using GlitchyEngine.Content; +using System.Collections; + +namespace Sandbox +{ + + class ExampleLayer : Layer + { + [Ordered] + struct VertexColorTexture : IVertexData + { + public Vector3 Position; + public Color Color; + public Vector2 TexCoord; + + public this() => this = default; + + public this(Vector3 pos, Color color) + { + Position = pos; + Color = color; + TexCoord = .(); + } + + public this(Vector3 pos, Color color, Vector2 texCoord) + { + Position = pos; + Color = color; + TexCoord = texCoord; + } + + public static readonly VertexElement[] VertexElements ~ delete _; + + public static VertexElement[] IVertexData.VertexElements => VertexElements; + + static this() + { + VertexElements = new VertexElement[]( + VertexElement(.R32G32B32_Float, "POSITION"), + VertexElement(.R8G8B8A8_UNorm, "COLOR"), + VertexElement(.R32G32_Float, "TEXCOORD"), + ); + } + } + + GeometryBinding _geometryBinding ~ _?.ReleaseRef(); + + GeometryBinding _quadGeometryBinding ~ _?.ReleaseRef(); + + RasterizerState _rasterizerState ~ _?.ReleaseRef(); + RasterizerState _rasterizerStateClockWise ~ _?.ReleaseRef(); + + GraphicsContext _context ~ _?.ReleaseRef(); + DepthStencilTarget _depthTarget ~ _?.ReleaseRef(); + + Material _checkerMaterial ~ _?.ReleaseRef(); + Material _logoMaterial ~ _?.ReleaseRef(); + Texture2D _texture ~ _?.ReleaseRef(); + Texture2D _ge_logo ~ _?.ReleaseRef(); + + BlendState _alphaBlendState ~ _?.ReleaseRef(); + BlendState _opaqueBlendState ~ _?.ReleaseRef(); + + EcsWorld _world = new EcsWorld() ~ delete _; + + PerspectiveCameraController _cameraController ~ delete _; + + private Vector3 CircleCoord(float angle) + { + return .(Math.Cos(angle), Math.Sin(angle), 0); + } + + [AllowAppend] + public this() : base("Example") + { + Application.Get().Window.IsVSync = false; + + _context = Application.Get().Window.Context..AddRef(); + + var effectLibrary = Application.Get().EffectLibrary; + + effectLibrary.LoadNoRefInc("content\\Shaders\\basicShader.hlsl"); + + effectLibrary.LoadNoRefInc("content\\Shaders\\testShader.hlsl"); + + var textureEffect = effectLibrary.Load("content\\Shaders\\textureShader.hlsl"); + + _depthTarget = new DepthStencilTarget(_context.SwapChain.Width, _context.SwapChain.Height); + + // Create Input Layout + + VertexLayout vertexLayout = new VertexLayout(VertexColorTexture.VertexElements, false, textureEffect.VertexShader); + + textureEffect.ReleaseRef(); + + // Create hexagon + { + _geometryBinding = new GeometryBinding(); + _geometryBinding.SetPrimitiveTopology(.TriangleList); + _geometryBinding.SetVertexLayout(vertexLayout); + + float pO3 = Math.PI_f / 3.0f; + VertexColorTexture[?] vertices = .( + VertexColorTexture(.Zero, Color(255,255,255)), + VertexColorTexture(CircleCoord(0), Color(255, 0, 0)), + VertexColorTexture(CircleCoord(pO3), Color(255,255, 0)), + VertexColorTexture(CircleCoord(pO3*2), Color( 0,255, 0)), + VertexColorTexture(CircleCoord(Math.PI_f), Color( 0,255,255)), + VertexColorTexture(CircleCoord(-pO3*2), Color( 0, 0,255)), + VertexColorTexture(CircleCoord(-pO3), Color(255, 0,255)), + ); + + let vb = new VertexBuffer(typeof(VertexColorTexture), (.)vertices.Count, .Immutable); + vb.SetData(vertices); + _geometryBinding.SetVertexBufferSlot(vb, 0); + vb.ReleaseRef(); + + uint16[?] indices = .( + 0, 1, 2, + 0, 2, 3, + 0, 3, 4, + 0, 4, 5, + 0, 5, 6, + 0, 6, 1); + + let ib = new IndexBuffer((.)indices.Count, .Immutable); + ib.SetData(indices); + _geometryBinding.SetIndexBuffer(ib); + ib.ReleaseRef(); + } + + // Create Quad + { + _quadGeometryBinding = new GeometryBinding(); + _quadGeometryBinding.SetPrimitiveTopology(.TriangleList); + _quadGeometryBinding.SetVertexLayout(vertexLayout); + + VertexColorTexture[?] vertices = .( + VertexColorTexture(Vector3(-0.75f, 0.75f, 0), Color.White, .(0, 0)), + VertexColorTexture(Vector3(-0.75f, -0.75f, 0), Color.White, .(0, 1)), + VertexColorTexture(Vector3(0.75f, -0.75f, 0), Color.White, .(1, 1)), + VertexColorTexture(Vector3(0.75f, 0.75f, 0), Color.White, .(1, 0)), + ); + + let qvb = new VertexBuffer(typeof(VertexColorTexture), (.)vertices.Count, .Immutable); + qvb.SetData(vertices); + _quadGeometryBinding.SetVertexBufferSlot(qvb, 0); + qvb.ReleaseRef(); + + uint16[?] indices = .( + 0, 1, 2, + 2, 3, 0); + + let qib = new IndexBuffer((.)indices.Count, .Immutable); + qib.SetData(indices); + _quadGeometryBinding.SetIndexBuffer(qib); + qib.ReleaseRef(); + } + + vertexLayout.ReleaseRef(); + + // Create rasterizer state + RasterizerStateDescription rsDesc = .(.Solid, .Back, true); + _rasterizerState = new RasterizerState(rsDesc); + + rsDesc.FrontCounterClockwise = false; + _rasterizerStateClockWise = new RasterizerState(rsDesc); + + _texture = new Texture2D("content/Textures/Checkerboard.dds"); + _ge_logo = new Texture2D("content/Textures/GE_Logo.dds"); + + let sampler = SamplerStateManager.GetSampler( + SamplerStateDescription() + { + MagFilter = .Point + }); + + _texture.SamplerState = sampler; + _ge_logo.SamplerState = sampler; + + sampler.ReleaseRef(); + + _logoMaterial = new Material(textureEffect); + _logoMaterial.SetTexture("ColorTexture", _ge_logo); + + _checkerMaterial = new Material(textureEffect); + _checkerMaterial.SetTexture("ColorTexture", _texture); + + BlendStateDescription blendDesc = .(); + blendDesc.RenderTarget[0] = .(true, .SourceAlpha, .InvertedSourceAlpha, .Add, .SourceAlpha, .InvertedSourceAlpha, .Add, .All); + _alphaBlendState = new BlendState(blendDesc); + _opaqueBlendState = new BlendState(.Default); + + InitEcs(); + + _cameraController = new .(_context.SwapChain.AspectRatio); + _cameraController.CameraPosition = .(0, 0, -5); + _cameraController.TranslationSpeed = 10; + + TestLoadModel(); + } + + List Clips = new List() ~ DeleteContainerAndReleaseItems!(_); + + Material animationMat; + + void TestLoadModel() + { + var testEffect = Application.Get().EffectLibrary.Get("testShader"); + var materialTestMaterial = new Material(testEffect); + animationMat = materialTestMaterial; + + Matrix[] matrices = scope Matrix[255]; + Matrix3x3[] matrices2 = scope Matrix3x3[255]; + + for(int i < 255) + { + matrices[i] = .Identity; + matrices2[i] = .Identity; + } + + materialTestMaterial.SetVariable("SkinningMatrices", matrices); + materialTestMaterial.SetVariable("InvTransSkinningMatrices", matrices2); + + materialTestMaterial.SetVariable("BaseColor", Color.White); + materialTestMaterial.SetVariable("LightDir", Vector3(1, 1, -0.5f).Normalized()); + + ModelLoader.LoadModel("content\\Models\\RiggedFigure\\RiggedFigure.glb", testEffect, materialTestMaterial, _world, Clips); + + materialTestMaterial.ReleaseRef(); + testEffect.ReleaseRef(); + + for(var (entity, transform, mesh, meshRenderer) in _world.Enumerate()) + { + var animation = _world.AssignComponent(entity); + + animation.AnimationClip = Clips[0]; + animation.TimeScale = 1.0f; + animation.IsPlaying = true; + animation.[Friend]_pose = new SkeletonPose(meshRenderer.Skeleton); + } + } + + Entity evenCrazierParent; + Entity crazyParent; + + Material testMaterial1 ~ _?.ReleaseRef(); + Material testMaterial2 ~ _?.ReleaseRef(); + + void InitEcs() + { + _world.Register(); + _world.Register(); + _world.Register(); + _world.Register(); + _world.Register(); + _world.Register(); + _world.Register(); + _world.Register(); + + var basicEffect = Application.Get().EffectLibrary.Get("basicShader"); + + testMaterial1 = new Material(basicEffect); + testMaterial1.SetVariable("BaseColor", _squareColor0); + testMaterial2 = new Material(basicEffect); + testMaterial2.SetVariable("BaseColor", _squareColor1); + + basicEffect.ReleaseRef(); + /* + Entity[20][20] entities; + + int i = 0; + + for(int x < 20) + for(int y < 20) + { + Entity entity = _world.NewEntity(); + + entities[x][y] = entity; + + var transform = _world.AssignComponent(entity); + *transform = TransformComponent(); + transform.LocalTransform = Matrix.Translation(x * 0.2f, y * 0.2f, 0) * Matrix.Scaling(0.1f); + + var mesh = _world.AssignComponent(entity); + mesh.Mesh = _quadGeometryBinding; + + i++; + + var meshRenderer = _world.AssignComponent(entity); + + if(i % 2 == 0) + meshRenderer.Material = testMaterial1; + else + meshRenderer.Material = testMaterial2; + } + + crazyParent = _world.NewEntity(); + evenCrazierParent = _world.NewEntity(); + + var crazyTransform = _world.AssignComponent(evenCrazierParent); + crazyTransform.Position = .Zero; + crazyTransform.Scale = .One; + crazyTransform.Rotation = .Identity; + + var pp = _world.AssignComponent(crazyParent); + pp.Entity = evenCrazierParent; + + crazyTransform = _world.AssignComponent(crazyParent); + crazyTransform.Position = .Zero; + crazyTransform.Scale = .(2.0f, 2.0f, 2.0f); + crazyTransform.Rotation = .Identity; + + for(int x < 20) + for(int y < 20) + { + var parent = _world.AssignComponent(entities[x][y]); + parent.Entity = crazyParent; + } + */ + } + + float f = 0.0f; + + bool playAnimation = false; + + public override void Update(GameTime gameTime) + { + f += (float)gameTime.FrameTime.TotalSeconds; + + _cameraController.Update(gameTime); + + RenderCommand.Clear(null, .(0.2f, 0.2f, 0.2f)); + RenderCommand.Clear(_depthTarget, .Depth, 1.0f, 0); + + // Draw test geometry + RenderCommand.SetRenderTarget(null); + RenderCommand.SetDepthStencilTarget(_depthTarget); + RenderCommand.BindRenderTargets(); + + RenderCommand.SetViewport(_context.SwapChain.BackbufferViewport); + + Renderer.BeginScene(_cameraController.Camera); + + RenderCommand.SetBlendState(_opaqueBlendState); + + var basicEffect = Application.Get().EffectLibrary.Get("basicShader"); + + RenderCommand.SetRasterizerState(_rasterizerState); + + TransformSystem.Update(_world); + + for(var (entity, transform, mesh, meshRenderer) in _world.Enumerate()) + { + Renderer.Submit(mesh.Mesh, meshRenderer.Material, transform.WorldTransform); + } + + for(var (entity, transform, mesh, meshRenderer, animation) in _world.Enumerate()) + { + var material = meshRenderer.Material; + + var timeIndex = ref animation.TimeIndex; + var currentClip = animation.AnimationClip; + var pose = animation.Pose; + + // Only advance time index if animation is playing + if(animation.IsPlaying) + { + timeIndex += (float)gameTime.FrameTime.TotalSeconds * animation.TimeScale; + + if(currentClip.IsLooping && currentClip.Duration != 0) + { + timeIndex %= currentClip.Duration; + + // modulo can result in negative numbers + if(timeIndex < 0) + timeIndex += currentClip.Duration; + } + } + + var skeleton = currentClip.Skeleton; + + // Update joints + for(int i < skeleton.Joints.Count) + { + ref JointPose localPose = ref pose.LocalPose[i]; + + localPose = currentClip.JointAnimations[i].GetCurrentPose(timeIndex); + + Matrix jointToParent = + Matrix.Translation(localPose.Translation) * + Matrix.RotationQuaternion(localPose.Rotation) * + Matrix.Scaling(localPose.Scale); + + uint8 parentIndex = skeleton.Joints[i].ParentID; + + ref Matrix globalPose = ref pose.GlobalPose[i]; + + if(parentIndex == uint8.MaxValue) + { + globalPose = jointToParent; + } + else + { + globalPose = pose.GlobalPose[parentIndex] * jointToParent; + } + + pose.SkinningMatricies[i] = globalPose * skeleton.Joints[i].InverseBindPose; + pose.InvTransSkinningMatricies[i] = ((Matrix3x3)pose.SkinningMatricies[i]).Inverse().Transpose(); + } + + int i = 0; + for(var globalPose in pose.GlobalPose) + { + Joint currentJoint = meshRenderer.Skeleton.Joints[i]; + + Matrix bindPose = currentJoint.InverseBindPose.Invert(); + + // Draw skeleton + Matrix mat = pose.SkinningMatricies[i] * bindPose; + + uint8 parentId = currentJoint.ParentID; + + if(parentId != uint8.MaxValue) + { + Vector3 start = mat.Translation; + + Joint parent = meshRenderer.Skeleton.Joints[parentId]; + + Matrix parentBindPose = parent.InverseBindPose.Invert(); + + Matrix parentMatrix = pose.SkinningMatricies[parentId] * parentBindPose; + + Vector3 end = parentMatrix.Translation; + + Renderer.DrawLine(start, end, .Black, transform.WorldTransform); + } + + DebugRenderer.DrawCoordinateCross(transform.WorldTransform * mat, 0.5f); + + i++; + } + + material.SetVariable("SkinningMatrices", pose.SkinningMatricies); + material.SetVariable("InvTransSkinningMatrices", pose.InvTransSkinningMatricies); + + // non engine + material.SetVariable("BaseColor", Color.White); + material.SetVariable("LightDir", Vector3(1, 1, -0.5f).Normalized()); + + Renderer.Submit(mesh.Mesh, material, transform.WorldTransform); + } + + basicEffect.Variables["BaseColor"].SetData(_squareColor1); + + _checkerMaterial.SetVariable("BaseColor", Color.White); + + Renderer.Submit(_quadGeometryBinding, _checkerMaterial, Matrix.RotationY(f) * Matrix.RotationX(MathHelper.PiOverTwo) * .Scaling(1.5f)); + + RenderCommand.SetBlendState(_alphaBlendState); + + _logoMaterial.SetVariable("BaseColor", Color.Pink); + + Renderer.Submit(_quadGeometryBinding, _logoMaterial, .Translation(0, 0, -1) * .Scaling(2f)); + + DebugRenderer.Render(_world); + + Renderer.EndScene(); + + basicEffect.ReleaseRef(); + } + + ColorRGBA _squareColor0 = ColorRGBA.CornflowerBlue; + ColorRGBA _squareColor1; + + public override void OnEvent(Event event) + { + _cameraController.OnEvent(event); + + EventDispatcher dispatcher = EventDispatcher(event); + + dispatcher.Dispatch(scope (e) => OnImGuiRender(e)); + dispatcher.Dispatch(scope (e) => OnWindowResize(e)); + } + + private bool OnImGuiRender(ImGuiRenderEvent e) + { + /* + ImGui.Begin("Test"); + + var v = ImGui.ColorEdit3("Square Color", ref _squareColor0); + + if(v) + { + testMaterial1.SetVariable("BaseColor", _squareColor0); + testMaterial2.SetVariable("BaseColor", ColorRGBA.White - _squareColor0); + } + + ImGui.End(); + */ + return false; + } + + private bool OnWindowResize(WindowResizeEvent e) + { + _depthTarget.ReleaseRef(); + _depthTarget = new DepthStencilTarget(_context.SwapChain.Width, _context.SwapChain.Height); + + return false; + } + } + +} \ No newline at end of file diff --git a/Sandbox/src/ExampleLayer2D.bf b/Sandbox/src/ExampleLayer2D.bf index 42ecb14..7ffbf1b 100644 --- a/Sandbox/src/ExampleLayer2D.bf +++ b/Sandbox/src/ExampleLayer2D.bf @@ -16,8 +16,6 @@ namespace Sandbox { class ExampleLayer2D : Layer { - RasterizerState _rasterizerState ~ _?.ReleaseRef(); - GraphicsContext _context ~ _?.ReleaseRef(); DepthStencilTarget _depthTarget ~ _?.ReleaseRef(); @@ -43,10 +41,6 @@ namespace Sandbox _context = Application.Get().Window.Context..AddRef(); - // Create rasterizer state - GlitchyEngine.Renderer.RasterizerStateDescription rsDesc = .(.Solid, .Back, false, 0); - _rasterizerState = new RasterizerState(rsDesc); - _depthTarget = new DepthStencilTarget(_context.SwapChain.Width, _context.SwapChain.Height); _checkerTexture = new Texture2D("content/Textures/Checkerboard.dds"); @@ -79,7 +73,7 @@ namespace Sandbox _textureViewer = new TextureViewer(); - cameraController = new OrthographicCameraController(16 / 9f); + cameraController = new OrthographicCameraController(_context.SwapChain.AspectRatio); DepthStencilStateDescription dssDesc = .() { @@ -106,8 +100,6 @@ namespace Sandbox RenderCommand.SetDepthStencilTarget(_depthTarget); RenderCommand.BindRenderTargets(); - RenderCommand.SetRasterizerState(_rasterizerState); - RenderCommand.SetViewport(_context.SwapChain.BackbufferViewport); Renderer2D.BeginScene(cameraController.Camera, .BackToFront); diff --git a/Sandbox/src/SandboxApp.bf b/Sandbox/src/SandboxApp.bf index dbfa922..c19e7bc 100644 --- a/Sandbox/src/SandboxApp.bf +++ b/Sandbox/src/SandboxApp.bf @@ -14,517 +14,6 @@ using GlitchyEngine.Renderer.Animation; namespace Sandbox { - class ExampleLayer : Layer - { - [Ordered] - struct VertexColorTexture : IVertexData - { - public Vector3 Position; - public Color Color; - public Vector2 TexCoord; - - public this() => this = default; - - public this(Vector3 pos, Color color) - { - Position = pos; - Color = color; - TexCoord = .(); - } - - public this(Vector3 pos, Color color, Vector2 texCoord) - { - Position = pos; - Color = color; - TexCoord = texCoord; - } - - public static readonly VertexElement[] VertexElements ~ delete _; - - public static VertexElement[] IVertexData.VertexElements => VertexElements; - - static this() - { - VertexElements = new VertexElement[]( - VertexElement(.R32G32B32_Float, "POSITION"), - VertexElement(.R8G8B8A8_UNorm, "COLOR"), - VertexElement(.R32G32_Float, "TEXCOORD"), - ); - } - } - - GeometryBinding _geometryBinding ~ _?.ReleaseRef(); - - GeometryBinding _quadGeometryBinding ~ _?.ReleaseRef(); - - RasterizerState _rasterizerState ~ _?.ReleaseRef(); - RasterizerState _rasterizerStateClockWise ~ _?.ReleaseRef(); - - GraphicsContext _context ~ _?.ReleaseRef(); - DepthStencilTarget _depthTarget ~ _?.ReleaseRef(); - - Material _checkerMaterial ~ _?.ReleaseRef(); - Material _logoMaterial ~ _?.ReleaseRef(); - Texture2D _texture ~ _?.ReleaseRef(); - Texture2D _ge_logo ~ _?.ReleaseRef(); - - BlendState _alphaBlendState ~ _?.ReleaseRef(); - BlendState _opaqueBlendState ~ _?.ReleaseRef(); - - EcsWorld _world = new EcsWorld() ~ delete _; - -// OrthographicCameraController _cameraController ~ delete _; - PerspectiveCameraController _cameraController ~ delete _; - - private Vector3 CircleCoord(float angle) - { - return .(Math.Cos(angle), Math.Sin(angle), 0); - } - - [AllowAppend] - public this() : base("Example") - { - Application.Get().Window.IsVSync = false; - - _context = Application.Get().Window.Context..AddRef(); - - var effectLibrary = Application.Get().EffectLibrary; - - effectLibrary.LoadNoRefInc("content\\Shaders\\basicShader.hlsl"); - - effectLibrary.LoadNoRefInc("content\\Shaders\\testShader.hlsl"); - - var textureEffect = effectLibrary.Load("content\\Shaders\\textureShader.hlsl"); - - _depthTarget = new DepthStencilTarget(_context.SwapChain.Width, _context.SwapChain.Height); - - // Create Input Layout - - VertexLayout vertexLayout = new VertexLayout(VertexColorTexture.VertexElements, false, textureEffect.VertexShader); - - textureEffect.ReleaseRef(); - - // Create hexagon - { - _geometryBinding = new GeometryBinding(); - _geometryBinding.SetPrimitiveTopology(.TriangleList); - _geometryBinding.SetVertexLayout(vertexLayout); - - float pO3 = Math.PI_f / 3.0f; - VertexColorTexture[?] vertices = .( - VertexColorTexture(.Zero, Color(255,255,255)), - VertexColorTexture(CircleCoord(0), Color(255, 0, 0)), - VertexColorTexture(CircleCoord(pO3), Color(255,255, 0)), - VertexColorTexture(CircleCoord(pO3*2), Color( 0,255, 0)), - VertexColorTexture(CircleCoord(Math.PI_f), Color( 0,255,255)), - VertexColorTexture(CircleCoord(-pO3*2), Color( 0, 0,255)), - VertexColorTexture(CircleCoord(-pO3), Color(255, 0,255)), - ); - - let vb = new VertexBuffer(typeof(VertexColorTexture), (.)vertices.Count, .Immutable); - vb.SetData(vertices); - _geometryBinding.SetVertexBufferSlot(vb, 0); - vb.ReleaseRef(); - - uint16[?] indices = .( - 0, 1, 2, - 0, 2, 3, - 0, 3, 4, - 0, 4, 5, - 0, 5, 6, - 0, 6, 1); - - let ib = new IndexBuffer((.)indices.Count, .Immutable); - ib.SetData(indices); - _geometryBinding.SetIndexBuffer(ib); - ib.ReleaseRef(); - } - - // Create Quad - { - _quadGeometryBinding = new GeometryBinding(); - _quadGeometryBinding.SetPrimitiveTopology(.TriangleList); - _quadGeometryBinding.SetVertexLayout(vertexLayout); - - VertexColorTexture[?] vertices = .( - VertexColorTexture(Vector3(-0.75f, 0.75f, 0), Color.White, .(0, 0)), - VertexColorTexture(Vector3(-0.75f, -0.75f, 0), Color.White, .(0, 1)), - VertexColorTexture(Vector3(0.75f, -0.75f, 0), Color.White, .(1, 1)), - VertexColorTexture(Vector3(0.75f, 0.75f, 0), Color.White, .(1, 0)), - ); - - let qvb = new VertexBuffer(typeof(VertexColorTexture), (.)vertices.Count, .Immutable); - qvb.SetData(vertices); - _quadGeometryBinding.SetVertexBufferSlot(qvb, 0); - qvb.ReleaseRef(); - - uint16[?] indices = .( - 0, 1, 2, - 2, 3, 0); - - let qib = new IndexBuffer((.)indices.Count, .Immutable); - qib.SetData(indices); - _quadGeometryBinding.SetIndexBuffer(qib); - qib.ReleaseRef(); - } - - vertexLayout.ReleaseRef(); - - // Create rasterizer state - RasterizerStateDescription rsDesc = .(.Solid, .Back, true); - _rasterizerState = new RasterizerState(rsDesc); - - rsDesc.FrontCounterClockwise = false; - _rasterizerStateClockWise = new RasterizerState(rsDesc); - - _texture = new Texture2D("content/Textures/Checkerboard.dds"); - _ge_logo = new Texture2D("content/Textures/GE_Logo.dds"); - - let sampler = SamplerStateManager.GetSampler( - SamplerStateDescription() - { - MagFilter = .Point - }); - - _texture.SamplerState = sampler; - _ge_logo.SamplerState = sampler; - - sampler.ReleaseRef(); - - _logoMaterial = new Material(textureEffect); - _logoMaterial.SetTexture("ColorTexture", _ge_logo); - - _checkerMaterial = new Material(textureEffect); - _checkerMaterial.SetTexture("ColorTexture", _texture); - - BlendStateDescription blendDesc = .(); - blendDesc.RenderTarget[0] = .(true, .SourceAlpha, .InvertedSourceAlpha, .Add, .SourceAlpha, .InvertedSourceAlpha, .Add, .All); - _alphaBlendState = new BlendState(blendDesc); - _opaqueBlendState = new BlendState(.Default); - - InitEcs(); - - //_cameraController = new OrthographicCameraController(Application.Get().Window.Context.SwapChain.BackbufferViewport.Width / - // Application.Get().Window.Context.SwapChain.BackbufferViewport.Height); - - _cameraController = new .(Application.Get().Window.Context.SwapChain.BackbufferViewport.Width / - Application.Get().Window.Context.SwapChain.BackbufferViewport.Height); - _cameraController.CameraPosition = .(0, 0, -5); - _cameraController.TranslationSpeed = 10; - - TestLoadModel(); - } - - List Clips = new List() ~ DeleteContainerAndReleaseItems!(_); - - Material animationMat; - - void TestLoadModel() - { - var testEffect = Application.Get().EffectLibrary.Get("testShader"); - var materialTestMaterial = new Material(testEffect); - animationMat = materialTestMaterial; - - Matrix[] matrices = scope Matrix[255]; - Matrix3x3[] matrices2 = scope Matrix3x3[255]; - - for(int i < 255) - { - matrices[i] = .Identity; - matrices2[i] = .Identity; - } - - materialTestMaterial.SetVariable("SkinningMatrices", matrices); - materialTestMaterial.SetVariable("InvTransSkinningMatrices", matrices2); - - materialTestMaterial.SetVariable("BaseColor", Color.White); - materialTestMaterial.SetVariable("LightDir", Vector3(1, 1, -0.5f).Normalized()); - - ModelLoader.LoadModel("content\\Models\\Figure\\Figure.gltf", testEffect, materialTestMaterial, _world, Clips); - - materialTestMaterial.ReleaseRef(); - testEffect.ReleaseRef(); - - for(var (entity, transform, mesh, meshRenderer) in _world.Enumerate()) - { - var animation = _world.AssignComponent(entity); - - animation.AnimationClip = Clips[0]; - animation.TimeScale = 1.0f; - animation.IsPlaying = true; - animation.[Friend]_pose = new SkeletonPose(meshRenderer.Skeleton); - } - } - - Entity evenCrazierParent; - Entity crazyParent; - - Material testMaterial1 ~ _?.ReleaseRef(); - Material testMaterial2 ~ _?.ReleaseRef(); - - void InitEcs() - { - _world.Register(); - _world.Register(); - _world.Register(); - _world.Register(); - _world.Register(); - _world.Register(); - _world.Register(); - _world.Register(); - - var basicEffect = Application.Get().EffectLibrary.Get("basicShader"); - - testMaterial1 = new Material(basicEffect); - testMaterial1.SetVariable("BaseColor", _squareColor0); - testMaterial2 = new Material(basicEffect); - testMaterial2.SetVariable("BaseColor", _squareColor1); - - basicEffect.ReleaseRef(); - /* - Entity[20][20] entities; - - int i = 0; - - for(int x < 20) - for(int y < 20) - { - Entity entity = _world.NewEntity(); - - entities[x][y] = entity; - - var transform = _world.AssignComponent(entity); - *transform = TransformComponent(); - transform.LocalTransform = Matrix.Translation(x * 0.2f, y * 0.2f, 0) * Matrix.Scaling(0.1f); - - var mesh = _world.AssignComponent(entity); - mesh.Mesh = _quadGeometryBinding; - - i++; - - var meshRenderer = _world.AssignComponent(entity); - - if(i % 2 == 0) - meshRenderer.Material = testMaterial1; - else - meshRenderer.Material = testMaterial2; - } - - crazyParent = _world.NewEntity(); - evenCrazierParent = _world.NewEntity(); - - var crazyTransform = _world.AssignComponent(evenCrazierParent); - crazyTransform.Position = .Zero; - crazyTransform.Scale = .One; - crazyTransform.Rotation = .Identity; - - var pp = _world.AssignComponent(crazyParent); - pp.Entity = evenCrazierParent; - - crazyTransform = _world.AssignComponent(crazyParent); - crazyTransform.Position = .Zero; - crazyTransform.Scale = .(2.0f, 2.0f, 2.0f); - crazyTransform.Rotation = .Identity; - - for(int x < 20) - for(int y < 20) - { - var parent = _world.AssignComponent(entities[x][y]); - parent.Entity = crazyParent; - } - */ - } - - float f = 0.0f; - - bool playAnimation = false; - - public override void Update(GameTime gameTime) - { - f += (float)gameTime.FrameTime.TotalSeconds; - - _cameraController.Update(gameTime); - - RenderCommand.Clear(null, .(0.2f, 0.2f, 0.2f)); - RenderCommand.Clear(_depthTarget, .Depth, 1.0f, 0); - - // Draw test geometry - RenderCommand.SetRenderTarget(null); - RenderCommand.SetDepthStencilTarget(_depthTarget); - RenderCommand.BindRenderTargets(); - - RenderCommand.SetViewport(_context.SwapChain.BackbufferViewport); - - Renderer.BeginScene(_cameraController.Camera); - - RenderCommand.SetBlendState(_opaqueBlendState); - - var basicEffect = Application.Get().EffectLibrary.Get("basicShader"); - - RenderCommand.SetRasterizerState(_rasterizerState); - - TransformSystem.Update(_world); - - for(var (entity, transform, mesh, meshRenderer) in _world.Enumerate()) - { - Renderer.Submit(mesh.Mesh, meshRenderer.Material, transform.WorldTransform); - } - - for(var (entity, transform, mesh, meshRenderer, animation) in _world.Enumerate()) - { - var material = meshRenderer.Material; - - var timeIndex = ref animation.TimeIndex; - var currentClip = animation.AnimationClip; - var pose = animation.Pose; - - // Only advance time index if animation is playing - if(animation.IsPlaying) - { - timeIndex += (float)gameTime.FrameTime.TotalSeconds * animation.TimeScale; - - if(currentClip.IsLooping && currentClip.Duration != 0) - { - timeIndex %= currentClip.Duration; - - // modulo can result in negative numbers - if(timeIndex < 0) - timeIndex += currentClip.Duration; - } - } - - var skeleton = currentClip.Skeleton; - - // Update joints - for(int i < skeleton.Joints.Count) - { - ref JointPose localPose = ref pose.LocalPose[i]; - - localPose = currentClip.JointAnimations[i].GetCurrentPose(timeIndex); - - Matrix jointToParent = - Matrix.Translation(localPose.Translation) * - Matrix.RotationQuaternion(localPose.Rotation) * - Matrix.Scaling(localPose.Scale); - - uint8 parentIndex = skeleton.Joints[i].ParentID; - - ref Matrix globalPose = ref pose.GlobalPose[i]; - - if(parentIndex == uint8.MaxValue) - { - globalPose = jointToParent; - } - else - { - globalPose = pose.GlobalPose[parentIndex] * jointToParent; - } - - pose.SkinningMatricies[i] = globalPose * skeleton.Joints[i].InverseBindPose; - pose.InvTransSkinningMatricies[i] = ((Matrix3x3)pose.SkinningMatricies[i]).Inverse().Transpose(); - } - - int i = 0; - for(var globalPose in pose.GlobalPose) - { - Joint currentJoint = meshRenderer.Skeleton.Joints[i]; - - Matrix bindPose = currentJoint.InverseBindPose.Invert(); - - // Draw skeleton - Matrix mat = pose.SkinningMatricies[i] * bindPose; - - uint8 parentId = currentJoint.ParentID; - - if(parentId != uint8.MaxValue) - { - Vector3 start = mat.Translation; - - Joint parent = meshRenderer.Skeleton.Joints[parentId]; - - Matrix parentBindPose = parent.InverseBindPose.Invert(); - - Matrix parentMatrix = pose.SkinningMatricies[parentId] * parentBindPose; - - Vector3 end = parentMatrix.Translation; - - Renderer.DrawLine(start, end, .Black, transform.WorldTransform); - } - - DebugRenderer.DrawCoordinateCross(transform.WorldTransform * mat, 0.5f); - - i++; - } - - material.SetVariable("SkinningMatrices", pose.SkinningMatricies); - material.SetVariable("InvTransSkinningMatrices", pose.InvTransSkinningMatricies); - - // non engine - material.SetVariable("BaseColor", Color.White); - material.SetVariable("LightDir", Vector3(1, 1, -0.5f).Normalized()); - - Renderer.Submit(mesh.Mesh, material, transform.WorldTransform); - } - - basicEffect.Variables["BaseColor"].SetData(_squareColor1); - - _checkerMaterial.SetVariable("BaseColor", Color.White); - - Renderer.Submit(_quadGeometryBinding, _checkerMaterial, Matrix.RotationZ(f) * .Scaling(1.5f)); - - RenderCommand.SetBlendState(_alphaBlendState); - - _logoMaterial.SetVariable("BaseColor", Color.Pink); - - Renderer.Submit(_quadGeometryBinding, _logoMaterial, .Translation(0, 0, -1) * .Scaling(2f)); - - DebugRenderer.Render(_world); - - Renderer.EndScene(); - - basicEffect.ReleaseRef(); - } - - ColorRGBA _squareColor0 = ColorRGBA.CornflowerBlue; - ColorRGBA _squareColor1; - - public override void OnEvent(Event event) - { - _cameraController.OnEvent(event); - - EventDispatcher dispatcher = EventDispatcher(event); - - dispatcher.Dispatch(scope (e) => OnImGuiRender(e)); - dispatcher.Dispatch(scope (e) => OnWindowResize(e)); - } - - private bool OnImGuiRender(ImGuiRenderEvent e) - { - /* - ImGui.Begin("Test"); - - var v = ImGui.ColorEdit3("Square Color", ref _squareColor0); - - if(v) - { - testMaterial1.SetVariable("BaseColor", _squareColor0); - testMaterial2.SetVariable("BaseColor", ColorRGBA.White - _squareColor0); - } - - ImGui.End(); - */ - return false; - } - - private bool OnWindowResize(WindowResizeEvent e) - { - _depthTarget.ReleaseRef(); - _depthTarget = new DepthStencilTarget(_context.SwapChain.Width, _context.SwapChain.Height); - - return false; - } - } - class SandboxApp : Application { public this()