From 565d2c2d9b74b61080b3dd165fa051b3b19dbd62 Mon Sep 17 00:00:00 2001
From: Greg Fodor <gfodor@gmail.com>
Date: Tue, 13 Nov 2018 18:55:37 +0000
Subject: [PATCH] WIP

---
 src/hub.js                           |  7 +++
 src/react-components/chat-message.js | 83 ++++++++++++++++++++--------
 src/scene-entry-manager.js           |  2 +-
 3 files changed, 68 insertions(+), 24 deletions(-)

diff --git a/src/hub.js b/src/hub.js
index de5406105..5492dd0f8 100644
--- a/src/hub.js
+++ b/src/hub.js
@@ -80,6 +80,7 @@ import { proxiedUrlFor } from "./utils/media-utils";
 import MessageDispatch from "./message-dispatch";
 import SceneEntryManager from "./scene-entry-manager";
 import Subscriptions from "./subscriptions";
+import { spawnChatMessage } from "./react-components/chat-message";
 
 import "./systems/nav";
 import "./systems/personal-space-bubble";
@@ -551,4 +552,10 @@ document.addEventListener("DOMContentLoaded", async () => {
   });
 
   linkChannel.setSocket(socket);
+
+  setInterval(() => {
+    spawnChatMessage(
+      "```Hello asdjf sdkfadsfadsfadsfadf\nalkdsf dsflsafadsfadsfadfsj\n asdf dsf adf adf sdkfadsfafd\n lasdfadsfadsfldsfldsfja\n asdkf sdfjadsadsfadsf\n aldf sdjf sdkfasdf ```"
+    );
+  }, 5000);
 });
diff --git a/src/react-components/chat-message.js b/src/react-components/chat-message.js
index a7aa72b55..613118004 100644
--- a/src/react-components/chat-message.js
+++ b/src/react-components/chat-message.js
@@ -6,6 +6,7 @@ import classNames from "classnames";
 import Linkify from "react-linkify";
 import { toArray as toEmojis } from "react-emoji-render";
 import serializeElement from "../utils/serialize-element";
+import nextTick from "../utils/next-tick";
 
 const messageCanvas = document.createElement("canvas");
 const emojiRegex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32-\ude3a]|[\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/;
@@ -30,7 +31,7 @@ const messageBodyDom = body => {
   );
 };
 
-export function spawnChatMessage(body) {
+export function renderChatMessage(body) {
   if (body.length === 0) return;
 
   if (body.match(urlRegex)) {
@@ -64,28 +65,64 @@ export function spawnChatMessage(body) {
     </div>
   );
 
-  ReactDOM.render(entryDom, el, () => {
-    // Scale by 12x
-    messageCanvas.width = el.offsetWidth * 12.1;
-    messageCanvas.height = el.offsetHeight * 12.1;
-
-    const xhtml = encodeURIComponent(`
-        <svg xmlns="http://www.w3.org/2000/svg" width="${messageCanvas.width}" height="${messageCanvas.height}">
-          <foreignObject width="8.333%" height="8.333%" style="transform: scale(12.0);">
-            ${serializeElement(el)}
-          </foreignObject>
-        </svg>
-  `);
-    const img = new Image();
-
-    img.onload = async () => {
-      context.drawImage(img, 0, 0);
-      const blob = await new Promise(resolve => messageCanvas.toBlob(resolve));
-      document.querySelector("a-scene").emit("add_media", new File([blob], "message.png", { type: "image/png" }));
-      el.parentNode.removeChild(el);
-    };
-
-    img.src = "data:image/svg+xml," + xhtml;
+  return new Promise(resolve => {
+    ReactDOM.render(entryDom, el, () => {
+      // Scale by 12x
+      //messageCanvas.width = el.offsetWidth * 12.1;
+      //messageCanvas.height = el.offsetHeight * 12.1;
+      messageCanvas.width = el.offsetWidth * 4.1;
+      messageCanvas.height = el.offsetHeight * 4.1;
+
+      const xhtml = encodeURIComponent(`
+          <svg xmlns="http://www.w3.org/2000/svg" width="${messageCanvas.width}" height="${messageCanvas.height}">
+            <foreignObject width="25%" height="25%" style="transform: scale(4.0);">
+              ${serializeElement(el)}
+            </foreignObject>
+          </svg>
+    `);
+      const img = new Image();
+
+      img.onload = async () => {
+        context.drawImage(img, 0, 0);
+        const blob = await new Promise(resolve => messageCanvas.toBlob(resolve));
+        el.parentNode.removeChild(el);
+        resolve(blob);
+      };
+
+      img.src = "data:image/svg+xml," + xhtml;
+    });
+  });
+}
+
+export async function spawnChatMessage(body) {
+  const blob = await renderChatMessage(body);
+  //document.querySelector("a-scene").emit("add_media", new File([blob], "message.png", { type: "image/png" }));
+  //
+  const entity = document.createElement("a-entity");
+  const offset = { x: 0, y: 0, z: -1.5 };
+
+  entity.setAttribute("offset-relative-to", {
+    target: "#player-camera",
+    offset
+  });
+
+  document.querySelector("a-scene").appendChild(entity);
+
+  await nextTick();
+
+  const textureLoader = new THREE.TextureLoader();
+  const blobUrl = URL.createObjectURL(blob);
+
+  textureLoader.load(blobUrl, texture => {
+    const material = new THREE.MeshBasicMaterial();
+    material.side = THREE.DoubleSide;
+    material.transparent = true;
+    material.map = texture;
+    material.needsUpdate = true;
+
+    const geometry = new THREE.PlaneGeometry();
+    const mesh = new THREE.Mesh(geometry, material);
+    entity.setObject3D("mesh", mesh);
   });
 }
 
diff --git a/src/scene-entry-manager.js b/src/scene-entry-manager.js
index 4c1875e72..848e14c82 100644
--- a/src/scene-entry-manager.js
+++ b/src/scene-entry-manager.js
@@ -53,7 +53,7 @@ export default class SceneEntryManager {
     if (enterInVR) {
       // HACK - A-Frame calls getVRDisplays at module load, we want to do it here to
       // force gamepads to become live.
-      navigator.getVRDisplays();
+      //navigator.getVRDisplays();
       this.scene.enterVR();
     } else if (AFRAME.utils.device.isMobile()) {
       document.body.addEventListener("touchend", requestFullscreen);
-- 
GitLab