update example project with debug widgets for child entities & morph targets
This commit is contained in:
@@ -1,10 +1,13 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:flutter/material.dart';
|
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/menus/controller_menu.dart';
|
||||||
import 'package:flutter_filament_example/example_viewport.dart';
|
import 'package:flutter_filament_example/example_viewport.dart';
|
||||||
import 'package:dart_filament/dart_filament/entities/entity_transform_controller.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_example/menus/scene_menu.dart';
|
||||||
import 'package:flutter_filament/flutter_filament.dart';
|
import 'package:flutter_filament/flutter_filament.dart';
|
||||||
|
import 'package:flutter_filament_example/picker_result_widget.dart';
|
||||||
|
|
||||||
|
|
||||||
const loadDefaultScene = bool.hasEnvironment('--load-default-scene');
|
const loadDefaultScene = bool.hasEnvironment('--load-default-scene');
|
||||||
@@ -178,18 +181,18 @@ class ExampleWidgetState extends State<ExampleWidget> {
|
|||||||
Expanded(child: Container()),
|
Expanded(child: Container()),
|
||||||
]))),
|
]))),
|
||||||
if (isInitialized) ...[
|
if (isInitialized) ...[
|
||||||
// EntityListWidget(controller: _plugin.viewer),
|
EntityListWidget(controller: _plugin.viewer),
|
||||||
// Padding(
|
Padding(
|
||||||
// padding: const EdgeInsets.only(top: 10, left: 20, right: 20),
|
padding: const EdgeInsets.only(top: 10, left: 20, right: 20),
|
||||||
// child: ValueListenableBuilder(
|
child: ValueListenableBuilder(
|
||||||
// valueListenable: showProjectionMatrices,
|
valueListenable: showProjectionMatrices,
|
||||||
// builder: (ctx, value, child) => CameraMatrixOverlay(
|
builder: (ctx, value, child) => CameraMatrixOverlay(
|
||||||
// controller: _plugin, showProjectionMatrices: value)),
|
controller: _plugin.viewer, showProjectionMatrices: value)),
|
||||||
// ),
|
),
|
||||||
// Align(
|
Align(
|
||||||
// alignment: Alignment.topRight,
|
alignment: Alignment.topRight,
|
||||||
// child: PickerResultWidget(controller: _plugin.viewer),
|
child: PickerResultWidget(controller: _plugin.viewer),
|
||||||
// )
|
)
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -77,39 +77,8 @@ class _AssetSubmenuState extends State<AssetSubmenu> {
|
|||||||
1000.0 / 60.0));
|
1000.0 / 60.0));
|
||||||
},
|
},
|
||||||
child: const Text('Set bone transform animation for Cylinder')),
|
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(
|
MenuItemButton(
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
var morphTargets = await widget.controller.viewer.getMorphTargetNames(
|
var morphTargets = await widget.controller.viewer.getMorphTargetNames(
|
||||||
|
|||||||
@@ -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) ?? "<none>";
|
||||||
|
return FutureBuilder(
|
||||||
|
future: controller!
|
||||||
|
.getMorphTargetNames(entity, name),
|
||||||
|
builder: (_, morphTargetsSnapshot) {
|
||||||
|
if (!morphTargetsSnapshot.hasData) {
|
||||||
|
return Container();
|
||||||
|
}
|
||||||
|
var morphTargets =
|
||||||
|
morphTargetsSnapshot.data!;
|
||||||
|
|
||||||
|
final menuChildren = <Widget>[];
|
||||||
|
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());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:dart_filament/dart_filament/abstract_filament_viewer.dart';
|
import 'package:dart_filament/dart_filament/abstract_filament_viewer.dart';
|
||||||
import 'package:dart_filament/dart_filament/entities/filament_entity.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_filament/flutter_filament.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
@@ -72,7 +73,9 @@ class _EntityListWidget extends State<EntityListWidget> {
|
|||||||
entity, animations.data!.indexOf(a));
|
entity, animations.data!.indexOf(a));
|
||||||
},
|
},
|
||||||
))
|
))
|
||||||
.toList())
|
.toList()),
|
||||||
|
ChildRenderableWidget(controller:widget.controller!, entity:entity),
|
||||||
|
|
||||||
])
|
])
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
@@ -120,25 +123,29 @@ class _EntityListWidget extends State<EntityListWidget> {
|
|||||||
if (widget.controller == null) {
|
if (widget.controller == null) {
|
||||||
return Container();
|
return Container();
|
||||||
}
|
}
|
||||||
return StreamBuilder(
|
return FutureBuilder(
|
||||||
stream: widget.controller!.scene.onUpdated,
|
future: widget.controller!.initialized,
|
||||||
builder: (_, __) => Container(
|
builder: (_, snapshot) => snapshot.data != true
|
||||||
padding: const EdgeInsets.symmetric(
|
? Container()
|
||||||
horizontal: 30, vertical: 10),
|
: StreamBuilder(
|
||||||
height: 100,
|
stream: widget.controller!.scene.onUpdated,
|
||||||
decoration: BoxDecoration(
|
builder: (_, __) => Container(
|
||||||
borderRadius: BorderRadius.circular(30),
|
padding: const EdgeInsets.symmetric(
|
||||||
color: Colors.white.withOpacity(0.25),
|
horizontal: 30, vertical: 10),
|
||||||
),
|
height: 100,
|
||||||
child: ListView(
|
decoration: BoxDecoration(
|
||||||
reverse: true,
|
borderRadius: BorderRadius.circular(30),
|
||||||
children: widget.controller!.scene
|
color: Colors.white.withOpacity(0.25),
|
||||||
.listLights()
|
),
|
||||||
.map(_light)
|
child: ListView(
|
||||||
.followedBy(widget.controller!.scene
|
reverse: true,
|
||||||
.listEntities()
|
children: widget.controller!.scene
|
||||||
.map(_entity))
|
.listLights()
|
||||||
.cast<Widget>()
|
.map(_light)
|
||||||
.toList())));
|
.followedBy(widget.controller!.scene
|
||||||
|
.listEntities()
|
||||||
|
.map(_entity))
|
||||||
|
.cast<Widget>()
|
||||||
|
.toList()))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user