From 5154fea17a9d4ca19ead74bf9c3207ca7867b4a2 Mon Sep 17 00:00:00 2001 From: rexim Date: Sat, 22 May 2021 18:36:09 +0700 Subject: [PATCH 1/5] Introduce Font entity --- assets/textures/charmap-cellphone_white.png | Bin 0 -> 1103 bytes src/something.cpp | 1 + src/something_atlas.cpp | 2 +- src/something_font.cpp | 9 +++++++++ src/something_font.hpp | 12 ++++++++++++ src/something_game.cpp | 2 ++ src/something_game.hpp | 4 +++- src/something_texture.cpp | 4 +++- src/something_texture.hpp | 2 +- 9 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 assets/textures/charmap-cellphone_white.png create mode 100644 src/something_font.cpp create mode 100644 src/something_font.hpp diff --git a/assets/textures/charmap-cellphone_white.png b/assets/textures/charmap-cellphone_white.png new file mode 100644 index 0000000000000000000000000000000000000000..ab252c4f653c364d583cb95a2e3d7b9c09d82064 GIT binary patch literal 1103 zcmV-V1hD&wP)(RCwC$T-$QQAP9}l{{Jth58Gy}+>U_RZI|=V=~!YA z1i6?VN8xR8p67X zE_>qpIcUC4A)s#oMTtvLGKfUmh2Ezd0kYqxnWgAx$=$mp8&rT4zkyLuq43$5kIFG- zFvCH5(vFn$44{5rqLc zFq#KQVH_?Rb62LPqcpmwh6wVxbYdgR?31J@$CGi<8QTveC!;ex(jZ}|#DKZ@HbCLQ z6d$;CkhOm+;CdO$G36{0NU>_B>?*qwDciA+E6MGWQG$`^mP}YWPPc>y*bb6tu5@p# zMB%7av>t!5)K>Aw13dZ96r%P86S z`@5i?lK4o9iQ5D|gT&IC#L7+uyd05^Ag;VsQ)64I|4;$({e_nemNKs`E=Wo}OphNF z6I+Hd9gE|2c+qJLrOZPZuVUR+h%6NT7R&|$+j}tw+3F+f(^mW1iKn;2o5lM)p+gwF z8!A=a@smvnEAPod?#W;t?%DA{FucPf7DTcvnN(qwx)g_8&NSzwi(-ozeM#0*!mSiZ z+?!pYT56INgUWVuM>0!cOfX@bbaPQsE0=s1Vq19DRw#UCBIX+pUQB!2<==yc<6tZo zwnYK@l_?~g!0&*tecB`M(yQK)Hj^ghvWYZ!{O(ADj~`}Fct?=OmJ{M#S(7Ebcl|1} z&TPm8+lM|)EBl6(wcFz>>8gGWLXWL86|nn*LP@OPg^W%2Hl!K>z3r+cVsTf4Txd+$ zZt-Y`O)brwOG!fUZ>K8}D-_~+3iz)!3JFor(j9`5rZW*szs{zlT?NJhrhjO%8dfTy zSXl<@f|fqh!2|rI4&tY~pjatlas = Atlas::from_config("./assets/textures/atlas.conf", 10); + this->font = Font::from_file("./assets/textures/charmap-cellphone_white.png"); + this->keyboard = SDL_GetKeyboardState(NULL); this->window = window; diff --git a/src/something_game.hpp b/src/something_game.hpp index d8c1d7e..1a71711 100644 --- a/src/something_game.hpp +++ b/src/something_game.hpp @@ -12,6 +12,7 @@ #include "./something_aabb_body.hpp" #include "./something_enemy.hpp" #include "./something_item.hpp" +#include "./something_font.hpp" struct Game { static const size_t AABB_BODIES_CAPACITY = 1024; @@ -23,8 +24,9 @@ struct Game { const Uint8 *keyboard; SDL_Window *window; - // Game Entities Atlas atlas; + Font font; + Player player; Camera camera; Tile_Grid tile_grid; diff --git a/src/something_texture.cpp b/src/something_texture.cpp index 4be77d0..a500d0e 100644 --- a/src/something_texture.cpp +++ b/src/something_texture.cpp @@ -206,10 +206,12 @@ void Texture::save_to_png_file(const char *file_path) } } -GL_Texture GL_Texture::from_texture(Texture texture) +GL_Texture GL_Texture::from_texture(Texture texture, GLenum unit) { GL_Texture result = {}; + glActiveTexture(unit); + glGenTextures(1, &result.id); glBindTexture(GL_TEXTURE_2D, result.id); diff --git a/src/something_texture.hpp b/src/something_texture.hpp index 838645a..52c0a9d 100644 --- a/src/something_texture.hpp +++ b/src/something_texture.hpp @@ -30,7 +30,7 @@ struct Texture { struct GL_Texture { GLuint id; - static GL_Texture from_texture(Texture texture); + static GL_Texture from_texture(Texture texture, GLenum unit); }; #endif // SOMETHING_TEXTURE_HPP_ From 7bd4fb880f3c04a90538b6054782ecfc5b285aa7 Mon Sep 17 00:00:00 2001 From: rexim Date: Sat, 22 May 2021 18:41:37 +0700 Subject: [PATCH 2/5] Rename atlas -> image in shaders --- assets/shaders/hsl.frag | 4 ++-- assets/shaders/rect.frag | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/shaders/hsl.frag b/assets/shaders/hsl.frag index 403cdb1..079815f 100644 --- a/assets/shaders/hsl.frag +++ b/assets/shaders/hsl.frag @@ -2,7 +2,7 @@ precision mediump float; -uniform sampler2D atlas; +uniform sampler2D image; uniform float time; in vec4 color; @@ -15,5 +15,5 @@ vec3 hsl2rgb(vec3 c) { } void main() { - output_color = texture(atlas, uv) * vec4(hsl2rgb(vec3((time - uv.x - uv.y) * 0.5, 1.0, 0.80)), color.w); + output_color = texture(image, uv) * vec4(hsl2rgb(vec3((time - uv.x - uv.y) * 0.5, 1.0, 0.80)), color.w); } diff --git a/assets/shaders/rect.frag b/assets/shaders/rect.frag index 0798a79..ddb167c 100644 --- a/assets/shaders/rect.frag +++ b/assets/shaders/rect.frag @@ -2,7 +2,7 @@ precision mediump float; -uniform sampler2D atlas; +uniform sampler2D image; uniform float time; in vec4 color; @@ -10,5 +10,5 @@ in vec2 uv; out vec4 output_color; void main() { - output_color = texture(atlas, uv) * color; + output_color = texture(image, uv) * color; } From a304af4437036bae0991e5cf5bd6cd760e95a703 Mon Sep 17 00:00:00 2001 From: rexim Date: Sat, 22 May 2021 18:59:02 +0700 Subject: [PATCH 3/5] Reorganize the shaders --- .../gradient_circle.frag} | 3 +++ assets/shaders/{ => frag}/hsl.frag | 2 ++ .../{rect.frag => frag/texture_color.frag} | 4 ++- .../{rect.vert => vert/triangle_camera.vert} | 2 ++ src/something_program.cpp | 2 +- src/something_program.hpp | 2 +- src/something_renderer.cpp | 26 +++++++++---------- src/something_renderer.hpp | 6 ++--- 8 files changed, 28 insertions(+), 19 deletions(-) rename assets/shaders/{particle.frag => frag/gradient_circle.frag} (74%) rename assets/shaders/{ => frag}/hsl.frag (83%) rename assets/shaders/{rect.frag => frag/texture_color.frag} (56%) rename assets/shaders/{rect.vert => vert/triangle_camera.vert} (82%) diff --git a/assets/shaders/particle.frag b/assets/shaders/frag/gradient_circle.frag similarity index 74% rename from assets/shaders/particle.frag rename to assets/shaders/frag/gradient_circle.frag index 14b225d..b573965 100644 --- a/assets/shaders/particle.frag +++ b/assets/shaders/frag/gradient_circle.frag @@ -1,3 +1,6 @@ +// A fragment shader that generates a texture for a gradient circle +// with a given `color` + #version 330 core precision mediump float; diff --git a/assets/shaders/hsl.frag b/assets/shaders/frag/hsl.frag similarity index 83% rename from assets/shaders/hsl.frag rename to assets/shaders/frag/hsl.frag index 079815f..18091e1 100644 --- a/assets/shaders/hsl.frag +++ b/assets/shaders/frag/hsl.frag @@ -1,3 +1,5 @@ +// A fragment shader that generates a simple KappaPride animation +// based on `time`. #version 330 core precision mediump float; diff --git a/assets/shaders/rect.frag b/assets/shaders/frag/texture_color.frag similarity index 56% rename from assets/shaders/rect.frag rename to assets/shaders/frag/texture_color.frag index ddb167c..1b244c3 100644 --- a/assets/shaders/rect.frag +++ b/assets/shaders/frag/texture_color.frag @@ -1,9 +1,11 @@ +// A fragment shader that textures the fragment according to the +// provided `image` and `uv` coordinates and multiplies it by the +// `color` #version 330 core precision mediump float; uniform sampler2D image; -uniform float time; in vec4 color; in vec2 uv; diff --git a/assets/shaders/rect.vert b/assets/shaders/vert/triangle_camera.vert similarity index 82% rename from assets/shaders/rect.vert rename to assets/shaders/vert/triangle_camera.vert index b480712..6fac3be 100644 --- a/assets/shaders/rect.vert +++ b/assets/shaders/vert/triangle_camera.vert @@ -1,3 +1,5 @@ +// Vertex shader that renders a triangle with a particular `uv` +// coordinates and `color` with applied camera_projection #version 330 core precision mediump float; diff --git a/src/something_program.cpp b/src/something_program.cpp index d3a46d2..075b5f8 100644 --- a/src/something_program.cpp +++ b/src/something_program.cpp @@ -36,7 +36,7 @@ bool Program::relink(Renderer *renderer) glUseProgram(this->id); - u_atlas = glGetUniformLocation(this->id, "atlas"); + u_image = glGetUniformLocation(this->id, "image"); u_resolution = glGetUniformLocation(this->id, "resolution"); u_camera_position = glGetUniformLocation(this->id, "camera_position"); u_camera_zoom = glGetUniformLocation(this->id, "camera_zoom"); diff --git a/src/something_program.hpp b/src/something_program.hpp index fbe3a32..8ee7306 100644 --- a/src/something_program.hpp +++ b/src/something_program.hpp @@ -14,7 +14,7 @@ struct Program { Index vert_shader_index; Index frag_shader_index; - GLuint u_atlas; + GLuint u_image; GLuint u_resolution; GLuint u_time; GLuint u_camera_position; diff --git a/src/something_renderer.cpp b/src/something_renderer.cpp index 73fe23f..bf7b84f 100644 --- a/src/something_renderer.cpp +++ b/src/something_renderer.cpp @@ -4,22 +4,22 @@ void Renderer::init() { triangle_vao.init(); - shaders[PARTICLE_FRAG_SHADER_ASSET] = - Shader::make(GL_FRAGMENT_SHADER, "./assets/shaders/particle.frag"); - shaders[RECT_FRAG_SHADER_ASSET] = - Shader::make(GL_FRAGMENT_SHADER, "./assets/shaders/rect.frag"); - shaders[RECT_VERT_SHADER_ASSET] = - Shader::make(GL_VERTEX_SHADER, "./assets/shaders/rect.vert"); + shaders[GRADIENT_CIRCLE_FRAG_SHADER_ASSET] = + Shader::make(GL_FRAGMENT_SHADER, "./assets/shaders/frag/gradient_circle.frag"); + shaders[TEXTURE_COLOR_FRAG_SHADER_ASSET] = + Shader::make(GL_FRAGMENT_SHADER, "./assets/shaders/frag/texture_color.frag"); + shaders[TRIANGLE_CAMERA_VERT_SHADER_ASSET] = + Shader::make(GL_VERTEX_SHADER, "./assets/shaders/vert/triangle_camera.vert"); shaders[HSL_FRAG_SHADER_ASSET] = - Shader::make(GL_FRAGMENT_SHADER, "./assets/shaders/hsl.frag"); + Shader::make(GL_FRAGMENT_SHADER, "./assets/shaders/frag/hsl.frag"); static_assert(COUNT_SHADER_ASSETS == 4); programs[REGULAR_PROGRAM_ASSET] = - Program::make({RECT_VERT_SHADER_ASSET}, {RECT_FRAG_SHADER_ASSET}); + Program::make({TRIANGLE_CAMERA_VERT_SHADER_ASSET}, {TEXTURE_COLOR_FRAG_SHADER_ASSET}); programs[PARTICLE_PROGRAM_ASSET] = - Program::make({RECT_VERT_SHADER_ASSET}, {PARTICLE_FRAG_SHADER_ASSET}); + Program::make({TRIANGLE_CAMERA_VERT_SHADER_ASSET}, {GRADIENT_CIRCLE_FRAG_SHADER_ASSET}); programs[PRIDE_PROGRAM_ASSET] = - Program::make({RECT_VERT_SHADER_ASSET}, {HSL_FRAG_SHADER_ASSET}); + Program::make({TRIANGLE_CAMERA_VERT_SHADER_ASSET}, {HSL_FRAG_SHADER_ASSET}); static_assert(COUNT_PROGRAM_ASSETS == 3); } @@ -122,9 +122,9 @@ void Renderer::fill_circle(V2 center, GLfloat radius, RGBA color, Program_Asset program_asset) { fill_aabb(AABB(center - V2(radius), V2(radius) * 2.0f), - color, - AABB(V2(0.0f), V2(1.0f)), - program_asset); + color, + AABB(V2(0.0f), V2(1.0f)), + program_asset); } Shader &Renderer::get_shader(Index index) diff --git a/src/something_renderer.hpp b/src/something_renderer.hpp index 6613f3e..c34c28a 100644 --- a/src/something_renderer.hpp +++ b/src/something_renderer.hpp @@ -7,9 +7,9 @@ struct Game; enum Shader_Asset: size_t { - PARTICLE_FRAG_SHADER_ASSET = 0, - RECT_FRAG_SHADER_ASSET, - RECT_VERT_SHADER_ASSET, + GRADIENT_CIRCLE_FRAG_SHADER_ASSET = 0, + TEXTURE_COLOR_FRAG_SHADER_ASSET, + TRIANGLE_CAMERA_VERT_SHADER_ASSET, HSL_FRAG_SHADER_ASSET, COUNT_SHADER_ASSETS, }; From b6f699857d50a034bd5bec73ce1d7e05c3289765 Mon Sep 17 00:00:00 2001 From: rexim Date: Sat, 22 May 2021 20:12:54 +0700 Subject: [PATCH 4/5] Implement Text Rendering inside of the world! --- assets/vars.conf | 2 ++ src/something_font.cpp | 54 +++++++++++++++++++++++++++++++++++--- src/something_font.hpp | 16 +++++++++-- src/something_game.cpp | 1 - src/something_math.hpp | 6 +++++ src/something_player.cpp | 2 +- src/something_program.cpp | 3 ++- src/something_program.hpp | 6 ++++- src/something_renderer.cpp | 6 +++-- src/something_renderer.hpp | 6 ++++- src/something_texture.cpp | 11 +++++--- src/something_texture.hpp | 2 +- 12 files changed, 98 insertions(+), 17 deletions(-) diff --git a/assets/vars.conf b/assets/vars.conf index 6906093..8e68c0a 100644 --- a/assets/vars.conf +++ b/assets/vars.conf @@ -1,3 +1,5 @@ +BACKGROUND_COLOR: color = 181830FF + HEALTH_BAR_WIDTH: float = 200.0 HEALTH_BAR_HEIGHT: float = 25.0 HEALTH_BAR_PADDING: float = 20.0 diff --git a/src/something_font.cpp b/src/something_font.cpp index 54acc1f..72a764c 100644 --- a/src/something_font.cpp +++ b/src/something_font.cpp @@ -2,8 +2,54 @@ Font Font::from_file(const char *file_path) { - Font result = {}; - result.texture = Texture::from_file(file_path); - result.gl_texture = GL_Texture::from_texture(result.texture, GL_TEXTURE0 + 1); - return result; + Font self = {}; + self.texture = Texture::from_file(file_path); + for (int y = 0; y < self.texture.height; ++y) { + for (int x = 0; x < self.texture.width; ++x) { + RGBA32 *pixel = &self.texture.pixels[y * self.texture.width + x]; + if (*pixel == 0xFF000000) { + *pixel = 0; + } + } + } + + self.gl_texture = GL_Texture::from_texture( + self.texture, + GL_TEXTURE0 + 1, + true); + self.tex_size_pix = V2(self.texture.width, self.texture.height).cast_to(); + const auto tex_size_cell = V2(COLS, ROWS); + self.char_size_pix = self.tex_size_pix / tex_size_cell; + self.char_size_uv = self.char_size_pix.cast_to() / self.tex_size_pix.cast_to(); + return self; +} + +AABB Font::char_uv(char c) const +{ + if (32 <= c && c <= 126) { + // TODO: Font::char_uv should be implementing entirely in a shader + const size_t char_index = c - 32; + const auto char_pos_cell = V2(char_index % COLS, char_index / COLS); + const auto char_pos_pix = char_pos_cell * char_size_pix; + const auto char_pos_uv = char_pos_pix.cast_to() / tex_size_pix.cast_to(); + + return AABB(char_pos_uv, char_size_uv).flip_vertically(); + } + + constexpr char INVALID = '?'; + static_assert(32 <= INVALID && INVALID <= 126); + return char_uv(INVALID); +} + +void Font::render_text(Renderer *renderer, const char *text, V2 position, GLfloat scale, RGBA color) const +{ + const size_t n = strlen(text); + for (size_t i = 0; i < n; ++i) { + renderer->fill_aabb( + AABB(position + (char_size_pix * V2(i, 0)).cast_to() * scale, + char_size_pix.cast_to() * scale), + color, + char_uv(text[i]), + FONT_PROGRAM_ASSET); + } } diff --git a/src/something_font.hpp b/src/something_font.hpp index 8a94ea7..ccccf6d 100644 --- a/src/something_font.hpp +++ b/src/something_font.hpp @@ -1,12 +1,24 @@ #ifndef SOMETHING_FONT_HPP_ #define SOMETHING_FONT_HPP_ -struct Font -{ +struct Font { + constexpr static size_t ROWS = 7; + constexpr static size_t COLS = 18; + Texture texture; GL_Texture gl_texture; + V2 tex_size_pix; + V2 char_size_pix; + V2 char_size_uv; static Font from_file(const char *file_path); + AABB char_uv(char c) const; + + void render_text(Renderer *renderer, + const char *text, + V2 position, + GLfloat scale, + RGBA color) const; }; #endif // SOMETHING_FONT_HPP_ diff --git a/src/something_game.cpp b/src/something_game.cpp index 5c7955e..40ab490 100644 --- a/src/something_game.cpp +++ b/src/something_game.cpp @@ -1,6 +1,5 @@ #include "./something_game.hpp" -const RGBA BACKGROUND_COLOR = RGBA::from_abgr32(0x181818FF); const RGBA FAILED_BACKGROUND_COLOR = RGBA::from_abgr32(0xAA1818FF); void Game::init(SDL_Window *window) diff --git a/src/something_math.hpp b/src/something_math.hpp index 43af7dd..0780132 100644 --- a/src/something_math.hpp +++ b/src/something_math.hpp @@ -125,6 +125,12 @@ V2 operator/(T s, V2 a) return V2(a.x / s, a.y / s); } +template +V2 operator/(V2 a, V2 b) +{ + return V2(a.x / b.x, a.y / b.y); +} + template void print1(FILE *stream, V2 v2) { diff --git a/src/something_player.cpp b/src/something_player.cpp index 98c3318..205d943 100644 --- a/src/something_player.cpp +++ b/src/something_player.cpp @@ -32,7 +32,7 @@ void Player::render(const Game *game, Renderer *renderer) const } const auto player_hitbox = aabb_stretch(body.hitbox, stretch); - renderer->fill_aabb(player_hitbox, RGBA(1.0f), uv, PRIDE_PROGRAM_ASSET); + renderer->fill_aabb(player_hitbox, RGBA(1.0f), uv, REGULAR_PROGRAM_ASSET); } // Player gun diff --git a/src/something_program.cpp b/src/something_program.cpp index 075b5f8..d889abe 100644 --- a/src/something_program.cpp +++ b/src/something_program.cpp @@ -57,5 +57,6 @@ void Program::sync_uniforms(const Game *game) glUniform2f(u_camera_position, game->camera.pos.x, game->camera.pos.y); glUniform1f(u_camera_zoom, game->camera.zoom); glUniform1f(u_time, game->time()); - glUniform1f(u_time, game->time()); + glUniform1i(u_image, image_unit); } + diff --git a/src/something_program.hpp b/src/something_program.hpp index 8ee7306..9f65797 100644 --- a/src/something_program.hpp +++ b/src/something_program.hpp @@ -20,12 +20,16 @@ struct Program { GLuint u_camera_position; GLuint u_camera_zoom; + int image_unit; + constexpr static Program make(Index vert_shader_index, - Index frag_shader_index) + Index frag_shader_index, + int image_unit = 0) { Program self = {}; self.vert_shader_index = vert_shader_index; self.frag_shader_index = frag_shader_index; + self.image_unit = image_unit; return self; } diff --git a/src/something_renderer.cpp b/src/something_renderer.cpp index bf7b84f..dd489cf 100644 --- a/src/something_renderer.cpp +++ b/src/something_renderer.cpp @@ -12,7 +12,7 @@ void Renderer::init() Shader::make(GL_VERTEX_SHADER, "./assets/shaders/vert/triangle_camera.vert"); shaders[HSL_FRAG_SHADER_ASSET] = Shader::make(GL_FRAGMENT_SHADER, "./assets/shaders/frag/hsl.frag"); - static_assert(COUNT_SHADER_ASSETS == 4); + static_assert(COUNT_SHADER_ASSETS == 4, "The amount of shader assets have changed"); programs[REGULAR_PROGRAM_ASSET] = Program::make({TRIANGLE_CAMERA_VERT_SHADER_ASSET}, {TEXTURE_COLOR_FRAG_SHADER_ASSET}); @@ -20,7 +20,9 @@ void Renderer::init() Program::make({TRIANGLE_CAMERA_VERT_SHADER_ASSET}, {GRADIENT_CIRCLE_FRAG_SHADER_ASSET}); programs[PRIDE_PROGRAM_ASSET] = Program::make({TRIANGLE_CAMERA_VERT_SHADER_ASSET}, {HSL_FRAG_SHADER_ASSET}); - static_assert(COUNT_PROGRAM_ASSETS == 3); + programs[FONT_PROGRAM_ASSET] = + Program::make({TRIANGLE_CAMERA_VERT_SHADER_ASSET}, {TEXTURE_COLOR_FRAG_SHADER_ASSET}, 1); + static_assert(COUNT_PROGRAM_ASSETS == 4, "The amount of program assets have changed"); } void Renderer::clear() diff --git a/src/something_renderer.hpp b/src/something_renderer.hpp index c34c28a..966c34b 100644 --- a/src/something_renderer.hpp +++ b/src/something_renderer.hpp @@ -18,6 +18,7 @@ enum Program_Asset: size_t { REGULAR_PROGRAM_ASSET = 0, PARTICLE_PROGRAM_ASSET, PRIDE_PROGRAM_ASSET, + FONT_PROGRAM_ASSET, COUNT_PROGRAM_ASSETS }; @@ -55,7 +56,10 @@ struct Renderer { Program_Asset program_asset); void fill_aabb(AABB aabb, RGBA shade, AABB uv_aabb, Program_Asset program_asset); - void fill_circle(V2 center, GLfloat radius, RGBA rgba, Program_Asset program_asset); + void fill_circle(V2 center, + GLfloat radius, + RGBA rgba, + Program_Asset program_asset); }; #endif // SOMETHING_RENDERER_HPP_ diff --git a/src/something_texture.cpp b/src/something_texture.cpp index a500d0e..e3b5d71 100644 --- a/src/something_texture.cpp +++ b/src/something_texture.cpp @@ -206,7 +206,7 @@ void Texture::save_to_png_file(const char *file_path) } } -GL_Texture GL_Texture::from_texture(Texture texture, GLenum unit) +GL_Texture GL_Texture::from_texture(Texture texture, GLenum unit, bool nearest) { GL_Texture result = {}; @@ -215,8 +215,13 @@ GL_Texture GL_Texture::from_texture(Texture texture, GLenum unit) glGenTextures(1, &result.id); glBindTexture(GL_TEXTURE_2D, result.id); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + if (nearest) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR); + } else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); diff --git a/src/something_texture.hpp b/src/something_texture.hpp index 52c0a9d..9dca434 100644 --- a/src/something_texture.hpp +++ b/src/something_texture.hpp @@ -30,7 +30,7 @@ struct Texture { struct GL_Texture { GLuint id; - static GL_Texture from_texture(Texture texture, GLenum unit); + static GL_Texture from_texture(Texture texture, GLenum unit, bool nearest = false); }; #endif // SOMETHING_TEXTURE_HPP_ From 13e4deca76b7e3fb780ae53ff4a941cf721179b7 Mon Sep 17 00:00:00 2001 From: rexim Date: Sat, 22 May 2021 20:30:57 +0700 Subject: [PATCH 5/5] Add TODO(#89) --- src/something_font.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/something_font.cpp b/src/something_font.cpp index 72a764c..ccea35f 100644 --- a/src/something_font.cpp +++ b/src/something_font.cpp @@ -27,7 +27,7 @@ Font Font::from_file(const char *file_path) AABB Font::char_uv(char c) const { if (32 <= c && c <= 126) { - // TODO: Font::char_uv should be implementing entirely in a shader + // TODO(#89): Font::char_uv should be implementing entirely in a shader const size_t char_index = c - 32; const auto char_pos_cell = V2(char_index % COLS, char_index / COLS); const auto char_pos_pix = char_pos_cell * char_size_pix;