mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-05-20 09:47:56 -05:00
add NullableSerialization
* Nullable<int> only
This commit is contained in:
parent
787039ea56
commit
80761cc01a
|
|
@ -75,6 +75,10 @@ namespace UniGLTF
|
|||
return new StringKeyDictionarySerialization(t,
|
||||
GetSerialization(t.GetGenericArguments()[1], path, attr, prefix));
|
||||
}
|
||||
else if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>))
|
||||
{
|
||||
return new NullableSerialization(t.GetGenericArguments()[0], path, attr, prefix);
|
||||
}
|
||||
|
||||
// GetCollectionType(fi.FieldType, out suffix, out t);
|
||||
if (t == typeof(sbyte))
|
||||
|
|
|
|||
|
|
@ -0,0 +1,41 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace UniGLTF
|
||||
{
|
||||
public class NullableSerialization : IValueSerialization
|
||||
{
|
||||
public NullableSerialization(Type t, string path, JsonSchemaAttribute attr, string prefix)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public Type ValueType => typeof(Int32);
|
||||
public bool IsInline => true;
|
||||
|
||||
public string CreateSerializationCondition(string argName, JsonSchemaAttribute t)
|
||||
{
|
||||
return $"{argName}.HasValue";
|
||||
}
|
||||
|
||||
public string GenerateSerializerCall(string callName, string argName)
|
||||
{
|
||||
return $"f.Value({argName}.Value)";
|
||||
}
|
||||
|
||||
public void GenerateSerializer(StreamWriter writer, string callName)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public string GenerateDeserializerCall(string callName, string argName)
|
||||
{
|
||||
return argName + ".GetInt32()";
|
||||
}
|
||||
|
||||
public void GenerateDeserializer(StreamWriter writer, string callName)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 84c7673bb94af9f419ca9839910fd8be
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -272,9 +272,9 @@ public static void Serialize_gltf_accessors_ITEM(JsonFormatter f, glTFAccessor v
|
|||
f.BeginMap();
|
||||
|
||||
|
||||
if(value.bufferView>=0){
|
||||
if(value.bufferView.HasValue){
|
||||
f.Key("bufferView");
|
||||
f.Value(value.bufferView);
|
||||
f.Value(value.bufferView.Value);
|
||||
}
|
||||
|
||||
if(value.byteOffset>=0){
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ namespace UniGLTF
|
|||
public class glTFAccessor
|
||||
{
|
||||
[JsonSchema(Minimum = 0)]
|
||||
public int bufferView = -1;
|
||||
public int? bufferView;
|
||||
|
||||
[JsonSchema(Minimum = 0, Dependencies = new string[] { "bufferView" })]
|
||||
public int byteOffset;
|
||||
|
|
|
|||
|
|
@ -208,7 +208,7 @@ namespace UniGLTF
|
|||
public BufferAccessor GetIndicesFromAccessorIndex(int accessorIndex)
|
||||
{
|
||||
var accessor = GLTF.accessors[accessorIndex];
|
||||
var view = GLTF.bufferViews[accessor.bufferView];
|
||||
var view = GLTF.bufferViews[accessor.bufferView.Value];
|
||||
return GetIntIndicesFromView(view, accessor.count, accessor.byteOffset, accessor.componentType);
|
||||
}
|
||||
|
||||
|
|
@ -218,8 +218,8 @@ namespace UniGLTF
|
|||
|
||||
if (vertexAccessor.count <= 0) return NativeArrayManager.CreateNativeArray<T>(0);
|
||||
|
||||
var result = (vertexAccessor.bufferView != -1)
|
||||
? GetTypedFromAccessor<T>(vertexAccessor, GLTF.bufferViews[vertexAccessor.bufferView])
|
||||
var result = (vertexAccessor.bufferView.HasValue)
|
||||
? GetTypedFromAccessor<T>(vertexAccessor, GLTF.bufferViews[vertexAccessor.bufferView.Value])
|
||||
: NativeArrayManager.CreateNativeArray<T>(vertexAccessor.count)
|
||||
;
|
||||
|
||||
|
|
@ -277,9 +277,9 @@ namespace UniGLTF
|
|||
var bufferCount = vertexAccessor.count * vertexAccessor.TypeCount;
|
||||
|
||||
NativeArray<float> result = default;
|
||||
if (vertexAccessor.bufferView != -1)
|
||||
if (vertexAccessor.bufferView.HasValue)
|
||||
{
|
||||
var view = GLTF.bufferViews[vertexAccessor.bufferView];
|
||||
var view = GLTF.bufferViews[vertexAccessor.bufferView.Value];
|
||||
var segment = GetBytesFromBuffer(view.buffer);
|
||||
result = segment.GetSubArray(view.byteOffset + vertexAccessor.byteOffset, vertexAccessor.count * 4 * vertexAccessor.TypeCount).Reinterpret<float>(1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,5 +18,27 @@ namespace UniVRM10
|
|||
index = value;
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool TryGetValidIndex(this int? value, int count, out int index)
|
||||
{
|
||||
if (!value.HasValue)
|
||||
{
|
||||
index = -1;
|
||||
return false;
|
||||
}
|
||||
if (value < 0)
|
||||
{
|
||||
index = -1;
|
||||
return false;
|
||||
}
|
||||
if (value >= count)
|
||||
{
|
||||
index = -1;
|
||||
return false;
|
||||
}
|
||||
|
||||
index = value.Value;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -226,7 +226,7 @@ namespace UniVRM10
|
|||
bool AccessorsIsContinuous(int[] accessorIndices)
|
||||
{
|
||||
var firstAccessor = Gltf.accessors[accessorIndices[0]];
|
||||
var firstView = Gltf.bufferViews[firstAccessor.bufferView];
|
||||
var firstView = Gltf.bufferViews[firstAccessor.bufferView.Value];
|
||||
var start = firstView.byteOffset + firstAccessor.byteOffset;
|
||||
var pos = start;
|
||||
foreach (var i in accessorIndices)
|
||||
|
|
@ -241,7 +241,7 @@ namespace UniVRM10
|
|||
return false;
|
||||
}
|
||||
|
||||
var view = Gltf.bufferViews[current.bufferView];
|
||||
var view = Gltf.bufferViews[current.bufferView.Value];
|
||||
if (pos != view.byteOffset + current.byteOffset)
|
||||
{
|
||||
return false;
|
||||
|
|
@ -267,7 +267,7 @@ namespace UniVRM10
|
|||
{
|
||||
// IndexBufferが連続して格納されている => Slice でいける
|
||||
var firstAccessor = Gltf.accessors[accessorIndices[0]];
|
||||
var firstView = Gltf.bufferViews[firstAccessor.bufferView];
|
||||
var firstView = Gltf.bufferViews[firstAccessor.bufferView.Value];
|
||||
var start = firstView.byteOffset + firstAccessor.byteOffset;
|
||||
if (!firstView.buffer.TryGetValidIndex(Gltf.buffers.Count, out int firstViewBufferIndex))
|
||||
{
|
||||
|
|
@ -295,7 +295,7 @@ namespace UniVRM10
|
|||
{
|
||||
throw new ArgumentException($"accessor.type: {accessor.type}");
|
||||
}
|
||||
var view = Gltf.bufferViews[accessor.bufferView];
|
||||
var view = Gltf.bufferViews[accessor.bufferView.Value];
|
||||
if (!view.buffer.TryGetValidIndex(Gltf.buffers.Count, out int viewBufferIndex))
|
||||
{
|
||||
throw new Exception();
|
||||
|
|
|
|||
|
|
@ -61,9 +61,9 @@ namespace UniVRM10
|
|||
|
||||
var accessor = data.GLTF.accessors[accessorIndex];
|
||||
var bufferViewIndex = -1;
|
||||
if (accessor.bufferView != -1)
|
||||
if (accessor.bufferView.HasValue)
|
||||
{
|
||||
bufferViewIndex = accessor.bufferView;
|
||||
bufferViewIndex = accessor.bufferView.Value;
|
||||
}
|
||||
else if (accessor.sparse?.values != null && accessor.sparse.values.bufferView != -1)
|
||||
{
|
||||
|
|
@ -113,7 +113,7 @@ namespace UniVRM10
|
|||
if (used.Add(skin.inverseBindMatrices))
|
||||
{
|
||||
var accessor = data.GLTF.accessors[skin.inverseBindMatrices];
|
||||
var buffer = data.GetBytesFromBufferView(accessor.bufferView);
|
||||
var buffer = data.GetBytesFromBufferView(accessor.bufferView.Value);
|
||||
var span = buffer.Reinterpret<UnityEngine.Matrix4x4>(1);
|
||||
for (int i = 0; i < span.Length; ++i)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user