#include "MetaCoreRender/MetaCorePlayerRenderer.h" #include "MetaCoreRender/MetaCoreRenderDevice.h" #include "MetaCoreScene/MetaCoreScene.h" #include #include #include 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(ViewportRect_.Width), static_cast(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