refactoring
This commit is contained in:
@@ -70,6 +70,11 @@ abstract class FilamentApp<T> {
|
|||||||
///
|
///
|
||||||
Future destroy();
|
Future destroy();
|
||||||
|
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
|
Future destroyAsset(covariant ThermionAsset asset);
|
||||||
|
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
@@ -227,7 +232,8 @@ abstract class FilamentApp<T> {
|
|||||||
///
|
///
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
Future<Uint8List> capture(covariant View view, {bool captureRenderTarget = false});
|
Future<Uint8List> capture(covariant View view,
|
||||||
|
{bool captureRenderTarget = false});
|
||||||
|
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'dart:async';
|
|||||||
import 'dart:ffi';
|
import 'dart:ffi';
|
||||||
|
|
||||||
import 'package:ffi/ffi.dart';
|
import 'package:ffi/ffi.dart';
|
||||||
|
import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_dart.g.dart';
|
||||||
export 'package:ffi/ffi.dart';
|
export 'package:ffi/ffi.dart';
|
||||||
export 'dart:ffi';
|
export 'dart:ffi';
|
||||||
export 'thermion_dart.g.dart';
|
export 'thermion_dart.g.dart';
|
||||||
@@ -20,6 +21,7 @@ Future<void> withVoidCallback2(Function() func) async {
|
|||||||
completer.complete();
|
completer.complete();
|
||||||
};
|
};
|
||||||
final nativeCallable = NativeCallable<Void Function()>.listener(callback);
|
final nativeCallable = NativeCallable<Void Function()>.listener(callback);
|
||||||
|
RenderLoop_addTask(nativeCallable.nativeFunction);
|
||||||
await completer.future;
|
await completer.future;
|
||||||
nativeCallable.close();
|
nativeCallable.close();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'dart:typed_data';
|
|||||||
|
|
||||||
import 'package:thermion_dart/src/filament/src/engine.dart';
|
import 'package:thermion_dart/src/filament/src/engine.dart';
|
||||||
import 'package:thermion_dart/src/viewer/src/ffi/src/callbacks.dart';
|
import 'package:thermion_dart/src/viewer/src/ffi/src/callbacks.dart';
|
||||||
|
import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_asset.dart';
|
||||||
import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_material.dart';
|
import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_material.dart';
|
||||||
import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_render_target.dart';
|
import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_render_target.dart';
|
||||||
import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_swapchain.dart';
|
import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_swapchain.dart';
|
||||||
@@ -187,6 +188,14 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
|
|||||||
Engine_destroy(engine);
|
Engine_destroy(engine);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
|
Future destroyAsset(covariant FFIAsset asset) async {
|
||||||
|
await withVoidCallback(
|
||||||
|
(cb) => SceneAsset_destroyRenderThread(asset.asset, cb));
|
||||||
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -279,47 +279,13 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
@override
|
@override
|
||||||
Future removeIbl() async {
|
Future removeIbl() async {
|
||||||
if (indirectLight != null) {
|
if (indirectLight != null) {
|
||||||
|
Scene_setIndirectLight(scene.scene, nullptr);
|
||||||
await withVoidCallback((cb) => Engine_destroyIndirectLightRenderThread(
|
await withVoidCallback((cb) => Engine_destroyIndirectLightRenderThread(
|
||||||
app.engine, indirectLight!, cb));
|
app.engine, indirectLight!, cb));
|
||||||
indirectLight = null;
|
indirectLight = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
Future<ThermionEntity> addLight(
|
|
||||||
LightType type,
|
|
||||||
double colour,
|
|
||||||
double intensity,
|
|
||||||
double posX,
|
|
||||||
double posY,
|
|
||||||
double posZ,
|
|
||||||
double dirX,
|
|
||||||
double dirY,
|
|
||||||
double dirZ,
|
|
||||||
{double falloffRadius = 1.0,
|
|
||||||
double spotLightConeInner = pi / 8,
|
|
||||||
double spotLightConeOuter = pi / 4,
|
|
||||||
double sunAngularRadius = 0.545,
|
|
||||||
double sunHaloSize = 10.0,
|
|
||||||
double sunHaloFallof = 80.0,
|
|
||||||
bool castShadows = true}) async {
|
|
||||||
DirectLight directLight = DirectLight(
|
|
||||||
type: type,
|
|
||||||
color: colour,
|
|
||||||
intensity: intensity,
|
|
||||||
position: Vector3(posX, posY, posZ),
|
|
||||||
direction: Vector3(dirX, dirY, dirZ)..normalize(),
|
|
||||||
falloffRadius: falloffRadius,
|
|
||||||
spotLightConeInner: spotLightConeInner,
|
|
||||||
spotLightConeOuter: spotLightConeOuter,
|
|
||||||
sunAngularRadius: sunAngularRadius,
|
|
||||||
sunHaloSize: sunHaloSize,
|
|
||||||
sunHaloFallof: sunHaloFallof,
|
|
||||||
castShadows: castShadows);
|
|
||||||
|
|
||||||
return addDirectLight(directLight);
|
|
||||||
}
|
|
||||||
|
|
||||||
final _lights = <ThermionEntity>{};
|
final _lights = <ThermionEntity>{};
|
||||||
|
|
||||||
///
|
///
|
||||||
@@ -453,9 +419,7 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
@override
|
@override
|
||||||
Future destroyAsset(covariant FFIAsset asset) async {
|
Future destroyAsset(covariant FFIAsset asset) async {
|
||||||
await scene.remove(asset);
|
await scene.remove(asset);
|
||||||
|
await FilamentApp.instance!.destroyAsset(asset);
|
||||||
await withVoidCallback(
|
|
||||||
(cb) => SceneAsset_destroyRenderThread(asset.asset, cb));
|
|
||||||
|
|
||||||
// if (asset.boundingBoxAsset != null) {
|
// if (asset.boundingBoxAsset != null) {
|
||||||
// await asset.setBoundingBoxVisibility(false);
|
// await asset.setBoundingBoxVisibility(false);
|
||||||
@@ -790,4 +754,12 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
// gizmoEntities.toSet()
|
// gizmoEntities.toSet()
|
||||||
// ..add(SceneAsset_getEntity(gizmo.cast<TSceneAsset>())));
|
// ..add(SceneAsset_getEntity(gizmo.cast<TSceneAsset>())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future addToScene(covariant FFIAsset asset) async {
|
||||||
|
await scene.add(asset);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future removeFromScene(covariant FFIAsset asset) async {
|
||||||
|
await scene.remove(asset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import 'dart:async';
|
|||||||
/// using the methods directly via FilamentApp.instance;
|
/// using the methods directly via FilamentApp.instance;
|
||||||
///
|
///
|
||||||
abstract class ThermionViewer {
|
abstract class ThermionViewer {
|
||||||
|
|
||||||
Future<bool> get initialized;
|
Future<bool> get initialized;
|
||||||
|
|
||||||
///
|
///
|
||||||
@@ -294,4 +293,7 @@ abstract class ThermionViewer {
|
|||||||
///
|
///
|
||||||
///
|
///
|
||||||
int getCameraCount();
|
int getCameraCount();
|
||||||
|
|
||||||
|
Future addToScene(covariant ThermionAsset asset);
|
||||||
|
Future removeFromScene(covariant ThermionAsset asset);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ namespace thermion
|
|||||||
_instances.clear();
|
_instances.clear();
|
||||||
_asset->releaseSourceData();
|
_asset->releaseSourceData();
|
||||||
_assetLoader->destroyAsset(_asset);
|
_assetLoader->destroyAsset(_asset);
|
||||||
|
TRACE("Destroyed");
|
||||||
}
|
}
|
||||||
|
|
||||||
SceneAsset *GltfSceneAsset::createInstance(MaterialInstance **materialInstances, size_t materialInstanceCount)
|
SceneAsset *GltfSceneAsset::createInstance(MaterialInstance **materialInstances, size_t materialInstanceCount)
|
||||||
|
|||||||
@@ -1,21 +1,73 @@
|
|||||||
|
@Timeout(const Duration(seconds: 600))
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
|
import 'package:vector_math/vector_math_64.dart';
|
||||||
import 'helpers.dart';
|
import 'helpers.dart';
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
final testHelper = TestHelper("lights");
|
final testHelper = TestHelper("assets");
|
||||||
|
await testHelper.setup();
|
||||||
group("assets", () {
|
group("assets", () {
|
||||||
test('add/clear asset', () async {
|
// test('load/clear skybox', () async {
|
||||||
|
// await testHelper.withViewer((viewer) async {
|
||||||
|
// final camera = await viewer.getActiveCamera();
|
||||||
|
// print(await camera.getModelMatrix());
|
||||||
|
// print(await camera.getViewMatrix());
|
||||||
|
// print(await camera.getProjectionMatrix());
|
||||||
|
// await camera.lookAt(Vector3(0, 0, 10),
|
||||||
|
// focus: Vector3.zero(), up: Vector3(0, 1, 0));
|
||||||
|
// await viewer.loadSkybox(
|
||||||
|
// "file://${testHelper.testDir}/assets/default_env_skybox.ktx");
|
||||||
|
// await testHelper.capture(viewer.view, "load_skybox");
|
||||||
|
// await viewer.removeSkybox();
|
||||||
|
// await testHelper.capture(viewer.view, "remove_skybox");
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
|
||||||
|
test('load/remove ibl', () async {
|
||||||
await testHelper.withViewer((viewer) async {
|
await testHelper.withViewer((viewer) async {
|
||||||
var asset = await viewer.loadGlb("file://${testHelper.testDir}/assets/cube.glb");
|
var asset = await viewer
|
||||||
await testHelper.capture(viewer, "asset_loaded");
|
.loadGlb("file://${testHelper.testDir}/assets/cube.glb");
|
||||||
await viewer.destroyAssets();
|
await viewer
|
||||||
await viewer.destroyLights();
|
.loadIbl("file://${testHelper.testDir}/assets/default_env_ibl.ktx");
|
||||||
await viewer.removeSkybox();
|
await testHelper.capture(viewer.view, "ibl_loaded");
|
||||||
await viewer.removeIbl();
|
await viewer.removeIbl();
|
||||||
await testHelper.capture(viewer, "assets_cleared");
|
await testHelper.capture(viewer.view, "ibl_removed");
|
||||||
asset = await viewer.loadGlb("file://${testHelper.testDir}/assets/cube.glb");
|
}, cameraPosition: Vector3(0, 0, 5));
|
||||||
await testHelper.capture(viewer, "asset_reloaded");
|
|
||||||
}, bg: kRed);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// test('add/remove asset from scene ', () async {
|
||||||
|
// await testHelper.withViewer((viewer) async {
|
||||||
|
// var asset = await viewer
|
||||||
|
// .loadGlb("file://${testHelper.testDir}/assets/cube.glb");
|
||||||
|
// await viewer
|
||||||
|
// .loadIbl("file://${testHelper.testDir}/assets/default_env_ibl.ktx");
|
||||||
|
// await testHelper.capture(viewer.view, "asset_added");
|
||||||
|
// await viewer.removeFromScene(asset);
|
||||||
|
// await testHelper.capture(viewer.view, "asset_removed");
|
||||||
|
// }, cameraPosition: Vector3(0, 0, 5));
|
||||||
|
// });
|
||||||
|
|
||||||
|
// test('destroy assets', () async {
|
||||||
|
// await testHelper.withViewer((viewer) async {
|
||||||
|
// var asset = await viewer
|
||||||
|
// .loadGlb("file://${testHelper.testDir}/assets/cube.glb");
|
||||||
|
// await viewer
|
||||||
|
// .loadIbl("file://${testHelper.testDir}/assets/default_env_ibl.ktx");
|
||||||
|
// await testHelper.capture(viewer.view, "assets_present");
|
||||||
|
// await viewer.destroyAssets();
|
||||||
|
// await testHelper.capture(viewer.view, "assets_destroyed");
|
||||||
|
// }, cameraPosition: Vector3(0, 0, 5));
|
||||||
|
// });
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// await viewer.destroyLights();
|
||||||
|
// await viewer.removeSkybox();
|
||||||
|
// await viewer.removeIbl();
|
||||||
|
|
||||||
|
// asset = await viewer
|
||||||
|
// .loadGlb("file://${testHelper.testDir}/assets/cube.glb");
|
||||||
|
// await testHelper.capture(viewer.view, "asset_reloaded");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,46 +1,26 @@
|
|||||||
import 'package:thermion_dart/thermion_dart.dart';
|
import 'package:thermion_dart/src/filament/src/light_options.dart';
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
import 'package:vector_math/vector_math_64.dart';
|
|
||||||
import 'helpers.dart';
|
import 'helpers.dart';
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
final testHelper = TestHelper("lights");
|
final testHelper = TestHelper("lights");
|
||||||
|
await testHelper.setup();
|
||||||
group("lights", () {
|
group("lights", () {
|
||||||
test('add/clear point lights', () async {
|
test('add/clear point light', () async {
|
||||||
await testHelper.withViewer((viewer) async {
|
await testHelper.withViewer((viewer) async {
|
||||||
await viewer.loadGlb("file://${testHelper.testDir}/assets/cube.glb");
|
await viewer.loadGlb("file://${testHelper.testDir}/assets/cube.glb");
|
||||||
|
|
||||||
var light = await viewer.addDirectLight(
|
var light = await viewer.addDirectLight(
|
||||||
DirectLight.point(intensity: 10000000000, falloffRadius: 10));
|
DirectLight.point(intensity: 1000000, falloffRadius: 10));
|
||||||
await viewer.setLightPosition(light, 0, 10, 0);
|
await viewer.setLightPosition(light, 1, 2, 2);
|
||||||
await testHelper.capture(viewer, "add_point_light");
|
await testHelper.capture(viewer.view, "add_point_light");
|
||||||
await viewer.destroyLights();
|
await viewer.setLightPosition(light, -1, 2, 2);
|
||||||
await testHelper.capture(viewer, "remove_lights");
|
await testHelper.capture(viewer.view, "move_point_light");
|
||||||
|
await viewer.removeLight(light);
|
||||||
|
await testHelper.capture(viewer.view, "remove_point_light");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('add/remove IBL', () async {
|
|
||||||
await testHelper.withViewer((viewer) async {
|
|
||||||
await viewer.loadGlb("file://${testHelper.testDir}/assets/cube.glb");
|
|
||||||
|
|
||||||
await viewer
|
|
||||||
.loadIbl("file://${testHelper.testDir}/assets/default_env_ibl.ktx");
|
|
||||||
await testHelper.capture(viewer, "load_ibl");
|
|
||||||
await viewer.removeIbl();
|
|
||||||
await testHelper.capture(viewer, "remove_ibl");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('add/remove skybox', () async {
|
|
||||||
await testHelper.withViewer((viewer) async {
|
|
||||||
await viewer.loadGlb("file://${testHelper.testDir}/assets/cube.glb");
|
|
||||||
|
|
||||||
await viewer
|
|
||||||
.loadSkybox("file://${testHelper.testDir}/assets/default_env_skybox.ktx");
|
|
||||||
await testHelper.capture(viewer, "load_skybox");
|
|
||||||
await viewer.removeSkybox();
|
|
||||||
await testHelper.capture(viewer, "remove_skybox");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user