function colorSpace3DImpl(config, ...legacyLayers) {
if (typeof config === "function") {
config = {
mapper: config
};
}
let {
isAnimated = false,
dragRotateGroup = "default",
mapper,
width = 500,
height = 500,
background = "transparent",
layers,
tag = "canvas",
rotation = {
x: (-Zdog.TAU * xRotation) / 16,
y: (Zdog.TAU * yRotation) / 16,
z: 0
}
} = config;
const element =
tag === "canvas"
? htl.html`<canvas width=${width} height=${height}>`
: tag === "svg"
? htl.html`<svg width=${width} height=${height}>`
: tag + "?";
element.style.background = background;
let isDragging = false;
const group = getDragRotateGroup(dragRotateGroup);
if (config.lookAtPlane) {
rotation = lookAtPlane(config.lookAtPlane.map(mapper));
}
const illo = new Zdog.Illustration({
element: element.tagName === "CANVAS" ? p3CanvasProxy(element) : element,
dragRotate: true,
rotate: rotation,
onDragStart() {
isDragging = true;
},
onDragMove() {
syncDragRotateGroup(illo, group);
dragRotateGroupsLastRotation.set(dragRotateGroup, illo.dragRotate.rotate);
},
onDragEnd() {
isDragging = false;
}
});
if (config.lookAtPlane) {
syncDragRotateGroup(illo, group);
dragRotateGroupsLastRotation.set(dragRotateGroup, rotation);
}
syncIlloFromDragRotateGroup(illo, dragRotateGroup);
group.add(illo);
const addPointImpl = (color, stroke) => {
const { x, y, z } = mapper(color);
return new Zdog.Shape({
addTo: illo,
stroke: stroke,
translate: { x, y, z },
color: toColorString(color)
});
};
for (const layer of layers) {
for (const color of layer.colors) {
addPointImpl(color, layer.stroke);
}
}
illo.updateRenderGraph();
function animate() {
if (isDragging || isAnimated) {
illo.updateRenderGraph();
}
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
const addPoint = (point, stroke) => {
const result = addPointImpl(point, stroke);
illo.updateRenderGraph();
return {
update(newPoint) {
const { x, y, z } = mapper(newPoint);
result.translate.x = x;
result.translate.y = y;
result.translate.z = z;
result.color = toColorString(newPoint);
illo.updateRenderGraph();
}
};
};
return { element, illo, addPoint };
}