From 192a198647beebcd09bd89234aee47f3d8be972e Mon Sep 17 00:00:00 2001 From: freezy Date: Mon, 4 Oct 2021 23:22:37 +0200 Subject: [PATCH 1/5] lights: Add insert prefab. --- .../Resources/Prefabs/Light - Insert.prefab | 330 ++++++++++++++++++ .../Prefabs/Light - Insert.prefab.meta | 7 + Assets/Resources/Prefabs/Light.prefab | 62 +--- Runtime/PrefabProvider.cs | 6 + 4 files changed, 346 insertions(+), 59 deletions(-) create mode 100644 Assets/Resources/Prefabs/Light - Insert.prefab create mode 100644 Assets/Resources/Prefabs/Light - Insert.prefab.meta diff --git a/Assets/Resources/Prefabs/Light - Insert.prefab b/Assets/Resources/Prefabs/Light - Insert.prefab new file mode 100644 index 0000000..d2e52fc --- /dev/null +++ b/Assets/Resources/Prefabs/Light - Insert.prefab @@ -0,0 +1,330 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &550864702806823459 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2649789736405374282} + - component: {fileID: 4750229237398323307} + m_Layer: 0 + m_Name: Light - Insert + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2649789736405374282 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 550864702806823459} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 179995335602121591} + - {fileID: 4222681214933490337} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &4750229237398323307 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 550864702806823459} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9e53d77b7d585c94b89513d95571354e, type: 3} + m_Name: + m_EditorClassIdentifier: + _isLocked: 0 + _editorLayer: 0 + _editorLayerName: + _editorLayerVisibility: 1 + Position: {x: 0, y: 0, z: 0} + _surface: {fileID: 0} + BulbSize: 20 + State: 0 + BlinkPattern: + BlinkInterval: 0 + FadeSpeedUp: 0 + FadeSpeedDown: 0 +--- !u!1 &5987759878404274838 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 179995335602121591} + - component: {fileID: 4762606870770787496} + - component: {fileID: 5251209611439210537} + m_Layer: 0 + m_Name: Insert + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &179995335602121591 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5987759878404274838} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0, y: -0, z: 0.1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2649789736405374282} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &4762606870770787496 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5987759878404274838} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2a11a120b7da4b4db6fd330516311db, type: 3} + m_Name: + m_EditorClassIdentifier: + InsertHeight: 20 + PositionZ: 0.1 + _dragPoints: [] +--- !u!33 &5251209611439210537 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5987759878404274838} + m_Mesh: {fileID: 0} +--- !u!1 &7031967719973800860 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4222681214933490337} + - component: {fileID: 1799189321192003275} + - component: {fileID: 680429306115422845} + m_Layer: 0 + m_Name: Source + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4222681214933490337 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7031967719973800860} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -50} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2649789736405374282} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!108 &1799189321192003275 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7031967719973800860} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 0 + m_Shape: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1155.2686 + m_Range: 0.1 + m_SpotAngle: 75 + m_InnerSpotAngle: 1 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 2 + m_AreaSize: {x: 0.5, y: 0.5} + m_BounceIntensity: 1 + m_ColorTemperature: 2700 + m_UseColorTemperature: 1 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0.01 + m_ShadowAngle: 0 +--- !u!114 &680429306115422845 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7031967719973800860} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7a68c43fe1f2a47cfa234b5eeaa98012, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 11 + m_ObsoleteShadowResolutionTier: 1 + m_ObsoleteUseShadowQualitySettings: 0 + m_ObsoleteCustomShadowResolution: 512 + m_ObsoleteContactShadows: 0 + m_PointlightHDType: 0 + m_SpotLightShape: 0 + m_AreaLightShape: 0 + m_Intensity: 1500 + m_EnableSpotReflector: 1 + m_LuxAtDistance: 1 + m_InnerSpotPercent: 85 + m_SpotIESCutoffPercent: 100 + m_LightDimmer: 1 + m_VolumetricDimmer: 1 + m_LightUnit: 0 + m_FadeDistance: 10000 + m_VolumetricFadeDistance: 10000 + m_AffectDiffuse: 1 + m_AffectSpecular: 1 + m_NonLightmappedOnly: 0 + m_ShapeWidth: 0.5 + m_ShapeHeight: 0.5 + m_AspectRatio: 1 + m_ShapeRadius: 0.01 + m_SoftnessScale: 1 + m_UseCustomSpotLightShadowCone: 0 + m_CustomSpotLightShadowCone: 1 + m_MaxSmoothness: 0.99 + m_ApplyRangeAttenuation: 1 + m_DisplayAreaLightEmissiveMesh: 0 + m_AreaLightCookie: {fileID: 0} + m_IESPoint: {fileID: 0} + m_IESSpot: {fileID: 0} + m_IncludeForRayTracing: 1 + m_AreaLightShadowCone: 120 + m_UseScreenSpaceShadows: 0 + m_InteractsWithSky: 1 + m_AngularDiameter: 0.5 + m_FlareSize: 2 + m_FlareTint: {r: 1, g: 1, b: 1, a: 1} + m_FlareFalloff: 4 + m_SurfaceTexture: {fileID: 0} + m_SurfaceTint: {r: 1, g: 1, b: 1, a: 1} + m_Distance: 1.5e+11 + m_UseRayTracedShadows: 0 + m_NumRayTracingSamples: 4 + m_FilterTracedShadow: 1 + m_FilterSizeTraced: 16 + m_SunLightConeAngle: 0.5 + m_LightShadowRadius: 0.5 + m_SemiTransparentShadow: 0 + m_ColorShadow: 1 + m_DistanceBasedFiltering: 0 + m_EvsmExponent: 15 + m_EvsmLightLeakBias: 0 + m_EvsmVarianceBias: 0.00001 + m_EvsmBlurPasses: 0 + m_LightlayersMask: 1 + m_LinkShadowLayers: 1 + m_ShadowNearPlane: 0.1 + m_BlockerSampleCount: 24 + m_FilterSampleCount: 16 + m_MinFilterSize: 0.1 + m_KernelSize: 5 + m_LightAngle: 1 + m_MaxDepthBias: 0.001 + m_ShadowResolution: + m_Override: 512 + m_UseOverride: 1 + m_Level: 0 + m_ShadowDimmer: 1 + m_VolumetricShadowDimmer: 1 + m_ShadowFadeDistance: 10000 + m_UseContactShadow: + m_Override: 0 + m_UseOverride: 1 + m_Level: 0 + m_RayTracedContactShadow: 0 + m_ShadowTint: {r: 0, g: 0, b: 0, a: 1} + m_PenumbraTint: 0 + m_NormalBias: 0.75 + m_SlopeBias: 0.5 + m_ShadowUpdateMode: 0 + m_AlwaysDrawDynamicShadows: 0 + m_UpdateShadowOnLightMovement: 0 + m_CachedShadowTranslationThreshold: 0.01 + m_CachedShadowAngularThreshold: 0.5 + m_BarnDoorAngle: 90 + m_BarnDoorLength: 0.05 + m_preserveCachedShadow: 0 + m_ShadowCascadeRatios: + - 0.05 + - 0.2 + - 0.3 + m_ShadowCascadeBorders: + - 0.2 + - 0.2 + - 0.2 + - 0.2 + m_ShadowAlgorithm: 0 + m_ShadowVariant: 0 + m_ShadowPrecision: 0 + useOldInspector: 0 + useVolumetric: 1 + featuresFoldout: 1 + showAdditionalSettings: 0 + m_AreaLightEmissiveMeshShadowCastingMode: 0 + m_AreaLightEmissiveMeshMotionVectorGenerationMode: 0 + m_AreaLightEmissiveMeshLayer: -1 diff --git a/Assets/Resources/Prefabs/Light - Insert.prefab.meta b/Assets/Resources/Prefabs/Light - Insert.prefab.meta new file mode 100644 index 0000000..2ac63d6 --- /dev/null +++ b/Assets/Resources/Prefabs/Light - Insert.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 18379ee7dfbf42941b3047cc39ad1491 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/Light.prefab b/Assets/Resources/Prefabs/Light.prefab index 935c43c..2567bd9 100644 --- a/Assets/Resources/Prefabs/Light.prefab +++ b/Assets/Resources/Prefabs/Light.prefab @@ -30,7 +30,6 @@ Transform: m_Children: - {fileID: 3878378365098062784} - {fileID: 6343396272821131885} - - {fileID: 179995335602121591} - {fileID: 4222681214933490337} m_Father: {fileID: 0} m_RootOrder: 0 @@ -86,7 +85,7 @@ Transform: m_GameObject: {fileID: 3112338884683058496} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalScale: {x: 20, y: 20, z: 20} m_Children: [] m_Father: {fileID: 2649789736405374282} m_RootOrder: 0 @@ -140,61 +139,6 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!1 &5987759878404274838 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 179995335602121591} - - component: {fileID: 4762606870770787496} - - component: {fileID: 5251209611439210537} - m_Layer: 0 - m_Name: Insert - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &179995335602121591 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5987759878404274838} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 2649789736405374282} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &4762606870770787496 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5987759878404274838} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e2a11a120b7da4b4db6fd330516311db, type: 3} - m_Name: - m_EditorClassIdentifier: - InsertHeight: 20 - PositionZ: 0 - _dragPoints: [] ---- !u!33 &5251209611439210537 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5987759878404274838} - m_Mesh: {fileID: 0} --- !u!1 &6207005947276562095 GameObject: m_ObjectHideFlags: 0 @@ -222,7 +166,7 @@ Transform: m_GameObject: {fileID: 6207005947276562095} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalScale: {x: 20, y: 20, z: 20} m_Children: [] m_Father: {fileID: 2649789736405374282} m_RootOrder: 1 @@ -306,7 +250,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 2649789736405374282} - m_RootOrder: 3 + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!108 &1799189321192003275 Light: diff --git a/Runtime/PrefabProvider.cs b/Runtime/PrefabProvider.cs index 739bb96..3a7ad34 100644 --- a/Runtime/PrefabProvider.cs +++ b/Runtime/PrefabProvider.cs @@ -65,11 +65,17 @@ public GameObject CreateKicker(int type) throw new ArgumentException(nameof(type), $"Unknown kicker type {type}."); } } + public GameObject CreateLight() { return UnityEngine.Resources.Load("Prefabs/Light"); } + public GameObject CreateInsertLight() + { + return UnityEngine.Resources.Load("Prefabs/Light - Insert"); + } + public GameObject CreateSpinner() { return UnityEngine.Resources.Load("Prefabs/Spinner"); From 559c9c79d849fa1279bd2254585144923163bf3c Mon Sep 17 00:00:00 2001 From: freezy Date: Tue, 5 Oct 2021 21:37:05 +0200 Subject: [PATCH 2/5] lights: Update prefabs. --- Runtime/LightConverter.cs | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/Runtime/LightConverter.cs b/Runtime/LightConverter.cs index dfee5f9..9604043 100644 --- a/Runtime/LightConverter.cs +++ b/Runtime/LightConverter.cs @@ -27,7 +27,7 @@ namespace VisualPinball.Engine.Unity.Hdrp { public class LightConverter : ILightConverter { - public void UpdateLight(Light light, LightData data) + public void UpdateLight(Light light, LightData data, bool isInsert) { // retrieve hdrp light var hdLight = light.GetComponent(); @@ -38,13 +38,39 @@ public void UpdateLight(Light light, LightData data) // color and position hdLight.color = data.Color2.ToUnityColor(); - hdLight.intensity = data.Intensity / 4f; - hdLight.range = data.Falloff * 0.001f; + if (!isInsert) { + hdLight.intensity = data.Intensity / 4f; + hdLight.range = data.Falloff * 0.001f; - // TODO: vpe specific data for height - light.transform.localPosition = new Vector3(0f, 0f, 25f); + // TODO: vpe specific data for height + light.transform.localPosition = new Vector3(0f, 0f, 25f); + } hdLight.EnableShadows(false); } + + public void SetColor(Light light, Color color) + { + var hdLight = light.GetComponent(); + if (hdLight != null) { + hdLight.color = color; + } + } + + public void SetIntensity(Light light, float intensityLumen) + { + var hdLight = light.GetComponent(); + if (hdLight != null) { + hdLight.SetIntensity(intensityLumen, LightUnit.Lumen); + } + } + + public void SpotLight(Light light, float outer, float innerPercent) + { + var hdLight = light.GetComponent(); + if (hdLight != null) { + hdLight.SetSpotAngle(outer, innerPercent); + } + } } } From 9297f2b9ac0aa85608d5652adcb85042ee695b3c Mon Sep 17 00:00:00 2001 From: freezy Date: Tue, 5 Oct 2021 23:41:51 +0200 Subject: [PATCH 3/5] lights: Add pyramid spot support. --- Runtime/LightConverter.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Runtime/LightConverter.cs b/Runtime/LightConverter.cs index 9604043..583866f 100644 --- a/Runtime/LightConverter.cs +++ b/Runtime/LightConverter.cs @@ -72,5 +72,15 @@ public void SpotLight(Light light, float outer, float innerPercent) hdLight.SetSpotAngle(outer, innerPercent); } } + + public void PyramidAngle(Light light, float angle, float aspectRatio) + { + var hdLight = light.GetComponent(); + if (hdLight != null) { + hdLight.spotLightShape = SpotLightShape.Pyramid; + hdLight.SetSpotAngle(angle); + hdLight.aspectRatio = aspectRatio; + } + } } } From 98f03bdce7707904b1187a9704d627e824aee38f Mon Sep 17 00:00:00 2001 From: freezy Date: Mon, 11 Oct 2021 00:24:35 +0200 Subject: [PATCH 4/5] api: Add diffusion profiles. --- Runtime/LightConverter.cs | 16 +++++++ Runtime/MaterialConverter.cs | 87 +++++++++++++++++++++++++++++++++++- 2 files changed, 101 insertions(+), 2 deletions(-) diff --git a/Runtime/LightConverter.cs b/Runtime/LightConverter.cs index 583866f..da5d149 100644 --- a/Runtime/LightConverter.cs +++ b/Runtime/LightConverter.cs @@ -56,6 +56,15 @@ public void SetColor(Light light, Color color) hdLight.color = color; } } + public void SetShadow(Light light, bool enabled, bool isDynamic, float nearPlane = 0.01f) + { + var hdLight = light.GetComponent(); + if (hdLight != null) { + hdLight.EnableShadows(enabled); + hdLight.SetShadowNearPlane(nearPlane); + hdLight.SetShadowUpdateMode(isDynamic ? ShadowUpdateMode.EveryFrame : ShadowUpdateMode.OnEnable); + } + } public void SetIntensity(Light light, float intensityLumen) { @@ -64,6 +73,13 @@ public void SetIntensity(Light light, float intensityLumen) hdLight.SetIntensity(intensityLumen, LightUnit.Lumen); } } + public void SetTemperature(Light light, float temperature) + { + var hdLight = light.GetComponent(); + if (hdLight != null) { + hdLight.SetColor(light.color, temperature); + } + } public void SpotLight(Light light, float outer, float innerPercent) { diff --git a/Runtime/MaterialConverter.cs b/Runtime/MaterialConverter.cs index 6572550..fe408d3 100644 --- a/Runtime/MaterialConverter.cs +++ b/Runtime/MaterialConverter.cs @@ -19,11 +19,18 @@ // ReSharper disable CheckNamespace using System; +using System.Globalization; +using System.Linq; +using System.Reflection; using System.Text; +using NLog; +using UnityEditor; using UnityEngine; using VisualPinball.Engine.VPT; using VisualPinball.Unity; +using Logger = NLog.Logger; using Material = UnityEngine.Material; +using Object = UnityEngine.Object; namespace VisualPinball.Engine.Unity.Hdrp { @@ -43,9 +50,17 @@ public class MaterialConverter : IMaterialConverter private static readonly int NormalMap = Shader.PropertyToID("_NormalMap"); private static readonly int UVChannelVertices = Shader.PropertyToID("_UVChannelVertices"); private static readonly int UVChannelNormals = Shader.PropertyToID("_UVChannelNormals"); + private static readonly int DiffusionProfileAsset = Shader.PropertyToID("_DiffusionProfileAsset"); + private static readonly int DiffusionProfileHash = Shader.PropertyToID("_DiffusionProfileHash"); + private static readonly int MaterialID = Shader.PropertyToID("_MaterialID"); #endregion + private const string DiffusionProfilePlastic = "Packages/org.visualpinball.unity.assetlibrary/Assets/Settings/DiffusionProfiles/Plastic/PET_PETG.asset"; + + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + public Shader GetShader() { return Shader.Find("HDRP/Lit"); @@ -114,8 +129,7 @@ public Material CreateMaterial(PbrMaterial vpxMaterial, ITextureProvider texture unityMaterial.SetFloat(Metallic, metallicValue); - // roughness / glossiness - unityMaterial.SetFloat(Smoothness, vpxMaterial.Roughness); + SetSmoothness(unityMaterial, vpxMaterial.Roughness); // map if (vpxMaterial.HasMap && textureProvider != null) { @@ -130,9 +144,21 @@ public Material CreateMaterial(PbrMaterial vpxMaterial, ITextureProvider texture unityMaterial.SetTexture( NormalMap, textureProvider.GetTexture(vpxMaterial.NormalMap.Name)); } + // diffusion profile + if (vpxMaterial.DiffusionProfile != DiffusionProfileTemplate.None) { + SetDiffusionProfile(unityMaterial, vpxMaterial.DiffusionProfile); + } + + SetMaterialType(unityMaterial, vpxMaterial.MaterialType); + return unityMaterial; } + public void SetSmoothness(Material unityMaterial, float smoothness) + { + unityMaterial.SetFloat(Smoothness, smoothness); + } + public Material MergeMaterials(PbrMaterial vpxMaterial, Material texturedMaterial) { var nonTexturedMaterial = CreateMaterial(vpxMaterial, null, null); @@ -146,5 +172,62 @@ public Material MergeMaterials(PbrMaterial vpxMaterial, Material texturedMateria return mergedMaterial; } + + public void SetDiffusionProfile(Material material, DiffusionProfileTemplate template) + { + #if UNITY_EDITOR + + var diffusionProfilePath = template switch { + DiffusionProfileTemplate.Plastics => DiffusionProfilePlastic, + _ => throw new ArgumentOutOfRangeException(nameof(template), template, "Invalid diffusion profile.") + }; + + // unity, why tf would you make DiffusionProfileSettings internal!?! + var diffusionProfile = AssetDatabase.LoadAssetAtPath(diffusionProfilePath); + + if (diffusionProfile != null) { + + // need to get those through reflection.. + var profile = diffusionProfile.GetType().GetRuntimeFields().First(f => f.Name == "profile").GetValue(diffusionProfile); + var profileHash = (uint)profile.GetType().GetRuntimeFields().First(f => f.Name == "hash").GetValue(profile); + + var guid = AssetDatabase.AssetPathToGUID(diffusionProfilePath); + var newGuid = ConvertGUIDToVector4(guid); + var hash = AsFloat(profileHash); + + // encode back GUID and it's hash + material.SetVector(DiffusionProfileAsset, newGuid); + material.SetFloat(DiffusionProfileHash, hash); + + } else { + Logger.Warn($"Could not load diffusion profile at {diffusionProfilePath}"); + } + + #endif + } + + public void SetMaterialType(Material material, MaterialType materialType) + { + material.SetFloat(MaterialID, (int)materialType); + } + + private static Vector4 ConvertGUIDToVector4(string guid) + { + Vector4 vector; + byte[] bytes = new byte[16]; + + for (int i = 0; i < 16; i++) + bytes[i] = byte.Parse(guid.Substring(i * 2, 2), NumberStyles.HexNumber); + + unsafe + { + fixed (byte * b = bytes) + vector = *(Vector4 *)b; + } + + return vector; + } + + private static float AsFloat(uint val) { unsafe { return *((float*)&val); } } } } From 3075aeda17ef6cfd37219215c2edeccd07f1de77 Mon Sep 17 00:00:00 2001 From: freezy Date: Mon, 18 Oct 2021 00:00:32 +0200 Subject: [PATCH 5/5] api: Add range. --- Runtime/LightConverter.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Runtime/LightConverter.cs b/Runtime/LightConverter.cs index da5d149..35ea31d 100644 --- a/Runtime/LightConverter.cs +++ b/Runtime/LightConverter.cs @@ -65,6 +65,13 @@ public void SetShadow(Light light, bool enabled, bool isDynamic, float nearPlane hdLight.SetShadowUpdateMode(isDynamic ? ShadowUpdateMode.EveryFrame : ShadowUpdateMode.OnEnable); } } + public void SetRange(Light light, float range) + { + var hdLight = light.GetComponent(); + if (hdLight != null) { + hdLight.range = range; + } + } public void SetIntensity(Light light, float intensityLumen) { @@ -85,6 +92,7 @@ public void SpotLight(Light light, float outer, float innerPercent) { var hdLight = light.GetComponent(); if (hdLight != null) { + hdLight.type = HDLightType.Spot; hdLight.SetSpotAngle(outer, innerPercent); } }