using System;
using GLTF.Extensions;
using GLTF.Math;
using Newtonsoft.Json;
namespace GLTF.Schema
{
///
/// A set of parameter values that are used to define the metallic-roughness
/// material model from Physically-Based Rendering (PBR) methodology.
///
public class PbrMetallicRoughness : GLTFProperty
{
///
/// The RGBA components of the base color of the material.
/// The fourth component (A) is the opacity of the material.
/// These values are linear.
///
public Color BaseColorFactor = Color.White;
///
/// The base color texture.
/// This texture contains RGB(A) components in sRGB color space.
/// The first three components (RGB) specify the base color of the material.
/// If the fourth component (A) is present, it represents the opacity of the
/// material. Otherwise, an opacity of 1.0 is assumed.
///
public TextureInfo BaseColorTexture;
///
/// The metalness of the material.
/// A value of 1.0 means the material is a metal.
/// A value of 0.0 means the material is a dielectric.
/// Values in between are for blending between metals and dielectrics such as
/// dirty metallic surfaces.
/// This value is linear.
///
public double MetallicFactor = 1;
///
/// The roughness of the material.
/// A value of 1.0 means the material is completely rough.
/// A value of 0.0 means the material is completely smooth.
/// This value is linear.
///
public double RoughnessFactor = 1;
///
/// The metallic-roughness texture has two components.
/// The first component (R) contains the metallic-ness of the material.
/// The second component (G) contains the roughness of the material.
/// These values are linear.
/// If the third component (B) and/or the fourth component (A) are present,
/// they are ignored.
///
public TextureInfo MetallicRoughnessTexture;
public PbrMetallicRoughness()
{
}
public PbrMetallicRoughness(PbrMetallicRoughness pbrMetallicRoughness, GLTFRoot gltfRoot) : base(pbrMetallicRoughness)
{
if(pbrMetallicRoughness == null)
{
return;
}
BaseColorFactor = pbrMetallicRoughness.BaseColorFactor;
if (pbrMetallicRoughness.BaseColorTexture != null)
{
BaseColorTexture = new TextureInfo(pbrMetallicRoughness.BaseColorTexture, gltfRoot);
}
MetallicFactor = pbrMetallicRoughness.MetallicFactor;
RoughnessFactor = pbrMetallicRoughness.RoughnessFactor;
if (pbrMetallicRoughness.MetallicRoughnessTexture != null)
{
MetallicRoughnessTexture = new TextureInfo(pbrMetallicRoughness.MetallicRoughnessTexture, gltfRoot);
}
}
public static PbrMetallicRoughness Deserialize(GLTFRoot root, JsonReader reader)
{
var metallicRoughness = new PbrMetallicRoughness();
if (reader.Read() && reader.TokenType != JsonToken.StartObject)
{
throw new Exception("Asset must be an object.");
}
while (reader.Read() && reader.TokenType == JsonToken.PropertyName)
{
var curProp = reader.Value.ToString();
switch (curProp)
{
case "baseColorFactor":
metallicRoughness.BaseColorFactor = reader.ReadAsRGBAColor();
break;
case "baseColorTexture":
metallicRoughness.BaseColorTexture = TextureInfo.Deserialize(root, reader);
break;
case "metallicFactor":
metallicRoughness.MetallicFactor = reader.ReadAsDouble().Value;
break;
case "roughnessFactor":
metallicRoughness.RoughnessFactor = reader.ReadAsDouble().Value;
break;
case "metallicRoughnessTexture":
metallicRoughness.MetallicRoughnessTexture = TextureInfo.Deserialize(root, reader);
break;
default:
metallicRoughness.DefaultPropertyDeserializer(root, reader);
break;
}
}
return metallicRoughness;
}
public override void Serialize(JsonWriter writer)
{
writer.WriteStartObject();
if (BaseColorFactor != Color.White)
{
writer.WritePropertyName("baseColorFactor");
writer.WriteStartArray();
writer.WriteValue(BaseColorFactor.R);
writer.WriteValue(BaseColorFactor.G);
writer.WriteValue(BaseColorFactor.B);
writer.WriteValue(BaseColorFactor.A);
writer.WriteEndArray();
}
if (BaseColorTexture != null)
{
writer.WritePropertyName("baseColorTexture");
BaseColorTexture.Serialize(writer);
}
if (MetallicFactor != 1.0f)
{
writer.WritePropertyName("metallicFactor");
writer.WriteValue(MetallicFactor);
}
if (RoughnessFactor != 1.0f)
{
writer.WritePropertyName("roughnessFactor");
writer.WriteValue(RoughnessFactor);
}
if (MetallicRoughnessTexture != null)
{
writer.WritePropertyName("metallicRoughnessTexture");
MetallicRoughnessTexture.Serialize(writer);
}
base.Serialize(writer);
writer.WriteEndObject();
}
}
}