MetaCore/Source/MetaCoreRender/Private/MetaCorePlayerRenderer.cpp

83 lines
2.5 KiB
C++

#include "MetaCoreRender/MetaCorePlayerRenderer.h"
#include "MetaCoreRender/MetaCoreRenderDevice.h"
#include "MetaCoreScene/MetaCoreScene.h"
#include <chrono>
#include <cstdio>
#include <ctime>
namespace MetaCore {
namespace {
void MetaCoreTracePlayerRenderer(const char* message) {
if (message == nullptr) {
return;
}
const auto now = std::chrono::system_clock::now();
const auto time = std::chrono::system_clock::to_time_t(now);
struct tm timeInfo {};
localtime_s(&timeInfo, &time);
char timeBuffer[32]{};
std::strftime(timeBuffer, sizeof(timeBuffer), "[%H:%M:%S] ", &timeInfo);
std::printf("%s%s\n", timeBuffer, message);
}
} // namespace
bool MetaCorePlayerRenderer::Initialize(MetaCoreRenderDevice& renderDevice, MetaCoreWindow& window) {
MetaCoreTracePlayerRenderer("metacore.render: player init enter");
Shutdown();
if (!FilamentSceneBridge_.Initialize(window, false, renderDevice.GetBackend())) {
MetaCoreTracePlayerRenderer("metacore.render: player filament scene bind failed");
return false;
}
RenderDevice_ = &renderDevice;
ViewportRect_ = MetaCoreViewportRect{};
MetaCoreTracePlayerRenderer("metacore.render: player init success");
return true;
}
void MetaCorePlayerRenderer::Shutdown() {
FilamentSceneBridge_.Shutdown();
RenderDevice_ = nullptr;
ViewportRect_ = MetaCoreViewportRect{};
}
void MetaCorePlayerRenderer::SetViewportRect(const MetaCoreViewportRect& viewportRect) {
ViewportRect_ = viewportRect;
if (RenderDevice_ != nullptr) {
RenderDevice_->SetSceneViewportRect(ViewportRect_);
}
}
void MetaCorePlayerRenderer::SetProjectRootPath(const std::filesystem::path& projectRootPath) {
FilamentSceneBridge_.SetProjectRootPath(projectRootPath);
}
void MetaCorePlayerRenderer::RenderScene(MetaCoreScene& scene, const MetaCoreSceneView& sceneView) {
if (RenderDevice_ == nullptr) {
return;
}
RenderDevice_->SetSceneViewportRect(ViewportRect_);
FilamentSceneBridge_.Resize(static_cast<int>(ViewportRect_.Width), static_cast<int>(ViewportRect_.Height));
FilamentSceneBridge_.ApplySceneView(sceneView);
FilamentSceneBridge_.SyncScene(scene, false, true);
}
void MetaCorePlayerRenderer::SetRuntimeUiOverlayFrame(const MetaCoreRuntimeUiFrame& frame, int width, int height) {
FilamentSceneBridge_.SetRuntimeUiOverlayFrame(frame, width, height);
}
void MetaCorePlayerRenderer::RenderAll() {
FilamentSceneBridge_.RenderAll();
}
} // namespace MetaCore