using System; using System.Collections.Generic; using UnityEngine; using System.IO; using UniJSON; namespace UniGLTF { public static class glTFExtensions { struct ComponentVec { public glComponentType ComponentType; public int ElementCount; public ComponentVec(glComponentType componentType, int elementCount) { ComponentType = componentType; ElementCount = elementCount; } } static Dictionary ComponentTypeMap = new Dictionary { { typeof(Vector2), new ComponentVec(glComponentType.FLOAT, 2) }, { typeof(Vector3), new ComponentVec(glComponentType.FLOAT, 3) }, { typeof(Vector4), new ComponentVec(glComponentType.FLOAT, 4) }, { typeof(UShort4), new ComponentVec(glComponentType.UNSIGNED_SHORT, 4) }, { typeof(Matrix4x4), new ComponentVec(glComponentType.FLOAT, 16) }, { typeof(Color), new ComponentVec(glComponentType.FLOAT, 4) }, }; public static glComponentType GetComponentType() { var cv = default(ComponentVec); if (ComponentTypeMap.TryGetValue(typeof(T), out cv)) { return cv.ComponentType; } else if (typeof(T) == typeof(sbyte)) { return glComponentType.BYTE; } else if (typeof(T) == typeof(byte)) { return glComponentType.UNSIGNED_BYTE; } else if (typeof(T) == typeof(ushort)) { return glComponentType.UNSIGNED_SHORT; } else if (typeof(T) == typeof(uint)) { return glComponentType.UNSIGNED_INT; } else if (typeof(T) == typeof(float)) { return glComponentType.FLOAT; } else { throw new NotImplementedException(typeof(T).Name); } } public static string GetAccessorType() { var cv = default(ComponentVec); if (ComponentTypeMap.TryGetValue(typeof(T), out cv)) { switch (cv.ElementCount) { case 2: return "VEC2"; case 3: return "VEC3"; case 4: return "VEC4"; case 16: return "MAT4"; default: throw new Exception(); } } else { return "SCALAR"; } } static int GetAccessorElementCount() { var cv = default(ComponentVec); if (ComponentTypeMap.TryGetValue(typeof(T), out cv)) { return cv.ElementCount; } else { return 1; } } public static bool IsGeneratedUniGLTFAndOlderThan(string generatorVersion, int major, int minor) { if (string.IsNullOrEmpty(generatorVersion)) return false; if (generatorVersion == "UniGLTF") return true; if (!generatorVersion.FastStartsWith("UniGLTF-")) return false; try { var splitted = generatorVersion.Substring(8).Split('.'); var generatorMajor = int.Parse(splitted[0]); var generatorMinor = int.Parse(splitted[1]); if (generatorMajor < major) { return true; } else if (generatorMajor > major) { return false; } else { if (generatorMinor >= minor) { return false; } else { return true; } } } catch (Exception ex) { Debug.LogWarningFormat("{0}: {1}", generatorVersion, ex); return false; } } static Dictionary<(string, int, int), bool> s_cache = new Dictionary<(string, int, int), bool>(); public static bool IsGeneratedUniGLTFAndOlder(this glTF gltf, int major, int minor) { if (gltf == null) return false; if (gltf.asset == null) return false; var key = (gltf.asset.generator, major, minor); if (s_cache.TryGetValue(key, out bool isOlder)) { return isOlder; } var result = IsGeneratedUniGLTFAndOlderThan(gltf.asset.generator, major, minor); s_cache.Add(key, result); return result; } } }