From 5738a5615a92263b6c1f9a707aaca22de69de3a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Madar=C3=A1sz?= Date: Fri, 1 Dec 2023 22:27:44 +0100 Subject: [PATCH] sync fwk --- bind/v4k.lua | 6 ++- demos/01-easing.c | 3 +- engine/editor.c | 73 +++++++++++++++++++++--------- engine/joint/v4k.h | 49 ++++++++++++++------ engine/split/3rd_lightmapper.h | 2 +- engine/split/v4k.x.inl | 3 +- engine/split/v4k_editor_timeline.h | 2 +- engine/split/v4k_font.c | 21 +++++++-- engine/split/v4k_string.c | 2 +- engine/split/v4k_time.c | 12 +++-- engine/split/v4k_time.h | 6 ++- engine/v4k | 6 ++- engine/v4k.c | 37 +++++++++++---- engine/v4k.h | 6 ++- 14 files changed, 164 insertions(+), 64 deletions(-) diff --git a/bind/v4k.lua b/bind/v4k.lua index fec03ff..4c94982 100644 --- a/bind/v4k.lua +++ b/bind/v4k.lua @@ -3440,7 +3440,8 @@ float scale; void timer_destroy(unsigned timer_handle); typedef vec3i guid; guid guid_create(); - float ease_nop(float t); + float ease_zero(float t); + float ease_one(float t); float ease_linear(float t); float ease_out_sine(float t); float ease_out_quad(float t); @@ -3487,7 +3488,8 @@ EASE_BOUNCE, EASE_IN, EASE_OUT = 0, EASE_INOUT = EASE_IN * 2, -EASE_NOP = EASE_INOUT | (EASE_BOUNCE + 1), +EASE_ZERO = EASE_INOUT | (EASE_BOUNCE + 1), +EASE_ONE, EASE_LINEAR, EASE_INOUT_PERLIN, EASE_NUM diff --git a/demos/01-easing.c b/demos/01-easing.c index 4e64342..8e52b04 100644 --- a/demos/01-easing.c +++ b/demos/01-easing.c @@ -4,7 +4,8 @@ struct { float (*ease)(float); const char *name; } easings[] = { - {ease_nop, "ease_nop"}, + {ease_zero, "ease_zero"}, + {ease_one, "ease_one"}, {ease_linear, "ease_linear"}, {ease_out_sine, "ease_out_sine"}, {ease_out_quad, "ease_out_quad"}, diff --git a/engine/editor.c b/engine/editor.c index d43efa7..f0bfb30 100644 --- a/engine/editor.c +++ b/engine/editor.c @@ -153,7 +153,8 @@ int editor_toolbar(int x, int y, int incw, int inch, const char *sym) { int my = input(MOUSE_Y); int inc = maxi(incw, inch); - static int ox = 0, oy = 0, dragging = 0; // drag origin + static int ox = 0, oy = 0; // drag origin + static uint64_t dragging = 0; editor_toolbar_rect = vec4(x,y,x + (incw ? incw * array_count(codepoints) : inch), y + (inch ? inch * array_count(codepoints) : incw) ); int oo = is_hovering(editor_toolbar_rect, vec2(ox,oy)); @@ -167,20 +168,24 @@ int editor_toolbar(int x, int y, int incw, int inch, const char *sym) { ix += incw; iy += inch; } -// debug: -// ddraw_push_2d(); -// ddraw_aabb(vec3(editor_toolbar_rect.x,editor_toolbar_rect.y,0),vec3(editor_toolbar_rect.z,editor_toolbar_rect.w,0)); -// ddraw_pop_2d(); + if( 0 && editor_toolbar_hovered() ) { // debug: + ddraw_push_2d(); + ddraw_aabb(vec3(editor_toolbar_rect.x,editor_toolbar_rect.y,0),vec3(editor_toolbar_rect.z,editor_toolbar_rect.w,0)); + ddraw_pop_2d(); + } + if( 1 ) // is_hovering(editor_toolbar_rect, vec2(mx,my)) ) { - if( input_down(MOUSE_L) && editor_toolbar_hovered() ) { + uint64_t id = hash_bin(&editor_toolbar_rect, sizeof(vec4)); + + if( input_down(MOUSE_L) && editor_toolbar_hovered() && !dragging ) { window_cursor_shape(0); editor_toolbar_drag = vec4(0,0, mx,my); - ox = mx, oy = my, dragging = 1; + ox = mx, oy = my, dragging = id; int mcx = ((ox - x) / inc) + 1, mcy = ((oy - y) / inc) + 1; // mouse cells return incw ? -mcx : -mcy; } - if( input(MOUSE_L) && dragging ) { + if( input(MOUSE_L) && dragging == id ) { int mcx = ((ox - x) / inc) + 1, mcy = ((oy - y) / inc) + 1; // mouse cells editor_toolbar_drag.x = mx - editor_toolbar_drag.z; editor_toolbar_drag.y = my - editor_toolbar_drag.w; @@ -190,14 +195,13 @@ int editor_toolbar(int x, int y, int incw, int inch, const char *sym) { editor_toolbar_drag.w = oy; return incw ? -mcx : -mcy; } - if( input_up(MOUSE_L) && dragging ) { + if( input_up(MOUSE_L) && dragging == id ) { int mcx = ((ox - x) / inc) + 1, mcy = ((oy - y) / inc) + 1; // mouse cells window_cursor_shape(CURSOR_SW_AUTO); ox = oy = 0, dragging = 0; return incw ? mcx : mcy; } } - editor_toolbar_drag = vec4(0,0,0,0); return 0; } @@ -472,26 +476,51 @@ int main(){ camera_t *cam = camera_get_active(); - int choice1 = editor_toolbar(window_width()-32, ui_has_menubar() ? 34 : 0, 0, 32, + int font_ascent_diff = 4; // ascent(mdi) - ascent(md) // @todo: move this into font api + + + + int choiceV = editor_toolbar(window_width()-32, ui_has_menubar() ? 34 + font_ascent_diff : 0, 0, 32, + va( ICON_MD_VISIBILITY ICON_MD_360 // ICON_MDI_ORBIT + ICON_MDI_ARROW_ALL ICON_MD_LOUPE // ZOOM_OUT_MAP // ICON_MD_ZOOM_IN - ICON_MD_GRID_ON ); // ICON_MDI_GRID ); - int choice2 = editor_toolbar(window_width()-32*2, ui_has_menubar() ? 34 : 0, -32, 0, ICON_MD_SQUARE_FOOT ); + "%s", camera_get_active()->orthographic ? ICON_MDI_AXIS_ARROW_INFO : ICON_MDI_AXIS_ARROW // ICON_MDI_GRID_OFF : ICON_MDI_GRID // ICON_MD_GRID_ON + ) + ); + static int rot_snapping = 0; + static int pos_snapping = 1; + int choiceH = editor_toolbar(window_width()-32*2, ui_has_menubar() ? 34 : 0, -32, 0, + va( + ICON_MDI_ANGLE_ACUTE + //ICON_MDI_ARROW_COLLAPSE + //ICON_MDI_ARTBOARD + "%s", pos_snapping ? ICON_MDI_DOTS_SQUARE : ICON_MDI_DOTS_CIRCLE + ) + ); - if( choice1 > 0 ) { // clicked[>0] + if( choiceV ) { // clicked[>0] dragged[<0] camera_t *cam = camera_get_active(); - if( choice1 == 4 ) cam->orthographic ^= 1, camera_fps(cam, 0, 0); - } - if( choice1 < 0 ) { // dragged[<0] vec2 mouse_sensitivity = vec2(0.1, -0.1); // sensitivity + polarity vec2 drag = mul2( editor_toolbar_dragged(), mouse_sensitivity ); - if( choice1 == -1 ) camera_fps(cam, drag.x, drag.y ); - if( choice1 == -2 ) camera_orbit(cam, drag.x, drag.y, 0); //len3(cam->position) ); - if( choice1 == -3 ) camera_fov(cam, cam->fov += drag.y - drag.x); + if( choiceV == -1 ) camera_fps(cam, drag.x, drag.y ); + if( choiceV == -2 ) camera_orbit(cam, drag.x, drag.y, 0); //len3(cam->position) ); + if( choiceV == -3 ) camera_moveby(cam, scale3(vec3(drag.x, drag.y, 0), 10)) ; + if( choiceV == -4 ) camera_fov(cam, cam->fov += drag.y - drag.x); + if( choiceV == 5 ) cam->orthographic ^= 1, camera_fps(cam, 0, 0); + } + if( choiceH ) { + if( choiceH == 2 ) pos_snapping ^= 1; } - // font demo - font_print(va(FONT_BOTTOM FONT_RIGHT FONT_H6 "(CAM: %5.2f,%5.2f,%5.2f)", cam->position.x, cam->position.y, cam->position.z)); + // + char *cam_info = NULL, *cam_info_fmt = FONT_BOTTOM FONT_RIGHT FONT_H5; + if( choiceV == -1 ) cam_info = va("%s(CAM POS: %5.2f,%5.2f,%5.2f)", cam_info_fmt, cam->position.x, cam->position.y, cam->position.z, cam->fov); + if( choiceV == -2 ) cam_info = va("%s(CAM YAW: %5.2f PITCH: %5.2f)", cam_info_fmt, cam->yaw, cam->pitch); + if( choiceV == -4 ) cam_info = va("%s(CAM FOV: %5.2f)", cam_info_fmt, cam->fov); + if( choiceV == -5 ) cam_info = va("%s(CAM ORTHOGRAPHIC: %d)", cam_info_fmt, cam->orthographic); + if( choiceH == -2 ) cam_info = va("%s(OBJ SNAPPING: %d)", cam_info_fmt, pos_snapping); + if( cam_info ) font_print(cam_info); } } diff --git a/engine/joint/v4k.h b/engine/joint/v4k.h index b0e60e9..44352cd 100644 --- a/engine/joint/v4k.h +++ b/engine/joint/v4k.h @@ -18335,7 +18335,8 @@ AUTORUN { // ---------------------------------------------------------------------------- // ease -API float ease_nop(float t); +API float ease_zero(float t); +API float ease_one(float t); API float ease_linear(float t); API float ease_out_sine(float t); @@ -18389,7 +18390,8 @@ enum EASE_FLAGS { EASE_OUT = 0, EASE_INOUT = EASE_IN * 2, - EASE_NOP = EASE_INOUT | (EASE_BOUNCE + 1), + EASE_ZERO = EASE_INOUT | (EASE_BOUNCE + 1), + EASE_ONE, EASE_LINEAR, EASE_INOUT_PERLIN, @@ -32815,7 +32817,6 @@ int gladLoadGL( GLADloadfunc load) { #define BQ_PLATFORM_IMPLEMENTATION // websocket #define BQ_WEBSOCKET_IMPLEMENTATION // websocket #define XML_C // xml -#define LIGHTMAPPER_IMPLEMENTATION // lightmapper #ifdef __APPLE__ #define MA_NO_RUNTIME_LINKING // miniaudio osx #define _GLFW_COCOA // glfw osx @@ -347878,6 +347879,8 @@ void lt_tick(struct lua_State *L) { } #line 0 +#define LIGHTMAPPER_IMPLEMENTATION +//#define LM_DEBUG_INTERPOLATION #line 1 "3rd_lightmapper.h" /*********************************************************** * A single header file OpenGL lightmapping library * @@ -349659,7 +349662,8 @@ lm_bool lmImageSaveTGAf(const char *filename, const float *image, int w, int h, return success; } -#endif // LIGHTMAPPER_IMPLEMENTATION#line 0 +#endif // LIGHTMAPPER_IMPLEMENTATION +#line 0 #endif // V4K_3RD /* game framework. @@ -350498,7 +350502,7 @@ const char *extract_utf32(const char *s, uint32_t *out) { /**/ if( (s[0] & 0x80) == 0x00 ) return *out = (s[0]), s + 1; else if( (s[0] & 0xe0) == 0xc0 ) return *out = (s[0] & 31) << 6 | (s[1] & 63), s + 2; else if( (s[0] & 0xf0) == 0xe0 ) return *out = (s[0] & 15) << 12 | (s[1] & 63) << 6 | (s[2] & 63), s + 3; - else if( (s[0] & 0xf8) == 0xf0 ) return *out = (s[0] & 7) << 18 | (s[1] & 63) << 12 | (s[2] & 63) << 8 | (s[3] & 63), s + 4; + else if( (s[0] & 0xf8) == 0xf0 ) return *out = (s[0] & 7) << 18 | (s[1] & 63) << 12 | (s[2] & 63) << 6 | (s[3] & 63), s + 4; return *out = 0, s + 0; } array(uint32_t) string32( const char *utf8 ) { @@ -359705,7 +359709,8 @@ static const unsigned table_middle_east[] = { static const unsigned table_emoji[] = { // 0xE000, 0xEB4C, // Private use (emojis) - 0xE000, 0xF8FF, // Private use (emojis+webfonts) + 0xE000, 0xF68B, // Private use (emojis+webfonts). U+F68C excluded + 0xF68D, 0xF8FF, // Private use (emojis+webfonts) 0xF0001,0xF1CC7,// Private use (icon mdi) 0 }; @@ -360053,13 +360058,25 @@ void font_face_from_mem(const char *tag, const void *ttf_data, unsigned ttf_len, unsigned char *bitmap = (unsigned char*)MALLOC(f->height*f->width); int charCount = *array_back(sorted) - sorted[0] + 1; // 0xEFFFF; - f->begin = sorted[0]; f->cdata = (stbtt_packedchar*)CALLOC(1, sizeof(stbtt_packedchar) * charCount); f->iter2cp = (unsigned*)MALLOC( sizeof(unsigned) * charCount ); f->cp2iter = (unsigned*)MALLOC( sizeof(unsigned) * charCount ); for( int i = 0; i < charCount; ++i ) f->iter2cp[i] = f->cp2iter[i] = 0xFFFD; // default invalid glyph + // find first char + { + stbtt_fontinfo info = {0}; + stbtt_InitFont(&info, ttf_data, stbtt_GetFontOffsetForIndex(ttf_data,0)); + + for( int i = 0, end = array_count(sorted); i < end; ++i ) { + unsigned glyph = sorted[i]; + if(!stbtt_FindGlyphIndex(&info, glyph)) continue; + f->begin = glyph; + break; + } + } + stbtt_pack_context pc; if( !stbtt_PackBegin(&pc, bitmap, f->width, f->height, 0, 1, NULL) ) { PANIC("Failed to initialize atlas font"); @@ -360072,6 +360089,8 @@ void font_face_from_mem(const char *tag, const void *ttf_data, unsigned ttf_len, while( i < (num-1) && (sorted[i+1]-sorted[i]) == 1 ) end = sorted[++i]; //printf("(%d,%d)", (unsigned)begin, (unsigned)end); + if( begin < f->begin ) continue; + if( stbtt_PackFontRange(&pc, ttf_data, 0, f->font_size, begin, end - begin + 1, (stbtt_packedchar*)f->cdata + begin - f->begin) ) { for( uint64_t cp = begin; cp <= end; ++cp ) { // unicode->index runtime lookup @@ -360382,7 +360401,7 @@ vec2 font_draw_ex(const char *text, vec2 offset, const char *col, void (*draw_cm // convert to vbo data int cp = ch - f->begin; // f->cp2iter[ch - f->begin]; //if(cp == 0xFFFD) continue; - //if(cp > f->num_glyphs) cp = 0xFFFD; + //if (cp > f->num_glyphs) continue; *t++ = X; *t++ = Y; @@ -374693,7 +374712,8 @@ guid guid_create() { // ---------------------------------------------------------------------------- // ease -float ease_nop(float t) { return 0; } +float ease_zero(float t) { return 0; } +float ease_one(float t) { return 1; } float ease_linear(float t) { return t; } float ease_out_sine(float t) { return sinf(t*(C_PI*0.5f)); } @@ -374767,7 +374787,8 @@ float ease(float t01, unsigned mode) { ease_inout_elastic, ease_inout_bounce, - ease_nop, + ease_zero, + ease_one, ease_linear, ease_inout_perlin, }; @@ -374814,7 +374835,8 @@ const char **ease_enums() { "ease_inout_elastic", "ease_inout_bounce", - "ease_nop", + "ease_zero", + "ease_one", "ease_linear", "ease_inout_perlin", @@ -374862,7 +374884,8 @@ const char *ease_enum(unsigned mode) { ENUM(EASE_ELASTIC|EASE_INOUT); ENUM(EASE_BOUNCE|EASE_INOUT); - ENUM(EASE_NOP); + ENUM(EASE_ZERO); + ENUM(EASE_ONE); ENUM(EASE_LINEAR); ENUM(EASE_INOUT_PERLIN); };*/ @@ -379918,7 +379941,7 @@ int ui_tween(const char *label, tween_t *t) { ui_hue = (hash & 0x3F) / (float)0x3F; ui_hue += !ui_hue; struct nk_color c = nk_hsva_f(ui_hue, 0.75f, 0.8f, ui_alpha); - nk_fill_rect(canvas, pos, ROUNDING, k->ease == EASE_NOP ? AS_NKCOLOR(0) : c); // AS_NKCOLOR(track_color)); + nk_fill_rect(canvas, pos, ROUNDING, k->ease == EASE_ZERO ? AS_NKCOLOR(0) : c); // AS_NKCOLOR(track_color)); } // horizontal line diff --git a/engine/split/3rd_lightmapper.h b/engine/split/3rd_lightmapper.h index f37794f..cf7cba1 100644 --- a/engine/split/3rd_lightmapper.h +++ b/engine/split/3rd_lightmapper.h @@ -1778,4 +1778,4 @@ lm_bool lmImageSaveTGAf(const char *filename, const float *image, int w, int h, return success; } -#endif // LIGHTMAPPER_IMPLEMENTATION \ No newline at end of file +#endif // LIGHTMAPPER_IMPLEMENTATION diff --git a/engine/split/v4k.x.inl b/engine/split/v4k.x.inl index bd140e9..b7eee5d 100644 --- a/engine/split/v4k.x.inl +++ b/engine/split/v4k.x.inl @@ -53,7 +53,6 @@ #define BQ_PLATFORM_IMPLEMENTATION // websocket #define BQ_WEBSOCKET_IMPLEMENTATION // websocket #define XML_C // xml -#define LIGHTMAPPER_IMPLEMENTATION // lightmapper #ifdef __APPLE__ #define MA_NO_RUNTIME_LINKING // miniaudio osx #define _GLFW_COCOA // glfw osx @@ -218,6 +217,8 @@ static char *ui_filter = 0; {{FILE:3rd_lite_sys.h}} {{FILE:3rd_lite.h}} +#define LIGHTMAPPER_IMPLEMENTATION +//#define LM_DEBUG_INTERPOLATION {{FILE:3rd_lightmapper.h}} #endif // V4K_3RD diff --git a/engine/split/v4k_editor_timeline.h b/engine/split/v4k_editor_timeline.h index 6a513f4..40c525d 100644 --- a/engine/split/v4k_editor_timeline.h +++ b/engine/split/v4k_editor_timeline.h @@ -72,7 +72,7 @@ int ui_tween(const char *label, tween_t *t) { ui_hue = (hash & 0x3F) / (float)0x3F; ui_hue += !ui_hue; struct nk_color c = nk_hsva_f(ui_hue, 0.75f, 0.8f, ui_alpha); - nk_fill_rect(canvas, pos, ROUNDING, k->ease == EASE_NOP ? AS_NKCOLOR(0) : c); // AS_NKCOLOR(track_color)); + nk_fill_rect(canvas, pos, ROUNDING, k->ease == EASE_ZERO ? AS_NKCOLOR(0) : c); // AS_NKCOLOR(track_color)); } // horizontal line diff --git a/engine/split/v4k_font.c b/engine/split/v4k_font.c index f2d6c69..fbe0a06 100644 --- a/engine/split/v4k_font.c +++ b/engine/split/v4k_font.c @@ -1387,7 +1387,8 @@ static const unsigned table_middle_east[] = { static const unsigned table_emoji[] = { // 0xE000, 0xEB4C, // Private use (emojis) - 0xE000, 0xF8FF, // Private use (emojis+webfonts) + 0xE000, 0xF68B, // Private use (emojis+webfonts). U+F68C excluded + 0xF68D, 0xF8FF, // Private use (emojis+webfonts) 0xF0001,0xF1CC7,// Private use (icon mdi) 0 }; @@ -1735,13 +1736,25 @@ void font_face_from_mem(const char *tag, const void *ttf_data, unsigned ttf_len, unsigned char *bitmap = (unsigned char*)MALLOC(f->height*f->width); int charCount = *array_back(sorted) - sorted[0] + 1; // 0xEFFFF; - f->begin = sorted[0]; f->cdata = (stbtt_packedchar*)CALLOC(1, sizeof(stbtt_packedchar) * charCount); f->iter2cp = (unsigned*)MALLOC( sizeof(unsigned) * charCount ); f->cp2iter = (unsigned*)MALLOC( sizeof(unsigned) * charCount ); for( int i = 0; i < charCount; ++i ) f->iter2cp[i] = f->cp2iter[i] = 0xFFFD; // default invalid glyph + // find first char + { + stbtt_fontinfo info = {0}; + stbtt_InitFont(&info, ttf_data, stbtt_GetFontOffsetForIndex(ttf_data,0)); + + for( int i = 0, end = array_count(sorted); i < end; ++i ) { + unsigned glyph = sorted[i]; + if(!stbtt_FindGlyphIndex(&info, glyph)) continue; + f->begin = glyph; + break; + } + } + stbtt_pack_context pc; if( !stbtt_PackBegin(&pc, bitmap, f->width, f->height, 0, 1, NULL) ) { PANIC("Failed to initialize atlas font"); @@ -1754,6 +1767,8 @@ void font_face_from_mem(const char *tag, const void *ttf_data, unsigned ttf_len, while( i < (num-1) && (sorted[i+1]-sorted[i]) == 1 ) end = sorted[++i]; //printf("(%d,%d)", (unsigned)begin, (unsigned)end); + if( begin < f->begin ) continue; + if( stbtt_PackFontRange(&pc, ttf_data, 0, f->font_size, begin, end - begin + 1, (stbtt_packedchar*)f->cdata + begin - f->begin) ) { for( uint64_t cp = begin; cp <= end; ++cp ) { // unicode->index runtime lookup @@ -2064,7 +2079,7 @@ vec2 font_draw_ex(const char *text, vec2 offset, const char *col, void (*draw_cm // convert to vbo data int cp = ch - f->begin; // f->cp2iter[ch - f->begin]; //if(cp == 0xFFFD) continue; - //if(cp > f->num_glyphs) cp = 0xFFFD; + //if (cp > f->num_glyphs) continue; *t++ = X; *t++ = Y; diff --git a/engine/split/v4k_string.c b/engine/split/v4k_string.c index ce68390..a862e1a 100644 --- a/engine/split/v4k_string.c +++ b/engine/split/v4k_string.c @@ -331,7 +331,7 @@ const char *extract_utf32(const char *s, uint32_t *out) { /**/ if( (s[0] & 0x80) == 0x00 ) return *out = (s[0]), s + 1; else if( (s[0] & 0xe0) == 0xc0 ) return *out = (s[0] & 31) << 6 | (s[1] & 63), s + 2; else if( (s[0] & 0xf0) == 0xe0 ) return *out = (s[0] & 15) << 12 | (s[1] & 63) << 6 | (s[2] & 63), s + 3; - else if( (s[0] & 0xf8) == 0xf0 ) return *out = (s[0] & 7) << 18 | (s[1] & 63) << 12 | (s[2] & 63) << 8 | (s[3] & 63), s + 4; + else if( (s[0] & 0xf8) == 0xf0 ) return *out = (s[0] & 7) << 18 | (s[1] & 63) << 12 | (s[2] & 63) << 6 | (s[3] & 63), s + 4; return *out = 0, s + 0; } array(uint32_t) string32( const char *utf8 ) { diff --git a/engine/split/v4k_time.c b/engine/split/v4k_time.c index de0529d..3adcf14 100644 --- a/engine/split/v4k_time.c +++ b/engine/split/v4k_time.c @@ -250,7 +250,8 @@ guid guid_create() { // ---------------------------------------------------------------------------- // ease -float ease_nop(float t) { return 0; } +float ease_zero(float t) { return 0; } +float ease_one(float t) { return 1; } float ease_linear(float t) { return t; } float ease_out_sine(float t) { return sinf(t*(C_PI*0.5f)); } @@ -324,7 +325,8 @@ float ease(float t01, unsigned mode) { ease_inout_elastic, ease_inout_bounce, - ease_nop, + ease_zero, + ease_one, ease_linear, ease_inout_perlin, }; @@ -371,7 +373,8 @@ const char **ease_enums() { "ease_inout_elastic", "ease_inout_bounce", - "ease_nop", + "ease_zero", + "ease_one", "ease_linear", "ease_inout_perlin", @@ -419,7 +422,8 @@ const char *ease_enum(unsigned mode) { ENUM(EASE_ELASTIC|EASE_INOUT); ENUM(EASE_BOUNCE|EASE_INOUT); - ENUM(EASE_NOP); + ENUM(EASE_ZERO); + ENUM(EASE_ONE); ENUM(EASE_LINEAR); ENUM(EASE_INOUT_PERLIN); };*/ diff --git a/engine/split/v4k_time.h b/engine/split/v4k_time.h index fd0057c..b01d5b4 100644 --- a/engine/split/v4k_time.h +++ b/engine/split/v4k_time.h @@ -45,7 +45,8 @@ AUTORUN { // ---------------------------------------------------------------------------- // ease -API float ease_nop(float t); +API float ease_zero(float t); +API float ease_one(float t); API float ease_linear(float t); API float ease_out_sine(float t); @@ -99,7 +100,8 @@ enum EASE_FLAGS { EASE_OUT = 0, EASE_INOUT = EASE_IN * 2, - EASE_NOP = EASE_INOUT | (EASE_BOUNCE + 1), + EASE_ZERO = EASE_INOUT | (EASE_BOUNCE + 1), + EASE_ONE, EASE_LINEAR, EASE_INOUT_PERLIN, diff --git a/engine/v4k b/engine/v4k index 0a8c486..b17dde4 100644 --- a/engine/v4k +++ b/engine/v4k @@ -13981,7 +13981,6 @@ int gladLoadGL( GLADloadfunc load) { #define BQ_PLATFORM_IMPLEMENTATION // websocket #define BQ_WEBSOCKET_IMPLEMENTATION // websocket #define XML_C // xml -#define LIGHTMAPPER_IMPLEMENTATION // lightmapper #ifdef __APPLE__ #define MA_NO_RUNTIME_LINKING // miniaudio osx #define _GLFW_COCOA // glfw osx @@ -329044,6 +329043,8 @@ void lt_tick(struct lua_State *L) { } #line 0 +#define LIGHTMAPPER_IMPLEMENTATION +//#define LM_DEBUG_INTERPOLATION #line 1 "3rd_lightmapper.h" /*********************************************************** * A single header file OpenGL lightmapping library * @@ -330825,6 +330826,7 @@ lm_bool lmImageSaveTGAf(const char *filename, const float *image, int w, int h, return success; } -#endif // LIGHTMAPPER_IMPLEMENTATION#line 0 +#endif // LIGHTMAPPER_IMPLEMENTATION +#line 0 #endif // V4K_3RD diff --git a/engine/v4k.c b/engine/v4k.c index e35da57..b62a437 100644 --- a/engine/v4k.c +++ b/engine/v4k.c @@ -834,7 +834,7 @@ const char *extract_utf32(const char *s, uint32_t *out) { /**/ if( (s[0] & 0x80) == 0x00 ) return *out = (s[0]), s + 1; else if( (s[0] & 0xe0) == 0xc0 ) return *out = (s[0] & 31) << 6 | (s[1] & 63), s + 2; else if( (s[0] & 0xf0) == 0xe0 ) return *out = (s[0] & 15) << 12 | (s[1] & 63) << 6 | (s[2] & 63), s + 3; - else if( (s[0] & 0xf8) == 0xf0 ) return *out = (s[0] & 7) << 18 | (s[1] & 63) << 12 | (s[2] & 63) << 8 | (s[3] & 63), s + 4; + else if( (s[0] & 0xf8) == 0xf0 ) return *out = (s[0] & 7) << 18 | (s[1] & 63) << 12 | (s[2] & 63) << 6 | (s[3] & 63), s + 4; return *out = 0, s + 0; } array(uint32_t) string32( const char *utf8 ) { @@ -10041,7 +10041,8 @@ static const unsigned table_middle_east[] = { static const unsigned table_emoji[] = { // 0xE000, 0xEB4C, // Private use (emojis) - 0xE000, 0xF8FF, // Private use (emojis+webfonts) + 0xE000, 0xF68B, // Private use (emojis+webfonts). U+F68C excluded + 0xF68D, 0xF8FF, // Private use (emojis+webfonts) 0xF0001,0xF1CC7,// Private use (icon mdi) 0 }; @@ -10389,13 +10390,25 @@ void font_face_from_mem(const char *tag, const void *ttf_data, unsigned ttf_len, unsigned char *bitmap = (unsigned char*)MALLOC(f->height*f->width); int charCount = *array_back(sorted) - sorted[0] + 1; // 0xEFFFF; - f->begin = sorted[0]; f->cdata = (stbtt_packedchar*)CALLOC(1, sizeof(stbtt_packedchar) * charCount); f->iter2cp = (unsigned*)MALLOC( sizeof(unsigned) * charCount ); f->cp2iter = (unsigned*)MALLOC( sizeof(unsigned) * charCount ); for( int i = 0; i < charCount; ++i ) f->iter2cp[i] = f->cp2iter[i] = 0xFFFD; // default invalid glyph + // find first char + { + stbtt_fontinfo info = {0}; + stbtt_InitFont(&info, ttf_data, stbtt_GetFontOffsetForIndex(ttf_data,0)); + + for( int i = 0, end = array_count(sorted); i < end; ++i ) { + unsigned glyph = sorted[i]; + if(!stbtt_FindGlyphIndex(&info, glyph)) continue; + f->begin = glyph; + break; + } + } + stbtt_pack_context pc; if( !stbtt_PackBegin(&pc, bitmap, f->width, f->height, 0, 1, NULL) ) { PANIC("Failed to initialize atlas font"); @@ -10408,6 +10421,8 @@ void font_face_from_mem(const char *tag, const void *ttf_data, unsigned ttf_len, while( i < (num-1) && (sorted[i+1]-sorted[i]) == 1 ) end = sorted[++i]; //printf("(%d,%d)", (unsigned)begin, (unsigned)end); + if( begin < f->begin ) continue; + if( stbtt_PackFontRange(&pc, ttf_data, 0, f->font_size, begin, end - begin + 1, (stbtt_packedchar*)f->cdata + begin - f->begin) ) { for( uint64_t cp = begin; cp <= end; ++cp ) { // unicode->index runtime lookup @@ -10718,7 +10733,7 @@ vec2 font_draw_ex(const char *text, vec2 offset, const char *col, void (*draw_cm // convert to vbo data int cp = ch - f->begin; // f->cp2iter[ch - f->begin]; //if(cp == 0xFFFD) continue; - //if(cp > f->num_glyphs) cp = 0xFFFD; + //if (cp > f->num_glyphs) continue; *t++ = X; *t++ = Y; @@ -25029,7 +25044,8 @@ guid guid_create() { // ---------------------------------------------------------------------------- // ease -float ease_nop(float t) { return 0; } +float ease_zero(float t) { return 0; } +float ease_one(float t) { return 1; } float ease_linear(float t) { return t; } float ease_out_sine(float t) { return sinf(t*(C_PI*0.5f)); } @@ -25103,7 +25119,8 @@ float ease(float t01, unsigned mode) { ease_inout_elastic, ease_inout_bounce, - ease_nop, + ease_zero, + ease_one, ease_linear, ease_inout_perlin, }; @@ -25150,7 +25167,8 @@ const char **ease_enums() { "ease_inout_elastic", "ease_inout_bounce", - "ease_nop", + "ease_zero", + "ease_one", "ease_linear", "ease_inout_perlin", @@ -25198,7 +25216,8 @@ const char *ease_enum(unsigned mode) { ENUM(EASE_ELASTIC|EASE_INOUT); ENUM(EASE_BOUNCE|EASE_INOUT); - ENUM(EASE_NOP); + ENUM(EASE_ZERO); + ENUM(EASE_ONE); ENUM(EASE_LINEAR); ENUM(EASE_INOUT_PERLIN); };*/ @@ -30254,7 +30273,7 @@ int ui_tween(const char *label, tween_t *t) { ui_hue = (hash & 0x3F) / (float)0x3F; ui_hue += !ui_hue; struct nk_color c = nk_hsva_f(ui_hue, 0.75f, 0.8f, ui_alpha); - nk_fill_rect(canvas, pos, ROUNDING, k->ease == EASE_NOP ? AS_NKCOLOR(0) : c); // AS_NKCOLOR(track_color)); + nk_fill_rect(canvas, pos, ROUNDING, k->ease == EASE_ZERO ? AS_NKCOLOR(0) : c); // AS_NKCOLOR(track_color)); } // horizontal line diff --git a/engine/v4k.h b/engine/v4k.h index 7d4e3e2..0a9b847 100644 --- a/engine/v4k.h +++ b/engine/v4k.h @@ -4402,7 +4402,8 @@ AUTORUN { // ---------------------------------------------------------------------------- // ease -API float ease_nop(float t); +API float ease_zero(float t); +API float ease_one(float t); API float ease_linear(float t); API float ease_out_sine(float t); @@ -4456,7 +4457,8 @@ enum EASE_FLAGS { EASE_OUT = 0, EASE_INOUT = EASE_IN * 2, - EASE_NOP = EASE_INOUT | (EASE_BOUNCE + 1), + EASE_ZERO = EASE_INOUT | (EASE_BOUNCE + 1), + EASE_ONE, EASE_LINEAR, EASE_INOUT_PERLIN,