|
@@ -193,9 +193,6 @@ const char *editor_line_starts_with_one_of(Editor *e, size_t row, size_t col, co
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
void editor_render(SDL_Window *window, Free_Glyph_Atlas *atlas, Simple_Renderer *sr, Editor *editor)
|
|
|
{
|
|
|
int w, h;
|
|
@@ -206,8 +203,7 @@ void editor_render(SDL_Window *window, Free_Glyph_Atlas *atlas, Simple_Renderer
|
|
|
sr->resolution = vec2f(w, h);
|
|
|
sr->time = (float) SDL_GetTicks() / 1000.0f;
|
|
|
|
|
|
- // Render text
|
|
|
-#if 1
|
|
|
+ // Render selection
|
|
|
{
|
|
|
simple_renderer_set_shader(sr, SHADER_FOR_COLOR);
|
|
|
if (editor->selection) {
|
|
@@ -245,98 +241,37 @@ void editor_render(SDL_Window *window, Free_Glyph_Atlas *atlas, Simple_Renderer
|
|
|
}
|
|
|
}
|
|
|
simple_renderer_flush(sr);
|
|
|
+ }
|
|
|
|
|
|
+ // Render text
|
|
|
+ {
|
|
|
simple_renderer_set_shader(sr, SHADER_FOR_TEXT);
|
|
|
for (size_t i = 0; i < editor->tokens.count; ++i) {
|
|
|
Token token = editor->tokens.items[i];
|
|
|
Vec2f pos = token.position;
|
|
|
Vec4f color = vec4fs(1);
|
|
|
switch (token.kind) {
|
|
|
- case TOKEN_PREPROC: color = hex_to_vec4f(0x95A99FFF); break;
|
|
|
- case TOKEN_KEYWORD: color = hex_to_vec4f(0xFFDD33FF); break;
|
|
|
- case TOKEN_COMMENT: color = hex_to_vec4f(0xCC8C3CFF); break;
|
|
|
- case TOKEN_STRING: color = hex_to_vec4f(0x73c936ff); break;
|
|
|
- default: {}
|
|
|
+ case TOKEN_PREPROC:
|
|
|
+ color = hex_to_vec4f(0x95A99FFF);
|
|
|
+ break;
|
|
|
+ case TOKEN_KEYWORD:
|
|
|
+ color = hex_to_vec4f(0xFFDD33FF);
|
|
|
+ break;
|
|
|
+ case TOKEN_COMMENT:
|
|
|
+ color = hex_to_vec4f(0xCC8C3CFF);
|
|
|
+ break;
|
|
|
+ case TOKEN_STRING:
|
|
|
+ color = hex_to_vec4f(0x73c936ff);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ {}
|
|
|
}
|
|
|
free_glyph_atlas_render_line_sized(atlas, sr, token.text, token.text_len, &pos, color);
|
|
|
- }
|
|
|
- simple_renderer_flush(sr);
|
|
|
- }
|
|
|
-#else
|
|
|
- {
|
|
|
- simple_renderer_set_shader(sr, SHADER_FOR_COLOR);
|
|
|
- if (editor->selection) {
|
|
|
- for (size_t row = 0; row < editor->lines.count; ++row) {
|
|
|
- size_t select_begin_chr = editor->select_begin;
|
|
|
- size_t select_end_chr = editor->cursor;
|
|
|
- if (select_begin_chr > select_end_chr) {
|
|
|
- SWAP(size_t, select_begin_chr, select_end_chr);
|
|
|
- }
|
|
|
-
|
|
|
- Line line_chr = editor->lines.items[row];
|
|
|
-
|
|
|
- if (select_begin_chr < line_chr.begin) {
|
|
|
- select_begin_chr = line_chr.begin;
|
|
|
- }
|
|
|
-
|
|
|
- if (select_end_chr > line_chr.end) {
|
|
|
- select_end_chr = line_chr.end;
|
|
|
- }
|
|
|
-
|
|
|
- if (select_begin_chr <= select_end_chr) {
|
|
|
- Vec2f select_begin_scr = vec2f(0, -(float)row * FREE_GLYPH_FONT_SIZE);
|
|
|
- free_glyph_atlas_measure_line_sized(
|
|
|
- atlas, editor->data.items + line_chr.begin, select_begin_chr - line_chr.begin,
|
|
|
- &select_begin_scr);
|
|
|
-
|
|
|
- Vec2f select_end_scr = select_begin_scr;
|
|
|
- free_glyph_atlas_measure_line_sized(
|
|
|
- atlas, editor->data.items + select_begin_chr, select_end_chr - select_begin_chr,
|
|
|
- &select_end_scr);
|
|
|
-
|
|
|
- Vec4f selection_color = vec4f(.25, .25, .25, 1);
|
|
|
- simple_renderer_solid_rect(sr, select_begin_scr, vec2f(select_end_scr.x - select_begin_scr.x, FREE_GLYPH_FONT_SIZE), selection_color);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- simple_renderer_flush(sr);
|
|
|
-
|
|
|
- simple_renderer_set_shader(sr, SHADER_FOR_TEXT);
|
|
|
- for (size_t row = 0; row < editor->lines.count; ++row) {
|
|
|
- Line line = editor->lines.items[row];
|
|
|
-
|
|
|
- const Vec2f begin = vec2f(0, -(float)row * FREE_GLYPH_FONT_SIZE);
|
|
|
- Vec2f end = begin;
|
|
|
-
|
|
|
- size_t col = 0;
|
|
|
- while (line.begin + col < line.end) {
|
|
|
- const char *keyword = editor_line_starts_with_one_of(editor, row, col, keywords, keywords_count);
|
|
|
- if (keyword != NULL) {
|
|
|
- size_t keyword_len = strlen(keyword);
|
|
|
- free_glyph_atlas_render_line_sized(
|
|
|
- atlas, sr, editor->data.items + line.begin + col, keyword_len,
|
|
|
- &end,
|
|
|
- vec4f(1, 1, 0, 1));
|
|
|
- col += keyword_len;
|
|
|
- } else {
|
|
|
- free_glyph_atlas_render_line_sized(
|
|
|
- atlas, sr, editor->data.items + line.begin + col, 1,
|
|
|
- &end,
|
|
|
- vec4fs(1));
|
|
|
- col += 1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
// TODO: the max_line_len should be calculated based on what's visible on the screen right now
|
|
|
- float line_len = fabsf(end.x - begin.x);
|
|
|
- if (line_len > max_line_len) {
|
|
|
- max_line_len = line_len;
|
|
|
- }
|
|
|
+ if (max_line_len < pos.x) max_line_len = pos.x;
|
|
|
}
|
|
|
-
|
|
|
simple_renderer_flush(sr);
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
Vec2f cursor_pos = vec2fs(0.0f);
|
|
|
{
|
|
@@ -374,7 +309,6 @@ void editor_render(SDL_Window *window, Free_Glyph_Atlas *atlas, Simple_Renderer
|
|
|
// Update camera
|
|
|
{
|
|
|
float target_scale = 3.0f;
|
|
|
- max_line_len = 1000.0f; // TODO: fix temporary epic zoom camera action
|
|
|
if (max_line_len > 1000.0f) {
|
|
|
max_line_len = 1000.0f;
|
|
|
}
|