Skip to content

Meshpicker

js
import {
  Camera,
  Scene,
  Node,
  WebGPURenderer,
  Material,
  getDevice,
} from "@tmrw-realityos/charm";

export async function ready() {
  // get the html canvas, create a camera and start the render
  const canvas = document.querySelector("canvas");
  if (!canvas) {
    throw new Error("Canvas not found");
  }

  const device = await getDevice();
  const camera = new Camera();
  const renderer = new WebGPURenderer(device, canvas);
  renderer.renderOptions.postfx = false;

  // create a single triangle mesh
  const mesh = renderer.newMesh();
  mesh.positions = [-0.2, 0.2, 0, -0.2, -0.2, 0, 0.2, -0.2, 0];
  mesh.mustUpdate = true;

  // create a scene
  const scene = new Scene();

  // create two nodes
  for (let i = 0; i < 2; i++) {
    const node = new Node();
    node.name = `node-${i}`;
    node.mesh = mesh;
    node.material = new Material();
    node.material.model = "unlit";
    node.material.color = [1 - i, i, 0];
    node.transform.setPosition([-0.2 + 0.4 * i, 0.0, 0]);
    scene.root.addChild(node);
  }

  // Handle click
  canvas.addEventListener("click", (e) => {
    renderer.pickScene(e.offsetX, e.offsetY).then((node) => {
      scene.root.setOutline(false, true);
      if (node) {
        node.setOutline(true);
        console.log("picked", node.name);
      } else {
        console.log("clear");
      }
      renderer.render(scene, camera);
    });
    renderer.render(scene, camera);
  });

  renderer.render(scene, camera);
}