Squashed 'deps/nostalgia/' changes from 124c7029..f128664a
f128664a [olympic/studio] Add ig::IndentStackItem e84df780 [glutils] Add ProgramSource::vboLen caa59f37 [nostalgia/core] Add functions for mapping tile idx to subsheet 1cf09433 [nostalgia/core/studio] Cleanup TileSheetEditor with new GlUtils helpers 9948346c [ox/model] Fix clangd false alarm aa8200be [glutils] Add helper functions for setting up shaders git-subtree-dir: deps/nostalgia git-subtree-split: f128664a81b817aaf066de02cc3a09650958ace9
This commit is contained in:
		@@ -158,6 +158,12 @@ struct TileSheet {
 | 
			
		||||
[[nodiscard]]
 | 
			
		||||
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]]
 | 
			
		||||
uint8_t getPixel4Bpp(TileSheet::SubSheet const&ss, std::size_t idx) noexcept;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,37 @@
 | 
			
		||||
 | 
			
		||||
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) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -17,9 +48,7 @@ void TileSheetPixels::setPixelSizeMod(float sm) noexcept {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ox::Error TileSheetPixels::buildShader() noexcept {
 | 
			
		||||
	auto const Vshad = ox::sfmt(VShad, gl::GlslVersion);
 | 
			
		||||
	auto const Fshad = ox::sfmt(FShad, gl::GlslVersion);
 | 
			
		||||
	return glutils::buildShaderProgram(Vshad, Fshad).moveTo(m_shader);
 | 
			
		||||
	return glutils::buildShaderProgram(s_programSrc).moveTo(m_shader);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TileSheetPixels::draw(bool update, ox::Vec2 const&scroll) noexcept {
 | 
			
		||||
@@ -40,14 +69,7 @@ void TileSheetPixels::initBufferSet(ox::Vec2 const&paneSize) noexcept {
 | 
			
		||||
	m_bufferSet.vbo = glutils::generateBuffer();
 | 
			
		||||
	m_bufferSet.ebo = glutils::generateBuffer();
 | 
			
		||||
	update(paneSize);
 | 
			
		||||
	// 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)}));
 | 
			
		||||
	glutils::setupShaderParams(m_shader, s_programSrc.shaderParams);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TileSheetPixels::update(ox::Vec2 const&paneSize) noexcept {
 | 
			
		||||
@@ -78,14 +100,14 @@ void TileSheetPixels::setPixelBufferObject(
 | 
			
		||||
	y += 1.0f - ymod;
 | 
			
		||||
	auto const r = redf(color), g = greenf(color), b = bluef(color);
 | 
			
		||||
	// don't worry, these memcpys gets optimized to something much more ideal
 | 
			
		||||
	ox::Array<float, VertexVboLength> const vertices = {
 | 
			
		||||
	std::array const vertices = {
 | 
			
		||||
			       x,        y, r, g, b, // bottom left
 | 
			
		||||
			x + xmod,        y, r, g, b, // bottom right
 | 
			
		||||
			x + xmod, y + ymod, r, g, b, // top right
 | 
			
		||||
			       x, y + ymod, r, g, b, // top left
 | 
			
		||||
	};
 | 
			
		||||
	memcpy(vbo, vertices.data(), sizeof(vertices));
 | 
			
		||||
	ox::Array<GLuint, VertexEboLength> const elms = {
 | 
			
		||||
	std::array const elms = {
 | 
			
		||||
			vertexRow + 0, vertexRow + 1, vertexRow + 2,
 | 
			
		||||
			vertexRow + 2, vertexRow + 3, vertexRow + 0,
 | 
			
		||||
	};
 | 
			
		||||
@@ -99,7 +121,8 @@ void TileSheetPixels::setBufferObjects(ox::Vec2 const&paneSize) noexcept {
 | 
			
		||||
	auto const width = subSheet.columns * TileWidth;
 | 
			
		||||
	auto const height = subSheet.rows * TileHeight;
 | 
			
		||||
	auto const pixels = static_cast<size_t>(width) * static_cast<size_t>(height);
 | 
			
		||||
	m_bufferSet.vertices.resize(pixels * VertexVboLength);
 | 
			
		||||
	auto const vboLen = static_cast<size_t>(s_programSrc.vboLen);
 | 
			
		||||
	m_bufferSet.vertices.resize(pixels * vboLen);
 | 
			
		||||
	m_bufferSet.elements.resize(pixels * VertexEboLength);
 | 
			
		||||
	// set pixels
 | 
			
		||||
	walkPixels(subSheet, m_model.img().bpp, [&](std::size_t i, uint8_t p) {
 | 
			
		||||
@@ -107,9 +130,9 @@ void TileSheetPixels::setBufferObjects(ox::Vec2 const&paneSize) noexcept {
 | 
			
		||||
		auto const pt = idxToPt(static_cast<int>(i), subSheet.columns);
 | 
			
		||||
		auto const fx = static_cast<float>(pt.x);
 | 
			
		||||
		auto const fy = static_cast<float>(pt.y);
 | 
			
		||||
		auto const vbo = &m_bufferSet.vertices[i * VertexVboLength];
 | 
			
		||||
		auto const vbo = &m_bufferSet.vertices[i * vboLen];
 | 
			
		||||
		auto const ebo = &m_bufferSet.elements[i * VertexEboLength];
 | 
			
		||||
		if (i * VertexVboLength + VertexVboLength > m_bufferSet.vertices.size()) {
 | 
			
		||||
		if (i * vboLen + vboLen > m_bufferSet.vertices.size()) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		if (i * VertexEboLength + VertexEboLength > m_bufferSet.elements.size()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -18,28 +18,9 @@ class TileSheetPixels {
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		static constexpr auto VertexVboRows = 4;
 | 
			
		||||
		static constexpr auto VertexVboRowLength = 5;
 | 
			
		||||
		static constexpr auto VertexVboLength = VertexVboRows * VertexVboRowLength;
 | 
			
		||||
		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;
 | 
			
		||||
		glutils::GLProgram m_shader;
 | 
			
		||||
		glutils::BufferSet m_bufferSet;
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,44 @@ std::size_t idx(TileSheet::SubSheet const&ss, ox::Point const&pt) noexcept {
 | 
			
		||||
	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 {
 | 
			
		||||
	if (idx & 1) {
 | 
			
		||||
		return ss.pixels[idx / 2] >> 4;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user