internal: expose more RenderableManager/LightManager bindings

This commit is contained in:
Nick Fisher
2025-01-06 18:57:26 +08:00
parent 6cefe44c64
commit b1c0d4b2e8
7 changed files with 190 additions and 35 deletions

View File

@@ -1,33 +1,94 @@
#include <filament/LightManager.h>
#include <utils/Entity.h>
#include "c_api/APIExport.h"
#include "Log.hpp"
extern "C"
{
#include "c_api/TLightManager.h"
EMSCRIPTEN_KEEPALIVE void LightManager_setPosition(TLightManager *tLightManager, EntityId light, double x, double y, double z) {
auto lightManager = reinterpret_cast<filament::LightManager*>(tLightManager);
auto instance = lightManager->getInstance(utils::Entity::import(light));
if(!instance.isValid()) {
Log("Warning: invalid light instance");
return;
}
lightManager->setPosition(instance, filament::math::float3 { x, y, z });
extern "C" {
EMSCRIPTEN_KEEPALIVE void LightManager_setPosition(TLightManager *tLightManager, EntityId light, double x, double y, double z) {
auto lightManager = reinterpret_cast<filament::LightManager*>(tLightManager);
auto instance = lightManager->getInstance(utils::Entity::import(light));
if (!instance.isValid()) {
Log("Warning: invalid light instance");
return;
}
lightManager->setPosition(instance, filament::math::float3 { static_cast<float>(x), static_cast<float>(y), static_cast<float>(z) });
}
EMSCRIPTEN_KEEPALIVE void LightManager_setDirection(TLightManager *tLightManager, EntityId light, double x, double y, double z) {
auto lightManager = reinterpret_cast<filament::LightManager*>(tLightManager);
auto instance = lightManager->getInstance(utils::Entity::import(light));
if (!instance.isValid()) {
Log("Warning: invalid light instance");
return;
}
lightManager->setDirection(instance, filament::math::float3 { static_cast<float>(x), static_cast<float>(y), static_cast<float>(z) });
}
EMSCRIPTEN_KEEPALIVE int LightManager_createLight(TLightManager *tLightManager, EntityId entity, int type) {
auto* lm = reinterpret_cast<filament::LightManager*>(tLightManager);
filament::LightManager::Type lightType;
switch (type) {
case 0: lightType = filament::LightManager::Type::SUN; break;
case 1: lightType = filament::LightManager::Type::DIRECTIONAL; break;
case 2: lightType = filament::LightManager::Type::POINT; break;
case 3: lightType = filament::LightManager::Type::FOCUSED_SPOT; break;
case 4: lightType = filament::LightManager::Type::SPOT; break;
default: return -1;
}
EMSCRIPTEN_KEEPALIVE void LightManager_setDirection(TLightManager *tLightManager, EntityId light, double x, double y, double z) {
auto lightManager = reinterpret_cast<filament::LightManager*>(tLightManager);
auto instance = lightManager->getInstance(utils::Entity::import(light));
if(!instance.isValid()) {
Log("Warning: invalid light instance");
return;
}
lightManager->setPosition(instance, filament::math::float3 { x, y, z });
filament::LightManager::Builder builder(lightType);
return false;
// auto result = builder.build(*lm->getEngine(), utils::Entity::import(entity));
// return result == filament::LightManager::Result::Success ? 0 : -1;
}
EMSCRIPTEN_KEEPALIVE void LightManager_destroyLight(TLightManager *tLightManager, EntityId entity) {
auto* lm = reinterpret_cast<filament::LightManager*>(tLightManager);
lm->destroy(utils::Entity::import(entity));
}
EMSCRIPTEN_KEEPALIVE void LightManager_setColor(TLightManager *tLightManager, EntityId entity, double r, double g, double b) {
auto* lm = reinterpret_cast<filament::LightManager*>(tLightManager);
auto instance = lm->getInstance(utils::Entity::import(entity));
if (instance.isValid()) {
lm->setColor(instance, {static_cast<float>(r), static_cast<float>(g), static_cast<float>(b)});
}
}
}
EMSCRIPTEN_KEEPALIVE void LightManager_setIntensity(TLightManager *tLightManager, EntityId entity, double intensity) {
auto* lm = reinterpret_cast<filament::LightManager*>(tLightManager);
auto instance = lm->getInstance(utils::Entity::import(entity));
if (instance.isValid()) {
lm->setIntensity(instance, static_cast<float>(intensity));
}
}
EMSCRIPTEN_KEEPALIVE void LightManager_setFalloff(TLightManager *tLightManager, EntityId entity, double falloff) {
auto* lm = reinterpret_cast<filament::LightManager*>(tLightManager);
auto instance = lm->getInstance(utils::Entity::import(entity));
if (instance.isValid()) {
lm->setFalloff(instance, static_cast<float>(falloff));
}
}
EMSCRIPTEN_KEEPALIVE void LightManager_setSpotLightCone(TLightManager *tLightManager, EntityId entity, double inner, double outer) {
auto* lm = reinterpret_cast<filament::LightManager*>(tLightManager);
auto instance = lm->getInstance(utils::Entity::import(entity));
if (instance.isValid()) {
lm->setSpotLightCone(instance, static_cast<float>(inner), static_cast<float>(outer));
}
}
EMSCRIPTEN_KEEPALIVE void LightManager_setShadowCaster(TLightManager *tLightManager, EntityId entity, bool enabled) {
auto* lm = reinterpret_cast<filament::LightManager*>(tLightManager);
auto instance = lm->getInstance(utils::Entity::import(entity));
if (instance.isValid()) {
lm->setShadowCaster(instance, enabled);
}
}
} // extern "C"

View File

@@ -1,4 +1,3 @@
#include <filament/MaterialInstance.h>
#include <filament/RenderableManager.h>
#include <utils/Entity.h>
@@ -8,7 +7,6 @@
namespace thermion
{
extern "C"
{
using namespace filament;
@@ -47,5 +45,56 @@ namespace thermion
auto renderableInstance = renderableManager->getInstance(entity);
return renderableInstance.isValid();
}
EMSCRIPTEN_KEEPALIVE bool RenderableManager_hasComponent(TRenderableManager *tRenderableManager, EntityId entityId) {
auto *renderableManager = reinterpret_cast<filament::RenderableManager *>(tRenderableManager);
const auto &entity = utils::Entity::import(entityId);
return renderableManager->hasComponent(entity);
}
EMSCRIPTEN_KEEPALIVE bool RenderableManager_empty(TRenderableManager *tRenderableManager) {
auto *renderableManager = reinterpret_cast<filament::RenderableManager *>(tRenderableManager);
return renderableManager->empty();
}
EMSCRIPTEN_KEEPALIVE bool RenderableManager_getLightChannel(TRenderableManager *tRenderableManager, EntityId entityId, unsigned int channel) {
auto *renderableManager = reinterpret_cast<filament::RenderableManager *>(tRenderableManager);
const auto &entity = utils::Entity::import(entityId);
auto renderableInstance = renderableManager->getInstance(entity);
if (!renderableInstance.isValid()) {
return false;
}
return renderableManager->getLightChannel(renderableInstance, channel);
}
EMSCRIPTEN_KEEPALIVE bool RenderableManager_isShadowCaster(TRenderableManager *tRenderableManager, EntityId entityId) {
auto *renderableManager = reinterpret_cast<filament::RenderableManager *>(tRenderableManager);
const auto &entity = utils::Entity::import(entityId);
auto renderableInstance = renderableManager->getInstance(entity);
if (!renderableInstance.isValid()) {
return false;
}
return renderableManager->isShadowCaster(renderableInstance);
}
EMSCRIPTEN_KEEPALIVE bool RenderableManager_isShadowReceiver(TRenderableManager *tRenderableManager, EntityId entityId) {
auto *renderableManager = reinterpret_cast<filament::RenderableManager *>(tRenderableManager);
const auto &entity = utils::Entity::import(entityId);
auto renderableInstance = renderableManager->getInstance(entity);
if (!renderableInstance.isValid()) {
return false;
}
return renderableManager->isShadowReceiver(renderableInstance);
}
EMSCRIPTEN_KEEPALIVE bool RenderableManager_getFogEnabled(TRenderableManager *tRenderableManager, EntityId entityId) {
auto *renderableManager = reinterpret_cast<filament::RenderableManager *>(tRenderableManager);
const auto &entity = utils::Entity::import(entityId);
auto renderableInstance = renderableManager->getInstance(entity);
if (!renderableInstance.isValid()) {
return false;
}
return renderableManager->getFogEnabled(renderableInstance);
}
}
}