allow directly creating an entity and setting transform
This commit is contained in:
@@ -10,6 +10,7 @@ import 'package:thermion_dart/src/filament/src/implementation/ffi_scene.dart';
|
|||||||
import 'package:thermion_dart/src/filament/src/implementation/ffi_swapchain.dart';
|
import 'package:thermion_dart/src/filament/src/implementation/ffi_swapchain.dart';
|
||||||
import 'package:thermion_dart/src/filament/src/implementation/ffi_texture.dart';
|
import 'package:thermion_dart/src/filament/src/implementation/ffi_texture.dart';
|
||||||
import 'package:thermion_dart/src/filament/src/implementation/ffi_view.dart';
|
import 'package:thermion_dart/src/filament/src/implementation/ffi_view.dart';
|
||||||
|
import 'package:thermion_dart/src/utils/src/matrix.dart';
|
||||||
import 'package:thermion_dart/thermion_dart.dart';
|
import 'package:thermion_dart/thermion_dart.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'resource_loader.dart';
|
import 'resource_loader.dart';
|
||||||
@@ -1092,4 +1093,23 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
|
|||||||
void onDestroy(Future Function() callback) {
|
void onDestroy(Future Function() callback) {
|
||||||
_onDestroy.add(callback);
|
_onDestroy.add(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
|
Future<ThermionEntity> createEntity(
|
||||||
|
{bool createTransformComponent = true}) async {
|
||||||
|
final entity = EntityManager_createEntity(Engine_getEntityManager(engine));
|
||||||
|
if (createTransformComponent) {
|
||||||
|
TransformManager_createComponent(transformManager, entity);
|
||||||
|
}
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
|
Future setTransform(ThermionEntity entity, Matrix4 transform) async {
|
||||||
|
TransformManager_setTransform(transformManager, entity, matrix4ToDouble4x4(transform));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -320,4 +320,14 @@ abstract class FilamentApp<T> {
|
|||||||
///
|
///
|
||||||
///
|
///
|
||||||
void onDestroy(Future Function() callback);
|
void onDestroy(Future Function() callback);
|
||||||
|
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
|
Future<ThermionEntity> createEntity({bool createTransformComponent = true});
|
||||||
|
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
|
Future setTransform(ThermionEntity entity, Matrix4 transform);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -183,6 +183,12 @@ namespace thermion
|
|||||||
return reinterpret_cast<TLightManager *>(&lightManager);
|
return reinterpret_cast<TLightManager *>(&lightManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMSCRIPTEN_KEEPALIVE TEntityManager *Engine_getEntityManager(TEngine *tEngine) {
|
||||||
|
auto *engine = reinterpret_cast<Engine *>(tEngine);
|
||||||
|
auto &entityManager = engine->getEntityManager();
|
||||||
|
return reinterpret_cast<TEntityManager *>(&entityManager);
|
||||||
|
}
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE TCamera *Engine_createCamera(TEngine *tEngine)
|
EMSCRIPTEN_KEEPALIVE TCamera *Engine_createCamera(TEngine *tEngine)
|
||||||
{
|
{
|
||||||
auto *engine = reinterpret_cast<Engine *>(tEngine);
|
auto *engine = reinterpret_cast<Engine *>(tEngine);
|
||||||
@@ -404,6 +410,11 @@ namespace thermion
|
|||||||
engine->destroy(indirectLight);
|
engine->destroy(indirectLight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMSCRIPTEN_KEEPALIVE EntityId EntityManager_createEntity(TEntityManager *tEntityManager) {
|
||||||
|
auto entityManager = reinterpret_cast<utils::EntityManager *>(tEntityManager);
|
||||||
|
auto entity = entityManager->create();
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -168,4 +168,14 @@ extern "C"
|
|||||||
|
|
||||||
return Entity::smuggle(parent);
|
return Entity::smuggle(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMSCRIPTEN_KEEPALIVE void TransformManager_createComponent(TTransformManager *tTransformManager, EntityId entityId) {
|
||||||
|
auto tm = reinterpret_cast<TransformManager *>(tTransformManager);
|
||||||
|
auto entity = Entity::import(entityId);
|
||||||
|
if(tm->hasComponent(entity)) {
|
||||||
|
Log("Entity already has transform component");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tm->create(entity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -8,45 +8,60 @@ import 'helpers.dart';
|
|||||||
void main() async {
|
void main() async {
|
||||||
final testHelper = TestHelper("transforms");
|
final testHelper = TestHelper("transforms");
|
||||||
await testHelper.setup();
|
await testHelper.setup();
|
||||||
group("transforms", () {
|
|
||||||
test('set/unset parent geometry', () async {
|
|
||||||
await testHelper.withViewer((viewer) async {
|
|
||||||
var blueMaterialInstance =
|
|
||||||
await FilamentApp.instance!.createUnlitMaterialInstance();
|
|
||||||
final blueCube = await viewer.createGeometry(
|
|
||||||
GeometryHelper.cube(normals: false, uvs: false),
|
|
||||||
materialInstances: [blueMaterialInstance]);
|
|
||||||
await blueMaterialInstance.setParameterFloat4(
|
|
||||||
"baseColorFactor", 0.0, 0.0, 1.0, 1.0);
|
|
||||||
|
|
||||||
// Position blue cube slightly behind and to the right
|
test('create entity and set as parent', () async {
|
||||||
await blueCube
|
await testHelper.withViewer((viewer) async {
|
||||||
.setTransform(Matrix4.translation(Vector3(1.0, 0.0, -1.0)));
|
final cube = await viewer
|
||||||
|
.createGeometry(GeometryHelper.cube(normals: false, uvs: false));
|
||||||
|
|
||||||
var greenMaterialInstance =
|
await testHelper.capture(viewer.view, "create_entity_before_parent");
|
||||||
await FilamentApp.instance!.createUnlitMaterialInstance();
|
|
||||||
final greenCube = await viewer.createGeometry(
|
final entity = await FilamentApp.instance!.createEntity();
|
||||||
GeometryHelper.cube(normals: false, uvs: false),
|
|
||||||
materialInstances: [greenMaterialInstance]);
|
|
||||||
await greenMaterialInstance.setParameterFloat4(
|
|
||||||
"baseColorFactor", 0.0, 1.0, 0.0, 1.0);
|
|
||||||
|
|
||||||
await viewer.addToScene(blueCube);
|
await FilamentApp.instance!.setParent(cube.entity, entity);
|
||||||
await viewer.addToScene(greenCube);
|
|
||||||
|
|
||||||
await testHelper.capture(viewer.view, "before_parent");
|
await FilamentApp.instance!.setTransform(entity, Matrix4.translation(Vector3.all(-1)));
|
||||||
|
|
||||||
await FilamentApp.instance!.setParent(blueCube.entity, greenCube.entity);
|
await testHelper.capture(viewer.view, "create_entity_after_parent");
|
||||||
|
|
||||||
await greenCube.setTransform(Matrix4.translation(Vector3.all(-1)));
|
});
|
||||||
|
});
|
||||||
|
|
||||||
await testHelper.capture(viewer.view, "after_parent");
|
test('set/unset parent geometry', () async {
|
||||||
|
await testHelper.withViewer((viewer) async {
|
||||||
|
var blueMaterialInstance =
|
||||||
|
await FilamentApp.instance!.createUnlitMaterialInstance();
|
||||||
|
final blueCube = await viewer.createGeometry(
|
||||||
|
GeometryHelper.cube(normals: false, uvs: false),
|
||||||
|
materialInstances: [blueMaterialInstance]);
|
||||||
|
await blueMaterialInstance.setParameterFloat4(
|
||||||
|
"baseColorFactor", 0.0, 0.0, 1.0, 1.0);
|
||||||
|
|
||||||
await FilamentApp.instance!.setParent(blueCube.entity, null);
|
// Position blue cube slightly behind and to the right
|
||||||
|
await blueCube.setTransform(Matrix4.translation(Vector3(1.0, 0.0, -1.0)));
|
||||||
|
|
||||||
await testHelper.capture(viewer.view, "unparent");
|
var greenMaterialInstance =
|
||||||
});
|
await FilamentApp.instance!.createUnlitMaterialInstance();
|
||||||
|
final greenCube = await viewer.createGeometry(
|
||||||
|
GeometryHelper.cube(normals: false, uvs: false),
|
||||||
|
materialInstances: [greenMaterialInstance]);
|
||||||
|
await greenMaterialInstance.setParameterFloat4(
|
||||||
|
"baseColorFactor", 0.0, 1.0, 0.0, 1.0);
|
||||||
|
|
||||||
|
await viewer.addToScene(blueCube);
|
||||||
|
await viewer.addToScene(greenCube);
|
||||||
|
|
||||||
|
await testHelper.capture(viewer.view, "before_parent");
|
||||||
|
|
||||||
|
await FilamentApp.instance!.setParent(blueCube.entity, greenCube.entity);
|
||||||
|
|
||||||
|
await greenCube.setTransform(Matrix4.translation(Vector3.all(-1)));
|
||||||
|
|
||||||
|
await testHelper.capture(viewer.view, "after_parent");
|
||||||
|
|
||||||
|
await FilamentApp.instance!.setParent(blueCube.entity, null);
|
||||||
|
|
||||||
|
await testHelper.capture(viewer.view, "unparent");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user