[nostalgia] Fix scaling of SceneEditorView not to be completely broken
This commit is contained in:
parent
62c671e823
commit
371044d63d
@ -78,7 +78,16 @@ void setSprite(Context &ctx, Sprite const&s) noexcept;
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace nostalgia::core::gl {
|
namespace nostalgia::core::gl {
|
||||||
constexpr ox::CStringView GlslVersion = "#version 330";
|
|
||||||
void draw(core::Context&, ox::Size const&) noexcept;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
constexpr ox::CStringView GlslVersion = "#version 330";
|
||||||
|
|
||||||
|
constexpr auto DefaultScale = 5;
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
ox::Size drawSize(int scale = DefaultScale) noexcept;
|
||||||
|
|
||||||
|
void draw(core::Context &ctx, ox::Size const&renderSz) noexcept;
|
||||||
|
|
||||||
|
void draw(core::Context&, int scale = 5) noexcept;
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -6,5 +6,4 @@ target_sources(
|
|||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
NostalgiaCore PUBLIC
|
NostalgiaCore PUBLIC
|
||||||
GlUtils
|
GlUtils
|
||||||
lodepng
|
|
||||||
)
|
)
|
||||||
|
@ -2,8 +2,6 @@
|
|||||||
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
|
* Copyright 2016 - 2023 Gary Talent (gary@drinkingtea.net). All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <lodepng.h>
|
|
||||||
|
|
||||||
#include <ox/std/array.hpp>
|
#include <ox/std/array.hpp>
|
||||||
#include <ox/std/fmt.hpp>
|
#include <ox/std/fmt.hpp>
|
||||||
#include <ox/std/vec.hpp>
|
#include <ox/std/vec.hpp>
|
||||||
@ -21,7 +19,7 @@
|
|||||||
|
|
||||||
namespace nostalgia::core {
|
namespace nostalgia::core {
|
||||||
|
|
||||||
constexpr auto Scale = 10;
|
constexpr auto Scale = 1;
|
||||||
|
|
||||||
namespace renderer {
|
namespace renderer {
|
||||||
|
|
||||||
@ -234,6 +232,7 @@ static glutils::GLTexture createTexture(
|
|||||||
GLsizei w,
|
GLsizei w,
|
||||||
GLsizei h,
|
GLsizei h,
|
||||||
const void *pixels) noexcept {
|
const void *pixels) noexcept {
|
||||||
|
oxDebugf("createTexture(w: {}, h: {}, pixels: ...)", w, h);
|
||||||
GLuint texId = 0;
|
GLuint texId = 0;
|
||||||
glGenTextures(1, &texId);
|
glGenTextures(1, &texId);
|
||||||
glutils::GLTexture tex(texId);
|
glutils::GLTexture tex(texId);
|
||||||
@ -607,6 +606,10 @@ void setTile(
|
|||||||
|
|
||||||
namespace gl {
|
namespace gl {
|
||||||
|
|
||||||
|
ox::Size drawSize(int scale) noexcept {
|
||||||
|
return {240 * scale, 160 * scale};
|
||||||
|
}
|
||||||
|
|
||||||
void draw(core::Context &ctx, ox::Size const&renderSz) noexcept {
|
void draw(core::Context &ctx, ox::Size const&renderSz) noexcept {
|
||||||
glViewport(0, 0, renderSz.width, renderSz.height);
|
glViewport(0, 0, renderSz.width, renderSz.height);
|
||||||
glutils::clearScreen();
|
glutils::clearScreen();
|
||||||
@ -616,6 +619,10 @@ void draw(core::Context &ctx, ox::Size const&renderSz) noexcept {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void draw(core::Context &ctx, int scale) noexcept {
|
||||||
|
draw(ctx, drawSize(scale));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ namespace nostalgia::scene {
|
|||||||
|
|
||||||
SceneEditorImGui::SceneEditorImGui(turbine::Context &ctx, ox::StringView path):
|
SceneEditorImGui::SceneEditorImGui(turbine::Context &ctx, ox::StringView path):
|
||||||
m_ctx(ctx),
|
m_ctx(ctx),
|
||||||
m_itemPath(std::move(path)),
|
m_itemPath(path),
|
||||||
m_editor(m_ctx, m_itemPath),
|
m_editor(m_ctx, m_itemPath),
|
||||||
m_view(m_ctx, m_editor.scene()) {
|
m_view(m_ctx, m_editor.scene()) {
|
||||||
const auto lastSlash = std::find(m_itemPath.rbegin(), m_itemPath.rend(), '/').offset();
|
const auto lastSlash = std::find(m_itemPath.rbegin(), m_itemPath.rend(), '/').offset();
|
||||||
@ -29,18 +29,28 @@ ox::CRString SceneEditorImGui::itemDisplayName() const noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SceneEditorImGui::draw(turbine::Context*) noexcept {
|
void SceneEditorImGui::draw(turbine::Context*) noexcept {
|
||||||
const auto paneSize = ImGui::GetContentRegionAvail();
|
auto const paneSize = ImGui::GetContentRegionAvail();
|
||||||
const ox::Size fbSize{
|
m_view.draw(ox::Size{static_cast<int>(paneSize.x), static_cast<int>(paneSize.y)});
|
||||||
static_cast<int>(paneSize.x),
|
|
||||||
static_cast<int>(paneSize.y)};
|
|
||||||
m_view.draw(fbSize.width, fbSize.height);
|
|
||||||
auto &fb = m_view.framebuffer();
|
auto &fb = m_view.framebuffer();
|
||||||
const uintptr_t buffId = fb.color.id;
|
auto const srcH = static_cast<float>(fb.height) / static_cast<float>(fb.width);
|
||||||
|
auto const dstH = paneSize.y / paneSize.x;
|
||||||
|
float xScale{}, yScale{};
|
||||||
|
if (dstH > srcH) {
|
||||||
|
// crop off width
|
||||||
|
xScale = srcH / dstH;
|
||||||
|
yScale = 1;
|
||||||
|
} else {
|
||||||
|
auto const srcW = static_cast<float>(fb.width) / static_cast<float>(fb.height);
|
||||||
|
auto const dstW = (paneSize.x / paneSize.y);
|
||||||
|
xScale = 1;
|
||||||
|
yScale = srcW / dstW;
|
||||||
|
}
|
||||||
|
uintptr_t const buffId = fb.color.id;
|
||||||
ImGui::Image(
|
ImGui::Image(
|
||||||
reinterpret_cast<void*>(buffId),
|
std::bit_cast<void*>(buffId),
|
||||||
paneSize,
|
paneSize,
|
||||||
ImVec2(0, 1),
|
ImVec2(0, yScale),
|
||||||
ImVec2(1, 0));
|
ImVec2(xScale, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneEditorImGui::onActivated() noexcept {
|
void SceneEditorImGui::onActivated() noexcept {
|
||||||
|
@ -9,21 +9,25 @@
|
|||||||
namespace nostalgia::scene {
|
namespace nostalgia::scene {
|
||||||
|
|
||||||
SceneEditorView::SceneEditorView(turbine::Context &tctx, SceneStatic const&sceneStatic):
|
SceneEditorView::SceneEditorView(turbine::Context &tctx, SceneStatic const&sceneStatic):
|
||||||
|
m_cctx(core::init(tctx, {.glInstallDrawer = false}).unwrapThrow()),
|
||||||
m_sceneStatic(sceneStatic),
|
m_sceneStatic(sceneStatic),
|
||||||
m_scene(m_sceneStatic) {
|
m_scene(m_sceneStatic) {
|
||||||
oxThrowError(core::init(tctx, {.glInstallDrawer = false}).moveTo(&m_cctx));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ox::Error SceneEditorView::setupScene() noexcept {
|
ox::Error SceneEditorView::setupScene() noexcept {
|
||||||
|
glutils::resizeInitFrameBuffer(m_frameBuffer, core::gl::drawSize(1));
|
||||||
return m_scene.setupDisplay(*m_cctx);
|
return m_scene.setupDisplay(*m_cctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneEditorView::draw(int width, int height) noexcept {
|
void SceneEditorView::draw(ox::Size const&targetSz) noexcept {
|
||||||
if (width != m_frameBuffer.width || height != m_frameBuffer.height) {
|
auto const scaleSz = targetSz / core::gl::drawSize(1);
|
||||||
glutils::resizeInitFrameBuffer(m_frameBuffer, width, height);
|
auto const scale = ox::max(1, ox::max(scaleSz.width, scaleSz.height));
|
||||||
|
if (m_scale != scale) {
|
||||||
|
m_scale = scale;
|
||||||
|
glutils::resizeInitFrameBuffer(m_frameBuffer, core::gl::drawSize(m_scale));
|
||||||
}
|
}
|
||||||
glutils::FrameBufferBind const frameBufferBind(m_frameBuffer);
|
glutils::FrameBufferBind const frameBufferBind(m_frameBuffer);
|
||||||
core::gl::draw(*m_cctx, {width, height});
|
core::gl::draw(*m_cctx, m_scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
glutils::FrameBuffer const&SceneEditorView::framebuffer() const noexcept {
|
glutils::FrameBuffer const&SceneEditorView::framebuffer() const noexcept {
|
||||||
|
@ -18,13 +18,14 @@ class SceneEditorView {
|
|||||||
SceneStatic const&m_sceneStatic;
|
SceneStatic const&m_sceneStatic;
|
||||||
Scene m_scene;
|
Scene m_scene;
|
||||||
glutils::FrameBuffer m_frameBuffer;
|
glutils::FrameBuffer m_frameBuffer;
|
||||||
|
int m_scale = 1;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SceneEditorView(turbine::Context &ctx, SceneStatic const&sceneStatic);
|
SceneEditorView(turbine::Context &ctx, SceneStatic const&sceneStatic);
|
||||||
|
|
||||||
ox::Error setupScene() noexcept;
|
ox::Error setupScene() noexcept;
|
||||||
|
|
||||||
void draw(int width, int height) noexcept;
|
void draw(ox::Size const&targetSz) noexcept;
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
glutils::FrameBuffer const&framebuffer() const noexcept;
|
glutils::FrameBuffer const&framebuffer() const noexcept;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user