sdl phase 2
This commit is contained in:
@@ -4,19 +4,27 @@
|
||||
|
||||
PI :f32: 3.14159265;
|
||||
|
||||
// ---- Matrix math (column-major [16]f32, passed as [*]f32) ----
|
||||
vec4 :: (x: f32, y: f32, z: f32, w: f32) -> Vector(4, f32) {
|
||||
.[x, y, z, w];
|
||||
}
|
||||
|
||||
mat4_zero :: (m: [*]f32) {
|
||||
// ---- Matrix44: column-major 4×4 matrix ----
|
||||
|
||||
Matrix44 :: struct {
|
||||
data: [16]f32;
|
||||
}
|
||||
|
||||
mat4_zero :: (m: *Matrix44) {
|
||||
i := 0;
|
||||
while i < 16 { m[i] = 0.0; i += 1; }
|
||||
while i < 16 { m.data[i] = 0.0; i += 1; }
|
||||
}
|
||||
|
||||
mat4_identity :: (m: [*]f32) {
|
||||
mat4_identity :: (m: *Matrix44) {
|
||||
mat4_zero(m);
|
||||
m[0] = 1.0; m[5] = 1.0; m[10] = 1.0; m[15] = 1.0;
|
||||
m.data[0] = 1.0; m.data[5] = 1.0; m.data[10] = 1.0; m.data[15] = 1.0;
|
||||
}
|
||||
|
||||
mat4_multiply :: (out: [*]f32, a: [*]f32, b: [*]f32) {
|
||||
mat4_multiply :: (out: *Matrix44, a: *Matrix44, b: *Matrix44) {
|
||||
tmp : [16]f32 = ---;
|
||||
j := 0;
|
||||
while j < 4 {
|
||||
@@ -25,7 +33,7 @@ mat4_multiply :: (out: [*]f32, a: [*]f32, b: [*]f32) {
|
||||
sum : f32 = 0.0;
|
||||
k := 0;
|
||||
while k < 4 {
|
||||
sum = sum + a[k * 4 + i] * b[j * 4 + k];
|
||||
sum = sum + a.data[k * 4 + i] * b.data[j * 4 + k];
|
||||
k += 1;
|
||||
}
|
||||
tmp[j * 4 + i] = sum;
|
||||
@@ -34,64 +42,63 @@ mat4_multiply :: (out: [*]f32, a: [*]f32, b: [*]f32) {
|
||||
j += 1;
|
||||
}
|
||||
i := 0;
|
||||
while i < 16 { out[i] = tmp[i]; i += 1; }
|
||||
while i < 16 { out.data[i] = tmp[i]; i += 1; }
|
||||
}
|
||||
|
||||
mat4_perspective :: (m: [*]f32, fov: f32, aspect: f32, near: f32, far: f32) {
|
||||
mat4_perspective :: (m: *Matrix44, fov: f32, aspect: f32, near: f32, far: f32) {
|
||||
mat4_zero(m);
|
||||
half := fov / 2.0;
|
||||
f := cos(half) / sin(half);
|
||||
m[0] = f / aspect;
|
||||
m[5] = f;
|
||||
m[10] = (far + near) / (near - far);
|
||||
m[11] = -1.0;
|
||||
m[14] = (2.0 * far * near) / (near - far);
|
||||
m.data[0] = f / aspect;
|
||||
m.data[5] = f;
|
||||
m.data[10] = (far + near) / (near - far);
|
||||
m.data[11] = -1.0;
|
||||
m.data[14] = (2.0 * far * near) / (near - far);
|
||||
}
|
||||
|
||||
mat4_rotate_y :: (m: [*]f32, angle: f32) {
|
||||
mat4_rotate_y :: (m: *Matrix44, angle: f32) {
|
||||
mat4_zero(m);
|
||||
c := cos(angle);
|
||||
s := sin(angle);
|
||||
m[0] = c;
|
||||
m[2] = 0.0 - s;
|
||||
m[5] = 1.0;
|
||||
m[8] = s;
|
||||
m[10] = c;
|
||||
m[15] = 1.0;
|
||||
m.data[0] = c;
|
||||
m.data[2] = 0.0 - s;
|
||||
m.data[5] = 1.0;
|
||||
m.data[8] = s;
|
||||
m.data[10] = c;
|
||||
m.data[15] = 1.0;
|
||||
}
|
||||
|
||||
mat4_rotate_x :: (m: [*]f32, angle: f32) {
|
||||
mat4_rotate_x :: (m: *Matrix44, angle: f32) {
|
||||
mat4_zero(m);
|
||||
c := cos(angle);
|
||||
s := sin(angle);
|
||||
m[0] = 1.0;
|
||||
m[5] = c;
|
||||
m[6] = s;
|
||||
m[9] = 0.0 - s;
|
||||
m[10] = c;
|
||||
m[15] = 1.0;
|
||||
m.data[0] = 1.0;
|
||||
m.data[5] = c;
|
||||
m.data[6] = s;
|
||||
m.data[9] = 0.0 - s;
|
||||
m.data[10] = c;
|
||||
m.data[15] = 1.0;
|
||||
}
|
||||
|
||||
mat4_translate :: (m: [*]f32, tx: f32, ty: f32, tz: f32) {
|
||||
mat4_translate :: (m: *Matrix44, tx: f32, ty: f32, tz: f32) {
|
||||
mat4_identity(m);
|
||||
m[12] = tx;
|
||||
m[13] = ty;
|
||||
m[14] = tz;
|
||||
m.data[12] = tx;
|
||||
m.data[13] = ty;
|
||||
m.data[14] = tz;
|
||||
}
|
||||
|
||||
// ---- Shader helpers ----
|
||||
|
||||
compile_shader :: (shader_type: u32, source: [:0]u8) -> u32 {
|
||||
shader : u32 = glCreateShader(shader_type);
|
||||
src_ptr : *void = xx &source[0];
|
||||
glShaderSource(shader, 1, xx &src_ptr, null);
|
||||
glShaderSource(shader, 1, source, null);
|
||||
glCompileShader(shader);
|
||||
|
||||
status : s32 = 0;
|
||||
glGetShaderiv(shader, GL_COMPILE_STATUS, xx &status);
|
||||
glGetShaderiv(shader, GL_COMPILE_STATUS, status);
|
||||
if status == GL_FALSE {
|
||||
log_buf : [512]u8 = ---;
|
||||
glGetShaderInfoLog(shader, 512, null, xx &log_buf[0]);
|
||||
glGetShaderInfoLog(shader, 512, null, log_buf);
|
||||
print("Shader compile error\n");
|
||||
}
|
||||
shader;
|
||||
@@ -107,10 +114,10 @@ create_program :: (vert_src: [:0]u8, frag_src: [:0]u8) -> u32 {
|
||||
glLinkProgram(prog);
|
||||
|
||||
status : s32 = 0;
|
||||
glGetProgramiv(prog, GL_LINK_STATUS, xx &status);
|
||||
glGetProgramiv(prog, GL_LINK_STATUS, status);
|
||||
if status == GL_FALSE {
|
||||
log_buf : [512]u8 = ---;
|
||||
glGetProgramInfoLog(prog, 512, null, xx &log_buf[0]);
|
||||
glGetProgramInfoLog(prog, 512, null, log_buf);
|
||||
print("Program link error\n");
|
||||
}
|
||||
|
||||
@@ -189,68 +196,68 @@ GLSL;
|
||||
light_loc : s32 = glGetUniformLocation(program, "uLightDir");
|
||||
wire_loc : s32 = glGetUniformLocation(program, "uWire");
|
||||
|
||||
// Cube vertices: position(3) + normal(3), 36 vertices = 216 floats
|
||||
vertices : [216]f32 = .[
|
||||
// Cube vertices: pos(vec4 w=1) + normal(vec4 w=0), 36 vertices × 2 vec4s = 72
|
||||
vertices : []Vector(4, f32) = .[
|
||||
// Front face (z = +0.5)
|
||||
-0.5, -0.5, 0.5, 0.0, 0.0, 1.0,
|
||||
0.5, -0.5, 0.5, 0.0, 0.0, 1.0,
|
||||
0.5, 0.5, 0.5, 0.0, 0.0, 1.0,
|
||||
-0.5, -0.5, 0.5, 0.0, 0.0, 1.0,
|
||||
0.5, 0.5, 0.5, 0.0, 0.0, 1.0,
|
||||
-0.5, 0.5, 0.5, 0.0, 0.0, 1.0,
|
||||
vec4(-0.5, -0.5, 0.5, 1.0), vec4( 0.0, 0.0, 1.0, 0.0),
|
||||
vec4( 0.5, -0.5, 0.5, 1.0), vec4( 0.0, 0.0, 1.0, 0.0),
|
||||
vec4( 0.5, 0.5, 0.5, 1.0), vec4( 0.0, 0.0, 1.0, 0.0),
|
||||
vec4(-0.5, -0.5, 0.5, 1.0), vec4( 0.0, 0.0, 1.0, 0.0),
|
||||
vec4( 0.5, 0.5, 0.5, 1.0), vec4( 0.0, 0.0, 1.0, 0.0),
|
||||
vec4(-0.5, 0.5, 0.5, 1.0), vec4( 0.0, 0.0, 1.0, 0.0),
|
||||
// Back face (z = -0.5)
|
||||
0.5, -0.5, -0.5, 0.0, 0.0, -1.0,
|
||||
-0.5, -0.5, -0.5, 0.0, 0.0, -1.0,
|
||||
-0.5, 0.5, -0.5, 0.0, 0.0, -1.0,
|
||||
0.5, -0.5, -0.5, 0.0, 0.0, -1.0,
|
||||
-0.5, 0.5, -0.5, 0.0, 0.0, -1.0,
|
||||
0.5, 0.5, -0.5, 0.0, 0.0, -1.0,
|
||||
vec4( 0.5, -0.5, -0.5, 1.0), vec4( 0.0, 0.0, -1.0, 0.0),
|
||||
vec4(-0.5, -0.5, -0.5, 1.0), vec4( 0.0, 0.0, -1.0, 0.0),
|
||||
vec4(-0.5, 0.5, -0.5, 1.0), vec4( 0.0, 0.0, -1.0, 0.0),
|
||||
vec4( 0.5, -0.5, -0.5, 1.0), vec4( 0.0, 0.0, -1.0, 0.0),
|
||||
vec4(-0.5, 0.5, -0.5, 1.0), vec4( 0.0, 0.0, -1.0, 0.0),
|
||||
vec4( 0.5, 0.5, -0.5, 1.0), vec4( 0.0, 0.0, -1.0, 0.0),
|
||||
// Top face (y = +0.5)
|
||||
-0.5, 0.5, 0.5, 0.0, 1.0, 0.0,
|
||||
0.5, 0.5, 0.5, 0.0, 1.0, 0.0,
|
||||
0.5, 0.5, -0.5, 0.0, 1.0, 0.0,
|
||||
-0.5, 0.5, 0.5, 0.0, 1.0, 0.0,
|
||||
0.5, 0.5, -0.5, 0.0, 1.0, 0.0,
|
||||
-0.5, 0.5, -0.5, 0.0, 1.0, 0.0,
|
||||
vec4(-0.5, 0.5, 0.5, 1.0), vec4( 0.0, 1.0, 0.0, 0.0),
|
||||
vec4( 0.5, 0.5, 0.5, 1.0), vec4( 0.0, 1.0, 0.0, 0.0),
|
||||
vec4( 0.5, 0.5, -0.5, 1.0), vec4( 0.0, 1.0, 0.0, 0.0),
|
||||
vec4(-0.5, 0.5, 0.5, 1.0), vec4( 0.0, 1.0, 0.0, 0.0),
|
||||
vec4( 0.5, 0.5, -0.5, 1.0), vec4( 0.0, 1.0, 0.0, 0.0),
|
||||
vec4(-0.5, 0.5, -0.5, 1.0), vec4( 0.0, 1.0, 0.0, 0.0),
|
||||
// Bottom face (y = -0.5)
|
||||
-0.5, -0.5, -0.5, 0.0, -1.0, 0.0,
|
||||
0.5, -0.5, -0.5, 0.0, -1.0, 0.0,
|
||||
0.5, -0.5, 0.5, 0.0, -1.0, 0.0,
|
||||
-0.5, -0.5, -0.5, 0.0, -1.0, 0.0,
|
||||
0.5, -0.5, 0.5, 0.0, -1.0, 0.0,
|
||||
-0.5, -0.5, 0.5, 0.0, -1.0, 0.0,
|
||||
vec4(-0.5, -0.5, -0.5, 1.0), vec4( 0.0, -1.0, 0.0, 0.0),
|
||||
vec4( 0.5, -0.5, -0.5, 1.0), vec4( 0.0, -1.0, 0.0, 0.0),
|
||||
vec4( 0.5, -0.5, 0.5, 1.0), vec4( 0.0, -1.0, 0.0, 0.0),
|
||||
vec4(-0.5, -0.5, -0.5, 1.0), vec4( 0.0, -1.0, 0.0, 0.0),
|
||||
vec4( 0.5, -0.5, 0.5, 1.0), vec4( 0.0, -1.0, 0.0, 0.0),
|
||||
vec4(-0.5, -0.5, 0.5, 1.0), vec4( 0.0, -1.0, 0.0, 0.0),
|
||||
// Right face (x = +0.5)
|
||||
0.5, -0.5, 0.5, 1.0, 0.0, 0.0,
|
||||
0.5, -0.5, -0.5, 1.0, 0.0, 0.0,
|
||||
0.5, 0.5, -0.5, 1.0, 0.0, 0.0,
|
||||
0.5, -0.5, 0.5, 1.0, 0.0, 0.0,
|
||||
0.5, 0.5, -0.5, 1.0, 0.0, 0.0,
|
||||
0.5, 0.5, 0.5, 1.0, 0.0, 0.0,
|
||||
vec4( 0.5, -0.5, 0.5, 1.0), vec4( 1.0, 0.0, 0.0, 0.0),
|
||||
vec4( 0.5, -0.5, -0.5, 1.0), vec4( 1.0, 0.0, 0.0, 0.0),
|
||||
vec4( 0.5, 0.5, -0.5, 1.0), vec4( 1.0, 0.0, 0.0, 0.0),
|
||||
vec4( 0.5, -0.5, 0.5, 1.0), vec4( 1.0, 0.0, 0.0, 0.0),
|
||||
vec4( 0.5, 0.5, -0.5, 1.0), vec4( 1.0, 0.0, 0.0, 0.0),
|
||||
vec4( 0.5, 0.5, 0.5, 1.0), vec4( 1.0, 0.0, 0.0, 0.0),
|
||||
// Left face (x = -0.5)
|
||||
-0.5, -0.5, -0.5, -1.0, 0.0, 0.0,
|
||||
-0.5, -0.5, 0.5, -1.0, 0.0, 0.0,
|
||||
-0.5, 0.5, 0.5, -1.0, 0.0, 0.0,
|
||||
-0.5, -0.5, -0.5, -1.0, 0.0, 0.0,
|
||||
-0.5, 0.5, 0.5, -1.0, 0.0, 0.0,
|
||||
-0.5, 0.5, -0.5, -1.0, 0.0, 0.0
|
||||
vec4(-0.5, -0.5, -0.5, 1.0), vec4(-1.0, 0.0, 0.0, 0.0),
|
||||
vec4(-0.5, -0.5, 0.5, 1.0), vec4(-1.0, 0.0, 0.0, 0.0),
|
||||
vec4(-0.5, 0.5, 0.5, 1.0), vec4(-1.0, 0.0, 0.0, 0.0),
|
||||
vec4(-0.5, -0.5, -0.5, 1.0), vec4(-1.0, 0.0, 0.0, 0.0),
|
||||
vec4(-0.5, 0.5, 0.5, 1.0), vec4(-1.0, 0.0, 0.0, 0.0),
|
||||
vec4(-0.5, 0.5, -0.5, 1.0), vec4(-1.0, 0.0, 0.0, 0.0)
|
||||
];
|
||||
|
||||
// Create VAO and VBO
|
||||
vao : u32 = 0;
|
||||
vbo : u32 = 0;
|
||||
glGenVertexArrays(1, xx &vao);
|
||||
glGenBuffers(1, xx &vbo);
|
||||
glGenVertexArrays(1, vao);
|
||||
glGenBuffers(1, vbo);
|
||||
|
||||
glBindVertexArray(vao);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||
glBufferData(GL_ARRAY_BUFFER, 864, xx &vertices[0], GL_STATIC_DRAW);
|
||||
glBufferData(GL_ARRAY_BUFFER, 1152, xx vertices, GL_STATIC_DRAW);
|
||||
|
||||
// Position attribute (location 0): 3 floats, stride 24 bytes, offset 0
|
||||
glVertexAttribPointer(0, 3, GL_FLOAT, 0, 24, xx 0);
|
||||
// Position attribute (location 0): 3 floats, stride 32 bytes, offset 0
|
||||
glVertexAttribPointer(0, 3, GL_FLOAT, 0, 32, xx 0);
|
||||
glEnableVertexAttribArray(0);
|
||||
|
||||
// Normal attribute (location 1): 3 floats, stride 24 bytes, offset 12
|
||||
glVertexAttribPointer(1, 3, GL_FLOAT, 0, 24, xx 12);
|
||||
// Normal attribute (location 1): 3 floats, stride 32 bytes, offset 16
|
||||
glVertexAttribPointer(1, 3, GL_FLOAT, 0, 32, xx 16);
|
||||
glEnableVertexAttribArray(1);
|
||||
|
||||
// Set light direction
|
||||
@@ -275,31 +282,28 @@ GLSL;
|
||||
angle := ms * 0.001;
|
||||
|
||||
// Build matrices
|
||||
proj : [16]f32 = ---;
|
||||
mat4_perspective(xx &proj[0], PI / 4.0, 800.0 / 600.0, 0.1, 100.0);
|
||||
proj : Matrix44 = ---;
|
||||
mat4_perspective(proj, PI / 4.0, 800.0 / 600.0, 0.1, 100.0);
|
||||
|
||||
view : [16]f32 = ---;
|
||||
mat4_translate(xx &view[0], 0.0, 0.0, -3.0);
|
||||
view : Matrix44 = ---;
|
||||
mat4_translate(view, 0.0, 0.0, -3.0);
|
||||
|
||||
rot_y : [16]f32 = ---;
|
||||
mat4_rotate_y(xx &rot_y[0], angle);
|
||||
rot_y : Matrix44 = ---;
|
||||
mat4_rotate_y(rot_y, angle);
|
||||
|
||||
rot_x : [16]f32 = ---;
|
||||
mat4_rotate_x(xx &rot_x[0], angle * 0.7);
|
||||
rot_x : Matrix44 = ---;
|
||||
mat4_rotate_x(rot_x, angle * 0.7);
|
||||
|
||||
// model = rot_y * rot_x
|
||||
model : [16]f32 = ---;
|
||||
mat4_multiply(xx &model[0], xx &rot_y[0], xx &rot_x[0]);
|
||||
model : Matrix44 = ---;
|
||||
mat4_multiply(model, rot_y, rot_x);
|
||||
|
||||
// view_model = view * model
|
||||
vm : [16]f32 = ---;
|
||||
mat4_multiply(xx &vm[0], xx &view[0], xx &model[0]);
|
||||
vm : Matrix44 = ---;
|
||||
mat4_multiply(vm, view, model);
|
||||
|
||||
// mvp = proj * view_model
|
||||
mvp : [16]f32 = ---;
|
||||
mat4_multiply(xx &mvp[0], xx &proj[0], xx &vm[0]);
|
||||
mvp : Matrix44 = ---;
|
||||
mat4_multiply(mvp, proj, vm);
|
||||
|
||||
glUniformMatrix4fv(mvp_loc, 1, 0, xx &mvp[0]);
|
||||
glUniformMatrix4fv(mvp_loc, 1, 0, mvp.data);
|
||||
|
||||
glClearColor(0.1, 0.1, 0.15, 1.0);
|
||||
glClear(GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
@@ -34,26 +34,26 @@ glDrawArrays : (u32, s32, s32) -> void = ---;
|
||||
glPolygonMode : (u32, u32) -> void = ---;
|
||||
glLineWidth : (f32) -> void = ---;
|
||||
glCreateShader : (u32) -> u32 = ---;
|
||||
glShaderSource : (u32, s32, *void, *void) -> void = ---;
|
||||
glShaderSource : (u32, s32, *[:0]u8, *s32) -> void = ---;
|
||||
glCompileShader : (u32) -> void = ---;
|
||||
glGetShaderiv : (u32, u32, *void) -> void = ---;
|
||||
glGetShaderInfoLog : (u32, s32, *void, *void) -> void = ---;
|
||||
glGetShaderiv : (u32, u32, *s32) -> void = ---;
|
||||
glGetShaderInfoLog : (u32, s32, *s32, [*]u8) -> void = ---;
|
||||
glCreateProgram : () -> u32 = ---;
|
||||
glAttachShader : (u32, u32) -> void = ---;
|
||||
glLinkProgram : (u32) -> void = ---;
|
||||
glGetProgramiv : (u32, u32, *void) -> void = ---;
|
||||
glGetProgramInfoLog : (u32, s32, *void, *void) -> void = ---;
|
||||
glGetProgramiv : (u32, u32, *s32) -> void = ---;
|
||||
glGetProgramInfoLog : (u32, s32, *s32, [*]u8) -> void = ---;
|
||||
glUseProgram : (u32) -> void = ---;
|
||||
glDeleteShader : (u32) -> void = ---;
|
||||
glGenVertexArrays : (s32, *void) -> void = ---;
|
||||
glGenBuffers : (s32, *void) -> void = ---;
|
||||
glGenVertexArrays : (s32, *u32) -> void = ---;
|
||||
glGenBuffers : (s32, *u32) -> void = ---;
|
||||
glBindVertexArray : (u32) -> void = ---;
|
||||
glBindBuffer : (u32, u32) -> void = ---;
|
||||
glBufferData : (u32, s64, *void, u32) -> void = ---;
|
||||
glVertexAttribPointer : (u32, s32, u32, u8, s32, *void) -> void = ---;
|
||||
glEnableVertexAttribArray : (u32) -> void = ---;
|
||||
glGetUniformLocation : (u32, [:0]u8) -> s32 = ---;
|
||||
glUniformMatrix4fv : (s32, s32, u8, *void) -> void = ---;
|
||||
glUniformMatrix4fv : (s32, s32, u8, [16]f32) -> void = ---;
|
||||
glUniform3f : (s32, f32, f32, f32) -> void = ---;
|
||||
glDepthFunc : (u32) -> void = ---;
|
||||
glUniform1f : (s32, f32) -> void = ---;
|
||||
|
||||
Reference in New Issue
Block a user