From 567aea2b1546bbdf2e12ef8aec64f9de35afe8b1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 26 Aug 2024 15:55:12 -0700 Subject: [PATCH] new view serialized/deserialized params storage --- src/df/gfx/df_gfx.c | 74 ++++++++++++++++++++++++++++++---- src/df/gfx/df_gfx.h | 8 +++- src/df/gfx/df_views.c | 93 +++++++++++++++++++++++++------------------ src/df/gfx/df_views.h | 23 +++++------ src/eval/eval_parse.c | 2 +- 5 files changed, 140 insertions(+), 60 deletions(-) diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 610af512..ed81d15e 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -809,7 +809,7 @@ df_view_alloc(void) internal void df_view_release(DF_View *view) { - DLLPushBack_NPZ(&df_g_nil_view, df_gfx_state->first_view, df_gfx_state->last_view, view, alloc_next, alloc_prev); + DLLRemove_NPZ(&df_g_nil_view, df_gfx_state->first_view, df_gfx_state->last_view, view, alloc_next, alloc_prev); SLLStackPush_N(df_gfx_state->free_view, view, alloc_next); for(DF_View *tchild = view->first_transient, *next = 0; !df_view_is_nil(tchild); tchild = next) { @@ -886,7 +886,7 @@ df_view_equip_spec(DF_Window *window, DF_View *view, DF_ViewSpec *spec, String8 } view->is_filtering = 0; view->is_filtering_t = 0; - view_setup(window, view, view->params_roots[view->params_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size)); + view_setup(window, view, view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size)); } } @@ -920,6 +920,55 @@ df_view_push_arena_ext(DF_View *view) return ext->arena; } +//- rjf: param saving + +internal void +df_store_param(DF_View *view, String8 key, String8 value) +{ + B32 new_copy = 0; + if(view->params_write_gen == view->params_read_gen) + { + view->params_write_gen += 1; + new_copy = 1; + } + Arena *new_params_arena = view->params_arenas[view->params_write_gen%ArrayCount(view->params_arenas)]; + if(new_copy) + { + arena_clear(new_params_arena); + view->params_roots[view->params_write_gen%ArrayCount(view->params_arenas)] = md_tree_copy(new_params_arena, view->params_roots[view->params_read_gen%ArrayCount(view->params_arenas)]); + } + MD_Node *new_params_root = view->params_roots[view->params_write_gen%ArrayCount(view->params_arenas)]; + MD_Node *key_node = md_child_from_string(new_params_root, key, 0); + if(md_node_is_nil(key_node)) + { + String8 key_copy = push_str8_copy(new_params_arena, key); + key_node = md_push_node(new_params_arena, MD_NodeKind_Main, MD_NodeFlag_Identifier, key_copy, key_copy, 0); + md_node_push_child(new_params_root, key_node); + } + key_node->first = key_node->last = &md_nil_node; + String8 value_copy = push_str8_copy(new_params_arena, value); + MD_TokenizeResult value_tokenize = md_tokenize_from_text(new_params_arena, value_copy); + MD_ParseResult value_parse = md_parse_from_text_tokens(new_params_arena, str8_zero(), value_copy, value_tokenize.tokens); + for(MD_EachNode(child, value_parse.root->first)) + { + child->parent = key_node; + } + key_node->first = value_parse.root->first; + key_node->last = value_parse.root->last; +} + +internal void +df_store_paramf(DF_View *view, String8 key, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + df_store_param(view, key, string); + va_end(args); + scratch_end(scratch); +} + //////////////////////////////// //~ rjf: Expand-Keyed Transient View Functions @@ -3449,7 +3498,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { df_push_interact_regs(); DF_ViewCmdFunctionType *do_view_cmds_function = view->spec->info.cmd_hook; - do_view_cmds_function(ws, panel, view, view->params_roots[view->params_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size), cmds); + do_view_cmds_function(ws, panel, view, view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size), cmds); DF_InteractRegs *view_regs = df_pop_interact_regs(); if(panel == ws->focused_panel) { @@ -3675,7 +3724,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { DF_ViewSpec *view_spec = view->spec; DF_ViewUIFunctionType *build_view_ui_function = view_spec->info.ui_hook; - build_view_ui_function(ws, &df_g_nil_panel, view, view->params_roots[view->params_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size), view_preview_container->rect); + build_view_ui_function(ws, &df_g_nil_panel, view, view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size), view_preview_container->rect); } } } @@ -6132,7 +6181,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { DF_ViewSpec *view_spec = view->spec; DF_ViewUIFunctionType *build_view_ui_function = view_spec->info.ui_hook; - build_view_ui_function(ws, &df_g_nil_panel, view, view->params_roots[view->params_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size), query_container_content_rect); + build_view_ui_function(ws, &df_g_nil_panel, view, view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size), query_container_content_rect); } //- rjf: query submission @@ -7289,7 +7338,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) { DF_View *view = df_selected_tab_from_panel(panel); DF_ViewUIFunctionType *build_view_ui_function = view->spec->info.ui_hook; - build_view_ui_function(ws, panel, view, view->params_roots[view->params_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size), content_rect); + build_view_ui_function(ws, panel, view, view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size), content_rect); } //- rjf: fill with per-view states, after the view has a chance to run @@ -9453,7 +9502,7 @@ df_cfg_strings_from_gfx(Arena *arena, String8 root_path, DF_CfgSrc source) str8_lit("selected"), }; MD_NodeRec rec = {0}; - MD_Node *params_root = view->params_roots[view->params_gen%ArrayCount(view->params_roots)]; + MD_Node *params_root = view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)]; for(MD_Node *n = params_root; !md_node_is_nil(n); n = rec.next) @@ -14120,6 +14169,17 @@ df_gfx_begin_frame(Arena *arena, DF_CmdList *cmds) } } + //- rjf: commit params changes for all views + { + for(DF_View *v = df_gfx_state->first_view; !df_view_is_nil(v); v = v->alloc_next) + { + if(v->params_write_gen == v->params_read_gen+1) + { + v->params_read_gen += 1; + } + } + } + ProfEnd(); } diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index a8790a6a..94f11432 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -242,7 +242,8 @@ struct DF_View // rjf: params tree state Arena *params_arenas[2]; MD_Node *params_roots[2]; - U64 params_gen; + U64 params_write_gen; + U64 params_read_gen; // rjf: text query state TxtPt query_cursor; @@ -970,6 +971,11 @@ internal void *df_view_get_or_push_user_state(DF_View *view, U64 size); internal Arena *df_view_push_arena_ext(DF_View *view); #define df_view_user_state(view, type) (type *)df_view_get_or_push_user_state((view), sizeof(type)) +//- rjf: param saving +internal void df_store_param(DF_View *view, String8 key, String8 value); +internal void df_store_paramf(DF_View *view, String8 key, char *fmt, ...); +#define df_store_param_f32(view, key, f32) df_store_paramf((view), (key), "%ff", (f32)) + //////////////////////////////// //~ rjf: Expand-Keyed Transient View Functions diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 1aa0820a..9d8e770f 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -2773,7 +2773,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS //- rjf: build UI_PermissionFlags(UI_PermissionFlag_Clicks|UI_PermissionFlag_ScrollX) { - canvas_view_spec->info.ui_hook(ws, &df_g_nil_panel, canvas_view, canvas_view->params_roots[canvas_view->params_gen%ArrayCount(canvas_view->params_roots)], str8(canvas_view->query_buffer, canvas_view->query_string_size), canvas_rect); + canvas_view_spec->info.ui_hook(ws, &df_g_nil_panel, canvas_view, canvas_view->params_roots[canvas_view->params_read_gen%ArrayCount(canvas_view->params_roots)], str8(canvas_view->query_buffer, canvas_view->query_string_size), canvas_rect); } //- rjf: pop interaction registers @@ -3284,38 +3284,38 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS //~ rjf: Bitmap Views internal Vec2F32 -df_bitmap_screen_from_canvas_pos(DF_BitmapViewState *bvs, Rng2F32 rect, Vec2F32 cvs) +df_bitmap_screen_from_canvas_pos(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Vec2F32 cvs) { Vec2F32 scr = { - (rect.x0+rect.x1)/2 + (cvs.x - bvs->view_center_pos.x) * bvs->zoom, - (rect.y0+rect.y1)/2 + (cvs.y - bvs->view_center_pos.y) * bvs->zoom, + (rect.x0+rect.x1)/2 + (cvs.x - view_center_pos.x) * zoom, + (rect.y0+rect.y1)/2 + (cvs.y - view_center_pos.y) * zoom, }; return scr; } internal Rng2F32 -df_bitmap_screen_from_canvas_rect(DF_BitmapViewState *bvs, Rng2F32 rect, Rng2F32 cvs) +df_bitmap_screen_from_canvas_rect(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Rng2F32 cvs) { - Rng2F32 scr = r2f32(df_bitmap_screen_from_canvas_pos(bvs, rect, cvs.p0), df_bitmap_screen_from_canvas_pos(bvs, rect, cvs.p1)); + Rng2F32 scr = r2f32(df_bitmap_screen_from_canvas_pos(view_center_pos, zoom, rect, cvs.p0), df_bitmap_screen_from_canvas_pos(view_center_pos, zoom, rect, cvs.p1)); return scr; } internal Vec2F32 -df_bitmap_canvas_from_screen_pos(DF_BitmapViewState *bvs, Rng2F32 rect, Vec2F32 scr) +df_bitmap_canvas_from_screen_pos(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Vec2F32 scr) { Vec2F32 cvs = { - (scr.x - (rect.x0+rect.x1)/2) / bvs->zoom + bvs->view_center_pos.x, - (scr.y - (rect.y0+rect.y1)/2) / bvs->zoom + bvs->view_center_pos.y, + (scr.x - (rect.x0+rect.x1)/2) / zoom + view_center_pos.x, + (scr.y - (rect.y0+rect.y1)/2) / zoom + view_center_pos.y, }; return cvs; } internal Rng2F32 -df_bitmap_canvas_from_screen_rect(DF_BitmapViewState *bvs, Rng2F32 rect, Rng2F32 scr) +df_bitmap_canvas_from_screen_rect(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Rng2F32 scr) { - Rng2F32 cvs = r2f32(df_bitmap_canvas_from_screen_pos(bvs, rect, scr.p0), df_bitmap_canvas_from_screen_pos(bvs, rect, scr.p1)); + Rng2F32 cvs = r2f32(df_bitmap_canvas_from_screen_pos(view_center_pos, zoom, rect, scr.p0), df_bitmap_canvas_from_screen_pos(view_center_pos, zoom, rect, scr.p1)); return cvs; } @@ -8043,9 +8043,9 @@ internal UI_BOX_CUSTOM_DRAW(df_bitmap_box_draw) internal UI_BOX_CUSTOM_DRAW(df_bitmap_view_canvas_box_draw) { - DF_BitmapViewState *bvs = (DF_BitmapViewState *)user_data; + DF_BitmapCanvasBoxDrawData *draw_data = (DF_BitmapCanvasBoxDrawData *)user_data; Rng2F32 rect_scrn = box->rect; - Rng2F32 rect_cvs = df_bitmap_canvas_from_screen_rect(bvs, rect_scrn, rect_scrn); + Rng2F32 rect_cvs = df_bitmap_canvas_from_screen_rect(draw_data->view_center_pos, draw_data->zoom, rect_scrn, rect_scrn); F32 grid_cell_size_cvs = box->font_size*10.f; F32 grid_line_thickness_px = Max(2.f, box->font_size*0.1f); Vec4F32 grid_line_color = df_rgba_from_theme_color(DF_ThemeColor_TextWeak); @@ -8057,7 +8057,7 @@ internal UI_BOX_CUSTOM_DRAW(df_bitmap_view_canvas_box_draw) { Vec2F32 p_cvs = {0}; p_cvs.v[axis] = v; - Vec2F32 p_scr = df_bitmap_screen_from_canvas_pos(bvs, rect_scrn, p_cvs); + Vec2F32 p_scr = df_bitmap_screen_from_canvas_pos(draw_data->view_center_pos, draw_data->zoom, rect_scrn, p_cvs); Rng2F32 rect = {0}; rect.p0.v[axis] = p_scr.v[axis] - grid_line_thickness_px/2; rect.p1.v[axis] = p_scr.v[axis] + grid_line_thickness_px/2; @@ -8068,23 +8068,28 @@ internal UI_BOX_CUSTOM_DRAW(df_bitmap_view_canvas_box_draw) } } -DF_VIEW_SETUP_FUNCTION_DEF(Bitmap) -{ - DF_BitmapViewState *bvs = df_view_user_state(view, DF_BitmapViewState); - bvs->zoom = 1.f; -} - -DF_VIEW_CMD_FUNCTION_DEF(Bitmap) -{ -} - +DF_VIEW_SETUP_FUNCTION_DEF(Bitmap) {} +DF_VIEW_CMD_FUNCTION_DEF(Bitmap) {} DF_VIEW_UI_FUNCTION_DEF(Bitmap) { - DF_BitmapViewState *bvs = df_view_user_state(view, DF_BitmapViewState); Temp scratch = scratch_begin(0, 0); HS_Scope *hs_scope = hs_scope_open(); TEX_Scope *tex_scope = tex_scope_open(); + ////////////////////////////// + //- rjf: unpack params + // + F32 zoom = df_value_from_params_key(params, str8_lit("zoom")).f32; + Vec2F32 view_center_pos = + { + df_value_from_params_key(params, str8_lit("x")).f32, + df_value_from_params_key(params, str8_lit("y")).f32, + }; + if(zoom == 0) + { + zoom = 1.f; + } + ////////////////////////////// //- rjf: evaluate expression // @@ -8112,8 +8117,11 @@ DF_VIEW_UI_FUNCTION_DEF(Bitmap) Rng2F32 canvas_rect = r2f32p(0, 0, canvas_dim.x, canvas_dim.y); UI_Rect(canvas_rect) { + DF_BitmapCanvasBoxDrawData *draw_data = push_array(ui_build_arena(), DF_BitmapCanvasBoxDrawData, 1); + draw_data->view_center_pos = view_center_pos; + draw_data->zoom = zoom; canvas_box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable|UI_BoxFlag_Scroll, "bmp_canvas_%p", view); - ui_box_equip_custom_draw(canvas_box, df_bitmap_view_canvas_box_draw, bvs); + ui_box_equip_custom_draw(canvas_box, df_bitmap_view_canvas_box_draw, draw_data); } ////////////////////////////// @@ -8127,30 +8135,30 @@ DF_VIEW_UI_FUNCTION_DEF(Bitmap) { DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - ui_store_drag_struct(&bvs->view_center_pos); + ui_store_drag_struct(&view_center_pos); } Vec2F32 start_view_center_pos = *ui_get_drag_struct(Vec2F32); Vec2F32 drag_delta_scr = ui_drag_delta(); - Vec2F32 drag_delta_cvs = scale_2f32(drag_delta_scr, 1.f/bvs->zoom); + Vec2F32 drag_delta_cvs = scale_2f32(drag_delta_scr, 1.f/zoom); Vec2F32 new_view_center_pos = sub_2f32(start_view_center_pos, drag_delta_cvs); - bvs->view_center_pos = new_view_center_pos; + view_center_pos = new_view_center_pos; } if(canvas_sig.scroll.y != 0) { - F32 new_zoom = bvs->zoom - bvs->zoom*canvas_sig.scroll.y/10.f; + F32 new_zoom = zoom - zoom*canvas_sig.scroll.y/10.f; new_zoom = Clamp(1.f/256.f, new_zoom, 256.f); Vec2F32 mouse_scr_pre = sub_2f32(ui_mouse(), rect.p0); - Vec2F32 mouse_cvs = df_bitmap_canvas_from_screen_pos(bvs, canvas_rect, mouse_scr_pre); - bvs->zoom = new_zoom; - Vec2F32 mouse_scr_pst = df_bitmap_screen_from_canvas_pos(bvs, canvas_rect, mouse_cvs); + Vec2F32 mouse_cvs = df_bitmap_canvas_from_screen_pos(view_center_pos, zoom, canvas_rect, mouse_scr_pre); + zoom = new_zoom; + Vec2F32 mouse_scr_pst = df_bitmap_screen_from_canvas_pos(view_center_pos, zoom, canvas_rect, mouse_cvs); Vec2F32 drift_scr = sub_2f32(mouse_scr_pst, mouse_scr_pre); - bvs->view_center_pos = add_2f32(bvs->view_center_pos, scale_2f32(drift_scr, 1.f/new_zoom)); + view_center_pos = add_2f32(view_center_pos, scale_2f32(drift_scr, 1.f/new_zoom)); } if(ui_double_clicked(canvas_sig)) { ui_kill_action(); - MemoryZeroStruct(&bvs->view_center_pos); - bvs->zoom = 1.f; + MemoryZeroStruct(&view_center_pos); + zoom = 1.f; } } @@ -8158,7 +8166,7 @@ DF_VIEW_UI_FUNCTION_DEF(Bitmap) //- rjf: calculate image coordinates // Rng2F32 img_rect_cvs = r2f32p(-topology.dim.x/2, -topology.dim.y/2, +topology.dim.x/2, +topology.dim.y/2); - Rng2F32 img_rect_scr = df_bitmap_screen_from_canvas_rect(bvs, canvas_rect, img_rect_cvs); + Rng2F32 img_rect_scr = df_bitmap_screen_from_canvas_rect(view_center_pos, zoom, canvas_rect, img_rect_cvs); ////////////////////////////// //- rjf: image-region canvas interaction @@ -8167,7 +8175,7 @@ DF_VIEW_UI_FUNCTION_DEF(Bitmap) if(ui_hovering(canvas_sig) && !ui_dragging(canvas_sig)) { Vec2F32 mouse_scr = sub_2f32(ui_mouse(), rect.p0); - Vec2F32 mouse_cvs = df_bitmap_canvas_from_screen_pos(bvs, canvas_rect, mouse_scr); + Vec2F32 mouse_cvs = df_bitmap_canvas_from_screen_pos(view_center_pos, zoom, canvas_rect, mouse_scr); if(contains_2f32(img_rect_cvs, mouse_cvs)) { mouse_bmp = v2s32((S32)(mouse_cvs.x-img_rect_cvs.x0), (S32)(mouse_cvs.y-img_rect_cvs.y0)); @@ -8208,7 +8216,7 @@ DF_VIEW_UI_FUNCTION_DEF(Bitmap) if(0 <= mouse_bmp.x && mouse_bmp.x < dim.x && 0 <= mouse_bmp.x && mouse_bmp.x < dim.y) { - F32 pixel_size_scr = 1.f*bvs->zoom; + F32 pixel_size_scr = 1.f*zoom; Rng2F32 indicator_rect_scr = r2f32p(img_rect_scr.x0 + mouse_bmp.x*pixel_size_scr, img_rect_scr.y0 + mouse_bmp.y*pixel_size_scr, img_rect_scr.x0 + (mouse_bmp.x+1)*pixel_size_scr, @@ -8224,6 +8232,13 @@ DF_VIEW_UI_FUNCTION_DEF(Bitmap) } } + ////////////////////////////// + //- rjf: store params + // + df_store_param_f32(view, str8_lit("zoom"), zoom); + df_store_param_f32(view, str8_lit("x"), view_center_pos.x); + df_store_param_f32(view, str8_lit("y"), view_center_pos.y); + hs_scope_close(hs_scope); tex_scope_close(tex_scope); scratch_end(scratch); diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index 3d745a97..221a26c1 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -456,14 +456,6 @@ struct DF_MemoryViewState //////////////////////////////// //~ rjf: Bitmap @view_types -typedef struct DF_BitmapViewState DF_BitmapViewState; -struct DF_BitmapViewState -{ - B32 initialized; - Vec2F32 view_center_pos; - F32 zoom; -}; - typedef struct DF_BitmapBoxDrawData DF_BitmapBoxDrawData; struct DF_BitmapBoxDrawData { @@ -475,6 +467,13 @@ struct DF_BitmapBoxDrawData F32 ui_per_bmp_px; }; +typedef struct DF_BitmapCanvasBoxDrawData DF_BitmapCanvasBoxDrawData; +struct DF_BitmapCanvasBoxDrawData +{ + Vec2F32 view_center_pos; + F32 zoom; +}; + //////////////////////////////// //~ rjf: Settings @view_types @@ -600,9 +599,9 @@ internal void df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, //////////////////////////////// //~ rjf: Bitmap Views -internal Vec2F32 df_bitmap_screen_from_canvas_pos(DF_BitmapViewState *bvs, Rng2F32 rect, Vec2F32 cvs); -internal Rng2F32 df_bitmap_screen_from_canvas_rect(DF_BitmapViewState *bvs, Rng2F32 rect, Rng2F32 cvs); -internal Vec2F32 df_bitmap_canvas_from_screen_pos(DF_BitmapViewState *bvs, Rng2F32 rect, Vec2F32 scr); -internal Rng2F32 df_bitmap_canvas_from_screen_rect(DF_BitmapViewState *bvs, Rng2F32 rect, Rng2F32 scr); +internal Vec2F32 df_bitmap_screen_from_canvas_pos(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Vec2F32 cvs); +internal Rng2F32 df_bitmap_screen_from_canvas_rect(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Rng2F32 cvs); +internal Vec2F32 df_bitmap_canvas_from_screen_pos(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Vec2F32 scr); +internal Rng2F32 df_bitmap_canvas_from_screen_rect(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Rng2F32 scr); #endif // DEBUG_FRONTEND_VIEWS_H diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index ad78f75b..2acbaae2 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -1707,7 +1707,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to if(f_pos < token_string.size) { atom = e_push_expr(arena, E_ExprKind_LeafF32, token_string.str); - atom->value.f32 = (F32)val; + atom->value.f32 = val; } // rjf: no f => f64