LightDelegateInterface.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <Atom/Feature/CoreLights/PhotometricValue.h>
  10. #include <Atom/Feature/CoreLights/ShadowConstants.h>
  11. #include <AzCore/Component/TransformBus.h>
  12. namespace AzFramework
  13. {
  14. class DebugDisplayRequests;
  15. }
  16. namespace AZ
  17. {
  18. class Color;
  19. class Transform;
  20. class Aabb;
  21. namespace Render
  22. {
  23. //! Delegate for managing light shape specific functionality in the AreaLightComponentController.
  24. class LightDelegateInterface
  25. {
  26. public:
  27. virtual ~LightDelegateInterface() = default;
  28. //! Sets the area light component config so delegates don't have to cache the same data locally.
  29. virtual void SetConfig(const AreaLightComponentConfig* config) = 0;
  30. //! Sets the color of the light independent of light intensity. The color is a mask on the total light intensity.
  31. virtual void SetChroma(const Color& chroma) = 0;
  32. //! Sets the light intensity.
  33. virtual void SetIntensity(float intensity) = 0;
  34. //! Sets the light unit, and returns the converted light intensity.
  35. virtual float SetPhotometricUnit(PhotometricUnit unit) = 0;
  36. //! Sets the maximum distance from any part of the surface of the area light at which this light will have an effect.
  37. virtual void SetAttenuationRadius(float radius) = 0;
  38. //! Gets the light intensity.
  39. virtual const PhotometricValue& GetPhotometricValue() const = 0;
  40. //! Gets the surface area of the shape.
  41. virtual float GetSurfaceArea() const = 0;
  42. //! Returns the number of steradians covered by this light type.
  43. virtual float GetEffectiveSolidAngle() const = 0;
  44. //! Sets if this shape is double-sided (only applicable for 2d shapes).
  45. virtual void SetLightEmitsBothDirections([[maybe_unused]] bool lightEmitsBothDirections) = 0;
  46. //! Sets if this light uses linearly transformed cosines (false) or a faster approximation (true). Only applicable for shapes
  47. //! that support LTC.
  48. virtual void SetUseFastApproximation([[maybe_unused]] bool useFastApproximation) = 0;
  49. //! Calculates the attenuation radius for this light type based on a threshold value.
  50. virtual float CalculateAttenuationRadius(float lightThreshold) const = 0;
  51. //! Handle any additional debug display drawing for beyond what the shape already provides.
  52. virtual void DrawDebugDisplay(
  53. const Transform& transform, const Color& color, AzFramework::DebugDisplayRequests& debugDisplay, bool isSelected) const = 0;
  54. //! Turns the visibility of this light on/off.
  55. virtual void SetVisibility(bool visibility) = 0;
  56. // Shutters
  57. // Sets if the light should be restricted to shutter angles.
  58. virtual void SetEnableShutters(bool enabled) = 0;
  59. // Sets the inner and outer angles of the shutters in degrees for where the light
  60. // beam starts to attenuate (inner) to where it is completely occluded (outer).
  61. virtual void SetShutterAngles(float innerAngleDegrees, float outerAngleDegrees) = 0;
  62. // Shadows
  63. //! Sets if shadows should be enabled.
  64. virtual void SetEnableShadow(bool enabled) = 0;
  65. //! Sets the shadow bias.
  66. virtual void SetShadowBias(float bias) = 0;
  67. //! Sets the maximum resolution of the shadow map.
  68. virtual void SetShadowmapMaxSize(ShadowmapSize size) = 0;
  69. //! Sets the filter method for the shadow.
  70. virtual void SetShadowFilterMethod(ShadowFilterMethod method) = 0;
  71. //! Sets the sample count for filtering of the shadow boundary, max 64.
  72. virtual void SetFilteringSampleCount(uint32_t count) = 0;
  73. //! Sets the Esm exponent to use. Higher values produce a steeper falloff between light and shadow.
  74. virtual void SetEsmExponent(float exponent) = 0;
  75. //! Sets the normal bias. Reduces acne by biasing the shadowmap lookup along the geometric normal.
  76. virtual void SetNormalShadowBias(float bias) = 0;
  77. //! Sets the current shadow caching mode. Cached shadows use persistent textures and only update
  78. //! when they detect a change. Regular shadows use transient textures but re-render every frame.
  79. virtual void SetShadowCachingMode(AreaLightComponentConfig::ShadowCachingMode cachingMode) = 0;
  80. // Global Illumination
  81. //! Sets if the light should affect diffuse global illumination.
  82. virtual void SetAffectsGI(bool affectsGI) = 0;
  83. //! Sets the multiplier on the contribution to diffuse global illumination.
  84. virtual void SetAffectsGIFactor(float affectsGIFactor) = 0;
  85. // Debug Visualization
  86. //! Returns the Aabb for the debug visualization of the light.
  87. virtual Aabb GetLocalVisualizationBounds() const = 0;
  88. };
  89. } // namespace Render
  90. } // namespace AZ