rasterizer_canvas_rd.cpp 102 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766
  1. /*************************************************************************/
  2. /* rasterizer_canvas_rd.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #include "rasterizer_canvas_rd.h"
  31. #include "core/config/project_settings.h"
  32. #include "core/math/geometry_2d.h"
  33. #include "core/math/math_funcs.h"
  34. #include "rasterizer_rd.h"
  35. void RasterizerCanvasRD::_update_transform_2d_to_mat4(const Transform2D &p_transform, float *p_mat4) {
  36. p_mat4[0] = p_transform.elements[0][0];
  37. p_mat4[1] = p_transform.elements[0][1];
  38. p_mat4[2] = 0;
  39. p_mat4[3] = 0;
  40. p_mat4[4] = p_transform.elements[1][0];
  41. p_mat4[5] = p_transform.elements[1][1];
  42. p_mat4[6] = 0;
  43. p_mat4[7] = 0;
  44. p_mat4[8] = 0;
  45. p_mat4[9] = 0;
  46. p_mat4[10] = 1;
  47. p_mat4[11] = 0;
  48. p_mat4[12] = p_transform.elements[2][0];
  49. p_mat4[13] = p_transform.elements[2][1];
  50. p_mat4[14] = 0;
  51. p_mat4[15] = 1;
  52. }
  53. void RasterizerCanvasRD::_update_transform_2d_to_mat2x4(const Transform2D &p_transform, float *p_mat2x4) {
  54. p_mat2x4[0] = p_transform.elements[0][0];
  55. p_mat2x4[1] = p_transform.elements[1][0];
  56. p_mat2x4[2] = 0;
  57. p_mat2x4[3] = p_transform.elements[2][0];
  58. p_mat2x4[4] = p_transform.elements[0][1];
  59. p_mat2x4[5] = p_transform.elements[1][1];
  60. p_mat2x4[6] = 0;
  61. p_mat2x4[7] = p_transform.elements[2][1];
  62. }
  63. void RasterizerCanvasRD::_update_transform_2d_to_mat2x3(const Transform2D &p_transform, float *p_mat2x3) {
  64. p_mat2x3[0] = p_transform.elements[0][0];
  65. p_mat2x3[1] = p_transform.elements[0][1];
  66. p_mat2x3[2] = p_transform.elements[1][0];
  67. p_mat2x3[3] = p_transform.elements[1][1];
  68. p_mat2x3[4] = p_transform.elements[2][0];
  69. p_mat2x3[5] = p_transform.elements[2][1];
  70. }
  71. void RasterizerCanvasRD::_update_transform_to_mat4(const Transform &p_transform, float *p_mat4) {
  72. p_mat4[0] = p_transform.basis.elements[0][0];
  73. p_mat4[1] = p_transform.basis.elements[1][0];
  74. p_mat4[2] = p_transform.basis.elements[2][0];
  75. p_mat4[3] = 0;
  76. p_mat4[4] = p_transform.basis.elements[0][1];
  77. p_mat4[5] = p_transform.basis.elements[1][1];
  78. p_mat4[6] = p_transform.basis.elements[2][1];
  79. p_mat4[7] = 0;
  80. p_mat4[8] = p_transform.basis.elements[0][2];
  81. p_mat4[9] = p_transform.basis.elements[1][2];
  82. p_mat4[10] = p_transform.basis.elements[2][2];
  83. p_mat4[11] = 0;
  84. p_mat4[12] = p_transform.origin.x;
  85. p_mat4[13] = p_transform.origin.y;
  86. p_mat4[14] = p_transform.origin.z;
  87. p_mat4[15] = 1;
  88. }
  89. RasterizerCanvas::PolygonID RasterizerCanvasRD::request_polygon(const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, const Vector<int> &p_bones, const Vector<float> &p_weights) {
  90. // Care must be taken to generate array formats
  91. // in ways where they could be reused, so we will
  92. // put single-occuring elements first, and repeated
  93. // elements later. This way the generated formats are
  94. // the same no matter the length of the arrays.
  95. // This dramatically reduces the amount of pipeline objects
  96. // that need to be created for these formats.
  97. uint32_t vertex_count = p_points.size();
  98. uint32_t stride = 2; //vertices always repeat
  99. if ((uint32_t)p_colors.size() == vertex_count || p_colors.size() == 1) {
  100. stride += 4;
  101. }
  102. if ((uint32_t)p_uvs.size() == vertex_count) {
  103. stride += 2;
  104. }
  105. if ((uint32_t)p_bones.size() == vertex_count * 4 && (uint32_t)p_weights.size() == vertex_count * 4) {
  106. stride += 4;
  107. }
  108. uint32_t buffer_size = stride * p_points.size();
  109. Vector<uint8_t> polygon_buffer;
  110. polygon_buffer.resize(buffer_size * sizeof(float));
  111. Vector<RD::VertexAttribute> descriptions;
  112. descriptions.resize(4);
  113. Vector<RID> buffers;
  114. buffers.resize(4);
  115. {
  116. const uint8_t *r = polygon_buffer.ptr();
  117. float *fptr = (float *)r;
  118. uint32_t *uptr = (uint32_t *)r;
  119. uint32_t base_offset = 0;
  120. { //vertices
  121. RD::VertexAttribute vd;
  122. vd.format = RD::DATA_FORMAT_R32G32_SFLOAT;
  123. vd.offset = base_offset * sizeof(float);
  124. vd.location = RS::ARRAY_VERTEX;
  125. vd.stride = stride * sizeof(float);
  126. descriptions.write[0] = vd;
  127. const Vector2 *points_ptr = p_points.ptr();
  128. for (uint32_t i = 0; i < vertex_count; i++) {
  129. fptr[base_offset + i * stride + 0] = points_ptr[i].x;
  130. fptr[base_offset + i * stride + 1] = points_ptr[i].y;
  131. }
  132. base_offset += 2;
  133. }
  134. //colors
  135. if ((uint32_t)p_colors.size() == vertex_count || p_colors.size() == 1) {
  136. RD::VertexAttribute vd;
  137. vd.format = RD::DATA_FORMAT_R32G32B32A32_SFLOAT;
  138. vd.offset = base_offset * sizeof(float);
  139. vd.location = RS::ARRAY_COLOR;
  140. vd.stride = stride * sizeof(float);
  141. descriptions.write[1] = vd;
  142. if (p_colors.size() == 1) {
  143. Color color = p_colors[0];
  144. for (uint32_t i = 0; i < vertex_count; i++) {
  145. fptr[base_offset + i * stride + 0] = color.r;
  146. fptr[base_offset + i * stride + 1] = color.g;
  147. fptr[base_offset + i * stride + 2] = color.b;
  148. fptr[base_offset + i * stride + 3] = color.a;
  149. }
  150. } else {
  151. const Color *color_ptr = p_colors.ptr();
  152. for (uint32_t i = 0; i < vertex_count; i++) {
  153. fptr[base_offset + i * stride + 0] = color_ptr[i].r;
  154. fptr[base_offset + i * stride + 1] = color_ptr[i].g;
  155. fptr[base_offset + i * stride + 2] = color_ptr[i].b;
  156. fptr[base_offset + i * stride + 3] = color_ptr[i].a;
  157. }
  158. }
  159. base_offset += 4;
  160. } else {
  161. RD::VertexAttribute vd;
  162. vd.format = RD::DATA_FORMAT_R32G32B32A32_SFLOAT;
  163. vd.offset = 0;
  164. vd.location = RS::ARRAY_COLOR;
  165. vd.stride = 0;
  166. descriptions.write[1] = vd;
  167. buffers.write[1] = storage->mesh_get_default_rd_buffer(RasterizerStorageRD::DEFAULT_RD_BUFFER_COLOR);
  168. }
  169. //uvs
  170. if ((uint32_t)p_uvs.size() == vertex_count) {
  171. RD::VertexAttribute vd;
  172. vd.format = RD::DATA_FORMAT_R32G32_SFLOAT;
  173. vd.offset = base_offset * sizeof(float);
  174. vd.location = RS::ARRAY_TEX_UV;
  175. vd.stride = stride * sizeof(float);
  176. descriptions.write[2] = vd;
  177. const Vector2 *uv_ptr = p_uvs.ptr();
  178. for (uint32_t i = 0; i < vertex_count; i++) {
  179. fptr[base_offset + i * stride + 0] = uv_ptr[i].x;
  180. fptr[base_offset + i * stride + 1] = uv_ptr[i].y;
  181. }
  182. base_offset += 2;
  183. } else {
  184. RD::VertexAttribute vd;
  185. vd.format = RD::DATA_FORMAT_R32G32_SFLOAT;
  186. vd.offset = 0;
  187. vd.location = RS::ARRAY_TEX_UV;
  188. vd.stride = 0;
  189. descriptions.write[2] = vd;
  190. buffers.write[2] = storage->mesh_get_default_rd_buffer(RasterizerStorageRD::DEFAULT_RD_BUFFER_TEX_UV);
  191. }
  192. //bones
  193. if ((uint32_t)p_indices.size() == vertex_count * 4 && (uint32_t)p_weights.size() == vertex_count * 4) {
  194. RD::VertexAttribute vd;
  195. vd.format = RD::DATA_FORMAT_R32G32B32A32_UINT;
  196. vd.offset = base_offset * sizeof(float);
  197. vd.location = RS::ARRAY_BONES;
  198. vd.stride = stride * sizeof(float);
  199. descriptions.write[3] = vd;
  200. const int *bone_ptr = p_bones.ptr();
  201. const float *weight_ptr = p_weights.ptr();
  202. for (uint32_t i = 0; i < vertex_count; i++) {
  203. uint16_t *bone16w = (uint16_t *)&uptr[base_offset + i * stride];
  204. uint16_t *weight16w = (uint16_t *)&uptr[base_offset + i * stride + 2];
  205. bone16w[0] = bone_ptr[i * 4 + 0];
  206. bone16w[1] = bone_ptr[i * 4 + 1];
  207. bone16w[2] = bone_ptr[i * 4 + 2];
  208. bone16w[3] = bone_ptr[i * 4 + 3];
  209. weight16w[0] = CLAMP(weight_ptr[i * 4 + 0] * 65535, 0, 65535);
  210. weight16w[1] = CLAMP(weight_ptr[i * 4 + 1] * 65535, 0, 65535);
  211. weight16w[2] = CLAMP(weight_ptr[i * 4 + 2] * 65535, 0, 65535);
  212. weight16w[3] = CLAMP(weight_ptr[i * 4 + 3] * 65535, 0, 65535);
  213. }
  214. base_offset += 4;
  215. } else {
  216. RD::VertexAttribute vd;
  217. vd.format = RD::DATA_FORMAT_R32G32B32A32_UINT;
  218. vd.offset = 0;
  219. vd.location = RS::ARRAY_BONES;
  220. vd.stride = 0;
  221. descriptions.write[3] = vd;
  222. buffers.write[3] = storage->mesh_get_default_rd_buffer(RasterizerStorageRD::DEFAULT_RD_BUFFER_BONES);
  223. }
  224. //check that everything is as it should be
  225. ERR_FAIL_COND_V(base_offset != stride, 0); //bug
  226. }
  227. RD::VertexFormatID vertex_id = RD::get_singleton()->vertex_format_create(descriptions);
  228. ERR_FAIL_COND_V(vertex_id == RD::INVALID_ID, 0);
  229. PolygonBuffers pb;
  230. pb.vertex_buffer = RD::get_singleton()->vertex_buffer_create(polygon_buffer.size(), polygon_buffer);
  231. for (int i = 0; i < descriptions.size(); i++) {
  232. if (buffers[i] == RID()) { //if put in vertex, use as vertex
  233. buffers.write[i] = pb.vertex_buffer;
  234. }
  235. }
  236. pb.vertex_array = RD::get_singleton()->vertex_array_create(p_points.size(), vertex_id, buffers);
  237. if (p_indices.size()) {
  238. //create indices, as indices were requested
  239. Vector<uint8_t> index_buffer;
  240. index_buffer.resize(p_indices.size() * sizeof(int32_t));
  241. {
  242. uint8_t *w = index_buffer.ptrw();
  243. copymem(w, p_indices.ptr(), sizeof(int32_t) * p_indices.size());
  244. }
  245. pb.index_buffer = RD::get_singleton()->index_buffer_create(p_indices.size(), RD::INDEX_BUFFER_FORMAT_UINT32, index_buffer);
  246. pb.indices = RD::get_singleton()->index_array_create(pb.index_buffer, 0, p_indices.size());
  247. }
  248. pb.vertex_format_id = vertex_id;
  249. PolygonID id = polygon_buffers.last_id++;
  250. polygon_buffers.polygons[id] = pb;
  251. return id;
  252. }
  253. void RasterizerCanvasRD::free_polygon(PolygonID p_polygon) {
  254. PolygonBuffers *pb_ptr = polygon_buffers.polygons.getptr(p_polygon);
  255. ERR_FAIL_COND(!pb_ptr);
  256. PolygonBuffers &pb = *pb_ptr;
  257. if (pb.indices.is_valid()) {
  258. RD::get_singleton()->free(pb.indices);
  259. }
  260. if (pb.index_buffer.is_valid()) {
  261. RD::get_singleton()->free(pb.index_buffer);
  262. }
  263. RD::get_singleton()->free(pb.vertex_array);
  264. RD::get_singleton()->free(pb.vertex_buffer);
  265. polygon_buffers.polygons.erase(p_polygon);
  266. }
  267. ////////////////////
  268. void RasterizerCanvasRD::_bind_canvas_texture(RD::DrawListID p_draw_list, RID p_texture, RS::CanvasItemTextureFilter p_base_filter, RS::CanvasItemTextureRepeat p_base_repeat, RID &r_last_texture, PushConstant &push_constant, Size2 &r_texpixel_size) {
  269. if (p_texture == RID()) {
  270. p_texture = default_canvas_texture;
  271. }
  272. if (r_last_texture == p_texture) {
  273. return; //nothing to do, its the same
  274. }
  275. RID uniform_set;
  276. Color specular_shininess;
  277. Size2i size;
  278. bool use_normal;
  279. bool use_specular;
  280. bool success = storage->canvas_texture_get_uniform_set(p_texture, p_base_filter, p_base_repeat, shader.default_version_rd_shader, CANVAS_TEXTURE_UNIFORM_SET, uniform_set, size, specular_shininess, use_normal, use_specular);
  281. //something odd happened
  282. if (!success) {
  283. _bind_canvas_texture(p_draw_list, default_canvas_texture, p_base_filter, p_base_repeat, r_last_texture, push_constant, r_texpixel_size);
  284. return;
  285. }
  286. RD::get_singleton()->draw_list_bind_uniform_set(p_draw_list, uniform_set, CANVAS_TEXTURE_UNIFORM_SET);
  287. if (specular_shininess.a < 0.999) {
  288. push_constant.flags |= FLAGS_DEFAULT_SPECULAR_MAP_USED;
  289. } else {
  290. push_constant.flags &= ~FLAGS_DEFAULT_SPECULAR_MAP_USED;
  291. }
  292. if (use_normal) {
  293. push_constant.flags |= FLAGS_DEFAULT_NORMAL_MAP_USED;
  294. } else {
  295. push_constant.flags &= ~FLAGS_DEFAULT_NORMAL_MAP_USED;
  296. }
  297. push_constant.specular_shininess = uint32_t(CLAMP(specular_shininess.a * 255.0, 0, 255)) << 24;
  298. push_constant.specular_shininess |= uint32_t(CLAMP(specular_shininess.b * 255.0, 0, 255)) << 16;
  299. push_constant.specular_shininess |= uint32_t(CLAMP(specular_shininess.g * 255.0, 0, 255)) << 8;
  300. push_constant.specular_shininess |= uint32_t(CLAMP(specular_shininess.r * 255.0, 0, 255));
  301. r_texpixel_size.x = 1.0 / float(size.x);
  302. r_texpixel_size.y = 1.0 / float(size.y);
  303. push_constant.color_texture_pixel_size[0] = r_texpixel_size.x;
  304. push_constant.color_texture_pixel_size[1] = r_texpixel_size.y;
  305. r_last_texture = p_texture;
  306. }
  307. void RasterizerCanvasRD::_render_item(RD::DrawListID p_draw_list, const Item *p_item, RD::FramebufferFormatID p_framebuffer_format, const Transform2D &p_canvas_transform_inverse, Item *&current_clip, Light *p_lights, PipelineVariants *p_pipeline_variants) {
  308. //create an empty push constant
  309. RS::CanvasItemTextureFilter current_filter = default_filter;
  310. RS::CanvasItemTextureRepeat current_repeat = default_repeat;
  311. if (p_item->texture_filter != RS::CANVAS_ITEM_TEXTURE_FILTER_DEFAULT) {
  312. current_filter = p_item->texture_filter;
  313. }
  314. if (p_item->texture_repeat != RS::CANVAS_ITEM_TEXTURE_REPEAT_DEFAULT) {
  315. current_repeat = p_item->texture_repeat;
  316. }
  317. PushConstant push_constant;
  318. Transform2D base_transform = p_canvas_transform_inverse * p_item->final_transform;
  319. _update_transform_2d_to_mat2x3(base_transform, push_constant.world);
  320. Color base_color = p_item->final_modulate;
  321. for (int i = 0; i < 4; i++) {
  322. push_constant.modulation[i] = 0;
  323. push_constant.ninepatch_margins[i] = 0;
  324. push_constant.src_rect[i] = 0;
  325. push_constant.dst_rect[i] = 0;
  326. }
  327. push_constant.flags = 0;
  328. push_constant.color_texture_pixel_size[0] = 0;
  329. push_constant.color_texture_pixel_size[1] = 0;
  330. push_constant.pad[0] = 0;
  331. push_constant.pad[1] = 0;
  332. push_constant.lights[0] = 0;
  333. push_constant.lights[1] = 0;
  334. push_constant.lights[2] = 0;
  335. push_constant.lights[3] = 0;
  336. uint32_t base_flags = 0;
  337. uint16_t light_count = 0;
  338. PipelineLightMode light_mode;
  339. {
  340. Light *light = p_lights;
  341. while (light) {
  342. if (light->render_index_cache >= 0 && p_item->light_mask & light->item_mask && p_item->z_final >= light->z_min && p_item->z_final <= light->z_max && p_item->global_rect_cache.intersects_transformed(light->xform_cache, light->rect_cache)) {
  343. uint32_t light_index = light->render_index_cache;
  344. push_constant.lights[light_count >> 2] |= light_index << ((light_count & 3) * 8);
  345. light_count++;
  346. if (light_count == MAX_LIGHTS_PER_ITEM) {
  347. break;
  348. }
  349. }
  350. light = light->next_ptr;
  351. }
  352. base_flags |= light_count << FLAGS_LIGHT_COUNT_SHIFT;
  353. }
  354. light_mode = (light_count > 0 || using_directional_lights) ? PIPELINE_LIGHT_MODE_ENABLED : PIPELINE_LIGHT_MODE_DISABLED;
  355. PipelineVariants *pipeline_variants = p_pipeline_variants;
  356. bool reclip = false;
  357. RID last_texture;
  358. Size2 texpixel_size;
  359. const Item::Command *c = p_item->commands;
  360. while (c) {
  361. push_constant.flags = base_flags | (push_constant.flags & (FLAGS_DEFAULT_NORMAL_MAP_USED | FLAGS_DEFAULT_SPECULAR_MAP_USED)); //reset on each command for sanity, keep canvastexture binding config
  362. switch (c->type) {
  363. case Item::Command::TYPE_RECT: {
  364. const Item::CommandRect *rect = static_cast<const Item::CommandRect *>(c);
  365. //bind pipeline
  366. {
  367. RID pipeline = pipeline_variants->variants[light_mode][PIPELINE_VARIANT_QUAD].get_render_pipeline(RD::INVALID_ID, p_framebuffer_format);
  368. RD::get_singleton()->draw_list_bind_render_pipeline(p_draw_list, pipeline);
  369. }
  370. //bind textures
  371. _bind_canvas_texture(p_draw_list, rect->texture, current_filter, current_repeat, last_texture, push_constant, texpixel_size);
  372. Rect2 src_rect;
  373. Rect2 dst_rect;
  374. if (rect->texture != RID()) {
  375. src_rect = (rect->flags & CANVAS_RECT_REGION) ? Rect2(rect->source.position * texpixel_size, rect->source.size * texpixel_size) : Rect2(0, 0, 1, 1);
  376. dst_rect = Rect2(rect->rect.position, rect->rect.size);
  377. if (dst_rect.size.width < 0) {
  378. dst_rect.position.x += dst_rect.size.width;
  379. dst_rect.size.width *= -1;
  380. }
  381. if (dst_rect.size.height < 0) {
  382. dst_rect.position.y += dst_rect.size.height;
  383. dst_rect.size.height *= -1;
  384. }
  385. if (rect->flags & CANVAS_RECT_FLIP_H) {
  386. src_rect.size.x *= -1;
  387. }
  388. if (rect->flags & CANVAS_RECT_FLIP_V) {
  389. src_rect.size.y *= -1;
  390. }
  391. if (rect->flags & CANVAS_RECT_TRANSPOSE) {
  392. dst_rect.size.x *= -1; // Encoding in the dst_rect.z uniform
  393. }
  394. if (rect->flags & CANVAS_RECT_CLIP_UV) {
  395. push_constant.flags |= FLAGS_CLIP_RECT_UV;
  396. }
  397. } else {
  398. dst_rect = Rect2(rect->rect.position, rect->rect.size);
  399. if (dst_rect.size.width < 0) {
  400. dst_rect.position.x += dst_rect.size.width;
  401. dst_rect.size.width *= -1;
  402. }
  403. if (dst_rect.size.height < 0) {
  404. dst_rect.position.y += dst_rect.size.height;
  405. dst_rect.size.height *= -1;
  406. }
  407. src_rect = Rect2(0, 0, 1, 1);
  408. }
  409. push_constant.modulation[0] = rect->modulate.r * base_color.r;
  410. push_constant.modulation[1] = rect->modulate.g * base_color.g;
  411. push_constant.modulation[2] = rect->modulate.b * base_color.b;
  412. push_constant.modulation[3] = rect->modulate.a * base_color.a;
  413. push_constant.src_rect[0] = src_rect.position.x;
  414. push_constant.src_rect[1] = src_rect.position.y;
  415. push_constant.src_rect[2] = src_rect.size.width;
  416. push_constant.src_rect[3] = src_rect.size.height;
  417. push_constant.dst_rect[0] = dst_rect.position.x;
  418. push_constant.dst_rect[1] = dst_rect.position.y;
  419. push_constant.dst_rect[2] = dst_rect.size.width;
  420. push_constant.dst_rect[3] = dst_rect.size.height;
  421. RD::get_singleton()->draw_list_set_push_constant(p_draw_list, &push_constant, sizeof(PushConstant));
  422. RD::get_singleton()->draw_list_bind_index_array(p_draw_list, shader.quad_index_array);
  423. RD::get_singleton()->draw_list_draw(p_draw_list, true);
  424. } break;
  425. case Item::Command::TYPE_NINEPATCH: {
  426. const Item::CommandNinePatch *np = static_cast<const Item::CommandNinePatch *>(c);
  427. //bind pipeline
  428. {
  429. RID pipeline = pipeline_variants->variants[light_mode][PIPELINE_VARIANT_NINEPATCH].get_render_pipeline(RD::INVALID_ID, p_framebuffer_format);
  430. RD::get_singleton()->draw_list_bind_render_pipeline(p_draw_list, pipeline);
  431. }
  432. //bind textures
  433. _bind_canvas_texture(p_draw_list, np->texture, current_filter, current_repeat, last_texture, push_constant, texpixel_size);
  434. Rect2 src_rect;
  435. Rect2 dst_rect(np->rect.position.x, np->rect.position.y, np->rect.size.x, np->rect.size.y);
  436. if (np->texture == RID()) {
  437. texpixel_size = Size2(1, 1);
  438. src_rect = Rect2(0, 0, 1, 1);
  439. } else {
  440. if (np->source != Rect2()) {
  441. src_rect = Rect2(np->source.position.x * texpixel_size.width, np->source.position.y * texpixel_size.height, np->source.size.x * texpixel_size.width, np->source.size.y * texpixel_size.height);
  442. push_constant.color_texture_pixel_size[0] = 1.0 / np->source.size.width;
  443. push_constant.color_texture_pixel_size[1] = 1.0 / np->source.size.height;
  444. } else {
  445. src_rect = Rect2(0, 0, 1, 1);
  446. }
  447. }
  448. push_constant.modulation[0] = np->color.r * base_color.r;
  449. push_constant.modulation[1] = np->color.g * base_color.g;
  450. push_constant.modulation[2] = np->color.b * base_color.b;
  451. push_constant.modulation[3] = np->color.a * base_color.a;
  452. push_constant.src_rect[0] = src_rect.position.x;
  453. push_constant.src_rect[1] = src_rect.position.y;
  454. push_constant.src_rect[2] = src_rect.size.width;
  455. push_constant.src_rect[3] = src_rect.size.height;
  456. push_constant.dst_rect[0] = dst_rect.position.x;
  457. push_constant.dst_rect[1] = dst_rect.position.y;
  458. push_constant.dst_rect[2] = dst_rect.size.width;
  459. push_constant.dst_rect[3] = dst_rect.size.height;
  460. push_constant.flags |= int(np->axis_x) << FLAGS_NINEPATCH_H_MODE_SHIFT;
  461. push_constant.flags |= int(np->axis_y) << FLAGS_NINEPATCH_V_MODE_SHIFT;
  462. if (np->draw_center) {
  463. push_constant.flags |= FLAGS_NINEPACH_DRAW_CENTER;
  464. }
  465. push_constant.ninepatch_margins[0] = np->margin[MARGIN_LEFT];
  466. push_constant.ninepatch_margins[1] = np->margin[MARGIN_TOP];
  467. push_constant.ninepatch_margins[2] = np->margin[MARGIN_RIGHT];
  468. push_constant.ninepatch_margins[3] = np->margin[MARGIN_BOTTOM];
  469. RD::get_singleton()->draw_list_set_push_constant(p_draw_list, &push_constant, sizeof(PushConstant));
  470. RD::get_singleton()->draw_list_bind_index_array(p_draw_list, shader.quad_index_array);
  471. RD::get_singleton()->draw_list_draw(p_draw_list, true);
  472. //restore if overrided
  473. push_constant.color_texture_pixel_size[0] = texpixel_size.x;
  474. push_constant.color_texture_pixel_size[1] = texpixel_size.y;
  475. } break;
  476. case Item::Command::TYPE_POLYGON: {
  477. const Item::CommandPolygon *polygon = static_cast<const Item::CommandPolygon *>(c);
  478. PolygonBuffers *pb = polygon_buffers.polygons.getptr(polygon->polygon.polygon_id);
  479. ERR_CONTINUE(!pb);
  480. //bind pipeline
  481. {
  482. static const PipelineVariant variant[RS::PRIMITIVE_MAX] = { PIPELINE_VARIANT_ATTRIBUTE_POINTS, PIPELINE_VARIANT_ATTRIBUTE_LINES, PIPELINE_VARIANT_ATTRIBUTE_LINES_STRIP, PIPELINE_VARIANT_ATTRIBUTE_TRIANGLES, PIPELINE_VARIANT_ATTRIBUTE_TRIANGLE_STRIP };
  483. ERR_CONTINUE(polygon->primitive < 0 || polygon->primitive >= RS::PRIMITIVE_MAX);
  484. RID pipeline = pipeline_variants->variants[light_mode][variant[polygon->primitive]].get_render_pipeline(pb->vertex_format_id, p_framebuffer_format);
  485. RD::get_singleton()->draw_list_bind_render_pipeline(p_draw_list, pipeline);
  486. }
  487. if (polygon->primitive == RS::PRIMITIVE_LINES) {
  488. //not supported in most hardware, so pointless
  489. //RD::get_singleton()->draw_list_set_line_width(p_draw_list, polygon->line_width);
  490. }
  491. //bind textures
  492. _bind_canvas_texture(p_draw_list, polygon->texture, current_filter, current_repeat, last_texture, push_constant, texpixel_size);
  493. push_constant.modulation[0] = base_color.r;
  494. push_constant.modulation[1] = base_color.g;
  495. push_constant.modulation[2] = base_color.b;
  496. push_constant.modulation[3] = base_color.a;
  497. for (int j = 0; j < 4; j++) {
  498. push_constant.src_rect[j] = 0;
  499. push_constant.dst_rect[j] = 0;
  500. push_constant.ninepatch_margins[j] = 0;
  501. }
  502. RD::get_singleton()->draw_list_set_push_constant(p_draw_list, &push_constant, sizeof(PushConstant));
  503. RD::get_singleton()->draw_list_bind_vertex_array(p_draw_list, pb->vertex_array);
  504. if (pb->indices.is_valid()) {
  505. RD::get_singleton()->draw_list_bind_index_array(p_draw_list, pb->indices);
  506. }
  507. RD::get_singleton()->draw_list_draw(p_draw_list, pb->indices.is_valid());
  508. } break;
  509. case Item::Command::TYPE_PRIMITIVE: {
  510. const Item::CommandPrimitive *primitive = static_cast<const Item::CommandPrimitive *>(c);
  511. //bind pipeline
  512. {
  513. static const PipelineVariant variant[4] = { PIPELINE_VARIANT_PRIMITIVE_POINTS, PIPELINE_VARIANT_PRIMITIVE_LINES, PIPELINE_VARIANT_PRIMITIVE_TRIANGLES, PIPELINE_VARIANT_PRIMITIVE_TRIANGLES };
  514. ERR_CONTINUE(primitive->point_count == 0 || primitive->point_count > 4);
  515. RID pipeline = pipeline_variants->variants[light_mode][variant[primitive->point_count - 1]].get_render_pipeline(RD::INVALID_ID, p_framebuffer_format);
  516. RD::get_singleton()->draw_list_bind_render_pipeline(p_draw_list, pipeline);
  517. }
  518. //bind textures
  519. _bind_canvas_texture(p_draw_list, RID(), current_filter, current_repeat, last_texture, push_constant, texpixel_size);
  520. RD::get_singleton()->draw_list_bind_index_array(p_draw_list, primitive_arrays.index_array[MIN(3, primitive->point_count) - 1]);
  521. for (uint32_t j = 0; j < MIN(3, primitive->point_count); j++) {
  522. push_constant.points[j * 2 + 0] = primitive->points[j].x;
  523. push_constant.points[j * 2 + 1] = primitive->points[j].y;
  524. push_constant.uvs[j * 2 + 0] = primitive->uvs[j].x;
  525. push_constant.uvs[j * 2 + 1] = primitive->uvs[j].y;
  526. Color col = primitive->colors[j] * base_color;
  527. push_constant.colors[j * 2 + 0] = (uint32_t(Math::make_half_float(col.g)) << 16) | Math::make_half_float(col.r);
  528. push_constant.colors[j * 2 + 1] = (uint32_t(Math::make_half_float(col.a)) << 16) | Math::make_half_float(col.b);
  529. }
  530. RD::get_singleton()->draw_list_set_push_constant(p_draw_list, &push_constant, sizeof(PushConstant));
  531. RD::get_singleton()->draw_list_draw(p_draw_list, true);
  532. if (primitive->point_count == 4) {
  533. for (uint32_t j = 1; j < 3; j++) {
  534. //second half of triangle
  535. push_constant.points[j * 2 + 0] = primitive->points[j + 1].x;
  536. push_constant.points[j * 2 + 1] = primitive->points[j + 1].y;
  537. push_constant.uvs[j * 2 + 0] = primitive->uvs[j + 1].x;
  538. push_constant.uvs[j * 2 + 1] = primitive->uvs[j + 1].y;
  539. Color col = primitive->colors[j + 1] * base_color;
  540. push_constant.colors[j * 2 + 0] = (uint32_t(Math::make_half_float(col.g)) << 16) | Math::make_half_float(col.r);
  541. push_constant.colors[j * 2 + 1] = (uint32_t(Math::make_half_float(col.a)) << 16) | Math::make_half_float(col.b);
  542. }
  543. RD::get_singleton()->draw_list_set_push_constant(p_draw_list, &push_constant, sizeof(PushConstant));
  544. RD::get_singleton()->draw_list_draw(p_draw_list, true);
  545. }
  546. } break;
  547. case Item::Command::TYPE_MESH:
  548. case Item::Command::TYPE_MULTIMESH:
  549. case Item::Command::TYPE_PARTICLES: {
  550. ERR_PRINT("FIXME: Mesh, MultiMesh and Particles render commands are unimplemented currently, they need to be ported to the 4.0 rendering architecture.");
  551. #ifndef _MSC_VER
  552. #warning Item::Command types for Mesh, MultiMesh and Particles need to be implemented.
  553. #endif
  554. // See #if 0'ed code below to port from GLES3.
  555. } break;
  556. #if 0
  557. case Item::Command::TYPE_MESH: {
  558. Item::CommandMesh *mesh = static_cast<Item::CommandMesh *>(c);
  559. _set_texture_rect_mode(false);
  560. RasterizerStorageGLES3::Texture *texture = _bind_canvas_texture(mesh->texture, mesh->normal_map);
  561. if (texture) {
  562. Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height);
  563. state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size);
  564. }
  565. state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX, state.final_transform * mesh->transform);
  566. RasterizerStorageGLES3::Mesh *mesh_data = storage->mesh_owner.getornull(mesh->mesh);
  567. if (mesh_data) {
  568. for (int j = 0; j < mesh_data->surfaces.size(); j++) {
  569. RasterizerStorageGLES3::Surface *s = mesh_data->surfaces[j];
  570. // materials are ignored in 2D meshes, could be added but many things (ie, lighting mode, reading from screen, etc) would break as they are not meant be set up at this point of drawing
  571. glBindVertexArray(s->array_id);
  572. glVertexAttrib4f(RS::ARRAY_COLOR, mesh->modulate.r, mesh->modulate.g, mesh->modulate.b, mesh->modulate.a);
  573. if (s->index_array_len) {
  574. glDrawElements(gl_primitive[s->primitive], s->index_array_len, (s->array_len >= (1 << 16)) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT, 0);
  575. } else {
  576. glDrawArrays(gl_primitive[s->primitive], 0, s->array_len);
  577. }
  578. glBindVertexArray(0);
  579. }
  580. }
  581. state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX, state.final_transform);
  582. } break;
  583. case Item::Command::TYPE_MULTIMESH: {
  584. Item::CommandMultiMesh *mmesh = static_cast<Item::CommandMultiMesh *>(c);
  585. RasterizerStorageGLES3::MultiMesh *multi_mesh = storage->multimesh_owner.getornull(mmesh->multimesh);
  586. if (!multi_mesh)
  587. break;
  588. RasterizerStorageGLES3::Mesh *mesh_data = storage->mesh_owner.getornull(multi_mesh->mesh);
  589. if (!mesh_data)
  590. break;
  591. RasterizerStorageGLES3::Texture *texture = _bind_canvas_texture(mmesh->texture, mmesh->normal_map);
  592. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCE_CUSTOM, multi_mesh->custom_data_format != RS::MULTIMESH_CUSTOM_DATA_NONE);
  593. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCING, true);
  594. //reset shader and force rebind
  595. state.using_texture_rect = true;
  596. _set_texture_rect_mode(false);
  597. if (texture) {
  598. Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height);
  599. state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size);
  600. }
  601. int amount = MIN(multi_mesh->size, multi_mesh->visible_instances);
  602. if (amount == -1) {
  603. amount = multi_mesh->size;
  604. }
  605. for (int j = 0; j < mesh_data->surfaces.size(); j++) {
  606. RasterizerStorageGLES3::Surface *s = mesh_data->surfaces[j];
  607. // materials are ignored in 2D meshes, could be added but many things (ie, lighting mode, reading from screen, etc) would break as they are not meant be set up at this point of drawing
  608. glBindVertexArray(s->instancing_array_id);
  609. glBindBuffer(GL_ARRAY_BUFFER, multi_mesh->buffer); //modify the buffer
  610. int stride = (multi_mesh->xform_floats + multi_mesh->color_floats + multi_mesh->custom_data_floats) * 4;
  611. glEnableVertexAttribArray(8);
  612. glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(0));
  613. glVertexAttribDivisor(8, 1);
  614. glEnableVertexAttribArray(9);
  615. glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(4 * 4));
  616. glVertexAttribDivisor(9, 1);
  617. int color_ofs;
  618. if (multi_mesh->transform_format == RS::MULTIMESH_TRANSFORM_3D) {
  619. glEnableVertexAttribArray(10);
  620. glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(8 * 4));
  621. glVertexAttribDivisor(10, 1);
  622. color_ofs = 12 * 4;
  623. } else {
  624. glDisableVertexAttribArray(10);
  625. glVertexAttrib4f(10, 0, 0, 1, 0);
  626. color_ofs = 8 * 4;
  627. }
  628. int custom_data_ofs = color_ofs;
  629. switch (multi_mesh->color_format) {
  630. case RS::MULTIMESH_COLOR_NONE: {
  631. glDisableVertexAttribArray(11);
  632. glVertexAttrib4f(11, 1, 1, 1, 1);
  633. } break;
  634. case RS::MULTIMESH_COLOR_8BIT: {
  635. glEnableVertexAttribArray(11);
  636. glVertexAttribPointer(11, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, CAST_INT_TO_UCHAR_PTR(color_ofs));
  637. glVertexAttribDivisor(11, 1);
  638. custom_data_ofs += 4;
  639. } break;
  640. case RS::MULTIMESH_COLOR_FLOAT: {
  641. glEnableVertexAttribArray(11);
  642. glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(color_ofs));
  643. glVertexAttribDivisor(11, 1);
  644. custom_data_ofs += 4 * 4;
  645. } break;
  646. }
  647. switch (multi_mesh->custom_data_format) {
  648. case RS::MULTIMESH_CUSTOM_DATA_NONE: {
  649. glDisableVertexAttribArray(12);
  650. glVertexAttrib4f(12, 1, 1, 1, 1);
  651. } break;
  652. case RS::MULTIMESH_CUSTOM_DATA_8BIT: {
  653. glEnableVertexAttribArray(12);
  654. glVertexAttribPointer(12, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, CAST_INT_TO_UCHAR_PTR(custom_data_ofs));
  655. glVertexAttribDivisor(12, 1);
  656. } break;
  657. case RS::MULTIMESH_CUSTOM_DATA_FLOAT: {
  658. glEnableVertexAttribArray(12);
  659. glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(custom_data_ofs));
  660. glVertexAttribDivisor(12, 1);
  661. } break;
  662. }
  663. if (s->index_array_len) {
  664. glDrawElementsInstanced(gl_primitive[s->primitive], s->index_array_len, (s->array_len >= (1 << 16)) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT, 0, amount);
  665. } else {
  666. glDrawArraysInstanced(gl_primitive[s->primitive], 0, s->array_len, amount);
  667. }
  668. glBindVertexArray(0);
  669. }
  670. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCE_CUSTOM, false);
  671. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCING, false);
  672. state.using_texture_rect = true;
  673. _set_texture_rect_mode(false);
  674. } break;
  675. case Item::Command::TYPE_PARTICLES: {
  676. Item::CommandParticles *particles_cmd = static_cast<Item::CommandParticles *>(c);
  677. RasterizerStorageGLES3::Particles *particles = storage->particles_owner.getornull(particles_cmd->particles);
  678. if (!particles)
  679. break;
  680. if (particles->inactive && !particles->emitting)
  681. break;
  682. glVertexAttrib4f(RS::ARRAY_COLOR, 1, 1, 1, 1); //not used, so keep white
  683. RenderingServerRaster::redraw_request();
  684. storage->particles_request_process(particles_cmd->particles);
  685. //enable instancing
  686. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCE_CUSTOM, true);
  687. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_PARTICLES, true);
  688. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCING, true);
  689. //reset shader and force rebind
  690. state.using_texture_rect = true;
  691. _set_texture_rect_mode(false);
  692. RasterizerStorageGLES3::Texture *texture = _bind_canvas_texture(particles_cmd->texture, particles_cmd->normal_map);
  693. if (texture) {
  694. Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height);
  695. state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size);
  696. } else {
  697. state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, Vector2(1.0, 1.0));
  698. }
  699. if (!particles->use_local_coords) {
  700. Transform2D inv_xf;
  701. inv_xf.set_axis(0, Vector2(particles->emission_transform.basis.get_axis(0).x, particles->emission_transform.basis.get_axis(0).y));
  702. inv_xf.set_axis(1, Vector2(particles->emission_transform.basis.get_axis(1).x, particles->emission_transform.basis.get_axis(1).y));
  703. inv_xf.set_origin(Vector2(particles->emission_transform.get_origin().x, particles->emission_transform.get_origin().y));
  704. inv_xf.affine_invert();
  705. state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX, state.final_transform * inv_xf);
  706. }
  707. glBindVertexArray(data.particle_quad_array); //use particle quad array
  708. glBindBuffer(GL_ARRAY_BUFFER, particles->particle_buffers[0]); //bind particle buffer
  709. int stride = sizeof(float) * 4 * 6;
  710. int amount = particles->amount;
  711. if (particles->draw_order != RS::PARTICLES_DRAW_ORDER_LIFETIME) {
  712. glEnableVertexAttribArray(8); //xform x
  713. glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 3));
  714. glVertexAttribDivisor(8, 1);
  715. glEnableVertexAttribArray(9); //xform y
  716. glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 4));
  717. glVertexAttribDivisor(9, 1);
  718. glEnableVertexAttribArray(10); //xform z
  719. glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 5));
  720. glVertexAttribDivisor(10, 1);
  721. glEnableVertexAttribArray(11); //color
  722. glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, nullptr);
  723. glVertexAttribDivisor(11, 1);
  724. glEnableVertexAttribArray(12); //custom
  725. glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 2));
  726. glVertexAttribDivisor(12, 1);
  727. glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, amount);
  728. } else {
  729. //split
  730. int split = int(Math::ceil(particles->phase * particles->amount));
  731. if (amount - split > 0) {
  732. glEnableVertexAttribArray(8); //xform x
  733. glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(stride * split + sizeof(float) * 4 * 3));
  734. glVertexAttribDivisor(8, 1);
  735. glEnableVertexAttribArray(9); //xform y
  736. glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(stride * split + sizeof(float) * 4 * 4));
  737. glVertexAttribDivisor(9, 1);
  738. glEnableVertexAttribArray(10); //xform z
  739. glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(stride * split + sizeof(float) * 4 * 5));
  740. glVertexAttribDivisor(10, 1);
  741. glEnableVertexAttribArray(11); //color
  742. glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(stride * split + 0));
  743. glVertexAttribDivisor(11, 1);
  744. glEnableVertexAttribArray(12); //custom
  745. glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(stride * split + sizeof(float) * 4 * 2));
  746. glVertexAttribDivisor(12, 1);
  747. glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, amount - split);
  748. }
  749. if (split > 0) {
  750. glEnableVertexAttribArray(8); //xform x
  751. glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 3));
  752. glVertexAttribDivisor(8, 1);
  753. glEnableVertexAttribArray(9); //xform y
  754. glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 4));
  755. glVertexAttribDivisor(9, 1);
  756. glEnableVertexAttribArray(10); //xform z
  757. glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 5));
  758. glVertexAttribDivisor(10, 1);
  759. glEnableVertexAttribArray(11); //color
  760. glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, nullptr);
  761. glVertexAttribDivisor(11, 1);
  762. glEnableVertexAttribArray(12); //custom
  763. glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, CAST_INT_TO_UCHAR_PTR(sizeof(float) * 4 * 2));
  764. glVertexAttribDivisor(12, 1);
  765. glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, split);
  766. }
  767. }
  768. glBindVertexArray(0);
  769. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCE_CUSTOM, false);
  770. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_PARTICLES, false);
  771. state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCING, false);
  772. state.using_texture_rect = true;
  773. _set_texture_rect_mode(false);
  774. } break;
  775. #endif
  776. case Item::Command::TYPE_TRANSFORM: {
  777. const Item::CommandTransform *transform = static_cast<const Item::CommandTransform *>(c);
  778. _update_transform_2d_to_mat2x3(base_transform * transform->xform, push_constant.world);
  779. } break;
  780. case Item::Command::TYPE_CLIP_IGNORE: {
  781. const Item::CommandClipIgnore *ci = static_cast<const Item::CommandClipIgnore *>(c);
  782. if (current_clip) {
  783. if (ci->ignore != reclip) {
  784. if (ci->ignore) {
  785. RD::get_singleton()->draw_list_disable_scissor(p_draw_list);
  786. reclip = true;
  787. } else {
  788. RD::get_singleton()->draw_list_enable_scissor(p_draw_list, current_clip->final_clip_rect);
  789. reclip = false;
  790. }
  791. }
  792. }
  793. } break;
  794. }
  795. c = c->next;
  796. }
  797. if (current_clip && reclip) {
  798. //will make it re-enable clipping if needed afterwards
  799. current_clip = nullptr;
  800. }
  801. }
  802. RID RasterizerCanvasRD::_create_base_uniform_set(RID p_to_render_target, bool p_backbuffer) {
  803. //re create canvas state
  804. Vector<RD::Uniform> uniforms;
  805. {
  806. RD::Uniform u;
  807. u.type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  808. u.binding = 1;
  809. u.ids.push_back(state.canvas_state_buffer);
  810. uniforms.push_back(u);
  811. }
  812. {
  813. RD::Uniform u;
  814. u.type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  815. u.binding = 2;
  816. u.ids.push_back(state.lights_uniform_buffer);
  817. uniforms.push_back(u);
  818. }
  819. {
  820. RD::Uniform u;
  821. u.type = RD::UNIFORM_TYPE_TEXTURE;
  822. u.binding = 3;
  823. u.ids.push_back(storage->decal_atlas_get_texture());
  824. uniforms.push_back(u);
  825. }
  826. {
  827. RD::Uniform u;
  828. u.type = RD::UNIFORM_TYPE_TEXTURE;
  829. u.binding = 4;
  830. u.ids.push_back(state.shadow_texture);
  831. uniforms.push_back(u);
  832. }
  833. {
  834. RD::Uniform u;
  835. u.type = RD::UNIFORM_TYPE_SAMPLER;
  836. u.binding = 5;
  837. u.ids.push_back(state.shadow_sampler);
  838. uniforms.push_back(u);
  839. }
  840. {
  841. RD::Uniform u;
  842. u.type = RD::UNIFORM_TYPE_TEXTURE;
  843. u.binding = 6;
  844. RID screen;
  845. if (p_backbuffer) {
  846. screen = storage->render_target_get_rd_texture(p_to_render_target);
  847. } else {
  848. screen = storage->render_target_get_rd_backbuffer(p_to_render_target);
  849. if (screen.is_null()) { //unallocated backbuffer
  850. screen = storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_WHITE);
  851. }
  852. }
  853. u.ids.push_back(screen);
  854. uniforms.push_back(u);
  855. }
  856. {
  857. RD::Uniform u;
  858. u.type = RD::UNIFORM_TYPE_TEXTURE;
  859. u.binding = 7;
  860. RID sdf = storage->render_target_get_sdf_texture(p_to_render_target);
  861. u.ids.push_back(sdf);
  862. uniforms.push_back(u);
  863. }
  864. {
  865. //needs samplers for the material (uses custom textures) create them
  866. RD::Uniform u;
  867. u.type = RD::UNIFORM_TYPE_SAMPLER;
  868. u.binding = 8;
  869. u.ids.resize(12);
  870. RID *ids_ptr = u.ids.ptrw();
  871. ids_ptr[0] = storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
  872. ids_ptr[1] = storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
  873. ids_ptr[2] = storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
  874. ids_ptr[3] = storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
  875. ids_ptr[4] = storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
  876. ids_ptr[5] = storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
  877. ids_ptr[6] = storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, RS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
  878. ids_ptr[7] = storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
  879. ids_ptr[8] = storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
  880. ids_ptr[9] = storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS, RS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
  881. ids_ptr[10] = storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
  882. ids_ptr[11] = storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC, RS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED);
  883. uniforms.push_back(u);
  884. }
  885. {
  886. RD::Uniform u;
  887. u.type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
  888. u.binding = 9;
  889. u.ids.push_back(storage->global_variables_get_storage_buffer());
  890. uniforms.push_back(u);
  891. }
  892. RID uniform_set = RD::get_singleton()->uniform_set_create(uniforms, shader.default_version_rd_shader, BASE_UNIFORM_SET);
  893. if (p_backbuffer) {
  894. storage->render_target_set_backbuffer_uniform_set(p_to_render_target, uniform_set);
  895. } else {
  896. storage->render_target_set_framebuffer_uniform_set(p_to_render_target, uniform_set);
  897. }
  898. return uniform_set;
  899. }
  900. void RasterizerCanvasRD::_render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, bool p_to_backbuffer) {
  901. Item *current_clip = nullptr;
  902. Transform2D canvas_transform_inverse = p_canvas_transform_inverse;
  903. RID framebuffer;
  904. RID fb_uniform_set;
  905. bool clear = false;
  906. Vector<Color> clear_colors;
  907. if (p_to_backbuffer) {
  908. framebuffer = storage->render_target_get_rd_backbuffer_framebuffer(p_to_render_target);
  909. fb_uniform_set = storage->render_target_get_backbuffer_uniform_set(p_to_render_target);
  910. } else {
  911. framebuffer = storage->render_target_get_rd_framebuffer(p_to_render_target);
  912. if (storage->render_target_is_clear_requested(p_to_render_target)) {
  913. clear = true;
  914. clear_colors.push_back(storage->render_target_get_clear_request_color(p_to_render_target));
  915. storage->render_target_disable_clear_request(p_to_render_target);
  916. }
  917. #ifndef _MSC_VER
  918. #warning TODO obtain from framebuffer format eventually when this is implemented
  919. #endif
  920. fb_uniform_set = storage->render_target_get_framebuffer_uniform_set(p_to_render_target);
  921. }
  922. if (fb_uniform_set.is_null() || !RD::get_singleton()->uniform_set_is_valid(fb_uniform_set)) {
  923. fb_uniform_set = _create_base_uniform_set(p_to_render_target, p_to_backbuffer);
  924. }
  925. RD::FramebufferFormatID fb_format = RD::get_singleton()->framebuffer_get_format(framebuffer);
  926. RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(framebuffer, clear ? RD::INITIAL_ACTION_CLEAR : RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD, clear_colors);
  927. RD::get_singleton()->draw_list_bind_uniform_set(draw_list, fb_uniform_set, BASE_UNIFORM_SET);
  928. RD::get_singleton()->draw_list_bind_uniform_set(draw_list, state.default_transforms_uniform_set, TRANSFORMS_UNIFORM_SET);
  929. RID prev_material;
  930. PipelineVariants *pipeline_variants = &shader.pipeline_variants;
  931. for (int i = 0; i < p_item_count; i++) {
  932. Item *ci = items[i];
  933. if (current_clip != ci->final_clip_owner) {
  934. current_clip = ci->final_clip_owner;
  935. //setup clip
  936. if (current_clip) {
  937. RD::get_singleton()->draw_list_enable_scissor(draw_list, current_clip->final_clip_rect);
  938. } else {
  939. RD::get_singleton()->draw_list_disable_scissor(draw_list);
  940. }
  941. }
  942. RID material = ci->material;
  943. if (material.is_null() && ci->canvas_group != nullptr) {
  944. material = default_canvas_group_material;
  945. }
  946. if (material != prev_material) {
  947. MaterialData *material_data = nullptr;
  948. if (material.is_valid()) {
  949. material_data = (MaterialData *)storage->material_get_data(material, RasterizerStorageRD::SHADER_TYPE_2D);
  950. }
  951. if (material_data) {
  952. if (material_data->shader_data->version.is_valid() && material_data->shader_data->valid) {
  953. pipeline_variants = &material_data->shader_data->pipeline_variants;
  954. if (material_data->uniform_set.is_valid()) {
  955. RD::get_singleton()->draw_list_bind_uniform_set(draw_list, material_data->uniform_set, MATERIAL_UNIFORM_SET);
  956. }
  957. } else {
  958. pipeline_variants = &shader.pipeline_variants;
  959. }
  960. } else {
  961. pipeline_variants = &shader.pipeline_variants;
  962. }
  963. }
  964. _render_item(draw_list, ci, fb_format, canvas_transform_inverse, current_clip, p_lights, pipeline_variants);
  965. prev_material = material;
  966. }
  967. RD::get_singleton()->draw_list_end();
  968. }
  969. void RasterizerCanvasRD::canvas_render_items(RID p_to_render_target, Item *p_item_list, const Color &p_modulate, Light *p_light_list, Light *p_directional_light_list, const Transform2D &p_canvas_transform, RenderingServer::CanvasItemTextureFilter p_default_filter, RenderingServer::CanvasItemTextureRepeat p_default_repeat, bool p_snap_2d_vertices_to_pixel, bool &r_sdf_used) {
  970. r_sdf_used = false;
  971. int item_count = 0;
  972. //setup canvas state uniforms if needed
  973. Transform2D canvas_transform_inverse = p_canvas_transform.affine_inverse();
  974. //setup directional lights if exist
  975. uint32_t light_count = 0;
  976. uint32_t directional_light_count = 0;
  977. {
  978. Light *l = p_directional_light_list;
  979. uint32_t index = 0;
  980. while (l) {
  981. if (index == state.max_lights_per_render) {
  982. l->render_index_cache = -1;
  983. l = l->next_ptr;
  984. continue;
  985. }
  986. CanvasLight *clight = canvas_light_owner.getornull(l->light_internal);
  987. if (!clight) { //unused or invalid texture
  988. l->render_index_cache = -1;
  989. l = l->next_ptr;
  990. ERR_CONTINUE(!clight);
  991. }
  992. Vector2 canvas_light_dir = l->xform_cache.elements[1].normalized();
  993. state.light_uniforms[index].position[0] = -canvas_light_dir.x;
  994. state.light_uniforms[index].position[1] = -canvas_light_dir.y;
  995. _update_transform_2d_to_mat2x4(clight->shadow.directional_xform, state.light_uniforms[index].shadow_matrix);
  996. state.light_uniforms[index].height = l->height; //0..1 here
  997. for (int i = 0; i < 4; i++) {
  998. state.light_uniforms[index].shadow_color[i] = uint8_t(CLAMP(int32_t(l->shadow_color[i] * 255.0), 0, 255));
  999. state.light_uniforms[index].color[i] = l->color[i];
  1000. }
  1001. state.light_uniforms[index].color[3] = l->energy; //use alpha for energy, so base color can go separate
  1002. if (state.shadow_fb.is_valid()) {
  1003. state.light_uniforms[index].shadow_pixel_size = (1.0 / state.shadow_texture_size) * (1.0 + l->shadow_smooth);
  1004. state.light_uniforms[index].shadow_z_far_inv = 1.0 / clight->shadow.z_far;
  1005. state.light_uniforms[index].shadow_y_ofs = clight->shadow.y_offset;
  1006. } else {
  1007. state.light_uniforms[index].shadow_pixel_size = 1.0;
  1008. state.light_uniforms[index].shadow_z_far_inv = 1.0;
  1009. state.light_uniforms[index].shadow_y_ofs = 0;
  1010. }
  1011. state.light_uniforms[index].flags = l->blend_mode << LIGHT_FLAGS_BLEND_SHIFT;
  1012. state.light_uniforms[index].flags |= l->shadow_filter << LIGHT_FLAGS_FILTER_SHIFT;
  1013. if (clight->shadow.enabled) {
  1014. state.light_uniforms[index].flags |= LIGHT_FLAGS_HAS_SHADOW;
  1015. }
  1016. l->render_index_cache = index;
  1017. index++;
  1018. l = l->next_ptr;
  1019. }
  1020. light_count = index;
  1021. directional_light_count = light_count;
  1022. using_directional_lights = directional_light_count > 0;
  1023. }
  1024. //setup lights if exist
  1025. {
  1026. Light *l = p_light_list;
  1027. uint32_t index = light_count;
  1028. while (l) {
  1029. if (index == state.max_lights_per_render) {
  1030. l->render_index_cache = -1;
  1031. l = l->next_ptr;
  1032. continue;
  1033. }
  1034. CanvasLight *clight = canvas_light_owner.getornull(l->light_internal);
  1035. if (!clight) { //unused or invalid texture
  1036. l->render_index_cache = -1;
  1037. l = l->next_ptr;
  1038. ERR_CONTINUE(!clight);
  1039. }
  1040. Transform2D to_light_xform = (p_canvas_transform * l->light_shader_xform).affine_inverse();
  1041. Vector2 canvas_light_pos = p_canvas_transform.xform(l->xform.get_origin()); //convert light position to canvas coordinates, as all computation is done in canvas coords to avoid precision loss
  1042. state.light_uniforms[index].position[0] = canvas_light_pos.x;
  1043. state.light_uniforms[index].position[1] = canvas_light_pos.y;
  1044. _update_transform_2d_to_mat2x4(to_light_xform, state.light_uniforms[index].matrix);
  1045. _update_transform_2d_to_mat2x4(l->xform_cache.affine_inverse(), state.light_uniforms[index].shadow_matrix);
  1046. state.light_uniforms[index].height = l->height * (p_canvas_transform.elements[0].length() + p_canvas_transform.elements[1].length()) * 0.5; //approximate height conversion to the canvas size, since all calculations are done in canvas coords to avoid precision loss
  1047. for (int i = 0; i < 4; i++) {
  1048. state.light_uniforms[index].shadow_color[i] = uint8_t(CLAMP(int32_t(l->shadow_color[i] * 255.0), 0, 255));
  1049. state.light_uniforms[index].color[i] = l->color[i];
  1050. }
  1051. state.light_uniforms[index].color[3] = l->energy; //use alpha for energy, so base color can go separate
  1052. if (state.shadow_fb.is_valid()) {
  1053. state.light_uniforms[index].shadow_pixel_size = (1.0 / state.shadow_texture_size) * (1.0 + l->shadow_smooth);
  1054. state.light_uniforms[index].shadow_z_far_inv = 1.0 / clight->shadow.z_far;
  1055. state.light_uniforms[index].shadow_y_ofs = clight->shadow.y_offset;
  1056. } else {
  1057. state.light_uniforms[index].shadow_pixel_size = 1.0;
  1058. state.light_uniforms[index].shadow_z_far_inv = 1.0;
  1059. state.light_uniforms[index].shadow_y_ofs = 0;
  1060. }
  1061. state.light_uniforms[index].flags = l->blend_mode << LIGHT_FLAGS_BLEND_SHIFT;
  1062. state.light_uniforms[index].flags |= l->shadow_filter << LIGHT_FLAGS_FILTER_SHIFT;
  1063. if (clight->shadow.enabled) {
  1064. state.light_uniforms[index].flags |= LIGHT_FLAGS_HAS_SHADOW;
  1065. }
  1066. if (clight->texture.is_valid()) {
  1067. Rect2 atlas_rect = storage->decal_atlas_get_texture_rect(clight->texture);
  1068. state.light_uniforms[index].atlas_rect[0] = atlas_rect.position.x;
  1069. state.light_uniforms[index].atlas_rect[1] = atlas_rect.position.y;
  1070. state.light_uniforms[index].atlas_rect[2] = atlas_rect.size.width;
  1071. state.light_uniforms[index].atlas_rect[3] = atlas_rect.size.height;
  1072. } else {
  1073. state.light_uniforms[index].atlas_rect[0] = 0;
  1074. state.light_uniforms[index].atlas_rect[1] = 0;
  1075. state.light_uniforms[index].atlas_rect[2] = 0;
  1076. state.light_uniforms[index].atlas_rect[3] = 0;
  1077. }
  1078. l->render_index_cache = index;
  1079. index++;
  1080. l = l->next_ptr;
  1081. }
  1082. light_count = index;
  1083. }
  1084. if (light_count > 0) {
  1085. RD::get_singleton()->buffer_update(state.lights_uniform_buffer, 0, sizeof(LightUniform) * light_count, &state.light_uniforms[0], true);
  1086. }
  1087. {
  1088. //update canvas state uniform buffer
  1089. State::Buffer state_buffer;
  1090. Size2i ssize = storage->render_target_get_size(p_to_render_target);
  1091. Transform screen_transform;
  1092. screen_transform.translate(-(ssize.width / 2.0f), -(ssize.height / 2.0f), 0.0f);
  1093. screen_transform.scale(Vector3(2.0f / ssize.width, 2.0f / ssize.height, 1.0f));
  1094. _update_transform_to_mat4(screen_transform, state_buffer.screen_transform);
  1095. _update_transform_2d_to_mat4(p_canvas_transform, state_buffer.canvas_transform);
  1096. Transform2D normal_transform = p_canvas_transform;
  1097. normal_transform.elements[0].normalize();
  1098. normal_transform.elements[1].normalize();
  1099. normal_transform.elements[2] = Vector2();
  1100. _update_transform_2d_to_mat4(normal_transform, state_buffer.canvas_normal_transform);
  1101. state_buffer.canvas_modulate[0] = p_modulate.r;
  1102. state_buffer.canvas_modulate[1] = p_modulate.g;
  1103. state_buffer.canvas_modulate[2] = p_modulate.b;
  1104. state_buffer.canvas_modulate[3] = p_modulate.a;
  1105. Size2 render_target_size = storage->render_target_get_size(p_to_render_target);
  1106. state_buffer.screen_pixel_size[0] = 1.0 / render_target_size.x;
  1107. state_buffer.screen_pixel_size[1] = 1.0 / render_target_size.y;
  1108. state_buffer.time = state.time;
  1109. state_buffer.use_pixel_snap = p_snap_2d_vertices_to_pixel;
  1110. state_buffer.directional_light_count = directional_light_count;
  1111. Vector2 canvas_scale = p_canvas_transform.get_scale();
  1112. state_buffer.sdf_to_screen[0] = render_target_size.width / canvas_scale.x;
  1113. state_buffer.sdf_to_screen[1] = render_target_size.height / canvas_scale.y;
  1114. state_buffer.screen_to_sdf[0] = 1.0 / state_buffer.sdf_to_screen[0];
  1115. state_buffer.screen_to_sdf[1] = 1.0 / state_buffer.sdf_to_screen[1];
  1116. Rect2 sdf_rect = storage->render_target_get_sdf_rect(p_to_render_target);
  1117. Rect2 sdf_tex_rect(sdf_rect.position / canvas_scale, sdf_rect.size / canvas_scale);
  1118. state_buffer.sdf_to_tex[0] = 1.0 / sdf_tex_rect.size.width;
  1119. state_buffer.sdf_to_tex[1] = 1.0 / sdf_tex_rect.size.height;
  1120. state_buffer.sdf_to_tex[2] = -sdf_tex_rect.position.x / sdf_tex_rect.size.width;
  1121. state_buffer.sdf_to_tex[3] = -sdf_tex_rect.position.y / sdf_tex_rect.size.height;
  1122. //print_line("w: " + itos(ssize.width) + " s: " + rtos(canvas_scale));
  1123. state_buffer.tex_to_sdf = 1.0 / ((canvas_scale.x + canvas_scale.y) * 0.5);
  1124. RD::get_singleton()->buffer_update(state.canvas_state_buffer, 0, sizeof(State::Buffer), &state_buffer, true);
  1125. }
  1126. { //default filter/repeat
  1127. default_filter = p_default_filter;
  1128. default_repeat = p_default_repeat;
  1129. }
  1130. //fill the list until rendering is possible.
  1131. bool material_screen_texture_found = false;
  1132. Item *ci = p_item_list;
  1133. Rect2 back_buffer_rect;
  1134. bool backbuffer_copy = false;
  1135. Item *canvas_group_owner = nullptr;
  1136. while (ci) {
  1137. if (ci->copy_back_buffer && canvas_group_owner == nullptr) {
  1138. backbuffer_copy = true;
  1139. if (ci->copy_back_buffer->full) {
  1140. back_buffer_rect = Rect2();
  1141. } else {
  1142. back_buffer_rect = ci->copy_back_buffer->rect;
  1143. }
  1144. }
  1145. if (ci->material.is_valid()) {
  1146. MaterialData *md = (MaterialData *)storage->material_get_data(ci->material, RasterizerStorageRD::SHADER_TYPE_2D);
  1147. if (md && md->shader_data->valid) {
  1148. if (md->shader_data->uses_screen_texture && canvas_group_owner == nullptr) {
  1149. if (!material_screen_texture_found) {
  1150. backbuffer_copy = true;
  1151. back_buffer_rect = Rect2();
  1152. }
  1153. }
  1154. if (md->shader_data->uses_sdf) {
  1155. r_sdf_used = true;
  1156. }
  1157. if (md->last_frame != RasterizerRD::singleton->get_frame_number()) {
  1158. md->last_frame = RasterizerRD::singleton->get_frame_number();
  1159. if (!RD::get_singleton()->uniform_set_is_valid(md->uniform_set)) {
  1160. // uniform set may be gone because a dependency was erased. In this case, it will happen
  1161. // if a texture is deleted, so just re-create it.
  1162. storage->material_force_update_textures(ci->material, RasterizerStorageRD::SHADER_TYPE_2D);
  1163. }
  1164. }
  1165. }
  1166. }
  1167. if (ci->canvas_group_owner != nullptr) {
  1168. if (canvas_group_owner == nullptr) {
  1169. //Canvas group begins here, render until before this item
  1170. _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list);
  1171. item_count = 0;
  1172. Rect2i group_rect = ci->canvas_group_owner->global_rect_cache;
  1173. if (ci->canvas_group_owner->canvas_group->mode == RS::CANVAS_GROUP_MODE_OPAQUE) {
  1174. storage->render_target_copy_to_back_buffer(p_to_render_target, group_rect, false);
  1175. } else {
  1176. storage->render_target_clear_back_buffer(p_to_render_target, group_rect, Color(0, 0, 0, 0));
  1177. }
  1178. backbuffer_copy = false;
  1179. canvas_group_owner = ci->canvas_group_owner; //continue until owner found
  1180. }
  1181. ci->canvas_group_owner = nullptr; //must be cleared
  1182. }
  1183. if (ci == canvas_group_owner) {
  1184. _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, true);
  1185. item_count = 0;
  1186. if (ci->canvas_group->blur_mipmaps) {
  1187. storage->render_target_gen_back_buffer_mipmaps(p_to_render_target, ci->global_rect_cache);
  1188. }
  1189. canvas_group_owner = nullptr;
  1190. }
  1191. if (backbuffer_copy) {
  1192. //render anything pending, including clearing if no items
  1193. _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list);
  1194. item_count = 0;
  1195. storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, true);
  1196. backbuffer_copy = false;
  1197. material_screen_texture_found = true; //after a backbuffer copy, screen texture makes no further copies
  1198. }
  1199. items[item_count++] = ci;
  1200. if (!ci->next || item_count == MAX_RENDER_ITEMS - 1) {
  1201. _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list);
  1202. //then reset
  1203. item_count = 0;
  1204. }
  1205. ci = ci->next;
  1206. }
  1207. }
  1208. RID RasterizerCanvasRD::light_create() {
  1209. CanvasLight canvas_light;
  1210. return canvas_light_owner.make_rid(canvas_light);
  1211. }
  1212. void RasterizerCanvasRD::light_set_texture(RID p_rid, RID p_texture) {
  1213. CanvasLight *cl = canvas_light_owner.getornull(p_rid);
  1214. ERR_FAIL_COND(!cl);
  1215. if (cl->texture == p_texture) {
  1216. return;
  1217. }
  1218. if (cl->texture.is_valid()) {
  1219. storage->texture_remove_from_decal_atlas(cl->texture);
  1220. }
  1221. cl->texture = p_texture;
  1222. if (cl->texture.is_valid()) {
  1223. storage->texture_add_to_decal_atlas(cl->texture);
  1224. }
  1225. }
  1226. void RasterizerCanvasRD::light_set_use_shadow(RID p_rid, bool p_enable) {
  1227. CanvasLight *cl = canvas_light_owner.getornull(p_rid);
  1228. ERR_FAIL_COND(!cl);
  1229. cl->shadow.enabled = p_enable;
  1230. }
  1231. void RasterizerCanvasRD::_update_shadow_atlas() {
  1232. if (state.shadow_fb == RID()) {
  1233. //ah, we lack the shadow texture..
  1234. RD::get_singleton()->free(state.shadow_texture); //erase placeholder
  1235. Vector<RID> fb_textures;
  1236. { //texture
  1237. RD::TextureFormat tf;
  1238. tf.type = RD::TEXTURE_TYPE_2D;
  1239. tf.width = state.shadow_texture_size;
  1240. tf.height = state.max_lights_per_render * 2;
  1241. tf.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT;
  1242. tf.format = RD::DATA_FORMAT_R32_SFLOAT;
  1243. state.shadow_texture = RD::get_singleton()->texture_create(tf, RD::TextureView());
  1244. fb_textures.push_back(state.shadow_texture);
  1245. }
  1246. {
  1247. RD::TextureFormat tf;
  1248. tf.type = RD::TEXTURE_TYPE_2D;
  1249. tf.width = state.shadow_texture_size;
  1250. tf.height = state.max_lights_per_render * 2;
  1251. tf.usage_bits = RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
  1252. tf.format = RD::DATA_FORMAT_D32_SFLOAT;
  1253. //chunks to write
  1254. state.shadow_depth_texture = RD::get_singleton()->texture_create(tf, RD::TextureView());
  1255. fb_textures.push_back(state.shadow_depth_texture);
  1256. }
  1257. state.shadow_fb = RD::get_singleton()->framebuffer_create(fb_textures);
  1258. }
  1259. }
  1260. void RasterizerCanvasRD::light_update_shadow(RID p_rid, int p_shadow_index, const Transform2D &p_light_xform, int p_light_mask, float p_near, float p_far, LightOccluderInstance *p_occluders) {
  1261. CanvasLight *cl = canvas_light_owner.getornull(p_rid);
  1262. ERR_FAIL_COND(!cl->shadow.enabled);
  1263. _update_shadow_atlas();
  1264. cl->shadow.z_far = p_far;
  1265. cl->shadow.y_offset = float(p_shadow_index * 2 + 1) / float(state.max_lights_per_render * 2);
  1266. Vector<Color> cc;
  1267. cc.push_back(Color(p_far, p_far, p_far, 1.0));
  1268. for (int i = 0; i < 4; i++) {
  1269. //make sure it remains orthogonal, makes easy to read angle later
  1270. //light.basis.scale(Vector3(to_light.elements[0].length(),to_light.elements[1].length(),1));
  1271. Rect2i rect((state.shadow_texture_size / 4) * i, p_shadow_index * 2, (state.shadow_texture_size / 4), 2);
  1272. RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(state.shadow_fb, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_DISCARD, cc, 1.0, 0, rect);
  1273. CameraMatrix projection;
  1274. {
  1275. real_t fov = 90;
  1276. real_t nearp = p_near;
  1277. real_t farp = p_far;
  1278. real_t aspect = 1.0;
  1279. real_t ymax = nearp * Math::tan(Math::deg2rad(fov * 0.5));
  1280. real_t ymin = -ymax;
  1281. real_t xmin = ymin * aspect;
  1282. real_t xmax = ymax * aspect;
  1283. projection.set_frustum(xmin, xmax, ymin, ymax, nearp, farp);
  1284. }
  1285. Vector3 cam_target = Basis(Vector3(0, 0, Math_PI * 2 * ((i + 3) / 4.0))).xform(Vector3(0, 1, 0));
  1286. projection = projection * CameraMatrix(Transform().looking_at(cam_target, Vector3(0, 0, -1)).affine_inverse());
  1287. ShadowRenderPushConstant push_constant;
  1288. for (int y = 0; y < 4; y++) {
  1289. for (int x = 0; x < 4; x++) {
  1290. push_constant.projection[y * 4 + x] = projection.matrix[y][x];
  1291. }
  1292. }
  1293. static const Vector2 directions[4] = { Vector2(1, 0), Vector2(0, 1), Vector2(-1, 0), Vector2(0, -1) };
  1294. push_constant.direction[0] = directions[i].x;
  1295. push_constant.direction[1] = directions[i].y;
  1296. push_constant.z_far = p_far;
  1297. push_constant.pad = 0;
  1298. /*if (i == 0)
  1299. *p_xform_cache = projection;*/
  1300. LightOccluderInstance *instance = p_occluders;
  1301. while (instance) {
  1302. OccluderPolygon *co = occluder_polygon_owner.getornull(instance->occluder);
  1303. if (!co || co->index_array.is_null() || !(p_light_mask & instance->light_mask)) {
  1304. instance = instance->next;
  1305. continue;
  1306. }
  1307. _update_transform_2d_to_mat2x4(p_light_xform * instance->xform_cache, push_constant.modelview);
  1308. RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, shadow_render.render_pipelines[co->cull_mode]);
  1309. RD::get_singleton()->draw_list_bind_vertex_array(draw_list, co->vertex_array);
  1310. RD::get_singleton()->draw_list_bind_index_array(draw_list, co->index_array);
  1311. RD::get_singleton()->draw_list_set_push_constant(draw_list, &push_constant, sizeof(ShadowRenderPushConstant));
  1312. RD::get_singleton()->draw_list_draw(draw_list, true);
  1313. instance = instance->next;
  1314. }
  1315. RD::get_singleton()->draw_list_end();
  1316. }
  1317. }
  1318. void RasterizerCanvasRD::light_update_directional_shadow(RID p_rid, int p_shadow_index, const Transform2D &p_light_xform, int p_light_mask, float p_cull_distance, const Rect2 &p_clip_rect, LightOccluderInstance *p_occluders) {
  1319. CanvasLight *cl = canvas_light_owner.getornull(p_rid);
  1320. ERR_FAIL_COND(!cl->shadow.enabled);
  1321. _update_shadow_atlas();
  1322. Vector2 light_dir = p_light_xform.elements[1].normalized();
  1323. Vector2 center = p_clip_rect.position + p_clip_rect.size * 0.5;
  1324. float to_edge_distance = ABS(light_dir.dot(p_clip_rect.get_support(light_dir)) - light_dir.dot(center));
  1325. Vector2 from_pos = center - light_dir * (to_edge_distance + p_cull_distance);
  1326. float distance = to_edge_distance * 2.0 + p_cull_distance;
  1327. float half_size = p_clip_rect.size.length() * 0.5; //shadow length, must keep this no matter the angle
  1328. cl->shadow.z_far = distance;
  1329. cl->shadow.y_offset = float(p_shadow_index * 2 + 1) / float(state.max_lights_per_render * 2);
  1330. Transform2D to_light_xform;
  1331. to_light_xform[2] = from_pos;
  1332. to_light_xform[1] = light_dir;
  1333. to_light_xform[0] = -light_dir.tangent();
  1334. to_light_xform.invert();
  1335. Vector<Color> cc;
  1336. cc.push_back(Color(1, 1, 1, 1));
  1337. Rect2i rect(0, p_shadow_index * 2, state.shadow_texture_size, 2);
  1338. RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(state.shadow_fb, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_DISCARD, cc, 1.0, 0, rect);
  1339. CameraMatrix projection;
  1340. projection.set_orthogonal(-half_size, half_size, -0.5, 0.5, 0.0, distance);
  1341. projection = projection * CameraMatrix(Transform().looking_at(Vector3(0, 1, 0), Vector3(0, 0, -1)).affine_inverse());
  1342. ShadowRenderPushConstant push_constant;
  1343. for (int y = 0; y < 4; y++) {
  1344. for (int x = 0; x < 4; x++) {
  1345. push_constant.projection[y * 4 + x] = projection.matrix[y][x];
  1346. }
  1347. }
  1348. push_constant.direction[0] = 0.0;
  1349. push_constant.direction[1] = 1.0;
  1350. push_constant.z_far = distance;
  1351. push_constant.pad = 0;
  1352. LightOccluderInstance *instance = p_occluders;
  1353. while (instance) {
  1354. OccluderPolygon *co = occluder_polygon_owner.getornull(instance->occluder);
  1355. if (!co || co->index_array.is_null() || !(p_light_mask & instance->light_mask)) {
  1356. instance = instance->next;
  1357. continue;
  1358. }
  1359. _update_transform_2d_to_mat2x4(to_light_xform * instance->xform_cache, push_constant.modelview);
  1360. RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, shadow_render.render_pipelines[co->cull_mode]);
  1361. RD::get_singleton()->draw_list_bind_vertex_array(draw_list, co->vertex_array);
  1362. RD::get_singleton()->draw_list_bind_index_array(draw_list, co->index_array);
  1363. RD::get_singleton()->draw_list_set_push_constant(draw_list, &push_constant, sizeof(ShadowRenderPushConstant));
  1364. RD::get_singleton()->draw_list_draw(draw_list, true);
  1365. instance = instance->next;
  1366. }
  1367. RD::get_singleton()->draw_list_end();
  1368. Transform2D to_shadow;
  1369. to_shadow.elements[0].x = 1.0 / -(half_size * 2.0);
  1370. to_shadow.elements[2].x = 0.5;
  1371. cl->shadow.directional_xform = to_shadow * to_light_xform;
  1372. }
  1373. void RasterizerCanvasRD::render_sdf(RID p_render_target, LightOccluderInstance *p_occluders) {
  1374. RID fb = storage->render_target_get_sdf_framebuffer(p_render_target);
  1375. Rect2i rect = storage->render_target_get_sdf_rect(p_render_target);
  1376. Transform2D to_sdf;
  1377. to_sdf.elements[0] *= rect.size.width;
  1378. to_sdf.elements[1] *= rect.size.height;
  1379. to_sdf.elements[2] = rect.position;
  1380. Transform2D to_clip;
  1381. to_clip.elements[0] *= 2.0;
  1382. to_clip.elements[1] *= 2.0;
  1383. to_clip.elements[2] = -Vector2(1.0, 1.0);
  1384. to_clip = to_clip * to_sdf.affine_inverse();
  1385. Vector<Color> cc;
  1386. cc.push_back(Color(0, 0, 0, 0));
  1387. RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(fb, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_DISCARD, cc);
  1388. CameraMatrix projection;
  1389. ShadowRenderPushConstant push_constant;
  1390. for (int y = 0; y < 4; y++) {
  1391. for (int x = 0; x < 4; x++) {
  1392. push_constant.projection[y * 4 + x] = projection.matrix[y][x];
  1393. }
  1394. }
  1395. push_constant.direction[0] = 0.0;
  1396. push_constant.direction[1] = 0.0;
  1397. push_constant.z_far = 0;
  1398. push_constant.pad = 0;
  1399. LightOccluderInstance *instance = p_occluders;
  1400. while (instance) {
  1401. OccluderPolygon *co = occluder_polygon_owner.getornull(instance->occluder);
  1402. if (!co || co->sdf_index_array.is_null()) {
  1403. instance = instance->next;
  1404. continue;
  1405. }
  1406. _update_transform_2d_to_mat2x4(to_clip * instance->xform_cache, push_constant.modelview);
  1407. RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, shadow_render.sdf_render_pipelines[co->sdf_is_lines ? SHADOW_RENDER_SDF_LINES : SHADOW_RENDER_SDF_TRIANGLES]);
  1408. RD::get_singleton()->draw_list_bind_vertex_array(draw_list, co->sdf_vertex_array);
  1409. RD::get_singleton()->draw_list_bind_index_array(draw_list, co->sdf_index_array);
  1410. RD::get_singleton()->draw_list_set_push_constant(draw_list, &push_constant, sizeof(ShadowRenderPushConstant));
  1411. RD::get_singleton()->draw_list_draw(draw_list, true);
  1412. instance = instance->next;
  1413. }
  1414. RD::get_singleton()->draw_list_end();
  1415. storage->render_target_sdf_process(p_render_target); //done rendering, process it
  1416. }
  1417. RID RasterizerCanvasRD::occluder_polygon_create() {
  1418. OccluderPolygon occluder;
  1419. occluder.line_point_count = 0;
  1420. occluder.sdf_point_count = 0;
  1421. occluder.sdf_index_count = 0;
  1422. occluder.cull_mode = RS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED;
  1423. return occluder_polygon_owner.make_rid(occluder);
  1424. }
  1425. void RasterizerCanvasRD::occluder_polygon_set_shape(RID p_occluder, const Vector<Vector2> &p_points, bool p_closed) {
  1426. OccluderPolygon *oc = occluder_polygon_owner.getornull(p_occluder);
  1427. ERR_FAIL_COND(!oc);
  1428. Vector<Vector2> lines;
  1429. int lc = p_points.size() * 2;
  1430. lines.resize(lc - (p_closed ? 0 : 2));
  1431. {
  1432. Vector2 *w = lines.ptrw();
  1433. const Vector2 *r = p_points.ptr();
  1434. int max = lc / 2;
  1435. if (!p_closed) {
  1436. max--;
  1437. }
  1438. for (int i = 0; i < max; i++) {
  1439. Vector2 a = r[i];
  1440. Vector2 b = r[(i + 1) % (lc / 2)];
  1441. w[i * 2 + 0] = a;
  1442. w[i * 2 + 1] = b;
  1443. }
  1444. }
  1445. if (oc->line_point_count != lines.size() && oc->vertex_array.is_valid()) {
  1446. RD::get_singleton()->free(oc->vertex_array);
  1447. RD::get_singleton()->free(oc->vertex_buffer);
  1448. RD::get_singleton()->free(oc->index_array);
  1449. RD::get_singleton()->free(oc->index_buffer);
  1450. oc->vertex_array = RID();
  1451. oc->vertex_buffer = RID();
  1452. oc->index_array = RID();
  1453. oc->index_buffer = RID();
  1454. oc->line_point_count = lines.size();
  1455. }
  1456. if (lines.size()) {
  1457. Vector<uint8_t> geometry;
  1458. Vector<uint8_t> indices;
  1459. lc = lines.size();
  1460. geometry.resize(lc * 6 * sizeof(float));
  1461. indices.resize(lc * 3 * sizeof(uint16_t));
  1462. {
  1463. uint8_t *vw = geometry.ptrw();
  1464. float *vwptr = (float *)vw;
  1465. uint8_t *iw = indices.ptrw();
  1466. uint16_t *iwptr = (uint16_t *)iw;
  1467. const Vector2 *lr = lines.ptr();
  1468. const int POLY_HEIGHT = 16384;
  1469. for (int i = 0; i < lc / 2; i++) {
  1470. vwptr[i * 12 + 0] = lr[i * 2 + 0].x;
  1471. vwptr[i * 12 + 1] = lr[i * 2 + 0].y;
  1472. vwptr[i * 12 + 2] = POLY_HEIGHT;
  1473. vwptr[i * 12 + 3] = lr[i * 2 + 1].x;
  1474. vwptr[i * 12 + 4] = lr[i * 2 + 1].y;
  1475. vwptr[i * 12 + 5] = POLY_HEIGHT;
  1476. vwptr[i * 12 + 6] = lr[i * 2 + 1].x;
  1477. vwptr[i * 12 + 7] = lr[i * 2 + 1].y;
  1478. vwptr[i * 12 + 8] = -POLY_HEIGHT;
  1479. vwptr[i * 12 + 9] = lr[i * 2 + 0].x;
  1480. vwptr[i * 12 + 10] = lr[i * 2 + 0].y;
  1481. vwptr[i * 12 + 11] = -POLY_HEIGHT;
  1482. iwptr[i * 6 + 0] = i * 4 + 0;
  1483. iwptr[i * 6 + 1] = i * 4 + 1;
  1484. iwptr[i * 6 + 2] = i * 4 + 2;
  1485. iwptr[i * 6 + 3] = i * 4 + 2;
  1486. iwptr[i * 6 + 4] = i * 4 + 3;
  1487. iwptr[i * 6 + 5] = i * 4 + 0;
  1488. }
  1489. }
  1490. //if same buffer len is being set, just use BufferSubData to avoid a pipeline flush
  1491. if (oc->vertex_array.is_null()) {
  1492. //create from scratch
  1493. //vertices
  1494. oc->vertex_buffer = RD::get_singleton()->vertex_buffer_create(lc * 6 * sizeof(real_t), geometry);
  1495. Vector<RID> buffer;
  1496. buffer.push_back(oc->vertex_buffer);
  1497. oc->vertex_array = RD::get_singleton()->vertex_array_create(4 * lc / 2, shadow_render.vertex_format, buffer);
  1498. //indices
  1499. oc->index_buffer = RD::get_singleton()->index_buffer_create(3 * lc, RD::INDEX_BUFFER_FORMAT_UINT16, indices);
  1500. oc->index_array = RD::get_singleton()->index_array_create(oc->index_buffer, 0, 3 * lc);
  1501. } else {
  1502. //update existing
  1503. const uint8_t *vr = geometry.ptr();
  1504. RD::get_singleton()->buffer_update(oc->vertex_buffer, 0, geometry.size(), vr);
  1505. const uint8_t *ir = indices.ptr();
  1506. RD::get_singleton()->buffer_update(oc->index_buffer, 0, indices.size(), ir);
  1507. }
  1508. }
  1509. // sdf
  1510. Vector<int> sdf_indices;
  1511. if (p_closed) {
  1512. sdf_indices = Geometry2D::triangulate_polygon(p_points);
  1513. oc->sdf_is_lines = false;
  1514. } else {
  1515. int max = p_points.size();
  1516. sdf_indices.resize(max * 2);
  1517. int *iw = sdf_indices.ptrw();
  1518. for (int i = 0; i < max; i++) {
  1519. iw[i * 2 + 0] = i;
  1520. iw[i * 2 + 1] = (i + 1) % max;
  1521. }
  1522. oc->sdf_is_lines = true;
  1523. }
  1524. if (oc->sdf_index_count != sdf_indices.size() && oc->sdf_point_count != p_points.size() && oc->sdf_vertex_array.is_valid()) {
  1525. RD::get_singleton()->free(oc->sdf_vertex_array);
  1526. RD::get_singleton()->free(oc->sdf_vertex_buffer);
  1527. RD::get_singleton()->free(oc->sdf_index_array);
  1528. RD::get_singleton()->free(oc->sdf_index_buffer);
  1529. oc->sdf_vertex_array = RID();
  1530. oc->sdf_vertex_buffer = RID();
  1531. oc->sdf_index_array = RID();
  1532. oc->sdf_index_buffer = RID();
  1533. oc->sdf_index_count = sdf_indices.size();
  1534. oc->sdf_point_count = p_points.size();
  1535. oc->sdf_is_lines = false;
  1536. }
  1537. if (sdf_indices.size()) {
  1538. if (oc->sdf_vertex_array.is_null()) {
  1539. //create from scratch
  1540. //vertices
  1541. oc->sdf_vertex_buffer = RD::get_singleton()->vertex_buffer_create(p_points.size() * 2 * sizeof(real_t), p_points.to_byte_array());
  1542. oc->sdf_index_buffer = RD::get_singleton()->index_buffer_create(sdf_indices.size(), RD::INDEX_BUFFER_FORMAT_UINT32, sdf_indices.to_byte_array());
  1543. oc->sdf_index_array = RD::get_singleton()->index_array_create(oc->sdf_index_buffer, 0, sdf_indices.size());
  1544. Vector<RID> buffer;
  1545. buffer.push_back(oc->sdf_vertex_buffer);
  1546. oc->sdf_vertex_array = RD::get_singleton()->vertex_array_create(p_points.size(), shadow_render.sdf_vertex_format, buffer);
  1547. //indices
  1548. } else {
  1549. //update existing
  1550. RD::get_singleton()->buffer_update(oc->vertex_buffer, 0, sizeof(real_t) * 2 * p_points.size(), p_points.ptr());
  1551. RD::get_singleton()->buffer_update(oc->index_buffer, 0, sdf_indices.size() * sizeof(int32_t), sdf_indices.ptr());
  1552. }
  1553. }
  1554. }
  1555. void RasterizerCanvasRD::occluder_polygon_set_cull_mode(RID p_occluder, RS::CanvasOccluderPolygonCullMode p_mode) {
  1556. OccluderPolygon *oc = occluder_polygon_owner.getornull(p_occluder);
  1557. ERR_FAIL_COND(!oc);
  1558. oc->cull_mode = p_mode;
  1559. }
  1560. void RasterizerCanvasRD::ShaderData::set_code(const String &p_code) {
  1561. //compile
  1562. code = p_code;
  1563. valid = false;
  1564. ubo_size = 0;
  1565. uniforms.clear();
  1566. uses_screen_texture = false;
  1567. uses_sdf = false;
  1568. if (code == String()) {
  1569. return; //just invalid, but no error
  1570. }
  1571. ShaderCompilerRD::GeneratedCode gen_code;
  1572. int blend_mode = BLEND_MODE_MIX;
  1573. uses_screen_texture = false;
  1574. ShaderCompilerRD::IdentifierActions actions;
  1575. actions.render_mode_values["blend_add"] = Pair<int *, int>(&blend_mode, BLEND_MODE_ADD);
  1576. actions.render_mode_values["blend_mix"] = Pair<int *, int>(&blend_mode, BLEND_MODE_MIX);
  1577. actions.render_mode_values["blend_sub"] = Pair<int *, int>(&blend_mode, BLEND_MODE_SUB);
  1578. actions.render_mode_values["blend_mul"] = Pair<int *, int>(&blend_mode, BLEND_MODE_MUL);
  1579. actions.render_mode_values["blend_premul_alpha"] = Pair<int *, int>(&blend_mode, BLEND_MODE_PMALPHA);
  1580. actions.render_mode_values["blend_disabled"] = Pair<int *, int>(&blend_mode, BLEND_MODE_DISABLED);
  1581. actions.usage_flag_pointers["SCREEN_TEXTURE"] = &uses_screen_texture;
  1582. actions.usage_flag_pointers["texture_sdf"] = &uses_sdf;
  1583. actions.uniforms = &uniforms;
  1584. RasterizerCanvasRD *canvas_singleton = (RasterizerCanvasRD *)RasterizerCanvas::singleton;
  1585. Error err = canvas_singleton->shader.compiler.compile(RS::SHADER_CANVAS_ITEM, code, &actions, path, gen_code);
  1586. ERR_FAIL_COND(err != OK);
  1587. if (version.is_null()) {
  1588. version = canvas_singleton->shader.canvas_shader.version_create();
  1589. }
  1590. #if 0
  1591. print_line("**compiling shader:");
  1592. print_line("**defines:\n");
  1593. for (int i = 0; i < gen_code.defines.size(); i++) {
  1594. print_line(gen_code.defines[i]);
  1595. }
  1596. print_line("\n**uniforms:\n" + gen_code.uniforms);
  1597. print_line("\n**vertex_globals:\n" + gen_code.vertex_global);
  1598. print_line("\n**vertex_code:\n" + gen_code.vertex);
  1599. print_line("\n**fragment_globals:\n" + gen_code.fragment_global);
  1600. print_line("\n**fragment_code:\n" + gen_code.fragment);
  1601. print_line("\n**light_code:\n" + gen_code.light);
  1602. #endif
  1603. canvas_singleton->shader.canvas_shader.version_set_code(version, gen_code.uniforms, gen_code.vertex_global, gen_code.vertex, gen_code.fragment_global, gen_code.light, gen_code.fragment, gen_code.defines);
  1604. ERR_FAIL_COND(!canvas_singleton->shader.canvas_shader.version_is_valid(version));
  1605. ubo_size = gen_code.uniform_total_size;
  1606. ubo_offsets = gen_code.uniform_offsets;
  1607. texture_uniforms = gen_code.texture_uniforms;
  1608. //update them pipelines
  1609. RD::PipelineColorBlendState::Attachment attachment;
  1610. switch (blend_mode) {
  1611. case BLEND_MODE_DISABLED: {
  1612. // nothing to do here, disabled by default
  1613. } break;
  1614. case BLEND_MODE_MIX: {
  1615. attachment.enable_blend = true;
  1616. attachment.color_blend_op = RD::BLEND_OP_ADD;
  1617. attachment.src_color_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA;
  1618. attachment.dst_color_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
  1619. attachment.alpha_blend_op = RD::BLEND_OP_ADD;
  1620. attachment.src_alpha_blend_factor = RD::BLEND_FACTOR_ONE;
  1621. attachment.dst_alpha_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
  1622. } break;
  1623. case BLEND_MODE_ADD: {
  1624. attachment.enable_blend = true;
  1625. attachment.alpha_blend_op = RD::BLEND_OP_ADD;
  1626. attachment.color_blend_op = RD::BLEND_OP_ADD;
  1627. attachment.src_color_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA;
  1628. attachment.dst_color_blend_factor = RD::BLEND_FACTOR_ONE;
  1629. attachment.src_alpha_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA;
  1630. attachment.dst_alpha_blend_factor = RD::BLEND_FACTOR_ONE;
  1631. } break;
  1632. case BLEND_MODE_SUB: {
  1633. attachment.enable_blend = true;
  1634. attachment.alpha_blend_op = RD::BLEND_OP_SUBTRACT;
  1635. attachment.color_blend_op = RD::BLEND_OP_SUBTRACT;
  1636. attachment.src_color_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA;
  1637. attachment.dst_color_blend_factor = RD::BLEND_FACTOR_ONE;
  1638. attachment.src_alpha_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA;
  1639. attachment.dst_alpha_blend_factor = RD::BLEND_FACTOR_ONE;
  1640. } break;
  1641. case BLEND_MODE_MUL: {
  1642. attachment.enable_blend = true;
  1643. attachment.alpha_blend_op = RD::BLEND_OP_ADD;
  1644. attachment.color_blend_op = RD::BLEND_OP_ADD;
  1645. attachment.src_color_blend_factor = RD::BLEND_FACTOR_DST_COLOR;
  1646. attachment.dst_color_blend_factor = RD::BLEND_FACTOR_ZERO;
  1647. attachment.src_alpha_blend_factor = RD::BLEND_FACTOR_DST_ALPHA;
  1648. attachment.dst_alpha_blend_factor = RD::BLEND_FACTOR_ZERO;
  1649. } break;
  1650. case BLEND_MODE_PMALPHA: {
  1651. attachment.enable_blend = true;
  1652. attachment.alpha_blend_op = RD::BLEND_OP_ADD;
  1653. attachment.color_blend_op = RD::BLEND_OP_ADD;
  1654. attachment.src_color_blend_factor = RD::BLEND_FACTOR_ONE;
  1655. attachment.dst_color_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
  1656. attachment.src_alpha_blend_factor = RD::BLEND_FACTOR_ONE;
  1657. attachment.dst_alpha_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
  1658. } break;
  1659. }
  1660. RD::PipelineColorBlendState blend_state;
  1661. blend_state.attachments.push_back(attachment);
  1662. //update pipelines
  1663. for (int i = 0; i < PIPELINE_LIGHT_MODE_MAX; i++) {
  1664. for (int j = 0; j < PIPELINE_VARIANT_MAX; j++) {
  1665. RD::RenderPrimitive primitive[PIPELINE_VARIANT_MAX] = {
  1666. RD::RENDER_PRIMITIVE_TRIANGLES,
  1667. RD::RENDER_PRIMITIVE_TRIANGLES,
  1668. RD::RENDER_PRIMITIVE_TRIANGLES,
  1669. RD::RENDER_PRIMITIVE_LINES,
  1670. RD::RENDER_PRIMITIVE_POINTS,
  1671. RD::RENDER_PRIMITIVE_TRIANGLES,
  1672. RD::RENDER_PRIMITIVE_TRIANGLE_STRIPS,
  1673. RD::RENDER_PRIMITIVE_LINES,
  1674. RD::RENDER_PRIMITIVE_LINESTRIPS,
  1675. RD::RENDER_PRIMITIVE_POINTS,
  1676. };
  1677. ShaderVariant shader_variants[PIPELINE_LIGHT_MODE_MAX][PIPELINE_VARIANT_MAX] = {
  1678. { //non lit
  1679. SHADER_VARIANT_QUAD,
  1680. SHADER_VARIANT_NINEPATCH,
  1681. SHADER_VARIANT_PRIMITIVE,
  1682. SHADER_VARIANT_PRIMITIVE,
  1683. SHADER_VARIANT_PRIMITIVE_POINTS,
  1684. SHADER_VARIANT_ATTRIBUTES,
  1685. SHADER_VARIANT_ATTRIBUTES,
  1686. SHADER_VARIANT_ATTRIBUTES,
  1687. SHADER_VARIANT_ATTRIBUTES,
  1688. SHADER_VARIANT_ATTRIBUTES_POINTS },
  1689. { //lit
  1690. SHADER_VARIANT_QUAD_LIGHT,
  1691. SHADER_VARIANT_NINEPATCH_LIGHT,
  1692. SHADER_VARIANT_PRIMITIVE_LIGHT,
  1693. SHADER_VARIANT_PRIMITIVE_LIGHT,
  1694. SHADER_VARIANT_PRIMITIVE_POINTS_LIGHT,
  1695. SHADER_VARIANT_ATTRIBUTES_LIGHT,
  1696. SHADER_VARIANT_ATTRIBUTES_LIGHT,
  1697. SHADER_VARIANT_ATTRIBUTES_LIGHT,
  1698. SHADER_VARIANT_ATTRIBUTES_LIGHT,
  1699. SHADER_VARIANT_ATTRIBUTES_POINTS_LIGHT },
  1700. };
  1701. RID shader_variant = canvas_singleton->shader.canvas_shader.version_get_shader(version, shader_variants[i][j]);
  1702. pipeline_variants.variants[i][j].setup(shader_variant, primitive[j], RD::PipelineRasterizationState(), RD::PipelineMultisampleState(), RD::PipelineDepthStencilState(), blend_state, 0);
  1703. }
  1704. }
  1705. valid = true;
  1706. }
  1707. void RasterizerCanvasRD::ShaderData::set_default_texture_param(const StringName &p_name, RID p_texture) {
  1708. if (!p_texture.is_valid()) {
  1709. default_texture_params.erase(p_name);
  1710. } else {
  1711. default_texture_params[p_name] = p_texture;
  1712. }
  1713. }
  1714. void RasterizerCanvasRD::ShaderData::get_param_list(List<PropertyInfo> *p_param_list) const {
  1715. Map<int, StringName> order;
  1716. for (Map<StringName, ShaderLanguage::ShaderNode::Uniform>::Element *E = uniforms.front(); E; E = E->next()) {
  1717. if (E->get().scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_LOCAL) {
  1718. continue;
  1719. }
  1720. if (E->get().texture_order >= 0) {
  1721. order[E->get().texture_order + 100000] = E->key();
  1722. } else {
  1723. order[E->get().order] = E->key();
  1724. }
  1725. }
  1726. for (Map<int, StringName>::Element *E = order.front(); E; E = E->next()) {
  1727. PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniforms[E->get()]);
  1728. pi.name = E->get();
  1729. p_param_list->push_back(pi);
  1730. }
  1731. }
  1732. void RasterizerCanvasRD::ShaderData::get_instance_param_list(List<RasterizerStorage::InstanceShaderParam> *p_param_list) const {
  1733. for (Map<StringName, ShaderLanguage::ShaderNode::Uniform>::Element *E = uniforms.front(); E; E = E->next()) {
  1734. if (E->get().scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) {
  1735. continue;
  1736. }
  1737. RasterizerStorage::InstanceShaderParam p;
  1738. p.info = ShaderLanguage::uniform_to_property_info(E->get());
  1739. p.info.name = E->key(); //supply name
  1740. p.index = E->get().instance_index;
  1741. p.default_value = ShaderLanguage::constant_value_to_variant(E->get().default_value, E->get().type, E->get().hint);
  1742. p_param_list->push_back(p);
  1743. }
  1744. }
  1745. bool RasterizerCanvasRD::ShaderData::is_param_texture(const StringName &p_param) const {
  1746. if (!uniforms.has(p_param)) {
  1747. return false;
  1748. }
  1749. return uniforms[p_param].texture_order >= 0;
  1750. }
  1751. bool RasterizerCanvasRD::ShaderData::is_animated() const {
  1752. return false;
  1753. }
  1754. bool RasterizerCanvasRD::ShaderData::casts_shadows() const {
  1755. return false;
  1756. }
  1757. Variant RasterizerCanvasRD::ShaderData::get_default_parameter(const StringName &p_parameter) const {
  1758. if (uniforms.has(p_parameter)) {
  1759. ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter];
  1760. Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value;
  1761. return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.hint);
  1762. }
  1763. return Variant();
  1764. }
  1765. RasterizerCanvasRD::ShaderData::ShaderData() {
  1766. valid = false;
  1767. uses_screen_texture = false;
  1768. uses_sdf = false;
  1769. }
  1770. RasterizerCanvasRD::ShaderData::~ShaderData() {
  1771. RasterizerCanvasRD *canvas_singleton = (RasterizerCanvasRD *)RasterizerCanvas::singleton;
  1772. ERR_FAIL_COND(!canvas_singleton);
  1773. //pipeline variants will clear themselves if shader is gone
  1774. if (version.is_valid()) {
  1775. canvas_singleton->shader.canvas_shader.version_free(version);
  1776. }
  1777. }
  1778. RasterizerStorageRD::ShaderData *RasterizerCanvasRD::_create_shader_func() {
  1779. ShaderData *shader_data = memnew(ShaderData);
  1780. return shader_data;
  1781. }
  1782. void RasterizerCanvasRD::MaterialData::update_parameters(const Map<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty) {
  1783. RasterizerCanvasRD *canvas_singleton = (RasterizerCanvasRD *)RasterizerCanvas::singleton;
  1784. if ((uint32_t)ubo_data.size() != shader_data->ubo_size) {
  1785. p_uniform_dirty = true;
  1786. if (uniform_buffer.is_valid()) {
  1787. RD::get_singleton()->free(uniform_buffer);
  1788. uniform_buffer = RID();
  1789. }
  1790. ubo_data.resize(shader_data->ubo_size);
  1791. if (ubo_data.size()) {
  1792. uniform_buffer = RD::get_singleton()->uniform_buffer_create(ubo_data.size());
  1793. memset(ubo_data.ptrw(), 0, ubo_data.size()); //clear
  1794. }
  1795. //clear previous uniform set
  1796. if (uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(uniform_set)) {
  1797. RD::get_singleton()->free(uniform_set);
  1798. uniform_set = RID();
  1799. }
  1800. }
  1801. //check whether buffer changed
  1802. if (p_uniform_dirty && ubo_data.size()) {
  1803. update_uniform_buffer(shader_data->uniforms, shader_data->ubo_offsets.ptr(), p_parameters, ubo_data.ptrw(), ubo_data.size(), false);
  1804. RD::get_singleton()->buffer_update(uniform_buffer, 0, ubo_data.size(), ubo_data.ptrw());
  1805. }
  1806. uint32_t tex_uniform_count = shader_data->texture_uniforms.size();
  1807. if ((uint32_t)texture_cache.size() != tex_uniform_count) {
  1808. texture_cache.resize(tex_uniform_count);
  1809. p_textures_dirty = true;
  1810. //clear previous uniform set
  1811. if (uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(uniform_set)) {
  1812. RD::get_singleton()->free(uniform_set);
  1813. uniform_set = RID();
  1814. }
  1815. }
  1816. if (p_textures_dirty && tex_uniform_count) {
  1817. update_textures(p_parameters, shader_data->default_texture_params, shader_data->texture_uniforms, texture_cache.ptrw(), false);
  1818. }
  1819. if (shader_data->ubo_size == 0) {
  1820. // This material does not require an uniform set, so don't create it.
  1821. return;
  1822. }
  1823. if (!p_textures_dirty && uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(uniform_set)) {
  1824. //no reason to update uniform set, only UBO (or nothing) was needed to update
  1825. return;
  1826. }
  1827. Vector<RD::Uniform> uniforms;
  1828. {
  1829. if (shader_data->ubo_size) {
  1830. RD::Uniform u;
  1831. u.type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
  1832. u.binding = 0;
  1833. u.ids.push_back(uniform_buffer);
  1834. uniforms.push_back(u);
  1835. }
  1836. const RID *textures = texture_cache.ptrw();
  1837. for (uint32_t i = 0; i < tex_uniform_count; i++) {
  1838. RD::Uniform u;
  1839. u.type = RD::UNIFORM_TYPE_TEXTURE;
  1840. u.binding = 1 + i;
  1841. u.ids.push_back(textures[i]);
  1842. uniforms.push_back(u);
  1843. }
  1844. }
  1845. uniform_set = RD::get_singleton()->uniform_set_create(uniforms, canvas_singleton->shader.canvas_shader.version_get_shader(shader_data->version, 0), MATERIAL_UNIFORM_SET);
  1846. }
  1847. RasterizerCanvasRD::MaterialData::~MaterialData() {
  1848. if (uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(uniform_set)) {
  1849. RD::get_singleton()->free(uniform_set);
  1850. }
  1851. if (uniform_buffer.is_valid()) {
  1852. RD::get_singleton()->free(uniform_buffer);
  1853. }
  1854. }
  1855. RasterizerStorageRD::MaterialData *RasterizerCanvasRD::_create_material_func(ShaderData *p_shader) {
  1856. MaterialData *material_data = memnew(MaterialData);
  1857. material_data->shader_data = p_shader;
  1858. material_data->last_frame = false;
  1859. //update will happen later anyway so do nothing.
  1860. return material_data;
  1861. }
  1862. void RasterizerCanvasRD::set_time(double p_time) {
  1863. state.time = p_time;
  1864. }
  1865. void RasterizerCanvasRD::update() {
  1866. }
  1867. RasterizerCanvasRD::RasterizerCanvasRD(RasterizerStorageRD *p_storage) {
  1868. storage = p_storage;
  1869. { //create default samplers
  1870. default_samplers.default_filter = RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR;
  1871. default_samplers.default_repeat = RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED;
  1872. }
  1873. { //shader variants
  1874. String global_defines;
  1875. uint32_t uniform_max_size = RD::get_singleton()->limit_get(RD::LIMIT_MAX_UNIFORM_BUFFER_SIZE);
  1876. if (uniform_max_size < 65536) {
  1877. //Yes, you guessed right, ARM again
  1878. state.max_lights_per_render = 64;
  1879. global_defines += "#define MAX_LIGHTS 64\n";
  1880. } else {
  1881. state.max_lights_per_render = DEFAULT_MAX_LIGHTS_PER_RENDER;
  1882. global_defines += "#define MAX_LIGHTS " + itos(DEFAULT_MAX_LIGHTS_PER_RENDER) + "\n";
  1883. }
  1884. state.light_uniforms = memnew_arr(LightUniform, state.max_lights_per_render);
  1885. Vector<String> variants;
  1886. //non light variants
  1887. variants.push_back(""); //none by default is first variant
  1888. variants.push_back("#define USE_NINEPATCH\n"); //ninepatch is the second variant
  1889. variants.push_back("#define USE_PRIMITIVE\n"); //primitive is the third
  1890. variants.push_back("#define USE_PRIMITIVE\n#define USE_POINT_SIZE\n"); //points need point size
  1891. variants.push_back("#define USE_ATTRIBUTES\n"); // attributes for vertex arrays
  1892. variants.push_back("#define USE_ATTRIBUTES\n#define USE_POINT_SIZE\n"); //attributes with point size
  1893. //light variants
  1894. variants.push_back("#define USE_LIGHTING\n"); //none by default is first variant
  1895. variants.push_back("#define USE_LIGHTING\n#define USE_NINEPATCH\n"); //ninepatch is the second variant
  1896. variants.push_back("#define USE_LIGHTING\n#define USE_PRIMITIVE\n"); //primitive is the third
  1897. variants.push_back("#define USE_LIGHTING\n#define USE_PRIMITIVE\n#define USE_POINT_SIZE\n"); //points need point size
  1898. variants.push_back("#define USE_LIGHTING\n#define USE_ATTRIBUTES\n"); // attributes for vertex arrays
  1899. variants.push_back("#define USE_LIGHTING\n#define USE_ATTRIBUTES\n#define USE_POINT_SIZE\n"); //attributes with point size
  1900. shader.canvas_shader.initialize(variants, global_defines);
  1901. shader.default_version = shader.canvas_shader.version_create();
  1902. shader.default_version_rd_shader = shader.canvas_shader.version_get_shader(shader.default_version, SHADER_VARIANT_QUAD);
  1903. RD::PipelineColorBlendState blend_state;
  1904. RD::PipelineColorBlendState::Attachment blend_attachment;
  1905. blend_attachment.enable_blend = true;
  1906. blend_attachment.color_blend_op = RD::BLEND_OP_ADD;
  1907. blend_attachment.src_color_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA;
  1908. blend_attachment.dst_color_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
  1909. blend_attachment.alpha_blend_op = RD::BLEND_OP_ADD;
  1910. blend_attachment.src_alpha_blend_factor = RD::BLEND_FACTOR_ONE;
  1911. blend_attachment.dst_alpha_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
  1912. blend_state.attachments.push_back(blend_attachment);
  1913. for (int i = 0; i < PIPELINE_LIGHT_MODE_MAX; i++) {
  1914. for (int j = 0; j < PIPELINE_VARIANT_MAX; j++) {
  1915. RD::RenderPrimitive primitive[PIPELINE_VARIANT_MAX] = {
  1916. RD::RENDER_PRIMITIVE_TRIANGLES,
  1917. RD::RENDER_PRIMITIVE_TRIANGLES,
  1918. RD::RENDER_PRIMITIVE_TRIANGLES,
  1919. RD::RENDER_PRIMITIVE_LINES,
  1920. RD::RENDER_PRIMITIVE_POINTS,
  1921. RD::RENDER_PRIMITIVE_TRIANGLES,
  1922. RD::RENDER_PRIMITIVE_TRIANGLE_STRIPS,
  1923. RD::RENDER_PRIMITIVE_LINES,
  1924. RD::RENDER_PRIMITIVE_LINESTRIPS,
  1925. RD::RENDER_PRIMITIVE_POINTS,
  1926. };
  1927. ShaderVariant shader_variants[PIPELINE_LIGHT_MODE_MAX][PIPELINE_VARIANT_MAX] = {
  1928. { //non lit
  1929. SHADER_VARIANT_QUAD,
  1930. SHADER_VARIANT_NINEPATCH,
  1931. SHADER_VARIANT_PRIMITIVE,
  1932. SHADER_VARIANT_PRIMITIVE,
  1933. SHADER_VARIANT_PRIMITIVE_POINTS,
  1934. SHADER_VARIANT_ATTRIBUTES,
  1935. SHADER_VARIANT_ATTRIBUTES,
  1936. SHADER_VARIANT_ATTRIBUTES,
  1937. SHADER_VARIANT_ATTRIBUTES,
  1938. SHADER_VARIANT_ATTRIBUTES_POINTS },
  1939. { //lit
  1940. SHADER_VARIANT_QUAD_LIGHT,
  1941. SHADER_VARIANT_NINEPATCH_LIGHT,
  1942. SHADER_VARIANT_PRIMITIVE_LIGHT,
  1943. SHADER_VARIANT_PRIMITIVE_LIGHT,
  1944. SHADER_VARIANT_PRIMITIVE_POINTS_LIGHT,
  1945. SHADER_VARIANT_ATTRIBUTES_LIGHT,
  1946. SHADER_VARIANT_ATTRIBUTES_LIGHT,
  1947. SHADER_VARIANT_ATTRIBUTES_LIGHT,
  1948. SHADER_VARIANT_ATTRIBUTES_LIGHT,
  1949. SHADER_VARIANT_ATTRIBUTES_POINTS_LIGHT },
  1950. };
  1951. RID shader_variant = shader.canvas_shader.version_get_shader(shader.default_version, shader_variants[i][j]);
  1952. shader.pipeline_variants.variants[i][j].setup(shader_variant, primitive[j], RD::PipelineRasterizationState(), RD::PipelineMultisampleState(), RD::PipelineDepthStencilState(), blend_state, 0);
  1953. }
  1954. }
  1955. }
  1956. {
  1957. //shader compiler
  1958. ShaderCompilerRD::DefaultIdentifierActions actions;
  1959. actions.renames["VERTEX"] = "vertex";
  1960. actions.renames["LIGHT_VERTEX"] = "light_vertex";
  1961. actions.renames["SHADOW_VERTEX"] = "shadow_vertex";
  1962. actions.renames["UV"] = "uv";
  1963. actions.renames["POINT_SIZE"] = "gl_PointSize";
  1964. actions.renames["WORLD_MATRIX"] = "world_matrix";
  1965. actions.renames["CANVAS_MATRIX"] = "canvas_data.canvas_transform";
  1966. actions.renames["SCREEN_MATRIX"] = "canvas_data.screen_transform";
  1967. actions.renames["TIME"] = "canvas_data.time";
  1968. actions.renames["AT_LIGHT_PASS"] = "false";
  1969. actions.renames["INSTANCE_CUSTOM"] = "instance_custom";
  1970. actions.renames["COLOR"] = "color";
  1971. actions.renames["NORMAL"] = "normal";
  1972. actions.renames["NORMALMAP"] = "normal_map";
  1973. actions.renames["NORMALMAP_DEPTH"] = "normal_depth";
  1974. actions.renames["TEXTURE"] = "color_texture";
  1975. actions.renames["TEXTURE_PIXEL_SIZE"] = "draw_data.color_texture_pixel_size";
  1976. actions.renames["NORMAL_TEXTURE"] = "normal_texture";
  1977. actions.renames["SPECULAR_SHININESS_TEXTURE"] = "specular_texture";
  1978. actions.renames["SPECULAR_SHININESS"] = "specular_shininess";
  1979. actions.renames["SCREEN_UV"] = "screen_uv";
  1980. actions.renames["SCREEN_TEXTURE"] = "screen_texture";
  1981. actions.renames["SCREEN_PIXEL_SIZE"] = "canvas_data.screen_pixel_size";
  1982. actions.renames["FRAGCOORD"] = "gl_FragCoord";
  1983. actions.renames["POINT_COORD"] = "gl_PointCoord";
  1984. actions.renames["LIGHT_POSITION"] = "light_pos";
  1985. actions.renames["LIGHT_COLOR"] = "light_color";
  1986. actions.renames["LIGHT_ENERGY"] = "light_energy";
  1987. actions.renames["LIGHT"] = "light";
  1988. actions.renames["SHADOW_MODULATE"] = "shadow_modulate";
  1989. actions.renames["texture_sdf"] = "texture_sdf";
  1990. actions.renames["texture_sdf_normal"] = "texture_sdf_normal";
  1991. actions.renames["sdf_to_screen_uv"] = "sdf_to_screen_uv";
  1992. actions.renames["screen_uv_to_sdf"] = "screen_uv_to_sdf";
  1993. actions.usage_defines["COLOR"] = "#define COLOR_USED\n";
  1994. actions.usage_defines["SCREEN_TEXTURE"] = "#define SCREEN_TEXTURE_USED\n";
  1995. actions.usage_defines["SCREEN_UV"] = "#define SCREEN_UV_USED\n";
  1996. actions.usage_defines["SCREEN_PIXEL_SIZE"] = "@SCREEN_UV";
  1997. actions.usage_defines["NORMAL"] = "#define NORMAL_USED\n";
  1998. actions.usage_defines["NORMALMAP"] = "#define NORMALMAP_USED\n";
  1999. actions.usage_defines["LIGHT"] = "#define LIGHT_SHADER_CODE_USED\n";
  2000. actions.render_mode_defines["skip_vertex_transform"] = "#define SKIP_TRANSFORM_USED\n";
  2001. actions.render_mode_defines["unshaded"] = "#define MODE_UNSHADED\n";
  2002. actions.render_mode_defines["light_only"] = "#define MODE_LIGHT_ONLY\n";
  2003. actions.custom_samplers["TEXTURE"] = "texture_sampler";
  2004. actions.custom_samplers["NORMAL_TEXTURE"] = "texture_sampler";
  2005. actions.custom_samplers["SPECULAR_SHININESS_TEXTURE"] = "texture_sampler";
  2006. actions.custom_samplers["SCREEN_TEXTURE"] = "material_samplers[3]"; //mipmap and filter for screen texture
  2007. actions.sampler_array_name = "material_samplers";
  2008. actions.base_texture_binding_index = 1;
  2009. actions.texture_layout_set = MATERIAL_UNIFORM_SET;
  2010. actions.base_uniform_string = "material.";
  2011. actions.default_filter = ShaderLanguage::FILTER_LINEAR;
  2012. actions.default_repeat = ShaderLanguage::REPEAT_DISABLE;
  2013. actions.base_varying_index = 4;
  2014. actions.global_buffer_array_variable = "global_variables.data";
  2015. shader.compiler.initialize(actions);
  2016. }
  2017. { //shadow rendering
  2018. Vector<String> versions;
  2019. versions.push_back("\n#define MODE_SHADOW\n"); //shadow
  2020. versions.push_back("\n#define MODE_SDF\n"); //sdf
  2021. shadow_render.shader.initialize(versions);
  2022. {
  2023. Vector<RD::AttachmentFormat> attachments;
  2024. RD::AttachmentFormat af_color;
  2025. af_color.format = RD::DATA_FORMAT_R32_SFLOAT;
  2026. af_color.usage_flags = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT;
  2027. attachments.push_back(af_color);
  2028. RD::AttachmentFormat af_depth;
  2029. af_depth.format = RD::DATA_FORMAT_D32_SFLOAT;
  2030. af_depth.usage_flags = RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
  2031. attachments.push_back(af_depth);
  2032. shadow_render.framebuffer_format = RD::get_singleton()->framebuffer_format_create(attachments);
  2033. }
  2034. {
  2035. Vector<RD::AttachmentFormat> attachments;
  2036. RD::AttachmentFormat af_color;
  2037. af_color.format = RD::DATA_FORMAT_R8_UNORM;
  2038. af_color.usage_flags = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT;
  2039. attachments.push_back(af_color);
  2040. shadow_render.sdf_framebuffer_format = RD::get_singleton()->framebuffer_format_create(attachments);
  2041. }
  2042. //pipelines
  2043. Vector<RD::VertexAttribute> vf;
  2044. RD::VertexAttribute vd;
  2045. vd.format = sizeof(real_t) == sizeof(float) ? RD::DATA_FORMAT_R32G32B32_SFLOAT : RD::DATA_FORMAT_R64G64B64_SFLOAT;
  2046. vd.location = 0;
  2047. vd.offset = 0;
  2048. vd.stride = sizeof(real_t) * 3;
  2049. vf.push_back(vd);
  2050. shadow_render.vertex_format = RD::get_singleton()->vertex_format_create(vf);
  2051. vd.format = sizeof(real_t) == sizeof(float) ? RD::DATA_FORMAT_R32G32_SFLOAT : RD::DATA_FORMAT_R64G64_SFLOAT;
  2052. vd.stride = sizeof(real_t) * 2;
  2053. vf.write[0] = vd;
  2054. shadow_render.sdf_vertex_format = RD::get_singleton()->vertex_format_create(vf);
  2055. shadow_render.shader_version = shadow_render.shader.version_create();
  2056. for (int i = 0; i < 3; i++) {
  2057. RD::PipelineRasterizationState rs;
  2058. rs.cull_mode = i == 0 ? RD::POLYGON_CULL_DISABLED : (i == 1 ? RD::POLYGON_CULL_FRONT : RD::POLYGON_CULL_BACK);
  2059. RD::PipelineDepthStencilState ds;
  2060. ds.enable_depth_write = true;
  2061. ds.enable_depth_test = true;
  2062. ds.depth_compare_operator = RD::COMPARE_OP_LESS;
  2063. shadow_render.render_pipelines[i] = RD::get_singleton()->render_pipeline_create(shadow_render.shader.version_get_shader(shadow_render.shader_version, SHADOW_RENDER_MODE_SHADOW), shadow_render.framebuffer_format, shadow_render.vertex_format, RD::RENDER_PRIMITIVE_TRIANGLES, rs, RD::PipelineMultisampleState(), ds, RD::PipelineColorBlendState::create_disabled(), 0);
  2064. }
  2065. for (int i = 0; i < 2; i++) {
  2066. shadow_render.sdf_render_pipelines[i] = RD::get_singleton()->render_pipeline_create(shadow_render.shader.version_get_shader(shadow_render.shader_version, SHADOW_RENDER_MODE_SDF), shadow_render.sdf_framebuffer_format, shadow_render.sdf_vertex_format, i == 0 ? RD::RENDER_PRIMITIVE_TRIANGLES : RD::RENDER_PRIMITIVE_LINES, RD::PipelineRasterizationState(), RD::PipelineMultisampleState(), RD::PipelineDepthStencilState(), RD::PipelineColorBlendState::create_disabled(), 0);
  2067. }
  2068. }
  2069. { //bindings
  2070. state.canvas_state_buffer = RD::get_singleton()->uniform_buffer_create(sizeof(State::Buffer));
  2071. state.lights_uniform_buffer = RD::get_singleton()->uniform_buffer_create(sizeof(LightUniform) * state.max_lights_per_render);
  2072. RD::SamplerState shadow_sampler_state;
  2073. shadow_sampler_state.mag_filter = RD::SAMPLER_FILTER_LINEAR;
  2074. shadow_sampler_state.min_filter = RD::SAMPLER_FILTER_LINEAR;
  2075. shadow_sampler_state.repeat_u = RD::SAMPLER_REPEAT_MODE_REPEAT; //shadow wrap around
  2076. shadow_sampler_state.compare_op = RD::COMPARE_OP_GREATER;
  2077. shadow_sampler_state.enable_compare = true;
  2078. state.shadow_sampler = RD::get_singleton()->sampler_create(shadow_sampler_state);
  2079. }
  2080. {
  2081. //polygon buffers
  2082. polygon_buffers.last_id = 1;
  2083. }
  2084. { // default index buffer
  2085. Vector<uint8_t> pv;
  2086. pv.resize(6 * 4);
  2087. {
  2088. uint8_t *w = pv.ptrw();
  2089. int *p32 = (int *)w;
  2090. p32[0] = 0;
  2091. p32[1] = 1;
  2092. p32[2] = 2;
  2093. p32[3] = 0;
  2094. p32[4] = 2;
  2095. p32[5] = 3;
  2096. }
  2097. shader.quad_index_buffer = RD::get_singleton()->index_buffer_create(6, RenderingDevice::INDEX_BUFFER_FORMAT_UINT32, pv);
  2098. shader.quad_index_array = RD::get_singleton()->index_array_create(shader.quad_index_buffer, 0, 6);
  2099. }
  2100. { //primitive
  2101. primitive_arrays.index_array[0] = shader.quad_index_array = RD::get_singleton()->index_array_create(shader.quad_index_buffer, 0, 1);
  2102. primitive_arrays.index_array[1] = shader.quad_index_array = RD::get_singleton()->index_array_create(shader.quad_index_buffer, 0, 2);
  2103. primitive_arrays.index_array[2] = shader.quad_index_array = RD::get_singleton()->index_array_create(shader.quad_index_buffer, 0, 3);
  2104. primitive_arrays.index_array[3] = shader.quad_index_array = RD::get_singleton()->index_array_create(shader.quad_index_buffer, 0, 6);
  2105. }
  2106. { //default skeleton buffer
  2107. shader.default_skeleton_uniform_buffer = RD::get_singleton()->uniform_buffer_create(sizeof(SkeletonUniform));
  2108. SkeletonUniform su;
  2109. _update_transform_2d_to_mat4(Transform2D(), su.skeleton_inverse);
  2110. _update_transform_2d_to_mat4(Transform2D(), su.skeleton_transform);
  2111. RD::get_singleton()->buffer_update(shader.default_skeleton_uniform_buffer, 0, sizeof(SkeletonUniform), &su);
  2112. shader.default_skeleton_texture_buffer = RD::get_singleton()->texture_buffer_create(32, RD::DATA_FORMAT_R32G32B32A32_SFLOAT);
  2113. }
  2114. {
  2115. //default shadow texture to keep uniform set happy
  2116. RD::TextureFormat tf;
  2117. tf.type = RD::TEXTURE_TYPE_2D;
  2118. tf.width = 4;
  2119. tf.height = 4;
  2120. tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT;
  2121. tf.format = RD::DATA_FORMAT_R32_SFLOAT;
  2122. state.shadow_texture = RD::get_singleton()->texture_create(tf, RD::TextureView());
  2123. }
  2124. {
  2125. Vector<RD::Uniform> uniforms;
  2126. {
  2127. RD::Uniform u;
  2128. u.type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
  2129. u.binding = 0;
  2130. u.ids.push_back(storage->get_default_rd_storage_buffer());
  2131. uniforms.push_back(u);
  2132. }
  2133. state.default_transforms_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, shader.default_version_rd_shader, TRANSFORMS_UNIFORM_SET);
  2134. }
  2135. default_canvas_texture = storage->canvas_texture_create();
  2136. state.shadow_texture_size = GLOBAL_GET("rendering/quality/2d_shadow_atlas/size");
  2137. //create functions for shader and material
  2138. storage->shader_set_data_request_function(RasterizerStorageRD::SHADER_TYPE_2D, _create_shader_funcs);
  2139. storage->material_set_data_request_function(RasterizerStorageRD::SHADER_TYPE_2D, _create_material_funcs);
  2140. state.time = 0;
  2141. {
  2142. default_canvas_group_shader = storage->shader_create();
  2143. storage->shader_set_code(default_canvas_group_shader, "shader_type canvas_item; \nvoid fragment() {\n\tvec4 c = textureLod(SCREEN_TEXTURE,SCREEN_UV,0.0); if (c.a > 0.0001) c.rgb/=c.a; COLOR *= c; \n}\n");
  2144. default_canvas_group_material = storage->material_create();
  2145. storage->material_set_shader(default_canvas_group_material, default_canvas_group_shader);
  2146. }
  2147. static_assert(sizeof(PushConstant) == 128);
  2148. }
  2149. bool RasterizerCanvasRD::free(RID p_rid) {
  2150. if (canvas_light_owner.owns(p_rid)) {
  2151. CanvasLight *cl = canvas_light_owner.getornull(p_rid);
  2152. ERR_FAIL_COND_V(!cl, false);
  2153. light_set_use_shadow(p_rid, false);
  2154. canvas_light_owner.free(p_rid);
  2155. } else if (occluder_polygon_owner.owns(p_rid)) {
  2156. occluder_polygon_set_shape(p_rid, Vector<Vector2>(), false);
  2157. occluder_polygon_owner.free(p_rid);
  2158. } else {
  2159. return false;
  2160. }
  2161. return true;
  2162. }
  2163. void RasterizerCanvasRD::set_shadow_texture_size(int p_size) {
  2164. p_size = nearest_power_of_2_templated(p_size);
  2165. if (p_size == state.shadow_texture_size) {
  2166. return;
  2167. }
  2168. state.shadow_texture_size = p_size;
  2169. if (state.shadow_fb.is_valid()) {
  2170. RD::get_singleton()->free(state.shadow_texture);
  2171. RD::get_singleton()->free(state.shadow_depth_texture);
  2172. state.shadow_fb = RID();
  2173. {
  2174. //create a default shadow texture to keep uniform set happy (and that it gets erased when a new one is created)
  2175. RD::TextureFormat tf;
  2176. tf.type = RD::TEXTURE_TYPE_2D;
  2177. tf.width = 4;
  2178. tf.height = 4;
  2179. tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT;
  2180. tf.format = RD::DATA_FORMAT_R32_SFLOAT;
  2181. state.shadow_texture = RD::get_singleton()->texture_create(tf, RD::TextureView());
  2182. }
  2183. }
  2184. }
  2185. RasterizerCanvasRD::~RasterizerCanvasRD() {
  2186. //canvas state
  2187. storage->free(default_canvas_group_material);
  2188. storage->free(default_canvas_group_shader);
  2189. {
  2190. if (state.canvas_state_buffer.is_valid()) {
  2191. RD::get_singleton()->free(state.canvas_state_buffer);
  2192. }
  2193. memdelete_arr(state.light_uniforms);
  2194. RD::get_singleton()->free(state.lights_uniform_buffer);
  2195. RD::get_singleton()->free(shader.default_skeleton_uniform_buffer);
  2196. RD::get_singleton()->free(shader.default_skeleton_texture_buffer);
  2197. }
  2198. //shadow rendering
  2199. {
  2200. shadow_render.shader.version_free(shadow_render.shader_version);
  2201. //this will also automatically clear all pipelines
  2202. RD::get_singleton()->free(state.shadow_sampler);
  2203. }
  2204. //bindings
  2205. //shaders
  2206. shader.canvas_shader.version_free(shader.default_version);
  2207. //buffers
  2208. {
  2209. RD::get_singleton()->free(shader.quad_index_array);
  2210. RD::get_singleton()->free(shader.quad_index_buffer);
  2211. //primitives are erase by dependency
  2212. }
  2213. if (state.shadow_fb.is_valid()) {
  2214. RD::get_singleton()->free(state.shadow_depth_texture);
  2215. }
  2216. RD::get_singleton()->free(state.shadow_texture);
  2217. storage->free(default_canvas_texture);
  2218. //pipelines don't need freeing, they are all gone after shaders are gone
  2219. }