hgeometry-0.9.0.0: src/Graphics/Render.hs
--------------------------------------------------------------------------------
-- |
-- Module : Graphics.Render
-- Copyright : (C) Frank Staals
-- License : see the LICENSE file
-- Maintainer : Frank Staals
-- Description : Some rendering functions for rendering (drawing) geometric objects
--
--------------------------------------------------------------------------------
module Graphics.Render where
import Data.Ext
import Control.Lens
import Data.Geometry.Point
import Data.Geometry.Triangle
import Data.Geometry.LineSegment
import Data.Geometry.Transformation
import Data.Geometry.Properties
--------------------------------------------------------------------------------
-- * Rendering functions
-- | Rendering function for a triangle.
--
renderTriangle :: Fractional r => Transformation 3 r -> Triangle 3 p r -> Triangle 2 p r
renderTriangle = renderWithTransform projectTriangle
where
projectTriangle (Triangle p q r) = Triangle (p&core %~ projectPoint)
(q&core %~ projectPoint)
(r&core %~ projectPoint)
-- | Render a point
renderPoint :: Fractional r => Transformation 3 r -> Point 3 r -> Point 2 r
renderPoint = renderWithTransform projectPoint
-- | Renders a line segment
renderLineSegment :: Fractional r => Transformation 3 r -> LineSegment 3 p r -> LineSegment 2 p r
renderLineSegment = renderWithTransform project
where
project s = s&endPoints.core %~ projectPoint
-- | Generic Rendering Function
renderWithTransform :: (Fractional r, IsTransformable g, Dimension g ~ 3, NumType g ~ r)
=> (g -> g') -- ^ Projection function
-> Transformation 3 r -- ^ The camera transform
-> g -- ^ The thing we wish to transform
-> g'
renderWithTransform project t = project . transformBy t