UNPKG

mylingo3d

Version:

Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor

83 lines 3.3 kB
import { debounce } from "@lincode/utils"; import resetIcon from "./resetIcon"; import getDefaultValue from "../../interface/utils/getDefaultValue"; import toFixed from "../../api/serializer/toFixed"; let programmatic = false; let leading = true; export const setProgrammatic = debounce(() => { programmatic = leading; leading = !leading; }, 100, "both"); const isPoint = (v) => v && typeof v === "object" && "x" in v && "y" in v; const isTrue = (v) => v === true || v === "true"; const isFalse = (v) => v === false || v === "false"; const isEqual = (a, b) => { if (isPoint(a) && isPoint(b)) return a.x === b.x && a.y === b.y && a.z === b.z; if (isTrue(a) && isTrue(b)) return true; if (isFalse(a) && isFalse(b)) return true; return a === b; }; export default (pane, title, target, defaults, params = { ...target }) => { const folder = pane.addFolder({ title }); for (const [key, value] of Object.entries(params)) switch (typeof value) { case "undefined": params[key] = ""; break; case "number": params[key] = toFixed(key, value); break; case "object": if (Array.isArray(value)) { params[key] = JSON.stringify(value); break; } typeof value?.x === "number" && (value.x = toFixed("x", value.x)); typeof value?.y === "number" && (value.y = toFixed("y", value.y)); typeof value?.z === "number" && (value.z = toFixed("z", value.z)); break; } return Object.fromEntries(Object.keys(params).map((key) => { const input = folder.addInput(params, key); const resetButton = resetIcon.cloneNode(true); input.element.prepend(resetButton); resetButton.style.opacity = "0.1"; const defaultValue = getDefaultValue(defaults, key, true); const updateResetButton = debounce(() => { const unchanged = isEqual(params[key], defaultValue); resetButton.style.opacity = unchanged ? "0.1" : "0.5"; resetButton.style.cursor = unchanged ? "auto" : "pointer"; }, 100, "trailing"); updateResetButton(); resetButton.onclick = () => { params[key] = JSON.parse(JSON.stringify(defaultValue)); input.refresh(); }; input.on("change", ({ value }) => { updateResetButton(); if (programmatic) return; if (typeof value === "string") { if (value === "true" || value === "false") { target[key] = value === "true" ? true : false; return; } const num = parseFloat(value); if (!Number.isNaN(num)) { target[key] = num; return; } } target[key] = typeof value === "number" ? toFixed(key, value) : value; }); return [key, input]; })); }; //# sourceMappingURL=addInputs.js.map