rasterizer_canvas_base_gles2.cpp 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021
  1. /*************************************************************************/
  2. /* rasterizer_canvas_base_gles2.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #include "rasterizer_canvas_base_gles2.h"
  31. #include "core/os/os.h"
  32. #include "core/project_settings.h"
  33. #include "rasterizer_scene_gles2.h"
  34. #include "servers/visual/visual_server_raster.h"
  35. #ifndef GLES_OVER_GL
  36. #define glClearDepth glClearDepthf
  37. #endif
  38. RID RasterizerCanvasBaseGLES2::light_internal_create() {
  39. return RID();
  40. }
  41. void RasterizerCanvasBaseGLES2::light_internal_update(RID p_rid, Light *p_light) {
  42. }
  43. void RasterizerCanvasBaseGLES2::light_internal_free(RID p_rid) {
  44. }
  45. void RasterizerCanvasBaseGLES2::canvas_begin() {
  46. state.canvas_shader.bind();
  47. state.using_transparent_rt = false;
  48. int viewport_x, viewport_y, viewport_width, viewport_height;
  49. if (storage->frame.current_rt) {
  50. glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->fbo);
  51. state.using_transparent_rt = storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT];
  52. if (storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_DIRECT_TO_SCREEN]) {
  53. // set Viewport and Scissor when rendering directly to screen
  54. viewport_width = storage->frame.current_rt->width;
  55. viewport_height = storage->frame.current_rt->height;
  56. viewport_x = storage->frame.current_rt->x;
  57. viewport_y = OS::get_singleton()->get_window_size().height - viewport_height - storage->frame.current_rt->y;
  58. glScissor(viewport_x, viewport_y, viewport_width, viewport_height);
  59. glViewport(viewport_x, viewport_y, viewport_width, viewport_height);
  60. glEnable(GL_SCISSOR_TEST);
  61. }
  62. }
  63. if (storage->frame.clear_request) {
  64. glClearColor(storage->frame.clear_request_color.r,
  65. storage->frame.clear_request_color.g,
  66. storage->frame.clear_request_color.b,
  67. state.using_transparent_rt ? storage->frame.clear_request_color.a : 1.0);
  68. glClear(GL_COLOR_BUFFER_BIT);
  69. storage->frame.clear_request = false;
  70. }
  71. /*
  72. if (storage->frame.current_rt) {
  73. glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->fbo);
  74. glColorMask(1, 1, 1, 1);
  75. }
  76. */
  77. reset_canvas();
  78. glActiveTexture(GL_TEXTURE0);
  79. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  80. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
  81. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  82. // set up default uniforms
  83. Transform canvas_transform;
  84. if (storage->frame.current_rt) {
  85. float csy = 1.0;
  86. if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_VFLIP]) {
  87. csy = -1.0;
  88. }
  89. canvas_transform.translate(-(storage->frame.current_rt->width / 2.0f), -(storage->frame.current_rt->height / 2.0f), 0.0f);
  90. canvas_transform.scale(Vector3(2.0f / storage->frame.current_rt->width, csy * -2.0f / storage->frame.current_rt->height, 1.0f));
  91. } else {
  92. Vector2 ssize = OS::get_singleton()->get_window_size();
  93. canvas_transform.translate(-(ssize.width / 2.0f), -(ssize.height / 2.0f), 0.0f);
  94. canvas_transform.scale(Vector3(2.0f / ssize.width, -2.0f / ssize.height, 1.0f));
  95. }
  96. state.uniforms.projection_matrix = canvas_transform;
  97. state.uniforms.final_modulate = Color(1, 1, 1, 1);
  98. state.uniforms.modelview_matrix = Transform2D();
  99. state.uniforms.extra_matrix = Transform2D();
  100. _set_uniforms();
  101. _bind_quad_buffer();
  102. }
  103. void RasterizerCanvasBaseGLES2::canvas_end() {
  104. glBindBuffer(GL_ARRAY_BUFFER, 0);
  105. for (int i = 0; i < VS::ARRAY_MAX; i++) {
  106. glDisableVertexAttribArray(i);
  107. }
  108. if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_DIRECT_TO_SCREEN]) {
  109. //reset viewport to full window size
  110. int viewport_width = OS::get_singleton()->get_window_size().width;
  111. int viewport_height = OS::get_singleton()->get_window_size().height;
  112. glViewport(0, 0, viewport_width, viewport_height);
  113. glScissor(0, 0, viewport_width, viewport_height);
  114. }
  115. state.using_texture_rect = false;
  116. state.using_skeleton = false;
  117. state.using_ninepatch = false;
  118. state.using_transparent_rt = false;
  119. }
  120. void RasterizerCanvasBaseGLES2::draw_generic_textured_rect(const Rect2 &p_rect, const Rect2 &p_src) {
  121. state.canvas_shader.set_uniform(CanvasShaderGLES2::DST_RECT, Color(p_rect.position.x, p_rect.position.y, p_rect.size.x, p_rect.size.y));
  122. state.canvas_shader.set_uniform(CanvasShaderGLES2::SRC_RECT, Color(p_src.position.x, p_src.position.y, p_src.size.x, p_src.size.y));
  123. glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  124. }
  125. RasterizerStorageGLES2::Texture *RasterizerCanvasBaseGLES2::_bind_canvas_texture(const RID &p_texture, const RID &p_normal_map) {
  126. RasterizerStorageGLES2::Texture *tex_return = NULL;
  127. if (p_texture.is_valid()) {
  128. RasterizerStorageGLES2::Texture *texture = storage->texture_owner.getornull(p_texture);
  129. if (!texture) {
  130. state.current_tex = RID();
  131. state.current_tex_ptr = NULL;
  132. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 1);
  133. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  134. } else {
  135. if (texture->redraw_if_visible) {
  136. VisualServerRaster::redraw_request();
  137. }
  138. texture = texture->get_ptr();
  139. if (texture->render_target) {
  140. texture->render_target->used_in_frame = true;
  141. }
  142. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 1);
  143. glBindTexture(GL_TEXTURE_2D, texture->tex_id);
  144. state.current_tex = p_texture;
  145. state.current_tex_ptr = texture;
  146. tex_return = texture;
  147. }
  148. } else {
  149. state.current_tex = RID();
  150. state.current_tex_ptr = NULL;
  151. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 1);
  152. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  153. }
  154. if (p_normal_map == state.current_normal) {
  155. //do none
  156. state.canvas_shader.set_uniform(CanvasShaderGLES2::USE_DEFAULT_NORMAL, state.current_normal.is_valid());
  157. } else if (p_normal_map.is_valid()) {
  158. RasterizerStorageGLES2::Texture *normal_map = storage->texture_owner.getornull(p_normal_map);
  159. if (!normal_map) {
  160. state.current_normal = RID();
  161. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 2);
  162. glBindTexture(GL_TEXTURE_2D, storage->resources.normal_tex);
  163. state.canvas_shader.set_uniform(CanvasShaderGLES2::USE_DEFAULT_NORMAL, false);
  164. } else {
  165. if (normal_map->redraw_if_visible) { //check before proxy, because this is usually used with proxies
  166. VisualServerRaster::redraw_request();
  167. }
  168. normal_map = normal_map->get_ptr();
  169. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 2);
  170. glBindTexture(GL_TEXTURE_2D, normal_map->tex_id);
  171. state.current_normal = p_normal_map;
  172. state.canvas_shader.set_uniform(CanvasShaderGLES2::USE_DEFAULT_NORMAL, true);
  173. }
  174. } else {
  175. state.current_normal = RID();
  176. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 2);
  177. glBindTexture(GL_TEXTURE_2D, storage->resources.normal_tex);
  178. state.canvas_shader.set_uniform(CanvasShaderGLES2::USE_DEFAULT_NORMAL, false);
  179. }
  180. return tex_return;
  181. }
  182. void RasterizerCanvasBaseGLES2::draw_window_margins(int *black_margin, RID *black_image) {
  183. Vector2 window_size = OS::get_singleton()->get_window_size();
  184. int window_h = window_size.height;
  185. int window_w = window_size.width;
  186. glBindFramebuffer(GL_FRAMEBUFFER, storage->system_fbo);
  187. glViewport(0, 0, window_size.width, window_size.height);
  188. canvas_begin();
  189. if (black_image[MARGIN_LEFT].is_valid()) {
  190. _bind_canvas_texture(black_image[MARGIN_LEFT], RID());
  191. Size2 sz(storage->texture_get_width(black_image[MARGIN_LEFT]), storage->texture_get_height(black_image[MARGIN_LEFT]));
  192. draw_generic_textured_rect(Rect2(0, 0, black_margin[MARGIN_LEFT], window_h),
  193. Rect2(0, 0, (float)black_margin[MARGIN_LEFT] / sz.x, (float)(window_h) / sz.y));
  194. } else if (black_margin[MARGIN_LEFT]) {
  195. glActiveTexture(GL_TEXTURE0);
  196. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  197. draw_generic_textured_rect(Rect2(0, 0, black_margin[MARGIN_LEFT], window_h), Rect2(0, 0, 1, 1));
  198. }
  199. if (black_image[MARGIN_RIGHT].is_valid()) {
  200. _bind_canvas_texture(black_image[MARGIN_RIGHT], RID());
  201. Size2 sz(storage->texture_get_width(black_image[MARGIN_RIGHT]), storage->texture_get_height(black_image[MARGIN_RIGHT]));
  202. draw_generic_textured_rect(Rect2(window_w - black_margin[MARGIN_RIGHT], 0, black_margin[MARGIN_RIGHT], window_h),
  203. Rect2(0, 0, (float)black_margin[MARGIN_RIGHT] / sz.x, (float)window_h / sz.y));
  204. } else if (black_margin[MARGIN_RIGHT]) {
  205. glActiveTexture(GL_TEXTURE0);
  206. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  207. draw_generic_textured_rect(Rect2(window_w - black_margin[MARGIN_RIGHT], 0, black_margin[MARGIN_RIGHT], window_h), Rect2(0, 0, 1, 1));
  208. }
  209. if (black_image[MARGIN_TOP].is_valid()) {
  210. _bind_canvas_texture(black_image[MARGIN_TOP], RID());
  211. Size2 sz(storage->texture_get_width(black_image[MARGIN_TOP]), storage->texture_get_height(black_image[MARGIN_TOP]));
  212. draw_generic_textured_rect(Rect2(0, 0, window_w, black_margin[MARGIN_TOP]),
  213. Rect2(0, 0, (float)window_w / sz.x, (float)black_margin[MARGIN_TOP] / sz.y));
  214. } else if (black_margin[MARGIN_TOP]) {
  215. glActiveTexture(GL_TEXTURE0);
  216. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  217. draw_generic_textured_rect(Rect2(0, 0, window_w, black_margin[MARGIN_TOP]), Rect2(0, 0, 1, 1));
  218. }
  219. if (black_image[MARGIN_BOTTOM].is_valid()) {
  220. _bind_canvas_texture(black_image[MARGIN_BOTTOM], RID());
  221. Size2 sz(storage->texture_get_width(black_image[MARGIN_BOTTOM]), storage->texture_get_height(black_image[MARGIN_BOTTOM]));
  222. draw_generic_textured_rect(Rect2(0, window_h - black_margin[MARGIN_BOTTOM], window_w, black_margin[MARGIN_BOTTOM]),
  223. Rect2(0, 0, (float)window_w / sz.x, (float)black_margin[MARGIN_BOTTOM] / sz.y));
  224. } else if (black_margin[MARGIN_BOTTOM]) {
  225. glActiveTexture(GL_TEXTURE0);
  226. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  227. draw_generic_textured_rect(Rect2(0, window_h - black_margin[MARGIN_BOTTOM], window_w, black_margin[MARGIN_BOTTOM]), Rect2(0, 0, 1, 1));
  228. }
  229. canvas_end();
  230. }
  231. void RasterizerCanvasBaseGLES2::_bind_quad_buffer() {
  232. glBindBuffer(GL_ARRAY_BUFFER, data.canvas_quad_vertices);
  233. glEnableVertexAttribArray(VS::ARRAY_VERTEX);
  234. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, 0, NULL);
  235. }
  236. void RasterizerCanvasBaseGLES2::_set_uniforms() {
  237. state.canvas_shader.set_uniform(CanvasShaderGLES2::PROJECTION_MATRIX, state.uniforms.projection_matrix);
  238. state.canvas_shader.set_uniform(CanvasShaderGLES2::MODELVIEW_MATRIX, state.uniforms.modelview_matrix);
  239. state.canvas_shader.set_uniform(CanvasShaderGLES2::EXTRA_MATRIX, state.uniforms.extra_matrix);
  240. state.canvas_shader.set_uniform(CanvasShaderGLES2::FINAL_MODULATE, state.uniforms.final_modulate);
  241. state.canvas_shader.set_uniform(CanvasShaderGLES2::TIME, storage->frame.time[0]);
  242. if (storage->frame.current_rt) {
  243. Vector2 screen_pixel_size;
  244. screen_pixel_size.x = 1.0 / storage->frame.current_rt->width;
  245. screen_pixel_size.y = 1.0 / storage->frame.current_rt->height;
  246. state.canvas_shader.set_uniform(CanvasShaderGLES2::SCREEN_PIXEL_SIZE, screen_pixel_size);
  247. }
  248. if (state.using_skeleton) {
  249. state.canvas_shader.set_uniform(CanvasShaderGLES2::SKELETON_TRANSFORM, state.skeleton_transform);
  250. state.canvas_shader.set_uniform(CanvasShaderGLES2::SKELETON_TRANSFORM_INVERSE, state.skeleton_transform_inverse);
  251. state.canvas_shader.set_uniform(CanvasShaderGLES2::SKELETON_TEXTURE_SIZE, state.skeleton_texture_size);
  252. }
  253. if (state.using_light) {
  254. Light *light = state.using_light;
  255. state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_MATRIX, light->light_shader_xform);
  256. Transform2D basis_inverse = light->light_shader_xform.affine_inverse().orthonormalized();
  257. basis_inverse[2] = Vector2();
  258. state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_MATRIX_INVERSE, basis_inverse);
  259. state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_LOCAL_MATRIX, light->xform_cache.affine_inverse());
  260. state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_COLOR, light->color * light->energy);
  261. state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_POS, light->light_shader_pos);
  262. state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_HEIGHT, light->height);
  263. state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_OUTSIDE_ALPHA, light->mode == VS::CANVAS_LIGHT_MODE_MASK ? 1.0 : 0.0);
  264. if (state.using_shadow) {
  265. RasterizerStorageGLES2::CanvasLightShadow *cls = storage->canvas_light_shadow_owner.get(light->shadow_buffer);
  266. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 5);
  267. glBindTexture(GL_TEXTURE_2D, cls->distance);
  268. state.canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_MATRIX, light->shadow_matrix_cache);
  269. state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_SHADOW_COLOR, light->shadow_color);
  270. state.canvas_shader.set_uniform(CanvasShaderGLES2::SHADOWPIXEL_SIZE, (1.0 / light->shadow_buffer_size) * (1.0 + light->shadow_smooth));
  271. if (light->radius_cache == 0) {
  272. state.canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_GRADIENT, 0.0);
  273. } else {
  274. state.canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_GRADIENT, light->shadow_gradient_length / (light->radius_cache * 1.1));
  275. }
  276. state.canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_DISTANCE_MULT, light->radius_cache * 1.1);
  277. /*canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_MATRIX,light->shadow_matrix_cache);
  278. canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_ESM_MULTIPLIER,light->shadow_esm_mult);
  279. canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_SHADOW_COLOR,light->shadow_color);*/
  280. }
  281. }
  282. }
  283. void RasterizerCanvasBaseGLES2::reset_canvas() {
  284. glDisable(GL_CULL_FACE);
  285. glDisable(GL_DEPTH_TEST);
  286. glDisable(GL_SCISSOR_TEST);
  287. glDisable(GL_DITHER);
  288. glEnable(GL_BLEND);
  289. if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
  290. glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
  291. } else {
  292. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  293. }
  294. // bind the back buffer to a texture so shaders can use it.
  295. // It should probably use texture unit -3 (as GLES2 does as well) but currently that's buggy.
  296. // keeping this for now as there's nothing else that uses texture unit 2
  297. // TODO ^
  298. if (storage->frame.current_rt) {
  299. // glActiveTexture(GL_TEXTURE0 + 2);
  300. // glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->copy_screen_effect.color);
  301. }
  302. glBindBuffer(GL_ARRAY_BUFFER, 0);
  303. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  304. }
  305. void RasterizerCanvasBaseGLES2::canvas_debug_viewport_shadows(Light *p_lights_with_shadow) {
  306. }
  307. void RasterizerCanvasBaseGLES2::_copy_texscreen(const Rect2 &p_rect) {
  308. state.canvas_texscreen_used = true;
  309. _copy_screen(p_rect);
  310. // back to canvas, force rebind
  311. state.using_texture_rect = false;
  312. state.canvas_shader.bind();
  313. _bind_canvas_texture(state.current_tex, state.current_normal);
  314. _set_uniforms();
  315. }
  316. void RasterizerCanvasBaseGLES2::_draw_polygon(const int *p_indices, int p_index_count, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor, const float *p_weights, const int *p_bones) {
  317. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  318. #ifndef GLES_OVER_GL
  319. // Orphan the buffer to avoid CPU/GPU sync points caused by glBufferSubData
  320. glBufferData(GL_ARRAY_BUFFER, data.polygon_buffer_size, NULL, GL_DYNAMIC_DRAW);
  321. #endif
  322. uint32_t buffer_ofs = 0;
  323. glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vector2) * p_vertex_count, p_vertices);
  324. glEnableVertexAttribArray(VS::ARRAY_VERTEX);
  325. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), NULL);
  326. buffer_ofs += sizeof(Vector2) * p_vertex_count;
  327. if (p_singlecolor) {
  328. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  329. Color m = *p_colors;
  330. glVertexAttrib4f(VS::ARRAY_COLOR, m.r, m.g, m.b, m.a);
  331. } else if (!p_colors) {
  332. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  333. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
  334. } else {
  335. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Color) * p_vertex_count, p_colors);
  336. glEnableVertexAttribArray(VS::ARRAY_COLOR);
  337. glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(Color), CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  338. buffer_ofs += sizeof(Color) * p_vertex_count;
  339. }
  340. if (p_uvs) {
  341. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_uvs);
  342. glEnableVertexAttribArray(VS::ARRAY_TEX_UV);
  343. glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  344. buffer_ofs += sizeof(Vector2) * p_vertex_count;
  345. } else {
  346. glDisableVertexAttribArray(VS::ARRAY_TEX_UV);
  347. }
  348. if (p_weights && p_bones) {
  349. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(float) * 4 * p_vertex_count, p_weights);
  350. glEnableVertexAttribArray(VS::ARRAY_WEIGHTS);
  351. glVertexAttribPointer(VS::ARRAY_WEIGHTS, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 4, CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  352. buffer_ofs += sizeof(float) * 4 * p_vertex_count;
  353. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(int) * 4 * p_vertex_count, p_bones);
  354. glEnableVertexAttribArray(VS::ARRAY_BONES);
  355. glVertexAttribPointer(VS::ARRAY_BONES, 4, GL_UNSIGNED_INT, GL_FALSE, sizeof(int) * 4, CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  356. buffer_ofs += sizeof(int) * 4 * p_vertex_count;
  357. } else {
  358. glDisableVertexAttribArray(VS::ARRAY_WEIGHTS);
  359. glDisableVertexAttribArray(VS::ARRAY_BONES);
  360. }
  361. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);
  362. #ifndef GLES_OVER_GL
  363. // Orphan the buffer to avoid CPU/GPU sync points caused by glBufferSubData
  364. glBufferData(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer_size, NULL, GL_DYNAMIC_DRAW);
  365. #endif
  366. if (storage->config.support_32_bits_indices) { //should check for
  367. glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(int) * p_index_count, p_indices);
  368. glDrawElements(GL_TRIANGLES, p_index_count, GL_UNSIGNED_INT, 0);
  369. storage->info.render._2d_draw_call_count++;
  370. } else {
  371. uint16_t *index16 = (uint16_t *)alloca(sizeof(uint16_t) * p_index_count);
  372. for (int i = 0; i < p_index_count; i++) {
  373. index16[i] = uint16_t(p_indices[i]);
  374. }
  375. glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(uint16_t) * p_index_count, index16);
  376. glDrawElements(GL_TRIANGLES, p_index_count, GL_UNSIGNED_SHORT, 0);
  377. storage->info.render._2d_draw_call_count++;
  378. }
  379. glBindBuffer(GL_ARRAY_BUFFER, 0);
  380. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  381. }
  382. void RasterizerCanvasBaseGLES2::_draw_generic(GLuint p_primitive, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor) {
  383. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  384. #ifndef GLES_OVER_GL
  385. // Orphan the buffer to avoid CPU/GPU sync points caused by glBufferSubData
  386. glBufferData(GL_ARRAY_BUFFER, data.polygon_buffer_size, NULL, GL_DYNAMIC_DRAW);
  387. #endif
  388. uint32_t buffer_ofs = 0;
  389. glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vector2) * p_vertex_count, p_vertices);
  390. glEnableVertexAttribArray(VS::ARRAY_VERTEX);
  391. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), NULL);
  392. buffer_ofs += sizeof(Vector2) * p_vertex_count;
  393. if (p_singlecolor) {
  394. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  395. Color m = *p_colors;
  396. glVertexAttrib4f(VS::ARRAY_COLOR, m.r, m.g, m.b, m.a);
  397. } else if (!p_colors) {
  398. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  399. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
  400. } else {
  401. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Color) * p_vertex_count, p_colors);
  402. glEnableVertexAttribArray(VS::ARRAY_COLOR);
  403. glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(Color), CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  404. buffer_ofs += sizeof(Color) * p_vertex_count;
  405. }
  406. if (p_uvs) {
  407. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_uvs);
  408. glEnableVertexAttribArray(VS::ARRAY_TEX_UV);
  409. glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  410. } else {
  411. glDisableVertexAttribArray(VS::ARRAY_TEX_UV);
  412. }
  413. glDrawArrays(p_primitive, 0, p_vertex_count);
  414. storage->info.render._2d_draw_call_count++;
  415. glBindBuffer(GL_ARRAY_BUFFER, 0);
  416. }
  417. void RasterizerCanvasBaseGLES2::_draw_generic_indices(GLuint p_primitive, const int *p_indices, int p_index_count, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor) {
  418. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  419. #ifndef GLES_OVER_GL
  420. // Orphan the buffer to avoid CPU/GPU sync points caused by glBufferSubData
  421. glBufferData(GL_ARRAY_BUFFER, data.polygon_buffer_size, NULL, GL_DYNAMIC_DRAW);
  422. #endif
  423. uint32_t buffer_ofs = 0;
  424. glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vector2) * p_vertex_count, p_vertices);
  425. glEnableVertexAttribArray(VS::ARRAY_VERTEX);
  426. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), NULL);
  427. buffer_ofs += sizeof(Vector2) * p_vertex_count;
  428. if (p_singlecolor) {
  429. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  430. Color m = *p_colors;
  431. glVertexAttrib4f(VS::ARRAY_COLOR, m.r, m.g, m.b, m.a);
  432. } else if (!p_colors) {
  433. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  434. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
  435. } else {
  436. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Color) * p_vertex_count, p_colors);
  437. glEnableVertexAttribArray(VS::ARRAY_COLOR);
  438. glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(Color), CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  439. buffer_ofs += sizeof(Color) * p_vertex_count;
  440. }
  441. if (p_uvs) {
  442. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_uvs);
  443. glEnableVertexAttribArray(VS::ARRAY_TEX_UV);
  444. glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  445. buffer_ofs += sizeof(Vector2) * p_vertex_count;
  446. } else {
  447. glDisableVertexAttribArray(VS::ARRAY_TEX_UV);
  448. }
  449. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);
  450. #ifndef GLES_OVER_GL
  451. // Orphan the buffer to avoid CPU/GPU sync points caused by glBufferSubData
  452. glBufferData(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer_size, NULL, GL_DYNAMIC_DRAW);
  453. #endif
  454. if (storage->config.support_32_bits_indices) { //should check for
  455. glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(int) * p_index_count, p_indices);
  456. glDrawElements(p_primitive, p_index_count, GL_UNSIGNED_INT, 0);
  457. storage->info.render._2d_draw_call_count++;
  458. } else {
  459. uint16_t *index16 = (uint16_t *)alloca(sizeof(uint16_t) * p_index_count);
  460. for (int i = 0; i < p_index_count; i++) {
  461. index16[i] = uint16_t(p_indices[i]);
  462. }
  463. glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(uint16_t) * p_index_count, index16);
  464. glDrawElements(p_primitive, p_index_count, GL_UNSIGNED_SHORT, 0);
  465. storage->info.render._2d_draw_call_count++;
  466. }
  467. glBindBuffer(GL_ARRAY_BUFFER, 0);
  468. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  469. }
  470. void RasterizerCanvasBaseGLES2::_draw_gui_primitive(int p_points, const Vector2 *p_vertices, const Color *p_colors, const Vector2 *p_uvs) {
  471. static const GLenum prim[5] = { GL_POINTS, GL_POINTS, GL_LINES, GL_TRIANGLES, GL_TRIANGLE_FAN };
  472. int color_offset = 0;
  473. int uv_offset = 0;
  474. int stride = 2;
  475. if (p_colors) {
  476. color_offset = stride;
  477. stride += 4;
  478. }
  479. if (p_uvs) {
  480. uv_offset = stride;
  481. stride += 2;
  482. }
  483. float buffer_data[(2 + 2 + 4) * 4];
  484. for (int i = 0; i < p_points; i++) {
  485. buffer_data[stride * i + 0] = p_vertices[i].x;
  486. buffer_data[stride * i + 1] = p_vertices[i].y;
  487. }
  488. if (p_colors) {
  489. for (int i = 0; i < p_points; i++) {
  490. buffer_data[stride * i + color_offset + 0] = p_colors[i].r;
  491. buffer_data[stride * i + color_offset + 1] = p_colors[i].g;
  492. buffer_data[stride * i + color_offset + 2] = p_colors[i].b;
  493. buffer_data[stride * i + color_offset + 3] = p_colors[i].a;
  494. }
  495. }
  496. if (p_uvs) {
  497. for (int i = 0; i < p_points; i++) {
  498. buffer_data[stride * i + uv_offset + 0] = p_uvs[i].x;
  499. buffer_data[stride * i + uv_offset + 1] = p_uvs[i].y;
  500. }
  501. }
  502. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  503. #ifndef GLES_OVER_GL
  504. // Orphan the buffer to avoid CPU/GPU sync points caused by glBufferSubData
  505. glBufferData(GL_ARRAY_BUFFER, data.polygon_buffer_size, NULL, GL_DYNAMIC_DRAW);
  506. #endif
  507. glBufferSubData(GL_ARRAY_BUFFER, 0, p_points * stride * 4 * sizeof(float), buffer_data);
  508. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, stride * sizeof(float), NULL);
  509. if (p_colors) {
  510. glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, stride * sizeof(float), CAST_INT_TO_UCHAR_PTR(color_offset * sizeof(float)));
  511. glEnableVertexAttribArray(VS::ARRAY_COLOR);
  512. }
  513. if (p_uvs) {
  514. glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, stride * sizeof(float), CAST_INT_TO_UCHAR_PTR(uv_offset * sizeof(float)));
  515. glEnableVertexAttribArray(VS::ARRAY_TEX_UV);
  516. }
  517. glDrawArrays(prim[p_points], 0, p_points);
  518. storage->info.render._2d_draw_call_count++;
  519. glBindBuffer(GL_ARRAY_BUFFER, 0);
  520. }
  521. void RasterizerCanvasBaseGLES2::_copy_screen(const Rect2 &p_rect) {
  522. if (storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_DIRECT_TO_SCREEN]) {
  523. ERR_PRINT_ONCE("Cannot use screen texture copying in render target set to render direct to screen.");
  524. return;
  525. }
  526. ERR_FAIL_COND_MSG(storage->frame.current_rt->copy_screen_effect.color == 0, "Can't use screen texture copying in a render target configured without copy buffers.");
  527. glDisable(GL_BLEND);
  528. Vector2 wh(storage->frame.current_rt->width, storage->frame.current_rt->height);
  529. Color copy_section(p_rect.position.x / wh.x, p_rect.position.y / wh.y, p_rect.size.x / wh.x, p_rect.size.y / wh.y);
  530. if (p_rect != Rect2()) {
  531. storage->shaders.copy.set_conditional(CopyShaderGLES2::USE_COPY_SECTION, true);
  532. }
  533. storage->shaders.copy.set_conditional(CopyShaderGLES2::USE_NO_ALPHA, !state.using_transparent_rt);
  534. glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->copy_screen_effect.fbo);
  535. glActiveTexture(GL_TEXTURE0);
  536. glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->color);
  537. storage->shaders.copy.bind();
  538. storage->shaders.copy.set_uniform(CopyShaderGLES2::COPY_SECTION, copy_section);
  539. const Vector2 vertpos[4] = {
  540. Vector2(-1, -1),
  541. Vector2(-1, 1),
  542. Vector2(1, 1),
  543. Vector2(1, -1),
  544. };
  545. const Vector2 uvpos[4] = {
  546. Vector2(0, 0),
  547. Vector2(0, 1),
  548. Vector2(1, 1),
  549. Vector2(1, 0)
  550. };
  551. const int indexpos[6] = {
  552. 0, 1, 2,
  553. 2, 3, 0
  554. };
  555. _draw_polygon(indexpos, 6, 4, vertpos, uvpos, NULL, false);
  556. storage->shaders.copy.set_conditional(CopyShaderGLES2::USE_COPY_SECTION, false);
  557. storage->shaders.copy.set_conditional(CopyShaderGLES2::USE_NO_ALPHA, false);
  558. glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->fbo); //back to front
  559. glEnable(GL_BLEND);
  560. }
  561. void RasterizerCanvasBaseGLES2::canvas_light_shadow_buffer_update(RID p_buffer, const Transform2D &p_light_xform, int p_light_mask, float p_near, float p_far, LightOccluderInstance *p_occluders, CameraMatrix *p_xform_cache) {
  562. RasterizerStorageGLES2::CanvasLightShadow *cls = storage->canvas_light_shadow_owner.get(p_buffer);
  563. ERR_FAIL_COND(!cls);
  564. glDisable(GL_BLEND);
  565. glDisable(GL_SCISSOR_TEST);
  566. glDisable(GL_DITHER);
  567. glDisable(GL_CULL_FACE);
  568. glDepthFunc(GL_LEQUAL);
  569. glEnable(GL_DEPTH_TEST);
  570. glDepthMask(true);
  571. glBindFramebuffer(GL_FRAMEBUFFER, cls->fbo);
  572. state.canvas_shadow_shader.set_conditional(CanvasShadowShaderGLES2::USE_RGBA_SHADOWS, storage->config.use_rgba_2d_shadows);
  573. state.canvas_shadow_shader.bind();
  574. glViewport(0, 0, cls->size, cls->height);
  575. glClearDepth(1.0f);
  576. glClearColor(1, 1, 1, 1);
  577. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  578. VS::CanvasOccluderPolygonCullMode cull = VS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED;
  579. for (int i = 0; i < 4; i++) {
  580. //make sure it remains orthogonal, makes easy to read angle later
  581. Transform light;
  582. light.origin[0] = p_light_xform[2][0];
  583. light.origin[1] = p_light_xform[2][1];
  584. light.basis[0][0] = p_light_xform[0][0];
  585. light.basis[0][1] = p_light_xform[1][0];
  586. light.basis[1][0] = p_light_xform[0][1];
  587. light.basis[1][1] = p_light_xform[1][1];
  588. //light.basis.scale(Vector3(to_light.elements[0].length(),to_light.elements[1].length(),1));
  589. //p_near=1;
  590. CameraMatrix projection;
  591. {
  592. real_t fov = 90;
  593. real_t nearp = p_near;
  594. real_t farp = p_far;
  595. real_t aspect = 1.0;
  596. real_t ymax = nearp * Math::tan(Math::deg2rad(fov * 0.5));
  597. real_t ymin = -ymax;
  598. real_t xmin = ymin * aspect;
  599. real_t xmax = ymax * aspect;
  600. projection.set_frustum(xmin, xmax, ymin, ymax, nearp, farp);
  601. }
  602. Vector3 cam_target = Basis(Vector3(0, 0, Math_PI * 2 * (i / 4.0))).xform(Vector3(0, 1, 0));
  603. projection = projection * CameraMatrix(Transform().looking_at(cam_target, Vector3(0, 0, -1)).affine_inverse());
  604. state.canvas_shadow_shader.set_uniform(CanvasShadowShaderGLES2::PROJECTION_MATRIX, projection);
  605. state.canvas_shadow_shader.set_uniform(CanvasShadowShaderGLES2::LIGHT_MATRIX, light);
  606. state.canvas_shadow_shader.set_uniform(CanvasShadowShaderGLES2::DISTANCE_NORM, 1.0 / p_far);
  607. if (i == 0)
  608. *p_xform_cache = projection;
  609. glViewport(0, (cls->height / 4) * i, cls->size, cls->height / 4);
  610. LightOccluderInstance *instance = p_occluders;
  611. while (instance) {
  612. RasterizerStorageGLES2::CanvasOccluder *cc = storage->canvas_occluder_owner.getornull(instance->polygon_buffer);
  613. if (!cc || cc->len == 0 || !(p_light_mask & instance->light_mask)) {
  614. instance = instance->next;
  615. continue;
  616. }
  617. state.canvas_shadow_shader.set_uniform(CanvasShadowShaderGLES2::WORLD_MATRIX, instance->xform_cache);
  618. VS::CanvasOccluderPolygonCullMode transformed_cull_cache = instance->cull_cache;
  619. if (transformed_cull_cache != VS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED &&
  620. (p_light_xform.basis_determinant() * instance->xform_cache.basis_determinant()) < 0) {
  621. transformed_cull_cache =
  622. transformed_cull_cache == VS::CANVAS_OCCLUDER_POLYGON_CULL_CLOCKWISE ?
  623. VS::CANVAS_OCCLUDER_POLYGON_CULL_COUNTER_CLOCKWISE :
  624. VS::CANVAS_OCCLUDER_POLYGON_CULL_CLOCKWISE;
  625. }
  626. if (cull != transformed_cull_cache) {
  627. cull = transformed_cull_cache;
  628. switch (cull) {
  629. case VS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED: {
  630. glDisable(GL_CULL_FACE);
  631. } break;
  632. case VS::CANVAS_OCCLUDER_POLYGON_CULL_CLOCKWISE: {
  633. glEnable(GL_CULL_FACE);
  634. glCullFace(GL_FRONT);
  635. } break;
  636. case VS::CANVAS_OCCLUDER_POLYGON_CULL_COUNTER_CLOCKWISE: {
  637. glEnable(GL_CULL_FACE);
  638. glCullFace(GL_BACK);
  639. } break;
  640. }
  641. }
  642. glBindBuffer(GL_ARRAY_BUFFER, cc->vertex_id);
  643. glEnableVertexAttribArray(VS::ARRAY_VERTEX);
  644. glVertexAttribPointer(VS::ARRAY_VERTEX, 3, GL_FLOAT, false, 0, 0);
  645. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cc->index_id);
  646. glDrawElements(GL_TRIANGLES, cc->len * 3, GL_UNSIGNED_SHORT, 0);
  647. instance = instance->next;
  648. }
  649. }
  650. glBindBuffer(GL_ARRAY_BUFFER, 0);
  651. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  652. }
  653. void RasterizerCanvasBaseGLES2::draw_lens_distortion_rect(const Rect2 &p_rect, float p_k1, float p_k2, const Vector2 &p_eye_center, float p_oversample) {
  654. Vector2 half_size;
  655. if (storage->frame.current_rt) {
  656. half_size = Vector2(storage->frame.current_rt->width, storage->frame.current_rt->height);
  657. } else {
  658. half_size = OS::get_singleton()->get_window_size();
  659. }
  660. half_size *= 0.5;
  661. Vector2 offset((p_rect.position.x - half_size.x) / half_size.x, (p_rect.position.y - half_size.y) / half_size.y);
  662. Vector2 scale(p_rect.size.x / half_size.x, p_rect.size.y / half_size.y);
  663. float aspect_ratio = p_rect.size.x / p_rect.size.y;
  664. // setup our lens shader
  665. state.lens_shader.bind();
  666. state.lens_shader.set_uniform(LensDistortedShaderGLES2::OFFSET, offset);
  667. state.lens_shader.set_uniform(LensDistortedShaderGLES2::SCALE, scale);
  668. state.lens_shader.set_uniform(LensDistortedShaderGLES2::K1, p_k1);
  669. state.lens_shader.set_uniform(LensDistortedShaderGLES2::K2, p_k2);
  670. state.lens_shader.set_uniform(LensDistortedShaderGLES2::EYE_CENTER, p_eye_center);
  671. state.lens_shader.set_uniform(LensDistortedShaderGLES2::UPSCALE, p_oversample);
  672. state.lens_shader.set_uniform(LensDistortedShaderGLES2::ASPECT_RATIO, aspect_ratio);
  673. // bind our quad buffer
  674. _bind_quad_buffer();
  675. // and draw
  676. glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  677. // and cleanup
  678. glBindBuffer(GL_ARRAY_BUFFER, 0);
  679. for (int i = 0; i < VS::ARRAY_MAX; i++) {
  680. glDisableVertexAttribArray(i);
  681. }
  682. }
  683. void RasterizerCanvasBaseGLES2::initialize() {
  684. // quad buffer
  685. {
  686. glGenBuffers(1, &data.canvas_quad_vertices);
  687. glBindBuffer(GL_ARRAY_BUFFER, data.canvas_quad_vertices);
  688. const float qv[8] = {
  689. 0, 0,
  690. 0, 1,
  691. 1, 1,
  692. 1, 0
  693. };
  694. glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 8, qv, GL_STATIC_DRAW);
  695. glBindBuffer(GL_ARRAY_BUFFER, 0);
  696. }
  697. // polygon buffer
  698. {
  699. uint32_t poly_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_buffer_size_kb", 128);
  700. ProjectSettings::get_singleton()->set_custom_property_info("rendering/limits/buffers/canvas_polygon_buffer_size_kb", PropertyInfo(Variant::INT, "rendering/limits/buffers/canvas_polygon_buffer_size_kb", PROPERTY_HINT_RANGE, "0,256,1,or_greater"));
  701. poly_size *= 1024;
  702. poly_size = MAX(poly_size, (2 + 2 + 4) * 4 * sizeof(float));
  703. glGenBuffers(1, &data.polygon_buffer);
  704. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  705. glBufferData(GL_ARRAY_BUFFER, poly_size, NULL, GL_DYNAMIC_DRAW);
  706. data.polygon_buffer_size = poly_size;
  707. glBindBuffer(GL_ARRAY_BUFFER, 0);
  708. uint32_t index_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_index_buffer_size_kb", 128);
  709. ProjectSettings::get_singleton()->set_custom_property_info("rendering/limits/buffers/canvas_polygon_index_buffer_size_kb", PropertyInfo(Variant::INT, "rendering/limits/buffers/canvas_polygon_index_buffer_size_kb", PROPERTY_HINT_RANGE, "0,256,1,or_greater"));
  710. index_size *= 1024; // kb
  711. glGenBuffers(1, &data.polygon_index_buffer);
  712. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);
  713. glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_size, NULL, GL_DYNAMIC_DRAW);
  714. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  715. data.polygon_index_buffer_size = index_size;
  716. }
  717. // ninepatch buffers
  718. {
  719. // array buffer
  720. glGenBuffers(1, &data.ninepatch_vertices);
  721. glBindBuffer(GL_ARRAY_BUFFER, data.ninepatch_vertices);
  722. glBufferData(GL_ARRAY_BUFFER, sizeof(float) * (16 + 16) * 2, NULL, GL_DYNAMIC_DRAW);
  723. glBindBuffer(GL_ARRAY_BUFFER, 0);
  724. // element buffer
  725. glGenBuffers(1, &data.ninepatch_elements);
  726. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.ninepatch_elements);
  727. #define _EIDX(y, x) (y * 4 + x)
  728. uint8_t elems[3 * 2 * 9] = {
  729. // first row
  730. _EIDX(0, 0), _EIDX(0, 1), _EIDX(1, 1),
  731. _EIDX(1, 1), _EIDX(1, 0), _EIDX(0, 0),
  732. _EIDX(0, 1), _EIDX(0, 2), _EIDX(1, 2),
  733. _EIDX(1, 2), _EIDX(1, 1), _EIDX(0, 1),
  734. _EIDX(0, 2), _EIDX(0, 3), _EIDX(1, 3),
  735. _EIDX(1, 3), _EIDX(1, 2), _EIDX(0, 2),
  736. // second row
  737. _EIDX(1, 0), _EIDX(1, 1), _EIDX(2, 1),
  738. _EIDX(2, 1), _EIDX(2, 0), _EIDX(1, 0),
  739. // the center one would be here, but we'll put it at the end
  740. // so it's easier to disable the center and be able to use
  741. // one draw call for both
  742. _EIDX(1, 2), _EIDX(1, 3), _EIDX(2, 3),
  743. _EIDX(2, 3), _EIDX(2, 2), _EIDX(1, 2),
  744. // third row
  745. _EIDX(2, 0), _EIDX(2, 1), _EIDX(3, 1),
  746. _EIDX(3, 1), _EIDX(3, 0), _EIDX(2, 0),
  747. _EIDX(2, 1), _EIDX(2, 2), _EIDX(3, 2),
  748. _EIDX(3, 2), _EIDX(3, 1), _EIDX(2, 1),
  749. _EIDX(2, 2), _EIDX(2, 3), _EIDX(3, 3),
  750. _EIDX(3, 3), _EIDX(3, 2), _EIDX(2, 2),
  751. // center field
  752. _EIDX(1, 1), _EIDX(1, 2), _EIDX(2, 2),
  753. _EIDX(2, 2), _EIDX(2, 1), _EIDX(1, 1)
  754. };
  755. #undef _EIDX
  756. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elems), elems, GL_STATIC_DRAW);
  757. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  758. }
  759. state.canvas_shadow_shader.init();
  760. state.canvas_shader.init();
  761. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, true);
  762. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_RGBA_SHADOWS, storage->config.use_rgba_2d_shadows);
  763. state.canvas_shader.bind();
  764. state.lens_shader.init();
  765. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_PIXEL_SNAP, GLOBAL_DEF("rendering/quality/2d/use_pixel_snap", false));
  766. state.using_light = NULL;
  767. state.using_transparent_rt = false;
  768. state.using_skeleton = false;
  769. }
  770. void RasterizerCanvasBaseGLES2::finalize() {
  771. }
  772. RasterizerCanvasBaseGLES2::RasterizerCanvasBaseGLES2() {
  773. #ifdef GLES_OVER_GL
  774. use_nvidia_rect_workaround = GLOBAL_GET("rendering/quality/2d/use_nvidia_rect_flicker_workaround");
  775. #else
  776. // Not needed (a priori) on GLES devices
  777. use_nvidia_rect_workaround = false;
  778. #endif
  779. }