| 821 | } |
| 822 | |
| 823 | static void UpdateAreaLightUnits() |
| 824 | { |
| 825 | static LightUnits prevUnits = AreaLightUnits; |
| 826 | const LightUnits currUnits = AreaLightUnits; |
| 827 | |
| 828 | const float size = AreaLightSize; |
| 829 | const float distance = AreaLightIlluminanceDistance; |
| 830 | |
| 831 | // Compute the luminance from our currently active unit |
| 832 | float luminance = AreaLightColor.Intensity(); |
| 833 | if(prevUnits == LightUnits::Illuminance) |
| 834 | { |
| 835 | float illuminance = AreaLightIlluminance; |
| 836 | float angularRadius = std::atan2(size, distance); |
| 837 | float integralFactor = IlluminanceIntegral(angularRadius); |
| 838 | luminance = illuminance / integralFactor; |
| 839 | } |
| 840 | else if(prevUnits == LightUnits::LuminousPower) |
| 841 | { |
| 842 | float luminousPower = AreaLightLuminousPower; |
| 843 | luminance = luminousPower / (4 * size * size * Pi * Pi); |
| 844 | } |
| 845 | else if(prevUnits == LightUnits::EV100) |
| 846 | { |
| 847 | float ev100 = AreaLightEV100; |
| 848 | luminance = std::pow(2.0f, ev100 - 3.0f); |
| 849 | } |
| 850 | |
| 851 | // Set the new luminance onto the color |
| 852 | AreaLightColor.SetIntensity(luminance); |
| 853 | |
| 854 | // Update the other units |
| 855 | float angularRadius = std::atan2(size, distance); |
| 856 | float integralFactor = IlluminanceIntegral(angularRadius); |
| 857 | float illuminance = luminance * integralFactor; |
| 858 | AreaLightIlluminance.SetValue(illuminance); |
| 859 | |
| 860 | float luminousPower = luminance * (4 * size * size * Pi * Pi); |
| 861 | AreaLightLuminousPower.SetValue(luminousPower); |
| 862 | |
| 863 | float ev100 = std::log2(luminance) + 3.0f; |
| 864 | AreaLightEV100.SetValue(ev100); |
| 865 | |
| 866 | if(prevUnits != currUnits) |
| 867 | { |
| 868 | AreaLightColor.SetIntensityVisible(currUnits == LightUnits::Luminance); |
| 869 | AreaLightIlluminance.SetVisible(currUnits == LightUnits::Illuminance); |
| 870 | AreaLightLuminousPower.SetVisible(currUnits == LightUnits::LuminousPower); |
| 871 | AreaLightEV100.SetVisible(currUnits == LightUnits::EV100); |
| 872 | AreaLightIlluminanceDistance.SetVisible(currUnits == LightUnits::Illuminance); |
| 873 | |
| 874 | prevUnits = currUnits; |
| 875 | } |
| 876 | } |
| 877 | |
| 878 | void UpdateUI() |
| 879 | { |
no test coverage detected