internal static void ValidateVertexAttributes(VALIDATIONCTX result, IReadOnlyDictionary <string, Accessor> attributes, int skinsMaxJointCount) { if (result.TryFix) { foreach (var kvp in attributes.Where(item => item.Key != "POSITION")) { // remove unnecessary bounds kvp.Value._min.Clear(); kvp.Value._max.Clear(); } } if (attributes.TryGetValue("POSITION", out Accessor positions)) { positions._ValidatePositions(result); } else { result.AddSemanticWarning("No POSITION attribute found."); } if (attributes.TryGetValue("NORMAL", out Accessor normals)) { normals._ValidateNormals(result); } if (attributes.TryGetValue("TANGENT", out Accessor tangents)) { tangents._ValidateTangents(result); } if (normals == null && tangents != null) { result.AddSemanticWarning("TANGENT", "attribute without NORMAL found."); } if (attributes.TryGetValue("JOINTS_0", out Accessor joints0)) { joints0._ValidateJoints(result, "JOINTS_0", skinsMaxJointCount); } if (attributes.TryGetValue("JOINTS_1", out Accessor joints1)) { joints0._ValidateJoints(result, "JOINTS_1", skinsMaxJointCount); } attributes.TryGetValue("WEIGHTS_0", out Accessor weights0); attributes.TryGetValue("WEIGHTS_1", out Accessor weights1); _ValidateWeights(result, weights0, weights1); }