diff --git a/flutter_filament_federated/flutter_filament/example/lib/main.dart b/flutter_filament_federated/flutter_filament/example/lib/main.dart index 0e93d7d5..86ab865a 100644 --- a/flutter_filament_federated/flutter_filament/example/lib/main.dart +++ b/flutter_filament_federated/flutter_filament/example/lib/main.dart @@ -1,10 +1,13 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:flutter_filament/filament/widgets/debug/entity_list_widget.dart'; +import 'package:flutter_filament_example/camera_matrix_overlay.dart'; import 'package:flutter_filament_example/menus/controller_menu.dart'; import 'package:flutter_filament_example/example_viewport.dart'; import 'package:dart_filament/dart_filament/entities/entity_transform_controller.dart'; import 'package:flutter_filament_example/menus/scene_menu.dart'; import 'package:flutter_filament/flutter_filament.dart'; +import 'package:flutter_filament_example/picker_result_widget.dart'; const loadDefaultScene = bool.hasEnvironment('--load-default-scene'); @@ -178,18 +181,18 @@ class ExampleWidgetState extends State { Expanded(child: Container()), ]))), if (isInitialized) ...[ - // EntityListWidget(controller: _plugin.viewer), - // Padding( - // padding: const EdgeInsets.only(top: 10, left: 20, right: 20), - // child: ValueListenableBuilder( - // valueListenable: showProjectionMatrices, - // builder: (ctx, value, child) => CameraMatrixOverlay( - // controller: _plugin, showProjectionMatrices: value)), - // ), - // Align( - // alignment: Alignment.topRight, - // child: PickerResultWidget(controller: _plugin.viewer), - // ) + EntityListWidget(controller: _plugin.viewer), + Padding( + padding: const EdgeInsets.only(top: 10, left: 20, right: 20), + child: ValueListenableBuilder( + valueListenable: showProjectionMatrices, + builder: (ctx, value, child) => CameraMatrixOverlay( + controller: _plugin.viewer, showProjectionMatrices: value)), + ), + Align( + alignment: Alignment.topRight, + child: PickerResultWidget(controller: _plugin.viewer), + ) ] ]); }); diff --git a/flutter_filament_federated/flutter_filament/example/lib/menus/asset_submenu.dart b/flutter_filament_federated/flutter_filament/example/lib/menus/asset_submenu.dart index 814affa0..7b51c47a 100644 --- a/flutter_filament_federated/flutter_filament/example/lib/menus/asset_submenu.dart +++ b/flutter_filament_federated/flutter_filament/example/lib/menus/asset_submenu.dart @@ -77,39 +77,8 @@ class _AssetSubmenuState extends State { 1000.0 / 60.0)); }, child: const Text('Set bone transform animation for Cylinder')), - MenuItemButton( - closeOnActivate: false, - onPressed: () async { - var names = await widget.controller.viewer.getMorphTargetNames( - widget.controller.viewer.scene.listEntities().last, "Cylinder"); - print("NAMES : $names"); - await showDialog( - context: context, - builder: (ctx) { - return Container( - height: 100, - width: 100, - color: Colors.white, - child: Text(names.join(","))); - }); - }, - child: const Text("Show morph target names for Cylinder")), - MenuItemButton( - onPressed: () async { - var cylinder = await widget.controller.viewer.getChildEntity( - widget.controller.viewer.scene.listEntities().last, "Cylinder"); - widget.controller.viewer - .setMorphTargetWeights(cylinder, List.filled(4, 1.0)); - }, - child: const Text("set Cylinder morph weights to 1")), - MenuItemButton( - onPressed: () async { - var cylinder = await widget.controller.viewer.getChildEntity( - widget.controller.viewer.scene.listEntities().last, "Cylinder"); - widget.controller.viewer - .setMorphTargetWeights(cylinder, List.filled(4, 0.0)); - }, - child: const Text("Set Cylinder morph weights to 0")), + + MenuItemButton( onPressed: () async { var morphTargets = await widget.controller.viewer.getMorphTargetNames( diff --git a/flutter_filament_federated/flutter_filament/lib/filament/widgets/debug/child_renderable_widget.dart b/flutter_filament_federated/flutter_filament/lib/filament/widgets/debug/child_renderable_widget.dart new file mode 100644 index 00000000..138592cc --- /dev/null +++ b/flutter_filament_federated/flutter_filament/lib/filament/widgets/debug/child_renderable_widget.dart @@ -0,0 +1,69 @@ +import 'package:dart_filament/dart_filament/abstract_filament_viewer.dart'; +import 'package:dart_filament/dart_filament/entities/filament_entity.dart'; +import 'package:flutter/material.dart'; + +class ChildRenderableWidget extends StatelessWidget { + final AbstractFilamentViewer controller; + final FilamentEntity entity; + + const ChildRenderableWidget( + {super.key, required this.controller, required this.entity}); + + + + Widget _childRenderable(FilamentEntity childEntity) { + var name = controller.getNameForEntity(childEntity) ?? ""; + return FutureBuilder( + future: controller! + .getMorphTargetNames(entity, name), + builder: (_, morphTargetsSnapshot) { + if (!morphTargetsSnapshot.hasData) { + return Container(); + } + var morphTargets = + morphTargetsSnapshot.data!; + + final menuChildren = []; + if(morphTargets.isEmpty) { + menuChildren.add(Text("None")); + } else { + for(int i= 0; i < 2; i++) { + var newWeights = List.filled( + morphTargets.length, i.toDouble() + ); + menuChildren.add(MenuItemButton( + child: Text( + "Set to $i"), + onPressed: () async { + await controller! + .setMorphTargetWeights( + childEntity, newWeights);})); + } + menuChildren.addAll(morphTargets.map((t) => Text(t))); + } + return SubmenuButton( + child: Text(name), + menuChildren: menuChildren); + }); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: controller!.getChildEntities(entity, true), + builder: (ctx, snapshot) { + if (!snapshot.hasData) { + return Container(); + } + + var children = snapshot.data!; + return SubmenuButton( + child: Text("Renderable entities"), + menuChildren: children.map(_childRenderable).toList()); + }); + } +} + + + + diff --git a/flutter_filament_federated/flutter_filament/lib/filament/widgets/debug/entity_list_widget.dart b/flutter_filament_federated/flutter_filament/lib/filament/widgets/debug/entity_list_widget.dart index 5df02401..b893619f 100644 --- a/flutter_filament_federated/flutter_filament/lib/filament/widgets/debug/entity_list_widget.dart +++ b/flutter_filament_federated/flutter_filament/lib/filament/widgets/debug/entity_list_widget.dart @@ -1,5 +1,6 @@ import 'package:dart_filament/dart_filament/abstract_filament_viewer.dart'; import 'package:dart_filament/dart_filament/entities/filament_entity.dart'; +import 'package:flutter_filament/filament/widgets/debug/child_renderable_widget.dart'; import 'package:flutter_filament/flutter_filament.dart'; import 'package:flutter/material.dart'; @@ -72,7 +73,9 @@ class _EntityListWidget extends State { entity, animations.data!.indexOf(a)); }, )) - .toList()) + .toList()), + ChildRenderableWidget(controller:widget.controller!, entity:entity), + ]) ]); }); @@ -120,25 +123,29 @@ class _EntityListWidget extends State { if (widget.controller == null) { return Container(); } - return StreamBuilder( - stream: widget.controller!.scene.onUpdated, - builder: (_, __) => Container( - padding: const EdgeInsets.symmetric( - horizontal: 30, vertical: 10), - height: 100, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(30), - color: Colors.white.withOpacity(0.25), - ), - child: ListView( - reverse: true, - children: widget.controller!.scene - .listLights() - .map(_light) - .followedBy(widget.controller!.scene - .listEntities() - .map(_entity)) - .cast() - .toList()))); + return FutureBuilder( + future: widget.controller!.initialized, + builder: (_, snapshot) => snapshot.data != true + ? Container() + : StreamBuilder( + stream: widget.controller!.scene.onUpdated, + builder: (_, __) => Container( + padding: const EdgeInsets.symmetric( + horizontal: 30, vertical: 10), + height: 100, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30), + color: Colors.white.withOpacity(0.25), + ), + child: ListView( + reverse: true, + children: widget.controller!.scene + .listLights() + .map(_light) + .followedBy(widget.controller!.scene + .listEntities() + .map(_entity)) + .cast() + .toList())))); } }