layers_ext.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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 is_forge
  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. ///else
  56. _gpu_begin(layers_expa);
  57. gpu_set_pipeline(pipes_merge);
  58. gpu_set_texture(pipes_tex0, l1.texpaint);
  59. gpu_set_texture(pipes_tex1, empty);
  60. gpu_set_texture(pipes_texmask, mask);
  61. gpu_set_texture(pipes_texa, layers_temp_image);
  62. gpu_set_float(pipes_opac, slot_layer_get_opacity(l1));
  63. gpu_set_float(pipes_tex1w, empty.width);
  64. gpu_set_int(pipes_blending, layers.length > 1 ? l1.blending : 0);
  65. gpu_set_vertex_buffer(const_data_screen_aligned_vb);
  66. gpu_set_index_buffer(const_data_screen_aligned_ib);
  67. gpu_draw();
  68. gpu_end();
  69. ///end
  70. }
  71. if (l1.paint_nor) {
  72. draw_begin(layers_temp_image);
  73. draw_set_pipeline(pipes_copy);
  74. draw_image(layers_expb, 0, 0);
  75. draw_set_pipeline(null);
  76. draw_end();
  77. _gpu_begin(layers_expb);
  78. gpu_set_pipeline(pipes_merge);
  79. gpu_set_texture(pipes_tex0, l1.texpaint);
  80. gpu_set_texture(pipes_tex1, l1.texpaint_nor);
  81. gpu_set_texture(pipes_texmask, mask);
  82. gpu_set_texture(pipes_texa, layers_temp_image);
  83. gpu_set_float(pipes_opac, slot_layer_get_opacity(l1));
  84. gpu_set_float(pipes_tex1w, l1.texpaint_nor.width);
  85. gpu_set_int(pipes_blending, l1.paint_nor_blend ? 102 : 101);
  86. gpu_set_vertex_buffer(const_data_screen_aligned_vb);
  87. gpu_set_index_buffer(const_data_screen_aligned_ib);
  88. gpu_draw();
  89. gpu_end();
  90. }
  91. if (l1.paint_occ || l1.paint_rough || l1.paint_met || l1.paint_height) {
  92. draw_begin(layers_temp_image);
  93. draw_set_pipeline(pipes_copy);
  94. draw_image(layers_expc, 0, 0);
  95. draw_set_pipeline(null);
  96. draw_end();
  97. if (l1.paint_occ && l1.paint_rough && l1.paint_met && l1.paint_height) {
  98. 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);
  99. }
  100. else {
  101. if (l1.paint_occ) {
  102. layers_commands_merge_pack(pipes_merge_r, layers_expc, l1.texpaint, l1.texpaint_pack, slot_layer_get_opacity(l1), mask);
  103. }
  104. if (l1.paint_rough) {
  105. layers_commands_merge_pack(pipes_merge_g, layers_expc, l1.texpaint, l1.texpaint_pack, slot_layer_get_opacity(l1), mask);
  106. }
  107. if (l1.paint_met) {
  108. layers_commands_merge_pack(pipes_merge_b, layers_expc, l1.texpaint, l1.texpaint_pack, slot_layer_get_opacity(l1), mask);
  109. }
  110. }
  111. }
  112. }
  113. let l0: slot_layer_t = {
  114. texpaint: layers_expa,
  115. texpaint_nor: layers_expb,
  116. texpaint_pack: layers_expc
  117. };
  118. // Merge height map into normal map
  119. if (height_to_normal && make_material_height_used) {
  120. draw_begin(layers_temp_image);
  121. draw_set_pipeline(pipes_copy);
  122. draw_image(l0.texpaint_nor, 0, 0);
  123. draw_set_pipeline(null);
  124. draw_end();
  125. _gpu_begin(l0.texpaint_nor);
  126. gpu_set_pipeline(pipes_merge);
  127. gpu_set_texture(pipes_tex0, layers_temp_image);
  128. gpu_set_texture(pipes_tex1, l0.texpaint_pack);
  129. gpu_set_texture(pipes_texmask, empty);
  130. gpu_set_texture(pipes_texa, empty);
  131. gpu_set_float(pipes_opac, 1.0);
  132. gpu_set_float(pipes_tex1w, l0.texpaint_pack.width);
  133. gpu_set_int(pipes_blending, 104);
  134. gpu_set_vertex_buffer(const_data_screen_aligned_vb);
  135. gpu_set_index_buffer(const_data_screen_aligned_ib);
  136. gpu_draw();
  137. gpu_end();
  138. }
  139. return l0;
  140. }
  141. function layers_ext_on_resized() {
  142. sys_notify_on_init(function () {
  143. layers_resize();
  144. let _layer: slot_layer_t = context_raw.layer;
  145. let _material: slot_material_t = context_raw.material;
  146. for (let i: i32 = 0; i < project_layers.length; ++i) {
  147. let l: slot_layer_t = project_layers[i];
  148. if (l.fill_layer != null) {
  149. context_raw.layer = l;
  150. context_raw.material = l.fill_layer;
  151. layers_update_fill_layer();
  152. }
  153. }
  154. context_raw.layer = _layer;
  155. context_raw.material = _material;
  156. make_material_parse_paint_material();
  157. });
  158. util_uv_uvmap = null;
  159. util_uv_uvmap_cached = false;
  160. util_uv_trianglemap = null;
  161. util_uv_trianglemap_cached = false;
  162. util_uv_dilatemap_cached = false;
  163. render_path_raytrace_ready = false;
  164. }