checkpoint before refactor

This commit is contained in:
2026-01-21 00:21:33 +01:00
parent c7194de5a0
commit 87312408a2

View File

@@ -192,6 +192,9 @@ let animationId = null;
// Geometry cache for height exaggeration // Geometry cache for height exaggeration
let geometryCache = null; let geometryCache = null;
// Resize observer
let resizeObserver = null;
// Initialize Three.js // Initialize Three.js
const initThreeJS = () => { const initThreeJS = () => {
if (!canvasRef.value) return; if (!canvasRef.value) return;
@@ -213,9 +216,8 @@ const initThreeJS = () => {
}); });
const width = canvasRef.value.clientWidth || 800; const width = canvasRef.value.clientWidth || 800;
const height = canvasRef.value.clientHeight || 800; const height = canvasRef.value.clientHeight || 600;
const size = Math.min(width, height); renderer.setSize(width, height);
renderer.setSize(size,size);
renderer.setPixelRatio(window.devicePixelRatio); renderer.setPixelRatio(window.devicePixelRatio);
// Lights // Lights
@@ -237,6 +239,25 @@ const initThreeJS = () => {
animate(); animate();
}; };
// Handle canvas resize
const handleResize = () => {
if (!canvasRef.value || !renderer || !camera) return;
const width = canvasRef.value.clientWidth || 800;
const height = canvasRef.value.clientHeight || 600;
renderer.setSize(width, height);
renderer.setPixelRatio(window.devicePixelRatio);
// Always maintain square frustum regardless of canvas aspect ratio
const viewSize = 6;
camera.left = -viewSize;
camera.right = viewSize;
camera.top = viewSize;
camera.bottom = -viewSize;
camera.updateProjectionMatrix();
};
// Load tile data // Load tile data
const loadTileData = (tileData) => { const loadTileData = (tileData) => {
if (!scene) { if (!scene) {
@@ -317,12 +338,10 @@ const loadTileData = (tileData) => {
mesh = new THREE.Mesh(geometry, material); mesh = new THREE.Mesh(geometry, material);
scene.add(mesh); scene.add(mesh);
// Configure camera frustum for orthographic view // Configure camera frustum for orthographic view - ALWAYS SQUARE
// We want to see the 10-unit box with some padding
const aspect = canvasRef.value.clientWidth / canvasRef.value.clientHeight;
const viewSize = 6; // 10-unit terrain + padding const viewSize = 6; // 10-unit terrain + padding
camera.left = -viewSize * aspect; camera.left = -viewSize;
camera.right = viewSize * aspect; camera.right = viewSize;
camera.top = viewSize; camera.top = viewSize;
camera.bottom = -viewSize; camera.bottom = -viewSize;
@@ -508,11 +527,10 @@ const renderTileWithSettings = async (tileData, renderSettings, resolution = 102
renderer.setSize(resolution, resolution); renderer.setSize(resolution, resolution);
renderer.setPixelRatio(1); renderer.setPixelRatio(1);
// Update camera for square aspect // Update camera for square aspect (always square)
const aspect = 1;
const viewSize = 6; const viewSize = 6;
camera.left = -viewSize * aspect; camera.left = -viewSize;
camera.right = viewSize * aspect; camera.right = viewSize;
camera.top = viewSize; camera.top = viewSize;
camera.bottom = -viewSize; camera.bottom = -viewSize;
camera.updateProjectionMatrix(); camera.updateProjectionMatrix();
@@ -527,10 +545,9 @@ const renderTileWithSettings = async (tileData, renderSettings, resolution = 102
renderer.setSize(originalWidth / originalPixelRatio, originalHeight / originalPixelRatio); renderer.setSize(originalWidth / originalPixelRatio, originalHeight / originalPixelRatio);
renderer.setPixelRatio(originalPixelRatio); renderer.setPixelRatio(originalPixelRatio);
// Restore camera aspect // Restore camera (always square frustum)
const canvasAspect = originalWidth / originalHeight; camera.left = -viewSize;
camera.left = -viewSize * canvasAspect; camera.right = viewSize;
camera.right = viewSize * canvasAspect;
camera.top = viewSize; camera.top = viewSize;
camera.bottom = -viewSize; camera.bottom = -viewSize;
camera.updateProjectionMatrix(); camera.updateProjectionMatrix();
@@ -571,6 +588,10 @@ const cleanup = () => {
if (animationId) { if (animationId) {
cancelAnimationFrame(animationId); cancelAnimationFrame(animationId);
} }
if (resizeObserver) {
resizeObserver.disconnect();
resizeObserver = null;
}
if (renderer) { if (renderer) {
renderer.dispose(); renderer.dispose();
} }
@@ -585,6 +606,14 @@ onMounted(() => {
if (props.visible) { if (props.visible) {
nextTick(() => { nextTick(() => {
initThreeJS(); initThreeJS();
// Set up resize observer
if (canvasRef.value) {
resizeObserver = new ResizeObserver(() => {
handleResize();
});
resizeObserver.observe(canvasRef.value);
}
}); });
} }
}); });
@@ -594,6 +623,14 @@ watch(() => props.visible, (newVal) => {
if (newVal && !renderer) { if (newVal && !renderer) {
nextTick(() => { nextTick(() => {
initThreeJS(); initThreeJS();
// Set up resize observer
if (canvasRef.value && !resizeObserver) {
resizeObserver = new ResizeObserver(() => {
handleResize();
});
resizeObserver.observe(canvasRef.value);
}
}); });
} }
}); });