summary refs log tree commit diff
diff options
context:
space:
mode:
authorWormHeamer2025-07-18 22:08:25 -0400
committerWormHeamer2025-07-18 22:08:25 -0400
commit17fd0a37e35fedeacb9095879fd26e9e93c966ca (patch)
tree6593d7900182314820722f464e12bc720c87bab7
parentcc0ca67cfe3397d73c810f7f04817b7cba4c9ed4 (diff)
camera uniform!
-rw-r--r--Makefile2
-rw-r--r--sdl_gpu_test.c48
-rw-r--r--shader/tri.frag5
-rw-r--r--shader/tri.vert11
4 files changed, 49 insertions, 17 deletions
diff --git a/Makefile b/Makefile
index 0c71d9e..bf013d0 100644
--- a/Makefile
+++ b/Makefile
@@ -11,7 +11,7 @@ clean:
 	rm -fv ${EXE} ${SPIRV}
 
 ${EXE}: *.c
-	${CC} -Os -Wall -std=c23 $< -o $@ -lSDL3
+	${CC} -Os -Wall -std=c23 $< -o $@ -lSDL3 -lm
 
 %.spv: %
 	glslc -O -c "$<" -o "$@"
diff --git a/sdl_gpu_test.c b/sdl_gpu_test.c
index 8bc6b73..30e6b83 100644
--- a/sdl_gpu_test.c
+++ b/sdl_gpu_test.c
@@ -3,8 +3,11 @@
 #define SDL_MAIN_USE_CALLBACKS 1
 #include <SDL3/SDL_main.h>
 #include <SDL3/SDL_gpu.h>
+#include <SDL3/SDL_timer.h>
+#include <cglm/cglm.h>
 #include <math.h>
 #include <stdio.h>
+#include <string.h>
 #include <err.h>
 
 SDL_Window *win;
@@ -202,6 +205,14 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) {
 	return SDL_APP_CONTINUE;
 }
 
+void build_cam_mat(mat4 dest, float width, float height, float x, float y, float scale, float rot) {
+	glm_mat4_identity(dest);
+	glm_scale(dest, (vec3) { height < width ? 1 : height / width, height < width ? width / height : 1, 1 });
+	glm_scale_uni(dest, scale);
+	glm_rotate_z(dest, rot, dest);
+	glm_translate(dest, (vec3) { -x, -y, 0 });
+}
+
 SDL_AppResult SDL_AppIterate(void *appstate) {
 	(void)appstate;
 
@@ -213,17 +224,32 @@ SDL_AppResult SDL_AppIterate(void *appstate) {
 	CHECK(SDL_WaitAndAcquireGPUSwapchainTexture(cmdbuf, win, &swapchain, &swc_width, &swc_height), "swapchain texture acquisition");
 	CHECK(swapchain, "nil swapchain texture");
 
-	float how = (float)swc_height / (float)swc_width;
-	float woh = (float)swc_width / (float)swc_height;
-	float scale = (32 * 2) / fminf(swc_width, swc_height);
-	float scale_x = (swc_height < swc_width ? how : 1) * scale;
-	float scale_y = (swc_height < swc_width ? 1 : woh) * scale;
-	float cam_mat[4][4] = {
-		{ scale_x, 0, 0, 0, },
-		{ 0, scale_y, 0, 0, },
-		{ 0, 0, 1, 0, },
-		{ 0, 0, 0, 1, },
-	};
+	static float t = 0;
+	static Uint64 last = 0;
+	Uint64 now = SDL_GetTicksNS();
+	float dt = (now - last) / 1e9;
+	last = now;
+	t += dt;
+
+	float mx, my;
+	SDL_GetMouseState(&mx, &my);
+	mx -= swc_width * 0.5f;
+	my -= swc_height * 0.5f;
+	mx *= 1.0f / fminf(swc_width, swc_height);
+	my *= 1.0f / fminf(swc_width, swc_height);
+
+	float rot = t;
+
+	mat4 cam_mat;
+	static float x = 0, y = 0;
+
+	float s = sinf(-rot), c = cosf(-rot);
+
+	float dx = mx * dt * 10;
+	float dy = -my * dt * 10;
+	x += dx * c - dy * s;
+	y += dy * c + dx * s;
+	build_cam_mat(cam_mat, swc_width, swc_height, x, y, 0.1, rot);
 	SDL_PushGPUVertexUniformData(cmdbuf, 0, &cam_mat, sizeof(cam_mat));
 	SDL_GPURenderPass *render_pass = SDL_BeginGPURenderPass(
 		cmdbuf,
diff --git a/shader/tri.frag b/shader/tri.frag
index 5599421..dea0868 100644
--- a/shader/tri.frag
+++ b/shader/tri.frag
@@ -1,8 +1,9 @@
 #version 450
 
-layout(location = 0) in vec4 in_pos;
+layout(location = 0) in vec2 uv;
 layout(location = 0) out vec4 out_color;
 
 void main(void) {
-	out_color = vec4(in_pos.xy + vec2(0.5,0.5), 0, 1.0);
+	float n = 2 * length(uv - 0.5);
+	out_color = vec4(vec3(uv, 1) * (1.75 - n), float(n<1));
 }
diff --git a/shader/tri.vert b/shader/tri.vert
index 701d7c6..750b2a3 100644
--- a/shader/tri.vert
+++ b/shader/tri.vert
@@ -1,9 +1,14 @@
 #version 450
 
+layout(set = 1, binding = 0) uniform UBO {
+	mat4 camera;
+};
+
 layout(location = 0) in vec2 in_pos;
-layout(location = 0) out vec4 out_pos;
+layout(location = 1) in vec2 in_uv;
+layout(location = 0) out vec2 out_uv;
 
 void main() {
-	gl_Position = vec4(in_pos.x, in_pos.y, 0.0, 1.0);
-	out_pos = gl_Position;
+	gl_Position = camera * vec4(in_pos, 0.0, 1.0);
+	out_uv = in_uv;
 }