kolibrios-gitea/programs/games/heliothryx/game/rsgametext.c
alpine 2815962839 Update for Heliothryx game:
- added localization tool

Updates for Marble Match-3 game:
- added localization support
- some cosmetic changes



git-svn-id: svn://kolibrios.org@5243 a494cfbc-eb01-0410-851d-a64ba20cac60
2014-12-19 17:29:02 +00:00

562 lines
14 KiB
C
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
// }
};