55 lines
2.1 KiB
JavaScript
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
|
|
};
|