From 7cf1468f3857a7d2a13aa3a4085464dfd5fafea8 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 12 Dec 2024 22:00:41 +0800 Subject: [PATCH] feat: more rotation gizmo improvements --- assets/rotation_gizmo.glb | Bin 163152 -> 156056 bytes .../implementations/gizmo_input_handler.dart | 119 +- .../include/resources/rotation_gizmo_glb.S | 2 +- .../resources/rotation_gizmo_glb.apple.S | 2 +- .../include/resources/rotation_gizmo_glb.bin | Bin 163152 -> 156056 bytes .../include/resources/rotation_gizmo_glb.c | 15397 ++++++++-------- thermion_dart/native/include/scene/Gizmo.hpp | 9 +- thermion_dart/native/src/scene/Gizmo.cpp | 37 +- thermion_dart/test/gizmo_tests.dart | 79 +- 9 files changed, 7697 insertions(+), 7948 deletions(-) diff --git a/assets/rotation_gizmo.glb b/assets/rotation_gizmo.glb index 6518c74c54b8173ca024a3a4900d380f54a1e87c..e461406430b3cc2d7353af32064e524c9a2b8dda 100644 GIT binary patch delta 30474 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 forType(ThermionViewer viewer, GizmoType type) async { + final view = await viewer.getViewAt(0); + return _Gizmo(await viewer.createGizmo(view, type), viewer, type); + } final _onEntityTransformUpdated = StreamController< ({ThermionEntity entity, Matrix4 transform})>.broadcast(); @@ -18,19 +24,18 @@ class _Gizmo { Axis? _active; Axis? get active => _active; - double _getAngleBetweenVectors(Vector2 v1, Vector2 v2) { // Normalize vectors to ensure consistent rotation regardless of distance from center v1.normalize(); v2.normalize(); - + // Calculate angle using atan2 double angle = atan2(v2.y, v2.x) - atan2(v1.y, v1.x); - + // Ensure angle is between -π and π if (angle > pi) angle -= 2 * pi; if (angle < -pi) angle += 2 * pi; - + return angle; } @@ -87,9 +92,9 @@ class _Gizmo { return; } - if (type == GizmoType.translation) { + if (_gizmoType == GizmoType.translation) { await _updateTranslation(currentPosition, delta); - } else if (type == GizmoType.rotation) { + } else if (_gizmoType == GizmoType.rotation) { await _updateRotation(currentPosition, delta); } @@ -97,7 +102,8 @@ class _Gizmo { .add((entity: _attachedTo!, transform: gizmoTransform!)); } - Future _updateTranslation(Vector2 currentPosition, Vector2 delta) async { + Future _updateTranslation( + Vector2 currentPosition, Vector2 delta) async { var view = await viewer.getViewAt(0); var camera = await viewer.getActiveCamera(); var viewport = await view.getViewport(); @@ -115,17 +121,13 @@ class _Gizmo { var gizmoNdc = gizmoClipSpace / gizmoClipSpace.w; - var gizmoScreenSpace = Vector2( - ((gizmoNdc.x / 2) + 0.5) * viewport.width, + var gizmoScreenSpace = Vector2(((gizmoNdc.x / 2) + 0.5) * viewport.width, viewport.height - (((gizmoNdc.y / 2) + 0.5) * viewport.height)); gizmoScreenSpace += delta; - gizmoNdc = Vector4( - ((gizmoScreenSpace.x / viewport.width) - 0.5) * 2, - (((gizmoScreenSpace.y / viewport.height)) - 0.5) * -2, - gizmoNdc.z, - 1.0); + gizmoNdc = Vector4(((gizmoScreenSpace.x / viewport.width) - 0.5) * 2, + (((gizmoScreenSpace.y / viewport.height)) - 0.5) * -2, gizmoNdc.z, 1.0); var gizmoViewSpace = inverseProjectionMatrix * gizmoNdc; gizmoViewSpace /= gizmoViewSpace.w; @@ -142,7 +144,6 @@ class _Gizmo { } Future _updateRotation(Vector2 currentPosition, Vector2 delta) async { - var view = await viewer.getViewAt(0); var camera = await viewer.getActiveCamera(); var viewport = await view.getViewport(); @@ -157,8 +158,7 @@ class _Gizmo { gizmoPositionWorldSpace.z, 1.0); var gizmoNdc = gizmoClipSpace / gizmoClipSpace.w; - var gizmoScreenSpace = Vector2( - ((gizmoNdc.x / 2) + 0.5) * viewport.width, + var gizmoScreenSpace = Vector2(((gizmoNdc.x / 2) + 0.5) * viewport.width, viewport.height - (((gizmoNdc.y / 2) + 0.5) * viewport.height)); // Calculate vectors from gizmo center to previous and current mouse positions @@ -207,23 +207,48 @@ class _Gizmo { // Apply rotation to the current transform gizmoTransform = rotationMatrix * gizmoTransform!; await viewer.setTransform(_attachedTo!, gizmoTransform!); - } } - class GizmoInputHandler extends InputHandler { final InputHandler wrapped; final ThermionViewer viewer; - late final _Gizmo translationGizmo; - late final _Gizmo rotationGizmo; - _Gizmo get active => - type == GizmoType.translation ? translationGizmo : rotationGizmo; - GizmoType type = GizmoType.translation; + late final _gizmos = {}; + _Gizmo? active; + StreamSubscription? _entityTransformUpdatedListener; + + GizmoType? getGizmoType() { + return active?._gizmoType; + } + + Future setGizmoType(GizmoType? type) async { + if (type == null) { + await active?.detach(); + active = null; + return; + } + + var target = _gizmos[type]!; + if (target != active) { + await _entityTransformUpdatedListener?.cancel(); + if (active?._attachedTo != null) { + var attachedTo = active!._attachedTo!; + await active!.detach(); + await target.attach(attachedTo); + } + active = target; + _entityTransformUpdatedListener = + active!._onEntityTransformUpdated.stream.listen((event) { + _transformUpdatedController.add(event); + }); + } + } + + final _transformUpdatedController = + StreamController<({ThermionEntity entity, Matrix4 transform})>(); Stream<({ThermionEntity entity, Matrix4 transform})> - get onEntityTransformUpdated => - translationGizmo._onEntityTransformUpdated.stream; + get onEntityTransformUpdated => _transformUpdatedController.stream; GizmoInputHandler({required this.wrapped, required this.viewer}) { initialize(); @@ -236,13 +261,12 @@ class GizmoInputHandler extends InputHandler { throw Exception("Already initialized"); } await viewer.initialized; - final view = await viewer.getViewAt(0); - - var tg = await viewer.createGizmo(view, GizmoType.translation); - this.translationGizmo = _Gizmo(tg, viewer, GizmoType.translation); - var rg = await viewer.createGizmo(view, GizmoType.rotation); - this.rotationGizmo = _Gizmo(rg, viewer, GizmoType.rotation); + _gizmos[GizmoType.translation] = + await _Gizmo.forType(viewer, GizmoType.translation); + _gizmos[GizmoType.rotation] = + await _Gizmo.forType(viewer, GizmoType.rotation); + await setGizmoType(GizmoType.translation); _initialized.complete(true); } @@ -251,8 +275,8 @@ class GizmoInputHandler extends InputHandler { @override Future dispose() async { - await viewer.removeEntity(rotationGizmo._gizmo); - await viewer.removeEntity(translationGizmo._gizmo); + await viewer.removeEntity(_gizmos[GizmoType.rotation]!._gizmo); + await viewer.removeEntity(_gizmos[GizmoType.translation]!._gizmo); } @override @@ -288,13 +312,13 @@ class GizmoInputHandler extends InputHandler { await viewer.pick(localPosition.x.toInt(), localPosition.y.toInt(), (result) async { - if (active._gizmo.isNonPickable(result.entity) || + if (active?._gizmo.isNonPickable(result.entity) == true || result.entity == FILAMENT_ENTITY_NULL) { - await active.detach(); + await active!.detach(); return; } - if (!active._gizmo.isGizmoEntity(result.entity)) { - active.attach(result.entity); + if (active?._gizmo.isGizmoEntity(result.entity) != true) { + active!.attach(result.entity); } }); } @@ -304,19 +328,18 @@ class GizmoInputHandler extends InputHandler { if (!_initialized.isCompleted) { return; } - active.checkHover( - localPosition.x.floor(), localPosition.y.floor()); + active?.checkHover(localPosition.x.floor(), localPosition.y.floor()); } @override Future onPointerMove( Vector2 localPosition, Vector2 delta, bool isMiddle) async { - if (!isMiddle && active._active != null) { + if (!isMiddle && active?._active != null) { final scaledDelta = Vector2( delta.x, delta.y, ); - active._updateTransform(localPosition, scaledDelta); + active!._updateTransform(localPosition, scaledDelta); return; } return wrapped.onPointerMove(localPosition, delta, isMiddle); @@ -364,14 +387,14 @@ class GizmoInputHandler extends InputHandler { } Future detach(ThermionAsset asset) async { - if (active._attachedTo == asset.entity) { - await active.detach(); + if (active?._attachedTo == asset.entity) { + await active!.detach(); return; } final childEntities = await asset.getChildEntities(); for (final childEntity in childEntities) { - if (active._attachedTo == childEntity) { - await active.detach(); + if (active?._attachedTo == childEntity) { + await active!.detach(); return; } } diff --git a/thermion_dart/native/include/resources/rotation_gizmo_glb.S b/thermion_dart/native/include/resources/rotation_gizmo_glb.S index 995f4bbc..dc82d09e 100644 --- a/thermion_dart/native/include/resources/rotation_gizmo_glb.S +++ b/thermion_dart/native/include/resources/rotation_gizmo_glb.S @@ -8,5 +8,5 @@ ROTATION_GIZMO_GLB_PACKAGE: ROTATION_GIZMO_GLB_ROTATION_GIZMO_OFFSET: .int 0 ROTATION_GIZMO_GLB_ROTATION_GIZMO_SIZE: - .int 163152 + .int 156056 diff --git a/thermion_dart/native/include/resources/rotation_gizmo_glb.apple.S b/thermion_dart/native/include/resources/rotation_gizmo_glb.apple.S index e3bfb1ed..ae243b47 100644 --- a/thermion_dart/native/include/resources/rotation_gizmo_glb.apple.S +++ b/thermion_dart/native/include/resources/rotation_gizmo_glb.apple.S @@ -8,5 +8,5 @@ _ROTATION_GIZMO_GLB_PACKAGE: _ROTATION_GIZMO_GLB_ROTATION_GIZMO_OFFSET: .int 0 _ROTATION_GIZMO_GLB_ROTATION_GIZMO_SIZE: - .int 163152 + .int 156056 diff --git a/thermion_dart/native/include/resources/rotation_gizmo_glb.bin b/thermion_dart/native/include/resources/rotation_gizmo_glb.bin index 6518c74c54b8173ca024a3a4900d380f54a1e87c..e461406430b3cc2d7353af32064e524c9a2b8dda 100644 GIT binary patch delta 30474 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 { + if (entity == axis->getEntity()) + { TRACE("MATCHED AXIS HEAD ENTITY"); result = GizmoPickResultType(axisIndex); - } else { + } + else + { for (int entityIndex = 0; entityIndex < axis->getChildEntityCount(); entityIndex++) { auto childEntity = axis->getChildEntities()[entityIndex]; - + if (entity == childEntity) { TRACE("MATCHED AXIS CHILD ENTITY %d (index %d)", childEntity, entityIndex); diff --git a/thermion_dart/native/src/scene/Gizmo.cpp b/thermion_dart/native/src/scene/Gizmo.cpp index ae74312c..d552fa34 100644 --- a/thermion_dart/native/src/scene/Gizmo.cpp +++ b/thermion_dart/native/src/scene/Gizmo.cpp @@ -25,14 +25,25 @@ namespace thermion View *view, Scene *scene, Material *material) noexcept : _source(sceneAsset), - _engine(engine), - _view(view), - _scene(scene), - _material(material) + _engine(engine), + _view(view), + _scene(scene), + _material(material) { auto &entityManager = _engine->getEntityManager(); _parent = entityManager.create(); + RenderableManager::Builder(1) // 1 primitive + .boundingBox({{-1, -1, -1}, {1, 1, 1}}) // Set a basic bounding box + .culling(false) // Disable culling since this is a UI element + .castShadows(false) // UI elements typically don't cast shadows + .receiveShadows(false) + + .build(*_engine, _parent); // Bu + auto &tm = _engine->getTransformManager(); + auto parentTransformInstance = tm.getInstance(_parent); + tm.setTransform(parentTransformInstance, math::mat4f()); + TRACE("Created Gizmo parent entity %d", _parent); _entities.push_back(_parent); @@ -59,7 +70,7 @@ namespace thermion other._view = nullptr; other._scene = nullptr; other._material = nullptr; - other._parent = {}; + other._parent = {}; } void Gizmo::createAxisInstance(Gizmo::Axis axis) @@ -71,7 +82,6 @@ namespace thermion auto instance = _source->createInstance(&materialInstance, 1); TRACE("Created Gizmo axis glTF instance with head entity %d", instance->getEntity()); - materialInstance->setParameter("baseColorFactor", inactiveColors[axis]); materialInstance->setParameter("scale", _scale); @@ -109,7 +119,15 @@ namespace thermion tm.setTransform(transformInstance, transform); // parent this entity's transform to the Gizmo _parent entity - tm.setParent(transformInstance, tm.getInstance(_parent)); + auto parentTransformInstance = tm.getInstance(_parent); + if (parentTransformInstance.isValid()) + { + tm.setParent(transformInstance, parentTransformInstance); + } + else + { + TRACE("WARNING: parent transform instance not valid."); + } _entities.push_back(instance->getEntity()); @@ -120,6 +138,11 @@ namespace thermion auto entity = instance->getChildEntities()[i]; _entities.push_back(entity); TRACE("Added entity %d for axis %d", entity, axis); + auto renderable = rm.getInstance(entity); + if (renderable.isValid()) + { + rm.setPriority(renderable, 7); + } } _axes.push_back(instance); diff --git a/thermion_dart/test/gizmo_tests.dart b/thermion_dart/test/gizmo_tests.dart index d7671332..7de211b0 100644 --- a/thermion_dart/test/gizmo_tests.dart +++ b/thermion_dart/test/gizmo_tests.dart @@ -9,27 +9,81 @@ void main() async { final testHelper = TestHelper("gizmo"); group("gizmo tests", () { - test('add gizmo', () async { + test('add/remove translation gizmo', () async { await testHelper.withViewer((viewer) async { + var cameraPos = Vector3(1.5, 1.5, 3); var modelMatrix = - makeViewMatrix(Vector3(0.5, 0.5, 0.5), Vector3.zero(), Vector3(0, 1, 0)); + makeViewMatrix(cameraPos, Vector3.zero(), Vector3(0, 1, 0)); modelMatrix.invert(); await viewer.setCameraModelMatrix4(modelMatrix); final view = await viewer.getViewAt(0); + await viewer.showGridOverlay(); final gizmo = await viewer.createGizmo(view, GizmoType.translation); await viewer.setLayerVisibility(VisibilityLayers.OVERLAY, true); await gizmo.addToScene(); - await testHelper.capture( - viewer, "gizmo_added_to_scene_unattached_close"); + await testHelper.capture(viewer, "translation_gizmo_near"); - modelMatrix = - makeViewMatrix(Vector3(0.5, 0.5, 0.5).scaled(10), Vector3.zero(), Vector3(0, 1, 0)); + modelMatrix = makeViewMatrix( + cameraPos.scaled(10), Vector3.zero(), Vector3(0, 1, 0)); modelMatrix.invert(); await viewer.setCameraModelMatrix4(modelMatrix); // gizmo occupies same viewport size no matter the camera position - await testHelper.capture(viewer, "gizmo_added_to_scene_unattached_far"); + await testHelper.capture(viewer, "translation_gizmo_far"); + + await gizmo.removeFromScene(); + + await testHelper.capture(viewer, "translation_gizmo_removed"); + }, postProcessing: true, bg: kWhite); + }); + + test('add/remove rotation gizmo', () async { + await testHelper.withViewer((viewer) async { + var cameraPos = Vector3(1.5, 1.5, 3); + var modelMatrix = + makeViewMatrix(cameraPos, Vector3.zero(), Vector3(0, 1, 0)); + modelMatrix.invert(); + await viewer.setCameraModelMatrix4(modelMatrix); + + final view = await viewer.getViewAt(0); + await viewer.showGridOverlay(); + final gizmo = await viewer.createGizmo(view, GizmoType.rotation); + await viewer.setLayerVisibility(VisibilityLayers.OVERLAY, true); + await gizmo.addToScene(); + await testHelper.capture(viewer, "rotation_gizmo_near"); + + modelMatrix = makeViewMatrix( + cameraPos.scaled(10), Vector3.zero(), Vector3(0, 1, 0)); + modelMatrix.invert(); + await viewer.setCameraModelMatrix4(modelMatrix); + + // gizmo occupies same viewport size no matter the camera position + await testHelper.capture(viewer, "rotation_gizmo_far"); + + await gizmo.removeFromScene(); + + await testHelper.capture(viewer, "rotation_gizmo_removed"); + }, postProcessing: true, bg: kWhite); + }); + + test('set gizmo transform', () async { + await testHelper.withViewer((viewer) async { + var cameraPos = Vector3(1.5, 1.5, 3); + var modelMatrix = + makeViewMatrix(cameraPos, Vector3.zero(), Vector3(0, 1, 0)); + modelMatrix.invert(); + await viewer.setCameraModelMatrix4(modelMatrix); + + final view = await viewer.getViewAt(0); + await viewer.showGridOverlay(); + final gizmo = await viewer.createGizmo(view, GizmoType.translation); + await viewer.setLayerVisibility(VisibilityLayers.OVERLAY, true); + await gizmo.addToScene(); + + await viewer.setTransform(gizmo.entity, Matrix4.translation(Vector3(0,2,0))); + + await testHelper.capture(viewer, "translation_gizmo_transformed"); }, postProcessing: true, bg: kWhite); }); @@ -60,7 +114,7 @@ void main() async { }, postProcessing: true, bg: kWhite); }); - test('pick gizmo when added to scene', () async { + test('pick translation gizmo when added to scene', () async { await testHelper.withViewer((viewer) async { await viewer.setCameraPosition(0, 0, 1); final view = await viewer.getViewAt(0); @@ -73,7 +127,7 @@ void main() async { await testHelper.capture(viewer, "gizmo_before_pick_no_highlight"); - await gizmo.pick(viewport.width ~/ 2, viewport.height ~/ 2 + 1, + await gizmo.pick(viewport.width ~/ 2 + 100, viewport.height ~/ 2, handler: (resultType, coords) async { completer.complete(resultType); }); @@ -86,17 +140,18 @@ void main() async { } assert(completer.isCompleted); + expect(await completer.future, GizmoPickResultType.AxisX); }, postProcessing: true, bg: kWhite); }); test('highlight/unhighlight gizmo', () async { await testHelper.withViewer((viewer) async { - final modelMatrix = - makeViewMatrix(Vector3(0.5, 0.5, 0.5), Vector3.zero(), Vector3(0, 1, 0)); + final modelMatrix = makeViewMatrix( + Vector3(0.5, 0.5, 0.5), Vector3.zero(), Vector3(0, 1, 0)); modelMatrix.invert(); await viewer.setCameraModelMatrix4(modelMatrix); final view = await viewer.getViewAt(0); - final viewport = await view.getViewport(); + final gizmo = await viewer.createGizmo(view, GizmoType.translation); await gizmo.addToScene(); await viewer.setLayerVisibility(VisibilityLayers.OVERLAY, true);