Merge branch 'master' of https://github.com/vrm-c/UniVRM into controlRig2

This commit is contained in:
Masataka SUMI
2022-09-06 19:52:34 +09:00
31 changed files with 561 additions and 173 deletions

View File

@@ -48,9 +48,20 @@ namespace UniGLTF
public enum Messages
{
[LangMsg(Languages.en, "Materials with fewer sub-meshes")]
[LangMsg(Languages.ja, "サブメッシュ数より少ないマテリアル")]
MATERIALS_LESS_THAN_SUBMESH_COUNT,
[LangMsg(Languages.en, "Materials with more sub-meshes")]
[LangMsg(Languages.ja, "サブメッシュ数より多いマテリアル")]
MATERIALS_GREATER_THAN_SUBMESH_COUNT,
[LangMsg(Languages.en, "Renderer has null in material")]
[LangMsg(Languages.ja, "レンダラーの material に null があります")]
MATERIALS_CONTAINS_NULL,
[LangMsg(Languages.en, "A Shader that cannot be exported")]
[LangMsg(Languages.ja, "エクスポート非対応のシェーダーです")]
UNKNOWN_SHADER,
[LangMsg(Languages.en, "Meshes containing BlendShapes with multiple Frames cannot be exported")]
@@ -79,7 +90,7 @@ namespace UniGLTF
if (info.Materials.Take(info.Mesh.subMeshCount).Any(x => x == null))
{
// material に null が含まれる(unity で magenta になっているはず)
yield return Validation.Error($"{info.Renderers}: {Messages.MATERIALS_CONTAINS_NULL.Msg()}");
yield return Validation.Error(Messages.MATERIALS_CONTAINS_NULL.Msg(), ValidationContext.Create(info.Renderers[0].Item1));
}
}

View File

@@ -475,9 +475,9 @@ public static void Serialize_gltf_textures_ITEM(JsonFormatter f, glTFTexture val
f.Value(value.sampler);
}
if(value.source>=0){
if(value.source.HasValue){
f.Key("source");
f.Value(value.source);
f.Value(value.source.Value);
}
if(value.extensions!=null){

View File

@@ -58,8 +58,7 @@ namespace UniGLTF
[JsonSchema(Minimum = 0)]
public int sampler;
[JsonSchema(Minimum = 0)]
public int source;
public int? source;
// empty schemas
public glTFExtension extensions;

View File

@@ -1,3 +1,4 @@
using System;
using System.IO;
using System.Threading.Tasks;
using UnityEngine;
@@ -14,12 +15,37 @@ namespace UniGLTF
throw new FileNotFoundException(path);
}
Debug.LogFormat("{0}", path);
if (awaitCaller == null)
{
Debug.LogWarning("GltfUtility.LoadAsync: awaitCaller argument is null. ImmediateCaller is used as the default fallback. When playing, we recommend RuntimeOnlyAwaitCaller.");
awaitCaller = new ImmediateCaller();
}
using (GltfData data = new AutoGltfFileParser(path).Parse())
using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
{
return await loader.LoadAsync(awaitCaller);
}
}
public static async Task<RuntimeGltfInstance> LoadBytesAsync(string path, byte[] bytes, IAwaitCaller awaitCaller = null, IMaterialDescriptorGenerator materialGenerator = null)
{
if (bytes == null)
{
throw new ArgumentNullException("bytes");
}
if (awaitCaller == null)
{
Debug.LogWarning("GltfUtility.LoadAsync: awaitCaller argument is null. ImmediateCaller is used as the default fallback. When playing, we recommend RuntimeOnlyAwaitCaller.");
awaitCaller = new ImmediateCaller();
}
using (GltfData data = new GlbBinaryParser(bytes, path).Parse())
using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
{
return await loader.LoadAsync(awaitCaller);
}
}
}
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using VRMShaders;
using ColorSpace = VRMShaders.ColorSpace;
@@ -70,13 +71,15 @@ namespace UniGLTF
var vectors = new Dictionary<string, Vector4>();
var actions = new List<Action<Material>>();
var standardTexDesc = default(TextureDescriptor);
TextureDescriptor? standardTexDesc = default;
if (src.pbrMetallicRoughness != null || src.occlusionTexture != null)
{
if (src.pbrMetallicRoughness.metallicRoughnessTexture != null || src.occlusionTexture != null)
{
SubAssetKey key;
(key, standardTexDesc) = GltfPbrTextureImporter.StandardTexture(data, src);
if (GltfPbrTextureImporter.TryStandardTexture(data, src, out var key, out var desc))
{
standardTexDesc = desc;
}
}
if (src.pbrMetallicRoughness.baseColorFactor != null &&
@@ -90,15 +93,18 @@ namespace UniGLTF
if (src.pbrMetallicRoughness.baseColorTexture != null &&
src.pbrMetallicRoughness.baseColorTexture.index != -1)
{
var (key, textureParam) = GltfPbrTextureImporter.BaseColorTexture(data, src);
textureSlots.Add("_MainTex", textureParam);
if (GltfPbrTextureImporter.TryBaseColorTexture(data, src, out var key, out var desc))
{
textureSlots.Add("_MainTex", desc);
}
}
if (src.pbrMetallicRoughness.metallicRoughnessTexture != null &&
src.pbrMetallicRoughness.metallicRoughnessTexture.index != -1)
src.pbrMetallicRoughness.metallicRoughnessTexture.index != -1 &&
standardTexDesc.HasValue)
{
actions.Add(material => material.EnableKeyword("_METALLICGLOSSMAP"));
textureSlots.Add("_MetallicGlossMap", standardTexDesc);
textureSlots.Add("_MetallicGlossMap", standardTexDesc.Value);
// Set 1.0f as hard-coded. See: https://github.com/dwango/UniVRM/issues/212.
floatValues.Add("_Metallic", 1.0f);
floatValues.Add("_GlossMapScale", 1.0f);
@@ -113,14 +119,16 @@ namespace UniGLTF
if (src.normalTexture != null && src.normalTexture.index != -1)
{
actions.Add(material => material.EnableKeyword("_NORMALMAP"));
var (_, textureParam) = GltfPbrTextureImporter.NormalTexture(data, src);
textureSlots.Add("_BumpMap", textureParam);
floatValues.Add("_BumpScale", src.normalTexture.scale);
if (GltfPbrTextureImporter.TryNormalTexture(data, src, out var key, out var desc))
{
textureSlots.Add("_BumpMap", desc);
floatValues.Add("_BumpScale", src.normalTexture.scale);
}
}
if (src.occlusionTexture != null && src.occlusionTexture.index != -1)
if (src.occlusionTexture != null && src.occlusionTexture.index != -1 && standardTexDesc.HasValue)
{
textureSlots.Add("_OcclusionMap", standardTexDesc);
textureSlots.Add("_OcclusionMap", standardTexDesc.Value);
floatValues.Add("_OcclusionStrength", src.occlusionTexture.strength);
}
@@ -152,8 +160,10 @@ namespace UniGLTF
if (src.emissiveTexture != null && src.emissiveTexture.index != -1)
{
var (key, textureParam) = GltfPbrTextureImporter.EmissiveTexture(data, src);
textureSlots.Add("_EmissionMap", textureParam);
if (GltfPbrTextureImporter.TryEmissiveTexture(data, src, out var key, out var desc))
{
textureSlots.Add("_EmissionMap", desc);
}
}
}

View File

@@ -42,11 +42,11 @@ namespace UniGLTF
// texture
if (src.pbrMetallicRoughness.baseColorTexture != null)
{
var (offset, scale) =
GltfTextureImporter.GetTextureOffsetAndScale(src.pbrMetallicRoughness.baseColorTexture);
var (key, textureParam) = GltfTextureImporter.CreateSrgb(data,
src.pbrMetallicRoughness.baseColorTexture.index, offset, scale);
textureSlots.Add("_MainTex", textureParam);
var (offset, scale) = GltfTextureImporter.GetTextureOffsetAndScale(src.pbrMetallicRoughness.baseColorTexture);
if (GltfTextureImporter.TryCreateSrgb(data, src.pbrMetallicRoughness.baseColorTexture.index, offset, scale, out var key, out var desc))
{
textureSlots.Add("_MainTex", desc);
}
}
matDesc = new MaterialDescriptor(

View File

@@ -42,13 +42,19 @@ namespace UniGLTF
var actions = new List<Action<Material>>();
var src = data.GLTF.materials[i];
var standardTexDesc = default(TextureDescriptor);
TextureDescriptor? standardTexDesc = default;
if (src.pbrMetallicRoughness != null || src.occlusionTexture != null)
{
if (src.pbrMetallicRoughness.metallicRoughnessTexture != null || src.occlusionTexture != null)
{
SubAssetKey key;
(key, standardTexDesc) = GltfPbrTextureImporter.StandardTexture(data, src);
if (GltfPbrTextureImporter.TryStandardTexture(data, src, out var key, out var desc))
{
if (string.IsNullOrEmpty(desc.UnityObjectName))
{
throw new ArgumentNullException();
}
standardTexDesc = desc;
}
}
if (src.pbrMetallicRoughness.baseColorFactor != null && src.pbrMetallicRoughness.baseColorFactor.Length == 4)
@@ -61,15 +67,17 @@ namespace UniGLTF
if (src.pbrMetallicRoughness.baseColorTexture != null && src.pbrMetallicRoughness.baseColorTexture.index != -1)
{
var (key, textureParam) = GltfPbrTextureImporter.BaseColorTexture(data, src);
// from _MainTex !
textureSlots.Add("_BaseMap", textureParam);
if (GltfPbrTextureImporter.TryBaseColorTexture(data, src, out var key, out var desc))
{
// from _MainTex !
textureSlots.Add("_BaseMap", desc);
}
}
if (src.pbrMetallicRoughness.metallicRoughnessTexture != null && src.pbrMetallicRoughness.metallicRoughnessTexture.index != -1)
if (src.pbrMetallicRoughness.metallicRoughnessTexture != null && src.pbrMetallicRoughness.metallicRoughnessTexture.index != -1 && standardTexDesc.HasValue)
{
actions.Add(material => material.EnableKeyword("_METALLICGLOSSMAP"));
textureSlots.Add("_MetallicGlossMap", standardTexDesc);
textureSlots.Add("_MetallicGlossMap", standardTexDesc.Value);
// Set 1.0f as hard-coded. See: https://github.com/dwango/UniVRM/issues/212.
floatValues.Add("_Metallic", 1.0f);
floatValues.Add("_GlossMapScale", 1.0f);
@@ -87,14 +95,16 @@ namespace UniGLTF
if (src.normalTexture != null && src.normalTexture.index != -1)
{
actions.Add(material => material.EnableKeyword("_NORMALMAP"));
var (key, textureParam) = GltfPbrTextureImporter.NormalTexture(data, src);
textureSlots.Add("_BumpMap", textureParam);
floatValues.Add("_BumpScale", src.normalTexture.scale);
if (GltfPbrTextureImporter.TryNormalTexture(data, src, out var key, out var desc))
{
textureSlots.Add("_BumpMap", desc);
floatValues.Add("_BumpScale", src.normalTexture.scale);
}
}
if (src.occlusionTexture != null && src.occlusionTexture.index != -1)
if (src.occlusionTexture != null && src.occlusionTexture.index != -1 && standardTexDesc.HasValue)
{
textureSlots.Add("_OcclusionMap", standardTexDesc);
textureSlots.Add("_OcclusionMap", standardTexDesc.Value);
floatValues.Add("_OcclusionStrength", src.occlusionTexture.strength);
}
@@ -125,8 +135,10 @@ namespace UniGLTF
if (src.emissiveTexture != null && src.emissiveTexture.index != -1)
{
var (key, textureParam) = GltfPbrTextureImporter.EmissiveTexture(data, src);
textureSlots.Add("_EmissionMap", textureParam);
if (GltfPbrTextureImporter.TryEmissiveTexture(data, src, out var key, out var desc))
{
textureSlots.Add("_EmissionMap", desc);
}
}
}

View File

@@ -107,7 +107,6 @@ namespace UniGLTF
MeshData data,
Func<int, Material> materialFromIndex)
{
Profiler.BeginSample("MeshUploader.BuildMesh");
//Debug.Log(prims.ToJson());
var mesh = new Mesh
@@ -150,7 +149,6 @@ namespace UniGLTF
await BuildBlendShapeAsync(awaitCaller, mesh, blendShape, emptyVertices);
}
}
Profiler.EndSample();
Profiler.BeginSample("Mesh.UploadMeshData");
mesh.UploadMeshData(false);

View File

@@ -172,16 +172,19 @@ namespace UniGLTF
for (var textureIdx = 0; textureIdx < GLTF.textures.Count; ++textureIdx)
{
var gltfTexture = GLTF.textures[textureIdx];
var gltfImage = GLTF.images[gltfTexture.source];
if (!string.IsNullOrEmpty(gltfImage.uri) && !gltfImage.uri.StartsWith("data:"))
if (gltfTexture.source.HasValidIndex())
{
// from image uri
gltfTexture.name = Path.GetFileNameWithoutExtension(gltfImage.uri);
}
if (string.IsNullOrEmpty(gltfTexture.name))
{
// use image name
gltfTexture.name = gltfImage.name;
var gltfImage = GLTF.images[gltfTexture.source.Value];
if (!string.IsNullOrEmpty(gltfImage.uri) && !gltfImage.uri.StartsWith("data:"))
{
// from image uri
gltfTexture.name = Path.GetFileNameWithoutExtension(gltfImage.uri);
}
if (string.IsNullOrEmpty(gltfTexture.name))
{
// use image name
gltfTexture.name = gltfImage.name;
}
}
if (string.IsNullOrEmpty(gltfTexture.name))
{

View File

@@ -15,7 +15,10 @@ namespace UniGLTF
// base color
if (m.pbrMetallicRoughness?.baseColorTexture != null)
{
yield return BaseColorTexture(data, m);
if (TryBaseColorTexture(data, m, out var key, out var desc))
{
yield return (key, desc);
}
}
// metallic roughness
@@ -28,13 +31,19 @@ namespace UniGLTF
// emission
if (m.emissiveTexture != null)
{
yield return EmissiveTexture(data, m);
if (TryEmissiveTexture(data, m, out var key, out var desc))
{
yield return (key, desc);
}
}
// normal
if (m.normalTexture != null)
{
yield return NormalTexture(data, m);
if (TryNormalTexture(data, m, out var key, out var desc))
{
yield return (key, desc);
}
}
// occlusion
@@ -47,17 +56,20 @@ namespace UniGLTF
// metallicSmooth and occlusion
if (metallicRoughnessTexture.HasValue || occlusionTexture.HasValue)
{
yield return StandardTexture(data, m);
if (TryStandardTexture(data, m, out var key, out var desc))
{
yield return (key, desc);
}
}
}
public static (SubAssetKey, TextureDescriptor) BaseColorTexture(GltfData data, glTFMaterial src)
public static bool TryBaseColorTexture(GltfData data, glTFMaterial src, out SubAssetKey key, out TextureDescriptor desc)
{
var (offset, scale) = GltfTextureImporter.GetTextureOffsetAndScale(src.pbrMetallicRoughness.baseColorTexture);
return GltfTextureImporter.CreateSrgb(data, src.pbrMetallicRoughness.baseColorTexture.index, offset, scale);
return GltfTextureImporter.TryCreateSrgb(data, src.pbrMetallicRoughness.baseColorTexture.index, offset, scale, out key, out desc);
}
public static (SubAssetKey, TextureDescriptor) StandardTexture(GltfData data, glTFMaterial src)
public static bool TryStandardTexture(GltfData data, glTFMaterial src, out SubAssetKey key, out TextureDescriptor desc)
{
var metallicFactor = 1.0f;
var roughnessFactor = 1.0f;
@@ -67,25 +79,24 @@ namespace UniGLTF
roughnessFactor = src.pbrMetallicRoughness.roughnessFactor;
}
var (offset, scale) = GltfTextureImporter.GetTextureOffsetAndScale(src.pbrMetallicRoughness.metallicRoughnessTexture);
return GltfTextureImporter.CreateStandard(data,
return GltfTextureImporter.TryCreateStandard(data,
src.pbrMetallicRoughness?.metallicRoughnessTexture?.index,
src.occlusionTexture?.index,
offset, scale,
metallicFactor,
roughnessFactor);
roughnessFactor, out key, out desc);
}
public static (SubAssetKey, TextureDescriptor) NormalTexture(GltfData data, glTFMaterial src)
public static bool TryNormalTexture(GltfData data, glTFMaterial src, out SubAssetKey key, out TextureDescriptor desc)
{
var (offset, scale) = GltfTextureImporter.GetTextureOffsetAndScale(src.normalTexture);
return GltfTextureImporter.CreateNormal(data, src.normalTexture.index, offset, scale);
return GltfTextureImporter.TryCreateNormal(data, src.normalTexture.index, offset, scale, out key, out desc);
}
public static (SubAssetKey, TextureDescriptor) EmissiveTexture(GltfData data, glTFMaterial src)
public static bool TryEmissiveTexture(GltfData data, glTFMaterial src, out SubAssetKey key, out TextureDescriptor desc)
{
var (offset, scale) = GltfTextureImporter.GetTextureOffsetAndScale(src.emissiveTexture);
return GltfTextureImporter.CreateSrgb(data, src.emissiveTexture.index, offset, scale);
return GltfTextureImporter.TryCreateSrgb(data, src.emissiveTexture.index, offset, scale, out key, out desc);
}
}
}

View File

@@ -35,13 +35,20 @@ namespace UniGLTF
return (texDesc.SubAssetKey, texDesc);
}
public static (SubAssetKey, TextureDescriptor) CreateSrgb(GltfData data, int textureIndex, Vector2 offset, Vector2 scale)
public static bool TryCreateSrgb(GltfData data, int textureIndex, Vector2 offset, Vector2 scale, out SubAssetKey key, out TextureDescriptor desc)
{
var gltfTexture = data.GLTF.textures[textureIndex];
var gltfImage = data.GLTF.images[gltfTexture.source];
if (!gltfTexture.source.HasValidIndex())
{
key = default;
desc = default;
return false;
}
var gltfImage = data.GLTF.images[gltfTexture.source.Value];
var name = TextureImportName.GetUnityObjectName(TextureImportTypes.sRGB, gltfTexture.name, gltfImage.uri);
var sampler = TextureSamplerUtil.CreateSampler(data.GLTF, textureIndex);
var param = new TextureDescriptor(
desc = new TextureDescriptor(
name,
offset, scale,
sampler,
@@ -50,16 +57,24 @@ namespace UniGLTF
default,
() => Task.FromResult(GetImageBytesFromTextureIndex(data, textureIndex)),
default, default, default, default, default);
return (param.SubAssetKey, param);
key = desc.SubAssetKey;
return true;
}
public static (SubAssetKey, TextureDescriptor) CreateLinear(GltfData data, int textureIndex, Vector2 offset, Vector2 scale)
public static bool TryCreateLinear(GltfData data, int textureIndex, Vector2 offset, Vector2 scale, out SubAssetKey key, out TextureDescriptor desc)
{
var gltfTexture = data.GLTF.textures[textureIndex];
var gltfImage = data.GLTF.images[gltfTexture.source];
if (!gltfTexture.source.HasValidIndex())
{
key = default;
desc = default;
return false;
}
var gltfImage = data.GLTF.images[gltfTexture.source.Value];
var name = TextureImportName.GetUnityObjectName(TextureImportTypes.Linear, gltfTexture.name, gltfImage.uri);
var sampler = TextureSamplerUtil.CreateSampler(data.GLTF, textureIndex);
var param = new TextureDescriptor(
desc = new TextureDescriptor(
name,
offset,
scale,
@@ -69,16 +84,24 @@ namespace UniGLTF
default,
() => Task.FromResult(GetImageBytesFromTextureIndex(data, textureIndex)),
default, default, default, default, default);
return (param.SubAssetKey, param);
key = desc.SubAssetKey;
return true;
}
public static (SubAssetKey, TextureDescriptor) CreateNormal(GltfData data, int textureIndex, Vector2 offset, Vector2 scale)
public static bool TryCreateNormal(GltfData data, int textureIndex, Vector2 offset, Vector2 scale, out SubAssetKey key, out TextureDescriptor desc)
{
var gltfTexture = data.GLTF.textures[textureIndex];
var gltfImage = data.GLTF.images[gltfTexture.source];
if (!gltfTexture.source.HasValidIndex())
{
key = default;
desc = default;
return false;
}
var gltfImage = data.GLTF.images[gltfTexture.source.Value];
var name = TextureImportName.GetUnityObjectName(TextureImportTypes.NormalMap, gltfTexture.name, gltfImage.uri);
var sampler = TextureSamplerUtil.CreateSampler(data.GLTF, textureIndex);
var param = new TextureDescriptor(
desc = new TextureDescriptor(
name,
offset,
scale,
@@ -88,10 +111,11 @@ namespace UniGLTF
default,
() => Task.FromResult(GetImageBytesFromTextureIndex(data, textureIndex)),
default, default, default, default, default);
return (param.SubAssetKey, param);
key = desc.SubAssetKey;
return true;
}
public static (SubAssetKey, TextureDescriptor) CreateStandard(GltfData data, int? metallicRoughnessTextureIndex, int? occlusionTextureIndex, Vector2 offset, Vector2 scale, float metallicFactor, float roughnessFactor)
public static bool TryCreateStandard(GltfData data, int? metallicRoughnessTextureIndex, int? occlusionTextureIndex, Vector2 offset, Vector2 scale, float metallicFactor, float roughnessFactor, out SubAssetKey key, out TextureDescriptor desc)
{
string name = default;
@@ -100,24 +124,37 @@ namespace UniGLTF
if (metallicRoughnessTextureIndex.HasValue)
{
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(GetImageBytesFromTextureIndex(data, metallicRoughnessTextureIndex.Value));
if (gltfTexture.source.HasValidIndex())
{
name = TextureImportName.GetUnityObjectName(TextureImportTypes.StandardMap, gltfTexture.name, data.GLTF.images[gltfTexture.source.Value].uri);
sampler = TextureSamplerUtil.CreateSampler(data.GLTF, metallicRoughnessTextureIndex.Value);
getMetallicRoughnessAsync = () => Task.FromResult(GetImageBytesFromTextureIndex(data, metallicRoughnessTextureIndex.Value));
}
}
GetTextureBytesAsync getOcclusionAsync = default;
if (occlusionTextureIndex.HasValue)
{
var gltfTexture = data.GLTF.textures[occlusionTextureIndex.Value];
if (string.IsNullOrEmpty(name))
if (gltfTexture.source.HasValidIndex())
{
name = TextureImportName.GetUnityObjectName(TextureImportTypes.StandardMap, gltfTexture.name, data.GLTF.images[gltfTexture.source].uri);
if (string.IsNullOrEmpty(name))
{
name = TextureImportName.GetUnityObjectName(TextureImportTypes.StandardMap, gltfTexture.name, data.GLTF.images[gltfTexture.source.Value].uri);
}
sampler = TextureSamplerUtil.CreateSampler(data.GLTF, occlusionTextureIndex.Value);
getOcclusionAsync = () => Task.FromResult(GetImageBytesFromTextureIndex(data, occlusionTextureIndex.Value));
}
sampler = TextureSamplerUtil.CreateSampler(data.GLTF, occlusionTextureIndex.Value);
getOcclusionAsync = () => Task.FromResult(GetImageBytesFromTextureIndex(data, occlusionTextureIndex.Value));
}
var texDesc = new TextureDescriptor(
if (string.IsNullOrEmpty(name))
{
key = default;
desc = default;
return false;
}
desc = new TextureDescriptor(
name,
offset,
scale,
@@ -128,7 +165,13 @@ namespace UniGLTF
getMetallicRoughnessAsync,
getOcclusionAsync,
default, default, default, default);
return (texDesc.SubAssetKey, texDesc);
key = desc.SubAssetKey;
if (string.IsNullOrEmpty(desc.UnityObjectName))
{
throw new ArgumentNullException();
}
Debug.Log("${name}");
return true;
}
public static (Vector2, Vector2) GetTextureOffsetAndScale(glTFTextureInfo textureInfo)

View File

@@ -301,8 +301,10 @@ namespace VRM
meta.Title = gltfMeta.title;
if (gltfMeta.texture >= 0)
{
var (key, param) = GltfTextureImporter.CreateSrgb(Data, gltfMeta.texture, Vector2.zero, Vector2.one);
meta.Thumbnail = await TextureFactory.GetTextureAsync(param, awaitCaller) as Texture2D;
if (GltfTextureImporter.TryCreateSrgb(Data, gltfMeta.texture, Vector2.zero, Vector2.one, out var key, out var desc))
{
meta.Thumbnail = await TextureFactory.GetTextureAsync(desc, awaitCaller) as Texture2D;
}
}
meta.AllowedUser = gltfMeta.allowedUser;
meta.ViolentUssage = gltfMeta.violentUssage;

View File

@@ -85,9 +85,9 @@ namespace VRM
foreach (var kv in vrmMaterial.textureProperties)
{
if (VRMMToonTextureImporter.TryGetTextureFromMaterialProperty(data, vrmMaterial, kv.Key,
out var texture))
out var key, out var desc))
{
textureSlots.Add(kv.Key, texture.Item2);
textureSlots.Add(kv.Key, desc);
}
}

View File

@@ -12,13 +12,13 @@ namespace VRM
var vrmMaterial = vrm.materialProperties[materialIdx];
foreach (var kv in vrmMaterial.textureProperties)
{
if (TryGetTextureFromMaterialProperty(data, vrmMaterial, kv.Key, out var texture))
if (TryGetTextureFromMaterialProperty(data, vrmMaterial, kv.Key, out var key, out var desc))
{
yield return texture;
yield return (key, desc);
}
}
}
public static bool TryGetTextureFromMaterialProperty(GltfData data, glTF_VRM_Material vrmMaterial, string textureKey, out (SubAssetKey, TextureDescriptor) texture)
public static bool TryGetTextureFromMaterialProperty(GltfData data, glTF_VRM_Material vrmMaterial, string textureKey, out SubAssetKey key, out TextureDescriptor desc)
{
// 任意の shader の import を許容する
if (/*vrmMaterial.shader == MToon.Utils.ShaderName &&*/ vrmMaterial.textureProperties.TryGetValue(textureKey, out var textureIdx))
@@ -33,16 +33,14 @@ namespace VRM
switch (textureKey)
{
case MToon.Utils.PropBumpMap:
texture = GltfTextureImporter.CreateNormal(data, textureIdx, offset, scale);
break;
return GltfTextureImporter.TryCreateNormal(data, textureIdx, offset, scale, out key, out desc);
default:
texture = GltfTextureImporter.CreateSrgb(data, textureIdx, offset, scale);
break;
return GltfTextureImporter.TryCreateSrgb(data, textureIdx, offset, scale, out key, out desc);
}
return true;
}
texture = default;
key = default;
desc = default;
return false;
}

View File

@@ -48,9 +48,9 @@ namespace VRM
if (vrmMaterial.textureProperties.ContainsKey(UnlitTransparentZWriteMainTexturePropName))
{
if (VRMMToonTextureImporter.TryGetTextureFromMaterialProperty(data, vrmMaterial,
UnlitTransparentZWriteMainTexturePropName, out var texture))
UnlitTransparentZWriteMainTexturePropName, out var key, out var desc))
{
textureSlots.Add(MToon.Utils.PropMainTex, texture.Item2);
textureSlots.Add(MToon.Utils.PropMainTex, desc);
}
}

View File

@@ -59,21 +59,21 @@ namespace VRM
}
// Thumbnail
if (TryGetThumbnailTexture(data, vrm, out var thumbnail))
if (TryGetThumbnailTexture(data, vrm, out var key, out var desc))
{
yield return thumbnail;
yield return (key, desc);
}
}
private static bool TryGetThumbnailTexture(GltfData data, glTF_VRM_extensions vrm, out (SubAssetKey, TextureDescriptor) texture)
private static bool TryGetThumbnailTexture(GltfData data, glTF_VRM_extensions vrm, out SubAssetKey key, out TextureDescriptor desc)
{
if (vrm.meta.texture > -1)
{
texture = GltfTextureImporter.CreateSrgb(data, vrm.meta.texture, Vector2.zero, Vector2.one);
return true;
return GltfTextureImporter.TryCreateSrgb(data, vrm.meta.texture, Vector2.zero, Vector2.one, out key, out desc);
}
texture = default;
key = default;
desc = default;
return false;
}
}

View File

@@ -60,5 +60,57 @@ namespace VRM
}
}
}
public static async Task<RuntimeGltfInstance> LoadBytesAsync(string path,
byte[] bytes,
IAwaitCaller awaitCaller = null,
MaterialGeneratorCallback materialGeneratorCallback = null,
MetaCallback metaCallback = null,
bool loadAnimation = false
)
{
if (bytes == null)
{
throw new ArgumentNullException("bytes");
}
if (awaitCaller == null)
{
Debug.LogWarning("VrmUtility.LoadAsync: awaitCaller argument is null. ImmediateCaller is used as the default fallback. When playing, we recommend RuntimeOnlyAwaitCaller.");
awaitCaller = new ImmediateCaller();
}
using (GltfData data = new GlbBinaryParser(bytes, path).Parse())
{
try
{
var vrm = new VRMData(data);
IMaterialDescriptorGenerator materialGen = default;
if (materialGeneratorCallback != null)
{
materialGen = materialGeneratorCallback(vrm.VrmExtension);
}
using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGen, loadAnimation: loadAnimation))
{
if (metaCallback != null)
{
var meta = await loader.ReadMetaAsync(awaitCaller, true);
metaCallback(meta);
}
return await loader.LoadAsync(awaitCaller);
}
}
catch (NotVrm0Exception)
{
// retry
Debug.LogWarning("file extension is vrm. but not vrm ?");
using (var loader = new UniGLTF.ImporterContext(data))
{
return await loader.LoadAsync(awaitCaller);
}
}
}
}
}
}

View File

@@ -70,11 +70,37 @@ namespace UniVRM10
var toVec = (Source.position - transform.position).normalized;
var fromToQuat = Quaternion.FromToRotation(fromVec, toVec);
transform.rotation = Quaternion.SlerpUnclamped(
transform.localRotation = Quaternion.SlerpUnclamped(
_dstRestLocalQuat,
Quaternion.Inverse(dstParentWorldQuat) * fromToQuat * dstParentWorldQuat * _dstRestLocalQuat,
Weight
);
}
public void OnDrawGizmosSelected()
{
if (Source == null)
{
return;
}
Gizmos.color = Color.magenta;
Gizmos.DrawLine(transform.position, Source.position);
Gizmos.DrawSphere(Source.position, 0.01f);
Gizmos.matrix = transform.localToWorldMatrix;
var len = 0.1f;
switch (AimAxis)
{
case AimAxis.PositiveX:
Gizmos.color = Color.red;
Gizmos.DrawLine(Vector3.zero, Vector3.right * len);
break;
case AimAxis.NegativeX:
Gizmos.color = Color.red;
Gizmos.DrawLine(Vector3.zero, Vector3.left * len);
break;
}
}
}
}

View File

@@ -0,0 +1,18 @@
namespace UniVRM10
{
public static class Vrm10ConstraintUtil
{
/// <summary>
/// 右手系と左手系を相互に変換する
/// </summary>
public static UniGLTF.Extensions.VRMC_node_constraint.AimAxis ReverseX(UniGLTF.Extensions.VRMC_node_constraint.AimAxis src)
{
switch (src)
{
case UniGLTF.Extensions.VRMC_node_constraint.AimAxis.PositiveX: return UniGLTF.Extensions.VRMC_node_constraint.AimAxis.NegativeX;
case UniGLTF.Extensions.VRMC_node_constraint.AimAxis.NegativeX: return UniGLTF.Extensions.VRMC_node_constraint.AimAxis.PositiveX;
default: return src;
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e2c7b76ebe42e9543ac52153ea9f2728
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -12,175 +12,180 @@ namespace UniVRM10
{
public static IEnumerable<(string key, (SubAssetKey, TextureDescriptor))> EnumerateAllTextures(GltfData data, glTFMaterial material, VRMC_materials_mtoon mToon)
{
if (TryGetBaseColorTexture(data, material, out var litTex))
if (TryGetBaseColorTexture(data, material, out var key, out var desc))
{
yield return (MToon10Prop.BaseColorTexture.ToUnityShaderLabName(), litTex);
yield return (MToon10Prop.BaseColorTexture.ToUnityShaderLabName(), (key, desc));
}
if (TryGetEmissiveTexture(data, material, out var emissiveTex))
if (TryGetEmissiveTexture(data, material, out key, out desc))
{
yield return (MToon10Prop.EmissiveTexture.ToUnityShaderLabName(), emissiveTex);
yield return (MToon10Prop.EmissiveTexture.ToUnityShaderLabName(), (key, desc));
}
if (TryGetNormalTexture(data, material, out var normalTex))
if (TryGetNormalTexture(data, material, out key, out desc))
{
yield return (MToon10Prop.NormalTexture.ToUnityShaderLabName(), normalTex);
yield return (MToon10Prop.NormalTexture.ToUnityShaderLabName(), (key, desc));
}
if (TryGetShadeMultiplyTexture(data, mToon, out var shadeTex))
if (TryGetShadeMultiplyTexture(data, mToon, out key, out desc))
{
yield return (MToon10Prop.ShadeColorTexture.ToUnityShaderLabName(), shadeTex);
yield return (MToon10Prop.ShadeColorTexture.ToUnityShaderLabName(), (key, desc));
}
if (TryGetShadingShiftTexture(data, mToon, out var shadeShiftTex))
if (TryGetShadingShiftTexture(data, mToon, out key, out desc))
{
yield return (MToon10Prop.ShadingShiftTexture.ToUnityShaderLabName(), shadeShiftTex);
yield return (MToon10Prop.ShadingShiftTexture.ToUnityShaderLabName(), (key, desc));
}
if (TryGetMatcapTexture(data, mToon, out var matcapTex))
if (TryGetMatcapTexture(data, mToon, out key, out desc))
{
yield return (MToon10Prop.MatcapTexture.ToUnityShaderLabName(), matcapTex);
yield return (MToon10Prop.MatcapTexture.ToUnityShaderLabName(), (key, desc));
}
if (TryGetRimMultiplyTexture(data, mToon, out var rimTex))
if (TryGetRimMultiplyTexture(data, mToon, out key, out desc))
{
yield return (MToon10Prop.RimMultiplyTexture.ToUnityShaderLabName(), rimTex);
yield return (MToon10Prop.RimMultiplyTexture.ToUnityShaderLabName(), (key, desc));
}
if (TryGetOutlineWidthMultiplyTexture(data, mToon, out var outlineTex))
if (TryGetOutlineWidthMultiplyTexture(data, mToon, out key, out desc))
{
yield return (MToon10Prop.OutlineWidthMultiplyTexture.ToUnityShaderLabName(), outlineTex);
yield return (MToon10Prop.OutlineWidthMultiplyTexture.ToUnityShaderLabName(), (key, desc));
}
if (TryGetUvAnimationMaskTexture(data, mToon, out var uvAnimMaskTex))
if (TryGetUvAnimationMaskTexture(data, mToon, out key, out desc))
{
yield return (MToon10Prop.UvAnimationMaskTexture.ToUnityShaderLabName(), uvAnimMaskTex);
yield return (MToon10Prop.UvAnimationMaskTexture.ToUnityShaderLabName(), (key, desc));
}
}
private static bool TryGetBaseColorTexture(GltfData data, glTFMaterial src, out (SubAssetKey, TextureDescriptor) pair)
private static bool TryGetBaseColorTexture(GltfData data, glTFMaterial src, out SubAssetKey key, out TextureDescriptor desc)
{
try
{
pair = GltfPbrTextureImporter.BaseColorTexture(data, src);
return true;
return GltfPbrTextureImporter.TryBaseColorTexture(data, src, out key, out desc);
}
catch (NullReferenceException)
{
pair = default;
key = default;
desc = default;
return false;
}
catch (ArgumentOutOfRangeException)
{
pair = default;
key = default;
desc = default;
return false;
}
}
private static bool TryGetEmissiveTexture(GltfData data, glTFMaterial src, out (SubAssetKey, TextureDescriptor) pair)
private static bool TryGetEmissiveTexture(GltfData data, glTFMaterial src, out SubAssetKey key, out TextureDescriptor desc)
{
try
{
pair = GltfPbrTextureImporter.EmissiveTexture(data, src);
return true;
return GltfPbrTextureImporter.TryEmissiveTexture(data, src, out key, out desc);
}
catch (NullReferenceException)
{
pair = default;
key = default;
desc = default;
return false;
}
catch (ArgumentOutOfRangeException)
{
pair = default;
key = default;
desc = default;
return false;
}
}
private static bool TryGetNormalTexture(GltfData data, glTFMaterial src, out (SubAssetKey, TextureDescriptor) pair)
private static bool TryGetNormalTexture(GltfData data, glTFMaterial src, out SubAssetKey key, out TextureDescriptor desc)
{
try
{
pair = GltfPbrTextureImporter.NormalTexture(data, src);
return true;
return GltfPbrTextureImporter.TryNormalTexture(data, src, out key, out desc);
}
catch (NullReferenceException)
{
pair = default;
key = default;
desc = default;
return false;
}
catch (ArgumentOutOfRangeException)
{
pair = default;
key = default;
desc = default;
return false;
}
}
private static bool TryGetShadeMultiplyTexture(GltfData data, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureDescriptor) pair)
private static bool TryGetShadeMultiplyTexture(GltfData data, VRMC_materials_mtoon mToon, out SubAssetKey key, out TextureDescriptor desc)
{
return TryGetSRGBTexture(data, new Vrm10TextureInfo(mToon.ShadeMultiplyTexture), out pair);
return TryGetSRGBTexture(data, new Vrm10TextureInfo(mToon.ShadeMultiplyTexture), out key, out desc);
}
private static bool TryGetShadingShiftTexture(GltfData data, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureDescriptor) pair)
private static bool TryGetShadingShiftTexture(GltfData data, VRMC_materials_mtoon mToon, out SubAssetKey key, out TextureDescriptor desc)
{
return TryGetLinearTexture(data, new Vrm10TextureInfo(mToon.ShadingShiftTexture), out pair);
return TryGetLinearTexture(data, new Vrm10TextureInfo(mToon.ShadingShiftTexture), out key, out desc);
}
private static bool TryGetMatcapTexture(GltfData data, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureDescriptor) pair)
private static bool TryGetMatcapTexture(GltfData data, VRMC_materials_mtoon mToon, out SubAssetKey key, out TextureDescriptor desc)
{
return TryGetSRGBTexture(data, new Vrm10TextureInfo(mToon.MatcapTexture), out pair);
return TryGetSRGBTexture(data, new Vrm10TextureInfo(mToon.MatcapTexture), out key, out desc);
}
private static bool TryGetRimMultiplyTexture(GltfData data, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureDescriptor) pair)
private static bool TryGetRimMultiplyTexture(GltfData data, VRMC_materials_mtoon mToon, out SubAssetKey key, out TextureDescriptor desc)
{
return TryGetSRGBTexture(data, new Vrm10TextureInfo(mToon.RimMultiplyTexture), out pair);
return TryGetSRGBTexture(data, new Vrm10TextureInfo(mToon.RimMultiplyTexture), out key, out desc);
}
private static bool TryGetOutlineWidthMultiplyTexture(GltfData data, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureDescriptor) pair)
private static bool TryGetOutlineWidthMultiplyTexture(GltfData data, VRMC_materials_mtoon mToon, out SubAssetKey key, out TextureDescriptor desc)
{
return TryGetLinearTexture(data, new Vrm10TextureInfo(mToon.OutlineWidthMultiplyTexture), out pair);
return TryGetLinearTexture(data, new Vrm10TextureInfo(mToon.OutlineWidthMultiplyTexture), out key, out desc);
}
private static bool TryGetUvAnimationMaskTexture(GltfData data, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureDescriptor) pair)
private static bool TryGetUvAnimationMaskTexture(GltfData data, VRMC_materials_mtoon mToon, out SubAssetKey key, out TextureDescriptor desc)
{
return TryGetLinearTexture(data, new Vrm10TextureInfo(mToon.UvAnimationMaskTexture), out pair);
return TryGetLinearTexture(data, new Vrm10TextureInfo(mToon.UvAnimationMaskTexture), out key, out desc);
}
private static bool TryGetSRGBTexture(GltfData data, Vrm10TextureInfo info, out (SubAssetKey, TextureDescriptor) pair)
private static bool TryGetSRGBTexture(GltfData data, Vrm10TextureInfo info, out SubAssetKey key, out TextureDescriptor desc)
{
try
{
var (offset, scale) = GetTextureOffsetAndScale(info);
pair = GltfTextureImporter.CreateSrgb(data, info.index, offset, scale);
return true;
return GltfTextureImporter.TryCreateSrgb(data, info.index, offset, scale, out key, out desc);
}
catch (NullReferenceException)
{
pair = default;
key = default;
desc = default;
return false;
}
catch (ArgumentOutOfRangeException)
{
pair = default;
key = default;
desc = default;
return false;
}
}
private static bool TryGetLinearTexture(GltfData data, Vrm10TextureInfo info, out (SubAssetKey, TextureDescriptor) pair)
private static bool TryGetLinearTexture(GltfData data, Vrm10TextureInfo info, out SubAssetKey key, out TextureDescriptor desc)
{
try
{
var (offset, scale) = GetTextureOffsetAndScale(info);
pair = GltfTextureImporter.CreateLinear(data, info.index, offset, scale);
return true;
return GltfTextureImporter.TryCreateLinear(data, info.index, offset, scale, out key, out desc);
}
catch (NullReferenceException)
{
pair = default;
key = default;
desc = default;
return false;
}
catch (ArgumentOutOfRangeException)
{
pair = default;
key = default;
desc = default;
return false;
}
}

View File

@@ -430,7 +430,7 @@ namespace UniVRM10
{
Source = model.Nodes.IndexOf(converter.Nodes[aimConstraint.Source.gameObject]),
Weight = aimConstraint.Weight,
AimAxis = aimConstraint.AimAxis,
AimAxis = Vrm10ConstraintUtil.ReverseX(aimConstraint.AimAxis),
};
break;

View File

@@ -701,7 +701,7 @@ namespace UniVRM10
var component = node.gameObject.AddComponent<Vrm10AimConstraint>();
component.Source = Nodes[aim.Source.Value]; // required
component.Weight = aim.Weight.GetValueOrDefault(1.0f);
component.AimAxis = aim.AimAxis; // required
component.AimAxis = Vrm10ConstraintUtil.ReverseX(aim.AimAxis); // required
}
else if (constraint.Rotation != null)
{

View File

@@ -0,0 +1,51 @@
using System;
using System.Threading.Tasks;
namespace VRMShaders
{
/// <summary>
/// Runtime (Build 後と、Editor Playing) での非同期ロードを実現する AwaitCaller.
/// WebGL など Thread が無いもの向け
/// </summary>
public sealed class RuntimeOnlyNoThreadAwaitCaller : IAwaitCaller
{
private readonly NextFrameTaskScheduler _scheduler;
public RuntimeOnlyNoThreadAwaitCaller()
{
_scheduler = new NextFrameTaskScheduler();
}
public Task NextFrame()
{
var tcs = new TaskCompletionSource<object>();
_scheduler.Enqueue(() => tcs.SetResult(default));
return tcs.Task;
}
public Task Run(Action action)
{
try
{
action();
return Task.FromResult<object>(null);
}
catch (Exception ex)
{
return Task.FromException(ex);
}
}
public Task<T> Run<T>(Func<T> action)
{
try
{
return Task.FromResult(action());
}
catch (Exception ex)
{
return Task.FromException<T>(ex);
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6d3630f9fecf62f4a8137907b0f7beb2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -55,9 +55,14 @@ namespace VRMShaders
public SubAssetKey(Type type, string name)
{
if (type == null || string.IsNullOrEmpty(name))
if (type == null)
{
throw new System.ArgumentNullException();
throw new System.ArgumentNullException("type");
}
if (string.IsNullOrEmpty(name))
{
throw new System.ArgumentNullException("name");
}
if (!type.IsSubclassOf(typeof(UnityEngine.Object)))

View File

@@ -52,6 +52,10 @@ namespace VRMShaders
GetTextureBytesAsync i4,
GetTextureBytesAsync i5)
{
if (string.IsNullOrEmpty(name))
{
throw new ArgumentNullException("name");
}
UnityObjectName = name;
Offset = offset;
Scale = scale;

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ccb1849bc34bcd740ba2e17462125200
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,21 @@
mergeInto(LibraryManager.library, {
WebGLFileDialog: function () {
const file_input_id = "file-input";
var file_input = document.getElementById(file_input_id);
if (!file_input) {
file_input = document.createElement('input');
file_input.setAttribute('type', 'file');
file_input.setAttribute('id', file_input_id);
// file_input.setAttribute('accept', '.vrm')
file_input.style.visibility = 'hidden';
file_input.onclick = function (event) {
event.target.value = null;
};
file_input.onchange = function (event) {
SendMessage('Canvas', 'FileSelected', URL.createObjectURL(event.target.files[0]));
}
document.body.appendChild(file_input);
}
file_input.click();
},
});

View File

@@ -0,0 +1,32 @@
fileFormatVersion: 2
guid: 2e8941ad33d65584f8ef2f8b829a05e7
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
WebGL: WebGL
second:
enabled: 1
settings: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,6 +1,8 @@
using System;
using System.Collections;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using UniGLTF;
using UniHumanoid;
@@ -11,10 +13,13 @@ using VRMShaders;
namespace VRM.SimpleViewer
{
public class ViewerUI : MonoBehaviour
{
#if UNITY_WEBGL
[DllImport("__Internal")]
private static extern void WebGLFileDialog();
#endif
#region UI
[SerializeField]
Text m_version = default;
@@ -353,10 +358,29 @@ namespace VRM.SimpleViewer
}
}
IEnumerator LoadTexture(string url)
{
var www = new WWW(url);
yield return www;
LoadModelAsync("tmp.vrm", www.bytes);
}
public void FileSelected(string url)
{
Debug.Log($"FileSelected: {url}");
StartCoroutine(LoadTexture(url));
}
void OnOpenClicked()
{
#if UNITY_STANDALONE_WIN
var path = FileDialogForWindows.FileDialog("open VRM", "vrm", "glb", "bvh", "gltf", "zip");
#elif UNITY_WEBGL
{
WebGLFileDialog();
return;
}
var path = "";
#elif UNITY_EDITOR
var path = UnityEditor.EditorUtility.OpenFilePanel("Open VRM", "", "vrm");
#else
@@ -370,8 +394,11 @@ namespace VRM.SimpleViewer
LoadModelAsync(path);
}
async void LoadModelAsync(string path)
async void LoadModelAsync(string path, byte[] bytes = null)
{
var size = bytes != null ? bytes.Length : 0;
Debug.Log($"LoadModelAsync: {path}: {size}bytes");
var ext = Path.GetExtension(path).ToLower();
switch (ext)
{
@@ -379,7 +406,7 @@ namespace VRM.SimpleViewer
case ".glb":
case ".zip":
{
var instance = await GltfUtility.LoadAsync(path,
var instance = await GltfUtility.LoadBytesAsync(path, bytes,
GetIAwaitCaller(m_useAsync.isOn),
GetGltfMaterialGenerator(m_useUrpMaterial.isOn));
break;
@@ -389,7 +416,7 @@ namespace VRM.SimpleViewer
{
VrmUtility.MaterialGeneratorCallback materialCallback = (VRM.glTF_VRM_extensions vrm) => GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm);
VrmUtility.MetaCallback metaCallback = m_texts.UpdateMeta;
var instance = await VrmUtility.LoadAsync(path, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback, loadAnimation: m_loadAnimation.isOn);
var instance = await VrmUtility.LoadBytesAsync(path, bytes, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback, loadAnimation: m_loadAnimation.isOn);
SetModel(instance);
break;
}
@@ -433,7 +460,11 @@ namespace VRM.SimpleViewer
{
if (useAsync)
{
#if UNITY_WEBGL
return new RuntimeOnlyNoThreadAwaitCaller();
#else
return new RuntimeOnlyAwaitCaller();
#endif
}
else
{