diff --git a/src/Runtime/Ghost.Core/Ghost.Core.csproj b/src/Runtime/Ghost.Core/Ghost.Core.csproj
index 7cbe6bf..b334eca 100644
--- a/src/Runtime/Ghost.Core/Ghost.Core.csproj
+++ b/src/Runtime/Ghost.Core/Ghost.Core.csproj
@@ -9,19 +9,20 @@
True
- $(DefineConstants);MHP_ENABLE_SAFETY_CHECKS
+ $(DefineConstants);MHP_ENABLE_SAFETY_CHECKS;MHP_ENABLE_STACKTRACE
True
True
+
True
-
-
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/src/Runtime/Ghost.Graphics.D3D12/D3D12ResourceAllocator.cs b/src/Runtime/Ghost.Graphics.D3D12/D3D12ResourceAllocator.cs
index 90704ee..be6a02f 100644
--- a/src/Runtime/Ghost.Graphics.D3D12/D3D12ResourceAllocator.cs
+++ b/src/Runtime/Ghost.Graphics.D3D12/D3D12ResourceAllocator.cs
@@ -740,7 +740,10 @@ internal sealed unsafe partial class D3D12ResourceAllocator : IResourceAllocator
else
{
hr = CreateResource(&allocationDesc, &resourceDesc, initialState, options, null, (void**)&pAllocation);
- pResource = pAllocation->GetResource();
+ if (hr.SUCCEEDED)
+ {
+ pResource = pAllocation->GetResource();
+ }
}
if (hr.FAILED)
diff --git a/src/Runtime/Ghost.Graphics.RHI/Common.cs b/src/Runtime/Ghost.Graphics.RHI/Common.cs
index 59ff5f9..3d2535a 100644
--- a/src/Runtime/Ghost.Graphics.RHI/Common.cs
+++ b/src/Runtime/Ghost.Graphics.RHI/Common.cs
@@ -132,7 +132,7 @@ public struct Color128 : IEquatable
[StructLayout(LayoutKind.Sequential)]
-public struct Vertex
+public record struct Vertex
{
public static class Semantic
{
@@ -145,11 +145,11 @@ public struct Vertex
public static readonly FixedText32 Color = new("COLOR"u8);
}
- public float4 position;
- public float4 normal;
- public float4 tangent;
- public float4 uv;
public Color128 color;
+ public float4 tangent;
+ public float3 position;
+ public float3 normal;
+ public float2 uv;
}
public readonly struct ShaderVariant;
diff --git a/src/Runtime/Ghost.Graphics/Core/Mesh.cs b/src/Runtime/Ghost.Graphics/Core/Mesh.cs
index ea36c58..db662b7 100644
--- a/src/Runtime/Ghost.Graphics/Core/Mesh.cs
+++ b/src/Runtime/Ghost.Graphics/Core/Mesh.cs
@@ -210,18 +210,20 @@ public struct Mesh : IResourceReleasable
maxVertices = 64,
minTriangles = 32,
maxTriangles = 124,
- partitionSize = 128,
- clusterSpatial = true,
+ partitionSpatial = true,
+ partitionSize = 16,
+ clusterSpatial = false,
+ clusterSplitFactor = 2.0f,
clusterFillWeight = 1.0f,
- clusterSplitFactor = 1.0f,
simplifyRatio = 0.5f,
- simplifyThreshold = 0.5f,
- simplifyErrorMergePrevious = 0.5f,
- simplifyErrorMergeAdditive = 0.5f,
- simplifyErrorFactorSloppy = 1.0f,
- simplifyErrorEdgeLimit = 1.0f,
- optimizeBounds = true,
- optimizeClusters = true
+ simplifyThreshold = 0.85f,
+ simplifyErrorMergePrevious = 1.0f,
+ simplifyErrorFactorSloppy = 2.0f,
+ simplifyPermissive = true,
+ simplifyFallbackPermissive = false,
+ simplifyFallbackSloppy = true,
+ //optimizeBounds = true,
+ //optimizeClusters = true
};
// 2. Map Mesh to ClodMesh
diff --git a/src/Runtime/Ghost.Graphics/Core/RenderingLayerMask.cs b/src/Runtime/Ghost.Graphics/Core/RenderingLayerMask.cs
index 0144ad1..975bc8c 100644
--- a/src/Runtime/Ghost.Graphics/Core/RenderingLayerMask.cs
+++ b/src/Runtime/Ghost.Graphics/Core/RenderingLayerMask.cs
@@ -1,31 +1,7 @@
-using System.Diagnostics;
-
namespace Ghost.Graphics.Core;
public readonly struct RenderingLayerMask : IEquatable
{
- private static readonly Dictionary s_layerNameToBit = new(32);
- private static readonly Dictionary s_bitToLayerName = new(32);
-
- internal static void SetLayerName(int layerIndex, string name)
- {
- Debug.Assert(layerIndex >= 0 && layerIndex < 32, "Layer index must be between 0 and 31.");
-
- var bit = 1u << layerIndex;
- s_layerNameToBit[name] = bit;
- s_bitToLayerName[bit] = name;
- }
-
- public static uint GetLayerBit(string name)
- {
- if (s_layerNameToBit.TryGetValue(name, out var bit))
- {
- return bit;
- }
-
- return 0u;
- }
-
private readonly uint _value;
public static readonly RenderingLayerMask Empty = new(0);
diff --git a/src/Runtime/Ghost.Graphics/Shaders/Includes/Common.hlsl b/src/Runtime/Ghost.Graphics/Shaders/Includes/Common.hlsl
index 4497ba8..8b6bddb 100644
--- a/src/Runtime/Ghost.Graphics/Shaders/Includes/Common.hlsl
+++ b/src/Runtime/Ghost.Graphics/Shaders/Includes/Common.hlsl
@@ -3,11 +3,11 @@
struct Vertex
{
- float4 position;
- float4 normal;
- float4 tangent;
- float4 uv;
float4 color;
+ float4 tangent;
+ float3 position;
+ float3 normal;
+ float2 uv;
};
struct Meshlet
diff --git a/src/Runtime/Ghost.Graphics/Utilities/MeshBuilder.cs b/src/Runtime/Ghost.Graphics/Utilities/MeshBuilder.cs
index d765140..b080836 100644
--- a/src/Runtime/Ghost.Graphics/Utilities/MeshBuilder.cs
+++ b/src/Runtime/Ghost.Graphics/Utilities/MeshBuilder.cs
@@ -17,12 +17,12 @@ public static unsafe class MeshBuilder
vertices = new UnsafeList(24, allocator);
indices = new UnsafeList(36, allocator);
- var corners = new float4[]
+ var corners = new float3[]
{
- new (-half, -half, -half, 1.0f), new (half, -half, -half, 1.0f),
- new (half, half, -half, 1.0f), new (-half, half, -half, 1.0f),
- new (-half, -half, half, 1.0f), new (half, -half, half, 1.0f),
- new (half, half, half, 1.0f), new (-half, half, half, 1.0f)
+ new (-half, -half, -half), new (half, -half, -half),
+ new (half, half, -half), new (-half, half, -half),
+ new (-half, -half, half), new (half, -half, half),
+ new (half, half, half), new (-half, half, half)
};
var faces = stackalloc int[]
@@ -46,10 +46,10 @@ public static unsafe class MeshBuilder
var vertex = new Vertex
{
position = corners[face[i]],
- normal = float4.zero,
+ normal = float3.zero,
tangent = float4.zero,
color = color,
- uv = new(uvs[i], 0.0f, 0.0f)
+ uv = uvs[i]
};
vertices.Add(vertex);
@@ -81,38 +81,38 @@ public static unsafe class MeshBuilder
vertices.Add(new Vertex()
{
- position = new(-hw, 0.0f, -hd, 0.0f),
- normal = float4.zero,
+ position = new float3(-hw, 0.0f, -hd),
+ normal = float3.zero,
tangent = float4.zero,
color = color,
- uv = new(0.0f)
+ uv = float2.zero
});
vertices.Add(new Vertex()
{
- position = new(hw, 0.0f, -hd, 0.0f),
- normal = float4.zero,
+ position = new float3(hw, 0.0f, -hd),
+ normal = float3.zero,
tangent = float4.zero,
color = color,
- uv = new(1.0f, 0.0f, 0.0f, 0.0f)
+ uv = new float2(1.0f, 0.0f)
});
vertices.Add(new Vertex()
{
- position = new(hw, 0.0f, hd, 0.0f),
- normal = float4.zero,
+ position = new float3(hw, 0.0f, hd),
+ normal = float3.zero,
tangent = float4.zero,
color = color,
- uv = new(1.0f, 1.0f, 0.0f, 0.0f)
+ uv = new float2(1.0f, 1.0f)
});
vertices.Add(new Vertex()
{
- position = new(-hw, 0.0f, hd, 0.0f),
- normal = float4.zero,
+ position = new float3(-hw, 0.0f, hd),
+ normal = float3.zero,
tangent = float4.zero,
color = color,
- uv = new(0.0f, 1.0f, 0.0f, 0.0f)
+ uv = new float2(0.0f, 1.0f)
});
indices.Add(0);
@@ -153,11 +153,11 @@ public static unsafe class MeshBuilder
vertices.Add(new Vertex
{
- position = new float4(x, y, z, 0.0f) * radius,
- normal = float4.zero,
+ position = new float3(x, y, z) * radius,
+ normal = float3.zero,
tangent = float4.zero,
color = color,
- uv = new float4((float)lon / longitudeSegments, (float)lat / latitudeSegments, 0.0f, 0.0f)
+ uv = new float2((float)lon / longitudeSegments, (float)lat / latitudeSegments)
});
}
}
@@ -231,7 +231,7 @@ public static unsafe class MeshBuilder
public static void ComputeTangents(UnsafeList vertices, UnsafeList indices)
{
using var scope = AllocationManager.CreateStackScope();
- var bitangents = new UnsafeArray(vertices.Count, scope.AllocationHandle);
+ var bitangents = new UnsafeArray(vertices.Count, scope.AllocationHandle, AllocationOption.Clear);
for (var i = 0; i < indices.Count; i += 3)
{
@@ -269,7 +269,7 @@ public static unsafe class MeshBuilder
for (var i = 0; i < vertices.Count; i++)
{
var n = vertices[i].normal;
- var t = vertices[i].tangent;
+ var t = vertices[i].tangent.xyz;
var proj = n * math.dot(n, t);
t = math.normalize(t - proj);
@@ -277,7 +277,7 @@ public static unsafe class MeshBuilder
var b = bitangents[i];
var w = math.dot(math.cross(n.xyz, t.xyz), b.xyz) < 0.0f ? -1.0f : 1.0f;
- vertices[i].tangent = new float4(t.x, t.y, t.z, w);
+ vertices[i].tangent = new float4(t.xyz, w);
}
}
}
diff --git a/src/Runtime/Ghost.Graphics/Utilities/MeshletUtility.cs b/src/Runtime/Ghost.Graphics/Utilities/MeshletUtility.cs
index 3150141..a774a6f 100644
--- a/src/Runtime/Ghost.Graphics/Utilities/MeshletUtility.cs
+++ b/src/Runtime/Ghost.Graphics/Utilities/MeshletUtility.cs
@@ -582,7 +582,7 @@ public static unsafe class MeshletUtility
}
}
- var targetSize = ((nuint)merged.Count / 3) * (nuint)config.simplifyRatio * 3;
+ var targetSize = (nuint)(merged.Count / 3 * config.simplifyRatio * 3.0f);
var bounds = MergeBounds(clusters, groups[i]);
var error = 0.0f;
diff --git a/src/Runtime/Ghost.Graphics/test.gshdr b/src/Runtime/Ghost.Graphics/test.gshdr
index af6209a..8afea0f 100644
--- a/src/Runtime/Ghost.Graphics/test.gshdr
+++ b/src/Runtime/Ghost.Graphics/test.gshdr
@@ -29,11 +29,12 @@ shader "MyShader/Standard"
hlsl
{
+ #line 31 "MyShader_Standard_Forward_hlsl_block"
struct PixelInput
{
float4 position : SV_POSITION;
float4 color : COLOR;
- float4 uv : TEXCOORD0;
+ float2 uv : TEXCOORD0;
nointerpolation uint meshletID : MESHLET_ID;
};
@@ -72,9 +73,9 @@ shader "MyShader/Standard"
float4 worldPos = mul(instanceData.localToWorld, float4(v.position.xyz, 1.0f));
float4 viewPos = mul(viewData.viewMatrix, worldPos);
- // outVerts[groupThreadID.x].position = mul(viewData.projectionMatrix, viewPos);
+ outVerts[groupThreadID.x].position = mul(viewData.projectionMatrix, viewPos);
// For testing.
- outVerts[groupThreadID.x].position = float4(v.position.xyz, 1.0f);
+ // outVerts[groupThreadID.x].position = v.position.xyz;
outVerts[groupThreadID.x].color = v.color;
outVerts[groupThreadID.x].uv = v.uv;
diff --git a/src/Test/Ghost.Graphics.Test/Ghost.Graphics.Test.csproj b/src/Test/Ghost.Graphics.Test/Ghost.Graphics.Test.csproj
index 2eb85fa..c5b7443 100644
--- a/src/Test/Ghost.Graphics.Test/Ghost.Graphics.Test.csproj
+++ b/src/Test/Ghost.Graphics.Test/Ghost.Graphics.Test.csproj
@@ -53,6 +53,7 @@
+