module Geomancy.Vulkan.Projection
( reverseDepthRH
, reverseDepthOrthoRH
, orthoRH
) where
import Geomancy.Mat4 (colMajor)
import Geomancy.Transform (Transform(..))
reverseDepthRH
:: Float
-> Float
-> Float -> Float
-> Transform
reverseDepthRH :: Float -> Float -> Float -> Float -> Transform
reverseDepthRH Float
fovRads Float
zn Float
width Float
height =
Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Transform
forall a.
Coercible Mat4 a =>
Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> a
colMajor
Float
sx Float
0 Float
0 Float
0
Float
0 Float
sy Float
0 Float
0
Float
0 Float
0 Float
0 Float
zn
Float
0 Float
0 Float
1 Float
0
where
sx :: Float
sx = Float
sy Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
recipAspect
where
recipAspect :: Float
recipAspect = Float
height Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
width
sy :: Float
sy = Float
1 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float -> Float
forall a. Floating a => a -> a
tan (Float
fovRads Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
2)
orthoRH :: Float -> Float -> Float -> Float -> Transform
orthoRH :: Float -> Float -> Float -> Float -> Transform
orthoRH Float
near Float
far Float
width Float
height =
Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Transform
forall a.
Coercible Mat4 a =>
Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> a
colMajor
Float
sx Float
0 Float
0 Float
0
Float
0 Float
sy Float
0 Float
0
Float
0 Float
0 Float
z Float
w
Float
0 Float
0 Float
0 Float
1
where
sx :: Float
sx = Float
2 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
width
sy :: Float
sy = Float
2 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
height
z :: Float
z = Float
1 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
far Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
near)
w :: Float
w = Float
near Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
near Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
far)
reverseDepthOrthoRH :: Float -> Float -> Float -> Float -> Transform
reverseDepthOrthoRH :: Float -> Float -> Float -> Float -> Transform
reverseDepthOrthoRH Float
near Float
far Float
width Float
height =
Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Transform
forall a.
Coercible Mat4 a =>
Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> a
colMajor
Float
sx Float
0 Float
0 Float
0
Float
0 Float
sy Float
0 Float
0
Float
0 Float
0 Float
z Float
w
Float
0 Float
0 Float
0 Float
1
where
sx :: Float
sx = Float
2 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
width
sy :: Float
sy = Float
2 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
height
z :: Float
z = Float
1 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
near Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
far)
w :: Float
w = Float
far Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ (Float
far Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
near)