layers_ext.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. function layers_ext_flatten(height_to_normal: bool = false, layers: slot_layer_t[] = null): slot_layer_t {
  2. if (layers == null) {
  3. layers = project_layers;
  4. }
  5. layers_make_temp_img();
  6. layers_make_export_img();
  7. let empty_rt: render_target_t = map_get(render_path_render_targets, "empty_white");
  8. let empty: gpu_texture_t = empty_rt._image;
  9. // Clear export layer
  10. _gpu_begin(layers_expa, null, null, clear_flag_t.COLOR, color_from_floats(0.0, 0.0, 0.0, 0.0));
  11. gpu_end();
  12. _gpu_begin(layers_expb, null, null, clear_flag_t.COLOR, color_from_floats(0.5, 0.5, 1.0, 0.0));
  13. gpu_end();
  14. _gpu_begin(layers_expc, null, null, clear_flag_t.COLOR, color_from_floats(1.0, 0.0, 0.0, 0.0));
  15. gpu_end();
  16. // Flatten layers
  17. for (let i: i32 = 0; i < layers.length; ++i) {
  18. let l1: slot_layer_t = layers[i];
  19. if (!slot_layer_is_visible(l1)) {
  20. continue;
  21. }
  22. if (!slot_layer_is_layer(l1)) {
  23. continue;
  24. }
  25. let mask: gpu_texture_t = empty;
  26. let l1masks: slot_layer_t[] = slot_layer_get_masks(l1);
  27. if (l1masks != null) {
  28. if (l1masks.length > 1) {
  29. layers_make_temp_mask_img();
  30. draw_begin(pipes_temp_mask_image, clear_flag_t.COLOR, 0x00000000);
  31. draw_end();
  32. let l1: slot_layer_t = { texpaint: pipes_temp_mask_image };
  33. for (let i: i32 = 0; i < l1masks.length; ++i) {
  34. layers_merge_layer(l1, l1masks[i]);
  35. }
  36. mask = pipes_temp_mask_image;
  37. }
  38. else {
  39. mask = l1masks[0].texpaint;
  40. }
  41. }
  42. if (l1.paint_base) {
  43. draw_begin(layers_temp_image); // Copy to temp
  44. draw_set_pipeline(pipes_copy);
  45. draw_image(layers_expa, 0, 0);
  46. draw_set_pipeline(null);
  47. draw_end();
  48. if (context_raw.tool == tool_type_t.GIZMO) {
  49. // Do not multiply basecol by alpha
  50. draw_begin(layers_expa); // Copy to temp
  51. draw_set_pipeline(pipes_copy);
  52. draw_image(l1.texpaint, 0, 0);
  53. draw_set_pipeline(null);
  54. draw_end();
  55. }
  56. else {
  57. _gpu_begin(layers_expa);
  58. gpu_set_pipeline(pipes_merge);
  59. gpu_set_texture(pipes_tex0, l1.texpaint);
  60. gpu_set_texture(pipes_tex1, empty);
  61. gpu_set_texture(pipes_texmask, mask);
  62. gpu_set_texture(pipes_texa, layers_temp_image);
  63. gpu_set_float(pipes_opac, slot_layer_get_opacity(l1));
  64. gpu_set_float(pipes_tex1w, empty.width);
  65. gpu_set_int(pipes_blending, layers.length > 1 ? l1.blending : 0);
  66. gpu_set_vertex_buffer(const_data_screen_aligned_vb);
  67. gpu_set_index_buffer(const_data_screen_aligned_ib);
  68. gpu_draw();
  69. gpu_end();
  70. }
  71. }
  72. if (l1.paint_nor) {
  73. draw_begin(layers_temp_image);
  74. draw_set_pipeline(pipes_copy);
  75. draw_image(layers_expb, 0, 0);
  76. draw_set_pipeline(null);
  77. draw_end();
  78. _gpu_begin(layers_expb);
  79. gpu_set_pipeline(pipes_merge);
  80. gpu_set_texture(pipes_tex0, l1.texpaint);
  81. gpu_set_texture(pipes_tex1, l1.texpaint_nor);
  82. gpu_set_texture(pipes_texmask, mask);
  83. gpu_set_texture(pipes_texa, layers_temp_image);
  84. gpu_set_float(pipes_opac, slot_layer_get_opacity(l1));
  85. gpu_set_float(pipes_tex1w, l1.texpaint_nor.width);
  86. gpu_set_int(pipes_blending, l1.paint_nor_blend ? 102 : 101);
  87. gpu_set_vertex_buffer(const_data_screen_aligned_vb);
  88. gpu_set_index_buffer(const_data_screen_aligned_ib);
  89. gpu_draw();
  90. gpu_end();
  91. }
  92. if (l1.paint_occ || l1.paint_rough || l1.paint_met || l1.paint_height) {
  93. draw_begin(layers_temp_image);
  94. draw_set_pipeline(pipes_copy);
  95. draw_image(layers_expc, 0, 0);
  96. draw_set_pipeline(null);
  97. draw_end();
  98. if (l1.paint_occ && l1.paint_rough && l1.paint_met && l1.paint_height) {
  99. layers_commands_merge_pack(pipes_merge, layers_expc, l1.texpaint, l1.texpaint_pack, slot_layer_get_opacity(l1), mask, l1.paint_height_blend ? 103 : 101);
  100. }
  101. else {
  102. if (l1.paint_occ) {
  103. layers_commands_merge_pack(pipes_merge_r, layers_expc, l1.texpaint, l1.texpaint_pack, slot_layer_get_opacity(l1), mask);
  104. }
  105. if (l1.paint_rough) {
  106. layers_commands_merge_pack(pipes_merge_g, layers_expc, l1.texpaint, l1.texpaint_pack, slot_layer_get_opacity(l1), mask);
  107. }
  108. if (l1.paint_met) {
  109. layers_commands_merge_pack(pipes_merge_b, layers_expc, l1.texpaint, l1.texpaint_pack, slot_layer_get_opacity(l1), mask);
  110. }
  111. }
  112. }
  113. }
  114. let l0: slot_layer_t = {
  115. texpaint: layers_expa,
  116. texpaint_nor: layers_expb,
  117. texpaint_pack: layers_expc
  118. };
  119. // Merge height map into normal map
  120. if (height_to_normal && make_material_height_used) {
  121. draw_begin(layers_temp_image);
  122. draw_set_pipeline(pipes_copy);
  123. draw_image(l0.texpaint_nor, 0, 0);
  124. draw_set_pipeline(null);
  125. draw_end();
  126. _gpu_begin(l0.texpaint_nor);
  127. gpu_set_pipeline(pipes_merge);
  128. gpu_set_texture(pipes_tex0, layers_temp_image);
  129. gpu_set_texture(pipes_tex1, l0.texpaint_pack);
  130. gpu_set_texture(pipes_texmask, empty);
  131. gpu_set_texture(pipes_texa, empty);
  132. gpu_set_float(pipes_opac, 1.0);
  133. gpu_set_float(pipes_tex1w, l0.texpaint_pack.width);
  134. gpu_set_int(pipes_blending, 104);
  135. gpu_set_vertex_buffer(const_data_screen_aligned_vb);
  136. gpu_set_index_buffer(const_data_screen_aligned_ib);
  137. gpu_draw();
  138. gpu_end();
  139. }
  140. return l0;
  141. }
  142. function layers_ext_on_resized() {
  143. sys_notify_on_next_frame(function () {
  144. layers_resize();
  145. let _layer: slot_layer_t = context_raw.layer;
  146. let _material: slot_material_t = context_raw.material;
  147. for (let i: i32 = 0; i < project_layers.length; ++i) {
  148. let l: slot_layer_t = project_layers[i];
  149. if (l.fill_layer != null) {
  150. context_raw.layer = l;
  151. context_raw.material = l.fill_layer;
  152. layers_update_fill_layer();
  153. }
  154. }
  155. context_raw.layer = _layer;
  156. context_raw.material = _material;
  157. make_material_parse_paint_material();
  158. });
  159. util_uv_uvmap = null;
  160. util_uv_uvmap_cached = false;
  161. util_uv_trianglemap = null;
  162. util_uv_trianglemap_cached = false;
  163. util_uv_dilatemap_cached = false;
  164. render_path_raytrace_ready = false;
  165. }