diff --git a/Terrain2/Math.swift b/Terrain2/Math.swift index 2a3abee..9212444 100644 --- a/Terrain2/Math.swift +++ b/Terrain2/Math.swift @@ -14,3 +14,37 @@ extension float4 { return float3(x, y, z) } } + +// Generic matrix math utility functions +func matrix4x4_rotation(radians: Float, axis: float3) -> matrix_float4x4 { + let unitAxis = normalize(axis) + let ct = cosf(radians) + let st = sinf(radians) + let ci = 1 - ct + let x = unitAxis.x, y = unitAxis.y, z = unitAxis.z + return matrix_float4x4.init(columns:(vector_float4( ct + x * x * ci, y * x * ci + z * st, z * x * ci - y * st, 0), + vector_float4(x * y * ci - z * st, ct + y * y * ci, z * y * ci + x * st, 0), + vector_float4(x * z * ci + y * st, y * z * ci - x * st, ct + z * z * ci, 0), + vector_float4( 0, 0, 0, 1))) +} + +func matrix4x4_translation(_ translationX: Float, _ translationY: Float, _ translationZ: Float) -> matrix_float4x4 { + return matrix_float4x4.init(columns:(vector_float4(1, 0, 0, 0), + vector_float4(0, 1, 0, 0), + vector_float4(0, 0, 1, 0), + vector_float4(translationX, translationY, translationZ, 1))) +} + +func matrix_perspective_right_hand(fovyRadians fovy: Float, aspectRatio: Float, nearZ: Float, farZ: Float) -> matrix_float4x4 { + let ys = 1 / tanf(fovy * 0.5) + let xs = ys / aspectRatio + let zs = farZ / (nearZ - farZ) + return matrix_float4x4.init(columns:(vector_float4(xs, 0, 0, 0), + vector_float4( 0, ys, 0, 0), + vector_float4( 0, 0, zs, -1), + vector_float4( 0, 0, zs * nearZ, 0))) +} + +func radians_from_degrees(_ degrees: Float) -> Float { + return (degrees / 180) * .pi +} diff --git a/Terrain2/Renderer.swift b/Terrain2/Renderer.swift index a9e68b2..03f30ef 100644 --- a/Terrain2/Renderer.swift +++ b/Terrain2/Renderer.swift @@ -387,37 +387,3 @@ class Renderer: NSObject, MTKViewDelegate { encoder.popDebugGroup() } } - -// Generic matrix math utility functions -func matrix4x4_rotation(radians: Float, axis: float3) -> matrix_float4x4 { - let unitAxis = normalize(axis) - let ct = cosf(radians) - let st = sinf(radians) - let ci = 1 - ct - let x = unitAxis.x, y = unitAxis.y, z = unitAxis.z - return matrix_float4x4.init(columns:(vector_float4( ct + x * x * ci, y * x * ci + z * st, z * x * ci - y * st, 0), - vector_float4(x * y * ci - z * st, ct + y * y * ci, z * y * ci + x * st, 0), - vector_float4(x * z * ci + y * st, y * z * ci - x * st, ct + z * z * ci, 0), - vector_float4( 0, 0, 0, 1))) -} - -func matrix4x4_translation(_ translationX: Float, _ translationY: Float, _ translationZ: Float) -> matrix_float4x4 { - return matrix_float4x4.init(columns:(vector_float4(1, 0, 0, 0), - vector_float4(0, 1, 0, 0), - vector_float4(0, 0, 1, 0), - vector_float4(translationX, translationY, translationZ, 1))) -} - -func matrix_perspective_right_hand(fovyRadians fovy: Float, aspectRatio: Float, nearZ: Float, farZ: Float) -> matrix_float4x4 { - let ys = 1 / tanf(fovy * 0.5) - let xs = ys / aspectRatio - let zs = farZ / (nearZ - farZ) - return matrix_float4x4.init(columns:(vector_float4(xs, 0, 0, 0), - vector_float4( 0, ys, 0, 0), - vector_float4( 0, 0, zs, -1), - vector_float4( 0, 0, zs * nearZ, 0))) -} - -func radians_from_degrees(_ degrees: Float) -> Float { - return (degrees / 180) * .pi -}