refactoring

This commit is contained in:
Nick Fisher
2025-03-19 12:27:13 +08:00
parent d5bffd5ad2
commit 627447f8b0
65 changed files with 2304 additions and 3005 deletions

View File

@@ -1,21 +1,16 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/material.dart' hide View;
import 'package:logging/logging.dart';
import 'package:thermion_dart/src/viewer/src/shared_types/view.dart' as t;
import 'package:thermion_flutter/src/widgets/src/resize_observer.dart';
import 'package:thermion_flutter/thermion_flutter.dart' hide Texture;
class ThermionTextureWidget extends StatefulWidget {
///
///
///
final ThermionViewer viewer;
///
///
///
final t.View view;
///
///
///
@@ -24,7 +19,7 @@ class ThermionTextureWidget extends StatefulWidget {
///
/// A callback that will be invoked whenever this widget (and the underlying texture is resized).
///
final Future Function(Size size, t.View view, double pixelRatio)? onResize;
final Future Function(Size size, View view, double pixelRatio)? onResize;
///
/// When true, an FPS counter will be displayed at the top right of the widget
@@ -34,7 +29,6 @@ class ThermionTextureWidget extends StatefulWidget {
const ThermionTextureWidget({
super.key,
required this.viewer,
required this.view,
this.initial,
this.onResize,
this.showFpsCounter = false,
@@ -49,7 +43,7 @@ class ThermionTextureWidget extends StatefulWidget {
class _ThermionTextureWidgetState extends State<ThermionTextureWidget> {
PlatformTextureDescriptor? _texture;
static final _views = <t.View>[];
static final _views = <View>[];
final _logger = Logger("_ThermionTextureWidgetState");
@@ -63,7 +57,7 @@ class _ThermionTextureWidgetState extends State<ThermionTextureWidget> {
@override
void dispose() {
super.dispose();
_views.remove(widget.view);
_views.remove(widget.viewer.view);
if (_texture != null) {
ThermionFlutterPlatform.instance.destroyTextureDescriptor(_texture!);
}
@@ -73,10 +67,10 @@ class _ThermionTextureWidgetState extends State<ThermionTextureWidget> {
@override
void initState() {
if (_views.contains(widget.view)) {
if (_views.contains(widget.viewer.view)) {
throw Exception("View already embedded in a widget");
}
_views.add(widget.view);
_views.add(widget.viewer.view);
// Start FPS counter update timer if enabled
if (widget.showFpsCounter) {
@@ -95,7 +89,6 @@ class _ThermionTextureWidgetState extends State<ThermionTextureWidget> {
}
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
await widget.viewer.initialized;
var dpr = MediaQuery.of(context).devicePixelRatio;
@@ -111,17 +104,17 @@ class _ThermionTextureWidgetState extends State<ThermionTextureWidget> {
"Target texture dimensions ${width}x${height} (pixel ratio : $dpr)");
_texture = await ThermionFlutterPlatform.instance
.createTextureAndBindToView(widget.view, width, height);
.createTextureAndBindToView(widget.viewer.view, width, height);
_logger.info(
"Actual texture dimensions ${_texture!.width}x${_texture!.height} (pixel ratio : $dpr)");
await widget.view.setViewport(_texture!.width, _texture!.height);
await widget.viewer.view.setViewport(_texture!.width, _texture!.height);
try {
await widget.onResize?.call(
Size(_texture!.width.toDouble(), _texture!.height.toDouble()),
widget.view,
widget.viewer.view,
dpr);
} catch (err, st) {
_logger.severe(err);
@@ -191,7 +184,7 @@ class _ThermionTextureWidgetState extends State<ThermionTextureWidget> {
widget.viewer.msPerFrame - _headroomInMs)) {
_rendering = true;
if (this == _states.first && _texture != null) {
await widget.viewer.requestFrame();
await FilamentApp.instance!.requestFrame();
lastRender = d.inMilliseconds;
if (widget.showFpsCounter) {
@@ -243,16 +236,16 @@ class _ThermionTextureWidgetState extends State<ThermionTextureWidget> {
"Resizing texture to dimensions ${newWidth}x${newHeight} (pixel ratio : $dpr)");
_texture = await ThermionFlutterPlatform.instance
.resizeTexture(_texture!, widget.view, newWidth, newHeight);
.resizeTexture(_texture!, widget.viewer.view, newWidth, newHeight);
_logger.info(
"Resized texture to dimensions ${_texture!.width}x${_texture!.height} (pixel ratio : $dpr)");
await widget.view.setViewport(_texture!.width, _texture!.height);
await widget.viewer.view.setViewport(_texture!.width, _texture!.height);
await widget.onResize?.call(
Size(_texture!.width.toDouble(), _texture!.height.toDouble()),
widget.view,
widget.viewer.view,
dpr);
if (!mounted) {

View File

@@ -1,13 +1,11 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/material.dart' hide View;
import 'package:thermion_flutter/src/widgets/src/thermion_texture_widget.dart';
import 'package:thermion_flutter/src/widgets/src/thermion_widget_web.dart';
import 'package:thermion_flutter/thermion_flutter.dart';
import 'package:thermion_flutter_web/thermion_flutter_web_options.dart';
import 'package:thermion_dart/src/viewer/src/shared_types/view.dart' as t;
Future kDefaultResizeCallback(Size size, t.View view, double pixelRatio) async {
Future kDefaultResizeCallback(Size size, View view, double pixelRatio) async {
var camera = await view.getCamera();
var near = await camera.getNear();
var far = await camera.getCullingFar();
@@ -26,11 +24,6 @@ class ThermionWidget extends StatefulWidget {
///
final ThermionViewer viewer;
///
/// The [t.View] associated with this widget. If null, the default View will be used.
///
final t.View? view;
///
/// A callback to invoke whenever this widget and the underlying surface are
/// resized. If a callback is not explicitly provided, the default callback
@@ -45,7 +38,7 @@ class ThermionWidget extends StatefulWidget {
/// If you need to work with Flutter dimensions, divide [size] by
/// [pixelRatio].
///
final Future Function(Size size, t.View view, double pixelRatio)? onResize;
final Future Function(Size size, View view, double pixelRatio)? onResize;
final bool showFpsCounter;
@@ -59,7 +52,6 @@ class ThermionWidget extends StatefulWidget {
{Key? key,
this.initial,
required this.viewer,
this.view,
this.showFpsCounter = false,
this.onResize = kDefaultResizeCallback})
: super(key: key);
@@ -69,42 +61,22 @@ class ThermionWidget extends StatefulWidget {
}
class _ThermionWidgetState extends State<ThermionWidget> {
t.View? view;
@override
void initState() {
super.initState();
initialize();
}
Future initialize() async {
if (widget.view != null) {
view = widget.view;
} else {
view = await widget.viewer.getViewAt(0);
}
setState(() {});
}
@override
Widget build(BuildContext context) {
if (view == null) {
return widget.initial ?? Container(color: Colors.red);
}
// Web doesn't support imported textures yet
if (kIsWeb) {
return ThermionWidgetWeb(
viewer: widget.viewer,
options: ThermionFlutterPlugin.options as ThermionFlutterWebOptions?);
throw Exception();
// return ThermionWidgetWeb(
// viewer: widget.viewer,
// options: ThermionFlutterPlugin.options as ThermionFlutterWebOptions?);
}
return ThermionTextureWidget(
key: ObjectKey(view!),
key: ObjectKey(widget.viewer),
initial: widget.initial,
viewer: widget.viewer,
view: view!,
showFpsCounter:widget.showFpsCounter,
view: widget.viewer.view,
showFpsCounter: widget.showFpsCounter,
onResize: widget.onResize);
}
}

View File

@@ -0,0 +1,116 @@
import 'package:flutter/material.dart';
import 'package:thermion_flutter/thermion_flutter.dart' hide Texture;
enum ViewerManipulatorType { ORBIT, FIRST_PERSON }
class ViewerOptions {
///
///
///
final Widget initial;
///
/// When true, an FPS counter will be displayed at the top right of the widget
///
final bool showFpsCounter;
///
///
///
final String? assetPath;
///
///
///
final String? skyboxPath;
///
///
///
final String? iblPath;
///
///
///
final LightType? directLightType;
///
///
///
final bool transformToUnitCube;
///
///
///
final bool postProcessing;
///
///
///
final Color? background;
///
///
///
final bool destroyAppOnUnload;
const ViewerOptions(
{this.initial =
const DecoratedBox(decoration: BoxDecoration(color: Colors.red)),
this.showFpsCounter = false,
this.transformToUnitCube = true,
this.postProcessing = true,
this.destroyAppOnUnload = false,
this.assetPath,
this.skyboxPath,
this.iblPath,
this.directLightType,
this.background});
}
class ViewerWidget extends StatefulWidget {
final ViewerOptions options;
const ViewerWidget({super.key, this.options = const ViewerOptions()});
@override
State<StatefulWidget> createState() {
return _ViewerWidgetState();
}
}
class _ViewerWidgetState extends State<ViewerWidget> {
ThermionViewer? viewer;
@override
void initState() {
super.initState();
ThermionFlutterPlugin.createViewer().then((viewer) async {
viewer = viewer;
setState(() {});
});
}
@override
void dispose() {
if (viewer != null) {
_tearDown();
}
}
Future _tearDown() async {
await viewer!.dispose();
if (widget.options.destroyAppOnUnload) {
await viewer!.app.destroy();
}
}
@override
Widget build(BuildContext context) {
if (viewer == null) {
return widget.options.initial!;
}
return ThermionWidget(viewer: viewer!);
}
}