83 lines
2.5 KiB
C++
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
|