use opaque CameraPtr to set camera matrices/properties/etc

This commit is contained in:
Nick Fisher
2024-09-11 23:05:40 +08:00
parent 9fbcc9edaf
commit 141827c59c

View File

@@ -4,7 +4,6 @@
#endif #endif
#include "ResourceBuffer.hpp" #include "ResourceBuffer.hpp"
#include "FilamentViewer.hpp" #include "FilamentViewer.hpp"
#include "filament/LightManager.h" #include "filament/LightManager.h"
#include "Log.hpp" #include "Log.hpp"
@@ -13,21 +12,42 @@
#include <thread> #include <thread>
#include <functional> #include <functional>
using namespace thermion_filament;
#ifdef __EMSCRIPTEN__ #ifdef __EMSCRIPTEN__
#include <emscripten/emscripten.h> #include <emscripten/emscripten.h>
#endif #endif
using namespace thermion_filament;
extern "C" extern "C"
{ {
#include "ThermionDartApi.h" #include "ThermionDartApi.h"
// Helper function to convert filament::math::mat4 to double4x4
static double4x4 convert_mat4_to_double4x4(const filament::math::mat4 &mat)
{
return double4x4{
{mat[0][0], mat[0][1], mat[0][2], mat[0][3]},
{mat[1][0], mat[1][1], mat[1][2], mat[1][3]},
{mat[2][0], mat[2][1], mat[2][2], mat[2][3]},
{mat[3][0], mat[3][1], mat[3][2], mat[3][3]},
};
}
// Helper function to convert double4x4 to filament::math::mat4
static filament::math::mat4 convert_double4x4_to_mat4(const double4x4& d_mat)
{
return filament::math::mat4{
filament::math::float4{float(d_mat.col1[0]), float(d_mat.col1[1]), float(d_mat.col1[2]), float(d_mat.col1[3])},
filament::math::float4{float(d_mat.col2[0]), float(d_mat.col2[1]), float(d_mat.col2[2]), float(d_mat.col2[3])},
filament::math::float4{float(d_mat.col3[0]), float(d_mat.col3[1]), float(d_mat.col3[2]), float(d_mat.col3[3])},
filament::math::float4{float(d_mat.col4[0]), float(d_mat.col4[1]), float(d_mat.col4[2]), float(d_mat.col4[3])}
};
}
EMSCRIPTEN_KEEPALIVE const void *create_filament_viewer(const void *context, const void *const loader, void *const platform, const char *uberArchivePath) EMSCRIPTEN_KEEPALIVE const void *create_filament_viewer(const void *context, const void *const loader, void *const platform, const char *uberArchivePath)
{ {
const auto * loaderImpl = new ResourceLoaderWrapperImpl((ResourceLoaderWrapper*)loader); const auto *loaderImpl = new ResourceLoaderWrapperImpl((ResourceLoaderWrapper *)loader);
auto viewer = (const void *)new FilamentViewer(context, loaderImpl, platform, uberArchivePath); auto viewer = (const void *)new FilamentViewer(context, loaderImpl, platform, uberArchivePath);
return viewer; return viewer;
} }
@@ -77,8 +97,9 @@ extern "C"
((FilamentViewer *)viewer)->loadSkybox(skyboxPath); ((FilamentViewer *)viewer)->loadSkybox(skyboxPath);
} }
EMSCRIPTEN_KEEPALIVE void create_ibl(const void *const viewer, float r, float g, float b, float intensity) { EMSCRIPTEN_KEEPALIVE void create_ibl(const void *const viewer, float r, float g, float b, float intensity)
((FilamentViewer*)viewer)->createIbl(r, g, b, intensity); {
((FilamentViewer *)viewer)->createIbl(r, g, b, intensity);
} }
EMSCRIPTEN_KEEPALIVE void load_ibl(const void *const viewer, const char *iblPath, float intensity) EMSCRIPTEN_KEEPALIVE void load_ibl(const void *const viewer, const char *iblPath, float intensity)
@@ -111,16 +132,16 @@ extern "C"
} }
EMSCRIPTEN_KEEPALIVE EntityId add_light( EMSCRIPTEN_KEEPALIVE EntityId add_light(
const void *const viewer, const void *const viewer,
uint8_t type, uint8_t type,
float colour, float colour,
float intensity, float intensity,
float posX, float posX,
float posY, float posY,
float posZ, float posZ,
float dirX, float dirX,
float dirY, float dirY,
float dirZ, float dirZ,
float falloffRadius, float falloffRadius,
float spotLightConeInner, float spotLightConeInner,
float spotLightConeOuter, float spotLightConeOuter,
@@ -129,31 +150,17 @@ extern "C"
float sunHaloFallof, float sunHaloFallof,
bool shadows) bool shadows)
{ {
return ((FilamentViewer *)viewer)->addLight( return ((FilamentViewer *)viewer)->addLight((LightManager::Type)type, colour, intensity, posX, posY, posZ, dirX, dirY, dirZ, falloffRadius, spotLightConeInner, spotLightConeOuter, sunAngularRadius, sunHaloSize, sunHaloFallof, shadows);
(LightManager::Type)type,
colour,
intensity,
posX,
posY,
posZ,
dirX,
dirY,
dirZ,
falloffRadius,
spotLightConeInner,
spotLightConeOuter,
sunAngularRadius,
sunHaloSize,
sunHaloFallof,
shadows);
} }
EMSCRIPTEN_KEEPALIVE void set_light_position(const void *const viewer, int32_t entityId, float x, float y, float z) { 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); {
((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) { 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); {
((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)
@@ -211,70 +218,82 @@ extern "C"
return ((FilamentViewer *)viewer)->setCamera(asset, nodeName); return ((FilamentViewer *)viewer)->setCamera(asset, nodeName);
} }
EMSCRIPTEN_KEEPALIVE float get_camera_fov(const void *const viewer, bool horizontal) { EMSCRIPTEN_KEEPALIVE float get_camera_fov(CameraPtr* camera, bool horizontal)
return ((FilamentViewer*)viewer)->getCameraFov(horizontal); {
auto cam = reinterpret_cast<filament::Camera*>(camera);
return cam->getFieldOfViewInDegrees(horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL);
} }
EMSCRIPTEN_KEEPALIVE void set_camera_fov(const void *const viewer, float fovInDegrees, bool horizontal) EMSCRIPTEN_KEEPALIVE double get_camera_focal_length(CameraPtr* const camera) {
{ auto cam = reinterpret_cast<filament::Camera*>(camera);
return ((FilamentViewer *)viewer)->setCameraFov(double(fovInDegrees), horizontal); return cam->getFocalLength();
} }
const double *const get_camera_model_matrix(const void *const viewer) EMSCRIPTEN_KEEPALIVE void set_camera_projection_from_fov(CameraPtr* camera, double fovInDegrees, double aspect, double near, double far, bool horizontal)
{ {
const auto &modelMatrix = ((FilamentViewer *)viewer)->getCameraModelMatrix(); auto cam = reinterpret_cast<filament::Camera*>(camera);
double *array = (double *)calloc(16, sizeof(double)); cam->setProjection(fovInDegrees, aspect, near, far, horizontal ? Camera::Fov::HORIZONTAL : Camera::Fov::VERTICAL);
memcpy(array, modelMatrix.asArray(), 16 * sizeof(double));
return array;
} }
const double *const get_camera_view_matrix(const void *const viewer) EMSCRIPTEN_KEEPALIVE CameraPtr* get_camera(const void *const viewer, EntityId entity) {
{ auto filamentCamera = ((FilamentViewer*)viewer)->getCamera(entity);
const auto &matrix = ((FilamentViewer *)viewer)->getCameraViewMatrix(); return reinterpret_cast<CameraPtr*>(filamentCamera);
double *array = (double *)calloc(16, sizeof(double));
memcpy(array, matrix.asArray(), 16 * sizeof(double));
return array;
} }
const double *const get_camera_projection_matrix(const void *const viewer) double4x4 get_camera_model_matrix(CameraPtr* camera)
{ {
const auto &matrix = ((FilamentViewer *)viewer)->getCameraProjectionMatrix(); const auto &mat = reinterpret_cast<filament::Camera*>(camera)->getModelMatrix();
double *array = (double *)calloc(16, sizeof(double)); return convert_mat4_to_double4x4(mat);
memcpy(array, matrix.asArray(), 16 * sizeof(double));
return array;
} }
const double *const get_camera_culling_projection_matrix(const void *const viewer) double4x4 get_camera_view_matrix(CameraPtr* camera)
{ {
const auto &matrix = ((FilamentViewer *)viewer)->getCameraCullingProjectionMatrix(); const auto &mat = reinterpret_cast<filament::Camera*>(camera)->getViewMatrix();
double *array = (double *)calloc(16, sizeof(double)); return convert_mat4_to_double4x4(mat);
memcpy(array, matrix.asArray(), 16 * sizeof(double));
return array;
} }
void set_camera_projection_matrix(const void *const viewer, const double *const matrix, double near, double far) double4x4 get_camera_projection_matrix(CameraPtr* camera)
{ {
((FilamentViewer *)viewer)->setCameraProjectionMatrix(matrix, near, far); const auto &mat = reinterpret_cast<filament::Camera*>(camera)->getProjectionMatrix();
return convert_mat4_to_double4x4(mat);
} }
void set_camera_culling(const void *const viewer, double near, double far) double4x4 get_camera_culling_projection_matrix(CameraPtr* camera)
{ {
((FilamentViewer *)viewer)->setCameraCulling(near, far); const auto &mat = reinterpret_cast<filament::Camera*>(camera)->getCullingProjectionMatrix();
return convert_mat4_to_double4x4(mat);
} }
double get_camera_culling_near(const void *const viewer) void set_camera_projection_matrix(CameraPtr* camera, double4x4 matrix, double near, double far)
{ {
return ((FilamentViewer *)viewer)->getCameraCullingNear(); auto cam = reinterpret_cast<filament::Camera*>(camera);
const auto& mat = convert_double4x4_to_mat4(matrix);
cam->setCustomProjection(mat, near, far);
} }
double get_camera_culling_far(const void *const viewer) void set_camera_lens_projection(CameraPtr* camera, double near, double far, double aspect, double focalLength)
{ {
return ((FilamentViewer *)viewer)->getCameraCullingFar(); auto cam = reinterpret_cast<filament::Camera*>(camera);
cam->setLensProjection(focalLength, aspect, near, far);
} }
const double *const get_camera_frustum(const void *const viewer) double get_camera_near(CameraPtr* camera)
{ {
const auto frustum = ((FilamentViewer *)viewer)->getCameraFrustum(); auto cam = reinterpret_cast<filament::Camera*>(camera);
return cam->getNear();
}
double get_camera_culling_far(CameraPtr* camera)
{
auto cam = reinterpret_cast<filament::Camera*>(camera);
return cam->getCullingFar();
}
const double *const get_camera_frustum(CameraPtr* camera)
{
const auto frustum = reinterpret_cast<filament::Camera*>(camera)->getFrustum();
const math::float4 *planes = frustum.getNormalizedPlanes(); const math::float4 *planes = frustum.getNormalizedPlanes();
double *array = (double *)calloc(24, sizeof(double)); double *array = (double *)calloc(24, sizeof(double));
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
@@ -299,39 +318,23 @@ extern "C"
((FilamentViewer *)viewer)->setViewFrustumCulling(enabled); ((FilamentViewer *)viewer)->setViewFrustumCulling(enabled);
} }
EMSCRIPTEN_KEEPALIVE void move_camera_to_asset(const void *const viewer, EntityId asset) EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(CameraPtr* camera, float distance)
{ {
((FilamentViewer *)viewer)->moveCameraToAsset(asset); auto * cam = reinterpret_cast<filament::Camera*>(camera);
cam->setFocusDistance(distance);
} }
EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(const void *const viewer, float distance) EMSCRIPTEN_KEEPALIVE void set_camera_exposure(CameraPtr* camera, float aperture, float shutterSpeed, float sensitivity)
{ {
((FilamentViewer *)viewer)->setCameraFocusDistance(distance); auto * cam = reinterpret_cast<filament::Camera*>(camera);
cam->setExposure(aperture, shutterSpeed, sensitivity);
} }
EMSCRIPTEN_KEEPALIVE void set_camera_exposure(const void *const viewer, float aperture, float shutterSpeed, float sensitivity) EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(CameraPtr* camera, double4x4 matrix)
{ {
((FilamentViewer *)viewer)->setCameraExposure(aperture, shutterSpeed, sensitivity); auto * cam = reinterpret_cast<filament::Camera*>(camera);
} const filament::math::mat4& mat = convert_double4x4_to_mat4(matrix);
cam->setModelMatrix(mat);
EMSCRIPTEN_KEEPALIVE void set_camera_position(const void *const viewer, float x, float y, float z)
{
((FilamentViewer *)viewer)->setCameraPosition(x, y, z);
}
EMSCRIPTEN_KEEPALIVE void set_camera_rotation(const void *const viewer, float w, float x, float y, float z)
{
((FilamentViewer *)viewer)->setCameraRotation(w, x, y, z);
}
EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(const void *const viewer, const float *const matrix)
{
((FilamentViewer *)viewer)->setCameraModelMatrix(matrix);
}
EMSCRIPTEN_KEEPALIVE void set_camera_focal_length(const void *const viewer, float focalLength)
{
((FilamentViewer *)viewer)->setCameraFocalLength(focalLength);
} }
EMSCRIPTEN_KEEPALIVE void render( EMSCRIPTEN_KEEPALIVE void render(
@@ -345,11 +348,12 @@ extern "C"
} }
EMSCRIPTEN_KEEPALIVE void capture( EMSCRIPTEN_KEEPALIVE void capture(
const void *const viewer, const void *const viewer,
uint8_t *pixelBuffer, uint8_t *pixelBuffer,
void (*callback)(void)) { void (*callback)(void))
((FilamentViewer *)viewer)->capture(pixelBuffer, callback); {
}; ((FilamentViewer *)viewer)->capture(pixelBuffer, callback);
};
EMSCRIPTEN_KEEPALIVE void set_frame_interval( EMSCRIPTEN_KEEPALIVE void set_frame_interval(
const void *const viewer, const void *const viewer,
@@ -368,9 +372,9 @@ extern "C"
((FilamentViewer *)viewer)->createSwapChain(window, width, height); ((FilamentViewer *)viewer)->createSwapChain(window, width, height);
} }
EMSCRIPTEN_KEEPALIVE void update_viewport_and_camera_projection(const void *const viewer, uint32_t width, uint32_t height, float scaleFactor) EMSCRIPTEN_KEEPALIVE void update_viewport(const void *const viewer, uint32_t width, uint32_t height)
{ {
return ((FilamentViewer *)viewer)->updateViewportAndCameraProjection(width, height, scaleFactor); return ((FilamentViewer *)viewer)->updateViewport(width, height);
} }
EMSCRIPTEN_KEEPALIVE void scroll_update(const void *const viewer, float x, float y, float delta) EMSCRIPTEN_KEEPALIVE void scroll_update(const void *const viewer, float x, float y, float delta)
@@ -440,7 +444,8 @@ extern "C"
return result; return result;
} }
EMSCRIPTEN_KEEPALIVE void clear_morph_animation(void* sceneManager, EntityId asset) { EMSCRIPTEN_KEEPALIVE void clear_morph_animation(void *sceneManager, EntityId asset)
{
((SceneManager *)sceneManager)->clearMorphAnimationBuffer(asset); ((SceneManager *)sceneManager)->clearMorphAnimationBuffer(asset);
} }
@@ -490,14 +495,16 @@ extern "C"
} }
EMSCRIPTEN_KEEPALIVE EntityId get_bone(void *sceneManager, EMSCRIPTEN_KEEPALIVE EntityId get_bone(void *sceneManager,
EntityId entityId, EntityId entityId,
int skinIndex, int skinIndex,
int boneIndex) { int boneIndex)
return ((SceneManager*)sceneManager)->getBone(entityId, skinIndex, boneIndex); {
return ((SceneManager *)sceneManager)->getBone(entityId, skinIndex, boneIndex);
} }
EMSCRIPTEN_KEEPALIVE void get_world_transform(void *sceneManager, EMSCRIPTEN_KEEPALIVE void get_world_transform(void *sceneManager,
EntityId entityId, float* const out) { EntityId entityId, float *const out)
auto transform = ((SceneManager*)sceneManager)->getWorldTransform(entityId); {
auto transform = ((SceneManager *)sceneManager)->getWorldTransform(entityId);
out[0] = transform[0][0]; out[0] = transform[0][0];
out[1] = transform[0][1]; out[1] = transform[0][1];
out[2] = transform[0][2]; out[2] = transform[0][2];
@@ -517,8 +524,9 @@ extern "C"
} }
EMSCRIPTEN_KEEPALIVE void get_local_transform(void *sceneManager, EMSCRIPTEN_KEEPALIVE void get_local_transform(void *sceneManager,
EntityId entityId, float* const out) { EntityId entityId, float *const out)
auto transform = ((SceneManager*)sceneManager)->getLocalTransform(entityId); {
auto transform = ((SceneManager *)sceneManager)->getLocalTransform(entityId);
out[0] = transform[0][0]; out[0] = transform[0][0];
out[1] = transform[0][1]; out[1] = transform[0][1];
out[2] = transform[0][2]; out[2] = transform[0][2];
@@ -538,26 +546,32 @@ extern "C"
} }
EMSCRIPTEN_KEEPALIVE void get_rest_local_transforms(void *sceneManager, EMSCRIPTEN_KEEPALIVE void get_rest_local_transforms(void *sceneManager,
EntityId entityId, int skinIndex, float* const out, int numBones) { EntityId entityId, int skinIndex, float *const out, int numBones)
const auto transforms = ((SceneManager*)sceneManager)->getBoneRestTranforms(entityId, skinIndex); {
const auto transforms = ((SceneManager *)sceneManager)->getBoneRestTranforms(entityId, skinIndex);
auto numTransforms = transforms->size(); auto numTransforms = transforms->size();
if(numTransforms != numBones) { if (numTransforms != numBones)
{
Log("Error - %d bone transforms available but you only specified %d.", numTransforms, numBones); Log("Error - %d bone transforms available but you only specified %d.", numTransforms, numBones);
return; return;
} }
for(int boneIndex = 0; boneIndex < numTransforms; boneIndex++) { for (int boneIndex = 0; boneIndex < numTransforms; boneIndex++)
{
const auto transform = transforms->at(boneIndex); const auto transform = transforms->at(boneIndex);
for(int colNum = 0; colNum < 4; colNum++) { for (int colNum = 0; colNum < 4; colNum++)
for(int rowNum = 0; rowNum < 4; rowNum++) { {
for (int rowNum = 0; rowNum < 4; rowNum++)
{
out[(boneIndex * 16) + (colNum * 4) + rowNum] = transform[colNum][rowNum]; out[(boneIndex * 16) + (colNum * 4) + rowNum] = transform[colNum][rowNum];
} }
} }
} }
} }
EMSCRIPTEN_KEEPALIVE void get_inverse_bind_matrix(void *sceneManager, EMSCRIPTEN_KEEPALIVE void get_inverse_bind_matrix(void *sceneManager,
EntityId entityId, int skinIndex, int boneIndex, float* const out) { EntityId entityId, int skinIndex, int boneIndex, float *const out)
auto transform = ((SceneManager*)sceneManager)->getInverseBindMatrix(entityId, skinIndex, boneIndex); {
auto transform = ((SceneManager *)sceneManager)->getInverseBindMatrix(entityId, skinIndex, boneIndex);
out[0] = transform[0][0]; out[0] = transform[0][0];
out[1] = transform[0][1]; out[1] = transform[0][1];
out[2] = transform[0][2]; out[2] = transform[0][2];
@@ -647,21 +661,25 @@ extern "C"
strcpy(outPtr, name.c_str()); strcpy(outPtr, name.c_str());
} }
EMSCRIPTEN_KEEPALIVE int get_bone_count(void *sceneManager, EntityId assetEntity, int skinIndex) { EMSCRIPTEN_KEEPALIVE int get_bone_count(void *sceneManager, EntityId assetEntity, int skinIndex)
{
auto names = ((SceneManager *)sceneManager)->getBoneNames(assetEntity, skinIndex); auto names = ((SceneManager *)sceneManager)->getBoneNames(assetEntity, skinIndex);
return names->size(); return names->size();
} }
EMSCRIPTEN_KEEPALIVE void get_bone_names(void *sceneManager, EntityId assetEntity, const char** out, int skinIndex) { EMSCRIPTEN_KEEPALIVE void get_bone_names(void *sceneManager, EntityId assetEntity, const char **out, int skinIndex)
{
auto names = ((SceneManager *)sceneManager)->getBoneNames(assetEntity, skinIndex); auto names = ((SceneManager *)sceneManager)->getBoneNames(assetEntity, skinIndex);
for(int i = 0; i < names->size(); i++) { for (int i = 0; i < names->size(); i++)
{
auto name_c = names->at(i).c_str(); auto name_c = names->at(i).c_str();
memcpy((void*)out[i], name_c, strlen(name_c) + 1); memcpy((void *)out[i], name_c, strlen(name_c) + 1);
} }
} }
EMSCRIPTEN_KEEPALIVE bool set_transform(void* sceneManager, EntityId entityId, const float* const transform) { EMSCRIPTEN_KEEPALIVE bool set_transform(void *sceneManager, EntityId entityId, const float *const transform)
auto matrix = math::mat4f( {
auto matrix = math::mat4f(
transform[0], transform[1], transform[2], transform[0], transform[1], transform[2],
transform[3], transform[3],
transform[4], transform[4],
@@ -676,11 +694,12 @@ extern "C"
transform[13], transform[13],
transform[14], transform[14],
transform[15]); transform[15]);
return ((SceneManager*)sceneManager)->setTransform(entityId, matrix); return ((SceneManager *)sceneManager)->setTransform(entityId, matrix);
} }
EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(void* sceneManager, EntityId entityId) { EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(void *sceneManager, EntityId entityId)
return ((SceneManager*)sceneManager)->updateBoneMatrices(entityId); {
return ((SceneManager *)sceneManager)->updateBoneMatrices(entityId);
} }
EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(void *sceneManager, EntityId assetEntity, EntityId childEntity) EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(void *sceneManager, EntityId assetEntity, EntityId childEntity)
@@ -736,7 +755,8 @@ extern "C"
((SceneManager *)sceneManager)->queuePositionUpdate(asset, x, y, z, relative); ((SceneManager *)sceneManager)->queuePositionUpdate(asset, x, y, z, relative);
} }
EMSCRIPTEN_KEEPALIVE void queue_relative_position_update_world_axis(void *sceneManager, EntityId entity, float viewportX, float viewportY, float x, float y, float z) { EMSCRIPTEN_KEEPALIVE void queue_relative_position_update_world_axis(void *sceneManager, EntityId entity, float viewportX, float viewportY, float x, float y, float z)
{
((SceneManager *)sceneManager)->queueRelativePositionUpdateWorldAxis(entity, viewportX, viewportY, x, y, z); ((SceneManager *)sceneManager)->queueRelativePositionUpdateWorldAxis(entity, viewportX, viewportY, x, y, z);
} }
@@ -745,7 +765,8 @@ extern "C"
((SceneManager *)sceneManager)->queueRotationUpdate(asset, rads, x, y, z, w, relative); ((SceneManager *)sceneManager)->queueRotationUpdate(asset, rads, x, y, z, w, relative);
} }
EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(void *sceneManager, EntityId entity, float viewportX, float viewportY) { EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(void *sceneManager, EntityId entity, float viewportX, float viewportY)
{
((SceneManager *)sceneManager)->queueRelativePositionUpdateFromViewportVector(entity, viewportX, viewportY); ((SceneManager *)sceneManager)->queueRelativePositionUpdateFromViewportVector(entity, viewportX, viewportY);
} }
@@ -823,7 +844,7 @@ extern "C"
{ {
return ((SceneManager *)sceneManager)->addAnimationComponent(entityId); return ((SceneManager *)sceneManager)->addAnimationComponent(entityId);
} }
EMSCRIPTEN_KEEPALIVE void remove_animation_component(void *const sceneManager, EntityId entityId) EMSCRIPTEN_KEEPALIVE void remove_animation_component(void *const sceneManager, EntityId entityId)
{ {
((SceneManager *)sceneManager)->removeAnimationComponent(entityId); ((SceneManager *)sceneManager)->removeAnimationComponent(entityId);
@@ -831,26 +852,12 @@ extern "C"
EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath) EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const sceneManager, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath)
{ {
return ((SceneManager *)sceneManager)->createGeometry( return ((SceneManager *)sceneManager)->createGeometry(vertices, (uint32_t)numVertices, indices, numIndices, (filament::RenderableManager::PrimitiveType)primitiveType, materialPath);
vertices,
(uint32_t)numVertices,
indices,
numIndices,
(filament::RenderableManager::PrimitiveType)primitiveType,
materialPath);
} }
EMSCRIPTEN_KEEPALIVE EntityId create_geometry_with_normals(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath) EMSCRIPTEN_KEEPALIVE EntityId create_geometry_with_normals(void *const sceneManager, float *vertices, int numVertices, float *normals, int numNormals, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath)
{ {
return ((SceneManager *)sceneManager)->createGeometryWithNormals( return ((SceneManager *)sceneManager)->createGeometryWithNormals(vertices, (uint32_t)numVertices, normals, (uint32_t)numNormals, indices, numIndices, (filament::RenderableManager::PrimitiveType)primitiveType, materialPath);
vertices,
(uint32_t)numVertices,
normals,
(uint32_t)numNormals,
indices,
numIndices,
(filament::RenderableManager::PrimitiveType)primitiveType,
materialPath);
} }
EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(void *const sceneManager, const EntityId parent, const char *name) EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(void *const sceneManager, const EntityId parent, const char *name)
@@ -864,7 +871,8 @@ extern "C"
return ((SceneManager *)sceneManager)->getParent(child); return ((SceneManager *)sceneManager)->getParent(child);
} }
EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(void *const sceneManager, EntityId child) { EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(void *const sceneManager, EntityId child)
{
return ((SceneManager *)sceneManager)->getAncestor(child); return ((SceneManager *)sceneManager)->getAncestor(child);
} }
@@ -892,40 +900,47 @@ extern "C"
out[3] = Entity::smuggle(gizmo->center()); out[3] = Entity::smuggle(gizmo->center());
} }
EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(void *const sceneManager, EntityId entity) { EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(void *const sceneManager, EntityId entity)
{
return ((SceneManager *)sceneManager)->getBoundingBox(entity); return ((SceneManager *)sceneManager)->getBoundingBox(entity);
} }
EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(void *const sceneManager, EntityId entity, float* minX, float* minY, float* maxX, float* maxY) { EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(void *const sceneManager, EntityId entity, float *minX, float *minY, float *maxX, float *maxY)
auto box =((SceneManager *)sceneManager)->getBoundingBox(entity); {
auto box = ((SceneManager *)sceneManager)->getBoundingBox(entity);
*minX = box.minX; *minX = box.minX;
*minY = box.minY; *minY = box.minY;
*maxX = box.maxX; *maxX = box.maxX;
*maxY = box.maxY; *maxY = box.maxY;
} }
EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled) { EMSCRIPTEN_KEEPALIVE void set_layer_enabled(void *const sceneManager, int layer, bool enabled)
((SceneManager*)sceneManager)->setLayerEnabled(layer, enabled); {
((SceneManager *)sceneManager)->setLayerEnabled(layer, enabled);
} }
EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void* ptr) { EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void *ptr)
{
free(ptr); free(ptr);
} }
EMSCRIPTEN_KEEPALIVE void pick_gizmo(void *const sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y)) { EMSCRIPTEN_KEEPALIVE void pick_gizmo(void *const sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y))
((SceneManager*)sceneManager)->gizmo->pick(x, y, callback); {
((SceneManager *)sceneManager)->gizmo->pick(x, y, callback);
} }
EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible) { EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible)
((SceneManager*)sceneManager)->gizmo->setVisibility(visible); {
} ((SceneManager *)sceneManager)->gizmo->setVisibility(visible);
EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entityId, float r, float g, float b) {
((SceneManager*)sceneManager)->setStencilHighlight(entityId, r, g, b);
} }
EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entityId) { EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entityId, float r, float g, float b)
((SceneManager*)sceneManager)->removeStencilHighlight(entityId); {
((SceneManager *)sceneManager)->setStencilHighlight(entityId, r, g, b);
} }
EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entityId)
{
((SceneManager *)sceneManager)->removeStencilHighlight(entityId);
}
} }