diff --git a/src/RhinoInside.Revit/Convert/Render/RenderMaterialConverter.cs b/src/RhinoInside.Revit/Convert/Render/RenderMaterialConverter.cs index 278f295f3..8490c7e0d 100755 --- a/src/RhinoInside.Revit/Convert/Render/RenderMaterialConverter.cs +++ b/src/RhinoInside.Revit/Convert/Render/RenderMaterialConverter.cs @@ -539,6 +539,7 @@ internal static void SimulateRenderingAsset(this RenderMaterial material, Asset static void TintMaterial(RenderMaterial material, Color4f? tintColor) { + if (!tintColor.HasValue) return; if (material.TextureChildSlotName(RenderMaterial.StandardChildSlots.Diffuse) is string diffuseSlot) { var diffuse = tintColor.HasValue ? @@ -1580,86 +1581,186 @@ static void GetMasonryCMUSchemaParameters(Asset asset, ref BasicMaterialParamete static void GetPrismOpaqueSchemaParameters(Asset asset, ref BasicMaterialParameters material) { material.PreviewGeometryType = RenderMaterial.PreviewGeometryType.Cube; + material.Transparency = 0.0; + material.FresnelEnabled = true; + + if (asset.FindByName(AdvancedOpaque.SurfaceNdfType) is AssetPropertyInteger ndfType) + { + switch ((SurfaceNdfType) ndfType.Value) + { + case SurfaceNdfType.Beckmann: break; + case SurfaceNdfType.Ggx: break; + } + } + #region Parameters + // Color if (asset.FindByName(AdvancedOpaque.OpaqueAlbedo) is AssetPropertyDoubleArray4d diffuse) { material.Diffuse = ToColor4f(diffuse); material.DiffuseTexture = ToSimulatedTexture(diffuse.GetSingleConnectedAsset()); } - if (asset.FindByName(AdvancedOpaque.OpaqueLuminance) is AssetPropertyDouble luminance) + // Reflectance + if (asset.FindByName(AdvancedOpaque.OpaqueF0) is AssetPropertyDouble reflectance) { - material.DisableLighting = luminance.Value > 0.0; - if (material.DisableLighting) + material.PolishAmount = reflectance.Value / 0.08; + } + + // Roughness + if (asset.FindByName(AdvancedOpaque.SurfaceRoughness) is AssetPropertyDouble roughness) + { + material.Reflectivity = 1.0 - roughness.Value; + } + #endregion + + #region Translucency + if (asset.FindByName(AdvancedOpaque.OpaqueTranslucency) is AssetPropertyBoolean translucency && translucency.Value) + { + // Depth + if (asset.FindByName(AdvancedOpaque.OpaqueMfp) is AssetPropertyDistance depth) { - if (asset.FindByName(AdvancedOpaque.OpaqueLuminanceModifier) is AssetPropertyDoubleArray4d emission) - { - var luminanceFactor = Arithmetic.Clamp(luminance.Value, 0.0, 2000.0) / 2000.0; - material.Emission = ToColor4f(emission, luminanceFactor); - } + var depth_mm = ARDB.UnitUtils.Convert(depth.Value, depth.GetUnitTypeId(), DBXS.UnitType.Millimeters); + material.ClarityAmount = depth_mm / 10.0; + } + + // Weight + if (asset.FindByName(AdvancedOpaque.OpaqueMfpModifier) is AssetPropertyDoubleArray4d weight) + { + } } + #endregion - if (asset.FindByName(AdvancedOpaque.SurfaceRoughness) is AssetPropertyDouble roughness) + #region Emissivity + if (asset.FindByName(AdvancedOpaque.OpaqueEmission) is AssetPropertyBoolean emission && emission.Value) { - material.Shine = 1.0 - roughness.Value; - material.PolishAmount = 1.0 - roughness.Value; + // Luminance + if (asset.FindByName(AdvancedOpaque.OpaqueLuminance) is AssetPropertyDouble luminance) + { + material.DisableLighting = luminance.Value > 0.0; + if (material.DisableLighting) + { + // Filter Color + if (asset.FindByName(AdvancedOpaque.OpaqueLuminanceModifier) is AssetPropertyDoubleArray4d modifier) + { + var luminanceFactor = Arithmetic.Clamp(luminance.Value, 0.0, 2000.0) / 2000.0; + material.Emission = ToColor4f(modifier, luminanceFactor); + } + } + } } + #endregion + #region Relief Pattern + // Image if (asset.FindByName(AdvancedOpaque.SurfaceNormal) is AssetPropertyReference normal) { material.BumpTexture = ToSimulatedTexture(normal.GetSingleConnectedAsset()); } + #endregion + #region Cutout if (asset.FindByName(AdvancedOpaque.SurfaceCutout) is AssetPropertyReference cutout) { material.OpacityTexture = ToSimulatedTexture(cutout.GetSingleConnectedAsset()); } + #endregion + + #region Advanced Highlight Controls + // Anisotropy + if (asset.FindByName(AdvancedOpaque.SurfaceAnisotropy) is AssetPropertyDouble anisotropy) + { + material.Shine = 1.0 - anisotropy.Value; + } + // Orientation + if (asset.FindByName(AdvancedOpaque.SurfaceRotation) is AssetPropertyDouble orientation) + { + } + + // Color if (asset.FindByName(AdvancedOpaque.SurfaceAlbedo) is AssetPropertyDoubleArray4d specular) { - material.Reflectivity = 1.0; - material.ReflectivityColor = ToColor4f(specular); + material.Specular = ToColor4f(specular); + material.EnvironmentTexture = ToSimulatedTexture(specular.GetSingleConnectedAsset()); + material.EnvironmentTextureAmount = 0.1; } + #endregion } static void GetPrismTransparentSchemaParameters(Asset asset, ref BasicMaterialParameters material) { material.PreviewGeometryType = RenderMaterial.PreviewGeometryType.Plane; + material.Transparency = 1.0; + material.FresnelEnabled = true; + + if (asset.FindByName(AdvancedTransparent.SurfaceNdfType) is AssetPropertyInteger ndfType) + { + switch ((SurfaceNdfType) ndfType.Value) + { + case SurfaceNdfType.Beckmann: break; + case SurfaceNdfType.Ggx: break; + } + } + #region Parameters if (asset.FindByName(AdvancedTransparent.TransparentColor) is AssetPropertyDoubleArray4d transparency) { + material.Diffuse = ToColor4f(transparency); + material.Diffuse = new Color4f(material.Diffuse.R, material.Diffuse.G, material.Diffuse.B, 1.0f); + material.TransparencyColor = ToColor4f(transparency); + material.OpacityTexture = ToSimulatedTexture(transparency.GetSingleConnectedAsset()); } if (asset.FindByName(AdvancedTransparent.TransparentIor) is AssetPropertyDouble ior) { - material.Transparency = 0.92; material.Ior = ior.Value; - material.FresnelEnabled = true; } if (asset.FindByName(AdvancedTransparent.SurfaceRoughness) is AssetPropertyDouble roughness) { material.Shine = 1.0 - roughness.Value; - material.PolishAmount = 1.0 - roughness.Value; + material.Reflectivity = 1.0 - roughness.Value; } + #endregion + #region Relief Pattern if (asset.FindByName(AdvancedTransparent.SurfaceNormal) is AssetPropertyReference normal) { material.BumpTexture = ToSimulatedTexture(normal.GetSingleConnectedAsset()); } + #endregion + #region Cutout if (asset.FindByName(AdvancedTransparent.SurfaceCutout) is AssetPropertyReference cutout) { material.OpacityTexture = ToSimulatedTexture(cutout.GetSingleConnectedAsset()); } + #endregion - if (asset.FindByName(AdvancedTransparent.SurfaceAlbedo) is AssetPropertyDoubleArray4d diffuse) + #region Advanced Highlight Controls + // Anisotropy + if (asset.FindByName(AdvancedTransparent.SurfaceAnisotropy) is AssetPropertyDouble anisotropy) { - material.Diffuse = ToColor4f(diffuse); - material.DiffuseTexture = ToSimulatedTexture(diffuse.GetSingleConnectedAsset()); + material.PolishAmount = 1.0 - anisotropy.Value; + material.ClarityAmount = 1.0 - anisotropy.Value; + } + + // Orientation + if (asset.FindByName(AdvancedOpaque.SurfaceRotation) is AssetPropertyDouble orientation) + { + } + + // Color + if (asset.FindByName(AdvancedTransparent.SurfaceAlbedo) is AssetPropertyDoubleArray4d specular) + { + material.Specular = ToColor4f(specular); + material.EnvironmentTexture = ToSimulatedTexture(specular.GetSingleConnectedAsset()); + material.EnvironmentTextureAmount = 0.1; } + #endregion } static void GetPrismMetalSchemaParameters(Asset asset, ref BasicMaterialParameters material)