#define PAD_TO_8( X ) (((u32)X+0x7) & ~(u32)0x7)
#define PAD_TO_16( X ) (((u32)X+0xf) & ~(u32)0xf)
-static inline f32 f32_min( f32 a, f32 b ){ return a < b? a: b; }
-static inline f32 f32_max( f32 a, f32 b ){ return a > b? a: b; }
+static inline i16 i16_min( i16 a, i16 b ){ return a < b? a: b; }
+static inline i16 i16_max( i16 a, i16 b ){ return a > b? a: b; }
static inline i32 i32_min( i32 a, i32 b ){ return a < b? a: b; }
static inline i32 i32_max( i32 a, i32 b ){ return a > b? a: b; }
static inline i32 u32_min( u32 a, u32 b ){ return a < b? a: b; }
static inline i32 u32_max( u32 a, u32 b ){ return a > b? a: b; }
-static inline i16 i16_min( i16 a, i16 b ){ return a < b? a: b; }
-static inline i16 i16_max( i16 a, i16 b ){ return a > b? a: b; }
-static inline f32 f32_clamp( f32 a, f32 min, f32 max ) { return f32_min( max, f32_max( a, min ) ); }
+static inline f32 f32_min( f32 a, f32 b ){ return a < b? a: b; }
+static inline f32 f32_max( f32 a, f32 b ){ return a > b? a: b; }
+
static inline i16 i16_clamp( i16 a, i16 min, i16 max ){ return i16_min( max, i16_max( a, min ) ); }
-static inline i16 i32_clamp( i32 a, i32 min, i32 max ){ return i32_min( max, i32_max( a, min ) ); }
+static inline i32 i32_clamp( i32 a, i32 min, i32 max ){ return i32_min( max, i32_max( a, min ) ); }
+static inline u32 u32_clamp( u32 a, u32 min, u32 max ){ return u32_min( max, u32_max( a, min ) ); }
+static inline f32 f32_clamp( f32 a, f32 min, f32 max ){ return f32_min( max, f32_max( a, min ) ); }
+
static inline f32 f32_sign( f32 a ) { return a < 0.0f? -1.0f: 1.0f; }
void _exit_init(void);
return action;
}
-void _ui_panel_number( struct ui_panel *panel, const c8 *label,
+enum number_action _ui_panel_number( struct ui_panel *panel, const c8 *label,
void *values,
void *mins,
void *maxs,
i32 *maxs_i32 = maxs;
i32 *start_i32s = (void *)_ui.controls.number.start_values;
+ u32 *values_u32 = values;
+ u32 *mins_u32 = mins;
+ u32 *maxs_u32 = maxs;
+ u32 *start_u32s = (void *)_ui.controls.number.start_values;
+
i16 label_box[4];
union colour tc = (flag & UI_DULL)? _ui_scheme[ k_ui_bg+3 ]: _ui_scheme[ k_ui_fg+3 ];
struct ui_panel cols[3];
_ui_panel_grid( panel, cols, 1, 3, 5, UI_PADDING_PX/2, NULL );
- _ui_panel_number( &cols[0], "CO", values_f32+0, mins_f32? mins_f32+0: NULL,
- maxs_f32? maxs_f32+0: NULL, k_data_type_vec3, UI_LABEL_ABOVE );
- _ui_panel_number( &cols[1], "S", values_f32+3, mins_f32? mins_f32+3: NULL,
- maxs_f32? maxs_f32+3: NULL, k_data_type_vec3, UI_LABEL_ABOVE );
- _ui_panel_number( &cols[2], "Q", values_f32+6, NULL, NULL, k_data_type_quat, UI_LABEL_ABOVE );
- return;
+ enum number_action action =
+ _ui_panel_number( &cols[0], "CO", values_f32+0, mins_f32? mins_f32+0: NULL,
+ maxs_f32? maxs_f32+0: NULL, k_data_type_vec3, UI_LABEL_ABOVE ) |
+ _ui_panel_number( &cols[1], "S", values_f32+3, mins_f32? mins_f32+3: NULL,
+ maxs_f32? maxs_f32+3: NULL, k_data_type_vec3, UI_LABEL_ABOVE ) |
+ _ui_panel_number( &cols[2], "Q", values_f32+6, NULL, NULL, k_data_type_quat, UI_LABEL_ABOVE );
+ return action;
}
+ enum number_action action = k_number_action_none;
+
struct ui_panel grid[3*16];
if( flag & UI_LABEL_ABOVE )
{
up_a = _ui_panel_button( &buttons[2], "+", flag );
enum button_action main_a = _ui_button( buttons[1].content_area );
- b8 modified = 0;
enum data_type single_type = DATATYPE_GET_SINGLE( data_type );
/* inc/dec */
if( down_a == k_button_click )
{
if( single_type == k_data_type_i32 ) values_i32[i] --;
+ else if( single_type == k_data_type_u32 ) values_u32[i] --;
else if( single_type == k_data_type_f32 ) values_f32[i] -= 1.0f;
- modified = 1;
+ action = k_number_action_changed;
}
if( up_a == k_button_click )
{
if( single_type == k_data_type_i32 ) values_i32[i] ++;
+ else if( single_type == k_data_type_u32 ) values_u32[i] ++;
else if( single_type == k_data_type_f32 ) values_f32[i] += 1.0f;
- modified = 1;
+ action = k_number_action_changed;
}
/* slider action */
if( main_a == k_button_click )
{
if( single_type == k_data_type_i32 ) start_i32s[i] = values_i32[i];
+ else if( single_type == k_data_type_u32 ) start_u32s[i] = values_u32[i];
else if( single_type == k_data_type_f32 ) start_f32s[i] = values_f32[i];
}
if( main_a == k_button_repeat )
if( _ui.mouse_mods & UI_KEYBOARD_ALT )
div = 8;
if( single_type == k_data_type_i32 ) values_i32[i] = start_i32s[i] + (delta/div);
+ else if( single_type == k_data_type_u32 ) values_u32[i] = start_u32s[i] + (delta/div);
else if( single_type == k_data_type_f32 ) values_f32[i] = start_f32s[i] + ((f32)delta/(f32)div)/10.0f;
- modified = 1;
+ action = k_number_action_changed;
}
- if( modified && (mins && maxs) )
+ if( (action == k_number_action_changed) && (mins && maxs) )
{
- if( single_type == k_data_type_i32 )
- values_i32[i] = i32_clamp( values_i32[i], mins_i32[i], maxs_i32[i] );
- else if( single_type == k_data_type_f32 )
- values_f32[i] = f32_clamp( values_f32[i], mins_f32[i], maxs_f32[i] );
+ if( single_type == k_data_type_i32 ) values_i32[i] = i32_clamp( values_i32[i], mins_i32[i], maxs_i32[i] );
+ else if( single_type == k_data_type_u32 ) values_u32[i] = u32_clamp( values_u32[i], mins_u32[i], maxs_u32[i] );
+ else if( single_type == k_data_type_f32 ) values_f32[i] = f32_clamp( values_f32[i], mins_f32[i], maxs_f32[i] );
}
c8 buf[32];
{
$v_string( &number_str, $signed( values_i32[i] ) );
}
+ else if( single_type == k_data_type_u32 )
+ {
+ $v_string( &number_str, $unsigned( values_u32[i] ) );
+ }
else if( single_type == k_data_type_f32 )
{
$v_string( &number_str, $float( values_f32[i] ) );
_ui.fiddle.co[1] = buttons[2].content_area[1];
}
}
+ return action;
}
enum dropdown_action _ui_panel_enum( struct ui_panel *panel, const c8 *label, i32 *value,
return action;
}
+enum button_action _ui_panel_checkbox( struct ui_panel *panel, const c8 *label, b8 *value, u32 flag )
+{
+ i16 rect[4];
+ _ui_panel_widget( panel, rect );
+
+ enum button_action action = _ui_panel_button_internal( rect, label, 0 );
+ if( action == k_button_click )
+ *value = (*value) ^ 0x1;
+
+ i16 end_box[4] = { rect[0] + rect[2] - rect[3], rect[1], rect[3], rect[3] };
+ if( *value ) _ui_text( end_box, "\xB3", k_ui_align_center, _ui_scheme[ k_ui_green ] );
+ else _ui_text( end_box, "\xB2", k_ui_align_center, _ui_scheme[ k_ui_red ] );
+ return action;
+}
+
void _ui_panel_heading( struct ui_panel *panel, const c8 *label, u32 flag )
{
i16 kerning[3];
ent->parameter_count ++;
parameter_count ++;
+
+ u32 flag_it = 0;
+ while( keyvalues_foreach( &_assembly, &flag_it, parameter_it, "flag" ) )
+ {
+ ent->parameter_count ++;
+ parameter_count ++;
+ }
}
$v_string( &H, {"};\n"} );
}
$v_string( &C, {", .type = k_data_type_"}, {type} );
$v_string( &C, {", .offset = __builtin_offsetof(struct "}, {ent->name}, {", "}, {name}, {")"} );
$v_string( &C, {" },\n"} );
+
+ u32 flag_it = 0;
+ while( keyvalues_foreach( &_assembly, &flag_it, parameter_it, "flag" ) )
+ {
+ const c8 *flag_name = keyvalues_read_string( &_assembly, flag_it, "name", NULL );
+ ASSERT_CRITICAL( flag_name );
+ const c8 *flag_value = keyvalues_read_string( &_assembly, flag_it, "value", NULL );
+ ASSERT_CRITICAL( flag_value );
+ $v_string( &C, {" { .name = \""}, {name}, {":"},{flag_name},{"\""} );
+ $v_string( &C, {", .type = k_data_format_bit"} );
+ $v_string( &C, {", .offset = __builtin_ctz("}, {flag_value}, {")"} );
+ $v_string( &C, {" },\n"} );
+ }
}
}
$v_string( &C, {"};\n"} );