|
4 | 4 |
|
5 | 5 | using SharpGLTF.Validation; |
6 | 6 |
|
7 | | -namespace SharpGLTF.Schema2.Tiles3D |
| 7 | +namespace SharpGLTF.Schema2 |
8 | 8 | { |
9 | | - /// <remarks> |
10 | | - /// This extension is attached to a <see cref="Schema2.MeshPrimitive"/> using <see cref="Tiles3DExtensions.SetCesiumOutline"/> |
11 | | - /// </remarks> |
12 | | - partial class CesiumPrimitiveOutline |
13 | | - { |
14 | | - #region lifecycle |
15 | | - |
16 | | - internal CesiumPrimitiveOutline(MeshPrimitive meshPrimitive) |
17 | | - { |
18 | | - this.meshPrimitive = meshPrimitive; |
19 | | - } |
20 | | - |
21 | | - #endregion |
22 | | - |
23 | | - #region properties |
24 | | - |
25 | | - private MeshPrimitive meshPrimitive; |
26 | | - |
27 | | - public Accessor Indices |
28 | | - { |
29 | | - get |
30 | | - { |
31 | | - return _indices.HasValue |
32 | | - ? meshPrimitive.LogicalParent.LogicalParent.LogicalAccessors[_indices.Value] |
33 | | - : null; |
34 | | - } |
35 | | - set |
36 | | - { |
37 | | - if (value == null) { _indices = null; return; } |
38 | | - |
39 | | - _ValidateAccessor(meshPrimitive.LogicalParent.LogicalParent, value); |
40 | | - |
41 | | - _indices = value.LogicalIndex; |
42 | | - } |
43 | | - } |
44 | | - |
45 | | - #endregion |
46 | | - |
47 | | - #region validation |
48 | | - |
49 | | - protected override void OnValidateReferences(ValidationContext validate) |
50 | | - { |
51 | | - validate.IsNullOrIndex(nameof(Indices), this._indices, meshPrimitive.LogicalParent.LogicalParent.LogicalAccessors); |
52 | | - |
53 | | - base.OnValidateReferences(validate); |
54 | | - } |
55 | | - |
56 | | - protected override void OnValidateContent(ValidationContext validate) |
57 | | - { |
58 | | - var outlineAccessor = meshPrimitive.LogicalParent.LogicalParent.LogicalAccessors[(int)_indices]; |
59 | | - var isValid = _ValidateCesiumOutlineIndices(outlineAccessor, meshPrimitive); |
60 | | - validate.IsTrue(nameof(_indices), isValid, "Mismatch between accesor indices and MeshPrimitive indices"); |
61 | | - |
62 | | - base.OnValidateContent(validate); |
63 | | - } |
64 | | - |
65 | | - internal static void _ValidateAccessor(ModelRoot model, Accessor accessor) |
66 | | - { |
67 | | - Guard.NotNull(accessor, nameof(accessor)); |
68 | | - Guard.MustShareLogicalParent(model, "this", accessor, nameof(accessor)); |
69 | | - Guard.IsTrue(accessor.Encoding == EncodingType.UNSIGNED_INT, nameof(accessor)); |
70 | | - Guard.IsTrue(accessor.Dimensions == DimensionType.SCALAR, nameof(accessor)); |
71 | | - Guard.IsFalse(accessor.Normalized, nameof(accessor)); |
72 | | - } |
73 | | - |
74 | | - /// <summary> |
75 | | - /// Checks if all the indices of the Cesium outline accessor are within the range of in the MeshPrimitive indices |
76 | | - /// </summary> |
77 | | - /// <param name="accessor">Cesium outline accessor</param> |
78 | | - /// <param name="meshPrimitive">MeshPrimitive with the CESIUM_primitive_outline extension</param> |
79 | | - /// <returns>true all indices are available, false indices are missing </returns> |
80 | | - private static bool _ValidateCesiumOutlineIndices(Accessor accessor, MeshPrimitive meshPrimitive) |
81 | | - { |
82 | | - var cesiumOutlineExtension = meshPrimitive.GetExtension<CesiumPrimitiveOutline>(); |
83 | | - if (cesiumOutlineExtension != null) |
84 | | - { |
85 | | - var accessorIndices = accessor.AsIndicesArray(); |
86 | | - var meshPrimitiveIndices = meshPrimitive.GetIndices(); |
87 | | - var maxIndex = meshPrimitiveIndices.Max(); |
88 | | - |
89 | | - foreach (var _ in from accessorIndice in accessorIndices |
90 | | - let contains = accessorIndice <= maxIndex |
91 | | - where !contains |
92 | | - select new { }) |
93 | | - { |
94 | | - return false; |
95 | | - } |
96 | | - } |
97 | | - return true; |
98 | | - } |
99 | | - |
100 | | - #endregion |
101 | | - } |
102 | | - |
| 9 | + using Tiles3D; |
103 | 10 | partial class Tiles3DExtensions |
104 | 11 | { |
105 | 12 | /// <summary> |
@@ -137,4 +44,101 @@ public static void SetCesiumOutline(this MeshPrimitive primitive, Accessor acces |
137 | 44 | ext.Indices = accessor; |
138 | 45 | } |
139 | 46 | } |
| 47 | + |
| 48 | + namespace Tiles3D |
| 49 | + { |
| 50 | + /// <remarks> |
| 51 | + /// This extension is attached to a <see cref="Schema2.MeshPrimitive"/> using <see cref="Tiles3DExtensions.SetCesiumOutline"/> |
| 52 | + /// </remarks> |
| 53 | + partial class CesiumPrimitiveOutline |
| 54 | + { |
| 55 | + #region lifecycle |
| 56 | + |
| 57 | + internal CesiumPrimitiveOutline(MeshPrimitive meshPrimitive) |
| 58 | + { |
| 59 | + this.meshPrimitive = meshPrimitive; |
| 60 | + } |
| 61 | + |
| 62 | + #endregion |
| 63 | + |
| 64 | + #region properties |
| 65 | + |
| 66 | + private MeshPrimitive meshPrimitive; |
| 67 | + |
| 68 | + public Accessor Indices |
| 69 | + { |
| 70 | + get |
| 71 | + { |
| 72 | + return _indices.HasValue |
| 73 | + ? meshPrimitive.LogicalParent.LogicalParent.LogicalAccessors[_indices.Value] |
| 74 | + : null; |
| 75 | + } |
| 76 | + set |
| 77 | + { |
| 78 | + if (value == null) { _indices = null; return; } |
| 79 | + |
| 80 | + _ValidateAccessor(meshPrimitive.LogicalParent.LogicalParent, value); |
| 81 | + |
| 82 | + _indices = value.LogicalIndex; |
| 83 | + } |
| 84 | + } |
| 85 | + |
| 86 | + #endregion |
| 87 | + |
| 88 | + #region validation |
| 89 | + |
| 90 | + protected override void OnValidateReferences(ValidationContext validate) |
| 91 | + { |
| 92 | + validate.IsNullOrIndex(nameof(Indices), this._indices, meshPrimitive.LogicalParent.LogicalParent.LogicalAccessors); |
| 93 | + |
| 94 | + base.OnValidateReferences(validate); |
| 95 | + } |
| 96 | + |
| 97 | + protected override void OnValidateContent(ValidationContext validate) |
| 98 | + { |
| 99 | + var outlineAccessor = meshPrimitive.LogicalParent.LogicalParent.LogicalAccessors[(int)_indices]; |
| 100 | + var isValid = _ValidateCesiumOutlineIndices(outlineAccessor, meshPrimitive); |
| 101 | + validate.IsTrue(nameof(_indices), isValid, "Mismatch between accesor indices and MeshPrimitive indices"); |
| 102 | + |
| 103 | + base.OnValidateContent(validate); |
| 104 | + } |
| 105 | + |
| 106 | + internal static void _ValidateAccessor(ModelRoot model, Accessor accessor) |
| 107 | + { |
| 108 | + Guard.NotNull(accessor, nameof(accessor)); |
| 109 | + Guard.MustShareLogicalParent(model, "this", accessor, nameof(accessor)); |
| 110 | + Guard.IsTrue(accessor.Encoding == EncodingType.UNSIGNED_INT, nameof(accessor)); |
| 111 | + Guard.IsTrue(accessor.Dimensions == DimensionType.SCALAR, nameof(accessor)); |
| 112 | + Guard.IsFalse(accessor.Normalized, nameof(accessor)); |
| 113 | + } |
| 114 | + |
| 115 | + /// <summary> |
| 116 | + /// Checks if all the indices of the Cesium outline accessor are within the range of in the MeshPrimitive indices |
| 117 | + /// </summary> |
| 118 | + /// <param name="accessor">Cesium outline accessor</param> |
| 119 | + /// <param name="meshPrimitive">MeshPrimitive with the CESIUM_primitive_outline extension</param> |
| 120 | + /// <returns>true all indices are available, false indices are missing </returns> |
| 121 | + private static bool _ValidateCesiumOutlineIndices(Accessor accessor, MeshPrimitive meshPrimitive) |
| 122 | + { |
| 123 | + var cesiumOutlineExtension = meshPrimitive.GetExtension<CesiumPrimitiveOutline>(); |
| 124 | + if (cesiumOutlineExtension != null) |
| 125 | + { |
| 126 | + var accessorIndices = accessor.AsIndicesArray(); |
| 127 | + var meshPrimitiveIndices = meshPrimitive.GetIndices(); |
| 128 | + var maxIndex = meshPrimitiveIndices.Max(); |
| 129 | + |
| 130 | + foreach (var _ in from accessorIndice in accessorIndices |
| 131 | + let contains = accessorIndice <= maxIndex |
| 132 | + where !contains |
| 133 | + select new { }) |
| 134 | + { |
| 135 | + return false; |
| 136 | + } |
| 137 | + } |
| 138 | + return true; |
| 139 | + } |
| 140 | + |
| 141 | + #endregion |
| 142 | + } |
| 143 | + } |
140 | 144 | } |
0 commit comments