Skip to content

Commit

Permalink
Add link initialization support
Browse files Browse the repository at this point in the history
  • Loading branch information
keianhzo committed Aug 9, 2023
1 parent 9a74ea6 commit 73a2743
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 14 deletions.
1 change: 1 addition & 0 deletions src/bit-components.js
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,7 @@ export const Link = defineComponent({
type: Types.ui8
});
Link.url[$isStringType] = true;
export const LinkInitializing = defineComponent();
// TODO: Store this data elsewhere, since only one or two will ever exist.
export const PDFMenu = defineComponent({
prevButtonRef: Types.eid,
Expand Down
26 changes: 20 additions & 6 deletions src/bit-systems/link-hover-menu.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
import { defineQuery, entityExists } from "bitecs";
import { Not, defineQuery, entityExists } from "bitecs";
import type { HubsWorld } from "../app";
import { Link, LinkHoverMenu, HoveredRemoteRight, TextTag, Interacted, LinkHoverMenuItem } from "../bit-components";
import {
Link,
LinkHoverMenu,
HoveredRemoteRight,
TextTag,
Interacted,
LinkHoverMenuItem,
LinkInitializing
} from "../bit-components";
import { findAncestorWithComponent, findChildWithComponent } from "../utils/bit-utils";
import { hubIdFromUrl } from "../utils/media-url-utils";
import { Text as TroikaText } from "troika-three-text";
Expand All @@ -11,7 +19,8 @@ import { setMatrixWorld } from "../utils/three-utils";
import { LinkType } from "../inflators/link";

const menuQuery = defineQuery([LinkHoverMenu]);
const hoveredLinksQuery = defineQuery([HoveredRemoteRight, Link]);
const hoveredLinksQuery = defineQuery([HoveredRemoteRight, Link, Not(LinkInitializing)]);
const hoveredMenuItemQuery = defineQuery([HoveredRemoteRight, LinkHoverMenuItem]);
const clickedMenuItemQuery = defineQuery([Interacted, LinkHoverMenuItem]);

function updateLinkMenuTarget(world: HubsWorld, menu: EntityID, sceneIsFrozen: boolean) {
Expand All @@ -24,9 +33,14 @@ function updateLinkMenuTarget(world: HubsWorld, menu: EntityID, sceneIsFrozen: b
LinkHoverMenu.targetObjectRef[menu] = 0;
}

const hoveredLinks = hoveredLinksQuery(world);
if (hoveredLinks.length > 0) {
LinkHoverMenu.targetObjectRef[menu] = hoveredLinks[0];
const hoveredLink = hoveredLinksQuery(world);
if (hoveredLink.length > 0) {
LinkHoverMenu.targetObjectRef[menu] = hoveredLink[0];
LinkHoverMenu.clearTargetTimer[menu] = world.time.elapsed + 1000;
}

const hoveredMenuItem = hoveredMenuItemQuery(world);
if (hoveredMenuItem.length > 0) {
LinkHoverMenu.clearTargetTimer[menu] = world.time.elapsed + 1000;
}

Expand Down
15 changes: 8 additions & 7 deletions src/bit-systems/link-system.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { defineQuery, enterQuery, exitQuery } from "bitecs";
import { defineQuery, enterQuery, exitQuery, removeComponent } from "bitecs";
import type { HubsWorld } from "../app";
import { Link } from "../bit-components";
import { Link, LinkInitializing } from "../bit-components";
import { isHubsRoomUrl, isLocalHubsAvatarUrl, isLocalHubsSceneUrl, isLocalHubsUrl } from "../utils/media-url-utils";
import { LinkType } from "../inflators/link";
import { JobRunner } from "../utils/coroutine-utils";
import { EntityID } from "../utils/networking-types";

const linkQuery = defineQuery([Link]);
const linkEnterQuery = enterQuery(linkQuery);
const linkExitQuery = exitQuery(linkQuery);
const linkInitializingQuery = defineQuery([LinkInitializing, Link]);
const linkInitializingEnterQuery = enterQuery(linkInitializingQuery);
const linkInitializingExitQuery = exitQuery(linkInitializingQuery);

function* updateLinkType(world: HubsWorld, eid: EntityID) {
const mayChangeScene = (APP.scene?.systems as any).permissions.canOrWillIfCreator("update_hub");
Expand All @@ -28,15 +28,16 @@ function* updateLinkType(world: HubsWorld, eid: EntityID) {
Link.type[eid] = LinkType.ROOM_URL;
}
}
removeComponent(world, LinkInitializing, eid);
}

const jobs = new JobRunner();
export function linkSystem(world: HubsWorld) {
linkEnterQuery(world).forEach(eid => {
linkInitializingEnterQuery(world).forEach(eid => {
jobs.stop(eid);
jobs.add(eid, () => updateLinkType(world, eid));
});
linkExitQuery(world).forEach(eid => {
linkInitializingExitQuery(world).forEach(eid => {
jobs.stop(eid);
});
jobs.tick();
Expand Down
3 changes: 2 additions & 1 deletion src/inflators/link.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { addComponent } from "bitecs";
import { Link } from "../bit-components";
import { Link, LinkInitializing } from "../bit-components";
import { HubsWorld } from "../app";

export enum LinkType {
Expand All @@ -17,6 +17,7 @@ export type LinkParams = {
};

export function inflateLink(world: HubsWorld, eid: number, params: LinkParams): number {
addComponent(world, LinkInitializing, eid);
addComponent(world, Link, eid);
Link.url[eid] = APP.getSid(params.href);
Link.type[eid] = params.type !== undefined ? params.type : LinkType.LINK;
Expand Down

0 comments on commit 73a2743

Please sign in to comment.