roleplay/client/src/main.c

120 lines
4.5 KiB
C

#include "command.h"
#include "render.h"
#include "arpa/inet.h"
#include "ui.h"
#include "vk_mem_alloc.h"
#include "vulkan/vk_enum_string_helper.h"
#include "vulkan/vulkan_core.h"
#include "ft2build.h"
#include FT_FREETYPE_H
VkResult render_thread(GLFWwindow* window, RenderContext* render) {
FT_Library library;
UIContextStorage ui;
UIContainerStorage container;
UILayerStorage layers[2];
FontStorage font;
uint32_t font_index;
TextureStorage texture;
uint32_t texture_index;
VkBuffer transfer;
VmaAllocation transfer_memory;
void* mapped;
VkResult result;
VK_RESULT(create_ui_context(
render->device,
render->allocator,
render->render_pass,
10,
10,
render->swapchain_extent,
render->window_scale,
render->transfer_pool,
render->transfer_queue,
&ui));
if(FT_Init_FreeType(&library) != FT_Err_Ok) {
return VK_ERROR_UNKNOWN;
}
VK_RESULT(load_font(render->device, render->allocator, &ui, render->transfer_pool, render->transfer_queue, library, "test.ttf", 16, VK_TRUE, &font_index, &font));
VK_RESULT(load_texture(render->device, render->allocator, &ui, render->transfer_pool, render->transfer_queue, "test.png", &texture_index, &texture));
VK_RESULT(create_container(0, 0, 200, 200, render->device, render->allocator, render->transfer_pool, render->transfer_queue, &container));
VK_RESULT(create_layer(10, 100, 10, font_index, render->device, render->allocator, render->transfer_pool, render->transfer_queue, &container, &layers[0]));
VK_RESULT(create_layer(10, 100, 10, font_index, render->device, render->allocator, render->transfer_pool, render->transfer_queue, &container, &layers[1]));
VK_RESULT(create_transfer_buffer(render->allocator, 2*sizeof(uint32_t) + 2*sizeof(UIDrawable) + sizeof(UIString) + 100*sizeof(uint32_t), &transfer, &transfer_memory, &mapped));
uint32_t* mapped_count = (uint32_t*)(mapped);
mapped_count[0] = 1;
mapped_count[1] = 1;
UIDrawable* mapped_drawable = (UIDrawable*)(mapped + 2*sizeof(uint32_t));
set_ui_image(0.0, 0.0, 100.0, 200.0, 1.0, 1.0, 1.0, 1.0, texture_index, &mapped_drawable[0]);
set_ui_rect(100.0, 0.0, 100.0, 200.0, 0.0, 1.0, 0.0, 1.0, &mapped_drawable[1]);
UIString* mapped_string = (UIString*)(mapped + 2*sizeof(uint32_t) + 2*sizeof(UIDrawable));
set_ui_string(0.0, 100.0, 32.0, 1.0, 1.0, 1.0, 1.0, 13, 0, &mapped_string[0]);
uint32_t* mapped_codes = (uint32_t*)(mapped + 2*sizeof(uint32_t) + 2*sizeof(UIDrawable) + sizeof(UIString));
VK_RESULT(set_ui_codes("Hello, World!", mapped_codes, 0, font.charmap, font.num_symbols));
VkCommandBuffer command_buffer = command_begin_single(render->device, render->transfer_pool);
command_copy_buffer(command_buffer, transfer, layers[0].layer, 0, offsetof(UILayer, num_drawables), sizeof(uint32_t));
command_copy_buffer(command_buffer, transfer, layers[1].layer, 0, offsetof(UILayer, num_drawables), sizeof(uint32_t));
command_copy_buffer(command_buffer, transfer, layers[1].layer, sizeof(uint32_t), offsetof(UILayer, dispatch_strings) + offsetof(DispatchCommand, x), sizeof(uint32_t));
command_copy_buffer(command_buffer, transfer, layers[0].drawables, 2*sizeof(uint32_t), 0, sizeof(UIDrawable));
command_copy_buffer(command_buffer, transfer, layers[1].drawables, 2*sizeof(uint32_t) + sizeof(UIDrawable), 0, sizeof(UIDrawable));
command_copy_buffer(command_buffer, transfer, layers[1].strings, 2*sizeof(uint32_t) + 2*sizeof(UIDrawable), 0, sizeof(UIString));
command_copy_buffer(command_buffer, transfer, layers[1].codes, 2*sizeof(uint32_t) + 2*sizeof(UIDrawable) + sizeof(UIString), 0, 100*sizeof(uint32_t));
VK_RESULT(command_end_single(render->device, command_buffer, render->transfer_pool, render->transfer_queue));
vkQueueWaitIdle(render->transfer_queue.handle);
destroy_transfer_buffer(render->allocator, transfer, transfer_memory);
while(glfwWindowShouldClose(window) == 0) {
glfwPollEvents();
result = draw_frame(render, &ui, layers, sizeof(layers)/sizeof(UILayerStorage));
if(result != VK_SUCCESS) {
fprintf(stderr, "draw_frame error: %s\n", string_VkResult(result));
return result;
}
}
return 0;
}
int logic_thread() {
return 0;
}
int network_thread() {
return 0;
}
int main() {
GLFWwindow* window = init_window();
if(window == NULL) {
return 1;
}
RenderContext render = {};
if(init_vulkan(window, &render) != VK_SUCCESS) {
return 2;
}
if(render_thread(window, &render) != VK_SUCCESS) {
return 3;
}
return 0;
}