Working with tilesets, about to do UV wrapping.

This commit is contained in:
2025-03-05 07:14:56 -06:00
parent 04eb4736d8
commit 40c97d6eb7
17 changed files with 303 additions and 5 deletions

View File

@ -9,4 +9,5 @@ target_sources(${DUSK_TARGET_NAME}
transforms.c
entities.c
mapshaderdata.c
tilesetshaderdata.c
)

View File

@ -0,0 +1,50 @@
// Copyright (c) 2025 Dominic Masters
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
#include "../../../../dusk/display/tilesetdefs.h"
struct Tileset {
int columns;
int rows;
int width;
int height;
};
layout(std140) uniform b_Tilesets {
Tileset tilesets[TILESET_SLOT_COUNT];
};
uniform sampler2D u_TilesetTextures[TILESET_SLOT_COUNT];
vec4 tilesetGetUVs(int tilesetIndex, int col, int row) {
Tileset tileset = tilesets[tilesetIndex];
float segWidth = 1.0 / float(tileset.columns);
float segHeight = 1.0 / float(tileset.rows);
float x = float(col) * segWidth;
float y = float(row) * segHeight;
return vec4(x, y, x + segWidth, y + segHeight);
}
vec4 tilesetGetUVsByIndex(int tilesetIndex, int index) {
Tileset tileset = tilesets[tilesetIndex];
int col = index % tileset.columns;
int row = index / tileset.columns;
return tilesetGetUVs(tilesetIndex, col, row);
}
vec4 tilesetGetColor(int tilesetIndex, vec2 coord) {
switch(tilesetIndex) {
case 0:
return texture(u_TilesetTextures[0], coord);
case 1:
return texture(u_TilesetTextures[1], coord);
case 2:
return texture(u_TilesetTextures[2], coord);
case 3:
return texture(u_TilesetTextures[3], coord);
default:
return vec4(1, 1, 1, 1);
}
}

View File

@ -0,0 +1,40 @@
/**
* Copyright (c) 2025 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "tilesetshaderdata.h"
#include "assert/assert.h"
#include "util/memory.h"
shaderbuffer_t TILESET_SHADER_DATA_BUFFER;
tilesetshaderdata_t TILESET_SHADER_DATA_DATA;
void tilesetShaderDataInit() {
memoryZero(&TILESET_SHADER_DATA_DATA, sizeof(tilesetshaderdata_t));
shaderBufferInit(&TILESET_SHADER_DATA_BUFFER, sizeof(tilesetshaderdata_t));
}
void tilesetShaderDataUpdate() {
uint8_t i = 0;
do {
if(TILESET_SLOTS[i] == TILESET_NULL) continue;
tileset_t *tileset = &TILESETS[TILESET_SLOTS[i]];
texture_t *texture = &TILESET_GL_TEXTURES[TILESET_SLOTS[i]];
tilesetshaderdatatileset_t *dest = &TILESET_SHADER_DATA_DATA.tilesets[i];
dest->columns = tileset->columns;
dest->rows = tileset->rows;
dest->width = texture->width;
dest->height = texture->height;
} while(++i < TILESET_COUNT);
shaderBufferBind(&TILESET_SHADER_DATA_BUFFER);
shaderBufferSetData(&TILESET_SHADER_DATA_BUFFER, &TILESET_SHADER_DATA_DATA);
}
void tilesetShaderDataDispose() {
shaderBufferDispose(&TILESET_SHADER_DATA_BUFFER);
}

View File

@ -0,0 +1,42 @@
/**
* Copyright (c) 2025 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#pragma once
#include "display/shader/shaderbuffer.h"
#include "display/tilesetgl.h"
#define TILESET_BLOCK_NAME "b_Tileset"
#define TILESET_UNIFORM_TEXTURES_NAME "u_TilesetTextures"
typedef struct {
int32_t columns;
int32_t rows;
int32_t width;
int32_t height;
} tilesetshaderdatatileset_t;
typedef struct {
tilesetshaderdatatileset_t tilesets[TILESET_COUNT];
} tilesetshaderdata_t;
extern shaderbuffer_t TILESET_SHADER_DATA_BUFFER;
extern tilesetshaderdata_t TILESET_SHADER_DATA_DATA;
/**
* Initializes the tileset buffer and data.
*/
void tilesetShaderDataInit();
/**
* Updates the tileset buffer with the current data.
*/
void tilesetShaderDataUpdate();
/**
* Destroys the tileset buffer.
*/
void tilesetShaderDataDispose();

View File

@ -5,6 +5,7 @@
#include "../fragments/header.glsl"
#include "../data/entities.glsl"
#include "../data/tilesets.glsl"
// Inputs from vertex shader
in vec2 v_TextureCoord;
@ -13,5 +14,6 @@ in vec2 v_TextureCoord;
out vec4 FragColor;
void main() {
FragColor = vec4(1, 1, 1, 1);
vec4 tColor = tilesetGetColor(0, v_TextureCoord);
FragColor = vec4(1, 1, 1, 1) * tColor;
}

View File

@ -10,13 +10,15 @@
#include "display/shader/data/transforms.h"
#include "display/shader/data/entities.h"
#include "display/shader/data/mapshaderdata.h"
#include "display/shader/data/tilesetshaderdata.h"
#include "display/shader/entityshader/entityshader.h"
#include "display/shader/mapshader/mapshader.h"
shadermanagerdatacallback_t SHADER_MANAGER_DATA_CALLBACKS[] = {
{ transformsInit, transformsUpdate, transformsDispose },
{ entitiesInit, entitiesUpdate, entitiesDispose },
{ mapShaderDataInit, mapShaderDataUpdate, mapShaderDataDispose }
{ mapShaderDataInit, mapShaderDataUpdate, mapShaderDataDispose },
{ tilesetShaderDataInit, tilesetShaderDataUpdate, tilesetShaderDataDispose }
};