static glTF_KHR_texture_transform Deserialize(JsonNode json) { var t = new glTF_KHR_texture_transform(); if (json.Value.ValueType == ValueNodeType.Object) { foreach (var kv in json.ObjectItems()) { var key = kv.Key.GetString(); switch (key) { case nameof(offset): t.offset = DeserializeFloat2(kv.Value).ToArray(); break; case nameof(rotation): t.rotation = kv.Value.GetSingle(); break; case nameof(scale): t.scale = DeserializeFloat2(kv.Value).ToArray(); break; case nameof(texCoord): t.texCoord = kv.Value.GetInt32(); break; default: throw new NotImplementedException(); } } } return(t); }
public static bool TryGet(glTFTextureInfo info, out glTF_KHR_texture_transform t) { if (info != null && info.extensions is glTFExtensionImport imported) { foreach (var kv in imported.ObjectItems()) { if (kv.Key.GetUtf8String() == ExtensionNameUt8) { t = Deserialize(kv.Value); return(true); } } } t = default; return(false); }
public static (Vector2, Vector2) GetTextureOffsetAndScale(glTF_KHR_texture_transform textureTransform) { var offset = new Vector2(0, 0); var scale = new Vector2(1, 1); if (textureTransform != null) { if (textureTransform.offset != null && textureTransform.offset.Length == 2) { offset = new Vector2(textureTransform.offset[0], textureTransform.offset[1]); } if (textureTransform.scale != null && textureTransform.scale.Length == 2) { scale = new Vector2(textureTransform.scale[0], textureTransform.scale[1]); } // UV Coordinate Conversion: glTF(top-left origin) to Unity(bottom-left origin) // Formula: https://github.com/vrm-c/UniVRM/issues/930 offset.y = 1.0f - offset.y - scale.y; } return(offset, scale); }