Ejemplo n.º 1
0
        public void UnityMaterialTest(string materialName, Type vrmLibMaterialType, bool sameShader = true)
        {
            // cerate copy avoid modify asset
            var src = new Material(Resources.Load <Material>(materialName));

            // => vrmlib
            var converter      = new UniVRM10.RuntimeVrmConverter();
            var vrmLibMaterial = converter.Export10(src, (a, b, c, d) => null);

            Assert.AreEqual(vrmLibMaterialType, vrmLibMaterial.GetType());

            // => protobuf
            var textures = new List <VrmLib.Texture>();

            var(protobufMaterial, hasKhrUnlit) = ToProtobufMaterial(vrmLibMaterial, textures);
            Assert.AreEqual(hasKhrUnlit, protobufMaterial.Extensions?.KHRMaterialsUnlit != null);

            // => json
            var settings     = Google.Protobuf.JsonFormatter.Settings.Default.WithPreserveProtoFieldNames(true);
            var jsonMaterial = new Google.Protobuf.JsonFormatter(settings).Format(protobufMaterial);

            // <= json
            var parserSettings = Google.Protobuf.JsonParser.Settings.Default;
            var deserialized   = new Google.Protobuf.JsonParser(parserSettings).Parse <VrmProtobuf.Material>(jsonMaterial);

            // <= protobuf
            var loaded  = deserialized.FromGltf(textures);
            var context = ModelDiffContext.Create();

            ModelDiffExtensions.MaterialEquals(context, vrmLibMaterial, loaded);
            var diff = context.List
                       .Where(x => !s_ignoreKeys.Contains(x.Context))
                       .ToArray();

            if (diff.Length > 0)
            {
                Debug.LogWarning(string.Join("\n", diff.Select(x => $"{x.Context}: {x.Message}")));
            }
            Assert.AreEqual(0, diff.Length);

            // <= vrmlib
            var map = new Dictionary <VrmLib.Texture, Texture2D>();
            var dst = UniVRM10.RuntimeUnityMaterialBuilder.CreateMaterialAsset(loaded, hasVertexColor: false, map);

            dst.name = src.name;

            if (sameShader)
            {
                CompareUnityMaterial(src, dst);
            }
        }
Ejemplo n.º 2
0
        public Vrm10Storage(ArraySegment <byte> json, Memory <byte> bin)
        {
            var parserSettings = Google.Protobuf.JsonParser.Settings.Default;
            var jsonString     = Encoding.UTF8.GetString(json.Array, json.Offset, json.Count);
            var deserialized   = new Google.Protobuf.JsonParser(parserSettings).Parse <VrmProtobuf.glTF>(jsonString);

            Gltf = deserialized;
            var array = bin.ToArray();

            Buffers = new List <ArrayByteBuffer>()
            {
                new ArrayByteBuffer(array, bin.Length)
            };
        }