kolibrios-gitea/programs/games/heliothryx/game/rsgametext.c

562 lines
14 KiB
C
Raw Normal View History

#include "rs/rsplatform.h"
#include "rsgametext.h"
#include "rsgame.h"
#include "rsgentex.h"
#include "rskos.h"
#ifdef RS_USE_C_LIBS
#include <math.h>
#include <stdlib.h>
#include <string.h>
#endif
signed short pp_seg[32*8] = {
// 0
16, 6-16,
16, 6+16,
16, 6,
13, 0,
// 1
26-16, 16,
26+16, 16,
26, 11,
8, 0,
// 2
26-16, 16,
26+16, 16,
26, 21,
8, 0,
// 3
16, 26-16,
16, 26+16,
16, 26,
13, 0,
// 4
6-16, 16,
6+16, 16,
6, 21,
8, 0,
// 5
6-16, 16,
6+16, 16,
6, 11,
8, 0,
// 6
16, 16-16,
16, 16+16,
16, 16,
13, 0,
// 7
16, 4-22,
16, 4+22,
16, 4,
4, 0,
// 8
16-16, 16,
16+16, 16,
16, 11,
8, 0,
// 9
16-16, 16,
16+16, 16,
16, 21,
8, 0,
// 10
21-16, 11+16,
21+16, 11-16,
21, 11,
9, 0,
// 11 modified
16-16, 16+16,
16+16, 16-16,
21, 21,
9, 0,
// 12
16-16, 16-16,
16+16, 16+16,
21, 11,
9, 0,
// 13
21-16, 21-16,
21+16, 21+16,
21, 21,
9, 0,
// 14
16, 16-16,
16, 16+16,
10, 16,
7, 0,
// 15
16, 16-16,
16, 16+16,
22, 16,
7, 0,
// 16
16-16, 16+16,
16+16, 16-16,
11, 11,
8, 0,
// 17
11-16, 21+16,
11+16, 21-16,
11, 21,
9, 0,
// 18
11-16, 11-16,
11+16, 11+16,
11, 11,
9, 0,
// 19
16-16, 16-16,
16+16, 16+16,
11, 21,
9, 0,
// 20 == copy 11 modified
21-22, 21+22,
21+22, 21-22,
21, 21,
9, 0,
// 21 - right
27-12, 28-9,
27+12, 28+9,
27, 27,
4, 0,
// 22 - left
5-12, 28+9,
5+12, 28-9,
5, 27,
4, 0,
// 23
6-16, 16,
6+16, 16,
6, 8,
5, 0,
// 24
16-33, 16,
16+33, 16,
16, 13,
4, 0,
// 25
16-33, 16,
16+33, 16,
16, 26,
4, 0,
// 26
16, 6-16,
16, 6+16,
11, 6,
7, 0,
// 27
16, 26-16,
16, 26+16,
11, 26,
7, 0,
// 28
16, 6-16,
16, 6+16,
21, 6,
7, 0,
// 29
16, 26-16,
16, 26+16,
21, 26,
7, 0,
// 30 ,
11-22, 27-22,
11+22, 27+22,
11, 25,
6, 0,
// 31 not implemented - need to create up-left DOT for percent(%) sign
16, 26-16,
16, 26+16,
16, 26,
13, 0,
};
unsigned int ch_seg[64] = {
0b00111111 /* | 1<<12 | 1<<19 */, // 0 or O
1<<26 | 1<<8 | 1<<9 | 1<<3, // 1
0b01011011, // 2
1<<0 | 1<<12 | 1<<15 | 1<<2 | 1<<3, // 3
0b01100110, // 4
0b01101101, // 5
1<<0 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6, // 6 // old: 1<<6 | 1<<2 | 1<<3 | 1<<4 | 1<<18 | 1<<28, // 6
1<<23 | 1<<0 | 1<<1 | 1<<13 , //0b00000111 , // 7
0b01111111, // 8
1<<6 | 1<<5 | 1<<0 | 1<<1 | 1<<2 | 1<<3, // 9
1<<24 | 1<<25, // :
1<<8 | 1<<25, // ;
1<<12 | 1<<11, // <
1<<6, // = (-)
1<<16 | 1<<19, // >
1<<23 | 1<<0 | 1<<1 | 1<<15 | 1<<25 | 1<<9, // ?
1<<19 | 1<<12, // @ (/)
1<<0 | 1<<1 | 1<<2 | 1<<6 | 1<<4 | 1<<5, // A
1<<26 | 1<<10 | 1<<6 | 1<<11 | 1<<3 | 1<<4 | 1<<5, // B
1<<0 | 1<<5 | 1<<4 | 1<<3, // C // corners: 1<<28 | 1<<18 | 1<<17 | 1<<29,
1<<26 | 1<<27 | 1<<5 | 1<<4 | 1<<10 | 1<<13 , // D
1<<0 | 1<<14 | 1<<3 | 1<<5 | 1<<4, // E
1<<0 | 1<<14 | 1<<5 | 1<<4, // F
1<<0 | 1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<15, // G
1<<1 | 1<<2 | 1<<5 | 1<<4 | 1<<6, // H
1<<0 | 1<<8 | 1<<9 | 1<<3, // I
1<<1 | 1<<2 | 1<<3 | 1<<4, // J
1<<5 | 1<<4 | 1<<14 | 1<<12 | 1<<11, // K
1<<5 | 1<<4 | 1<<3, // L
1<<5 | 1<<4 | 1<<1 | 1<<2 | 1<<16 | 1<<12, // M
1<<5 | 1<<4 | 1<<16 | 1<<11 | 1<<1 | 1<<2, // N
1<<16 | 1<<11 | 1<<19 | 1<<12 | 1<<6 | 1<<8 | 1<<9, // O - FREE SYMBOL
1<<4 | 1<<5 | 1<<0 | 1<<1 | 1<<6, // P
1<<0 | 1<<1 | 1<<13 | 1<<27 | 1<<4 | 1<<5 | 1<<11, // Q // old: 0b00111111 | 1<<11, // Q
1<<0 | 1<<1 | 1<<6 | 1<<5 | 1<<4 | 1<<11, // R
(1 << 18 | 1 << 13) | (1 << 29 | 1 << 26) | (1 << 5 | 1 << 2) | (1 << 19 | 1 << 12), // percent(%) sign, s == 5 -> // 0b01101101, // S
1<<0 | 1<<8 | 1<<9, // T
1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5, // U
1<<1 | 1<<13 | 1<<17 | 1<<5, // V
1<<5 | 1<<4 | 1<<19 | 1<<11 | 1<<2 | 1<<1, // W
1<<16 | 1<<11 | 1<<19 | 1<<12, // X
1<<5 | 1<<6 | 1<<1 | 1<<2 | 1<<3, // Y
1<<0 | 1<<12 | 1<<19 | 1<<3, // Z
1<<26 | 1<<8 | 1<<9 | 1<<29 | 1<<2 | 1<<15, // [Ъ
1<<5 | 1<<4 | 1<<27 | 1<<9 | 1<<14 | 1<<1 | 1<<2, // \Ы
1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<6, // ]Ь
1<<7 | 1<<5 | 1<<4 | 1<<19 | 1<<12 | 1<<1 | 1<<2, // ^Й
1<<30, // _ (,comma)
1<<25, // ` dot
1<<5 | 1<<0 | 1<<1 | 1<<6 | 1<<2 | 1<<19, // aЯ
1<<0 | 1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<6, // bБ
1<<5 | 1<<4 | 1<<3 | 1<<1 | 1<<2 | 1<<21, // cЦ
0b011001000000010000011100, // dД
1<<0 | 1<<1 | 1<<15 | 1<<2 | 1<<3, // eЭ // with corners: 1<<26 | 1<<10 | 1<<6 | 1<<13 | 1<<27, // eЭ
1<<0 | 1<<1 | 1<<6 | 1<<5 | 1<<8 | 1<<9, // fФ
1<<4 | 1<<5 | 1<<0, // gГ
1<<5 | 1<<4 | 1<<3 | 1<<1 | 1<<2 | 1<<9, // hШ,
1<<5 | 1<<4 | 1<<19 | 1<<12 | 1<<1 | 1<<2, // iИ
1<<5 | 1<<8 | 1<<1 | 1<<6 | 1<<4 | 1<<9 | 1<<2, // old: 1<<16 | 1<<8 | 1<<12 | 1<<19 | 1<<9 | 1<<11, // jЖ
1<<5 | 1<<4 | 1<<14 | 1<<8 | 1<<9 | 1<<1 | 1<<2 | 1<<28 | 1<<29, // k_Ю
1<<4 | 1<<18 | 1<<28 | 1<<1 | 1<<2, // l // old symmetric: 1<<4 | 1<<18 | 1<<10 | 1<<2, // l // old: 1<<19 | 1<<12 | 1<<1 | 1<<2, // lЛ
1<<5 | 1<<4 | 1<<3 | 1<<1 | 1<<2 | 1<<9 | 1<<21, // mЩ,
1<<4 | 1<<5 | 1<<0 | 1<<1 | 1<<2, // n
(1<<8 | 1<<9) | 1<<10 | 1<<18, // 'o' for arrow up ^
};
void game_font_init() {
DEBUG30(":: font init start");
float scale = 1.0;
int seg;
int ch;
int ch_bit;
// // FAT FONT #1 (OK)
// float scales[4] = { 0.4, 0.6, 0.2, 2 }; // 2,1,1,1
// float pows[4] = { 15.0, 19.0, 200.0, 22.0 };
// float ks1[4] = { 1.2, 1.0, 1.2, 0.90 }; // 0.75 straight
// float ks2[4] = { -1.0, -1.0, -1.0, -1.0 };
// float pows1[4] = { 1.0, 0.79, 1.0, 1.0 };
// float pows2[4] = { 1.0, 0.79, 1.0, 1.0 };
// float clamp1[4] = { 0.8, 0.75, 0.65, 0.87 }; // 0.8 to 0.86
// float clamp2[4] = { 0.85, 0.85, 0.85, 0.92 };
// float radiuses[4] = { 1.0, 1.1, 1.2, 0.87 };
float scales[4] = { 0.4, 0.6, 0.2, 2 }; // 2,1,1,1
//float pows[4] = { 45.0, 100.0, 200.0, 22.0 };
float pows[4] = { 15.0, 15.0, 15.0, 22.0 };
float ks1[4] = { 1.0, 1.2, 1.2, 0.90 }; // 0.75 straight
float ks2[4] = { -1.0, -1.0, -1.0, -1.0 };
float pows1[4] = { 1.3, 1.0, 1.0, 1.0 };
float pows2[4] = { 1.2, 0.9, 1.0, 1.0 };
float clamp1[4] = { 0.7, 0.79, 0.65, 0.87 }; // 0.8 to 0.86
float clamp2[4] = { 0.9, 0.85, 0.85, 0.92 };
float radiuses[4] = { 0.93, 0.93, 1.2, 0.87 };
float colors_r[4] = { 1.0, 0.3, 1.0, 0.3 };
float colors_g[4] = { 1.0, 0.6, 1.0, 0.6 };
float colors_b[4] = { 1.0, 1.0, 1.0, 0.9 };
// 1: 0.5, 0.74, 0.79
DEBUG20(":: font init label-a");
int font_index = 0;
int font_index_color = 0;
for (font_index_color = 0; font_index_color < FONTS_COUNT; font_index_color++) {
font_index = font_index_color % 3;
DEBUG30f(":: font init label-b (font index %d) \n", font_index);
scale = scales[font_index];
rs_gen_reg.cell_scale = scale;
int char_tex_size = scale*32;
// DEBUG10f("char_tex_size %d \n", char_tex_size);
rs_gen_init(97, char_tex_size);
for (seg = 0; seg < 32; seg++) {
rs_gen_func_cell(seg, 1, 2, &pp_seg[8*seg], ks1[font_index], pows1[font_index], ks2[font_index], pows2[font_index], 0.0, 0.0);
//rs_gen_func_cell(seg, 1, 2, &pp_seg[8*seg], 1.2, 1.0, -1.0, 1.0, 0.0, 0.0);
//rs_gen_func_cell(seg, 1, 2, &pp_seg[8*seg], 0.48450032, 1.0, -1.0, 2.20, 0.0, 0.0); // toon
rs_gen_func_normalize(seg, 0.0, 1.0); // 0.1 to 1.0
rs_gen_func_clamp(seg, clamp1[font_index], clamp2[font_index]); // 0.8, 0.86); // toon 0.775, 0.839889
rs_gen_func_normalize(seg, 0.0, 1.0); // 0.1 to 1.0
rs_gen_func_set(96, 0.0);
rs_gen_func_radial(96, (float)pp_seg[8*seg + 4]/32.0, (float)pp_seg[8*seg + 5]/32.0, (float)pp_seg[8*seg + 6]/32.0*radiuses[font_index], 1.0, pows[font_index]);
rs_gen_func_mult(seg, seg, 96);
};
for (ch = 0; ch < 64; ch++) {
rs_gen_func_set(32+ch, 0.0);
for (ch_bit = 0; ch_bit < 32; ch_bit++) {
if ( (1<<ch_bit) & (ch_seg[ch]) ) {
rs_gen_func_add_lerped(32+ch, 32+ch, ch_bit, 1.0, 1.0);
}
}
rs_gen_func_clamp(32+ch, (ch+ch/8)%2 ? 0.0 : 0.0, 1.0);
// rs_gen_func_set(32+ch, (ch+ch/8)%2 ? 0.5 : 0.0);
rs_gen_tex_out_rgba_set(0.0, 0.0, 0.0, 0.0);
rs_gen_tex_out_rgba(32+ch, 32+ch, 32+ch, 32+ch, colors_b[font_index_color], colors_g[font_index_color], colors_r[font_index_color], 1.0);
texture_init(&game.tex_font[font_index_color*64 + ch], char_tex_size, char_tex_size);
memcpy(game.tex_font[font_index_color*64 + ch].data, rs_gen_reg.tex_out, char_tex_size*char_tex_size*4 );
}
/*
float *fontdata = malloc(256*scale*256*scale*4);
int i, j, k;
for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) {
for (k = 0; k < 32*scale; k++) {
memcpy( &(fontdata[i*256*(32*scale)*scale + k*256*scale + (j)*(32*scale)]), &(rs_gen_reg.tex[k*(32*scale) + (32+j+i*8)*(32*scale)*(32*scale)] ), 32*4*scale );
};
};
};
rs_gen_term();
int font_tex_size = 256*scale;
rs_gen_init(2, font_tex_size);
memcpy( rs_gen_reg.tex, fontdata, 256*256 * 4 *scale*scale);
rs_gen_func_set(1, 1.0);
rs_gen_tex_out_rgba_set(0.0, 0.0, 0.0, 0.0);
rs_gen_tex_out_rgba(1, 1, 1, 0, 1.0, 1.0, 1.0, 1.0);
//game.font_texture[font_index] = rs_tx_create_from_data(font_tex_size, font_tex_size, 4, 1, 0, rs_gen_reg.tex_out);
game_loader_create_texture( &(game.font_texture[font_index]), font_tex_size, font_tex_size, 4, 1, 0, rs_gen_reg.tex_out );
save_image(0, rs_gen_reg.tex_out, 256*scale, 256*scale, 4);
*/
rs_gen_term();
// free(fontdata);
//
// game.loader_progress = font_index+2;
};
rs_gen_reg.cell_scale = 1;
};
void game_font_term() {
int i;
for (i = 0; i < 64*FONTS_COUNT; i++) {
texture_free(&game.tex_font[i]);
};
};
void game_textout_init(int set_to_ortho, int font_index) {
// CHECK_GL("textout init: start");
//
// glDisable(GL_DEPTH_TEST);
// CHECK_GL("textout init: disable depth test");
//
// rs_sh_use(game.text_shader);
// CHECK_GL("textout init: use text shader");
// glBindTexture(GL_TEXTURE_2D, game.font_texture[font_index]);
// CHECK_GL("textout init: glBindTexture");
// glUniform1i( game.text_shader[RS_SH_SAMPLER0_ID], 0 );
// if (set_to_ortho) {
// rs_mx_ortho1h_proj();
// }
//
// CHECK_GL("textout init: label d");
//
// glUniformMatrix4fv( game.text_shader[RS_SH_PROJ_ID], 1, GL_FALSE, rs_reg.mx_proj );
//
// CHECK_GL("textout init: label e");
//
// glUniform4f( game.text_shader[RS_SH_COLOR_ID], 0.0, 0.0, 0.0, 0.0 );
//
// CHECK_GL("textout init: end");
};
float game_colors[4*7] = {
0.0, 0.0, 0.0, 1.0,
1.0, 1.0, 1.0, 1.0,
1.0, 0.9, 0.3, 1.0,
1.0, 0.4, 0.3, 1.0,
0.6, 0.8, 1.0, 1.0,
1.0, 0.8, 0.6, 1.0,
0.6, 0.6, 0.6, 0.9,
};
void game_textout(int x, int y, int font_index, char* s) {
int i = 0;
while (*s) {
if (*s != ' ') {
texture_draw(&game.framebuffer, &game.tex_font[ 64*font_index + ((*s - 48) % 64) ], x+i*game.tex_font[64*font_index+0].w, y, DRAW_MODE_ALPHA);
};
s++;
i++;
};
// for (i = 0; i < 8; i++) {
// texture_draw(&game.framebuffer, &game.tex_font[i], 40+8+game.tx+i*game.tex_font[i].w, 80+game.ty, DRAW_MODE_ALPHA);
// }
// //char *s = "12345_QUICK_BROWN_FOX_JUMPS_OVER_A_LAZY_DOG";
//
// float w = 2.0*h/3.0;
// int len = strlen(s);
//
// x -= (float) align * 0.5 * len * w;
//
// float sx = 0.0;
// float sy = 0.0;
//
//
//
// int i;
// for (i = 0; i < len; i++) {
// unsigned char c = s[i];
//
// if (c == '\n') {
// sx = 0.0;
// sy += h;
// continue;
// };
//
// if (c == ' ') {
// sx += w;
// continue;
// };
//
// c = (c-48)%64;
// float tx = 1.0 / 8.0 * (c % 8);
// float ty = 1.0 / 8.0 * (c / 8);
//
// glUniform4fv( game.text_shader[RS_SH_SCALE_ID], 1, &(game_colors[4*0]) ); // black shadow
// glrsDrawRect_full(sx + x + h/12,
// sy + y-h/2 + h/12,
// sx + x + w + h/12,
// sy + y+h/2 + h/12,
// tx, ty, tx+1.0/8.0, ty+1.0/8.0,
// game.text_shader[RS_SH_POS_ID], game.text_shader[RS_SH_UV_ID],
// 0.0, 0.0, 0.0 );
//
// glUniform4fv( game.text_shader[RS_SH_SCALE_ID], 1, &(game_colors[4*color]) );
//// glUniform3f( game.text_shader[RS_SH_TIME_ID], 1.0, 1.0, 0.0 );
// glrsDrawRect_full(sx + x,
// sy + y-h/2,
// sx + x + w,
// sy + y+h/2,
// tx, ty, tx+1.0/8.0, ty+1.0/8.0,
// game.text_shader[RS_SH_POS_ID], game.text_shader[RS_SH_UV_ID],
// 0.0, 0.0, 0.0 );
// sx += w;
// }
};