Merge branch 'master' into urp_xrmotionvector

This commit is contained in:
Masataka SUMI 2025-09-11 10:15:04 +09:00 committed by GitHub
commit 2dfb7b222f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
42 changed files with 631 additions and 141 deletions

View File

@ -33,7 +33,7 @@ jobs:
UNITY_VERSION=`cat ${PROJECT_VERSION_PATH} | sed -n -E "s/^m_EditorVersion:\s+//p" | head -n 1`
UNITY_CHANGESET=`cat ${PROJECT_VERSION_PATH} | sed -n -E "s/^m_EditorVersionWithRevision:\s+\S+\s+\((\S+)\)/\1/p" | head -n 1`
UNITY_EDITOR_EXECUTABLE=`"${UNITY_HUB}" -- --headless editors --installed | \
sed -n -E "s/^${UNITY_VERSION} , installed at //p" | \
sed -n -E "s/^${UNITY_VERSION} installed at //p" | \
head -n 1`
if [ -z "${UNITY_EDITOR_EXECUTABLE}" ]; then

View File

@ -5,14 +5,18 @@ using UnityEngine;
namespace UniGLTF
{
/// <summary>
/// GLTF の MaterialImporter
/// A class that generates MaterialDescriptor by considering the extensions included in the glTF data to be imported.
/// </summary>
public sealed class BuiltInGltfMaterialDescriptorGenerator : IMaterialDescriptorGenerator
{
public BuiltInGltfPbrMaterialImporter PbrMaterialImporter { get; } = new();
public BuiltInGltfDefaultMaterialImporter DefaultMaterialImporter { get; } = new();
public BuiltInGltfUnlitMaterialImporter UnlitMaterialImporter { get; } = new();
public MaterialDescriptor Get(GltfData data, int i)
{
if (BuiltInGltfUnlitMaterialImporter.TryCreateParam(data, i, out var param)) return param;
if (BuiltInGltfPbrMaterialImporter.TryCreateParam(data, i, out param)) return param;
if (UnlitMaterialImporter.TryCreateParam(data, i, out var param)) return param;
if (PbrMaterialImporter.TryCreateParam(data, i, out param)) return param;
// fallback
if (Symbols.VRM_DEVELOP)
@ -22,6 +26,6 @@ namespace UniGLTF
return GetGltfDefault(GltfMaterialImportUtils.ImportMaterialName(i, null));
}
public MaterialDescriptor GetGltfDefault(string materialName = null) => BuiltInGltfDefaultMaterialImporter.CreateParam(materialName);
public MaterialDescriptor GetGltfDefault(string materialName = null) => DefaultMaterialImporter.CreateParam(materialName);
}
}

View File

@ -5,16 +5,28 @@ using UnityEngine;
namespace UniGLTF
{
/// <summary>
/// Generate the descriptor of the glTF default material.
/// A class that generates MaterialDescriptor for "Standard" shader based on glTF default Material specification.
///
/// https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#default-material
/// </summary>
public static class BuiltInGltfDefaultMaterialImporter
public class BuiltInGltfDefaultMaterialImporter
{
public static MaterialDescriptor CreateParam(string materialName = null)
/// <summary>
/// Can be replaced with custom shaders that are compatible with "Standard" properties and keywords.
/// </summary>
public Shader Shader { get; set; }
public BuiltInGltfDefaultMaterialImporter(Shader shader = null)
{
Shader = shader != null ? shader : Shader.Find("Standard");
}
public MaterialDescriptor CreateParam(string materialName = null)
{
// FIXME
return new MaterialDescriptor(
string.IsNullOrEmpty(materialName) ? "__default__" : materialName,
BuiltInGltfPbrMaterialImporter.Shader,
Shader,
default,
new Dictionary<string, TextureDescriptor>(),
new Dictionary<string, float>(),

View File

@ -5,44 +5,16 @@ using UnityEngine;
namespace UniGLTF
{
/// <summary>
/// Gltf から MaterialImportParam に変換する
///
/// StandardShader variables
///
/// _Color
/// _MainTex
/// _Cutoff
/// _Glossiness
/// _Metallic
/// _MetallicGlossMap
/// _BumpScale
/// _BumpMap
/// _Parallax
/// _ParallaxMap
/// _OcclusionStrength
/// _OcclusionMap
/// _EmissionColor
/// _EmissionMap
/// _DetailMask
/// _DetailAlbedoMap
/// _DetailNormalMapScale
/// _DetailNormalMap
/// _UVSec
/// _EmissionScaleUI
/// _EmissionColorUI
/// _Mode
/// _SrcBlend
/// _DstBlend
/// _ZWrite
/// A class that generates MaterialDescriptor for "Standard" shader based on glTF Material specification.
///
/// https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#materials
/// </summary>
public static class BuiltInGltfPbrMaterialImporter
public class BuiltInGltfPbrMaterialImporter
{
private static readonly int SrcBlend = Shader.PropertyToID("_SrcBlend");
private static readonly int DstBlend = Shader.PropertyToID("_DstBlend");
private static readonly int ZWrite = Shader.PropertyToID("_ZWrite");
private static readonly int Cutoff = Shader.PropertyToID("_Cutoff");
public static Shader Shader => Shader.Find("Standard");
private enum BlendMode
{
@ -52,7 +24,17 @@ namespace UniGLTF
Transparent
}
public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc)
/// <summary>
/// Can be replaced with custom shaders that are compatible with "Standard" properties and keywords.
/// </summary>
public Shader Shader { get; set; }
public BuiltInGltfPbrMaterialImporter(Shader shader = null)
{
Shader = shader != null ? shader : Shader.Find("Standard");
}
public bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc)
{
if (i < 0 || i >= data.GLTF.materials.Count)
{

View File

@ -5,13 +5,26 @@ using UnityEngine;
namespace UniGLTF
{
public static class BuiltInGltfUnlitMaterialImporter
/// <summary>
/// A class that generates MaterialDescriptor for "UnGLTF/UniUnlit" shader based on glTF Extension "KHR_materials_unlit".
///
/// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_unlit
/// </summary>
public class BuiltInGltfUnlitMaterialImporter
{
private static readonly int Cutoff = Shader.PropertyToID("_Cutoff");
public static Shader Shader => Shader.Find(UniUnlitUtil.ShaderName);
/// <summary>
/// Can be replaced with custom shaders that are compatible with "UniGLTF/UniUnlit" properties and keywords.
/// </summary>
public Shader Shader { get; set; }
public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc)
public BuiltInGltfUnlitMaterialImporter(Shader shader = null)
{
Shader = shader != null ? shader : Shader.Find(UniUnlitUtil.ShaderName);
}
public bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc)
{
if (i < 0 || i >= data.GLTF.materials.Count)
{

View File

@ -6,12 +6,15 @@ using UnityEngine.Rendering;
namespace UniGLTF
{
/// <summary>
/// Generate the descriptor of the glTF default material.
/// A class that generates MaterialDescriptor for "Universal Render Pipeline/Lit" shader based on glTF default Material specification.
///
/// https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#default-material
/// </summary>
public class UrpGltfDefaultMaterialImporter
{
/// <summary>
/// Can be replaced with custom shaders that are compatible with "Universal Render Pipeline/Lit" properties and keywords.
/// </summary>
public Shader Shader { get; set; }
public UrpGltfDefaultMaterialImporter(Shader shader = null)

View File

@ -7,14 +7,14 @@ using UnityEngine.Rendering;
namespace UniGLTF
{
/// <summary>
/// glTF PBR to URP Lit.
///
/// see: https://github.com/Unity-Technologies/Graphics/blob/v7.5.3/com.unity.render-pipelines.universal/Editor/UniversalRenderPipelineMaterialUpgrader.cs#L354-L379
/// A class that generates MaterialDescriptor for "Universal Render Pipeline/Lit" shader based on glTF Material specification.
///
/// https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#materials
/// </summary>
public class UrpGltfPbrMaterialImporter
{
/// <summary>
/// Universal Render Pipeline/Lit とプロパティやキーワードに互換があるカスタムシェーダに置換可能。
/// Can be replaced with custom shaders that are compatible with "Universal Render Pipeline/Lit" properties and keywords.
/// </summary>
public Shader Shader { get; set; }

View File

@ -3,16 +3,17 @@ using UnityEngine;
namespace UniGLTF
{
/// <summary>
/// GLTF の MaterialImporter
/// A class that generates MaterialDescriptor by considering the extensions included in the glTF data to be imported.
/// </summary>
public sealed class UrpGltfMaterialDescriptorGenerator : IMaterialDescriptorGenerator
{
public UrpGltfPbrMaterialImporter PbrMaterialImporter { get; } = new();
public UrpGltfDefaultMaterialImporter DefaultMaterialImporter { get; } = new();
public BuiltInGltfUnlitMaterialImporter UnlitMaterialImporter { get; } = new();
public MaterialDescriptor Get(GltfData data, int i)
{
if (BuiltInGltfUnlitMaterialImporter.TryCreateParam(data, i, out var param)) return param;
if (UnlitMaterialImporter.TryCreateParam(data, i, out var param)) return param;
if (PbrMaterialImporter.TryCreateParam(data, i, out param)) return param;
// NOTE: Fallback to default material

View File

@ -83,6 +83,7 @@ namespace UniGLTF
RestoreOlderVersionValues(json, GLTF);
FixMeshNameUnique(GLTF);
FixBlendShapeNameUnique(GLTF);
foreach (var image in GLTF.images)
{
image.uri = PrepareUri(image.uri);
@ -121,6 +122,61 @@ namespace UniGLTF
}
}
// https://github.com/vrm-c/UniVRM/issues/2619
private static void FixBlendShapeNameUnique(glTF GLTF)
{
foreach (var mesh in GLTF.meshes)
{
/// https://github.com/KhronosGroup/glTF/pull/1631/files
if (gltf_mesh_extras_targetNames.TryGet(mesh, out var targetNames))
{
var used = new HashSet<string>();
int rename = 0;
for (int i = 0; i < targetNames.Count; ++i)
{
var target_name = targetNames[i];
if (string.IsNullOrEmpty(target_name))
{
// no name
targetNames[i] = $"__{i}__";
UniGLTFLogger.Log($"rename blendshape: {mesh.name}[{i}]{target_name} => {targetNames[i]}");
rename += 1;
}
else if (used.Contains(target_name))
{
// rename
var uname = $"__{i}__{target_name}";
targetNames[i] = uname;
UniGLTFLogger.Log($"rename blendshape: {mesh.name}[{i}]{target_name} => {targetNames[i]}");
rename += 1;
}
used.Add(targetNames[i]);
}
if (rename > 0)
{
// var extrans = new Dictionary<string, JsonNode>()
// {
// {"targetNames", targetNames },
var f = new JsonFormatter();
f.BeginMap();
f.Key("targetNames");
{
f.BeginList();
foreach (var name in targetNames)
{
f.Value(name);
}
f.EndList();
}
f.EndMap();
var json = f.ToString();
mesh.extras = new UniGLTF.glTFExtensionImport(JsonParser.Parse(json));
}
}
}
}
private static void RenameImageFromTexture(glTF GLTF, int i)
{
foreach (var texture in GLTF.textures)

View File

@ -4,8 +4,8 @@ namespace UniGLTF
public static partial class PackageVersion
{
public const int MAJOR = 0;
public const int MINOR = 129;
public const int PATCH = 3;
public const string VERSION = "0.129.3";
public const int MINOR = 130;
public const int PATCH = 0;
public const string VERSION = "0.130.0";
}
}

View File

@ -4,8 +4,8 @@ namespace UniGLTF
public static partial class UniGLTFVersion
{
public const int MAJOR = 2;
public const int MINOR = 65;
public const int PATCH = 3;
public const string VERSION = "2.65.3";
public const int MINOR = 66;
public const int PATCH = 0;
public const string VERSION = "2.66.0";
}
}

View File

@ -53,7 +53,7 @@ namespace UniJSON
}
default:
throw new ParserException(segment + " is not valid json start");
throw new ParserException(segment + " is not valid json start(maybe invalid ',')");
}
}

View File

@ -233,5 +233,103 @@ namespace UniGLTF
}
}
}
// https://github.khronos.org/glTF-Tutorials/gltfTutorial/gltfTutorial_017_SimpleMorphTarget.html
[Test]
public void Preprocess_AutoNodeName()
{
var json = @"
{
""scene"": 0,
""scenes"" : [
{
""nodes"" : [ 0 ]
}
],
""nodes"" : [
{
""mesh"" : 0
}
],
""meshes"" : [
{
""primitives"" : [ {
""attributes"" : {
""POSITION"" : 1
},
""indices"" : 0
} ]
}
],
""buffers"" : [
{
""uri"" : ""data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA="",
""byteLength"" : 44
}
],
""bufferViews"" : [
{
""buffer"" : 0,
""byteOffset"" : 0,
""byteLength"" : 6,
""target"" : 34963
},
{
""buffer"" : 0,
""byteOffset"" : 8,
""byteLength"" : 36,
""target"" : 34962
}
],
""accessors"" : [
{
""bufferView"" : 0,
""byteOffset"" : 0,
""componentType"" : 5123,
""count"" : 3,
""type"" : ""SCALAR"",
""max"" : [ 2 ],
""min"" : [ 0 ]
},
{
""bufferView"" : 1,
""byteOffset"" : 0,
""componentType"" : 5126,
""count"" : 3,
""type"" : ""VEC3"",
""max"" : [ 1.0, 1.0, 0.0 ],
""min"" : [ 0.0, 0.0, 0.0 ]
}
],
""asset"" : {
""version"" : ""2.0""
}
}
";
var gltf = GlbLowLevelParser.ParseGltf("tmp", json, null, null, default);
Assert.AreEqual(1, gltf.GLTF.nodes.Count);
Assert.AreEqual("0", gltf.GLTF.nodes[0].name);
}
// https://github.khronos.org/glTF-Tutorials/gltfTutorial/gltfTutorial_017_SimpleMorphTarget.html
[Test]
public void Preprocess_DupMorphTargetName()
{
var asset = UnityEditor.AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/UniGLTF/Tests/UniGLTF/gltfTutorial_017_SimpleMorphTarget.txt");
Assert.True(asset);
var gltf = GlbLowLevelParser.ParseGltf("tmp", asset.text, null, null, default);
Assert.AreEqual(1, gltf.GLTF.nodes.Count);
Assert.AreEqual("0", gltf.GLTF.nodes[0].name);
Assert.True(gltf_mesh_extras_targetNames.TryGet(gltf.GLTF.meshes[0], out List<string> targetNames));
// [dup_name, dup_name] => [dup_name, __1__dup_name]
Assert.AreEqual(2, targetNames.Count);
Assert.AreEqual("dup_name", targetNames[0]);
Assert.AreEqual("__1__dup_name", targetNames[1]);
}
}
}

View File

@ -0,0 +1,198 @@
{
"scene": 0,
"scenes":[
{
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0
}
],
"meshes":[
{
"primitives":[
{
"attributes":{
"POSITION":1
},
"targets":[
{
"POSITION":2
},
{
"POSITION":3
}
],
"indices":0
}
],
"weights":[
1.0,
0.5
],
"extras":{
"targetNames": [
"dup_name",
"dup_name"
]
}
}
],
"animations":[
{
"samplers":[
{
"input":4,
"interpolation":"LINEAR",
"output":5
}
],
"channels":[
{
"sampler":0,
"target":{
"node":0,
"path":"weights"
}
}
]
}
],
"buffers":[
{
"uri":"data:application/gltf-buffer;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAA/AAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIC/AACAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/AACAPwAAAAA=",
"byteLength":116
},
{
"uri":"data:application/gltf-buffer;base64,AAAAAAAAgD8AAABAAABAQAAAgEAAAAAAAAAAAAAAAAAAAIA/AACAPwAAgD8AAIA/AAAAAAAAAAAAAAAA",
"byteLength":60
}
],
"bufferViews":[
{
"buffer":0,
"byteOffset":0,
"byteLength":6,
"target":34963
},
{
"buffer":0,
"byteOffset":8,
"byteLength":108,
"byteStride":12,
"target":34962
},
{
"buffer":1,
"byteOffset":0,
"byteLength":20
},
{
"buffer":1,
"byteOffset":20,
"byteLength":40
}
],
"accessors":[
{
"bufferView":0,
"byteOffset":0,
"componentType":5123,
"count":3,
"type":"SCALAR",
"max":[
2
],
"min":[
0
]
},
{
"bufferView":1,
"byteOffset":0,
"componentType":5126,
"count":3,
"type":"VEC3",
"max":[
1.0,
0.5,
0.0
],
"min":[
0.0,
0.0,
0.0
]
},
{
"bufferView":1,
"byteOffset":36,
"componentType":5126,
"count":3,
"type":"VEC3",
"max":[
0.0,
1.0,
0.0
],
"min":[
-1.0,
0.0,
0.0
]
},
{
"bufferView":1,
"byteOffset":72,
"componentType":5126,
"count":3,
"type":"VEC3",
"max":[
1.0,
1.0,
0.0
],
"min":[
0.0,
0.0,
0.0
]
},
{
"bufferView":2,
"byteOffset":0,
"componentType":5126,
"count":5,
"type":"SCALAR",
"max":[
4.0
],
"min":[
0.0
]
},
{
"bufferView":3,
"byteOffset":0,
"componentType":5126,
"count":10,
"type":"SCALAR",
"max":[
1.0
],
"min":[
0.0
]
}
],
"asset":{
"version":"2.0"
}
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ff5b21eda4deae14583275d904ae3d08
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,6 +1,6 @@
{
"name": "com.vrmc.gltf",
"version": "0.129.3",
"version": "0.130.0",
"displayName": "UniGLTF",
"description": "GLTF importer and exporter",
"unity": "2021.3",

View File

@ -5,10 +5,19 @@ using UnityEngine;
namespace VRM
{
/// <summary>
/// A class that generates MaterialDescriptor by considering the VRM 0.X extension included in the glTF data to be imported.
/// </summary>
public sealed class BuiltInVrmMaterialDescriptorGenerator : IMaterialDescriptorGenerator
{
private readonly glTF_VRM_extensions _vrm;
public BuiltInGltfPbrMaterialImporter PbrMaterialImporter { get; } = new();
public BuiltInGltfDefaultMaterialImporter DefaultMaterialImporter { get; } = new();
public BuiltInGltfUnlitMaterialImporter UnlitMaterialImporter { get; } = new();
public BuiltInVrmMToonMaterialImporter MToonMaterialImporter { get; } = new();
public BuiltInVrmUnlitTransparentZWriteMaterialImporter UnlitTransparentZWriteMaterialImporter { get; } = new();
public BuiltInVrmMaterialDescriptorGenerator(glTF_VRM_extensions vrm)
{
_vrm = vrm;
@ -17,25 +26,25 @@ namespace VRM
public MaterialDescriptor Get(GltfData data, int i)
{
// legacy "VRM/UnlitTransparentZWrite"
if (BuiltInVrmUnlitTransparentZWriteMaterialImporter.TryCreateParam(data, _vrm, i, out var matDesc))
if (UnlitTransparentZWriteMaterialImporter.TryCreateParam(data, _vrm, i, out var matDesc))
{
return matDesc;
}
// mtoon
if (BuiltInVrmMToonMaterialImporter.TryCreateParam(data, _vrm, i, out matDesc))
if (MToonMaterialImporter.TryCreateParam(data, _vrm, i, out matDesc))
{
return matDesc;
}
// unlit
if (BuiltInGltfUnlitMaterialImporter.TryCreateParam(data, i, out matDesc))
if (UnlitMaterialImporter.TryCreateParam(data, i, out matDesc))
{
return matDesc;
}
// pbr
if (BuiltInGltfPbrMaterialImporter.TryCreateParam(data, i, out matDesc))
if (PbrMaterialImporter.TryCreateParam(data, i, out matDesc))
{
return matDesc;
}
@ -48,6 +57,6 @@ namespace VRM
return GetGltfDefault(GltfMaterialImportUtils.ImportMaterialName(i, null));
}
public MaterialDescriptor GetGltfDefault(string materialName = null) => BuiltInGltfDefaultMaterialImporter.CreateParam(materialName);
public MaterialDescriptor GetGltfDefault(string materialName = null) => DefaultMaterialImporter.CreateParam(materialName);
}
}

View File

@ -6,7 +6,12 @@ using UnityEngine;
namespace VRM
{
public static class BuiltInVrmMToonMaterialImporter
/// <summary>
/// A class that generates MaterialDescriptor for some shader based on VRM 0.X implementation.
///
/// There is no specification for VRM 0.X.
/// </summary>
public class BuiltInVrmMToonMaterialImporter
{
/// <summary>
/// 過去バージョンに含まれていたが、廃止・統合された Shader のフォールバック情報
@ -33,8 +38,46 @@ namespace VRM
"_UvAnimMaskTexture",
};
public static bool TryCreateParam(GltfData data, glTF_VRM_extensions vrm, int materialIdx,
out MaterialDescriptor matDesc)
/// <summary>
/// Can be replaced with custom shaders that are compatible with "VRM/MToon" properties and keywords.
/// </summary>
public Shader MToonShader { get; set; }
/// <summary>
/// Can be replaced with custom shaders that are compatible with "Unlit/Texture" properties and keywords.
/// </summary>
public Shader UnlitTextureShader { get; set; }
/// <summary>
/// Can be replaced with custom shaders that are compatible with "Unlit/Transparent" properties and keywords.
/// </summary>
public Shader UnlitTransparentShader { get; set; }
/// <summary>
/// Can be replaced with custom shaders that are compatible with "Unlit/Transparent Cutout" properties and keywords.
/// </summary>
public Shader UnlitTransparentCutoutShader { get; set; }
/// <summary>
/// Can be replaced with custom shaders that are compatible with "UniGLTF/UniUnlit" properties and keywords.
/// </summary>
public Shader UniUnlitShader { get; set; }
public BuiltInVrmMToonMaterialImporter(
Shader mtoonShader = null,
Shader unlitTextureShader = null,
Shader unlitTransparentShader = null,
Shader unlitTransparentCutoutShader = null,
Shader uniUnlitShader = null)
{
MToonShader = mtoonShader != null ? mtoonShader : Shader.Find("VRM/MToon");
UnlitTextureShader = unlitTextureShader != null ? unlitTextureShader : Shader.Find("Unlit/Texture");
UnlitTransparentShader = unlitTransparentShader != null ? unlitTransparentShader : Shader.Find("Unlit/Transparent");
UnlitTransparentCutoutShader = unlitTransparentCutoutShader != null ? unlitTransparentCutoutShader : Shader.Find("Unlit/Transparent Cutout");
UniUnlitShader = uniUnlitShader != null ? uniUnlitShader : Shader.Find(UniGLTF.UniUnlit.UniUnlitUtil.ShaderName);
}
public bool TryCreateParam(GltfData data, glTF_VRM_extensions vrm, int materialIdx, out MaterialDescriptor matDesc)
{
if (vrm?.materialProperties == null || vrm.materialProperties.Count == 0)
{
@ -66,7 +109,16 @@ namespace VRM
{
shaderName = FallbackShaders[shaderName];
}
var shader = Shader.Find(shaderName);
var shader = shaderName switch
{
"VRM/MToon" => MToonShader,
"Unlit/Texture" => UnlitTextureShader,
"Unlit/Transparent" => UnlitTransparentShader,
"Unlit/Transparent Cutout" => UnlitTransparentCutoutShader,
UniGLTF.UniUnlit.UniUnlitUtil.ShaderName => UniUnlitShader,
_ => Shader.Find(shaderName),
};
var textureSlots = new Dictionary<string, TextureDescriptor>();
var floatValues = new Dictionary<string, float>();

View File

@ -8,12 +8,27 @@ using RenderMode = MToon.RenderMode;
namespace VRM
{
public static class BuiltInVrmUnlitTransparentZWriteMaterialImporter
/// <summary>
/// A class that generates MaterialDescriptor for "VRM/UnlitTransparentZWrite" shader based on VRM 0.X implementation.
///
/// There is no specification for VRM 0.X.
/// </summary>
public class BuiltInVrmUnlitTransparentZWriteMaterialImporter
{
public const string UnlitTransparentZWriteShaderName = "VRM/UnlitTransparentZWrite";
public const string UnlitTransparentZWriteMainTexturePropName = "_MainTex";
public static bool TryCreateParam(GltfData data, glTF_VRM_extensions vrm, int materialIdx,
/// <summary>
/// Can be replaced with custom shaders that are compatible with "VRM/UnlitTransparentZWrite" properties and keywords.
/// </summary>
public Shader Shader { get; }
public BuiltInVrmUnlitTransparentZWriteMaterialImporter(Shader shader = null)
{
Shader = shader != null ? shader : Shader.Find(UnlitTransparentZWriteShaderName);
}
public bool TryCreateParam(GltfData data, glTF_VRM_extensions vrm, int materialIdx,
out MaterialDescriptor matDesc)
{
if (vrm?.materialProperties == null || vrm.materialProperties.Count == 0)

View File

@ -5,12 +5,16 @@ using UnityEngine;
namespace VRM
{
/// <summary>
/// A class that generates MaterialDescriptor by considering the VRM 0.X extension included in the glTF data to be imported.
/// </summary>
public sealed class UrpVrmMaterialDescriptorGenerator : IMaterialDescriptorGenerator
{
private readonly glTF_VRM_extensions _vrm;
public UrpGltfPbrMaterialImporter PbrMaterialImporter { get; } = new();
public UrpGltfDefaultMaterialImporter DefaultMaterialImporter { get; } = new();
public BuiltInGltfUnlitMaterialImporter UnlitMaterialImporter { get; } = new();
public UrpVrmMaterialDescriptorGenerator(glTF_VRM_extensions vrm)
{
@ -21,7 +25,7 @@ namespace VRM
{
// mtoon URP "MToon" shader is not ready. import fallback to unlit
// unlit "UniUnlit" work in URP
if (BuiltInGltfUnlitMaterialImporter.TryCreateParam(data, i, out var matDesc)) return matDesc;
if (UnlitMaterialImporter.TryCreateParam(data, i, out var matDesc)) return matDesc;
// pbr "Standard" to "Universal Render Pipeline/Lit"
if (PbrMaterialImporter.TryCreateParam(data, i, out matDesc)) return matDesc;

View File

@ -6,7 +6,8 @@
"GUID:1cd941934d098654fa21a13f28346412",
"GUID:b7aa47b240b57de44a4b2021c143c9bf",
"GUID:05dd262a0c0a2f841b8252c8c3815582",
"GUID:3e5d614bc16b50d41bd94c8d7444ca46"
"GUID:3e5d614bc16b50d41bd94c8d7444ca46",
"GUID:d8b63aba1907145bea998dd612889d6b"
],
"includePlatforms": [],
"excludePlatforms": [],

View File

@ -343,15 +343,15 @@ namespace VRM.SimpleViewer
m_loaded.EnableLipSyncValue = m_enableLipSync.isOn;
m_loaded.EnableBlinkValue = m_enableAutoBlink.isOn;
m_loaded.SetSpringboneModelLevel(new UniGLTF.SpringBoneJobs.Blittables.BlittableModelLevel
{
ExternalForce = new Vector3(
(
externalForce: new Vector3(
m_springExternalX.value,
m_springExternalY.value,
m_springExternalZ.value
),
StopSpringBoneWriteback = m_springBonePause.isOn,
SupportsScalingAtRuntime = m_springBoneScaling.isOn,
});
stopSpringBoneWriteback: m_springBonePause.isOn,
supportsScalingAtRuntime: m_springBoneScaling.isOn
));
m_loaded.Update();
}
}

View File

@ -48,9 +48,10 @@ namespace VRM
{
var vrm = new VRMData(data);
var importer = new VRMImporterContext(vrm, null);
var materialImporter = new BuiltInVrmMToonMaterialImporter();
Assert.AreEqual(73, vrm.Data.GLTF.materials.Count);
Assert.True(BuiltInVrmMToonMaterialImporter.TryCreateParam(vrm.Data, importer.VRM, 0, out MaterialDescriptor matDesc));
Assert.True(materialImporter.TryCreateParam(vrm.Data, importer.VRM, 0, out MaterialDescriptor matDesc));
}
}

View File

@ -138,9 +138,10 @@ namespace VRM
},
}
};
var materialImporter = new BuiltInVrmMToonMaterialImporter();
// 2系統ある
Assert.IsTrue(BuiltInVrmMToonMaterialImporter.TryCreateParam(data, vrm, 0, out var matDesc));
Assert.IsTrue(materialImporter.TryCreateParam(data, vrm, 0, out var matDesc));
Assert.AreEqual(1, matDesc.TextureSlots.Count);
var items = new VrmTextureDescriptorGenerator(data, vrm).Get().GetEnumerable().ToArray();

View File

@ -1,6 +1,6 @@
{
"name": "com.vrmc.univrm",
"version": "0.129.3",
"version": "0.130.0",
"displayName": "VRM",
"description": "VRM importer",
"unity": "2021.3",
@ -14,7 +14,7 @@
"name": "VRM Consortium"
},
"dependencies": {
"com.vrmc.gltf": "0.129.3",
"com.vrmc.gltf": "0.130.0",
"com.unity.ugui": "1.0.0"
},
"samples": [

View File

@ -87,9 +87,11 @@ namespace UniVRM10
//
// angle limit
//
m_showAnglelimitSettings = EditorGUILayout.Foldout(m_showAnglelimitSettings, "AngleLimit Settings(dev)");
m_showAnglelimitSettings = EditorGUILayout.Foldout(m_showAnglelimitSettings, "AngleLimit Settings (experimental)");
if (m_showAnglelimitSettings)
{
EditorGUILayout.HelpBox("SpringBoneの角度制限はまだdraft仕様です。将来的に仕様が変更される可能性があります。また、VRMファイルへのインポート・エクスポート機能はまだ実装されていません。\nThe angle limit feature for SpringBone is still in draft status. The specifications may change in the future. Also, the import/export of VRM files has not yet been implemented.", MessageType.Warning);
EditorGUILayout.PropertyField(m_angleLimitType);
switch ((UniGLTF.SpringBoneJobs.AnglelimitTypes)m_angleLimitType.enumValueIndex)
{

View File

@ -5,16 +5,24 @@ using UnityEngine;
namespace UniVRM10
{
/// <summary>
/// A class that generates MaterialDescriptor by considering the VRM 1.0 extension included in the glTF data to be imported.
/// </summary>
public sealed class BuiltInVrm10MaterialDescriptorGenerator : IMaterialDescriptorGenerator
{
public BuiltInGltfPbrMaterialImporter PbrMaterialImporter { get; } = new();
public BuiltInGltfDefaultMaterialImporter DefaultMaterialImporter { get; } = new();
public BuiltInGltfUnlitMaterialImporter UnlitMaterialImporter { get; } = new();
public BuiltInVrm10MToonMaterialImporter MToonMaterialImporter { get; } = new();
public MaterialDescriptor Get(GltfData data, int i)
{
// mtoon
if (BuiltInVrm10MToonMaterialImporter.TryCreateParam(data, i, out MaterialDescriptor matDesc)) return matDesc;
if (MToonMaterialImporter.TryCreateParam(data, i, out MaterialDescriptor matDesc)) return matDesc;
// unlit
if (BuiltInGltfUnlitMaterialImporter.TryCreateParam(data, i, out matDesc)) return matDesc;
if (UnlitMaterialImporter.TryCreateParam(data, i, out matDesc)) return matDesc;
// pbr
if (BuiltInGltfPbrMaterialImporter.TryCreateParam(data, i, out matDesc)) return matDesc;
if (PbrMaterialImporter.TryCreateParam(data, i, out matDesc)) return matDesc;
// fallback
if (Symbols.VRM_DEVELOP)
@ -24,6 +32,6 @@ namespace UniVRM10
return GetGltfDefault(GltfMaterialImportUtils.ImportMaterialName(i, null));
}
public MaterialDescriptor GetGltfDefault(string materialName = null) => BuiltInGltfDefaultMaterialImporter.CreateParam(materialName);
public MaterialDescriptor GetGltfDefault(string materialName = null) => DefaultMaterialImporter.CreateParam(materialName);
}
}

View File

@ -11,14 +11,26 @@ using OutlineWidthMode = UniGLTF.Extensions.VRMC_materials_mtoon.OutlineWidthMod
namespace UniVRM10
{
/// <summary>
/// Convert MToon parameters from glTF specification to Unity implementation.
/// A class that generates MaterialDescriptor for "VRM10/MToon10" shader based on vrm-1.0 Material specification.
///
/// https://github.com/vrm-c/vrm-specification/blob/master/specification/VRMC_materials_mtoon-1.0/README.md
/// </summary>
public static class BuiltInVrm10MToonMaterialImporter
public class BuiltInVrm10MToonMaterialImporter
{
/// <summary>
/// Can be replaced with custom shaders that are compatible with "VRM10/MToon10" properties and keywords.
/// </summary>
public Shader Shader { get; set; }
public BuiltInVrm10MToonMaterialImporter(Shader shader = null)
{
Shader = shader != null ? shader : Shader.Find("VRM10/MToon10");
}
/// <summary>
/// VMRC_materials_mtoon の場合にマテリアル生成情報を作成する
/// </summary>
public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc)
public bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc)
{
var m = data.GLTF.materials[i];
if (!UniGLTF.Extensions.VRMC_materials_mtoon.GltfDeserializer.TryGet(m.extensions,

View File

@ -7,14 +7,26 @@ using VRM10.MToon10;
namespace UniVRM10
{
/// <summary>
/// Convert MToon parameters from glTF specification to Unity implementation.(for URP)
/// A class that generates MaterialDescriptor for "VRM10/Universal Render Pipeline/MToon10" shader based on vrm-1.0 Material specification.
///
/// https://github.com/vrm-c/vrm-specification/blob/master/specification/VRMC_materials_mtoon-1.0/README.md
/// </summary>
public static class UrpVrm10MToonMaterialImporter
public class UrpVrm10MToonMaterialImporter
{
/// <summary>
/// Can be replaced with custom shaders that are compatible with "VRM10/Universal Render Pipeline/MToon10" properties and keywords.
/// </summary>
public Shader Shader { get; set; }
public UrpVrm10MToonMaterialImporter(Shader shader = null)
{
Shader = shader != null ? shader : Shader.Find("VRM10/Universal Render Pipeline/MToon10");
}
/// <summary>
/// VMRC_materials_mtoon の場合にマテリアル生成情報を作成する
/// </summary>
public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc)
public bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc)
{
var m = data.GLTF.materials[i];
if (!UniGLTF.Extensions.VRMC_materials_mtoon.GltfDeserializer.TryGet(m.extensions, out var mtoon))

View File

@ -5,17 +5,22 @@ using UnityEngine;
namespace UniVRM10
{
/// <summary>
/// A class that generates MaterialDescriptor by considering the VRM 1.0 extension included in the glTF data to be imported.
/// </summary>
public sealed class UrpVrm10MaterialDescriptorGenerator : IMaterialDescriptorGenerator
{
public UrpGltfPbrMaterialImporter PbrMaterialImporter { get; } = new();
public UrpGltfDefaultMaterialImporter DefaultMaterialImporter { get; } = new();
public BuiltInGltfUnlitMaterialImporter UnlitMaterialImporter { get; } = new();
public UrpVrm10MToonMaterialImporter MToonMaterialImporter { get; } = new();
public MaterialDescriptor Get(GltfData data, int i)
{
// mtoon
if (UrpVrm10MToonMaterialImporter.TryCreateParam(data, i, out var matDesc)) return matDesc;
if (MToonMaterialImporter.TryCreateParam(data, i, out var matDesc)) return matDesc;
// unlit
if (BuiltInGltfUnlitMaterialImporter.TryCreateParam(data, i, out matDesc)) return matDesc;
if (UnlitMaterialImporter.TryCreateParam(data, i, out matDesc)) return matDesc;
// pbr
if (PbrMaterialImporter.TryCreateParam(data, i, out matDesc)) return matDesc;

View File

@ -6,7 +6,8 @@
"GUID:e47c917724578cc43b5506c17a27e9a0",
"GUID:8d76e605759c3f64a957d63ef96ada7c",
"GUID:1cd941934d098654fa21a13f28346412",
"GUID:5f875fdc81c40184c8333b9d63c6ddd5"
"GUID:5f875fdc81c40184c8333b9d63c6ddd5",
"GUID:d8b63aba1907145bea998dd612889d6b"
],
"includePlatforms": [],
"excludePlatforms": [],

View File

@ -135,12 +135,7 @@ namespace UniVRM10.ClothWarp
// }
}
public void Process()
{
Process(Time.deltaTime);
}
void Process(float deltaTime)
public void Process(float deltaTime)
{
if (!_initialized)
{

View File

@ -193,14 +193,12 @@ namespace UniVRM10.ClothWarp.Jobs
var colliderTransformIndex = GetOrAddColliderTransform(collider.transform);
colliderRef.Add(colliderInfo.Count);
colliderInfo.Add(new BlittableCollider
{
offset = collider.Offset,
radius = collider.Radius,
tailOrNormal = collider.TailOrNormal,
colliderType = TranslateColliderType(collider.ColliderType),
transformIndex = colliderTransformIndex,
});
colliderInfo.Add(new BlittableCollider(
offset: collider.Offset,
radius: collider.Radius,
tailOrNormal: collider.TailOrNormal,
colliderType: TranslateColliderType(collider.ColliderType),
colliderTransformIndex: colliderTransformIndex));
_colliders.Add(collider);
}
@ -410,11 +408,6 @@ namespace UniVRM10.ClothWarp.Jobs
}
}
public void Process()
{
Process(Time.deltaTime);
}
public void Process(float deltaTime)
{
var frame = new FrameInfo(deltaTime, Vector3.zero);

View File

@ -39,14 +39,12 @@ namespace UniVRM10.ClothWarp.Jobs
public BlittableJointMutable ToBlittableJointMutable()
{
return new BlittableJointMutable
{
stiffnessForce = Stiffness,
gravityPower = 1.0f,
gravityDir = Gravity,
dragForce = Deceleration,
radius = Radius,
};
return new BlittableJointMutable(
stiffnessForce: Stiffness,
gravityPower: 1.0f,
gravityDir: Gravity,
dragForce: Deceleration,
radius: Radius);
}
}

View File

@ -4,9 +4,11 @@ namespace UniVRM10.VRM10Viewer
{
class UnlitMaterialImporter : IMaterialImporter
{
public BuiltInGltfUnlitMaterialImporter GltfUnlitMaterialImporter { get; } = new();
bool IMaterialImporter.TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc)
{
return BuiltInGltfUnlitMaterialImporter.TryCreateParam(data, i, out matDesc);
return GltfUnlitMaterialImporter.TryCreateParam(data, i, out matDesc);
}
}
}

View File

@ -7,9 +7,11 @@ namespace UniVRM10.VRM10Viewer
/// </summary>
public class UrpMToonMaterialImporter : IMaterialImporter
{
public UrpVrm10MToonMaterialImporter MToonMaterialImporter { get; } = new();
public bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc)
{
if (UrpVrm10MToonMaterialImporter.TryCreateParam(data, i, out matDesc))
if (MToonMaterialImporter.TryCreateParam(data, i, out matDesc))
{
return true;
}

View File

@ -185,15 +185,14 @@ namespace UniVRM10.VRM10Viewer
m_controller.ShowBoxMan(m_showBoxMan.value);
if (m_controller.TryUpdate(
m_motionMode.value == 0,
new BlittableModelLevel
{
ExternalForce = new Vector3(
new BlittableModelLevel(
externalForce: new Vector3(
m_springboneExternalX.value,
m_springboneExternalY.value,
m_springboneExternalZ.value),
StopSpringBoneWriteback = m_useSpringbonePause.value,
SupportsScalingAtRuntime = m_useSpringboneScaling.value,
},
stopSpringBoneWriteback: m_useSpringbonePause.value,
supportsScalingAtRuntime: m_useSpringboneScaling.value
),
out var loaded
))
{

View File

@ -7,7 +7,8 @@
"GUID:e47c917724578cc43b5506c17a27e9a0",
"GUID:1cd941934d098654fa21a13f28346412",
"GUID:3e5d614bc16b50d41bd94c8d7444ca46",
"GUID:f06555f75b070af458a003d92f9efb00"
"GUID:f06555f75b070af458a003d92f9efb00",
"GUID:d8b63aba1907145bea998dd612889d6b"
],
"includePlatforms": [],
"excludePlatforms": [],

View File

@ -226,12 +226,11 @@ namespace UniVRM10.VRM10Viewer
m_controller.ShowBoxMan(m_showBoxMan.isOn);
if (m_controller.TryUpdate(
m_ui.IsTPose,
new BlittableModelLevel
{
ExternalForce = new Vector3(m_springboneExternalX.value, m_springboneExternalY.value, m_springboneExternalZ.value),
StopSpringBoneWriteback = m_springbonePause.isOn,
SupportsScalingAtRuntime = m_springboneScaling.isOn,
},
new BlittableModelLevel(
externalForce: new Vector3(m_springboneExternalX.value, m_springboneExternalY.value, m_springboneExternalZ.value),
stopSpringBoneWriteback: m_springbonePause.isOn,
supportsScalingAtRuntime: m_springboneScaling.isOn
),
out var loaded
))
{

View File

@ -1,6 +1,6 @@
{
"name": "com.vrmc.vrm",
"version": "0.129.3",
"version": "0.130.0",
"displayName": "VRM-1.0",
"description": "VRM-1.0 importer",
"unity": "2021.3",
@ -15,7 +15,7 @@
},
"dependencies": {
"com.unity.timeline": "1.7.6",
"com.vrmc.gltf": "0.129.3"
"com.vrmc.gltf": "0.130.0"
},
"samples": [
{

View File

@ -4,9 +4,11 @@ namespace UniVRM10.VRM10Viewer
{
class UnlitMaterialImporter : IMaterialImporter
{
public BuiltInGltfUnlitMaterialImporter GltfUnlitMaterialImporter { get; } = new();
bool IMaterialImporter.TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc)
{
return BuiltInGltfUnlitMaterialImporter.TryCreateParam(data, i, out matDesc);
return GltfUnlitMaterialImporter.TryCreateParam(data, i, out matDesc);
}
}
}

View File

@ -7,9 +7,11 @@ namespace UniVRM10.VRM10Viewer
/// </summary>
public class UrpMToonMaterialImporter : IMaterialImporter
{
public UrpVrm10MToonMaterialImporter MToonMaterialImporter { get; } = new();
public bool TryCreateParam(GltfData data, int i, out MaterialDescriptor matDesc)
{
if (UrpVrm10MToonMaterialImporter.TryCreateParam(data, i, out matDesc))
if (MToonMaterialImporter.TryCreateParam(data, i, out matDesc))
{
return true;
}