[nostalgia/core/studio] Add zoom support to TileSheetEditor
This commit is contained in:
parent
78942ce21d
commit
d4e198ecc3
@ -2,6 +2,8 @@
|
|||||||
* Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved.
|
* Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
|
|
||||||
#include <nostalgia/common/point.hpp>
|
#include <nostalgia/common/point.hpp>
|
||||||
@ -47,8 +49,10 @@ void TileSheetEditor::paste() {
|
|||||||
void TileSheetEditor::draw(core::Context*) noexcept {
|
void TileSheetEditor::draw(core::Context*) noexcept {
|
||||||
const auto size = ImGui::GetContentRegionAvail();
|
const auto size = ImGui::GetContentRegionAvail();
|
||||||
const auto sizei = common::Size(static_cast<int>(size.x), static_cast<int>(size.y));
|
const auto sizei = common::Size(static_cast<int>(size.x), static_cast<int>(size.y));
|
||||||
if (m_framebuffer.width != sizei.width || m_framebuffer.height != sizei.height) {
|
if (m_updated || m_framebuffer.width != sizei.width || m_framebuffer.height != sizei.height) {
|
||||||
m_framebuffer = glutils::generateFrameBuffer(sizei.width, sizei.height);
|
if (!m_framebuffer) {
|
||||||
|
m_framebuffer = glutils::generateFrameBuffer(sizei.width, sizei.height);
|
||||||
|
}
|
||||||
m_pixels.initBufferSet(m_img, *m_pal);
|
m_pixels.initBufferSet(m_img, *m_pal);
|
||||||
m_pixelGrid.initBufferSet(m_img);
|
m_pixelGrid.initBufferSet(m_img);
|
||||||
}
|
}
|
||||||
@ -57,6 +61,24 @@ void TileSheetEditor::draw(core::Context*) noexcept {
|
|||||||
glDraw();
|
glDraw();
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
ImGui::Image(reinterpret_cast<void*>(m_framebuffer.color.id), size, ImVec2(0, 1), ImVec2(1, 0));
|
ImGui::Image(reinterpret_cast<void*>(m_framebuffer.color.id), size, ImVec2(0, 1), ImVec2(1, 0));
|
||||||
|
if (ImGui::IsItemHovered()) {
|
||||||
|
const auto &io = ImGui::GetIO();
|
||||||
|
const auto wheel = io.MouseWheel * 0.01f;
|
||||||
|
const auto zoomMod = ox::defines::OS == ox::defines::OS::Darwin ? io.KeySuper : io.KeyCtrl;
|
||||||
|
if (zoomMod && wheel != 0) {
|
||||||
|
m_pixelSizeMod = ox::clamp(m_pixelSizeMod + wheel, 0.55f, 2.f);
|
||||||
|
m_pixels.setPixelSizeMod(m_pixelSizeMod);
|
||||||
|
m_pixelGrid.setPixelSizeMod(m_pixelSizeMod);
|
||||||
|
m_updated = true;
|
||||||
|
}
|
||||||
|
if (io.MouseClicked[0]) {
|
||||||
|
auto clickPos = io.MouseClickedPos[0];
|
||||||
|
const auto &winPos = ImGui::GetWindowPos();
|
||||||
|
clickPos.x -= winPos.x;
|
||||||
|
clickPos.y -= winPos.y;
|
||||||
|
std::cout << clickPos.x - 8 << ", " << clickPos.y - 31 << '\n';
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileSheetEditor::glDraw() noexcept {
|
void TileSheetEditor::glDraw() noexcept {
|
||||||
|
@ -73,9 +73,9 @@ struct TileSheetClipboard {
|
|||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
bool empty() const;
|
bool empty() const;
|
||||||
|
|
||||||
void pastePixels(common::Point pt, ox::Vector<int> *tgt, int tgtColumns) const;
|
void pastePixels(const common::Point &pt, ox::Vector<int> *tgt, int tgtColumns) const;
|
||||||
|
|
||||||
void setPoints(common::Point p1, common::Point p2);
|
void setPoints(const common::Point &p1, const common::Point &p2);
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
common::Point point1() const;
|
common::Point point1() const;
|
||||||
@ -106,6 +106,7 @@ class TileSheetEditor: public studio::Editor {
|
|||||||
NostalgiaGraphic m_img;
|
NostalgiaGraphic m_img;
|
||||||
AssetRef<NostalgiaPalette> m_pal;
|
AssetRef<NostalgiaPalette> m_pal;
|
||||||
Context *m_ctx = nullptr;
|
Context *m_ctx = nullptr;
|
||||||
|
float m_pixelSizeMod = 1;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TileSheetEditor(Context *ctx, const ox::String &path);
|
TileSheetEditor(Context *ctx, const ox::String &path);
|
||||||
|
@ -7,6 +7,10 @@
|
|||||||
|
|
||||||
namespace nostalgia::core {
|
namespace nostalgia::core {
|
||||||
|
|
||||||
|
void TileSheetGrid::setPixelSizeMod(float sm) noexcept {
|
||||||
|
m_pixelSizeMod = sm;
|
||||||
|
}
|
||||||
|
|
||||||
ox::Error TileSheetGrid::buildShader() noexcept {
|
ox::Error TileSheetGrid::buildShader() noexcept {
|
||||||
const auto pixelLineVshad = ox::sfmt(VShad, glutils::GlslVersion);
|
const auto pixelLineVshad = ox::sfmt(VShad, glutils::GlslVersion);
|
||||||
const auto pixelLineFshad = ox::sfmt(FShad, glutils::GlslVersion);
|
const auto pixelLineFshad = ox::sfmt(FShad, glutils::GlslVersion);
|
||||||
@ -92,11 +96,11 @@ void TileSheetGrid::setBufferObjects(const NostalgiaGraphic &img, glutils::Buffe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImVec2 TileSheetGrid::pixelSize() noexcept {
|
ImVec2 TileSheetGrid::pixelSize() const noexcept {
|
||||||
const auto [sw, sh] = ImGui::GetContentRegionAvail();
|
const auto [sw, sh] = ImGui::GetContentRegionAvail();
|
||||||
constexpr float ymod = 0.35f / 10.0f;
|
constexpr float ymod = 0.35f / 10.0f;
|
||||||
const auto xmod = ymod * sh / sw;
|
const auto xmod = ymod * sh / sw;
|
||||||
return {xmod, ymod};
|
return {xmod * m_pixelSizeMod, ymod * m_pixelSizeMod};
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -60,8 +60,11 @@ class TileSheetGrid {
|
|||||||
|
|
||||||
glutils::GLProgram m_shader;
|
glutils::GLProgram m_shader;
|
||||||
glutils::BufferSet m_bufferSet;
|
glutils::BufferSet m_bufferSet;
|
||||||
|
float m_pixelSizeMod = 1;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
void setPixelSizeMod(float sm) noexcept;
|
||||||
|
|
||||||
ox::Error buildShader() noexcept;
|
ox::Error buildShader() noexcept;
|
||||||
|
|
||||||
void draw(bool update) noexcept;
|
void draw(bool update) noexcept;
|
||||||
@ -73,7 +76,7 @@ class TileSheetGrid {
|
|||||||
|
|
||||||
void setBufferObjects(const NostalgiaGraphic &img, glutils::BufferSet *bg) noexcept;
|
void setBufferObjects(const NostalgiaGraphic &img, glutils::BufferSet *bg) noexcept;
|
||||||
|
|
||||||
static class ImVec2 pixelSize() noexcept;
|
class ImVec2 pixelSize() const noexcept;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -8,6 +8,10 @@
|
|||||||
|
|
||||||
namespace nostalgia::core {
|
namespace nostalgia::core {
|
||||||
|
|
||||||
|
void TileSheetPixels::setPixelSizeMod(float sm) noexcept {
|
||||||
|
m_pixelSizeMod = sm;
|
||||||
|
}
|
||||||
|
|
||||||
ox::Error TileSheetPixels::buildShader() noexcept {
|
ox::Error TileSheetPixels::buildShader() noexcept {
|
||||||
const auto Vshad = ox::sfmt(VShad, glutils::GlslVersion);
|
const auto Vshad = ox::sfmt(VShad, glutils::GlslVersion);
|
||||||
const auto Fshad = ox::sfmt(FShad, glutils::GlslVersion);
|
const auto Fshad = ox::sfmt(FShad, glutils::GlslVersion);
|
||||||
@ -67,7 +71,7 @@ void TileSheetPixels::setPixelBufferObject(unsigned vertexRow, float x, float y,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TileSheetPixels::setBufferObjects(const NostalgiaGraphic &img, const NostalgiaPalette &pal, glutils::BufferSet *bg) noexcept {
|
void TileSheetPixels::setBufferObjects(const NostalgiaGraphic &img, const NostalgiaPalette &pal, glutils::BufferSet *bg) noexcept {
|
||||||
const auto setPixel = [bg, img, pal](std::size_t i, uint8_t p) {
|
const auto setPixel = [this, bg, img, pal](std::size_t i, uint8_t p) {
|
||||||
const auto color = pal.colors[p];
|
const auto color = pal.colors[p];
|
||||||
const auto pt = idxToPt(i, img.columns);
|
const auto pt = idxToPt(i, img.columns);
|
||||||
const auto fx = static_cast<float>(pt.x);
|
const auto fx = static_cast<float>(pt.x);
|
||||||
@ -98,11 +102,11 @@ void TileSheetPixels::setBufferObjects(const NostalgiaGraphic &img, const Nostal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImVec2 TileSheetPixels::pixelSize() noexcept {
|
ImVec2 TileSheetPixels::pixelSize() const noexcept {
|
||||||
const auto [sw, sh] = ImGui::GetContentRegionAvail();
|
const auto [sw, sh] = ImGui::GetContentRegionAvail();
|
||||||
constexpr float ymod = 0.35f / 10.0f;
|
constexpr float ymod = 0.35f / 10.0f;
|
||||||
const auto xmod = ymod * sh / sw;
|
const auto xmod = ymod * sh / sw;
|
||||||
return {xmod, ymod};
|
return {xmod * m_pixelSizeMod, ymod * m_pixelSizeMod};
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -37,10 +37,13 @@ class TileSheetPixels {
|
|||||||
outColor = vec4(fColor, 1.0);
|
outColor = vec4(fColor, 1.0);
|
||||||
})";
|
})";
|
||||||
|
|
||||||
|
float m_pixelSizeMod = 1;
|
||||||
glutils::GLProgram m_shader;
|
glutils::GLProgram m_shader;
|
||||||
glutils::BufferSet m_bufferSet;
|
glutils::BufferSet m_bufferSet;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
void setPixelSizeMod(float sm) noexcept;
|
||||||
|
|
||||||
ox::Error buildShader() noexcept;
|
ox::Error buildShader() noexcept;
|
||||||
|
|
||||||
void draw(bool update) noexcept;
|
void draw(bool update) noexcept;
|
||||||
@ -48,11 +51,11 @@ class TileSheetPixels {
|
|||||||
void initBufferSet(const NostalgiaGraphic &img, const NostalgiaPalette &pal) noexcept;
|
void initBufferSet(const NostalgiaGraphic &img, const NostalgiaPalette &pal) noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void setPixelBufferObject(unsigned vertexRow, float x, float y, Color16 color, float *vbo, GLuint *ebo) noexcept;
|
void setPixelBufferObject(unsigned vertexRow, float x, float y, Color16 color, float *vbo, GLuint *ebo) noexcept;
|
||||||
|
|
||||||
void setBufferObjects(const NostalgiaGraphic &img, const NostalgiaPalette &pal, glutils::BufferSet *bg) noexcept;
|
void setBufferObjects(const NostalgiaGraphic &img, const NostalgiaPalette &pal, glutils::BufferSet *bg) noexcept;
|
||||||
|
|
||||||
static class ImVec2 pixelSize() noexcept;
|
class ImVec2 pixelSize() const noexcept;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user