Skip to content
Snippets Groups Projects
hub.html 23.33 KiB
<!DOCTYPE html>
<html>

<head>
    <!-- DO NOT REMOVE/EDIT THIS COMMENT - HUB_META_TAGS -->

    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

    <link rel="shortcut icon" type="image/png" href="/favicon.ico">
    <title>Get together | Hubs by Mozilla</title>
    <link href="https://fonts.googleapis.com/css?family=Zilla+Slab:300,300i,400,400i,700" rel="stylesheet">
</head>

<body>
    <audio id="test-tone">
        <source src="./assets/sfx/tone.webm" type="audio/webm"/>
        <source src="./assets/sfx/tone.mp3" type="audio/mpeg"/>
        <source src="./assets/sfx/tone.ogg" type="audio/ogg"/>
        <source src="./assets/sfx/tone.wav" type="audio/wav"/>
    </audio>

    <a-scene
        renderer="antialias: true; gammaOutput: true; sortObjects: true; physicallyCorrectLights: true;"
        gamma-factor
        networked-scene="adapter: janus; audio: true; debug: true; connectOnLoad: false;"
        physics="gravity: -6; debug: false;"
        mute-mic="eventSrc: a-scene; toggleEvents: action_mute"
        freeze-controller="toggleEvent: action_freeze"
        personal-space-bubble="debug: false;"
        vr-mode-ui="enabled: false"
        pinch-to-move
        input-configurator="
                  gazeCursorRayObject: #player-camera;
                  cursorController: #cursor-controller;
                  gazeTeleporter: #gaze-teleport;
                  camera: #player-camera;
                  playerRig: #player-rig;
                  leftController: #player-left-controller;
                  leftControllerRayObject: #player-left-controller;
                  rightController: #player-right-controller;
                  rightControllerRayObject: #player-right-controller;"
    >

        <a-assets>
            <img id="tooltip" crossorigin="anonymous" src="./assets/hud/tooltip.9.png">
            <img id="mute-off" crossorigin="anonymous" src="./assets/hud/mute_off.png">
            <img id="mute-off-hover" crossorigin="anonymous" src="./assets/hud/mute_off-hover.png">
            <img id="mute-on" crossorigin="anonymous" src="./assets/hud/mute_on.png">
            <img id="mute-on-hover" crossorigin="anonymous" src="./assets/hud/mute_on-hover.png">
            <img id="bubble-off" crossorigin="anonymous" src="./assets/hud/bubble_off.png">
            <img id="bubble-off-hover" crossorigin="anonymous" src="./assets/hud/bubble_off-hover.png">
            <img id="bubble-on" crossorigin="anonymous" src="./assets/hud/bubble_on.png">
            <img id="bubble-on-hover" crossorigin="anonymous" src="./assets/hud/bubble_on-hover.png">
            <img id="freeze-off" crossorigin="anonymous" src="./assets/hud/freeze_off.png">
            <img id="freeze-off-hover" crossorigin="anonymous" src="./assets/hud/freeze_off-hover.png">
            <img id="freeze-on" crossorigin="anonymous" src="./assets/hud/freeze_on.png">
            <img id="freeze-on-hover" crossorigin="anonymous" src="./assets/hud/freeze_on-hover.png">
            <img id="spawn-pen" crossorigin="anonymous" src="./assets/hud/spawn_pen.png">
            <img id="spawn-pen-hover" crossorigin="anonymous" src="./assets/hud/spawn_pen-hover.png">

            <a-asset-item id="botdefault" response-type="arraybuffer" src="https://asset-bundles-prod.reticulum.io/bots/BotDefault_Avatar-9f71f8ff22.gltf"></a-asset-item>
            <a-asset-item id="botbobo" response-type="arraybuffer" src="https://asset-bundles-prod.reticulum.io/bots/BotBobo_Avatar-f9740a010b.gltf"></a-asset-item>
            <a-asset-item id="botdom" response-type="arraybuffer" src="https://asset-bundles-prod.reticulum.io/bots/BotDom_Avatar-0c48bf15a5.gltf"></a-asset-item>
            <a-asset-item id="botgreg" response-type="arraybuffer" src="https://asset-bundles-prod.reticulum.io/bots/BotGreg_Avatar-98d39797bb.gltf"></a-asset-item>
            <a-asset-item id="botguest" response-type="arraybuffer" src="https://asset-bundles-prod.reticulum.io/bots/BotGuest_Avatar-78cd857332.gltf"></a-asset-item>
            <a-asset-item id="botjim" response-type="arraybuffer" src="https://asset-bundles-prod.reticulum.io/bots/BotJim_Avatar-d28005a687.gltf"></a-asset-item>
            <a-asset-item id="botkev" response-type="arraybuffer" src="https://asset-bundles-prod.reticulum.io/bots/BotKev_Avatar-a95787bb51.gltf"></a-asset-item>
            <a-asset-item id="botpinky" response-type="arraybuffer" src="https://asset-bundles-prod.reticulum.io/bots/BotPinky_Avatar-b0b93f8675.gltf"></a-asset-item>
            <a-asset-item id="botrobert" response-type="arraybuffer" src="https://asset-bundles-prod.reticulum.io/bots/BotRobert_Avatar-e9554880f3.gltf"></a-asset-item>
            <a-asset-item id="botwoody" response-type="arraybuffer" src="https://asset-bundles-prod.reticulum.io/bots/BotWoody_Avatar-0140485a23.gltf"></a-asset-item>

            <a-asset-item id="watch-model" response-type="arraybuffer" src="./assets/hud/watch.glb"></a-asset-item>

            <a-asset-item id="quack" src="./assets/sfx/quack.mp3" response-type="arraybuffer" preload="auto"></a-asset-item>
            <a-asset-item id="specialquack" src="./assets/sfx/specialquack.mp3" response-type="arraybuffer" preload="auto"></a-asset-item>

            <img id="water-normal-map" crossorigin="anonymous" src="./assets/waternormals.jpg">

            <!-- Templates -->
            <template id="video-template">
                <a-entity class="video" geometry="primitive: plane;" material="side: double; shader: flat;" networked-video-player></a-entity>
            </template>

            <template id="remote-avatar-template">
                <a-entity networked-avatar ik-root player-info>
                    <a-entity class="camera"></a-entity>

                    <a-entity class="left-controller"></a-entity>

                    <a-entity class="right-controller"></a-entity>

                    <a-entity class="model" gltf-model-plus="inflate: true">
                        <template data-name="RootScene">
                            <a-entity ik-controller hand-pose__left hand-pose__right animation-mixer space-invader-mesh="meshName: Bot_Skinned"></a-entity>
                        </template>

                        <template data-name="Neck">
                            <a-entity>
                                <a-entity
                                   class="nametag"
                                   billboard
                                   text="side: double; align: center; color: #ddd"
                                   position="0 1 0"
                                   scale="6 6 6"
                               ></a-entity>
                            </a-entity>
                        </template>

                        <template data-name="Chest">
                          <a-entity personal-space-invader="radius: 0.2; useMaterial: true;" bone-visibility>
                            <a-entity billboard>
                              <a-entity mixin="rounded-text-button" block-button visible-while-frozen ui-class-while-frozen position="0 0 .35"> </a-entity>
                              <a-entity visible-while-frozen text="value:Block; width:2.5; align:center;" position="0 0 0.36"></a-entity>
                            </a-entity>
                          </a-entity>
                        </template>

                        <template data-name="Head">
                            <a-entity
                                networked-audio-source
                                networked-audio-analyser
                                personal-space-invader="radius: 0.15; useMaterial: true;"
                                bone-visibility
                            >
                              <a-cylinder
                                  static-body
                                  radius="0.13"
                                  height="0.2"
                                  position="0 0.07 0.05"
                                  visible="false"
                              ></a-cylinder>
                            </a-entity>
                        </template>

                        <template data-name="LeftHand">
                          <a-entity personal-space-invader="radius: 0.1" bone-visibility></a-entity>
                        </template>

                        <template data-name="RightHand">
                          <a-entity personal-space-invader="radius: 0.1" bone-visibility></a-entity>
                        </template>
                    </a-entity>
                </a-entity>
            </template>

            <template id="interactable-media">
                <a-entity
                    class="interactable"
                    super-networked-interactable="counter: #media-counter;"
                    body="type: dynamic; shape: none; mass: 1;"
                    grabbable
                    stretchable="useWorldPosition: true; usePhysics: never"
                    hoverable
                    auto-scale-cannon-physics-body
                    sticky-object="autoLockOnRelease: true; autoLockOnLoad: true;"
                    position-at-box-shape-border="target:.delete-button"
                    destroy-at-extreme-distances
                    rotation
                    activatable__increase-scale="buttonStartEvents: scroll_right; buttonEndEvents: horizontal_scroll_release; activatedState: scaleUp;"
                    activatable__decrease-scale="buttonStartEvents: scroll_left; buttonEndEvents: horizontal_scroll_release; activatedState: scaleDown;"
                >
                    <!-- HACK: rotation component above is required for its side effect of setting YXZ order -->
                    <a-entity class="delete-button" visible-while-frozen>
                        <a-entity mixin="rounded-text-button" remove-networked-object-button position="0 0 0"> </a-entity>
                        <a-entity text=" value:Delete; width:2.5; align:center;" text-raycast-hack position="0 0 0.01"></a-entity>
                    </a-entity>
                </a-entity>
            </template>

            <template id="pen-interactable">
                <a-entity
                    class="interactable toggle"
                    super-networked-interactable="counter: #pen-counter;"
                    body="type: dynamic; shape: none; mass: 1;"
                    grabbable-toggle="maxGrabbers: 1;"
                    sticky-object="autoLockOnRelease: true; autoLockOnLoad: true;"
                    hoverable
                    activatable__draw-hand="buttonStartEvents: secondary_hand_grab; buttonEndEvents: secondary_hand_release;"
                    activatable__draw-cursor="buttonStartEvents: secondary-cursor-grab; buttonEndEvents: secondary-cursor-release;"
                    activatable__color-next="buttonStartEvents: next_color, scroll_right; buttonEndEvents: thumb_up, secondary_hand_release, horizontal_scroll_release; activatedState: colorNext;"
                    activatable__color-prev="buttonStartEvents: previous_color, scroll_left; buttonEndEvents: thumb_up, secondary_hand_release, horizontal_scroll_release; activatedState: colorPrev;"
                    activatable__increase-radius="buttonStartEvents: increase_radius, scroll_up; buttonEndEvents: thumb_up, secondary_hand_release, vertical_scroll_release; activatedState: radiusUp;"
                    activatable__decrease-radius="buttonStartEvents: decrease_radius, scroll_down; buttonEndEvents: thumb_up, secondary_hand_release, vertical_scroll_release; activatedState: radiusDown;"
                    scale="0.5 0.5 0.5"
                >
                    <a-sphere
                        id="pen"
                        scale="1.5, 1.5, 1.5"
                        position="0 -0.18 0"
                        radius="0.02"
                        color="#FF0033"
                        pen="camera: #player-camera; drawingManager: #drawing-manager"
                        segments-width="16"
                        segments-height="12"
                    ></a-sphere>
                    <a-entity class="delete-button" visible-while-frozen>
                        <a-entity mixin="rounded-text-button" remove-networked-object-button position="0 0 0"> </a-entity>
                        <a-entity text=" value:Delete; width:2.5; align:center;" text-raycast-hack position="0 0 0.01"></a-entity>
                    </a-entity>
                </a-entity>
            </template>


            <template id="interactable-drawing">
                <a-entity
                    networked-drawing
                ></a-entity>
            </template>
            <template id="paging-toolbar">
                <a-entity class="paging-toolbar" visible-to-owner>
                    <a-entity class="prev-button" position="-0.3 0 0">
                        <a-entity mixin="rounded-text-button" slice9="width: 0.2"> </a-entity>
                        <a-entity text=" value:<; width:2; align:center;" text-raycast-hack position="0 0 0.01"></a-entity>
                    </a-entity>
                    <a-entity class="page-label" text="width:2; align:center;" text-raycast-hack></a-entity>
                    <a-entity class="next-button" position="0.3 0 0">
                        <a-entity mixin="rounded-text-button" slice9="width: 0.2"> </a-entity>
                        <a-entity text=" value:>; width:2; align:center;" text-raycast-hack position="0 0 0.01"></a-entity>
                    </a-entity>
                </a-entity>
            </template>

            <a-mixin id="rounded-text-button"
                text-button="
                    haptic:#player-right-controller;
                    textHoverColor: #fff;
                    textColor: #fff;
                    backgroundHoverColor: #ea4b54;
                    backgroundColor: #fff;"
                slice9="
                    width: 0.45;
                    height: 0.2;
                    left: 53;
                    top: 53;
                    right: 10;
                    bottom: 10;
                    opacity: 1.3;
                    src: #tooltip"
            ></a-mixin>

            <a-mixin id="controller-super-hands"
                     super-hands="
                         colliderEvent: collisions;
                         colliderEventProperty: els;
                         colliderEndEvent: collisions;
                         colliderEndEventProperty: clearedEls;
                         grabStartButtons: primary_hand_grab, secondary_hand_grab;
                         grabEndButtons: primary_hand_release, secondary_hand_release;
                         stretchStartButtons: primary_hand_grab, secondary_hand_grab;
                         stretchEndButtons: primary_hand_release, secondary_hand_release;
                         dragDropStartButtons: hand_grab, secondary_hand_grab;
                         dragDropEndButtons: hand_release, secondary_hand_release;
                         activateStartButtons: secondary_hand_grab, next_color, previous_color, increase_radius, decrease_radius, scroll_up, scroll_down, scroll_left, scroll_right;
                         activateEndButtons: secondary_hand_release, vertical_scroll_release, horizontal_scroll_release, thumb_up;"
                     collision-filter="collisionForces: false"
                     physics-collider
            ></a-mixin>
        </a-assets>

        <!-- Interactables -->
        <a-entity id="media-counter" networked-counter="max: 10;"></a-entity>

        <a-entity id="pen-counter" networked-counter="max: 10;"></a-entity>

        <a-entity id="drawing-manager" drawing-manager></a-entity>

        <a-entity
            id="cursor-controller"
            cursor-controller="
                cursor: #cursor;
                camera: #player-camera;
                objects: .collidable, .interactable, .ui;"
            line="visible: false; color: white; opacity: 0.2;"
        ></a-entity>

        <a-sphere
            id="cursor"
            material="depthTest: false; opacity:0.9;"
            radius="0.02"
            segments-width="9"
            segments-height="9"
            static-body="shape: sphere;"
            collision-filter="collisionForces: false"
            super-hands="
                colliderEvent: raycaster-intersection;
                colliderEndEvent: raycaster-intersection-cleared;
                grabStartButtons: cursor-grab, primary_hand_grab, secondary_hand_grab;
                grabEndButtons: cursor-release, primary_hand_release, secondary_hand_release;
                stretchStartButtons: cursor-grab, primary_hand_grab, secondary_hand_grab;
                stretchEndButtons: cursor-release, primary_hand_release, secondary_hand_release;
                dragDropStartButtons: cursor-grab, primary_hand_grab, secondary_hand_grab;
                dragDropEndButtons: cursor-release, primary_hand_release, secondary_hand_release;
                activateStartButtons: secondary-cursor-grab, secondary_hand_grab, next_color, previous_color, increase_radius, decrease_radius, scroll_up, scroll_down, scroll_left, scroll_right;
                activateEndButtons: secondary-cursor-release, secondary_hand_release, vertical_scroll_release, horizontal_scroll_release, thumb_up;"
        ></a-sphere>

        <!-- Player Rig -->
        <a-entity
            id="player-rig"
            networked="template: #remote-avatar-template; attachTemplateToLocal: false;"
            spawn-controller="loadedEvent: bundleloaded; target: #environment-root"
            wasd-to-analog2d
            character-controller="pivot: #player-camera"
            ik-root
            player-info
            networked-avatar
            cardboard-controls
        >
          <a-entity
              id="player-hud"
              hud-controller="head: #player-camera;"
              vr-mode-toggle-visibility
              vr-mode-toggle-playing__hud-controller
          >
            <a-entity in-world-hud="haptic:#player-right-controller;raycaster:#player-right-controller;" rotation="30 0 0">
              <a-rounded height="0.13" width="0.48" color="#000000" position="-0.24 -0.065 0" radius="0.065" opacity="0.35" class="hud bg"></a-rounded>
              <a-image icon-button="tooltip: #hud-tooltip; tooltipText: Mute Mic; activeTooltipText: Unmute Mic; image: #mute-off; hoverImage: #mute-off-hover; activeImage: #mute-on; activeHoverImage: #mute-on-hover" scale="0.1 0.1 0.1" position="-0.17 0 0.001" class="ui hud mic" material="alphaTest:0.1;"></a-image>
              <a-image icon-button="tooltip: #hud-tooltip; tooltipText: Pause; activeTooltipText: Resume; image: #freeze-off; hoverImage: #freeze-off-hover; activeImage: #freeze-on; activeHoverImage: #freeze-on-hover" scale="0.2 0.2 0.2" position="0 0 0.005" class="ui hud freeze"></a-image>
              <a-image icon-button="tooltip: #hud-tooltip; tooltipText: Spawn Pen; activeTooltipText: Spawn Pen; image: #spawn-pen; hoverImage: #spawn-pen-hover; activeImage: #spawn-pen; activeHoverImage: #spawn-pen-hover" scale="0.1 0.1 0.1" position="0.17 0 0.001" class="ui hud pen" material="alphaTest:0.1;"></a-image>
              <a-rounded visible="false" id="hud-tooltip" height="0.08" width="0.3" color="#000000" position="-0.15 -0.2 0" rotation="-20 0 0" radius="0.025" opacity="0.35" class="hud bg">
                <a-entity text="value: Mute Mic; align:center;" position="0.15 0.04 0.001" ></a-entity>
              </a-rounded>
            </a-entity>
          </a-entity>

          <a-entity
              id="player-camera"
              class="camera"
              camera
              position="0 1.6 0"
              personal-space-bubble="radius: 0.4;"
              pitch-yaw-rotator
          >
            <a-entity
                id="gaze-teleport"
                position = "0.15 0 0"
                teleport-controls="
                    cameraRig: #player-rig;
                    teleportOrigin: #player-camera;
                    button: gaze-teleport_;
                    collisionEntities: [nav-mesh];
                    drawIncrementally: true;
                    incrementalDrawMs: 600;
                    hitOpacity: 0.3;
                    missOpacity: 0.1;
                    curveShootingSpeed: 12;"
            ></a-entity>
          </a-entity>

          <a-entity
              id="player-left-controller"
              class="left-controller"
              hand-controls2="left"
              tracked-controls
              teleport-controls="
                  cameraRig: #player-rig;
                  teleportOrigin: #player-camera;
                  button: cursor-teleport_;
                  collisionEntities: [nav-mesh];
                  drawIncrementally: true;
                  incrementalDrawMs: 600;
                  hitOpacity: 0.3;
                  missOpacity: 0.1;
                  curveShootingSpeed: 12;"
              haptic-feedback
              body="type: static; shape: none;"
              mixin="controller-super-hands"
              controls-shape-offset
          >
          </a-entity>

          <a-entity
              id="player-right-controller"
              class="right-controller"
              hand-controls2="right"
              tracked-controls
              teleport-controls="
                  cameraRig: #player-rig;
                  teleportOrigin: #player-camera;
                  button: cursor-teleport_;
                  collisionEntities: [nav-mesh];
                  drawIncrementally: true;
                  incrementalDrawMs: 600;
                  hitOpacity: 0.3;
                  missOpacity: 0.1;
                  curveShootingSpeed: 12;"
              haptic-feedback
              event-repeater="events: haptic_pulse; eventSource: #cursor"
              body="type: static; shape: none;"
              mixin="controller-super-hands"
              controls-shape-offset
          >
          </a-entity>

          <a-entity gltf-model-plus="inflate: true;"
                    class="model">
            <template data-name="RootScene">
              <a-entity
                  ik-controller
                  animation-mixer
                  hand-pose__left
                  hand-pose__right
                  hand-pose-controller__left="networkedAvatar:#player-rig;eventSrc:#player-left-controller"
                  hand-pose-controller__right="networkedAvatar:#player-rig;eventSrc:#player-right-controller"
              ></a-entity>
            </template>

            <template data-name="Neck">
              <a-entity>
                <a-entity class="nametag" visible="false" text ></a-entity>
              </a-entity>
            </template>

            <template data-name="Head">
              <a-entity visible="false" bone-visibility></a-entity>
            </template>

            <template data-name="LeftHand">
              <a-entity bone-visibility></a-entity>
            </template>

            <template data-name="RightHand">
              <a-entity bone-visibility></a-entity>
            </template>

          </a-entity>
        </a-entity>

        <!-- Environment -->
        <a-entity
            id="environment-root"
            nav-mesh-helper
            static-body="shape: none;"
        ></a-entity>

        <a-entity
        super-spawner="
            template: #pen-interactable;
            src: https://asset-bundles-prod.reticulum.io/interactables/DrawingPen/DrawingPen-34fb4aee27.gltf;
            spawnEvent: spawn_pen;
            superHand: #player-right-controller;
            cursorSuperHand: #cursor;"
        ></a-entity>
    </a-scene>

    <div id="ui-root"></div>
</body>

</html>