1
0

BulbLight.gml 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /// @param renderer
  2. /// @param sprite
  3. /// @param image
  4. /// @param x
  5. /// @param y
  6. function BulbLight(_renderer, _sprite, _image, _x, _y) constructor
  7. {
  8. visible = true;
  9. x = _x;
  10. y = _y;
  11. normalMap = BULB_DEFAULT_USE_NORMAL_MAP;
  12. normalMapZ = BULB_DEFAULT_NORMAL_MAP_Z;
  13. sprite = _sprite;
  14. image = _image;
  15. xscale = 1.0;
  16. yscale = 1.0;
  17. angle = 0.0;
  18. blend = c_white;
  19. intensity = 1.0;
  20. penumbraSize = 0.0;
  21. castShadows = true;
  22. __oldSprite = undefined;
  23. __radius = 0;
  24. __destroyed = false;
  25. static Destroy = function()
  26. {
  27. __destroyed = true;
  28. }
  29. static AddToRenderer = function(_renderer)
  30. {
  31. if (__destroyed) return;
  32. array_push(_renderer.__lightsArray, weak_ref_create(self));
  33. }
  34. static RemoveFromRenderer = function(_renderer)
  35. {
  36. var _array = _renderer.__lightsArray;
  37. var _i = array_length(_array) - 1;
  38. repeat(array_length(_array))
  39. {
  40. var _weak = _array[_i];
  41. if (weak_ref_alive(_weak))
  42. {
  43. if (_weak.ref == self) array_delete(_array, _i, 1);
  44. }
  45. else
  46. {
  47. array_delete(_array, _i, 1);
  48. }
  49. --_i;
  50. }
  51. }
  52. static __CheckSpriteDimensions = function()
  53. {
  54. // Redefine light sprite boundaries
  55. if (sprite != __oldSprite)
  56. {
  57. __oldSprite = sprite;
  58. if ((sprite != undefined) && sprite_exists(sprite))
  59. {
  60. //Choose the longest axis of the sprite as the radius
  61. //We apply x/y scaling in the __IsOnScreen() function
  62. var _xOffset = sprite_get_xoffset(sprite);
  63. var _yOffset = sprite_get_yoffset(sprite);
  64. var _x = max(_xOffset, sprite_get_width( sprite) - _xOffset);
  65. var _y = max(_yOffset, sprite_get_height(sprite) - _yOffset);
  66. __radius = sqrt(_x*_x + _y*_y);
  67. }
  68. else
  69. {
  70. __radius = 0;
  71. }
  72. }
  73. }
  74. static __IsOnScreen = function(_cameraL, _cameraT, _cameraR, _cameraB)
  75. {
  76. var _radius = __radius*max(xscale, yscale);
  77. return (!__destroyed && visible && __BulbRectInRect(x - _radius, y - _radius, x + _radius, y + _radius, _cameraL, _cameraT, _cameraR, _cameraB));
  78. }
  79. if (_renderer != undefined) AddToRenderer(_renderer);
  80. }