rasterizer_canvas_rd.cpp 90 KB

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