Skip to content

Commit d68ea62

Browse files
committed
WIP: KHR_mesh_quantization support
1 parent 07f7b4c commit d68ea62

File tree

13 files changed

+217
-152
lines changed

13 files changed

+217
-152
lines changed

src/SharpGLTF.Core/Debug/DebuggerDisplay.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ internal static string GetAttributeShortName(string attributeName)
2727
return attributeName;
2828
}
2929

30-
public static String ToReport(this Memory.MemoryAccessInfo minfo)
30+
public static String ToReport(this Memory.MemoryEncoding minfo)
3131
{
3232
var txt = GetAttributeShortName(minfo.Name);
3333
if (minfo.ByteOffset != 0) txt += $" Offs:{minfo.ByteOffset}ᴮʸᵗᵉˢ";
@@ -93,7 +93,7 @@ public static string ToReport(this MeshPrimitive prim, string txt)
9393
if (vcounts.Count() > 1)
9494
{
9595
var vAccessors = prim.VertexAccessors
96-
.OrderBy(item => item.Key, Memory.MemoryAccessInfo.NameComparer)
96+
.OrderBy(item => item.Key, Memory.MemoryEncoding.NameComparer)
9797
.Select(item => $"{GetAttributeShortName(item.Key)}={item.Value.ToReportShort()}")
9898
.ToList();
9999

@@ -109,7 +109,7 @@ string toShort(string name, Accessor accessor)
109109
}
110110

111111
var vAccessors = prim.VertexAccessors
112-
.OrderBy(item => item.Key, Memory.MemoryAccessInfo.NameComparer)
112+
.OrderBy(item => item.Key, Memory.MemoryEncoding.NameComparer)
113113
.Select(item => toShort(item.Key, item.Value))
114114
.ToList();
115115

src/SharpGLTF.Core/IO/ReadContext.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ public SCHEMA2 ReadBinarySchema2(Stream stream)
225225
try
226226
{
227227
root.Deserialize(ref reader);
228+
root.OnDeserializationCompleted();
228229
}
229230
catch (JsonException rex)
230231
{

src/SharpGLTF.Core/Memory/MemoryAccessor.cs

Lines changed: 130 additions & 123 deletions
Large diffs are not rendered by default.

src/SharpGLTF.Core/Schema2/gltf.AccessorSparse.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ internal AccessorSparseValues(BufferView bv, int byteOffset)
150150
internal Memory.MemoryAccessor _GetMemoryAccessor(ROOT root, int count, Accessor baseAccessor)
151151
{
152152
var view = root.LogicalBufferViews[this._bufferView];
153-
var info = new Memory.MemoryAccessInfo(null, this._byteOffset ?? 0, count, view.ByteStride, baseAccessor.Dimensions, baseAccessor.Encoding, baseAccessor.Normalized);
153+
var info = new Memory.MemoryEncoding(null, this._byteOffset ?? 0, count, view.ByteStride, baseAccessor.Dimensions, baseAccessor.Encoding, baseAccessor.Normalized);
154154
return new Memory.MemoryAccessor(view.Content, info);
155155
}
156156

src/SharpGLTF.Core/Schema2/gltf.Accessors.cs

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ internal Accessor()
9393
internal MemoryAccessor _GetMemoryAccessor()
9494
{
9595
var view = SourceBufferView;
96-
var info = new MemoryAccessInfo(null, ByteOffset, Count, view.ByteStride, Dimensions, Encoding, Normalized);
96+
var info = new MemoryEncoding(null, ByteOffset, Count, view.ByteStride, Dimensions, Encoding, Normalized);
9797
return new MemoryAccessor(view.Content, info);
9898
}
9999

@@ -431,9 +431,12 @@ internal void ValidatePositions(Validation.ValidationContext result)
431431
result = result.GetContext(this);
432432

433433
SourceBufferView.ValidateBufferUsageGPU(result, BufferMode.ARRAY_BUFFER);
434-
result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
435-
result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
436434
result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.VEC3);
435+
if (!this.LogicalParent.MeshQuantizationAllowed)
436+
{
437+
result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
438+
result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
439+
}
437440

438441
var positions = this.AsVector3Array();
439442

@@ -448,9 +451,17 @@ internal void ValidateNormals(Validation.ValidationContext result)
448451
result = result.GetContext(this);
449452

450453
SourceBufferView.ValidateBufferUsageGPU(result, BufferMode.ARRAY_BUFFER);
451-
result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
452-
result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
453454
result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.VEC3);
455+
if (!this.LogicalParent.MeshQuantizationAllowed)
456+
{
457+
result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
458+
result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
459+
}
460+
else
461+
{
462+
if (Normalized) result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.BYTE, EncodingType.SHORT);
463+
else result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
464+
}
454465

455466
var normals = this.AsVector3Array();
456467

@@ -468,17 +479,30 @@ internal void ValidateTangents(Validation.ValidationContext result)
468479
result = result.GetContext(this);
469480

470481
SourceBufferView.ValidateBufferUsageGPU(result, BufferMode.ARRAY_BUFFER);
471-
result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
472-
result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
473482
result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.VEC3, DimensionType.VEC4);
483+
if (!this.LogicalParent.MeshQuantizationAllowed)
484+
{
485+
result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
486+
result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
487+
}
488+
else
489+
{
490+
if (Normalized) result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.BYTE, EncodingType.SHORT);
491+
else result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
492+
}
474493

475-
var tangents = this.AsVector4Array();
494+
// when Dimensions == VEC3, its morph target tangent deltas
476495

477-
for (int i = 0; i < tangents.Count; ++i)
496+
if (Dimensions == DimensionType.VEC4)
478497
{
479-
if (result.TryFixTangentOrError(i, tangents[i]))
498+
var tangents = this.AsVector4Array();
499+
500+
for (int i = 0; i < tangents.Count; ++i)
480501
{
481-
tangents[i] = tangents[i].SanitizeTangent();
502+
if (result.TryFixTangentOrError(i, tangents[i]))
503+
{
504+
tangents[i] = tangents[i].SanitizeTangent();
505+
}
482506
}
483507
}
484508
}

src/SharpGLTF.Core/Schema2/gltf.ExtensionsFactory.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,39 @@ internal static string Identify(Type parentType, Type extensionType)
8383

8484
partial class ModelRoot
8585
{
86+
#region properties
87+
88+
public bool MeshQuantizationAllowed { get; private set; }
89+
90+
#endregion
91+
92+
#region API
93+
94+
/// <summary>
95+
/// Immediatelly called after deserialization, it assigns
96+
/// </summary>
97+
private void _FindMeshQuantizationExtension()
98+
{
99+
MeshQuantizationAllowed = this._extensionsRequired.Contains("KHR_mesh_quantization");
100+
}
101+
86102
internal void UpdateExtensionsSupport()
87103
{
88104
var used = RetrieveUsedExtensions();
89105

90106
// update the used list
91107
this._extensionsUsed.Clear();
92108
this._extensionsUsed.AddRange(used);
109+
110+
_SetRequiredExtension("KHR_mesh_quantization", MeshQuantizationAllowed);
111+
}
112+
113+
private void _SetRequiredExtension(string extension, bool enabled)
114+
{
115+
if (!enabled) { this._extensionsRequired.Remove(extension); return; }
116+
117+
if (this._extensionsRequired.Contains(extension)) return;
118+
this._extensionsRequired.Add(extension);
93119
}
94120

95121
internal IEnumerable<ExtraProperties> GetLogicalChildrenFlattened()
@@ -135,5 +161,7 @@ internal void UsingExtension(Type parentType, Type extensionType)
135161

136162
this._extensionsUsed.Add(id);
137163
}
164+
165+
#endregion
138166
}
139167
}

src/SharpGLTF.Core/Schema2/gltf.Serialization.Read.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,11 @@ void _addUri(System.Text.Json.JsonElement property)
198198

199199
#region externals dependencies resolver
200200

201+
internal void OnDeserializationCompleted()
202+
{
203+
_FindMeshQuantizationExtension();
204+
}
205+
201206
internal void _ResolveSatelliteDependencies(IO.ReadContext context)
202207
{
203208
// resolve satellite buffers

src/SharpGLTF.Core/SharpGLTF.Core.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<TargetFramework>netstandard2.0</TargetFramework>
55
<AssemblyName>SharpGLTF.Core</AssemblyName>
66
<RootNamespace>SharpGLTF</RootNamespace>
7-
<LangVersion>latest</LangVersion>
7+
<LangVersion>7.3</LangVersion>
88
<DebugSymbols>true</DebugSymbols>
99
</PropertyGroup>
1010

src/SharpGLTF.Toolkit/Geometry/PrimitiveBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ protected PrimitiveBuilder(MeshBuilder<TMaterial, TvG, TvM, TvS> mesh, Primitive
129129
Guard.NotNull(other, nameof(other));
130130

131131
this._Mesh = mesh;
132-
this._Material = material ?? other.Material;
132+
this._Material = material != null ? material : other.Material;
133133
other._Vertices.CopyTo(this._Vertices);
134134

135135
foreach (var otherMT in other._MorphTargets)

src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexUtils.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ public static MemoryAccessor[] CreateVertexMemoryAccessors<TVertex>(this IReadOn
244244
var vbuffer = new ArraySegment<byte>(new Byte[byteStride * vertices.Count]);
245245

246246
// fill the buffer with the vertex attributes.
247-
var accessors = MemoryAccessInfo
247+
var accessors = MemoryEncoding
248248
.Slice(attributes, 0, vertices.Count)
249249
.Select(item => new MemoryAccessor(vbuffer, item))
250250
.ToArray();
@@ -272,7 +272,7 @@ public static MemoryAccessor CreateIndexMemoryAccessor(this IReadOnlyList<Int32>
272272
{
273273
if (indices == null || indices.Count == 0) return null;
274274

275-
var attribute = new MemoryAccessInfo("INDEX", 0, indices.Count, 0, Schema2.DimensionType.SCALAR, encoding);
275+
var attribute = new MemoryEncoding("INDEX", 0, indices.Count, 0, Schema2.DimensionType.SCALAR, encoding);
276276

277277
// create buffer
278278
var ibytes = new Byte[encoding.ByteLength() * indices.Count];
@@ -286,13 +286,13 @@ public static MemoryAccessor CreateIndexMemoryAccessor(this IReadOnlyList<Int32>
286286
return accessor;
287287
}
288288

289-
public static MemoryAccessInfo[] GetVertexAttributes(this IVertexBuilder firstVertex, int vertexCount, Schema2.EncodingType jointEncoding)
289+
public static MemoryEncoding[] GetVertexAttributes(this IVertexBuilder firstVertex, int vertexCount, Schema2.EncodingType jointEncoding)
290290
{
291291
var tvg = firstVertex.GetGeometry().GetType();
292292
var tvm = firstVertex.GetMaterial().GetType();
293293
var tvs = firstVertex.GetSkinning().GetType();
294294

295-
var attributes = new List<MemoryAccessInfo>();
295+
var attributes = new List<MemoryEncoding>();
296296

297297
foreach (var finfo in tvg.GetFields())
298298
{
@@ -320,12 +320,12 @@ public static MemoryAccessInfo[] GetVertexAttributes(this IVertexBuilder firstVe
320320

321321
var array = attributes.ToArray();
322322

323-
MemoryAccessInfo.SetInterleavedInfo(array, 0, vertexCount);
323+
MemoryEncoding.SetInterleavedInfo(array, 0, vertexCount);
324324

325325
return array;
326326
}
327327

328-
private static MemoryAccessInfo? _GetMemoryAccessInfo(System.Reflection.FieldInfo finfo)
328+
private static MemoryEncoding? _GetMemoryAccessInfo(System.Reflection.FieldInfo finfo)
329329
{
330330
var attribute = finfo.GetCustomAttributes(true)
331331
.OfType<VertexAttributeAttribute>()
@@ -344,7 +344,7 @@ public static MemoryAccessInfo[] GetVertexAttributes(this IVertexBuilder firstVe
344344

345345
if (dimensions == null) throw new ArgumentException($"invalid type {finfo.FieldType}");
346346

347-
return new MemoryAccessInfo(attribute.Name, 0, 0, 0, dimensions.Value, attribute.Encoding, attribute.Normalized);
347+
return new MemoryEncoding(attribute.Name, 0, 0, 0, dimensions.Value, attribute.Encoding, attribute.Normalized);
348348
}
349349

350350
private static Func<IVertexBuilder, Object> _GetVertexBuilderAttributeFunc(string attributeName)

0 commit comments

Comments
 (0)