textures/mesh.c

90 lines
3.4 KiB
C
Raw Normal View History

2025-01-27 18:21:29 +00:00
#include <stdio.h>
#include <string.h>
#include "array.h"
#include "mesh.h"
mesh_t mesh = {
.vertices = NULL,
.faces = NULL,
.rotation = { 0, 0, 0 },
.scale = { 1.0, 1.0, 1.0 },
.translation = { 0, 0, 0 }
};
vec3_t cube_vertices[N_CUBE_VERTICES] = {
{ .x = -1, .y = -1, .z = -1 }, // 1
{ .x = -1, .y = 1, .z = -1 }, // 2
{ .x = 1, .y = 1, .z = -1 }, // 3
{ .x = 1, .y = -1, .z = -1 }, // 4
{ .x = 1, .y = 1, .z = 1 }, // 5
{ .x = 1, .y = -1, .z = 1 }, // 6
{ .x = -1, .y = 1, .z = 1 }, // 7
{ .x = -1, .y = -1, .z = 1 } // 8
};
face_t cube_faces[N_CUBE_FACES] = {
// front
{ .a = 1, .b = 2, .c = 3, .a_uv = { 0, 0 }, .b_uv = { 0, 1 }, .c_uv = { 1, 1 }, .color = 0xFFFFFFFF },
{ .a = 1, .b = 3, .c = 4, .a_uv = { 0, 0 }, .b_uv = { 1, 1 }, .c_uv = { 1, 0 }, .color = 0xFFFFFFFF },
// right
{ .a = 4, .b = 3, .c = 5, .a_uv = { 0, 0 }, .b_uv = { 0, 1 }, .c_uv = { 1, 1 }, .color = 0xFFFFFFFF },
{ .a = 4, .b = 5, .c = 6, .a_uv = { 0, 0 }, .b_uv = { 1, 1 }, .c_uv = { 1, 0 }, .color = 0xFFFFFFFF },
// back
{ .a = 6, .b = 5, .c = 7, .a_uv = { 0, 0 }, .b_uv = { 0, 1 }, .c_uv = { 1, 1 }, .color = 0xFFFFFFFF },
{ .a = 6, .b = 7, .c = 8, .a_uv = { 0, 0 }, .b_uv = { 1, 1 }, .c_uv = { 1, 0 }, .color = 0xFFFFFFFF },
// left
{ .a = 8, .b = 7, .c = 2, .a_uv = { 0, 0 }, .b_uv = { 0, 1 }, .c_uv = { 1, 1 }, .color = 0xFFFFFFFF },
{ .a = 8, .b = 2, .c = 1, .a_uv = { 0, 0 }, .b_uv = { 1, 1 }, .c_uv = { 1, 0 }, .color = 0xFFFFFFFF },
// top
{ .a = 2, .b = 7, .c = 5, .a_uv = { 0, 0 }, .b_uv = { 0, 1 }, .c_uv = { 1, 1 }, .color = 0xFFFFFFFF },
{ .a = 2, .b = 5, .c = 3, .a_uv = { 0, 0 }, .b_uv = { 1, 1 }, .c_uv = { 1, 0 }, .color = 0xFFFFFFFF },
// bottom
{ .a = 6, .b = 8, .c = 1, .a_uv = { 0, 0 }, .b_uv = { 0, 1 }, .c_uv = { 1, 1 }, .color = 0xFFFFFFFF },
{ .a = 6, .b = 1, .c = 4, .a_uv = { 0, 0 }, .b_uv = { 1, 1 }, .c_uv = { 1, 0 }, .color = 0xFFFFFFFF }
};
void load_cube_mesh_data(void) {
for (int i = 0; i < N_CUBE_VERTICES; i++) {
vec3_t cube_vertex = cube_vertices[i];
array_push(mesh.vertices, cube_vertex);
}
for (int i = 0; i < N_CUBE_FACES; i++) {
face_t cube_face = cube_faces[i];
array_push(mesh.faces, cube_face);
}
}
void load_obj_file_data(char* filename) {
FILE* file;
file = fopen(filename, "r");
char line[1024];
while (fgets(line, 1024, file)) {
// Vertex information
if (strncmp(line, "v ", 2) == 0) {
vec3_t vertex;
sscanf(line, "v %f %f %f", &vertex.x, &vertex.y, &vertex.z);
array_push(mesh.vertices, vertex);
}
// Face information
if (strncmp(line, "f ", 2) == 0) {
int vertex_indices[3];
int texture_indices[3];
int normal_indices[3];
sscanf(
line, "f %d/%d/%d %d/%d/%d %d/%d/%d",
&vertex_indices[0], &texture_indices[0], &normal_indices[0],
&vertex_indices[1], &texture_indices[1], &normal_indices[1],
&vertex_indices[2], &texture_indices[2], &normal_indices[2]
);
face_t face = {
.a = vertex_indices[0],
.b = vertex_indices[1],
.c = vertex_indices[2],
.color = 0xFFFFFFFF
};
array_push(mesh.faces, face);
}
}
}