feat: expose attached entity as Stream on GizmoInputHandler
This commit is contained in:
@@ -9,6 +9,8 @@ class _Gizmo {
|
|||||||
final GizmoAsset _gizmo;
|
final GizmoAsset _gizmo;
|
||||||
ThermionEntity? _attachedTo;
|
ThermionEntity? _attachedTo;
|
||||||
|
|
||||||
|
final attachedTo = StreamController<ThermionEntity?>.broadcast();
|
||||||
|
|
||||||
final GizmoType _gizmoType;
|
final GizmoType _gizmoType;
|
||||||
|
|
||||||
_Gizmo(this._gizmo, this.viewer, this._gizmoType);
|
_Gizmo(this._gizmo, this.viewer, this._gizmoType);
|
||||||
@@ -67,6 +69,7 @@ class _Gizmo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_attachedTo = entity;
|
_attachedTo = entity;
|
||||||
|
attachedTo.add(_attachedTo);
|
||||||
|
|
||||||
await viewer.setParent(_gizmo.entity, entity);
|
await viewer.setParent(_gizmo.entity, entity);
|
||||||
await viewer.setTransform(_gizmo.entity, Matrix4.identity());
|
await viewer.setTransform(_gizmo.entity, Matrix4.identity());
|
||||||
@@ -83,6 +86,7 @@ class _Gizmo {
|
|||||||
if (_attachedTo != null) {
|
if (_attachedTo != null) {
|
||||||
await viewer.setParent(_attachedTo!, 0);
|
await viewer.setParent(_attachedTo!, 0);
|
||||||
}
|
}
|
||||||
|
attachedTo.add(null);
|
||||||
_active = null;
|
_active = null;
|
||||||
isVisible = false;
|
isVisible = false;
|
||||||
}
|
}
|
||||||
@@ -205,18 +209,25 @@ class _Gizmo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Apply rotation to the current transform
|
// Apply rotation to the current transform
|
||||||
gizmoTransform = rotationMatrix * gizmoTransform!;
|
gizmoTransform = gizmoTransform! * rotationMatrix;
|
||||||
await viewer.setTransform(_attachedTo!, gizmoTransform!);
|
await viewer.setTransform(_attachedTo!, gizmoTransform!);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class GizmoInputHandler extends InputHandler {
|
class GizmoInputHandler extends InputHandler {
|
||||||
final InputHandler wrapped;
|
final InputHandler wrapped;
|
||||||
|
|
||||||
final ThermionViewer viewer;
|
final ThermionViewer viewer;
|
||||||
|
|
||||||
late final _gizmos = <GizmoType, _Gizmo>{};
|
late final _gizmos = <GizmoType, _Gizmo>{};
|
||||||
|
|
||||||
_Gizmo? active;
|
_Gizmo? active;
|
||||||
|
|
||||||
StreamSubscription? _entityTransformUpdatedListener;
|
StreamSubscription? _entityTransformUpdatedListener;
|
||||||
|
StreamSubscription? _attachedToListener;
|
||||||
|
|
||||||
|
final _attachedTo = StreamController<ThermionEntity?>.broadcast();
|
||||||
|
Stream<ThermionEntity?> get attachedTo => _attachedTo.stream;
|
||||||
|
|
||||||
GizmoType? getGizmoType() {
|
GizmoType? getGizmoType() {
|
||||||
return active?._gizmoType;
|
return active?._gizmoType;
|
||||||
@@ -232,6 +243,7 @@ class GizmoInputHandler extends InputHandler {
|
|||||||
var target = _gizmos[type]!;
|
var target = _gizmos[type]!;
|
||||||
if (target != active) {
|
if (target != active) {
|
||||||
await _entityTransformUpdatedListener?.cancel();
|
await _entityTransformUpdatedListener?.cancel();
|
||||||
|
await _attachedToListener?.cancel();
|
||||||
if (active?._attachedTo != null) {
|
if (active?._attachedTo != null) {
|
||||||
var attachedTo = active!._attachedTo!;
|
var attachedTo = active!._attachedTo!;
|
||||||
await active!.detach();
|
await active!.detach();
|
||||||
@@ -242,6 +254,10 @@ class GizmoInputHandler extends InputHandler {
|
|||||||
active!._onEntityTransformUpdated.stream.listen((event) {
|
active!._onEntityTransformUpdated.stream.listen((event) {
|
||||||
_transformUpdatedController.add(event);
|
_transformUpdatedController.add(event);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_attachedToListener = active!.attachedTo.stream.listen((entity) {
|
||||||
|
_attachedTo.add(entity);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -399,9 +415,4 @@ class GizmoInputHandler extends InputHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// @override
|
|
||||||
// Future setCamera(Camera camera) async {
|
|
||||||
// await wrapped.setCamera(camera);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user