User:Monster Domosed/common.js: Difference between revisionsGive feedback
No edit summary |
No edit summary |
||
| Line 5: | Line 5: | ||
const HQ_ICON = '/images/1/10/HQ_icon.png'; | const HQ_ICON = '/images/1/10/HQ_icon.png'; | ||
function getSize( | function getSize(element) { | ||
const match = | const match = element.className.match(/model_size_(\d+)/); | ||
return match ? parseInt(match[1], 10) : 500; | return match ? parseInt(match[1], 10) : 500; | ||
} | } | ||
| Line 36: | Line 20: | ||
return fetch(apiUrl) | return fetch(apiUrl) | ||
.then | .then(response => response.json()) | ||
.then(data => { | |||
.then | |||
const page = Object.values(data.query.pages)[0]; | const page = Object.values(data.query.pages)[0]; | ||
| Line 50: | Line 32: | ||
} | } | ||
function addQualityButton( | function addQualityButton(container, viewer, lqUrl, hqUrl) { | ||
if (!hqUrl || lqUrl === hqUrl) { | if (!hqUrl || lqUrl === hqUrl) { | ||
return; | return; | ||
| Line 58: | Line 40: | ||
button.className = 'mv-quality-toggle'; | button.className = 'mv-quality-toggle'; | ||
button.type = 'button'; | button.type = 'button'; | ||
const icon = document.createElement('img'); | const icon = document.createElement('img'); | ||
| Line 66: | Line 46: | ||
button.appendChild(icon); | button.appendChild(icon); | ||
const buttonSize = Math.max( | |||
28, | |||
Math.min(56, Math.round(container.offsetWidth * 0.14)) | |||
); | |||
button.style.width = buttonSize + 'px'; | |||
button.style.height = buttonSize + 'px'; | |||
button.addEventListener('click', function () { | button.addEventListener('click', function () { | ||
| Line 74: | Line 62: | ||
}); | }); | ||
container.appendChild(button); | |||
} | } | ||
function loadModel( | function loadModel(preview) { | ||
if ( | if (preview.dataset.loaded) { | ||
return; | return; | ||
} | } | ||
preview.dataset.loaded = '1'; | |||
const fileName = preview.dataset.model; | |||
const size = getSize(preview); | |||
Promise.all([ | Promise.all([ | ||
getFileUrl( | getFileUrl(fileName + '-compressed.glb'), | ||
getFileUrl( | getFileUrl(fileName + '.glb') | ||
]).then(function (urls) { | ]).then(function (urls) { | ||
const lqUrl = urls[0] || urls[1]; | const lqUrl = urls[0] || urls[1]; | ||
const hqUrl = urls[1]; | const hqUrl = urls[1]; | ||
| Line 96: | Line 86: | ||
} | } | ||
const container = document.createElement('div'); | |||
container.className = 'model-viewer-container'; | |||
container.style.width = size + 'px'; | |||
container.style.height = size + 'px'; | |||
const viewer = document.createElement('model-viewer'); | const viewer = document.createElement('model-viewer'); | ||
viewer.src = lqUrl; | viewer.src = lqUrl; | ||
viewer.setAttribute('camera-controls', ''); | viewer.setAttribute('camera-controls', ''); | ||
viewer.setAttribute('touch-action', 'pan-y'); | viewer.setAttribute('touch-action', 'pan-y'); | ||
container.appendChild(viewer); | |||
preview.replaceWith(container); | |||
viewer.addEventListener('load', function () { | viewer.addEventListener('load', function () { | ||
addQualityButton( | addQualityButton( | ||
container, | |||
viewer, | |||
lqUrl, | |||
hqUrl | |||
); | |||
}); | }); | ||
}); | }); | ||
} | } | ||
function | function initPreview(preview) { | ||
if ( | if (preview.dataset.initialized) { | ||
return; | return; | ||
} | } | ||
preview.dataset.initialized = '1'; | |||
const button = document.createElement('button'); | const button = document.createElement('button'); | ||
button.className = 'model-load-button'; | |||
button.type = 'button'; | button.type = 'button'; | ||
button.addEventListener('click', function () { | button.addEventListener('click', function () { | ||
loadModel( | loadModel(preview); | ||
}); | }); | ||
preview.appendChild(button); | |||
} | } | ||
function scan() { | function scan() { | ||
document | document | ||
.querySelectorAll('.model- | .querySelectorAll('.model-preview') | ||
.forEach( | .forEach(initPreview); | ||
} | } | ||
| Line 152: | Line 142: | ||
childList: true, | childList: true, | ||
subtree: true | subtree: true | ||
}); | }); | ||