__BulbRendererDefineVertexBuffers.gml 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // Feather disable all
  2. function __BulbRendererDefineVertexBuffers()
  3. {
  4. __staticVBuffer = undefined; //Vertex buffer describing the geometry of static occluder objects
  5. __dynamicVBuffer = undefined; //As above but for dynamic shadow occluders. This is updated every step
  6. __staticOccludersArray = [];
  7. __dynamicOccludersArray = [];
  8. RefreshStaticOccluders = function()
  9. {
  10. if (__staticVBuffer != undefined)
  11. {
  12. vertex_delete_buffer(__staticVBuffer);
  13. __staticVBuffer = undefined;
  14. }
  15. }
  16. __FreeVertexBuffers = function()
  17. {
  18. if (__staticVBuffer != undefined)
  19. {
  20. vertex_delete_buffer(__staticVBuffer);
  21. __staticVBuffer = undefined;
  22. }
  23. if (__dynamicVBuffer != undefined)
  24. {
  25. vertex_delete_buffer(__dynamicVBuffer);
  26. __dynamicVBuffer = undefined;
  27. }
  28. }
  29. __UpdateVertexBuffers = function(_boundaryL, _boundaryT, _boundaryR, _boundaryB)
  30. {
  31. //One-time construction of the static occluder geometry
  32. if (__staticVBuffer == undefined)
  33. {
  34. //Create a new vertex buffer
  35. __staticVBuffer = vertex_create_buffer();
  36. var _staticVBuffer = __staticVBuffer;
  37. //Add static shadow caster vertices to the relevant vertex buffer
  38. if (soft)
  39. {
  40. vertex_begin(__staticVBuffer, _vformat3DNormalTex);
  41. var _array = __staticOccludersArray;
  42. var _i = 0;
  43. repeat(array_length(_array))
  44. {
  45. var _weak = _array[_i];
  46. if (!weak_ref_alive(_weak) || _weak.ref.__destroyed)
  47. {
  48. array_delete(_array, _i, 1);
  49. }
  50. else
  51. {
  52. with(_weak.ref) __BulbAddOcclusionSoft(_staticVBuffer);
  53. ++_i;
  54. }
  55. }
  56. }
  57. else
  58. {
  59. vertex_begin(__staticVBuffer, _vformat3DNormal);
  60. var _array = __staticOccludersArray;
  61. var _i = 0;
  62. repeat(array_length(_array))
  63. {
  64. var _weak = _array[_i];
  65. if (!weak_ref_alive(_weak) || _weak.ref.__destroyed)
  66. {
  67. array_delete(_array, _i, 1);
  68. }
  69. else
  70. {
  71. with(_weak.ref) __BulbAddOcclusionHard(_staticVBuffer);
  72. ++_i;
  73. }
  74. }
  75. }
  76. vertex_end(__staticVBuffer);
  77. //Freeze this buffer for speed boosts later on (though only if we have vertices in this buffer)
  78. if (vertex_get_number(__staticVBuffer) > 0) vertex_freeze(__staticVBuffer);
  79. }
  80. //Refresh the dynamic occluder geometry
  81. if (__dynamicVBuffer == undefined) __dynamicVBuffer = vertex_create_buffer();
  82. var _dynamicVBuffer = __dynamicVBuffer;
  83. //Add dynamic occluder vertices to the relevant vertex buffer
  84. if (soft)
  85. {
  86. vertex_begin(_dynamicVBuffer, _vformat3DNormalTex);
  87. var _array = __dynamicOccludersArray;
  88. var _i = 0;
  89. repeat(array_length(_array))
  90. {
  91. var _weak = _array[_i];
  92. if (!weak_ref_alive(_weak) || _weak.ref.__destroyed)
  93. {
  94. array_delete(_array, _i, 1);
  95. }
  96. else
  97. {
  98. with(_weak.ref)
  99. {
  100. if (__IsOnScreen(_boundaryL, _boundaryT, _boundaryR, _boundaryB)) __BulbAddOcclusionSoft(_dynamicVBuffer);
  101. }
  102. ++_i;
  103. }
  104. }
  105. }
  106. else
  107. {
  108. vertex_begin(_dynamicVBuffer, _vformat3DNormal);
  109. var _array = __dynamicOccludersArray;
  110. var _i = 0;
  111. repeat(array_length(_array))
  112. {
  113. var _weak = _array[_i];
  114. if (!weak_ref_alive(_weak) || _weak.ref.__destroyed)
  115. {
  116. array_delete(_array, _i, 1);
  117. }
  118. else
  119. {
  120. with(_weak.ref)
  121. {
  122. if (__IsOnScreen(_boundaryL, _boundaryT, _boundaryR, _boundaryB)) __BulbAddOcclusionHard(_dynamicVBuffer);
  123. }
  124. ++_i;
  125. }
  126. }
  127. }
  128. vertex_end(_dynamicVBuffer);
  129. }
  130. }