add View_pickRenderThread method (only used in WASM builds so we can proxy the callback to the main thread
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:math';
|
|
||||||
|
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
|
import 'package:thermion_dart/src/bindings/src/js_interop.dart';
|
||||||
import 'package:thermion_dart/src/filament/src/interface/scene.dart';
|
import 'package:thermion_dart/src/filament/src/interface/scene.dart';
|
||||||
import 'package:thermion_dart/src/filament/src/implementation/ffi_filament_app.dart';
|
import 'package:thermion_dart/src/filament/src/implementation/ffi_filament_app.dart';
|
||||||
import 'package:thermion_dart/src/filament/src/implementation/ffi_render_target.dart';
|
import 'package:thermion_dart/src/filament/src/implementation/ffi_render_target.dart';
|
||||||
@@ -11,7 +10,6 @@ import 'package:thermion_dart/thermion_dart.dart';
|
|||||||
import 'ffi_camera.dart';
|
import 'ffi_camera.dart';
|
||||||
|
|
||||||
class FFIView extends View {
|
class FFIView extends View {
|
||||||
|
|
||||||
late final _logger = Logger(this.runtimeType.toString());
|
late final _logger = Logger(this.runtimeType.toString());
|
||||||
int _renderOrder = 0;
|
int _renderOrder = 0;
|
||||||
int get renderOrder => _renderOrder;
|
int get renderOrder => _renderOrder;
|
||||||
@@ -26,15 +24,13 @@ class FFIView extends View {
|
|||||||
|
|
||||||
late CallbackHolder<PickCallbackFunction> _onPickResultHolder;
|
late CallbackHolder<PickCallbackFunction> _onPickResultHolder;
|
||||||
|
|
||||||
|
|
||||||
FFIView(this.view, this.app) {
|
FFIView(this.view, this.app) {
|
||||||
final renderTargetPtr = View_getRenderTarget(view);
|
final renderTargetPtr = View_getRenderTarget(view);
|
||||||
if (renderTargetPtr != nullptr) {
|
if (renderTargetPtr != nullptr) {
|
||||||
renderTarget = FFIRenderTarget(renderTargetPtr, app);
|
renderTarget = FFIRenderTarget(renderTargetPtr, app);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onPickResultHolder =
|
_onPickResultHolder = _onPickResult.asCallback();
|
||||||
_onPickResult.asCallback();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
@@ -113,8 +109,8 @@ class FFIView extends View {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future setBloom(bool enabled, double strength) async {
|
Future setBloom(bool enabled, double strength) async {
|
||||||
await withVoidCallback((requestId,cb) {
|
await withVoidCallback((requestId, cb) {
|
||||||
View_setBloomRenderThread(view, enabled, strength, requestId,cb);
|
View_setBloomRenderThread(view, enabled, strength, requestId, cb);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,25 +172,28 @@ class FFIView extends View {
|
|||||||
int _pickRequestId = -1;
|
int _pickRequestId = -1;
|
||||||
|
|
||||||
static int kMaxPickRequests = 1024;
|
static int kMaxPickRequests = 1024;
|
||||||
final _pickRequests = List<({void Function(PickResult) handler, int x, int y})?>.generate(kMaxPickRequests, (idx) => null);
|
final _pickRequests =
|
||||||
|
List<({void Function(PickResult) handler, int x, int y})?>.generate(
|
||||||
|
kMaxPickRequests, (idx) => null);
|
||||||
|
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
@override
|
@override
|
||||||
Future pick(int x, int y, void Function(PickResult) resultHandler) async {
|
Future pick(int x, int y, void Function(PickResult) resultHandler) async {
|
||||||
_pickRequestId = max(_pickRequestId + 1, kMaxPickRequests);
|
_pickRequestId++;
|
||||||
|
var pickRequestId = _pickRequestId;
|
||||||
|
|
||||||
_pickRequests[_pickRequestId % kMaxPickRequests] =
|
_pickRequests[_pickRequestId % kMaxPickRequests] =
|
||||||
(handler: resultHandler, x: x, y: y);
|
(handler: resultHandler, x: x, y: y);
|
||||||
var pickRequestId = _pickRequestId;
|
|
||||||
var viewport = await getViewport();
|
var viewport = await getViewport();
|
||||||
y = viewport.height - y;
|
y = viewport.height - y;
|
||||||
|
if (FILAMENT_WASM) {
|
||||||
View_pick(
|
View_pickRenderThread(view, pickRequestId, x, y, _onPickResultHolder.pointer);
|
||||||
view, pickRequestId, x, y, _onPickResultHolder.pointer);
|
} else {
|
||||||
|
View_pick(view, pickRequestId, x, y, _onPickResultHolder.pointer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onPickResult(int requestId, ThermionEntity entityId, double depth,
|
void _onPickResult(int requestId, ThermionEntity entityId, double depth,
|
||||||
@@ -220,5 +219,4 @@ class FFIView extends View {
|
|||||||
fragZ: fragZ,
|
fragZ: fragZ,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ namespace thermion
|
|||||||
void Material_createGizmoMaterialRenderThread(TEngine *tEngine, void (*onComplete)(TMaterial *));
|
void Material_createGizmoMaterialRenderThread(TEngine *tEngine, void (*onComplete)(TMaterial *));
|
||||||
|
|
||||||
void ColorGrading_createRenderThread(TEngine *tEngine, TToneMapping toneMapping, void (*callback)(TColorGrading *));
|
void ColorGrading_createRenderThread(TEngine *tEngine, TToneMapping toneMapping, void (*callback)(TColorGrading *));
|
||||||
|
void View_pickRenderThread(TView *tView, uint32_t requestId, uint32_t x, uint32_t y, PickCallback callback);
|
||||||
void View_setColorGradingRenderThread(TView *tView, TColorGrading *tColorGrading, uint32_t requestId, VoidCallback onComplete);
|
void View_setColorGradingRenderThread(TView *tView, TColorGrading *tColorGrading, uint32_t requestId, VoidCallback onComplete);
|
||||||
void View_setBloomRenderThread(TView *tView, bool enabled, double strength, uint32_t requestId, VoidCallback onComplete);
|
void View_setBloomRenderThread(TView *tView, bool enabled, double strength, uint32_t requestId, VoidCallback onComplete);
|
||||||
void View_setCameraRenderThread(TView *tView, TCamera *tCamera, uint32_t requestId, VoidCallback onComplete);
|
void View_setCameraRenderThread(TView *tView, TCamera *tCamera, uint32_t requestId, VoidCallback onComplete);
|
||||||
|
|||||||
@@ -554,6 +554,13 @@ EMSCRIPTEN_KEEPALIVE void SceneAsset_createFromFilamentAssetRenderThread(
|
|||||||
auto fut = _renderThread->add_task(lambda);
|
auto fut = _renderThread->add_task(lambda);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EMSCRIPTEN_KEEPALIVE void View_pickRenderThread(TView *tView, uint32_t requestId, uint32_t x, uint32_t y, PickCallback callback) {
|
||||||
|
auto *view = reinterpret_cast<View *>(tView);
|
||||||
|
view->pick(x, y, [=](filament::View::PickingQueryResult const &result) {
|
||||||
|
PROXY(callback(requestId, utils::Entity::smuggle(result.renderable), result.depth, result.fragCoords.x, result.fragCoords.y, result.fragCoords.z));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
EMSCRIPTEN_KEEPALIVE void View_setColorGradingRenderThread(TView *tView, TColorGrading *tColorGrading, uint32_t requestId, VoidCallback onComplete)
|
EMSCRIPTEN_KEEPALIVE void View_setColorGradingRenderThread(TView *tView, TColorGrading *tColorGrading, uint32_t requestId, VoidCallback onComplete)
|
||||||
{
|
{
|
||||||
std::packaged_task<void()> lambda(
|
std::packaged_task<void()> lambda(
|
||||||
|
|||||||
Reference in New Issue
Block a user