-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodel.c
65 lines (53 loc) · 1.96 KB
/
model.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include "model.h"
#include "data.h"
#include "render.h"
#include "vector.h"
vector * model_load(void * void_verts, uint32_t frame_len, uint32_t vert_len, float * u, float * v) {
// todo, scale??
vector * frame_ids = vector_init(sizeof(uint32_t));
float (*model_verts)[frame_len][vert_len][3] = void_verts;
uint32_t u_i = 0;
uint32_t v_i = 0;
// frame
for (uint32_t frame_i = 0; frame_i < frame_len; frame_i++) {
// point to first vertex in frame
vector_push(frame_ids, &r_num_verts);
// reset uv indices
u_i = 0;
v_i = 0;
// vertex of frame
for (uint32_t vert_i = 0; vert_i < vert_len; vert_i+=3) {
vec3_t fv[3];
typedef struct {
float u;
float v;
} uv_t;
uv_t uv[3];
for (uint32_t face_i = 0; face_i < 3; face_i++) {
// scale to match cube dimensions
fv[face_i] = vec3(
// flip x because blender
(*model_verts)[frame_i][vert_i + face_i][0] * -32,
(*model_verts)[frame_i][vert_i + face_i][1] * 32,
(*model_verts)[frame_i][vert_i + face_i][2] * 32
);
uv[face_i] = (uv_t) {
.u = u[u_i++], // god forgive me
.v = v[v_i++] // maybe could be vert_i / 3 + face_i, fuck
};
}
// switch vertex winding for normals and verts because blender
vec3_t n = vec3_face_normal(fv[0], fv[1], fv[2]);
r_push_vert(fv[0], n, uv[0].u, uv[0].v);
r_push_vert(fv[1], n, uv[1].u, uv[1].v);
r_push_vert(fv[2], n, uv[2].u, uv[2].v);
}
}
return frame_ids;
}
void model_quit() {
// todo, do these in map_quit once everything's sorted
}