|
@@ -10,6 +10,9 @@
|
|
|
#define GL_GLEXT_PROTOTYPES
|
|
#define GL_GLEXT_PROTOTYPES
|
|
|
#include <SDL2/SDL_opengl.h>
|
|
#include <SDL2/SDL_opengl.h>
|
|
|
|
|
|
|
|
|
|
+#include <ft2build.h>
|
|
|
|
|
+#include FT_FREETYPE_H
|
|
|
|
|
+
|
|
|
#pragma GCC diagnostic push
|
|
#pragma GCC diagnostic push
|
|
|
#pragma GCC diagnostic ignored "-Wall"
|
|
#pragma GCC diagnostic ignored "-Wall"
|
|
|
#pragma GCC diagnostic ignored "-Wsign-conversion"
|
|
#pragma GCC diagnostic ignored "-Wsign-conversion"
|
|
@@ -33,8 +36,18 @@
|
|
|
#include "shader.h"
|
|
#include "shader.h"
|
|
|
#include "tile_glyph.h"
|
|
#include "tile_glyph.h"
|
|
|
#include "gl_util.h"
|
|
#include "gl_util.h"
|
|
|
|
|
+#include "free_glyph.h"
|
|
|
|
|
|
|
|
struct app handle_events(struct app app, int32_t resolution_uniform);
|
|
struct app handle_events(struct app app, int32_t resolution_uniform);
|
|
|
|
|
+struct tile_glyph_render render_buffer_into_tgr(struct tile_glyph_render tgr,
|
|
|
|
|
+ struct app app,
|
|
|
|
|
+ struct vec2 cpos);
|
|
|
|
|
+
|
|
|
|
|
+struct free_glyph_render render_buffer_into_fgr(struct free_glyph_render fgr,
|
|
|
|
|
+ struct app app,
|
|
|
|
|
+ struct vec2 cpos);
|
|
|
|
|
+
|
|
|
|
|
+FT_Library library;
|
|
|
|
|
|
|
|
int32_t
|
|
int32_t
|
|
|
main(int32_t argc, char **argv)
|
|
main(int32_t argc, char **argv)
|
|
@@ -46,6 +59,37 @@ main(int32_t argc, char **argv)
|
|
|
exit(EXIT_FAILURE);
|
|
exit(EXIT_FAILURE);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ const char *ffont_path = "./fonts/VictorMono-Regular.ttf";
|
|
|
|
|
+
|
|
|
|
|
+ {
|
|
|
|
|
+ FT_Error error = FT_Init_FreeType( &library );
|
|
|
|
|
+ if ( error ) {
|
|
|
|
|
+ fprintf(stderr,
|
|
|
|
|
+ "[ERROR] Failed to load FreeType2 library\n");
|
|
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ FT_Face face;
|
|
|
|
|
+ error = FT_New_Face(library, ffont_path, 0, &face);
|
|
|
|
|
+ if ( error == FT_Err_Unknown_File_Format ) {
|
|
|
|
|
+ fprintf(stderr, "[ERROR] Font %s has unknown format\n",
|
|
|
|
|
+ ffont_path);
|
|
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
|
|
+ } else if ( error ) {
|
|
|
|
|
+ fprintf(stderr, "[ERROR] Failed to load font: %s\n",
|
|
|
|
|
+ ffont_path);
|
|
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ FT_UInt pixel_size = 64;
|
|
|
|
|
+ error = FT_Set_Pixel_Sizes(face, 0, pixel_size);
|
|
|
|
|
+ if ( error ) {
|
|
|
|
|
+ fprintf(stderr, "[ERROR] Failed to set font size: %u\n",
|
|
|
|
|
+ pixel_size);
|
|
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
struct app app = app_create("ged");
|
|
struct app app = app_create("ged");
|
|
|
const char *font_path = "./fonts/charmap-oldschool_white.png";
|
|
const char *font_path = "./fonts/charmap-oldschool_white.png";
|
|
|
app.font = font_create(app.rdr, font_path, 7, 18);
|
|
app.font = font_create(app.rdr, font_path, 7, 18);
|
|
@@ -59,10 +103,16 @@ main(int32_t argc, char **argv)
|
|
|
exit(EXIT_FAILURE);
|
|
exit(EXIT_FAILURE);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- struct tile_glyph_render tgr = tile_glyph_render_create(
|
|
|
|
|
- font_path,
|
|
|
|
|
- "./shaders/tile_font.vert",
|
|
|
|
|
- "./shaders/tile_font.frag");
|
|
|
|
|
|
|
+ /* struct tile_glyph_render tgr = tile_glyph_render_create( */
|
|
|
|
|
+ /* font_path, */
|
|
|
|
|
+ /* "./shaders/tile_font.vert", */
|
|
|
|
|
+ /* "./shaders/tile_font.frag"); */
|
|
|
|
|
+ struct free_glyph_render fgr = free_glyph_render_create(
|
|
|
|
|
+ ffont_path,
|
|
|
|
|
+ "./shaders/free_font.vert",
|
|
|
|
|
+ "./shaders/free_font.frag");
|
|
|
|
|
+
|
|
|
|
|
+ struct vec2 cpos; /* camera pos */
|
|
|
|
|
|
|
|
double dt = (1.0 / (double)app.target_fps) * 3;
|
|
double dt = (1.0 / (double)app.target_fps) * 3;
|
|
|
uint32_t frame_target_dur = (uint32_t)(1000 / app.target_fps);
|
|
uint32_t frame_target_dur = (uint32_t)(1000 / app.target_fps);
|
|
@@ -76,10 +126,9 @@ main(int32_t argc, char **argv)
|
|
|
|
|
|
|
|
while ( app.running ) {
|
|
while ( app.running ) {
|
|
|
fr_start = SDL_GetTicks();
|
|
fr_start = SDL_GetTicks();
|
|
|
- glUniform1f(tgr.uniforms.scale,(float) app.font.scale);
|
|
|
|
|
|
|
|
|
|
- struct buffer *buf = &app.buf;
|
|
|
|
|
- app = handle_events(app, tgr.uniforms.resolution);
|
|
|
|
|
|
|
+ /* app = handle_events(app, tgr.uniforms.resolution); */
|
|
|
|
|
+ app = handle_events(app, -1);
|
|
|
|
|
|
|
|
if ( app.show_fps == true ) {
|
|
if ( app.show_fps == true ) {
|
|
|
fps_text_size = (size_t) snprintf(fps_text, 128,
|
|
fps_text_size = (size_t) snprintf(fps_text, 128,
|
|
@@ -93,49 +142,15 @@ main(int32_t argc, char **argv)
|
|
|
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
|
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
|
|
|
|
- /* Calc Camera */
|
|
|
|
|
- {
|
|
|
|
|
- struct vec2 cpos;
|
|
|
|
|
- RET_UNWRAP2(app, cpos,
|
|
|
|
|
- struct ret_app_vec2,
|
|
|
|
|
- app_calc_buffer_cam(app, dt));
|
|
|
|
|
- glUniform2f(tgr.uniforms.camera,
|
|
|
|
|
- (float)cpos.x,
|
|
|
|
|
- (float)cpos.y);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- tgr.glyphs.size = 0;
|
|
|
|
|
- tgr = tile_glyph_render_calc_buffer(tgr, app.buf, vec2is(0));
|
|
|
|
|
- tile_glyph_render_sync(tgr);
|
|
|
|
|
- glDrawArraysInstanced(GL_TRIANGLE_STRIP,
|
|
|
|
|
- 0, 4,
|
|
|
|
|
- (int32_t) tgr.glyphs.size);
|
|
|
|
|
|
|
+ RET_UNWRAP2(app, cpos,
|
|
|
|
|
+ struct ret_app_vec2,
|
|
|
|
|
+ app_calc_buffer_cam(app, dt));
|
|
|
|
|
|
|
|
- {
|
|
|
|
|
- size_t col = 0;
|
|
|
|
|
- size_t row = 0;
|
|
|
|
|
- RET_UNWRAP2(col, row,
|
|
|
|
|
- struct ret_size_t_size_t,
|
|
|
|
|
- buffer_calc_cur_pos(app.buf));
|
|
|
|
|
-
|
|
|
|
|
- const char *c = buf->data.items + buf->cur;
|
|
|
|
|
- tgr.glyphs.size = 0;
|
|
|
|
|
- tgr = tile_glyph_render_calc(tgr,
|
|
|
|
|
- ( *c == '\n' ) ? " " : c, 1,
|
|
|
|
|
- vec2i((int32_t)col,
|
|
|
|
|
- -(int32_t)row),
|
|
|
|
|
- vec4fs(0), vec4fs(1));
|
|
|
|
|
- tile_glyph_render_sync(tgr);
|
|
|
|
|
- glDrawArraysInstanced(GL_TRIANGLE_STRIP,
|
|
|
|
|
- 0, 4,
|
|
|
|
|
- (int32_t) tgr.glyphs.size);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ /* tgr = render_buffer_into_tgr(tgr, app, cpos); */
|
|
|
|
|
+ fgr = render_buffer_into_fgr(fgr, app, cpos);
|
|
|
|
|
|
|
|
SDL_GL_SwapWindow(app.win.ptr);
|
|
SDL_GL_SwapWindow(app.win.ptr);
|
|
|
|
|
|
|
|
- glUniform1f(tgr.uniforms.time,
|
|
|
|
|
- (float) (SDL_GetTicks() / 1000));
|
|
|
|
|
-
|
|
|
|
|
fr_end = SDL_GetTicks();
|
|
fr_end = SDL_GetTicks();
|
|
|
fr_dur = (fr_end - fr_start);
|
|
fr_dur = (fr_end - fr_start);
|
|
|
if ( fr_dur < frame_target_dur ) {
|
|
if ( fr_dur < frame_target_dur ) {
|
|
@@ -200,3 +215,51 @@ handle_events(struct app app, int32_t resolution_uniform)
|
|
|
|
|
|
|
|
return app;
|
|
return app;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+struct tile_glyph_render
|
|
|
|
|
+render_buffer_into_tgr(struct tile_glyph_render tgr, struct app app,
|
|
|
|
|
+ struct vec2 cpos)
|
|
|
|
|
+{
|
|
|
|
|
+ glUniform1f(tgr.uniforms.scale,(float) app.font.scale);
|
|
|
|
|
+ glUniform2f(tgr.uniforms.camera,
|
|
|
|
|
+ (float)cpos.x,
|
|
|
|
|
+ (float)cpos.y);
|
|
|
|
|
+
|
|
|
|
|
+ tgr.glyphs.size = 0;
|
|
|
|
|
+ tgr = tile_glyph_render_calc_buffer(tgr, app.buf, vec2is(0));
|
|
|
|
|
+ tile_glyph_render_sync(tgr);
|
|
|
|
|
+ glDrawArraysInstanced(GL_TRIANGLE_STRIP,
|
|
|
|
|
+ 0, 4,
|
|
|
|
|
+ (int32_t) tgr.glyphs.size);
|
|
|
|
|
+
|
|
|
|
|
+ {
|
|
|
|
|
+ size_t col = 0;
|
|
|
|
|
+ size_t row = 0;
|
|
|
|
|
+ RET_UNWRAP2(col, row,
|
|
|
|
|
+ struct ret_size_t_size_t,
|
|
|
|
|
+ buffer_calc_cur_pos(app.buf));
|
|
|
|
|
+
|
|
|
|
|
+ const char *c = app.buf.data.items + app.buf.cur;
|
|
|
|
|
+ tgr.glyphs.size = 0;
|
|
|
|
|
+ tgr = tile_glyph_render_calc(tgr,
|
|
|
|
|
+ ( *c == '\n' ) ? " " : c, 1,
|
|
|
|
|
+ vec2i((int32_t)col,
|
|
|
|
|
+ -(int32_t)row),
|
|
|
|
|
+ vec4fs(0), vec4fs(1));
|
|
|
|
|
+ tile_glyph_render_sync(tgr);
|
|
|
|
|
+ glDrawArraysInstanced(GL_TRIANGLE_STRIP,
|
|
|
|
|
+ 0, 4,
|
|
|
|
|
+ (int32_t) tgr.glyphs.size);
|
|
|
|
|
+ }
|
|
|
|
|
+ glUniform1f(tgr.uniforms.time,
|
|
|
|
|
+ (float) (SDL_GetTicks() / 1000));
|
|
|
|
|
+ return tgr;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+struct free_glyph_render
|
|
|
|
|
+render_buffer_into_fgr(struct free_glyph_render fgr, struct app app,
|
|
|
|
|
+ struct vec2 cpos)
|
|
|
|
|
+{
|
|
|
|
|
+ (void) fgr; (void) app; (void) cpos;
|
|
|
|
|
+ return fgr;
|
|
|
|
|
+}
|