render_path_paint.ts 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968
  1. let render_path_paint_live_layer: slot_layer_t = null;
  2. let render_path_paint_live_layer_drawn: i32 = 0;
  3. let render_path_paint_live_layer_locked: bool = false;
  4. let render_path_paint_dilated: bool = true;
  5. let render_path_paint_init_voxels: bool = true; // Bake AO
  6. let render_path_paint_push_undo_last: bool;
  7. let render_path_paint_painto: mesh_object_t = null;
  8. let render_path_paint_planeo: mesh_object_t = null;
  9. let render_path_paint_visibles: bool[] = null;
  10. let render_path_paint_merged_object_visible: bool = false;
  11. let render_path_paint_saved_fov: f32 = 0.0;
  12. let render_path_paint_baking: bool = false;
  13. let _render_path_paint_texpaint: render_target_t;
  14. let _render_path_paint_texpaint_nor: render_target_t;
  15. let _render_path_paint_texpaint_pack: render_target_t;
  16. let _render_path_paint_texpaint_undo: render_target_t;
  17. let _render_path_paint_texpaint_nor_undo: render_target_t;
  18. let _render_path_paint_texpaint_pack_undo: render_target_t;
  19. let render_path_paint_last_x: f32 = -1.0;
  20. let render_path_paint_last_y: f32 = -1.0;
  21. function render_path_paint_init() {
  22. {
  23. let t: render_target_t = render_target_create();
  24. t.name = "texpaint_blend0";
  25. t.width = config_get_texture_res_x();
  26. t.height = config_get_texture_res_y();
  27. t.format = "R8";
  28. render_path_create_render_target(t);
  29. }
  30. {
  31. let t: render_target_t = render_target_create();
  32. t.name = "texpaint_blend1";
  33. t.width = config_get_texture_res_x();
  34. t.height = config_get_texture_res_y();
  35. t.format = "R8";
  36. render_path_create_render_target(t);
  37. }
  38. {
  39. let t: render_target_t = render_target_create();
  40. t.name = "texpaint_colorid";
  41. t.width = 1;
  42. t.height = 1;
  43. t.format = "RGBA32";
  44. render_path_create_render_target(t);
  45. }
  46. {
  47. let t: render_target_t = render_target_create();
  48. t.name = "texpaint_picker";
  49. t.width = 1;
  50. t.height = 1;
  51. t.format = "RGBA32";
  52. render_path_create_render_target(t);
  53. }
  54. {
  55. let t: render_target_t = render_target_create();
  56. t.name = "texpaint_nor_picker";
  57. t.width = 1;
  58. t.height = 1;
  59. t.format = "RGBA32";
  60. render_path_create_render_target(t);
  61. }
  62. {
  63. let t: render_target_t = render_target_create();
  64. t.name = "texpaint_pack_picker";
  65. t.width = 1;
  66. t.height = 1;
  67. t.format = "RGBA32";
  68. render_path_create_render_target(t);
  69. }
  70. {
  71. let t: render_target_t = render_target_create();
  72. t.name = "texpaint_uv_picker";
  73. t.width = 1;
  74. t.height = 1;
  75. t.format = "RGBA32";
  76. render_path_create_render_target(t);
  77. }
  78. {
  79. let t: render_target_t = render_target_create();
  80. t.name = "texpaint_posnortex_picker0";
  81. t.width = 1;
  82. t.height = 1;
  83. t.format = "RGBA128";
  84. render_path_create_render_target(t);
  85. }
  86. {
  87. let t: render_target_t = render_target_create();
  88. t.name = "texpaint_posnortex_picker1";
  89. t.width = 1;
  90. t.height = 1;
  91. t.format = "RGBA128";
  92. render_path_create_render_target(t);
  93. }
  94. render_path_load_shader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
  95. render_path_load_shader("shader_datas/copy_mrt3_pass/copy_mrt3RGBA64_pass");
  96. ///if is_paint
  97. render_path_load_shader("shader_datas/dilate_pass/dilate_pass");
  98. ///end
  99. }
  100. function render_path_paint_commands_paint(dilation = true) {
  101. let tid: i32 = context_raw.layer.id;
  102. if (context_raw.pdirty > 0) {
  103. ///if arm_physics
  104. let particle_physics: bool = context_raw.particle_physics;
  105. ///else
  106. let particle_physics: bool = false;
  107. ///end
  108. if (context_raw.tool == workspace_tool_t.PARTICLE && !particle_physics) {
  109. render_path_set_target("texparticle");
  110. render_path_clear_target(0x00000000);
  111. render_path_bind_target("_main", "gbufferD");
  112. if ((context_raw.xray || config_raw.brush_angle_reject) && config_raw.brush_3d) {
  113. render_path_bind_target("gbuffer0", "gbuffer0");
  114. }
  115. let mo: mesh_object_t = scene_get_child(".ParticleEmitter").ext;
  116. mo.base.visible = true;
  117. mesh_object_render(mo, "mesh",_render_path_bind_params);
  118. mo.base.visible = false;
  119. mo = scene_get_child(".Particle").ext;
  120. mo.base.visible = true;
  121. mesh_object_render(mo, "mesh",_render_path_bind_params);
  122. mo.base.visible = false;
  123. render_path_end();
  124. }
  125. ///if is_paint
  126. if (context_raw.tool == workspace_tool_t.COLORID) {
  127. render_path_set_target("texpaint_colorid");
  128. render_path_clear_target(0xff000000);
  129. render_path_bind_target("gbuffer2", "gbuffer2");
  130. render_path_draw_meshes("paint");
  131. ui_header_handle.redraws = 2;
  132. }
  133. else if (context_raw.tool == workspace_tool_t.PICKER || context_raw.tool == workspace_tool_t.MATERIAL) {
  134. if (context_raw.pick_pos_nor_tex) {
  135. if (context_raw.paint2d) {
  136. render_path_set_target("gbuffer0", ["gbuffer1", "gbuffer2"]);
  137. render_path_draw_meshes("mesh");
  138. }
  139. render_path_set_target("texpaint_posnortex_picker0", ["texpaint_posnortex_picker1"]);
  140. render_path_bind_target("gbuffer2", "gbuffer2");
  141. render_path_bind_target("_main", "gbufferD");
  142. render_path_draw_meshes("paint");
  143. let texpaint_posnortex_picker0: image_t = map_get(render_path_render_targets, "texpaint_posnortex_picker0")._image;
  144. let texpaint_posnortex_picker1: image_t = map_get(render_path_render_targets, "texpaint_posnortex_picker1")._image;
  145. let a: buffer_view_t = buffer_view_create(image_get_pixels(texpaint_posnortex_picker0));
  146. let b: buffer_view_t = buffer_view_create(image_get_pixels(texpaint_posnortex_picker1));
  147. context_raw.posx_picked = buffer_view_get_f32(a, 0);
  148. context_raw.posy_picked = buffer_view_get_f32(a, 4);
  149. context_raw.posz_picked = buffer_view_get_f32(a, 8);
  150. context_raw.uvx_picked = buffer_view_get_f32(a, 12);
  151. context_raw.norx_picked = buffer_view_get_f32(b, 0);
  152. context_raw.nory_picked = buffer_view_get_f32(b, 4);
  153. context_raw.norz_picked = buffer_view_get_f32(b, 8);
  154. context_raw.uvy_picked = buffer_view_get_f32(b, 12);
  155. }
  156. else {
  157. render_path_set_target("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker", "texpaint_uv_picker"]);
  158. render_path_bind_target("gbuffer2", "gbuffer2");
  159. tid = context_raw.layer.id;
  160. let use_live_layer: bool = context_raw.tool == workspace_tool_t.MATERIAL;
  161. if (use_live_layer) {
  162. render_path_paint_use_live_layer(true);
  163. }
  164. render_path_bind_target("texpaint" + tid, "texpaint");
  165. render_path_bind_target("texpaint_nor" + tid, "texpaint_nor");
  166. render_path_bind_target("texpaint_pack" + tid, "texpaint_pack");
  167. render_path_draw_meshes("paint");
  168. if (use_live_layer) {
  169. render_path_paint_use_live_layer(false);
  170. }
  171. ui_header_handle.redraws = 2;
  172. ui_base_hwnds[2].redraws = 2;
  173. let texpaint_picker: image_t = map_get(render_path_render_targets, "texpaint_picker")._image;
  174. let texpaint_nor_picker: image_t = map_get(render_path_render_targets, "texpaint_nor_picker")._image;
  175. let texpaint_pack_picker: image_t = map_get(render_path_render_targets, "texpaint_pack_picker")._image;
  176. let texpaint_uv_picker: image_t = map_get(render_path_render_targets, "texpaint_uv_picker")._image;
  177. let a: buffer_view_t = buffer_view_create(image_get_pixels(texpaint_picker));
  178. let b: buffer_view_t = buffer_view_create(image_get_pixels(texpaint_nor_picker));
  179. let c: buffer_view_t = buffer_view_create(image_get_pixels(texpaint_pack_picker));
  180. let d: buffer_view_t = buffer_view_create(image_get_pixels(texpaint_uv_picker));
  181. if (context_raw.color_picker_callback != null) {
  182. context_raw.color_picker_callback(context_raw.picked_color);
  183. }
  184. // Picked surface values
  185. ///if (krom_metal || krom_vulkan)
  186. let i0: i32 = 2;
  187. let i1: i32 = 1;
  188. let i2: i32 = 0;
  189. ///else
  190. let i0: i32 = 0;
  191. let i1: i32 = 1;
  192. let i2: i32 = 2;
  193. ///end
  194. let i3: i32 = 3;
  195. context_raw.picked_color.base = color_set_rb(context_raw.picked_color.base, buffer_view_get_u8(a, i0));
  196. context_raw.picked_color.base = color_set_gb(context_raw.picked_color.base, buffer_view_get_u8(a, i1));
  197. context_raw.picked_color.base = color_set_bb(context_raw.picked_color.base, buffer_view_get_u8(a, i2));
  198. context_raw.picked_color.normal = color_set_rb(context_raw.picked_color.normal, buffer_view_get_u8(b, i0));
  199. context_raw.picked_color.normal = color_set_gb(context_raw.picked_color.normal, buffer_view_get_u8(b, i1));
  200. context_raw.picked_color.normal = color_set_bb(context_raw.picked_color.normal, buffer_view_get_u8(b, i2));
  201. context_raw.picked_color.occlusion = buffer_view_get_u8(c, i0) / 255;
  202. context_raw.picked_color.roughness = buffer_view_get_u8(c, i1) / 255;
  203. context_raw.picked_color.metallic = buffer_view_get_u8(c, i2) / 255;
  204. context_raw.picked_color.height = buffer_view_get_u8(c, i3) / 255;
  205. context_raw.picked_color.opacity = buffer_view_get_u8(a, i3) / 255;
  206. context_raw.uvx_picked = buffer_view_get_u8(d, i0) / 255;
  207. context_raw.uvy_picked = buffer_view_get_u8(d, i1) / 255;
  208. // Pick material
  209. if (context_raw.picker_select_material && context_raw.color_picker_callback == null) {
  210. // matid % 3 == 0 - normal, 1 - emission, 2 - subsurface
  211. let matid: i32 = math_floor((buffer_view_get_u8(b, 3) - (buffer_view_get_u8(b, 3) % 3)) / 3);
  212. for (let i: i32 = 0; i < project_materials.length; ++i) {
  213. let m: slot_material_t = project_materials[i];
  214. if (m.id == matid) {
  215. context_set_material(m);
  216. context_raw.materialid_picked = matid;
  217. break;
  218. }
  219. }
  220. }
  221. }
  222. }
  223. else {
  224. ///if arm_voxels
  225. if (context_raw.tool == workspace_tool_t.BAKE && context_raw.bake_type == bake_type_t.AO) {
  226. if (render_path_paint_init_voxels) {
  227. render_path_paint_init_voxels = false;
  228. let _rp_gi: bool = config_raw.rp_gi;
  229. config_raw.rp_gi = true;
  230. render_path_base_init_voxels();
  231. config_raw.rp_gi = _rp_gi;
  232. }
  233. render_path_clear_image("voxels", 0x00000000);
  234. render_path_set_target("");
  235. render_path_set_viewport(256, 256);
  236. render_path_bind_target("voxels", "voxels");
  237. render_path_draw_meshes("voxel");
  238. render_path_gen_mipmaps("voxels");
  239. }
  240. ///end
  241. let texpaint: string = "texpaint" + tid;
  242. if (context_raw.tool == workspace_tool_t.BAKE && context_raw.brush_time == time_delta()) {
  243. // Clear to black on bake start
  244. render_path_set_target(texpaint);
  245. render_path_clear_target(0xff000000);
  246. }
  247. render_path_set_target("texpaint_blend1");
  248. render_path_bind_target("texpaint_blend0", "tex");
  249. render_path_draw_shader("shader_datas/copy_pass/copyR8_pass");
  250. let is_mask: bool = slot_layer_is_mask(context_raw.layer);
  251. if (is_mask) {
  252. let ptid: i32 = context_raw.layer.parent.id;
  253. if (slot_layer_is_group(context_raw.layer.parent)) { // Group mask
  254. for (let i: i32 = 0; i < slot_layer_get_children(context_raw.layer.parent).length; ++i) {
  255. let c: slot_layer_t = slot_layer_get_children(context_raw.layer.parent)[i];
  256. ptid = c.id;
  257. break;
  258. }
  259. }
  260. render_path_set_target(texpaint, ["texpaint_nor" + ptid, "texpaint_pack" + ptid, "texpaint_blend0"]);
  261. }
  262. else {
  263. render_path_set_target(texpaint, ["texpaint_nor" + tid, "texpaint_pack" + tid, "texpaint_blend0"]);
  264. }
  265. render_path_bind_target("_main", "gbufferD");
  266. if ((context_raw.xray || config_raw.brush_angle_reject) && config_raw.brush_3d) {
  267. render_path_bind_target("gbuffer0", "gbuffer0");
  268. }
  269. render_path_bind_target("texpaint_blend1", "paintmask");
  270. ///if arm_voxels
  271. if (context_raw.tool == workspace_tool_t.BAKE && context_raw.bake_type == bake_type_t.AO) {
  272. render_path_bind_target("voxels", "voxels");
  273. }
  274. ///end
  275. if (context_raw.colorid_picked) {
  276. render_path_bind_target("texpaint_colorid", "texpaint_colorid");
  277. }
  278. // Read texcoords from gbuffer
  279. let read_tc: bool = (context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.FACE) ||
  280. context_raw.tool == workspace_tool_t.CLONE ||
  281. context_raw.tool == workspace_tool_t.BLUR ||
  282. context_raw.tool == workspace_tool_t.SMUDGE;
  283. if (read_tc) {
  284. render_path_bind_target("gbuffer2", "gbuffer2");
  285. }
  286. render_path_draw_meshes("paint");
  287. if (context_raw.tool == workspace_tool_t.BAKE && context_raw.bake_type == bake_type_t.CURVATURE && context_raw.bake_curv_smooth > 0) {
  288. if (map_get(render_path_render_targets, "texpaint_blur") == null) {
  289. let t = render_target_create();
  290. t.name = "texpaint_blur";
  291. t.width = math_floor(config_get_texture_res_x() * 0.95);
  292. t.height = math_floor(config_get_texture_res_y() * 0.95);
  293. t.format = "RGBA32";
  294. render_path_create_render_target(t);
  295. }
  296. let blurs: i32 = math_round(context_raw.bake_curv_smooth);
  297. for (let i: i32 = 0; i < blurs; ++i) {
  298. render_path_set_target("texpaint_blur");
  299. render_path_bind_target(texpaint, "tex");
  300. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  301. render_path_set_target(texpaint);
  302. render_path_bind_target("texpaint_blur", "tex");
  303. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  304. }
  305. }
  306. if (dilation && config_raw.dilate == dilate_type_t.INSTANT) {
  307. render_path_paint_dilate(true, false);
  308. }
  309. }
  310. ///end
  311. ///if is_sculpt
  312. let texpaint: string = "texpaint" + tid;
  313. render_path_set_target("texpaint_blend1");
  314. render_path_bind_target("texpaint_blend0", "tex");
  315. render_path_draw_shader("shader_datas/copy_pass/copyR8_pass");
  316. render_path_set_target(texpaint, ["texpaint_blend0"]);
  317. render_path_bind_target("gbufferD_undo", "gbufferD");
  318. if ((context_raw.xray || config_raw.brush_angle_reject) && config_raw.brush_3d) {
  319. render_path_bind_target("gbuffer0", "gbuffer0");
  320. }
  321. render_path_bind_target("texpaint_blend1", "paintmask");
  322. // Read texcoords from gbuffer
  323. let read_tc: bool = (context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.FACE) ||
  324. context_raw.tool == workspace_tool_t.CLONE ||
  325. context_raw.tool == workspace_tool_t.BLUR ||
  326. context_raw.tool == workspace_tool_t.SMUDGE;
  327. if (read_tc) {
  328. render_path_bind_target("gbuffer2", "gbuffer2");
  329. }
  330. render_path_bind_target("gbuffer0_undo", "gbuffer0_undo");
  331. let material_contexts: material_context_t[] = [];
  332. let shader_contexts: shader_context_t[] = [];
  333. let mats: material_data_t[] = project_paint_objects[0].materials;
  334. mesh_object_get_contexts(project_paint_objects[0], "paint", mats, material_contexts, shader_contexts);
  335. let cc_context: shader_context_t = shader_contexts[0];
  336. if (const_data_screen_aligned_vb == null) {
  337. const_data_create_screen_aligned_data();
  338. }
  339. g4_set_pipeline(cc_context._.pipe_state);
  340. uniforms_set_context_consts(cc_context,_render_path_bind_params);
  341. uniforms_set_obj_consts(cc_context, project_paint_objects[0].base);
  342. uniforms_set_material_consts(cc_context, material_contexts[0]);
  343. g4_set_vertex_buffer(const_data_screen_aligned_vb);
  344. g4_set_index_buffer(const_data_screen_aligned_ib);
  345. g4_draw();
  346. render_path_end();
  347. ///end
  348. }
  349. }
  350. function render_path_paint_use_live_layer(use: bool) {
  351. let tid: i32 = context_raw.layer.id;
  352. let hid: i32 = history_undo_i - 1 < 0 ? config_raw.undo_steps - 1 : history_undo_i - 1;
  353. if (use) {
  354. _render_path_paint_texpaint = map_get(render_path_render_targets, "texpaint" + tid);
  355. _render_path_paint_texpaint_undo = map_get(render_path_render_targets, "texpaint_undo" + hid);
  356. _render_path_paint_texpaint_nor_undo = map_get(render_path_render_targets, "texpaint_nor_undo" + hid);
  357. _render_path_paint_texpaint_pack_undo = map_get(render_path_render_targets, "texpaint_pack_undo" + hid);
  358. _render_path_paint_texpaint_nor = map_get(render_path_render_targets, "texpaint_nor" + tid);
  359. _render_path_paint_texpaint_pack = map_get(render_path_render_targets, "texpaint_pack" + tid);
  360. map_set(render_path_render_targets, "texpaint_undo" + hid,map_get(render_path_render_targets, "texpaint" + tid));
  361. map_set(render_path_render_targets, "texpaint" + tid,map_get(render_path_render_targets, "texpaint_live"));
  362. if (slot_layer_is_layer(context_raw.layer)) {
  363. map_set(render_path_render_targets, "texpaint_nor_undo" + hid,map_get(render_path_render_targets, "texpaint_nor" + tid));
  364. map_set(render_path_render_targets, "texpaint_pack_undo" + hid,map_get(render_path_render_targets, "texpaint_pack" + tid));
  365. map_set(render_path_render_targets, "texpaint_nor" + tid,map_get(render_path_render_targets, "texpaint_nor_live"));
  366. map_set(render_path_render_targets, "texpaint_pack" + tid,map_get(render_path_render_targets, "texpaint_pack_live"));
  367. }
  368. }
  369. else {
  370. map_set(render_path_render_targets, "texpaint" + tid, _render_path_paint_texpaint);
  371. map_set(render_path_render_targets, "texpaint_undo" + hid, _render_path_paint_texpaint_undo);
  372. if (slot_layer_is_layer(context_raw.layer)) {
  373. map_set(render_path_render_targets, "texpaint_nor_undo" + hid, _render_path_paint_texpaint_nor_undo);
  374. map_set(render_path_render_targets, "texpaint_pack_undo" + hid, _render_path_paint_texpaint_pack_undo);
  375. map_set(render_path_render_targets, "texpaint_nor" + tid, _render_path_paint_texpaint_nor);
  376. map_set(render_path_render_targets, "texpaint_pack" + tid, _render_path_paint_texpaint_pack);
  377. }
  378. }
  379. render_path_paint_live_layer_locked = use;
  380. }
  381. function render_path_paint_commands_live_brush() {
  382. let tool: workspace_tool_t = context_raw.tool;
  383. if (tool != workspace_tool_t.BRUSH &&
  384. tool != workspace_tool_t.ERASER &&
  385. tool != workspace_tool_t.CLONE &&
  386. tool != workspace_tool_t.DECAL &&
  387. tool != workspace_tool_t.TEXT &&
  388. tool != workspace_tool_t.BLUR &&
  389. tool != workspace_tool_t.SMUDGE) {
  390. return;
  391. }
  392. if (render_path_paint_live_layer_locked) {
  393. return;
  394. }
  395. if (render_path_paint_live_layer == null) {
  396. render_path_paint_live_layer = slot_layer_create("_live");
  397. }
  398. let tid: i32 = context_raw.layer.id;
  399. if (slot_layer_is_mask(context_raw.layer)) {
  400. render_path_set_target("texpaint_live");
  401. render_path_bind_target("texpaint" + tid, "tex");
  402. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  403. }
  404. else {
  405. render_path_set_target("texpaint_live", ["texpaint_nor_live", "texpaint_pack_live"]);
  406. render_path_bind_target("texpaint" + tid, "tex0");
  407. render_path_bind_target("texpaint_nor" + tid, "tex1");
  408. render_path_bind_target("texpaint_pack" + tid, "tex2");
  409. render_path_draw_shader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
  410. }
  411. render_path_paint_use_live_layer(true);
  412. render_path_paint_live_layer_drawn = 2;
  413. ui_view2d_hwnd.redraws = 2;
  414. let _x: f32 = context_raw.paint_vec.x;
  415. let _y: f32 = context_raw.paint_vec.y;
  416. if (context_raw.brush_locked) {
  417. context_raw.paint_vec.x = (context_raw.lock_started_x - app_x()) / app_w();
  418. context_raw.paint_vec.y = (context_raw.lock_started_y - app_y()) / app_h();
  419. }
  420. let _last_x: f32 = context_raw.last_paint_vec_x;
  421. let _last_y: f32 = context_raw.last_paint_vec_y;
  422. let _pdirty: i32 = context_raw.pdirty;
  423. context_raw.last_paint_vec_x = context_raw.paint_vec.x;
  424. context_raw.last_paint_vec_y = context_raw.paint_vec.y;
  425. if (operator_shortcut(map_get(config_keymap, "brush_ruler"))) {
  426. context_raw.last_paint_vec_x = context_raw.last_paint_x;
  427. context_raw.last_paint_vec_y = context_raw.last_paint_y;
  428. }
  429. context_raw.pdirty = 2;
  430. render_path_paint_commands_symmetry();
  431. render_path_paint_commands_paint();
  432. render_path_paint_use_live_layer(false);
  433. context_raw.paint_vec.x = _x;
  434. context_raw.paint_vec.y = _y;
  435. context_raw.last_paint_vec_x = _last_x;
  436. context_raw.last_paint_vec_y = _last_y;
  437. context_raw.pdirty = _pdirty;
  438. context_raw.brush_blend_dirty = true;
  439. }
  440. function render_path_paint_commands_cursor() {
  441. if (!config_raw.brush_3d) return;
  442. let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT;
  443. let decal_mask: bool = decal && operator_shortcut(map_get(config_keymap, "decal_mask"), shortcut_type_t.DOWN);
  444. let tool: workspace_tool_t = context_raw.tool;
  445. if (tool != workspace_tool_t.BRUSH &&
  446. tool != workspace_tool_t.ERASER &&
  447. tool != workspace_tool_t.CLONE &&
  448. tool != workspace_tool_t.BLUR &&
  449. tool != workspace_tool_t.SMUDGE &&
  450. tool != workspace_tool_t.PARTICLE &&
  451. !decal_mask) {
  452. return;
  453. }
  454. let fill_layer: bool = context_raw.layer.fill_layer != null;
  455. let group_layer: bool = slot_layer_is_group(context_raw.layer);
  456. if (!base_ui_enabled || base_is_dragging || fill_layer || group_layer) {
  457. return;
  458. }
  459. let mx: f32 = context_raw.paint_vec.x;
  460. let my: f32 = 1.0 - context_raw.paint_vec.y;
  461. if (context_raw.brush_locked) {
  462. mx = (context_raw.lock_started_x - app_x()) / app_w();
  463. my = 1.0 - (context_raw.lock_started_y - app_y()) / app_h();
  464. }
  465. let radius: f32 = decal_mask ? context_raw.brush_decal_mask_radius : context_raw.brush_radius;
  466. render_path_paint_draw_cursor(mx, my, context_raw.brush_nodes_radius * radius / 3.4);
  467. }
  468. function render_path_paint_draw_cursor(mx: f32, my: f32, radius: f32, tint_r: f32 = 1.0, tint_g: f32 = 1.0, tint_b: f32 = 1.0) {
  469. let plane: mesh_object_t = scene_get_child(".Plane").ext;
  470. let geom: mesh_data_t = plane.data;
  471. if (base_pipe_cursor == null) {
  472. base_make_cursor_pipe();
  473. }
  474. render_path_set_target("");
  475. g4_set_pipeline(base_pipe_cursor);
  476. let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT;
  477. let decal_mask: bool = decal && operator_shortcut(map_get(config_keymap, "decal_mask"), shortcut_type_t.DOWN);
  478. let img: image_t = (decal && !decal_mask) ? context_raw.decal_image : resource_get("cursor.k");
  479. g4_set_tex(base_cursor_tex, img);
  480. let gbuffer0: image_t = map_get(render_path_render_targets, "gbuffer0")._image;
  481. g4_set_tex_depth(base_cursor_gbufferd, gbuffer0);
  482. g4_set_float2(base_cursor_mouse, mx, my);
  483. g4_set_float2(base_cursor_tex_step, 1 / gbuffer0.width, 1 / gbuffer0.height);
  484. g4_set_float(base_cursor_radius, radius);
  485. let right: vec4_t = vec4_normalize(camera_object_right_world(scene_camera));
  486. g4_set_float3(base_cursor_camera_right, right.x, right.y, right.z);
  487. g4_set_float3(base_cursor_tint, tint_r, tint_g, tint_b);
  488. g4_set_mat(base_cursor_vp, scene_camera.vp);
  489. let help_mat: mat4_t = mat4_identity();
  490. mat4_get_inv(help_mat, scene_camera.vp);
  491. g4_set_mat(base_cursor_inv_vp, help_mat);
  492. ///if (krom_metal || krom_vulkan)
  493. g4_set_vertex_buffer(mesh_data_get(geom, [{name: "tex", data: "short2norm"}]));
  494. ///else
  495. g4_set_vertex_buffer(geom._.vertex_buffer);
  496. ///end
  497. g4_set_index_buffer(geom._.index_buffers[0]);
  498. g4_draw();
  499. g4_disable_scissor();
  500. render_path_end();
  501. }
  502. function render_path_paint_commands_symmetry() {
  503. if (context_raw.sym_x || context_raw.sym_y || context_raw.sym_z) {
  504. context_raw.ddirty = 2;
  505. let t: transform_t = context_raw.paint_object.base.transform;
  506. let sx: f32 = t.scale.x;
  507. let sy: f32 = t.scale.y;
  508. let sz: f32 = t.scale.z;
  509. if (context_raw.sym_x) {
  510. vec4_set(t.scale, -sx, sy, sz);
  511. transform_build_matrix(t);
  512. render_path_paint_commands_paint(false);
  513. }
  514. if (context_raw.sym_y) {
  515. vec4_set(t.scale, sx, -sy, sz);
  516. transform_build_matrix(t);
  517. render_path_paint_commands_paint(false);
  518. }
  519. if (context_raw.sym_z) {
  520. vec4_set(t.scale, sx, sy, -sz);
  521. transform_build_matrix(t);
  522. render_path_paint_commands_paint(false);
  523. }
  524. if (context_raw.sym_x && context_raw.sym_y) {
  525. vec4_set(t.scale, -sx, -sy, sz);
  526. transform_build_matrix(t);
  527. render_path_paint_commands_paint(false);
  528. }
  529. if (context_raw.sym_x && context_raw.sym_z) {
  530. vec4_set(t.scale, -sx, sy, -sz);
  531. transform_build_matrix(t);
  532. render_path_paint_commands_paint(false);
  533. }
  534. if (context_raw.sym_y && context_raw.sym_z) {
  535. vec4_set(t.scale, sx, -sy, -sz);
  536. transform_build_matrix(t);
  537. render_path_paint_commands_paint(false);
  538. }
  539. if (context_raw.sym_x && context_raw.sym_y && context_raw.sym_z) {
  540. vec4_set(t.scale, -sx, -sy, -sz);
  541. transform_build_matrix(t);
  542. render_path_paint_commands_paint(false);
  543. }
  544. vec4_set(t.scale, sx, sy, sz);
  545. transform_build_matrix(t);
  546. }
  547. }
  548. function render_path_paint_paint_enabled(): bool {
  549. ///if is_paint
  550. let fill_layer: bool = context_raw.layer.fill_layer != null && context_raw.tool != workspace_tool_t.PICKER && context_raw.tool != workspace_tool_t.MATERIAL && context_raw.tool != workspace_tool_t.COLORID;
  551. ///end
  552. ///if is_sculpt
  553. let fill_layer: bool = context_raw.layer.fill_layer != null && context_raw.tool != workspace_tool_t.PICKER && context_raw.tool != workspace_tool_t.MATERIAL;
  554. ///end
  555. let group_layer: bool = slot_layer_is_group(context_raw.layer);
  556. return !fill_layer && !group_layer && !context_raw.foreground_event;
  557. }
  558. function render_path_paint_live_brush_dirty() {
  559. let mx: f32 = render_path_paint_last_x;
  560. let my: f32 = render_path_paint_last_y;
  561. render_path_paint_last_x = mouse_view_x();
  562. render_path_paint_last_y = mouse_view_y();
  563. if (config_raw.brush_live && context_raw.pdirty <= 0) {
  564. let moved: bool = (mx != render_path_paint_last_x || my != render_path_paint_last_y) && (context_in_viewport() || context_in_2d_view());
  565. if (moved || context_raw.brush_locked) {
  566. context_raw.rdirty = 2;
  567. }
  568. }
  569. }
  570. function render_path_paint_begin() {
  571. ///if is_paint
  572. if (!render_path_paint_dilated) {
  573. render_path_paint_dilate(config_raw.dilate == dilate_type_t.DELAYED, true);
  574. render_path_paint_dilated = true;
  575. }
  576. ///end
  577. if (!render_path_paint_paint_enabled()) {
  578. return;
  579. }
  580. ///if is_paint
  581. render_path_paint_push_undo_last = history_push_undo;
  582. ///end
  583. if (history_push_undo && history_undo_layers != null) {
  584. history_paint();
  585. ///if is_sculpt
  586. render_path_set_target("gbuffer0_undo");
  587. render_path_bind_target("gbuffer0", "tex");
  588. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  589. render_path_set_target("gbufferD_undo");
  590. render_path_bind_target("_main", "tex");
  591. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  592. ///end
  593. }
  594. ///if is_sculpt
  595. if (history_push_undo2 && history_undo_layers != null) {
  596. history_paint();
  597. }
  598. ///end
  599. if (context_raw.paint2d) {
  600. render_path_paint_set_plane_mesh();
  601. }
  602. if (render_path_paint_live_layer_drawn > 0) render_path_paint_live_layer_drawn--;
  603. if (config_raw.brush_live && context_raw.pdirty <= 0 && context_raw.ddirty <= 0 && context_raw.brush_time == 0) {
  604. // Depth is unchanged, draw before gbuffer gets updated
  605. render_path_paint_commands_live_brush();
  606. }
  607. }
  608. function render_path_paint_end() {
  609. render_path_paint_commands_cursor();
  610. context_raw.ddirty--;
  611. context_raw.rdirty--;
  612. if (!render_path_paint_paint_enabled()) {
  613. return;
  614. }
  615. context_raw.pdirty--;
  616. }
  617. function render_path_paint_draw() {
  618. if (!render_path_paint_paint_enabled()) {
  619. return;
  620. }
  621. ///if (!krom_ios) // No hover on iPad, decals are painted by pen release
  622. if (config_raw.brush_live && context_raw.pdirty <= 0 && context_raw.ddirty > 0 && context_raw.brush_time == 0) {
  623. // gbuffer has been updated now but brush will lag 1 frame
  624. render_path_paint_commands_live_brush();
  625. }
  626. ///end
  627. if (history_undo_layers != null) {
  628. render_path_paint_commands_symmetry();
  629. if (context_raw.pdirty > 0) {
  630. render_path_paint_dilated = false;
  631. }
  632. ///if is_paint
  633. if (context_raw.tool == workspace_tool_t.BAKE) {
  634. ///if (krom_direct3d12 || krom_vulkan || krom_metal)
  635. let is_raytraced_bake: bool = (context_raw.bake_type == bake_type_t.AO ||
  636. context_raw.bake_type == bake_type_t.LIGHTMAP ||
  637. context_raw.bake_type == bake_type_t.BENT_NORMAL ||
  638. context_raw.bake_type == bake_type_t.THICKNESS);
  639. ///end
  640. if (context_raw.bake_type == bake_type_t.NORMAL || context_raw.bake_type == bake_type_t.HEIGHT || context_raw.bake_type == bake_type_t.DERIVATIVE) {
  641. if (!render_path_paint_baking && context_raw.pdirty > 0) {
  642. render_path_paint_baking = true;
  643. let _bake_type: bake_type_t = context_raw.bake_type;
  644. context_raw.bake_type = context_raw.bake_type == bake_type_t.NORMAL ? bake_type_t.NORMAL_OBJECT : bake_type_t.POSITION; // Bake high poly data
  645. make_material_parse_paint_material();
  646. let _paint_object: mesh_object_t = context_raw.paint_object;
  647. let high_poly: mesh_object_t = project_paint_objects[context_raw.bake_high_poly];
  648. let _visible: bool = high_poly.base.visible;
  649. high_poly.base.visible = true;
  650. context_select_paint_object(high_poly);
  651. render_path_paint_commands_paint();
  652. high_poly.base.visible = _visible;
  653. if (render_path_paint_push_undo_last) {
  654. history_paint();
  655. }
  656. context_select_paint_object(_paint_object);
  657. let _render_final = function () {
  658. context_raw.bake_type = _bake_type;
  659. make_material_parse_paint_material();
  660. context_raw.pdirty = 1;
  661. render_path_paint_commands_paint();
  662. context_raw.pdirty = 0;
  663. render_path_paint_baking = false;
  664. }
  665. let _render_deriv = function () {
  666. context_raw.bake_type = bake_type_t.HEIGHT;
  667. make_material_parse_paint_material();
  668. context_raw.pdirty = 1;
  669. render_path_paint_commands_paint();
  670. context_raw.pdirty = 0;
  671. if (render_path_paint_push_undo_last) {
  672. history_paint();
  673. }
  674. app_notify_on_init(_render_final);
  675. }
  676. // @ts-ignore
  677. app_notify_on_init(context_raw.bake_type == bake_type_t.DERIVATIVE ? _render_deriv : _render_final);
  678. }
  679. }
  680. else if (context_raw.bake_type == bake_type_t.OBJECTID) {
  681. let _layer_filter: i32 = context_raw.layer_filter;
  682. let _paint_object: mesh_object_t = context_raw.paint_object;
  683. let is_merged: bool = context_raw.merged_object != null;
  684. let _visible: bool = is_merged && context_raw.merged_object.base.visible;
  685. context_raw.layer_filter = 1;
  686. if (is_merged) {
  687. context_raw.merged_object.base.visible = false;
  688. }
  689. for (let i: i32 = 0; i < project_paint_objects.length; ++i) {
  690. let p: mesh_object_t = project_paint_objects[i];
  691. context_select_paint_object(p);
  692. render_path_paint_commands_paint();
  693. }
  694. context_raw.layer_filter = _layer_filter;
  695. context_select_paint_object(_paint_object);
  696. if (is_merged) context_raw.merged_object.base.visible = _visible;
  697. }
  698. ///if (krom_direct3d12 || krom_vulkan || krom_metal)
  699. else if (is_raytraced_bake) {
  700. let dirty: bool = render_path_raytrace_bake_commands(make_material_parse_paint_material);
  701. if (dirty) ui_header_handle.redraws = 2;
  702. if (config_raw.dilate == dilate_type_t.INSTANT) { // && raw.pdirty == 1
  703. render_path_paint_dilate(true, false);
  704. }
  705. }
  706. ///end
  707. else {
  708. render_path_paint_commands_paint();
  709. }
  710. }
  711. else { // Paint
  712. render_path_paint_commands_paint();
  713. }
  714. ///end
  715. ///if is_sculpt
  716. render_path_paint_commands_paint();
  717. ///end
  718. }
  719. if (context_raw.brush_blend_dirty) {
  720. context_raw.brush_blend_dirty = false;
  721. ///if krom_metal
  722. render_path_set_target("texpaint_blend0");
  723. render_path_clear_target(0x00000000);
  724. render_path_set_target("texpaint_blend1");
  725. render_path_clear_target(0x00000000);
  726. ///else
  727. render_path_set_target("texpaint_blend0", ["texpaint_blend1"]);
  728. render_path_clear_target(0x00000000);
  729. ///end
  730. }
  731. if (context_raw.paint2d) {
  732. render_path_paint_restore_plane_mesh();
  733. }
  734. }
  735. function render_path_paint_set_plane_mesh() {
  736. context_raw.paint2d_view = true;
  737. render_path_paint_painto = context_raw.paint_object;
  738. render_path_paint_visibles = [];
  739. for (let i: i32 = 0; i < project_paint_objects.length; ++i) {
  740. let p: mesh_object_t = project_paint_objects[i];
  741. array_push(render_path_paint_visibles, p.base.visible);
  742. p.base.visible = false;
  743. }
  744. if (context_raw.merged_object != null) {
  745. render_path_paint_merged_object_visible = context_raw.merged_object.base.visible;
  746. context_raw.merged_object.base.visible = false;
  747. }
  748. let cam: camera_object_t = scene_camera;
  749. mat4_set_from(context_raw.saved_camera, cam.base.transform.local);
  750. render_path_paint_saved_fov = cam.data.fov;
  751. viewport_update_camera_type(camera_type_t.PERSPECTIVE);
  752. let m: mat4_t = mat4_identity();
  753. mat4_translate(m, 0, 0, 0.5);
  754. transform_set_matrix(cam.base.transform, m);
  755. cam.data.fov = base_default_fov;
  756. camera_object_build_proj(cam);
  757. camera_object_build_mat(cam);
  758. let tw: f32 = 0.95 * ui_view2d_pan_scale;
  759. let tx: f32 = ui_view2d_pan_x / ui_view2d_ww;
  760. let ty: f32 = ui_view2d_pan_y / app_h();
  761. mat4_set_identity(m);
  762. mat4_scale(m, vec4_create(tw, tw, 1));
  763. mat4_set_loc(m, vec4_create(tx, ty, 0));
  764. let m2: mat4_t = mat4_identity();
  765. mat4_get_inv(m2, scene_camera.vp);
  766. mat4_mult_mat(m, m2);
  767. let tiled: bool = ui_view2d_tiled_show;
  768. if (tiled && scene_get_child(".PlaneTiled") == null) {
  769. // 3x3 planes
  770. let posa: i16[] = [32767,0,-32767,0,10922,0,-10922,0,10922,0,-32767,0,10922,0,-10922,0,-10922,0,10922,0,-10922,0,-10922,0,-10922,0,10922,0,-32767,0,32767,0,-32767,0,10922,0,10922,0,10922,0,-10922,0,32767,0,-10922,0,10922,0,32767,0,10922,0,10922,0,32767,0,10922,0,10922,0,-10922,0,-10922,0,-32767,0,10922,0,-32767,0,-10922,0,32767,0,-10922,0,10922,0,10922,0,10922,0,-10922,0,-10922,0,-32767,0,-32767,0,-10922,0,-32767,0,-32767,0,10922,0,-32767,0,-10922,0,-10922,0,-10922,0,-32767,0,32767,0,-32767,0,32767,0,-10922,0,10922,0,-10922,0,10922,0,-10922,0,10922,0,10922,0,-10922,0,10922,0,-10922,0,10922,0,-10922,0,32767,0,-32767,0,32767,0,10922,0,10922,0,10922,0,32767,0,-10922,0,32767,0,32767,0,10922,0,32767,0,32767,0,10922,0,32767,0,-10922,0,-10922,0,-10922,0,10922,0,-32767,0,10922,0,32767,0,-10922,0,32767,0,10922,0,10922,0,10922,0,-10922,0,-32767,0,-10922,0,-10922,0,-32767,0,-10922,0,10922,0,-32767,0,10922,0,-10922,0,-10922,0,-10922,0];
  771. let nora: i16[] = [0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767];
  772. let texa: i16[] = [32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0];
  773. let inda: u32[] = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53];
  774. let raw: mesh_data_t = {
  775. name: ".PlaneTiled",
  776. vertex_arrays: [
  777. { attrib: "pos", values: i16_array_create_from_array(posa), data: "short4norm" },
  778. { attrib: "nor", values: i16_array_create_from_array(nora), data: "short2norm" },
  779. { attrib: "tex", values: i16_array_create_from_array(texa), data: "short2norm" }
  780. ],
  781. index_arrays: [
  782. { values: u32_array_create_from_array(inda), material: 0 }
  783. ],
  784. scale_pos: 1.5,
  785. scale_tex: 1.0
  786. };
  787. let md: mesh_data_t = mesh_data_create(raw);
  788. let materials: material_data_t[] = scene_get_child(".Plane").ext.materials;
  789. let o: mesh_object_t = scene_add_mesh_object(md, materials);
  790. o.base.name = ".PlaneTiled";
  791. }
  792. render_path_paint_planeo = scene_get_child(tiled ? ".PlaneTiled" : ".Plane").ext;
  793. render_path_paint_planeo.base.visible = true;
  794. context_raw.paint_object = render_path_paint_planeo;
  795. let v: vec4_t = vec4_create();
  796. let sx: f32 = vec4_len(vec4_set(v, m.m[0], m.m[1], m.m[2]));
  797. quat_from_euler(render_path_paint_planeo.base.transform.rot, -math_pi() / 2, 0, 0);
  798. vec4_set(render_path_paint_planeo.base.transform.scale, sx, 1.0, sx);
  799. render_path_paint_planeo.base.transform.scale.z *= config_get_texture_res_y() / config_get_texture_res_x();
  800. vec4_set(render_path_paint_planeo.base.transform.loc, m.m[12], -m.m[13], 0.0);
  801. transform_build_matrix(render_path_paint_planeo.base.transform);
  802. }
  803. function render_path_paint_restore_plane_mesh() {
  804. context_raw.paint2d_view = false;
  805. render_path_paint_planeo.base.visible = false;
  806. vec4_set(render_path_paint_planeo.base.transform.loc, 0.0, 0.0, 0.0);
  807. for (let i: i32 = 0; i < project_paint_objects.length; ++i) {
  808. project_paint_objects[i].base.visible = render_path_paint_visibles[i];
  809. }
  810. if (context_raw.merged_object != null) {
  811. context_raw.merged_object.base.visible = render_path_paint_merged_object_visible;
  812. }
  813. context_raw.paint_object = render_path_paint_painto;
  814. transform_set_matrix(scene_camera.base.transform, context_raw.saved_camera);
  815. scene_camera.data.fov = render_path_paint_saved_fov;
  816. viewport_update_camera_type(context_raw.camera_type);
  817. camera_object_build_proj(scene_camera);
  818. camera_object_build_mat(scene_camera);
  819. render_path_base_draw_gbuffer();
  820. }
  821. function render_path_paint_bind_layers() {
  822. ///if is_paint
  823. let is_live: bool = config_raw.brush_live && render_path_paint_live_layer_drawn > 0;
  824. let is_material_tool: bool = context_raw.tool == workspace_tool_t.MATERIAL;
  825. if (is_live || is_material_tool) {
  826. render_path_paint_use_live_layer(true);
  827. }
  828. ///end
  829. for (let i: i32 = 0; i < project_layers.length; ++i) {
  830. let l: slot_layer_t = project_layers[i];
  831. render_path_bind_target("texpaint" + l.id, "texpaint" + l.id);
  832. ///if is_paint
  833. if (slot_layer_is_layer(l)) {
  834. render_path_bind_target("texpaint_nor" + l.id, "texpaint_nor" + l.id);
  835. render_path_bind_target("texpaint_pack" + l.id, "texpaint_pack" + l.id);
  836. }
  837. ///end
  838. }
  839. }
  840. function render_path_paint_unbind_layers() {
  841. ///if is_paint
  842. let is_live: bool = config_raw.brush_live && render_path_paint_live_layer_drawn > 0;
  843. let is_material_tool: bool = context_raw.tool == workspace_tool_t.MATERIAL;
  844. if (is_live || is_material_tool) {
  845. render_path_paint_use_live_layer(false);
  846. }
  847. ///end
  848. }
  849. function render_path_paint_dilate(base: bool, nor_pack: bool) {
  850. ///if is_paint
  851. if (config_raw.dilate_radius > 0 && !context_raw.paint2d) {
  852. util_uv_cache_dilate_map();
  853. base_make_temp_img();
  854. let tid: i32 = context_raw.layer.id;
  855. if (base) {
  856. let texpaint: string = "texpaint";
  857. render_path_set_target("temptex0");
  858. render_path_bind_target(texpaint + tid, "tex");
  859. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  860. render_path_set_target(texpaint + tid);
  861. render_path_bind_target("temptex0", "tex");
  862. render_path_draw_shader("shader_datas/dilate_pass/dilate_pass");
  863. }
  864. if (nor_pack && !slot_layer_is_mask(context_raw.layer)) {
  865. render_path_set_target("temptex0");
  866. render_path_bind_target("texpaint_nor" + tid, "tex");
  867. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  868. render_path_set_target("texpaint_nor" + tid);
  869. render_path_bind_target("temptex0", "tex");
  870. render_path_draw_shader("shader_datas/dilate_pass/dilate_pass");
  871. render_path_set_target("temptex0");
  872. render_path_bind_target("texpaint_pack" + tid, "tex");
  873. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  874. render_path_set_target("texpaint_pack" + tid);
  875. render_path_bind_target("temptex0", "tex");
  876. render_path_draw_shader("shader_datas/dilate_pass/dilate_pass");
  877. }
  878. }
  879. ///end
  880. }