add grid and highlighting of selected tiles when picking
This commit is contained in:
+309
-116
@@ -18,6 +18,7 @@
|
||||
#include "../assets/shader/basic.h"
|
||||
#include "../assets/shader/world.h"
|
||||
#include "../assets/shader/gui_tile.h"
|
||||
#include "../assets/shader/grid.h"
|
||||
|
||||
using namespace M;
|
||||
|
||||
@@ -29,6 +30,7 @@ static SDL_Window *window;
|
||||
|
||||
static SDL_GPUGraphicsPipeline *basic_graphics_pipeline;
|
||||
static SDL_GPUGraphicsPipeline *world_graphics_pipeline;
|
||||
static SDL_GPUGraphicsPipeline *grid_graphics_pipeline;
|
||||
static SDL_GPUGraphicsPipeline *gui_tile_graphics_pipeline;
|
||||
static SDL_GPUSampler *pixel_sampler;
|
||||
|
||||
@@ -36,6 +38,8 @@ SDL_GPUTexture *tile_textures_array;
|
||||
|
||||
static SDL_GPUBuffer *vertex_buffer;
|
||||
static SDL_GPUBuffer *index_buffer;
|
||||
static SDL_GPUBuffer *grid_vertex_buffer;
|
||||
static SDL_GPUBuffer *grid_index_buffer;
|
||||
static SDL_GPUBuffer *player_instance_buffer;
|
||||
static SDL_GPUBuffer *world_buffer;
|
||||
static SDL_GPUBuffer *tile_infos_buffer;
|
||||
@@ -60,6 +64,8 @@ static SDL_Time time;
|
||||
static bool use_actual_time = true;
|
||||
static SDL_DateTime calendar_time;
|
||||
|
||||
static V2 mouse_pos;
|
||||
|
||||
static int time_tints_times[4][3] = {
|
||||
{ 4, 0, 0 },
|
||||
{ 9, 0, 0 },
|
||||
@@ -79,10 +85,10 @@ struct Vertex {
|
||||
};
|
||||
|
||||
static Vertex vertices[] = {
|
||||
{{ -0.5f, 0.5f, 0 }},
|
||||
{{ 0.5f, 0.5f, 0 }},
|
||||
{{ 0.5f, -0.5f, 0 }},
|
||||
{{ -0.5f, -0.5f, 0 }},
|
||||
{{ -0.5f, 0.5f }},
|
||||
{{ 0.5f, 0.5f }},
|
||||
{{ 0.5f, -0.5f }},
|
||||
{{ -0.5f, -0.5f }},
|
||||
};
|
||||
|
||||
static Uint16 indices[] = {
|
||||
@@ -90,6 +96,51 @@ static Uint16 indices[] = {
|
||||
0, 2, 3,
|
||||
};
|
||||
|
||||
#define grid_line_size (1.0f / 64.0f)
|
||||
static Vertex grid_vertices[] = {
|
||||
// LEFT
|
||||
{{ -0.5f, 0.5f }},
|
||||
{{ -0.5f + grid_line_size, 0.5f }},
|
||||
{{ -0.5f + grid_line_size, -0.5f + grid_line_size }},
|
||||
{{ -0.5f, -0.5f + grid_line_size }},
|
||||
|
||||
// TOP
|
||||
{{ -0.5f + grid_line_size, 0.5f }},
|
||||
{{ 0.5f, 0.5f }},
|
||||
{{ 0.5f, 0.5f - grid_line_size }},
|
||||
{{ -0.5f + grid_line_size, 0.5f - grid_line_size }},
|
||||
|
||||
// RIGHT
|
||||
{{ 0.5f - grid_line_size, 0.5f - grid_line_size }},
|
||||
{{ 0.5f, 0.5f - grid_line_size }},
|
||||
{{ 0.5f, -0.5f }},
|
||||
{{ 0.5f - grid_line_size, -0.5f }},
|
||||
|
||||
// BOTTOM
|
||||
{{ -0.5f, -0.5f + grid_line_size }},
|
||||
{{ 0.5f - grid_line_size, -0.5f + grid_line_size }},
|
||||
{{ 0.5f - grid_line_size, -0.5f }},
|
||||
{{ -0.5f, -0.5f }},
|
||||
};
|
||||
|
||||
static Uint16 grid_indices[] = {
|
||||
// LEFT
|
||||
0, 1, 2,
|
||||
0, 2, 3,
|
||||
|
||||
// TOP
|
||||
4, 5, 6,
|
||||
4, 6, 7,
|
||||
|
||||
// RIGHT
|
||||
8, 9, 10,
|
||||
8, 10, 11,
|
||||
|
||||
// BOTTOM
|
||||
12, 13, 14,
|
||||
12, 14, 15,
|
||||
};
|
||||
|
||||
struct Instance {
|
||||
V2 pos;
|
||||
V4 uv0uv1;
|
||||
@@ -117,6 +168,8 @@ struct PerFrame {
|
||||
float camera_y;
|
||||
float camera_distance;
|
||||
float camera_tilt;
|
||||
Sint32 drag_start[2];
|
||||
Sint32 mouse[2];
|
||||
Uint32 map_width;
|
||||
};
|
||||
|
||||
@@ -855,110 +908,200 @@ static bool recreate_graphics_pipelines() {
|
||||
SDL_ReleaseGPUShader(device, world_pixel_shader);
|
||||
}
|
||||
|
||||
{ // gui_tile_graphics_pipeline
|
||||
SDL_GPUShaderCreateInfo gui_tile_vertex_shader_info = {
|
||||
.code_size = SDL_arraysize(SPIRV_gui_tile),
|
||||
.code = SPIRV_gui_tile,
|
||||
.entrypoint = "main_vertex",
|
||||
.format = SDL_GPU_SHADERFORMAT_SPIRV,
|
||||
.stage = SDL_GPU_SHADERSTAGE_VERTEX,
|
||||
{ // gui_tile_graphics_pipeline
|
||||
SDL_GPUShaderCreateInfo gui_tile_vertex_shader_info = {
|
||||
.code_size = SDL_arraysize(SPIRV_gui_tile),
|
||||
.code = SPIRV_gui_tile,
|
||||
.entrypoint = "main_vertex",
|
||||
.format = SDL_GPU_SHADERFORMAT_SPIRV,
|
||||
.stage = SDL_GPU_SHADERSTAGE_VERTEX,
|
||||
|
||||
.num_uniform_buffers = 1,
|
||||
};
|
||||
|
||||
SDL_GPUShader *gui_tile_vertex_shader = SDL_CreateGPUShader(device, &gui_tile_vertex_shader_info);
|
||||
if (!gui_tile_vertex_shader) {
|
||||
log_error("Failed to create gui_tile vertex shader. Exiting.");
|
||||
return false;
|
||||
}
|
||||
|
||||
SDL_GPUShaderCreateInfo gui_tile_pixel_shader_info = {
|
||||
.code_size = SDL_arraysize(SPIRV_gui_tile),
|
||||
.code = SPIRV_gui_tile,
|
||||
.entrypoint = "main_fragment",
|
||||
.format = SDL_GPU_SHADERFORMAT_SPIRV,
|
||||
.stage = SDL_GPU_SHADERSTAGE_FRAGMENT,
|
||||
|
||||
.num_samplers = 1,
|
||||
.num_uniform_buffers = 1,
|
||||
};
|
||||
|
||||
SDL_GPUShader *gui_tile_pixel_shader = SDL_CreateGPUShader(device, &gui_tile_pixel_shader_info);
|
||||
if (!gui_tile_pixel_shader) {
|
||||
log_error("Failed to create gui_tile pixel shader. Exiting.");
|
||||
return false;
|
||||
}
|
||||
.num_uniform_buffers = 1,
|
||||
};
|
||||
|
||||
SDL_GPUVertexBufferDescription vertex_buffer_descriptions[] = {
|
||||
{
|
||||
.slot = 0,
|
||||
.pitch = sizeof(ImDrawVert),
|
||||
.input_rate = SDL_GPU_VERTEXINPUTRATE_VERTEX,
|
||||
},
|
||||
{
|
||||
.slot = 1,
|
||||
.pitch = sizeof(Uint32),
|
||||
.input_rate = SDL_GPU_VERTEXINPUTRATE_INSTANCE,
|
||||
.instance_step_rate = 1,
|
||||
},
|
||||
};
|
||||
|
||||
SDL_GPUVertexAttribute vertex_attributes[] = {
|
||||
{
|
||||
.location = 0,
|
||||
.buffer_slot = 0,
|
||||
.format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2,
|
||||
.offset = offsetof(ImDrawVert, pos),
|
||||
},
|
||||
{
|
||||
.location = 1,
|
||||
.buffer_slot = 0,
|
||||
.format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2,
|
||||
.offset = offsetof(ImDrawVert, uv),
|
||||
},
|
||||
{
|
||||
.location = 2,
|
||||
.buffer_slot = 0,
|
||||
.format = SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4_NORM,
|
||||
.offset = offsetof(ImDrawVert, col),
|
||||
},
|
||||
};
|
||||
|
||||
SDL_GPUGraphicsPipelineCreateInfo gui_tile_graphics_pipeline_info = {
|
||||
.vertex_shader = gui_tile_vertex_shader,
|
||||
.fragment_shader = gui_tile_pixel_shader,
|
||||
.vertex_input_state = {
|
||||
.vertex_buffer_descriptions = vertex_buffer_descriptions,
|
||||
.num_vertex_buffers = SDL_arraysize(vertex_buffer_descriptions),
|
||||
.vertex_attributes = vertex_attributes,
|
||||
.num_vertex_attributes = SDL_arraysize(vertex_attributes),
|
||||
},
|
||||
.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST,
|
||||
.rasterizer_state = {
|
||||
.fill_mode = SDL_GPU_FILLMODE_FILL,
|
||||
.cull_mode = SDL_GPU_CULLMODE_NONE,
|
||||
.front_face = SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE,
|
||||
},
|
||||
.target_info = {
|
||||
.color_target_descriptions = color_target_descriptions,
|
||||
.num_color_targets = SDL_arraysize(color_target_descriptions),
|
||||
},
|
||||
};
|
||||
|
||||
if (gui_tile_graphics_pipeline) {
|
||||
SDL_ReleaseGPUGraphicsPipeline(device, gui_tile_graphics_pipeline);
|
||||
gui_tile_graphics_pipeline = NULL;
|
||||
}
|
||||
|
||||
gui_tile_graphics_pipeline = SDL_CreateGPUGraphicsPipeline(device, &gui_tile_graphics_pipeline_info);
|
||||
if (!gui_tile_graphics_pipeline) {
|
||||
log_error("Failed to create world graphics pipeline. Exiting.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
SDL_ReleaseGPUShader(device, gui_tile_vertex_shader);
|
||||
SDL_ReleaseGPUShader(device, gui_tile_pixel_shader);
|
||||
SDL_GPUShader *gui_tile_vertex_shader = SDL_CreateGPUShader(device, &gui_tile_vertex_shader_info);
|
||||
if (!gui_tile_vertex_shader) {
|
||||
log_error("Failed to create gui_tile vertex shader. Exiting.");
|
||||
return false;
|
||||
}
|
||||
|
||||
SDL_GPUShaderCreateInfo gui_tile_pixel_shader_info = {
|
||||
.code_size = SDL_arraysize(SPIRV_gui_tile),
|
||||
.code = SPIRV_gui_tile,
|
||||
.entrypoint = "main_fragment",
|
||||
.format = SDL_GPU_SHADERFORMAT_SPIRV,
|
||||
.stage = SDL_GPU_SHADERSTAGE_FRAGMENT,
|
||||
|
||||
.num_samplers = 1,
|
||||
.num_uniform_buffers = 1,
|
||||
};
|
||||
|
||||
SDL_GPUShader *gui_tile_pixel_shader = SDL_CreateGPUShader(device, &gui_tile_pixel_shader_info);
|
||||
if (!gui_tile_pixel_shader) {
|
||||
log_error("Failed to create gui_tile pixel shader. Exiting.");
|
||||
return false;
|
||||
}
|
||||
|
||||
SDL_GPUVertexBufferDescription vertex_buffer_descriptions[] = {
|
||||
{
|
||||
.slot = 0,
|
||||
.pitch = sizeof(ImDrawVert),
|
||||
.input_rate = SDL_GPU_VERTEXINPUTRATE_VERTEX,
|
||||
},
|
||||
{
|
||||
.slot = 1,
|
||||
.pitch = sizeof(Uint32),
|
||||
.input_rate = SDL_GPU_VERTEXINPUTRATE_INSTANCE,
|
||||
.instance_step_rate = 1,
|
||||
},
|
||||
};
|
||||
|
||||
SDL_GPUVertexAttribute vertex_attributes[] = {
|
||||
{
|
||||
.location = 0,
|
||||
.buffer_slot = 0,
|
||||
.format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2,
|
||||
.offset = offsetof(ImDrawVert, pos),
|
||||
},
|
||||
{
|
||||
.location = 1,
|
||||
.buffer_slot = 0,
|
||||
.format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2,
|
||||
.offset = offsetof(ImDrawVert, uv),
|
||||
},
|
||||
{
|
||||
.location = 2,
|
||||
.buffer_slot = 0,
|
||||
.format = SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4_NORM,
|
||||
.offset = offsetof(ImDrawVert, col),
|
||||
},
|
||||
};
|
||||
|
||||
SDL_GPUGraphicsPipelineCreateInfo gui_tile_graphics_pipeline_info = {
|
||||
.vertex_shader = gui_tile_vertex_shader,
|
||||
.fragment_shader = gui_tile_pixel_shader,
|
||||
.vertex_input_state = {
|
||||
.vertex_buffer_descriptions = vertex_buffer_descriptions,
|
||||
.num_vertex_buffers = SDL_arraysize(vertex_buffer_descriptions),
|
||||
.vertex_attributes = vertex_attributes,
|
||||
.num_vertex_attributes = SDL_arraysize(vertex_attributes),
|
||||
},
|
||||
.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST,
|
||||
.rasterizer_state = {
|
||||
.fill_mode = SDL_GPU_FILLMODE_FILL,
|
||||
.cull_mode = SDL_GPU_CULLMODE_NONE,
|
||||
.front_face = SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE,
|
||||
},
|
||||
.target_info = {
|
||||
.color_target_descriptions = color_target_descriptions,
|
||||
.num_color_targets = SDL_arraysize(color_target_descriptions),
|
||||
},
|
||||
};
|
||||
|
||||
if (gui_tile_graphics_pipeline) {
|
||||
SDL_ReleaseGPUGraphicsPipeline(device, gui_tile_graphics_pipeline);
|
||||
gui_tile_graphics_pipeline = NULL;
|
||||
}
|
||||
|
||||
gui_tile_graphics_pipeline = SDL_CreateGPUGraphicsPipeline(device, &gui_tile_graphics_pipeline_info);
|
||||
if (!gui_tile_graphics_pipeline) {
|
||||
log_error("Failed to create world graphics pipeline. Exiting.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
SDL_ReleaseGPUShader(device, gui_tile_vertex_shader);
|
||||
SDL_ReleaseGPUShader(device, gui_tile_pixel_shader);
|
||||
}
|
||||
|
||||
{ // grid_graphics_pipeline
|
||||
SDL_GPUShaderCreateInfo grid_vertex_shader_info = {
|
||||
.code_size = SDL_arraysize(SPIRV_grid),
|
||||
.code = SPIRV_grid,
|
||||
.entrypoint = "main_vertex",
|
||||
.format = SDL_GPU_SHADERFORMAT_SPIRV,
|
||||
.stage = SDL_GPU_SHADERSTAGE_VERTEX,
|
||||
|
||||
.num_uniform_buffers = 1,
|
||||
};
|
||||
|
||||
SDL_GPUShader *grid_vertex_shader = SDL_CreateGPUShader(device, &grid_vertex_shader_info);
|
||||
if (!grid_vertex_shader) {
|
||||
log_error("Failed to create grid vertex shader. Exiting.");
|
||||
return false;
|
||||
}
|
||||
|
||||
SDL_GPUShaderCreateInfo grid_pixel_shader_info = {
|
||||
.code_size = SDL_arraysize(SPIRV_grid),
|
||||
.code = SPIRV_grid,
|
||||
.entrypoint = "main_fragment",
|
||||
.format = SDL_GPU_SHADERFORMAT_SPIRV,
|
||||
.stage = SDL_GPU_SHADERSTAGE_FRAGMENT,
|
||||
|
||||
.num_uniform_buffers = 1,
|
||||
};
|
||||
|
||||
SDL_GPUShader *grid_pixel_shader = SDL_CreateGPUShader(device, &grid_pixel_shader_info);
|
||||
if (!grid_pixel_shader) {
|
||||
log_error("Failed to create grid pixel shader. Exiting.");
|
||||
return false;
|
||||
}
|
||||
|
||||
SDL_GPUVertexBufferDescription vertex_buffer_descriptions[] = {
|
||||
{
|
||||
.slot = 0,
|
||||
.pitch = sizeof(Vertex),
|
||||
.input_rate = SDL_GPU_VERTEXINPUTRATE_VERTEX,
|
||||
},
|
||||
};
|
||||
|
||||
SDL_GPUVertexAttribute vertex_attributes[] = {
|
||||
{
|
||||
.location = 0,
|
||||
.buffer_slot = 0,
|
||||
.format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3,
|
||||
.offset = offsetof(Vertex, pos),
|
||||
},
|
||||
};
|
||||
|
||||
SDL_GPUGraphicsPipelineCreateInfo grid_graphics_pipeline_info = {
|
||||
.vertex_shader = grid_vertex_shader,
|
||||
.fragment_shader = grid_pixel_shader,
|
||||
.vertex_input_state = {
|
||||
.vertex_buffer_descriptions = vertex_buffer_descriptions,
|
||||
.num_vertex_buffers = SDL_arraysize(vertex_buffer_descriptions),
|
||||
.vertex_attributes = vertex_attributes,
|
||||
.num_vertex_attributes = SDL_arraysize(vertex_attributes),
|
||||
},
|
||||
.primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST,
|
||||
.rasterizer_state = {
|
||||
.fill_mode = SDL_GPU_FILLMODE_FILL,
|
||||
.cull_mode = SDL_GPU_CULLMODE_BACK,
|
||||
.front_face = SDL_GPU_FRONTFACE_CLOCKWISE,
|
||||
.enable_depth_clip = true,
|
||||
},
|
||||
.multisample_state = {
|
||||
.sample_count = enable_msaa ? highest_supported_sample_count : SDL_GPU_SAMPLECOUNT_1,
|
||||
},
|
||||
.target_info = {
|
||||
.color_target_descriptions = color_target_descriptions,
|
||||
.num_color_targets = SDL_arraysize(color_target_descriptions),
|
||||
},
|
||||
};
|
||||
|
||||
if (grid_graphics_pipeline) {
|
||||
SDL_ReleaseGPUGraphicsPipeline(device, grid_graphics_pipeline);
|
||||
grid_graphics_pipeline = NULL;
|
||||
}
|
||||
|
||||
grid_graphics_pipeline = SDL_CreateGPUGraphicsPipeline(device, &grid_graphics_pipeline_info);
|
||||
if (!grid_graphics_pipeline) {
|
||||
log_error("Failed to create grid graphics pipeline. Exiting.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
SDL_ReleaseGPUShader(device, grid_vertex_shader);
|
||||
SDL_ReleaseGPUShader(device, grid_pixel_shader);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1170,6 +1313,18 @@ int main(int argc, char **argv) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
grid_vertex_buffer = create_buffer(SDL_GPU_BUFFERUSAGE_VERTEX, sizeof(grid_vertices), grid_vertices, "grid_vertex_buffer");
|
||||
if (!grid_vertex_buffer) {
|
||||
log_error("Failed to create buffer. Exiting.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
grid_index_buffer = create_buffer(SDL_GPU_BUFFERUSAGE_INDEX, sizeof(grid_indices), grid_indices, "grid_index_buffer");
|
||||
if (!grid_index_buffer) {
|
||||
log_error("Failed to create buffer. Exiting.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
player_instance_buffer = create_buffer(SDL_GPU_BUFFERUSAGE_VERTEX, sizeof(player_instance), &player_instance, "player_instance_buffer");
|
||||
if (!player_instance_buffer) {
|
||||
log_error("Failed to create buffer. Exiting.");
|
||||
@@ -1530,6 +1685,10 @@ int main(int argc, char **argv) {
|
||||
|
||||
dragging_tile_change = false;
|
||||
} break;
|
||||
|
||||
case SDL_EVENT_MOUSE_MOTION: {
|
||||
mouse_pos = V2_(event.motion.x, event.motion.y);
|
||||
} break;
|
||||
|
||||
case SDL_EVENT_GAMEPAD_BUTTON_DOWN: {
|
||||
if (io.WantCaptureKeyboard)
|
||||
@@ -1599,16 +1758,6 @@ int main(int argc, char **argv) {
|
||||
update_buffer(player_instance_buffer, 0, sizeof(player_instance), &player_instance);
|
||||
}
|
||||
|
||||
{
|
||||
ZoneScopedN("per_frame");
|
||||
per_frame.aspect_ratio = ((float) window_width / (float) window_height);
|
||||
per_frame.map_width = map_width;
|
||||
per_frame.camera_x = player.pos_x;
|
||||
per_frame.camera_y = player.pos_y;
|
||||
|
||||
SDL_PushGPUVertexUniformData(command_buffer, 0, &per_frame, sizeof(per_frame));
|
||||
}
|
||||
|
||||
{
|
||||
ZoneScopedN("matrices");
|
||||
view_matrix = view (V3_((float)player.pos_x, (float)player.pos_y, 0), radians(per_frame.camera_tilt), per_frame.camera_distance);
|
||||
@@ -1618,6 +1767,31 @@ int main(int argc, char **argv) {
|
||||
inverse_projection_matrix = inverse_projection(radians(per_frame.fovy_degrees), per_frame.aspect_ratio, NEAR_PLANE);
|
||||
}
|
||||
|
||||
{
|
||||
ZoneScopedN("per_frame");
|
||||
|
||||
V2 floor_intersection = get_floor_intersection_of_mouse(mouse_pos);
|
||||
Sint32 tile_x = roundf(floor_intersection.x);
|
||||
Sint32 tile_y = roundf(floor_intersection.y);
|
||||
|
||||
per_frame.aspect_ratio = ((float) window_width / (float) window_height);
|
||||
per_frame.map_width = map_width;
|
||||
per_frame.camera_x = player.pos_x;
|
||||
per_frame.camera_y = player.pos_y;
|
||||
per_frame.mouse[0] = tile_x;
|
||||
per_frame.mouse[1] = tile_y;
|
||||
|
||||
if (dragging_tile_change) {
|
||||
per_frame.drag_start[0] = drag_start_pos[0];
|
||||
per_frame.drag_start[1] = drag_start_pos[1];
|
||||
} else {
|
||||
per_frame.drag_start[0] = tile_x;
|
||||
per_frame.drag_start[1] = tile_y;
|
||||
}
|
||||
|
||||
SDL_PushGPUVertexUniformData(command_buffer, 0, &per_frame, sizeof(per_frame));
|
||||
}
|
||||
|
||||
{
|
||||
ZoneScopedN("tint color");
|
||||
Sint64 tint_times_ns[5];
|
||||
@@ -1646,7 +1820,7 @@ int main(int argc, char **argv) {
|
||||
|
||||
SDL_GPUColorTargetInfo color_target_info = {
|
||||
.texture = enable_msaa ? msaa_texture : swapchain_texture,
|
||||
.clear_color = { .r = 1.0f, .g = 0.0f, .b = 1.0f, .a = 1.0f },
|
||||
.clear_color = { .r = 0.01f, .g = 0.01f, .b = 0.01f, .a = 1.0f },
|
||||
.load_op = SDL_GPU_LOADOP_CLEAR,
|
||||
.store_op = enable_msaa ? SDL_GPU_STOREOP_RESOLVE : SDL_GPU_STOREOP_STORE,
|
||||
.resolve_texture = swapchain_texture,
|
||||
@@ -1678,6 +1852,25 @@ int main(int argc, char **argv) {
|
||||
SDL_DrawGPUIndexedPrimitives(render_pass, 6, map_height * map_width, 0, 0, 0);
|
||||
}
|
||||
|
||||
if (selected_tile != -1) { // Draw Grid
|
||||
ZoneScopedN("Draw Grid");
|
||||
SDL_GPUBufferBinding index_buffer_binding = { .buffer = grid_index_buffer, .offset = 0 };
|
||||
SDL_GPUBufferBinding vertex_buffers[] = {
|
||||
{ .buffer = grid_vertex_buffer, .offset = 0 },
|
||||
};
|
||||
|
||||
V4 tints[2] = {
|
||||
{ 1.0f, 1.0f, 1.0f, 0.1f },
|
||||
{ 1.0f, 0.0f, 1.0f, 1.0f },
|
||||
};
|
||||
|
||||
SDL_BindGPUGraphicsPipeline(render_pass, grid_graphics_pipeline);
|
||||
SDL_BindGPUIndexBuffer(render_pass, &index_buffer_binding, SDL_GPU_INDEXELEMENTSIZE_16BIT);
|
||||
SDL_BindGPUVertexBuffers(render_pass, 0, vertex_buffers, SDL_arraysize(vertex_buffers));
|
||||
SDL_PushGPUFragmentUniformData(command_buffer, 0, &tints, sizeof(tints));
|
||||
SDL_DrawGPUIndexedPrimitives(render_pass, SDL_arraysize(grid_indices), map_height * map_width, 0, 0, 0);
|
||||
}
|
||||
|
||||
{ // Draw Player
|
||||
ZoneScopedN("Draw Player");
|
||||
SDL_GPUBufferBinding vertex_buffers[] = {
|
||||
|
||||
Reference in New Issue
Block a user