add implementation methods for getPrimitiveCount, setMaterialInstancesFromMap, getMaterialInstancesAsMap and setMaterialInstanceForAll

This commit is contained in:
Nick Fisher
2025-06-09 18:28:33 +08:00
parent 4086c9bd01
commit fef48940fc

View File

@@ -478,14 +478,76 @@ class FFIAsset extends ThermionAsset {
return FFIMaterialInstance(ptr, app);
}
///
///
///
Future setMaterialInstanceForAll(FFIMaterialInstance instance) async {
for (int i = 0; i < await getPrimitiveCount(entity: entity); i++) {
if (RenderableManager_isRenderable(app.renderableManager, entity)) {
await setMaterialInstanceAt(instance,
entity: entity, primitiveIndex: i);
}
}
for (final entity in await getChildEntities()) {
if (!RenderableManager_isRenderable(app.renderableManager, entity)) {
continue;
}
for (int i = 0; i < await getPrimitiveCount(entity: entity); i++) {
await setMaterialInstanceAt(instance,
entity: entity, primitiveIndex: i);
}
}
}
///
///
///
Future<Map<ThermionEntity, List<MaterialInstance>>>
getMaterialInstancesAsMap() async {
final result = <ThermionEntity, List<MaterialInstance>>{};
var entities = [entity, ...await getChildEntities()];
for (final entity in entities) {
if (RenderableManager_isRenderable(app.renderableManager, entity)) {
result[entity] = [];
for (int i = 0; i < await getPrimitiveCount(entity: entity); i++) {
result[entity]!
.add(await getMaterialInstanceAt(entity: entity, index: i));
}
}
}
return result;
}
///
///
///
Future setMaterialInstancesFromMap(
Map<ThermionEntity, List<MaterialInstance>> materialInstances) async {
for (final entity in materialInstances.keys) {
if (RenderableManager_isRenderable(app.renderableManager, entity)) {
for (int i = 0; i < materialInstances[entity]!.length; i++) {
final mi = materialInstances[entity]![i];
await setMaterialInstanceAt(mi as FFIMaterialInstance,
entity: entity, primitiveIndex: i);
}
}
}
}
///
///
///
@override
Future setMaterialInstanceAt(FFIMaterialInstance instance,
{int? entity = null, int primitiveIndex = 0}) async {
if (entity == null) {
if (entity != null &&
!RenderableManager_isRenderable(app.renderableManager, entity)) {
_logger.warning("Provided entity is not renderable");
return;
}
if (entity == null) {
if (RenderableManager_isRenderable(app.renderableManager, this.entity)) {
entity ??= this.entity;
} else {
@@ -501,15 +563,14 @@ class FFIAsset extends ThermionAsset {
if (entity == null) {
throw Exception("Failed to find renderable entity");
}
if (!RenderableManager_setMaterialInstanceAt(
Engine_getRenderableManager(app.engine),
entity,
primitiveIndex,
instance.pointer)) {
_logger.warning(
"Failed to set material instance for entity $entity at primitive index ${primitiveIndex}");
Engine_getRenderableManager(app.engine),
entity,
primitiveIndex,
instance.pointer)) {
_logger.warning(
"Failed to set material instance for entity $entity at primitive index ${primitiveIndex}");
}
}
@@ -907,8 +968,7 @@ class FFIAsset extends ThermionAsset {
///
///
Future setTransform(Matrix4 transform, {ThermionEntity? entity}) async {
await FilamentApp.instance!.setTransform(
entity ?? this.entity, transform);
await FilamentApp.instance!.setTransform(entity ?? this.entity, transform);
}
///
@@ -987,7 +1047,9 @@ class FFIAsset extends ThermionAsset {
///
@override
Future resetBones() async {
await withVoidCallback((requestId, cb) => AnimationManager_resetToRestPoseRenderThread(animationManager, asset, requestId, cb));
await withVoidCallback((requestId, cb) =>
AnimationManager_resetToRestPoseRenderThread(
animationManager, asset, requestId, cb));
}
///
@@ -1084,4 +1146,9 @@ class FFIAsset extends ThermionAsset {
AnimationManager_removeMorphAnimationComponent(animationManager, child);
}
}
Future<int> getPrimitiveCount({ThermionEntity? entity}) async {
entity ??= this.entity;
return RenderableManager_getPrimitiveCount(app.renderableManager, entity);
}
}