|  |  |  | @ -45,6 +45,10 @@ typedef struct ClientContextStruct { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   uint32_t selected_region; | 
		
	
		
			
				|  |  |  |  |   uint32_t last_selected_region; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   uint32_t last_clicked_region; | 
		
	
		
			
				|  |  |  |  |   uint32_t last_clicked_hex; | 
		
	
		
			
				|  |  |  |  |   uint32_t last_clicked_vertex; | 
		
	
		
			
				|  |  |  |  | } ClientContext; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | void* network_thread(void* data) { | 
		
	
	
		
			
				
					|  |  |  | @ -88,20 +92,97 @@ uint32_t add_hex_region(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |   return i; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | char region_info_strs[][20] = { | 
		
	
		
			
				|  |  |  |  |   "Region XXXX", | 
		
	
		
			
				|  |  |  |  |   "Q: XXXX", | 
		
	
		
			
				|  |  |  |  |   "R: XXXX", | 
		
	
		
			
				|  |  |  |  |   "Y: XXXX", | 
		
	
		
			
				|  |  |  |  | VkResult hex_info_ui(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   GPUString strings[] = { | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 33}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 32, | 
		
	
		
			
				|  |  |  |  |       .offset = 0, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 73}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 16, | 
		
	
		
			
				|  |  |  |  |       .offset = 20, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 93}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 16, | 
		
	
		
			
				|  |  |  |  |       .offset = 40, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 113}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 16, | 
		
	
		
			
				|  |  |  |  |       .offset = 60, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 133}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 16, | 
		
	
		
			
				|  |  |  |  |       .offset = 80, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 153}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 16, | 
		
	
		
			
				|  |  |  |  |       .offset = 100, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 173}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 16, | 
		
	
		
			
				|  |  |  |  |       .offset = 120, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   GPUDrawable drawables[] = { | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 0}, | 
		
	
		
			
				|  |  |  |  |       .size = {225, 200}, | 
		
	
		
			
				|  |  |  |  |       .color = {0.4, 0.4, 0.4, 0.4}, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   LayerInput layer = { | 
		
	
		
			
				|  |  |  |  |     .strings = strings, | 
		
	
		
			
				|  |  |  |  |     .num_strings = sizeof(strings)/sizeof(GPUString), | 
		
	
		
			
				|  |  |  |  |     .max_strings = sizeof(strings)/sizeof(GPUString) + 4, | 
		
	
		
			
				|  |  |  |  |     .max_codes = 200, | 
		
	
		
			
				|  |  |  |  |     .drawables = drawables, | 
		
	
		
			
				|  |  |  |  |     .num_drawables = sizeof(drawables)/sizeof(GPUDrawable), | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | uint32_t region_info_str_off[] = { | 
		
	
		
			
				|  |  |  |  |   0, | 
		
	
		
			
				|  |  |  |  |   11, | 
		
	
		
			
				|  |  |  |  |   18, | 
		
	
		
			
				|  |  |  |  |   25, | 
		
	
		
			
				|  |  |  |  |   ContainerInput container = { | 
		
	
		
			
				|  |  |  |  |     .id = 0x01, | 
		
	
		
			
				|  |  |  |  |     .size = {225, 200}, | 
		
	
		
			
				|  |  |  |  |     .offset = {0, 0}, | 
		
	
		
			
				|  |  |  |  |     .anchor = ANCHOR_BOTTOM_RIGHT, | 
		
	
		
			
				|  |  |  |  |     .layers = &layer, | 
		
	
		
			
				|  |  |  |  |     .layer_count = 1, | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   return create_container(&container, context->render, context->ui); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | VkResult region_info_ui(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   GPUString strings[] = { | 
		
	
	
		
			
				
					|  |  |  | @ -109,43 +190,36 @@ VkResult region_info_ui(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 33}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 32, | 
		
	
		
			
				|  |  |  |  |       .offset = region_info_str_off[0], | 
		
	
		
			
				|  |  |  |  |       .length = strlen(region_info_strs[0]), | 
		
	
		
			
				|  |  |  |  |       .offset = 0, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 33 + 1*40}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 32, | 
		
	
		
			
				|  |  |  |  |       .offset = region_info_str_off[1], | 
		
	
		
			
				|  |  |  |  |       .length = strlen(region_info_strs[1]), | 
		
	
		
			
				|  |  |  |  |       .offset = 11, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 33 + 2*40}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 32, | 
		
	
		
			
				|  |  |  |  |       .offset = region_info_str_off[2], | 
		
	
		
			
				|  |  |  |  |       .length = strlen(region_info_strs[2]), | 
		
	
		
			
				|  |  |  |  |       .offset = 18, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 33 + 3*40}, | 
		
	
		
			
				|  |  |  |  |       .color = {1, 1, 1, 1}, | 
		
	
		
			
				|  |  |  |  |       .size = 32, | 
		
	
		
			
				|  |  |  |  |       .offset = region_info_str_off[3], | 
		
	
		
			
				|  |  |  |  |       .length = strlen(region_info_strs[3]), | 
		
	
		
			
				|  |  |  |  |       .offset = 25, | 
		
	
		
			
				|  |  |  |  |       .length = 0, | 
		
	
		
			
				|  |  |  |  |       .font = 0, | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   uint32_t codes[43/4]; | 
		
	
		
			
				|  |  |  |  |   VkResult result; | 
		
	
		
			
				|  |  |  |  |   VK_RESULT(map_string(region_info_strs[0], codes, region_info_str_off[0], 0, context->ui)); | 
		
	
		
			
				|  |  |  |  |   VK_RESULT(map_string(region_info_strs[1], codes, region_info_str_off[1], 0, context->ui)); | 
		
	
		
			
				|  |  |  |  |   VK_RESULT(map_string(region_info_strs[2], codes, region_info_str_off[2], 0, context->ui)); | 
		
	
		
			
				|  |  |  |  |   VK_RESULT(map_string(region_info_strs[3], codes, region_info_str_off[3], 0, context->ui)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   GPUDrawable drawables[] = { | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |       .pos = {0, 0}, | 
		
	
	
		
			
				
					|  |  |  | @ -158,14 +232,12 @@ VkResult region_info_ui(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |     .strings = strings, | 
		
	
		
			
				|  |  |  |  |     .num_strings = sizeof(strings)/sizeof(GPUString), | 
		
	
		
			
				|  |  |  |  |     .max_strings = sizeof(strings)/sizeof(GPUString) + 4, | 
		
	
		
			
				|  |  |  |  |     .codes = codes, | 
		
	
		
			
				|  |  |  |  |     .num_codes = sizeof(codes)/sizeof(uint32_t), | 
		
	
		
			
				|  |  |  |  |     .max_codes = sizeof(codes)/sizeof(uint32_t) + 100, | 
		
	
		
			
				|  |  |  |  |     .max_codes = 100, | 
		
	
		
			
				|  |  |  |  |     .drawables = drawables, | 
		
	
		
			
				|  |  |  |  |     .num_drawables = sizeof(drawables)/sizeof(GPUDrawable), | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   ContainerInput region_info = { | 
		
	
		
			
				|  |  |  |  |   ContainerInput container = { | 
		
	
		
			
				|  |  |  |  |     .id = 0x01, | 
		
	
		
			
				|  |  |  |  |     .size = {225, 155}, | 
		
	
		
			
				|  |  |  |  |     .offset = {0, 0}, | 
		
	
	
		
			
				
					|  |  |  | @ -174,54 +246,152 @@ VkResult region_info_ui(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |     .layer_count = 1, | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   return create_container(®ion_info, context->render, context->ui); | 
		
	
		
			
				|  |  |  |  |   return create_container(&container, context->render, context->ui); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | VkResult update_region_info_ui(ClientContext* context) {  | 
		
	
		
			
				|  |  |  |  |   char temp[20]; | 
		
	
		
			
				|  |  |  |  |   VkResult result; | 
		
	
		
			
				|  |  |  |  |   HexRegion* selected_region = context->hex->regions[context->selected_region]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   snprintf(region_info_strs[0], | 
		
	
		
			
				|  |  |  |  |       sizeof(region_info_strs[0]), | 
		
	
		
			
				|  |  |  |  |   snprintf(temp, | 
		
	
		
			
				|  |  |  |  |       sizeof(temp), | 
		
	
		
			
				|  |  |  |  |       "Region %4d", context->selected_region); | 
		
	
		
			
				|  |  |  |  |   VK_RESULT(update_ui_string(region_info_strs[0], 0, 0, 0, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |   VK_RESULT(update_ui_string(temp, 0, 0, 0, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   if(selected_region == NULL) { | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         region_info_strs[1], | 
		
	
		
			
				|  |  |  |  |         sizeof(region_info_strs[1]), | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         ""); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(region_info_strs[1], 0, 0, 1, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 0, 0, 1, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         region_info_strs[2], | 
		
	
		
			
				|  |  |  |  |         sizeof(region_info_strs[2]), | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         ""); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(region_info_strs[2], 0, 0, 2, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 0, 0, 2, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         region_info_strs[3], | 
		
	
		
			
				|  |  |  |  |         sizeof(region_info_strs[3]), | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         ""); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(region_info_strs[3], 0, 0, 3, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 0, 0, 3, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |   } else { | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         region_info_strs[1], | 
		
	
		
			
				|  |  |  |  |         sizeof(region_info_strs[1]), | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         "Q: %4d", selected_region->data.q); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(region_info_strs[1], 0, 0, 1, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 0, 0, 1, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         region_info_strs[2], | 
		
	
		
			
				|  |  |  |  |         sizeof(region_info_strs[2]), | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         "R: %4d", selected_region->data.r); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(region_info_strs[2], 0, 0, 2, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 0, 0, 2, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         region_info_strs[3], | 
		
	
		
			
				|  |  |  |  |         sizeof(region_info_strs[3]), | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         "Y: %4d", selected_region->data.y); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(region_info_strs[3], 0, 0, 3, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 0, 0, 3, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   return VK_SUCCESS; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | VkResult update_hex_info_ui(ClientContext* context) {  | 
		
	
		
			
				|  |  |  |  |   char temp[20]; | 
		
	
		
			
				|  |  |  |  |   VkResult result; | 
		
	
		
			
				|  |  |  |  |   HexRegion* region = context->hex->regions[context->hex->data.clicked_region]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   snprintf(temp, | 
		
	
		
			
				|  |  |  |  |       sizeof(temp), | 
		
	
		
			
				|  |  |  |  |       "Hex %d-%d.%d", | 
		
	
		
			
				|  |  |  |  |       context->hex->data.clicked_region, | 
		
	
		
			
				|  |  |  |  |       context->hex->data.clicked_hex, | 
		
	
		
			
				|  |  |  |  |       context->hex->data.clicked_vertex); | 
		
	
		
			
				|  |  |  |  |   VK_RESULT(update_ui_string(temp, 1, 0, 0, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   if(region == NULL) { | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         ""); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 1, 0, 1, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         ""); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 1, 0, 2, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         ""); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 1, 0, 3, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         ""); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 1, 0, 4, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         ""); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 1, 0, 5, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         ""); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 1, 0, 6, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |   } else { | 
		
	
		
			
				|  |  |  |  |     GPUHex* hex = ®ion->data.hexes[context->hex->data.clicked_hex]; | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         "%02.02f %02.02f %02.02f", | 
		
	
		
			
				|  |  |  |  |         hex->height[0], hex->height[1], hex->height[2]); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 1, 0, 1, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         "%02.02f %02.02f %02.02f", | 
		
	
		
			
				|  |  |  |  |         hex->height[3], hex->height[4], hex->height[5]); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 1, 0, 2, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         "%08X", | 
		
	
		
			
				|  |  |  |  |         hex->color[0]); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 1, 0, 3, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         "%08X %08X", | 
		
	
		
			
				|  |  |  |  |         hex->color[1], hex->color[2]); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 1, 0, 4, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         "%08X %08X", | 
		
	
		
			
				|  |  |  |  |         hex->color[3], hex->color[4]); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 1, 0, 5, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         temp, | 
		
	
		
			
				|  |  |  |  |         sizeof(temp), | 
		
	
		
			
				|  |  |  |  |         "%08X %08X", | 
		
	
		
			
				|  |  |  |  |         hex->color[5], hex->color[6]); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(temp, 1, 0, 6, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   return VK_SUCCESS; | 
		
	
	
		
			
				
					|  |  |  | @ -231,6 +401,7 @@ VkResult main_thread(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |   VkResult result; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   VK_RESULT(region_info_ui(context)); | 
		
	
		
			
				|  |  |  |  |   VK_RESULT(hex_info_ui(context)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   //
 | 
		
	
		
			
				|  |  |  |  |   double last_frame_time = 0; | 
		
	
	
		
			
				
					|  |  |  | @ -247,6 +418,15 @@ VkResult main_thread(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     glfwPollEvents(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     if(context->last_clicked_region != context->hex->data.clicked_region || | 
		
	
		
			
				|  |  |  |  |        context->last_clicked_hex != context->hex->data.clicked_hex || | 
		
	
		
			
				|  |  |  |  |        context->last_clicked_vertex != context->hex->data.clicked_vertex) { | 
		
	
		
			
				|  |  |  |  |       context->last_clicked_region = context->hex->data.clicked_region; | 
		
	
		
			
				|  |  |  |  |       context->last_clicked_hex = context->hex->data.clicked_hex; | 
		
	
		
			
				|  |  |  |  |       context->last_clicked_vertex = context->hex->data.clicked_vertex; | 
		
	
		
			
				|  |  |  |  |       update_hex_info_ui(context); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     if(context->selected_region != context->last_selected_region) { | 
		
	
		
			
				|  |  |  |  |       context->last_selected_region = context->selected_region; | 
		
	
		
			
				|  |  |  |  |       update_region_info_ui(context); | 
		
	
	
		
			
				
					|  |  |  | @ -524,6 +704,7 @@ void key_callback(GLFWwindow* window, int key, int scancode, int action, int mod | 
		
	
		
			
				|  |  |  |  |             sizeof(float), | 
		
	
		
			
				|  |  |  |  |             context->render->current_frame, | 
		
	
		
			
				|  |  |  |  |             context->render); | 
		
	
		
			
				|  |  |  |  |         update_hex_info_ui(context); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |     break; | 
		
	
	
		
			
				
					|  |  |  | @ -542,6 +723,7 @@ void key_callback(GLFWwindow* window, int key, int scancode, int action, int mod | 
		
	
		
			
				|  |  |  |  |             sizeof(float), | 
		
	
		
			
				|  |  |  |  |             context->render->current_frame, | 
		
	
		
			
				|  |  |  |  |             context->render); | 
		
	
		
			
				|  |  |  |  |         update_hex_info_ui(context); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |     break; | 
		
	
	
		
			
				
					|  |  |  | @ -646,6 +828,8 @@ int main() { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     .selected_region = MAX_LOADED_REGIONS, | 
		
	
		
			
				|  |  |  |  |     .last_selected_region = 0, | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     .last_clicked_region = MAX_LOADED_REGIONS, | 
		
	
		
			
				|  |  |  |  |   }; | 
		
	
		
			
				|  |  |  |  |   if(context.window == NULL || context.render == NULL || context.ui == NULL || context.hex == NULL) { | 
		
	
		
			
				|  |  |  |  |     return VK_ERROR_OUT_OF_HOST_MEMORY; | 
		
	
	
		
			
				
					|  |  |  | 
 |