feat: expose setLightDirection and setLightPosition
This commit is contained in:
@@ -183,6 +183,28 @@ external void clear_lights(
|
|||||||
ffi.Pointer<ffi.Void> viewer,
|
ffi.Pointer<ffi.Void> viewer,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ffi.Native<
|
||||||
|
ffi.Void Function(
|
||||||
|
ffi.Pointer<ffi.Void>, EntityId, ffi.Float, ffi.Float, ffi.Float)>()
|
||||||
|
external void set_light_position(
|
||||||
|
ffi.Pointer<ffi.Void> viewer,
|
||||||
|
int light,
|
||||||
|
double x,
|
||||||
|
double y,
|
||||||
|
double z,
|
||||||
|
);
|
||||||
|
|
||||||
|
@ffi.Native<
|
||||||
|
ffi.Void Function(
|
||||||
|
ffi.Pointer<ffi.Void>, EntityId, ffi.Float, ffi.Float, ffi.Float)>()
|
||||||
|
external void set_light_direction(
|
||||||
|
ffi.Pointer<ffi.Void> viewer,
|
||||||
|
int light,
|
||||||
|
double x,
|
||||||
|
double y,
|
||||||
|
double z,
|
||||||
|
);
|
||||||
|
|
||||||
@ffi.Native<
|
@ffi.Native<
|
||||||
EntityId Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>, ffi.Int)>()
|
EntityId Function(ffi.Pointer<ffi.Void>, ffi.Pointer<ffi.Char>, ffi.Int)>()
|
||||||
external int load_glb(
|
external int load_glb(
|
||||||
|
|||||||
@@ -2256,4 +2256,28 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
[_sceneManager!, visible.toJS].toJS,
|
[_sceneManager!, visible.toJS].toJS,
|
||||||
null);
|
null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future setLightDirection(ThermionEntity lightEntity, Vector3 direction) async {
|
||||||
|
direction.normalize();
|
||||||
|
_module!.ccall(
|
||||||
|
"set_light_direction",
|
||||||
|
"void",
|
||||||
|
["void*".toJS, "double".toJS, "double".toJS, "double".toJS].toJS,
|
||||||
|
[_viewer!, direction.x.toJS, direction.y.toJS, direction.z.toJS]
|
||||||
|
.toJS,
|
||||||
|
null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future setLightPosition(
|
||||||
|
ThermionEntity lightEntity, double x, double y, double z) async {
|
||||||
|
_module!.ccall(
|
||||||
|
"set_light_position",
|
||||||
|
"void",
|
||||||
|
["void*".toJS, "double".toJS, "double".toJS, "double".toJS].toJS,
|
||||||
|
[_viewer!, x.toJS,y.toJS,z.toJS]
|
||||||
|
.toJS,
|
||||||
|
null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -570,10 +570,20 @@ abstract class ThermionViewer {
|
|||||||
Future transformToUnitCube(ThermionEntity entity);
|
Future transformToUnitCube(ThermionEntity entity);
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Directly sets the world space position for [entity] to the given coordinates, skipping all collision detection.
|
/// Directly sets the world space position for [entity] to the given coordinates.
|
||||||
///
|
///
|
||||||
Future setPosition(ThermionEntity entity, double x, double y, double z);
|
Future setPosition(ThermionEntity entity, double x, double y, double z);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Set the world space position for [lightEntity] to the given coordinates.
|
||||||
|
///
|
||||||
|
Future setLightPosition(ThermionEntity lightEntity, double x, double y, double z);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Sets the world space direction for [lightEntity] to the given vector.
|
||||||
|
///
|
||||||
|
Future setLightDirection(ThermionEntity lightEntity, Vector3 direction);
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Directly sets the scale for [entity], skipping all collision detection.
|
/// Directly sets the scale for [entity], skipping all collision detection.
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -1287,6 +1287,24 @@ class ThermionViewerFFI extends ThermionViewer {
|
|||||||
set_position(_sceneManager!, entity, x, y, z);
|
set_position(_sceneManager!, entity, x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
|
@override
|
||||||
|
Future setLightPosition(
|
||||||
|
ThermionEntity lightEntity, double x, double y, double z) async {
|
||||||
|
set_light_position(_viewer!, lightEntity, x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
|
@override
|
||||||
|
Future setLightDirection(ThermionEntity lightEntity, Vector3 direction) async {
|
||||||
|
direction.normalize();
|
||||||
|
set_light_direction(_viewer!, lightEntity, direction.x, direction.y, direction.z);
|
||||||
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -147,6 +147,8 @@ namespace thermion_filament
|
|||||||
float sunHaloSize,
|
float sunHaloSize,
|
||||||
float sunHaloFallof,
|
float sunHaloFallof,
|
||||||
bool shadows);
|
bool shadows);
|
||||||
|
void setLightPosition(EntityId entityId, float x, float y, float z);
|
||||||
|
void setLightDirection(EntityId entityId, float x, float y, float z);
|
||||||
void removeLight(EntityId entityId);
|
void removeLight(EntityId entityId);
|
||||||
void clearLights();
|
void clearLights();
|
||||||
void setPostProcessing(bool enabled);
|
void setPostProcessing(bool enabled);
|
||||||
|
|||||||
@@ -93,6 +93,8 @@ extern "C"
|
|||||||
bool shadows);
|
bool shadows);
|
||||||
EMSCRIPTEN_KEEPALIVE void remove_light(const void *const viewer, EntityId entityId);
|
EMSCRIPTEN_KEEPALIVE void remove_light(const void *const viewer, EntityId entityId);
|
||||||
EMSCRIPTEN_KEEPALIVE void clear_lights(const void *const viewer);
|
EMSCRIPTEN_KEEPALIVE void clear_lights(const void *const viewer);
|
||||||
|
EMSCRIPTEN_KEEPALIVE void set_light_position(const void *const viewer, EntityId light, float x, float y, float z);
|
||||||
|
EMSCRIPTEN_KEEPALIVE void set_light_direction(const void *const viewer, EntityId light, float x, float y, float z);
|
||||||
EMSCRIPTEN_KEEPALIVE EntityId load_glb(void *sceneManager, const char *assetPath, int numInstances);
|
EMSCRIPTEN_KEEPALIVE EntityId load_glb(void *sceneManager, const char *assetPath, int numInstances);
|
||||||
EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length);
|
EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length);
|
||||||
EMSCRIPTEN_KEEPALIVE EntityId load_gltf(void *sceneManager, const char *assetPath, const char *relativePath);
|
EMSCRIPTEN_KEEPALIVE EntityId load_gltf(void *sceneManager, const char *assetPath, const char *relativePath);
|
||||||
|
|||||||
@@ -288,7 +288,6 @@ namespace thermion_filament
|
|||||||
fro.interval = 1; // frameInterval;
|
fro.interval = 1; // frameInterval;
|
||||||
fro.history = 5;
|
fro.history = 5;
|
||||||
_renderer->setFrameRateOptions(fro);
|
_renderer->setFrameRateOptions(fro);
|
||||||
Log("Set frame interval to %f", frameInterval);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EntityId FilamentViewer::addLight(
|
EntityId FilamentViewer::addLight(
|
||||||
@@ -310,9 +309,6 @@ namespace thermion_filament
|
|||||||
bool shadows)
|
bool shadows)
|
||||||
{
|
{
|
||||||
auto light = EntityManager::get().create();
|
auto light = EntityManager::get().create();
|
||||||
auto &transformManager = _engine->getTransformManager();
|
|
||||||
transformManager.create(light);
|
|
||||||
auto parent = transformManager.getInstance(light);
|
|
||||||
|
|
||||||
auto result = LightManager::Builder(t)
|
auto result = LightManager::Builder(t)
|
||||||
.color(Color::cct(colour))
|
.color(Color::cct(colour))
|
||||||
@@ -336,16 +332,43 @@ namespace thermion_filament
|
|||||||
_lights.push_back(light);
|
_lights.push_back(light);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto entityId = Entity::smuggle(light);
|
return Entity::smuggle(light);
|
||||||
auto transformInstance = transformManager.getInstance(light);
|
}
|
||||||
transformManager.setTransform(transformInstance, math::mat4::translation(math::float3{posX, posY, posZ}));
|
|
||||||
// Log("Added light under entity ID %d of type %d with colour %f intensity %f at (%f, %f, %f) with direction (%f, %f, %f) with shadows %d", entityId, t, colour, intensity, posX, posY, posZ, dirX, dirY, dirZ, shadows);
|
void FilamentViewer::setLightPosition(EntityId entityId, float x, float y, float z) {
|
||||||
return entityId;
|
auto light = Entity::import(entityId);
|
||||||
|
|
||||||
|
if(light.isNull()) {
|
||||||
|
Log("Light not found for entity %d", entityId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& lm = _engine->getLightManager();
|
||||||
|
|
||||||
|
auto instance = lm.getInstance(light);
|
||||||
|
|
||||||
|
lm.setPosition(instance, filament::math::float3 { x, y, z });
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void FilamentViewer::setLightDirection(EntityId entityId, float x, float y, float z) {
|
||||||
|
auto light = Entity::import(entityId);
|
||||||
|
|
||||||
|
if(light.isNull()) {
|
||||||
|
Log("Light not found for entity %d", entityId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& lm = _engine->getLightManager();
|
||||||
|
|
||||||
|
auto instance = lm.getInstance(light);
|
||||||
|
|
||||||
|
lm.setDirection(instance, filament::math::float3 { x, y, z });
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FilamentViewer::removeLight(EntityId entityId)
|
void FilamentViewer::removeLight(EntityId entityId)
|
||||||
{
|
{
|
||||||
Log("Removing light with entity ID %d", entityId);
|
|
||||||
auto entity = utils::Entity::import(entityId);
|
auto entity = utils::Entity::import(entityId);
|
||||||
if (entity.isNull())
|
if (entity.isNull())
|
||||||
{
|
{
|
||||||
@@ -361,7 +384,6 @@ namespace thermion_filament
|
|||||||
|
|
||||||
void FilamentViewer::clearLights()
|
void FilamentViewer::clearLights()
|
||||||
{
|
{
|
||||||
Log("Removing all lights");
|
|
||||||
_scene->removeEntities(_lights.data(), _lights.size());
|
_scene->removeEntities(_lights.data(), _lights.size());
|
||||||
EntityManager::get().destroy(_lights.size(), _lights.data());
|
EntityManager::get().destroy(_lights.size(), _lights.data());
|
||||||
_lights.clear();
|
_lights.clear();
|
||||||
@@ -1364,7 +1386,6 @@ namespace thermion_filament
|
|||||||
{
|
{
|
||||||
if (!_view || !_mainCamera)
|
if (!_view || !_mainCamera)
|
||||||
{
|
{
|
||||||
Log("Skipping camera update, no view or camrea");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1379,8 +1400,6 @@ namespace thermion_filament
|
|||||||
cam.setLensProjection(_cameraFocalLength, aspect, _near,
|
cam.setLensProjection(_cameraFocalLength, aspect, _near,
|
||||||
_far);
|
_far);
|
||||||
|
|
||||||
Log("Set viewport to width: %d height: %d aspect %f scaleFactor : %f", width, height, aspect,
|
|
||||||
contentScaleFactor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FilamentViewer::setViewFrustumCulling(bool enabled)
|
void FilamentViewer::setViewFrustumCulling(bool enabled)
|
||||||
@@ -1398,7 +1417,7 @@ namespace thermion_filament
|
|||||||
{
|
{
|
||||||
Camera &cam = _view->getCamera();
|
Camera &cam = _view->getCamera();
|
||||||
const auto &vp = _view->getViewport();
|
const auto &vp = _view->getViewport();
|
||||||
auto aspect = vp.width / vp.height;
|
const float aspect = static_cast<float>(vp.width) / static_cast<float>(vp.height);
|
||||||
cam.setProjection(fovInDegrees, aspect, _near, _far, horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL);
|
cam.setProjection(fovInDegrees, aspect, _near, _far, horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1672,7 +1691,7 @@ namespace thermion_filament
|
|||||||
if (materialPath)
|
if (materialPath)
|
||||||
{
|
{
|
||||||
auto matData = _resourceLoaderWrapper->load(materialPath);
|
auto matData = _resourceLoaderWrapper->load(materialPath);
|
||||||
auto mat = Material::Builder().package(matData.data, matData.size).build(*_engine);
|
mat = Material::Builder().package(matData.data, matData.size).build(*_engine);
|
||||||
_resourceLoaderWrapper->free(matData);
|
_resourceLoaderWrapper->free(matData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1706,8 +1725,6 @@ namespace thermion_filament
|
|||||||
|
|
||||||
_scene->addEntity(renderable);
|
_scene->addEntity(renderable);
|
||||||
|
|
||||||
Log("Created geometry with primitive type %d (result %d)", primitiveType, result);
|
|
||||||
|
|
||||||
return Entity::smuggle(renderable);
|
return Entity::smuggle(renderable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -148,6 +148,14 @@ extern "C"
|
|||||||
shadows);
|
shadows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMSCRIPTEN_KEEPALIVE void set_light_position(const void *const viewer, int32_t entityId, float x, float y, float z) {
|
||||||
|
((FilamentViewer*)viewer)->setLightPosition(entityId, x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
EMSCRIPTEN_KEEPALIVE void set_light_direction(const void *const viewer, int32_t entityId, float x, float y, float z) {
|
||||||
|
((FilamentViewer*)viewer)->setLightDirection(entityId, x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE void remove_light(const void *const viewer, int32_t entityId)
|
EMSCRIPTEN_KEEPALIVE void remove_light(const void *const viewer, int32_t entityId)
|
||||||
{
|
{
|
||||||
((FilamentViewer *)viewer)->removeLight(entityId);
|
((FilamentViewer *)viewer)->removeLight(entityId);
|
||||||
|
|||||||
Reference in New Issue
Block a user