c1_lua/lua/app/ui/gm/light_setting_ui.lua
2023-04-03 10:59:13 +08:00

412 lines
16 KiB
Lua

local LightSettingUI = class("LightSettingUi", BaseUI)
function LightSettingUI:ctor()
end
function LightSettingUI:getPrefabPath()
return "assets/prefabs/ui/gm/gm_light_setting.prefab"
end
function LightSettingUI:isFullScreen()
return false
end
function LightSettingUI:onClose()
self.dropList.onValueChanged:RemoveAllListeners()
self.colorInputField.onEndEdit:RemoveAllListeners()
self.intensityInputField.onEndEdit:RemoveAllListeners()
self.shadowStrengthSlider.onValueChanged:RemoveAllListeners()
self.shadowStrengthInputField.onEndEdit:RemoveAllListeners()
self.shadowResolutionDropList.onValueChanged:RemoveAllListeners()
self.shadowBiasSlider.onValueChanged:RemoveAllListeners()
self.shadowBiasInputField.onEndEdit:RemoveAllListeners()
self.shadowNormalBiasSlider.onValueChanged:RemoveAllListeners()
self.shadowNormalBiasInputField.onEndEdit:RemoveAllListeners()
self.shadowNearPlaneSlider.onValueChanged:RemoveAllListeners()
self.shadowNearPlaneInputField.onEndEdit:RemoveAllListeners()
self.shadowProjectionDropList.onValueChanged:RemoveAllListeners()
self.shadowDistanceInputField.onEndEdit:RemoveAllListeners()
self.shadowNearPlaneOffsetInputField.onEndEdit:RemoveAllListeners()
self.shadowCascadesDropList.onValueChanged:RemoveAllListeners()
self.shadowmaskModeDropList.onValueChanged:RemoveAllListeners()
self.shadowsDropList.onValueChanged:RemoveAllListeners()
end
function LightSettingUI:onLoadRootComplete()
local uiMap = self.root:genAllChildren()
uiMap["gm_light_setting.close_btn"]:addClickListener(function()
self:closeUI()
end)
self.dropList = uiMap["gm_light_setting.light_list"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_DROP_DOWN)
self.dropList.onValueChanged:AddListener(function(index)
if self.lights == nil then
return
end
self.currLight = self.lights[index]
self:refreshLight()
end)
self.dropList:ClearOptions()
self.mask = uiMap["gm_light_setting.mask"]
-- 颜色
self.colorInputField = uiMap["gm_light_setting.input_field_1"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_INPUT_FIELD)
self.colorImage = uiMap["gm_light_setting.image_1"]
self.colorAlphaSlider = uiMap["gm_light_setting.image_1.alpha_slider"]
self.colorInputField.onEndEdit:AddListener(function (value)
if self.currLight == nil then
return
end
if string.byte(value) ~= 35 then
value = "#" .. value
end
local color = CS.BF.Utils.ParseHtmlString(value)
if color == nil then
return
end
self.currLight.color = color
self:refreshLight()
end)
-- 强度
self.intensityInputField = uiMap["gm_light_setting.input_field_2"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_INPUT_FIELD)
self.intensityInputField.onEndEdit:AddListener(function (value)
if self.currLight == nil then
return
end
local intensity = tonumber(value)
if intensity == nil then
return
end
self.currLight.intensity = intensity
self:refreshLight()
end)
-- 阴影
self.shadowStrengthSlider = uiMap["gm_light_setting.slider_5"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_SLIDER)
self.shadowStrengthSlider.onValueChanged:AddListener(function (value)
if self.currLight == nil then
return
end
self.currLight.shadowStrength = value
self:refreshLight()
end)
self.shadowStrengthInputField = uiMap["gm_light_setting.input_field_5"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_INPUT_FIELD)
self.shadowStrengthInputField.onEndEdit:AddListener(function (value)
if self.currLight == nil then
return
end
local strength = tonumber(value)
if strength == nil then
return
end
self.currLight.shadowStrength = strength
self:refreshLight()
end)
self.shadowResolutionDropList = uiMap["gm_light_setting.resolution_list_6"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_DROP_DOWN)
self.shadowResolutionDropList:ClearOptions()
local optionList = {}
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("Use Quality Settings"))
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("Low Resolution"))
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("Medium Resolution"))
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("High Resolution"))
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("Very High Resolution"))
self.shadowResolutionDropList:AddOptions(optionList)
self.shadowResolutionDropList.onValueChanged:AddListener(function(index)
if self.currLight == nil then
return
end
if index == 0 then
self.currLight.shadowResolution = CS.UnityEngine.Rendering.LightShadowResolution.FromQualitySettings
elseif index == 1 then
self.currLight.shadowResolution = CS.UnityEngine.Rendering.LightShadowResolution.Low
elseif index == 2 then
self.currLight.shadowResolution = CS.UnityEngine.Rendering.LightShadowResolution.Medium
elseif index == 3 then
self.currLight.shadowResolution = CS.UnityEngine.Rendering.LightShadowResolution.High
elseif index == 4 then
self.currLight.shadowResolution = CS.UnityEngine.Rendering.LightShadowResolution.VeryHigh
else
self.currLight.shadowResolution = CS.UnityEngine.Rendering.LightShadowResolution.FromQualitySettings
end
self:refreshLight()
end)
self.shadowResolutionDropList:SetValueWithoutNotify(0)
self.shadowBiasSlider = uiMap["gm_light_setting.slider_7"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_SLIDER)
self.shadowBiasSlider.onValueChanged:AddListener(function (value)
if self.currLight == nil then
return
end
self.currLight.shadowBias = value
self:refreshLight()
end)
self.shadowBiasInputField = uiMap["gm_light_setting.input_field_7"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_INPUT_FIELD)
self.shadowBiasInputField.onEndEdit:AddListener(function (value)
if self.currLight == nil then
return
end
local shadowBias = tonumber(value)
if shadowBias == nil then
return
end
self.currLight.shadowBias = shadowBias
self:refreshLight()
end)
self.shadowNormalBiasSlider = uiMap["gm_light_setting.slider_8"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_SLIDER)
self.shadowNormalBiasSlider.onValueChanged:AddListener(function (value)
if self.currLight == nil then
return
end
self.currLight.shadowNormalBias = value
self:refreshLight()
end)
self.shadowNormalBiasInputField = uiMap["gm_light_setting.input_field_8"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_INPUT_FIELD)
self.shadowNormalBiasInputField.onEndEdit:AddListener(function (value)
if self.currLight == nil then
return
end
local shadowNormalBias = tonumber(value)
if shadowNormalBias == nil then
return
end
self.currLight.shadowNormalBias = shadowNormalBias
self:refreshLight()
end)
self.shadowNearPlaneSlider = uiMap["gm_light_setting.slider_9"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_SLIDER)
self.shadowNearPlaneSlider.onValueChanged:AddListener(function (value)
if self.currLight == nil then
return
end
self.currLight.shadowNearPlane = value
self:refreshLight()
end)
self.shadowNearPlaneInputField = uiMap["gm_light_setting.input_field_9"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_INPUT_FIELD)
self.shadowNearPlaneInputField.onEndEdit:AddListener(function (value)
if self.currLight == nil then
return
end
local shadowNearPlane = tonumber(value)
if shadowNearPlane == nil then
return
end
self.currLight.shadowNearPlane = shadowNearPlane
self:refreshLight()
end)
self.shadowProjectionDropList = uiMap["gm_light_setting.projection_list_11"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_DROP_DOWN)
self.shadowProjectionDropList:ClearOptions()
local optionList = {}
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("Close Fit"))
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("Stable Fit"))
self.shadowProjectionDropList:AddOptions(optionList)
self.shadowProjectionDropList.onValueChanged:AddListener(function(index)
if self.currLight == nil then
return
end
if index == 0 then
CS.UnityEngine.QualitySettings.shadowProjection = CS.UnityEngine.ShadowProjection.CloseFit
else
CS.UnityEngine.QualitySettings.shadowProjection = CS.UnityEngine.ShadowProjection.StableFit
end
self:refreshLight()
end)
self.shadowProjectionDropList:SetValueWithoutNotify(0)
self.shadowDistanceInputField = uiMap["gm_light_setting.input_field_12"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_INPUT_FIELD)
self.shadowDistanceInputField.onEndEdit:AddListener(function (value)
if self.currLight == nil then
return
end
local shadowDistance = tonumber(value)
if shadowDistance == nil then
return
end
CS.UnityEngine.QualitySettings.shadowDistance = shadowDistance
self:refreshLight()
end)
self.shadowNearPlaneOffsetInputField = uiMap["gm_light_setting.input_field_13"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_INPUT_FIELD)
self.shadowNearPlaneOffsetInputField.onEndEdit:AddListener(function (value)
if self.currLight == nil then
return
end
local shadowNearPlaneOffset = tonumber(value)
if shadowNearPlaneOffset == nil then
return
end
CS.UnityEngine.QualitySettings.shadowNearPlaneOffset = shadowNearPlaneOffset
self:refreshLight()
end)
self.shadowCascadesDropList = uiMap["gm_light_setting.cascades_list_14"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_DROP_DOWN)
self.shadowCascadesDropList:ClearOptions()
local optionList = {}
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("No Cascades"))
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("Two Cascades"))
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("Four Cascades"))
self.shadowCascadesDropList:AddOptions(optionList)
self.shadowCascadesDropList.onValueChanged:AddListener(function(index)
if self.currLight == nil then
return
end
if index == 0 then
CS.UnityEngine.QualitySettings.shadowCascades = 1
elseif index == 1 then
CS.UnityEngine.QualitySettings.shadowCascades = 2
elseif index == 2 then
CS.UnityEngine.QualitySettings.shadowCascades = 4
else
CS.UnityEngine.QualitySettings.shadowCascades = 1
end
self:refreshLight()
end)
self.shadowCascadesDropList:SetValueWithoutNotify(0)
self.shadowmaskModeDropList = uiMap["gm_light_setting.mode_list_15"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_DROP_DOWN)
self.shadowmaskModeDropList:ClearOptions()
local optionList = {}
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("Shadowmask"))
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("Distance Shadowmask"))
self.shadowmaskModeDropList:AddOptions(optionList)
self.shadowmaskModeDropList.onValueChanged:AddListener(function(index)
if self.currLight == nil then
return
end
if index == 1 then
CS.UnityEngine.QualitySettings.shadowmaskMode = CS.UnityEngine.ShadowmaskMode.DistanceShadowmask
else
CS.UnityEngine.QualitySettings.shadowmaskMode = CS.UnityEngine.ShadowmaskMode.Shadowmask
end
self:refreshLight()
end)
self.shadowmaskModeDropList:SetValueWithoutNotify(0)
self.shadowsDropList = uiMap["gm_light_setting.shadows_list_16"]:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_DROP_DOWN)
self.shadowsDropList:ClearOptions()
local optionList = {}
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("Disable Shadows"))
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("Hard Shadows Only"))
table.insert(optionList, CS.UnityEngine.UI.Dropdown.OptionData("Hard And Soft Shadows"))
self.shadowsDropList:AddOptions(optionList)
self.shadowsDropList.onValueChanged:AddListener(function(index)
if self.currLight == nil then
return
end
if index == 1 then
CS.UnityEngine.QualitySettings.shadows = CS.UnityEngine.ShadowQuality.HardOnly
elseif index == 2 then
CS.UnityEngine.QualitySettings.shadows = CS.UnityEngine.ShadowQuality.All
else
CS.UnityEngine.QualitySettings.shadows = CS.UnityEngine.ShadowQuality.Disable
end
self:refreshLight()
end)
self.shadowsDropList:SetValueWithoutNotify(0)
self.lights = CS.UnityEngine.GameObject.FindObjectsOfType(GConst.TYPEOF_UNITY_CLASS.LIGHT)
if self.lights == nil or self.lights.Length <= 0 then
self.lights = nil
self.currLight = nil
self.mask:setLocalScale(1, 1, 1)
else
self.mask:setLocalScale(0, 0, 0)
end
end
function LightSettingUI:onRefresh()
self:refreshLightList()
end
function LightSettingUI:refreshLightList()
self.dropList:ClearOptions()
if self.lights == nil then
return
end
if self.lights.Length <= 0 then
return
end
local optionList = {}
for i = 0, self.lights.Length - 1 do
local data = CS.UnityEngine.UI.Dropdown.OptionData(self.lights[i].transform.name)
table.insert(optionList, data)
end
self.dropList:AddOptions(optionList)
self.dropList:SetValueWithoutNotify(0)
self.currLight = self.lights[0]
self:refreshLight()
end
function LightSettingUI:refreshLight()
local lightColor = self.currLight.color
self.colorImage:getComponent(GConst.TYPEOF_UNITY_CLASS.UI_IMAGE).color = BF.Color(lightColor.r, lightColor.g, lightColor.b, 1)
self.colorAlphaSlider:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER).value = 1 - lightColor.a
self.colorInputField.text = CS.UnityEngine.ColorUtility.ToHtmlStringRGBA(lightColor)
self.intensityInputField.text = tostring(self.currLight.intensity)
self.shadowStrengthInputField.text = tostring(self.currLight.shadowStrength)
self.shadowStrengthSlider.value = self.currLight.shadowStrength
local shadowResolution = self.currLight.shadowResolution
if shadowResolution == CS.UnityEngine.Rendering.LightShadowResolution.FromQualitySettings then
self.shadowResolutionDropList:SetValueWithoutNotify(0)
elseif shadowResolution == CS.UnityEngine.Rendering.LightShadowResolution.Low then
self.shadowResolutionDropList:SetValueWithoutNotify(1)
elseif shadowResolution == CS.UnityEngine.Rendering.LightShadowResolution.Medium then
self.shadowResolutionDropList:SetValueWithoutNotify(2)
elseif shadowResolution == CS.UnityEngine.Rendering.LightShadowResolution.High then
self.shadowResolutionDropList:SetValueWithoutNotify(3)
elseif shadowResolution == CS.UnityEngine.Rendering.LightShadowResolution.VeryHigh then
self.shadowResolutionDropList:SetValueWithoutNotify(4)
else
self.shadowResolutionDropList:SetValueWithoutNotify(0)
end
self.shadowBiasSlider.value = self.currLight.shadowBias
self.shadowBiasInputField.text = tostring(self.currLight.shadowBias)
self.shadowNormalBiasSlider.value = self.currLight.shadowNormalBias
self.shadowNormalBiasInputField.text = tostring(self.currLight.shadowNormalBias)
self.shadowNearPlaneSlider.value = self.currLight.shadowNearPlane
self.shadowNearPlaneInputField.text = tostring(self.currLight.shadowNearPlane)
if CS.UnityEngine.QualitySettings.shadowProjection == CS.UnityEngine.ShadowProjection.StableFit then
self.shadowProjectionDropList:SetValueWithoutNotify(1)
else
self.shadowProjectionDropList:SetValueWithoutNotify(0)
end
self.shadowDistanceInputField.text = tostring(CS.UnityEngine.QualitySettings.shadowDistance)
self.shadowNearPlaneOffsetInputField.text = tostring(CS.UnityEngine.QualitySettings.shadowNearPlaneOffset)
if CS.UnityEngine.QualitySettings.shadowCascades == 2 then
self.shadowCascadesDropList:SetValueWithoutNotify(1)
elseif CS.UnityEngine.QualitySettings.shadowCascades == 4 then
self.shadowCascadesDropList:SetValueWithoutNotify(2)
else
self.shadowCascadesDropList:SetValueWithoutNotify(0)
end
if CS.UnityEngine.QualitySettings.shadowmaskMode == CS.UnityEngine.ShadowmaskMode.DistanceShadowmask then
self.shadowmaskModeDropList:SetValueWithoutNotify(1)
else
self.shadowmaskModeDropList:SetValueWithoutNotify(0)
end
if CS.UnityEngine.QualitySettings.shadows == CS.UnityEngine.ShadowQuality.HardOnly then
self.shadowsDropList:SetValueWithoutNotify(1)
elseif CS.UnityEngine.QualitySettings.shadows == CS.UnityEngine.ShadowQuality.All then
self.shadowsDropList:SetValueWithoutNotify(2)
else
self.shadowsDropList:SetValueWithoutNotify(0)
end
end
return LightSettingUI