-
Notifications
You must be signed in to change notification settings - Fork 423
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #298 from vrm-c/generate_json_serializer
Generate json serializer
- Loading branch information
Showing
26 changed files
with
6,133 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
115 changes: 115 additions & 0 deletions
115
Assets/VRM/UniGLTF/Editor/Serialization/CollectionSerialization.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
using System; | ||
using System.IO; | ||
|
||
namespace UniGLTF | ||
{ | ||
public class ArraySerialization : FunctionSerializationBase | ||
{ | ||
IValueSerialization m_inner; | ||
|
||
public ArraySerialization(Type t, IValueSerialization inner) | ||
{ | ||
ValueType = t; | ||
m_inner = inner; | ||
} | ||
public override void GenerateDeserializer(StreamWriter writer, string callName) | ||
{ | ||
var itemCallName = callName + "_ARRAY"; | ||
|
||
writer.Write(@" | ||
public static $0 $2(ListTreeNode<JsonValue> parsed) | ||
{ | ||
var value = new $1[parsed.GetArrayCount()]; | ||
int i=0; | ||
foreach(var x in parsed.ArrayItems()) | ||
{ | ||
value[i++] = $3; | ||
} | ||
return value; | ||
} | ||
" | ||
.Replace("$0", UniJSON.JsonSchemaAttribute.GetTypeName(ValueType)) | ||
.Replace("$1", m_inner.ValueType.Name) | ||
.Replace("$2", callName) | ||
.Replace("$3", m_inner.GenerateDeserializerCall(itemCallName, "x")) | ||
); | ||
|
||
if (!m_inner.IsInline) | ||
{ | ||
m_inner.GenerateDeserializer(writer, itemCallName); | ||
} | ||
} | ||
} | ||
|
||
public class ListSerialization : FunctionSerializationBase | ||
{ | ||
IValueSerialization m_inner; | ||
|
||
public ListSerialization(Type t, IValueSerialization inner) | ||
{ | ||
ValueType = t; | ||
m_inner = inner; | ||
} | ||
public override void GenerateDeserializer(StreamWriter writer, string callName) | ||
{ | ||
var itemCallName = callName + "_LIST"; | ||
writer.Write(@" | ||
public static $0 $2(ListTreeNode<JsonValue> parsed) | ||
{ | ||
var value = new List<$1>(); | ||
foreach(var x in parsed.ArrayItems()) | ||
{ | ||
value.Add($3); | ||
} | ||
return value; | ||
}" | ||
.Replace("$0", UniJSON.JsonSchemaAttribute.GetTypeName(ValueType)) | ||
.Replace("$1", m_inner.ValueType.Name) | ||
.Replace("$2", callName) | ||
.Replace("$3", m_inner.GenerateDeserializerCall(itemCallName, "x")) | ||
); | ||
|
||
if (!m_inner.IsInline) | ||
{ | ||
m_inner.GenerateDeserializer(writer, itemCallName); | ||
} | ||
} | ||
} | ||
|
||
public class StringKeyDictionarySerialization : FunctionSerializationBase | ||
{ | ||
IValueSerialization m_inner; | ||
|
||
public StringKeyDictionarySerialization(Type t, IValueSerialization inner) | ||
{ | ||
ValueType = t; | ||
m_inner = inner; | ||
} | ||
public override void GenerateDeserializer(StreamWriter writer, string callName) | ||
{ | ||
var itemCallName = callName + "_DICT"; | ||
writer.Write(@" | ||
public static $0 $2(ListTreeNode<JsonValue> parsed) | ||
{ | ||
var value = new Dictionary<string, $1>(); | ||
foreach(var kv in parsed.ObjectItems()) | ||
{ | ||
value.Add(kv.Key.GetString(), $3); | ||
} | ||
return value; | ||
} | ||
" | ||
.Replace("$0", UniJSON.JsonSchemaAttribute.GetTypeName(ValueType)) | ||
.Replace("$1", m_inner.ValueType.Name) | ||
.Replace("$2", callName) | ||
.Replace("$3", m_inner.GenerateDeserializerCall(itemCallName, "kv.Value")) | ||
); | ||
|
||
if (!m_inner.IsInline) | ||
{ | ||
m_inner.GenerateDeserializer(writer, itemCallName); | ||
} | ||
} | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
Assets/VRM/UniGLTF/Editor/Serialization/CollectionSerialization.cs.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
61 changes: 61 additions & 0 deletions
61
Assets/VRM/UniGLTF/Editor/Serialization/DeserializerGenerator.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
using System.IO; | ||
using System.Reflection; | ||
using System.Text; | ||
using UnityEditor; | ||
using UnityEngine; | ||
|
||
namespace UniGLTF | ||
{ | ||
public static class DeserializerGenerator | ||
{ | ||
public const BindingFlags FIELD_FLAGS = BindingFlags.Instance | BindingFlags.Public; | ||
|
||
static string OutPath | ||
{ | ||
get | ||
{ | ||
return Path.Combine(UnityEngine.Application.dataPath, | ||
"VRM/UniGLTF/Scripts/IO/GltfDeserializer.g.cs"); | ||
} | ||
} | ||
|
||
/// <summary> | ||
/// AOT向けにデシリアライザを生成する | ||
/// </summary> | ||
[MenuItem(VRM.VRMVersion.MENU + "/Generate Deserializer")] | ||
static void GenerateSerializer() | ||
{ | ||
var info = new ObjectSerialization(typeof(glTF), "gltf"); | ||
Debug.Log(info); | ||
|
||
using (var s = File.Open(OutPath, FileMode.Create)) | ||
using (var w = new StreamWriter(s, Encoding.UTF8)) | ||
{ | ||
// header | ||
w.Write(@" | ||
using UniJSON; | ||
using System; | ||
using System.Collections.Generic; | ||
using VRM; | ||
using UnityEngine; | ||
namespace UniGLTF { | ||
public static class GltfDeserializer | ||
{ | ||
"); | ||
|
||
info.GenerateDeserializer(w, "Deserialize"); | ||
|
||
// footer | ||
w.Write(@" | ||
} // GltfDeserializer | ||
} // UniGLTF | ||
"); | ||
|
||
Debug.LogFormat("write: {0}", OutPath); | ||
} | ||
} | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
Assets/VRM/UniGLTF/Editor/Serialization/DeserializerGenerator.cs.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.