using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace Smuggler { public struct PBRLight { public Vector3 direction; public Vector3 colour; public PBRLight(Vector3 direction, Vector3 colour) { this.direction = direction; this.colour = colour; } } public class PBREffect : Effect { readonly EffectParameter modelParam; readonly EffectParameter viewParam; readonly EffectParameter projectionParam; readonly EffectParameter lightDirParam; readonly EffectParameter lightColourParam; readonly EffectParameter normalScaleParam; readonly EffectParameter emissiveFactorParam; readonly EffectParameter occlusionStrengthParam; readonly EffectParameter metallicRoughnessValuesParam; readonly EffectParameter baseColorFactorParam; readonly EffectParameter cameraLookParam; readonly EffectParameter baseColourTextureParam; readonly EffectParameter normalTextureParam; readonly EffectParameter emissionTextureParam; readonly EffectParameter occlusionTextureParam; readonly EffectParameter metallicRoughnessTextureParam; readonly EffectParameter envDiffuseTextureParam; readonly EffectParameter brdfLutTextureParam; readonly EffectParameter envSpecularTextureParam; Matrix world = Matrix.Identity; Matrix view = Matrix.Identity; Matrix projection = Matrix.Identity; PBRLight light = new PBRLight(); float normalScale = 1; Vector3 emissiveFactor; float occlusionStrength; Vector2 metallicRoughnessValue; Vector4 baseColorFactor; public Matrix World { get { return world; } set { world = value; modelParam.SetValue(world); } } public Matrix View { get { return view; } set { view = value; viewParam.SetValue(view); cameraLookParam.SetValue(-new Vector3( view.M13, view.M23, view.M33 )); } } public Matrix Projection { get { return projection; } set { projection = value; projectionParam.SetValue(value); } } public PBRLight Light { get { return light; } set { light = value; lightDirParam.SetValue(light.direction); lightColourParam.SetValue(light.colour); } } public float NormalScale { get { return normalScale; } set { normalScale = value; normalScaleParam.SetValue(normalScale); } } public Vector3 EmissiveFactor { get { return emissiveFactor; } set { emissiveFactor = value; emissiveFactorParam.SetValue(emissiveFactor); } } public float OcclusionStrength { get { return occlusionStrength; } set { occlusionStrength = value; occlusionStrengthParam.SetValue(occlusionStrength); } } public Vector2 MetallicRoughnessValue { get { return metallicRoughnessValue; } set { metallicRoughnessValue = value; metallicRoughnessValuesParam.SetValue(metallicRoughnessValue); } } public Vector4 BaseColorFactor { get { return baseColorFactor; } set { baseColorFactor = value; baseColorFactorParam.SetValue(baseColorFactor); } } public Texture2D BaseColourTexture { get { return baseColourTextureParam.GetValueTexture2D(); } set { baseColourTextureParam.SetValue(value); } } public Texture2D NormalTexture { get { return normalTextureParam.GetValueTexture2D(); } set { normalTextureParam.SetValue(value); } } public Texture2D EmissionTexture { get { return emissionTextureParam.GetValueTexture2D(); } set { emissionTextureParam.SetValue(value); } } public Texture2D OcclusionTexture { get { return occlusionTextureParam.GetValueTexture2D(); } set { occlusionTextureParam.SetValue(value); } } public Texture2D MetallicRoughnessTexture { get { return metallicRoughnessTextureParam.GetValueTexture2D(); } set { metallicRoughnessTextureParam.SetValue(value); } } public TextureCube EnvDiffuseTexture { get { return envDiffuseTextureParam.GetValueTextureCube(); } set { envDiffuseTextureParam.SetValue(value); } } public Texture2D BRDFLutTexture { get { return brdfLutTextureParam.GetValueTexture2D(); } set { brdfLutTextureParam.SetValue(value); } } public TextureCube EnvSpecularTexture { get { return envSpecularTextureParam.GetValueTextureCube(); } set { envSpecularTextureParam.SetValue(value); } } public PBREffect(GraphicsDevice graphicsDevice) : base(graphicsDevice, Resources.PBREffect) { modelParam = Parameters["model"]; viewParam = Parameters["view"]; projectionParam = Parameters["projection"]; lightDirParam = Parameters["lightDir"]; lightColourParam = Parameters["lightColour"]; normalScaleParam = Parameters["normalScale"]; emissiveFactorParam = Parameters["emissiveFactor"]; occlusionStrengthParam = Parameters["occlusionStrength"]; metallicRoughnessValuesParam = Parameters["metallicRoughnessValues"]; baseColorFactorParam = Parameters["baseColorFactor"]; cameraLookParam = Parameters["camera"]; baseColourTextureParam = Parameters["baseColourTexture"]; normalTextureParam = Parameters["normalTexture"]; emissionTextureParam = Parameters["emissionTexture"]; occlusionTextureParam = Parameters["occlusionTexture"]; metallicRoughnessTextureParam = Parameters["metallicRoughnessTexture"]; envDiffuseTextureParam = Parameters["envDiffuseTexture"]; brdfLutTextureParam = Parameters["brdfLutTexture"]; envSpecularTextureParam = Parameters["envSpecularTexture"]; } protected PBREffect(PBREffect cloneSource) : base(cloneSource) { modelParam = Parameters["model"]; viewParam = Parameters["view"]; projectionParam = Parameters["param"]; lightDirParam = Parameters["lightDir"]; lightColourParam = Parameters["lightColour"]; normalScaleParam = Parameters["normalScale"]; emissiveFactorParam = Parameters["emissiveFactor"]; occlusionStrengthParam = Parameters["occlusionStrength"]; metallicRoughnessValuesParam = Parameters["metallicRoughnessValues"]; baseColorFactorParam = Parameters["baseColorFactor"]; cameraLookParam = Parameters["camera"]; baseColourTextureParam = Parameters["baseColourTexture"]; normalTextureParam = Parameters["normalTexture"]; emissionTextureParam = Parameters["emissionTexture"]; occlusionTextureParam = Parameters["occlusionTexture"]; metallicRoughnessTextureParam = Parameters["metallicRoughnessTexture"]; envDiffuseTextureParam = Parameters["envDiffuseTexture"]; brdfLutTextureParam = Parameters["brdfLutTexture"]; envSpecularTextureParam = Parameters["envSpecularTexture"]; World = cloneSource.World; View = cloneSource.View; Projection = cloneSource.Projection; Light = cloneSource.Light; NormalScale = cloneSource.normalScale; EmissiveFactor = cloneSource.EmissiveFactor; OcclusionStrength = cloneSource.OcclusionStrength; MetallicRoughnessValue = cloneSource.MetallicRoughnessValue; BaseColorFactor = cloneSource.BaseColorFactor; BaseColourTexture = cloneSource.BaseColourTexture; NormalTexture = cloneSource.NormalTexture; EmissionTexture = cloneSource.EmissionTexture; OcclusionTexture = cloneSource.OcclusionTexture; MetallicRoughnessTexture = cloneSource.MetallicRoughnessTexture; EnvDiffuseTexture = cloneSource.EnvDiffuseTexture; BRDFLutTexture = cloneSource.BRDFLutTexture; EnvSpecularTexture = cloneSource.EnvSpecularTexture; } public override Effect Clone() { return new PBREffect(this); } // FIXME: do param applications here for performance protected override void OnApply() { base.OnApply(); } } }