rasterizer_canvas_gles2.cpp 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169
  1. /*************************************************************************/
  2. /* rasterizer_canvas_gles2.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2018 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_gles2.h"
  31. #include "os/os.h"
  32. #include "project_settings.h"
  33. #include "rasterizer_scene_gles2.h"
  34. #include "servers/visual/visual_server_raster.h"
  35. #ifndef GLES_OVER_GL
  36. #define glClearDepth glClearDepthf
  37. #endif
  38. RID RasterizerCanvasGLES2::light_internal_create() {
  39. return RID();
  40. }
  41. void RasterizerCanvasGLES2::light_internal_update(RID p_rid, Light *p_light) {
  42. }
  43. void RasterizerCanvasGLES2::light_internal_free(RID p_rid) {
  44. }
  45. void RasterizerCanvasGLES2::_set_uniforms() {
  46. state.canvas_shader.set_uniform(CanvasShaderGLES2::PROJECTION_MATRIX, state.uniforms.projection_matrix);
  47. state.canvas_shader.set_uniform(CanvasShaderGLES2::MODELVIEW_MATRIX, state.uniforms.modelview_matrix);
  48. state.canvas_shader.set_uniform(CanvasShaderGLES2::EXTRA_MATRIX, state.uniforms.extra_matrix);
  49. state.canvas_shader.set_uniform(CanvasShaderGLES2::FINAL_MODULATE, state.uniforms.final_modulate);
  50. state.canvas_shader.set_uniform(CanvasShaderGLES2::TIME, storage->frame.time[0]);
  51. if (storage->frame.current_rt) {
  52. Vector2 screen_pixel_size;
  53. screen_pixel_size.x = 1.0 / storage->frame.current_rt->width;
  54. screen_pixel_size.y = 1.0 / storage->frame.current_rt->height;
  55. state.canvas_shader.set_uniform(CanvasShaderGLES2::SCREEN_PIXEL_SIZE, screen_pixel_size);
  56. }
  57. }
  58. void RasterizerCanvasGLES2::canvas_begin() {
  59. state.canvas_shader.bind();
  60. if (storage->frame.current_rt) {
  61. glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->fbo);
  62. glColorMask(1, 1, 1, 1);
  63. }
  64. if (storage->frame.clear_request) {
  65. glColorMask(true, true, true, true);
  66. glClearColor(storage->frame.clear_request_color.r,
  67. storage->frame.clear_request_color.g,
  68. storage->frame.clear_request_color.b,
  69. storage->frame.clear_request_color.a);
  70. glClear(GL_COLOR_BUFFER_BIT);
  71. storage->frame.clear_request = false;
  72. }
  73. /*
  74. if (storage->frame.current_rt) {
  75. glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->fbo);
  76. glColorMask(1, 1, 1, 1);
  77. }
  78. */
  79. reset_canvas();
  80. glActiveTexture(GL_TEXTURE0);
  81. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  82. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
  83. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  84. // set up default uniforms
  85. Transform canvas_transform;
  86. if (storage->frame.current_rt) {
  87. float csy = 1.0;
  88. if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_VFLIP]) {
  89. csy = -1.0;
  90. }
  91. canvas_transform.translate(-(storage->frame.current_rt->width / 2.0f), -(storage->frame.current_rt->height / 2.0f), 0.0f);
  92. canvas_transform.scale(Vector3(2.0f / storage->frame.current_rt->width, csy * -2.0f / storage->frame.current_rt->height, 1.0f));
  93. } else {
  94. Vector2 ssize = OS::get_singleton()->get_window_size();
  95. canvas_transform.translate(-(ssize.width / 2.0f), -(ssize.height / 2.0f), 0.0f);
  96. canvas_transform.scale(Vector3(2.0f / ssize.width, -2.0f / ssize.height, 1.0f));
  97. }
  98. state.uniforms.projection_matrix = canvas_transform;
  99. state.uniforms.final_modulate = Color(1, 1, 1, 1);
  100. state.uniforms.modelview_matrix = Transform2D();
  101. state.uniforms.extra_matrix = Transform2D();
  102. _set_uniforms();
  103. _bind_quad_buffer();
  104. }
  105. void RasterizerCanvasGLES2::canvas_end() {
  106. glBindBuffer(GL_ARRAY_BUFFER, 0);
  107. for (int i = 0; i < VS::ARRAY_MAX; i++) {
  108. glDisableVertexAttribArray(i);
  109. }
  110. state.using_texture_rect = false;
  111. state.using_ninepatch = false;
  112. }
  113. RasterizerStorageGLES2::Texture *RasterizerCanvasGLES2::_bind_canvas_texture(const RID &p_texture, const RID &p_normal_map) {
  114. RasterizerStorageGLES2::Texture *tex_return = NULL;
  115. if (p_texture.is_valid()) {
  116. RasterizerStorageGLES2::Texture *texture = storage->texture_owner.getornull(p_texture);
  117. if (!texture) {
  118. state.current_tex = RID();
  119. state.current_tex_ptr = NULL;
  120. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 1);
  121. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  122. } else {
  123. texture = texture->get_ptr();
  124. if (texture->redraw_if_visible) {
  125. VisualServerRaster::redraw_request();
  126. }
  127. if (texture->render_target) {
  128. texture->render_target->used_in_frame = true;
  129. }
  130. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 1);
  131. glBindTexture(GL_TEXTURE_2D, texture->tex_id);
  132. state.current_tex = p_texture;
  133. state.current_tex_ptr = texture;
  134. tex_return = texture;
  135. }
  136. } else {
  137. state.current_tex = RID();
  138. state.current_tex_ptr = NULL;
  139. glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 1);
  140. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  141. }
  142. return tex_return;
  143. }
  144. void RasterizerCanvasGLES2::_set_texture_rect_mode(bool p_enable, bool p_ninepatch) {
  145. }
  146. void RasterizerCanvasGLES2::_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) {
  147. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  148. uint32_t buffer_ofs = 0;
  149. glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vector2) * p_vertex_count, p_vertices);
  150. glEnableVertexAttribArray(VS::ARRAY_VERTEX);
  151. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), NULL);
  152. buffer_ofs += sizeof(Vector2) * p_vertex_count;
  153. if (p_singlecolor) {
  154. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  155. Color m = *p_colors;
  156. glVertexAttrib4f(VS::ARRAY_COLOR, m.r, m.g, m.b, m.a);
  157. } else if (!p_colors) {
  158. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  159. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
  160. } else {
  161. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Color) * p_vertex_count, p_colors);
  162. glEnableVertexAttribArray(VS::ARRAY_COLOR);
  163. glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(Color), ((uint8_t *)0) + buffer_ofs);
  164. buffer_ofs += sizeof(Color) * p_vertex_count;
  165. }
  166. if (p_uvs) {
  167. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_uvs);
  168. glEnableVertexAttribArray(VS::ARRAY_TEX_UV);
  169. glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), ((uint8_t *)0) + buffer_ofs);
  170. buffer_ofs += sizeof(Vector2) * p_vertex_count;
  171. } else {
  172. glDisableVertexAttribArray(VS::ARRAY_TEX_UV);
  173. }
  174. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);
  175. glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(int) * p_index_count, p_indices);
  176. glDrawElements(GL_TRIANGLES, p_index_count, GL_UNSIGNED_INT, 0);
  177. glBindBuffer(GL_ARRAY_BUFFER, 0);
  178. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  179. }
  180. void RasterizerCanvasGLES2::_draw_generic(GLuint p_primitive, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor) {
  181. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  182. uint32_t buffer_ofs = 0;
  183. glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vector2) * p_vertex_count, p_vertices);
  184. glEnableVertexAttribArray(VS::ARRAY_VERTEX);
  185. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), (uint8_t *)0);
  186. buffer_ofs += sizeof(Vector2) * p_vertex_count;
  187. if (p_singlecolor) {
  188. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  189. Color m = *p_colors;
  190. glVertexAttrib4f(VS::ARRAY_COLOR, m.r, m.g, m.b, m.a);
  191. } else if (!p_colors) {
  192. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  193. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
  194. } else {
  195. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Color) * p_vertex_count, p_colors);
  196. glEnableVertexAttribArray(VS::ARRAY_COLOR);
  197. glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, sizeof(Color), ((uint8_t *)0) + buffer_ofs);
  198. buffer_ofs += sizeof(Color) * p_vertex_count;
  199. }
  200. if (p_uvs) {
  201. glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(Vector2) * p_vertex_count, p_uvs);
  202. glEnableVertexAttribArray(VS::ARRAY_TEX_UV);
  203. glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, sizeof(Vector2), ((uint8_t *)0) + buffer_ofs);
  204. } else {
  205. glDisableVertexAttribArray(VS::ARRAY_TEX_UV);
  206. }
  207. glDrawArrays(p_primitive, 0, p_vertex_count);
  208. glBindBuffer(GL_ARRAY_BUFFER, 0);
  209. }
  210. void RasterizerCanvasGLES2::_draw_gui_primitive(int p_points, const Vector2 *p_vertices, const Color *p_colors, const Vector2 *p_uvs) {
  211. static const GLenum prim[5] = { GL_POINTS, GL_POINTS, GL_LINES, GL_TRIANGLES, GL_TRIANGLE_FAN };
  212. int color_offset = 0;
  213. int uv_offset = 0;
  214. int stride = 2;
  215. if (p_colors) {
  216. color_offset = stride;
  217. stride += 4;
  218. }
  219. if (p_uvs) {
  220. uv_offset = stride;
  221. stride += 2;
  222. }
  223. float buffer_data[(2 + 2 + 4) * 4];
  224. for (int i = 0; i < p_points; i++) {
  225. buffer_data[stride * i + 0] = p_vertices[i].x;
  226. buffer_data[stride * i + 1] = p_vertices[i].y;
  227. }
  228. if (p_colors) {
  229. for (int i = 0; i < p_points; i++) {
  230. buffer_data[stride * i + color_offset + 0] = p_colors[i].r;
  231. buffer_data[stride * i + color_offset + 1] = p_colors[i].g;
  232. buffer_data[stride * i + color_offset + 2] = p_colors[i].b;
  233. buffer_data[stride * i + color_offset + 3] = p_colors[i].a;
  234. }
  235. }
  236. if (p_uvs) {
  237. for (int i = 0; i < p_points; i++) {
  238. buffer_data[stride * i + uv_offset + 0] = p_uvs[i].x;
  239. buffer_data[stride * i + uv_offset + 1] = p_uvs[i].y;
  240. }
  241. }
  242. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  243. glBufferSubData(GL_ARRAY_BUFFER, 0, p_points * stride * 4 * sizeof(float), buffer_data);
  244. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, stride * sizeof(float), NULL);
  245. if (p_colors) {
  246. glVertexAttribPointer(VS::ARRAY_COLOR, 4, GL_FLOAT, GL_FALSE, stride * sizeof(float), (uint8_t *)0 + color_offset * sizeof(float));
  247. glEnableVertexAttribArray(VS::ARRAY_COLOR);
  248. }
  249. if (p_uvs) {
  250. glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, stride * sizeof(float), (uint8_t *)0 + uv_offset * sizeof(float));
  251. glEnableVertexAttribArray(VS::ARRAY_TEX_UV);
  252. }
  253. glDrawArrays(prim[p_points], 0, p_points);
  254. glBindBuffer(GL_ARRAY_BUFFER, 0);
  255. }
  256. void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *current_clip, bool &reclip, RasterizerStorageGLES2::Material *p_material) {
  257. int command_count = p_item->commands.size();
  258. Item::Command **commands = p_item->commands.ptrw();
  259. for (int i = 0; i < command_count; i++) {
  260. Item::Command *command = commands[i];
  261. switch (command->type) {
  262. case Item::Command::TYPE_LINE: {
  263. Item::CommandLine *line = static_cast<Item::CommandLine *>(command);
  264. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
  265. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, false);
  266. if (state.canvas_shader.bind()) {
  267. _set_uniforms();
  268. state.canvas_shader.use_material((void *)p_material);
  269. }
  270. _bind_canvas_texture(RID(), RID());
  271. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  272. glVertexAttrib4fv(VS::ARRAY_COLOR, line->color.components);
  273. state.canvas_shader.set_uniform(CanvasShaderGLES2::MODELVIEW_MATRIX, state.uniforms.modelview_matrix);
  274. if (line->width <= 1) {
  275. Vector2 verts[2] = {
  276. Vector2(line->from.x, line->from.y),
  277. Vector2(line->to.x, line->to.y)
  278. };
  279. _draw_gui_primitive(2, verts, NULL, NULL);
  280. } else {
  281. Vector2 t = (line->from - line->to).normalized().tangent() * line->width * 0.5;
  282. Vector2 verts[4] = {
  283. line->from - t,
  284. line->from + t,
  285. line->to + t,
  286. line->to - t
  287. };
  288. _draw_gui_primitive(4, verts, NULL, NULL);
  289. }
  290. } break;
  291. case Item::Command::TYPE_RECT: {
  292. Item::CommandRect *r = static_cast<Item::CommandRect *>(command);
  293. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  294. glVertexAttrib4fv(VS::ARRAY_COLOR, r->modulate.components);
  295. _bind_quad_buffer();
  296. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, true);
  297. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, false);
  298. if (state.canvas_shader.bind()) {
  299. _set_uniforms();
  300. state.canvas_shader.use_material((void *)p_material);
  301. }
  302. RasterizerStorageGLES2::Texture *tex = _bind_canvas_texture(r->texture, r->normal_map);
  303. if (!tex) {
  304. Rect2 dst_rect = Rect2(r->rect.position, r->rect.size);
  305. if (dst_rect.size.width < 0) {
  306. dst_rect.position.x += dst_rect.size.width;
  307. dst_rect.size.width *= -1;
  308. }
  309. if (dst_rect.size.height < 0) {
  310. dst_rect.position.y += dst_rect.size.height;
  311. dst_rect.size.height *= -1;
  312. }
  313. state.canvas_shader.set_uniform(CanvasShaderGLES2::DST_RECT, Color(dst_rect.position.x, dst_rect.position.y, dst_rect.size.x, dst_rect.size.y));
  314. state.canvas_shader.set_uniform(CanvasShaderGLES2::SRC_RECT, Color(0, 0, 1, 1));
  315. glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  316. } else {
  317. bool untile = false;
  318. if (r->flags & CANVAS_RECT_TILE && !(tex->flags & VS::TEXTURE_FLAG_REPEAT)) {
  319. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  320. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  321. untile = true;
  322. }
  323. Size2 texpixel_size(1.0 / tex->width, 1.0 / tex->height);
  324. Rect2 src_rect = (r->flags & CANVAS_RECT_REGION) ? Rect2(r->source.position * texpixel_size, r->source.size * texpixel_size) : Rect2(0, 0, 1, 1);
  325. Rect2 dst_rect = Rect2(r->rect.position, r->rect.size);
  326. if (dst_rect.size.width < 0) {
  327. dst_rect.position.x += dst_rect.size.width;
  328. dst_rect.size.width *= -1;
  329. }
  330. if (dst_rect.size.height < 0) {
  331. dst_rect.position.y += dst_rect.size.height;
  332. dst_rect.size.height *= -1;
  333. }
  334. if (r->flags & CANVAS_RECT_FLIP_H) {
  335. src_rect.size.x *= -1;
  336. }
  337. if (r->flags & CANVAS_RECT_FLIP_V) {
  338. src_rect.size.y *= -1;
  339. }
  340. if (r->flags & CANVAS_RECT_TRANSPOSE) {
  341. dst_rect.size.x *= -1; // Encoding in the dst_rect.z uniform
  342. }
  343. state.canvas_shader.set_uniform(CanvasShaderGLES2::COLOR_TEXPIXEL_SIZE, texpixel_size);
  344. state.canvas_shader.set_uniform(CanvasShaderGLES2::DST_RECT, Color(dst_rect.position.x, dst_rect.position.y, dst_rect.size.x, dst_rect.size.y));
  345. state.canvas_shader.set_uniform(CanvasShaderGLES2::SRC_RECT, Color(src_rect.position.x, src_rect.position.y, src_rect.size.x, src_rect.size.y));
  346. glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  347. if (untile) {
  348. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  349. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  350. }
  351. }
  352. glBindBuffer(GL_ARRAY_BUFFER, 0);
  353. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  354. } break;
  355. case Item::Command::TYPE_NINEPATCH: {
  356. Item::CommandNinePatch *np = static_cast<Item::CommandNinePatch *>(command);
  357. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
  358. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, true);
  359. if (state.canvas_shader.bind()) {
  360. _set_uniforms();
  361. state.canvas_shader.use_material((void *)p_material);
  362. }
  363. glDisableVertexAttribArray(VS::ARRAY_COLOR);
  364. glVertexAttrib4fv(VS::ARRAY_COLOR, np->color.components);
  365. RasterizerStorageGLES2::Texture *tex = _bind_canvas_texture(np->texture, np->normal_map);
  366. if (!tex) {
  367. print_line("TODO: ninepatch without texture");
  368. continue;
  369. }
  370. Size2 texpixel_size(1.0 / tex->width, 1.0 / tex->height);
  371. // state.canvas_shader.set_uniform(CanvasShaderGLES2::MODELVIEW_MATRIX, state.uniforms.modelview_matrix);
  372. state.canvas_shader.set_uniform(CanvasShaderGLES2::COLOR_TEXPIXEL_SIZE, texpixel_size);
  373. Rect2 source = np->source;
  374. if (source.size.x == 0 && source.size.y == 0) {
  375. source.size.x = tex->width;
  376. source.size.y = tex->height;
  377. }
  378. // prepare vertex buffer
  379. // this buffer contains [ POS POS UV UV ] *
  380. float buffer[16 * 2 + 16 * 2];
  381. {
  382. // first row
  383. buffer[(0 * 4 * 4) + 0] = np->rect.position.x;
  384. buffer[(0 * 4 * 4) + 1] = np->rect.position.y;
  385. buffer[(0 * 4 * 4) + 2] = source.position.x * texpixel_size.x;
  386. buffer[(0 * 4 * 4) + 3] = source.position.y * texpixel_size.y;
  387. buffer[(0 * 4 * 4) + 4] = np->rect.position.x + np->margin[MARGIN_LEFT];
  388. buffer[(0 * 4 * 4) + 5] = np->rect.position.y;
  389. buffer[(0 * 4 * 4) + 6] = (source.position.x + np->margin[MARGIN_LEFT]) * texpixel_size.x;
  390. buffer[(0 * 4 * 4) + 7] = source.position.y * texpixel_size.y;
  391. buffer[(0 * 4 * 4) + 8] = np->rect.position.x + np->rect.size.x - np->margin[MARGIN_RIGHT];
  392. buffer[(0 * 4 * 4) + 9] = np->rect.position.y;
  393. buffer[(0 * 4 * 4) + 10] = (source.position.x + source.size.x - np->margin[MARGIN_RIGHT]) * texpixel_size.x;
  394. buffer[(0 * 4 * 4) + 11] = source.position.y * texpixel_size.y;
  395. buffer[(0 * 4 * 4) + 12] = np->rect.position.x + np->rect.size.x;
  396. buffer[(0 * 4 * 4) + 13] = np->rect.position.y;
  397. buffer[(0 * 4 * 4) + 14] = (source.position.x + source.size.x) * texpixel_size.x;
  398. buffer[(0 * 4 * 4) + 15] = source.position.y * texpixel_size.y;
  399. // second row
  400. buffer[(1 * 4 * 4) + 0] = np->rect.position.x;
  401. buffer[(1 * 4 * 4) + 1] = np->rect.position.y + np->margin[MARGIN_TOP];
  402. buffer[(1 * 4 * 4) + 2] = source.position.x * texpixel_size.x;
  403. buffer[(1 * 4 * 4) + 3] = (source.position.y + np->margin[MARGIN_TOP]) * texpixel_size.y;
  404. buffer[(1 * 4 * 4) + 4] = np->rect.position.x + np->margin[MARGIN_LEFT];
  405. buffer[(1 * 4 * 4) + 5] = np->rect.position.y + np->margin[MARGIN_TOP];
  406. buffer[(1 * 4 * 4) + 6] = (source.position.x + np->margin[MARGIN_LEFT]) * texpixel_size.x;
  407. buffer[(1 * 4 * 4) + 7] = (source.position.y + np->margin[MARGIN_TOP]) * texpixel_size.y;
  408. buffer[(1 * 4 * 4) + 8] = np->rect.position.x + np->rect.size.x - np->margin[MARGIN_RIGHT];
  409. buffer[(1 * 4 * 4) + 9] = np->rect.position.y + np->margin[MARGIN_TOP];
  410. buffer[(1 * 4 * 4) + 10] = (source.position.x + source.size.x - np->margin[MARGIN_RIGHT]) * texpixel_size.x;
  411. buffer[(1 * 4 * 4) + 11] = (source.position.y + np->margin[MARGIN_TOP]) * texpixel_size.y;
  412. buffer[(1 * 4 * 4) + 12] = np->rect.position.x + np->rect.size.x;
  413. buffer[(1 * 4 * 4) + 13] = np->rect.position.y + np->margin[MARGIN_TOP];
  414. buffer[(1 * 4 * 4) + 14] = (source.position.x + source.size.x) * texpixel_size.x;
  415. buffer[(1 * 4 * 4) + 15] = (source.position.y + np->margin[MARGIN_TOP]) * texpixel_size.y;
  416. // thrid row
  417. buffer[(2 * 4 * 4) + 0] = np->rect.position.x;
  418. buffer[(2 * 4 * 4) + 1] = np->rect.position.y + np->rect.size.y - np->margin[MARGIN_BOTTOM];
  419. buffer[(2 * 4 * 4) + 2] = source.position.x * texpixel_size.x;
  420. buffer[(2 * 4 * 4) + 3] = (source.position.y + source.size.y - np->margin[MARGIN_BOTTOM]) * texpixel_size.y;
  421. buffer[(2 * 4 * 4) + 4] = np->rect.position.x + np->margin[MARGIN_LEFT];
  422. buffer[(2 * 4 * 4) + 5] = np->rect.position.y + np->rect.size.y - np->margin[MARGIN_BOTTOM];
  423. buffer[(2 * 4 * 4) + 6] = (source.position.x + np->margin[MARGIN_LEFT]) * texpixel_size.x;
  424. buffer[(2 * 4 * 4) + 7] = (source.position.y + source.size.y - np->margin[MARGIN_BOTTOM]) * texpixel_size.y;
  425. buffer[(2 * 4 * 4) + 8] = np->rect.position.x + np->rect.size.x - np->margin[MARGIN_RIGHT];
  426. buffer[(2 * 4 * 4) + 9] = np->rect.position.y + np->rect.size.y - np->margin[MARGIN_BOTTOM];
  427. buffer[(2 * 4 * 4) + 10] = (source.position.x + source.size.x - np->margin[MARGIN_RIGHT]) * texpixel_size.x;
  428. buffer[(2 * 4 * 4) + 11] = (source.position.y + source.size.y - np->margin[MARGIN_BOTTOM]) * texpixel_size.y;
  429. buffer[(2 * 4 * 4) + 12] = np->rect.position.x + np->rect.size.x;
  430. buffer[(2 * 4 * 4) + 13] = np->rect.position.y + np->rect.size.y - np->margin[MARGIN_BOTTOM];
  431. buffer[(2 * 4 * 4) + 14] = (source.position.x + source.size.x) * texpixel_size.x;
  432. buffer[(2 * 4 * 4) + 15] = (source.position.y + source.size.y - np->margin[MARGIN_BOTTOM]) * texpixel_size.y;
  433. // fourth row
  434. buffer[(3 * 4 * 4) + 0] = np->rect.position.x;
  435. buffer[(3 * 4 * 4) + 1] = np->rect.position.y + np->rect.size.y;
  436. buffer[(3 * 4 * 4) + 2] = source.position.x * texpixel_size.x;
  437. buffer[(3 * 4 * 4) + 3] = (source.position.y + source.size.y) * texpixel_size.y;
  438. buffer[(3 * 4 * 4) + 4] = np->rect.position.x + np->margin[MARGIN_LEFT];
  439. buffer[(3 * 4 * 4) + 5] = np->rect.position.y + np->rect.size.y;
  440. buffer[(3 * 4 * 4) + 6] = (source.position.x + np->margin[MARGIN_LEFT]) * texpixel_size.x;
  441. buffer[(3 * 4 * 4) + 7] = (source.position.y + source.size.y) * texpixel_size.y;
  442. buffer[(3 * 4 * 4) + 8] = np->rect.position.x + np->rect.size.x - np->margin[MARGIN_RIGHT];
  443. buffer[(3 * 4 * 4) + 9] = np->rect.position.y + np->rect.size.y;
  444. buffer[(3 * 4 * 4) + 10] = (source.position.x + source.size.x - np->margin[MARGIN_RIGHT]) * texpixel_size.x;
  445. buffer[(3 * 4 * 4) + 11] = (source.position.y + source.size.y) * texpixel_size.y;
  446. buffer[(3 * 4 * 4) + 12] = np->rect.position.x + np->rect.size.x;
  447. buffer[(3 * 4 * 4) + 13] = np->rect.position.y + np->rect.size.y;
  448. buffer[(3 * 4 * 4) + 14] = (source.position.x + source.size.x) * texpixel_size.x;
  449. buffer[(3 * 4 * 4) + 15] = (source.position.y + source.size.y) * texpixel_size.y;
  450. // print_line(String::num((source.position.y + source.size.y) * texpixel_size.y));
  451. }
  452. glBindBuffer(GL_ARRAY_BUFFER, data.ninepatch_vertices);
  453. glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float) * (16 + 16) * 2, buffer);
  454. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.ninepatch_elements);
  455. glEnableVertexAttribArray(VS::ARRAY_VERTEX);
  456. glEnableVertexAttribArray(VS::ARRAY_TEX_UV);
  457. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), NULL);
  458. glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (uint8_t *)0 + (sizeof(float) * 2));
  459. glDrawElements(GL_TRIANGLES, 18 * 3 - (np->draw_center ? 0 : 6), GL_UNSIGNED_BYTE, NULL);
  460. glBindBuffer(GL_ARRAY_BUFFER, 0);
  461. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  462. } break;
  463. case Item::Command::TYPE_CIRCLE: {
  464. Item::CommandCircle *circle = static_cast<Item::CommandCircle *>(command);
  465. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
  466. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, false);
  467. if (state.canvas_shader.bind()) {
  468. _set_uniforms();
  469. state.canvas_shader.use_material((void *)p_material);
  470. }
  471. static const int num_points = 32;
  472. Vector2 points[num_points + 1];
  473. points[num_points] = circle->pos;
  474. int indices[num_points * 3];
  475. for (int i = 0; i < num_points; i++) {
  476. points[i] = circle->pos + Vector2(Math::sin(i * Math_PI * 2.0 / num_points), Math::cos(i * Math_PI * 2.0 / num_points)) * circle->radius;
  477. indices[i * 3 + 0] = i;
  478. indices[i * 3 + 1] = (i + 1) % num_points;
  479. indices[i * 3 + 2] = num_points;
  480. }
  481. _bind_canvas_texture(RID(), RID());
  482. _draw_polygon(indices, num_points * 3, num_points + 1, points, NULL, &circle->color, true);
  483. } break;
  484. case Item::Command::TYPE_POLYGON: {
  485. Item::CommandPolygon *polygon = static_cast<Item::CommandPolygon *>(command);
  486. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
  487. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, true);
  488. if (state.canvas_shader.bind()) {
  489. _set_uniforms();
  490. state.canvas_shader.use_material((void *)p_material);
  491. }
  492. RasterizerStorageGLES2::Texture *texture = _bind_canvas_texture(polygon->texture, polygon->normal_map);
  493. if (texture) {
  494. Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height);
  495. state.canvas_shader.set_uniform(CanvasShaderGLES2::COLOR_TEXPIXEL_SIZE, texpixel_size);
  496. }
  497. _draw_polygon(polygon->indices.ptr(), polygon->count, polygon->points.size(), polygon->points.ptr(), polygon->uvs.ptr(), polygon->colors.ptr(), polygon->colors.size() == 1);
  498. } break;
  499. case Item::Command::TYPE_POLYLINE: {
  500. Item::CommandPolyLine *pline = static_cast<Item::CommandPolyLine *>(command);
  501. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
  502. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, false);
  503. if (state.canvas_shader.bind()) {
  504. _set_uniforms();
  505. state.canvas_shader.use_material((void *)p_material);
  506. }
  507. _bind_canvas_texture(RID(), RID());
  508. if (pline->triangles.size()) {
  509. _draw_generic(GL_TRIANGLE_STRIP, pline->triangles.size(), pline->triangles.ptr(), NULL, pline->triangle_colors.ptr(), pline->triangle_colors.size() == 1);
  510. } else {
  511. if (pline->multiline) {
  512. int todo = pline->lines.size() / 2;
  513. int max_per_call = data.polygon_buffer_size / (sizeof(real_t) * 4);
  514. int offset = 0;
  515. while (todo) {
  516. int to_draw = MIN(max_per_call, todo);
  517. _draw_generic(GL_LINES, to_draw * 2, &pline->lines.ptr()[offset], NULL, pline->line_colors.size() == 1 ? pline->line_colors.ptr() : &pline->line_colors.ptr()[offset], pline->line_colors.size() == 1);
  518. todo -= to_draw;
  519. offset += to_draw * 2;
  520. }
  521. } else {
  522. _draw_generic(GL_LINES, pline->lines.size(), pline->lines.ptr(), NULL, pline->line_colors.ptr(), pline->line_colors.size() == 1);
  523. }
  524. }
  525. } break;
  526. case Item::Command::TYPE_PRIMITIVE: {
  527. Item::CommandPrimitive *primitive = static_cast<Item::CommandPrimitive *>(command);
  528. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
  529. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, true);
  530. if (state.canvas_shader.bind()) {
  531. _set_uniforms();
  532. state.canvas_shader.use_material((void *)p_material);
  533. }
  534. ERR_CONTINUE(primitive->points.size() < 1);
  535. RasterizerStorageGLES2::Texture *texture = _bind_canvas_texture(primitive->texture, primitive->normal_map);
  536. if (texture) {
  537. Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height);
  538. state.canvas_shader.set_uniform(CanvasShaderGLES2::COLOR_TEXPIXEL_SIZE, texpixel_size);
  539. }
  540. if (primitive->colors.size() == 1 && primitive->points.size() > 1) {
  541. Color c = primitive->colors[0];
  542. glVertexAttrib4f(VS::ARRAY_COLOR, c.r, c.g, c.b, c.a);
  543. } else if (primitive->colors.empty()) {
  544. glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
  545. }
  546. _draw_gui_primitive(primitive->points.size(), primitive->points.ptr(), primitive->colors.ptr(), primitive->uvs.ptr());
  547. } break;
  548. case Item::Command::TYPE_TRANSFORM: {
  549. Item::CommandTransform *transform = static_cast<Item::CommandTransform *>(command);
  550. state.uniforms.extra_matrix = transform->xform;
  551. state.canvas_shader.set_uniform(CanvasShaderGLES2::EXTRA_MATRIX, state.uniforms.extra_matrix);
  552. } break;
  553. case Item::Command::TYPE_PARTICLES: {
  554. } break;
  555. case Item::Command::TYPE_CLIP_IGNORE: {
  556. Item::CommandClipIgnore *ci = static_cast<Item::CommandClipIgnore *>(command);
  557. if (current_clip) {
  558. if (ci->ignore != reclip) {
  559. if (ci->ignore) {
  560. glDisable(GL_SCISSOR_TEST);
  561. reclip = true;
  562. } else {
  563. glEnable(GL_SCISSOR_TEST);
  564. int x = current_clip->final_clip_rect.position.x;
  565. int y = storage->frame.current_rt->height - (current_clip->final_clip_rect.position.y + current_clip->final_clip_rect.size.y);
  566. int w = current_clip->final_clip_rect.size.x;
  567. int h = current_clip->final_clip_rect.size.y;
  568. if (storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_VFLIP])
  569. y = current_clip->final_clip_rect.position.y;
  570. glScissor(x, y, w, h);
  571. reclip = false;
  572. }
  573. }
  574. }
  575. } break;
  576. default: {
  577. print_line("other");
  578. } break;
  579. }
  580. }
  581. }
  582. void RasterizerCanvasGLES2::_copy_texscreen(const Rect2 &p_rect) {
  583. // This isn't really working yet, so disabling for now.
  584. }
  585. void RasterizerCanvasGLES2::canvas_render_items(Item *p_item_list, int p_z, const Color &p_modulate, Light *p_light, const Transform2D &p_base_transform) {
  586. Item *current_clip = NULL;
  587. RasterizerStorageGLES2::Shader *shader_cache = NULL;
  588. bool rebind_shader = true;
  589. Size2 rt_size = Size2(storage->frame.current_rt->width, storage->frame.current_rt->height);
  590. state.current_tex = RID();
  591. state.current_tex_ptr = NULL;
  592. state.current_normal = RID();
  593. glActiveTexture(GL_TEXTURE0);
  594. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  595. int last_blend_mode = -1;
  596. RID canvas_last_material = RID();
  597. while (p_item_list) {
  598. Item *ci = p_item_list;
  599. if (current_clip != ci->final_clip_owner) {
  600. current_clip = ci->final_clip_owner;
  601. if (current_clip) {
  602. glEnable(GL_SCISSOR_TEST);
  603. int y = storage->frame.current_rt->height - (current_clip->final_clip_rect.position.y + current_clip->final_clip_rect.size.y);
  604. if (storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_VFLIP])
  605. y = current_clip->final_clip_rect.position.y;
  606. glScissor(current_clip->final_clip_rect.position.x, y, current_clip->final_clip_rect.size.width, current_clip->final_clip_rect.size.height);
  607. } else {
  608. glDisable(GL_SCISSOR_TEST);
  609. }
  610. }
  611. // TODO: copy back buffer
  612. if (ci->copy_back_buffer) {
  613. if (ci->copy_back_buffer->full) {
  614. _copy_texscreen(Rect2());
  615. } else {
  616. _copy_texscreen(ci->copy_back_buffer->rect);
  617. }
  618. }
  619. Item *material_owner = ci->material_owner ? ci->material_owner : ci;
  620. RID material = material_owner->material;
  621. RasterizerStorageGLES2::Material *material_ptr = storage->material_owner.getornull(material);
  622. if (material != canvas_last_material || rebind_shader) {
  623. RasterizerStorageGLES2::Shader *shader_ptr = NULL;
  624. if (material_ptr) {
  625. shader_ptr = material_ptr->shader;
  626. if (shader_ptr && shader_ptr->mode != VS::SHADER_CANVAS_ITEM) {
  627. shader_ptr = NULL; // not a canvas item shader, don't use.
  628. }
  629. }
  630. if (shader_ptr) {
  631. if (shader_ptr->canvas_item.uses_screen_texture) {
  632. _copy_texscreen(Rect2());
  633. }
  634. if (shader_ptr != shader_cache) {
  635. if (shader_ptr->canvas_item.uses_time) {
  636. VisualServerRaster::redraw_request();
  637. }
  638. state.canvas_shader.set_custom_shader(shader_ptr->custom_code_id);
  639. state.canvas_shader.bind();
  640. }
  641. int tc = material_ptr->textures.size();
  642. Pair<StringName, RID> *textures = material_ptr->textures.ptrw();
  643. ShaderLanguage::ShaderNode::Uniform::Hint *texture_hints = shader_ptr->texture_hints.ptrw();
  644. for (int i = 0; i < tc; i++) {
  645. glActiveTexture(GL_TEXTURE0 + i);
  646. RasterizerStorageGLES2::Texture *t = storage->texture_owner.getornull(textures[i].second);
  647. if (!t) {
  648. switch (texture_hints[i]) {
  649. case ShaderLanguage::ShaderNode::Uniform::HINT_BLACK_ALBEDO:
  650. case ShaderLanguage::ShaderNode::Uniform::HINT_BLACK: {
  651. glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
  652. } break;
  653. case ShaderLanguage::ShaderNode::Uniform::HINT_ANISO: {
  654. glBindTexture(GL_TEXTURE_2D, storage->resources.aniso_tex);
  655. } break;
  656. case ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL: {
  657. glBindTexture(GL_TEXTURE_2D, storage->resources.normal_tex);
  658. } break;
  659. default: {
  660. glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
  661. } break;
  662. }
  663. continue;
  664. }
  665. t = t->get_ptr();
  666. if (t->redraw_if_visible) {
  667. VisualServerRaster::redraw_request();
  668. }
  669. glBindTexture(t->target, t->tex_id);
  670. }
  671. } else {
  672. state.canvas_shader.set_custom_shader(0);
  673. state.canvas_shader.bind();
  674. }
  675. state.canvas_shader.use_material((void *)material_ptr);
  676. shader_cache = shader_ptr;
  677. canvas_last_material = material;
  678. rebind_shader = false;
  679. }
  680. int blend_mode = shader_cache ? shader_cache->canvas_item.blend_mode : RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_MIX;
  681. bool unshaded = true || (shader_cache && blend_mode != RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_MIX);
  682. bool reclip = false;
  683. if (last_blend_mode != blend_mode) {
  684. switch (blend_mode) {
  685. case RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_MIX: {
  686. glBlendEquation(GL_FUNC_ADD);
  687. if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
  688. glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
  689. } else {
  690. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  691. }
  692. } break;
  693. case RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_ADD: {
  694. glBlendEquation(GL_FUNC_ADD);
  695. glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  696. } break;
  697. case RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_SUB: {
  698. glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
  699. glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  700. } break;
  701. case RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_MUL: {
  702. glBlendEquation(GL_FUNC_ADD);
  703. glBlendFunc(GL_DST_COLOR, GL_ZERO);
  704. } break;
  705. case RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_PMALPHA: {
  706. glBlendEquation(GL_FUNC_ADD);
  707. glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
  708. } break;
  709. }
  710. }
  711. state.uniforms.final_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);
  712. state.uniforms.modelview_matrix = ci->final_transform;
  713. state.uniforms.extra_matrix = Transform2D();
  714. _set_uniforms();
  715. _canvas_item_render_commands(p_item_list, NULL, reclip, material_ptr);
  716. rebind_shader = true; // hacked in for now.
  717. if (reclip) {
  718. glEnable(GL_SCISSOR_TEST);
  719. int y = storage->frame.current_rt->height - (current_clip->final_clip_rect.position.y + current_clip->final_clip_rect.size.y);
  720. if (storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_VFLIP])
  721. y = current_clip->final_clip_rect.position.y;
  722. glScissor(current_clip->final_clip_rect.position.x, y, current_clip->final_clip_rect.size.width, current_clip->final_clip_rect.size.height);
  723. }
  724. p_item_list = p_item_list->next;
  725. }
  726. if (current_clip) {
  727. glDisable(GL_SCISSOR_TEST);
  728. }
  729. }
  730. void RasterizerCanvasGLES2::canvas_debug_viewport_shadows(Light *p_lights_with_shadow) {
  731. }
  732. void RasterizerCanvasGLES2::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) {
  733. }
  734. void RasterizerCanvasGLES2::reset_canvas() {
  735. glDisable(GL_CULL_FACE);
  736. glDisable(GL_DEPTH_TEST);
  737. glDisable(GL_SCISSOR_TEST);
  738. glDisable(GL_DITHER);
  739. glEnable(GL_BLEND);
  740. if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
  741. glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
  742. } else {
  743. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  744. }
  745. // bind the back buffer to a texture so shaders can use it.
  746. // It should probably use texture unit -3 (as GLES3 does as well) but currently that's buggy.
  747. // keeping this for now as there's nothing else that uses texture unit 2
  748. // TODO ^
  749. if (storage->frame.current_rt) {
  750. // glActiveTexture(GL_TEXTURE0 + 2);
  751. // glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->copy_screen_effect.color);
  752. }
  753. glBindBuffer(GL_ARRAY_BUFFER, 0);
  754. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  755. }
  756. void RasterizerCanvasGLES2::_bind_quad_buffer() {
  757. glBindBuffer(GL_ARRAY_BUFFER, data.canvas_quad_vertices);
  758. glEnableVertexAttribArray(VS::ARRAY_VERTEX);
  759. glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, 0, NULL);
  760. }
  761. void RasterizerCanvasGLES2::draw_generic_textured_rect(const Rect2 &p_rect, const Rect2 &p_src) {
  762. state.canvas_shader.set_uniform(CanvasShaderGLES2::DST_RECT, Color(p_rect.position.x, p_rect.position.y, p_rect.size.x, p_rect.size.y));
  763. state.canvas_shader.set_uniform(CanvasShaderGLES2::SRC_RECT, Color(p_src.position.x, p_src.position.y, p_src.size.x, p_src.size.y));
  764. glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  765. }
  766. void RasterizerCanvasGLES2::draw_window_margins(int *black_margin, RID *black_image) {
  767. }
  768. void RasterizerCanvasGLES2::initialize() {
  769. // quad buffer
  770. {
  771. glGenBuffers(1, &data.canvas_quad_vertices);
  772. glBindBuffer(GL_ARRAY_BUFFER, data.canvas_quad_vertices);
  773. const float qv[8] = {
  774. 0, 0,
  775. 0, 1,
  776. 1, 1,
  777. 1, 0
  778. };
  779. glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 8, qv, GL_STATIC_DRAW);
  780. glBindBuffer(GL_ARRAY_BUFFER, 0);
  781. }
  782. // polygon buffer
  783. {
  784. uint32_t poly_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_buffer_size_kb", 128);
  785. poly_size *= 1024;
  786. poly_size = MAX(poly_size, (2 + 2 + 4) * 4 * sizeof(float));
  787. glGenBuffers(1, &data.polygon_buffer);
  788. glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
  789. glBufferData(GL_ARRAY_BUFFER, poly_size, NULL, GL_DYNAMIC_DRAW);
  790. data.polygon_buffer_size = poly_size;
  791. glBindBuffer(GL_ARRAY_BUFFER, 0);
  792. uint32_t index_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_index_size_kb", 128);
  793. index_size *= 1024; // kb
  794. glGenBuffers(1, &data.polygon_index_buffer);
  795. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);
  796. glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_size, NULL, GL_DYNAMIC_DRAW);
  797. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  798. }
  799. // ninepatch buffers
  800. {
  801. // array buffer
  802. glGenBuffers(1, &data.ninepatch_vertices);
  803. glBindBuffer(GL_ARRAY_BUFFER, data.ninepatch_vertices);
  804. glBufferData(GL_ARRAY_BUFFER, sizeof(float) * (16 + 16) * 2, NULL, GL_DYNAMIC_DRAW);
  805. glBindBuffer(GL_ARRAY_BUFFER, 0);
  806. // element buffer
  807. glGenBuffers(1, &data.ninepatch_elements);
  808. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.ninepatch_elements);
  809. #define _EIDX(y, x) (y * 4 + x)
  810. uint8_t elems[3 * 2 * 9] = {
  811. // first row
  812. _EIDX(0, 0), _EIDX(0, 1), _EIDX(1, 1),
  813. _EIDX(1, 1), _EIDX(1, 0), _EIDX(0, 0),
  814. _EIDX(0, 1), _EIDX(0, 2), _EIDX(1, 2),
  815. _EIDX(1, 2), _EIDX(1, 1), _EIDX(0, 1),
  816. _EIDX(0, 2), _EIDX(0, 3), _EIDX(1, 3),
  817. _EIDX(1, 3), _EIDX(1, 2), _EIDX(0, 2),
  818. // second row
  819. _EIDX(1, 0), _EIDX(1, 1), _EIDX(2, 1),
  820. _EIDX(2, 1), _EIDX(2, 0), _EIDX(1, 0),
  821. // the center one would be here, but we'll put it at the end
  822. // so it's easier to disable the center and be able to use
  823. // one draw call for both
  824. _EIDX(1, 2), _EIDX(1, 3), _EIDX(2, 3),
  825. _EIDX(2, 3), _EIDX(2, 2), _EIDX(1, 2),
  826. // third row
  827. _EIDX(2, 0), _EIDX(2, 1), _EIDX(3, 1),
  828. _EIDX(3, 1), _EIDX(3, 0), _EIDX(2, 0),
  829. _EIDX(2, 1), _EIDX(2, 2), _EIDX(3, 2),
  830. _EIDX(3, 2), _EIDX(3, 1), _EIDX(2, 1),
  831. _EIDX(2, 2), _EIDX(2, 3), _EIDX(3, 3),
  832. _EIDX(3, 3), _EIDX(3, 2), _EIDX(2, 2),
  833. // center field
  834. _EIDX(1, 1), _EIDX(1, 2), _EIDX(2, 2),
  835. _EIDX(2, 2), _EIDX(2, 1), _EIDX(1, 1)
  836. };
  837. ;
  838. #undef _EIDX
  839. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elems), elems, GL_STATIC_DRAW);
  840. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  841. }
  842. state.canvas_shader.init();
  843. state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, true);
  844. state.canvas_shader.bind();
  845. }
  846. void RasterizerCanvasGLES2::finalize() {
  847. }
  848. RasterizerCanvasGLES2::RasterizerCanvasGLES2() {
  849. }