module Codec.GlTF.Material
  ( MaterialIx(..)
  , Material(..)
  , MaterialAlphaMode(..)
  , pattern OPAQUE
  , pattern MASK
  , pattern BLEND
  , MaterialNormal(..)
  , MaterialOcclusion(..)
  ) where

import Codec.GlTF.Prelude

import Codec.GlTF.PbrMetallicRoughness (PbrMetallicRoughness)
import Codec.GlTF.TextureInfo (TextureInfo, TextureInfo_)

newtype MaterialIx = MaterialIx { MaterialIx -> Int
unMaterialIx :: Int }
  deriving (MaterialIx -> MaterialIx -> Bool
(MaterialIx -> MaterialIx -> Bool)
-> (MaterialIx -> MaterialIx -> Bool) -> Eq MaterialIx
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MaterialIx -> MaterialIx -> Bool
$c/= :: MaterialIx -> MaterialIx -> Bool
== :: MaterialIx -> MaterialIx -> Bool
$c== :: MaterialIx -> MaterialIx -> Bool
Eq, Eq MaterialIx
Eq MaterialIx
-> (MaterialIx -> MaterialIx -> Ordering)
-> (MaterialIx -> MaterialIx -> Bool)
-> (MaterialIx -> MaterialIx -> Bool)
-> (MaterialIx -> MaterialIx -> Bool)
-> (MaterialIx -> MaterialIx -> Bool)
-> (MaterialIx -> MaterialIx -> MaterialIx)
-> (MaterialIx -> MaterialIx -> MaterialIx)
-> Ord MaterialIx
MaterialIx -> MaterialIx -> Bool
MaterialIx -> MaterialIx -> Ordering
MaterialIx -> MaterialIx -> MaterialIx
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MaterialIx -> MaterialIx -> MaterialIx
$cmin :: MaterialIx -> MaterialIx -> MaterialIx
max :: MaterialIx -> MaterialIx -> MaterialIx
$cmax :: MaterialIx -> MaterialIx -> MaterialIx
>= :: MaterialIx -> MaterialIx -> Bool
$c>= :: MaterialIx -> MaterialIx -> Bool
> :: MaterialIx -> MaterialIx -> Bool
$c> :: MaterialIx -> MaterialIx -> Bool
<= :: MaterialIx -> MaterialIx -> Bool
$c<= :: MaterialIx -> MaterialIx -> Bool
< :: MaterialIx -> MaterialIx -> Bool
$c< :: MaterialIx -> MaterialIx -> Bool
compare :: MaterialIx -> MaterialIx -> Ordering
$ccompare :: MaterialIx -> MaterialIx -> Ordering
$cp1Ord :: Eq MaterialIx
Ord, Int -> MaterialIx -> ShowS
[MaterialIx] -> ShowS
MaterialIx -> String
(Int -> MaterialIx -> ShowS)
-> (MaterialIx -> String)
-> ([MaterialIx] -> ShowS)
-> Show MaterialIx
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MaterialIx] -> ShowS
$cshowList :: [MaterialIx] -> ShowS
show :: MaterialIx -> String
$cshow :: MaterialIx -> String
showsPrec :: Int -> MaterialIx -> ShowS
$cshowsPrec :: Int -> MaterialIx -> ShowS
Show, Value -> Parser [MaterialIx]
Value -> Parser MaterialIx
(Value -> Parser MaterialIx)
-> (Value -> Parser [MaterialIx]) -> FromJSON MaterialIx
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [MaterialIx]
$cparseJSONList :: Value -> Parser [MaterialIx]
parseJSON :: Value -> Parser MaterialIx
$cparseJSON :: Value -> Parser MaterialIx
FromJSON, [MaterialIx] -> Encoding
[MaterialIx] -> Value
MaterialIx -> Encoding
MaterialIx -> Value
(MaterialIx -> Value)
-> (MaterialIx -> Encoding)
-> ([MaterialIx] -> Value)
-> ([MaterialIx] -> Encoding)
-> ToJSON MaterialIx
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [MaterialIx] -> Encoding
$ctoEncodingList :: [MaterialIx] -> Encoding
toJSONList :: [MaterialIx] -> Value
$ctoJSONList :: [MaterialIx] -> Value
toEncoding :: MaterialIx -> Encoding
$ctoEncoding :: MaterialIx -> Encoding
toJSON :: MaterialIx -> Value
$ctoJSON :: MaterialIx -> Value
ToJSON, (forall x. MaterialIx -> Rep MaterialIx x)
-> (forall x. Rep MaterialIx x -> MaterialIx) -> Generic MaterialIx
forall x. Rep MaterialIx x -> MaterialIx
forall x. MaterialIx -> Rep MaterialIx x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep MaterialIx x -> MaterialIx
$cfrom :: forall x. MaterialIx -> Rep MaterialIx x
Generic)

-- | The material appearance of a primitive.
data Material = Material
  { Material -> (Float, Float, Float)
emissiveFactor :: (Float, Float, Float)
  , Material -> MaterialAlphaMode
alphaMode      :: MaterialAlphaMode
  , Material -> Float
alphaCutoff    :: Float
  , Material -> Bool
doubleSided    :: Bool

  , Material -> Maybe PbrMetallicRoughness
pbrMetallicRoughness :: Maybe PbrMetallicRoughness
  , Material -> Maybe (TextureInfo MaterialNormal)
normalTexture        :: Maybe (TextureInfo MaterialNormal)
  , Material -> Maybe (TextureInfo MaterialOcclusion)
occlusionTexture     :: Maybe (TextureInfo MaterialOcclusion)
  , Material -> Maybe TextureInfo_
emissiveTexture      :: Maybe (TextureInfo_)

  , Material -> Maybe Text
name         :: Maybe Text
  , Material -> Maybe Object
extensions   :: Maybe Object
  , Material -> Maybe Value
extras       :: Maybe Value
  } deriving (Material -> Material -> Bool
(Material -> Material -> Bool)
-> (Material -> Material -> Bool) -> Eq Material
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Material -> Material -> Bool
$c/= :: Material -> Material -> Bool
== :: Material -> Material -> Bool
$c== :: Material -> Material -> Bool
Eq, Int -> Material -> ShowS
[Material] -> ShowS
Material -> String
(Int -> Material -> ShowS)
-> (Material -> String) -> ([Material] -> ShowS) -> Show Material
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Material] -> ShowS
$cshowList :: [Material] -> ShowS
show :: Material -> String
$cshow :: Material -> String
showsPrec :: Int -> Material -> ShowS
$cshowsPrec :: Int -> Material -> ShowS
Show, (forall x. Material -> Rep Material x)
-> (forall x. Rep Material x -> Material) -> Generic Material
forall x. Rep Material x -> Material
forall x. Material -> Rep Material x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Material x -> Material
$cfrom :: forall x. Material -> Rep Material x
Generic)

instance FromJSON Material where
  parseJSON :: Value -> Parser Material
parseJSON = String -> (Object -> Parser Material) -> Value -> Parser Material
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Material" \Object
o -> do
    (Float, Float, Float)
emissiveFactor       <- Object
o Object -> Text -> Parser (Maybe (Float, Float, Float))
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"emissiveFactor" Parser (Maybe (Float, Float, Float))
-> (Float, Float, Float) -> Parser (Float, Float, Float)
forall a. Parser (Maybe a) -> a -> Parser a
.!= (Float
0, Float
0, Float
0)
    MaterialAlphaMode
alphaMode            <- Object
o Object -> Text -> Parser (Maybe MaterialAlphaMode)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"alphaMode"      Parser (Maybe MaterialAlphaMode)
-> MaterialAlphaMode -> Parser MaterialAlphaMode
forall a. Parser (Maybe a) -> a -> Parser a
.!= MaterialAlphaMode
OPAQUE
    Float
alphaCutoff          <- Object
o Object -> Text -> Parser (Maybe Float)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"alphaCutoff"    Parser (Maybe Float) -> Float -> Parser Float
forall a. Parser (Maybe a) -> a -> Parser a
.!= Float
0.5
    Bool
doubleSided          <- Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"doubleSided"    Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
False

    Maybe PbrMetallicRoughness
pbrMetallicRoughness <- Object
o Object -> Text -> Parser (Maybe PbrMetallicRoughness)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"pbrMetallicRoughness"
    Maybe (TextureInfo MaterialNormal)
normalTexture        <- Object
o Object -> Text -> Parser (Maybe (TextureInfo MaterialNormal))
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"normalTexture"
    Maybe (TextureInfo MaterialOcclusion)
occlusionTexture     <- Object
o Object -> Text -> Parser (Maybe (TextureInfo MaterialOcclusion))
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"occlusionTexture"
    Maybe TextureInfo_
emissiveTexture      <- Object
o Object -> Text -> Parser (Maybe TextureInfo_)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"emissiveTexture"

    Maybe Text
name                 <- Object
o Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"name"
    Maybe Object
extensions           <- Object
o Object -> Text -> Parser (Maybe Object)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"extensions"
    Maybe Value
extras               <- Object
o Object -> Text -> Parser (Maybe Value)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"extras"
    pure Material :: (Float, Float, Float)
-> MaterialAlphaMode
-> Float
-> Bool
-> Maybe PbrMetallicRoughness
-> Maybe (TextureInfo MaterialNormal)
-> Maybe (TextureInfo MaterialOcclusion)
-> Maybe TextureInfo_
-> Maybe Text
-> Maybe Object
-> Maybe Value
-> Material
Material{Bool
Float
Maybe Text
Maybe Object
Maybe Value
Maybe TextureInfo_
Maybe (TextureInfo MaterialOcclusion)
Maybe (TextureInfo MaterialNormal)
Maybe PbrMetallicRoughness
(Float, Float, Float)
MaterialAlphaMode
extras :: Maybe Value
extensions :: Maybe Object
name :: Maybe Text
emissiveTexture :: Maybe TextureInfo_
occlusionTexture :: Maybe (TextureInfo MaterialOcclusion)
normalTexture :: Maybe (TextureInfo MaterialNormal)
pbrMetallicRoughness :: Maybe PbrMetallicRoughness
doubleSided :: Bool
alphaCutoff :: Float
alphaMode :: MaterialAlphaMode
emissiveFactor :: (Float, Float, Float)
$sel:extras:Material :: Maybe Value
$sel:extensions:Material :: Maybe Object
$sel:name:Material :: Maybe Text
$sel:emissiveTexture:Material :: Maybe TextureInfo_
$sel:occlusionTexture:Material :: Maybe (TextureInfo MaterialOcclusion)
$sel:normalTexture:Material :: Maybe (TextureInfo MaterialNormal)
$sel:pbrMetallicRoughness:Material :: Maybe PbrMetallicRoughness
$sel:doubleSided:Material :: Bool
$sel:alphaCutoff:Material :: Float
$sel:alphaMode:Material :: MaterialAlphaMode
$sel:emissiveFactor:Material :: (Float, Float, Float)
..}

instance ToJSON Material

-- | The alpha rendering mode of the material.
newtype MaterialAlphaMode = MaterialAlphaMode { MaterialAlphaMode -> Text
unMaterialAlphaMode :: Text }
  deriving (MaterialAlphaMode -> MaterialAlphaMode -> Bool
(MaterialAlphaMode -> MaterialAlphaMode -> Bool)
-> (MaterialAlphaMode -> MaterialAlphaMode -> Bool)
-> Eq MaterialAlphaMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MaterialAlphaMode -> MaterialAlphaMode -> Bool
$c/= :: MaterialAlphaMode -> MaterialAlphaMode -> Bool
== :: MaterialAlphaMode -> MaterialAlphaMode -> Bool
$c== :: MaterialAlphaMode -> MaterialAlphaMode -> Bool
Eq, Eq MaterialAlphaMode
Eq MaterialAlphaMode
-> (MaterialAlphaMode -> MaterialAlphaMode -> Ordering)
-> (MaterialAlphaMode -> MaterialAlphaMode -> Bool)
-> (MaterialAlphaMode -> MaterialAlphaMode -> Bool)
-> (MaterialAlphaMode -> MaterialAlphaMode -> Bool)
-> (MaterialAlphaMode -> MaterialAlphaMode -> Bool)
-> (MaterialAlphaMode -> MaterialAlphaMode -> MaterialAlphaMode)
-> (MaterialAlphaMode -> MaterialAlphaMode -> MaterialAlphaMode)
-> Ord MaterialAlphaMode
MaterialAlphaMode -> MaterialAlphaMode -> Bool
MaterialAlphaMode -> MaterialAlphaMode -> Ordering
MaterialAlphaMode -> MaterialAlphaMode -> MaterialAlphaMode
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MaterialAlphaMode -> MaterialAlphaMode -> MaterialAlphaMode
$cmin :: MaterialAlphaMode -> MaterialAlphaMode -> MaterialAlphaMode
max :: MaterialAlphaMode -> MaterialAlphaMode -> MaterialAlphaMode
$cmax :: MaterialAlphaMode -> MaterialAlphaMode -> MaterialAlphaMode
>= :: MaterialAlphaMode -> MaterialAlphaMode -> Bool
$c>= :: MaterialAlphaMode -> MaterialAlphaMode -> Bool
> :: MaterialAlphaMode -> MaterialAlphaMode -> Bool
$c> :: MaterialAlphaMode -> MaterialAlphaMode -> Bool
<= :: MaterialAlphaMode -> MaterialAlphaMode -> Bool
$c<= :: MaterialAlphaMode -> MaterialAlphaMode -> Bool
< :: MaterialAlphaMode -> MaterialAlphaMode -> Bool
$c< :: MaterialAlphaMode -> MaterialAlphaMode -> Bool
compare :: MaterialAlphaMode -> MaterialAlphaMode -> Ordering
$ccompare :: MaterialAlphaMode -> MaterialAlphaMode -> Ordering
$cp1Ord :: Eq MaterialAlphaMode
Ord, Int -> MaterialAlphaMode -> ShowS
[MaterialAlphaMode] -> ShowS
MaterialAlphaMode -> String
(Int -> MaterialAlphaMode -> ShowS)
-> (MaterialAlphaMode -> String)
-> ([MaterialAlphaMode] -> ShowS)
-> Show MaterialAlphaMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MaterialAlphaMode] -> ShowS
$cshowList :: [MaterialAlphaMode] -> ShowS
show :: MaterialAlphaMode -> String
$cshow :: MaterialAlphaMode -> String
showsPrec :: Int -> MaterialAlphaMode -> ShowS
$cshowsPrec :: Int -> MaterialAlphaMode -> ShowS
Show, Value -> Parser [MaterialAlphaMode]
Value -> Parser MaterialAlphaMode
(Value -> Parser MaterialAlphaMode)
-> (Value -> Parser [MaterialAlphaMode])
-> FromJSON MaterialAlphaMode
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [MaterialAlphaMode]
$cparseJSONList :: Value -> Parser [MaterialAlphaMode]
parseJSON :: Value -> Parser MaterialAlphaMode
$cparseJSON :: Value -> Parser MaterialAlphaMode
FromJSON, [MaterialAlphaMode] -> Encoding
[MaterialAlphaMode] -> Value
MaterialAlphaMode -> Encoding
MaterialAlphaMode -> Value
(MaterialAlphaMode -> Value)
-> (MaterialAlphaMode -> Encoding)
-> ([MaterialAlphaMode] -> Value)
-> ([MaterialAlphaMode] -> Encoding)
-> ToJSON MaterialAlphaMode
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [MaterialAlphaMode] -> Encoding
$ctoEncodingList :: [MaterialAlphaMode] -> Encoding
toJSONList :: [MaterialAlphaMode] -> Value
$ctoJSONList :: [MaterialAlphaMode] -> Value
toEncoding :: MaterialAlphaMode -> Encoding
$ctoEncoding :: MaterialAlphaMode -> Encoding
toJSON :: MaterialAlphaMode -> Value
$ctoJSON :: MaterialAlphaMode -> Value
ToJSON, (forall x. MaterialAlphaMode -> Rep MaterialAlphaMode x)
-> (forall x. Rep MaterialAlphaMode x -> MaterialAlphaMode)
-> Generic MaterialAlphaMode
forall x. Rep MaterialAlphaMode x -> MaterialAlphaMode
forall x. MaterialAlphaMode -> Rep MaterialAlphaMode x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep MaterialAlphaMode x -> MaterialAlphaMode
$cfrom :: forall x. MaterialAlphaMode -> Rep MaterialAlphaMode x
Generic)

pattern OPAQUE :: MaterialAlphaMode
pattern $bOPAQUE :: MaterialAlphaMode
$mOPAQUE :: forall r. MaterialAlphaMode -> (Void# -> r) -> (Void# -> r) -> r
OPAQUE = MaterialAlphaMode "OPAQUE"

pattern MASK :: MaterialAlphaMode
pattern $bMASK :: MaterialAlphaMode
$mMASK :: forall r. MaterialAlphaMode -> (Void# -> r) -> (Void# -> r) -> r
MASK = MaterialAlphaMode "MASK"

pattern BLEND :: MaterialAlphaMode
pattern $bBLEND :: MaterialAlphaMode
$mBLEND :: forall r. MaterialAlphaMode -> (Void# -> r) -> (Void# -> r) -> r
BLEND = MaterialAlphaMode "BLEND"

data MaterialNormal = MaterialNormal
  { MaterialNormal -> Float
scale :: Float
    -- ^ The scalar multiplier applied to each normal vector of the normal texture.
  } deriving (MaterialNormal -> MaterialNormal -> Bool
(MaterialNormal -> MaterialNormal -> Bool)
-> (MaterialNormal -> MaterialNormal -> Bool) -> Eq MaterialNormal
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MaterialNormal -> MaterialNormal -> Bool
$c/= :: MaterialNormal -> MaterialNormal -> Bool
== :: MaterialNormal -> MaterialNormal -> Bool
$c== :: MaterialNormal -> MaterialNormal -> Bool
Eq, Int -> MaterialNormal -> ShowS
[MaterialNormal] -> ShowS
MaterialNormal -> String
(Int -> MaterialNormal -> ShowS)
-> (MaterialNormal -> String)
-> ([MaterialNormal] -> ShowS)
-> Show MaterialNormal
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MaterialNormal] -> ShowS
$cshowList :: [MaterialNormal] -> ShowS
show :: MaterialNormal -> String
$cshow :: MaterialNormal -> String
showsPrec :: Int -> MaterialNormal -> ShowS
$cshowsPrec :: Int -> MaterialNormal -> ShowS
Show, (forall x. MaterialNormal -> Rep MaterialNormal x)
-> (forall x. Rep MaterialNormal x -> MaterialNormal)
-> Generic MaterialNormal
forall x. Rep MaterialNormal x -> MaterialNormal
forall x. MaterialNormal -> Rep MaterialNormal x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep MaterialNormal x -> MaterialNormal
$cfrom :: forall x. MaterialNormal -> Rep MaterialNormal x
Generic)

instance FromJSON MaterialNormal where
  parseJSON :: Value -> Parser MaterialNormal
parseJSON = String
-> (Object -> Parser MaterialNormal)
-> Value
-> Parser MaterialNormal
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MaterialNormal" \Object
o -> do
    Float
scale <- Object
o Object -> Text -> Parser (Maybe Float)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"scale" Parser (Maybe Float) -> Float -> Parser Float
forall a. Parser (Maybe a) -> a -> Parser a
.!= Float
1.0
    pure MaterialNormal :: Float -> MaterialNormal
MaterialNormal{Float
scale :: Float
$sel:scale:MaterialNormal :: Float
..}

instance ToJSON MaterialNormal

data MaterialOcclusion = MaterialOcclusion
  { MaterialOcclusion -> Float
strength :: Float
    -- ^ A scalar multiplier controlling the amount of occlusion applied. @[0.0-1.0]@
  } deriving (MaterialOcclusion -> MaterialOcclusion -> Bool
(MaterialOcclusion -> MaterialOcclusion -> Bool)
-> (MaterialOcclusion -> MaterialOcclusion -> Bool)
-> Eq MaterialOcclusion
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MaterialOcclusion -> MaterialOcclusion -> Bool
$c/= :: MaterialOcclusion -> MaterialOcclusion -> Bool
== :: MaterialOcclusion -> MaterialOcclusion -> Bool
$c== :: MaterialOcclusion -> MaterialOcclusion -> Bool
Eq, Int -> MaterialOcclusion -> ShowS
[MaterialOcclusion] -> ShowS
MaterialOcclusion -> String
(Int -> MaterialOcclusion -> ShowS)
-> (MaterialOcclusion -> String)
-> ([MaterialOcclusion] -> ShowS)
-> Show MaterialOcclusion
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MaterialOcclusion] -> ShowS
$cshowList :: [MaterialOcclusion] -> ShowS
show :: MaterialOcclusion -> String
$cshow :: MaterialOcclusion -> String
showsPrec :: Int -> MaterialOcclusion -> ShowS
$cshowsPrec :: Int -> MaterialOcclusion -> ShowS
Show, (forall x. MaterialOcclusion -> Rep MaterialOcclusion x)
-> (forall x. Rep MaterialOcclusion x -> MaterialOcclusion)
-> Generic MaterialOcclusion
forall x. Rep MaterialOcclusion x -> MaterialOcclusion
forall x. MaterialOcclusion -> Rep MaterialOcclusion x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep MaterialOcclusion x -> MaterialOcclusion
$cfrom :: forall x. MaterialOcclusion -> Rep MaterialOcclusion x
Generic)

instance FromJSON MaterialOcclusion where
  parseJSON :: Value -> Parser MaterialOcclusion
parseJSON = String
-> (Object -> Parser MaterialOcclusion)
-> Value
-> Parser MaterialOcclusion
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MaterialOcclusion" \Object
o -> do
    Float
strength <- Object
o Object -> Text -> Parser (Maybe Float)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"strength" Parser (Maybe Float) -> Float -> Parser Float
forall a. Parser (Maybe a) -> a -> Parser a
.!= Float
1.0
    pure MaterialOcclusion :: Float -> MaterialOcclusion
MaterialOcclusion{Float
strength :: Float
$sel:strength:MaterialOcclusion :: Float
..}

instance ToJSON MaterialOcclusion