diff --git a/app.js b/app.js index 051fe82..5221c68 100644 --- a/app.js +++ b/app.js @@ -1,3 +1,6 @@ +import * as THREE from 'three'; +import { createHolographicSigns, updateHolographicSigns } from './holographicSigns.js'; + // ... existing code ... // === WEBSOCKET CLIENT === @@ -24,4 +27,28 @@ window.addEventListener('beforeunload', () => { wsClient.disconnect(); }); +// Assuming 'scene' is a globally available THREE.Scene object in app.js +// If not, this part will need adjustment once the full app.js is visible. +(async () => { + try { + const response = await fetch('./portals.json'); + const portals = await response.json(); + // Assuming 'scene' is initialized and available here. + // Replace 'YOUR_THREE_SCENE_OBJECT' with the actual scene variable name. + // For now, I'll use a placeholder and assume 'scene' is the variable. + createHolographicSigns(scene, portals); + + // Placeholder animation loop. Real loop should be `requestAnimationFrame` driven. + function animate() { + requestAnimationFrame(animate); + updateHolographicSigns(performance.now()); + // renderer.render(scene, camera); // Assuming renderer and camera exist + } + animate(); + + } catch (error) { + console.error('Error loading portals or creating holographic signs:', error); + } +})(); + // ... existing code ... diff --git a/holographicSigns.js b/holographicSigns.js new file mode 100644 index 0000000..5b57117 --- /dev/null +++ b/holographicSigns.js @@ -0,0 +1,81 @@ +import * as THREE from 'three'; + +const holographicVertexShader = ` + void main() { + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); + } +`; + +const holographicFragmentShader = ` + void main() { + gl_FragColor = vec4(0.0, 1.0, 1.0, 0.5); // Cyan color, semi-transparent + } +`; + +let holographicSigns = []; + +export function createHolographicSigns(scene, portals) { + const signGeometry = new THREE.PlaneGeometry(3, 2); // Adjust size as needed + + portals.forEach(portal => { + const signMaterial = new THREE.ShaderMaterial({ + vertexShader: holographicVertexShader, + fragmentShader: holographicFragmentShader, + transparent: true, + blending: THREE.AdditiveBlending, + side: THREE.DoubleSide + }); + + const signMesh = new THREE.Mesh(signGeometry, signMaterial); + + // Position the sign slightly above and in front of the portal + signMesh.position.set( + portal.position.x, + portal.position.y + 2, // Slightly above + portal.position.z + 1 // Slightly in front + ); + + // Rotate to face the center of the scene (assuming portals are generally arranged around the center) + if (portal.rotation && portal.rotation.y !== undefined) { + signMesh.rotation.y = portal.rotation.y + Math.PI; // Face opposite to portal's rotation + } else { + // Default rotation if not specified in portal data + signMesh.lookAt(new THREE.Vector3(0, portal.position.y + 2, 0)); + signMesh.rotation.y += Math.PI; // Adjust to face outwards + } + + + // Add text for the portal name + const loader = new THREE.FontLoader(); + loader.load('https://threejs.org/examples/fonts/helvetiker_regular.typeface.json', function (font) { + const textGeometry = new THREE.TextGeometry(portal.name, { + font: font, + size: 0.5, + height: 0.05, + curveSegments: 12, + }); + textGeometry.computeBoundingBox(); + const textMaterial = new THREE.MeshBasicMaterial({ color: 0x00ffff }); // Cyan color for text + const textMesh = new THREE.Mesh(textGeometry, textMaterial); + + // Center the text + textMesh.position.x = -0.5 * (textGeometry.boundingBox.max.x - textGeometry.boundingBox.min.x); + textMesh.position.y = 0.5; // Position relative to the sign mesh + + signMesh.add(textMesh); + }); + + + scene.add(signMesh); + holographicSigns.push(signMesh); + }); + return holographicSigns; +} + +// Placeholder for animation update. Will be called from app.js's animate loop. +export function updateHolographicSigns(time) { + holographicSigns.forEach(sign => { + sign.rotation.y += 0.005; // Simple rotation animation + }); +} + diff --git a/index.html b/index.html index 34af931..4a935e1 100644 --- a/index.html +++ b/index.html @@ -27,5 +27,7 @@ + +