summaryrefslogtreecommitdiff
path: root/src/model.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/model.c')
-rw-r--r--src/model.c42
1 files changed, 12 insertions, 30 deletions
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));