render_path_paint.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. let render_path_paint_live_layer_drawn: i32 = 0; ////
  2. function render_path_paint_init() {
  3. {
  4. let t = render_target_create();
  5. t.name = "texpaint_blend0";
  6. t.width = config_get_texture_res_x();
  7. t.height = config_get_texture_res_y();
  8. t.format = "R8";
  9. render_path_create_render_target(t);
  10. }
  11. {
  12. let t = render_target_create();
  13. t.name = "texpaint_blend1";
  14. t.width = config_get_texture_res_x();
  15. t.height = config_get_texture_res_y();
  16. t.format = "R8";
  17. render_path_create_render_target(t);
  18. }
  19. {
  20. let t = render_target_create();
  21. t.name = "texpaint_picker";
  22. t.width = 1;
  23. t.height = 1;
  24. t.format = "RGBA32";
  25. render_path_create_render_target(t);
  26. }
  27. {
  28. let t = render_target_create();
  29. t.name = "texpaint_nor_picker";
  30. t.width = 1;
  31. t.height = 1;
  32. t.format = "RGBA32";
  33. render_path_create_render_target(t);
  34. }
  35. {
  36. let t = render_target_create();
  37. t.name = "texpaint_pack_picker";
  38. t.width = 1;
  39. t.height = 1;
  40. t.format = "RGBA32";
  41. render_path_create_render_target(t);
  42. }
  43. {
  44. let t = render_target_create();
  45. t.name = "texpaint_uv_picker";
  46. t.width = 1;
  47. t.height = 1;
  48. t.format = "RGBA32";
  49. render_path_create_render_target(t);
  50. }
  51. render_path_load_shader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
  52. }
  53. function render_path_paint_commands_paint(dilation: bool = true) {
  54. let tid = "";
  55. if (context_raw.pdirty > 0) {
  56. if (context_raw.tool == workspace_tool_t.PICKER) {
  57. ///if krom_metal
  58. // render_path_set_target("texpaint_picker");
  59. // render_path_clear_target(0xff000000);
  60. // render_path_set_target("texpaint_nor_picker");
  61. // render_path_clear_target(0xff000000);
  62. // render_path_set_target("texpaint_pack_picker");
  63. // render_path_clear_target(0xff000000);
  64. render_path_set_target("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker", "texpaint_uv_picker"]);
  65. ///else
  66. render_path_set_target("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker", "texpaint_uv_picker"]);
  67. // render_path_clear_target(0xff000000);
  68. ///end
  69. render_path_bind_target("gbuffer2", "gbuffer2");
  70. // tid = context_raw.layer.id;
  71. render_path_bind_target("texpaint" + tid, "texpaint");
  72. render_path_bind_target("texpaint_nor" + tid, "texpaint_nor");
  73. render_path_bind_target("texpaint_pack" + tid, "texpaint_pack");
  74. render_path_draw_meshes("paint");
  75. ui_header_handle.redraws = 2;
  76. let texpaint_picker = map_get(render_path_render_targets, "texpaint_picker")._image;
  77. let texpaint_nor_picker = map_get(render_path_render_targets, "texpaint_nor_picker")._image;
  78. let texpaint_pack_picker = map_get(render_path_render_targets, "texpaint_pack_picker")._image;
  79. let texpaint_uv_picker = map_get(render_path_render_targets, "texpaint_uv_picker")._image;
  80. let a = image_get_pixels(texpaint_picker);
  81. let b = image_get_pixels(texpaint_nor_picker);
  82. let c = image_get_pixels(texpaint_pack_picker);
  83. let d = image_get_pixels(texpaint_uv_picker);
  84. if (context_raw.color_picker_callback != null) {
  85. context_raw.color_picker_callback(context_raw.picked_color);
  86. }
  87. // Picked surface values
  88. // ///if (krom_metal || krom_vulkan)
  89. // context_raw.pickedColor.base.Rb = a.get(2);
  90. // context_raw.pickedColor.base.Gb = a.get(1);
  91. // context_raw.pickedColor.base.Bb = a.get(0);
  92. // context_raw.pickedColor.normal.Rb = b.get(2);
  93. // context_raw.pickedColor.normal.Gb = b.get(1);
  94. // context_raw.pickedColor.normal.Bb = b.get(0);
  95. // context_raw.pickedColor.occlusion = c.get(2) / 255;
  96. // context_raw.pickedColor.roughness = c.get(1) / 255;
  97. // context_raw.pickedColor.metallic = c.get(0) / 255;
  98. // context_raw.pickedColor.height = c.get(3) / 255;
  99. // context_raw.pickedColor.opacity = a.get(3) / 255;
  100. // context_raw.uvxPicked = d.get(2) / 255;
  101. // context_raw.uvyPicked = d.get(1) / 255;
  102. // ///else
  103. // context_raw.pickedColor.base.Rb = a.get(0);
  104. // context_raw.pickedColor.base.Gb = a.get(1);
  105. // context_raw.pickedColor.base.Bb = a.get(2);
  106. // context_raw.pickedColor.normal.Rb = b.get(0);
  107. // context_raw.pickedColor.normal.Gb = b.get(1);
  108. // context_raw.pickedColor.normal.Bb = b.get(2);
  109. // context_raw.pickedColor.occlusion = c.get(0) / 255;
  110. // context_raw.pickedColor.roughness = c.get(1) / 255;
  111. // context_raw.pickedColor.metallic = c.get(2) / 255;
  112. // context_raw.pickedColor.height = c.get(3) / 255;
  113. // context_raw.pickedColor.opacity = a.get(3) / 255;
  114. // context_raw.uvxPicked = d.get(0) / 255;
  115. // context_raw.uvyPicked = d.get(1) / 255;
  116. // ///end
  117. }
  118. else {
  119. let texpaint = "texpaint_node_target";
  120. render_path_set_target("texpaint_blend1");
  121. render_path_bind_target("texpaint_blend0", "tex");
  122. render_path_draw_shader("shader_datas/copy_pass/copyR8_pass");
  123. render_path_set_target(texpaint, ["texpaint_nor" + tid, "texpaint_pack" + tid, "texpaint_blend0"]);
  124. render_path_bind_target("_main", "gbufferD");
  125. render_path_bind_target("texpaint_blend1", "paintmask");
  126. // Read texcoords from gbuffer
  127. let readTC = context_raw.tool == workspace_tool_t.CLONE ||
  128. context_raw.tool == workspace_tool_t.BLUR ||
  129. context_raw.tool == workspace_tool_t.SMUDGE;
  130. if (readTC) {
  131. render_path_bind_target("gbuffer2", "gbuffer2");
  132. }
  133. render_path_draw_meshes("paint");
  134. }
  135. }
  136. }
  137. function render_path_paint_commands_cursor() {
  138. let tool = context_raw.tool;
  139. if (tool != workspace_tool_t.ERASER &&
  140. tool != workspace_tool_t.CLONE &&
  141. tool != workspace_tool_t.BLUR &&
  142. tool != workspace_tool_t.SMUDGE) {
  143. return;
  144. }
  145. let nodes = ui_nodes_get_nodes();
  146. let canvas = ui_nodes_get_canvas(true);
  147. let inpaint = nodes.nodes_selected_id.length > 0 && zui_get_node(canvas.nodes, nodes.nodes_selected_id[0]).type == "InpaintNode";
  148. if (!base_ui_enabled || base_is_dragging || !inpaint) {
  149. return;
  150. }
  151. let mx = context_raw.paint_vec.x;
  152. let my = 1.0 - context_raw.paint_vec.y;
  153. if (context_raw.brush_locked) {
  154. mx = (context_raw.lock_started_x - app_x()) / app_w();
  155. my = 1.0 - (context_raw.lock_started_y - app_y()) / app_h();
  156. }
  157. let radius = context_raw.brush_radius;
  158. render_path_paint_draw_cursor(mx, my, radius / 3.4);
  159. }
  160. 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) {
  161. let plane = scene_get_child(".Plane").ext;
  162. let geom = plane.data;
  163. if (base_pipe_cursor == null) {
  164. base_make_cursor_pipe();
  165. }
  166. render_path_set_target("");
  167. g4_set_pipeline(base_pipe_cursor);
  168. let img = resource_get("cursor.k");
  169. g4_set_tex(base_cursor_tex, img);
  170. let gbuffer0 = map_get(render_path_render_targets, "gbuffer0")._image;
  171. g4_set_tex_depth(base_cursor_gbufferd, gbuffer0);
  172. g4_set_float2(base_cursor_mouse, mx, my);
  173. g4_set_float2(base_cursor_tex_step, 1 / gbuffer0.width, 1 / gbuffer0.height);
  174. g4_set_float(base_cursor_radius, radius);
  175. let right = vec4_normalize(camera_object_right_world(scene_camera));
  176. g4_set_float3(base_cursor_camera_right, right.x, right.y, right.z);
  177. g4_set_float3(base_cursor_tint, tint_r, tint_g, tint_b);
  178. g4_set_mat(base_cursor_vp, scene_camera.vp);
  179. let helpMat = mat4_identity();
  180. mat4_get_inv(helpMat, scene_camera.vp);
  181. g4_set_mat(base_cursor_inv_vp, helpMat);
  182. ///if (krom_metal || krom_vulkan)
  183. g4_set_vertex_buffer(mesh_data_get(geom, [{name: "tex", data: "short2norm"}]));
  184. ///else
  185. g4_set_vertex_buffer(geom._vertexBuffer);
  186. ///end
  187. g4_set_index_buffer(geom._indexBuffers[0]);
  188. g4_draw();
  189. g4_disable_scissor();
  190. render_path_end();
  191. }
  192. function render_path_paint_paint_enabled(): bool {
  193. return !context_raw.foreground_event;
  194. }
  195. function render_path_paint_begin() {
  196. if (!render_path_paint_paint_enabled()) {
  197. return;
  198. }
  199. }
  200. function render_path_paint_end() {
  201. render_path_paint_commands_cursor();
  202. context_raw.ddirty--;
  203. context_raw.rdirty--;
  204. if (!render_path_paint_paint_enabled()) {
  205. return;
  206. }
  207. context_raw.pdirty--;
  208. }
  209. function render_path_paint_draw() {
  210. if (!render_path_paint_paint_enabled()) {
  211. return;
  212. }
  213. render_path_paint_commands_paint();
  214. if (context_raw.brush_blend_dirty) {
  215. context_raw.brush_blend_dirty = false;
  216. ///if krom_metal
  217. render_path_set_target("texpaint_blend0");
  218. render_path_clear_target(0x00000000);
  219. render_path_set_target("texpaint_blend1");
  220. render_path_clear_target(0x00000000);
  221. ///else
  222. render_path_set_target("texpaint_blend0", ["texpaint_blend1"]);
  223. render_path_clear_target(0x00000000);
  224. ///end
  225. }
  226. }
  227. function render_path_paint_bind_layers() {
  228. let image: image_t = null;
  229. let nodes = ui_nodes_get_nodes();
  230. let canvas = ui_nodes_get_canvas(true);
  231. if (nodes.nodes_selected_id.length > 0) {
  232. let node = zui_get_node(canvas.nodes, nodes.nodes_selected_id[0]);
  233. let brush_node: logic_node_t = parser_logic_get_logic_node(node);
  234. if (brush_node != null) {
  235. image = logic_node_get_cached_image(brush_node);
  236. }
  237. }
  238. if (image != null) {
  239. if (map_get(render_path_render_targets, "texpaint_node") == null) {
  240. let t = render_target_create();
  241. t.name = "texpaint_node";
  242. t.width = config_get_texture_res_x();
  243. t.height = config_get_texture_res_y();
  244. t.format = "RGBA32";
  245. map_set(render_path_render_targets, t.name, t);
  246. }
  247. if (map_get(render_path_render_targets, "texpaint_node_target") == null) {
  248. let t = render_target_create();
  249. t.name = "texpaint_node_target";
  250. t.width = config_get_texture_res_x();
  251. t.height = config_get_texture_res_y();
  252. t.format = "RGBA32";
  253. map_set(render_path_render_targets, t.name, t);
  254. }
  255. map_get(render_path_render_targets, "texpaint_node")._image = image;
  256. render_path_bind_target("texpaint_node", "texpaint");
  257. render_path_bind_target("texpaint_nor_empty", "texpaint_nor");
  258. render_path_bind_target("texpaint_pack_empty", "texpaint_pack");
  259. let nodes = ui_nodes_get_nodes();
  260. let canvas = ui_nodes_get_canvas(true);
  261. let node = zui_get_node(canvas.nodes, nodes.nodes_selected_id[0]);
  262. let inpaint = node.type == "InpaintNode";
  263. if (inpaint) {
  264. map_get(render_path_render_targets, "texpaint_node_target")._image = inpaint_node_get_target();
  265. }
  266. }
  267. else {
  268. render_path_bind_target("texpaint", "texpaint");
  269. render_path_bind_target("texpaint_nor", "texpaint_nor");
  270. render_path_bind_target("texpaint_pack", "texpaint_pack");
  271. }
  272. }
  273. function render_path_paint_unbind_layers() {
  274. }