feat: working implementation of multiple widgets on macos
This commit is contained in:
@@ -69,11 +69,15 @@ class DelegateInputHandler implements InputHandler {
|
||||
});
|
||||
|
||||
factory DelegateInputHandler.flight(ThermionViewer viewer,
|
||||
{PickDelegate? pickDelegate, bool freeLook=false, double? clampY, ThermionEntity? entity}) =>
|
||||
{PickDelegate? pickDelegate,
|
||||
bool freeLook = false,
|
||||
double? clampY,
|
||||
ThermionEntity? entity}) =>
|
||||
DelegateInputHandler(
|
||||
viewer: viewer,
|
||||
pickDelegate: pickDelegate,
|
||||
transformDelegate: FreeFlightInputHandlerDelegate(viewer, clampY:clampY, entity:entity),
|
||||
transformDelegate: FreeFlightInputHandlerDelegate(viewer,
|
||||
clampY: clampY, entity: entity),
|
||||
actions: {
|
||||
InputType.MMB_HOLD_AND_MOVE: InputAction.ROTATE,
|
||||
InputType.SCROLLWHEEL: InputAction.TRANSLATE,
|
||||
@@ -82,8 +86,7 @@ class DelegateInputHandler implements InputHandler {
|
||||
InputType.KEYDOWN_W: InputAction.TRANSLATE,
|
||||
InputType.KEYDOWN_S: InputAction.TRANSLATE,
|
||||
InputType.KEYDOWN_D: InputAction.TRANSLATE,
|
||||
if(freeLook)
|
||||
InputType.POINTER_MOVE: InputAction.ROTATE,
|
||||
if (freeLook) InputType.POINTER_MOVE: InputAction.ROTATE,
|
||||
});
|
||||
|
||||
bool _processing = false;
|
||||
@@ -160,15 +163,13 @@ class DelegateInputHandler implements InputHandler {
|
||||
}
|
||||
if (isMiddle) {
|
||||
_inputDeltas[InputType.MMB_HOLD_AND_MOVE] =
|
||||
(_inputDeltas[InputType.MMB_HOLD_AND_MOVE] ?? Vector3.zero()) + Vector3(delta.x, delta.y, 0.0);
|
||||
(_inputDeltas[InputType.MMB_HOLD_AND_MOVE] ?? Vector3.zero()) +
|
||||
Vector3(delta.x, delta.y, 0.0);
|
||||
} else {
|
||||
_inputDeltas[InputType.LMB_HOLD_AND_MOVE] =
|
||||
(_inputDeltas[InputType.LMB_HOLD_AND_MOVE] ?? Vector3.zero()) + Vector3(delta.x, delta.y, 0.0);
|
||||
(_inputDeltas[InputType.LMB_HOLD_AND_MOVE] ?? Vector3.zero()) +
|
||||
Vector3(delta.x, delta.y, 0.0);
|
||||
}
|
||||
// else {
|
||||
// _inputDeltas[InputType.POINTER_MOVE] =
|
||||
// (_inputDeltas[InputType.POINTER_MOVE] ?? Vector3.zero()) + delta;
|
||||
// }
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -180,7 +181,8 @@ class DelegateInputHandler implements InputHandler {
|
||||
return;
|
||||
}
|
||||
_inputDeltas[InputType.POINTER_MOVE] =
|
||||
(_inputDeltas[InputType.POINTER_MOVE] ?? Vector3.zero()) + Vector3(delta.x, delta.y, 0.0);
|
||||
(_inputDeltas[InputType.POINTER_MOVE] ?? Vector3.zero()) +
|
||||
Vector3(delta.x, delta.y, 0.0);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -191,8 +193,8 @@ class DelegateInputHandler implements InputHandler {
|
||||
}
|
||||
try {
|
||||
_inputDeltas[InputType.SCROLLWHEEL] =
|
||||
(_inputDeltas[InputType.SCROLLWHEEL] ?? Vector3.zero())
|
||||
+ Vector3(0,0, scrollDelta > 0 ? 1 : -1);
|
||||
(_inputDeltas[InputType.SCROLLWHEEL] ?? Vector3.zero()) +
|
||||
Vector3(0, 0, scrollDelta > 0 ? 1 : -1);
|
||||
} catch (e) {
|
||||
_logger.warning("Error during scroll accumulation: $e");
|
||||
}
|
||||
|
||||
@@ -39,4 +39,18 @@ class FFIView extends View {
|
||||
final engine = Viewer_getEngine(viewer);
|
||||
return FFICamera(View_getCamera(view), engine);
|
||||
}
|
||||
|
||||
@override
|
||||
Future setAntiAliasing(bool msaa, bool fxaa, bool taa) async {
|
||||
View_setAntiAliasing(view, msaa, fxaa, taa);
|
||||
}
|
||||
|
||||
@override
|
||||
Future setPostProcessing(bool enabled) async {
|
||||
View_setPostProcessing(view, enabled);
|
||||
}
|
||||
|
||||
Future setRenderable(bool renderable) async {
|
||||
Viewer_markViewRenderable(viewer, view, renderable);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,7 +65,6 @@ external void Viewer_destroySwapChain(
|
||||
@ffi.Native<
|
||||
ffi.Bool Function(
|
||||
ffi.Pointer<TViewer>,
|
||||
ffi.Pointer<TView>,
|
||||
ffi.Pointer<TSwapChain>,
|
||||
ffi.Uint64,
|
||||
ffi.Pointer<ffi.Void>,
|
||||
@@ -76,7 +75,6 @@ external void Viewer_destroySwapChain(
|
||||
ffi.Pointer<ffi.Void>)>(isLeaf: true)
|
||||
external bool Viewer_render(
|
||||
ffi.Pointer<TViewer> viewer,
|
||||
ffi.Pointer<TView> view,
|
||||
ffi.Pointer<TSwapChain> swapChain,
|
||||
int frameTimeInNanos,
|
||||
ffi.Pointer<ffi.Void> pixelBuffer,
|
||||
@@ -146,6 +144,15 @@ external ffi.Pointer<TSwapChain> Viewer_getSwapChainAt(
|
||||
int index,
|
||||
);
|
||||
|
||||
@ffi.Native<
|
||||
ffi.Void Function(
|
||||
ffi.Pointer<TViewer>, ffi.Pointer<TView>, ffi.Bool)>(isLeaf: true)
|
||||
external void Viewer_markViewRenderable(
|
||||
ffi.Pointer<TViewer> viewer,
|
||||
ffi.Pointer<TView> view,
|
||||
bool renderable,
|
||||
);
|
||||
|
||||
@ffi.Native<ffi.Pointer<TEngine> Function(ffi.Pointer<TViewer>)>(isLeaf: true)
|
||||
external ffi.Pointer<TEngine> Viewer_getEngine(
|
||||
ffi.Pointer<TViewer> viewer,
|
||||
@@ -1451,6 +1458,15 @@ external void Viewer_captureRenderTargetRenderThread(
|
||||
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
|
||||
);
|
||||
|
||||
@ffi.Native<
|
||||
ffi.Void Function(ffi.Pointer<TViewer>, ffi.Pointer<TSwapChain>,
|
||||
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>(isLeaf: true)
|
||||
external void Viewer_requestFrameRenderThread(
|
||||
ffi.Pointer<TViewer> viewer,
|
||||
ffi.Pointer<TSwapChain> tSwapChain,
|
||||
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
|
||||
);
|
||||
|
||||
@ffi.Native<ffi.Void Function(ffi.Pointer<TViewer>)>(isLeaf: true)
|
||||
external void destroy_filament_viewer_render_thread(
|
||||
ffi.Pointer<TViewer> viewer,
|
||||
@@ -1471,19 +1487,6 @@ external void set_rendering_render_thread(
|
||||
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
|
||||
);
|
||||
|
||||
@ffi.Native<
|
||||
ffi.Void Function(
|
||||
ffi.Pointer<TViewer>,
|
||||
ffi.Pointer<TView>,
|
||||
ffi.Pointer<TSwapChain>,
|
||||
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>>)>(isLeaf: true)
|
||||
external void Viewer_requestFrameRenderThread(
|
||||
ffi.Pointer<TViewer> viewer,
|
||||
ffi.Pointer<TView> view,
|
||||
ffi.Pointer<TSwapChain> tSwapChain,
|
||||
ffi.Pointer<ffi.NativeFunction<ffi.Void Function()>> onComplete,
|
||||
);
|
||||
|
||||
@ffi.Native<ffi.Void Function(ffi.Pointer<TViewer>, ffi.Float)>(isLeaf: true)
|
||||
external void set_frame_interval_render_thread(
|
||||
ffi.Pointer<TViewer> viewer,
|
||||
@@ -1888,14 +1891,25 @@ external void View_setBloom(
|
||||
);
|
||||
|
||||
@ffi.Native<
|
||||
ffi.Void Function(
|
||||
ffi.Pointer<TView>, ffi.Pointer<TEngine>, ffi.Int32)>(isLeaf: true)
|
||||
external void View_setToneMapping(
|
||||
ffi.Void Function(ffi.Pointer<TView>, ffi.Pointer<TEngine>,
|
||||
ffi.UnsignedInt)>(symbol: "View_setToneMapping", isLeaf: true)
|
||||
external void _View_setToneMapping(
|
||||
ffi.Pointer<TView> tView,
|
||||
ffi.Pointer<TEngine> tEngine,
|
||||
int toneMapping,
|
||||
);
|
||||
|
||||
void View_setToneMapping(
|
||||
ffi.Pointer<TView> tView,
|
||||
ffi.Pointer<TEngine> tEngine,
|
||||
ToneMapping toneMapping,
|
||||
) =>
|
||||
_View_setToneMapping(
|
||||
tView,
|
||||
tEngine,
|
||||
toneMapping.value,
|
||||
);
|
||||
|
||||
@ffi.Native<
|
||||
ffi.Void Function(
|
||||
ffi.Pointer<TView>, ffi.Bool, ffi.Bool, ffi.Bool)>(isLeaf: true)
|
||||
@@ -2224,10 +2238,20 @@ final class TViewport extends ffi.Struct {
|
||||
external int height;
|
||||
}
|
||||
|
||||
abstract class ToneMapping {
|
||||
static const int ACES = 0;
|
||||
static const int FILMIC = 1;
|
||||
static const int LINEAR = 2;
|
||||
enum ToneMapping {
|
||||
ACES(0),
|
||||
FILMIC(1),
|
||||
LINEAR(2);
|
||||
|
||||
final int value;
|
||||
const ToneMapping(this.value);
|
||||
|
||||
static ToneMapping fromValue(int value) => switch (value) {
|
||||
0 => ACES,
|
||||
1 => FILMIC,
|
||||
2 => LINEAR,
|
||||
_ => throw ArgumentError("Unknown value for ToneMapping: $value"),
|
||||
};
|
||||
}
|
||||
|
||||
typedef GizmoPickCallback
|
||||
|
||||
@@ -2040,10 +2040,8 @@ class ThermionViewerFFI extends ThermionViewer {
|
||||
});
|
||||
|
||||
final swapChain = Viewer_getSwapChainAt(_viewer!, 0);
|
||||
final view = Viewer_getViewAt(_viewer!, 0);
|
||||
|
||||
Viewer_requestFrameRenderThread(
|
||||
_viewer!, view, swapChain, callback.nativeFunction);
|
||||
Viewer_requestFrameRenderThread(_viewer!, swapChain, callback.nativeFunction);
|
||||
|
||||
await completer.future;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
library shared_types;
|
||||
|
||||
export 'swap_chain.dart';
|
||||
export 'view.dart';
|
||||
export 'render_target.dart';
|
||||
export 'camera.dart';
|
||||
export 'material.dart';
|
||||
|
||||
@@ -15,4 +15,7 @@ abstract class View {
|
||||
Future setRenderTarget(covariant RenderTarget? renderTarget);
|
||||
Future setCamera(covariant Camera camera);
|
||||
Camera getCamera();
|
||||
Future setPostProcessing(bool enabled);
|
||||
Future setAntiAliasing(bool msaa, bool fxaa, bool taa);
|
||||
Future setRenderable(bool renderable);
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ extern "C"
|
||||
typedef struct TView TView;
|
||||
typedef struct TGizmo TGizmo;
|
||||
typedef struct TScene TScene;
|
||||
|
||||
|
||||
struct TMaterialKey {
|
||||
bool doubleSided = 1;
|
||||
bool unlit = 1;
|
||||
|
||||
@@ -70,7 +70,6 @@ namespace thermion
|
||||
|
||||
bool render(
|
||||
uint64_t frameTimeInNanos,
|
||||
View* view,
|
||||
SwapChain* swapChain,
|
||||
void *pixelBuffer,
|
||||
void (*callback)(void *buf, size_t size, void *data),
|
||||
@@ -92,6 +91,22 @@ namespace thermion
|
||||
|
||||
Renderer *getRenderer();
|
||||
|
||||
std::vector<View*> _renderable;
|
||||
void setRenderable(View* view, bool renderable) {
|
||||
auto it = std::find(_renderable.begin(), _renderable.end(), view);
|
||||
|
||||
if(renderable) {
|
||||
if(it == _renderable.end()) {
|
||||
_renderable.push_back(view);
|
||||
}
|
||||
} else {
|
||||
if(it != _renderable.end()) {
|
||||
_renderable.erase(it);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void setBackgroundColor(const float r, const float g, const float b, const float a);
|
||||
void setBackgroundImage(const char *resourcePath, bool fillHeight, uint32_t width, uint32_t height);
|
||||
void clearBackgroundImage();
|
||||
|
||||
@@ -63,7 +63,6 @@ extern "C"
|
||||
EMSCRIPTEN_KEEPALIVE void Viewer_destroySwapChain(TViewer *viewer, TSwapChain* swapChain);
|
||||
EMSCRIPTEN_KEEPALIVE bool Viewer_render(
|
||||
TViewer *viewer,
|
||||
TView *view,
|
||||
TSwapChain *swapChain,
|
||||
uint64_t frameTimeInNanos,
|
||||
void *pixelBuffer,
|
||||
@@ -85,13 +84,13 @@ extern "C"
|
||||
EMSCRIPTEN_KEEPALIVE TView* Viewer_createView(TViewer *viewer);
|
||||
EMSCRIPTEN_KEEPALIVE TView* Viewer_getViewAt(TViewer *viewer, int index);
|
||||
EMSCRIPTEN_KEEPALIVE void Viewer_setMainCamera(TViewer *tViewer, TView *tView);
|
||||
EMSCRIPTEN_KEEPALIVE TSwapChain* Viewer_getSwapChainAt(TViewer *tViewer, int index);
|
||||
EMSCRIPTEN_KEEPALIVE TSwapChain* Viewer_getSwapChainAt(TViewer *tViewer, int index);
|
||||
EMSCRIPTEN_KEEPALIVE void Viewer_markViewRenderable(TViewer *viewer, TView* view, bool renderable);
|
||||
|
||||
// Engine
|
||||
EMSCRIPTEN_KEEPALIVE TEngine *Viewer_getEngine(TViewer* viewer);
|
||||
EMSCRIPTEN_KEEPALIVE TCamera *Engine_getCameraComponent(TEngine* tEngine, EntityId entityId);
|
||||
EMSCRIPTEN_KEEPALIVE void Engine_setTransform(TEngine* tEngine, EntityId entity, double4x4 transform);
|
||||
|
||||
|
||||
EMSCRIPTEN_KEEPALIVE void clear_background_image(TViewer *viewer);
|
||||
EMSCRIPTEN_KEEPALIVE void set_background_image(TViewer *viewer, const char *path, bool fillHeight);
|
||||
|
||||
@@ -30,12 +30,13 @@ extern "C"
|
||||
EMSCRIPTEN_KEEPALIVE void Viewer_renderRenderThread(TViewer *viewer, TView* view, TSwapChain* swapChain);
|
||||
EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderThread(TViewer *viewer, TView* view, TSwapChain* swapChain, uint8_t* out, void (*onComplete)());
|
||||
EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderTargetRenderThread(TViewer *viewer, TView* view, TSwapChain* swapChain, TRenderTarget* renderTarget, uint8_t* out, void (*onComplete)());
|
||||
EMSCRIPTEN_KEEPALIVE void Viewer_requestFrameRenderThread(TViewer *viewer, TSwapChain* tSwapChain, void(*onComplete)());
|
||||
|
||||
EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer_render_thread(TViewer *viewer);
|
||||
|
||||
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 Viewer_requestFrameRenderThread(TViewer *viewer, TView *view, TSwapChain *tSwapChain, 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);
|
||||
|
||||
@@ -166,6 +166,8 @@ namespace thermion
|
||||
|
||||
createView();
|
||||
|
||||
setRenderable(_views[0], true);
|
||||
|
||||
const float aperture = _mainCamera->getAperture();
|
||||
const float shutterSpeed = _mainCamera->getShutterSpeed();
|
||||
const float sens = _mainCamera->getSensitivity();
|
||||
@@ -687,6 +689,7 @@ namespace thermion
|
||||
|
||||
RenderTarget *FilamentViewer::createRenderTarget(intptr_t texture, uint32_t width, uint32_t height)
|
||||
{
|
||||
Log("Creating render target with size %d x %d", width, height);
|
||||
// Create filament textures and render targets (note the color buffer has the import call)
|
||||
auto rtColor = filament::Texture::Builder()
|
||||
.width(width)
|
||||
@@ -707,6 +710,7 @@ namespace thermion
|
||||
.texture(RenderTarget::AttachmentPoint::COLOR, rtColor)
|
||||
.texture(RenderTarget::AttachmentPoint::DEPTH, rtDepth)
|
||||
.build(*_engine);
|
||||
_renderTargets.push_back(rt);
|
||||
return rt;
|
||||
}
|
||||
|
||||
@@ -800,6 +804,9 @@ namespace thermion
|
||||
_sceneManager->destroyAll();
|
||||
}
|
||||
|
||||
/// @brief
|
||||
/// @param asset
|
||||
///
|
||||
void FilamentViewer::removeEntity(EntityId asset)
|
||||
{
|
||||
_renderMutex.lock();
|
||||
@@ -1015,14 +1022,13 @@ namespace thermion
|
||||
|
||||
bool FilamentViewer::render(
|
||||
uint64_t frameTimeInNanos,
|
||||
View *view,
|
||||
SwapChain *swapChain,
|
||||
void *pixelBuffer,
|
||||
void (*callback)(void *buf, size_t size, void *data),
|
||||
void *data)
|
||||
{
|
||||
|
||||
if (!view || !swapChain)
|
||||
if (!swapChain)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -1050,15 +1056,11 @@ namespace thermion
|
||||
if (!beginFrame)
|
||||
{
|
||||
_skippedFrames++;
|
||||
}
|
||||
|
||||
if (beginFrame)
|
||||
{
|
||||
|
||||
_renderer->render(view);
|
||||
|
||||
} else {
|
||||
for(auto *view : _renderable) {
|
||||
_renderer->render(view);
|
||||
}
|
||||
_frameCount++;
|
||||
|
||||
_renderer->endFrame();
|
||||
}
|
||||
#ifdef __EMSCRIPTEN__
|
||||
|
||||
@@ -341,7 +341,6 @@ extern "C"
|
||||
|
||||
EMSCRIPTEN_KEEPALIVE bool Viewer_render(
|
||||
TViewer *tViewer,
|
||||
TView *tView,
|
||||
TSwapChain *tSwapChain,
|
||||
uint64_t frameTimeInNanos,
|
||||
void *pixelBuffer,
|
||||
@@ -355,8 +354,14 @@ extern "C"
|
||||
swapChain = viewer->getSwapChainAt(0);
|
||||
}
|
||||
|
||||
return viewer->render(frameTimeInNanos, swapChain, pixelBuffer, callback, data);
|
||||
}
|
||||
|
||||
EMSCRIPTEN_KEEPALIVE void Viewer_markViewRenderable(TViewer *tViewer, TView* tView, bool renderable) {
|
||||
auto viewer = reinterpret_cast<FilamentViewer *>(tViewer);
|
||||
|
||||
auto *view = reinterpret_cast<View*>(tView);
|
||||
return viewer->render(frameTimeInNanos, view, swapChain, pixelBuffer, callback, data);
|
||||
viewer->setRenderable(view, renderable);
|
||||
}
|
||||
|
||||
EMSCRIPTEN_KEEPALIVE void Viewer_capture(
|
||||
|
||||
@@ -50,7 +50,7 @@ public:
|
||||
~RenderLoop()
|
||||
{
|
||||
_stop = true;
|
||||
target = nullptr;
|
||||
swapChain = nullptr;
|
||||
_cv.notify_one();
|
||||
#ifdef __EMSCRIPTEN__
|
||||
pthread_join(t, NULL);
|
||||
@@ -82,21 +82,21 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void requestFrame(TView* tView, TSwapChain* tSwapChain, void (*callback)())
|
||||
void requestFrame(TSwapChain* tSwapChain, void (*callback)())
|
||||
{
|
||||
this->target = tSwapChain;
|
||||
this->view = tView;
|
||||
std::unique_lock<std::mutex> lock(_mutex);
|
||||
this->swapChain = tSwapChain;
|
||||
this->_requestFrameRenderCallback = callback;
|
||||
}
|
||||
|
||||
void iter()
|
||||
{
|
||||
std::unique_lock<std::mutex> lock(_mutex);
|
||||
if (target)
|
||||
if (swapChain)
|
||||
{
|
||||
doRender(view, target);
|
||||
doRender(swapChain);
|
||||
this->_requestFrameRenderCallback();
|
||||
target = nullptr;
|
||||
swapChain = nullptr;
|
||||
|
||||
// Calculate and print FPS
|
||||
auto currentTime = std::chrono::high_resolution_clock::now();
|
||||
@@ -126,8 +126,6 @@ public:
|
||||
_cv.wait_for(lock, std::chrono::microseconds(1000), [this]
|
||||
{ return !_tasks.empty() || _stop; });
|
||||
|
||||
if (_stop)
|
||||
return;
|
||||
}
|
||||
|
||||
void createViewer(void *const context,
|
||||
@@ -170,14 +168,14 @@ public:
|
||||
{
|
||||
std::packaged_task<void()> lambda([=]() mutable
|
||||
{
|
||||
target = nullptr;
|
||||
swapChain = nullptr;
|
||||
_viewer = nullptr;
|
||||
destroy_filament_viewer(reinterpret_cast<TViewer*>(viewer)); });
|
||||
auto fut = add_task(lambda);
|
||||
fut.wait();
|
||||
}
|
||||
|
||||
bool doRender(TView* tView, TSwapChain *tSwapChain)
|
||||
bool doRender(TSwapChain *tSwapChain)
|
||||
{
|
||||
#ifdef __EMSCRIPTEN__
|
||||
if (emscripten_is_webgl_context_lost(_context) == EM_TRUE)
|
||||
@@ -188,7 +186,7 @@ public:
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
auto rendered = Viewer_render(_viewer, tView, tSwapChain, 0, nullptr, nullptr, nullptr);
|
||||
bool rendered = Viewer_render(_viewer, tSwapChain, 0, nullptr, nullptr, nullptr);
|
||||
if (_renderCallback)
|
||||
{
|
||||
_renderCallback(_renderCallbackOwner);
|
||||
@@ -218,8 +216,7 @@ public:
|
||||
}
|
||||
|
||||
public:
|
||||
TSwapChain *target;
|
||||
TView *view;
|
||||
TSwapChain *swapChain;
|
||||
|
||||
private:
|
||||
void(*_requestFrameRenderCallback)() = nullptr;
|
||||
@@ -307,7 +304,7 @@ extern "C"
|
||||
}
|
||||
|
||||
|
||||
EMSCRIPTEN_KEEPALIVE void Viewer_requestFrameRenderThread(TViewer *viewer, TView* view, TSwapChain* tSwapChain, void(*onComplete)())
|
||||
EMSCRIPTEN_KEEPALIVE void Viewer_requestFrameRenderThread(TViewer *viewer, TSwapChain* tSwapChain, void(*onComplete)())
|
||||
{
|
||||
if (!_rl)
|
||||
{
|
||||
@@ -315,7 +312,7 @@ extern "C"
|
||||
}
|
||||
else
|
||||
{
|
||||
_rl->requestFrame(view, tSwapChain, onComplete);
|
||||
_rl->requestFrame(tSwapChain, onComplete);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -331,7 +328,9 @@ extern "C"
|
||||
EMSCRIPTEN_KEEPALIVE void Viewer_renderRenderThread(TViewer *viewer, TView *tView, TSwapChain *tSwapChain)
|
||||
{
|
||||
std::packaged_task<void()> lambda([=]() mutable
|
||||
{ _rl->doRender(tView, tSwapChain); });
|
||||
{
|
||||
_rl->doRender(tSwapChain);
|
||||
});
|
||||
auto fut = _rl->add_task(lambda);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user