diff --git a/Week-2/Task-3/vanilla/index.html b/Week-2/Task-3/vanilla/index.html index 202d2ea..e2d9ea7 100644 --- a/Week-2/Task-3/vanilla/index.html +++ b/Week-2/Task-3/vanilla/index.html @@ -1,11 +1,18 @@ - - - Task 3 - UI-Controlled Product Option (Configurator Pattern) + + Task 3 — UI-Controlled Product Option + - + +
+ + + +
+ + \ No newline at end of file diff --git a/Week-2/Task-3/vanilla/main.js b/Week-2/Task-3/vanilla/main.js index e69de29..170bb3f 100644 --- a/Week-2/Task-3/vanilla/main.js +++ b/Week-2/Task-3/vanilla/main.js @@ -0,0 +1,92 @@ +import * as THREE from "three"; +import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; + +const scene = new THREE.Scene(); +scene.background = new THREE.Color("white"); + +const camera = new THREE.PerspectiveCamera( + 75, + window.innerWidth / window.innerHeight, + 0.1, + 1000 +); +camera.position.z = 5; + +const renderer = new THREE.WebGLRenderer(); +renderer.setSize(window.innerWidth, window.innerHeight); +document.body.appendChild(renderer.domElement); + +const geometries = { + black: new THREE.BoxGeometry(2, 2, 2), + silver: new THREE.SphereGeometry(1.5, 32, 32), + gold: new THREE.TorusGeometry(1.2, 0.4, 16, 100), +}; + +const materials = { + black: new THREE.MeshStandardMaterial({ + color: "black", + roughness: 1, + metalness: 0, + }), + silver: new THREE.MeshStandardMaterial({ + color: "#C0C0C0", + roughness: 0.3, + metalness: 1, + }), + gold: new THREE.MeshStandardMaterial({ + color: "#FFD700", + roughness: 0.4, + metalness: 1, + }), +}; + +let currentVariant = "black"; + +let mesh = new THREE.Mesh( + geometries[currentVariant], + materials[currentVariant] +); +scene.add(mesh); + +scene.add(new THREE.AmbientLight(0xffffff, 0.6)); + +const pointLight = new THREE.PointLight(0xffffff, 1); +pointLight.position.set(5, 5, 5); +scene.add(pointLight); + +const controls = new OrbitControls(camera, renderer.domElement); +controls.enableDamping = true; + +function updateScene() { + mesh.geometry = geometries[currentVariant]; + mesh.material = materials[currentVariant]; +} + +const buttons = document.querySelectorAll("button"); + +buttons.forEach((btn) => { + btn.addEventListener("click", () => { + const variant = btn.getAttribute("data-variant"); + + currentVariant = variant; + updateScene(); + + buttons.forEach((b) => b.classList.remove("active")); + btn.classList.add("active"); + }); +}); + +function animate() { + requestAnimationFrame(animate); + + controls.update(); + + renderer.render(scene, camera); +} +animate(); + +window.addEventListener("resize", () => { + camera.aspect = window.innerWidth / window.innerHeight; + camera.updateProjectionMatrix(); + renderer.setSize(window.innerWidth, window.innerHeight); +}); \ No newline at end of file