intergratedRenderer = (rawScene, params, interactions) => {
const world = params?.world || worldParameters
const perspective = params?.perspective || perspectiveParameters
const sceneInWorld = processSceneGivenParameters(rawScene, world)
const sceneProjected = projectSceneGivenParameters(sceneInWorld, perspective)
const el = svg`<svg width="${width}px" height="512">${anaglyphRenderer(sceneProjected)}</svg>`
let isMouseDown = false
const defaultUpdateFn = (layerX, layerY, worldParams, perspectiveParams) => {
const newRZ = -Math.PI + layerX / width * 2 * Math.PI
const newRX = -Math.PI / 2 + layerY / height * Math.PI / 2
return {
worldParameters: {
...worldParams,
rZ: newRZ,
rX: newRX
},
perspectiveParameters: {
...perspectiveParams
}
}
}
const updateFn = interactions?.update || defaultUpdateFn
const interactionStart = interactions?.start || (event => {
event.preventDefault();
isMouseDown = true
})
const interactionMove = interactions?.move || (event => {
if (isMouseDown === false) return;
event.preventDefault();
const update = updateFn(event.layerX, event.layerY, world, perspective)
const newWorld = processSceneGivenParameters(rawScene, update.worldParameters)
const newProjectedScene = projectSceneGivenParameters(newWorld, update.perspectiveParameters)
el.querySelectorAll('*').forEach(n => n.remove());
el.append(anaglyphRenderer(newProjectedScene))
})
const interactionEnd = interactions?.end || (event => {
isMouseDown = false
})
el.addEventListener('touchstart', interactionStart)
el.addEventListener('pointerdown', interactionStart)
el.addEventListener('pointermove', interactionMove)
el.addEventListener('pointerup', interactionEnd)
return Object.assign(el, {
onmousedown: interactionStart,
onmousemove: interactionMove,
onmouseup: interactionEnd
})
}