commit d1aff1f0a60c16d97bf5ce3a14614da3d184e91e
parent 13072c6043e79e12badb50ddf4451615fe328699
Author: evenfri <evenfri@4plt.ch>
Date: Mon, 2 Nov 2026 06:17:02 +0800
fix format, add define CAMERA_FOV
Diffstat:
| M | blocks.c | | | 12 | ++++++------ |
| M | camera.c | | | 106 | ++++++++++++++++++++++++++++++++++++++++++++----------------------------------- |
| M | dat.h | | | 14 | ++++++++------ |
3 files changed, 73 insertions(+), 59 deletions(-)
diff --git a/blocks.c b/blocks.c
@@ -3,12 +3,12 @@
Block blocks[] = {
{ BLOCK_GRASS, {
- "assets/grass_side.png", /* back */
- "assets/grass_side.png", /* front */
- "assets/grass_side.png", /* left */
- "assets/grass_side.png", /* right */
- "assets/dirt.png", /* bottom */
- "assets/grass_top.png", /* top */
+ "assets/grass_side.png", /* back */
+ "assets/grass_side.png", /* front */
+ "assets/grass_side.png", /* left */
+ "assets/grass_side.png", /* right */
+ "assets/dirt.png", /* bottom */
+ "assets/grass_top.png", /* top */
}},
{ BLOCK_STONE, {
"assets/stone.png", "assets/stone.png",
diff --git a/camera.c b/camera.c
@@ -5,23 +5,60 @@
Camera camera;
-static vec3 vec3_make(float x, float y, float z) { vec3 v = {x, y, z}; return v; }
-// static vec3 vec3_sub (vec3 a, vec3 b) { return vec3_make(a.x-b.x, a.y-b.y, a.z-b.z); }
-static vec3 vec3_scale(vec3 a, float s){ return vec3_make(a.x*s, a.y*s, a.z*s); }
-static float vec3_dot (vec3 a, vec3 b) { return a.x*b.x + a.y*b.y + a.z*b.z; }
+static vec3 vec3_make(float x, float y, float z) {
+ vec3 v = {x, y, z};
+ return v;
+}
+
+/*
+ * static vec3 vec3_sub (vec3 a, vec3 b) {
+ * return vec3_make(a.x - b.x, a.y - b.y, a.z - b.z);
+ * }
+ */
+
+static float vec3_dot (vec3 a, vec3 b) {
+ return a.x * b.x + a.y * b.y + a.z * b.z;
+}
+
static vec3 vec3_cross(vec3 a, vec3 b) {
- return vec3_make(a.y*b.z - a.z*b.y,
- a.z*b.x - a.x*b.z,
- a.x*b.y - a.y*b.x);
+ return vec3_make(a.y * b.z - a.z * b.y,
+ a.z * b.x - a.x * b.z,
+ a.x * b.y - a.y * b.x);
}
+
static vec3 vec3_norm(vec3 a) {
float l = sqrtf(vec3_dot(a, a));
if (l < 1e-6f) return vec3_make(0, 0, 0);
return vec3_scale(a, 1.0f / l);
}
+mat4 mat4_identity(void)
+ mat4 r = {{0}};
+r.m[0] = r.m[5] = r.m[10] = r.m[15] = 1.0f;
+return r;
+}
+
+mat4 mat4_perspective(float fovy, float aspect, float znear, float zfar) {
+ mat4 r = {{0}};
+ float f = 1.0f / tanf(0.5f * fovy * PI / 180.0f);
+ r.m[0] = f / aspect;
+ r.m[5] = f;
+ r.m[10] = (zfar + znear) / (znear - zfar);
+ r.m[11] = -1.0f;
+ r.m[14] = (2.0f * zfar * znear) / (znear - zfar);
+ return r;
+}
+
+mat4 mat4_translate(float x, float y, float z) {
+ mat4 r = mat4_identity();
+ r.m[12] = x;
+ r.m[13] = y;
+ r.m[14] = z;
+ return r;
+}
+
void camera_update_vectors(void) {
- float yr = camera.yaw * PI / 180.0f;
+ float yr = camera.yaw * PI / 180.0f;
float pr = camera.pitch * PI / 180.0f;
vec3 front;
@@ -31,17 +68,17 @@ void camera_update_vectors(void) {
camera.front = vec3_norm(front);
camera.right = vec3_norm(vec3_cross(camera.front, camera.world_up));
- camera.up = vec3_norm(vec3_cross(camera.right, camera.front));
+ camera.up = vec3_norm(vec3_cross(camera.right, camera.front));
}
void camera_init(void) {
- camera.position = vec3_make(0.0f, 0.0f, 3.0f);
- camera.world_up = vec3_make(0.0f, 1.0f, 0.0f);
- camera.yaw = -90.0f; /* смотрим в -Z */
- camera.pitch = 0.0f;
- camera.speed = 2.5f;
- camera.sensitivity = 0.1f;
- camera.fov = 45.0f;
+ camera.position = vec3_make(0.0f, 0.0f, 3.0f);
+ camera.world_up = vec3_make(0.0f, 1.0f, 0.0f);
+ camera.yaw = -90.0f; /* look to -90 z */
+ camera.pitch = 0.0f;
+ camera.speed = 2.5f;
+ camera.sensitivity = 0.1f;
+ camera.fov = CAMERA_FOV;
camera_update_vectors();
}
@@ -52,38 +89,13 @@ mat4 camera_get_view(void) {
vec3 e = camera.position;
mat4 v;
- v.m[0] = s.x; v.m[4] = s.y; v.m[8] = s.z; v.m[12] = -vec3_dot(s, e);
- v.m[1] = u.x; v.m[5] = u.y; v.m[9] = u.z; v.m[13] = -vec3_dot(u, e);
- v.m[2] = -f.x; v.m[6] = -f.y; v.m[10] = -f.z; v.m[14] = vec3_dot(f, e);
- v.m[3] = 0.0f; v.m[7] = 0.0f; v.m[11] = 0.0f; v.m[15] = 1.0f;
+ v.m[0] = s.x; v.m[4] = s.y; v.m[8] = s.z; v.m[12] = -vec3_dot(s, e);
+ v.m[1] = u.x; v.m[5] = u.y; v.m[9] = u.z; v.m[13] = -vec3_dot(u, e);
+ v.m[2] = -f.x; v.m[6] = -f.y; v.m[10] = -f.z; v.m[14] = vec3_dot(f, e);
+ v.m[3] = 0.0f; v.m[7] = 0.0f; v.m[11] = 0.0f; v.m[15] = 1.0f;
return v;
}
-mat4 mat4_identity(void) {
- mat4 r = {{0}};
- r.m[0] = r.m[5] = r.m[10] = r.m[15] = 1.0f;
- return r;
-}
-
-mat4 mat4_perspective(float fovy, float aspect, float znear, float zfar) {
- mat4 r = {{0}};
- float f = 1.0f / tanf(0.5f * fovy * PI / 180.0f);
- r.m[0] = f / aspect;
- r.m[5] = f;
- r.m[10] = (zfar + znear) / (znear - zfar);
- r.m[11] = -1.0f;
- r.m[14] = (2.0f * zfar * znear) / (znear - zfar);
- return r;
-}
-
-mat4 mat4_translate(float x, float y, float z) {
- mat4 r = mat4_identity();
- r.m[12] = x;
- r.m[13] = y;
- r.m[14] = z;
- return r;
-}
-
void camera_process_keyboard(float dt) {
float v = camera.speed * dt;
@@ -114,10 +126,10 @@ void camera_process_keyboard(float dt) {
}
void camera_process_mouse(float dx, float dy) {
- camera.yaw += dx * camera.sensitivity;
+ camera.yaw += dx * camera.sensitivity;
camera.pitch += dy * camera.sensitivity;
- if (camera.pitch > 89.0f) camera.pitch = 89.0f;
+ if (camera.pitch > 89.0f) camera.pitch = 89.0f;
if (camera.pitch < -89.0f) camera.pitch = -89.0f;
camera_update_vectors();
diff --git a/dat.h b/dat.h
@@ -11,11 +11,11 @@ typedef struct { float x, y, z; } vec3;
typedef struct { float m[16]; } mat4;
typedef struct {
- vec3 position;
- vec3 front;
- vec3 up;
- vec3 right;
- vec3 world_up;
+ vec3 position;
+ vec3 front;
+ vec3 up;
+ vec3 right;
+ vec3 world_up;
float yaw;
float pitch;
float speed;
@@ -23,6 +23,8 @@ typedef struct {
float fov;
} Camera;
+#define CAMERA_FOV 60
+
#define FACE_BACK 0
#define FACE_FRONT 1
#define FACE_LEFT 2
@@ -45,6 +47,6 @@ extern GLFWwindow *Window;
extern unsigned int Shader;
extern Camera camera;
extern Block blocks[];
-extern int block_count;
+extern int block_count;
#endif /* DAT_H */