feat: working implementation of multiple widgets on macos

This commit is contained in:
Nick Fisher
2024-09-30 13:45:57 +08:00
parent 22020d8607
commit fbd54a2a09
21 changed files with 382 additions and 183 deletions

View File

@@ -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__

View File

@@ -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(

View File

@@ -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);
}