Skip to content
Snippets Groups Projects
scene.js 3.03 KiB
Newer Older
Greg Fodor's avatar
Greg Fodor committed
console.log(`Hubs version: ${process.env.BUILD_VERSION || "?"}`);

import "./assets/stylesheets/scene.scss";

import "aframe";
import "./utils/logging";
import { patchWebGLRenderingContext } from "./utils/webgl";
patchWebGLRenderingContext();

import "three/examples/js/loaders/GLTFLoader";

Greg Fodor's avatar
Greg Fodor committed
import "./components/scene-components";
Greg Fodor's avatar
Greg Fodor committed
import "./components/debug";
import "./systems/nav";

import { getReticulumFetchUrl } from "./utils/phoenix-utils";
Greg Fodor's avatar
Greg Fodor committed

import ReactDOM from "react-dom";
import React from "react";
import SceneUI from "./react-components/scene-ui";
import { disableiOSZoom } from "./utils/disable-ios-zoom";

import "./gltf-component-mappings";

import { App } from "./App";

window.APP = new App();

const qs = new URLSearchParams(location.search);
const isMobile = AFRAME.utils.device.isMobile();

window.APP.quality = qs.get("quality") || isMobile ? "low" : "high";

import "aframe-physics-system";
import "aframe-physics-extras";
import "./components/event-repeater";
import "./components/controls-shape-offset";

import registerTelemetry from "./telemetry";

registerTelemetry();

disableiOSZoom();

function mountUI(scene, props = {}) {
  ReactDOM.render(
    <SceneUI
      {...{
        scene,
        ...props
      }}
    />,
    document.getElementById("ui-root")
  );
}

const onReady = async () => {
  const scene = document.querySelector("a-scene");
  window.APP.scene = scene;

Greg Fodor's avatar
Greg Fodor committed
  const sceneId = qs.get("scene_id") || document.location.pathname.substring(1).split("/")[1];
Greg Fodor's avatar
Greg Fodor committed
  console.log(`Scene ID: ${sceneId}`);

  let uiProps = { sceneId: sceneId };
Greg Fodor's avatar
Greg Fodor committed

  mountUI(scene);

  const remountUI = props => {
    uiProps = { ...uiProps, ...props };
    mountUI(scene, uiProps);
  };

  const sceneRoot = document.querySelector("#scene-root");
  const sceneModelEntity = document.createElement("a-entity");
Greg Fodor's avatar
Greg Fodor committed
  const gltfEl = document.createElement("a-entity");
  const camera = document.getElementById("camera");
Greg Fodor's avatar
Greg Fodor committed

  sceneModelEntity.addEventListener("scene-loaded", () => {
    remountUI({ sceneLoaded: true });
Greg Fodor's avatar
Greg Fodor committed
    const previewCamera = gltfEl.object3D.getObjectByName("scene-preview-camera");

    if (previewCamera) {
Greg Fodor's avatar
Greg Fodor committed
      camera.object3D.position.copy(previewCamera.position);
      camera.object3D.rotation.copy(previewCamera.rotation);
      camera.object3D.updateMatrix();
Greg Fodor's avatar
Greg Fodor committed
    }

    camera.setAttribute("scene-preview-camera", "");
Greg Fodor's avatar
Greg Fodor committed
  const res = await fetch(getReticulumFetchUrl(`/api/v1/scenes/${sceneId}`)).then(r => r.json());
  const sceneInfo = res.scenes[0];
Greg Fodor's avatar
Greg Fodor committed
  const modelUrl = sceneInfo.model_url;
  console.log(`Scene Model URL: ${modelUrl}`);
Greg Fodor's avatar
Greg Fodor committed
  gltfEl.setAttribute("gltf-model-plus", { src: modelUrl, useCache: false, inflate: true });
Greg Fodor's avatar
Greg Fodor committed
  gltfEl.addEventListener("model-loaded", () => sceneModelEntity.emit("scene-loaded"));
  sceneModelEntity.appendChild(gltfEl);
Greg Fodor's avatar
Greg Fodor committed
  sceneRoot.appendChild(sceneModelEntity);
Greg Fodor's avatar
Greg Fodor committed
  remountUI({
    sceneName: sceneInfo.name,
    sceneDescription: sceneInfo.description,
Greg Fodor's avatar
Greg Fodor committed
    sceneAttributions: sceneInfo.attributions,
Greg Fodor's avatar
Greg Fodor committed
    sceneScreenshotURL: sceneInfo.screenshot_url
Greg Fodor's avatar
Greg Fodor committed
  });
Greg Fodor's avatar
Greg Fodor committed
};

document.addEventListener("DOMContentLoaded", onReady);