Skip to content
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions fission/src/aps/APS.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import { Mutex } from "async-mutex"
import EventSystem from "@/systems/EventSystem.ts"
import World from "@/systems/World"
import { globalAddToast } from "@/ui/components/GlobalUIControls"

const APS_AUTH_KEY = "aps_auth"
const APS_USER_INFO_KEY = "aps_user_info"

export const APS_USER_INFO_UPDATE_EVENT = "aps_user_info_update"

const CLIENT_ID = "GCxaewcLjsYlK8ud7Ka9AKf9dPwMR3e4GlybyfhAK2zvl3tU"

const ENDPOINT_SYNTHESIS_CODE = `/api/aps/code`
Expand Down Expand Up @@ -135,8 +134,7 @@ class APS {
if (info) {
window.localStorage.setItem(APS_USER_INFO_KEY, JSON.stringify(info))
}

document.dispatchEvent(new Event(APS_USER_INFO_UPDATE_EVENT))
EventSystem.dispatch("APSUserInfoUpdate")
}

/**
Expand Down
67 changes: 19 additions & 48 deletions fission/src/aps/APSDataManagement.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Mutex } from "async-mutex"
import EventSystem from "@/systems/EventSystem.ts"
import { globalAddToast } from "@/ui/components/GlobalUIControls"
import type TaskStatus from "@/util/TaskStatus"
import APS from "./APS"

export const FOLDER_DATA_TYPE = "folders"
Expand Down Expand Up @@ -296,18 +296,16 @@ export async function requestMirabufFiles() {
return
}

mirabufFilesMutex.runExclusive(async () => {
await mirabufFilesMutex.runExclusive(async () => {
const auth = await APS.getAuth()
if (auth) {
getHubs().then(async hubs => {
if (!hubs) {
window.dispatchEvent(
new MirabufFilesStatusUpdateEvent({
isDone: true,
message: "Failed to get Hubs",
progress: 1,
})
)
EventSystem.dispatch("MirabufFilesStatusUpdateEvent", {
isDone: true,
message: "Failed to get Hubs",
progress: 1,
})
return
}
const fileData: Data[] = []
Expand All @@ -324,25 +322,22 @@ export async function requestMirabufFiles() {

if (!projects.length) return
for (const project of projects) {
window.dispatchEvent(
new MirabufFilesStatusUpdateEvent({
isDone: false,
message: `Searching Project '${project.name}'`,
progress: i++ / projects.length,
})
)
EventSystem.dispatch("MirabufFilesStatusUpdateEvent", {
isDone: false,
message: `Searching Project '${project.name}'`,
progress: i++ / projects.length,
})
const data = await searchRootForMira(project)
if (data) fileData.push(...data)
}
window.dispatchEvent(
new MirabufFilesStatusUpdateEvent({
isDone: true,
message: `Found ${fileData.length} file${fileData.length == 1 ? "" : "s"}`,
progress: 1,
})
)
EventSystem.dispatch("MirabufFilesStatusUpdateEvent", {
isDone: true,
message: `Found ${fileData.length} file${fileData.length == 1 ? "" : "s"}`,
progress: 1,
})

mirabufFiles = fileData
window.dispatchEvent(new MirabufFilesUpdateEvent(mirabufFiles))
EventSystem.dispatch("MirabufFilesUpdateEvent", mirabufFiles)
})
}
})
Expand All @@ -351,27 +346,3 @@ export async function requestMirabufFiles() {
export function getMirabufFiles(): Data[] | undefined {
return mirabufFiles
}

export class MirabufFilesUpdateEvent extends Event {
public static readonly EVENT_KEY: string = "MirabufFilesUpdateEvent"

public data: Data[]

public constructor(data: Data[]) {
super(MirabufFilesUpdateEvent.EVENT_KEY)

this.data = data
}
}

export class MirabufFilesStatusUpdateEvent extends Event {
public static readonly EVENT_KEY: string = "MirabufFilesStatusUpdateEvent"

public status: TaskStatus

public constructor(status: TaskStatus) {
super(MirabufFilesStatusUpdateEvent.EVENT_KEY)

this.status = status
}
}
16 changes: 0 additions & 16 deletions fission/src/events/ConfigurationSavedEvent.ts
Original file line number Diff line number Diff line change
@@ -1,16 +0,0 @@
/** An event to save whatever configuration interface is open when it is closed */
export class ConfigurationSavedEvent extends Event {
public constructor() {
super("ConfigurationSaved")

window.dispatchEvent(this)
}

public static listen(func: (e: Event) => void) {
window.addEventListener("ConfigurationSaved", func)
}

public static removeListener(func: (e: Event) => void) {
window.removeEventListener("ConfigurationSaved", func)
}
}
33 changes: 15 additions & 18 deletions fission/src/mirabuf/IntakeSensorSceneObject.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type Jolt from "@azaleacolburn/jolt-physics"
import * as THREE from "three"
import { OnContactPersistedEvent } from "@/systems/physics/ContactEvents"
import EventSystem from "@/systems/EventSystem.ts"
import SceneObject from "@/systems/scene/SceneObject"
import World from "@/systems/World"
import JOLT from "@/util/loading/JoltSyncLoader"
Expand All @@ -19,7 +19,7 @@ class IntakeSensorSceneObject extends SceneObject {
private _deltaTransformation?: THREE.Matrix4

private _joltBodyId?: Jolt.BodyID
private _collision?: (e: OnContactPersistedEvent) => void
private _collisionUnsubscriber?: () => void
private _visualIndicator?: THREE.Mesh

public constructor(parentAssembly: MirabufSceneObject) {
Expand All @@ -45,22 +45,19 @@ class IntakeSensorSceneObject extends SceneObject {
return
}

this._collision = (event: OnContactPersistedEvent) => {
if (this._parentAssembly.intakeActive) {
if (this._joltBodyId && !World.physicsSystem.isPaused) {
const body1 = event.message.body1
const body2 = event.message.body2

if (body1.GetIndexAndSequenceNumber() == this._joltBodyId.GetIndexAndSequenceNumber()) {
this.intakeCollision(body2)
} else if (body2.GetIndexAndSequenceNumber() == this._joltBodyId.GetIndexAndSequenceNumber()) {
this.intakeCollision(body1)
}
}
}
}
this._collisionUnsubscriber = EventSystem.listen("OnContactPersistedEvent", data => {
if (!this._parentAssembly.intakeActive || this._joltBodyId == null || World.physicsSystem.isPaused)
return

const body1 = data.body1
const body2 = data.body2

OnContactPersistedEvent.addListener(this._collision)
if (body1.GetIndexAndSequenceNumber() == this._joltBodyId.GetIndexAndSequenceNumber()) {
this.intakeCollision(body2)
} else if (body2.GetIndexAndSequenceNumber() == this._joltBodyId.GetIndexAndSequenceNumber()) {
this.intakeCollision(body1)
}
})
}

// Create visual indicator if showZoneAlways is enabled
Expand Down Expand Up @@ -120,7 +117,7 @@ class IntakeSensorSceneObject extends SceneObject {
World.physicsSystem.destroyBodyIds(this._joltBodyId)
}

if (this._collision) OnContactPersistedEvent.removeListener(this._collision)
this._collisionUnsubscriber?.()

// Clean up visual indicator
if (this._visualIndicator) {
Expand Down
13 changes: 6 additions & 7 deletions fission/src/mirabuf/MirabufSceneObject.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type Jolt from "@azaleacolburn/jolt-physics"
import * as THREE from "three"
import type { mirabuf } from "@/proto/mirabuf"
import { OnContactAddedEvent } from "@/systems/physics/ContactEvents"
import EventSystem from "@/systems/EventSystem.ts"
import type Mechanism from "@/systems/physics/Mechanism"
import { BodyAssociate, type LayerReserve } from "@/systems/physics/PhysicsSystem"
import PreferencesSystem from "@/systems/preferences/PreferencesSystem"
Expand Down Expand Up @@ -105,7 +105,7 @@ class MirabufSceneObject extends SceneObject implements ContextSupplier {
private _lastEjectableToastTime = 0
private static readonly EJECTABLE_TOAST_COOLDOWN_MS = 500

private _collision?: (event: OnContactAddedEvent) => void
private _collisionUnsubscriber?: () => void
private _cacheId?: string

public get intakeActive() {
Expand Down Expand Up @@ -230,17 +230,15 @@ class MirabufSceneObject extends SceneObject implements ContextSupplier {
)

// Detects when something collides with the robot
this._collision = (event: OnContactAddedEvent) => {
const body1 = event.message.body1
const body2 = event.message.body2
this._collisionUnsubscriber = EventSystem.listen("OnContactAddedEvent", data => {
const { body1, body2 } = data

if (body1.GetIndexAndSequenceNumber() === this.getRootNodeId()?.GetIndexAndSequenceNumber()) {
this.recordRobotCollision(body2)
} else if (body2.GetIndexAndSequenceNumber() === this.getRootNodeId()?.GetIndexAndSequenceNumber()) {
this.recordRobotCollision(body1)
}
}
OnContactAddedEvent.addListener(this._collision)
})

// Center of Mass Indicator
const material = new THREE.MeshBasicMaterial({
Expand Down Expand Up @@ -421,6 +419,7 @@ class MirabufSceneObject extends SceneObject implements ContextSupplier {
;(x.colliderMesh.material as THREE.Material).dispose()
;(x.comMesh.material as THREE.Material).dispose()
})
this._collisionUnsubscriber?.()
this._debugBodies?.clear()
this._physicsLayerReserve?.release()
if (this._centerOfMassIndicator) {
Expand Down
45 changes: 21 additions & 24 deletions fission/src/mirabuf/ProtectedZoneSceneObject.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import Jolt from "@azaleacolburn/jolt-physics"
import * as THREE from "three"
import EventSystem, { type SynthesisEventListener } from "@/systems/EventSystem.ts"
import MatchMode from "@/systems/match_mode/MatchMode"
import { MatchModeType } from "@/systems/match_mode/MatchModeTypes"
import { OnContactAddedEvent, OnContactPersistedEvent, OnContactRemovedEvent } from "@/systems/physics/ContactEvents"
import PreferencesSystem from "@/systems/preferences/PreferencesSystem"
import type { ProtectedZonePreferences } from "@/systems/preferences/PreferenceTypes"
import SceneObject from "@/systems/scene/SceneObject"
Expand Down Expand Up @@ -50,8 +50,7 @@ class ProtectedZoneSceneObject extends SceneObject {
private _prefs?: ProtectedZonePreferences
private _joltBodyId?: Jolt.BodyID
private _mesh?: THREE.Mesh
private _collision?: (event: OnContactAddedEvent | OnContactPersistedEvent) => void
private _collisionRemoved?: (event: OnContactRemovedEvent) => void
private _unsubscribers: (() => void)[] = []

private _robotsInside: Map<MirabufSceneObject, number> = new Map()

Expand Down Expand Up @@ -122,9 +121,10 @@ class ProtectedZoneSceneObject extends SceneObject {
}

// Detect when something enters or persists in the zone
this._collision = (event: OnContactAddedEvent | OnContactPersistedEvent) => {
const body1 = event.message.body1
const body2 = event.message.body2
const collisionSubscriber: SynthesisEventListener<
"OnContactAddedEvent" | "OnContactPersistedEvent"
> = data => {
const { body1, body2 } = data

if (body1.GetIndexAndSequenceNumber() == this._joltBodyId?.GetIndexAndSequenceNumber()) {
this.zoneCollision(body2)
Expand All @@ -136,21 +136,22 @@ class ProtectedZoneSceneObject extends SceneObject {
if (this._prefs?.contactType == ContactType.ROBOT_ENTERS || !this.isZoneActive()) return
this.handleContactPenalty(body1, body2)
}
OnContactAddedEvent.addListener(this._collision)
OnContactPersistedEvent.addListener(this._collision)
this._unsubscribers.push(EventSystem.listen("OnContactAddedEvent", collisionSubscriber))
this._unsubscribers.push(EventSystem.listen("OnContactPersistedEvent", collisionSubscriber))

// Detects when something leaves the zone
this._collisionRemoved = (event: OnContactRemovedEvent) => {
const body1 = event.message.GetBody1ID()
const body2 = event.message.GetBody2ID()

if (body1.GetIndexAndSequenceNumber() == this._joltBodyId?.GetIndexAndSequenceNumber()) {
this.zoneCollisionRemoved(body2)
} else if (body2.GetIndexAndSequenceNumber() == this._joltBodyId?.GetIndexAndSequenceNumber()) {
this.zoneCollisionRemoved(body1)
}
}
OnContactRemovedEvent.addListener(this._collisionRemoved)
this._unsubscribers.push(
EventSystem.listen("OnContactRemovedEvent", ({ message }) => {
const body1 = message.GetBody1ID()
const body2 = message.GetBody2ID()

if (body1.GetIndexAndSequenceNumber() == this._joltBodyId?.GetIndexAndSequenceNumber()) {
this.zoneCollisionRemoved(body2)
} else if (body2.GetIndexAndSequenceNumber() == this._joltBodyId?.GetIndexAndSequenceNumber()) {
this.zoneCollisionRemoved(body1)
}
})
)
}
}
}
Expand Down Expand Up @@ -198,11 +199,7 @@ class ProtectedZoneSceneObject extends SceneObject {
}
}

if (this._collision) {
OnContactAddedEvent.removeListener(this._collision)
OnContactPersistedEvent.removeListener(this._collision)
}
if (this._collisionRemoved) OnContactRemovedEvent.removeListener(this._collisionRemoved)
this._unsubscribers.forEach(func => func())
}

private zoneCollision(collisionID: Jolt.BodyID) {
Expand Down
Loading
Loading