
Tim and Christopher, here is my code. There is a lot of it, but I've tried to cut out the irrelevent parts. If I change the type of Transform3D.append from append :: (Floating a) => Transformer a -> Transform a -> Transformer a to append :: Transformer Double -> Transform Double -> Transformer Double The framerate goes from ~1400 fps to ~2200 fps. module Render where ... renderTree :: GLInfo -> Tree (Attribute Double) -> IO () renderTree (GLInfo names attribs uniforms) t = fst $ cFold2 f (return (),identity) t where f acc Hidden = Skip acc f (a,tr) (Transformation t) = Continue (a, append tr t) f (a,tr) (Clip b) = let (x1:.y1:._, x2:.y2:._) = extremes $ applyAABB tr b a' = do glUniform2f (uniforms M.! "maskMin") (realToFrac x1) (realToFrac y1) glUniform2f (uniforms M.! "maskMax") (realToFrac x2) (realToFrac y2) in Continue (a >> a', tr) f (a,tr) (Texture _ (x1:.y1:.x2:.y2:._)) = let a' = do glUniform1i (uniforms M.! "texSampler") 0 glUniform4f (uniforms M.! "uvCoords") (realToFrac x1) (realToFrac y1) (realToFrac x2) (realToFrac y2) glUniformMatrix4fv' (uniforms M.! "mvp") 1 (fromBool False) (map realToFrac $ transformerToList tr) glDrawElements gl_TRIANGLES (fromIntegral $ attribs M.! "iboLenSquare") gl_UNSIGNED_INT nullPtr in Continue (a >> a', tr) f acc _ = Continue acc ... module Transform3D where ... data Transform a = RotationZ a | Scale (Vec3 a) | Translation (Vec3 a) deriving (Eq, Read, Show) newtype Transformer a = Transformer (Vec4 (Vec4 a)) append :: (Floating a) => Transformer a -> Transform a -> Transformer a append (Transformer m) t = Transformer $ m #*# toMatrix t identity :: (Num a) => Transformer a identity = Transformer identityMatrix toMatrix :: (Floating a) => Transform a -> Vec4 (Vec4 a) toMatrix (RotationZ z) = rotationZMatrix z toMatrix (Scale (x:.y:.z:._)) = scaleMatrix x y z toMatrix (Translation (x:.y:.z:._)) = translationMatrix x y z identityMatrix :: (Num a) => Vec4 (Vec4 a) identityMatrix = (1:.0:.0:.0:.Nil):. (0:.1:.0:.0:.Nil):. (0:.0:.1:.0:.Nil):. (0:.0:.0:.1:.Nil):.Nil rotationZMatrix :: (Floating a) => a -> Vec4 (Vec4 a) rotationZMatrix a = let c = cos a s = sin a in (c:.(-s):.0:.0:.Nil):. (s:.c:.0:.0:.Nil):. (0:.0:.1:.0:.Nil):. (0:.0:.0:.1:.Nil):.Nil scaleMatrix :: (Num a) => a -> a -> a -> Vec4 (Vec4 a) scaleMatrix x y z = (x:.0:.0:.0:.Nil):. (0:.y:.0:.0:.Nil):. (0:.0:.z:.0:.Nil):. (0:.0:.0:.1:.Nil):.Nil translationMatrix :: (Num a) => a -> a -> a -> Vec4 (Vec4 a) translationMatrix x y z = (1:.0:.0:.x:.Nil):. (0:.1:.0:.y:.Nil):. (0:.0:.1:.z:.Nil):. (0:.0:.0:.1:.Nil):.Nil ... module Vector where ... infixr 5 :. --data Cons u t = (:.) t (u t) deriving (Eq, Read, Show) data Cons u t = (:.) ! t ! (u t) deriving (Eq, Read, Show) data Nil t = Nil deriving (Eq, Read, Show) ... (|*#) :: (Num t, Vector w, Vector u) => w t -> w (u t) -> u t (|*#) v m = (transpose m) #*| v (#*#) :: (Num t, Vector u, Vector v, Vector w) => u (v t) -> v (w t) -> u (w t) (#*#) x y = transpose $ fmap (x #*|) (transpose y) dot :: (Num t, Vector v) => v t -> v t -> t dot xs ys = sum ((*) <$> xs <*> ys) ...
participants (1)
-
Ben Rogalski