rasterizer_canvas_base_opengl.cpp 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252
  1. /*************************************************************************/
  2. /* rasterizer_canvas_base_opengl.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2021 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_opengl.h"
  31. #ifdef OPENGL_BACKEND_ENABLED
  32. #include "core/os/os.h"
  33. #include "drivers/opengl/rasterizer_asserts.h"
  34. #include "rasterizer_scene_opengl.h"
  35. #include "core/config/project_settings.h"
  36. #include "servers/rendering/rendering_server_default.h"
  37. #ifndef GLES_OVER_GL
  38. #define glClearDepth glClearDepthf
  39. #endif
  40. RID RasterizerCanvasBaseOpenGL::light_internal_create() {
  41. return RID();
  42. }
  43. void RasterizerCanvasBaseOpenGL::light_internal_update(RID p_rid, Light *p_light) {
  44. }
  45. void RasterizerCanvasBaseOpenGL::light_internal_free(RID p_rid) {
  46. }
  47. RID RasterizerCanvasBaseOpenGL::light_create() {
  48. return RID();
  49. }
  50. void RasterizerCanvasBaseOpenGL::light_set_texture(RID p_rid, RID p_texture) {
  51. }
  52. void RasterizerCanvasBaseOpenGL::light_set_use_shadow(RID p_rid, bool p_enable) {
  53. }
  54. void RasterizerCanvasBaseOpenGL::light_update_shadow(RID p_rid, int p_shadow_index, const Transform2D &p_light_xform, int p_light_mask, float p_near, float p_far, LightOccluderInstance *p_occluders) {
  55. }
  56. void RasterizerCanvasBaseOpenGL::light_update_directional_shadow(RID p_rid, int p_shadow_index, const Transform2D &p_light_xform, int p_light_mask, float p_cull_distance, const Rect2 &p_clip_rect, LightOccluderInstance *p_occluders) {
  57. }
  58. void RasterizerCanvasBaseOpenGL::render_sdf(RID p_render_target, LightOccluderInstance *p_occluders) {
  59. }
  60. RID RasterizerCanvasBaseOpenGL::occluder_polygon_create() {
  61. return RID();
  62. }
  63. void RasterizerCanvasBaseOpenGL::occluder_polygon_set_shape(RID p_occluder, const Vector<Vector2> &p_points, bool p_closed) {
  64. }
  65. void RasterizerCanvasBaseOpenGL::occluder_polygon_set_cull_mode(RID p_occluder, RS::CanvasOccluderPolygonCullMode p_mode) {
  66. }
  67. void RasterizerCanvasBaseOpenGL::set_shadow_texture_size(int p_size) {
  68. }
  69. bool RasterizerCanvasBaseOpenGL::free(RID p_rid) {
  70. return true;
  71. }
  72. void RasterizerCanvasBaseOpenGL::update() {
  73. }
  74. void RasterizerCanvasBaseOpenGL::canvas_begin() {
  75. state.using_transparent_rt = false;
  76. // always start with light_angle unset
  77. state.using_light_angle = false;
  78. state.using_large_vertex = false;
  79. state.using_modulate = false;
  80. state.canvas_shader.set_conditional(CanvasShaderOpenGL::USE_ATTRIB_LIGHT_ANGLE, false);
  81. state.canvas_shader.set_conditional(CanvasShaderOpenGL::USE_ATTRIB_MODULATE, false);
  82. state.canvas_shader.set_conditional(CanvasShaderOpenGL::USE_ATTRIB_LARGE_VERTEX, false);
  83. state.canvas_shader.bind();
  84. int viewport_x, viewport_y, viewport_width, viewport_height;
  85. if (storage->frame.current_rt) {
  86. storage->bind_framebuffer(storage->frame.current_rt->fbo);
  87. state.using_transparent_rt = storage->frame.current_rt->flags[RendererStorage::RENDER_TARGET_TRANSPARENT];
  88. if (storage->frame.current_rt->flags[RendererStorage::RENDER_TARGET_DIRECT_TO_SCREEN]) {
  89. // set Viewport and Scissor when rendering directly to screen
  90. viewport_width = storage->_dims.rt_width;
  91. viewport_height = storage->_dims.rt_height;
  92. viewport_x = storage->frame.current_rt->x;
  93. // FTODO
  94. // viewport_y = OS::get_singleton()->get_window_size().height - viewport_height - storage->frame.current_rt->y;
  95. viewport_y = storage->frame.current_rt->y;
  96. // viewport_x = 0;
  97. // viewport_y = 0;
  98. glScissor(viewport_x, viewport_y, viewport_width, viewport_height);
  99. glViewport(viewport_x, viewport_y, viewport_width, viewport_height);
  100. glEnable(GL_SCISSOR_TEST);
  101. }
  102. }
  103. // FTODO .. this was commented out to try and get the clear color correct
  104. //#ifdef GODOT3
  105. // OLD METHOD .. now done by render target rather than frame
  106. #if 0
  107. if (storage->frame.clear_request) {
  108. glClearColor(storage->frame.clear_request_color.r,
  109. storage->frame.clear_request_color.g,
  110. storage->frame.clear_request_color.b,
  111. state.using_transparent_rt ? storage->frame.clear_request_color.a : 1.0);
  112. glClear(GL_COLOR_BUFFER_BIT);
  113. storage->frame.clear_request = false;
  114. }
  115. #endif
  116. // NEW METHOD
  117. if (storage->frame.current_rt && storage->frame.current_rt->clear_requested) {
  118. const Color &col = storage->frame.current_rt->clear_color;
  119. glClearColor(col.r, col.g, col.b, col.a);
  120. // clear EVERYTHING.
  121. // not clearing everything can be devastating on tiled renderers especially,
  122. // because if anything is preserved, often the whole frame buffer needs to be preserved.
  123. // Not sure if GL_ACCUM_BUFFER_BIT is needed or supported in GLES.
  124. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  125. storage->frame.current_rt->clear_requested = false;
  126. }
  127. //#endif
  128. /*
  129. if (storage->frame.current_rt) {
  130. glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->fbo);
  131. glColorMask(1, 1, 1, 1);
  132. }
  133. */
  134. reset_canvas();
  135. glActiveTexture(GL_TEXTURE0);
  136. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  137. glVertexAttrib4f(RS::ARRAY_COLOR, 1, 1, 1, 1);
  138. glDisableVertexAttribArray(RS::ARRAY_COLOR);
  139. // set up default uniforms
  140. Transform3D canvas_transform;
  141. if (storage->frame.current_rt) {
  142. float csy = 1.0;
  143. // FTODO
  144. // if (storage->frame.current_rt && storage->frame.current_rt->flags[RendererStorage::RENDER_TARGET_VFLIP]) {
  145. // csy = -1.0;
  146. // }
  147. canvas_transform.translate(-(storage->frame.current_rt->width / 2.0f), -(storage->frame.current_rt->height / 2.0f), 0.0f);
  148. canvas_transform.scale(Vector3(2.0f / storage->frame.current_rt->width, csy * -2.0f / storage->frame.current_rt->height, 1.0f));
  149. } else {
  150. // FTODO
  151. // Vector2 ssize = OS::get_singleton()->get_window_size();
  152. Vector2 ssize;
  153. ssize.x = storage->_dims.win_width;
  154. ssize.y = storage->_dims.win_height;
  155. canvas_transform.translate(-(ssize.width / 2.0f), -(ssize.height / 2.0f), 0.0f);
  156. canvas_transform.scale(Vector3(2.0f / ssize.width, -2.0f / ssize.height, 1.0f));
  157. }
  158. state.uniforms.projection_matrix = canvas_transform;
  159. state.uniforms.final_modulate = Color(1, 1, 1, 1);
  160. state.uniforms.modelview_matrix = Transform2D();
  161. state.uniforms.extra_matrix = Transform2D();
  162. _set_uniforms();
  163. _bind_quad_buffer();
  164. }
  165. void RasterizerCanvasBaseOpenGL::canvas_end() {
  166. glBindBuffer(GL_ARRAY_BUFFER, 0);
  167. for (int i = 0; i < RS::ARRAY_MAX; i++) {
  168. glDisableVertexAttribArray(i);
  169. }
  170. if (storage->frame.current_rt && storage->frame.current_rt->flags[RendererStorage::RENDER_TARGET_DIRECT_TO_SCREEN]) {
  171. //reset viewport to full window size
  172. // int viewport_width = OS::get_singleton()->get_window_size().width;
  173. // int viewport_height = OS::get_singleton()->get_window_size().height;
  174. int viewport_width = storage->_dims.win_width;
  175. int viewport_height = storage->_dims.win_height;
  176. glViewport(0, 0, viewport_width, viewport_height);
  177. glScissor(0, 0, viewport_width, viewport_height);
  178. }
  179. state.using_texture_rect = false;
  180. state.using_skeleton = false;
  181. state.using_ninepatch = false;
  182. state.using_transparent_rt = false;
  183. }
  184. void RasterizerCanvasBaseOpenGL::draw_generic_textured_rect(const Rect2 &p_rect, const Rect2 &p_src) {
  185. state.canvas_shader.set_uniform(CanvasShaderOpenGL::DST_RECT, Color(p_rect.position.x, p_rect.position.y, p_rect.size.x, p_rect.size.y));
  186. state.canvas_shader.set_uniform(CanvasShaderOpenGL::SRC_RECT, Color(p_src.position.x, p_src.position.y, p_src.size.x, p_src.size.y));
  187. glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  188. }
  189. void RasterizerCanvasBaseOpenGL::_set_texture_rect_mode(bool p_texture_rect, bool p_light_angle, bool p_modulate, bool p_large_vertex) {
  190. // always set this directly (this could be state checked)
  191. state.canvas_shader.set_conditional(CanvasShaderOpenGL::USE_TEXTURE_RECT, p_texture_rect);
  192. if (state.using_light_angle != p_light_angle) {
  193. state.using_light_angle = p_light_angle;
  194. state.canvas_shader.set_conditional(CanvasShaderOpenGL::USE_ATTRIB_LIGHT_ANGLE, p_light_angle);
  195. }
  196. if (state.using_modulate != p_modulate) {
  197. state.using_modulate = p_modulate;
  198. state.canvas_shader.set_conditional(CanvasShaderOpenGL::USE_ATTRIB_MODULATE, p_modulate);
  199. }
  200. if (state.using_large_vertex != p_large_vertex) {
  201. state.using_large_vertex = p_large_vertex;
  202. state.canvas_shader.set_conditional(CanvasShaderOpenGL::USE_ATTRIB_LARGE_VERTEX, p_large_vertex);
  203. }
  204. }
  205. RasterizerStorageOpenGL::Texture *RasterizerCanvasBaseOpenGL::_bind_canvas_texture(const RID &p_texture, const RID &p_normal_map) {
  206. RasterizerStorageOpenGL::Texture *tex_return = NULL;
  207. if (p_texture.is_valid()) {
  208. RasterizerStorageOpenGL::Texture *texture = storage->texture_owner.get_or_null(p_texture);
  209. if (!texture) {
  210. state.current_tex = RID();
  211. state.current_tex_ptr = NULL;
  212. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 1);
  213. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  214. } else {
  215. if (texture->redraw_if_visible) {
  216. RenderingServerDefault::redraw_request();
  217. }
  218. texture = texture->get_ptr();
  219. if (texture->render_target) {
  220. texture->render_target->used_in_frame = true;
  221. }
  222. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 1);
  223. glBindTexture(GL_TEXTURE_2D, texture->tex_id);
  224. state.current_tex = p_texture;
  225. state.current_tex_ptr = texture;
  226. // new for Godot 4. Set the texture min mag filter and repeat per item
  227. // we use a wrapper to avoid noop GL state changes
  228. texture->GLSetFilter(GL_TEXTURE_2D, state.current_filter);
  229. tex_return = texture;
  230. }
  231. } else {
  232. state.current_tex = RID();
  233. state.current_tex_ptr = NULL;
  234. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 1);
  235. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  236. }
  237. if (p_normal_map == state.current_normal) {
  238. //do none
  239. state.canvas_shader.set_uniform(CanvasShaderOpenGL::USE_DEFAULT_NORMAL, state.current_normal.is_valid());
  240. } else if (p_normal_map.is_valid()) {
  241. RasterizerStorageOpenGL::Texture *normal_map = storage->texture_owner.get_or_null(p_normal_map);
  242. if (!normal_map) {
  243. state.current_normal = RID();
  244. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 2);
  245. glBindTexture(GL_TEXTURE_2D, storage->resources.normal_tex);
  246. state.canvas_shader.set_uniform(CanvasShaderOpenGL::USE_DEFAULT_NORMAL, false);
  247. } else {
  248. if (normal_map->redraw_if_visible) { //check before proxy, because this is usually used with proxies
  249. RenderingServerDefault::redraw_request();
  250. }
  251. normal_map = normal_map->get_ptr();
  252. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 2);
  253. glBindTexture(GL_TEXTURE_2D, normal_map->tex_id);
  254. state.current_normal = p_normal_map;
  255. state.canvas_shader.set_uniform(CanvasShaderOpenGL::USE_DEFAULT_NORMAL, true);
  256. }
  257. } else {
  258. state.current_normal = RID();
  259. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 2);
  260. glBindTexture(GL_TEXTURE_2D, storage->resources.normal_tex);
  261. state.canvas_shader.set_uniform(CanvasShaderOpenGL::USE_DEFAULT_NORMAL, false);
  262. }
  263. return tex_return;
  264. }
  265. /*
  266. void RasterizerCanvasBaseOpenGL::draw_window_margins(int *black_margin, RID *black_image) {
  267. return;
  268. // FTODO
  269. int window_w = storage->_dims.rt_width;
  270. int window_h = storage->_dims.rt_height;
  271. //Vector2 window_size = Vector2(window_w, window_h);
  272. // int window_h = window_size.height;
  273. // int window_w = window_size.width;
  274. // glBindFramebuffer(GL_FRAMEBUFFER, storage->system_fbo);
  275. // glViewport(0, 0, window_size.width, window_size.height);
  276. canvas_begin();
  277. if (black_image[SIDE_LEFT].is_valid()) {
  278. _bind_canvas_texture(black_image[SIDE_LEFT], RID());
  279. Size2 sz(storage->texture_get_width(black_image[SIDE_LEFT]), storage->texture_get_height(black_image[SIDE_LEFT]));
  280. draw_generic_textured_rect(Rect2(0, 0, black_margin[SIDE_LEFT], window_h),
  281. Rect2(0, 0, (float)black_margin[SIDE_LEFT] / sz.x, (float)(window_h) / sz.y));
  282. } else if (black_margin[SIDE_LEFT]) {
  283. glActiveTexture(GL_TEXTURE0);
  284. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  285. draw_generic_textured_rect(Rect2(0, 0, black_margin[SIDE_LEFT], window_h), Rect2(0, 0, 1, 1));
  286. }
  287. if (black_image[SIDE_RIGHT].is_valid()) {
  288. _bind_canvas_texture(black_image[SIDE_RIGHT], RID());
  289. Size2 sz(storage->texture_get_width(black_image[SIDE_RIGHT]), storage->texture_get_height(black_image[SIDE_RIGHT]));
  290. draw_generic_textured_rect(Rect2(window_w - black_margin[SIDE_RIGHT], 0, black_margin[SIDE_RIGHT], window_h),
  291. Rect2(0, 0, (float)black_margin[SIDE_RIGHT] / sz.x, (float)window_h / sz.y));
  292. } else if (black_margin[SIDE_RIGHT]) {
  293. glActiveTexture(GL_TEXTURE0);
  294. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  295. draw_generic_textured_rect(Rect2(window_w - black_margin[SIDE_RIGHT], 0, black_margin[SIDE_RIGHT], window_h), Rect2(0, 0, 1, 1));
  296. }
  297. if (black_image[SIDE_TOP].is_valid()) {
  298. _bind_canvas_texture(black_image[SIDE_TOP], RID());
  299. Size2 sz(storage->texture_get_width(black_image[SIDE_TOP]), storage->texture_get_height(black_image[SIDE_TOP]));
  300. draw_generic_textured_rect(Rect2(0, 0, window_w, black_margin[SIDE_TOP]),
  301. Rect2(0, 0, (float)window_w / sz.x, (float)black_margin[SIDE_TOP] / sz.y));
  302. } else if (black_margin[SIDE_TOP]) {
  303. glActiveTexture(GL_TEXTURE0);
  304. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  305. draw_generic_textured_rect(Rect2(0, 0, window_w, black_margin[SIDE_TOP]), Rect2(0, 0, 1, 1));
  306. }
  307. if (black_image[SIDE_BOTTOM].is_valid()) {
  308. _bind_canvas_texture(black_image[SIDE_BOTTOM], RID());
  309. Size2 sz(storage->texture_get_width(black_image[SIDE_BOTTOM]), storage->texture_get_height(black_image[SIDE_BOTTOM]));
  310. draw_generic_textured_rect(Rect2(0, window_h - black_margin[SIDE_BOTTOM], window_w, black_margin[SIDE_BOTTOM]),
  311. Rect2(0, 0, (float)window_w / sz.x, (float)black_margin[SIDE_BOTTOM] / sz.y));
  312. } else if (black_margin[SIDE_BOTTOM]) {
  313. glActiveTexture(GL_TEXTURE0);
  314. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  315. draw_generic_textured_rect(Rect2(0, window_h - black_margin[SIDE_BOTTOM], window_w, black_margin[SIDE_BOTTOM]), Rect2(0, 0, 1, 1));
  316. }
  317. canvas_end();
  318. }
  319. */
  320. void RasterizerCanvasBaseOpenGL::_bind_quad_buffer() {
  321. glBindBuffer(GL_ARRAY_BUFFER, data.canvas_quad_vertices);
  322. glEnableVertexAttribArray(RS::ARRAY_VERTEX);
  323. glVertexAttribPointer(RS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, 0, NULL);
  324. }
  325. void RasterizerCanvasBaseOpenGL::_set_uniforms() {
  326. state.canvas_shader.set_uniform(CanvasShaderOpenGL::PROJECTION_MATRIX, state.uniforms.projection_matrix);
  327. state.canvas_shader.set_uniform(CanvasShaderOpenGL::MODELVIEW_MATRIX, state.uniforms.modelview_matrix);
  328. state.canvas_shader.set_uniform(CanvasShaderOpenGL::EXTRA_MATRIX, state.uniforms.extra_matrix);
  329. state.canvas_shader.set_uniform(CanvasShaderOpenGL::FINAL_MODULATE, state.uniforms.final_modulate);
  330. state.canvas_shader.set_uniform(CanvasShaderOpenGL::TIME, storage->frame.time[0]);
  331. if (storage->frame.current_rt) {
  332. Vector2 screen_pixel_size;
  333. screen_pixel_size.x = 1.0 / storage->frame.current_rt->width;
  334. screen_pixel_size.y = 1.0 / storage->frame.current_rt->height;
  335. state.canvas_shader.set_uniform(CanvasShaderOpenGL::SCREEN_PIXEL_SIZE, screen_pixel_size);
  336. }
  337. if (state.using_skeleton) {
  338. state.canvas_shader.set_uniform(CanvasShaderOpenGL::SKELETON_TRANSFORM, state.skeleton_transform);
  339. state.canvas_shader.set_uniform(CanvasShaderOpenGL::SKELETON_TRANSFORM_INVERSE, state.skeleton_transform_inverse);
  340. state.canvas_shader.set_uniform(CanvasShaderOpenGL::SKELETON_TEXTURE_SIZE, state.skeleton_texture_size);
  341. }
  342. if (state.using_light) {
  343. Light *light = state.using_light;
  344. state.canvas_shader.set_uniform(CanvasShaderOpenGL::LIGHT_MATRIX, light->light_shader_xform);
  345. Transform2D basis_inverse = light->light_shader_xform.affine_inverse().orthonormalized();
  346. basis_inverse.elements[2] = Vector2();
  347. state.canvas_shader.set_uniform(CanvasShaderOpenGL::LIGHT_MATRIX_INVERSE, basis_inverse);
  348. state.canvas_shader.set_uniform(CanvasShaderOpenGL::LIGHT_LOCAL_MATRIX, light->xform_cache.affine_inverse());
  349. state.canvas_shader.set_uniform(CanvasShaderOpenGL::LIGHT_COLOR, light->color * light->energy);
  350. // state.canvas_shader.set_uniform(CanvasShaderOpenGL::LIGHT_POS, light->light_shader_pos);
  351. // FTODO
  352. state.canvas_shader.set_uniform(CanvasShaderOpenGL::LIGHT_POS, light->light_shader_xform.elements[2]);
  353. state.canvas_shader.set_uniform(CanvasShaderOpenGL::LIGHT_HEIGHT, light->height);
  354. // FTODO
  355. //state.canvas_shader.set_uniform(CanvasShaderOpenGL::LIGHT_OUTSIDE_ALPHA, light->mode == RS::CANVAS_LIGHT_MODE_MASK ? 1.0 : 0.0);
  356. state.canvas_shader.set_uniform(CanvasShaderOpenGL::LIGHT_OUTSIDE_ALPHA, 0.0f);
  357. if (state.using_shadow) {
  358. // FTODO
  359. #if 0
  360. RasterizerStorageOpenGL::CanvasLightShadow *cls = storage->canvas_light_shadow_owner.get(light->shadow_buffer);
  361. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 5);
  362. glBindTexture(GL_TEXTURE_2D, cls->distance);
  363. state.canvas_shader.set_uniform(CanvasShaderOpenGL::SHADOW_MATRIX, light->shadow_matrix_cache);
  364. state.canvas_shader.set_uniform(CanvasShaderOpenGL::LIGHT_SHADOW_COLOR, light->shadow_color);
  365. state.canvas_shader.set_uniform(CanvasShaderOpenGL::SHADOWPIXEL_SIZE, (1.0 / light->shadow_buffer_size) * (1.0 + light->shadow_smooth));
  366. if (light->radius_cache == 0) {
  367. state.canvas_shader.set_uniform(CanvasShaderOpenGL::SHADOW_GRADIENT, 0.0);
  368. } else {
  369. state.canvas_shader.set_uniform(CanvasShaderOpenGL::SHADOW_GRADIENT, light->shadow_gradient_length / (light->radius_cache * 1.1));
  370. }
  371. state.canvas_shader.set_uniform(CanvasShaderOpenGL::SHADOW_DISTANCE_MULT, light->radius_cache * 1.1);
  372. #endif
  373. }
  374. }
  375. }
  376. void RasterizerCanvasBaseOpenGL::reset_canvas() {
  377. glDisable(GL_CULL_FACE);
  378. glDisable(GL_DEPTH_TEST);
  379. glDisable(GL_SCISSOR_TEST);
  380. glDisable(GL_DITHER);
  381. glEnable(GL_BLEND);
  382. if (storage->frame.current_rt && storage->frame.current_rt->flags[RendererStorage::RENDER_TARGET_TRANSPARENT]) {
  383. glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
  384. } else {
  385. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  386. }
  387. // bind the back buffer to a texture so shaders can use it.
  388. // It should probably use texture unit -3 (as OpenGL does as well) but currently that's buggy.
  389. // keeping this for now as there's nothing else that uses texture unit 2
  390. // TODO ^
  391. if (storage->frame.current_rt) {
  392. // glActiveTexture(GL_TEXTURE0 + 2);
  393. // glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->copy_screen_effect.color);
  394. }
  395. glBindBuffer(GL_ARRAY_BUFFER, 0);
  396. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  397. }
  398. void RasterizerCanvasBaseOpenGL::canvas_debug_viewport_shadows(Light *p_lights_with_shadow) {
  399. }
  400. void RasterizerCanvasBaseOpenGL::_copy_texscreen(const Rect2 &p_rect) {
  401. state.canvas_texscreen_used = true;
  402. _copy_screen(p_rect);
  403. // back to canvas, force rebind
  404. state.using_texture_rect = false;
  405. state.canvas_shader.bind();
  406. _bind_canvas_texture(state.current_tex, state.current_normal);
  407. _set_uniforms();
  408. }
  409. void RasterizerCanvasBaseOpenGL::_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) {
  410. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  411. uint32_t buffer_ofs = 0;
  412. uint32_t buffer_ofs_after = buffer_ofs + (sizeof(Vector2) * p_vertex_count);
  413. #ifdef DEBUG_ENABLED
  414. ERR_FAIL_COND(buffer_ofs_after > data.polygon_buffer_size);
  415. #endif
  416. storage->buffer_orphan_and_upload(data.polygon_buffer_size, 0, sizeof(Vector2) * p_vertex_count, p_vertices, GL_ARRAY_BUFFER, _buffer_upload_usage_flag, true);
  417. glEnableVertexAttribArray(RS::ARRAY_VERTEX);
  418. glVertexAttribPointer(RS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), NULL);
  419. buffer_ofs = buffer_ofs_after;
  420. if (p_singlecolor) {
  421. glDisableVertexAttribArray(RS::ARRAY_COLOR);
  422. Color m = *p_colors;
  423. glVertexAttrib4f(RS::ARRAY_COLOR, m.r, m.g, m.b, m.a);
  424. } else if (!p_colors) {
  425. glDisableVertexAttribArray(RS::ARRAY_COLOR);
  426. glVertexAttrib4f(RS::ARRAY_COLOR, 1, 1, 1, 1);
  427. } else {
  428. RAST_FAIL_COND(!storage->safe_buffer_sub_data(data.polygon_buffer_size, GL_ARRAY_BUFFER, buffer_ofs, sizeof(Color) * p_vertex_count, p_colors, buffer_ofs_after));
  429. glEnableVertexAttribArray(RS::ARRAY_COLOR);
  430. glVertexAttribPointer(RS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(Color), CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  431. buffer_ofs = buffer_ofs_after;
  432. }
  433. if (p_uvs) {
  434. RAST_FAIL_COND(!storage->safe_buffer_sub_data(data.polygon_buffer_size, GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_uvs, buffer_ofs_after));
  435. glEnableVertexAttribArray(RS::ARRAY_TEX_UV);
  436. glVertexAttribPointer(RS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  437. buffer_ofs = buffer_ofs_after;
  438. } else {
  439. glDisableVertexAttribArray(RS::ARRAY_TEX_UV);
  440. }
  441. if (p_weights && p_bones) {
  442. RAST_FAIL_COND(!storage->safe_buffer_sub_data(data.polygon_buffer_size, GL_ARRAY_BUFFER, buffer_ofs, sizeof(float) * 4 * p_vertex_count, p_weights, buffer_ofs_after));
  443. glEnableVertexAttribArray(RS::ARRAY_WEIGHTS);
  444. glVertexAttribPointer(RS::ARRAY_WEIGHTS, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 4, CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  445. buffer_ofs = buffer_ofs_after;
  446. RAST_FAIL_COND(!storage->safe_buffer_sub_data(data.polygon_buffer_size, GL_ARRAY_BUFFER, buffer_ofs, sizeof(int) * 4 * p_vertex_count, p_bones, buffer_ofs_after));
  447. glEnableVertexAttribArray(RS::ARRAY_BONES);
  448. glVertexAttribPointer(RS::ARRAY_BONES, 4, GL_UNSIGNED_INT, GL_FALSE, sizeof(int) * 4, CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  449. buffer_ofs = buffer_ofs_after;
  450. } else {
  451. glDisableVertexAttribArray(RS::ARRAY_WEIGHTS);
  452. glDisableVertexAttribArray(RS::ARRAY_BONES);
  453. }
  454. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);
  455. if (storage->config.support_32_bits_indices) { //should check for
  456. #ifdef DEBUG_ENABLED
  457. ERR_FAIL_COND((sizeof(int) * p_index_count) > data.polygon_index_buffer_size);
  458. #endif
  459. storage->buffer_orphan_and_upload(data.polygon_index_buffer_size, 0, sizeof(int) * p_index_count, p_indices, GL_ELEMENT_ARRAY_BUFFER, _buffer_upload_usage_flag, true);
  460. glDrawElements(GL_TRIANGLES, p_index_count, GL_UNSIGNED_INT, 0);
  461. storage->info.render._2d_draw_call_count++;
  462. } else {
  463. #ifdef DEBUG_ENABLED
  464. ERR_FAIL_COND((sizeof(uint16_t) * p_index_count) > data.polygon_index_buffer_size);
  465. #endif
  466. uint16_t *index16 = (uint16_t *)alloca(sizeof(uint16_t) * p_index_count);
  467. for (int i = 0; i < p_index_count; i++) {
  468. index16[i] = uint16_t(p_indices[i]);
  469. }
  470. storage->buffer_orphan_and_upload(data.polygon_index_buffer_size, 0, sizeof(uint16_t) * p_index_count, index16, GL_ELEMENT_ARRAY_BUFFER, _buffer_upload_usage_flag, true);
  471. glDrawElements(GL_TRIANGLES, p_index_count, GL_UNSIGNED_SHORT, 0);
  472. storage->info.render._2d_draw_call_count++;
  473. }
  474. glBindBuffer(GL_ARRAY_BUFFER, 0);
  475. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  476. }
  477. void RasterizerCanvasBaseOpenGL::_draw_generic(GLuint p_primitive, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor) {
  478. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  479. uint32_t buffer_ofs = 0;
  480. uint32_t buffer_ofs_after = buffer_ofs + (sizeof(Vector2) * p_vertex_count);
  481. #ifdef DEBUG_ENABLED
  482. ERR_FAIL_COND(buffer_ofs_after > data.polygon_buffer_size);
  483. #endif
  484. storage->buffer_orphan_and_upload(data.polygon_buffer_size, 0, sizeof(Vector2) * p_vertex_count, p_vertices, GL_ARRAY_BUFFER, _buffer_upload_usage_flag, true);
  485. glEnableVertexAttribArray(RS::ARRAY_VERTEX);
  486. glVertexAttribPointer(RS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), NULL);
  487. buffer_ofs = buffer_ofs_after;
  488. if (p_singlecolor) {
  489. glDisableVertexAttribArray(RS::ARRAY_COLOR);
  490. Color m = *p_colors;
  491. glVertexAttrib4f(RS::ARRAY_COLOR, m.r, m.g, m.b, m.a);
  492. } else if (!p_colors) {
  493. glDisableVertexAttribArray(RS::ARRAY_COLOR);
  494. glVertexAttrib4f(RS::ARRAY_COLOR, 1, 1, 1, 1);
  495. } else {
  496. RAST_FAIL_COND(!storage->safe_buffer_sub_data(data.polygon_buffer_size, GL_ARRAY_BUFFER, buffer_ofs, sizeof(Color) * p_vertex_count, p_colors, buffer_ofs_after));
  497. glEnableVertexAttribArray(RS::ARRAY_COLOR);
  498. glVertexAttribPointer(RS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(Color), CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  499. buffer_ofs = buffer_ofs_after;
  500. }
  501. if (p_uvs) {
  502. RAST_FAIL_COND(!storage->safe_buffer_sub_data(data.polygon_buffer_size, GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_uvs, buffer_ofs_after));
  503. glEnableVertexAttribArray(RS::ARRAY_TEX_UV);
  504. glVertexAttribPointer(RS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  505. buffer_ofs = buffer_ofs_after;
  506. } else {
  507. glDisableVertexAttribArray(RS::ARRAY_TEX_UV);
  508. }
  509. glDrawArrays(p_primitive, 0, p_vertex_count);
  510. storage->info.render._2d_draw_call_count++;
  511. glBindBuffer(GL_ARRAY_BUFFER, 0);
  512. }
  513. void RasterizerCanvasBaseOpenGL::_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) {
  514. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  515. uint32_t buffer_ofs = 0;
  516. uint32_t buffer_ofs_after = buffer_ofs + (sizeof(Vector2) * p_vertex_count);
  517. #ifdef DEBUG_ENABLED
  518. ERR_FAIL_COND(buffer_ofs_after > data.polygon_buffer_size);
  519. #endif
  520. storage->buffer_orphan_and_upload(data.polygon_buffer_size, 0, sizeof(Vector2) * p_vertex_count, p_vertices, GL_ARRAY_BUFFER, _buffer_upload_usage_flag, true);
  521. glEnableVertexAttribArray(RS::ARRAY_VERTEX);
  522. glVertexAttribPointer(RS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), NULL);
  523. buffer_ofs = buffer_ofs_after;
  524. if (p_singlecolor) {
  525. glDisableVertexAttribArray(RS::ARRAY_COLOR);
  526. Color m = *p_colors;
  527. glVertexAttrib4f(RS::ARRAY_COLOR, m.r, m.g, m.b, m.a);
  528. } else if (!p_colors) {
  529. glDisableVertexAttribArray(RS::ARRAY_COLOR);
  530. glVertexAttrib4f(RS::ARRAY_COLOR, 1, 1, 1, 1);
  531. } else {
  532. RAST_FAIL_COND(!storage->safe_buffer_sub_data(data.polygon_buffer_size, GL_ARRAY_BUFFER, buffer_ofs, sizeof(Color) * p_vertex_count, p_colors, buffer_ofs_after));
  533. glEnableVertexAttribArray(RS::ARRAY_COLOR);
  534. glVertexAttribPointer(RS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(Color), CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  535. buffer_ofs = buffer_ofs_after;
  536. }
  537. if (p_uvs) {
  538. RAST_FAIL_COND(!storage->safe_buffer_sub_data(data.polygon_buffer_size, GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_uvs, buffer_ofs_after));
  539. glEnableVertexAttribArray(RS::ARRAY_TEX_UV);
  540. glVertexAttribPointer(RS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), CAST_INT_TO_UCHAR_PTR(buffer_ofs));
  541. buffer_ofs = buffer_ofs_after;
  542. } else {
  543. glDisableVertexAttribArray(RS::ARRAY_TEX_UV);
  544. }
  545. #ifdef RASTERIZER_EXTRA_CHECKS
  546. // very slow, do not enable in normal use
  547. for (int n = 0; n < p_index_count; n++) {
  548. RAST_DEV_DEBUG_ASSERT(p_indices[n] < p_vertex_count);
  549. }
  550. #endif
  551. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);
  552. if (storage->config.support_32_bits_indices) { //should check for
  553. #ifdef DEBUG_ENABLED
  554. ERR_FAIL_COND((sizeof(int) * p_index_count) > data.polygon_index_buffer_size);
  555. #endif
  556. storage->buffer_orphan_and_upload(data.polygon_index_buffer_size, 0, sizeof(int) * p_index_count, p_indices, GL_ELEMENT_ARRAY_BUFFER, _buffer_upload_usage_flag, true);
  557. glDrawElements(p_primitive, p_index_count, GL_UNSIGNED_INT, 0);
  558. storage->info.render._2d_draw_call_count++;
  559. } else {
  560. #ifdef DEBUG_ENABLED
  561. ERR_FAIL_COND((sizeof(uint16_t) * p_index_count) > data.polygon_index_buffer_size);
  562. #endif
  563. uint16_t *index16 = (uint16_t *)alloca(sizeof(uint16_t) * p_index_count);
  564. for (int i = 0; i < p_index_count; i++) {
  565. index16[i] = uint16_t(p_indices[i]);
  566. }
  567. storage->buffer_orphan_and_upload(data.polygon_index_buffer_size, 0, sizeof(uint16_t) * p_index_count, index16, GL_ELEMENT_ARRAY_BUFFER, _buffer_upload_usage_flag, true);
  568. glDrawElements(p_primitive, p_index_count, GL_UNSIGNED_SHORT, 0);
  569. storage->info.render._2d_draw_call_count++;
  570. }
  571. glBindBuffer(GL_ARRAY_BUFFER, 0);
  572. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  573. }
  574. void RasterizerCanvasBaseOpenGL::_legacy_draw_poly_triangles(Item::CommandPolygon *p_poly, RasterizerStorageOpenGL::Material *p_material) {
  575. // return;
  576. const PolyData &pd = _polydata[p_poly->polygon.polygon_id];
  577. _set_texture_rect_mode(false);
  578. if (state.canvas_shader.bind()) {
  579. _set_uniforms();
  580. state.canvas_shader.use_material((void *)p_material);
  581. }
  582. // FTODO
  583. //RasterizerStorageOpenGL::Texture *texture = _bind_canvas_texture(polygon->texture, polygon->normal_map);
  584. RasterizerStorageOpenGL::Texture *texture = _bind_canvas_texture(p_poly->texture, RID());
  585. if (texture) {
  586. Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height);
  587. state.canvas_shader.set_uniform(CanvasShaderOpenGL::COLOR_TEXPIXEL_SIZE, texpixel_size);
  588. }
  589. _draw_polygon(pd.indices.ptr(), pd.indices.size(), pd.points.size(), pd.points.ptr(), pd.uvs.ptr(), pd.colors.ptr(), pd.colors.size() == 1, nullptr, nullptr);
  590. // _draw_polygon(polygon->indices.ptr(), polygon->count, polygon->points.size(), polygon->points.ptr(), polygon->uvs.ptr(), polygon->colors.ptr(), polygon->colors.size() == 1, polygon->weights.ptr(), polygon->bones.ptr());
  591. #ifdef GLES_OVER_GL
  592. #if 0
  593. if (polygon->antialiased) {
  594. glEnable(GL_LINE_SMOOTH);
  595. if (polygon->antialiasing_use_indices) {
  596. _draw_generic_indices(GL_LINE_STRIP, polygon->indices.ptr(), polygon->count, polygon->points.size(), polygon->points.ptr(), polygon->uvs.ptr(), polygon->colors.ptr(), polygon->colors.size() == 1);
  597. } else {
  598. _draw_generic(GL_LINE_LOOP, polygon->points.size(), polygon->points.ptr(), polygon->uvs.ptr(), polygon->colors.ptr(), polygon->colors.size() == 1);
  599. }
  600. glDisable(GL_LINE_SMOOTH);
  601. }
  602. #endif
  603. #endif
  604. }
  605. void RasterizerCanvasBaseOpenGL::_legacy_draw_primitive(Item::CommandPrimitive *p_pr, RasterizerStorageOpenGL::Material *p_material) {
  606. // return;
  607. if (p_pr->point_count != 4)
  608. return; // not sure if supported
  609. _set_texture_rect_mode(false);
  610. if (state.canvas_shader.bind()) {
  611. _set_uniforms();
  612. state.canvas_shader.use_material((void *)p_material);
  613. }
  614. _bind_canvas_texture(RID(), RID());
  615. glDisableVertexAttribArray(RS::ARRAY_COLOR);
  616. glVertexAttrib4fv(RS::ARRAY_COLOR, p_pr->colors[0].components);
  617. state.canvas_shader.set_uniform(CanvasShaderOpenGL::MODELVIEW_MATRIX, state.uniforms.modelview_matrix);
  618. _draw_gui_primitive(p_pr->point_count, p_pr->points, NULL, NULL);
  619. }
  620. void RasterizerCanvasBaseOpenGL::_legacy_draw_line(Item::CommandPrimitive *p_pr, RasterizerStorageOpenGL::Material *p_material) {
  621. _set_texture_rect_mode(false);
  622. if (state.canvas_shader.bind()) {
  623. _set_uniforms();
  624. state.canvas_shader.use_material((void *)p_material);
  625. }
  626. _bind_canvas_texture(RID(), RID());
  627. glDisableVertexAttribArray(RS::ARRAY_COLOR);
  628. glVertexAttrib4fv(RS::ARRAY_COLOR, p_pr->colors[0].components);
  629. state.canvas_shader.set_uniform(CanvasShaderOpenGL::MODELVIEW_MATRIX, state.uniforms.modelview_matrix);
  630. #ifdef GLES_OVER_GL
  631. // if (line->antialiased)
  632. // glEnable(GL_LINE_SMOOTH);
  633. #endif
  634. _draw_gui_primitive(2, p_pr->points, NULL, NULL);
  635. #ifdef GLES_OVER_GL
  636. // if (line->antialiased)
  637. // glDisable(GL_LINE_SMOOTH);
  638. #endif
  639. }
  640. void RasterizerCanvasBaseOpenGL::_draw_gui_primitive(int p_points, const Vector2 *p_vertices, const Color *p_colors, const Vector2 *p_uvs, const float *p_light_angles) {
  641. static const GLenum prim[5] = { GL_POINTS, GL_POINTS, GL_LINES, GL_TRIANGLES, GL_TRIANGLE_FAN };
  642. int color_offset = 0;
  643. int uv_offset = 0;
  644. int light_angle_offset = 0;
  645. int stride = 2;
  646. if (p_colors) {
  647. color_offset = stride;
  648. stride += 4;
  649. }
  650. if (p_uvs) {
  651. uv_offset = stride;
  652. stride += 2;
  653. }
  654. if (p_light_angles) { //light_angles
  655. light_angle_offset = stride;
  656. stride += 1;
  657. }
  658. RAST_DEV_DEBUG_ASSERT(p_points <= 4);
  659. float buffer_data[(2 + 2 + 4 + 1) * 4];
  660. for (int i = 0; i < p_points; i++) {
  661. buffer_data[stride * i + 0] = p_vertices[i].x;
  662. buffer_data[stride * i + 1] = p_vertices[i].y;
  663. }
  664. if (p_colors) {
  665. for (int i = 0; i < p_points; i++) {
  666. buffer_data[stride * i + color_offset + 0] = p_colors[i].r;
  667. buffer_data[stride * i + color_offset + 1] = p_colors[i].g;
  668. buffer_data[stride * i + color_offset + 2] = p_colors[i].b;
  669. buffer_data[stride * i + color_offset + 3] = p_colors[i].a;
  670. }
  671. }
  672. if (p_uvs) {
  673. for (int i = 0; i < p_points; i++) {
  674. buffer_data[stride * i + uv_offset + 0] = p_uvs[i].x;
  675. buffer_data[stride * i + uv_offset + 1] = p_uvs[i].y;
  676. }
  677. }
  678. if (p_light_angles) {
  679. for (int i = 0; i < p_points; i++) {
  680. buffer_data[stride * i + light_angle_offset + 0] = p_light_angles[i];
  681. }
  682. }
  683. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  684. storage->buffer_orphan_and_upload(data.polygon_buffer_size, 0, p_points * stride * 4 * sizeof(float), buffer_data, GL_ARRAY_BUFFER, _buffer_upload_usage_flag, true);
  685. glVertexAttribPointer(RS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, stride * sizeof(float), NULL);
  686. if (p_colors) {
  687. glVertexAttribPointer(RS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, stride * sizeof(float), CAST_INT_TO_UCHAR_PTR(color_offset * sizeof(float)));
  688. glEnableVertexAttribArray(RS::ARRAY_COLOR);
  689. }
  690. if (p_uvs) {
  691. glVertexAttribPointer(RS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, stride * sizeof(float), CAST_INT_TO_UCHAR_PTR(uv_offset * sizeof(float)));
  692. glEnableVertexAttribArray(RS::ARRAY_TEX_UV);
  693. }
  694. if (p_light_angles) {
  695. glVertexAttribPointer(RS::ARRAY_TANGENT, 1, GL_FLOAT, GL_FALSE, stride * sizeof(float), CAST_INT_TO_UCHAR_PTR(light_angle_offset * sizeof(float)));
  696. glEnableVertexAttribArray(RS::ARRAY_TANGENT);
  697. }
  698. glDrawArrays(prim[p_points], 0, p_points);
  699. storage->info.render._2d_draw_call_count++;
  700. if (p_light_angles) {
  701. // may not be needed
  702. glDisableVertexAttribArray(RS::ARRAY_TANGENT);
  703. }
  704. glBindBuffer(GL_ARRAY_BUFFER, 0);
  705. }
  706. void RasterizerCanvasBaseOpenGL::_copy_screen(const Rect2 &p_rect) {
  707. if (storage->frame.current_rt->flags[RendererStorage::RENDER_TARGET_DIRECT_TO_SCREEN]) {
  708. ERR_PRINT_ONCE("Cannot use screen texture copying in render target set to render direct to screen.");
  709. return;
  710. }
  711. 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.");
  712. glDisable(GL_BLEND);
  713. Vector2 wh(storage->frame.current_rt->width, storage->frame.current_rt->height);
  714. 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);
  715. if (p_rect != Rect2()) {
  716. storage->shaders.copy.set_conditional(CopyShaderOpenGL::USE_COPY_SECTION, true);
  717. }
  718. storage->shaders.copy.set_conditional(CopyShaderOpenGL::USE_NO_ALPHA, !state.using_transparent_rt);
  719. storage->bind_framebuffer(storage->frame.current_rt->copy_screen_effect.fbo);
  720. glActiveTexture(GL_TEXTURE0);
  721. glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->color);
  722. storage->shaders.copy.bind();
  723. storage->shaders.copy.set_uniform(CopyShaderOpenGL::COPY_SECTION, copy_section);
  724. const Vector2 vertpos[4] = {
  725. Vector2(-1, -1),
  726. Vector2(-1, 1),
  727. Vector2(1, 1),
  728. Vector2(1, -1),
  729. };
  730. const Vector2 uvpos[4] = {
  731. Vector2(0, 0),
  732. Vector2(0, 1),
  733. Vector2(1, 1),
  734. Vector2(1, 0)
  735. };
  736. const int indexpos[6] = {
  737. 0, 1, 2,
  738. 2, 3, 0
  739. };
  740. _draw_polygon(indexpos, 6, 4, vertpos, uvpos, NULL, false);
  741. storage->shaders.copy.set_conditional(CopyShaderOpenGL::USE_COPY_SECTION, false);
  742. storage->shaders.copy.set_conditional(CopyShaderOpenGL::USE_NO_ALPHA, false);
  743. storage->bind_framebuffer(storage->frame.current_rt->fbo);
  744. glEnable(GL_BLEND);
  745. }
  746. void RasterizerCanvasBaseOpenGL::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) {
  747. #if 0
  748. RasterizerStorageOpenGL::CanvasLightShadow *cls = storage->canvas_light_shadow_owner.get(p_buffer);
  749. ERR_FAIL_COND(!cls);
  750. glDisable(GL_BLEND);
  751. glDisable(GL_SCISSOR_TEST);
  752. glDisable(GL_DITHER);
  753. glDisable(GL_CULL_FACE);
  754. glDepthFunc(GL_LEQUAL);
  755. glEnable(GL_DEPTH_TEST);
  756. glDepthMask(true);
  757. glBindFramebuffer(GL_FRAMEBUFFER, cls->fbo);
  758. state.canvas_shadow_shader.set_conditional(CanvasShadowShaderOpenGL::USE_RGBA_SHADOWS, storage->config.use_rgba_2d_shadows);
  759. state.canvas_shadow_shader.bind();
  760. glViewport(0, 0, cls->size, cls->height);
  761. glClearDepth(1.0f);
  762. glClearColor(1, 1, 1, 1);
  763. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  764. RS::CanvasOccluderPolygonCullMode cull = RS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED;
  765. for (int i = 0; i < 4; i++) {
  766. //make sure it remains orthogonal, makes easy to read angle later
  767. Transform3D light;
  768. light.origin[0] = p_light_xform[2][0];
  769. light.origin[1] = p_light_xform[2][1];
  770. light.basis[0][0] = p_light_xform[0][0];
  771. light.basis[0][1] = p_light_xform[1][0];
  772. light.basis[1][0] = p_light_xform[0][1];
  773. light.basis[1][1] = p_light_xform[1][1];
  774. //light.basis.scale(Vector3(to_light.elements[0].length(),to_light.elements[1].length(),1));
  775. //p_near=1;
  776. CameraMatrix projection;
  777. {
  778. real_t fov = 90;
  779. real_t nearp = p_near;
  780. real_t farp = p_far;
  781. real_t aspect = 1.0;
  782. real_t ymax = nearp * Math::tan(Math::deg2rad(fov * 0.5));
  783. real_t ymin = -ymax;
  784. real_t xmin = ymin * aspect;
  785. real_t xmax = ymax * aspect;
  786. projection.set_frustum(xmin, xmax, ymin, ymax, nearp, farp);
  787. }
  788. Vector3 cam_target = Basis(Vector3(0, 0, Math_PI * 2 * (i / 4.0))).xform(Vector3(0, 1, 0));
  789. projection = projection * CameraMatrix(Transform3D().looking_at(cam_target, Vector3(0, 0, -1)).affine_inverse());
  790. state.canvas_shadow_shader.set_uniform(CanvasShadowShaderOpenGL::PROJECTION_MATRIX, projection);
  791. state.canvas_shadow_shader.set_uniform(CanvasShadowShaderOpenGL::LIGHT_MATRIX, light);
  792. state.canvas_shadow_shader.set_uniform(CanvasShadowShaderOpenGL::DISTANCE_NORM, 1.0 / p_far);
  793. if (i == 0)
  794. *p_xform_cache = projection;
  795. glViewport(0, (cls->height / 4) * i, cls->size, cls->height / 4);
  796. LightOccluderInstance *instance = p_occluders;
  797. while (instance) {
  798. RasterizerStorageOpenGL::CanvasOccluder *cc = storage->canvas_occluder_owner.get_or_null(instance->polygon_buffer);
  799. if (!cc || cc->len == 0 || !(p_light_mask & instance->light_mask)) {
  800. instance = instance->next;
  801. continue;
  802. }
  803. state.canvas_shadow_shader.set_uniform(CanvasShadowShaderOpenGL::WORLD_MATRIX, instance->xform_cache);
  804. RS::CanvasOccluderPolygonCullMode transformed_cull_cache = instance->cull_cache;
  805. if (transformed_cull_cache != RS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED &&
  806. (p_light_xform.basis_determinant() * instance->xform_cache.basis_determinant()) < 0) {
  807. transformed_cull_cache =
  808. transformed_cull_cache == RS::CANVAS_OCCLUDER_POLYGON_CULL_CLOCKWISE ?
  809. RS::CANVAS_OCCLUDER_POLYGON_CULL_COUNTER_CLOCKWISE :
  810. RS::CANVAS_OCCLUDER_POLYGON_CULL_CLOCKWISE;
  811. }
  812. if (cull != transformed_cull_cache) {
  813. cull = transformed_cull_cache;
  814. switch (cull) {
  815. case RS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED: {
  816. glDisable(GL_CULL_FACE);
  817. } break;
  818. case RS::CANVAS_OCCLUDER_POLYGON_CULL_CLOCKWISE: {
  819. glEnable(GL_CULL_FACE);
  820. glCullFace(GL_FRONT);
  821. } break;
  822. case RS::CANVAS_OCCLUDER_POLYGON_CULL_COUNTER_CLOCKWISE: {
  823. glEnable(GL_CULL_FACE);
  824. glCullFace(GL_BACK);
  825. } break;
  826. }
  827. }
  828. glBindBuffer(GL_ARRAY_BUFFER, cc->vertex_id);
  829. glEnableVertexAttribArray(RS::ARRAY_VERTEX);
  830. glVertexAttribPointer(RS::ARRAY_VERTEX, 3, GL_FLOAT, false, 0, 0);
  831. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cc->index_id);
  832. glDrawElements(GL_TRIANGLES, cc->len * 3, GL_UNSIGNED_SHORT, 0);
  833. instance = instance->next;
  834. }
  835. }
  836. glBindBuffer(GL_ARRAY_BUFFER, 0);
  837. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  838. #endif
  839. }
  840. void RasterizerCanvasBaseOpenGL::draw_lens_distortion_rect(const Rect2 &p_rect, float p_k1, float p_k2, const Vector2 &p_eye_center, float p_oversample) {
  841. Vector2 half_size;
  842. if (storage->frame.current_rt) {
  843. half_size = Vector2(storage->frame.current_rt->width, storage->frame.current_rt->height);
  844. } else {
  845. // half_size = OS::get_singleton()->get_window_size();
  846. half_size = Vector2(storage->_dims.win_width, storage->_dims.win_height);
  847. }
  848. half_size *= 0.5;
  849. Vector2 offset((p_rect.position.x - half_size.x) / half_size.x, (p_rect.position.y - half_size.y) / half_size.y);
  850. Vector2 scale(p_rect.size.x / half_size.x, p_rect.size.y / half_size.y);
  851. float aspect_ratio = p_rect.size.x / p_rect.size.y;
  852. // setup our lens shader
  853. state.lens_shader.bind();
  854. state.lens_shader.set_uniform(LensDistortedShaderOpenGL::OFFSET, offset);
  855. state.lens_shader.set_uniform(LensDistortedShaderOpenGL::SCALE, scale);
  856. state.lens_shader.set_uniform(LensDistortedShaderOpenGL::K1, p_k1);
  857. state.lens_shader.set_uniform(LensDistortedShaderOpenGL::K2, p_k2);
  858. state.lens_shader.set_uniform(LensDistortedShaderOpenGL::EYE_CENTER, p_eye_center);
  859. state.lens_shader.set_uniform(LensDistortedShaderOpenGL::UPSCALE, p_oversample);
  860. state.lens_shader.set_uniform(LensDistortedShaderOpenGL::ASPECT_RATIO, aspect_ratio);
  861. // bind our quad buffer
  862. _bind_quad_buffer();
  863. // and draw
  864. glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  865. // and cleanup
  866. glBindBuffer(GL_ARRAY_BUFFER, 0);
  867. for (int i = 0; i < RS::ARRAY_MAX; i++) {
  868. glDisableVertexAttribArray(i);
  869. }
  870. }
  871. void RasterizerCanvasBaseOpenGL::initialize() {
  872. bool flag_stream = false;
  873. //flag_stream = GLOBAL_GET("rendering/options/api_usage_legacy/flag_stream");
  874. if (flag_stream)
  875. _buffer_upload_usage_flag = GL_STREAM_DRAW;
  876. else
  877. _buffer_upload_usage_flag = GL_DYNAMIC_DRAW;
  878. // quad buffer
  879. {
  880. glGenBuffers(1, &data.canvas_quad_vertices);
  881. glBindBuffer(GL_ARRAY_BUFFER, data.canvas_quad_vertices);
  882. const float qv[8] = {
  883. 0, 0,
  884. 0, 1,
  885. 1, 1,
  886. 1, 0
  887. };
  888. glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 8, qv, GL_STATIC_DRAW);
  889. glBindBuffer(GL_ARRAY_BUFFER, 0);
  890. }
  891. // polygon buffer
  892. {
  893. uint32_t poly_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_buffer_size_kb", 128);
  894. 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"));
  895. poly_size = MAX(poly_size, 128); // minimum 2k, may still see anomalies in editor
  896. poly_size *= 1024;
  897. glGenBuffers(1, &data.polygon_buffer);
  898. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  899. glBufferData(GL_ARRAY_BUFFER, poly_size, NULL, GL_DYNAMIC_DRAW);
  900. data.polygon_buffer_size = poly_size;
  901. glBindBuffer(GL_ARRAY_BUFFER, 0);
  902. uint32_t index_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_index_buffer_size_kb", 128);
  903. 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"));
  904. index_size = MAX(index_size, 128);
  905. index_size *= 1024; // kb
  906. glGenBuffers(1, &data.polygon_index_buffer);
  907. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);
  908. glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_size, NULL, GL_DYNAMIC_DRAW);
  909. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  910. data.polygon_index_buffer_size = index_size;
  911. }
  912. // ninepatch buffers
  913. {
  914. // array buffer
  915. glGenBuffers(1, &data.ninepatch_vertices);
  916. glBindBuffer(GL_ARRAY_BUFFER, data.ninepatch_vertices);
  917. glBufferData(GL_ARRAY_BUFFER, sizeof(float) * (16 + 16) * 2, NULL, GL_DYNAMIC_DRAW);
  918. glBindBuffer(GL_ARRAY_BUFFER, 0);
  919. // element buffer
  920. glGenBuffers(1, &data.ninepatch_elements);
  921. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.ninepatch_elements);
  922. #define _EIDX(y, x) (y * 4 + x)
  923. uint8_t elems[3 * 2 * 9] = {
  924. // first row
  925. _EIDX(0, 0), _EIDX(0, 1), _EIDX(1, 1),
  926. _EIDX(1, 1), _EIDX(1, 0), _EIDX(0, 0),
  927. _EIDX(0, 1), _EIDX(0, 2), _EIDX(1, 2),
  928. _EIDX(1, 2), _EIDX(1, 1), _EIDX(0, 1),
  929. _EIDX(0, 2), _EIDX(0, 3), _EIDX(1, 3),
  930. _EIDX(1, 3), _EIDX(1, 2), _EIDX(0, 2),
  931. // second row
  932. _EIDX(1, 0), _EIDX(1, 1), _EIDX(2, 1),
  933. _EIDX(2, 1), _EIDX(2, 0), _EIDX(1, 0),
  934. // the center one would be here, but we'll put it at the end
  935. // so it's easier to disable the center and be able to use
  936. // one draw call for both
  937. _EIDX(1, 2), _EIDX(1, 3), _EIDX(2, 3),
  938. _EIDX(2, 3), _EIDX(2, 2), _EIDX(1, 2),
  939. // third row
  940. _EIDX(2, 0), _EIDX(2, 1), _EIDX(3, 1),
  941. _EIDX(3, 1), _EIDX(3, 0), _EIDX(2, 0),
  942. _EIDX(2, 1), _EIDX(2, 2), _EIDX(3, 2),
  943. _EIDX(3, 2), _EIDX(3, 1), _EIDX(2, 1),
  944. _EIDX(2, 2), _EIDX(2, 3), _EIDX(3, 3),
  945. _EIDX(3, 3), _EIDX(3, 2), _EIDX(2, 2),
  946. // center field
  947. _EIDX(1, 1), _EIDX(1, 2), _EIDX(2, 2),
  948. _EIDX(2, 2), _EIDX(2, 1), _EIDX(1, 1)
  949. };
  950. #undef _EIDX
  951. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elems), elems, GL_STATIC_DRAW);
  952. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  953. }
  954. state.canvas_shadow_shader.init();
  955. state.canvas_shader.init();
  956. _set_texture_rect_mode(true);
  957. state.canvas_shader.set_conditional(CanvasShaderOpenGL::USE_RGBA_SHADOWS, storage->config.use_rgba_2d_shadows);
  958. state.canvas_shader.bind();
  959. state.lens_shader.init();
  960. state.canvas_shader.set_conditional(CanvasShaderOpenGL::USE_PIXEL_SNAP, GLOBAL_DEF("rendering/quality/2d/use_pixel_snap", false));
  961. state.using_light = NULL;
  962. state.using_transparent_rt = false;
  963. state.using_skeleton = false;
  964. }
  965. RendererCanvasRender::PolygonID RasterizerCanvasBaseOpenGL::request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, const Vector<int> &p_bones, const Vector<float> &p_weights) {
  966. uint32_t id = _polydata.alloc();
  967. PolyData &pd = _polydata[id];
  968. pd.indices = p_indices;
  969. pd.points = p_points;
  970. pd.colors = p_colors;
  971. pd.uvs = p_uvs;
  972. return id;
  973. }
  974. void RasterizerCanvasBaseOpenGL::free_polygon(PolygonID p_polygon) {
  975. _polydata.free(p_polygon);
  976. }
  977. void RasterizerCanvasBaseOpenGL::finalize() {
  978. }
  979. RasterizerCanvasBaseOpenGL::RasterizerCanvasBaseOpenGL() {
  980. }
  981. #endif // OPENGL_BACKEND_ENABLED