feat: add getAncestor method
This commit is contained in:
@@ -1043,6 +1043,12 @@ external int get_parent(
|
|||||||
int child,
|
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.Native<
|
||||||
ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId, EntityId, ffi.Bool)>()
|
ffi.Void Function(ffi.Pointer<ffi.Void>, EntityId, EntityId, ffi.Bool)>()
|
||||||
external void set_parent(
|
external void set_parent(
|
||||||
|
|||||||
@@ -773,9 +773,14 @@ abstract class ThermionViewer {
|
|||||||
PrimitiveType primitiveType = PrimitiveType.TRIANGLES});
|
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].
|
/// Sets the parent transform of [child] to [parent].
|
||||||
|
|||||||
@@ -1805,6 +1805,21 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
return parent;
|
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 {
|
test('set position based on screenspace coord', () async {
|
||||||
var viewer = await createViewer();
|
var viewer = await createViewer();
|
||||||
print(await viewer.getCameraFov(true));
|
print(await viewer.getCameraFov(true));
|
||||||
|
|||||||
Reference in New Issue
Block a user