Files
armorpaint/armorforge/Sources/TabObjects.ts
T
luboslenco 705045dfd4 Format
2024-03-07 20:37:30 +01:00

254 lines
7.9 KiB
TypeScript

class TabObjects {
static materialId = 0;
static roundfp = (f: f32, precision = 2): f32 => {
f *= Math.pow(10, precision);
return Math.round(f) / Math.pow(10, precision);
}
static draw = (htab: zui_handle_t) => {
let ui = UIBase.ui;
if (zui_tab(htab, tr("Objects"))) {
zui_begin_sticky();
zui_row([1 / 4]);
if (zui_button("Import")) {
Project.import_mesh(false, () => {
object_set_parent(Project.paint_objects.pop().base, null);
});
}
zui_end_sticky();
if (zui_panel(zui_handle("tabobjects_0", {selected: true}), "Outliner")) {
// ui.indent();
ui._y -= zui_ELEMENT_OFFSET(ui);
let listX = ui._x;
let listW = ui._w;
let lineCounter = 0;
let drawList = (listHandle: zui_handle_t, currentObject: object_t) => {
if (currentObject.name.charAt(0) == ".") return; // Hidden
let b = false;
// Highlight every other line
if (lineCounter % 2 == 0) {
g2_set_color(ui.t.SEPARATOR_COL);
g2_fill_rect(0, ui._y, ui._window_w, zui_ELEMENT_H(ui));
g2_set_color(0xffffffff);
}
// Highlight selected line
if (currentObject == Context.raw.selected_object) {
g2_set_color(0xff205d9c);
g2_fill_rect(0, ui._y, ui._window_w, zui_ELEMENT_H(ui));
g2_set_color(0xffffffff);
}
if (currentObject.children.length > 0) {
zui_row([1 / 13, 12 / 13]);
b = zui_panel(zui_nest(listHandle, lineCounter, {selected: true}), "", true, false, false);
zui_text(currentObject.name);
}
else {
ui._x += 18; // Sign offset
// Draw line that shows parent relations
g2_set_color(ui.t.ACCENT_COL);
g2_draw_line(ui._x - 10, ui._y + zui_ELEMENT_H(ui) / 2, ui._x, ui._y + zui_ELEMENT_H(ui) / 2);
g2_set_color(0xffffffff);
zui_text(currentObject.name);
ui._x -= 18;
}
lineCounter++;
// Undo applied offset for row drawing caused by endElement() in Zui.hx
ui._y -= zui_ELEMENT_OFFSET(ui);
if (ui.is_released) {
Context.raw.selected_object = currentObject;
}
if (ui.is_hovered && ui.input_released_r) {
UIMenu.draw((ui: zui_t) => {
if (UIMenu.menu_button(ui, "Assign Material")) {
TabObjects.materialId++;
for (let sh of _scene_raw.shader_datas) {
if (sh.name == "Material_data") {
let s: shader_data_t = JSON.parse(JSON.stringify(sh));
s.name = "TempMaterial_data" + TabObjects.materialId;
_scene_raw.shader_datas.push(s);
break;
}
}
for (let mat of _scene_raw.material_datas) {
if (mat.name == "Material") {
let m: material_data_t = JSON.parse(JSON.stringify(mat));
m.name = "TempMaterial" + TabObjects.materialId;
m.shader = "TempMaterial_data" + TabObjects.materialId;
_scene_raw.material_datas.push(m);
break;
}
}
let md: material_data_t = data_get_material("Scene", "TempMaterial" + TabObjects.materialId);
let mo: mesh_object_t = currentObject.ext;
mo.materials = [md];
MakeMaterial.parse_mesh_preview_material(md);
}
}, 1);
}
if (b) {
let currentY = ui._y;
for (let child of currentObject.children) {
// ui.indent();
drawList(listHandle, child);
// ui.unindent();
}
// Draw line that shows parent relations
g2_set_color(ui.t.ACCENT_COL);
g2_draw_line(ui._x + 14, currentY, ui._x + 14, ui._y - zui_ELEMENT_H(ui) / 2);
g2_set_color(0xffffffff);
}
}
for (let c of _scene_root.children) {
drawList(zui_handle("tabobjects_1"), c);
}
// ui.unindent();
}
if (zui_panel(zui_handle("tabobjects_2", {selected: true}), 'Properties')) {
// ui.indent();
if (Context.raw.selected_object != null) {
let h = zui_handle("tabobjects_3");
h.selected = Context.raw.selected_object.visible;
Context.raw.selected_object.visible = zui_check(h, "Visible");
let t = Context.raw.selected_object.transform;
let localPos = t.loc;
let worldPos = vec4_create(transform_world_x(t), transform_world_y(t), transform_world_z(t), 1.0);
let scale = t.scale;
let rot = quat_get_euler(t.rot);
let dim = t.dim;
vec4_mult(rot, 180 / 3.141592);
let f = 0.0;
zui_row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
zui_text("Loc");
h = zui_handle("tabobjects_4");
h.text = TabObjects.roundfp(localPos.x) + "";
f = parseFloat(zui_text_input(h, "X"));
if (h.changed) localPos.x = f;
h = zui_handle("tabobjects_5");
h.text = TabObjects.roundfp(localPos.y) + "";
f = parseFloat(zui_text_input(h, "Y"));
if (h.changed) localPos.y = f;
h = zui_handle("tabobjects_6");
h.text = TabObjects.roundfp(localPos.z) + "";
f = parseFloat(zui_text_input(h, "Z"));
if (h.changed) localPos.z = f;
zui_row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
zui_text("Rotation");
h = zui_handle("tabobjects_7");
h.text = TabObjects.roundfp(rot.x) + "";
f = parseFloat(zui_text_input(h, "X"));
let changed = false;
if (h.changed) { changed = true; rot.x = f; }
h = zui_handle("tabobjects_8");
h.text = TabObjects.roundfp(rot.y) + "";
f = parseFloat(zui_text_input(h, "Y"));
if (h.changed) { changed = true; rot.y = f; }
h = zui_handle("tabobjects_9");
h.text = TabObjects.roundfp(rot.z) + "";
f = parseFloat(zui_text_input(h, "Z"));
if (h.changed) { changed = true; rot.z = f; }
if (changed && Context.raw.selected_object.name != "Scene") {
vec4_mult(rot, 3.141592 / 180);
quat_from_euler(Context.raw.selected_object.transform.rot, rot.x, rot.y, rot.z);
transform_build_matrix(Context.raw.selected_object.transform);
// ///if arm_physics
// if (rb != null) rb.syncTransform();
// ///end
}
zui_row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
zui_text("Scale");
h = zui_handle("tabobjects_10");
h.text = TabObjects.roundfp(scale.x) + "";
f = parseFloat(zui_text_input(h, "X"));
if (h.changed) scale.x = f;
h = zui_handle("tabobjects_11");
h.text = TabObjects.roundfp(scale.y) + "";
f = parseFloat(zui_text_input(h, "Y"));
if (h.changed) scale.y = f;
h = zui_handle("tabobjects_12");
h.text = TabObjects.roundfp(scale.z) + "";
f = parseFloat(zui_text_input(h, "Z"));
if (h.changed) scale.z = f;
zui_row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
zui_text("Dimensions");
h = zui_handle("tabobjects_13");
h.text = TabObjects.roundfp(dim.x) + "";
f = parseFloat(zui_text_input(h, "X"));
if (h.changed) dim.x = f;
h = zui_handle("tabobjects_14");
h.text = TabObjects.roundfp(dim.y) + "";
f = parseFloat(zui_text_input(h, "Y"));
if (h.changed) dim.y = f;
h = zui_handle("tabobjects_15");
h.text = TabObjects.roundfp(dim.z) + "";
f = parseFloat(zui_text_input(h, "Z"));
if (h.changed) dim.z = f;
Context.raw.selected_object.transform.dirty = true;
if (Context.raw.selected_object.name == "Scene") {
let p = scene_world;
p.strength = zui_slider(zui_handle("tabobjects_16", {value: p.strength}), "Environment", 0.0, 5.0, true);
}
else if (Context.raw.selected_object.ext_type == "light_object_t") {
let light = Context.raw.selected_object.ext;
let lightHandle = zui_handle("tabobjects_17");
lightHandle.value = light.data.strength / 10;
light.data.strength = zui_slider(lightHandle, "Strength", 0.0, 5.0, true) * 10;
}
else if (Context.raw.selected_object.ext_type == "camera_object_t") {
let cam = Context.raw.selected_object.ext;
let fovHandle = zui_handle("tabobjects_18");
fovHandle.value = Math.floor(cam.data.fov * 100) / 100;
cam.data.fov = zui_slider(fovHandle, "FoV", 0.3, 2.0, true);
if (fovHandle.changed) {
camera_object_build_proj(cam);
}
}
}
// ui.unindent();
}
}
}
}