Lighting.gd 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. extends CanvasLayer
  2. #
  3. @onready var colorRectArrays : Array[ColorRect] = [$GridContainer/HBoxContainer/ColorRect, $GridContainer/HBoxContainer/ColorRect2, $GridContainer/HBoxContainer/ColorRect3, $GridContainer/HBoxContainer/ColorRect4, $GridContainer/HBoxContainer2/ColorRect5, $GridContainer/HBoxContainer2/ColorRect6, $GridContainer/HBoxContainer2/ColorRect7, $GridContainer/HBoxContainer2/ColorRect8]
  4. @export var lightLevel : float = 0.5
  5. var time : float = 0.0
  6. #
  7. func _ready():
  8. for colorRect in colorRectArrays:
  9. colorRect.material.set_shader_parameter("light_level", lightLevel)
  10. func _process(delta : float):
  11. if not visible or not Launcher.Camera.mainCamera or not Launcher.Camera.mainCamera.is_inside_tree():
  12. return
  13. var lights : Array[Node] = get_tree().get_nodes_in_group("lights")
  14. var visibleLights : Array[Node] = []
  15. var canvasTransform : Transform2D = Launcher.Camera.mainCamera.get_canvas_transform()
  16. var canvasScale : Vector2 = canvasTransform.get_scale()
  17. var viewportSize : Vector2 = Launcher.Camera.mainCamera.get_viewport_rect().size / canvasScale
  18. var cameraTopLeft : Vector2 = Launcher.Camera.mainCamera.global_position - viewportSize * 0.5
  19. cameraTopLeft = cameraTopLeft.clamp(Launcher.Camera.minPos, Launcher.Camera.maxPos - viewportSize)
  20. var cameraRect : Rect2 = Rect2(cameraTopLeft, viewportSize)
  21. time += delta
  22. for light in lights:
  23. if light and light is LightSource:
  24. if cameraRect.grow(light.currentRadius).has_point(light.global_position):
  25. light.currentDeadband = sin(light.speed * time + light.randomSeed) * 0.008 + 0.5 if light.speed > 0 else 0.5
  26. if light.currentDeadband > 0:
  27. visibleLights.append(light)
  28. for colorRect in colorRectArrays:
  29. var lightData : Array[Vector4] = []
  30. var colorData : Array[Color] = []
  31. var rescaledRect : Vector2 = colorRect.global_position / canvasScale
  32. var rectTopLeft : Vector2 = rescaledRect - canvasTransform.origin
  33. var rect : Rect2 = Rect2(Vector2(rectTopLeft), Vector2(colorRect.size))
  34. for light in visibleLights:
  35. var rescaledPos : Vector2 = rescaledRect + (light.global_position - rescaledRect) * canvasScale
  36. var rescaledRadius : float = light.currentRadius * canvasScale.x
  37. if rect.grow(rescaledRadius).has_point(rescaledPos):
  38. lightData.append(Vector4(rescaledPos.x, rescaledPos.y, light.currentDeadband, rescaledRadius))
  39. colorData.append(light.color)
  40. colorRect.material.set_shader_parameter("global_transform", Transform2D(0, rectTopLeft))
  41. colorRect.material.set_shader_parameter("n_lights", lightData.size())
  42. colorRect.material.set_shader_parameter("light_data", lightData)
  43. colorRect.material.set_shader_parameter("color_data", colorData)
  44. func _enter_tree():
  45. visible = Effects.lightingEnabled
  46. Effects.lightLayer = self
  47. func _exit_tree():
  48. Effects.lightLayer = null