Compare commits
No commits in common. "f128664a81b817aaf066de02cc3a09650958ace9" and "124c7029bda328e9ddc208b00e53a2e6452f2ede" have entirely different histories.
f128664a81
...
124c7029bd
35
deps/glutils/include/glutils/glutils.hpp
vendored
35
deps/glutils/include/glutils/glutils.hpp
vendored
@ -150,39 +150,8 @@ class FrameBufferBind {
|
|||||||
|
|
||||||
void bind(const FrameBuffer &fb) noexcept;
|
void bind(const FrameBuffer &fb) noexcept;
|
||||||
|
|
||||||
struct ShaderVarSet {
|
|
||||||
GLsizei len{};
|
|
||||||
ox::String name;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ProgramSource {
|
ox::Result<GLProgram> buildShaderProgram(ox::CStringView const&vert, ox::CStringView const&frag, ox::CStringView const&geo = "") noexcept;
|
||||||
ox::Vector<glutils::ShaderVarSet> const shaderParams;
|
|
||||||
GLsizei const rowLen = [this] {
|
|
||||||
GLsizei len{};
|
|
||||||
for (auto const&v : shaderParams) {
|
|
||||||
len += v.len;
|
|
||||||
}
|
|
||||||
return len;
|
|
||||||
}();
|
|
||||||
GLsizei const vboLen = rowLen * 4;
|
|
||||||
ox::String const vertShader{};
|
|
||||||
ox::String const fragShader{};
|
|
||||||
ox::String const geomShader{};
|
|
||||||
};
|
|
||||||
|
|
||||||
ox::Result<GLProgram> buildShaderProgram(ProgramSource const&src) noexcept;
|
|
||||||
|
|
||||||
ox::Result<GLProgram> buildShaderProgram(
|
|
||||||
ox::CStringView const&vert,
|
|
||||||
ox::CStringView const&frag,
|
|
||||||
ox::CStringView const&geo = "") noexcept;
|
|
||||||
|
|
||||||
void setupShaderParams(
|
|
||||||
GLProgram const&shader,
|
|
||||||
ox::Vector<ShaderVarSet> const&vars,
|
|
||||||
GLsizei vertexRowLen) noexcept;
|
|
||||||
|
|
||||||
void setupShaderParams(GLProgram const&shader, ox::Vector<ShaderVarSet> const&vars) noexcept;
|
|
||||||
|
|
||||||
glutils::GLVertexArray generateVertexArrayObject() noexcept;
|
glutils::GLVertexArray generateVertexArrayObject() noexcept;
|
||||||
|
|
||||||
@ -191,8 +160,6 @@ glutils::GLBuffer generateBuffer() noexcept;
|
|||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
FrameBuffer generateFrameBuffer(int width, int height) noexcept;
|
FrameBuffer generateFrameBuffer(int width, int height) noexcept;
|
||||||
|
|
||||||
void resizeFrameBuffer(FrameBuffer &fb, int width, int height) noexcept;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resizes a FrameBuffer, and creates if it does not already exist.
|
* Resizes a FrameBuffer, and creates if it does not already exist.
|
||||||
*/
|
*/
|
||||||
|
48
deps/glutils/src/glutils.cpp
vendored
48
deps/glutils/src/glutils.cpp
vendored
@ -88,40 +88,6 @@ static ox::Result<GLShader> buildShader(
|
|||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
ox::Result<GLProgram> buildShaderProgram(ProgramSource const&src) noexcept {
|
|
||||||
oxRequireM(program, buildShaderProgram(
|
|
||||||
src.vertShader,
|
|
||||||
src.fragShader,
|
|
||||||
src.geomShader));
|
|
||||||
setupShaderParams(program, src.shaderParams, src.rowLen);
|
|
||||||
return std::move(program);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupShaderParams(
|
|
||||||
GLProgram const&shader,
|
|
||||||
ox::Vector<ShaderVarSet> const&vars,
|
|
||||||
GLsizei vertexRowLen) noexcept {
|
|
||||||
// setup vars
|
|
||||||
for (auto lenWritten = 0LU; auto const&v : vars) {
|
|
||||||
auto const attr = static_cast<GLuint>(glGetAttribLocation(shader, v.name.c_str()));
|
|
||||||
glEnableVertexAttribArray(attr);
|
|
||||||
glVertexAttribPointer(
|
|
||||||
attr, v.len, GL_FLOAT, GL_FALSE,
|
|
||||||
vertexRowLen * static_cast<GLsizei>(sizeof(float)),
|
|
||||||
std::bit_cast<void*>(uintptr_t{lenWritten * sizeof(float)}));
|
|
||||||
lenWritten += static_cast<size_t>(v.len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupShaderParams(GLProgram const&shader, ox::Vector<ShaderVarSet> const&vars) noexcept {
|
|
||||||
// get row len
|
|
||||||
GLsizei vertexRowLen{};
|
|
||||||
for (auto const&v : vars) {
|
|
||||||
vertexRowLen += v.len;
|
|
||||||
}
|
|
||||||
setupShaderParams(shader, vars, vertexRowLen);
|
|
||||||
}
|
|
||||||
|
|
||||||
ox::Result<GLProgram> buildShaderProgram(
|
ox::Result<GLProgram> buildShaderProgram(
|
||||||
ox::CStringView const&vert,
|
ox::CStringView const&vert,
|
||||||
ox::CStringView const&frag,
|
ox::CStringView const&frag,
|
||||||
@ -181,7 +147,11 @@ FrameBuffer generateFrameBuffer(int width, int height) noexcept {
|
|||||||
return fb;
|
return fb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void resizeFrameBuffer(FrameBuffer &fb, int width, int height) noexcept {
|
void resizeInitFrameBuffer(FrameBuffer &fb, int width, int height) noexcept {
|
||||||
|
if (!fb) {
|
||||||
|
fb = generateFrameBuffer(width, height);
|
||||||
|
return;
|
||||||
|
}
|
||||||
width = ox::max(1, width);
|
width = ox::max(1, width);
|
||||||
height = ox::max(1, height);
|
height = ox::max(1, height);
|
||||||
fb.width = width;
|
fb.width = width;
|
||||||
@ -201,14 +171,6 @@ void resizeFrameBuffer(FrameBuffer &fb, int width, int height) noexcept {
|
|||||||
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void resizeInitFrameBuffer(FrameBuffer &fb, int width, int height) noexcept {
|
|
||||||
if (!fb) {
|
|
||||||
fb = generateFrameBuffer(width, height);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
resizeFrameBuffer(fb, width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
void resizeInitFrameBuffer(FrameBuffer &fb, ox::Size const&sz) noexcept {
|
void resizeInitFrameBuffer(FrameBuffer &fb, ox::Size const&sz) noexcept {
|
||||||
resizeInitFrameBuffer(fb, sz.width, sz.height);
|
resizeInitFrameBuffer(fb, sz.width, sz.height);
|
||||||
}
|
}
|
||||||
|
7
deps/ox/src/ox/model/modelvalue.hpp
vendored
7
deps/ox/src/ox/model/modelvalue.hpp
vendored
@ -334,12 +334,7 @@ consteval bool isVector(const ModelValueVector*) noexcept {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr Error model(auto *h, CommonPtrWith<ModelObject> auto *obj) noexcept;
|
|
||||||
constexpr Error model(auto *h, CommonPtrWith<ModelUnion> auto *obj) noexcept;
|
|
||||||
|
|
||||||
|
|
||||||
class ModelObject {
|
class ModelObject {
|
||||||
friend constexpr Error model(auto *h, CommonPtrWith<ModelObject> auto *obj) noexcept;
|
|
||||||
public:
|
public:
|
||||||
struct Field {
|
struct Field {
|
||||||
String name;
|
String name;
|
||||||
@ -522,7 +517,7 @@ class ModelUnion {
|
|||||||
String name;
|
String name;
|
||||||
ModelValue value;
|
ModelValue value;
|
||||||
};
|
};
|
||||||
friend constexpr Error model(auto *h, CommonPtrWith<ModelUnion> auto *obj) noexcept;
|
oxModelFriend(ModelUnion);
|
||||||
friend ModelValue;
|
friend ModelValue;
|
||||||
Vector<UniquePtr<Field>> m_fieldsOrder;
|
Vector<UniquePtr<Field>> m_fieldsOrder;
|
||||||
HashMap<String, Field*> m_fields;
|
HashMap<String, Field*> m_fields;
|
||||||
|
@ -158,12 +158,6 @@ struct TileSheet {
|
|||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
std::size_t idx(TileSheet::SubSheet const&ss, ox::Point const&pt) noexcept;
|
std::size_t idx(TileSheet::SubSheet const&ss, ox::Point const&pt) noexcept;
|
||||||
|
|
||||||
[[nodiscard]]
|
|
||||||
TileSheet::SubSheet const*getSubsheet(TileSheet const&ts, SubSheetId const id) noexcept;
|
|
||||||
|
|
||||||
[[nodiscard]]
|
|
||||||
size_t getTileIdx(TileSheet const&ts, SubSheetId id) noexcept;
|
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
uint8_t getPixel4Bpp(TileSheet::SubSheet const&ss, std::size_t idx) noexcept;
|
uint8_t getPixel4Bpp(TileSheet::SubSheet const&ss, std::size_t idx) noexcept;
|
||||||
|
|
||||||
|
@ -9,37 +9,6 @@
|
|||||||
|
|
||||||
namespace nostalgia::core {
|
namespace nostalgia::core {
|
||||||
|
|
||||||
const glutils::ProgramSource TileSheetPixels::s_programSrc = {
|
|
||||||
.shaderParams = {
|
|
||||||
{
|
|
||||||
.len = 2,
|
|
||||||
.name = ox::String("vPosition"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.len = 3,
|
|
||||||
.name = ox::String("vColor"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.vertShader = ox::sfmt(R"(
|
|
||||||
{}
|
|
||||||
in vec2 vPosition;
|
|
||||||
in vec3 vColor;
|
|
||||||
out vec3 fColor;
|
|
||||||
uniform vec2 vScroll;
|
|
||||||
void main() {
|
|
||||||
gl_Position = vec4(vPosition + vScroll, 0.0, 1.0);
|
|
||||||
fColor = vColor;
|
|
||||||
})", core::gl::GlslVersion),
|
|
||||||
.fragShader = ox::sfmt(R"(
|
|
||||||
{}
|
|
||||||
in vec3 fColor;
|
|
||||||
out vec4 outColor;
|
|
||||||
void main() {
|
|
||||||
//outColor = vec4(0.0, 0.7, 1.0, 1.0);
|
|
||||||
outColor = vec4(fColor, 1.0);
|
|
||||||
})", core::gl::GlslVersion),
|
|
||||||
};
|
|
||||||
|
|
||||||
TileSheetPixels::TileSheetPixels(TileSheetEditorModel &model) noexcept: m_model(model) {
|
TileSheetPixels::TileSheetPixels(TileSheetEditorModel &model) noexcept: m_model(model) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,7 +17,9 @@ void TileSheetPixels::setPixelSizeMod(float sm) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ox::Error TileSheetPixels::buildShader() noexcept {
|
ox::Error TileSheetPixels::buildShader() noexcept {
|
||||||
return glutils::buildShaderProgram(s_programSrc).moveTo(m_shader);
|
auto const Vshad = ox::sfmt(VShad, gl::GlslVersion);
|
||||||
|
auto const Fshad = ox::sfmt(FShad, gl::GlslVersion);
|
||||||
|
return glutils::buildShaderProgram(Vshad, Fshad).moveTo(m_shader);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileSheetPixels::draw(bool update, ox::Vec2 const&scroll) noexcept {
|
void TileSheetPixels::draw(bool update, ox::Vec2 const&scroll) noexcept {
|
||||||
@ -69,7 +40,14 @@ void TileSheetPixels::initBufferSet(ox::Vec2 const&paneSize) noexcept {
|
|||||||
m_bufferSet.vbo = glutils::generateBuffer();
|
m_bufferSet.vbo = glutils::generateBuffer();
|
||||||
m_bufferSet.ebo = glutils::generateBuffer();
|
m_bufferSet.ebo = glutils::generateBuffer();
|
||||||
update(paneSize);
|
update(paneSize);
|
||||||
glutils::setupShaderParams(m_shader, s_programSrc.shaderParams);
|
// vbo layout
|
||||||
|
auto const posAttr = static_cast<GLuint>(glGetAttribLocation(m_shader, "vPosition"));
|
||||||
|
glEnableVertexAttribArray(posAttr);
|
||||||
|
glVertexAttribPointer(posAttr, 2, GL_FLOAT, GL_FALSE, VertexVboRowLength * sizeof(float), nullptr);
|
||||||
|
auto const colorAttr = static_cast<GLuint>(glGetAttribLocation(m_shader, "vColor"));
|
||||||
|
glEnableVertexAttribArray(colorAttr);
|
||||||
|
glVertexAttribPointer(colorAttr, 3, GL_FLOAT, GL_FALSE, VertexVboRowLength * sizeof(float),
|
||||||
|
std::bit_cast<void*>(uintptr_t{2 * sizeof(float)}));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileSheetPixels::update(ox::Vec2 const&paneSize) noexcept {
|
void TileSheetPixels::update(ox::Vec2 const&paneSize) noexcept {
|
||||||
@ -100,14 +78,14 @@ void TileSheetPixels::setPixelBufferObject(
|
|||||||
y += 1.0f - ymod;
|
y += 1.0f - ymod;
|
||||||
auto const r = redf(color), g = greenf(color), b = bluef(color);
|
auto const r = redf(color), g = greenf(color), b = bluef(color);
|
||||||
// don't worry, these memcpys gets optimized to something much more ideal
|
// don't worry, these memcpys gets optimized to something much more ideal
|
||||||
std::array const vertices = {
|
ox::Array<float, VertexVboLength> const vertices = {
|
||||||
x, y, r, g, b, // bottom left
|
x, y, r, g, b, // bottom left
|
||||||
x + xmod, y, r, g, b, // bottom right
|
x + xmod, y, r, g, b, // bottom right
|
||||||
x + xmod, y + ymod, r, g, b, // top right
|
x + xmod, y + ymod, r, g, b, // top right
|
||||||
x, y + ymod, r, g, b, // top left
|
x, y + ymod, r, g, b, // top left
|
||||||
};
|
};
|
||||||
memcpy(vbo, vertices.data(), sizeof(vertices));
|
memcpy(vbo, vertices.data(), sizeof(vertices));
|
||||||
std::array const elms = {
|
ox::Array<GLuint, VertexEboLength> const elms = {
|
||||||
vertexRow + 0, vertexRow + 1, vertexRow + 2,
|
vertexRow + 0, vertexRow + 1, vertexRow + 2,
|
||||||
vertexRow + 2, vertexRow + 3, vertexRow + 0,
|
vertexRow + 2, vertexRow + 3, vertexRow + 0,
|
||||||
};
|
};
|
||||||
@ -121,8 +99,7 @@ void TileSheetPixels::setBufferObjects(ox::Vec2 const&paneSize) noexcept {
|
|||||||
auto const width = subSheet.columns * TileWidth;
|
auto const width = subSheet.columns * TileWidth;
|
||||||
auto const height = subSheet.rows * TileHeight;
|
auto const height = subSheet.rows * TileHeight;
|
||||||
auto const pixels = static_cast<size_t>(width) * static_cast<size_t>(height);
|
auto const pixels = static_cast<size_t>(width) * static_cast<size_t>(height);
|
||||||
auto const vboLen = static_cast<size_t>(s_programSrc.vboLen);
|
m_bufferSet.vertices.resize(pixels * VertexVboLength);
|
||||||
m_bufferSet.vertices.resize(pixels * vboLen);
|
|
||||||
m_bufferSet.elements.resize(pixels * VertexEboLength);
|
m_bufferSet.elements.resize(pixels * VertexEboLength);
|
||||||
// set pixels
|
// set pixels
|
||||||
walkPixels(subSheet, m_model.img().bpp, [&](std::size_t i, uint8_t p) {
|
walkPixels(subSheet, m_model.img().bpp, [&](std::size_t i, uint8_t p) {
|
||||||
@ -130,9 +107,9 @@ void TileSheetPixels::setBufferObjects(ox::Vec2 const&paneSize) noexcept {
|
|||||||
auto const pt = idxToPt(static_cast<int>(i), subSheet.columns);
|
auto const pt = idxToPt(static_cast<int>(i), subSheet.columns);
|
||||||
auto const fx = static_cast<float>(pt.x);
|
auto const fx = static_cast<float>(pt.x);
|
||||||
auto const fy = static_cast<float>(pt.y);
|
auto const fy = static_cast<float>(pt.y);
|
||||||
auto const vbo = &m_bufferSet.vertices[i * vboLen];
|
auto const vbo = &m_bufferSet.vertices[i * VertexVboLength];
|
||||||
auto const ebo = &m_bufferSet.elements[i * VertexEboLength];
|
auto const ebo = &m_bufferSet.elements[i * VertexEboLength];
|
||||||
if (i * vboLen + vboLen > m_bufferSet.vertices.size()) {
|
if (i * VertexVboLength + VertexVboLength > m_bufferSet.vertices.size()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (i * VertexEboLength + VertexEboLength > m_bufferSet.elements.size()) {
|
if (i * VertexEboLength + VertexEboLength > m_bufferSet.elements.size()) {
|
||||||
|
@ -18,9 +18,28 @@ class TileSheetPixels {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr auto VertexVboRows = 4;
|
static constexpr auto VertexVboRows = 4;
|
||||||
|
static constexpr auto VertexVboRowLength = 5;
|
||||||
|
static constexpr auto VertexVboLength = VertexVboRows * VertexVboRowLength;
|
||||||
static constexpr auto VertexEboLength = 6;
|
static constexpr auto VertexEboLength = 6;
|
||||||
|
static constexpr auto VShad = R"(
|
||||||
|
{}
|
||||||
|
in vec2 vPosition;
|
||||||
|
in vec3 vColor;
|
||||||
|
out vec3 fColor;
|
||||||
|
uniform vec2 vScroll;
|
||||||
|
void main() {
|
||||||
|
gl_Position = vec4(vPosition + vScroll, 0.0, 1.0);
|
||||||
|
fColor = vColor;
|
||||||
|
})";
|
||||||
|
static constexpr auto FShad = R"(
|
||||||
|
{}
|
||||||
|
in vec3 fColor;
|
||||||
|
out vec4 outColor;
|
||||||
|
void main() {
|
||||||
|
//outColor = vec4(0.0, 0.7, 1.0, 1.0);
|
||||||
|
outColor = vec4(fColor, 1.0);
|
||||||
|
})";
|
||||||
|
|
||||||
static const glutils::ProgramSource s_programSrc;
|
|
||||||
float m_pixelSizeMod = 1;
|
float m_pixelSizeMod = 1;
|
||||||
glutils::GLProgram m_shader;
|
glutils::GLProgram m_shader;
|
||||||
glutils::BufferSet m_bufferSet;
|
glutils::BufferSet m_bufferSet;
|
||||||
|
@ -14,44 +14,6 @@ std::size_t idx(TileSheet::SubSheet const&ss, ox::Point const&pt) noexcept {
|
|||||||
return ptToIdx(pt, ss.columns);
|
return ptToIdx(pt, ss.columns);
|
||||||
}
|
}
|
||||||
|
|
||||||
static TileSheet::SubSheet const*getSubsheet(TileSheet::SubSheet const&ss, SubSheetId const id) noexcept {
|
|
||||||
if (ss.id == id) {
|
|
||||||
return &ss;
|
|
||||||
}
|
|
||||||
for (auto const&child : ss.subsheets) {
|
|
||||||
if (auto out = getSubsheet(child, id)) {
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
TileSheet::SubSheet const*getSubsheet(TileSheet const&ts, SubSheetId const id) noexcept {
|
|
||||||
return getSubsheet(ts.subsheet, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ox::Optional<size_t> getPixelIdx(
|
|
||||||
TileSheet::SubSheet const&ss,
|
|
||||||
SubSheetId const id,
|
|
||||||
size_t idx,
|
|
||||||
int8_t const bpp) noexcept {
|
|
||||||
for (auto const&child : ss.subsheets) {
|
|
||||||
if (child.id == id) {
|
|
||||||
return ox::Optional<size_t>(ox::in_place, idx);
|
|
||||||
}
|
|
||||||
if (auto out = getPixelIdx(child, id, idx, bpp)) {
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
idx += pixelCnt(ss, bpp);
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t getTileIdx(TileSheet const&ts, SubSheetId const id) noexcept {
|
|
||||||
auto const out = getPixelIdx(ts.subsheet, id, 0, ts.bpp);
|
|
||||||
return out.or_value(0) / PixelsPerTile;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t getPixel4Bpp(TileSheet::SubSheet const&ss, std::size_t idx) noexcept {
|
uint8_t getPixel4Bpp(TileSheet::SubSheet const&ss, std::size_t idx) noexcept {
|
||||||
if (idx & 1) {
|
if (idx & 1) {
|
||||||
return ss.pixels[idx / 2] >> 4;
|
return ss.pixels[idx / 2] >> 4;
|
||||||
|
@ -20,14 +20,6 @@ class IDStackItem {
|
|||||||
~IDStackItem() noexcept;
|
~IDStackItem() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
class IndentStackItem {
|
|
||||||
private:
|
|
||||||
float m_indent{};
|
|
||||||
public:
|
|
||||||
explicit IndentStackItem(float id) noexcept;
|
|
||||||
~IndentStackItem() noexcept;
|
|
||||||
};
|
|
||||||
|
|
||||||
void centerNextWindow(turbine::Context &ctx) noexcept;
|
void centerNextWindow(turbine::Context &ctx) noexcept;
|
||||||
|
|
||||||
bool PushButton(ox::CStringView lbl, ImVec2 const&btnSz = BtnSz) noexcept;
|
bool PushButton(ox::CStringView lbl, ImVec2 const&btnSz = BtnSz) noexcept;
|
||||||
|
@ -24,16 +24,6 @@ IDStackItem::~IDStackItem() noexcept {
|
|||||||
ImGui::PopID();
|
ImGui::PopID();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
IndentStackItem::IndentStackItem(float indent) noexcept: m_indent(indent) {
|
|
||||||
ImGui::Indent(m_indent);
|
|
||||||
}
|
|
||||||
|
|
||||||
IndentStackItem::~IndentStackItem() noexcept {
|
|
||||||
ImGui::Indent(-m_indent);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void centerNextWindow(turbine::Context &ctx) noexcept {
|
void centerNextWindow(turbine::Context &ctx) noexcept {
|
||||||
auto const sz = turbine::getScreenSize(ctx);
|
auto const sz = turbine::getScreenSize(ctx);
|
||||||
auto const screenW = static_cast<float>(sz.width);
|
auto const screenW = static_cast<float>(sz.width);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user