Files
armorpaint/armorforge/Sources/TabObjects.ts
T

255 lines
7.7 KiB
TypeScript
Raw Normal View History

2023-05-12 09:55:43 +02:00
class TabObjects {
2024-01-17 18:53:31 +01:00
static materialId = 0;
2023-05-12 09:55:43 +02:00
2024-01-17 18:53:31 +01:00
static roundfp = (f: f32, precision = 2): f32 => {
f *= Math.pow(10, precision);
return Math.round(f) / Math.pow(10, precision);
2023-05-12 09:55:43 +02:00
}
2024-01-17 18:53:31 +01:00
static draw = (htab: Handle) => {
2024-01-21 15:18:44 +01:00
let ui = UIBase.ui;
2023-05-12 09:55:43 +02:00
if (ui.tab(htab, tr("Objects"))) {
ui.beginSticky();
ui.row([1 / 4]);
if (ui.button("Import")) {
2024-01-17 18:53:31 +01:00
Project.importMesh(false, () => {
2023-05-12 09:55:43 +02:00
Project.paintObjects.pop().setParent(null);
});
}
ui.endSticky();
2023-11-29 18:08:53 +01:00
if (ui.panel(Zui.handle("tabobjects_0", {selected: true}), "Outliner")) {
2023-11-30 13:55:29 +01:00
// ui.indent();
2023-05-12 09:55:43 +02:00
ui._y -= ui.ELEMENT_OFFSET();
2024-01-17 18:53:31 +01:00
let listX = ui._x;
let listW = ui._w;
2023-05-12 09:55:43 +02:00
2024-01-17 18:53:31 +01:00
let lineCounter = 0;
2024-01-26 22:09:49 +01:00
let drawList = (listHandle: Handle, currentObject: BaseObject) => {
2023-05-12 09:55:43 +02:00
if (currentObject.name.charAt(0) == ".") return; // Hidden
2024-01-17 18:53:31 +01:00
let b = false;
2023-05-12 09:55:43 +02:00
// Highlight every other line
if (lineCounter % 2 == 0) {
ui.g.color = ui.t.SEPARATOR_COL;
ui.g.fillRect(0, ui._y, ui._windowW, ui.ELEMENT_H());
ui.g.color = 0xffffffff;
}
// Highlight selected line
if (currentObject == Context.raw.selectedObject) {
ui.g.color = 0xff205d9c;
ui.g.fillRect(0, ui._y, ui._windowW, ui.ELEMENT_H());
ui.g.color = 0xffffffff;
}
if (currentObject.children.length > 0) {
ui.row([1 / 13, 12 / 13]);
b = ui.panel(listHandle.nest(lineCounter, {selected: true}), "", true, false, false);
ui.text(currentObject.name);
}
else {
ui._x += 18; // Sign offset
// Draw line that shows parent relations
ui.g.color = ui.t.ACCENT_COL;
ui.g.drawLine(ui._x - 10, ui._y + ui.ELEMENT_H() / 2, ui._x, ui._y + ui.ELEMENT_H() / 2);
ui.g.color = 0xffffffff;
ui.text(currentObject.name);
ui._x -= 18;
}
lineCounter++;
// Undo applied offset for row drawing caused by endElement() in Zui.hx
ui._y -= ui.ELEMENT_OFFSET();
if (ui.isReleased) {
Context.raw.selectedObject = currentObject;
}
if (ui.isHovered && ui.inputReleasedR) {
2024-01-17 18:53:31 +01:00
UIMenu.draw((ui: Zui) => {
2023-05-18 22:53:58 +02:00
if (UIMenu.menuButton(ui, "Assign Material")) {
2024-01-26 22:09:49 +01:00
TabObjects.materialId++;
2023-05-12 09:55:43 +02:00
2024-01-17 18:53:31 +01:00
for (let sh of Scene.active.raw.shader_datas) {
2023-05-12 09:55:43 +02:00
if (sh.name == "Material_data") {
2024-01-17 18:53:31 +01:00
let s: TShaderData = JSON.parse(JSON.stringify(sh));
2024-01-26 22:09:49 +01:00
s.name = "TempMaterial_data" + TabObjects.materialId;
2023-12-12 14:57:44 +01:00
Scene.active.raw.shader_datas.push(s);
2023-05-12 09:55:43 +02:00
break;
}
}
2024-01-17 18:53:31 +01:00
for (let mat of Scene.active.raw.material_datas) {
2023-05-12 09:55:43 +02:00
if (mat.name == "Material") {
2024-01-17 18:53:31 +01:00
let m: TMaterialData = JSON.parse(JSON.stringify(mat));
2024-01-26 22:09:49 +01:00
m.name = "TempMaterial" + TabObjects.materialId;
m.shader = "TempMaterial_data" + TabObjects.materialId;
2023-12-12 14:57:44 +01:00
Scene.active.raw.material_datas.push(m);
2023-05-12 09:55:43 +02:00
break;
}
}
2024-01-26 22:09:49 +01:00
Data.getMaterial("Scene", "TempMaterial" + TabObjects.materialId, (md: MaterialData) => {
let mo: MeshObject = currentObject as MeshObject;
2023-12-12 14:57:44 +01:00
mo.materials = [md];
2023-12-13 15:52:41 +01:00
MakeMaterial.parseMeshPreviewMaterial(md);
2023-05-12 09:55:43 +02:00
});
}
2023-05-18 22:53:58 +02:00
}, 1);
2023-05-12 09:55:43 +02:00
}
if (b) {
2024-01-17 18:53:31 +01:00
let currentY = ui._y;
for (let child of currentObject.children) {
2023-11-30 13:55:29 +01:00
// ui.indent();
2023-05-12 09:55:43 +02:00
drawList(listHandle, child);
2023-11-30 13:55:29 +01:00
// ui.unindent();
2023-05-12 09:55:43 +02:00
}
// Draw line that shows parent relations
ui.g.color = ui.t.ACCENT_COL;
ui.g.drawLine(ui._x + 14, currentY, ui._x + 14, ui._y - ui.ELEMENT_H() / 2);
ui.g.color = 0xffffffff;
}
}
2024-01-17 18:53:31 +01:00
for (let c of Scene.active.root.children) {
2023-11-29 18:08:53 +01:00
drawList(Zui.handle("tabobjects_1"), c);
2023-05-12 09:55:43 +02:00
}
2023-11-30 13:55:29 +01:00
// ui.unindent();
2023-05-12 09:55:43 +02:00
}
2023-11-29 18:08:53 +01:00
if (ui.panel(Zui.handle("tabobjects_2", {selected: true}), 'Properties')) {
2023-11-30 13:55:29 +01:00
// ui.indent();
2023-05-12 09:55:43 +02:00
if (Context.raw.selectedObject != null) {
2024-01-17 18:53:31 +01:00
let h = Zui.handle("tabobjects_3");
2023-05-12 09:55:43 +02:00
h.selected = Context.raw.selectedObject.visible;
Context.raw.selectedObject.visible = ui.check(h, "Visible");
2024-01-17 18:53:31 +01:00
let t = Context.raw.selectedObject.transform;
let localPos = t.loc;
let worldPos = new Vec4(t.worldx(), t.worldy(), t.worldz(), 1.0);
let scale = t.scale;
let rot = t.rot.getEuler();
let dim = t.dim;
2023-05-12 09:55:43 +02:00
rot.mult(180 / 3.141592);
2024-01-17 18:53:31 +01:00
let f = 0.0;
2023-05-12 09:55:43 +02:00
ui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
ui.text("Loc");
2023-11-29 18:08:53 +01:00
h = Zui.handle("tabobjects_4");
2024-01-26 22:09:49 +01:00
h.text = TabObjects.roundfp(localPos.x) + "";
2024-01-17 18:53:31 +01:00
f = parseFloat(ui.textInput(h, "X"));
2023-05-12 09:55:43 +02:00
if (h.changed) localPos.x = f;
2023-11-29 18:08:53 +01:00
h = Zui.handle("tabobjects_5");
2024-01-26 22:09:49 +01:00
h.text = TabObjects.roundfp(localPos.y) + "";
2024-01-17 18:53:31 +01:00
f = parseFloat(ui.textInput(h, "Y"));
2023-05-12 09:55:43 +02:00
if (h.changed) localPos.y = f;
2023-11-29 18:08:53 +01:00
h = Zui.handle("tabobjects_6");
2024-01-26 22:09:49 +01:00
h.text = TabObjects.roundfp(localPos.z) + "";
2024-01-17 18:53:31 +01:00
f = parseFloat(ui.textInput(h, "Z"));
2023-05-12 09:55:43 +02:00
if (h.changed) localPos.z = f;
ui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
ui.text("Rotation");
2023-11-29 18:08:53 +01:00
h = Zui.handle("tabobjects_7");
2024-01-26 22:09:49 +01:00
h.text = TabObjects.roundfp(rot.x) + "";
2024-01-17 18:53:31 +01:00
f = parseFloat(ui.textInput(h, "X"));
let changed = false;
2023-05-12 09:55:43 +02:00
if (h.changed) { changed = true; rot.x = f; }
2023-11-29 18:08:53 +01:00
h = Zui.handle("tabobjects_8");
2024-01-26 22:09:49 +01:00
h.text = TabObjects.roundfp(rot.y) + "";
2024-01-17 18:53:31 +01:00
f = parseFloat(ui.textInput(h, "Y"));
2023-05-12 09:55:43 +02:00
if (h.changed) { changed = true; rot.y = f; }
2023-11-29 18:08:53 +01:00
h = Zui.handle("tabobjects_9");
2024-01-26 22:09:49 +01:00
h.text = TabObjects.roundfp(rot.z) + "";
2024-01-17 18:53:31 +01:00
f = parseFloat(ui.textInput(h, "Z"));
2023-05-12 09:55:43 +02:00
if (h.changed) { changed = true; rot.z = f; }
if (changed && Context.raw.selectedObject.name != "Scene") {
rot.mult(3.141592 / 180);
Context.raw.selectedObject.transform.rot.fromEuler(rot.x, rot.y, rot.z);
Context.raw.selectedObject.transform.buildMatrix();
2024-01-17 18:53:31 +01:00
// ///if arm_physics
2023-05-12 09:55:43 +02:00
// if (rb != null) rb.syncTransform();
2024-01-17 18:53:31 +01:00
// ///end
2023-05-12 09:55:43 +02:00
}
ui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
ui.text("Scale");
2023-11-29 18:08:53 +01:00
h = Zui.handle("tabobjects_10");
2024-01-26 22:09:49 +01:00
h.text = TabObjects.roundfp(scale.x) + "";
2024-01-17 18:53:31 +01:00
f = parseFloat(ui.textInput(h, "X"));
2023-05-12 09:55:43 +02:00
if (h.changed) scale.x = f;
2023-11-29 18:08:53 +01:00
h = Zui.handle("tabobjects_11");
2024-01-26 22:09:49 +01:00
h.text = TabObjects.roundfp(scale.y) + "";
2024-01-17 18:53:31 +01:00
f = parseFloat(ui.textInput(h, "Y"));
2023-05-12 09:55:43 +02:00
if (h.changed) scale.y = f;
2023-11-29 18:08:53 +01:00
h = Zui.handle("tabobjects_12");
2024-01-26 22:09:49 +01:00
h.text = TabObjects.roundfp(scale.z) + "";
2024-01-17 18:53:31 +01:00
f = parseFloat(ui.textInput(h, "Z"));
2023-05-12 09:55:43 +02:00
if (h.changed) scale.z = f;
ui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
ui.text("Dimensions");
2023-11-29 18:08:53 +01:00
h = Zui.handle("tabobjects_13");
2024-01-26 22:09:49 +01:00
h.text = TabObjects.roundfp(dim.x) + "";
2024-01-17 18:53:31 +01:00
f = parseFloat(ui.textInput(h, "X"));
2023-05-12 09:55:43 +02:00
if (h.changed) dim.x = f;
2023-11-29 18:08:53 +01:00
h = Zui.handle("tabobjects_14");
2024-01-26 22:09:49 +01:00
h.text = TabObjects.roundfp(dim.y) + "";
2024-01-17 18:53:31 +01:00
f = parseFloat(ui.textInput(h, "Y"));
2023-05-12 09:55:43 +02:00
if (h.changed) dim.y = f;
2023-11-29 18:08:53 +01:00
h = Zui.handle("tabobjects_15");
2024-01-26 22:09:49 +01:00
h.text = TabObjects.roundfp(dim.z) + "";
2024-01-17 18:53:31 +01:00
f = parseFloat(ui.textInput(h, "Z"));
2023-05-12 09:55:43 +02:00
if (h.changed) dim.z = f;
Context.raw.selectedObject.transform.dirty = true;
if (Context.raw.selectedObject.name == "Scene") {
2024-01-29 09:49:10 +01:00
let p = Scene.active.world;
2023-11-29 18:08:53 +01:00
p.raw.strength = ui.slider(Zui.handle("tabobjects_16", {value: p.raw.strength}), "Environment", 0.0, 5.0, true);
2023-05-12 09:55:43 +02:00
}
2024-01-17 18:53:31 +01:00
else if (Context.raw.selectedObject.constructor == LightObject) {
2024-01-26 22:09:49 +01:00
let light = (Context.raw.selectedObject as LightObject);
2024-01-17 18:53:31 +01:00
let lightHandle = Zui.handle("tabobjects_17");
2024-01-29 09:49:10 +01:00
lightHandle.value = light.data.strength / 10;
light.data.strength = ui.slider(lightHandle, "Strength", 0.0, 5.0, true) * 10;
2023-05-12 09:55:43 +02:00
}
2024-01-17 18:53:31 +01:00
else if (Context.raw.selectedObject.constructor == CameraObject) {
2024-01-26 22:09:49 +01:00
let cam = (Context.raw.selectedObject as CameraObject);
2024-01-17 18:53:31 +01:00
let fovHandle = Zui.handle("tabobjects_18");
2024-01-29 09:49:10 +01:00
fovHandle.value = Math.floor(cam.data.fov * 100) / 100;
cam.data.fov = ui.slider(fovHandle, "FoV", 0.3, 2.0, true);
2023-05-12 09:55:43 +02:00
if (fovHandle.changed) {
cam.buildProjection();
}
}
}
2023-11-30 13:55:29 +01:00
// ui.unindent();
2023-05-12 09:55:43 +02:00
}
}
}
}