feat: add getAncestor method
This commit is contained in:
@@ -1043,6 +1043,12 @@ external int get_parent(
|
||||
int child,
|
||||
);
|
||||
|
||||
@ffi.Native<EntityId Function(ffi.Pointer<ffi.Void>, EntityId)>()
|
||||
external int get_ancestor(
|
||||
ffi.Pointer<ffi.Void> sceneManager,
|
||||
int child,
|
||||
);
|
||||
|
||||
@ffi.Native<
|
||||
ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId, EntityId, ffi.Bool)>()
|
||||
external void set_parent(
|
||||
|
||||
@@ -773,9 +773,14 @@ abstract class ThermionViewer {
|
||||
PrimitiveType primitiveType = PrimitiveType.TRIANGLES});
|
||||
|
||||
///
|
||||
/// Gets the parent transform of [child].
|
||||
/// Gets the parent entity of [entity]. Returns null if the entity has no parent.
|
||||
///
|
||||
Future<ThermionEntity?> getParent(ThermionEntity child);
|
||||
Future<ThermionEntity?> getParent(ThermionEntity entity);
|
||||
|
||||
///
|
||||
/// Gets the ancestor (ultimate parent) entity of [entity]. Returns null if the entity has no parent.
|
||||
///
|
||||
Future<ThermionEntity?> getAncestor(ThermionEntity entity);
|
||||
|
||||
///
|
||||
/// Sets the parent transform of [child] to [parent].
|
||||
|
||||
@@ -1805,6 +1805,21 @@ class ThermionViewerFFI extends ThermionViewer {
|
||||
return parent;
|
||||
}
|
||||
|
||||
///
|
||||
///
|
||||
///
|
||||
@override
|
||||
Future<ThermionEntity?> getAncestor(ThermionEntity child) async {
|
||||
if (_sceneManager == null) {
|
||||
throw Exception("Asset manager must be non-null");
|
||||
}
|
||||
var parent = get_ancestor(_sceneManager!, child);
|
||||
if (parent == _FILAMENT_ASSET_ERROR) {
|
||||
return null;
|
||||
}
|
||||
return parent;
|
||||
}
|
||||
|
||||
///
|
||||
///
|
||||
///
|
||||
|
||||
@@ -124,7 +124,51 @@ void main() async {
|
||||
});
|
||||
});
|
||||
|
||||
group("transforms", () {
|
||||
group("transforms & parenting", () {
|
||||
test('getParent and getAncestor both return null when entity has no parent', () async {
|
||||
var viewer = await createViewer();
|
||||
|
||||
final cube = await viewer.createGeometry(cubeVertices, cubeIndices,
|
||||
primitiveType: PrimitiveType.TRIANGLES);
|
||||
|
||||
expect(await viewer.getParent(cube), isNull);
|
||||
expect(await viewer.getAncestor(cube), isNull);
|
||||
});
|
||||
|
||||
test(
|
||||
'getParent returns the parent entity after one has been set via setParent',
|
||||
() async {
|
||||
var viewer = await createViewer();
|
||||
|
||||
final cube1 = await viewer.createGeometry(cubeVertices, cubeIndices,
|
||||
primitiveType: PrimitiveType.TRIANGLES);
|
||||
final cube2 = await viewer.createGeometry(cubeVertices, cubeIndices,
|
||||
primitiveType: PrimitiveType.TRIANGLES);
|
||||
|
||||
await viewer.setParent(cube1, cube2);
|
||||
|
||||
final parent = await viewer.getParent(cube1);
|
||||
|
||||
expect(parent, cube2);
|
||||
});
|
||||
|
||||
test('getAncestor returns the ultimate parent entity', () async {
|
||||
var viewer = await createViewer();
|
||||
|
||||
final grandparent = await viewer.createGeometry(cubeVertices, cubeIndices,
|
||||
primitiveType: PrimitiveType.TRIANGLES);
|
||||
final parent = await viewer.createGeometry(cubeVertices, cubeIndices,
|
||||
primitiveType: PrimitiveType.TRIANGLES);
|
||||
final child = await viewer.createGeometry(cubeVertices, cubeIndices,
|
||||
primitiveType: PrimitiveType.TRIANGLES);
|
||||
|
||||
await viewer.setParent(child, parent);
|
||||
await viewer.setParent(parent, grandparent);
|
||||
|
||||
expect(await viewer.getAncestor(child), grandparent);
|
||||
|
||||
});
|
||||
|
||||
test('set position based on screenspace coord', () async {
|
||||
var viewer = await createViewer();
|
||||
print(await viewer.getCameraFov(true));
|
||||
|
||||
Reference in New Issue
Block a user