EmissiveFunctor.lua 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. ----------------------------------------------------------------------------------------------------
  2. --
  3. -- Copyright (c) Contributors to the Open 3D Engine Project.
  4. -- For complete copyright and license terms please see the LICENSE at the root of this distribution.
  5. --
  6. -- SPDX-License-Identifier: Apache-2.0 OR MIT
  7. --
  8. --
  9. --
  10. ----------------------------------------------------------------------------------------------------
  11. function GetMaterialPropertyDependencies()
  12. return {"emissive.useTexture", "emissive.textureMap", "emissive.intensity", "emissive.unit"}
  13. end
  14. function GetShaderOptionDependencies()
  15. return {"o_emissive_useTexture"}
  16. end
  17. -- These values are based on the Intensity enum defined in the .materialtype file
  18. LightUnitProperty_EV100 = 0
  19. LightUnitProperty_Nit = 1
  20. function Process(context)
  21. local useTexture = context:GetMaterialPropertyValue_bool("emissive.useTexture")
  22. local textureMap = context:GetMaterialPropertyValue_Image("emissive.textureMap")
  23. context:SetShaderOptionValue_bool("o_emissive_useTexture", useTexture and textureMap ~= nil)
  24. local lightUnit = context:GetMaterialPropertyValue_enum("emissive.unit")
  25. local intensity = context:GetMaterialPropertyValue_float("emissive.intensity")
  26. if(LightUnitProperty_EV100 == lightUnit) then
  27. local Ev100LightMeterConstantLuminance = 12.5
  28. local Ev100Iso = 100.0
  29. local Ev100ShutterSpeed = 1.0
  30. intensity = (Ev100LightMeterConstantLuminance * Math.Pow(2.0, intensity)) / (Ev100Iso * Ev100ShutterSpeed)
  31. end
  32. context:SetShaderConstant_float("m_emissiveIntensity", intensity)
  33. end
  34. function ProcessEditor(context)
  35. local textureMap = context:GetMaterialPropertyValue_Image("emissive.textureMap")
  36. if(nil == textureMap) then
  37. context:SetMaterialPropertyVisibility("emissive.useTexture", MaterialPropertyVisibility_Disabled)
  38. else
  39. context:SetMaterialPropertyVisibility("emissive.useTexture", MaterialPropertyVisibility_Enabled)
  40. end
  41. -- Update range values based on light units
  42. local lightUnit = context:GetMaterialPropertyValue_enum("emissive.unit")
  43. if(LightUnitProperty_EV100 == lightUnit) then
  44. context:SetMaterialPropertyMinValue_float("emissive.intensity", -10)
  45. context:SetMaterialPropertyMaxValue_float("emissive.intensity", 20)
  46. context:SetMaterialPropertySoftMinValue_float("emissive.intensity", -6)
  47. context:SetMaterialPropertySoftMaxValue_float("emissive.intensity", 16)
  48. elseif(LightUnitProperty_Nit == lightUnit) then
  49. context:SetMaterialPropertyMinValue_float("emissive.intensity", 0.0)
  50. context:SetMaterialPropertyMaxValue_float("emissive.intensity", 100000.0)
  51. context:SetMaterialPropertySoftMinValue_float("emissive.intensity", 0.001)
  52. context:SetMaterialPropertySoftMaxValue_float("emissive.intensity", 20.0)
  53. else
  54. Error("Unrecognized light unit.")
  55. end
  56. end