Basic texturing support

This commit is contained in:
Phireh 2025-05-31 12:58:20 +02:00
commit c9b454058a
3 changed files with 51 additions and 18 deletions

View file

@ -86,6 +86,12 @@ struct charglyph_t {
uint32_t advance; // offset to next glyph
};
struct texture_t {
GLuint gl_id; // OpenGL GLuint ID
uint32_t w;
uint32_t h;
};
struct hex_t {
int32_t id;
glm::vec3 position;
@ -96,6 +102,7 @@ struct hex_t {
uint32_t vao;
uint32_t vbo;
uint32_t ebo;
texture_t *tex;
};
struct grid_t {
@ -114,12 +121,6 @@ struct selection_t {
int32_t nselected;
};
struct texture_t {
uint32_t gl_id; // OpenGL GLuint ID
uint32_t w;
uint32_t h;
};
struct input_t {
uint8_t keys[GLFW_KEY_LAST];
};
@ -135,6 +136,8 @@ glm::mat4 transforms[ARRAY_LIMIT];
int32_t letter_map[ARRAY_LIMIT];
int32_t text_frame_idx;
texture_t pngtex = {};
uint8_t white_data[] = { 255, 255, 255, 255 };
texture_t default_tex = {};
camera_t the_camera = {};
bool dirty_window = true;
@ -164,19 +167,25 @@ bool is_selected(int idx, selection_t *sel)
return false;
}
void select(int idx, selection_t *sel)
void select(int idx, selection_t *sel, grid_t *grid)
{
// NOTE: temp code
if (!is_selected(idx, sel))
{
sel->indices[sel->nselected++] = idx;
if (pngtex.gl_id)
grid->hexes[idx].tex = &pngtex;
}
}
void deselect(int idx, selection_t *sel)
void deselect(int idx, selection_t *sel, grid_t *grid)
{
for (int i = 0; i < sel->nselected; ++i)
if (sel->indices[i] == idx)
{
sel->indices[i] = -1;
--sel->nselected;
grid->hexes[idx].tex = &default_tex;
}
}
@ -202,6 +211,7 @@ int path_callback([[maybe_unused]]ImGuiInputTextCallbackData *data)
return 0;
}
// TODO: Make this function less complicated
void ogl_debugcb(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, GLchar const* message, void const* user_param)
{
auto const src_str = [source]() {
@ -506,13 +516,15 @@ void create_grid(grid_t *grid, int rows, int columns)
the_hexagon->vertices[6] = the_hexagon->position + glm::vec3(-radius * glm::cos(glm::radians(60.0)), -radius * glm::sin(glm::radians(60.0)), 0);
// default uv coordinates are a simple 1 unit-sized hexagon mask
the_hexagon->uvs[0] = glm::vec2(0, 0);
the_hexagon->uvs[1] = glm::vec2(-radius, 0);
the_hexagon->uvs[2] = glm::vec2(-radius * glm::cos(glm::radians(60.0)), radius * glm::sin(glm::radians(60.0)));
the_hexagon->uvs[3] = glm::vec2(radius * glm::cos(glm::radians(60.0)), radius * glm::sin(glm::radians(60.0)));
the_hexagon->uvs[4] = glm::vec2(radius, 0);
the_hexagon->uvs[5] = glm::vec2(radius * glm::cos(glm::radians(60.0)), -radius * glm::sin(glm::radians(60.0)));
the_hexagon->uvs[6] = glm::vec2(-radius * glm::cos(glm::radians(60.0)), -radius * glm::sin(glm::radians(60.0)));
the_hexagon->uvs[0] = glm::vec2(0.5, 0.5);
the_hexagon->uvs[1] = glm::vec2(0, 0.5);
the_hexagon->uvs[2] = glm::vec2(0.5 - glm::cos(glm::radians(60.0))/2.0, 0.5 + glm::sin(glm::radians(60.0))/2.0);
the_hexagon->uvs[3] = glm::vec2(0.5 + glm::cos(glm::radians(60.0))/2.0, 0.5 + glm::sin(glm::radians(60.0))/2.0);
the_hexagon->uvs[4] = glm::vec2(1, 0.5);
the_hexagon->uvs[5] = glm::vec2(0.5 + glm::cos(glm::radians(60.0))/2.0, 0.5 - glm::sin(glm::radians(60.0))/2.0);
the_hexagon->uvs[6] = glm::vec2(0.5 - glm::cos(glm::radians(60.0))/2.0, 0.5 - glm::sin(glm::radians(60.0))/2.0);
the_hexagon->tex = &default_tex;
// copy verts + uvs to a temp ordered buffer before sending to GPU
float databuf[7 * 3 + 7 * 2];
@ -685,6 +697,17 @@ int main([[maybe_unused]]int argc, [[maybe_unused]]char **argv)
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
// white default texture creation
default_tex.w = 1;
default_tex.h = 1;
glGenTextures(1, &default_tex.gl_id);
glBindTexture(GL_TEXTURE_2D, default_tex.gl_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, default_tex.w, default_tex.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, white_data);
static grid_t grid = {};
create_grid(&grid, 10, 10);
@ -857,11 +880,11 @@ int main([[maybe_unused]]int argc, [[maybe_unused]]char **argv)
hovered_hex = i * grid.columns + j;
if (mouse_pressed)
{
select(idx, &selection);
select(idx, &selection, &grid);
}
else if (right_mouse_pressed)
{
deselect(idx, &selection);
deselect(idx, &selection, &grid);
}
if (!is_selected(idx, &selection))
glUniform4f(glGetUniformLocation(hex_program, "hex_color"), 1.0f, 0.0f, 0.0f, 1.0f); // red
@ -879,10 +902,15 @@ int main([[maybe_unused]]int argc, [[maybe_unused]]char **argv)
glUniform4f(glGetUniformLocation(hex_program, "hex_color"), grid.hexes[idx].color.x, grid.hexes[idx].color.y, grid.hexes[idx].color.z, grid.hexes[idx].color.w);
}
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, grid.hexes[idx].tex->gl_id);
glUniform1i(glGetUniformLocation(hex_program, "tex"), 0);
glBindVertexArray(grid.hexes[idx].vao);
glBindBuffer(GL_ARRAY_BUFFER, grid.hexes[idx].vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, grid.hexes[idx].ebo);
glEnable(GL_CULL_FACE);
glDrawElements(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_INT, 0);
glDisable(GL_CULL_FACE);
glBindVertexArray(0);