From 05f42e30cab5b5bc8607af57cf924de399731c8c Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 13 Oct 2020 20:40:39 +0900 Subject: [PATCH] use EnumSerializationType. fix gltf.cameras[].type Serialization * https://github.com/KhronosGroup/glTF-Sample-Models/blob/master/2.0/MultiUVTest/glTF/MultiUVTest.gltf#L192 --- .../Serialization/FieldSerializationInfo.cs | 14 +++++++------- .../Serialization/PrimitiveSerialization.cs | 17 +++++++++++++++-- .../UniGLTF/Scripts/IO/GltfDeserializer.g.cs | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Assets/VRM/UniGLTF/Editor/Serialization/FieldSerializationInfo.cs b/Assets/VRM/UniGLTF/Editor/Serialization/FieldSerializationInfo.cs index 3ca000776..f0236d6d4 100644 --- a/Assets/VRM/UniGLTF/Editor/Serialization/FieldSerializationInfo.cs +++ b/Assets/VRM/UniGLTF/Editor/Serialization/FieldSerializationInfo.cs @@ -51,26 +51,26 @@ namespace UniGLTF Path = path + "/" + fi.Name; m_attr = fi.GetCustomAttributes(true).FirstOrDefault(x => x.GetType() == typeof(JsonSchemaAttribute)) as JsonSchemaAttribute; - Serialization = GetSerialization(m_fi.FieldType, Path); + Serialization = GetSerialization(m_fi.FieldType, Path, m_attr); } - static IValueSerialization GetSerialization(Type t, string path) + static IValueSerialization GetSerialization(Type t, string path, JsonSchemaAttribute attr) { if (t.IsArray) { return new ArraySerialization(t, - GetSerialization(t.GetElementType(), path + "[]")); + GetSerialization(t.GetElementType(), path + "[]", attr)); } else if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>)) { return new ListSerialization(t, - GetSerialization(t.GetGenericArguments()[0], path + "[]")); + GetSerialization(t.GetGenericArguments()[0], path + "[]", attr)); } else if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Dictionary<,>) && t.GetGenericArguments()[0] == typeof(string)) { - return new StringKeyDictionarySerialization(t, - GetSerialization(t.GetGenericArguments()[1], path)); + return new StringKeyDictionarySerialization(t, + GetSerialization(t.GetGenericArguments()[1], path, attr)); } // GetCollectionType(fi.FieldType, out suffix, out t); @@ -124,7 +124,7 @@ namespace UniGLTF } else if (t.IsEnum) { - return new EnumIntSerialization(t); + return new EnumIntSerialization(t, attr.EnumSerializationType); } return new ObjectSerialization(t, path); diff --git a/Assets/VRM/UniGLTF/Editor/Serialization/PrimitiveSerialization.cs b/Assets/VRM/UniGLTF/Editor/Serialization/PrimitiveSerialization.cs index 396aa483f..33d879a95 100644 --- a/Assets/VRM/UniGLTF/Editor/Serialization/PrimitiveSerialization.cs +++ b/Assets/VRM/UniGLTF/Editor/Serialization/PrimitiveSerialization.cs @@ -179,20 +179,33 @@ namespace UniGLTF public class EnumIntSerialization : PrimitiveSerializationBase { Type m_type; + UniJSON.EnumSerializationType m_serializationType; public override Type ValueType { get { return m_type; } } - public EnumIntSerialization(Type t) + public EnumIntSerialization(Type t, UniJSON.EnumSerializationType serializationType) { m_type = t; + m_serializationType = serializationType; } public override string GenerateDeserializerCall(string callName, string argName) { - return string.Format("({0}){1}.GetInt32()", m_type.Name, argName); + switch (m_serializationType) + { + case UniJSON.EnumSerializationType.AsInt: + return string.Format("({0}){1}.GetInt32()", m_type.Name, argName); + + case UniJSON.EnumSerializationType.AsLowerString: + // (ProjectionType)Enum.Parse(typeof(ProjectionType), kv.Value.GetString(), true) + return $"({m_type.Name})Enum.Parse(typeof({m_type.Name}), {argName}.GetString(), true)"; + + default: + throw new NotImplementedException(); + } } } } \ No newline at end of file diff --git a/Assets/VRM/UniGLTF/Scripts/IO/GltfDeserializer.g.cs b/Assets/VRM/UniGLTF/Scripts/IO/GltfDeserializer.g.cs index a2bf59bb8..2912ba9b1 100644 --- a/Assets/VRM/UniGLTF/Scripts/IO/GltfDeserializer.g.cs +++ b/Assets/VRM/UniGLTF/Scripts/IO/GltfDeserializer.g.cs @@ -1861,7 +1861,7 @@ public static glTFCamera Deserialize_gltf_cameras_LIST(ListTreeNode p } if(key=="type"){ - value.type = (ProjectionType)kv.Value.GetInt32(); + value.type = (ProjectionType)Enum.Parse(typeof(ProjectionType), kv.Value.GetString(), true); continue; }