Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
43 changes: 8 additions & 35 deletions fission/src/mirabuf/MirabufSceneObject.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import type {
UpdateObjectData,
} from "@/systems/multiplayer/types"
import { BodyAssociate } from "@/systems/physics/BodyAssociate.ts"
import { OnContactAddedEvent } from "@/systems/physics/ContactEvents"
import EventSystem from "@/systems/EventSystem.ts"
import type Mechanism from "@/systems/physics/Mechanism"
import type { LayerReserve } from "@/systems/physics/PhysicsSystem"
import PreferencesSystem from "@/systems/preferences/PreferencesSystem"
Expand Down Expand Up @@ -117,7 +117,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

public get scoringZones(): Readonly<ScoringZoneSceneObject[]> {
return this._scoringZones
Expand Down Expand Up @@ -267,17 +267,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 @@ -353,7 +351,7 @@ class MirabufSceneObject extends SceneObject implements ContextSupplier {
cameraControls.focusProvider = this
}

MirabufObjectChangeEvent.dispatch(this)
EventSystem.dispatch("MirabufObjectChangeEvent", this)
}

// Centered in xz plane, bottom surface of object
Expand Down Expand Up @@ -462,6 +460,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 All @@ -472,7 +471,7 @@ class MirabufSceneObject extends SceneObject implements ContextSupplier {
if (this._brain && this._brain instanceof SynthesisBrain) {
this._brain.clearControls()
}
MirabufObjectChangeEvent.dispatch(null)
EventSystem.dispatch("MirabufObjectChangeEvent", null)
}

public eject() {
Expand Down Expand Up @@ -1125,29 +1124,3 @@ export class RigidNodeAssociate extends BodyAssociate {
}

export default MirabufSceneObject

export class MirabufObjectChangeEvent extends Event {
private static _eventKey = "MirabufObjectChange"
private _obj: MirabufSceneObject | null

private constructor(obj: MirabufSceneObject | null) {
super(MirabufObjectChangeEvent._eventKey)
this._obj = obj
}

public static addEventListener(cb: (object: MirabufSceneObject | null) => void): () => void {
const listener = (event: Event) => {
if (event instanceof MirabufObjectChangeEvent) {
cb(event._obj)
} else {
cb(null)
}
}
window.addEventListener(this._eventKey, listener)
return () => window.removeEventListener(this._eventKey, listener)
}

public static dispatch(obj: MirabufSceneObject | null) {
window.dispatchEvent(new MirabufObjectChangeEvent(obj))
}
}
45 changes: 21 additions & 24 deletions fission/src/mirabuf/ProtectedZoneSceneObject.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
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 ScoreTracker from "@/systems/match_mode/ScoreTracker"
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