Code viewer for World: Simple World (clone by Li...
import * as THREE from "three";

import { useEffect } from "react";

import SceneInit from "./lib/SceneInit";
import TicTacToeCube from "./lib/TicTacToeCube";
import { WireframeGeometry } from "three";

export default function Home() {
  const canvasId = "myThreeCanvas";

  useEffect(() => {
    const test = new SceneInit(canvasId);
    test.initScene();
    test.animate();

    const game = new TicTacToeCube();
    test.scene.add(game.board);

    const mouse = new THREE.Vector2();
    const raycaster = new THREE.Raycaster();

    const onMouseMove = (event) => {
      mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
      mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
      raycaster.setFromCamera(mouse, test.camera);
      const intersects = raycaster.intersectObjects(game.hiddenCubes.children);

      // NOTE: Hide all previous cubes.
      const hideCube = (hiddenCube) => {
        hiddenCube.material.wireframe = true;
      };
      game.hiddenCubes.children.forEach((hiddenCube) => hideCube(hiddenCube));

      if (intersects.length > 0) {
        const index = game.hiddenCubes.children.findIndex(
          (c) => c.uuid === intersects[0].object.uuid
        );
        game.hiddenCubes.children[index].material.wireframe = false;
      }
    };

    const onMouseDown = (event) => {
      mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
      mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
      raycaster.setFromCamera(mouse, test.camera);
      const intersects = raycaster.intersectObjects(game.hiddenCubes.children);
      console.log(intersects);
      if (intersects.length > 0) {
        const index = game.hiddenCubes.children.findIndex(
          (c) => c.uuid === intersects[0].object.uuid
        );
        game.hiddenCubes.children.splice(index, 1);
        const x = intersects[0].object.position.x;
        const y = intersects[0].object.position.y;
        const z = intersects[0].object.position.z;
        game.addSphereOrAsterisk({ x, y, z });
        game.checkWinConditions();
      }
    };

    const scaleUp = (obj) => {
      if (obj.scale.x < 1) {
        obj.scale.x += 0.04;
      }
      if (obj.scale.y < 1) {
        obj.scale.y += 0.04;
      }
      if (obj.scale.z < 1) {
        obj.scale.z += 0.04;
      }
    };

    const animate = () => {
      game.spheres.children.forEach((sphere) => scaleUp(sphere));
      game.asterisks.children.forEach((asterisk) => scaleUp(asterisk));
      game.winStrikes.children.forEach((strike) => scaleUp(strike));
      requestAnimationFrame(animate);
    };

    animate();

    window.addEventListener("mousedown", onMouseDown, false);
    window.addEventListener("mousemove", onMouseMove, false);
  }, []);

  return (
    <div className="flex flex-col items-center justify-center">
      <canvas id={canvasId} />
    </div>
  );
}