@@ -87,38 +87,48 @@ function look_at(position, target, up)
8787 X = normalize (normalize (up) × Z)
8888 Y = Z × X
8989
90- SMatrix {4, 4, Float32} (
90+ SMatrix {4, 4, Float32, 16 } (
9191 X[1 ], Y[1 ], Z[1 ], 0f0 ,
9292 X[2 ], Y[2 ], Z[2 ], 0f0 ,
9393 X[3 ], Y[3 ], Z[3 ], 0f0 ,
9494 X ⋅ - position, Y ⋅ - position, Z ⋅ - position, 1f0 )
9595end
9696
97- function _frustum (left, right, bottom, top, znear, zfar)
97+ function _frustum (left, right, bottom, top, znear, zfar; zsign :: Float32 = - 1f0 )
9898 (right == left || bottom == top || znear == zfar) &&
99- return SMatrix {4, 4, Float32} (I)
99+ return SMatrix {4, 4, Float32, 16 } (I)
100100
101101 rl = 1f0 / (right - left)
102102 tb = 1f0 / (top - bottom)
103103 zz = 1f0 / (zfar - znear)
104104
105- SMatrix {4, 4, Float32} (
105+ SMatrix {4, 4, Float32, 16 } (
106106 2f0 * znear * rl, 0f0 , 0f0 , 0f0 ,
107107 0f0 , 2f0 * znear * tb, 0f0 , 0f0 ,
108- (right + left) * rl, (top + bottom) * tb, - (zfar + znear) * zz, - 1f0 ,
108+ (right + left) * rl, (top + bottom) * tb, zsign * (zfar + znear) * zz, zsign ,
109109 0f0 , 0f0 , (- 2f0 * znear * zfar) * zz, 0f0 )
110110end
111111
112112"""
113+ - `fovx`: In degrees.
113114- `fovy`: In degrees.
114115"""
115- function perspective (fovy, aspect, znear, zfar)
116+ function perspective (fovx, fovy, znear, zfar; zsign:: Float32 = - 1f0 )
117+ (znear == zfar) &&
118+ error (" znear `$znear ` must be different from zfar `$zfar `" )
119+
120+ w = tan (0.5f0 * deg2rad (fovx)) * znear
121+ h = tan (0.5f0 * deg2rad (fovy)) * znear
122+ _frustum (- w, w, - h, h, znear, zfar; zsign)
123+ end
124+
125+ function perspective (fovy, znear, zfar; aspect:: Float32 , zsign:: Float32 = - 1f0 )
116126 (znear == zfar) &&
117127 error (" znear `$znear ` must be different from zfar `$zfar `" )
118128
119129 h = tan (0.5f0 * deg2rad (fovy)) * znear
120130 w = h * aspect
121- _frustum (- w, w, - h, h, znear, zfar)
131+ _frustum (- w, w, - h, h, znear, zfar; zsign )
122132end
123133
124134abstract type AbstractTexture end
0 commit comments