Advertisement
Guest User

Untitled

a guest
Aug 29th, 2024
13
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.56 KB | None | 0 0
  1. -------Draw--------
  2.  
  3. var view_mat = camera_get_view_mat(cam),
  4. x_scale = camera_get_view_width/surface_get_width(application_surface),
  5. y_scale = camera_get_view_height/surface_get_height(application_surface),
  6. view_x = c_x + camera_get_view_width(cam)*.5 - camera_get_view_width(cam)*.5 * view_mat[0] - camera_get_view_height(cam)*.5 * view_mat[1],
  7. view_y = c_y + camera_get_view_height(cam)*.5 + camera_get_view_width(cam)*.5 * view_mat[1] - camera_get_view_height(cam)*.5 * view_mat[0];
  8.  
  9.  
  10. //Create and populate array of lights
  11. var l_count = instance_number(o_Light),
  12. l_arr = array_create(l_count * 7 + 1),
  13. l_i = 1;
  14.  
  15. l_arr[0] = l_count;
  16.  
  17. with (o_Light) {
  18. l_arr[l_i++] = x;
  19. l_arr[l_i++] = y;
  20. l_arr[l_i++] = image_blend;
  21. l_arr[l_i++] = in_rad;
  22. l_arr[l_i++] = out_rad;
  23. l_arr[l_i++] = dir;
  24. l_arr[l_i++] = fov;
  25. }
  26.  
  27. //Create the light surface and set it as target
  28. if (!surface_exists(light_surf))
  29. light_surf = surface_create(surface_get_width(application_surface), surface_get_height(application_surface));
  30.  
  31. gpu_set_blendmode_ext(bm_one, bm_zero);
  32. surface_set_target(light_surf); {
  33. camera_apply(cam);
  34. shader_set(sh_LightArray);
  35. shader_set_uniform_f_array(l_array, l_arr);
  36. draw_surface_ext(application_surface, view_x, view_y, x_scale, y_scale, 0, c_white, 1);
  37. shader_reset();
  38. } surface_reset_target();
  39.  
  40. //Draw light_surf back to app_surf
  41. draw_surface_ext(light_surf, view_x, view_y, x_scale, y_scale, 0, c_white, 1);
  42. gpu_set_blendmode(bm_normal);
  43.  
  44.  
  45. -------Shader--------
  46.  
  47. vec3 get_radiance(float c)
  48. {
  49. // UNPACK COLOR BITS
  50. vec3 col;
  51. col.b = floor(c * 0.0000152587890625);
  52. float blue_bits = c - col.b * 65536.0;
  53. col.g = floor(blue_bits * 0.00390625);
  54. col.r = floor(blue_bits - col.g * 256.0);
  55.  
  56. // NORMALIZE 0-255
  57. return col * 0.00390625;
  58. }
  59.  
  60. varying vec2 pos; //Pixel position
  61. varying vec2 tex;
  62.  
  63. uniform float l_array[512];
  64.  
  65. #define PI 3.1415926538
  66.  
  67. void main() {
  68.  
  69. vec3 albedo = texture2D(gm_BaseTexture, tex).rgb;
  70. vec3 color = vec3(0.0);
  71.  
  72. //Iterate over the lights array
  73. int num_lights = int(l_array[0]);
  74. int l_i = 1;
  75. for (int i=0; i<num_lights; ++i) {
  76.  
  77. vec2 l_pos = vec2(l_array[l_i++], l_array[l_i++]);
  78. vec3 radiance = get_radiance(l_array[l_i++]);
  79. float l_in_rad = l_array[l_i++];
  80. float l_out_rad = l_array[l_i++];
  81. float l_dir = l_array[l_i++];
  82. float l_fov = l_array[l_i++];
  83.  
  84.  
  85. //Test attenuation
  86. float dist = length(l_pos.xy - pos.xy) / l_out_rad;
  87. float new_alpha = 5./(dist*dist*.1 + 1.);
  88.  
  89. color += albedo * new_alpha * radiance;
  90. }
  91.  
  92. gl_FragColor = vec4(color, 1.);
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement