2023-02-08 14:51:54 +01:00
|
|
|
|
|
|
|
|
let plugin = new arm.Plugin();
|
|
|
|
|
let h1 = new zui.Handle();
|
|
|
|
|
let h2 = new zui.Handle();
|
|
|
|
|
|
|
|
|
|
let slots = ["base", "occ", "rough", "nor"];
|
|
|
|
|
let breakdown = null;
|
|
|
|
|
|
|
|
|
|
plugin.drawUI = function(ui) {
|
2024-02-05 20:57:20 +01:00
|
|
|
if (Zui.panel(h1, "Texture Breakdown")) {
|
2023-02-08 14:51:54 +01:00
|
|
|
|
|
|
|
|
ui.g.end();
|
|
|
|
|
drawBreakdown();
|
|
|
|
|
ui.g.begin(false);
|
|
|
|
|
|
2024-02-05 20:57:20 +01:00
|
|
|
// Zui.row([1 / 4]);
|
|
|
|
|
// Zui.combo(h2, ["Material", "Viewport"], "Type");
|
2023-02-08 14:51:54 +01:00
|
|
|
|
2024-02-05 20:57:20 +01:00
|
|
|
Zui.image(breakdown);
|
2023-02-08 14:51:54 +01:00
|
|
|
if (ui.isHovered && ui.inputReleasedR) {
|
|
|
|
|
let x = ui.inputX - ui._windowX;
|
|
|
|
|
let w = ui._windowW / slots.length;
|
|
|
|
|
let i = (x / w) | 0;
|
|
|
|
|
arm.UIMenu.draw(function(ui) {
|
2024-02-05 20:57:20 +01:00
|
|
|
Zui.text(slots[i], 2, ui.t.HIGHLIGHT_COL);
|
|
|
|
|
if (Zui.button("Delete", 0)) {
|
2023-02-08 14:51:54 +01:00
|
|
|
slots.splice(i, 1);
|
|
|
|
|
}
|
|
|
|
|
}, 2);
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-05 20:57:20 +01:00
|
|
|
Zui.row([1 / 4, 1 / 4]);
|
2023-02-08 14:51:54 +01:00
|
|
|
|
2024-02-05 20:57:20 +01:00
|
|
|
if (Zui.button("Add")) {
|
2023-02-08 14:51:54 +01:00
|
|
|
arm.UIMenu.draw(function(ui) {
|
2024-02-05 20:57:20 +01:00
|
|
|
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"); }
|
2023-02-08 14:51:54 +01:00
|
|
|
}, 6);
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-05 20:57:20 +01:00
|
|
|
if (Zui.button("Export")) {
|
2023-02-08 14:51:54 +01:00
|
|
|
arm.UIFiles.show("png", true, false, function(path) {
|
2023-12-12 14:57:44 +01:00
|
|
|
Base.notifyOnNextFrame(function() {
|
2023-02-08 14:51:54 +01:00
|
|
|
var f = arm.UIFiles.filename;
|
|
|
|
|
if (f === "") f = "untitled";
|
|
|
|
|
if (!f.endsWith(".png")) f += ".png";
|
2023-12-12 14:57:44 +01:00
|
|
|
Krom.writePng(path + arm.Path.sep + f, breakdown.getPixels(), breakdown.get_width(), breakdown.get_height(), 2);
|
2023-02-08 14:51:54 +01:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function drawBreakdown(type) {
|
|
|
|
|
if (breakdown === null) {
|
|
|
|
|
breakdown = core.Image.createRenderTarget(4096, 4096);
|
|
|
|
|
}
|
|
|
|
|
let g2 = breakdown.get_g2();
|
|
|
|
|
g2.begin(true, 0xff000000);
|
|
|
|
|
g2.disableScissor();
|
|
|
|
|
|
|
|
|
|
if (h2.position === 0) { // Material
|
|
|
|
|
var lay = arm.BrushOutputNode.inst;
|
|
|
|
|
for (let i = 0; i < slots.length; ++i) {
|
|
|
|
|
g2.set_pipeline(arm.UIView2D.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;
|
|
|
|
|
}
|
|
|
|
|
breakdown.get_g4().setInt(arm.UIView2D.channelLocation, channel);
|
|
|
|
|
var step_source = image.get_width() / slots.length;
|
|
|
|
|
var step_dest = breakdown.get_width() / slots.length;
|
|
|
|
|
g2.drawScaledSubImage(image, step_source * i, 0, step_source, image.get_height(), step_dest * i, 0, step_dest, breakdown.get_height());
|
2023-05-18 10:22:46 +02:00
|
|
|
g2.end(); // Flush
|
|
|
|
|
g2.begin(false);
|
2023-02-08 14:51:54 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else { // Viewport
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g2.end();
|
|
|
|
|
}
|