__BulbRendererDefineAccumulateHard.gml 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // Feather disable all
  2. function __BulbRendererDefineAccumulateHard()
  3. {
  4. __AccumulateHardLights = function(_boundaryL, _boundaryT, _boundaryR, _boundaryB, _cameraCX, _cameraCY, _cameraW, _cameraH, _cameraCos, _cameraSin, _normalCoeff)
  5. {
  6. static _shdBulbHardShadows_u_vLight = shader_get_uniform(__shdBulbHardShadows, "u_vLight" );
  7. static _shdBulbHardShadows_u_fNormalCoeff = shader_get_uniform(__shdBulbHardShadows, "u_fNormalCoeff");
  8. static _shdBulbHardShadowsSunlight_u_vLightVector = shader_get_uniform(__shdBulbHardShadowsSunlight, "u_vLightVector");
  9. static _shdBulbHardShadowsSunlight_u_fNormalCoeff = shader_get_uniform(__shdBulbHardShadowsSunlight, "u_fNormalCoeff");
  10. static _shdBulbLightWithNormalMap_u_vInfo = shader_get_uniform(__shdBulbLightWithNormalMap, "u_vInfo" );
  11. static _shdBulbLightWithoutNormalMap_u_fIntensity = shader_get_uniform(__shdBulbLightWithoutNormalMap, "u_fIntensity" );
  12. static _shdBulbSunlightWithNormalMap_u_vSunInfo = shader_get_uniform(__shdBulbSunlightWithNormalMap, "u_vInfo" );
  13. static _sshdBulbSunlightWithoutNormalMap_u_fIntensity = shader_get_uniform(__shdBulbSunlightWithoutNormalMap, "u_fIntensity" );
  14. var _oldStencilRef = gpu_get_stencil_ref();
  15. var _oldStencilFunc = gpu_get_stencil_func();
  16. var _oldStencilPass = gpu_get_stencil_pass();
  17. var _oldStencilFail = gpu_get_stencil_fail();
  18. var _oldStencilDepthFail = gpu_get_stencil_depth_fail();
  19. var _staticVBuffer = __staticVBuffer;
  20. var _dynamicVBuffer = __dynamicVBuffer;
  21. var _rendererNormalMap = normalMap;
  22. if (_rendererNormalMap)
  23. {
  24. shader_set(__shdBulbLightWithNormalMap);
  25. texture_set_stage(shader_get_sampler_index(__shdBulbLightWithNormalMap, "u_sNormalMap"), surface_get_texture(GetNormalMapSurface()));
  26. shader_set_uniform_f(shader_get_uniform(__shdBulbLightWithNormalMap, "u_vCamera"), _cameraCX, _cameraCY, _cameraW/2, _cameraH/2);
  27. shader_set_uniform_f(shader_get_uniform(__shdBulbLightWithNormalMap, "u_vCameraVector"), _cameraCos, _cameraSin);
  28. shader_set_uniform_f(shader_get_uniform(__shdBulbLightWithNormalMap, "u_fSpecularIntensity"), hdr? BULB_SPECULAR_MAP_INTENSITY : 0);
  29. shader_set(__shdBulbSunlightWithNormalMap);
  30. shader_set_uniform_f(shader_get_uniform(__shdBulbSunlightWithNormalMap, "u_fSpecularIntensity"), hdr? BULB_SPECULAR_MAP_INTENSITY : 0);
  31. }
  32. //bm_max requires some trickery with alpha to get good-looking results
  33. //Determine the blend mode and "default" shader accordingly
  34. gpu_set_blendmode(bm_add);
  35. //Set up the coefficient to flip normals
  36. //We use this to control self-renderer
  37. shader_set(__shdBulbHardShadows);
  38. shader_set_uniform_f(_shdBulbHardShadows_u_fNormalCoeff, _normalCoeff);
  39. //Also do the same for our sunlight shader, provided we have any sunlight sources
  40. if (array_length(__sunlightArray) > 0)
  41. {
  42. shader_set(__shdBulbHardShadowsSunlight);
  43. shader_set_uniform_f(_shdBulbHardShadowsSunlight_u_fNormalCoeff, _normalCoeff);
  44. }
  45. //Set our default shader
  46. shader_set(__shdBulbIntensity);
  47. gpu_set_colorwriteenable(true, true, true, false);
  48. draw_clear_stencil(0);
  49. gpu_set_stencil_enable(true);
  50. gpu_set_stencil_pass(stencilop_replace);
  51. gpu_set_stencil_fail(stencilop_keep);
  52. gpu_set_stencil_depth_fail(stencilop_keep);
  53. gpu_set_stencil_func(cmpfunc_always);
  54. var _stencil = 0;
  55. var _i = 0;
  56. repeat(array_length(__lightsArray))
  57. {
  58. var _weak = __lightsArray[_i];
  59. if (!weak_ref_alive(_weak) || _weak.ref.__destroyed)
  60. {
  61. array_delete(__lightsArray, _i, 1);
  62. }
  63. else
  64. {
  65. with(_weak.ref)
  66. {
  67. if (visible)
  68. {
  69. __CheckSpriteDimensions();
  70. //If this light is active, do some drawing
  71. if (__IsOnScreen(_boundaryL, _boundaryT, _boundaryR, _boundaryB))
  72. {
  73. if (castShadows)
  74. {
  75. ++_stencil;
  76. if (_stencil >= 256)
  77. {
  78. draw_clear_stencil(0);
  79. _stencil = 1;
  80. }
  81. gpu_set_stencil_ref(_stencil);
  82. //Stencil out shadow areas
  83. shader_set(__shdBulbHardShadows);
  84. shader_set_uniform_f(_shdBulbHardShadows_u_vLight, x, y);
  85. vertex_submit(_staticVBuffer, pr_trianglelist, -1);
  86. vertex_submit(_dynamicVBuffer, pr_trianglelist, -1);
  87. if (_rendererNormalMap && normalMap)
  88. {
  89. shader_set(__shdBulbLightWithNormalMap);
  90. shader_set_uniform_f(_shdBulbLightWithNormalMap_u_vInfo, x, y, normalMapZ, intensity);
  91. }
  92. else
  93. {
  94. shader_set(__shdBulbLightWithoutNormalMap);
  95. shader_set_uniform_f(_shdBulbLightWithoutNormalMap_u_fIntensity, intensity);
  96. }
  97. gpu_set_stencil_func(cmpfunc_greater);
  98. draw_sprite_ext(sprite, image, x, y, xscale, yscale, angle, blend, 1);
  99. gpu_set_stencil_func(cmpfunc_always);
  100. }
  101. else
  102. {
  103. //Just draw the sprite, no fancy stuff here
  104. if (_rendererNormalMap && normalMap)
  105. {
  106. shader_set(__shdBulbLightWithNormalMap);
  107. shader_set_uniform_f(_shdBulbLightWithNormalMap_u_vInfo, x, y, normalMapZ, intensity);
  108. }
  109. else
  110. {
  111. shader_set(__shdBulbLightWithoutNormalMap);
  112. shader_set_uniform_f(_shdBulbLightWithoutNormalMap_u_fIntensity, intensity);
  113. }
  114. draw_sprite_ext(sprite, image, x, y, xscale, yscale, angle, blend, 1);
  115. }
  116. }
  117. }
  118. }
  119. ++_i;
  120. }
  121. }
  122. gpu_set_stencil_enable(true);
  123. var _i = 0;
  124. repeat(array_length(__sunlightArray))
  125. {
  126. var _weak = __sunlightArray[_i];
  127. if (!weak_ref_alive(_weak) || _weak.ref.__destroyed)
  128. {
  129. array_delete(__sunlightArray, _i, 1);
  130. }
  131. else
  132. {
  133. with(_weak.ref)
  134. {
  135. if (visible)
  136. {
  137. ++_stencil;
  138. if (_stencil >= 256)
  139. {
  140. draw_clear_stencil(0);
  141. _stencil = 1;
  142. }
  143. gpu_set_stencil_ref(_stencil);
  144. //Stencil out shadow areas
  145. shader_set(__shdBulbHardShadowsSunlight);
  146. shader_set_uniform_f(_shdBulbHardShadowsSunlight_u_vLightVector, dcos(angle), -dsin(angle));
  147. vertex_submit(_staticVBuffer, pr_trianglelist, -1);
  148. vertex_submit(_dynamicVBuffer, pr_trianglelist, -1);
  149. if (_rendererNormalMap && normalMap)
  150. {
  151. shader_set(__shdBulbSunlightWithNormalMap);
  152. shader_set_uniform_f(_shdBulbSunlightWithNormalMap_u_vSunInfo, dcos(angle), -dsin(angle), normalMapZ, intensity);
  153. }
  154. else
  155. {
  156. shader_set(__shdBulbLightWithoutNormalMap);
  157. shader_set_uniform_f(_shdBulbLightWithoutNormalMap_u_fIntensity, intensity);
  158. }
  159. gpu_set_stencil_func(cmpfunc_greater);
  160. draw_sprite_ext(__sprBulbPixel, 0, _boundaryL, _boundaryT, _boundaryR - _boundaryL, _boundaryB - _boundaryT, 0, blend, 1);
  161. gpu_set_stencil_func(cmpfunc_always);
  162. }
  163. }
  164. ++_i;
  165. }
  166. }
  167. shader_reset();
  168. gpu_set_colorwriteenable(true, true, true, true);
  169. gpu_set_blendmode(bm_normal);
  170. gpu_set_stencil_enable(false);
  171. gpu_set_stencil_ref(_oldStencilRef);
  172. gpu_set_stencil_func(_oldStencilFunc);
  173. gpu_set_stencil_pass(_oldStencilPass);
  174. gpu_set_stencil_fail(_oldStencilFail);
  175. gpu_set_stencil_depth_fail(_oldStencilDepthFail);
  176. }
  177. }