protected Runtime.Image UseTexture(List <string> imageList, string name) { Runtime.Image image = GetImage(imageList, name); UsedTextures.Add(image); return(image); }
public static void Create(Assembly executingAssembly, string outputFolder, List <Manifest> manifestMaster) { // Make a list of models that need a reference image // Pass that list to the generator (Kacey's code) // Loop through each model group // - Create a folder for the reference images // - Copy the default reference image into the folder for each model that needs it (requires file rename) // - Copy the available reference images into the folder via filehelper Runtime.Image defaultNYI = new Runtime.Image { Uri = noRefImage }; List <Runtime.Image> placeholder = new List <Runtime.Image>() { defaultNYI }; foreach (var modelGroup in manifestMaster) { string assetFolder = Path.Combine(outputFolder, modelGroup.folder); foreach (var filename in modelGroup.files) { string imageFileName = Path.Combine("ReferenceImages", filename.Replace(".gltf", ".png")); FileHelper.CopyImageFiles(executingAssembly, assetFolder, placeholder, imageFileName, useThumbnails: true); } } }
public static string ToReadmeString(this Runtime.Image value) { // 18 is normal cell height. Use height=\"72\" width=\"72\" to clamp the size, but currently removed // due to stretching when the table is too wide. Using thumbnails of the intended size for now. Regex changePath = new Regex(@"(.*)(?=\/)"); string thumbnailPath = changePath.Replace(value.Uri, "Figures/Thumbnails", 1); return($"[<img src=\"{thumbnailPath}\" align=\"middle\">]({value.Uri})"); }
private Runtime.Image GetImage(List <string> imageList, string name) { var image = new Runtime.Image { Uri = imageList.Find(e => e.Contains(name)) }; return(image); }
public Node_Attribute(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_Nodes"); Runtime.Image normalImage = UseTexture(imageList, "Normal_Nodes"); Runtime.Image metallicRoughnessTextureImage = UseTexture(imageList, "MetallicRoughness_Nodes"); // Track the common properties for use in the readme. CommonProperties.Add(new Property(PropertyName.BaseColorTexture, baseColorTextureImage.ToReadmeString())); CommonProperties.Add(new Property(PropertyName.NormalTexture, normalImage.ToReadmeString())); CommonProperties.Add(new Property(PropertyName.MetallicRoughnessTexture, metallicRoughnessTextureImage.ToReadmeString())); Model CreateModel(Action <List <Property>, Runtime.Node> setProperties) { var properties = new List <Property>(); List <Runtime.Node> nodes = Nodes.CreateMultiNode(); // Apply the common properties to the gltf. foreach (var node in nodes) { node.Mesh.MeshPrimitives.First().Material = new Runtime.Material { NormalTexture = new Runtime.Texture { Source = normalImage }, MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness { BaseColorTexture = new Runtime.Texture { Source = baseColorTextureImage }, MetallicRoughnessTexture = new Runtime.Texture { Source = metallicRoughnessTextureImage }, }, }; } // Apply the properties that are specific to this gltf. setProperties(properties, nodes[1]); // Create the gltf object. return(new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene { Nodes = new[] { nodes[0] } }) }); } void SetTranslation(List <Property> properties, Runtime.Node node) { node.Translation = new Vector3(-2.0f, 2.0f, -2.0f); properties.Add(new Property(PropertyName.Translation, node.Translation.ToReadmeString())); } void SetTranslationX(List <Property> properties, Runtime.Node node) { node.Translation = new Vector3(-2.0f, 0.0f, 0.0f); properties.Add(new Property(PropertyName.Translation, node.Translation.ToReadmeString())); } void SetTranslationY(List <Property> properties, Runtime.Node node) { node.Translation = new Vector3(0.0f, 2.0f, 0.0f); properties.Add(new Property(PropertyName.Translation, node.Translation.ToReadmeString())); } void SetTranslationZ(List <Property> properties, Runtime.Node node) { node.Translation = new Vector3(0.0f, 0.0f, -2.0f); properties.Add(new Property(PropertyName.Translation, node.Translation.ToReadmeString())); } void SetRotation(List <Property> properties, Runtime.Node node) { var rotation = new Quaternion(0.0f, 1.0f, 0.0f, 0.0f); node.Rotation = rotation; properties.Add(new Property(PropertyName.Rotation, rotation.ToReadmeString())); } void SetScale(List <Property> properties, Runtime.Node node) { node.Scale = new Vector3(1.2f, 1.2f, 1.2f); properties.Add(new Property(PropertyName.Scale, node.Scale.ToReadmeString())); } void SetMatrix(List <Property> properties, Runtime.Node node) { Matrix4x4 matrixT = Matrix4x4.CreateTranslation(new Vector3(-2.0f, 2.0f, -2.0f)); Matrix4x4 matrixR = Matrix4x4.CreateRotationY(FloatMath.Pi); Matrix4x4 matrixS = Matrix4x4.CreateScale(1.2f); Matrix4x4 matrixTRS = Matrix4x4.Multiply(Matrix4x4.Multiply(matrixS, matrixR), matrixT); node.Matrix = matrixTRS; properties.Add(new Property(PropertyName.Matrix, matrixTRS.ToReadmeString())); } Models = new List <Model> { CreateModel((properties, node) => { // There are no properties set on this model. }), CreateModel((properties, node) => { SetTranslation(properties, node); }), CreateModel((properties, node) => { SetTranslationX(properties, node); }), CreateModel((properties, node) => { SetTranslationY(properties, node); }), CreateModel((properties, node) => { SetTranslationZ(properties, node); }), CreateModel((properties, node) => { SetRotation(properties, node); }), CreateModel((properties, node) => { SetScale(properties, node); }), CreateModel((properties, node) => { SetTranslation(properties, node); SetRotation(properties, node); SetScale(properties, node); }), CreateModel((properties, node) => { SetMatrix(properties, node); }), }; GenerateUsedPropertiesList(); }
public Material_DoubleSided(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_Plane"); Runtime.Image normalImage = UseTexture(imageList, "Normal_Plane"); // Track the common properties for use in the readme. var doubleSidedValue = true; CommonProperties.Add(new Property(PropertyName.DoubleSided, doubleSidedValue.ToString())); CommonProperties.Add(new Property(PropertyName.BaseColorTexture, baseColorTextureImage.ToReadmeString())); Model CreateModel(Action <List <Property>, Runtime.MeshPrimitive> setProperties) { var properties = new List <Property>(); var meshPrimitive = MeshPrimitive.CreateSinglePlane(); meshPrimitive.Material = new Runtime.Material(); meshPrimitive.Material.MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness(); // Apply the common properties to the gltf. meshPrimitive.Material.DoubleSided = doubleSidedValue; meshPrimitive.Material.MetallicRoughnessMaterial.BaseColorTexture = new Runtime.Texture { Source = baseColorTextureImage }; // Apply the properties that are specific to this gltf. setProperties(properties, meshPrimitive); // Create the gltf object. return(new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene { Nodes = new List <Runtime.Node> { new Runtime.Node { Mesh = new Runtime.Mesh { MeshPrimitives = new List <Runtime.MeshPrimitive> { meshPrimitive } }, }, }, }), }); } void SetVertexNormal(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { var planeNormalsValue = MeshPrimitive.GetSinglePlaneNormals(); meshPrimitive.Normals = planeNormalsValue; properties.Add(new Property(PropertyName.VertexNormal, planeNormalsValue.ToReadmeString())); } void SetVertexTangent(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { var planeTangentValue = MeshPrimitive.GetSinglePlaneTangents(); meshPrimitive.Tangents = planeTangentValue; properties.Add(new Property(PropertyName.VertexTangent, planeTangentValue.ToReadmeString())); } void SetNormalTexture(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.Material.NormalTexture = new Runtime.Texture { Source = normalImage }; properties.Add(new Property(PropertyName.NormalTexture, normalImage.ToReadmeString())); } Models = new List <Model> { CreateModel((properties, meshPrimitive) => { // There are no properties set on this model. }), CreateModel((properties, meshPrimitive) => { SetVertexNormal(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive) => { SetVertexNormal(properties, meshPrimitive); SetNormalTexture(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive) => { SetVertexNormal(properties, meshPrimitive); SetVertexTangent(properties, meshPrimitive); SetNormalTexture(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive) => { SetNormalTexture(properties, meshPrimitive); }), }; GenerateUsedPropertiesList(); }
public Node_NegativeScale(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_Nodes"); Runtime.Image normalImage = UseTexture(imageList, "Normal_Nodes"); Runtime.Image metallicRoughnessTextureImage = UseTexture(imageList, "MetallicRoughness_Nodes"); // Track the common properties for use in the readme. var translationValue = new Vector3(0, 2, 0); Matrix4x4 matrixTranslationValue = Matrix4x4.CreateTranslation(translationValue); CommonProperties.Add(new Property(PropertyName.Translation, translationValue.ToReadmeString())); CommonProperties.Add(new Property(PropertyName.BaseColorTexture, baseColorTextureImage.ToReadmeString())); CommonProperties.Add(new Property(PropertyName.NormalTexture, normalImage.ToReadmeString())); CommonProperties.Add(new Property(PropertyName.MetallicRoughnessTexture, metallicRoughnessTextureImage.ToReadmeString())); Model CreateModel(Action <List <Property>, Runtime.Node, Runtime.Node> setProperties) { var properties = new List <Property>(); List <Runtime.Node> nodes = Nodes.CreateMultiNode(); // Apply the common properties to the gltf. foreach (var node in nodes) { node.Mesh.MeshPrimitives.First().Material = new Runtime.Material { NormalTexture = new Runtime.Texture { Source = normalImage }, MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness { BaseColorTexture = new Runtime.Texture { Source = baseColorTextureImage }, MetallicRoughnessTexture = new Runtime.Texture { Source = metallicRoughnessTextureImage }, }, }; } // Apply the properties that are specific to this gltf. setProperties(properties, nodes[0], nodes[1]); // Applies a translation to avoid clipping the other node. // Models with a matrix applied have the translation applied in that matrix. if (properties.Find(e => e.Name == PropertyName.Matrix) == null) { nodes[1].Translation = translationValue; } // Create the gltf object. return(new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene { Nodes = new[] { nodes[0] } }) }); } void SetMatrixScaleX(List <Property> properties, Runtime.Node node) { node.Matrix = Matrix4x4.Multiply(Matrix4x4.CreateScale(new Vector3(-1.0f, 1.0f, 1.0f)), matrixTranslationValue); properties.Add(new Property(PropertyName.Matrix, node.Matrix.ToReadmeString())); } void SetMatrixScaleXY(List <Property> properties, Runtime.Node node) { node.Matrix = Matrix4x4.Multiply(Matrix4x4.CreateScale(new Vector3(-1.0f, -1.0f, 1.0f)), matrixTranslationValue); properties.Add(new Property(PropertyName.Matrix, node.Matrix.ToReadmeString())); } void SetMatrixScaleXYZ(List <Property> properties, Runtime.Node node) { node.Matrix = Matrix4x4.Multiply(Matrix4x4.CreateScale(new Vector3(-1.0f, -1.0f, -1.0f)), matrixTranslationValue); properties.Add(new Property(PropertyName.Matrix, node.Matrix.ToReadmeString())); } void SetScaleX(List <Property> properties, Runtime.Node node) { node.Scale = new Vector3(-1.0f, 1.0f, 1.0f); properties.Add(new Property(PropertyName.Scale, node.Scale.ToReadmeString())); } void SetScaleXY(List <Property> properties, Runtime.Node node) { node.Scale = new Vector3(-1.0f, -1.0f, 1.0f); properties.Add(new Property(PropertyName.Scale, node.Scale.ToReadmeString())); } void SetScaleXYZ(List <Property> properties, Runtime.Node node) { node.Scale = new Vector3(-1.0f, -1.0f, -1.0f); properties.Add(new Property(PropertyName.Scale, node.Scale.ToReadmeString())); } void SetVertexNormal(List <Property> properties, Runtime.Node nodeZero, Runtime.Node nodeOne) { var normals = Nodes.GetMultiNodeNormals(); nodeZero.Mesh.MeshPrimitives.First().Normals = normals; nodeOne.Mesh.MeshPrimitives.First().Normals = normals; properties.Add(new Property(PropertyName.VertexNormal, ":white_check_mark:")); } void SetVertexTangent(List <Property> properties, Runtime.Node nodeZero, Runtime.Node nodeOne) { var tangents = Nodes.GetMultiNodeTangents(); nodeZero.Mesh.MeshPrimitives.First().Tangents = tangents; nodeOne.Mesh.MeshPrimitives.First().Tangents = tangents; properties.Add(new Property(PropertyName.VertexTangent, ":white_check_mark:")); } Models = new List <Model> { CreateModel((properties, nodeZero, nodeOne) => { // There are no properties set on this model. }), CreateModel((properties, nodeZero, nodeOne) => { SetMatrixScaleX(properties, nodeOne); }), CreateModel((properties, nodeZero, nodeOne) => { SetMatrixScaleXY(properties, nodeOne); }), CreateModel((properties, nodeZero, nodeOne) => { SetMatrixScaleXYZ(properties, nodeOne); }), CreateModel((properties, nodeZero, nodeOne) => { SetScaleX(properties, nodeOne); }), CreateModel((properties, nodeZero, nodeOne) => { SetScaleXY(properties, nodeOne); }), CreateModel((properties, nodeZero, nodeOne) => { SetScaleXYZ(properties, nodeOne); }), CreateModel((properties, nodeZero, nodeOne) => { SetScaleX(properties, nodeOne); SetVertexNormal(properties, nodeZero, nodeOne); }), CreateModel((properties, nodeZero, nodeOne) => { SetScaleXY(properties, nodeOne); SetVertexNormal(properties, nodeZero, nodeOne); }), CreateModel((properties, nodeZero, nodeOne) => { SetScaleXYZ(properties, nodeOne); SetVertexNormal(properties, nodeZero, nodeOne); }), CreateModel((properties, nodeZero, nodeOne) => { SetScaleX(properties, nodeOne); SetVertexNormal(properties, nodeZero, nodeOne); SetVertexTangent(properties, nodeZero, nodeOne); }), CreateModel((properties, nodeZero, nodeOne) => { SetScaleXY(properties, nodeOne); SetVertexNormal(properties, nodeZero, nodeOne); SetVertexTangent(properties, nodeZero, nodeOne); }), CreateModel((properties, nodeZero, nodeOne) => { SetScaleXYZ(properties, nodeOne); SetVertexNormal(properties, nodeZero, nodeOne); SetVertexTangent(properties, nodeZero, nodeOne); }), }; GenerateUsedPropertiesList(); }
public Animation_SamplerType(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_Cube"); CommonProperties.Add(new Property(PropertyName.Target, "Rotation")); CommonProperties.Add(new Property(PropertyName.Interpolation, "Linear")); Model CreateModel(AnimationSampler.ComponentTypeEnum samplerOutputComponentType, string samplerOutputComponentTypeDisplayValue) { var properties = new List <Property>(); var cubeMeshPrimitive = MeshPrimitive.CreateCube(); // Apply the common properties to the gltf. cubeMeshPrimitive.Material = new Runtime.Material { MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness { BaseColorTexture = new Runtime.Texture { Source = baseColorTextureImage }, }, }; var node = new Runtime.Node { Mesh = new Runtime.Mesh { MeshPrimitives = new[] { cubeMeshPrimitive } } }; var channel = new Runtime.AnimationChannel { Target = new Runtime.AnimationChannelTarget { Node = node, Path = Runtime.AnimationChannelTarget.PathEnum.ROTATION, }, Sampler = new Runtime.LinearAnimationSampler <Quaternion> ( new[] { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, }, new[] { Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(90.0f), 0.0f, 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(-90.0f), 0.0f, 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(90.0f), 0.0f, 0.0f), }, outputComponentType: samplerOutputComponentType ) }; // Apply the properties that are specific to this gltf. properties.Add(new Property(PropertyName.SamplerOutputComponentType, samplerOutputComponentTypeDisplayValue)); // Create the gltf object. Runtime.GLTF gltf = CreateGLTF(() => new Runtime.Scene { Nodes = new[] { node }, }); gltf.Animations = new[] { new Runtime.Animation { Channels = new List <Runtime.AnimationChannel> { channel } } }; return(new Model { Properties = properties, GLTF = gltf, Animated = true, }); } Models = new List <Model> { CreateModel(AnimationSampler.ComponentTypeEnum.FLOAT, "Float"), CreateModel(AnimationSampler.ComponentTypeEnum.NORMALIZED_BYTE, "Byte"), CreateModel(AnimationSampler.ComponentTypeEnum.NORMALIZED_SHORT, "Short"), }; GenerateUsedPropertiesList(); }
public Mesh_PrimitiveAttribute(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_Plane"); Runtime.Image normalImage = UseTexture(imageList, "Normal_Plane"); // Track the common properties for use in the readme. CommonProperties.Add(new Property(PropertyName.BaseColorTexture, baseColorTextureImage.ToReadmeString())); Model CreateModel(Action <List <Property>, Runtime.MeshPrimitive> setProperties) { var properties = new List <Property>(); var meshPrimitive = MeshPrimitive.CreateSinglePlane(); meshPrimitive.Material = new Runtime.Material(); // Apply the common properties to the gltf. meshPrimitive.Material.MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness { BaseColorTexture = new Runtime.Texture { Source = baseColorTextureImage } }; // Apply the properties that are specific to this gltf. setProperties(properties, meshPrimitive); // Create the gltf object. return(new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene { Nodes = new List <Runtime.Node> { new Runtime.Node { Mesh = new Runtime.Mesh { MeshPrimitives = new List <Runtime.MeshPrimitive> { meshPrimitive } }, }, }, }), }); } void SetVertexUVFloat(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.TextureCoordsComponentType = TextureCoordsComponentTypeEnum.FLOAT; properties.Add(new Property(PropertyName.VertexUV0, meshPrimitive.TextureCoordsComponentType.ToReadmeString())); } void SetVertexUVByte(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.TextureCoordsComponentType = TextureCoordsComponentTypeEnum.NORMALIZED_UBYTE; properties.Add(new Property(PropertyName.VertexUV0, meshPrimitive.TextureCoordsComponentType.ToReadmeString())); } void SetVertexUVShort(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.TextureCoordsComponentType = TextureCoordsComponentTypeEnum.NORMALIZED_USHORT; properties.Add(new Property(PropertyName.VertexUV0, meshPrimitive.TextureCoordsComponentType.ToReadmeString())); } void SetVertexNormal(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { var planeNormalsValue = MeshPrimitive.GetSinglePlaneNormals(); meshPrimitive.Normals = planeNormalsValue; properties.Add(new Property(PropertyName.VertexNormal, planeNormalsValue.ToReadmeString())); } void SetVertexTangent(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { var planeTangentValue = new List <Vector4> { new Vector4(1.0f, 0.0f, 0.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f) }; meshPrimitive.Tangents = planeTangentValue; properties.Add(new Property(PropertyName.VertexTangent, planeTangentValue.ToReadmeString())); } void SetNormalTexture(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.Material.NormalTexture = new Runtime.Texture { Source = normalImage }; properties.Add(new Property(PropertyName.NormalTexture, normalImage.ToReadmeString())); } Models = new List <Model> { CreateModel((properties, meshPrimitive) => { SetVertexUVFloat(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive) => { SetVertexUVByte(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive) => { SetVertexUVShort(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive) => { SetVertexUVFloat(properties, meshPrimitive); SetVertexNormal(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive) => { SetVertexUVFloat(properties, meshPrimitive); SetNormalTexture(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive) => { SetVertexUVFloat(properties, meshPrimitive); SetVertexNormal(properties, meshPrimitive); SetNormalTexture(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive) => { SetVertexUVFloat(properties, meshPrimitive); SetVertexNormal(properties, meshPrimitive); SetVertexTangent(properties, meshPrimitive); SetNormalTexture(properties, meshPrimitive); }), }; GenerateUsedPropertiesList(); }
public Animation_Node(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_Cube"); // There are no common properties in this model group that are reported in the readme. Model CreateModel(Action <List <Property>, List <Runtime.AnimationChannel>, Runtime.Node> setProperties) { var properties = new List <Property>(); var cubeMeshPrimitive = MeshPrimitive.CreateCube(); // Apply the common properties to the gltf. cubeMeshPrimitive.Material = new Runtime.Material { MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness { BaseColorTexture = new Runtime.Texture { Source = baseColorTextureImage }, }, }; var channels = new List <Runtime.AnimationChannel> { new Runtime.AnimationChannel() }; var node = new Runtime.Node(); // Apply the properties that are specific to this gltf. setProperties(properties, channels, node); // Create the gltf object. node.Mesh = new Runtime.Mesh { MeshPrimitives = new[] { cubeMeshPrimitive } }; Runtime.GLTF gltf = CreateGLTF(() => new Runtime.Scene() { Nodes = new[] { node }, }); gltf.Animations = new[] { new Runtime.Animation { Channels = channels } }; return(new Model { Properties = properties, GLTF = gltf, Animated = true, }); } void SetTranslationChannelTarget(List <Property> properties, Runtime.AnimationChannel channel, Runtime.Node node) { channel.Target = new Runtime.AnimationChannelTarget { Node = node, Path = Runtime.AnimationChannelTarget.PathEnum.TRANSLATION, }; properties.Add(new Property(PropertyName.Target, "Translation")); } void SetRotationChannelTarget(List <Property> properties, Runtime.AnimationChannel channel, Runtime.Node node) { channel.Target = new Runtime.AnimationChannelTarget { Node = node, Path = Runtime.AnimationChannelTarget.PathEnum.ROTATION, }; properties.Add(new Property(PropertyName.Target, "Rotation")); } void SetScaleChannelTarget(List <Property> properties, Runtime.AnimationChannel channel, Runtime.Node node) { channel.Target = new Runtime.AnimationChannelTarget { Node = node, Path = Runtime.AnimationChannelTarget.PathEnum.SCALE, }; properties.Add(new Property(PropertyName.Target, "Scale")); } void SetLinearSamplerForTranslation(List <Property> properties, Runtime.AnimationChannel channel) { channel.Sampler = new Runtime.LinearAnimationSampler <Vector3> ( new[] { 0.0f, 1.0f, 2.0f, }, new[] { new Vector3(-0.1f, 0.0f, 0.0f), new Vector3(0.1f, 0.0f, 0.0f), new Vector3(-0.1f, 0.0f, 0.0f), } ); properties.Add(new Property(PropertyName.Interpolation, "Linear")); } void SetLinearSamplerForScale(List <Property> properties, Runtime.AnimationChannel channel) { channel.Sampler = new Runtime.LinearAnimationSampler <Vector3> ( new[] { 0.0f, 1.0f, 2.0f, }, new[] { new Vector3(0.8f, 0.8f, 0.8f), new Vector3(1.2f, 1.2f, 1.2f), new Vector3(0.8f, 0.8f, 0.8f), } ); properties.Add(new Property(PropertyName.Interpolation, "Linear")); } void SetLinearSamplerForRotation(List <Property> properties, Runtime.AnimationChannel channel) { channel.Sampler = new Runtime.LinearAnimationSampler <Quaternion> ( new[] { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, }, new[] { Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(90.0f), 0.0f, 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(-90.0f), 0.0f, 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(90.0f), 0.0f, 0.0f), } ); properties.Add(new Property(PropertyName.Interpolation, "Linear")); } void SetStepSamplerForTranslation(List <Property> properties, Runtime.AnimationChannel channel) { channel.Sampler = new Runtime.StepAnimationSampler <Vector3> ( new[] { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, }, new[] { new Vector3(-0.1f, 0.0f, 0.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.1f, 0.0f, 0.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(-0.1f, 0.0f, 0.0f), } ); properties.Add(new Property(PropertyName.Interpolation, "Step")); } void SetCubicSplineSamplerForTranslation(List <Property> properties, Runtime.AnimationChannel channel) { channel.Sampler = new Runtime.CubicSplineAnimationSampler <Vector3> ( new[] { 0.0f, 1.0f, 2.0f, }, new[] { new Runtime.CubicSplineAnimationSampler <Vector3> .Key { InTangent = new Vector3(0.0f, 0.0f, 0.0f), Value = new Vector3(-0.1f, 0.0f, 0.0f), OutTangent = new Vector3(0.0f, 0.0f, 0.0f) }, new Runtime.CubicSplineAnimationSampler <Vector3> .Key { InTangent = new Vector3(0.0f, 0.0f, 0.0f), Value = new Vector3(0.1f, 0.0f, 0.0f), OutTangent = new Vector3(0.0f, -0.3f, 0.0f) }, new Runtime.CubicSplineAnimationSampler <Vector3> .Key { InTangent = new Vector3(0.0f, 0.0f, 0.0f), Value = new Vector3(-0.1f, 0.0f, 0.0f), OutTangent = new Vector3(0.0f, 0.0f, 0.0f) } } ); properties.Add(new Property(PropertyName.Interpolation, "Cubic Spline")); } void CreateCubicSplineSamplerForRotation(List <Property> properties, Runtime.AnimationChannel channel) { channel.Sampler = new Runtime.CubicSplineAnimationSampler <Quaternion> ( new[] { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, }, new[] { new Runtime.CubicSplineAnimationSampler <Quaternion> .Key { InTangent = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f), Value = Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(90.0f), 0.0f, 0.0f), OutTangent = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f) }, new Runtime.CubicSplineAnimationSampler <Quaternion> .Key { InTangent = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f), Value = Quaternion.Identity, OutTangent = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f) }, new Runtime.CubicSplineAnimationSampler <Quaternion> .Key { InTangent = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f), Value = Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(-90.0f), 0.0f, 0.0f), OutTangent = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f) }, new Runtime.CubicSplineAnimationSampler <Quaternion> .Key { InTangent = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f), Value = Quaternion.Identity, OutTangent = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f) }, new Runtime.CubicSplineAnimationSampler <Quaternion> .Key { InTangent = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f), Value = Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(90.0f), 0.0f, 0.0f), OutTangent = new Quaternion(0.0f, 0.0f, 0.0f, 0.0f) }, } ); properties.Add(new Property(PropertyName.Interpolation, "Cubic Spline")); } Models = new List <Model> { CreateModel((properties, channels, node) => { SetTranslationChannelTarget(properties, channels[0], node); SetLinearSamplerForTranslation(properties, channels[0]); }), CreateModel((properties, channels, node) => { SetRotationChannelTarget(properties, channels[0], node); SetLinearSamplerForRotation(properties, channels[0]); }), CreateModel((properties, channels, node) => { SetScaleChannelTarget(properties, channels[0], node); SetLinearSamplerForScale(properties, channels[0]); }), CreateModel((properties, channels, node) => { SetTranslationChannelTarget(properties, channels[0], node); SetStepSamplerForTranslation(properties, channels[0]); }), CreateModel((properties, channels, node) => { SetTranslationChannelTarget(properties, channels[0], node); SetCubicSplineSamplerForTranslation(properties, channels[0]); }), CreateModel((properties, channels, node) => { SetRotationChannelTarget(properties, channels[0], node); CreateCubicSplineSamplerForRotation(properties, channels[0]); }), }; GenerateUsedPropertiesList(); }
public Material_Mixed(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_X"); UseFigure(imageList, "UVSpace2"); UseFigure(imageList, "UVSpace3"); // Track the common properties for use in the readme. CommonProperties.Add(new Property(PropertyName.ExtensionUsed, "Specular Glossiness")); CommonProperties.Add(new Property(PropertyName.BaseColorTexture, baseColorTextureImage)); Model CreateModel(Action <List <Property>, Runtime.Material, Runtime.Material> setProperties) { var properties = new List <Property>(); var meshPrimitives = MeshPrimitive.CreateMultiPrimitivePlane(); var baseColorTexture = new Runtime.Texture { Source = baseColorTextureImage }; meshPrimitives[0].Material = new Runtime.Material(); meshPrimitives[0].Material.MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness(); meshPrimitives[1].Material = new Runtime.Material(); meshPrimitives[1].Material.MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness(); // Apply the common properties to the gltf. meshPrimitives[0].Material.MetallicRoughnessMaterial.BaseColorTexture = baseColorTexture; meshPrimitives[1].Material.MetallicRoughnessMaterial.BaseColorTexture = baseColorTexture; // Apply the properties that are specific to this gltf. setProperties(properties, meshPrimitives[0].Material, meshPrimitives[1].Material); // Create the gltf object. return(new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene() { Nodes = new[] { new Runtime.Node { Mesh = new Runtime.Mesh { MeshPrimitives = meshPrimitives }, }, }, }, extensionsUsed: new List <string>() { "KHR_materials_pbrSpecularGlossiness" }), }); } void SetSpecularGlossiness0(List <Property> properties, Runtime.Material material0) { material0.Extensions = new List <Runtime.Extensions.Extension>() { new Runtime.Extensions.KHR_materials_pbrSpecularGlossiness() }; properties.Add(new Property(PropertyName.SpecularGlossinessOnMaterial0, ":white_check_mark:")); } void SetSpecularGlossiness1(List <Property> properties, Runtime.Material material1) { material1.Extensions = new List <Runtime.Extensions.Extension>() { new Runtime.Extensions.KHR_materials_pbrSpecularGlossiness() }; properties.Add(new Property(PropertyName.SpecularGlossinessOnMaterial1, ":white_check_mark:")); } void NoSpecularGlossiness0(List <Property> properties) { properties.Add(new Property(PropertyName.SpecularGlossinessOnMaterial0, ":x:")); } void NoSpecularGlossiness1(List <Property> properties) { properties.Add(new Property(PropertyName.SpecularGlossinessOnMaterial1, ":x:")); } Models = new List <Model> { CreateModel((properties, material0, material1) => { SetSpecularGlossiness0(properties, material0); SetSpecularGlossiness1(properties, material1); }), CreateModel((properties, material0, material1) => { NoSpecularGlossiness0(properties); NoSpecularGlossiness1(properties); }), CreateModel((properties, material0, material1) => { SetSpecularGlossiness0(properties, material0); NoSpecularGlossiness1(properties); }), }; GenerateUsedPropertiesList(); }
public Animation_NodeMisc(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_Cube"); // There are no common properties in this model group that are reported in the readme. Model CreateModel(Action <List <Property>, List <Runtime.AnimationChannel>, List <Runtime.Node>, List <Runtime.Animation> > setProperties) { var properties = new List <Property>(); var cubeMeshPrimitive = MeshPrimitive.CreateCube(); // Apply the common properties to the gltf. cubeMeshPrimitive.Material = new Runtime.Material { MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness { BaseColorTexture = new Runtime.Texture { Source = baseColorTextureImage }, }, }; var channels = new List <Runtime.AnimationChannel> { new Runtime.AnimationChannel() }; var nodes = new List <Runtime.Node> { new Runtime.Node(), }; var animations = new List <Runtime.Animation> { new Runtime.Animation { Channels = channels } }; // Apply the properties that are specific to this gltf. setProperties(properties, channels, nodes, animations); // Create the gltf object. foreach (var node in nodes) { node.Mesh = new Runtime.Mesh { MeshPrimitives = new List <Runtime.MeshPrimitive> { cubeMeshPrimitive } }; } Runtime.GLTF gltf = CreateGLTF(() => new Runtime.Scene { Nodes = nodes }); gltf.Animations = animations; return(new Model { Properties = properties, GLTF = gltf, Animated = true, }); } void SetTranslationChannelTarget(Runtime.AnimationChannel channel, Runtime.Node node) { channel.Target = new Runtime.AnimationChannelTarget { Node = node, Path = Runtime.AnimationChannelTarget.PathEnum.TRANSLATION, }; } void SetRotationChannelTarget(Runtime.AnimationChannel channel, Runtime.Node node) { channel.Target = new Runtime.AnimationChannelTarget { Node = node, Path = Runtime.AnimationChannelTarget.PathEnum.ROTATION, }; } void SetLinearSamplerForTranslation(Runtime.AnimationChannel channel) { channel.Sampler = new Runtime.LinearAnimationSampler <Vector3> ( new[] { 0.0f, 2.0f, 4.0f, }, new[] { new Vector3(-0.1f, 0.0f, 0.0f), new Vector3(0.1f, 0.0f, 0.0f), new Vector3(-0.1f, 0.0f, 0.0f), } ); } void SetLinearSamplerForHorizontalRotation(Runtime.AnimationChannel channel) { channel.Sampler = new Runtime.LinearAnimationSampler <Quaternion> ( new[] { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, }, new[] { Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(90.0f), 0.0f, 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(-90.0f), 0.0f, 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(90.0f), 0.0f, 0.0f), } ); } void SetLinearSamplerForVerticalRotation(Runtime.AnimationChannel channel) { channel.Sampler = new Runtime.LinearAnimationSampler <Quaternion> ( new[] { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, }, new[] { Quaternion.CreateFromYawPitchRoll(0.0f, FloatMath.ToRadians(90.0f), 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(0.0f, FloatMath.ToRadians(-90.0f), 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(0.0f, FloatMath.ToRadians(90.0f), 0.0f), } ); } void SetLinearSamplerForConstantRotation(Runtime.AnimationChannel channel) { channel.Sampler = new Runtime.LinearAnimationSampler <Quaternion> ( new[] { 0.0f, 6.0f, }, new[] { Quaternion.CreateFromYawPitchRoll(-FloatMath.Pi / 3.0f, 0.0f, 0.0f), Quaternion.CreateFromYawPitchRoll(-FloatMath.Pi / 3.0f, 0.0f, 0.0f), } ); } void SetLinearSamplerForTranslationStartsAboveZero(Runtime.AnimationChannel channel) { channel.Sampler = new Runtime.LinearAnimationSampler <Vector3> ( new[] { 2.0f, 4.0f, 6.0f, }, new[] { new Vector3(0.0f, -0.1f, 0.0f), new Vector3(0.0f, 0.1f, 0.0f), new Vector3(0.0f, -0.1f, 0.0f), } ); } void SetLinearSamplerWithOneKey(Runtime.AnimationChannel channel) { channel.Sampler = new Runtime.LinearAnimationSampler <Vector3> ( new[] { 0.0f, }, new[] { new Vector3(-0.1f, 0.0f, 0.0f), } ); } void SetLinearSamplerForRotationThatStartsAboveZero(Runtime.AnimationChannel channel) { channel.Sampler = new Runtime.LinearAnimationSampler <Quaternion> ( new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, }, new[] { Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(90.0f), 0.0f, 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(-90.0f), 0.0f, 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(FloatMath.ToRadians(90.0f), 0.0f, 0.0f), } ); } void CreateMultipleChannelsWithUniqueTargets(List <Runtime.AnimationChannel> channels, Runtime.Node node) { // The first channel is already added as a common property. channels.Add(new Runtime.AnimationChannel()); SetTranslationChannelTarget(channels[0], node); SetRotationChannelTarget(channels[1], node); var samplerPropertiesList = new List <Property>(); SetLinearSamplerForTranslation(channels[0]); SetLinearSamplerForHorizontalRotation(channels[1]); } void CreateMultipleChannelsWithDifferentTimes(List <Runtime.AnimationChannel> channels, Runtime.Node node) { // The first channel is already added as a common property. channels.Add(new Runtime.AnimationChannel()); SetTranslationChannelTarget(channels[0], node); SetRotationChannelTarget(channels[1], node); SetLinearSamplerForTranslationStartsAboveZero(channels[0]); SetLinearSamplerForRotationThatStartsAboveZero(channels[1]); } void CreateMultipleChannelsForDifferentNodes(List <Runtime.AnimationChannel> channels, Runtime.Node node0, Runtime.Node node1) { // The first channel is already added as a common property. channels.Add(new Runtime.AnimationChannel()); SetRotationChannelTarget(channels[0], node0); SetRotationChannelTarget(channels[1], node1); SetLinearSamplerForHorizontalRotation(channels[0]); SetLinearSamplerForVerticalRotation(channels[1]); } Models = new List <Model> { CreateModel((properties, channels, nodes, animations) => { // Multiple channels CreateMultipleChannelsWithUniqueTargets(channels, nodes[0]); properties.Add(new Property(PropertyName.Description, "There are two channels. The first channel targets translation. The second channel targets rotation. The start and end times of both channels are `0.0` and `4.0` respectively.")); }), CreateModel((properties, channels, nodes, animations) => { // Curve that doesn't start at zero SetRotationChannelTarget(channels[0], nodes[0]); SetLinearSamplerForRotationThatStartsAboveZero(channels[0]); properties.Add(new Property(PropertyName.Description, "There is one channel with a non-zero start time. The channel targets rotation. The start time is `1.0`.")); }), CreateModel((properties, channels, nodes, animations) => { // Two channels with different start/end times CreateMultipleChannelsWithDifferentTimes(channels, nodes[0]); properties.Add(new Property(PropertyName.Description, "There are two channels with different start and end times. The first channel targets translation with start and end times of `2.0` and `6.0` respectively. The second channel targets rotation with start and end times of `1.0` and `5.0` respectively.")); }), CreateModel((properties, channels, nodes, animations) => { // Has only one key SetTranslationChannelTarget(channels[0], nodes[0]); SetLinearSamplerWithOneKey(channels[0]); properties.Add(new Property(PropertyName.Description, "There is one channel with only one keyframe. The channel targets translation with a value of <code>[-0.1, 0.0, 0.0]</code>.")); }), CreateModel((properties, channels, nodes, animations) => { // Creates a second node based on the existing node, and applies a transform to help differentiate them. nodes.Add(DeepCopy.CloneObject(nodes[0])); nodes[0].Translation = new Vector3(-0.2f, 0.0f, 0.0f); nodes[1].Translation = new Vector3(0.2f, 0.0f, 0.0f); nodes[0].Scale = new Vector3(0.5f, 0.5f, 0.5f); nodes[1].Scale = new Vector3(0.5f, 0.5f, 0.5f); // One animation, two channels for two nodes. CreateMultipleChannelsForDifferentNodes(channels, nodes[0], nodes[1]); properties.Add(new Property(PropertyName.Description, "There are two channels with different nodes. The first channel targets the left node and rotation along the X axis. The second channel targets the right node and rotation along the Y axis.")); }), CreateModel((properties, channels, nodes, animations) => { // Rotate the model, and then apply the same target animation to it (Animation overrides) nodes[0].Rotation = Quaternion.CreateFromYawPitchRoll(FloatMath.Pi / 3.0f, 0.0f, 0.0f); SetRotationChannelTarget(channels[0], nodes[0]); SetLinearSamplerForConstantRotation(channels[0]); properties.Add(new Property(PropertyName.Description, "There is one channel that targets a node. The node has a rotation of <code>[0.0, 0.5, 0.0, 0.866]</code>. The channel overrides the rotation of the node to a different constant value of <code>[0.0, -0.5, 0.0, 0.866]</code>.")); }), CreateModel((properties, channels, nodes, animations) => { // Rotate the model, and then apply an translation animation to it (Animation doesn't override rotation) nodes[0].Rotation = Quaternion.CreateFromYawPitchRoll(FloatMath.Pi / 3.0f, 0.0f, 0.0f); SetTranslationChannelTarget(channels[0], nodes[0]); SetLinearSamplerForTranslation(channels[0]); properties.Add(new Property(PropertyName.Description, "There is one channel that targets a node. The node has a rotation of <code>[0.0, 0.5, 0.0, 0.866]</code>. The channel targets the translation of the node.")); }), CreateModel((properties, channels, nodes, animations) => { // Two animations. One rotates, the other translates. They should not interact or bleed across. var channel = new Runtime.AnimationChannel(); SetTranslationChannelTarget(channel, nodes[0]); SetLinearSamplerForTranslation(channel); animations.Add(new Runtime.Animation { Channels = new[] { channel } }); // The first animation is already added as an empty common property. SetRotationChannelTarget(channels[0], nodes[0]); SetLinearSamplerForHorizontalRotation(channels[0]); properties.Add(new Property(PropertyName.Description, "There are two animations, each with one channel. The first animation's channel targets rotation. The second animation's channel targets translation.")); }), CreateModel((properties, channels, nodes, animations) => { // Multiple channels, but one omits node (the channel with no target node is ignored per the spec). CreateMultipleChannelsForDifferentNodes(channels, null, nodes[0]); properties.Add(new Property(PropertyName.Description, "There are two channels. The first channel has a rotation along the X axis but does not specify a node. The second channel does target the node and has a rotation along the Y axis.")); }), }; GenerateUsedPropertiesList(); }
public Buffer_Interleaved(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_Grey"); // Track the common properties for use in the readme. CommonProperties.Add(new Property(PropertyName.BaseColorTexture, baseColorTextureImage)); Model CreateModel(Action <List <Property>, Runtime.MeshPrimitive> setProperties) { var properties = new List <Property>(); Runtime.MeshPrimitive meshPrimitive = MeshPrimitive.CreateSinglePlane(); // Apply the common properties to the gltf. meshPrimitive.Interleave = true; meshPrimitive.Colors = new[] { new Vector4(0.0f, 1.0f, 0.0f, 0.2f), new Vector4(1.0f, 0.0f, 0.0f, 0.2f), new Vector4(1.0f, 1.0f, 0.0f, 0.2f), new Vector4(0.0f, 0.0f, 1.0f, 0.2f), }; meshPrimitive.Material = new Runtime.Material() { MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness() { BaseColorTexture = new Runtime.Texture() { Source = baseColorTextureImage, Sampler = new Runtime.Sampler(), }, }, }; // Apply the properties that are specific to this gltf. setProperties(properties, meshPrimitive); // Create the gltf object. return(new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene() { Nodes = new[] { new Runtime.Node { Mesh = new Runtime.Mesh { MeshPrimitives = new[] { meshPrimitive } }, }, }, }), }); } void SetUvTypeFloat(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.TextureCoordsComponentType = TextureCoordsComponentTypeEnum.FLOAT; properties.Add(new Property(PropertyName.VertexUV0, "Float")); } void SetUvTypeTypeByte(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.TextureCoordsComponentType = TextureCoordsComponentTypeEnum.NORMALIZED_UBYTE; properties.Add(new Property(PropertyName.VertexUV0, "Byte")); } void SetUvTypeTypeShort(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.TextureCoordsComponentType = TextureCoordsComponentTypeEnum.NORMALIZED_USHORT; properties.Add(new Property(PropertyName.VertexUV0, "Short")); } void SetColorTypeFloat(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.ColorComponentType = ColorComponentTypeEnum.FLOAT; meshPrimitive.ColorType = ColorTypeEnum.VEC3; properties.Add(new Property(PropertyName.VertexColor, "Vector3 Float")); } void SetColorTypeByte(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.ColorComponentType = ColorComponentTypeEnum.NORMALIZED_UBYTE; meshPrimitive.ColorType = ColorTypeEnum.VEC3; properties.Add(new Property(PropertyName.VertexColor, "Vector3 Byte")); } void SetColorTypeShort(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.ColorComponentType = ColorComponentTypeEnum.NORMALIZED_USHORT; meshPrimitive.ColorType = ColorTypeEnum.VEC3; properties.Add(new Property(PropertyName.VertexColor, "Vector3 Short")); } Models = new List <Model> { CreateModel((properties, meshPrimitive) => { SetUvTypeFloat(properties, meshPrimitive); SetColorTypeFloat(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive) => { SetUvTypeFloat(properties, meshPrimitive); SetColorTypeByte(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive) => { SetUvTypeFloat(properties, meshPrimitive); SetColorTypeShort(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive) => { SetUvTypeTypeByte(properties, meshPrimitive); SetColorTypeFloat(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive) => { SetUvTypeTypeShort(properties, meshPrimitive); SetColorTypeFloat(properties, meshPrimitive); }), }; GenerateUsedPropertiesList(); }
public Material(List <string> imageList) { Runtime.Image emissiveImage = UseTexture(imageList, "Emissive_Plane"); Runtime.Image normalImage = UseTexture(imageList, "Normal_Plane"); Runtime.Image occlusionImage = UseTexture(imageList, "Occlusion_Plane"); // Track the common properties for use in the readme. var metallicFactorValue = 0.0f; var baseColorFactorValue = new Vector4(0.2f, 0.2f, 0.2f, 1.0f); CommonProperties.Add(new Property(PropertyName.MetallicFactor, metallicFactorValue)); CommonProperties.Add(new Property(PropertyName.BaseColorFactor, baseColorFactorValue)); Model CreateModel(Action <List <Property>, Runtime.MeshPrimitive, Runtime.Material> setProperties) { var properties = new List <Property>(); Runtime.MeshPrimitive meshPrimitive = MeshPrimitive.CreateSinglePlane(); meshPrimitive.Material = new Runtime.Material(); meshPrimitive.Material.MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness(); // Apply the common properties to the gltf. meshPrimitive.Material.MetallicRoughnessMaterial.MetallicFactor = metallicFactorValue; meshPrimitive.Material.MetallicRoughnessMaterial.BaseColorFactor = baseColorFactorValue; // Apply the properties that are specific to this gltf. setProperties(properties, meshPrimitive, meshPrimitive.Material); // Create the gltf object. return(new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene() { Nodes = new List <Runtime.Node> { new Runtime.Node { Mesh = new Runtime.Mesh { MeshPrimitives = new List <Runtime.MeshPrimitive> { meshPrimitive } }, }, }, }), }); } void SetNormalTexture(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { var planeNormalsValue = new[] { new Vector3(0.0f, 0.0f, 1.0f), new Vector3(0.0f, 0.0f, 1.0f), new Vector3(0.0f, 0.0f, 1.0f), new Vector3(0.0f, 0.0f, 1.0f), }; meshPrimitive.Normals = planeNormalsValue; meshPrimitive.Material.NormalTexture = new Runtime.Texture { Source = normalImage }; properties.Add(new Property(PropertyName.NormalTexture, normalImage)); } void SetNormalScale(List <Property> properties, Runtime.Material material) { material.NormalScale = 10.0f; properties.Add(new Property(PropertyName.NormalTextureScale, material.NormalScale)); } void SetOcclusionTexture(List <Property> properties, Runtime.Material material) { material.OcclusionTexture = new Runtime.Texture { Source = occlusionImage }; properties.Add(new Property(PropertyName.OcclusionTexture, occlusionImage)); } void SetOcclusionStrength(List <Property> properties, Runtime.Material material) { material.OcclusionStrength = 0.5f; properties.Add(new Property(PropertyName.OcclusionTextureStrength, material.OcclusionStrength)); } void SetEmissiveTexture(List <Property> properties, Runtime.Material material) { material.EmissiveTexture = new Runtime.Texture { Source = emissiveImage }; properties.Add(new Property(PropertyName.EmissiveTexture, emissiveImage)); } void SetEmissiveFactor(List <Property> properties, Runtime.Material material) { var emissiveFactorValue = new Vector3(1.0f, 1.0f, 1.0f); material.EmissiveFactor = emissiveFactorValue; properties.Add(new Property(PropertyName.EmissiveFactor, emissiveFactorValue)); } Models = new List <Model> { CreateModel((properties, meshPrimitive, material) => { // There are no properties set on this model. }), CreateModel((properties, meshPrimitive, material) => { SetNormalTexture(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive, material) => { SetOcclusionTexture(properties, material); }), CreateModel((properties, meshPrimitive, material) => { SetEmissiveFactor(properties, material); }), CreateModel((properties, meshPrimitive, material) => { SetNormalTexture(properties, meshPrimitive); SetNormalScale(properties, material); }), CreateModel((properties, meshPrimitive, material) => { SetOcclusionTexture(properties, material); SetOcclusionStrength(properties, material); }), CreateModel((properties, meshPrimitive, material) => { SetEmissiveTexture(properties, material); SetEmissiveFactor(properties, material); }), CreateModel((properties, meshPrimitive, material) => { SetNormalTexture(properties, meshPrimitive); SetNormalScale(properties, material); SetOcclusionTexture(properties, material); SetOcclusionStrength(properties, material); SetEmissiveTexture(properties, material); SetEmissiveFactor(properties, material); }), }; GenerateUsedPropertiesList(); }
public Instancing(List <string> imageList) { Runtime.Image baseColorTextureImageA = UseTexture(imageList, "BaseColor_A"); Runtime.Image baseColorTextureImageB = UseTexture(imageList, "BaseColor_B"); Runtime.Image baseColorTextureImageCube = UseTexture(imageList, "BaseColor_Cube"); var distantCamera = new Manifest.Camera(new Vector3(0.0f, 0.0f, 2.7f)); // There are no common properties in this model group that are reported in the readme. Model CreateModel(Action <List <Property>, List <Runtime.Node>, List <Runtime.Animation> > setProperties, Action <Model> setCamera) { var properties = new List <Property>(); var animations = new List <Runtime.Animation>(); var animated = true; var nodes = new List <Runtime.Node>(); // Apply the properties that are specific to this gltf. setProperties(properties, nodes, animations); // If no animations are used, null out that property. if (!animations.Any()) { animations = null; animated = false; } // Create the gltf object. var model = new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene { Nodes = nodes }, animations: animations), Animated = animated, }; setCamera(model); return(model); } var SamplerInputLinear = new[] { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, }; var SamplerInputCurve = new[] { 0.0f, 0.5f, 1.0f, 2.0f, 4.0f, }; var SamplerOutput = new[] { Quaternion.CreateFromYawPitchRoll(0.0f, FloatMath.ToRadians(90.0f), 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(0.0f, FloatMath.ToRadians(-90.0f), 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(0.0f, FloatMath.ToRadians(90.0f), 0.0f), }; var SamplerOutputReverse = new[] { Quaternion.CreateFromYawPitchRoll(0.0f, FloatMath.ToRadians(-90.0f), 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(0.0f, FloatMath.ToRadians(90.0f), 0.0f), Quaternion.Identity, Quaternion.CreateFromYawPitchRoll(0.0f, FloatMath.ToRadians(-90.0f), 0.0f), }; Runtime.Texture CreateTexture(Runtime.Image image) { return(new Runtime.Texture { Source = image }); } Runtime.Material CreateMaterial(Runtime.Texture texture) { return(new Runtime.Material { MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness { BaseColorTexture = texture } }); } void AddMeshPrimitivesToSingleNode(List <Runtime.Node> nodes, List <Runtime.MeshPrimitive> meshPrimitives) { // If there are multiple mesh primitives, offset their position so they don't overlap. if (meshPrimitives.Count > 1) { meshPrimitives[0].Positions = meshPrimitives[0].Positions.Select(position => { return(new Vector3(position.X - 0.6f, position.Y, position.Z)); }); meshPrimitives[1].Positions = meshPrimitives[1].Positions.Select(position => { return(new Vector3(position.X + 0.6f, position.Y, position.Z)); }); } nodes.Add( new Runtime.Node { Mesh = new Runtime.Mesh { MeshPrimitives = meshPrimitives } } ); } void AddMeshPrimitivesToMultipleNodes(List <Runtime.Node> nodes, Runtime.MeshPrimitive meshPrimitives0, Runtime.MeshPrimitive meshPrimitives1) { nodes.AddRange(new[] { new Runtime.Node { Translation = new Vector3(-0.6f, 0.0f, 0.0f), Mesh = new Runtime.Mesh { MeshPrimitives = new List <Runtime.MeshPrimitive> { meshPrimitives0 } } }, new Runtime.Node { Translation = new Vector3(0.6f, 0.0f, 0.0f), Mesh = new Runtime.Mesh { MeshPrimitives = new List <Runtime.MeshPrimitive> { meshPrimitives1 } } } } ); } void AddAnimation(List <Runtime.Animation> animations, List <Runtime.Node> nodes, Runtime.AnimationSampler sampler0, Runtime.AnimationSampler sampler1, bool samplerInstanced) { animations.Add(new Runtime.Animation { Channels = new List <Runtime.AnimationChannel> { new Runtime.AnimationChannel { Target = new Runtime.AnimationChannelTarget { Node = nodes[0], Path = ROTATION, }, Sampler = sampler0 }, new Runtime.AnimationChannel { Target = new Runtime.AnimationChannelTarget { Node = nodes[1], Path = ROTATION, }, Sampler = sampler1 }, } }); } Models = new List <Model> { CreateModel((properties, nodes, animations) => { var meshPrimitives = new List <Runtime.MeshPrimitive> { MeshPrimitive.CreateSinglePlane(includeTextureCoords: false), MeshPrimitive.CreateSinglePlane(includeTextureCoords: false) }; foreach (Runtime.MeshPrimitive meshPrimitive in meshPrimitives) { // This non-standard set of texture coordinates is larger than the texture but not an exact multiple, so it allows texture sampler settings to be visible. meshPrimitive.TextureCoordSets = new List <List <Vector2> > { new List <Vector2> { new Vector2(1.3f, 1.3f), new Vector2(-0.3f, 1.3f), new Vector2(-0.3f, -0.3f), new Vector2(1.3f, -0.3f), } }; } meshPrimitives[0].Material = CreateMaterial(CreateTexture(baseColorTextureImageA)); meshPrimitives[1].Material = CreateMaterial(CreateTexture(baseColorTextureImageA)); meshPrimitives[0].Material.MetallicRoughnessMaterial.BaseColorTexture.Sampler = new Runtime.Sampler { WrapT = WrapTEnum.CLAMP_TO_EDGE, WrapS = WrapSEnum.CLAMP_TO_EDGE }; meshPrimitives[1].Material.MetallicRoughnessMaterial.BaseColorTexture.Sampler = new Runtime.Sampler { WrapT = WrapTEnum.MIRRORED_REPEAT, WrapS = WrapSEnum.MIRRORED_REPEAT }; AddMeshPrimitivesToSingleNode(nodes, meshPrimitives); properties.Add(new Property(PropertyName.Description, "Two textures using the same image as their source.")); properties.Add(new Property(PropertyName.Difference, "The texture sampler `WrapT` and `WrapS` are set to `CLAMP_TO_EDGE` for one and `MIRRORED_REPEAT` for the other.")); }, (model) => { model.Camera = distantCamera; }), CreateModel((properties, nodes, animations) => { var meshPrimitives = new List <Runtime.MeshPrimitive> { MeshPrimitive.CreateSinglePlane(includeTextureCoords: false), MeshPrimitive.CreateSinglePlane(includeTextureCoords: false) }; meshPrimitives[0].Material = CreateMaterial(CreateTexture(baseColorTextureImageA)); meshPrimitives[1].Material = CreateMaterial(CreateTexture(baseColorTextureImageB)); var sampler = new Runtime.Sampler { WrapT = WrapTEnum.CLAMP_TO_EDGE, WrapS = WrapSEnum.CLAMP_TO_EDGE }; foreach (Runtime.MeshPrimitive meshPrimitive in meshPrimitives) { meshPrimitive.Material.MetallicRoughnessMaterial.BaseColorTexture.Sampler = sampler; // This non-standard set of texture coordinates is larger than the texture but not an exact multiple, so it allows texture sampler settings to be visible. meshPrimitive.TextureCoordSets = new List <List <Vector2> > { new List <Vector2> { new Vector2(1.3f, 1.3f), new Vector2(-0.3f, 1.3f), new Vector2(-0.3f, -0.3f), new Vector2(1.3f, -0.3f), } }; } AddMeshPrimitivesToSingleNode(nodes, meshPrimitives); properties.Add(new Property(PropertyName.Description, "Two textures using the same sampler.")); properties.Add(new Property(PropertyName.Difference, "One texture uses image A while the other uses image B.")); }, (model) => { model.Camera = distantCamera; }), CreateModel((properties, nodes, animations) => { var meshPrimitives = new List <Runtime.MeshPrimitive> { MeshPrimitive.CreateSinglePlane(), MeshPrimitive.CreateSinglePlane() }; var texture = CreateTexture(baseColorTextureImageA); foreach (Runtime.MeshPrimitive meshPrimitive in meshPrimitives) { meshPrimitive.Material = CreateMaterial(texture); } meshPrimitives[0].Material.MetallicRoughnessMaterial.BaseColorTexture = meshPrimitives[1].Material.MetallicRoughnessMaterial.BaseColorTexture; meshPrimitives[1].Material.MetallicRoughnessMaterial.BaseColorFactor = new Vector4(0.5f, 0.5f, 1.0f, 1.0f); AddMeshPrimitivesToSingleNode(nodes, meshPrimitives); properties.Add(new Property(PropertyName.Description, "Two textures using the same source image.")); properties.Add(new Property(PropertyName.Difference, "One material does not have a baseColorFactor and the other has a blue baseColorFactor.")); }, (model) => { model.Camera = distantCamera; }), CreateModel((properties, nodes, animations) => { var meshPrimitives = new List <Runtime.MeshPrimitive> { MeshPrimitive.CreateSinglePlane(), MeshPrimitive.CreateSinglePlane(includeTextureCoords: false) }; var material = CreateMaterial(CreateTexture(baseColorTextureImageA)); foreach (Runtime.MeshPrimitive meshPrimitive in meshPrimitives) { meshPrimitive.Material = material; } // One of the primitives has a 'zoomed in' texture coordinate set. meshPrimitives[1].TextureCoordSets = new List <List <Vector2> > { new List <Vector2> { new Vector2(0.9f, 0.9f), new Vector2(0.1f, 0.9f), new Vector2(0.1f, 0.1f), new Vector2(0.9f, 0.1f), } }; AddMeshPrimitivesToSingleNode(nodes, meshPrimitives); properties.Add(new Property(PropertyName.Description, "Two primitives using the same material.")); properties.Add(new Property(PropertyName.Difference, "One primitive has texture coordinates that displays all of texture A, while the other primitive has textures coordinates that don't display the border.")); }, (model) => { model.Camera = distantCamera; }), CreateModel((properties, nodes, animations) => { var meshPrimitive0 = MeshPrimitive.CreateSinglePlane(); var meshPrimitive1 = MeshPrimitive.CreateSinglePlane(); meshPrimitive0.Material = CreateMaterial(CreateTexture(baseColorTextureImageA)); meshPrimitive1.Material = CreateMaterial(CreateTexture(baseColorTextureImageB)); meshPrimitive0.Positions = meshPrimitive1.Positions; AddMeshPrimitivesToMultipleNodes(nodes, meshPrimitive0, meshPrimitive1); properties.Add(new Property(PropertyName.Description, "Two primitives using the same accessors for the `POSITION` attribute.")); properties.Add(new Property(PropertyName.Difference, "One primitive uses texture A while the other primitive uses texture B.")); }, (model) => { model.Camera = distantCamera; }), CreateModel((properties, nodes, animations) => { var meshPrimitive0 = MeshPrimitive.CreateSinglePlane(includeIndices: false); var meshPrimitive1 = MeshPrimitive.CreateSinglePlane(); meshPrimitive0.Material = CreateMaterial(CreateTexture(baseColorTextureImageA)); meshPrimitive1.Material = CreateMaterial(CreateTexture(baseColorTextureImageB)); meshPrimitive0.Indices = meshPrimitive1.Indices; AddMeshPrimitivesToMultipleNodes(nodes, meshPrimitive0, meshPrimitive1); properties.Add(new Property(PropertyName.Description, "Two primitives using the same accessors for indices.")); properties.Add(new Property(PropertyName.Difference, "One primitive uses texture A while the other primitive uses texture B.")); }, (model) => { model.Camera = distantCamera; }), CreateModel((properties, nodes, animations) => { var meshPrimitive = MeshPrimitive.CreateSinglePlane(); meshPrimitive.Material = CreateMaterial(CreateTexture(baseColorTextureImageA)); AddMeshPrimitivesToMultipleNodes(nodes, meshPrimitive, meshPrimitive); nodes[1].Mesh = nodes[0].Mesh; properties.Add(new Property(PropertyName.Description, "Two nodes using the same mesh.")); properties.Add(new Property(PropertyName.Difference, "The two nodes have different translations.")); }, (model) => { model.Camera = distantCamera; }), CreateModel((properties, nodes, animations) => { nodes.AddRange(Nodes.CreateFoldingPlaneSkin("skinA", 2, 3)); nodes[0].Name = "plane0"; nodes[0].Mesh.MeshPrimitives.ElementAt(0).Material = CreateMaterial(CreateTexture(baseColorTextureImageA)); nodes[0].Mesh.MeshPrimitives.ElementAt(0).TextureCoordSets = Nodes.GetSkinATextureCoordSets(); // Adds just the node containing the mesh, dropping the data for a second set of joints. nodes.Add(Nodes.CreateFoldingPlaneSkin("skinA", 2, 3)[0]); nodes[2].Name = "plane1"; nodes[2].Mesh.MeshPrimitives.ElementAt(0).Material = CreateMaterial(CreateTexture(baseColorTextureImageB)); nodes[2].Mesh.MeshPrimitives.ElementAt(0).TextureCoordSets = Nodes.GetSkinATextureCoordSets(); nodes[2].Skin = nodes[0].Skin; // Offsets the position of both meshes so they don't overlap. nodes[0].Mesh.MeshPrimitives.ElementAt(0).Positions = nodes[0].Mesh.MeshPrimitives.ElementAt(0).Positions.Select(position => { return(new Vector3(position.X - 0.3f, position.Y, position.Z)); }); nodes[2].Mesh.MeshPrimitives.ElementAt(0).Positions = nodes[2].Mesh.MeshPrimitives.ElementAt(0).Positions.Select(position => { return(new Vector3(position.X + 0.3f, position.Y, position.Z)); }); properties.Add(new Property(PropertyName.Description, "Two nodes using the same skin.")); properties.Add(new Property(PropertyName.Difference, "The two mesh primitives have different `POSITION` values.")); }, (model) => { model.Camera = null; }), CreateModel((properties, nodes, animations) => { nodes.AddRange(Nodes.CreateFoldingPlaneSkin("skinA", 2, 3)); nodes[0].Name = "plane0"; nodes[0].Mesh.MeshPrimitives.ElementAt(0).Material = CreateMaterial(CreateTexture(baseColorTextureImageA)); nodes[0].Mesh.MeshPrimitives.ElementAt(0).TextureCoordSets = Nodes.GetSkinATextureCoordSets(); // Adds just the node containing the mesh, dropping the data for a second set of joints. nodes.Add(Nodes.CreateFoldingPlaneSkin("skinA", 2, 3)[0]); nodes[2].Name = "plane1"; nodes[2].Mesh.MeshPrimitives.ElementAt(0).Material = CreateMaterial(CreateTexture(baseColorTextureImageB)); nodes[2].Mesh.MeshPrimitives.ElementAt(0).TextureCoordSets = Nodes.GetSkinATextureCoordSets(); nodes[2].Skin.Joints = nodes[0].Skin.Joints; // Creates new inverseBindMatrices for the second skin, rotating the flap further than the default value would. nodes[2].Skin.InverseBindMatrices = new[] { nodes[2].Skin.InverseBindMatrices.First(), Matrix4x4.Multiply(nodes[2].Skin.InverseBindMatrices.ElementAt(1), Matrix4x4.CreateRotationX(FloatMath.ToRadians(-30))), }; // Offsets the position of both meshes so they don't overlap. nodes[0].Mesh.MeshPrimitives.ElementAt(0).Positions = nodes[0].Mesh.MeshPrimitives.ElementAt(0).Positions.Select(position => { return(new Vector3(position.X - 0.3f, position.Y, position.Z)); }); nodes[2].Mesh.MeshPrimitives.ElementAt(0).Positions = nodes[2].Mesh.MeshPrimitives.ElementAt(0).Positions.Select(position => { return(new Vector3(position.X + 0.3f, position.Y, position.Z)); }); properties.Add(new Property(PropertyName.Description, "Two skins using the same joints.")); properties.Add(new Property(PropertyName.Difference, "The skin with texture B has inverseBindMatrices that fold twice as far as the skin with texture A.")); }, (model) => { model.Camera = null; }), CreateModel((properties, nodes, animations) => { nodes.AddRange(Nodes.CreateFoldingPlaneSkin("skinA", 2, 3)); nodes[0].Name = "plane0"; nodes[0].Mesh.MeshPrimitives.ElementAt(0).Material = CreateMaterial(CreateTexture(baseColorTextureImageA)); nodes[0].Mesh.MeshPrimitives.ElementAt(0).TextureCoordSets = Nodes.GetSkinATextureCoordSets(); nodes[1].Translation = Vector3.Add((Vector3)nodes[1].Translation, new Vector3(-0.3f, 0.0f, 0.0f)); nodes.AddRange(Nodes.CreateFoldingPlaneSkin("skinA", 2, 3)); nodes[2].Name = "plane1"; nodes[2].Mesh.MeshPrimitives.ElementAt(0).Material = CreateMaterial(CreateTexture(baseColorTextureImageB)); nodes[2].Mesh.MeshPrimitives.ElementAt(0).TextureCoordSets = Nodes.GetSkinATextureCoordSets(); nodes[3].Translation = Vector3.Add((Vector3)nodes[3].Translation, new Vector3(0.3f, 0.0f, 0.0f)); nodes[2].Skin.InverseBindMatrices = nodes[0].Skin.InverseBindMatrices; properties.Add(new Property(PropertyName.Description, "Two skins using the same inverseBindMatrices.")); properties.Add(new Property(PropertyName.Difference, "The base joint for the two skins have different translations.")); }, (model) => { model.Camera = null; }), CreateModel((properties, nodes, animations) => { var meshPrimitive0 = MeshPrimitive.CreateCube(); var meshPrimitive1 = MeshPrimitive.CreateCube(); meshPrimitive0.Material = CreateMaterial(CreateTexture(baseColorTextureImageCube)); meshPrimitive1.Material = CreateMaterial(CreateTexture(baseColorTextureImageCube)); AddMeshPrimitivesToMultipleNodes(nodes, meshPrimitive0, meshPrimitive1); var sampler = new Runtime.LinearAnimationSampler <Quaternion>(SamplerInputLinear, SamplerOutput); AddAnimation(animations, nodes, sampler, sampler, true); properties.Add(new Property(PropertyName.Description, "Two animation channels using the same sampler.")); properties.Add(new Property(PropertyName.Difference, "The two animation channels target different nodes.")); }, (model) => { model.Camera = distantCamera; }), CreateModel((properties, nodes, animations) => { var meshPrimitive0 = MeshPrimitive.CreateCube(); var meshPrimitive1 = MeshPrimitive.CreateCube(); meshPrimitive0.Material = CreateMaterial(CreateTexture(baseColorTextureImageCube)); meshPrimitive1.Material = CreateMaterial(CreateTexture(baseColorTextureImageCube)); AddMeshPrimitivesToMultipleNodes(nodes, meshPrimitive0, meshPrimitive1); var inputKeys = SamplerInputLinear; var sampler0 = new Runtime.LinearAnimationSampler <Quaternion>(inputKeys, SamplerOutput); var sampler1 = new Runtime.LinearAnimationSampler <Quaternion>(inputKeys, SamplerOutputReverse); AddAnimation(animations, nodes, sampler0, sampler1, false); properties.Add(new Property(PropertyName.Description, "Two animation samplers using the same input accessors.")); properties.Add(new Property(PropertyName.Difference, "The two animation samplers have different output values.")); }, (model) => { model.Camera = distantCamera; }), CreateModel((properties, nodes, animations) => { var meshPrimitive0 = MeshPrimitive.CreateCube(); var meshPrimitive1 = MeshPrimitive.CreateCube(); meshPrimitive0.Material = CreateMaterial(CreateTexture(baseColorTextureImageCube)); meshPrimitive1.Material = CreateMaterial(CreateTexture(baseColorTextureImageCube)); AddMeshPrimitivesToMultipleNodes(nodes, meshPrimitive0, meshPrimitive1); var output = SamplerOutput; var sampler0 = new Runtime.LinearAnimationSampler <Quaternion>(SamplerInputLinear, output); var sampler1 = new Runtime.LinearAnimationSampler <Quaternion>(SamplerInputCurve, output); AddAnimation(animations, nodes, sampler0, sampler1, false); properties.Add(new Property(PropertyName.Description, "Two animation samplers using the same output accessors.")); properties.Add(new Property(PropertyName.Difference, "The two animation samplers have different input values.")); }, (model) => { model.Camera = distantCamera; }), // New model // To be implemented later. Needs to work as a type of interleaving. //CreateModel((properties, nodes, animations) => //{ // var meshPrimitives = new List<Runtime.MeshPrimitive> // { // MeshPrimitive.CreateSinglePlane(includeTextureCoords: false), // MeshPrimitive.CreateSinglePlane(includeTextureCoords: false) // }; // meshPrimitives[0].TextureCoordSets = meshPrimitives[1].TextureCoordSets = MeshPrimitive.GetSinglePlaneTextureCoordSets(); // meshPrimitives[0].Normals = meshPrimitives[1].Normals = MeshPrimitive.GetSinglePlaneNormals(); // foreach (Runtime.MeshPrimitive meshPrimitive in meshPrimitives) // { // meshPrimitive.BufferViewsInstanced = true; // meshPrimitive.Material = CreateMaterial(); // } // AddMeshPrimitivesToSingleNode(nodes, meshPrimitives); // properties.Add(new Property(PropertyName.Description, "Two accessors using the same buffer view.")); //}, (model) => { model.Camera = null; }), }; GenerateUsedPropertiesList(); }
public Material_MetallicRoughness(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_Plane"); Runtime.Image metallicRoughnessTextureImage = UseTexture(imageList, "MetallicRoughness_Plane"); // There are no common properties in this model group. Model CreateModel(Action <List <Property>, Runtime.MeshPrimitive, Runtime.PbrMetallicRoughness> setProperties) { var properties = new List <Property>(); var meshPrimitive = MeshPrimitive.CreateSinglePlane(); meshPrimitive.Material = new Runtime.Material(); meshPrimitive.Material.MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness(); // Apply the properties that are specific to this gltf. setProperties(properties, meshPrimitive, meshPrimitive.Material.MetallicRoughnessMaterial); // Create the gltf object. return(new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene() { Nodes = new[] { new Runtime.Node { Mesh = new Runtime.Mesh { MeshPrimitives = new List <Runtime.MeshPrimitive> { meshPrimitive } }, }, }, }), }); } void SetVertexColor(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { var vertexColors = new[] { new Vector4(0.0f, 0.0f, 1.0f, 0.8f), new Vector4(1.0f, 0.0f, 0.0f, 0.8f), new Vector4(0.0f, 0.0f, 1.0f, 0.8f), new Vector4(1.0f, 0.0f, 0.0f, 0.8f), }; meshPrimitive.ColorComponentType = ColorComponentTypeEnum.FLOAT; meshPrimitive.ColorType = ColorTypeEnum.VEC3; meshPrimitive.Colors = vertexColors; properties.Add(new Property(PropertyName.VertexColor, "Vector3 Float")); } void SetBaseColorTexture(List <Property> properties, Runtime.PbrMetallicRoughness metallicRoughness) { metallicRoughness.BaseColorTexture = new Runtime.Texture { Source = baseColorTextureImage }; properties.Add(new Property(PropertyName.BaseColorTexture, baseColorTextureImage)); } void SetBaseColorFactor(List <Property> properties, Runtime.PbrMetallicRoughness metallicRoughness) { var baseColorFactorValue = new Vector4(0.2f, 0.2f, 0.2f, 0.8f); metallicRoughness.BaseColorFactor = baseColorFactorValue; properties.Add(new Property(PropertyName.BaseColorFactor, baseColorFactorValue)); } void SetMetallicRoughnessTexture(List <Property> properties, Runtime.PbrMetallicRoughness metallicRoughness) { metallicRoughness.MetallicRoughnessTexture = new Runtime.Texture { Source = metallicRoughnessTextureImage }; properties.Add(new Property(PropertyName.MetallicRoughnessTexture, metallicRoughnessTextureImage)); } void SetMetallicFactor(List <Property> properties, Runtime.PbrMetallicRoughness metallicRoughness) { metallicRoughness.MetallicFactor = 0.0f; properties.Add(new Property(PropertyName.MetallicFactor, metallicRoughness.MetallicFactor)); } void SetRoughnessFactor(List <Property> properties, Runtime.PbrMetallicRoughness metallicRoughness) { metallicRoughness.RoughnessFactor = 0.0f; properties.Add(new Property(PropertyName.RoughnessFactor, metallicRoughness.RoughnessFactor)); } Models = new List <Model> { CreateModel((properties, meshPrimitive, metallicRoughness) => { // There are no properties set on this model. }), CreateModel((properties, meshPrimitive, metallicRoughness) => { SetVertexColor(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { SetBaseColorTexture(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { SetBaseColorFactor(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { SetMetallicRoughnessTexture(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { SetMetallicFactor(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { SetRoughnessFactor(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { SetVertexColor(properties, meshPrimitive); SetBaseColorTexture(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { SetBaseColorTexture(properties, metallicRoughness); SetBaseColorFactor(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { SetMetallicRoughnessTexture(properties, metallicRoughness); SetMetallicFactor(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { SetMetallicRoughnessTexture(properties, metallicRoughness); SetRoughnessFactor(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { SetVertexColor(properties, meshPrimitive); SetBaseColorTexture(properties, metallicRoughness); SetBaseColorFactor(properties, metallicRoughness); SetMetallicRoughnessTexture(properties, metallicRoughness); SetMetallicFactor(properties, metallicRoughness); SetRoughnessFactor(properties, metallicRoughness); }), }; GenerateUsedPropertiesList(); }
public Texture_Sampler(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_Plane"); // Track the common properties for use in the readme. CommonProperties.Add(new Property(PropertyName.BaseColorTexture, baseColorTextureImage)); Model CreateModel(Action <List <Property>, Runtime.Sampler> setProperties) { var properties = new List <Property>(); Runtime.MeshPrimitive meshPrimitive = MeshPrimitive.CreateSinglePlane(); meshPrimitive.Material = new Runtime.Material { MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness { BaseColorTexture = new Runtime.Texture { Source = baseColorTextureImage, Sampler = new Runtime.Sampler(), }, }, }; // Apply the common properties to the gltf. meshPrimitive.TextureCoordSets = new List <List <Vector2> > { new List <Vector2>() { new Vector2(1.3f, 1.3f), new Vector2(-0.3f, 1.3f), new Vector2(-0.3f, -0.3f), new Vector2(1.3f, -0.3f), } }; // Apply the properties that are specific to this gltf. setProperties(properties, meshPrimitive.Material.MetallicRoughnessMaterial.BaseColorTexture.Sampler); // Create the gltf object. return(new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene { Nodes = new List <Runtime.Node> { new Runtime.Node { Mesh = new Runtime.Mesh { MeshPrimitives = new List <Runtime.MeshPrimitive> { meshPrimitive } }, }, }, }), }); } void SetWrapT(List <Property> properties, Runtime.Sampler sampler, WrapTEnum enumValue) { sampler.WrapT = enumValue; properties.Add(new Property(PropertyName.WrapT, enumValue)); } void SetWrapS(List <Property> properties, Runtime.Sampler sampler, WrapSEnum enumValue) { sampler.WrapS = enumValue; properties.Add(new Property(PropertyName.WrapS, sampler.WrapS)); } void SetMagFilter(List <Property> properties, Runtime.Sampler sampler, MagFilterEnum enumValue) { sampler.MagFilter = enumValue; properties.Add(new Property(PropertyName.MagFilter, enumValue)); } void SetMinFilter(List <Property> properties, Runtime.Sampler sampler, MinFilterEnum enumValue) { sampler.MinFilter = enumValue; properties.Add(new Property(PropertyName.MinFilter, enumValue)); } Models = new List <Model> { CreateModel((properties, sampler) => { // There are no properties set on this model. }), CreateModel((properties, sampler) => { SetWrapT(properties, sampler, WrapTEnum.CLAMP_TO_EDGE); }), CreateModel((properties, sampler) => { SetWrapT(properties, sampler, WrapTEnum.MIRRORED_REPEAT); }), CreateModel((properties, sampler) => { SetWrapS(properties, sampler, WrapSEnum.CLAMP_TO_EDGE); }), CreateModel((properties, sampler) => { SetWrapS(properties, sampler, WrapSEnum.MIRRORED_REPEAT); }), CreateModel((properties, sampler) => { SetMagFilter(properties, sampler, MagFilterEnum.NEAREST); }), CreateModel((properties, sampler) => { SetMagFilter(properties, sampler, MagFilterEnum.LINEAR); }), CreateModel((properties, sampler) => { SetMinFilter(properties, sampler, MinFilterEnum.NEAREST); }), CreateModel((properties, sampler) => { SetMinFilter(properties, sampler, MinFilterEnum.LINEAR); }), CreateModel((properties, sampler) => { SetMinFilter(properties, sampler, MinFilterEnum.NEAREST_MIPMAP_NEAREST); }), CreateModel((properties, sampler) => { SetMinFilter(properties, sampler, MinFilterEnum.LINEAR_MIPMAP_NEAREST); }), CreateModel((properties, sampler) => { SetMinFilter(properties, sampler, MinFilterEnum.NEAREST_MIPMAP_LINEAR); }), CreateModel((properties, sampler) => { SetMinFilter(properties, sampler, MinFilterEnum.LINEAR_MIPMAP_LINEAR); }), CreateModel((properties, sampler) => { SetWrapT(properties, sampler, WrapTEnum.CLAMP_TO_EDGE); SetWrapS(properties, sampler, WrapSEnum.CLAMP_TO_EDGE); SetMagFilter(properties, sampler, MagFilterEnum.NEAREST); SetMinFilter(properties, sampler, MinFilterEnum.NEAREST); }), }; GenerateUsedPropertiesList(); }
public Mesh_PrimitivesUV(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_Plane"); Runtime.Image normalImage = UseTexture(imageList, "Normal_Plane"); UseFigure(imageList, "Indices_Primitive0"); UseFigure(imageList, "Indices_Primitive1"); UseFigure(imageList, "UVSpace2"); UseFigure(imageList, "UVSpace3"); UseFigure(imageList, "UVSpace4"); UseFigure(imageList, "UVSpace5"); // Track the common properties for use in the readme. var vertexNormalValue = new List <Vector3> { new Vector3(0.0f, 0.0f, 1.0f), new Vector3(0.0f, 0.0f, 1.0f), new Vector3(0.0f, 0.0f, 1.0f), }; var tangentValue = new List <Vector4> { new Vector4(1.0f, 0.0f, 0.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), }; var vertexColorValue = new List <Vector4> { new Vector4(0.0f, 1.0f, 0.0f, 0.2f), new Vector4(1.0f, 0.0f, 0.0f, 0.2f), new Vector4(0.0f, 0.0f, 1.0f, 0.2f), }; CommonProperties.Add(new Property(PropertyName.VertexNormal, vertexNormalValue)); CommonProperties.Add(new Property(PropertyName.VertexTangent, tangentValue)); CommonProperties.Add(new Property(PropertyName.VertexColor, vertexColorValue)); CommonProperties.Add(new Property(PropertyName.NormalTexture, normalImage)); CommonProperties.Add(new Property(PropertyName.BaseColorTexture, baseColorTextureImage)); Model CreateModel(Action <List <Property>, Runtime.MeshPrimitive, Runtime.MeshPrimitive> setProperties) { var properties = new List <Property>(); List <Runtime.MeshPrimitive> meshPrimitives = MeshPrimitive.CreateMultiPrimitivePlane(); // Apply the common properties to the gltf. foreach (var meshPrimitive in meshPrimitives) { meshPrimitive.TextureCoordSets = new List <List <Vector2> >(); meshPrimitive.Material = new Runtime.Material { MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness { MetallicFactor = 0 } }; } // Apply the properties that are specific to this gltf. setProperties(properties, meshPrimitives[0], meshPrimitives[1]); // Create the gltf object return(new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene { Nodes = new List <Runtime.Node> { new Runtime.Node { Mesh = new Runtime.Mesh { MeshPrimitives = meshPrimitives }, }, }, }), }); } void SetCommonProperties(Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.Normals = vertexNormalValue; meshPrimitive.Tangents = tangentValue; meshPrimitive.Colors = vertexColorValue; meshPrimitive.Material.NormalTexture = new Runtime.Texture { Source = normalImage }; meshPrimitive.Material.MetallicRoughnessMaterial.BaseColorTexture = new Runtime.Texture() { Source = baseColorTextureImage }; } void SetNullUV(Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.Material = null; meshPrimitive.TextureCoordSets = null; } void SetPrimitiveZeroVertexUVZero(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { SetCommonProperties(meshPrimitive); meshPrimitive.TextureCoordSets = meshPrimitive.TextureCoordSets.Concat( new[] { new[] { new Vector2(0.0f, 1.0f), new Vector2(1.0f, 0.0f), new Vector2(0.0f, 0.0f), } }); properties.Add(new Property(PropertyName.Primitive0VertexUV0, ":white_check_mark:")); } void SetPrimitiveOneVertexUVZero(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { SetCommonProperties(meshPrimitive); meshPrimitive.TextureCoordSets = meshPrimitive.TextureCoordSets.Concat( new[] { new[] { new Vector2(0.0f, 1.0f), new Vector2(1.0f, 1.0f), new Vector2(1.0f, 0.0f), } }); properties.Add(new Property(PropertyName.Primitive1VertexUV0, ":white_check_mark:")); } void SetPrimitiveZeroVertexUVOne(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { SetCommonProperties(meshPrimitive); meshPrimitive.Material.MetallicRoughnessMaterial.BaseColorTexture.TexCoordIndex = 1; meshPrimitive.Material.NormalTexture.TexCoordIndex = 1; meshPrimitive.TextureCoordSets = meshPrimitive.TextureCoordSets.Concat( new[] { new[] { new Vector2(0.5f, 0.5f), new Vector2(1.0f, 0.0f), new Vector2(0.5f, 0.0f), } }); properties.Add(new Property(PropertyName.Primitive0VertexUV1, ":white_check_mark:")); } void SetPrimitiveOneVertexUVOne(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { SetCommonProperties(meshPrimitive); meshPrimitive.Material.MetallicRoughnessMaterial.BaseColorTexture.TexCoordIndex = 1; meshPrimitive.Material.NormalTexture.TexCoordIndex = 1; meshPrimitive.TextureCoordSets = meshPrimitive.TextureCoordSets.Concat( new[] { new[] { new Vector2(0.5f, 0.5f), new Vector2(1.0f, 0.5f), new Vector2(1.0f, 0.0f), } }); properties.Add(new Property(PropertyName.Primitive1VertexUV1, ":white_check_mark:")); } Models = new List <Model> { CreateModel((properties, meshPrimitiveZero, meshPrimitiveOne) => { SetNullUV(meshPrimitiveZero); SetNullUV(meshPrimitiveOne); }), CreateModel((properties, meshPrimitiveZero, meshPrimitiveOne) => { SetPrimitiveZeroVertexUVZero(properties, meshPrimitiveZero); SetNullUV(meshPrimitiveOne); }), CreateModel((properties, meshPrimitiveZero, meshPrimitiveOne) => { SetPrimitiveOneVertexUVZero(properties, meshPrimitiveOne); SetNullUV(meshPrimitiveZero); }), CreateModel((properties, meshPrimitiveZero, meshPrimitiveOne) => { SetPrimitiveZeroVertexUVZero(properties, meshPrimitiveZero); SetPrimitiveOneVertexUVZero(properties, meshPrimitiveOne); }), CreateModel((properties, meshPrimitiveZero, meshPrimitiveOne) => { SetPrimitiveZeroVertexUVZero(properties, meshPrimitiveZero); SetPrimitiveZeroVertexUVOne(properties, meshPrimitiveZero); SetNullUV(meshPrimitiveOne); }), CreateModel((properties, meshPrimitiveZero, meshPrimitiveOne) => { SetPrimitiveOneVertexUVZero(properties, meshPrimitiveOne); SetPrimitiveOneVertexUVOne(properties, meshPrimitiveOne); SetNullUV(meshPrimitiveZero); }), CreateModel((properties, meshPrimitiveZero, meshPrimitiveOne) => { SetPrimitiveZeroVertexUVZero(properties, meshPrimitiveZero); SetPrimitiveOneVertexUVZero(properties, meshPrimitiveOne); SetPrimitiveOneVertexUVOne(properties, meshPrimitiveOne); }), CreateModel((properties, meshPrimitiveZero, meshPrimitiveOne) => { SetPrimitiveZeroVertexUVZero(properties, meshPrimitiveZero); SetPrimitiveOneVertexUVZero(properties, meshPrimitiveOne); SetPrimitiveZeroVertexUVOne(properties, meshPrimitiveZero); }), CreateModel((properties, meshPrimitiveZero, meshPrimitiveOne) => { SetPrimitiveZeroVertexUVZero(properties, meshPrimitiveZero); SetPrimitiveOneVertexUVZero(properties, meshPrimitiveOne); SetPrimitiveZeroVertexUVOne(properties, meshPrimitiveZero); SetPrimitiveOneVertexUVOne(properties, meshPrimitiveOne); }), }; GenerateUsedPropertiesList(); }
public Material_AlphaBlend(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_Plane"); // Track the common properties for use in the readme. var alphaModeValue = AlphaModeEnum.BLEND; CommonProperties.Add(new Property(PropertyName.AlphaMode, alphaModeValue)); Model CreateModel(Action <List <Property>, Runtime.MeshPrimitive, Runtime.PbrMetallicRoughness> setProperties) { var properties = new List <Property>(); Runtime.MeshPrimitive meshPrimitive = MeshPrimitive.CreateSinglePlane(includeTextureCoords: false); // Apply the common properties to the gltf. meshPrimitive.Material = new Runtime.Material { MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness { MetallicFactor = 0 }, AlphaMode = alphaModeValue, }; // Apply the properties that are specific to this gltf. setProperties(properties, meshPrimitive, meshPrimitive.Material.MetallicRoughnessMaterial); // Create the gltf object. return(new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene { Nodes = new[] { new Runtime.Node { Mesh = new Runtime.Mesh { MeshPrimitives = new[] { meshPrimitive } }, }, }, }), }); } void SetNoMetallicRoughness(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { meshPrimitive.Material.MetallicRoughnessMaterial = null; } void SetBaseColorFactor(List <Property> properties, Runtime.PbrMetallicRoughness metallicRoughness) { var baseColorFactorValue = new Vector4(1.0f, 1.0f, 1.0f, 0.7f); metallicRoughness.BaseColorFactor = baseColorFactorValue; properties.Add(new Property(PropertyName.BaseColorFactor, baseColorFactorValue)); } void SetBaseColorTexture(List <Property> properties, Runtime.PbrMetallicRoughness metallicRoughness) { metallicRoughness.BaseColorTexture = new Runtime.Texture { Source = baseColorTextureImage }; properties.Add(new Property(PropertyName.BaseColorTexture, baseColorTextureImage)); } void SetVertexColor(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { var vertexColors = new[] { new Vector4(0.3f, 0.3f, 0.3f, 0.4f), new Vector4(0.3f, 0.3f, 0.3f, 0.2f), new Vector4(0.3f, 0.3f, 0.3f, 0.8f), new Vector4(0.3f, 0.3f, 0.3f, 0.6f), }; meshPrimitive.ColorComponentType = ColorComponentTypeEnum.FLOAT; meshPrimitive.ColorType = ColorTypeEnum.VEC4; meshPrimitive.Colors = vertexColors; properties.Add(new Property(PropertyName.VertexColor, "Vector4 Float")); } Models = new List <Model> { CreateModel((properties, meshPrimitive, metallicRoughness) => { SetVertexColor(properties, meshPrimitive); SetNoMetallicRoughness(properties, meshPrimitive); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { meshPrimitive.TextureCoordSets = MeshPrimitive.GetSinglePlaneTextureCoordSets(); SetBaseColorTexture(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { SetBaseColorFactor(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { meshPrimitive.TextureCoordSets = MeshPrimitive.GetSinglePlaneTextureCoordSets(); SetVertexColor(properties, meshPrimitive); SetBaseColorTexture(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { SetVertexColor(properties, meshPrimitive); SetBaseColorFactor(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { meshPrimitive.TextureCoordSets = MeshPrimitive.GetSinglePlaneTextureCoordSets(); SetBaseColorTexture(properties, metallicRoughness); SetBaseColorFactor(properties, metallicRoughness); }), CreateModel((properties, meshPrimitive, metallicRoughness) => { meshPrimitive.TextureCoordSets = MeshPrimitive.GetSinglePlaneTextureCoordSets(); SetVertexColor(properties, meshPrimitive); SetBaseColorTexture(properties, metallicRoughness); SetBaseColorFactor(properties, metallicRoughness); }), }; GenerateUsedPropertiesList(); }
public Material_AlphaMask(List <string> imageList) { Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_Plane"); // Track the common properties for use in the readme. var alphaModeValue = AlphaModeEnum.MASK; CommonProperties.Add(new Property(PropertyName.AlphaMode, alphaModeValue)); CommonProperties.Add(new Property(PropertyName.BaseColorTexture, baseColorTextureImage)); Model CreateModel(Action <List <Property>, Runtime.Material, Runtime.PbrMetallicRoughness> setProperties) { var properties = new List <Property>(); var meshPrimitive = MeshPrimitive.CreateSinglePlane(); meshPrimitive.Material = new Runtime.Material(); meshPrimitive.Material.MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness(); // Apply the common properties to the gltf. meshPrimitive.Material.AlphaMode = alphaModeValue; meshPrimitive.Material.MetallicRoughnessMaterial.BaseColorTexture = new Runtime.Texture { Source = baseColorTextureImage }; // Apply the properties that are specific to this gltf. setProperties(properties, meshPrimitive.Material, meshPrimitive.Material.MetallicRoughnessMaterial); // Create the gltf object. return(new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene { Nodes = new[] { new Runtime.Node { Mesh = new Runtime.Mesh { MeshPrimitives = new List <Runtime.MeshPrimitive> { meshPrimitive } }, }, }, }), }); } void SetAlphaCutoff_Low(List <Property> properties, Runtime.Material material) { material.AlphaCutoff = 0.4f; properties.Add(new Property(PropertyName.AlphaCutoff, material.AlphaCutoff)); } void SetAlphaCutoff_High(List <Property> properties, Runtime.Material material) { material.AlphaCutoff = 0.7f; properties.Add(new Property(PropertyName.AlphaCutoff, material.AlphaCutoff)); } void SetAlphaCutoff_Multiplied(List <Property> properties, Runtime.Material material) { material.AlphaCutoff = 0.6f; properties.Add(new Property(PropertyName.AlphaCutoff, material.AlphaCutoff)); } void SetAlphaCutoff_All(List <Property> properties, Runtime.Material material) { material.AlphaCutoff = 1.1f; properties.Add(new Property(PropertyName.AlphaCutoff, material.AlphaCutoff)); } void SetAlphaCutoff_None(List <Property> properties, Runtime.Material material) { material.AlphaCutoff = 0.0f; properties.Add(new Property(PropertyName.AlphaCutoff, material.AlphaCutoff)); } void SetBaseColorFactor(List <Property> properties, Runtime.PbrMetallicRoughness metallicRoughness) { var baseColorFactorValue = new Vector4(1.0f, 1.0f, 1.0f, 0.7f); metallicRoughness.BaseColorFactor = baseColorFactorValue; properties.Add(new Property(PropertyName.BaseColorFactor, baseColorFactorValue)); } Models = new List <Model> { CreateModel((properties, material, metallicRoughness) => { // There are no properties set on this model. }), CreateModel((properties, material, metallicRoughness) => { SetAlphaCutoff_Low(properties, material); }), CreateModel((properties, material, metallicRoughness) => { SetAlphaCutoff_High(properties, material); }), CreateModel((properties, material, metallicRoughness) => { SetAlphaCutoff_All(properties, material); }), CreateModel((properties, material, metallicRoughness) => { SetAlphaCutoff_None(properties, material); }), CreateModel((properties, material, metallicRoughness) => { SetAlphaCutoff_Low(properties, material); SetBaseColorFactor(properties, metallicRoughness); }), CreateModel((properties, material, metallicRoughness) => { SetAlphaCutoff_Multiplied(properties, material); SetBaseColorFactor(properties, metallicRoughness); }), }; GenerateUsedPropertiesList(); }
public Material_SpecularGlossiness(List <string> imageList) { Runtime.Image diffuseTextureImage = UseTexture(imageList, "Diffuse_Plane"); Runtime.Image specularGlossinessTextureImage = UseTexture(imageList, "SpecularGlossiness_Plane"); Runtime.Image baseColorTextureImage = UseTexture(imageList, "BaseColor_X"); // Track the common properties for use in the readme. CommonProperties.Add(new Property(PropertyName.ExtensionUsed, "Specular Glossiness")); CommonProperties.Add(new Property(PropertyName.ExtensionRequired, "Specular Glossiness")); CommonProperties.Add(new Property(PropertyName.BaseColorTexture, baseColorTextureImage)); Model CreateModel(Action <List <Property>, Runtime.MeshPrimitive, Runtime.Material, KHR_materials_pbrSpecularGlossiness> setProperties) { var properties = new List <Property>(); var meshPrimitive = MeshPrimitive.CreateSinglePlane(); var extension = new KHR_materials_pbrSpecularGlossiness(); meshPrimitive.Material = new Runtime.Material(); meshPrimitive.Material.Extensions = new List <Extension> { extension }; meshPrimitive.Material.MetallicRoughnessMaterial = new Runtime.PbrMetallicRoughness(); // Apply the common properties to the gltf. meshPrimitive.Material.MetallicRoughnessMaterial.BaseColorTexture = new Runtime.Texture { Source = baseColorTextureImage }; // Apply the properties that are specific to this gltf. setProperties(properties, meshPrimitive, meshPrimitive.Material, extension); // Create the gltf object. return(new Model { Properties = properties, GLTF = CreateGLTF(() => new Runtime.Scene { Nodes = new[] { new Runtime.Node { Mesh = new Runtime.Mesh { MeshPrimitives = new[] { meshPrimitive } }, }, }, }, extensionsUsed: new List <string> { "KHR_materials_pbrSpecularGlossiness" }, extensionsRequired: new List <string> { "KHR_materials_pbrSpecularGlossiness" }), }); } void SetVertexColor(List <Property> properties, Runtime.MeshPrimitive meshPrimitive) { var vertexColors = new[] { new Vector4(0.0f, 0.0f, 1.0f, 0.8f), new Vector4(1.0f, 0.0f, 0.0f, 0.8f), new Vector4(0.0f, 0.0f, 1.0f, 0.8f), new Vector4(1.0f, 0.0f, 0.0f, 0.8f) }; meshPrimitive.ColorComponentType = ColorComponentTypeEnum.FLOAT; meshPrimitive.ColorType = ColorTypeEnum.VEC3; meshPrimitive.Colors = vertexColors; properties.Add(new Property(PropertyName.VertexColor, "Vector3 Float")); } void SetDiffuseTexture(List <Property> properties, KHR_materials_pbrSpecularGlossiness extension) { extension.DiffuseTexture = new Runtime.Texture { Source = diffuseTextureImage }; properties.Add(new Property(PropertyName.DiffuseTexture, diffuseTextureImage)); } void SetDiffuseFactor(List <Property> properties, KHR_materials_pbrSpecularGlossiness extension) { var diffuseFactorValue = new Vector4(0.2f, 0.2f, 0.2f, 0.8f); extension.DiffuseFactor = diffuseFactorValue; properties.Add(new Property(PropertyName.DiffuseFactor, diffuseFactorValue)); } void SetSpecularGlossinessTexture(List <Property> properties, KHR_materials_pbrSpecularGlossiness extension) { extension.SpecularGlossinessTexture = new Runtime.Texture { Source = specularGlossinessTextureImage }; properties.Add(new Property(PropertyName.SpecularGlossinessTexture, specularGlossinessTextureImage)); } void SetSpecularFactor(List <Property> properties, KHR_materials_pbrSpecularGlossiness extension) { var specularFactorValue = new Vector3(0.4f, 0.4f, 0.4f); extension.SpecularFactor = specularFactorValue; properties.Add(new Property(PropertyName.SpecularFactor, specularFactorValue)); } void SetSpecularFactorToZero(List <Property> properties, KHR_materials_pbrSpecularGlossiness extension) { var specularFactorValue = new Vector3(0.0f, 0.0f, 0.0f); extension.SpecularFactor = specularFactorValue; properties.Add(new Property(PropertyName.SpecularFactor, specularFactorValue)); } void SetGlossinessFactor(List <Property> properties, KHR_materials_pbrSpecularGlossiness extension) { extension.GlossinessFactor = 0.3f; properties.Add(new Property(PropertyName.GlossinessFactor, extension.GlossinessFactor)); } Models = new List <Model> { CreateModel((properties, meshPrimitive, material, extension) => { // There are no properties set on this model. }), CreateModel((properties, meshPrimitive, material, extension) => { SetVertexColor(properties, meshPrimitive); SetSpecularFactorToZero(properties, extension); }), CreateModel((properties, meshPrimitive, material, extension) => { SetDiffuseTexture(properties, extension); SetSpecularFactorToZero(properties, extension); }), CreateModel((properties, meshPrimitive, material, extension) => { SetDiffuseFactor(properties, extension); SetSpecularFactorToZero(properties, extension); }), CreateModel((properties, meshPrimitive, material, extension) => { SetSpecularGlossinessTexture(properties, extension); }), CreateModel((properties, meshPrimitive, material, extension) => { SetSpecularFactor(properties, extension); }), CreateModel((properties, meshPrimitive, material, extension) => { SetGlossinessFactor(properties, extension); }), CreateModel((properties, meshPrimitive, material, extension) => { SetVertexColor(properties, meshPrimitive); SetDiffuseTexture(properties, extension); SetSpecularFactorToZero(properties, extension); }), CreateModel((properties, meshPrimitive, material, extension) => { SetDiffuseTexture(properties, extension); SetDiffuseFactor(properties, extension); SetSpecularFactorToZero(properties, extension); }), CreateModel((properties, meshPrimitive, material, extension) => { SetDiffuseTexture(properties, extension); SetGlossinessFactor(properties, extension); }), CreateModel((properties, meshPrimitive, material, extension) => { SetSpecularGlossinessTexture(properties, extension); SetSpecularFactor(properties, extension); }), CreateModel((properties, meshPrimitive, material, extension) => { SetSpecularGlossinessTexture(properties, extension); SetGlossinessFactor(properties, extension); }), CreateModel((properties, meshPrimitive, material, extension) => { SetDiffuseTexture(properties, extension); SetSpecularFactor(properties, extension); SetGlossinessFactor(properties, extension); }), CreateModel((properties, meshPrimitive, material, extension) => { SetVertexColor(properties, meshPrimitive); SetDiffuseTexture(properties, extension); SetDiffuseFactor(properties, extension); SetSpecularGlossinessTexture(properties, extension); SetSpecularFactor(properties, extension); SetGlossinessFactor(properties, extension); }), }; GenerateUsedPropertiesList(); }