Esempio n. 1
0
        private Schema.MeshPrimitive ConvertMeshPrimitive(MeshPrimitive runtimeMeshPrimitive, BinaryData binaryData)
        {
            var meshPrimitive = CreateInstance <Schema.MeshPrimitive>();

            var runtimeAttributes = new Dictionary <string, DataConvertArgs>();

            void AddRuntimeAttribute(string key, DataConvertArgs args)
            {
                if (args.Data != null)
                {
                    runtimeAttributes.Add(key, args);
                }
            }

            AddRuntimeAttribute("POSITION", new DataConvertArgs("Positions Accessor", "Positions", runtimeMeshPrimitive.Positions, minMax: true));
            AddRuntimeAttribute("NORMAL", new DataConvertArgs("Normals Accessor", "Normals", runtimeMeshPrimitive.Normals));
            AddRuntimeAttribute("TANGENT", new DataConvertArgs("Tangents Accessor", "Tangents", runtimeMeshPrimitive.Tangents));
            AddRuntimeAttribute("COLOR_0", new DataConvertArgs("Colors Accessor", "Colors", runtimeMeshPrimitive.Colors));
            AddRuntimeAttribute("TEXCOORD_0", new DataConvertArgs("UV Accessor 0", "Texture Coords 0", runtimeMeshPrimitive.TexCoords0));
            AddRuntimeAttribute("TEXCOORD_1", new DataConvertArgs("UV Accessor 1", "Texture Coords 1", runtimeMeshPrimitive.TexCoords1));

            meshPrimitive.Attributes = ConvertMeshPrimitiveAttributes(runtimeAttributes, runtimeMeshPrimitive.Interleave ?? false, binaryData);

            if (runtimeMeshPrimitive.Indices != null)
            {
                var args = new DataConvertArgs("Indices Accessor", "Indices", runtimeMeshPrimitive.Indices);
                meshPrimitive.Indices = ConvertData(args, binaryData);
            }

            // TODO: moved here to match existing data layout
            {
                if (runtimeMeshPrimitive.Weights != null)
                {
                    var args = new DataConvertArgs("weights accessor", "weights buffer view", runtimeMeshPrimitive.Weights);
                    meshPrimitive.Attributes["WEIGHTS_0"] = ConvertData(args, binaryData, attribute: true);
                }

                if (runtimeMeshPrimitive.Joints != null)
                {
                    var args = new DataConvertArgs("joint indices accessor", "joint indices buffer view", runtimeMeshPrimitive.Joints);
                    meshPrimitive.Attributes["JOINTS_0"] = ConvertData(args, binaryData, attribute: true);
                }
            }

            if (runtimeMeshPrimitive.Material != null)
            {
                meshPrimitive.Material = ConvertMaterial(runtimeMeshPrimitive.Material);
            }

            meshPrimitive.Mode = (ModeEnum)runtimeMeshPrimitive.Mode;

            return(meshPrimitive);
        }
Esempio n. 2
0
        private int ConvertSkin(Skin runtimeSkin, BinaryData binaryData)
        {
            return(Convert(runtimeSkin, skins, skinToIndexCache, skin =>
            {
                skin.Name = runtimeSkin.Name;

                if (runtimeSkin.InverseBindMatrices != null)
                {
                    var args = new DataConvertArgs("IBM", "Inverse Bind Matrix", runtimeSkin.InverseBindMatrices);
                    skin.InverseBindMatrices = ConvertData(args, binaryData);
                }

                skin.Joints = runtimeSkin.Joints.Select(jointNode => ConvertNode(jointNode)).ToArray();
            }));
        }
Esempio n. 3
0
        private int ConvertData(DataConvertArgs args, BinaryData binaryData, bool attribute = false)
        {
            if (accessorToIndexCache.TryGetValue(args.Data, out int accessorIndex))
            {
                return(accessorIndex);
            }

            var argsMap = new Dictionary <string, DataConvertArgs>
            {
                { "", args }
            };

            accessorIndex = ConvertData(argsMap, binaryData, attribute).First().Value;
            accessorToIndexCache.Add(args.Data, accessorIndex);
            return(accessorIndex);
        }
Esempio n. 4
0
        private Schema.Animation ConvertAnimation(Animation runtimeAnimation, BinaryData binaryData)
        {
            var animation = CreateInstance <Schema.Animation>();

            var animationChannels            = new List <Schema.AnimationChannel>();
            var animationSamplers            = new List <Schema.AnimationSampler>();
            var animationSamplerToIndexCache = new Dictionary <AnimationSampler, int>();

            int ConvertAnimationSampler(AnimationSampler runtimeAnimationSampler)
            {
                return(Convert(runtimeAnimationSampler, animationSamplers, animationSamplerToIndexCache, animationSampler =>
                {
                    var inputDataInfo = new DataConvertArgs("Animation Sampler Input", "Animation Sampler Input", runtimeAnimationSampler.Input, minMax: true);
                    var outputDataInfo = new DataConvertArgs("Animation Sampler Output", "Animation Sampler Output", runtimeAnimationSampler.Output);

                    animationSampler.Interpolation = (InterpolationEnum)runtimeAnimationSampler.Interpolation;
                    animationSampler.Input = ConvertData(inputDataInfo, binaryData);
                    animationSampler.Output = ConvertData(outputDataInfo, binaryData);
                }));
            }

            foreach (var runtimeAnimationChannel in runtimeAnimation.Channels)
            {
                var animationChannel = CreateInstance <Schema.AnimationChannel>();

                animationChannel.Sampler = ConvertAnimationSampler(runtimeAnimationChannel.Sampler);

                animationChannel.Target = CreateInstance <Schema.AnimationChannelTarget>();

                if (runtimeAnimationChannel.Target.Node != null)
                {
                    animationChannel.Target.Node = ConvertNode(runtimeAnimationChannel.Target.Node);
                }

                animationChannel.Target.Path = (PathEnum)runtimeAnimationChannel.Target.Path;

                animationChannels.Add(animationChannel);
            }

            animation.Name     = runtimeAnimation.Name;
            animation.Channels = animationChannels.ToArray();
            animation.Samplers = animationSamplers.ToArray();

            return(animation);
        }