rename setLayerEnabled to setLayerVisibility, add setVisibilityLayer method

This commit is contained in:
Nick Fisher
2024-09-20 17:34:17 +08:00
parent 686b4800aa
commit 820ad7cb28
9 changed files with 124 additions and 25 deletions

View File

@@ -584,6 +584,7 @@ namespace thermion_filament
.material(0, _imageMaterial->getDefaultInstance())
.geometry(0, RenderableManager::PrimitiveType::TRIANGLES, _imageVb,
_imageIb, 0, 3)
.layerMask(0xFF, 1u << SceneManager::LAYERS::BACKGROUND)
.culling(false)
.build(*_engine, _imageEntity);
_scene->addEntity(_imageEntity);
@@ -969,7 +970,11 @@ namespace thermion_filament
delete vec; },
callbackData);
_skybox =
filament::Skybox::Builder().environment(_skyboxTexture).build(*_engine);
filament::Skybox::Builder()
.environment(_skyboxTexture)
.build(*_engine);
_skybox->setLayerMask(0xFF, 1u << SceneManager::LAYERS::BACKGROUND);
_scene->setSkybox(_skybox);
}

View File

@@ -104,6 +104,7 @@ namespace thermion_filament
_scene->addEntity(_gridOverlay->grid());
_view->setLayerEnabled(SceneManager::LAYERS::DEFAULT_ASSETS, true);
_view->setLayerEnabled(SceneManager::LAYERS::BACKGROUND, true); // skybox + image
_view->setLayerEnabled(SceneManager::LAYERS::OVERLAY, false); // world grid + gizmo
}
@@ -238,6 +239,17 @@ namespace thermion_filament
return eid;
}
void SceneManager::setVisibilityLayer(EntityId entityId, int layer) {
auto& rm = _engine->getRenderableManager();
auto renderable = rm.getInstance(utils::Entity::import(entityId));
if(!renderable.isValid()) {
Log("Warning: no renderable found");
}
rm.setLayerMask(renderable, 0xFF, 1u << layer);
}
EntityId SceneManager::loadGlbFromBuffer(const uint8_t *data, size_t length, int numInstances, bool keepData, int priority, int layer)
{
@@ -2393,7 +2405,7 @@ namespace thermion_filament
return Aabb2{minX, minY, maxX, maxY};
}
void SceneManager::setLayerEnabled(int layer, bool enabled)
void SceneManager::setLayerVisibility(LAYERS layer, bool enabled)
{
_view->setLayerEnabled(layer, enabled);
}
@@ -2528,6 +2540,18 @@ EntityId SceneManager::createGeometry(
return entityId;
}
MaterialInstance* SceneManager::getMaterialInstanceAt(EntityId entityId, int materialIndex) {
auto entity = Entity::import(entityId);
const auto &rm = _engine->getRenderableManager();
auto renderableInstance = rm.getInstance(entity);
if (!renderableInstance.isValid())
{
Log("Error retrieving material instance: no renderable found for entity %d");
return std::nullptr_t();
}
return rm.getMaterialInstanceAt(renderableInstance, materialIndex);
}
void SceneManager::setMaterialProperty(EntityId entityId, int materialIndex, const char *property, float value)
{
auto entity = Entity::import(entityId);
@@ -2620,7 +2644,6 @@ EntityId SceneManager::createGeometry(
return;
}
auto materialInstance = rm.getMaterialInstanceAt(renderableInstance, materialIndex);
materialInstance->setDepthWrite(enabled);
}

View File

@@ -927,9 +927,14 @@ extern "C"
*maxY = box.maxY;
}
EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled)
EMSCRIPTEN_KEEPALIVE void set_visibility_layer(void *const sceneManager, EntityId entity, int layer) {
((SceneManager*)sceneManager)->setVisibilityLayer(entity, layer);
}
EMSCRIPTEN_KEEPALIVE void set_layer_visibility(void *const sceneManager, int layer, bool visible)
{
((SceneManager *)sceneManager)->setLayerEnabled(layer, enabled);
((SceneManager *)sceneManager)->setLayerVisibility((SceneManager::LAYERS)layer, visible);
}
EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void *ptr)
@@ -962,9 +967,13 @@ extern "C"
((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, value);
}
EMSCRIPTEN_KEEPALIVE TMaterialInstance* get_material_instance_at(void *const sceneManager, EntityId entity, int materialIndex) {
auto instance = ((SceneManager *)sceneManager)->getMaterialInstanceAt(entity, materialIndex);
return reinterpret_cast<TMaterialInstance*>(instance);
}
EMSCRIPTEN_KEEPALIVE void set_material_property_int(void *const sceneManager, EntityId entity, int materialIndex, const char *property, int32_t value)
{
((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, value);
}