mirror of
https://github.com/TomHodson/tomhodson.github.com.git
synced 2025-06-26 10:01:18 +02:00
77 lines
2.1 KiB
JavaScript
77 lines
2.1 KiB
JavaScript
const icon_container = document.querySelector(".icon-container");
|
|
const inline_viewer = document.querySelector("outline-model-viewer");
|
|
const canvas = inline_viewer.component.canvas;
|
|
const header = document.querySelector("section.header");
|
|
|
|
if (inline_viewer) {
|
|
let last_scroll_pos = 0;
|
|
let mode = "inline";
|
|
let { controls, composer } = inline_viewer.component;
|
|
let margin = 50; // in pixels
|
|
let original = {};
|
|
|
|
header.classList.add("sticky");
|
|
|
|
const onscroll = () => {
|
|
const delta =
|
|
icon_container.getBoundingClientRect().bottom -
|
|
inline_viewer.getBoundingClientRect().bottom;
|
|
|
|
if (mode === "inline" && delta > margin) {
|
|
console.log(`Moving canvas to icon delta ${delta} ${window.scrollY}`);
|
|
icon_container.appendChild(canvas);
|
|
mode = "icon";
|
|
|
|
original.autoRotate = controls.autoRotate;
|
|
controls.autoRotate = true;
|
|
|
|
inline_viewer.onWindowResize();
|
|
inline_viewer.updateEdgeThickness(0.5);
|
|
canvas.classList.add("revealed");
|
|
}
|
|
|
|
if (mode === "icon" && delta > 2 * margin) {
|
|
canvas.classList.add("revealed");
|
|
}
|
|
|
|
if (mode === "icon" && delta < 0) {
|
|
console.log(
|
|
`Moving canvas to inline viewer delta ${delta} ${window.scrollY}`
|
|
);
|
|
inline_viewer.component.container.insertBefore(
|
|
canvas,
|
|
inline_viewer.component.gui.domElement
|
|
);
|
|
controls.autoRotate = original.autoRotate;
|
|
mode = "inline";
|
|
inline_viewer.onWindowResize();
|
|
inline_viewer.updateEdgeThickness(1);
|
|
canvas.classList.remove("revealed");
|
|
}
|
|
|
|
if (mode === "icon" && delta < 2 * margin) {
|
|
canvas.classList.remove("revealed");
|
|
}
|
|
|
|
if (mode == "icon") {
|
|
const delta = (window.scrollY - last_scroll_pos) / 30;
|
|
if (Math.abs(delta) > 0.1) {
|
|
controls.update(delta);
|
|
composer.render();
|
|
last_scroll_pos = window.scrollY;
|
|
}
|
|
}
|
|
};
|
|
|
|
let ticking = false;
|
|
document.addEventListener("scroll", (event) => {
|
|
if (!ticking) {
|
|
window.requestAnimationFrame(() => {
|
|
onscroll();
|
|
ticking = false;
|
|
});
|
|
ticking = true;
|
|
}
|
|
});
|
|
}
|