From 8fc46365d6bdcde0c18a8b413b9f7a80fa487107 Mon Sep 17 00:00:00 2001 From: Connor Thomson Date: Sat, 12 Sep 2026 10:20:39 -0700 Subject: Getting ready to add PCSS shadows --- src/model.c | 42 ++++++++++++------------------------------ 1 file changed, 12 insertions(+), 30 deletions(-) (limited to 'src/model.c') diff --git a/src/model.c b/src/model.c index be72817..4171c21 100644 --- a/src/model.c +++ b/src/model.c @@ -22,6 +22,7 @@ #include "model.h" #include "camera.h" #include "files.h" +#include "gpu.h" #include "ta_math.h" static bool ta_model_push_vertex(ta_model_mesh *mesh, size_t *capacity, const ta_model_vertex *vertex) { @@ -170,34 +171,6 @@ bool ta_model_init(ta_model *model, SDL_GPUDevice *device, const float positions if (!ta_model_build(positions, position_count, faces, face_count, &model->mesh) || model->mesh.vertex_count == 0) { return false; } - float minimum[TA_MODEL_DIMENSION]; - float maximum[TA_MODEL_DIMENSION]; - memcpy(minimum, model->mesh.vertices[0].position, sizeof(minimum)); - memcpy(maximum, minimum, sizeof(maximum)); - for (size_t index = 1; index < model->mesh.vertex_count; index++) for (int axis = 0; axis < TA_MODEL_DIMENSION; axis++) { - if (model->mesh.vertices[index].position[axis] < minimum[axis]) { - minimum[axis] = model->mesh.vertices[index].position[axis]; - } - if (model->mesh.vertices[index].position[axis] > maximum[axis]) { - maximum[axis] = model->mesh.vertices[index].position[axis]; - } - } - float center[TA_MODEL_DIMENSION] = { - (minimum[0] + maximum[0]) * 0.5f, - (minimum[1] + maximum[1]) * 0.5f, - (minimum[2] + maximum[2]) * 0.5f - }; - float extent = maximum[0] - minimum[0]; - for (int axis = 1; axis < TA_MODEL_DIMENSION; axis++) { - if (maximum[axis] - minimum[axis] > extent) { - extent = maximum[axis] - minimum[axis]; - } - } - for (size_t index = 0; index < model->mesh.vertex_count; index++) { - for (int axis = 0; axis < TA_MODEL_DIMENSION; axis++) { - model->mesh.vertices[index].position[axis] = (model->mesh.vertices[index].position[axis] - center[axis]) * (2.2f / extent); - } - } SDL_GPUBufferCreateInfo buffer_info = { .usage = SDL_GPU_BUFFERUSAGE_VERTEX, @@ -258,9 +231,16 @@ bool ta_model_init(ta_model *model, SDL_GPUDevice *device, const float positions }, }; model->pipeline = ta_sdl_create_gpu_graphics_pipeline(device, &pipeline_info); + + SDL_GPUShader *wireframe_fragment_shader = ta_model_shader(device, file_model_wireframe_frag_slang_spv_start, file_model_wireframe_frag_slang_spv_size, SDL_GPU_SHADERSTAGE_FRAGMENT); + pipeline_info.fragment_shader = wireframe_fragment_shader; + pipeline_info.rasterizer_state.fill_mode = SDL_GPU_FILLMODE_LINE; + model->wireframe_pipeline = ta_sdl_create_gpu_graphics_pipeline(device, &pipeline_info); + SDL_ReleaseGPUShader(device, vertex_shader); SDL_ReleaseGPUShader(device, fragment_shader); - return model->pipeline != NULL; + SDL_ReleaseGPUShader(device, wireframe_fragment_shader); + return model->pipeline != NULL && model->wireframe_pipeline != NULL; } void ta_model_upload(ta_model *model, SDL_GPUCommandBuffer *command_buffer, SDL_GPUDevice *device) { @@ -345,8 +325,9 @@ void ta_model_render(const ta_model *model, SDL_GPUCommandBuffer *command_buffer uniforms.camera_position[1] = ta_camera_current.y; uniforms.camera_position[2] = ta_camera_current.z; uniforms.padding = 0.0f; + SDL_GPUGraphicsPipeline *pipeline = ta_gpu_enable_wireframe && model->wireframe_pipeline ? model->wireframe_pipeline : model->pipeline; SDL_PushGPUVertexUniformData(command_buffer, 0, &uniforms, sizeof(uniforms)); - SDL_BindGPUGraphicsPipeline(render_pass, model->pipeline); + SDL_BindGPUGraphicsPipeline(render_pass, pipeline); SDL_GPUBufferBinding binding = { .buffer = model->vertex_buffer }; @@ -356,6 +337,7 @@ void ta_model_render(const ta_model *model, SDL_GPUCommandBuffer *command_buffer void ta_model_destroy(ta_model *model, SDL_GPUDevice *device) { SDL_ReleaseGPUGraphicsPipeline(device, model->pipeline); + SDL_ReleaseGPUGraphicsPipeline(device, model->wireframe_pipeline); SDL_ReleaseGPUBuffer(device, model->vertex_buffer); ta_model_free(&model->mesh); memset(model, 0, sizeof(*model)); -- cgit v1.2.3