commit 73e44436dd889b8a44ef3d90175e20983653b7c2
parent 594a1db68f9a11df3a3a9b037f8a91e84474761c
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Sat,  2 Nov 2024 08:50:50 +0900
rotate
Diffstat:
4 files changed, 59 insertions(+), 7 deletions(-)
diff --git a/cmd/sample/main.go b/cmd/sample/main.go
@@ -122,18 +122,17 @@ func main() {
 	if err := program.SetTexture(texture2, "texture2"); err != nil {
 		log.Fatalf("set texture: %v", err)
 	}
-//	gl.ActiveTexture(gl.TEXTURE0)
-//	gl.BindTexture(gl.TEXTURE_2D, 1)
-//	gl.ActiveTexture(gl.TEXTURE1)
-//	gl.BindTexture(gl.TEXTURE_2D, 2)
 
 	window.SetFramebufferSizeCallback(framebufferSizeCallback)
 
+	transform := tofu.Rotate(math.Pi/4, tofu.Vec3{0, 0, 1})
+
 	for !window.ShouldClose() {
 		processInput(window)
 		gl.ClearColor(0.2, 0.3, 0.3, 1.0)
 		gl.Clear(gl.COLOR_BUFFER_BIT)
 		program.SetFloat32("alpha", alpha)
+		program.SetMat4("transform", transform)
 		gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, nil)
 		window.SwapBuffers()
 		glfw.PollEvents()
diff --git a/cmd/sample/vertex.glsl b/cmd/sample/vertex.glsl
@@ -4,8 +4,9 @@ layout (location = 1) in vec3 col;
 layout (location = 2) in vec2 vtexCoord;
 out vec3 vcol;
 out vec2 texCoord;
+uniform mat4 transform;
 void main() {
-	gl_Position = vec4(pos, 1.0);
+	gl_Position = transform * vec4(pos, 1.0);
 	vcol = col;
 	texCoord = vtexCoord;
 }
diff --git a/math.go b/math.go
@@ -0,0 +1,44 @@
+package tofu
+
+import "math"
+
+type Vec3 [3]float32
+
+// column major
+type Mat4 [16]float32
+
+// Mul multiplies m by n and returns newly allocated result.
+func (m Mat4) Mul(n Mat4) Mat4 {
+	var dst Mat4
+	for i := 0; i < 4; i++ {
+		for j := 0; j < 4; j++ {
+			for k := 0; k < 4; k++ {
+				dst[i+4*j] += m[i+4*k] * n[k+4*j]
+			}
+		}
+	}
+	return dst
+}
+
+func Translate(v Vec3) Mat4 {
+	var n Mat4
+	n[0] = 1
+	n[5] = 1
+	n[10] = 1
+	n[12] = v[0]
+	n[13] = v[1]
+	n[14] = v[2]
+	n[15] = 1
+	return n
+}
+
+func Rotate(rad float32, axis Vec3) Mat4 {
+	x, y, z := axis[0], axis[1], axis[2]
+	c := float32(math.Cos(float64(rad)))
+	d := 1 - c
+	s := float32(math.Sin(float64(rad)))
+	return Mat4{c + x*x*d, y*x*d + z*s, z*x*d - y*s, 0,
+		x*y*d - z*s, c + y*y*d, z*y*d + x*s, 0,
+		x*z*d + y*s, y*z*d - x*s, c + z*z*d, 0,
+		0, 0, 0, 1}
+}
diff --git a/shader.go b/shader.go
@@ -98,6 +98,15 @@ func (p *Program) SetFloat32(name string, val float32) error {
 	return nil
 }
 
+func (p *Program) SetMat4(name string, val Mat4) error {
+	l := gl.GetUniformLocation(p.id, gl.Str(name + "\x00"))
+	if l == -1 {
+		return fmt.Errorf("uniform %s not found", name)
+	}
+	gl.UniformMatrix4fv(l, 1, false, &val[0])
+	return nil
+}
+
 func (p *Program) SetTexture(t *Texture, name string) error {
 	p.Use()
 	gl.ActiveTexture(t.unit)
@@ -108,4 +117,4 @@ func (p *Program) SetTexture(t *Texture, name string) error {
 	}
 	gl.Uniform1i(l, int32(t.unit - gl.TEXTURE0))
 	return nil
-}
-\ No newline at end of file
+}