90 lines
3.4 KiB
C
Executable File
90 lines
3.4 KiB
C
Executable File
#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);
|
|
}
|
|
}
|
|
}
|