{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module Diagrams.ThreeD.Light where
import Data.Colour
import Data.Monoid
import Data.Typeable
import Diagrams.Core
import Diagrams.Direction
import Diagrams.ThreeD.Types
data PointLight n = PointLight (Point V3 n) (Colour Double)
deriving Typeable
type instance V (PointLight n) = V3
type instance N (PointLight n) = n
data ParallelLight n = ParallelLight (V3 n) (Colour Double)
deriving Typeable
type instance V (ParallelLight n) = V3
type instance N (ParallelLight n) = n
instance Fractional n => Transformable (PointLight n) where
transform :: Transformation (V (PointLight n)) (N (PointLight n))
-> PointLight n -> PointLight n
transform Transformation (V (PointLight n)) (N (PointLight n))
t (PointLight Point V3 n
p Colour Double
c) = forall n. Point V3 n -> Colour Double -> PointLight n
PointLight (forall t. Transformable t => Transformation (V t) (N t) -> t -> t
transform Transformation (V (PointLight n)) (N (PointLight n))
t Point V3 n
p) Colour Double
c
instance Transformable (ParallelLight n) where
transform :: Transformation (V (ParallelLight n)) (N (ParallelLight n))
-> ParallelLight n -> ParallelLight n
transform Transformation (V (ParallelLight n)) (N (ParallelLight n))
t (ParallelLight V3 n
v Colour Double
c) = forall n. V3 n -> Colour Double -> ParallelLight n
ParallelLight (forall t. Transformable t => Transformation (V t) (N t) -> t -> t
transform Transformation (V (ParallelLight n)) (N (ParallelLight n))
t V3 n
v) Colour Double
c
pointLight :: (Typeable n, Num n, Ord n, Renderable (PointLight n) b)
=> Colour Double
-> QDiagram b V3 n Any
pointLight :: forall n b.
(Typeable n, Num n, Ord n, Renderable (PointLight n) b) =>
Colour Double -> QDiagram b V3 n Any
pointLight Colour Double
c = forall b (v :: * -> *) n m.
Prim b v n
-> Envelope v n
-> Trace v n
-> SubMap b v n m
-> Query v n m
-> QDiagram b v n m
mkQD (forall p b.
(Transformable p, Typeable p, Renderable p b) =>
p -> Prim b (V p) (N p)
Prim forall a b. (a -> b) -> a -> b
$ forall n. Point V3 n -> Colour Double -> PointLight n
PointLight forall (f :: * -> *) a. (Additive f, Num a) => Point f a
origin Colour Double
c) forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty
(forall (v :: * -> *) n m. (Point v n -> m) -> Query v n m
Query forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. a -> b -> a
const forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> Any
Any forall a b. (a -> b) -> a -> b
$ Bool
False)
parallelLight :: (Typeable n, OrderedField n, Renderable (ParallelLight n) b)
=> Direction V3 n
-> Colour Double
-> QDiagram b V3 n Any
parallelLight :: forall n b.
(Typeable n, OrderedField n, Renderable (ParallelLight n) b) =>
Direction V3 n -> Colour Double -> QDiagram b V3 n Any
parallelLight Direction V3 n
d Colour Double
c = forall b (v :: * -> *) n m.
Prim b v n
-> Envelope v n
-> Trace v n
-> SubMap b v n m
-> Query v n m
-> QDiagram b v n m
mkQD (forall p b.
(Transformable p, Typeable p, Renderable p b) =>
p -> Prim b (V p) (N p)
Prim forall a b. (a -> b) -> a -> b
$ forall n. V3 n -> Colour Double -> ParallelLight n
ParallelLight (forall (v :: * -> *) n.
(Metric v, Floating n) =>
Direction v n -> v n
fromDirection Direction V3 n
d) Colour Double
c)
forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty (forall (v :: * -> *) n m. (Point v n -> m) -> Query v n m
Query forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. a -> b -> a
const forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> Any
Any forall a b. (a -> b) -> a -> b
$ Bool
False)