rasterizer_canvas_gles3.cpp 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839
  1. /*************************************************************************/
  2. /* rasterizer_canvas_gles3.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2017 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_gles3.h"
  31. #include "os/os.h"
  32. #include "project_settings.h"
  33. #include "rasterizer_scene_gles3.h"
  34. #include "servers/visual/visual_server_raster.h"
  35. #ifndef GLES_OVER_GL
  36. #define glClearDepth glClearDepthf
  37. #endif
  38. static _FORCE_INLINE_ void store_transform2d(const Transform2D &p_mtx, float *p_array) {
  39. p_array[0] = p_mtx.elements[0][0];
  40. p_array[1] = p_mtx.elements[0][1];
  41. p_array[2] = 0;
  42. p_array[3] = 0;
  43. p_array[4] = p_mtx.elements[1][0];
  44. p_array[5] = p_mtx.elements[1][1];
  45. p_array[6] = 0;
  46. p_array[7] = 0;
  47. p_array[8] = 0;
  48. p_array[9] = 0;
  49. p_array[10] = 1;
  50. p_array[11] = 0;
  51. p_array[12] = p_mtx.elements[2][0];
  52. p_array[13] = p_mtx.elements[2][1];
  53. p_array[14] = 0;
  54. p_array[15] = 1;
  55. }
  56. static _FORCE_INLINE_ void store_transform(const Transform &p_mtx, float *p_array) {
  57. p_array[0] = p_mtx.basis.elements[0][0];
  58. p_array[1] = p_mtx.basis.elements[1][0];
  59. p_array[2] = p_mtx.basis.elements[2][0];
  60. p_array[3] = 0;
  61. p_array[4] = p_mtx.basis.elements[0][1];
  62. p_array[5] = p_mtx.basis.elements[1][1];
  63. p_array[6] = p_mtx.basis.elements[2][1];
  64. p_array[7] = 0;
  65. p_array[8] = p_mtx.basis.elements[0][2];
  66. p_array[9] = p_mtx.basis.elements[1][2];
  67. p_array[10] = p_mtx.basis.elements[2][2];
  68. p_array[11] = 0;
  69. p_array[12] = p_mtx.origin.x;
  70. p_array[13] = p_mtx.origin.y;
  71. p_array[14] = p_mtx.origin.z;
  72. p_array[15] = 1;
  73. }
  74. static _FORCE_INLINE_ void store_camera(const CameraMatrix &p_mtx, float *p_array) {
  75. for (int i = 0; i < 4; i++) {
  76. for (int j = 0; j < 4; j++) {
  77. p_array[i * 4 + j] = p_mtx.matrix[i][j];
  78. }
  79. }
  80. }
  81. RID RasterizerCanvasGLES3::light_internal_create() {
  82. LightInternal *li = memnew(LightInternal);
  83. glGenBuffers(1, &li->ubo);
  84. glBindBuffer(GL_UNIFORM_BUFFER, li->ubo);
  85. glBufferData(GL_UNIFORM_BUFFER, sizeof(LightInternal::UBOData), &state.canvas_item_ubo_data, GL_DYNAMIC_DRAW);
  86. glBindBuffer(GL_UNIFORM_BUFFER, 0);
  87. return light_internal_owner.make_rid(li);
  88. }
  89. void RasterizerCanvasGLES3::light_internal_update(RID p_rid, Light *p_light) {
  90. LightInternal *li = light_internal_owner.getornull(p_rid);
  91. ERR_FAIL_COND(!li);
  92. store_transform2d(p_light->light_shader_xform, li->ubo_data.light_matrix);
  93. store_transform2d(p_light->xform_cache.affine_inverse(), li->ubo_data.local_matrix);
  94. store_camera(p_light->shadow_matrix_cache, li->ubo_data.shadow_matrix);
  95. for (int i = 0; i < 4; i++) {
  96. li->ubo_data.color[i] = p_light->color[i] * p_light->energy;
  97. li->ubo_data.shadow_color[i] = p_light->shadow_color[i];
  98. }
  99. li->ubo_data.light_pos[0] = p_light->light_shader_pos.x;
  100. li->ubo_data.light_pos[1] = p_light->light_shader_pos.y;
  101. li->ubo_data.shadowpixel_size = (1.0 / p_light->shadow_buffer_size) * (1.0 + p_light->shadow_smooth);
  102. li->ubo_data.light_outside_alpha = p_light->mode == VS::CANVAS_LIGHT_MODE_MASK ? 1.0 : 0.0;
  103. li->ubo_data.light_height = p_light->height;
  104. if (p_light->radius_cache == 0)
  105. li->ubo_data.shadow_gradient = 0;
  106. else
  107. li->ubo_data.shadow_gradient = p_light->shadow_gradient_length / (p_light->radius_cache * 1.1);
  108. li->ubo_data.shadow_distance_mult = (p_light->radius_cache * 1.1);
  109. glBindBuffer(GL_UNIFORM_BUFFER, li->ubo);
  110. glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(LightInternal::UBOData), &li->ubo_data);
  111. glBindBuffer(GL_UNIFORM_BUFFER, 0);
  112. }
  113. void RasterizerCanvasGLES3::light_internal_free(RID p_rid) {
  114. LightInternal *li = light_internal_owner.getornull(p_rid);
  115. ERR_FAIL_COND(!li);
  116. glDeleteBuffers(1, &li->ubo);
  117. light_internal_owner.free(p_rid);
  118. memdelete(li);
  119. }
  120. void RasterizerCanvasGLES3::canvas_begin() {
  121. if (storage->frame.current_rt && storage->frame.clear_request) {
  122. // a clear request may be pending, so do it
  123. glClearColor(storage->frame.clear_request_color.r, storage->frame.clear_request_color.g, storage->frame.clear_request_color.b, storage->frame.clear_request_color.a);
  124. glClear(GL_COLOR_BUFFER_BIT);
  125. storage->frame.clear_request = false;
  126. }
  127. /*canvas_shader.unbind();
  128. canvas_shader.set_custom_shader(0);
  129. canvas_shader.set_conditional(CanvasShaderGLES2::USE_MODULATE,false);
  130. canvas_shader.bind();
  131. canvas_shader.set_uniform(CanvasShaderGLES2::TEXTURE, 0);
  132. canvas_use_modulate=false;*/
  133. reset_canvas();
  134. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_TEXTURE_RECT, true);
  135. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_LIGHTING, false);
  136. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_SHADOWS, false);
  137. state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_NEAREST, false);
  138. state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF5, false);
  139. state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF13, false);
  140. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_DISTANCE_FIELD, false);
  141. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_NINEPATCH, false);
  142. state.canvas_shader.set_custom_shader(0);
  143. state.canvas_shader.bind();
  144. state.canvas_shader.set_uniform(CanvasShaderGLES3::FINAL_MODULATE, Color(1, 1, 1, 1));
  145. state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX, Transform2D());
  146. state.canvas_shader.set_uniform(CanvasShaderGLES3::EXTRA_MATRIX, Transform2D());
  147. if (storage->frame.current_rt) {
  148. state.canvas_shader.set_uniform(CanvasShaderGLES3::SCREEN_PIXEL_SIZE, Vector2(1.0 / storage->frame.current_rt->width, 1.0 / storage->frame.current_rt->height));
  149. } else {
  150. state.canvas_shader.set_uniform(CanvasShaderGLES3::SCREEN_PIXEL_SIZE, Vector2(1.0, 1.0));
  151. }
  152. //state.canvas_shader.set_uniform(CanvasShaderGLES3::PROJECTION_MATRIX,state.vp);
  153. //state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX,Transform());
  154. //state.canvas_shader.set_uniform(CanvasShaderGLES3::EXTRA_MATRIX,Transform());
  155. glBindBufferBase(GL_UNIFORM_BUFFER, 0, state.canvas_item_ubo);
  156. glBindVertexArray(data.canvas_quad_array);
  157. state.using_texture_rect = true;
  158. state.using_ninepatch = false;
  159. }
  160. void RasterizerCanvasGLES3::canvas_end() {
  161. glBindVertexArray(0);
  162. glBindBufferBase(GL_UNIFORM_BUFFER, 0, 0);
  163. state.using_texture_rect = false;
  164. state.using_ninepatch = false;
  165. }
  166. RasterizerStorageGLES3::Texture *RasterizerCanvasGLES3::_bind_canvas_texture(const RID &p_texture, const RID &p_normal_map) {
  167. RasterizerStorageGLES3::Texture *tex_return = NULL;
  168. if (p_texture == state.current_tex) {
  169. tex_return = state.current_tex_ptr;
  170. } else if (p_texture.is_valid()) {
  171. RasterizerStorageGLES3::Texture *texture = storage->texture_owner.getornull(p_texture);
  172. if (!texture) {
  173. state.current_tex = RID();
  174. state.current_tex_ptr = NULL;
  175. glActiveTexture(GL_TEXTURE0);
  176. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  177. } else {
  178. if (texture->render_target)
  179. texture->render_target->used_in_frame = true;
  180. glActiveTexture(GL_TEXTURE0);
  181. glBindTexture(GL_TEXTURE_2D, texture->tex_id);
  182. state.current_tex = p_texture;
  183. state.current_tex_ptr = texture;
  184. tex_return = texture;
  185. }
  186. } else {
  187. glActiveTexture(GL_TEXTURE0);
  188. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  189. state.current_tex = RID();
  190. state.current_tex_ptr = NULL;
  191. }
  192. if (p_normal_map == state.current_normal) {
  193. //do none
  194. state.canvas_shader.set_uniform(CanvasShaderGLES3::USE_DEFAULT_NORMAL, state.current_normal.is_valid());
  195. } else if (p_normal_map.is_valid()) {
  196. RasterizerStorageGLES3::Texture *normal_map = storage->texture_owner.getornull(p_normal_map);
  197. if (!normal_map) {
  198. state.current_normal = RID();
  199. glActiveTexture(GL_TEXTURE1);
  200. glBindTexture(GL_TEXTURE_2D, storage->resources.normal_tex);
  201. state.canvas_shader.set_uniform(CanvasShaderGLES3::USE_DEFAULT_NORMAL, false);
  202. } else {
  203. glActiveTexture(GL_TEXTURE1);
  204. glBindTexture(GL_TEXTURE_2D, normal_map->tex_id);
  205. state.current_normal = p_normal_map;
  206. state.canvas_shader.set_uniform(CanvasShaderGLES3::USE_DEFAULT_NORMAL, true);
  207. }
  208. } else {
  209. state.current_normal = RID();
  210. glActiveTexture(GL_TEXTURE1);
  211. glBindTexture(GL_TEXTURE_2D, storage->resources.normal_tex);
  212. state.canvas_shader.set_uniform(CanvasShaderGLES3::USE_DEFAULT_NORMAL, false);
  213. }
  214. return tex_return;
  215. }
  216. void RasterizerCanvasGLES3::_set_texture_rect_mode(bool p_enable, bool p_ninepatch) {
  217. if (state.using_texture_rect == p_enable && state.using_ninepatch == p_ninepatch)
  218. return;
  219. if (p_enable) {
  220. glBindVertexArray(data.canvas_quad_array);
  221. } else {
  222. glBindVertexArray(0);
  223. glBindBuffer(GL_ARRAY_BUFFER, 0);
  224. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  225. }
  226. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_NINEPATCH, p_ninepatch && p_enable);
  227. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_TEXTURE_RECT, p_enable);
  228. state.canvas_shader.bind();
  229. state.canvas_shader.set_uniform(CanvasShaderGLES3::FINAL_MODULATE, state.canvas_item_modulate);
  230. state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX, state.final_transform);
  231. state.canvas_shader.set_uniform(CanvasShaderGLES3::EXTRA_MATRIX, state.extra_matrix);
  232. if (storage->frame.current_rt) {
  233. state.canvas_shader.set_uniform(CanvasShaderGLES3::SCREEN_PIXEL_SIZE, Vector2(1.0 / storage->frame.current_rt->width, 1.0 / storage->frame.current_rt->height));
  234. } else {
  235. state.canvas_shader.set_uniform(CanvasShaderGLES3::SCREEN_PIXEL_SIZE, Vector2(1.0, 1.0));
  236. }
  237. state.using_texture_rect = p_enable;
  238. state.using_ninepatch = p_ninepatch;
  239. }
  240. void RasterizerCanvasGLES3::_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) {
  241. glBindVertexArray(data.polygon_buffer_pointer_array);
  242. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  243. uint32_t buffer_ofs = 0;
  244. //vertex
  245. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_vertices);
  246. glEnableVertexAttribArray(VS::ARRAY_VERTEX);
  247. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, false, sizeof(Vector2), ((uint8_t *)0) + buffer_ofs);
  248. buffer_ofs += sizeof(Vector2) * p_vertex_count;
  249. //color
  250. if (p_singlecolor) {
  251. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  252. Color m = *p_colors;
  253. glVertexAttrib4f(VS::ARRAY_COLOR, m.r, m.g, m.b, m.a);
  254. } else if (!p_colors) {
  255. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  256. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
  257. } else {
  258. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Color) * p_vertex_count, p_colors);
  259. glEnableVertexAttribArray(VS::ARRAY_COLOR);
  260. glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, false, sizeof(Color), ((uint8_t *)0) + buffer_ofs);
  261. buffer_ofs += sizeof(Color) * p_vertex_count;
  262. }
  263. if (p_uvs) {
  264. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_uvs);
  265. glEnableVertexAttribArray(VS::ARRAY_TEX_UV);
  266. glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, false, sizeof(Vector2), ((uint8_t *)0) + buffer_ofs);
  267. buffer_ofs += sizeof(Vector2) * p_vertex_count;
  268. } else {
  269. glDisableVertexAttribArray(VS::ARRAY_TEX_UV);
  270. }
  271. //bind the indices buffer.
  272. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);
  273. glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(int) * p_index_count, p_indices);
  274. //draw the triangles.
  275. glDrawElements(GL_TRIANGLES, p_index_count, GL_UNSIGNED_INT, 0);
  276. storage->frame.canvas_draw_commands++;
  277. glBindVertexArray(0);
  278. }
  279. void RasterizerCanvasGLES3::_draw_generic(GLuint p_primitive, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor) {
  280. glBindVertexArray(data.polygon_buffer_pointer_array);
  281. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  282. uint32_t buffer_ofs = 0;
  283. //vertex
  284. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_vertices);
  285. glEnableVertexAttribArray(VS::ARRAY_VERTEX);
  286. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, false, sizeof(Vector2), ((uint8_t *)0) + buffer_ofs);
  287. buffer_ofs += sizeof(Vector2) * p_vertex_count;
  288. //color
  289. if (p_singlecolor) {
  290. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  291. Color m = *p_colors;
  292. glVertexAttrib4f(VS::ARRAY_COLOR, m.r, m.g, m.b, m.a);
  293. } else if (!p_colors) {
  294. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  295. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
  296. } else {
  297. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Color) * p_vertex_count, p_colors);
  298. glEnableVertexAttribArray(VS::ARRAY_COLOR);
  299. glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, false, sizeof(Color), ((uint8_t *)0) + buffer_ofs);
  300. buffer_ofs += sizeof(Color) * p_vertex_count;
  301. }
  302. if (p_uvs) {
  303. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_uvs);
  304. glEnableVertexAttribArray(VS::ARRAY_TEX_UV);
  305. glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, false, sizeof(Vector2), ((uint8_t *)0) + buffer_ofs);
  306. buffer_ofs += sizeof(Vector2) * p_vertex_count;
  307. } else {
  308. glDisableVertexAttribArray(VS::ARRAY_TEX_UV);
  309. }
  310. glDrawArrays(p_primitive, 0, p_vertex_count);
  311. storage->frame.canvas_draw_commands++;
  312. glBindVertexArray(0);
  313. }
  314. void RasterizerCanvasGLES3::_draw_gui_primitive(int p_points, const Vector2 *p_vertices, const Color *p_colors, const Vector2 *p_uvs) {
  315. static const GLenum prim[5] = { GL_POINTS, GL_POINTS, GL_LINES, GL_TRIANGLES, GL_TRIANGLE_FAN };
  316. //#define GLES_USE_PRIMITIVE_BUFFER
  317. int version = 0;
  318. int color_ofs = 0;
  319. int uv_ofs = 0;
  320. int stride = 2;
  321. if (p_colors) { //color
  322. version |= 1;
  323. color_ofs = stride;
  324. stride += 4;
  325. }
  326. if (p_uvs) { //uv
  327. version |= 2;
  328. uv_ofs = stride;
  329. stride += 2;
  330. }
  331. float b[(2 + 2 + 4) * 4];
  332. for (int i = 0; i < p_points; i++) {
  333. b[stride * i + 0] = p_vertices[i].x;
  334. b[stride * i + 1] = p_vertices[i].y;
  335. }
  336. if (p_colors) {
  337. for (int i = 0; i < p_points; i++) {
  338. b[stride * i + color_ofs + 0] = p_colors[i].r;
  339. b[stride * i + color_ofs + 1] = p_colors[i].g;
  340. b[stride * i + color_ofs + 2] = p_colors[i].b;
  341. b[stride * i + color_ofs + 3] = p_colors[i].a;
  342. }
  343. }
  344. if (p_uvs) {
  345. for (int i = 0; i < p_points; i++) {
  346. b[stride * i + uv_ofs + 0] = p_uvs[i].x;
  347. b[stride * i + uv_ofs + 1] = p_uvs[i].y;
  348. }
  349. }
  350. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  351. glBufferSubData(GL_ARRAY_BUFFER, 0, p_points * stride * 4, &b[0]);
  352. glBindVertexArray(data.polygon_buffer_quad_arrays[version]);
  353. glDrawArrays(prim[p_points], 0, p_points);
  354. glBindVertexArray(0);
  355. glBindBuffer(GL_ARRAY_BUFFER, 0);
  356. storage->frame.canvas_draw_commands++;
  357. }
  358. void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *current_clip, bool &reclip) {
  359. int cc = p_item->commands.size();
  360. Item::Command **commands = p_item->commands.ptr();
  361. for (int i = 0; i < cc; i++) {
  362. Item::Command *c = commands[i];
  363. switch (c->type) {
  364. case Item::Command::TYPE_LINE: {
  365. Item::CommandLine *line = static_cast<Item::CommandLine *>(c);
  366. _set_texture_rect_mode(false);
  367. _bind_canvas_texture(RID(), RID());
  368. glVertexAttrib4f(VS::ARRAY_COLOR, line->color.r, line->color.g, line->color.b, line->color.a);
  369. if (line->width <= 1) {
  370. Vector2 verts[2] = {
  371. Vector2(line->from.x, line->from.y),
  372. Vector2(line->to.x, line->to.y)
  373. };
  374. #ifdef GLES_OVER_GL
  375. if (line->antialiased)
  376. glEnable(GL_LINE_SMOOTH);
  377. #endif
  378. //glLineWidth(line->width);
  379. _draw_gui_primitive(2, verts, NULL, NULL);
  380. #ifdef GLES_OVER_GL
  381. if (line->antialiased)
  382. glDisable(GL_LINE_SMOOTH);
  383. #endif
  384. } else {
  385. //thicker line
  386. Vector2 t = (line->from - line->to).normalized().tangent() * line->width * 0.5;
  387. Vector2 verts[4] = {
  388. line->from - t,
  389. line->from + t,
  390. line->to + t,
  391. line->to - t,
  392. };
  393. //glLineWidth(line->width);
  394. _draw_gui_primitive(4, verts, NULL, NULL);
  395. #ifdef GLES_OVER_GL
  396. if (line->antialiased) {
  397. glEnable(GL_LINE_SMOOTH);
  398. for (int i = 0; i < 4; i++) {
  399. Vector2 vertsl[2] = {
  400. verts[i],
  401. verts[(i + 1) % 4],
  402. };
  403. _draw_gui_primitive(2, vertsl, NULL, NULL);
  404. }
  405. glDisable(GL_LINE_SMOOTH);
  406. }
  407. #endif
  408. }
  409. } break;
  410. case Item::Command::TYPE_POLYLINE: {
  411. Item::CommandPolyLine *pline = static_cast<Item::CommandPolyLine *>(c);
  412. _set_texture_rect_mode(false);
  413. _bind_canvas_texture(RID(), RID());
  414. if (pline->triangles.size()) {
  415. _draw_generic(GL_TRIANGLE_STRIP, pline->triangles.size(), pline->triangles.ptr(), NULL, pline->triangle_colors.ptr(), pline->triangle_colors.size() == 1);
  416. #ifdef GLES_OVER_GL
  417. glEnable(GL_LINE_SMOOTH);
  418. if (pline->lines.size()) {
  419. _draw_generic(GL_LINE_LOOP, pline->lines.size(), pline->lines.ptr(), NULL, pline->line_colors.ptr(), pline->line_colors.size() == 1);
  420. }
  421. glDisable(GL_LINE_SMOOTH);
  422. #endif
  423. } else {
  424. #ifdef GLES_OVER_GL
  425. if (pline->antialiased)
  426. glEnable(GL_LINE_SMOOTH);
  427. #endif
  428. _draw_generic(GL_LINE_STRIP, pline->lines.size(), pline->lines.ptr(), NULL, pline->line_colors.ptr(), pline->line_colors.size() == 1);
  429. #ifdef GLES_OVER_GL
  430. if (pline->antialiased)
  431. glDisable(GL_LINE_SMOOTH);
  432. #endif
  433. }
  434. } break;
  435. case Item::Command::TYPE_RECT: {
  436. Item::CommandRect *rect = static_cast<Item::CommandRect *>(c);
  437. _set_texture_rect_mode(true);
  438. //set color
  439. glVertexAttrib4f(VS::ARRAY_COLOR, rect->modulate.r, rect->modulate.g, rect->modulate.b, rect->modulate.a);
  440. RasterizerStorageGLES3::Texture *texture = _bind_canvas_texture(rect->texture, rect->normal_map);
  441. if (texture) {
  442. bool untile = false;
  443. if (rect->flags & CANVAS_RECT_TILE && !(texture->flags & VS::TEXTURE_FLAG_REPEAT)) {
  444. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  445. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  446. untile = true;
  447. }
  448. Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height);
  449. Rect2 src_rect = (rect->flags & CANVAS_RECT_REGION) ? Rect2(rect->source.position * texpixel_size, rect->source.size * texpixel_size) : Rect2(0, 0, 1, 1);
  450. Rect2 dst_rect = Rect2(rect->rect.position, rect->rect.size);
  451. if (dst_rect.size.width < 0) {
  452. dst_rect.position.x += dst_rect.size.width;
  453. dst_rect.size.width *= -1;
  454. }
  455. if (dst_rect.size.height < 0) {
  456. dst_rect.position.y += dst_rect.size.height;
  457. dst_rect.size.height *= -1;
  458. }
  459. if (rect->flags & CANVAS_RECT_FLIP_H) {
  460. src_rect.size.x *= -1;
  461. }
  462. if (rect->flags & CANVAS_RECT_FLIP_V) {
  463. src_rect.size.y *= -1;
  464. }
  465. if (rect->flags & CANVAS_RECT_TRANSPOSE) {
  466. dst_rect.size.x *= -1; // Encoding in the dst_rect.z uniform
  467. }
  468. state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size);
  469. state.canvas_shader.set_uniform(CanvasShaderGLES3::DST_RECT, Color(dst_rect.position.x, dst_rect.position.y, dst_rect.size.x, dst_rect.size.y));
  470. state.canvas_shader.set_uniform(CanvasShaderGLES3::SRC_RECT, Color(src_rect.position.x, src_rect.position.y, src_rect.size.x, src_rect.size.y));
  471. state.canvas_shader.set_uniform(CanvasShaderGLES3::CLIP_RECT_UV, (rect->flags & CANVAS_RECT_CLIP_UV) ? true : false);
  472. glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  473. if (untile) {
  474. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  475. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  476. }
  477. } else {
  478. Rect2 dst_rect = Rect2(rect->rect.position, rect->rect.size);
  479. if (dst_rect.size.width < 0) {
  480. dst_rect.position.x += dst_rect.size.width;
  481. dst_rect.size.width *= -1;
  482. }
  483. if (dst_rect.size.height < 0) {
  484. dst_rect.position.y += dst_rect.size.height;
  485. dst_rect.size.height *= -1;
  486. }
  487. state.canvas_shader.set_uniform(CanvasShaderGLES3::DST_RECT, Color(dst_rect.position.x, dst_rect.position.y, dst_rect.size.x, dst_rect.size.y));
  488. state.canvas_shader.set_uniform(CanvasShaderGLES3::SRC_RECT, Color(0, 0, 1, 1));
  489. state.canvas_shader.set_uniform(CanvasShaderGLES3::CLIP_RECT_UV, false);
  490. glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  491. }
  492. storage->frame.canvas_draw_commands++;
  493. } break;
  494. case Item::Command::TYPE_NINEPATCH: {
  495. Item::CommandNinePatch *np = static_cast<Item::CommandNinePatch *>(c);
  496. _set_texture_rect_mode(true, true);
  497. glVertexAttrib4f(VS::ARRAY_COLOR, np->color.r, np->color.g, np->color.b, np->color.a);
  498. RasterizerStorageGLES3::Texture *texture = _bind_canvas_texture(np->texture, np->normal_map);
  499. Size2 texpixel_size;
  500. if (!texture) {
  501. texpixel_size = Size2(1, 1);
  502. state.canvas_shader.set_uniform(CanvasShaderGLES3::SRC_RECT, Color(0, 0, 1, 1));
  503. } else {
  504. if (np->source != Rect2()) {
  505. texpixel_size = Size2(1.0 / np->source.size.width, 1.0 / np->source.size.height);
  506. state.canvas_shader.set_uniform(CanvasShaderGLES3::SRC_RECT, Color(np->source.position.x / texture->width, np->source.position.y / texture->height, np->source.size.x / texture->width, np->source.size.y / texture->height));
  507. } else {
  508. texpixel_size = Size2(1.0 / texture->width, 1.0 / texture->height);
  509. state.canvas_shader.set_uniform(CanvasShaderGLES3::SRC_RECT, Color(0, 0, 1, 1));
  510. }
  511. }
  512. state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size);
  513. state.canvas_shader.set_uniform(CanvasShaderGLES3::CLIP_RECT_UV, false);
  514. state.canvas_shader.set_uniform(CanvasShaderGLES3::NP_REPEAT_H, int(np->axis_x));
  515. state.canvas_shader.set_uniform(CanvasShaderGLES3::NP_REPEAT_V, int(np->axis_y));
  516. state.canvas_shader.set_uniform(CanvasShaderGLES3::NP_DRAW_CENTER, np->draw_center);
  517. state.canvas_shader.set_uniform(CanvasShaderGLES3::NP_MARGINS, Color(np->margin[MARGIN_LEFT], np->margin[MARGIN_TOP], np->margin[MARGIN_RIGHT], np->margin[MARGIN_BOTTOM]));
  518. state.canvas_shader.set_uniform(CanvasShaderGLES3::DST_RECT, Color(np->rect.position.x, np->rect.position.y, np->rect.size.x, np->rect.size.y));
  519. glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  520. storage->frame.canvas_draw_commands++;
  521. } break;
  522. case Item::Command::TYPE_PRIMITIVE: {
  523. Item::CommandPrimitive *primitive = static_cast<Item::CommandPrimitive *>(c);
  524. _set_texture_rect_mode(false);
  525. ERR_CONTINUE(primitive->points.size() < 1);
  526. RasterizerStorageGLES3::Texture *texture = _bind_canvas_texture(primitive->texture, primitive->normal_map);
  527. if (texture) {
  528. Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height);
  529. state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size);
  530. }
  531. if (primitive->colors.size() == 1 && primitive->points.size() > 1) {
  532. Color c = primitive->colors[0];
  533. glVertexAttrib4f(VS::ARRAY_COLOR, c.r, c.g, c.b, c.a);
  534. } else if (primitive->colors.empty()) {
  535. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
  536. }
  537. _draw_gui_primitive(primitive->points.size(), primitive->points.ptr(), primitive->colors.ptr(), primitive->uvs.ptr());
  538. } break;
  539. case Item::Command::TYPE_POLYGON: {
  540. Item::CommandPolygon *polygon = static_cast<Item::CommandPolygon *>(c);
  541. _set_texture_rect_mode(false);
  542. RasterizerStorageGLES3::Texture *texture = _bind_canvas_texture(polygon->texture, polygon->normal_map);
  543. if (texture) {
  544. Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height);
  545. state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size);
  546. }
  547. _draw_polygon(polygon->indices.ptr(), polygon->count, polygon->points.size(), polygon->points.ptr(), polygon->uvs.ptr(), polygon->colors.ptr(), polygon->colors.size() == 1);
  548. #ifdef GLES_OVER_GL
  549. if (polygon->antialiased) {
  550. glEnable(GL_LINE_SMOOTH);
  551. _draw_generic(GL_LINE_LOOP, polygon->points.size(), polygon->points.ptr(), polygon->uvs.ptr(), polygon->colors.ptr(), polygon->colors.size() == 1);
  552. glDisable(GL_LINE_SMOOTH);
  553. }
  554. #endif
  555. } break;
  556. case Item::Command::TYPE_PARTICLES: {
  557. Item::CommandParticles *particles_cmd = static_cast<Item::CommandParticles *>(c);
  558. RasterizerStorageGLES3::Particles *particles = storage->particles_owner.getornull(particles_cmd->particles);
  559. if (!particles)
  560. break;
  561. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1); //not used, so keep white
  562. VisualServerRaster::redraw_request();
  563. storage->particles_request_process(particles_cmd->particles);
  564. //enable instancing
  565. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCE_CUSTOM, true);
  566. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_PARTICLES, true);
  567. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCING, true);
  568. //reset shader and force rebind
  569. state.using_texture_rect = true;
  570. _set_texture_rect_mode(false);
  571. RasterizerStorageGLES3::Texture *texture = _bind_canvas_texture(particles_cmd->texture, particles_cmd->normal_map);
  572. if (texture) {
  573. Size2 texpixel_size(1.0 / (texture->width / particles_cmd->h_frames), 1.0 / (texture->height / particles_cmd->v_frames));
  574. state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size);
  575. } else {
  576. state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, Vector2(1.0, 1.0));
  577. }
  578. if (!particles->use_local_coords) {
  579. Transform2D inv_xf;
  580. inv_xf.set_axis(0, Vector2(particles->emission_transform.basis.get_axis(0).x, particles->emission_transform.basis.get_axis(0).y));
  581. inv_xf.set_axis(1, Vector2(particles->emission_transform.basis.get_axis(1).x, particles->emission_transform.basis.get_axis(1).y));
  582. inv_xf.set_origin(Vector2(particles->emission_transform.get_origin().x, particles->emission_transform.get_origin().y));
  583. inv_xf.affine_invert();
  584. state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX, state.final_transform * inv_xf);
  585. }
  586. state.canvas_shader.set_uniform(CanvasShaderGLES3::H_FRAMES, particles_cmd->h_frames);
  587. state.canvas_shader.set_uniform(CanvasShaderGLES3::V_FRAMES, particles_cmd->v_frames);
  588. glBindVertexArray(data.particle_quad_array); //use particle quad array
  589. glBindBuffer(GL_ARRAY_BUFFER, particles->particle_buffers[0]); //bind particle buffer
  590. int stride = sizeof(float) * 4 * 6;
  591. int amount = particles->amount;
  592. if (particles->draw_order != VS::PARTICLES_DRAW_ORDER_LIFETIME) {
  593. glEnableVertexAttribArray(8); //xform x
  594. glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 3);
  595. glVertexAttribDivisor(8, 1);
  596. glEnableVertexAttribArray(9); //xform y
  597. glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 4);
  598. glVertexAttribDivisor(9, 1);
  599. glEnableVertexAttribArray(10); //xform z
  600. glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 5);
  601. glVertexAttribDivisor(10, 1);
  602. glEnableVertexAttribArray(11); //color
  603. glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + 0);
  604. glVertexAttribDivisor(11, 1);
  605. glEnableVertexAttribArray(12); //custom
  606. glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 2);
  607. glVertexAttribDivisor(12, 1);
  608. glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, amount);
  609. } else {
  610. //split
  611. int stride = sizeof(float) * 4 * 6;
  612. int split = int(Math::ceil(particles->phase * particles->amount));
  613. if (amount - split > 0) {
  614. glEnableVertexAttribArray(8); //xform x
  615. glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + sizeof(float) * 4 * 3);
  616. glVertexAttribDivisor(8, 1);
  617. glEnableVertexAttribArray(9); //xform y
  618. glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + sizeof(float) * 4 * 4);
  619. glVertexAttribDivisor(9, 1);
  620. glEnableVertexAttribArray(10); //xform z
  621. glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + sizeof(float) * 4 * 5);
  622. glVertexAttribDivisor(10, 1);
  623. glEnableVertexAttribArray(11); //color
  624. glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + 0);
  625. glVertexAttribDivisor(11, 1);
  626. glEnableVertexAttribArray(12); //custom
  627. glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + sizeof(float) * 4 * 2);
  628. glVertexAttribDivisor(12, 1);
  629. glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, amount - split);
  630. }
  631. if (split > 0) {
  632. glEnableVertexAttribArray(8); //xform x
  633. glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 3);
  634. glVertexAttribDivisor(8, 1);
  635. glEnableVertexAttribArray(9); //xform y
  636. glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 4);
  637. glVertexAttribDivisor(9, 1);
  638. glEnableVertexAttribArray(10); //xform z
  639. glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 5);
  640. glVertexAttribDivisor(10, 1);
  641. glEnableVertexAttribArray(11); //color
  642. glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + 0);
  643. glVertexAttribDivisor(11, 1);
  644. glEnableVertexAttribArray(12); //custom
  645. glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 2);
  646. glVertexAttribDivisor(12, 1);
  647. glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, split);
  648. }
  649. }
  650. glBindVertexArray(0);
  651. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCE_CUSTOM, false);
  652. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCING, false);
  653. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_PARTICLES, false);
  654. state.using_texture_rect = true;
  655. _set_texture_rect_mode(false);
  656. } break;
  657. case Item::Command::TYPE_CIRCLE: {
  658. _set_texture_rect_mode(false);
  659. Item::CommandCircle *circle = static_cast<Item::CommandCircle *>(c);
  660. static const int numpoints = 32;
  661. Vector2 points[numpoints + 1];
  662. points[numpoints] = circle->pos;
  663. int indices[numpoints * 3];
  664. for (int i = 0; i < numpoints; i++) {
  665. points[i] = circle->pos + Vector2(Math::sin(i * Math_PI * 2.0 / numpoints), Math::cos(i * Math_PI * 2.0 / numpoints)) * circle->radius;
  666. indices[i * 3 + 0] = i;
  667. indices[i * 3 + 1] = (i + 1) % numpoints;
  668. indices[i * 3 + 2] = numpoints;
  669. }
  670. _bind_canvas_texture(RID(), RID());
  671. _draw_polygon(indices, numpoints * 3, numpoints + 1, points, NULL, &circle->color, true);
  672. //_draw_polygon(numpoints*3,indices,points,NULL,&circle->color,RID(),true);
  673. //canvas_draw_circle(circle->indices.size(),circle->indices.ptr(),circle->points.ptr(),circle->uvs.ptr(),circle->colors.ptr(),circle->texture,circle->colors.size()==1);
  674. } break;
  675. case Item::Command::TYPE_TRANSFORM: {
  676. Item::CommandTransform *transform = static_cast<Item::CommandTransform *>(c);
  677. state.extra_matrix = transform->xform;
  678. state.canvas_shader.set_uniform(CanvasShaderGLES3::EXTRA_MATRIX, state.extra_matrix);
  679. } break;
  680. case Item::Command::TYPE_CLIP_IGNORE: {
  681. Item::CommandClipIgnore *ci = static_cast<Item::CommandClipIgnore *>(c);
  682. if (current_clip) {
  683. if (ci->ignore != reclip) {
  684. if (ci->ignore) {
  685. glDisable(GL_SCISSOR_TEST);
  686. reclip = true;
  687. } else {
  688. glEnable(GL_SCISSOR_TEST);
  689. //glScissor(viewport.x+current_clip->final_clip_rect.pos.x,viewport.y+ (viewport.height-(current_clip->final_clip_rect.pos.y+current_clip->final_clip_rect.size.height)),
  690. //current_clip->final_clip_rect.size.width,current_clip->final_clip_rect.size.height);
  691. int x = current_clip->final_clip_rect.position.x;
  692. int y = storage->frame.current_rt->height - (current_clip->final_clip_rect.position.y + current_clip->final_clip_rect.size.y);
  693. int w = current_clip->final_clip_rect.size.x;
  694. int h = current_clip->final_clip_rect.size.y;
  695. glScissor(x, y, w, h);
  696. reclip = false;
  697. }
  698. }
  699. }
  700. } break;
  701. }
  702. }
  703. }
  704. #if 0
  705. void RasterizerGLES2::_canvas_item_setup_shader_params(ShaderMaterial *material,Shader* shader) {
  706. if (canvas_shader.bind())
  707. rebind_texpixel_size=true;
  708. if (material->shader_version!=shader->version) {
  709. //todo optimize uniforms
  710. material->shader_version=shader->version;
  711. }
  712. if (shader->has_texscreen && framebuffer.active) {
  713. int x = viewport.x;
  714. int y = window_size.height-(viewport.height+viewport.y);
  715. canvas_shader.set_uniform(CanvasShaderGLES2::TEXSCREEN_SCREEN_MULT,Vector2(float(viewport.width)/framebuffer.width,float(viewport.height)/framebuffer.height));
  716. canvas_shader.set_uniform(CanvasShaderGLES2::TEXSCREEN_SCREEN_CLAMP,Color(float(x)/framebuffer.width,float(y)/framebuffer.height,float(x+viewport.width)/framebuffer.width,float(y+viewport.height)/framebuffer.height));
  717. canvas_shader.set_uniform(CanvasShaderGLES2::TEXSCREEN_TEX,max_texture_units-1);
  718. glActiveTexture(GL_TEXTURE0+max_texture_units-1);
  719. glBindTexture(GL_TEXTURE_2D,framebuffer.sample_color);
  720. if (framebuffer.scale==1 && !canvas_texscreen_used) {
  721. #ifdef GLEW_ENABLED
  722. if (current_rt) {
  723. glReadBuffer(GL_COLOR_ATTACHMENT0);
  724. } else {
  725. glReadBuffer(GL_BACK);
  726. }
  727. #endif
  728. if (current_rt) {
  729. glCopyTexSubImage2D(GL_TEXTURE_2D,0,viewport.x,viewport.y,viewport.x,viewport.y,viewport.width,viewport.height);
  730. canvas_shader.set_uniform(CanvasShaderGLES2::TEXSCREEN_SCREEN_CLAMP,Color(float(x)/framebuffer.width,float(viewport.y)/framebuffer.height,float(x+viewport.width)/framebuffer.width,float(y+viewport.height)/framebuffer.height));
  731. //window_size.height-(viewport.height+viewport.y)
  732. } else {
  733. glCopyTexSubImage2D(GL_TEXTURE_2D,0,x,y,x,y,viewport.width,viewport.height);
  734. }
  735. canvas_texscreen_used=true;
  736. }
  737. glActiveTexture(GL_TEXTURE0);
  738. }
  739. if (shader->has_screen_uv) {
  740. canvas_shader.set_uniform(CanvasShaderGLES2::SCREEN_UV_MULT,Vector2(1.0/viewport.width,1.0/viewport.height));
  741. }
  742. uses_texpixel_size=shader->uses_texpixel_size;
  743. }
  744. #endif
  745. void RasterizerCanvasGLES3::_copy_texscreen(const Rect2 &p_rect) {
  746. glDisable(GL_BLEND);
  747. state.canvas_texscreen_used = true;
  748. //blur diffuse into effect mipmaps using separatable convolution
  749. //storage->shaders.copy.set_conditional(CopyShaderGLES3::GAUSSIAN_HORIZONTAL,true);
  750. Vector2 wh(storage->frame.current_rt->width, storage->frame.current_rt->height);
  751. Color blur_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);
  752. if (p_rect != Rect2()) {
  753. scene_render->state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::USE_BLUR_SECTION, true);
  754. storage->shaders.copy.set_conditional(CopyShaderGLES3::USE_COPY_SECTION, true);
  755. }
  756. glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[0].sizes[0].fbo);
  757. glActiveTexture(GL_TEXTURE0);
  758. glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->color);
  759. storage->shaders.copy.bind();
  760. storage->shaders.copy.set_uniform(CopyShaderGLES3::COPY_SECTION, blur_section);
  761. scene_render->_copy_screen();
  762. for (int i = 0; i < storage->frame.current_rt->effects.mip_maps[1].sizes.size(); i++) {
  763. int vp_w = storage->frame.current_rt->effects.mip_maps[1].sizes[i].width;
  764. int vp_h = storage->frame.current_rt->effects.mip_maps[1].sizes[i].height;
  765. glViewport(0, 0, vp_w, vp_h);
  766. //horizontal pass
  767. scene_render->state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_HORIZONTAL, true);
  768. scene_render->state.effect_blur_shader.bind();
  769. scene_render->state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::PIXEL_SIZE, Vector2(1.0 / vp_w, 1.0 / vp_h));
  770. scene_render->state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::LOD, float(i));
  771. scene_render->state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::BLUR_SECTION, blur_section);
  772. glActiveTexture(GL_TEXTURE0);
  773. glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.mip_maps[0].color); //previous level, since mipmaps[0] starts one level bigger
  774. glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[1].sizes[i].fbo);
  775. scene_render->_copy_screen();
  776. scene_render->state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_HORIZONTAL, false);
  777. //vertical pass
  778. scene_render->state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_VERTICAL, true);
  779. scene_render->state.effect_blur_shader.bind();
  780. scene_render->state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::PIXEL_SIZE, Vector2(1.0 / vp_w, 1.0 / vp_h));
  781. scene_render->state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::LOD, float(i));
  782. scene_render->state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::BLUR_SECTION, blur_section);
  783. glActiveTexture(GL_TEXTURE0);
  784. glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.mip_maps[1].color);
  785. glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[0].sizes[i + 1].fbo); //next level, since mipmaps[0] starts one level bigger
  786. scene_render->_copy_screen();
  787. scene_render->state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::GAUSSIAN_VERTICAL, false);
  788. }
  789. scene_render->state.effect_blur_shader.set_conditional(EffectBlurShaderGLES3::USE_BLUR_SECTION, false);
  790. storage->shaders.copy.set_conditional(CopyShaderGLES3::USE_COPY_SECTION, false);
  791. glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->fbo); //back to front
  792. glViewport(0, 0, storage->frame.current_rt->width, storage->frame.current_rt->height);
  793. state.canvas_shader.bind(); //back to canvas
  794. _bind_canvas_texture(state.current_tex, state.current_normal);
  795. if (state.using_texture_rect) {
  796. state.using_texture_rect = false;
  797. _set_texture_rect_mode(state.using_texture_rect, state.using_ninepatch);
  798. }
  799. glEnable(GL_BLEND);
  800. }
  801. void RasterizerCanvasGLES3::canvas_render_items(Item *p_item_list, int p_z, const Color &p_modulate, Light *p_light) {
  802. Item *current_clip = NULL;
  803. RasterizerStorageGLES3::Shader *shader_cache = NULL;
  804. bool rebind_shader = true;
  805. Size2 rt_size = Size2(storage->frame.current_rt->width, storage->frame.current_rt->height);
  806. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_DISTANCE_FIELD, false);
  807. glBindBuffer(GL_UNIFORM_BUFFER, state.canvas_item_ubo);
  808. glBufferData(GL_UNIFORM_BUFFER, sizeof(CanvasItemUBO), &state.canvas_item_ubo_data, GL_DYNAMIC_DRAW);
  809. glBindBuffer(GL_UNIFORM_BUFFER, 0);
  810. state.current_tex = RID();
  811. state.current_tex_ptr = NULL;
  812. state.current_normal = RID();
  813. glActiveTexture(GL_TEXTURE0);
  814. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  815. int last_blend_mode = -1;
  816. RID canvas_last_material;
  817. bool prev_distance_field = false;
  818. while (p_item_list) {
  819. Item *ci = p_item_list;
  820. if (prev_distance_field != ci->distance_field) {
  821. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_DISTANCE_FIELD, ci->distance_field);
  822. prev_distance_field = ci->distance_field;
  823. rebind_shader = true;
  824. }
  825. if (current_clip != ci->final_clip_owner) {
  826. current_clip = ci->final_clip_owner;
  827. //setup clip
  828. if (current_clip) {
  829. glEnable(GL_SCISSOR_TEST);
  830. glScissor(current_clip->final_clip_rect.position.x, (rt_size.height - (current_clip->final_clip_rect.position.y + current_clip->final_clip_rect.size.height)), current_clip->final_clip_rect.size.width, current_clip->final_clip_rect.size.height);
  831. } else {
  832. glDisable(GL_SCISSOR_TEST);
  833. }
  834. }
  835. if (ci->copy_back_buffer) {
  836. if (ci->copy_back_buffer->full) {
  837. _copy_texscreen(Rect2());
  838. } else {
  839. _copy_texscreen(ci->copy_back_buffer->rect);
  840. }
  841. }
  842. //begin rect
  843. Item *material_owner = ci->material_owner ? ci->material_owner : ci;
  844. RID material = material_owner->material;
  845. if (material != canvas_last_material || rebind_shader) {
  846. RasterizerStorageGLES3::Material *material_ptr = storage->material_owner.getornull(material);
  847. RasterizerStorageGLES3::Shader *shader_ptr = NULL;
  848. if (material_ptr) {
  849. shader_ptr = material_ptr->shader;
  850. if (shader_ptr && shader_ptr->mode != VS::SHADER_CANVAS_ITEM) {
  851. shader_ptr = NULL; //do not use non canvasitem shader
  852. }
  853. }
  854. if (shader_ptr && shader_ptr != shader_cache) {
  855. if (shader_ptr->canvas_item.uses_screen_texture && !state.canvas_texscreen_used) {
  856. //copy if not copied before
  857. _copy_texscreen(Rect2());
  858. }
  859. if (shader_ptr->canvas_item.uses_time) {
  860. VisualServerRaster::redraw_request();
  861. }
  862. state.canvas_shader.set_custom_shader(shader_ptr->custom_code_id);
  863. state.canvas_shader.bind();
  864. if (material_ptr->ubo_id) {
  865. glBindBufferBase(GL_UNIFORM_BUFFER, 2, material_ptr->ubo_id);
  866. }
  867. int tc = material_ptr->textures.size();
  868. RID *textures = material_ptr->textures.ptr();
  869. ShaderLanguage::ShaderNode::Uniform::Hint *texture_hints = shader_ptr->texture_hints.ptr();
  870. for (int i = 0; i < tc; i++) {
  871. glActiveTexture(GL_TEXTURE2 + i);
  872. RasterizerStorageGLES3::Texture *t = storage->texture_owner.getornull(textures[i]);
  873. if (!t) {
  874. switch (texture_hints[i]) {
  875. case ShaderLanguage::ShaderNode::Uniform::HINT_BLACK_ALBEDO:
  876. case ShaderLanguage::ShaderNode::Uniform::HINT_BLACK: {
  877. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  878. } break;
  879. case ShaderLanguage::ShaderNode::Uniform::HINT_ANISO: {
  880. glBindTexture(GL_TEXTURE_2D, storage->resources.aniso_tex);
  881. } break;
  882. case ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL: {
  883. glBindTexture(GL_TEXTURE_2D, storage->resources.normal_tex);
  884. } break;
  885. default: {
  886. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  887. } break;
  888. }
  889. //check hints
  890. continue;
  891. }
  892. if (storage->config.srgb_decode_supported && t->using_srgb) {
  893. //no srgb in 2D
  894. glTexParameteri(t->target, _TEXTURE_SRGB_DECODE_EXT, _SKIP_DECODE_EXT);
  895. t->using_srgb = false;
  896. }
  897. glBindTexture(t->target, t->tex_id);
  898. }
  899. } else if (!shader_ptr) {
  900. state.canvas_shader.set_custom_shader(0);
  901. state.canvas_shader.bind();
  902. }
  903. shader_cache = shader_ptr;
  904. canvas_last_material = material;
  905. rebind_shader = false;
  906. }
  907. int blend_mode = shader_cache ? shader_cache->canvas_item.blend_mode : RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_MIX;
  908. bool unshaded = shader_cache && (shader_cache->canvas_item.light_mode == RasterizerStorageGLES3::Shader::CanvasItem::LIGHT_MODE_UNSHADED || blend_mode != RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_MIX);
  909. bool reclip = false;
  910. if (last_blend_mode != blend_mode) {
  911. switch (blend_mode) {
  912. case RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_MIX: {
  913. glBlendEquation(GL_FUNC_ADD);
  914. if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
  915. glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
  916. } else {
  917. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  918. }
  919. } break;
  920. case RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_ADD: {
  921. glBlendEquation(GL_FUNC_ADD);
  922. glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  923. } break;
  924. case RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_SUB: {
  925. glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
  926. glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  927. } break;
  928. case RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_MUL: {
  929. glBlendEquation(GL_FUNC_ADD);
  930. glBlendFunc(GL_DST_COLOR, GL_ZERO);
  931. } break;
  932. case RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_PMALPHA: {
  933. glBlendEquation(GL_FUNC_ADD);
  934. glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
  935. } break;
  936. }
  937. last_blend_mode = blend_mode;
  938. }
  939. state.canvas_item_modulate = unshaded ? ci->final_modulate : Color(ci->final_modulate.r * p_modulate.r, ci->final_modulate.g * p_modulate.g, ci->final_modulate.b * p_modulate.b, ci->final_modulate.a * p_modulate.a);
  940. state.final_transform = ci->final_transform;
  941. state.extra_matrix = Transform2D();
  942. state.canvas_shader.set_uniform(CanvasShaderGLES3::FINAL_MODULATE, state.canvas_item_modulate);
  943. state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX, state.final_transform);
  944. state.canvas_shader.set_uniform(CanvasShaderGLES3::EXTRA_MATRIX, state.extra_matrix);
  945. if (storage->frame.current_rt) {
  946. state.canvas_shader.set_uniform(CanvasShaderGLES3::SCREEN_PIXEL_SIZE, Vector2(1.0 / storage->frame.current_rt->width, 1.0 / storage->frame.current_rt->height));
  947. } else {
  948. state.canvas_shader.set_uniform(CanvasShaderGLES3::SCREEN_PIXEL_SIZE, Vector2(1.0, 1.0));
  949. }
  950. if (unshaded || (state.canvas_item_modulate.a > 0.001 && (!shader_cache || shader_cache->canvas_item.light_mode != RasterizerStorageGLES3::Shader::CanvasItem::LIGHT_MODE_LIGHT_ONLY) && !ci->light_masked))
  951. _canvas_item_render_commands(ci, current_clip, reclip);
  952. if ((blend_mode == RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_MIX || blend_mode == RasterizerStorageGLES3::Shader::CanvasItem::BLEND_MODE_PMALPHA) && p_light && !unshaded) {
  953. Light *light = p_light;
  954. bool light_used = false;
  955. VS::CanvasLightMode mode = VS::CANVAS_LIGHT_MODE_ADD;
  956. state.canvas_item_modulate = ci->final_modulate; // remove the canvas modulate
  957. while (light) {
  958. if (ci->light_mask & light->item_mask && p_z >= light->z_min && p_z <= light->z_max && ci->global_rect_cache.intersects_transformed(light->xform_cache, light->rect_cache)) {
  959. //intersects this light
  960. if (!light_used || mode != light->mode) {
  961. mode = light->mode;
  962. switch (mode) {
  963. case VS::CANVAS_LIGHT_MODE_ADD: {
  964. glBlendEquation(GL_FUNC_ADD);
  965. glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  966. } break;
  967. case VS::CANVAS_LIGHT_MODE_SUB: {
  968. glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
  969. glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  970. } break;
  971. case VS::CANVAS_LIGHT_MODE_MIX:
  972. case VS::CANVAS_LIGHT_MODE_MASK: {
  973. glBlendEquation(GL_FUNC_ADD);
  974. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  975. } break;
  976. }
  977. }
  978. if (!light_used) {
  979. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_LIGHTING, true);
  980. light_used = true;
  981. }
  982. bool has_shadow = light->shadow_buffer.is_valid() && ci->light_mask & light->item_shadow_mask;
  983. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_SHADOWS, has_shadow);
  984. if (has_shadow) {
  985. state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_USE_GRADIENT, light->shadow_gradient_length > 0);
  986. switch (light->shadow_filter) {
  987. case VS::CANVAS_LIGHT_FILTER_NONE: state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_NEAREST, true); break;
  988. case VS::CANVAS_LIGHT_FILTER_PCF3: state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF3, true); break;
  989. case VS::CANVAS_LIGHT_FILTER_PCF5: state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF5, true); break;
  990. case VS::CANVAS_LIGHT_FILTER_PCF7: state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF7, true); break;
  991. case VS::CANVAS_LIGHT_FILTER_PCF9: state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF9, true); break;
  992. case VS::CANVAS_LIGHT_FILTER_PCF13: state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF13, true); break;
  993. }
  994. }
  995. bool light_rebind = state.canvas_shader.bind();
  996. if (light_rebind) {
  997. state.canvas_shader.set_uniform(CanvasShaderGLES3::FINAL_MODULATE, state.canvas_item_modulate);
  998. state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX, state.final_transform);
  999. state.canvas_shader.set_uniform(CanvasShaderGLES3::EXTRA_MATRIX, Transform2D());
  1000. }
  1001. glBindBufferBase(GL_UNIFORM_BUFFER, 1, static_cast<LightInternal *>(light->light_internal.get_data())->ubo);
  1002. if (has_shadow) {
  1003. RasterizerStorageGLES3::CanvasLightShadow *cls = storage->canvas_light_shadow_owner.get(light->shadow_buffer);
  1004. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 2);
  1005. glBindTexture(GL_TEXTURE_2D, cls->distance);
  1006. /*canvas_shader.set_uniform(CanvasShaderGLES3::SHADOW_MATRIX,light->shadow_matrix_cache);
  1007. canvas_shader.set_uniform(CanvasShaderGLES3::SHADOW_ESM_MULTIPLIER,light->shadow_esm_mult);
  1008. canvas_shader.set_uniform(CanvasShaderGLES3::LIGHT_SHADOW_COLOR,light->shadow_color);*/
  1009. }
  1010. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 1);
  1011. RasterizerStorageGLES3::Texture *t = storage->texture_owner.getornull(light->texture);
  1012. if (!t) {
  1013. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  1014. } else {
  1015. glBindTexture(t->target, t->tex_id);
  1016. }
  1017. glActiveTexture(GL_TEXTURE0);
  1018. _canvas_item_render_commands(ci, current_clip, reclip); //redraw using light
  1019. }
  1020. light = light->next_ptr;
  1021. }
  1022. if (light_used) {
  1023. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_LIGHTING, false);
  1024. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_SHADOWS, false);
  1025. state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_NEAREST, false);
  1026. state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF3, false);
  1027. state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF5, false);
  1028. state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF7, false);
  1029. state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF9, false);
  1030. state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF13, false);
  1031. state.canvas_shader.bind();
  1032. last_blend_mode = -1;
  1033. /*
  1034. //this is set again, so it should not be needed anyway?
  1035. state.canvas_item_modulate = unshaded ? ci->final_modulate : Color(
  1036. ci->final_modulate.r * p_modulate.r,
  1037. ci->final_modulate.g * p_modulate.g,
  1038. ci->final_modulate.b * p_modulate.b,
  1039. ci->final_modulate.a * p_modulate.a );
  1040. state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX,state.final_transform);
  1041. state.canvas_shader.set_uniform(CanvasShaderGLES3::EXTRA_MATRIX,Transform2D());
  1042. state.canvas_shader.set_uniform(CanvasShaderGLES3::FINAL_MODULATE,state.canvas_item_modulate);
  1043. glBlendEquation(GL_FUNC_ADD);
  1044. if (storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
  1045. glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
  1046. } else {
  1047. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  1048. }
  1049. //@TODO RESET canvas_blend_mode
  1050. */
  1051. }
  1052. }
  1053. if (reclip) {
  1054. glEnable(GL_SCISSOR_TEST);
  1055. glScissor(current_clip->final_clip_rect.position.x, (rt_size.height - (current_clip->final_clip_rect.position.y + current_clip->final_clip_rect.size.height)), current_clip->final_clip_rect.size.width, current_clip->final_clip_rect.size.height);
  1056. }
  1057. p_item_list = p_item_list->next;
  1058. }
  1059. if (current_clip) {
  1060. glDisable(GL_SCISSOR_TEST);
  1061. }
  1062. }
  1063. void RasterizerCanvasGLES3::canvas_debug_viewport_shadows(Light *p_lights_with_shadow) {
  1064. Light *light = p_lights_with_shadow;
  1065. canvas_begin(); //reset
  1066. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
  1067. int h = 10;
  1068. int w = storage->frame.current_rt->width;
  1069. int ofs = h;
  1070. glDisable(GL_BLEND);
  1071. //print_line(" debug lights ");
  1072. while (light) {
  1073. //print_line("debug light");
  1074. if (light->shadow_buffer.is_valid()) {
  1075. //print_line("sb is valid");
  1076. RasterizerStorageGLES3::CanvasLightShadow *sb = storage->canvas_light_shadow_owner.get(light->shadow_buffer);
  1077. if (sb) {
  1078. glBindTexture(GL_TEXTURE_2D, sb->distance);
  1079. //glBindTexture(GL_TEXTURE_2D,storage->resources.white_tex);
  1080. draw_generic_textured_rect(Rect2(h, ofs, w - h * 2, h), Rect2(0, 0, 1, 1));
  1081. ofs += h * 2;
  1082. }
  1083. }
  1084. light = light->shadows_next_ptr;
  1085. }
  1086. }
  1087. void RasterizerCanvasGLES3::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) {
  1088. RasterizerStorageGLES3::CanvasLightShadow *cls = storage->canvas_light_shadow_owner.get(p_buffer);
  1089. ERR_FAIL_COND(!cls);
  1090. glDisable(GL_BLEND);
  1091. glDisable(GL_SCISSOR_TEST);
  1092. glDisable(GL_DITHER);
  1093. glDisable(GL_CULL_FACE);
  1094. glDepthFunc(GL_LEQUAL);
  1095. glEnable(GL_DEPTH_TEST);
  1096. glDepthMask(true);
  1097. glBindFramebuffer(GL_FRAMEBUFFER, cls->fbo);
  1098. state.canvas_shadow_shader.bind();
  1099. glViewport(0, 0, cls->size, cls->height);
  1100. glClearDepth(1.0f);
  1101. glClearColor(1, 1, 1, 1);
  1102. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  1103. VS::CanvasOccluderPolygonCullMode cull = VS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED;
  1104. for (int i = 0; i < 4; i++) {
  1105. //make sure it remains orthogonal, makes easy to read angle later
  1106. Transform light;
  1107. light.origin[0] = p_light_xform[2][0];
  1108. light.origin[1] = p_light_xform[2][1];
  1109. light.basis[0][0] = p_light_xform[0][0];
  1110. light.basis[0][1] = p_light_xform[1][0];
  1111. light.basis[1][0] = p_light_xform[0][1];
  1112. light.basis[1][1] = p_light_xform[1][1];
  1113. //light.basis.scale(Vector3(to_light.elements[0].length(),to_light.elements[1].length(),1));
  1114. //p_near=1;
  1115. CameraMatrix projection;
  1116. {
  1117. real_t fov = 90;
  1118. real_t nearp = p_near;
  1119. real_t farp = p_far;
  1120. real_t aspect = 1.0;
  1121. real_t ymax = nearp * Math::tan(Math::deg2rad(fov * 0.5));
  1122. real_t ymin = -ymax;
  1123. real_t xmin = ymin * aspect;
  1124. real_t xmax = ymax * aspect;
  1125. projection.set_frustum(xmin, xmax, ymin, ymax, nearp, farp);
  1126. }
  1127. Vector3 cam_target = Basis(Vector3(0, 0, Math_PI * 2 * (i / 4.0))).xform(Vector3(0, 1, 0));
  1128. projection = projection * CameraMatrix(Transform().looking_at(cam_target, Vector3(0, 0, -1)).affine_inverse());
  1129. state.canvas_shadow_shader.set_uniform(CanvasShadowShaderGLES3::PROJECTION_MATRIX, projection);
  1130. state.canvas_shadow_shader.set_uniform(CanvasShadowShaderGLES3::LIGHT_MATRIX, light);
  1131. state.canvas_shadow_shader.set_uniform(CanvasShadowShaderGLES3::DISTANCE_NORM, 1.0 / p_far);
  1132. if (i == 0)
  1133. *p_xform_cache = projection;
  1134. glViewport(0, (cls->height / 4) * i, cls->size, cls->height / 4);
  1135. LightOccluderInstance *instance = p_occluders;
  1136. while (instance) {
  1137. RasterizerStorageGLES3::CanvasOccluder *cc = storage->canvas_occluder_owner.get(instance->polygon_buffer);
  1138. if (!cc || cc->len == 0 || !(p_light_mask & instance->light_mask)) {
  1139. instance = instance->next;
  1140. continue;
  1141. }
  1142. state.canvas_shadow_shader.set_uniform(CanvasShadowShaderGLES3::WORLD_MATRIX, instance->xform_cache);
  1143. if (cull != instance->cull_cache) {
  1144. cull = instance->cull_cache;
  1145. switch (cull) {
  1146. case VS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED: {
  1147. glDisable(GL_CULL_FACE);
  1148. } break;
  1149. case VS::CANVAS_OCCLUDER_POLYGON_CULL_CLOCKWISE: {
  1150. glEnable(GL_CULL_FACE);
  1151. glCullFace(GL_FRONT);
  1152. } break;
  1153. case VS::CANVAS_OCCLUDER_POLYGON_CULL_COUNTER_CLOCKWISE: {
  1154. glEnable(GL_CULL_FACE);
  1155. glCullFace(GL_BACK);
  1156. } break;
  1157. }
  1158. }
  1159. /*
  1160. if (i==0) {
  1161. for(int i=0;i<cc->lines.size();i++) {
  1162. Vector2 p = instance->xform_cache.xform(cc->lines.get(i));
  1163. Plane pp(Vector3(p.x,p.y,0),1);
  1164. pp.normal = light.xform(pp.normal);
  1165. pp = projection.xform4(pp);
  1166. print_line(itos(i)+": "+pp.normal/pp.d);
  1167. //pp=light_mat.xform4(pp);
  1168. //print_line(itos(i)+": "+pp.normal/pp.d);
  1169. }
  1170. }
  1171. */
  1172. glBindVertexArray(cc->array_id);
  1173. glDrawElements(GL_TRIANGLES, cc->len * 3, GL_UNSIGNED_SHORT, 0);
  1174. instance = instance->next;
  1175. }
  1176. }
  1177. glBindVertexArray(0);
  1178. }
  1179. void RasterizerCanvasGLES3::reset_canvas() {
  1180. if (storage->frame.current_rt) {
  1181. glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->fbo);
  1182. glColorMask(1, 1, 1, 1); //don't touch alpha
  1183. }
  1184. glBindVertexArray(0);
  1185. glDisable(GL_CULL_FACE);
  1186. glDisable(GL_DEPTH_TEST);
  1187. glDisable(GL_SCISSOR_TEST);
  1188. glDisable(GL_DITHER);
  1189. glEnable(GL_BLEND);
  1190. glBlendEquation(GL_FUNC_ADD);
  1191. if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
  1192. glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
  1193. } else {
  1194. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  1195. }
  1196. //glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  1197. //glLineWidth(1.0);
  1198. glBindBuffer(GL_ARRAY_BUFFER, 0);
  1199. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  1200. //use for reading from screen
  1201. if (storage->frame.current_rt) {
  1202. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 3);
  1203. glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.mip_maps[0].color);
  1204. }
  1205. glActiveTexture(GL_TEXTURE0);
  1206. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  1207. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
  1208. Transform canvas_transform;
  1209. if (storage->frame.current_rt) {
  1210. float csy = 1.0;
  1211. if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_VFLIP]) {
  1212. csy = -1.0;
  1213. }
  1214. canvas_transform.translate(-(storage->frame.current_rt->width / 2.0f), -(storage->frame.current_rt->height / 2.0f), 0.0f);
  1215. canvas_transform.scale(Vector3(2.0f / storage->frame.current_rt->width, csy * -2.0f / storage->frame.current_rt->height, 1.0f));
  1216. } else {
  1217. Vector2 ssize = OS::get_singleton()->get_window_size();
  1218. canvas_transform.translate(-(ssize.width / 2.0f), -(ssize.height / 2.0f), 0.0f);
  1219. canvas_transform.scale(Vector3(2.0f / ssize.width, -2.0f / ssize.height, 1.0f));
  1220. }
  1221. state.vp = canvas_transform;
  1222. store_transform(canvas_transform, state.canvas_item_ubo_data.projection_matrix);
  1223. state.canvas_item_ubo_data.time = storage->frame.time[0];
  1224. glBindBuffer(GL_UNIFORM_BUFFER, state.canvas_item_ubo);
  1225. glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(CanvasItemUBO), &state.canvas_item_ubo_data);
  1226. glBindBuffer(GL_UNIFORM_BUFFER, 0);
  1227. state.canvas_texscreen_used = false;
  1228. }
  1229. void RasterizerCanvasGLES3::draw_generic_textured_rect(const Rect2 &p_rect, const Rect2 &p_src) {
  1230. state.canvas_shader.set_uniform(CanvasShaderGLES3::DST_RECT, Color(p_rect.position.x, p_rect.position.y, p_rect.size.x, p_rect.size.y));
  1231. state.canvas_shader.set_uniform(CanvasShaderGLES3::SRC_RECT, Color(p_src.position.x, p_src.position.y, p_src.size.x, p_src.size.y));
  1232. state.canvas_shader.set_uniform(CanvasShaderGLES3::CLIP_RECT_UV, false);
  1233. glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  1234. }
  1235. void RasterizerCanvasGLES3::draw_window_margins(int *black_margin, RID *black_image) {
  1236. Vector2 window_size = OS::get_singleton()->get_window_size();
  1237. int window_h = window_size.height;
  1238. int window_w = window_size.width;
  1239. glBindFramebuffer(GL_FRAMEBUFFER, storage->system_fbo);
  1240. glViewport(0, 0, window_size.width, window_size.height);
  1241. canvas_begin();
  1242. if (black_image[MARGIN_LEFT].is_valid()) {
  1243. _bind_canvas_texture(black_image[MARGIN_LEFT], RID());
  1244. Size2 sz(storage->texture_get_width(black_image[MARGIN_LEFT]), storage->texture_get_height(black_image[MARGIN_LEFT]));
  1245. draw_generic_textured_rect(Rect2(0, 0, black_margin[MARGIN_LEFT], window_h), Rect2(0, 0, sz.x, sz.y));
  1246. } else if (black_margin[MARGIN_LEFT]) {
  1247. glActiveTexture(GL_TEXTURE0);
  1248. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  1249. draw_generic_textured_rect(Rect2(0, 0, black_margin[MARGIN_LEFT], window_h), Rect2(0, 0, 1, 1));
  1250. }
  1251. if (black_image[MARGIN_RIGHT].is_valid()) {
  1252. _bind_canvas_texture(black_image[MARGIN_RIGHT], RID());
  1253. Size2 sz(storage->texture_get_width(black_image[MARGIN_RIGHT]), storage->texture_get_height(black_image[MARGIN_RIGHT]));
  1254. draw_generic_textured_rect(Rect2(window_w - black_margin[MARGIN_RIGHT], 0, black_margin[MARGIN_RIGHT], window_h), Rect2(0, 0, sz.x, sz.y));
  1255. } else if (black_margin[MARGIN_RIGHT]) {
  1256. glActiveTexture(GL_TEXTURE0);
  1257. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  1258. draw_generic_textured_rect(Rect2(window_w - black_margin[MARGIN_RIGHT], 0, black_margin[MARGIN_RIGHT], window_h), Rect2(0, 0, 1, 1));
  1259. }
  1260. if (black_image[MARGIN_TOP].is_valid()) {
  1261. _bind_canvas_texture(black_image[MARGIN_TOP], RID());
  1262. Size2 sz(storage->texture_get_width(black_image[MARGIN_TOP]), storage->texture_get_height(black_image[MARGIN_TOP]));
  1263. draw_generic_textured_rect(Rect2(0, 0, window_w, black_margin[MARGIN_TOP]), Rect2(0, 0, sz.x, sz.y));
  1264. } else if (black_margin[MARGIN_TOP]) {
  1265. glActiveTexture(GL_TEXTURE0);
  1266. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  1267. draw_generic_textured_rect(Rect2(0, 0, window_w, black_margin[MARGIN_TOP]), Rect2(0, 0, 1, 1));
  1268. }
  1269. if (black_image[MARGIN_BOTTOM].is_valid()) {
  1270. _bind_canvas_texture(black_image[MARGIN_BOTTOM], RID());
  1271. Size2 sz(storage->texture_get_width(black_image[MARGIN_BOTTOM]), storage->texture_get_height(black_image[MARGIN_BOTTOM]));
  1272. draw_generic_textured_rect(Rect2(0, window_h - black_margin[MARGIN_BOTTOM], window_w, black_margin[MARGIN_BOTTOM]), Rect2(0, 0, sz.x, sz.y));
  1273. } else if (black_margin[MARGIN_BOTTOM]) {
  1274. glActiveTexture(GL_TEXTURE0);
  1275. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  1276. draw_generic_textured_rect(Rect2(0, window_h - black_margin[MARGIN_BOTTOM], window_w, black_margin[MARGIN_BOTTOM]), Rect2(0, 0, 1, 1));
  1277. }
  1278. }
  1279. void RasterizerCanvasGLES3::initialize() {
  1280. {
  1281. //quad buffers
  1282. glGenBuffers(1, &data.canvas_quad_vertices);
  1283. glBindBuffer(GL_ARRAY_BUFFER, data.canvas_quad_vertices);
  1284. {
  1285. const float qv[8] = {
  1286. 0, 0,
  1287. 0, 1,
  1288. 1, 1,
  1289. 1, 0
  1290. };
  1291. glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 8, qv, GL_STATIC_DRAW);
  1292. }
  1293. glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind
  1294. glGenVertexArrays(1, &data.canvas_quad_array);
  1295. glBindVertexArray(data.canvas_quad_array);
  1296. glBindBuffer(GL_ARRAY_BUFFER, data.canvas_quad_vertices);
  1297. glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
  1298. glEnableVertexAttribArray(0);
  1299. glBindVertexArray(0);
  1300. glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind
  1301. }
  1302. {
  1303. //particle quad buffers
  1304. glGenBuffers(1, &data.particle_quad_vertices);
  1305. glBindBuffer(GL_ARRAY_BUFFER, data.particle_quad_vertices);
  1306. {
  1307. //quad of size 1, with pivot on the center for particles, then regular UVS. Color is general plus fetched from particle
  1308. const float qv[16] = {
  1309. -0.5, -0.5,
  1310. 0.0, 0.0,
  1311. -0.5, 0.5,
  1312. 0.0, 1.0,
  1313. 0.5, 0.5,
  1314. 1.0, 1.0,
  1315. 0.5, -0.5,
  1316. 1.0, 0.0
  1317. };
  1318. glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 16, qv, GL_STATIC_DRAW);
  1319. }
  1320. glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind
  1321. glGenVertexArrays(1, &data.particle_quad_array);
  1322. glBindVertexArray(data.particle_quad_array);
  1323. glBindBuffer(GL_ARRAY_BUFFER, data.particle_quad_vertices);
  1324. glEnableVertexAttribArray(VS::ARRAY_VERTEX);
  1325. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, 0);
  1326. glEnableVertexAttribArray(VS::ARRAY_TEX_UV);
  1327. glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, (float *)0 + 2);
  1328. glBindVertexArray(0);
  1329. glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind
  1330. }
  1331. {
  1332. uint32_t poly_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_buffer_size_kb", 128);
  1333. poly_size *= 1024; //kb
  1334. poly_size = MAX(poly_size, (2 + 2 + 4) * 4 * sizeof(float));
  1335. glGenBuffers(1, &data.polygon_buffer);
  1336. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  1337. glBufferData(GL_ARRAY_BUFFER, poly_size, NULL, GL_DYNAMIC_DRAW); //allocate max size
  1338. glBindBuffer(GL_ARRAY_BUFFER, 0);
  1339. //quad arrays
  1340. for (int i = 0; i < 4; i++) {
  1341. glGenVertexArrays(1, &data.polygon_buffer_quad_arrays[i]);
  1342. glBindVertexArray(data.polygon_buffer_quad_arrays[i]);
  1343. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  1344. int uv_ofs = 0;
  1345. int color_ofs = 0;
  1346. int stride = 2 * 4;
  1347. if (i & 1) { //color
  1348. color_ofs = stride;
  1349. stride += 4 * 4;
  1350. }
  1351. if (i & 2) { //uv
  1352. uv_ofs = stride;
  1353. stride += 2 * 4;
  1354. }
  1355. glEnableVertexAttribArray(VS::ARRAY_VERTEX);
  1356. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + 0);
  1357. if (i & 1) {
  1358. glEnableVertexAttribArray(VS::ARRAY_COLOR);
  1359. glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + color_ofs);
  1360. }
  1361. if (i & 2) {
  1362. glEnableVertexAttribArray(VS::ARRAY_TEX_UV);
  1363. glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + uv_ofs);
  1364. }
  1365. glBindVertexArray(0);
  1366. }
  1367. glGenVertexArrays(1, &data.polygon_buffer_pointer_array);
  1368. uint32_t index_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_index_buffer_size_kb", 128);
  1369. index_size *= 1024; //kb
  1370. glGenBuffers(1, &data.polygon_index_buffer);
  1371. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);
  1372. glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_size, NULL, GL_DYNAMIC_DRAW); //allocate max size
  1373. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  1374. }
  1375. store_transform(Transform(), state.canvas_item_ubo_data.projection_matrix);
  1376. glGenBuffers(1, &state.canvas_item_ubo);
  1377. glBindBuffer(GL_UNIFORM_BUFFER, state.canvas_item_ubo);
  1378. glBufferData(GL_UNIFORM_BUFFER, sizeof(CanvasItemUBO), &state.canvas_item_ubo_data, GL_DYNAMIC_DRAW);
  1379. glBindBuffer(GL_UNIFORM_BUFFER, 0);
  1380. state.canvas_shader.init();
  1381. state.canvas_shader.set_base_material_tex_index(2);
  1382. state.canvas_shadow_shader.init();
  1383. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_RGBA_SHADOWS, storage->config.use_rgba_2d_shadows);
  1384. state.canvas_shadow_shader.set_conditional(CanvasShadowShaderGLES3::USE_RGBA_SHADOWS, storage->config.use_rgba_2d_shadows);
  1385. }
  1386. void RasterizerCanvasGLES3::finalize() {
  1387. glDeleteBuffers(1, &data.canvas_quad_vertices);
  1388. glDeleteVertexArrays(1, &data.canvas_quad_array);
  1389. glDeleteBuffers(1, &data.canvas_quad_vertices);
  1390. glDeleteVertexArrays(1, &data.canvas_quad_array);
  1391. glDeleteVertexArrays(1, &data.polygon_buffer_pointer_array);
  1392. }
  1393. RasterizerCanvasGLES3::RasterizerCanvasGLES3() {
  1394. }