From 8b34934755acd66d42cad81131c4c7ff3f414dd1 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Mon, 17 Mar 2025 16:37:51 +0800 Subject: [PATCH] add TRenderer --- .../native/include/c_api/TRenderer.h | 32 +++++ thermion_dart/native/src/c_api/TRenderer.cpp | 121 ++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 thermion_dart/native/include/c_api/TRenderer.h create mode 100644 thermion_dart/native/src/c_api/TRenderer.cpp diff --git a/thermion_dart/native/include/c_api/TRenderer.h b/thermion_dart/native/include/c_api/TRenderer.h new file mode 100644 index 00000000..32e4dc1d --- /dev/null +++ b/thermion_dart/native/include/c_api/TRenderer.h @@ -0,0 +1,32 @@ +#ifndef _T_RENDERER_H +#define _T_RENDERER_H + +#include "APIExport.h" +#include "APIBoundaryTypes.h" +#include "TMaterialInstance.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +EMSCRIPTEN_KEEPALIVE void Renderer_setClearOptions(TRenderer *tRenderer, double clearR, double clearG, double clearB, double clearA, uint8_t clearStencil, bool clear, bool discard); +EMSCRIPTEN_KEEPALIVE bool Renderer_beginFrame(TRenderer *tRenderer, TSwapChain *tSwapChain, uint64_t frameTimeInNanos); +EMSCRIPTEN_KEEPALIVE void Renderer_endFrame(TRenderer *tRenderer); +EMSCRIPTEN_KEEPALIVE void Renderer_render(TRenderer *tRenderer, TView *tView); +EMSCRIPTEN_KEEPALIVE void Renderer_renderStandaloneView(TRenderer *tRenderer, TView *tView); +EMSCRIPTEN_KEEPALIVE void Renderer_readPixels( + TRenderer *tRenderer, + TView *tView, + TRenderTarget *tRenderTarget, + TPixelDataFormat tPixelBufferFormat, + TPixelDataType tPixelDataType, + uint8_t *out +); + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/thermion_dart/native/src/c_api/TRenderer.cpp b/thermion_dart/native/src/c_api/TRenderer.cpp new file mode 100644 index 00000000..c3e99e4f --- /dev/null +++ b/thermion_dart/native/src/c_api/TRenderer.cpp @@ -0,0 +1,121 @@ +#ifdef _WIN32 +#include "ThermionWin32.h" +#endif + +#include "Log.hpp" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "c_api/TTexture.h" + +#ifdef __cplusplus +namespace thermion +{ + extern "C" + { + +#endif + +#include "c_api/ThermionDartApi.h" + +EMSCRIPTEN_KEEPALIVE void Renderer_setClearOptions(TRenderer *tRenderer, double clearR, double clearG, double clearB, double clearA, uint8_t clearStencil, bool clear, bool discard) { + auto *renderer = reinterpret_cast(tRenderer); + filament::Renderer::ClearOptions clearOpts; + clearOpts.clearColor = filament::math::float4 { static_cast(clearR), static_cast(clearG), static_cast(clearB),static_cast(clearA)}; + clearOpts.clear = clear; + clearOpts.discard = discard; + clearOpts.clearStencil = clearStencil; + renderer->setClearOptions(clearOpts); +} + +EMSCRIPTEN_KEEPALIVE bool Renderer_beginFrame(TRenderer *tRenderer, TSwapChain *tSwapChain, uint64_t frameTimeInNanos) { + auto *renderer = reinterpret_cast(tRenderer); + auto *swapChain = reinterpret_cast(tSwapChain); + return renderer->beginFrame(swapChain, frameTimeInNanos); +} + +EMSCRIPTEN_KEEPALIVE void Renderer_endFrame(TRenderer *tRenderer) { + auto *renderer = reinterpret_cast(tRenderer); + renderer->endFrame(); +} + +EMSCRIPTEN_KEEPALIVE void Renderer_render(TRenderer *tRenderer, TView *tView) { + auto *renderer = reinterpret_cast(tRenderer); + auto *view = reinterpret_cast(tView); + renderer->render(view); +} + +EMSCRIPTEN_KEEPALIVE void Renderer_renderStandaloneView(TRenderer *tRenderer, TView *tView) { + auto *renderer = reinterpret_cast(tRenderer); + auto *view = reinterpret_cast(tView); + renderer->renderStandaloneView(view); +} + +class CaptureCallbackHandler : public filament::backend::CallbackHandler +{ + void post(void *user, Callback callback) + { + callback(user); + delete this; + } +}; + + +EMSCRIPTEN_KEEPALIVE void Renderer_readPixels( + TRenderer *tRenderer, + TView *tView, + TRenderTarget *tRenderTarget, + TPixelDataFormat tPixelBufferFormat, + TPixelDataType tPixelDataType, + uint8_t *out) { + + auto *renderer = reinterpret_cast(tRenderer); + auto *renderTarget = reinterpret_cast(tRenderTarget); + auto *view = reinterpret_cast(tView); + + filament::Viewport const &vp = view->getViewport(); + + size_t pixelBufferSize = vp.width * vp.height * 4; + + filament::backend::PixelDataFormat pixelBufferFormat = static_cast(tPixelBufferFormat); + filament::backend::PixelDataType pixelDataType = static_cast(tPixelDataType); + + auto *dispatcher = new CaptureCallbackHandler(); + auto callback = [](void *buf, size_t size, void *data) + { + + }; + + + auto pbd = filament::Texture::PixelBufferDescriptor( + out, pixelBufferSize, + pixelBufferFormat, + pixelDataType, + dispatcher, + callback, + out + ); + + if(renderTarget) { + renderer->readPixels(renderTarget, 0, 0, vp.width, vp.height, std::move(pbd)); + } else { + renderer->readPixels(0, 0, vp.width, vp.height, std::move(pbd)); + } + +} + + +#ifdef __cplusplus + } +} +#endif