roleplay/client/include/hex.h

177 lines
3.9 KiB
C

#ifndef HEX_H
#define HEX_H
#include "gpu.h"
#include "vulkan/vulkan_core.h"
#define MAX_RAYS 10
#define MAX_HIGHLIGHTS 10
#define MAX_POINTS 10
#define MAX_LOADED_REGIONS 2500
#define REGION_SIZE 10
#define REGION_HEX_COUNT (3*REGION_SIZE*(REGION_SIZE-1)+1)
#define HEX_X 0.75
#define SQRT3 1.732050807568877193176604123436845839023590087890625
#define HEX_Z (SQRT3/2)
#define REGION_DIAMETER (2*REGION_SIZE-1)
#define REGION_WIDTH (HEX_X*REGION_DIAMETER)
#define REGION_HEIGHT (HEX_Z*REGION_DIAMETER)
#define max(a, b) ((a > b) ? a : b)
#define min(a, b) ((a < b) ? a : b)
typedef struct HexCoordStruct {
int32_t q;
int32_t r;
} HexCoord;
extern vec3 hex_vertices[];
extern vec3 hex_starts[];
extern vec3 hex_directions[];
extern HexCoord hex_starts_qr[];
extern HexCoord hex_directions_qr[];
extern int hex_indices[];
typedef struct GPUHexStruct {
float height[6];
uint32_t color[7];
} GPUHex;
typedef struct GPUHexRegionStruct {
HexCoord position;
int32_t y;
uint32_t map;
GPUHex hexes[REGION_HEX_COUNT];
} GPUHexRegion;
typedef struct HexRegionStruct {
VkDeviceAddress address;
VkBuffer region;
VmaAllocation region_memory;
GPUHexRegion data;
} HexRegion;
typedef struct GPURayStruct {
vec4 start;
vec4 end;
vec4 color;
} GPURay;
typedef struct GPUHighlightStruct {
vec4 color;
uint32_t region;
uint32_t hex;
float offset;
} GPUHighlight;
typedef struct GPUPointStruct {
vec4 color;
uint32_t region;
uint32_t hex;
uint32_t vertex;
float size;
float offset;
} GPUPoint;
typedef struct GPUHexContextStruct {
mat4 proj;
mat4 view;
uint32_t current_map;
VkDeviceAddress rays;
VkDeviceAddress points;
VkDeviceAddress highlights;
VkDeviceAddress regions[MAX_LOADED_REGIONS];
} GPUHexContext;
typedef struct HexContextStruct {
VkDeviceAddress address[MAX_FRAMES_IN_FLIGHT];
VkBuffer context[MAX_FRAMES_IN_FLIGHT];
VmaAllocation context_memory[MAX_FRAMES_IN_FLIGHT];
VkBuffer rays[MAX_FRAMES_IN_FLIGHT];
VkBuffer points[MAX_FRAMES_IN_FLIGHT];
VkBuffer highlights[MAX_FRAMES_IN_FLIGHT];
VmaAllocation rays_memory[MAX_FRAMES_IN_FLIGHT];
VmaAllocation points_memory[MAX_FRAMES_IN_FLIGHT];
VmaAllocation highlights_memory[MAX_FRAMES_IN_FLIGHT];
GPURay rays_buffer[MAX_RAYS];
GPUHighlight highlights_buffer[MAX_HIGHLIGHTS];
GPUPoint points_buffer[MAX_POINTS];
mat4 inverse;
GraphicsPipeline graphics;
GraphicsPipeline highlight_pipeline;
GraphicsPipeline point_pipeline;
GraphicsPipeline ray_pipeline;
HexRegion* regions[MAX_LOADED_REGIONS];
GPUHexContext data;
} HexContext;
typedef struct HexPushConstantStruct {
VkDeviceAddress context;
double time;
} HexPushConstant;
VkResult create_hex_context(
RenderContext* gpu,
HexContext* context);
VkResult set_hex_region(
HexRegion* region,
HexContext* hex,
RenderContext* gpu);
VkResult allocate_hex_region(
int32_t q, int32_t r, int32_t y,
uint32_t map,
HexRegion** region,
HexContext* hex,
RenderContext* gpu);
VkResult free_hex_region(
uint32_t region_index,
HexContext* hex,
RenderContext* gpu);
bool ray_world_intersect(
float* distance,
uint32_t* vertex,
uint32_t* rid,
uint32_t* hid,
vec4 ray_start,
vec4 ray_end,
HexContext* context);
VkResult update_hex_proj(
RenderContext* gpu,
HexContext* hex);
VkResult update_hex_view(
vec3 position,
vec2 rotation,
double distance,
RenderContext* gpu,
HexContext* hex);
void hex_qr(uint32_t hex, HexCoord* world);
void region_qr(HexCoord region, HexCoord* world);
void hex_add(HexCoord from, HexCoord* to);
void hex_index(HexCoord world, HexCoord* region, uint32_t* hex);
void hex_vertex_neighbors(
uint32_t vertex, HexCoord hex,
uint32_t n_vertex[2], HexCoord n_region[2], uint32_t n_hex[2]);
void first_matching_region(HexCoord coord, int y, uint32_t* region, HexContext* context);
#endif