| Light.SetCastShadows = function(self, cast) | |
| if cast then | |
| self:SetLightFlags(const.elfCastShadows) | |
| else | |
| self:ClearLightFlags(const.elfCastShadows) | |
| end | |
| self:ConfigureInvisibleObjectHelper(self:GetAttach("InvisibleObjectHelper")) | |
| end | |
| if FirstLoad then | |
| DbgClusterCameraPos = false | |
| DbgClusterCameraLookAt = false | |
| StatsLightShadowsThread = false | |
| end | |
| function DBGLightsShowFirstLight(store_camera) | |
| CreateRealTimeThread(function() | |
| if store_camera then | |
| DbgClusterCameraPos, DbgClusterCameraLookAt = cameraMax.GetPosLookAt() | |
| else | |
| cameraMax.SetCamera(DbgClusterCameraPos, DbgClusterCameraLookAt) | |
| WaitNextFrame(10) | |
| end | |
| DbgClearVectors() | |
| hr.DbgAutoClearLimit = 20000 | |
| hr.LightsClusterWireframe = 3 | |
| end) | |
| end | |
| function HideLightShadowsStats() | |
| hr.LightShadowsStatistics = 0 | |
| if IsValidThread(StatsLightShadowsThread) then | |
| DeleteThread(StatsLightShadowsThread) | |
| MapForEach("map", "Light", function(light) | |
| local text = rawget(light, "StatsText") | |
| if text ~= nil then | |
| text:Detach() | |
| text:delete() | |
| rawset(light, "StatsText", nil) | |
| end | |
| end) | |
| end | |
| StatsLightShadowsThread = false | |
| end | |
| function ShowLightShadowsStats(frequency) | |
| HideLightShadowsStats() | |
| hr.LightShadowsStatistics = 1 | |
| StatsLightShadowsThread = CreateRealTimeThread(function() | |
| local prev_frame = GetRenderFrame() - 1 | |
| while true do | |
| local curr_frame = GetRenderFrame() | |
| local frames = curr_frame - prev_frame | |
| prev_frame = curr_frame | |
| local lights = GetLights() | |
| for _, light in ipairs(lights) do | |
| if rawget(light, "StatsText") == nil then | |
| local text = Text:new{ hide_in_editor = false } | |
| rawset(light, "StatsText", text) | |
| light:Attach(text) | |
| end | |
| if light:GetCastShadows() then | |
| local rops_per_frame = DivRound(light:GetShadowStatsROPs(), Max(frames, 1)) | |
| local polygons_per_frame = DivRound(light:GetShadowStatsPolygons(), Max(frames, 1)) | |
| local pushed_objects_per_frame = DivRound(light:GetShadowStatsPushedGOs(), Max(frames, 1)) | |
| light:SetShadowStatsROPs(0) | |
| light:SetShadowStatsPolygons(0) | |
| light:SetShadowStatsPushedGOs(0) | |
| light.StatsText:SetText(string.format("%s(%s)%s\n%d Objects/frame\n%d Polygons/frame\nGathered Objects/frame\n%d", | |
| light.class, light:GetDetailClass(), | |
| light:GetDetailClass() == "Optional" and "[Visible due to CastShadow=true]" or "", | |
| rops_per_frame, polygons_per_frame, pushed_objects_per_frame | |
| )) | |
| if rops_per_frame > 5000 or polygons_per_frame > 300000 or pushed_objects_per_frame > 30000 then | |
| light.StatsText:SetColor(const.clrRed) | |
| elseif rops_per_frame > 2000 or polygons_per_frame > 100000 or pushed_objects_per_frame > 10000 then | |
| light.StatsText:SetColor(const.clrYellow) | |
| else | |
| light.StatsText:SetColor(const.clrGreen) | |
| end | |
| else | |
| light.StatsText:SetText(string.format("%s(%s)\nNo Shadow", | |
| light.class, light:GetDetailClass() | |
| )) | |
| light.StatsText:SetColor(const.clrGreen) | |
| end | |
| end | |
| Sleep(frequency) | |
| end | |
| end) | |
| end | |
| if FirstLoad then | |
| g_LightSelected = false | |
| g_CapturedScreenLights = false | |
| end | |
| function CaptureScreenLights(clear) | |
| if clear then | |
| g_CapturedScreenLights = false | |
| print("Captured Lights on Screen cleared") | |
| return | |
| end | |
| g_CapturedScreenLights = GatherObjectsInScreenRect(point20, point(GetResolution()), "Light") | |
| print(string.format("Captured %d/%d Lights on Screen", #g_CapturedScreenLights, #GetLights())) | |
| end | |
| function ViewNextLight(dir, screen_lights) | |
| local lights = screen_lights and (g_CapturedScreenLights or empty_table) or GetLights() | |
| if #lights == 0 then return end | |
| g_LightSelected = (g_LightSelected or 0) + dir | |
| if g_LightSelected > #lights then | |
| g_LightSelected = 1 | |
| elseif g_LightSelected < 1 then | |
| g_LightSelected = #lights | |
| end | |
| local light = lights[g_LightSelected] | |
| if not screen_lights then | |
| ViewObject(light) | |
| end | |
| editor.ClearSel() | |
| editor.AddObjToSel(light) | |
| ViewObject(light) | |
| print(string.format("%sLight(%s-%s) %d/%d", screen_lights and "Screen " or "", light.class, light:GetDetailClass(), g_LightSelected, #lights)) | |
| end | |
| function OnMsg.NewMapLoaded() | |
| g_LightSelected = false | |
| g_CapturedScreenLights = false | |
| end | |
| function OnMsg.GameOptionsChanged(category) | |
| if category == "Video" then | |
| g_LightSelected = false | |
| CaptureScreenLights("clear") | |
| end | |
| end |