|  |  |  | @ -54,12 +54,10 @@ void* network_thread(void* data) { | 
		
	
		
			
				|  |  |  |  |   return NULL; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | VkResult add_hex_region(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |   VkResult result; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | uint32_t add_hex_region(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |   HexRegion* region; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   VK_RESULT(allocate_hex_region(0, 0, 0, context->hex->data.current_map, ®ion, context->hex, context->render)); | 
		
	
		
			
				|  |  |  |  |   allocate_hex_region(0, 0, 0, context->hex->data.current_map, ®ion, context->hex, context->render); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   for(uint32_t hex = 0; hex < REGION_HEX_COUNT; hex++) { | 
		
	
		
			
				|  |  |  |  |     region->data.hexes[hex].color[0] = 0xFFFFFFFF; | 
		
	
	
		
			
				
					|  |  |  | @ -78,9 +76,16 @@ VkResult add_hex_region(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |     region->data.hexes[hex].height[5] = 0; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   VK_RESULT(set_hex_region(region, context->hex, context->render)); | 
		
	
		
			
				|  |  |  |  |   set_hex_region(region, context->hex, context->render); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   return VK_SUCCESS; | 
		
	
		
			
				|  |  |  |  |   uint32_t i = 0; | 
		
	
		
			
				|  |  |  |  |   for(; i < MAX_LOADED_REGIONS; i++) { | 
		
	
		
			
				|  |  |  |  |     if(region == context->hex->regions[i]) { | 
		
	
		
			
				|  |  |  |  |       break; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   return i; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | char region_info_strs[][20] = { | 
		
	
	
		
			
				
					|  |  |  | @ -172,6 +177,56 @@ VkResult region_info_ui(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |   return create_container(®ion_info, context->render, context->ui); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | VkResult update_region_info_ui(ClientContext* context) {  | 
		
	
		
			
				|  |  |  |  |   VkResult result; | 
		
	
		
			
				|  |  |  |  |   HexRegion* selected_region = context->hex->regions[context->selected_region]; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   snprintf(region_info_strs[0], | 
		
	
		
			
				|  |  |  |  |       sizeof(region_info_strs[0]), | 
		
	
		
			
				|  |  |  |  |       "Region %4d", context->selected_region); | 
		
	
		
			
				|  |  |  |  |   VK_RESULT(update_ui_string(region_info_strs[0], 0, 0, 0, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   if(selected_region == NULL) { | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         region_info_strs[1], | 
		
	
		
			
				|  |  |  |  |         sizeof(region_info_strs[1]), | 
		
	
		
			
				|  |  |  |  |         ""); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(region_info_strs[1], 0, 0, 1, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         region_info_strs[2], | 
		
	
		
			
				|  |  |  |  |         sizeof(region_info_strs[2]), | 
		
	
		
			
				|  |  |  |  |         ""); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(region_info_strs[2], 0, 0, 2, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         region_info_strs[3], | 
		
	
		
			
				|  |  |  |  |         sizeof(region_info_strs[3]), | 
		
	
		
			
				|  |  |  |  |         ""); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(region_info_strs[3], 0, 0, 3, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |   } else { | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         region_info_strs[1], | 
		
	
		
			
				|  |  |  |  |         sizeof(region_info_strs[1]), | 
		
	
		
			
				|  |  |  |  |         "Q: %4d", selected_region->data.q); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(region_info_strs[1], 0, 0, 1, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         region_info_strs[2], | 
		
	
		
			
				|  |  |  |  |         sizeof(region_info_strs[2]), | 
		
	
		
			
				|  |  |  |  |         "R: %4d", selected_region->data.r); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(region_info_strs[2], 0, 0, 2, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     snprintf( | 
		
	
		
			
				|  |  |  |  |         region_info_strs[3], | 
		
	
		
			
				|  |  |  |  |         sizeof(region_info_strs[3]), | 
		
	
		
			
				|  |  |  |  |         "Y: %4d", selected_region->data.y); | 
		
	
		
			
				|  |  |  |  |     VK_RESULT(update_ui_string(region_info_strs[3], 0, 0, 3, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   return VK_SUCCESS; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | VkResult main_thread(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  |   VkResult result; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -194,52 +249,7 @@ VkResult main_thread(ClientContext* context) { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     if(context->selected_region != context->last_selected_region) { | 
		
	
		
			
				|  |  |  |  |       context->last_selected_region = context->selected_region; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |       HexRegion* selected_region = context->hex->regions[context->selected_region]; | 
		
	
		
			
				|  |  |  |  |       snprintf(region_info_strs[0], | 
		
	
		
			
				|  |  |  |  |           sizeof(region_info_strs[0]), | 
		
	
		
			
				|  |  |  |  |           "Region %4d", context->selected_region); | 
		
	
		
			
				|  |  |  |  |       VK_RESULT(update_ui_string(region_info_strs[0], 0, 0, 0, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |       if(selected_region == NULL) { | 
		
	
		
			
				|  |  |  |  |         snprintf( | 
		
	
		
			
				|  |  |  |  |             region_info_strs[1], | 
		
	
		
			
				|  |  |  |  |             sizeof(region_info_strs[1]), | 
		
	
		
			
				|  |  |  |  |             ""); | 
		
	
		
			
				|  |  |  |  |         VK_RESULT(update_ui_string(region_info_strs[1], 0, 0, 1, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         snprintf( | 
		
	
		
			
				|  |  |  |  |             region_info_strs[2], | 
		
	
		
			
				|  |  |  |  |             sizeof(region_info_strs[2]), | 
		
	
		
			
				|  |  |  |  |             ""); | 
		
	
		
			
				|  |  |  |  |         VK_RESULT(update_ui_string(region_info_strs[2], 0, 0, 2, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         snprintf( | 
		
	
		
			
				|  |  |  |  |             region_info_strs[3], | 
		
	
		
			
				|  |  |  |  |             sizeof(region_info_strs[3]), | 
		
	
		
			
				|  |  |  |  |             ""); | 
		
	
		
			
				|  |  |  |  |         VK_RESULT(update_ui_string(region_info_strs[3], 0, 0, 3, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |       } else { | 
		
	
		
			
				|  |  |  |  |         snprintf( | 
		
	
		
			
				|  |  |  |  |             region_info_strs[1], | 
		
	
		
			
				|  |  |  |  |             sizeof(region_info_strs[1]), | 
		
	
		
			
				|  |  |  |  |             "Q: %4d", selected_region->data.q); | 
		
	
		
			
				|  |  |  |  |         VK_RESULT(update_ui_string(region_info_strs[1], 0, 0, 1, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         snprintf( | 
		
	
		
			
				|  |  |  |  |             region_info_strs[2], | 
		
	
		
			
				|  |  |  |  |             sizeof(region_info_strs[2]), | 
		
	
		
			
				|  |  |  |  |             "R: %4d", selected_region->data.r); | 
		
	
		
			
				|  |  |  |  |         VK_RESULT(update_ui_string(region_info_strs[2], 0, 0, 2, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         snprintf( | 
		
	
		
			
				|  |  |  |  |             region_info_strs[3], | 
		
	
		
			
				|  |  |  |  |             sizeof(region_info_strs[3]), | 
		
	
		
			
				|  |  |  |  |             "Y: %4d", selected_region->data.y); | 
		
	
		
			
				|  |  |  |  |         VK_RESULT(update_ui_string(region_info_strs[3], 0, 0, 3, context->ui, context->render)); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |       update_region_info_ui(context); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     if((context->key_spin[0] != 0 || context->key_spin[1] != 0 || | 
		
	
	
		
			
				
					|  |  |  | @ -387,7 +397,7 @@ void key_callback(GLFWwindow* window, int key, int scancode, int action, int mod | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   case GLFW_KEY_EQUAL: | 
		
	
		
			
				|  |  |  |  |     if(action == GLFW_PRESS) { | 
		
	
		
			
				|  |  |  |  |       add_hex_region(context); | 
		
	
		
			
				|  |  |  |  |       context->selected_region = add_hex_region(context); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |     break; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -407,6 +417,97 @@ void key_callback(GLFWwindow* window, int key, int scancode, int action, int mod | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |     break; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   case GLFW_KEY_I: | 
		
	
		
			
				|  |  |  |  |     if(action == GLFW_PRESS) { | 
		
	
		
			
				|  |  |  |  |       if(context->hex->regions[context->selected_region] != NULL) { | 
		
	
		
			
				|  |  |  |  |         context->hex->regions[context->selected_region]->data.q += 1; | 
		
	
		
			
				|  |  |  |  |         add_transfer( | 
		
	
		
			
				|  |  |  |  |             &context->hex->regions[context->selected_region]->data.q, | 
		
	
		
			
				|  |  |  |  |             context->hex->regions[context->selected_region]->region, | 
		
	
		
			
				|  |  |  |  |             offsetof(GPUHexRegion, q), | 
		
	
		
			
				|  |  |  |  |             sizeof(uint32_t), | 
		
	
		
			
				|  |  |  |  |             context->render->current_frame, | 
		
	
		
			
				|  |  |  |  |             context->render); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |       update_region_info_ui(context); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |     break; | 
		
	
		
			
				|  |  |  |  |   case GLFW_KEY_K: | 
		
	
		
			
				|  |  |  |  |     if(action == GLFW_PRESS) { | 
		
	
		
			
				|  |  |  |  |       if(context->hex->regions[context->selected_region] != NULL) { | 
		
	
		
			
				|  |  |  |  |         context->hex->regions[context->selected_region]->data.q -= 1; | 
		
	
		
			
				|  |  |  |  |         add_transfer( | 
		
	
		
			
				|  |  |  |  |             &context->hex->regions[context->selected_region]->data.q, | 
		
	
		
			
				|  |  |  |  |             context->hex->regions[context->selected_region]->region, | 
		
	
		
			
				|  |  |  |  |             offsetof(GPUHexRegion, q), | 
		
	
		
			
				|  |  |  |  |             sizeof(uint32_t), | 
		
	
		
			
				|  |  |  |  |             context->render->current_frame, | 
		
	
		
			
				|  |  |  |  |             context->render); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |       update_region_info_ui(context); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |     break; | 
		
	
		
			
				|  |  |  |  |   case GLFW_KEY_J: | 
		
	
		
			
				|  |  |  |  |     if(action == GLFW_PRESS) { | 
		
	
		
			
				|  |  |  |  |       if(context->hex->regions[context->selected_region] != NULL) { | 
		
	
		
			
				|  |  |  |  |         context->hex->regions[context->selected_region]->data.r += 1; | 
		
	
		
			
				|  |  |  |  |         add_transfer( | 
		
	
		
			
				|  |  |  |  |             &context->hex->regions[context->selected_region]->data.r, | 
		
	
		
			
				|  |  |  |  |             context->hex->regions[context->selected_region]->region, | 
		
	
		
			
				|  |  |  |  |             offsetof(GPUHexRegion, r), | 
		
	
		
			
				|  |  |  |  |             sizeof(uint32_t), | 
		
	
		
			
				|  |  |  |  |             context->render->current_frame, | 
		
	
		
			
				|  |  |  |  |             context->render); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |       update_region_info_ui(context); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |     break; | 
		
	
		
			
				|  |  |  |  |   case GLFW_KEY_L: | 
		
	
		
			
				|  |  |  |  |     if(action == GLFW_PRESS) { | 
		
	
		
			
				|  |  |  |  |       if(context->hex->regions[context->selected_region] != NULL) { | 
		
	
		
			
				|  |  |  |  |         context->hex->regions[context->selected_region]->data.r -= 1; | 
		
	
		
			
				|  |  |  |  |         add_transfer( | 
		
	
		
			
				|  |  |  |  |             &context->hex->regions[context->selected_region]->data.r, | 
		
	
		
			
				|  |  |  |  |             context->hex->regions[context->selected_region]->region, | 
		
	
		
			
				|  |  |  |  |             offsetof(GPUHexRegion, r), | 
		
	
		
			
				|  |  |  |  |             sizeof(uint32_t), | 
		
	
		
			
				|  |  |  |  |             context->render->current_frame, | 
		
	
		
			
				|  |  |  |  |             context->render); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |       update_region_info_ui(context); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |     break; | 
		
	
		
			
				|  |  |  |  |   case GLFW_KEY_O: | 
		
	
		
			
				|  |  |  |  |     if(action == GLFW_PRESS) { | 
		
	
		
			
				|  |  |  |  |       if(context->hex->regions[context->selected_region] != NULL) { | 
		
	
		
			
				|  |  |  |  |         context->hex->regions[context->selected_region]->data.y += 1; | 
		
	
		
			
				|  |  |  |  |         add_transfer( | 
		
	
		
			
				|  |  |  |  |             &context->hex->regions[context->selected_region]->data.y, | 
		
	
		
			
				|  |  |  |  |             context->hex->regions[context->selected_region]->region, | 
		
	
		
			
				|  |  |  |  |             offsetof(GPUHexRegion, y), | 
		
	
		
			
				|  |  |  |  |             sizeof(int32_t), | 
		
	
		
			
				|  |  |  |  |             context->render->current_frame, | 
		
	
		
			
				|  |  |  |  |             context->render); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |       update_region_info_ui(context); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |     break; | 
		
	
		
			
				|  |  |  |  |   case GLFW_KEY_U: | 
		
	
		
			
				|  |  |  |  |     if(action == GLFW_PRESS) { | 
		
	
		
			
				|  |  |  |  |       if(context->hex->regions[context->selected_region] != NULL) { | 
		
	
		
			
				|  |  |  |  |         context->hex->regions[context->selected_region]->data.y -= 1; | 
		
	
		
			
				|  |  |  |  |         add_transfer( | 
		
	
		
			
				|  |  |  |  |             &context->hex->regions[context->selected_region]->data.y, | 
		
	
		
			
				|  |  |  |  |             context->hex->regions[context->selected_region]->region, | 
		
	
		
			
				|  |  |  |  |             offsetof(GPUHexRegion, y), | 
		
	
		
			
				|  |  |  |  |             sizeof(int32_t), | 
		
	
		
			
				|  |  |  |  |             context->render->current_frame, | 
		
	
		
			
				|  |  |  |  |             context->render); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |       update_region_info_ui(context); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |     break; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | 
 |