lambdacube-compiler-0.6.0.0: backendtest/EditorExamplesTest.hs
{-# LANGUAGE LambdaCase #-}
module EditorExamplesTest (getRenderJob) where
import Control.Monad
import qualified Data.Vector as V
import qualified Data.Map as Map
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base64 as B64
import Data.ByteString.Char8 (unpack)
import System.FilePath
import System.Directory
import Data.Aeson
import Data.Vect
import TestData as TD
import LambdaCube.Linear
import LambdaCube.IR
import LambdaCube.PipelineSchema
import LambdaCube.PipelineSchemaUtil
import LambdaCube.Mesh
import LambdaCube.Compiler as LambdaCube -- compiler
{-
../test-data/editor-examples
let inputSchema =
{ slots : fromArray [ Tuple "stream4" {primitive: Triangles, attributes: fromArray [Tuple "position4" TV4F, Tuple "vertexUV" TV2F]}
]
, uniforms : fromArray
+[ Tuple "MVP" M44F
+, Tuple "Time" Float
+, Tuple "Diffuse" FTexture2D
]
}
-}
inputSchema = makeSchema $ do
defObjectArray "stream4" Triangles $ do
"position4" @: Attribute_V4F
"vertexUV" @: Attribute_V2F
defUniforms $ do
"Time" @: Float
"MVP" @: M44F
"Diffuse" @: FTexture2D
frame t m = Frame
{ renderCount = 10
, frameUniforms = Map.fromList [("Time",VFloat t), ("MVP",VM44F m)]
, frameTextures = Map.fromList [("Diffuse",0)]
}
scene wh = Scene
{ TD.objectArrays = Map.fromList [("stream4", V.fromList [0])]
, renderTargetWidth = wh
, renderTargetHeight = wh
, frames = V.fromList [frame t (mvp t) | t <- [0..10]]
}
where
mvp t =
let camPos = Vec3 3.0 1.3 0.3
camTarget = Vec3 0.0 0.0 0.0
camUp = Vec3 0.0 1.0 0.0
near = 0.1
far = 100.0
fovDeg = 30.0
angle = pi / 24.0 * t
cm = fromProjective $ lookat camPos camTarget camUp
mm = fromProjective $ orthogonal $ toOrthoUnsafe $ rotMatrixY angle
pm = perspective near far (fovDeg / 180 * pi) (fromIntegral wh / fromIntegral wh)
in mat4ToM44F $ mm .*. cm .*. pm
getRenderJob = do
let path = "./testdata/editor-examples"
tests <- filter ((".lc" ==) . takeExtension) <$> getDirectoryContents path
print tests
ppls <- forM tests $ \name -> do
putStrLn $ "compile: " ++ name
LambdaCube.compileMain [path] OpenGL33 name >>= \case
Left err -> fail $ "compile error:\n" ++ show err
Right ppl -> return $ PipelineInfo
{ pipelineName = path </> name
, pipeline = ppl
}
img <- unpack . B64.encode <$> BS.readFile "./backend-test-data/editor/logo256x256.png"
let job = RenderJob
{ meshes = V.fromList [cubeMesh]
, TD.textures = V.fromList [img]
, schema = inputSchema
, scenes = V.fromList [scene 64]
, pipelines = V.fromList ppls
}
return ("editor",job)
g_vertex_buffer_data =
[ V4 1.0 1.0 (-1.0) 1.0
, V4 1.0 (-1.0) (-1.0) 1.0
, V4 (-1.0) (-1.0) (-1.0) 1.0
, V4 1.0 1.0 (-1.0) 1.0
, V4 (-1.0) (-1.0) (-1.0) 1.0
, V4 (-1.0) 1.0 (-1.0) 1.0
, V4 1.0 1.0 (-1.0) 1.0
, V4 1.0 1.0 1.0 1.0
, V4 1.0 (-1.0) 1.0 1.0
, V4 1.0 1.0 (-1.0) 1.0
, V4 1.0 (-1.0) 1.0 1.0
, V4 1.0 (-1.0) (-1.0) 1.0
, V4 1.0 1.0 1.0 1.0
, V4 (-1.0) (-1.0) 1.0 1.0
, V4 1.0 (-1.0) 1.0 1.0
, V4 1.0 1.0 1.0 1.0
, V4 (-1.0) 1.0 1.0 1.0
, V4 (-1.0) (-1.0) 1.0 1.0
, V4 (-1.0) 1.0 1.0 1.0
, V4 (-1.0) (-1.0) (-1.0) 1.0
, V4 (-1.0) (-1.0) 1.0 1.0
, V4 (-1.0) 1.0 1.0 1.0
, V4 (-1.0) 1.0 (-1.0) 1.0
, V4 (-1.0) (-1.0) (-1.0) 1.0
, V4 1.0 1.0 (-1.0) 1.0
, V4 (-1.0) 1.0 (-1.0) 1.0
, V4 (-1.0) 1.0 1.0 1.0
, V4 1.0 1.0 (-1.0) 1.0
, V4 (-1.0) 1.0 1.0 1.0
, V4 1.0 1.0 1.0 1.0
, V4 1.0 (-1.0) (-1.0) 1.0
, V4 1.0 (-1.0) 1.0 1.0
, V4 (-1.0) (-1.0) 1.0 1.0
, V4 1.0 (-1.0) (-1.0) 1.0
, V4 (-1.0) (-1.0) 1.0 1.0
, V4 (-1.0) (-1.0) (-1.0) 1.0
]
-- Two UV coordinatesfor each vertex. They were created with Blender.
g_uv_buffer_data =
[ V2 0.0 1.0
, V2 0.0 0.0
, V2 1.0 0.0
, V2 0.0 1.0
, V2 1.0 0.0
, V2 1.0 1.0
, V2 0.0 1.0
, V2 1.0 1.0
, V2 1.0 0.0
, V2 0.0 1.0
, V2 1.0 0.0
, V2 0.0 0.0
, V2 1.0 1.0
, V2 0.0 0.0
, V2 1.0 0.0
, V2 1.0 1.0
, V2 0.0 1.0
, V2 0.0 0.0
, V2 0.0 1.0
, V2 1.0 0.0
, V2 0.0 0.0
, V2 0.0 1.0
, V2 1.0 1.0
, V2 1.0 0.0
, V2 0.0 1.0
, V2 1.0 1.0
, V2 1.0 0.0
, V2 0.0 1.0
, V2 1.0 0.0
, V2 0.0 0.0
, V2 0.0 1.0
, V2 0.0 0.0
, V2 1.0 0.0
, V2 0.0 1.0
, V2 1.0 0.0
, V2 1.0 1.0
]
cubeMesh = Mesh
{ mAttributes = Map.fromList
[ ("position4", A_V4F $ V.fromList g_vertex_buffer_data)
, ("vertexUV", A_V2F $ V.fromList g_uv_buffer_data)
]
, mPrimitive = P_Triangles
}
vec4ToV4F (Vec4 x y z w) = V4 x y z w
mat4ToM44F (Mat4 a b c d) = V4 (vec4ToV4F a) (vec4ToV4F b) (vec4ToV4F c) (vec4ToV4F d)
-- | Camera transformation matrix.
lookat :: Vec3 -- ^ Camera position.
-> Vec3 -- ^ Target position.
-> Vec3 -- ^ Upward direction.
-> Proj4
lookat pos target up = translateBefore4 (neg pos) (orthogonal $ toOrthoUnsafe r)
where
w = normalize $ pos &- target
u = normalize $ up &^ w
v = w &^ u
r = transpose $ Mat3 u v w
-- | Perspective transformation matrix in row major order.
perspective :: Float -- ^ Near plane clipping distance (always positive).
-> Float -- ^ Far plane clipping distance (always positive).
-> Float -- ^ Field of view of the y axis, in radians.
-> Float -- ^ Aspect ratio, i.e. screen's width\/height.
-> Mat4
perspective n f fovy aspect = transpose $
Mat4 (Vec4 (2*n/(r-l)) 0 (-(r+l)/(r-l)) 0)
(Vec4 0 (2*n/(t-b)) ((t+b)/(t-b)) 0)
(Vec4 0 0 (-(f+n)/(f-n)) (-2*f*n/(f-n)))
(Vec4 0 0 (-1) 0)
where
t = n*tan(fovy/2)
b = -t
r = aspect*t
l = -r