module Graphics.FieldTrip.Material
( Material(..)
, setAmbient , setDiffuse , setSpecular , setEmission , setShininess
, plastic, flat
, defaultMat, bluePlastic
, material
) where
import Graphics.Rendering.OpenGL
import Graphics.FieldTrip.Misc
import Graphics.FieldTrip.Color
data Material = Mat
{ ambientM :: Col
, diffuseM :: Col
, specularM :: Col
, emissionM :: Col
, shininessM :: R
} deriving Show
defaultMat :: Material
defaultMat = Mat { ambientM = rgba 0.2 0.2 0.2 1.0
, diffuseM = rgba 0.8 0.8 0.8 1.0
, specularM = rgba 0.0 0.0 0.0 1.0
, emissionM = rgba 0.0 0.0 0.0 1.0
, shininessM = 0
}
setAmbient :: Col -> Material -> Material
setAmbient c m = m{ ambientM=c }
setDiffuse :: Col -> Material -> Material
setDiffuse c m = m{ diffuseM=c }
setSpecular :: Col -> Material -> Material
setSpecular c m = m{ specularM=c }
setEmission :: Col -> Material -> Material
setEmission c m = m{ emissionM=c }
setShininess :: R -> Material -> Material
setShininess c m = m{ shininessM=c }
polishedPlastic :: Material-> Material
polishedPlastic = \m -> m { specularM = (rgba 1.0 1.0 1.0 1.0)
, emissionM = (rgba 0.0 0.0 0.0 1.0)
, shininessM = (70.0/128.0)
}
setAmbDiff :: Col -> Material -> Material
setAmbDiff c = \m -> m { ambientM = c
, diffuseM = c
}
bluePlastic :: Material
bluePlastic = plastic blue
plastic :: Col -> Material
plastic = polishedPlastic . flat
flat :: Col -> Material
flat = flip setAmbDiff defaultMat
material :: Material -> IO()
material m = do materialAmbient Front $= ambientM m
materialDiffuse Front $= diffuseM m
materialSpecular Front $= specularM m
materialEmission Front $= emissionM m
materialShininess Front $= (shininessM m)*128.0