|
|
|
@ -12,6 +12,9 @@
|
|
|
|
|
#include "vulkan/vulkan_core.h"
|
|
|
|
|
#include "pthread.h"
|
|
|
|
|
#include <math.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
|
|
#define max(a, b) ((a > b) ? a : b)
|
|
|
|
|
|
|
|
|
|
typedef struct ClientContextStruct {
|
|
|
|
|
GLFWwindow* window;
|
|
|
|
@ -21,6 +24,7 @@ typedef struct ClientContextStruct {
|
|
|
|
|
|
|
|
|
|
uint32_t clicked_container;
|
|
|
|
|
uint32_t clicked_element;
|
|
|
|
|
int32_t clicked_hex[2];
|
|
|
|
|
|
|
|
|
|
vec2 cursor;
|
|
|
|
|
|
|
|
|
@ -62,45 +66,14 @@ VkResult main_thread(ClientContext* context) {
|
|
|
|
|
.length = 0,
|
|
|
|
|
.font = 0,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
.pos = {110, 138},
|
|
|
|
|
.size = 32,
|
|
|
|
|
.color = {1.0, 1.0, 1.0, 1.0},
|
|
|
|
|
.offset = 20,
|
|
|
|
|
.length = 1,
|
|
|
|
|
.font = 0,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
.pos = {210, 138},
|
|
|
|
|
.size = 32,
|
|
|
|
|
.color = {1.0, 1.0, 1.0, 1.0},
|
|
|
|
|
.offset = 21,
|
|
|
|
|
.length = 1,
|
|
|
|
|
.font = 0,
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
GPUDrawable drawables[] = {
|
|
|
|
|
{
|
|
|
|
|
.pos = {100, 100},
|
|
|
|
|
.size = {50, 50},
|
|
|
|
|
.color = {1, 0, 0, 1},
|
|
|
|
|
.type = 0,
|
|
|
|
|
.id = 1,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
.pos = {200, 100},
|
|
|
|
|
.size = {50, 50},
|
|
|
|
|
.color = {0, 1, 0, 1},
|
|
|
|
|
.type = 0,
|
|
|
|
|
.id = 2,
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
GPUDrawable drawables[] = {};
|
|
|
|
|
|
|
|
|
|
LayerInput layer = {
|
|
|
|
|
.strings = strings,
|
|
|
|
|
.num_strings = sizeof(strings)/sizeof(GPUString),
|
|
|
|
|
.max_codes = 24,
|
|
|
|
|
.max_codes = 50,
|
|
|
|
|
|
|
|
|
|
.drawables = drawables,
|
|
|
|
|
.num_drawables = sizeof(drawables)/sizeof(GPUDrawable),
|
|
|
|
@ -114,57 +87,30 @@ VkResult main_thread(ClientContext* context) {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
create_container(&container, &context->render, &context->ui);
|
|
|
|
|
map_string("1234", context->ui.containers[0].layers[0].codes_buffer, 20, 0, &context->ui);
|
|
|
|
|
VK_RESULT(add_transfers(
|
|
|
|
|
&context->ui.containers[0].layers[0].codes_buffer[20],
|
|
|
|
|
context->ui.containers[0].layers[0].codes,
|
|
|
|
|
20*sizeof(uint32_t),
|
|
|
|
|
4*sizeof(uint32_t),
|
|
|
|
|
&context->render));
|
|
|
|
|
|
|
|
|
|
HexRegion* regions[MAX_LOADED_REGIONS];
|
|
|
|
|
uint32_t colors[] = {
|
|
|
|
|
0xFF0000FF,
|
|
|
|
|
0x00FF00FF,
|
|
|
|
|
0x00FF00FF,
|
|
|
|
|
0x00FF00FF,
|
|
|
|
|
0x00FF00FF,
|
|
|
|
|
0x00FF00FF,
|
|
|
|
|
0x00FF00FF,
|
|
|
|
|
0x0000FFFF,
|
|
|
|
|
0x0000FFFF,
|
|
|
|
|
0x0000FFFF,
|
|
|
|
|
0x0000FFFF,
|
|
|
|
|
0x0000FFFF,
|
|
|
|
|
0x0000FFFF,
|
|
|
|
|
0x0000FFFF,
|
|
|
|
|
0x0000FFFF,
|
|
|
|
|
0x0000FFFF,
|
|
|
|
|
0x0000FFFF,
|
|
|
|
|
0x0000FFFF,
|
|
|
|
|
0x0000FFFF,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
GPUHex* temp_hexes = malloc(sizeof(GPUHex)*REGION_HEX_COUNT);
|
|
|
|
|
uint32_t region = 0;
|
|
|
|
|
for(int32_t q = -5; q < 5; q++) {
|
|
|
|
|
for(int32_t r = -5; r < 5; r++) {
|
|
|
|
|
for(int32_t q = -10; q < 10; q++) {
|
|
|
|
|
for(int32_t r = -10; r < 10; r++) {
|
|
|
|
|
VK_RESULT(create_hex_region(q, r, ®ions[region], &context->hex, &context->render));
|
|
|
|
|
for(uint32_t i = 0; i < REGION_HEX_COUNT; i++) {
|
|
|
|
|
for(uint32_t h = 0; h < 6; h++) {
|
|
|
|
|
temp_hexes[i].color[h] = colors[r % (sizeof(colors)/sizeof(uint32_t))];
|
|
|
|
|
temp_hexes[i].height[h] = 0;
|
|
|
|
|
regions[region]->data[i].color[h] = colors[(q+r+50) % (sizeof(colors)/sizeof(uint32_t))];
|
|
|
|
|
regions[region]->data[i].height[h] = (float)i/REGION_HEX_COUNT;
|
|
|
|
|
}
|
|
|
|
|
temp_hexes[i].color[6] = colors[r % (sizeof(colors)/sizeof(uint32_t))];
|
|
|
|
|
regions[region]->data[i].color[6] = colors[(q+r+50) % (sizeof(colors)/sizeof(uint32_t))];
|
|
|
|
|
}
|
|
|
|
|
VK_RESULT(add_transfer(temp_hexes, regions[region]->region, offsetof(GPUHexRegion, hexes), sizeof(GPUHex)*REGION_HEX_COUNT, 0, &context->render));
|
|
|
|
|
VK_RESULT(add_transfer(®ions[region]->data, regions[region]->region, offsetof(GPUHexRegion, hexes), sizeof(GPUHex)*REGION_HEX_COUNT, 0, &context->render));
|
|
|
|
|
region++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
free(temp_hexes);
|
|
|
|
|
|
|
|
|
|
context->position[0] = 0;
|
|
|
|
|
context->position[1] = 0;
|
|
|
|
|
context->position[2] = 0;
|
|
|
|
@ -178,7 +124,7 @@ VkResult main_thread(ClientContext* context) {
|
|
|
|
|
context->key_spin[1] = 0;
|
|
|
|
|
context->cur_spin[0] = 0;
|
|
|
|
|
context->cur_spin[1] = 0;
|
|
|
|
|
context->distance = 50;
|
|
|
|
|
context->distance = 25;
|
|
|
|
|
context->zoom = 0;
|
|
|
|
|
context->camera_mode = false;
|
|
|
|
|
context->key_spin_speed = 1.0;
|
|
|
|
@ -188,15 +134,18 @@ VkResult main_thread(ClientContext* context) {
|
|
|
|
|
//
|
|
|
|
|
uint32_t* mapped_codes = context->ui.containers[0].layers[0].codes_buffer;
|
|
|
|
|
GPUString* mapped_string = context->ui.containers[0].layers[0].strings_buffer;
|
|
|
|
|
char str[21];
|
|
|
|
|
char str[51];
|
|
|
|
|
|
|
|
|
|
double last_frame_time = 0;
|
|
|
|
|
int frame = 0;
|
|
|
|
|
while(glfwWindowShouldClose(context->window) == 0) {
|
|
|
|
|
double frame_time = glfwGetTime();
|
|
|
|
|
double delta_time = (frame_time - last_frame_time);
|
|
|
|
|
|
|
|
|
|
context->clicked_element = 0x00000000;
|
|
|
|
|
context->clicked_container = 0x00000000;
|
|
|
|
|
context->clicked_hex[0] = 0;
|
|
|
|
|
context->clicked_hex[1] = 0;
|
|
|
|
|
context->zoom = 0;
|
|
|
|
|
context->cur_spin[0] = 0;
|
|
|
|
|
context->cur_spin[1] = 0;
|
|
|
|
@ -205,8 +154,7 @@ VkResult main_thread(ClientContext* context) {
|
|
|
|
|
|
|
|
|
|
if(context->key_spin[0] != 0 || context->key_spin[1] != 0 ||
|
|
|
|
|
context->zoom != 0 ||
|
|
|
|
|
context->cur_spin[0] != 0 || context->cur_spin[1] != 0 ||
|
|
|
|
|
last_frame_time == 0) {
|
|
|
|
|
context->cur_spin[0] != 0 || context->cur_spin[1] != 0 || frame == 1) {
|
|
|
|
|
|
|
|
|
|
context->rotation[0] += (float)context->key_spin[0]*delta_time*context->key_spin_speed;
|
|
|
|
|
context->rotation[0] += (float)context->cur_spin[0]*delta_time*context->cur_spin_speed;
|
|
|
|
@ -237,8 +185,10 @@ VkResult main_thread(ClientContext* context) {
|
|
|
|
|
vec2 hex_pos = {};
|
|
|
|
|
vec2 hex_forward = {};
|
|
|
|
|
|
|
|
|
|
hex_pos[0] = camera[0];
|
|
|
|
|
hex_pos[1] = camera[2] - camera[0]/2;
|
|
|
|
|
hex_pos[0] = camera[0];
|
|
|
|
|
hex_pos[1] = -camera[2] + camera[0]/2;
|
|
|
|
|
hex_forward[0] = 0;
|
|
|
|
|
hex_forward[1] = 0;
|
|
|
|
|
|
|
|
|
|
glm_lookat(camera, context->position, up, context->hex.data.view);
|
|
|
|
|
add_transfer(&context->hex.data, context->hex.context, 0, 2*sizeof(mat4), context->render.current_frame, &context->render);
|
|
|
|
@ -246,8 +196,8 @@ VkResult main_thread(ClientContext* context) {
|
|
|
|
|
add_transfer(hex_forward, context->hex.context, offsetof(GPUHexContext, forward), sizeof(vec2), context->render.current_frame, &context->render);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(context->clicked_container != 0) {
|
|
|
|
|
snprintf(str, 21, "Clicked: %d.%d", context->clicked_container, context->clicked_element);
|
|
|
|
|
if(context->clicked_hex[0] != 0 || context->clicked_hex[1] != 0) {
|
|
|
|
|
snprintf(str, 50, "Clicked: (%d,%d)", context->clicked_hex[0], context->clicked_hex[1]);
|
|
|
|
|
map_string(str, mapped_codes, 0, 0, &context->ui);
|
|
|
|
|
VK_RESULT(add_transfers(
|
|
|
|
|
context->ui.containers[0].layers[0].codes_buffer,
|
|
|
|
@ -264,6 +214,7 @@ VkResult main_thread(ClientContext* context) {
|
|
|
|
|
&context->render));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
frame += 1;
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
VkResult result = draw_frame(&context->render, &context->ui, &context->hex, frame_time);
|
|
|
|
|