Skip to content

Commit ef190e2

Browse files
Julien Moreau-Mathisjulien-moreau
authored andcommitted
feat: improve "focus object" to handle sounds and particle systems
1 parent 52b9d89 commit ef190e2

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

editor/src/editor/dialogs/command-palette/command-palette.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,11 @@ export class CommandPalette extends Component<ICommandPaletteProps, ICommandPale
134134
private _refreshEntities(): void {
135135
const scene = this.props.editor.layout.preview.scene;
136136

137-
const objects = [...scene.meshes, ...scene.lights, ...scene.cameras, ...scene.particleSystems, ...(scene.sounds ?? [])] as (Node | IParticleSystem | Sound)[];
137+
const objects = [...scene.meshes, ...scene.lights, ...scene.cameras, ...scene.particleSystems] as (Node | IParticleSystem | Sound)[];
138+
scene.soundTracks?.forEach((soundTrack) => {
139+
objects.push(...soundTrack.soundCollection);
140+
});
141+
138142
const entities = objects.map(
139143
(entity) =>
140144
({

editor/src/editor/layout/graph/label.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { DragEvent, useEffect, useRef, useState } from "react";
55
import { FaLock } from "react-icons/fa";
66
import { useEventListener } from "usehooks-ts";
77

8-
import { Node, TransformNode, AbstractMesh } from "babylonjs";
8+
import { Node, TransformNode, AbstractMesh, Vector3 } from "babylonjs";
99

1010
import { Input } from "../../../ui/shadcn/ui/input";
1111

@@ -152,6 +152,7 @@ export function EditorGraphLabel(props: IEditorGraphLabelProps) {
152152

153153
n.nodeData.detachFromMesh();
154154
n.nodeData.spatialSound = false;
155+
n.nodeData.setPosition(Vector3.Zero());
155156
return (n.nodeData["_connectedTransformNode"] = null);
156157
}
157158

@@ -180,6 +181,7 @@ export function EditorGraphLabel(props: IEditorGraphLabelProps) {
180181
if (isScene(newParent)) {
181182
n.nodeData.detachFromMesh();
182183
n.nodeData.spatialSound = false;
184+
n.nodeData.setPosition(Vector3.Zero());
183185
return (n.nodeData["_connectedTransformNode"] = null);
184186
}
185187
}

editor/src/editor/layout/preview.tsx

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,18 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from ".
3939

4040
import { Editor } from "../main";
4141

42+
import { isSound } from "../../tools/guards/sound";
4243
import { Tween } from "../../tools/animation/tween";
44+
import { isVector3 } from "../../tools/guards/math";
4345
import { isNodeLocked } from "../../tools/node/metadata";
4446
import { registerUndoRedo } from "../../tools/undoredo";
4547
import { initializeHavok } from "../../tools/physics/init";
48+
import { isAnyParticleSystem } from "../../tools/guards/particles";
4649
import { onTextureAddedObservable } from "../../tools/observables";
4750
import { waitNextAnimationFrame, waitUntil } from "../../tools/tools";
4851
import { checkProjectCachedCompressedTextures } from "../../tools/ktx/check";
4952
import { createSceneLink, getRootSceneLink } from "../../tools/scene/scene-link";
50-
import { isAbstractMesh, isCamera, isCollisionInstancedMesh, isCollisionMesh, isInstancedMesh, isMesh, isTransformNode } from "../../tools/guards/nodes";
53+
import { isAbstractMesh, isCamera, isCollisionInstancedMesh, isCollisionMesh, isInstancedMesh, isLight, isMesh, isTransformNode } from "../../tools/guards/nodes";
5154
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from "../../ui/shadcn/ui/dropdown-menu";
5255

5356
import { EditorCamera } from "../nodes/camera";
@@ -328,9 +331,29 @@ export class EditorPreview extends Component<IEditorPreviewProps, IEditorPreview
328331
return;
329332
}
330333

331-
const position = isCamera(selectedNode) ? selectedNode.globalPosition : selectedNode.getAbsolutePosition?.();
334+
let position: Vector3 | undefined;
335+
if (isCamera(selectedNode)) {
336+
position = selectedNode.globalPosition;
337+
} else if (isAbstractMesh(selectedNode) || isLight(selectedNode) || isTransformNode(selectedNode)) {
338+
position = selectedNode.getAbsolutePosition();
339+
} else if (isAnyParticleSystem(selectedNode)) {
340+
if (isAbstractMesh(selectedNode.emitter)) {
341+
position = selectedNode.emitter.getAbsolutePosition();
342+
} else if (isVector3(selectedNode.emitter)) {
343+
position = selectedNode.emitter;
344+
}
345+
} else if (isSound(selectedNode)) {
346+
const soundPosition = selectedNode["_position"] as Vector3;
347+
348+
if (selectedNode["_connectedTransformNode"]) {
349+
position = selectedNode["_connectedTransformNode"].getAbsolutePosition();
350+
} else if (!soundPosition.equalsToFloats(0, 0, 0)) {
351+
position = selectedNode["_position"]();
352+
}
353+
}
332354

333355
const camera = this.scene.activeCamera;
356+
334357
if (position && camera) {
335358
Tween.create(camera, 0.5, {
336359
target: position,

0 commit comments

Comments
 (0)