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); }
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(); })); }
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); }
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); }