Compare commits
	
		
			2 Commits
		
	
	
		
			17cb40c0ec
			...
			1cc3549d00
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 1cc3549d00 | |||
| 4bcef4bd35 | 
| @@ -7,6 +7,7 @@ | ||||
| #include <ox/std/array.hpp> | ||||
| #include <ox/std/fmt.hpp> | ||||
|  | ||||
| #include <nostalgia/geo/vec.hpp> | ||||
| #include <nostalgia/glutils/glutils.hpp> | ||||
|  | ||||
| #include <nostalgia/core/context.hpp> | ||||
| @@ -27,7 +28,7 @@ constexpr uint64_t BgVertexVboRows = 4; | ||||
| constexpr uint64_t BgVertexVboRowLength = 4; | ||||
| constexpr uint64_t BgVertexVboLength = BgVertexVboRows * BgVertexVboRowLength; | ||||
| constexpr uint64_t BgVertexEboLength = 6; | ||||
| constexpr uint64_t SpriteVertexVboRows = 4; | ||||
| constexpr uint64_t SpriteVertexVboRows = 256; | ||||
| constexpr uint64_t SpriteVertexVboRowLength = 5; | ||||
| constexpr uint64_t SpriteVertexVboLength = SpriteVertexVboRows * SpriteVertexVboRowLength; | ||||
| constexpr uint64_t SpriteVertexEboLength = 6; | ||||
| @@ -103,17 +104,7 @@ constexpr ox::StringView spritevshadTmpl = R"( | ||||
| 		fTexCoord = vTexCoord * vec2(1, vTileHeight) * vec2(vEnabled, vEnabled); | ||||
| 	})"; | ||||
|  | ||||
| constexpr ox::StringView spritefshadTmpl = R"( | ||||
| 	{} | ||||
| 	out vec4 outColor; | ||||
| 	in vec2 fTexCoord; | ||||
| 	uniform sampler2D image; | ||||
| 	uniform vec4 fPalette[256]; | ||||
| 	void main() { | ||||
| 		int idx = int(texture(image, fTexCoord).rgb.r * 256); | ||||
| 		outColor = fPalette[idx]; | ||||
| 		//outColor = vec4(0.0, 0.7, 1.0, 1.0); | ||||
| 	})"; | ||||
| constexpr ox::StringView spritefshadTmpl = bgfshadTmpl; | ||||
|  | ||||
| [[nodiscard]] | ||||
| static constexpr auto bgVertexRow(unsigned x, unsigned y) noexcept { | ||||
| @@ -270,9 +261,9 @@ static void tickFps(GlImplData *id) noexcept { | ||||
| 		const auto duration = static_cast<double>(now - id->prevFpsCheckTime) / 1000.0; | ||||
| 		const auto fps = static_cast<int>(static_cast<double>(id->draws) / duration); | ||||
| 		if constexpr(config::UserlandFpsPrint) { | ||||
| 			oxInfof("FPS: {}", fps); | ||||
| 			oxOutf("FPS: {}\n", fps); | ||||
| 		} | ||||
| 		oxTracef("nostalgia::core::gfx::gl::fps", "FPS: {}", fps); | ||||
| 		oxTracef("nostalgia::core::gfx::fps", "FPS: {}", fps); | ||||
| 		id->prevFpsCheckTime = now; | ||||
| 		id->draws = 0; | ||||
| 	} | ||||
| @@ -432,7 +423,9 @@ void draw(Context *ctx) noexcept { | ||||
| 	glClear(GL_COLOR_BUFFER_BIT); | ||||
| 	// render | ||||
| 	renderer::drawBackgrounds(id); | ||||
| 	if (id->spriteBlocks.tex) { | ||||
| 		renderer::drawSprites(id); | ||||
| 	} | ||||
| 	for (const auto cd : ctx->drawers) { | ||||
| 		cd->draw(ctx); | ||||
| 	} | ||||
| @@ -466,17 +459,59 @@ void setSprite(Context *ctx, | ||||
|                [[maybe_unused]] unsigned spriteShape, | ||||
|                [[maybe_unused]] unsigned spriteSize, | ||||
|                unsigned flipX) noexcept { | ||||
| 	const auto uX = static_cast<unsigned>(x) % 255; | ||||
| 	const auto uY = static_cast<unsigned>(y) % 127; | ||||
| 	//oxTracef("nostalgia::core::gfx::gl", "setSprite(ctx, {}, {}, {}, {}, {}, {}, {})", | ||||
| 	//         idx, x, y, tileIdx, spriteShape, spriteSize, flipX); | ||||
| 	// Tonc Table 8.4 | ||||
| 	static constexpr ox::Array<geo::Vec<unsigned>, 12> dimensions{ | ||||
| 		// col 0 | ||||
| 		{1, 1}, // 0, 0 | ||||
| 		{2, 2}, // 0, 1 | ||||
| 		{4, 4}, // 0, 2 | ||||
| 		{8, 8}, // 0, 3 | ||||
| 		// col 1 | ||||
| 		{2, 1}, // 1, 0 | ||||
| 		{4, 1}, // 1, 1 | ||||
| 		{4, 2}, // 1, 2 | ||||
| 		{8, 4}, // 1, 3 | ||||
| 		// col 2 | ||||
| 		{1, 1}, // 2, 0 | ||||
| 		{1, 4}, // 2, 1 | ||||
| 		{2, 4}, // 2, 2 | ||||
| 		{4, 8}, // 2, 3 | ||||
| 	}; | ||||
| 	const auto dim = dimensions[(spriteShape << 2) | spriteSize]; | ||||
| 	const auto uX = static_cast<int>(x) % 255; | ||||
| 	const auto uY = static_cast<int>(y + 8) % 255 - 8; | ||||
| 	auto &id = *ctx->rendererData<renderer::GlImplData>(); | ||||
| 	auto vbo = &id.spriteBlocks.vertices[idx * renderer::SpriteVertexVboLength]; | ||||
| 	auto ebo = &id.spriteBlocks.elements[idx * renderer::SpriteVertexEboLength]; | ||||
| 	renderer::setSpriteBufferObject(ctx, idx * renderer::SpriteVertexVboRows, 1, | ||||
| 	                                static_cast<float>(uX) / 8, static_cast<float>(uY) / 8, tileIdx, flipX, vbo, ebo); | ||||
| 	auto i = 0u; | ||||
| 	const auto set = [&](int xIt, int yIt) { | ||||
| 		const auto fX = static_cast<float>(uX + xIt * 8) / 8; | ||||
| 		const auto fY = static_cast<float>(uY + yIt * 8) / 8; | ||||
| 		const auto cidx = idx + i; | ||||
| 		auto vbo = &id.spriteBlocks.vertices[cidx * renderer::SpriteVertexVboLength]; | ||||
| 		auto ebo = &id.spriteBlocks.elements[cidx * renderer::SpriteVertexEboLength]; | ||||
| 		renderer::setSpriteBufferObject(ctx, cidx * renderer::SpriteVertexVboRows, 1, | ||||
| 												  fX, fY, tileIdx + i, flipX, vbo, ebo); | ||||
| 		++i; | ||||
| 	}; | ||||
| 	if (!flipX) { | ||||
| 		for (auto yIt = 0; yIt < static_cast<int>(dim.y); ++yIt) { | ||||
| 			for (auto xIt = 0u; xIt < dim.x; ++xIt) { | ||||
| 				set(static_cast<int>(xIt), static_cast<int>(yIt)); | ||||
| 			} | ||||
| 		} | ||||
| 	} else { | ||||
| 		for (auto yIt = 0u; yIt < dim.y; ++yIt) { | ||||
| 			for (auto xIt = dim.x - 1; xIt < ~0u; --xIt) { | ||||
| 				set(static_cast<int>(xIt), static_cast<int>(yIt)); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	id.spriteBlocks.updated = true; | ||||
| } | ||||
|  | ||||
| void setTile(Context *ctx, unsigned bgIdx, int column, int row, uint8_t tile) noexcept { | ||||
| 	//oxTracef("nostalgia::core::gfx::gl", "setTile(ctx, {}, {}, {}, {})", bgIdx, column, row, tile); | ||||
| 	const auto id = ctx->rendererData<renderer::GlImplData>(); | ||||
| 	const auto z = static_cast<unsigned>(bgIdx); | ||||
| 	const auto y = static_cast<unsigned>(row); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user