Files
cadSet/text-to-cad/models/implicits/gyroid-window.implicit.js
T
2026-07-22 19:38:36 +08:00

55 lines
2.1 KiB
JavaScript

const GLSL = `
float sdf(vec3 p) {
vec3 q = p / periodScale;
float gyroid = implicit_tpms_gyroid(q, vec3(1.0), vec3(1.0));
float sheet = implicit_shell(gyroid, wallThickness, 0.0) * periodScale;
float roundedWindow = implicit_box_centered(p, vec3(windowSize), vec3(0.0));
float roundover = implicit_sphere(p, vec3(0.0), outerRadius);
return implicit_intersect_round(max(sheet, roundedWindow), roundover, roundover);
}
vec3 color(vec3 p, vec3 normal) {
vec3 wave = 0.5 + 0.5 * sin((p * 0.095) + vec3(0.0, 2.1, 4.2));
return mix(baseColor, accentColor, dot(wave, vec3(0.28, 0.36, 0.36)));
}
`;
export default {
schema: "implicit.js/0.1.0",
name: "gyroid window",
units: "mm",
params: {
periodScale: { type: "number", label: "Period scale", min: 5, max: 13, step: 0.1, default: 8.5, unit: "mm" },
wallThickness: { type: "number", label: "Wall thickness", min: 0.14, max: 0.7, step: 0.01, default: 0.34 },
windowSize: { type: "number", label: "Window size", min: 36, max: 66, step: 0.5, default: 52, unit: "mm" },
outerRadius: { type: "number", label: "Outer radius", min: 24, max: 42, step: 0.5, default: 33.5, unit: "mm" },
roundover: { type: "number", label: "Roundover", min: 0.5, max: 5, step: 0.1, default: 2.5, unit: "mm" },
baseColor: { type: "color", label: "Window color", default: "#43e8ff" },
accentColor: { type: "color", label: "Gold color", default: "#ffd166" }
},
animations: {
windowPulse: {
label: "Window pulse",
duration: 5.6,
loop: true,
update({ progress, set }) {
const wave = Math.sin(progress * Math.PI * 2);
set("wallThickness", 0.34 + wave * 0.16);
set("roundover", 2.5 + wave * 1.5);
set("windowSize", 52 + wave * 8);
}
}
},
bounds: ({ params }) => {
const extent = Math.max(params.windowSize * 0.5, params.outerRadius) + params.roundover + 4;
return [[-extent, -extent, -extent], [extent, extent, extent]];
},
render: ({ params }) => ({
steps: 280,
epsilon: Math.max(0.004, params.periodScale * 0.0007),
normalEpsilon: Math.max(0.04, params.periodScale * 0.006)
}),
glsl: GLSL
};