General refactors to various files
* Moved all mapped procedure overloads to grime.odin * Removed extraneous entity_box related procedures * Major refactor to grime_array its header is now allocated as part of its initialization *
This commit is contained in:
		| @@ -8,42 +8,6 @@ pos_within_range2 :: proc( pos : Vec2, range : Range2 ) -> b32 { | ||||
| 	return b32(within_x && within_y) | ||||
| } | ||||
|  | ||||
| box_is_within :: proc( box : ^ Box2, pos : Vec2 ) -> b32 { | ||||
| 	bounds := box_get_bounds( box ) | ||||
| 	within_x_bounds : b32 = pos.x >= bounds.top_left.x     && pos.x <= bounds.bottom_right.x | ||||
| 	within_y_bounds : b32 = pos.y >= bounds.bottom_right.y && pos.y <= bounds.top_left.y | ||||
| 	return within_x_bounds && within_y_bounds | ||||
| } | ||||
|  | ||||
| // Not sure if I should in the future not do the radius check, | ||||
| // As it maybe be better off as a general proc used in an iteration... | ||||
| box_is_within_view :: proc( box : ^ Box2 ) -> b32 | ||||
| { | ||||
| 	state := get_state(); using state | ||||
| 	screen_extent := app_window.extent | ||||
|  | ||||
| 	screen_bounds_radius := max(screen_extent.x, screen_extent.y) | ||||
| 	box_bounds_radius    := max(box.extent.x,    box.extent.y) | ||||
|  | ||||
| 	cam                 := project.workspace.cam | ||||
| 	cam_box_distance    := linalg.distance(cam.target, box.position) | ||||
| 	acceptable_distance := box_bounds_radius + screen_bounds_radius | ||||
|  | ||||
| 	if cam_box_distance > acceptable_distance { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	screen_bounds := view_get_bounds() | ||||
| 	bounds        := box_get_bounds( box ) | ||||
|  | ||||
| 	within_bounds : b32 = false | ||||
|  | ||||
| 	// within_x_bounds : b32 = pos.x >= bounds.top_left.x     && pos.x <= bounds.bottom_right.x | ||||
| 	// within_y_bounds : b32 = pos.y >= bounds.bottom_right.y && pos.y <= bounds.top_left.y | ||||
|  | ||||
| 	return within_bounds | ||||
| } | ||||
|  | ||||
| is_within_screenspace :: proc( pos : Vec2 ) -> b32 { | ||||
| 	state         := get_state(); using state | ||||
| 	screen_extent := state.app_window.extent | ||||
|   | ||||
| @@ -29,18 +29,24 @@ import fmt_io "core:fmt" | ||||
| import "core:mem" | ||||
| 	Allocator               :: mem.Allocator | ||||
| 	AllocatorError          :: mem.Allocator_Error | ||||
| 	AllocatorMode           :: mem.Allocator_Mode | ||||
| 	AllocatorModeSet        :: mem.Allocator_Mode_Set | ||||
| 	alloc                   :: mem.alloc | ||||
| 	alloc_bytes             :: mem.alloc_bytes | ||||
| 	Arena                   :: mem.Arena | ||||
| 	arena_allocator         :: mem.arena_allocator | ||||
| 	arena_init              :: mem.arena_init | ||||
| 	byte_slice              :: mem.byte_slice | ||||
| 	free                    :: mem.free | ||||
| 	ptr_offset              :: mem.ptr_offset | ||||
| 	resize                  :: mem.resize | ||||
| 	slice_ptr               :: mem.slice_ptr | ||||
| 	TrackingAllocator       :: mem.Tracking_Allocator | ||||
| 	tracking_allocator      :: mem.tracking_allocator | ||||
| 	tracking_allocator_init :: mem.tracking_allocator_init | ||||
| import "core:mem/virtual" | ||||
| import "core:odin" | ||||
| 	SourceCodeLocation :: runtime.Source_Code_Location | ||||
| import "core:os" | ||||
| 	FileFlag_Create    :: os.O_CREATE | ||||
| 	FileFlag_ReadWrite :: os.O_RDWR | ||||
| @@ -67,10 +73,20 @@ import "core:unicode/utf8" | ||||
|  | ||||
| OS_Type :: type_of(ODIN_OS) | ||||
|  | ||||
| // Alias Tables | ||||
| context_ext :: proc( $ Type : typeid ) -> (^Type) { | ||||
| 	return cast(^Type) context.user_ptr | ||||
| } | ||||
|  | ||||
| // Proc Name Overloads Alias table | ||||
| // This has to be done on a per-module basis. Most likely can be automated | ||||
|  | ||||
| cm_to_pixels :: proc { | ||||
| 	f32_cm_to_pixels, | ||||
| 	vec2_cm_to_pixels, | ||||
| 	range2_cm_to_pixels, | ||||
| } | ||||
|  | ||||
| get_bounds :: proc { | ||||
| 	box_get_bounds, | ||||
| 	view_get_bounds, | ||||
| } | ||||
|  | ||||
| @@ -78,6 +94,24 @@ is_power_of_two :: proc { | ||||
| 	is_power_of_two_u32, | ||||
| } | ||||
|  | ||||
| pop :: proc { | ||||
| 	stack_pop, | ||||
| 	stack_allocator_pop, | ||||
| } | ||||
|  | ||||
| pressed :: proc { | ||||
| 	btn_pressed, | ||||
| } | ||||
|  | ||||
| push :: proc { | ||||
| 	stack_push, | ||||
| 	stack_allocator_push, | ||||
| } | ||||
|  | ||||
| released :: proc { | ||||
| 	btn_released, | ||||
| } | ||||
|  | ||||
| to_runes :: proc { | ||||
| 	string_to_runes, | ||||
| } | ||||
| @@ -87,6 +121,18 @@ to_string :: proc { | ||||
| 	str_builder_to_string, | ||||
| } | ||||
|  | ||||
| context_ext :: proc( $ Type : typeid ) -> (^Type) { | ||||
| 	return cast(^Type) context.user_ptr | ||||
| pixels_to_cm :: proc { | ||||
| 	f32_pixels_to_cm, | ||||
| 	vec2_pixels_to_cm, | ||||
| 	range2_pixels_to_cm, | ||||
| } | ||||
|  | ||||
| points_to_pixels :: proc { | ||||
| 	f32_points_to_pixels, | ||||
| 	vec2_points_to_pixels, | ||||
| } | ||||
|  | ||||
| ui_set_layout :: proc { | ||||
| 	ui_style_set_layout, | ||||
| 	ui_style_theme_set_layout, | ||||
| } | ||||
|   | ||||
| @@ -8,14 +8,26 @@ import "core:c/libc" | ||||
| import "core:mem" | ||||
| import "core:slice" | ||||
|  | ||||
| Array :: struct ( $ Type : typeid ) { | ||||
| // Array :: struct ( $ Type : typeid ) { | ||||
| // 	allocator : Allocator, | ||||
| // 	capacity  : u64, | ||||
| // 	num       : u64, | ||||
| // 	data      : [^]Type, | ||||
| // } | ||||
|  | ||||
| ArrayHeader :: struct ( $ Type : typeid ) { | ||||
| 	allocator : Allocator, | ||||
| 	capacity  : u64, | ||||
| 	num       : u64, | ||||
| 	data      : [^]Type, | ||||
| } | ||||
|  | ||||
| array_underlying_slice :: proc(slice: []($ Type)) -> Array(Type) { | ||||
| Array :: struct ( $ Type : typeid ) { | ||||
| 	using header : ^ArrayHeader(Type), | ||||
| } | ||||
|  | ||||
| array_underlying_slice :: proc(slice: []($ Type)) -> Array(Type) | ||||
| { | ||||
| 	if len(slice) == 0 { | ||||
| 			return nil | ||||
| 	} | ||||
| @@ -41,17 +53,23 @@ array_init :: proc( $ Type : typeid, allocator : Allocator ) -> ( Array(Type), A | ||||
| 	return array_init_reserve( Type, allocator, array_grow_formula(0) ) | ||||
| } | ||||
|  | ||||
| array_init_reserve :: proc( $ Type : typeid, allocator : Allocator, capacity : u64 ) -> ( Array(Type), AllocatorError ) | ||||
| array_init_reserve :: proc | ||||
| ( $ Type : typeid, allocator : Allocator, capacity : u64 ) -> ( result : Array(Type), alloc_error : AllocatorError ) | ||||
| { | ||||
| 	raw_data, result_code := alloc( size_of(Array) + int(capacity) * size_of(Type), allocator = allocator ) | ||||
| 	result          := cast(^Array(Type)) raw_data; | ||||
| 	result.data      = cast( [^]Type ) (cast( [^]Array(Type)) result)[ 1:] | ||||
| 	header_size :: size_of(ArrayHeader) | ||||
|  | ||||
| 	raw_mem : rawptr | ||||
| 	raw_mem, alloc_error = alloc( header_size + int(capacity) * size_of(Type), allocator = allocator ) | ||||
| 	if alloc_error != AllocatorError.None do return | ||||
|  | ||||
| 	result.header    = cast( ^ArrayHeader(Type)) raw_mem; | ||||
| 	result.allocator = allocator | ||||
| 	result.capacity  = capacity | ||||
| 	return (result ^), result_code | ||||
| 	result.data      = cast( [^]Type ) (cast( [^]ArrayHeader(Type)) result.header)[ 1:] | ||||
| 	return | ||||
| } | ||||
|  | ||||
| array_append :: proc( using self : ^ Array( $ Type), value : Type ) -> AllocatorError | ||||
| array_append :: proc( using self : ^Array( $ Type), value : Type ) -> AllocatorError | ||||
| { | ||||
| 	if num == capacity | ||||
| 	{ | ||||
| @@ -66,7 +84,7 @@ array_append :: proc( using self : ^ Array( $ Type), value : Type ) -> Allocator | ||||
| 	return AllocatorError.None | ||||
| } | ||||
|  | ||||
| array_append_slice :: proc( using self : ^ Array( $ Type ), items : []Type ) -> AllocatorError | ||||
| array_append_slice :: proc( using self : ^Array( $ Type ), items : []Type ) -> AllocatorError | ||||
| { | ||||
| 	if num + len(items) > capacity | ||||
| 	{ | ||||
| @@ -87,7 +105,7 @@ array_append_slice :: proc( using self : ^ Array( $ Type ), items : []Type ) -> | ||||
| 	return AllocatorError.None | ||||
| } | ||||
|  | ||||
| array_append_at :: proc( using self : ^ Array( $ Type ), item : Type, id : u64 ) -> AllocatorError | ||||
| array_append_at :: proc( using self : ^Array( $ Type ), item : Type, id : u64 ) -> AllocatorError | ||||
| { | ||||
| 	id := id | ||||
| 	if id >= num { | ||||
| @@ -119,7 +137,7 @@ array_append_at :: proc( using self : ^ Array( $ Type ), item : Type, id : u64 ) | ||||
| 	return AllocatorError.None | ||||
| } | ||||
|  | ||||
| array_append_at_slice :: proc( using self : ^ Array( $ Type ), items : []Type, id : u64 ) -> AllocatorError | ||||
| array_append_at_slice :: proc( using self : ^Array( $ Type ), items : []Type, id : u64 ) -> AllocatorError | ||||
| { | ||||
| 	id := id | ||||
| 	if id >= num { | ||||
| @@ -150,18 +168,28 @@ array_append_at_slice :: proc( using self : ^ Array( $ Type ), items : []Type, i | ||||
| 	return AllocatorError.None | ||||
| } | ||||
|  | ||||
| array_back :: proc( using self : ^ Array( $ Type ) ) -> ^ Type { | ||||
| array_push_back :: proc( using self : Array( $ Type)) -> b32 { | ||||
| 	if num == capacity { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	data[ num ] = value | ||||
| 	num        += 1 | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| array_back :: proc( using self : Array( $ Type ) ) -> ( ^Type) { | ||||
| 	return & data[ num - 1 ] | ||||
| } | ||||
|  | ||||
| array_clear :: proc( using self : ^ Array( $ Type ), zero_data : b32 ) { | ||||
| array_clear :: proc( using self : Array( $ Type ), zero_data : b32 ) { | ||||
| 	if zero_data { | ||||
| 		mem.set( raw_data( data ), 0, num ) | ||||
| 	} | ||||
| 	num = 0 | ||||
| } | ||||
|  | ||||
| array_fill :: proc( using self : ^ Array( $ Type ), begin, end : u64, value : Type ) -> b32 | ||||
| array_fill :: proc( using self : Array( $ Type ), begin, end : u64, value : Type ) -> b32 | ||||
| { | ||||
| 	if begin < 0 || end >= num { | ||||
| 		return false | ||||
| @@ -177,12 +205,12 @@ array_fill :: proc( using self : ^ Array( $ Type ), begin, end : u64, value : Ty | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| array_free :: proc( using self : ^ Array( $ Type ) ) { | ||||
| array_free :: proc( using self : Array( $ Type ) ) { | ||||
| 	free( data, allocator ) | ||||
| 	data = nil | ||||
| 	self.data = nil | ||||
| } | ||||
|  | ||||
| array_grow :: proc( using self : ^ Array( $ Type ), min_capacity : u64 ) -> AllocatorError | ||||
| array_grow :: proc( using self : ^Array( $ Type ), min_capacity : u64 ) -> AllocatorError | ||||
| { | ||||
| 	new_capacity := array_grow_formula( capacity ) | ||||
|  | ||||
| @@ -192,12 +220,12 @@ array_grow :: proc( using self : ^ Array( $ Type ), min_capacity : u64 ) -> Allo | ||||
| 	return array_set_capacity( self, new_capacity ) | ||||
| } | ||||
|  | ||||
| array_pop :: proc( using self : ^ Array( $ Type ) ) { | ||||
| array_pop :: proc( using self : Array( $ Type ) ) { | ||||
| 	verify( num != 0, "Attempted to pop an array with no elements" ) | ||||
| 	num -= 1 | ||||
| } | ||||
|  | ||||
| array_remove_at :: proc( using self : ^ Array( $ Type ), id : u64 ) | ||||
| array_remove_at :: proc( using self : Array( $ Type ), id : u64 ) | ||||
| { | ||||
| 	verify( id >= num, "Attempted to remove from an index larger than the array" ) | ||||
|  | ||||
| @@ -208,7 +236,7 @@ array_remove_at :: proc( using self : ^ Array( $ Type ), id : u64 ) | ||||
| 	num -= 1 | ||||
| } | ||||
|  | ||||
| array_reserve :: proc( using self : ^ Array( $ Type ), new_capacity : u64 ) -> AllocatorError | ||||
| array_reserve :: proc( using self : ^Array( $ Type ), new_capacity : u64 ) -> AllocatorError | ||||
| { | ||||
| 	if capacity < new_capacity { | ||||
| 		return array_set_capacity( self, new_capacity ) | ||||
| @@ -216,7 +244,7 @@ array_reserve :: proc( using self : ^ Array( $ Type ), new_capacity : u64 ) -> A | ||||
| 	return AllocatorError.None | ||||
| } | ||||
|  | ||||
| array_resize :: proc( array : ^ Array( $ Type ), num : u64 ) -> AllocatorError | ||||
| array_resize :: proc( array : ^Array( $ Type ), num : u64 ) -> AllocatorError | ||||
| { | ||||
| 	if array.capacity < num | ||||
| 	{ | ||||
| @@ -230,23 +258,33 @@ array_resize :: proc( array : ^ Array( $ Type ), num : u64 ) -> AllocatorError | ||||
| 	return AllocatorError.None | ||||
| } | ||||
|  | ||||
| array_set_capacity :: proc( using self : ^ Array( $ Type ), new_capacity : u64 ) -> AllocatorError | ||||
| array_set_capacity :: proc( self : ^Array( $ Type ), new_capacity : u64 ) -> AllocatorError | ||||
| { | ||||
| 	if new_capacity == capacity { | ||||
| 	if new_capacity == self.capacity { | ||||
| 		return AllocatorError.None | ||||
| 	} | ||||
| 	if new_capacity < num { | ||||
| 		num = new_capacity | ||||
| 	if new_capacity < self.num { | ||||
| 		self.num = new_capacity | ||||
| 		return AllocatorError.None | ||||
| 	} | ||||
|  | ||||
| 	new_data, result_code := alloc( cast(int) new_capacity * size_of(Type), allocator = allocator ) | ||||
| 	header_size :: size_of(ArrayHeader(Type)) | ||||
|  | ||||
| 	new_size := header_size + cast(int) new_capacity  * size_of(Type) | ||||
| 	old_size := header_size + cast(int) self.capacity * size_of(Type) | ||||
|  | ||||
| 	new_mem, result_code := resize( self.header, old_size, new_size, allocator = self.allocator ) | ||||
| 	if result_code != AllocatorError.None { | ||||
| 		ensure( false, "Failed to allocate for new array capacity" ) | ||||
| 		return result_code | ||||
| 	} | ||||
| 	free( data ) | ||||
| 	data     = cast( [^] Type ) new_data | ||||
| 	capacity = new_capacity | ||||
|  | ||||
| 	using new_self : Array(Type) | ||||
| 	header      = cast( ^ArrayHeader(Type)) new_mem; | ||||
| 	data        = cast( [^]Type ) (cast( [^]ArrayHeader(Type)) header)[ 1:] | ||||
| 	capacity    = new_capacity | ||||
| 	num         = self.num | ||||
|  | ||||
| 	(self ^) = new_self | ||||
| 	return result_code | ||||
| } | ||||
|   | ||||
| @@ -4,7 +4,8 @@ | ||||
|  | ||||
| // This implementation uses two ZPL-Based Arrays to hold entires and the actual hash table. | ||||
| // Its algorithim isn't that great, removal of elements is very expensive. | ||||
| // To the point where if thats done quite a bit another implementation should be looked at. | ||||
| // Growing the hashtable doesn't do a resize on the original arrays properly, leading to completely discarded memory. | ||||
| // Its recommended to use something closer to raddbg's implementation for greater flexibility. | ||||
| package sectr | ||||
|  | ||||
| import "core:slice" | ||||
| @@ -40,7 +41,8 @@ zpl_hmap_init :: proc( $ Type : typeid, allocator : Allocator ) -> ( HMapZPL( Ty | ||||
| 	return zpl_hmap_init_reserve( Type, allocator ) | ||||
| } | ||||
|  | ||||
| zpl_hmap_init_reserve :: proc( $ Type : typeid, allocator : Allocator, num : u64 ) -> ( HMapZPL( Type), AllocatorError ) | ||||
| zpl_hmap_init_reserve :: proc | ||||
| ( $ Type : typeid, allocator : Allocator, num : u64 ) -> ( HMapZPL( Type), AllocatorError ) | ||||
| { | ||||
| 	result                        : HMapZPL(Type) | ||||
| 	hashes_result, entries_result : AllocatorError | ||||
| @@ -72,8 +74,8 @@ zpl_hmap_clear :: proc( using self : ^ HMapZPL( $ Type ) ) { | ||||
|  | ||||
| zpl_hmap_destroy :: proc( using self : ^ HMapZPL( $ Type ) ) { | ||||
| 	if hashes.data != nil && hashes.capacity > 0 { | ||||
| 		array_free( & hashes ) | ||||
| 		array_free( & entries ) | ||||
| 		array_free( hashes ) | ||||
| 		array_free( entries ) | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -21,14 +21,6 @@ btn_released :: proc ( btn : DigitalBtn ) -> b32 { | ||||
| 	return btn.ended_down == false && btn.half_transitions > 0 | ||||
| } | ||||
|  | ||||
| pressed :: proc { | ||||
| 	btn_pressed, | ||||
| } | ||||
|  | ||||
| released :: proc { | ||||
| 	btn_released, | ||||
| } | ||||
|  | ||||
| MaxKeyboardKeys :: 256 | ||||
| KeyboardKey :: enum u32 { | ||||
| 	null = 0x00, | ||||
|   | ||||
| @@ -21,22 +21,7 @@ when ODIN_OS == OS_Type.Windows { | ||||
| 	// 1 inch = 2.54 cm, 96 inch * 2.54 = 243.84 DPCM | ||||
| } | ||||
|  | ||||
| cm_to_pixels :: proc { | ||||
| 	f32_cm_to_pixels, | ||||
| 	vec2_cm_to_pixels, | ||||
| 	range2_cm_to_pixels, | ||||
| } | ||||
|  | ||||
| pixels_to_cm :: proc { | ||||
| 	f32_pixels_to_cm, | ||||
| 	vec2_pixels_to_cm, | ||||
| 	range2_pixels_to_cm, | ||||
| } | ||||
|  | ||||
| points_to_pixels :: proc { | ||||
| 	f32_points_to_pixels, | ||||
| 	vec2_points_to_pixels, | ||||
| } | ||||
|  | ||||
| //region Unit Conversion Impl | ||||
|  | ||||
|   | ||||
| @@ -12,7 +12,8 @@ debug_draw_text :: proc( content : string, pos : Vec2, size : f32, color : rl.Co | ||||
| 		return | ||||
| 	} | ||||
| 	runes, alloc_error := to_runes( content, context.temp_allocator ) | ||||
| 	verify( alloc_error == AllocatorError.None, "Failed to temp allocate runes" ) | ||||
| 	// runes, alloc_error := to_runes( content, context.temp_allocator ) | ||||
| 	// verify( alloc_error == AllocatorError.None, "Failed to temp allocate runes" ) | ||||
|  | ||||
| 	font := font | ||||
| 	if font.key == Font_Default.key { | ||||
|   | ||||
							
								
								
									
										13
									
								
								code/ui.odin
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								code/ui.odin
									
									
									
									
									
								
							| @@ -268,8 +268,8 @@ UI_State :: struct { | ||||
| 	layout_dirty  : b32, | ||||
|  | ||||
| 	// TODO(Ed) : Look into using a build arena like Ryan does for these possibly (and thus have a linked-list stack) | ||||
| 	theme_stack   : Stack( UI_StyleTheme, UI_Style_Stack_Size ), | ||||
| 	parent_stack  : Stack( ^ UI_Box, UI_Parent_Stack_Size ), | ||||
| 	theme_stack   : StackFixed( UI_StyleTheme, UI_Style_Stack_Size ), | ||||
| 	parent_stack  : StackFixed( ^ UI_Box, UI_Parent_Stack_Size ), | ||||
| 	// flag_stack    : Stack( UI_BoxFlags, UI_BoxFlags_Stack_Size ), | ||||
|  | ||||
| 	hot            : UI_Key, | ||||
| @@ -558,11 +558,11 @@ ui_style_set_layout :: proc ( layout : UI_Layout, preset : UI_StylePreset ) { | ||||
| } | ||||
|  | ||||
| ui_style_theme_push :: proc( preset : UI_StyleTheme ) { | ||||
| 	stack_push( & get_state().ui_context.theme_stack, preset ) | ||||
| 	push( & get_state().ui_context.theme_stack, preset ) | ||||
| } | ||||
|  | ||||
| ui_style_theme_pop :: proc() { | ||||
| 	stack_pop( & get_state().ui_context.theme_stack ) | ||||
| 	pop( & get_state().ui_context.theme_stack ) | ||||
| } | ||||
|  | ||||
| @(deferred_none = ui_style_theme_pop) | ||||
| @@ -575,8 +575,3 @@ ui_style_theme_set_layout :: proc ( layout : UI_Layout ) { | ||||
| 		preset.layout = layout | ||||
| 	} | ||||
| } | ||||
|  | ||||
| ui_set_layout :: proc { | ||||
| 	ui_style_set_layout, | ||||
| 	ui_style_theme_set_layout, | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user