refactor!: remove RenderThread methods no longer needed

This commit is contained in:
Nick Fisher
2024-09-27 15:11:47 +08:00
parent 1309bf7c6e
commit 95b378348c
3 changed files with 47 additions and 139 deletions

View File

@@ -336,7 +336,7 @@ class ThermionViewerFFI extends ThermionViewer {
Future loadIbl(String lightingPath, {double intensity = 30000}) async {
final pathPtr =
lightingPath.toNativeUtf8(allocator: allocator).cast<Char>();
load_ibl_render_thread(_viewer!, pathPtr, intensity);
load_ibl(_viewer!, pathPtr, intensity);
}
///
@@ -365,7 +365,7 @@ class ThermionViewerFFI extends ThermionViewer {
///
@override
Future removeIbl() async {
remove_ibl_render_thread(_viewer!);
remove_ibl(_viewer!);
}
@override
@@ -408,7 +408,7 @@ class ThermionViewerFFI extends ThermionViewer {
///
@override
Future<ThermionEntity> addDirectLight(DirectLight directLight) async {
var entity = await withIntCallback((callback) => add_light_render_thread(
var entity = add_light(
_viewer!,
directLight.type.index,
directLight.color,
@@ -426,7 +426,7 @@ class ThermionViewerFFI extends ThermionViewer {
directLight.sunHaloSize,
directLight.sunHaloFallof,
directLight.castShadows,
callback));
);
if (entity == _FILAMENT_ASSET_ERROR) {
throw Exception("Failed to add light to scene");
}
@@ -440,7 +440,7 @@ class ThermionViewerFFI extends ThermionViewer {
///
@override
Future removeLight(ThermionEntity entity) async {
remove_light_render_thread(_viewer!, entity);
remove_light(_viewer!, entity);
_sceneUpdateEventController.add(SceneUpdateEvent.remove(entity));
}
@@ -449,8 +449,7 @@ class ThermionViewerFFI extends ThermionViewer {
///
@override
Future clearLights() async {
clear_lights_render_thread(_viewer!);
clear_lights(_viewer!);
_sceneUpdateEventController.add(SceneUpdateEvent.clearLights());
}
@@ -941,12 +940,21 @@ class ThermionViewerFFI extends ThermionViewer {
///
///
Future setTransform(ThermionEntity entity, Matrix4 transform) async {
final ptr = allocator<Float>(16);
for (int i = 0; i < 16; i++) {
ptr[i] = transform[i];
}
set_transform(_sceneManager!, entity, ptr);
allocator.free(ptr);
SceneManager_setTransform(
_sceneManager!, entity, transform.storage.address);
}
///
///
///
Future queueTransformUpdates(
List<ThermionEntity> entities, List<Matrix4> transforms) async {
var tEntities = Int32List.fromList(entities);
var tTransforms =
Float64List.fromList(transforms.expand((t) => t.storage).toList());
SceneManager_queueTransformUpdates(_sceneManager!, tEntities.address,
tTransforms.address, tEntities.length);
}
///
@@ -1466,36 +1474,6 @@ class ThermionViewerFFI extends ThermionViewer {
set_scale(_sceneManager!, entity, scale);
}
///
///
///
Future queueRotationUpdateQuat(ThermionEntity entity, Quaternion rotation,
{bool relative = false}) async {
queue_rotation_update(_sceneManager!, entity, rotation.radians, rotation.x,
rotation.y, rotation.z, rotation.w, relative);
}
///
///
///
@override
Future queueRotationUpdate(
ThermionEntity entity, double rads, double x, double y, double z,
{bool relative = false}) async {
var quat = Quaternion.axisAngle(Vector3(x, y, z), rads);
await queueRotationUpdateQuat(entity, quat, relative: relative);
}
///
///
///
@override
Future queuePositionUpdate(
ThermionEntity entity, double x, double y, double z,
{bool relative = false}) async {
queue_position_update(_sceneManager!, entity, x, y, z, relative);
}
///
/// Queues an update to the worldspace position for [entity] to the viewport coordinates {x,y}.
/// The actual update will occur on the next frame, and will be subject to collision detection.
@@ -2176,7 +2154,15 @@ class ThermionViewerFFI extends ThermionViewer {
for (final hook in _hooks) {
await hook.call();
}
request_frame_render_thread(_viewer!);
final completer = Completer();
final callback = NativeCallable<Void Function()>.listener(() {
completer.complete(true);
});
request_frame_render_thread(_viewer!, callback.nativeFunction);
await completer.future;
}
Future<Camera> createCamera() async {
@@ -2261,4 +2247,10 @@ class ThermionFFIMaterialInstance extends MaterialInstance {
Future setDepthWriteEnabled(bool enabled) async {
MaterialInstance_setDepthWrite(this._pointer, enabled);
}
@override
Future setParameterFloat2(String name, double x, double y) async {
MaterialInstance_setParameterFloat2(
_pointer, name.toNativeUtf8().cast<Char>(), x, y);
}
}

View File

@@ -33,7 +33,7 @@ extern "C"
EMSCRIPTEN_KEEPALIVE void capture_render_thread(TViewer *viewer, uint8_t* out, void (*onComplete)());
EMSCRIPTEN_KEEPALIVE FilamentRenderCallback make_render_callback_fn_pointer(FilamentRenderCallback);
EMSCRIPTEN_KEEPALIVE void set_rendering_render_thread(TViewer *viewer, bool rendering, void(*onComplete)());
EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(TViewer *viewer);
EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(TViewer *viewer, void(*onComplete)());
EMSCRIPTEN_KEEPALIVE void set_frame_interval_render_thread(TViewer *viewer, float frameInterval);
EMSCRIPTEN_KEEPALIVE void set_background_color_render_thread(TViewer *viewer, const float r, const float g, const float b, const float a);
EMSCRIPTEN_KEEPALIVE void clear_background_image_render_thread(TViewer *viewer);
@@ -42,30 +42,8 @@ extern "C"
EMSCRIPTEN_KEEPALIVE void set_tone_mapping_render_thread(TViewer *viewer, int toneMapping);
EMSCRIPTEN_KEEPALIVE void set_bloom_render_thread(TViewer *viewer, float strength);
EMSCRIPTEN_KEEPALIVE void load_skybox_render_thread(TViewer *viewer, const char *skyboxPath, void (*onComplete)());
EMSCRIPTEN_KEEPALIVE void load_ibl_render_thread(TViewer *viewer, const char *iblPath, float intensity);
EMSCRIPTEN_KEEPALIVE void remove_skybox_render_thread(TViewer *viewer);
EMSCRIPTEN_KEEPALIVE void remove_ibl_render_thread(TViewer *viewer);
EMSCRIPTEN_KEEPALIVE void add_light_render_thread(
TViewer *viewer,
uint8_t type,
float colour,
float intensity,
float posX,
float posY,
float posZ,
float dirX,
float dirY,
float dirZ,
float falloffRadius,
float spotLightConeInner,
float spotLightConeOuter,
float sunAngularRadius,
float sunHaloSize,
float sunHaloFallof,
bool shadows,
void (*callback)(EntityId));
EMSCRIPTEN_KEEPALIVE void remove_light_render_thread(TViewer *viewer, EntityId entityId);
EMSCRIPTEN_KEEPALIVE void clear_lights_render_thread(TViewer *viewer);
EMSCRIPTEN_KEEPALIVE void load_glb_render_thread(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData, void (*callback)(EntityId));
EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_render_thread(TSceneManager *sceneManager, const uint8_t *const data, size_t length, int numInstances, bool keepData, int priority, int layer, void (*callback)(EntityId));
EMSCRIPTEN_KEEPALIVE void load_gltf_render_thread(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData, void (*callback)(EntityId));

View File

@@ -82,9 +82,10 @@ public:
}
}
void requestFrame()
void requestFrame(void (*callback)())
{
this->_render = true;
this->_requestFrameRenderCallback = callback;
}
void iter()
@@ -93,6 +94,7 @@ public:
if (_render)
{
doRender();
this->_requestFrameRenderCallback();
_render = false;
// Calculate and print FPS
@@ -214,9 +216,12 @@ public:
return ret;
}
public:
std::atomic_bool _render = false;
private:
void(*_requestFrameRenderCallback)() = nullptr;
bool _stop = false;
bool _render = false;
int _frameIntervalInMicroseconds = 1000000 / 60;
std::mutex _mutex;
std::condition_variable _cv;
@@ -317,7 +322,7 @@ extern "C"
auto fut = _rl->add_task(lambda);
}
EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(TViewer *viewer)
EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(TViewer *viewer, void(*onComplete)())
{
if (!_rl)
{
@@ -325,7 +330,7 @@ extern "C"
}
else
{
_rl->requestFrame();
_rl->requestFrame(onComplete);
}
}
@@ -505,73 +510,6 @@ extern "C"
auto fut = _rl->add_task(lambda);
}
void add_light_render_thread(
TViewer *viewer,
uint8_t type,
float colour,
float intensity,
float posX,
float posY,
float posZ,
float dirX,
float dirY,
float dirZ,
float falloffRadius,
float spotLightConeInner,
float spotLightConeOuter,
float sunAngularRadius,
float sunHaloSize,
float sunHaloFallof,
bool shadows,
void (*callback)(EntityId))
{
std::packaged_task<EntityId()> lambda([=]
{
auto entity = add_light(
viewer,
type,
colour,
intensity,
posX,
posY,
posZ,
dirX,
dirY,
dirZ,
falloffRadius,
spotLightConeInner,
spotLightConeOuter,
sunAngularRadius,
sunHaloSize,
sunHaloFallof,
shadows);
#ifdef __EMSCRIPTEN__
MAIN_THREAD_EM_ASM({
moduleArg.dartFilamentResolveCallback($0, $1);
}, callback, entity);
#else
callback(entity);
#endif
return entity; });
auto fut = _rl->add_task(lambda);
}
EMSCRIPTEN_KEEPALIVE void remove_light_render_thread(TViewer *viewer,
EntityId entityId)
{
std::packaged_task<void()> lambda([=]
{ remove_light(viewer, entityId); });
auto fut = _rl->add_task(lambda);
}
EMSCRIPTEN_KEEPALIVE void clear_lights_render_thread(TViewer *viewer)
{
std::packaged_task<void()> lambda([=]
{ clear_lights(viewer); });
auto fut = _rl->add_task(lambda);
}
EMSCRIPTEN_KEEPALIVE void remove_entity_render_thread(TViewer *viewer,
EntityId asset, void (*callback)())
{