fix: add Fence to capture() and set stencil buffer by default

This commit is contained in:
Nick Fisher
2024-09-06 13:03:51 +08:00
parent 29b6a48816
commit 6ec84b6249

View File

@@ -35,6 +35,7 @@
#endif #endif
#include <filament/ColorGrading.h> #include <filament/ColorGrading.h>
#include <filament/Engine.h> #include <filament/Engine.h>
#include <filament/Fence.h>
#include <filament/IndexBuffer.h> #include <filament/IndexBuffer.h>
#include <filament/IndirectLight.h> #include <filament/IndirectLight.h>
@@ -165,6 +166,7 @@ namespace thermion_filament
_mainCamera = _engine->createCamera(camera); _mainCamera = _engine->createCamera(camera);
_view = _engine->createView(); _view = _engine->createView();
_view->setStencilBufferEnabled(true);
setToneMapping(ToneMapping::ACES); setToneMapping(ToneMapping::ACES);
@@ -1261,6 +1263,12 @@ namespace thermion_filament
#endif #endif
} }
class CaptureCallbackHandler : public filament::backend::CallbackHandler {
void post(void* user, Callback callback) {
callback(user);
}
};
void FilamentViewer::capture(uint8_t *out, void (*onComplete)()) void FilamentViewer::capture(uint8_t *out, void (*onComplete)())
{ {
@@ -1279,22 +1287,24 @@ namespace thermion_filament
callback(); callback();
}; };
// Create a fence
#ifndef __EMSCRIPTEN__
Fence* fence = _engine->createFence();
#endif
auto userData = new std::vector<void *>{out, (void *)onComplete}; auto userData = new std::vector<void *>{out, (void *)onComplete};
auto dispatcher = new CaptureCallbackHandler();
auto pbd = Texture::PixelBufferDescriptor( auto pbd = Texture::PixelBufferDescriptor(
pixelBuffer, pixelBufferSize, pixelBuffer, pixelBufferSize,
Texture::Format::RGBA, Texture::Format::RGBA,
Texture::Type::UBYTE, nullptr, callback, userData); Texture::Type::UBYTE, dispatcher, callback, userData);
_renderer->beginFrame(_swapChain, 0); _renderer->beginFrame(_swapChain, 0);
_renderer->render(_view); _renderer->render(_view);
_view->setScene(_highlightScene); _view->setScene(_highlightScene);
_renderer->render(_view); _renderer->render(_view);
_view->setScene(_scene); _view->setScene(_scene);
if (_rt) if (_rt)
{ {
_renderer->readPixels(_rt, 0, 0, vp.width, vp.height, std::move(pbd)); _renderer->readPixels(_rt, 0, 0, vp.width, vp.height, std::move(pbd));
@@ -1308,6 +1318,8 @@ namespace thermion_filament
#ifdef __EMSCRIPTEN__ #ifdef __EMSCRIPTEN__
_engine->execute(); _engine->execute();
emscripten_webgl_commit_frame(); emscripten_webgl_commit_frame();
#else
Fence::waitAndDestroy(fence);
#endif #endif
} }