Batch Renderer 2/2

This commit is contained in:
Isuru Samarathunga
2025-11-02 04:14:47 +05:30
parent 0bffbbf66c
commit 9fafab5145
6 changed files with 49 additions and 21 deletions

View File

@ -10,7 +10,7 @@ layout(set = 2, binding = 0) uniform sampler2D texSampler;
void main()
{
outColor = inVertexColor;
outColor = texture(texSampler, inTexCoord);
if(outColor.w < 0.1)
discard;
}

View File

@ -29,6 +29,6 @@ void main()
{
SpriteInstanceData spriteData = sboSpriteData.data[gl_InstanceIndex];
gl_Position = uboPerScene.projection * uboPerFrame.view * spriteData.Transform * vec4(inPosition, 0.0f, 1.0f);
outTexCoord = inTexCoord;
outTexCoord = vec2(spriteData.TexCoords) + vec2(spriteData.TexCoords.z, spriteData.TexCoords.w) * inTexCoord;
outVertexColor = spriteData.Color;
}

File diff suppressed because one or more lines are too long

View File

@ -18,6 +18,8 @@
#include <IAEngine/LibInterface.hpp>
#include <Renderer.hpp>
#define STB_IMAGE_IMPLEMENTATION
#include <Vendor/stb/stb_image.h>
namespace ia::iae
{
@ -96,9 +98,25 @@ namespace ia::iae
namespace ia::iae
{
Handle CreateTexture(IN PCCHAR path, IN INT32 tileWidth = -1, IN INT32 tileHeight = -1)
{
INT32 w, h, n;
auto pixels = stbi_load(path, &w, &h, &n, STBI_rgb_alpha);
const auto t = Renderer::CreateTexture(pixels, w, h, tileWidth == -1 ? 1 : w/tileWidth, tileHeight == -1 ? 1 : h/tileHeight);
stbi_image_free(pixels);
return t;
}
Handle textures[5];
VOID IAEngine::Initialize()
{
Renderer::Initialize(IVec2{g_designViewport.x, g_designViewport.y});
textures[0] = CreateTexture("Resources/Cute_Fantasy_Free/Tiles/Beach_Tile.png", 16, 16);
textures[1] = CreateTexture("Resources/Cute_Fantasy_Free/Tiles/Cliff_Tile.png", 16, 16);
Renderer::SetTextureAtlas({textures[0], textures[1]});
}
VOID IAEngine::Terminate()
@ -108,6 +126,10 @@ namespace ia::iae
VOID IAEngine::Update()
{
Renderer::DrawStaticSpriteTopLeft(textures[1], 0, {0.0f, 0.0f}, {1.0f, 1.0f}, 0.0f);
Renderer::DrawStaticSpriteTopLeft(textures[1], 1, {16.0f, 0.0f}, {1.0f, 1.0f}, 0.0f);
Renderer::DrawStaticSpriteTopLeft(textures[1], 2, {32.0f, 0.0f}, {1.0f, 1.0f}, 0.0f);
Renderer::Update();
}

View File

@ -74,9 +74,10 @@ namespace ia::iae
SDL_GPUTransferBuffer *g_spriteDataStagingBuffer{};
SDL_GPUTexture *g_defaultTexture{};
SDL_GPUTexture *g_activeTextureAtlas{};
Map<Handle, Vec4> g_activeTextureAtlasUVMap;
Vec2 g_activeTextureAtlasInverseSize{};
SDL_GPUTexture *g_activeTextureAtlas{};
Map<Handle, Vec2> g_activeTextureAtlasUVMap;
EXTERN BOOL g_isDebugMode;
EXTERN Vec2 g_designViewport;
@ -104,8 +105,9 @@ namespace ia::iae
delete g_debugPipeline;
delete g_geometryPipeline;
if (g_defaultTexture)
DestroyTexture(g_defaultTexture);
for (SIZE_T i = 0; i < g_texureData.size(); i++)
DestroyTexture(i);
if (g_activeTextureAtlas && (g_activeTextureAtlas != g_defaultTexture))
DestroyTexture(g_activeTextureAtlas);
@ -125,8 +127,6 @@ namespace ia::iae
VOID Renderer::Update()
{
DrawStaticSpriteTopLeft(0, 0, {10.0f, 0.0f}, {100.0f, 100.0f}, 0.0f);
DrawStaticSpriteTopLeft(0, 0, {200.0f, 300.0f}, {100.0f, 100.0f}, 0.0f);
Render();
}
@ -209,7 +209,7 @@ namespace ia::iae
{
Mat4 transform = glm::translate(glm::mat4(1.0f), glm::vec3{position.x, position.y, 0});
transform = glm::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f));
transform = glm::scale(transform, glm::vec3{scale.x, scale.y, 1.0f});
transform = glm::scale(transform, glm::vec3{scale.x * g_texureData[texture].TileWidth, scale.y * g_texureData[texture].TileHeight, 1.0f});
g_staticSprites.pushBack({.Transform = transform,
.TexCoords = GetTextureAtlasCoordinates(texture, tileIndex),
.Color = {1.0f, 1.0f, 1.0f, 1.0f}});
@ -220,7 +220,7 @@ namespace ia::iae
{
Mat4 transform = glm::translate(glm::mat4(1.0f), glm::vec3{position.x, position.y, 0});
transform = glm::rotate(transform, rotation, glm::vec3(0.0f, 0.0f, 1.0f));
transform = glm::scale(transform, glm::vec3{scale.x, scale.y, 1.0f});
transform = glm::scale(transform, glm::vec3{scale.x * g_texureData[texture].TileWidth, scale.y * g_texureData[texture].TileHeight, 1.0f});
g_dynamicSprites.pushBack({.Transform = transform,
.TexCoords = GetTextureAtlasCoordinates(texture, tileIndex),
.Color = {1.0f, 1.0f, 1.0f, 1.0f}});
@ -286,10 +286,11 @@ namespace ia::iae
VOID Renderer::SetTextureAtlas(IN CONST Vector<Handle> textures)
{
g_activeTextureAtlasUVMap = Map<Handle, Vec4>();
if (g_activeTextureAtlas)
if (g_activeTextureAtlas && (g_activeTextureAtlas != g_defaultTexture))
DestroyTexture(g_activeTextureAtlas);
g_activeTextureAtlasUVMap = Map<Handle, Vec2>();
INT32 atlasWidth{0}, atlasHeight{0};
for (const auto &t : textures)
{
@ -299,6 +300,8 @@ namespace ia::iae
atlasHeight = d.Height;
}
g_activeTextureAtlasInverseSize = {1.0f / ((FLOAT32) atlasWidth), 1.0f / ((FLOAT32) atlasHeight)};
const auto pixels = new UINT8[atlasWidth * atlasHeight * 4];
INT32 atlasCursor{0};
@ -306,10 +309,8 @@ namespace ia::iae
{
const auto &d = g_texureData[t];
for (INT32 y = 0; y < d.Height; y++)
ia_memcpy(&pixels[atlasCursor + (y * atlasWidth)], d.Pixels, d.Width * 4);
g_activeTextureAtlasUVMap[t] =
Vec4(((FLOAT32) atlasCursor) / ((FLOAT32) atlasWidth), 0.0f,
((FLOAT32) d.Width) / ((FLOAT32) atlasWidth), ((FLOAT32) d.Height) / ((FLOAT32) atlasHeight));
ia_memcpy(&pixels[(atlasCursor + (y * atlasWidth)) * 4], &d.Pixels[y * d.Width * 4], d.Width * 4);
g_activeTextureAtlasUVMap[t] = Vec2(((FLOAT32) atlasCursor) / ((FLOAT32) atlasWidth), 0.0f);
atlasCursor += d.Width;
}
@ -323,7 +324,12 @@ namespace ia::iae
{
const auto &d = g_texureData[texture];
const auto &t = g_activeTextureAtlasUVMap[texture];
return t;
const auto pX =
((INT32) (tileIndex % d.TileCountX) * ((FLOAT32) d.TileWidth)) * g_activeTextureAtlasInverseSize.x;
const auto pY =
((INT32) (tileIndex / d.TileCountX) * ((FLOAT32) d.TileHeight)) * g_activeTextureAtlasInverseSize.y;
return Vec4(t.x + pX, t.y + pY, d.TileWidth * g_activeTextureAtlasInverseSize.x,
d.TileHeight * g_activeTextureAtlasInverseSize.y);
}
} // namespace ia::iae

View File

@ -679,9 +679,9 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];
#endif
#ifndef STBI_MALLOC
#define STBI_MALLOC(sz) malloc(sz)
#define STBI_MALLOC(sz) ia_malloc(sz)
#define STBI_REALLOC(p,newsz) realloc(p,newsz)
#define STBI_FREE(p) free(p)
#define STBI_FREE(p) ia_free(p)
#endif
#ifndef STBI_REALLOC_SIZED