This commit is contained in:
ousttrue
2021-10-26 00:39:06 +09:00
parent 1802915111
commit 758a9ffff9
12 changed files with 94 additions and 57 deletions

View File

@@ -17,7 +17,6 @@ namespace UniGLTF
public GltfData Data => m_data;
public glTF GLTF => m_data.GLTF;
public IStorage Storage => m_data.Storage;
public readonly Dictionary<SubAssetKey, UnityPath> Textures = new Dictionary<SubAssetKey, UnityPath>();
private readonly IReadOnlyDictionary<SubAssetKey, Texture> m_subAssets;

View File

@@ -246,24 +246,6 @@ namespace UniGLTF
public static ArraySegment<Byte> GetImageBytesFromTextureIndex(this glTF self, IStorage storage, int textureIndex)
{
var imageIndex = self.textures[textureIndex].source;
return self.GetImageBytes(storage, imageIndex);
}
public static ArraySegment<Byte> GetImageBytes(this glTF self, IStorage storage, int imageIndex)
{
var image = self.images[imageIndex];
if (string.IsNullOrEmpty(image.uri))
{
return self.GetViewBytes(image.bufferView);
}
else
{
return storage.Get(image.uri);
}
}
static Utf8String s_extensions = Utf8String.From("extensions");

View File

@@ -40,13 +40,6 @@ namespace UniGLTF
[JsonSchema(MinItems = 1, ExplicitIgnorableItemLength = 0)]
public List<glTFAccessor> accessors = new List<glTFAccessor>();
public ArraySegment<Byte> GetViewBytes(int bufferView)
{
var view = bufferViews[bufferView];
var segment = buffers[view.buffer].GetBytes();
return new ArraySegment<byte>(segment.Array, segment.Offset + view.byteOffset, view.byteLength);
}
#endregion
[JsonSchema(MinItems = 1, ExplicitIgnorableItemLength = 0)]

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
namespace UniGLTF
@@ -58,4 +59,24 @@ namespace UniGLTF
}
}
}
public class GltfStorage : IStorage
{
glTF _gltf;
public GltfStorage(glTF gltf)
{
_gltf = gltf;
}
public ArraySegment<byte> Get(string url)
{
return _gltf.buffers[0].GetBytes();
}
public string GetPath(string url)
{
return null;
}
}
}

View File

@@ -50,7 +50,7 @@ namespace UniGLTF
/// <summary>
/// URI access
/// </summary>
public IStorage Storage { get; }
IStorage _storage;
/// <summary>
/// Migration Flags used by ImporterContext
@@ -63,27 +63,50 @@ namespace UniGLTF
Json = json;
GLTF = gltf;
Chunks = chunks;
Storage = storage;
_storage = storage;
MigrationFlags = migrationFlags;
}
public static GltfData CreateFromGltfDataForTest(glTF gltf)
public static GltfData CreateFromGltfDataForTest(glTF gltf, ArraySegment<byte> bytes = default)
{
IStorage storage = null;
if (bytes.Array != null)
{
storage = new SimpleStorage(bytes);
}
else
{
storage = new GltfStorage(gltf);
}
return new GltfData(
string.Empty,
string.Empty,
gltf,
new List<GlbChunk>(),
new SimpleStorage(new ArraySegment<byte>()),
storage,
new MigrationFlags()
);
}
#region bytes access helper methods. buffer, bufferView, accessor(may sparse), image
public ArraySegment<Byte> GetBytes(int bufferIndex)
{
// TODO:
var buffer = GLTF.buffers[bufferIndex];
return _storage.Get(buffer.uri);
}
public ArraySegment<Byte> GetViewBytes(int bufferView)
{
var view = GLTF.bufferViews[bufferView];
var segment = GetBytes(view.buffer);
return new ArraySegment<byte>(segment.Array, segment.Offset + view.byteOffset, view.byteLength);
}
T[] GetAttrib<T>(int count, int byteOffset, glTFBufferView view) where T : struct
{
var segment = GetBytes(view.buffer);
var attrib = new T[count];
var segment = GLTF.buffers[view.buffer].GetBytes();
var bytes = new ArraySegment<Byte>(segment.Array, segment.Offset + view.byteOffset + byteOffset, count * view.byteStride);
bytes.MarshalCopyTo(attrib);
return attrib;
@@ -207,7 +230,7 @@ namespace UniGLTF
{
var attrib = new float[vertexAccessor.count * vertexAccessor.TypeCount];
var view = GLTF.bufferViews[vertexAccessor.bufferView];
var segment = GLTF.buffers[view.buffer].GetBytes();
var segment = GetBytes(view.buffer);
var bytes = new ArraySegment<Byte>(segment.Array, segment.Offset + view.byteOffset + vertexAccessor.byteOffset, vertexAccessor.count * view.byteStride);
bytes.MarshalCopyTo(attrib);
result = attrib;
@@ -233,6 +256,25 @@ namespace UniGLTF
}
return result;
}
public ArraySegment<Byte> GetImageBytes(int imageIndex)
{
var image = GLTF.images[imageIndex];
if (string.IsNullOrEmpty(image.uri))
{
return GetViewBytes(image.bufferView);
}
else
{
return _storage.Get(image.uri);
}
}
public ArraySegment<Byte> GetImageBytesFromTextureIndex(int textureIndex)
{
var imageIndex = GLTF.textures[textureIndex].source;
return GetImageBytes(imageIndex);
}
#endregion
}
}

View File

@@ -57,7 +57,6 @@ namespace UniGLTF
public GltfData Data { get; }
public String Json => Data.Json;
public glTF GLTF => Data.GLTF;
public IStorage Storage => Data.Storage;
#endregion
// configuration

View File

@@ -35,7 +35,7 @@ namespace UniGLTF
var gltfImage = data.GLTF.images[gltfTexture.source];
var name = TextureImportName.GetUnityObjectName(TextureImportTypes.sRGB, gltfTexture.name, gltfImage.uri);
var sampler = TextureSamplerUtil.CreateSampler(data.GLTF, textureIndex);
GetTextureBytesAsync getTextureBytesAsync = () => Task.FromResult(ToArray(data.GLTF.GetImageBytesFromTextureIndex(data.Storage, textureIndex)));
GetTextureBytesAsync getTextureBytesAsync = () => Task.FromResult(ToArray(data.GetImageBytesFromTextureIndex(textureIndex)));
var param = new TextureDescriptor(name, gltfImage.GetExt(), gltfImage.uri, offset, scale, sampler, TextureImportTypes.sRGB, default, default, getTextureBytesAsync, default, default, default, default, default);
return (param.SubAssetKey, param);
}
@@ -46,7 +46,7 @@ namespace UniGLTF
var gltfImage = data.GLTF.images[gltfTexture.source];
var name = TextureImportName.GetUnityObjectName(TextureImportTypes.Linear, gltfTexture.name, gltfImage.uri);
var sampler = TextureSamplerUtil.CreateSampler(data.GLTF, textureIndex);
GetTextureBytesAsync getTextureBytesAsync = () => Task.FromResult(ToArray(data.GLTF.GetImageBytesFromTextureIndex(data.Storage, textureIndex)));
GetTextureBytesAsync getTextureBytesAsync = () => Task.FromResult(ToArray(data.GetImageBytesFromTextureIndex(textureIndex)));
var param = new TextureDescriptor(name, gltfImage.GetExt(), gltfImage.uri, offset, scale, sampler, TextureImportTypes.Linear, default, default, getTextureBytesAsync, default, default, default, default, default);
return (param.SubAssetKey, param);
}
@@ -57,7 +57,7 @@ namespace UniGLTF
var gltfImage = data.GLTF.images[gltfTexture.source];
var name = TextureImportName.GetUnityObjectName(TextureImportTypes.NormalMap, gltfTexture.name, gltfImage.uri);
var sampler = TextureSamplerUtil.CreateSampler(data.GLTF, textureIndex);
GetTextureBytesAsync getTextureBytesAsync = () => Task.FromResult(ToArray(data.GLTF.GetImageBytesFromTextureIndex(data.Storage, textureIndex)));
GetTextureBytesAsync getTextureBytesAsync = () => Task.FromResult(ToArray(data.GetImageBytesFromTextureIndex(textureIndex)));
var param = new TextureDescriptor(name, gltfImage.GetExt(), gltfImage.uri, offset, scale, sampler, TextureImportTypes.NormalMap, default, default, getTextureBytesAsync, default, default, default, default, default);
return (param.SubAssetKey, param);
}
@@ -73,7 +73,7 @@ namespace UniGLTF
var gltfTexture = data.GLTF.textures[metallicRoughnessTextureIndex.Value];
name = TextureImportName.GetUnityObjectName(TextureImportTypes.StandardMap, gltfTexture.name, data.GLTF.images[gltfTexture.source].uri);
sampler = TextureSamplerUtil.CreateSampler(data.GLTF, metallicRoughnessTextureIndex.Value);
getMetallicRoughnessAsync = () => Task.FromResult(ToArray(data.GLTF.GetImageBytesFromTextureIndex(data.Storage, metallicRoughnessTextureIndex.Value)));
getMetallicRoughnessAsync = () => Task.FromResult(ToArray(data.GetImageBytesFromTextureIndex(metallicRoughnessTextureIndex.Value)));
}
GetTextureBytesAsync getOcclusionAsync = default;
@@ -85,7 +85,7 @@ namespace UniGLTF
name = TextureImportName.GetUnityObjectName(TextureImportTypes.StandardMap, gltfTexture.name, data.GLTF.images[gltfTexture.source].uri);
}
sampler = TextureSamplerUtil.CreateSampler(data.GLTF, occlusionTextureIndex.Value);
getOcclusionAsync = () => Task.FromResult(ToArray(data.GLTF.GetImageBytesFromTextureIndex(data.Storage, occlusionTextureIndex.Value)));
getOcclusionAsync = () => Task.FromResult(ToArray(data.GetImageBytesFromTextureIndex(occlusionTextureIndex.Value)));
}
var texDesc = new TextureDescriptor(name, ".png", null, offset, scale, sampler, TextureImportTypes.StandardMap, metallicFactor, roughnessFactor, getMetallicRoughnessAsync, getOcclusionAsync, default, default, default, default);

View File

@@ -142,8 +142,10 @@ namespace UniGLTF
UnityEngine.Object.DestroyImmediate(mat);
UnityEngine.Object.DestroyImmediate(root);
var data = GltfData.CreateFromGltfDataForTest(gltf);
// Extract Image to Texture2D
var exportedBytes = gltf.GetViewBytes(exportedImage.bufferView).ToArray();
var exportedBytes = data.GetViewBytes(exportedImage.bufferView).ToArray();
var exportedTexture = new Texture2D(2, 2, TextureFormat.ARGB32, mipChain: false, linear: false);
Assert.IsTrue(exportedTexture.LoadImage(exportedBytes)); // Always true ?
Assert.AreEqual(srcTex.width, exportedTexture.width);

View File

@@ -25,7 +25,6 @@ namespace UniGLTF
w.Write(8.0f);
bytes = ms.ToArray();
}
var storage = new SimpleStorage(new ArraySegment<byte>(bytes));
var gltf = new glTF
{
@@ -54,9 +53,9 @@ namespace UniGLTF
}
}
};
gltf.buffers[0].OpenStorage(storage);
var (getter, len) = WeightsAccessor.GetAccessor(GltfData.CreateFromGltfDataForTest(gltf), 0);
var data = GltfData.CreateFromGltfDataForTest(gltf, new ArraySegment<byte>(bytes));
var (getter, len) = WeightsAccessor.GetAccessor(data, 0);
Assert.AreEqual((1.0f, 2.0f, 3.0f, 4.0f), getter(0));
Assert.AreEqual((5.0f, 6.0f, 7.0f, 8.0f), getter(1));
}

View File

@@ -110,7 +110,7 @@ namespace UniVRM10
GetTextureBytesAsync getThumbnailImageBytesAsync = () =>
{
var bytes = data.GLTF.GetImageBytes(data.Storage, imageIndex);
var bytes = data.GetImageBytes(imageIndex);
return Task.FromResult(GltfTextureImporter.ToArray(bytes));
};
var texDesc = new TextureDescriptor(objectName, gltfImage.GetExt(), gltfImage.uri, Vector2.zero, Vector2.one, default, TextureImportTypes.sRGB, default, default,

View File

@@ -69,7 +69,7 @@ namespace UniVRM10
// copy images
foreach (var image in gltf.images)
{
var bytes = gltf.GetViewBytes(image.bufferView);
var bytes = _data.GetViewBytes(image.bufferView);
image.bufferView = AddBuffer(bytes);
}

View File

@@ -47,7 +47,7 @@ namespace UniVRM10
}
}
static void ReverseVector3Array(glTF gltf, int accessorIndex, HashSet<int> used)
static void ReverseVector3Array(GltfData data, int accessorIndex, HashSet<int> used)
{
if (accessorIndex == -1)
{
@@ -59,7 +59,7 @@ namespace UniVRM10
return;
}
var accessor = gltf.accessors[accessorIndex];
var accessor = data.GLTF.accessors[accessorIndex];
var bufferViewIndex = -1;
if (accessor.bufferView != -1)
{
@@ -72,7 +72,7 @@ namespace UniVRM10
if (bufferViewIndex != -1)
{
var buffer = gltf.GetViewBytes(bufferViewIndex);
var buffer = data.GetViewBytes(bufferViewIndex);
var span = SpanLike.Wrap<UnityEngine.Vector3>(buffer);
for (int i = 0; i < span.Length; ++i)
{
@@ -85,35 +85,35 @@ namespace UniVRM10
/// シーンをY軸で180度回転する
/// </summary>
/// <param name="gltf"></param>
public static void Rotate(glTF gltf)
public static void Rotate(GltfData data)
{
foreach (var node in gltf.nodes)
foreach (var node in data.GLTF.nodes)
{
Rotate(node);
}
// mesh の回転のみでよい
var used = new HashSet<int>();
foreach (var mesh in gltf.meshes)
foreach (var mesh in data.GLTF.meshes)
{
foreach (var prim in mesh.primitives)
{
ReverseVector3Array(gltf, prim.attributes.POSITION, used);
ReverseVector3Array(gltf, prim.attributes.NORMAL, used);
ReverseVector3Array(data, prim.attributes.POSITION, used);
ReverseVector3Array(data, prim.attributes.NORMAL, used);
foreach (var target in prim.targets)
{
ReverseVector3Array(gltf, target.POSITION, used);
ReverseVector3Array(gltf, target.NORMAL, used);
ReverseVector3Array(data, target.POSITION, used);
ReverseVector3Array(data, target.NORMAL, used);
}
}
}
foreach (var skin in gltf.skins)
foreach (var skin in data.GLTF.skins)
{
if (used.Add(skin.inverseBindMatrices))
{
var accessor = gltf.accessors[skin.inverseBindMatrices];
var buffer = gltf.GetViewBytes(accessor.bufferView);
var accessor = data.GLTF.accessors[skin.inverseBindMatrices];
var buffer = data.GetViewBytes(accessor.bufferView);
var span = SpanLike.Wrap<UnityEngine.Matrix4x4>(buffer);
for (int i = 0; i < span.Length; ++i)
{