add TRenderer
This commit is contained in:
32
thermion_dart/native/include/c_api/TRenderer.h
Normal file
32
thermion_dart/native/include/c_api/TRenderer.h
Normal file
@@ -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
|
||||||
121
thermion_dart/native/src/c_api/TRenderer.cpp
Normal file
121
thermion_dart/native/src/c_api/TRenderer.cpp
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
#ifdef _WIN32
|
||||||
|
#include "ThermionWin32.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "Log.hpp"
|
||||||
|
|
||||||
|
#include <thread>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
#include <filament/Engine.h>
|
||||||
|
#include <filament/Fence.h>
|
||||||
|
#include <filament/Renderer.h>
|
||||||
|
#include <filament/SwapChain.h>
|
||||||
|
#include <filament/Texture.h>
|
||||||
|
#include <filament/Viewport.h>
|
||||||
|
#include <filament/View.h>
|
||||||
|
#include <filament/math/mat4.h>
|
||||||
|
|
||||||
|
#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<filament::Renderer *>(tRenderer);
|
||||||
|
filament::Renderer::ClearOptions clearOpts;
|
||||||
|
clearOpts.clearColor = filament::math::float4 { static_cast<float>(clearR), static_cast<float>(clearG), static_cast<float>(clearB),static_cast<float>(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<filament::Renderer *>(tRenderer);
|
||||||
|
auto *swapChain = reinterpret_cast<filament::SwapChain *>(tSwapChain);
|
||||||
|
return renderer->beginFrame(swapChain, frameTimeInNanos);
|
||||||
|
}
|
||||||
|
|
||||||
|
EMSCRIPTEN_KEEPALIVE void Renderer_endFrame(TRenderer *tRenderer) {
|
||||||
|
auto *renderer = reinterpret_cast<filament::Renderer *>(tRenderer);
|
||||||
|
renderer->endFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
EMSCRIPTEN_KEEPALIVE void Renderer_render(TRenderer *tRenderer, TView *tView) {
|
||||||
|
auto *renderer = reinterpret_cast<filament::Renderer *>(tRenderer);
|
||||||
|
auto *view = reinterpret_cast<filament::View *>(tView);
|
||||||
|
renderer->render(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
EMSCRIPTEN_KEEPALIVE void Renderer_renderStandaloneView(TRenderer *tRenderer, TView *tView) {
|
||||||
|
auto *renderer = reinterpret_cast<filament::Renderer *>(tRenderer);
|
||||||
|
auto *view = reinterpret_cast<filament::View *>(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<filament::Renderer *>(tRenderer);
|
||||||
|
auto *renderTarget = reinterpret_cast<filament::RenderTarget *>(tRenderTarget);
|
||||||
|
auto *view = reinterpret_cast<filament::View *>(tView);
|
||||||
|
|
||||||
|
filament::Viewport const &vp = view->getViewport();
|
||||||
|
|
||||||
|
size_t pixelBufferSize = vp.width * vp.height * 4;
|
||||||
|
|
||||||
|
filament::backend::PixelDataFormat pixelBufferFormat = static_cast<filament::backend::PixelDataFormat>(tPixelBufferFormat);
|
||||||
|
filament::backend::PixelDataType pixelDataType = static_cast<filament::backend::PixelDataType>(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
|
||||||
Reference in New Issue
Block a user