chore: remove destroy() methods from FFIRenderTarget/FFISwapChain, implement destroyRenderTarget/destroySwapChain and clean up ThermionViewerFFI disposal
This commit is contained in:
@@ -8,7 +8,6 @@ import 'package:vector_math/vector_math_64.dart' as v64;
|
|||||||
import '../../../../utils/src/gizmo.dart';
|
import '../../../../utils/src/gizmo.dart';
|
||||||
import '../../../../utils/src/matrix.dart';
|
import '../../../../utils/src/matrix.dart';
|
||||||
import '../../events.dart';
|
import '../../events.dart';
|
||||||
import '../../shared_types/view.dart';
|
|
||||||
import '../../thermion_viewer_base.dart';
|
import '../../thermion_viewer_base.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
|
|
||||||
@@ -83,9 +82,9 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
this._driver = driver ?? nullptr;
|
this._driver = driver ?? nullptr;
|
||||||
this._sharedContext = sharedContext ?? nullptr;
|
this._sharedContext = sharedContext ?? nullptr;
|
||||||
|
|
||||||
_onPickResultCallable =
|
_onPickResultCallable = NativeCallable<
|
||||||
NativeCallable<Void Function(EntityId entityId, Int x, Int y, Pointer<TView> view)>.listener(
|
Void Function(EntityId entityId, Int x, Int y,
|
||||||
_onPickResult);
|
Pointer<TView> view)>.listener(_onPickResult);
|
||||||
|
|
||||||
_initialize();
|
_initialize();
|
||||||
}
|
}
|
||||||
@@ -103,9 +102,26 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
///
|
///
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
Future setRenderTarget(FFIRenderTarget renderTarget) async {
|
@override
|
||||||
|
Future destroyRenderTarget(FFIRenderTarget renderTarget) async {
|
||||||
|
if (_disposing || _viewer == null) {
|
||||||
|
_logger.info(
|
||||||
|
"Viewer is being (or has been) disposed; this will clean up all render targets.");
|
||||||
|
} else {
|
||||||
|
Viewer_destroyRenderTarget(_viewer!, renderTarget.renderTarget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
|
Future setRenderTarget(FFIRenderTarget? renderTarget) async {
|
||||||
final view = (await getViewAt(0)) as FFIView;
|
final view = (await getViewAt(0)) as FFIView;
|
||||||
View_setRenderTarget(view.view, renderTarget.renderTarget);
|
if (renderTarget != null) {
|
||||||
|
View_setRenderTarget(view.view, renderTarget.renderTarget);
|
||||||
|
} else {
|
||||||
|
View_setRenderTarget(view.view, nullptr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
@@ -171,6 +187,18 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
return FFISwapChain(swapChain, _viewer!);
|
return FFISwapChain(swapChain, _viewer!);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
|
Future destroySwapChain(FFISwapChain swapChain) async {
|
||||||
|
if (_viewer != null) {
|
||||||
|
await withVoidCallback((callback) {
|
||||||
|
Viewer_destroySwapChainRenderThread(
|
||||||
|
_viewer!, swapChain.swapChain, callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Gizmo? _gizmo;
|
Gizmo? _gizmo;
|
||||||
Gizmo? get gizmo => _gizmo;
|
Gizmo? get gizmo => _gizmo;
|
||||||
|
|
||||||
@@ -260,6 +288,7 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final _onDispose = <Future Function()>[];
|
final _onDispose = <Future Function()>[];
|
||||||
|
bool _disposing = false;
|
||||||
|
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
@@ -267,23 +296,26 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
@override
|
@override
|
||||||
Future dispose() async {
|
Future dispose() async {
|
||||||
if (_viewer == null) {
|
if (_viewer == null) {
|
||||||
// we've already cleaned everything up, ignore the call to dispose
|
_logger.info("Viewer already disposed, ignoring");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
_disposing = true;
|
||||||
|
|
||||||
await setRendering(false);
|
await setRendering(false);
|
||||||
await clearEntities();
|
await clearEntities();
|
||||||
await clearLights();
|
await clearLights();
|
||||||
destroy_filament_viewer_render_thread(_viewer!);
|
|
||||||
_sceneManager = null;
|
|
||||||
_viewer = null;
|
|
||||||
await _pickResultController.close();
|
await _pickResultController.close();
|
||||||
await _gizmoPickResultController.close();
|
await _gizmoPickResultController.close();
|
||||||
await _sceneUpdateEventController.close();
|
await _sceneUpdateEventController.close();
|
||||||
|
Viewer_destroyOnRenderThread(_viewer!);
|
||||||
|
_sceneManager = null;
|
||||||
|
_viewer = null;
|
||||||
|
|
||||||
for (final callback in _onDispose) {
|
for (final callback in _onDispose) {
|
||||||
await callback.call();
|
await callback.call();
|
||||||
}
|
}
|
||||||
_onDispose.clear();
|
_onDispose.clear();
|
||||||
|
_disposing = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
@@ -364,8 +396,6 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
await withVoidCallback((cb) {
|
await withVoidCallback((cb) {
|
||||||
Viewer_loadIblRenderThread(_viewer!, pathPtr, intensity, cb);
|
Viewer_loadIblRenderThread(_viewer!, pathPtr, intensity, cb);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
@@ -551,7 +581,8 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
int numInstances = 1,
|
int numInstances = 1,
|
||||||
bool keepData = false,
|
bool keepData = false,
|
||||||
int priority = 4,
|
int priority = 4,
|
||||||
int layer = 0, bool loadResourcesAsync=false}) async {
|
int layer = 0,
|
||||||
|
bool loadResourcesAsync = false}) async {
|
||||||
if (unlit) {
|
if (unlit) {
|
||||||
throw Exception("Not yet implemented");
|
throw Exception("Not yet implemented");
|
||||||
}
|
}
|
||||||
@@ -561,8 +592,16 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var entity = await withIntCallback((callback) =>
|
var entity = await withIntCallback((callback) =>
|
||||||
SceneManager_loadGlbFromBufferRenderThread(_sceneManager!, data.address,
|
SceneManager_loadGlbFromBufferRenderThread(
|
||||||
data.length, numInstances, keepData, priority, layer, loadResourcesAsync, callback));
|
_sceneManager!,
|
||||||
|
data.address,
|
||||||
|
data.length,
|
||||||
|
numInstances,
|
||||||
|
keepData,
|
||||||
|
priority,
|
||||||
|
layer,
|
||||||
|
loadResourcesAsync,
|
||||||
|
callback));
|
||||||
|
|
||||||
if (entity == _FILAMENT_ASSET_ERROR) {
|
if (entity == _FILAMENT_ASSET_ERROR) {
|
||||||
throw Exception("An error occurred loading GLB from buffer");
|
throw Exception("An error occurred loading GLB from buffer");
|
||||||
@@ -1478,7 +1517,8 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
.add((entity: entityId, x: x.ceil(), y: (viewport.height - y).ceil()));
|
.add((entity: entityId, x: x.ceil(), y: (viewport.height - y).ceil()));
|
||||||
}
|
}
|
||||||
|
|
||||||
late NativeCallable<Void Function(EntityId entityId, Int x, Int y, Pointer<TView> view)>
|
late NativeCallable<
|
||||||
|
Void Function(EntityId entityId, Int x, Int y, Pointer<TView> view)>
|
||||||
_onPickResultCallable;
|
_onPickResultCallable;
|
||||||
|
|
||||||
///
|
///
|
||||||
@@ -2159,11 +2199,6 @@ class FFIRenderTarget extends RenderTarget {
|
|||||||
final Pointer<TViewer> viewer;
|
final Pointer<TViewer> viewer;
|
||||||
|
|
||||||
FFIRenderTarget(this.renderTarget, this.viewer);
|
FFIRenderTarget(this.renderTarget, this.viewer);
|
||||||
|
|
||||||
@override
|
|
||||||
Future destroy() async {
|
|
||||||
Viewer_destroyRenderTarget(viewer, renderTarget);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class FFISwapChain extends SwapChain {
|
class FFISwapChain extends SwapChain {
|
||||||
@@ -2171,10 +2206,4 @@ class FFISwapChain extends SwapChain {
|
|||||||
final Pointer<TViewer> viewer;
|
final Pointer<TViewer> viewer;
|
||||||
|
|
||||||
FFISwapChain(this.swapChain, this.viewer);
|
FFISwapChain(this.swapChain, this.viewer);
|
||||||
|
|
||||||
Future destroy() async {
|
|
||||||
await withVoidCallback((callback) {
|
|
||||||
Viewer_destroySwapChainRenderThread(viewer, swapChain, callback);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user