Lighting.gd 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. #
  6. func UpdateTransform():
  7. var canvas_transform : Transform2D = Launcher.Camera.mainCamera.get_canvas_transform()
  8. for colorRect in colorRectArrays:
  9. var topLeft = (-canvas_transform.origin + colorRect.global_position) / canvas_transform.get_scale()
  10. colorRect.material.set_shader_parameter("global_transform", Transform2D(0, topLeft))
  11. func UpdateTexture():
  12. var lights : Array[Node] = get_tree().get_nodes_in_group("lights")
  13. var visibleLights : Array[Node] = []
  14. var time : float = Time.get_ticks_msec() / 1000.0
  15. var viewportSize : Vector2 = Launcher.Camera.mainCamera.get_viewport_rect().size
  16. var cameraTopLeft : Vector2 = Launcher.Camera.mainCamera.global_position - viewportSize * 0.5
  17. cameraTopLeft = cameraTopLeft.clamp(Launcher.Camera.minPos, Launcher.Camera.maxPos - viewportSize)
  18. var cameraRect : Rect2 = Rect2(cameraTopLeft, viewportSize)
  19. for light in lights:
  20. if light and light is LightSource:
  21. if cameraRect.grow(light.currentRadius).has_point(light.global_position):
  22. light.currentDeadband = sin(light.speed * time + light.randomSeed) * 0.008 + 0.5 if light.speed > 0 else 0.5
  23. if light.currentDeadband > 0:
  24. visibleLights.append(light)
  25. for colorRect in colorRectArrays:
  26. var lightData : Array[Vector4] = []
  27. var colorData : Array[Color] = []
  28. for light in visibleLights:
  29. if Rect2( \
  30. Vector2(cameraTopLeft + colorRect.global_position), \
  31. Vector2(colorRect.size) \
  32. ).grow(light.radius).has_point(light.global_position):
  33. lightData.append(Vector4(light.global_position.x, light.global_position.y, light.currentDeadband, light.currentRadius))
  34. colorData.append(light.color)
  35. colorRect.material.set_shader_parameter("n_lights", lightData.size())
  36. colorRect.material.set_shader_parameter("light_data", lightData)
  37. colorRect.material.set_shader_parameter("color_data", colorData)
  38. #
  39. func _ready():
  40. for colorRect in colorRectArrays:
  41. colorRect.material.set_shader_parameter("light_level", lightLevel)
  42. func _process(_delta : float):
  43. if visible and Launcher.Camera.mainCamera and Launcher.Camera.mainCamera.is_inside_tree():
  44. UpdateTransform()
  45. UpdateTexture()
  46. func _enter_tree():
  47. visible = Effects.lightingEnabled
  48. Effects.lightLayer = self
  49. func _exit_tree():
  50. Effects.lightLayer = null