Skip to content

Commit b21585c

Browse files
Utility Methods for Finding MirabufSceneObjects [AARD-2048] (#1256)
Co-authored-by: Zach Rutman <92497727+rutmanz@users.noreply.github.com>
2 parents ef8121a + 3aec44b commit b21585c

24 files changed

+119
-163
lines changed

fission/forge.config.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import type { ForgeConfig } from "@electron-forge/shared-types"
1+
import { FuseV1Options, FuseVersion } from "@electron/fuses"
22
import { MakerSquirrel } from "@electron-forge/maker-squirrel"
33
import { MakerZIP } from "@electron-forge/maker-zip"
4-
import { VitePlugin } from "@electron-forge/plugin-vite"
54
import { FusesPlugin } from "@electron-forge/plugin-fuses"
6-
import { FuseV1Options, FuseVersion } from "@electron/fuses"
5+
import { VitePlugin } from "@electron-forge/plugin-vite"
6+
import type { ForgeConfig } from "@electron-forge/shared-types"
77
import path from "path"
88

99
const config: ForgeConfig = {

fission/src/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { app, BrowserWindow } from "electron"
21
import path from "node:path"
2+
import { app, BrowserWindow } from "electron"
33
import started from "electron-squirrel-startup"
44

55
// Handle creating/removing shortcuts on Windows when installing/uninstalling.

fission/src/mirabuf/EjectableSceneObject.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,7 @@ class EjectableSceneObject extends SceneObject {
8080
World.physicsSystem.disablePhysicsForBody(this._gamePieceBodyId)
8181

8282
// Remove from any scoring zones
83-
const zones = [...World.sceneRenderer.sceneObjects.entries()]
84-
.filter(x => x[1] instanceof ScoringZoneSceneObject)
85-
.map(x => x[1]) as ScoringZoneSceneObject[]
86-
83+
const zones = World.sceneRenderer.filterSceneObjects(x => x instanceof ScoringZoneSceneObject)
8784
zones.forEach(x => {
8885
if (this._gamePieceBodyId) ScoringZoneSceneObject.removeGamepiece(x, this._gamePieceBodyId)
8986
})

fission/src/systems/World.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ class World {
119119
World._analyticsSystem?.update(this._currentDeltaT)
120120
World._performanceMonitorSystem?.update(this._currentDeltaT)
121121

122-
RobotDimensionTracker.update(World._sceneRenderer)
123-
RobotPositionTracker.update(World._sceneRenderer)
122+
RobotDimensionTracker.update()
123+
RobotPositionTracker.update()
124124
}
125125

126126
public static get currentDeltaT(): number {

fission/src/systems/match_mode/MatchMode.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ import SimulationSystem from "../simulation/SimulationSystem"
99
import { SoundPlayer } from "../sound/SoundPlayer"
1010
import {
1111
DEFAULT_AUTONOMOUS_TIME,
12-
DEFAULT_TELEOP_TIME,
1312
DEFAULT_ENDGAME_TIME,
13+
DEFAULT_HEIGHT_LIMIT_PENALTY,
1414
DEFAULT_IGNORE_ROTATION,
1515
DEFAULT_MAX_HEIGHT,
16-
DEFAULT_HEIGHT_LIMIT_PENALTY,
17-
DEFAULT_SIDE_MAX_EXTENSION,
1816
DEFAULT_SIDE_EXTENSION_PENALTY,
17+
DEFAULT_SIDE_MAX_EXTENSION,
18+
DEFAULT_TELEOP_TIME,
1919
MatchModeType,
2020
} from "./MatchModeTypes"
2121
import RobotDimensionTracker from "./RobotDimensionTracker"

fission/src/systems/match_mode/RobotDimensionTracker.ts

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
import { MiraType } from "@/mirabuf/MirabufLoader"
2-
import MirabufSceneObject from "@/mirabuf/MirabufSceneObject"
31
import SimulationSystem from "@/systems/simulation/SimulationSystem"
4-
import World from "@/systems/World"
5-
import type SceneRenderer from "../scene/SceneRenderer"
2+
import World from "@/systems/World.ts"
63
import MatchMode from "./MatchMode"
74

85
const BUFFER_HEIGHT = 0.1
@@ -31,14 +28,10 @@ class RobotDimensionTracker {
3128
this._sideExtensionPenalty = sideExtensionPenalty
3229
}
3330

34-
public static update(sceneRenderer: SceneRenderer): void {
31+
public static update(): void {
3532
if (!MatchMode.getInstance().isMatchEnabled()) return
3633

37-
const robots = [...sceneRenderer.sceneObjects.values()].filter(
38-
(obj): obj is MirabufSceneObject => obj instanceof MirabufSceneObject && obj.miraType === MiraType.ROBOT
39-
)
40-
41-
robots.forEach(robot => {
34+
World.sceneRenderer.mirabufSceneObjects.getRobots().forEach(robot => {
4235
const dimensions = this._ignoreRotation ? robot.getDimensionsWithoutRotation() : robot.getDimensions()
4336

4437
if (dimensions.height > this._maxHeight + BUFFER_HEIGHT) {
@@ -69,11 +62,7 @@ class RobotDimensionTracker {
6962
this._robotSize.clear()
7063
this._robotLastFramePenalty.clear()
7164

72-
const robots = [...World.sceneRenderer.sceneObjects.values()].filter(
73-
(obj): obj is MirabufSceneObject => obj instanceof MirabufSceneObject && obj.miraType === MiraType.ROBOT
74-
)
75-
76-
robots.forEach(robot => {
65+
World.sceneRenderer.mirabufSceneObjects.getRobots().forEach(robot => {
7766
this._robotSize.set(robot.id, robot.getDimensions())
7867
})
7968
}

fission/src/systems/scene/CameraControls.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as THREE from "three"
22
import { MiraType } from "@/mirabuf/MirabufLoader"
3-
import MirabufSceneObject from "@/mirabuf/MirabufSceneObject"
3+
import type MirabufSceneObject from "@/mirabuf/MirabufSceneObject"
44
import PreferencesSystem from "@/systems/preferences/PreferencesSystem"
55
import World from "../World"
66
import type ScreenInteractionHandler from "./ScreenInteractionHandler"
@@ -171,15 +171,12 @@ export class CustomOrbitControls extends CameraControls {
171171
* Prioritizes robots first, then fields, then any other MirabufSceneObject.
172172
*/
173173
private findFallbackFocus(mirabufObjects?: MirabufSceneObject[]): MirabufSceneObject | undefined {
174-
if (!mirabufObjects) {
175-
const sceneObjects = Array.from(World.sceneRenderer.sceneObjects.values())
176-
mirabufObjects = sceneObjects.filter(obj => obj instanceof MirabufSceneObject) as MirabufSceneObject[]
177-
}
174+
mirabufObjects ??= World.sceneRenderer.mirabufSceneObjects.getAll()
178175

179176
const robots = mirabufObjects.filter(obj => obj.miraType === MiraType.ROBOT)
180177
const fields = mirabufObjects.filter(obj => obj.miraType === MiraType.FIELD)
181178

182-
return robots[0] || fields[0] || mirabufObjects[0]
179+
return robots[0] ?? fields[0] ?? mirabufObjects[0]
183180
}
184181

185182
/**
@@ -190,9 +187,7 @@ export class CustomOrbitControls extends CameraControls {
190187
if (!World.sceneRenderer?.sceneObjects || World.dragModeSystem.isTransitioning) {
191188
return
192189
}
193-
194-
const allSceneObjects = Array.from(World.sceneRenderer.sceneObjects.values())
195-
const mirabufObjects = allSceneObjects.filter(obj => obj instanceof MirabufSceneObject) as MirabufSceneObject[]
190+
const mirabufObjects = World.sceneRenderer.mirabufSceneObjects.getAll()
196191

197192
if (this._focusProvider) {
198193
if (!mirabufObjects.includes(this._focusProvider)) {

fission/src/systems/scene/DragModeSystem.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import type Jolt from "@azaleacolburn/jolt-physics"
22
import * as THREE from "three"
33
import { MiraType } from "@/mirabuf/MirabufLoader"
4-
import MirabufSceneObject, { type RigidNodeAssociate } from "@/mirabuf/MirabufSceneObject"
4+
import type MirabufSceneObject from "@/mirabuf/MirabufSceneObject"
5+
import type { RigidNodeAssociate } from "@/mirabuf/MirabufSceneObject"
56
import InputSystem from "@/systems/input/InputSystem.ts"
67
import JOLT from "@/util/loading/JoltSyncLoader"
78
import { convertJoltVec3ToThreeVector3, convertThreeVector3ToJoltVec3 } from "@/util/TypeConversions"
@@ -242,7 +243,7 @@ class DragModeSystem extends WorldSystem {
242243
const hitResult = this.raycastFromMouse(interaction.position)
243244
if (hitResult) {
244245
const association = World.physicsSystem.getBodyAssociation(hitResult.data.mBodyID) as RigidNodeAssociate
245-
if (association?.sceneObject && association.sceneObject instanceof MirabufSceneObject) {
246+
if (association?.sceneObject) {
246247
const body = World.physicsSystem.getBody(hitResult.data.mBodyID)
247248
if (body) {
248249
const isStatic = body.GetMotionType() === JOLT.EMotionType_Static

fission/src/systems/scene/SceneRenderer.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,18 @@ class SceneRenderer extends WorldSystem {
5555
return this._sceneObjects
5656
}
5757

58+
public filterSceneObjects<T extends SceneObject>(predicate: (obj: SceneObject) => obj is T): T[] {
59+
return [...this._sceneObjects.values()].filter(predicate)
60+
}
61+
62+
public readonly mirabufSceneObjects = {
63+
getAll: () => this.filterSceneObjects(obj => obj instanceof MirabufSceneObject),
64+
findWhere: (predicate: Parameters<(typeof Array<MirabufSceneObject>)["prototype"]["find"]>[0]) =>
65+
this.mirabufSceneObjects.getAll().find(predicate),
66+
getField: () => this.mirabufSceneObjects.findWhere(obj => obj.miraType == MiraType.FIELD),
67+
getRobots: () => this.mirabufSceneObjects.getAll().filter(obj => obj.miraType == MiraType.ROBOT),
68+
} as const
69+
5870
public get mainCamera() {
5971
return this._mainCamera
6072
}
@@ -514,9 +526,9 @@ class SceneRenderer extends WorldSystem {
514526
*/
515527
public onContextMenu(e: InteractionEnd) {
516528
// Cast ray into physics scene.
517-
const origin = World.sceneRenderer.mainCamera.position
529+
const origin = this.mainCamera.position
518530

519-
const worldSpace = World.sceneRenderer.pixelToWorldSpace(e.position[0], e.position[1])
531+
const worldSpace = this.pixelToWorldSpace(e.position[0], e.position[1])
520532
const dir = worldSpace.sub(origin).normalize().multiplyScalar(40.0)
521533

522534
const res = World.physicsSystem.rayCast(

fission/src/systems/simulation/RobotPositionTracker.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,15 @@
11
import * as THREE from "three"
2-
import { MiraType } from "@/mirabuf/MirabufLoader"
3-
import MirabufSceneObject from "@/mirabuf/MirabufSceneObject"
42
import SimulationSystem from "@/systems/simulation/SimulationSystem"
53
import JOLT from "@/util/loading/JoltSyncLoader"
64
import { convertJoltMat44ToThreeMatrix4 } from "@/util/TypeConversions"
7-
import type SceneRenderer from "../scene/SceneRenderer"
85
import World from "../World"
96

107
class RobotPositionTracker {
118
private static _mapBoundaryY: number = -4
129
private static _offMapPenalty: number = 0
1310

14-
public static update(sceneRenderer: SceneRenderer): void {
15-
const robots = [...sceneRenderer.sceneObjects.values()].filter(
16-
(obj): obj is MirabufSceneObject => obj instanceof MirabufSceneObject && obj.miraType === MiraType.ROBOT
17-
)
18-
19-
robots.forEach(robot => {
11+
public static update(): void {
12+
World.sceneRenderer.mirabufSceneObjects.getRobots().forEach(robot => {
2013
const rootNodeId = robot.getRootNodeId()
2114
if (!rootNodeId) {
2215
return

0 commit comments

Comments
 (0)