Working with tilesets, about to do UV wrapping.
This commit is contained in:
@ -9,4 +9,5 @@ target_sources(${DUSK_TARGET_NAME}
|
||||
transforms.c
|
||||
entities.c
|
||||
mapshaderdata.c
|
||||
tilesetshaderdata.c
|
||||
)
|
50
src/duskgl/display/shader/data/tilesets.glsl
Normal file
50
src/duskgl/display/shader/data/tilesets.glsl
Normal 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);
|
||||
}
|
||||
}
|
40
src/duskgl/display/shader/data/tilesetshaderdata.c
Normal file
40
src/duskgl/display/shader/data/tilesetshaderdata.c
Normal 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);
|
||||
}
|
42
src/duskgl/display/shader/data/tilesetshaderdata.h
Normal file
42
src/duskgl/display/shader/data/tilesetshaderdata.h
Normal 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();
|
@ -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;
|
||||
}
|
||||
|
@ -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 }
|
||||
};
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user