checkpoint before refactor
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user