115 lines
2.6 KiB
JavaScript
115 lines
2.6 KiB
JavaScript
|
|
let plugin = plugin_create();
|
|
let h1 = zui_handle_create();
|
|
let h2 = zui_handle_create();
|
|
|
|
let slots = ["base", "occ", "rough", "nor"];
|
|
let breakdown = null;
|
|
|
|
plugin.draw_ui = function(ui) {
|
|
if (zui_panel(h1, "Texture Breakdown")) {
|
|
|
|
g2_end();
|
|
draw_breakdown();
|
|
g2_begin(ui);
|
|
|
|
// zui_row([1 / 4]);
|
|
// zui_combo(h2, ["Material", "Viewport"], "Type");
|
|
|
|
zui_image(breakdown);
|
|
if (ui.is_hovered && ui.input_released_r) {
|
|
let x = ui.input_x - ui._window_x;
|
|
let w = ui._window_w / slots.length;
|
|
let i = (x / w) | 0;
|
|
ui_menu_draw(function(ui) {
|
|
zui_text(slots[i], 2, ui.t.HIGHLIGHT_COL);
|
|
if (zui_button("Delete", 0)) {
|
|
slots.splice(i, 1);
|
|
}
|
|
}, 2);
|
|
}
|
|
|
|
zui_row([1 / 4, 1 / 4]);
|
|
|
|
if (zui_button("Add")) {
|
|
ui_menu_draw(function(ui) {
|
|
zui_text("Channel", 2, ui.t.HIGHLIGHT_COL);
|
|
if (zui_button("Base Color", 0)) {
|
|
slots.push("base");
|
|
}
|
|
if (zui_button("Occlusion", 0)) {
|
|
slots.push("occ");
|
|
}
|
|
if (zui_button("Roughness", 0)) {
|
|
slots.push("rough");
|
|
}
|
|
if (zui_button("Metallic", 0)) {
|
|
slots.push("metal");
|
|
}
|
|
if (zui_button("Normal Map", 0)) {
|
|
slots.push("nor");
|
|
}
|
|
}, 6);
|
|
}
|
|
|
|
if (zui_button("Export")) {
|
|
ui_files_show("png", true, false, function(path) {
|
|
base_notify_on_next_frame(function() {
|
|
var f = ui_files_filename;
|
|
if (f === "") {
|
|
f = "untitled";
|
|
}
|
|
if (!f.endsWith(".png")) {
|
|
f += ".png";
|
|
}
|
|
krom_write_png(path + path_sep + f, image_get_pixels(breakdown), breakdown.width, breakdown.height, 2);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
function draw_breakdown(type) {
|
|
if (breakdown === null) {
|
|
breakdown = image_create_render_target(4096, 4096);
|
|
}
|
|
g2_begin(breakdown);
|
|
g2_clear(0xff000000);
|
|
g2_disable_scissor();
|
|
|
|
if (h2.position === 0) { // Material
|
|
var lay = brush_output_node_inst;
|
|
for (let i = 0; i < slots.length; ++i) {
|
|
g2_set_pipeline(ui_view2d_pipe);
|
|
let image = lay.texpaint;
|
|
let channel = 0;
|
|
if (slots[i] === "occ") {
|
|
image = lay.texpaint_pack;
|
|
channel = 1;
|
|
}
|
|
else if (slots[i] === "rough") {
|
|
image = lay.texpaint_pack;
|
|
channel = 2;
|
|
}
|
|
else if (slots[i] === "metal") {
|
|
image = lay.texpaint_pack;
|
|
channel = 3;
|
|
}
|
|
else if (slots[i] === "nor") {
|
|
image = lay.texpaint_nor;
|
|
channel = 5;
|
|
}
|
|
g4_set_int(ui_view2d_channel_location, channel);
|
|
var step_source = image.width / slots.length;
|
|
var step_dest = breakdown.width / slots.length;
|
|
g2_draw_scaled_sub_image(image, step_source * i, 0, step_source, image.height, step_dest * i, 0, step_dest, breakdown.height);
|
|
g2_end(); // Flush
|
|
g2_begin();
|
|
}
|
|
}
|
|
else { // Viewport
|
|
}
|
|
|
|
g2_end();
|
|
}
|