-----------------------------------------------------------------------------
{-# LANGUAGE ConstrainedClassMethods #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE OverloadedStrings #-}
-----------------------------------------------------------------------------
module THREE.Material
  ( Material (..)
  ) where
-----------------------------------------------------------------------------
import           Miso
-----------------------------------------------------------------------------
import           THREE.Color
import           THREE.Constants.CustomBlendingEquations
import           THREE.Constants.CustomBlendingEquations.DestinationFactors
import           THREE.Constants.CustomBlendingEquations.SourceFactors
import           THREE.Constants.Materials
import           THREE.EventDispatcher
import           THREE.Internal as THREE
import           THREE.Plane
-----------------------------------------------------------------------------
-- | https://threejs.org/docs/#api/en/materials/Material
class (EventDispatcher material, ToJSVal material, ToObject material) => Material material where

  -- ReadOnly

  type_ :: ReadOnly material MisoString
  type_ = MisoString -> ReadOnly material MisoString
forall object return.
(FromJSVal return, ToObject object) =>
MisoString -> ReadOnly object return
readonly MisoString
"type"

  uuid :: ReadOnly material MisoString
  uuid = MisoString -> ReadOnly material MisoString
forall object return.
(FromJSVal return, ToObject object) =>
MisoString -> ReadOnly object return
readonly MisoString
"uuid"

  isMaterial :: ReadOnly material Bool
  isMaterial = MisoString -> ReadOnly material Bool
forall object return.
(FromJSVal return, ToObject object) =>
MisoString -> ReadOnly object return
readonly MisoString
"isMaterial"

  -- Property

  alphaHash :: Property material Bool
  alphaHash = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"alphaHash" 

  alphaTest :: Property material Double
  alphaTest = MisoString -> Property material Double
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"alphaTest" 

  alphaToCoverage :: Property material Bool
  alphaToCoverage = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"alphaToCoverage" 

  blendAlpha :: Property material Double
  blendAlpha = MisoString -> Property material Double
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"blendAlpha" 

  blendColor :: Property material Color
  blendColor = MisoString -> Property material Color
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"blendColor" 

  blendDst :: Property material (Maybe DestinationFactors)
  blendDst = MisoString -> Property material (Maybe DestinationFactors)
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"blendDst" 

  blendDstAlpha :: Property material (Maybe DestinationFactors)
  blendDstAlpha = MisoString -> Property material (Maybe DestinationFactors)
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object (Maybe field)
optional MisoString
"blendDstAlpha" 

  blendEquation :: Property material BlendingEquations
  blendEquation = MisoString -> Property material BlendingEquations
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"blendEquation" 

  blendEquationAlpha :: Property material (Maybe BlendingEquations)
  blendEquationAlpha = MisoString -> Property material (Maybe BlendingEquations)
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object (Maybe field)
optional MisoString
"blendEquationAlpha" 

  blending :: Property material (Maybe BlendingMode)
  blending = MisoString -> Property material (Maybe BlendingMode)
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"blending" 

  blendSrc :: Property material SourceFactors
  blendSrc = MisoString -> Property material SourceFactors
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"blendSrc" 

  blendSrcAlpha :: Property material (Maybe SourceFactors)
  blendSrcAlpha = MisoString -> Property material (Maybe SourceFactors)
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object (Maybe field)
optional MisoString
"blendSrcAlpha" 

  clipIntersection :: Property material Bool
  clipIntersection = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"clipIntersection" 

  clippingPlanes :: Property material (Maybe [Plane])
  clippingPlanes = MisoString -> Property material (Maybe [Plane])
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object (Maybe field)
optional MisoString
"clippingPlanes" 

  clipShadows :: Property material Bool
  clipShadows = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"clipShadows" 

  colorWrite :: Property material Bool
  colorWrite = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"colorWrite" 

  defines :: Property material (Maybe Object)
  defines = MisoString -> Property material (Maybe Object)
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object (Maybe field)
optional MisoString
"defines"

  depthFunc :: Property material DepthMode
  depthFunc = MisoString -> Property material DepthMode
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"depthFunc"

  depthTest :: Property material Bool
  depthTest = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"depthTest"

  depthWrite :: Property material Bool
  depthWrite = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"depthWrite"

  forceSinglePass :: Property material Bool
  forceSinglePass = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"forceSinglePass"

  stencilWrite :: Property material Bool
  stencilWrite = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"stencilWrite"

  stencilWriteMask :: Property material Int
  stencilWriteMask = MisoString -> Property material Int
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"stencilWriteMask"

  stencilFunc :: Property material StencilFunctions
  stencilFunc = MisoString -> Property material StencilFunctions
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"stencilFunc"

  stencilRef :: Property material Int
  stencilRef = MisoString -> Property material Int
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"stencilRef"

  stencilFuncMask :: Property material Int
  stencilFuncMask = MisoString -> Property material Int
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"stencilFuncMask"

  stencilFail :: Property material StencilOperations
  stencilFail = MisoString -> Property material StencilOperations
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"stencilFail"

  stencilZFail :: Property material StencilOperations
  stencilZFail = MisoString -> Property material StencilOperations
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"stencilZFail"

  stencilZPass :: Property material StencilOperations
  stencilZPass = MisoString -> Property material StencilOperations
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"stencilZPass"

  id :: Property material Int
  id = MisoString -> Property material Int
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"id"

  name :: Property material MisoString
  name = MisoString -> Property material MisoString
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"name"

  needsUpdate :: Property material Bool
  needsUpdate = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"needsUpdate"

  opacity :: Property material Double
  opacity = MisoString -> Property material Double
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"opacity"

  polygonOffset :: Property material Bool
  polygonOffset = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"polygonOffset"

  polygonOffsetFactor :: Property material Int
  polygonOffsetFactor = MisoString -> Property material Int
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"polygonOffsetFactor"

  polygonOffsetUnits :: Property material Int
  polygonOffsetUnits = MisoString -> Property material Int
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"polygonOffsetUnits"

  precision :: Property material (Maybe MisoString)
  precision = MisoString -> Property material (Maybe MisoString)
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object (Maybe field)
optional MisoString
"precision"

  premultipliedAlpha :: Property material Bool
  premultipliedAlpha = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"premultipliedAlpha"

  dithering :: Property material Bool
  dithering = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"dithering"

  shadowSide :: Property material Side
  shadowSide = MisoString -> Property material Side
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"shadowSide"

  side :: Property material Side
  side = MisoString -> Property material Side
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"side"

  toneMapped :: Property material Bool
  toneMapped = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"toneMapped"

  transparent :: Property material Bool
  transparent = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"transparent"

  version :: Property material Int
  version = MisoString -> Property material Int
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"version"

  vertexColors :: Property material Bool
  vertexColors = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"vertexColors"

  visible :: Property material Bool
  visible = MisoString -> Property material Bool
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"visible"

  userData :: Property material Object
  userData = MisoString -> Property material Object
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"userData"

  -- Method

  clone :: FromJSVal material => Method material () material
  clone = MisoString -> Method material () material
forall object return args.
(FromJSVal return, ToArgs args, ToObject object) =>
MisoString -> Method object args return
method MisoString
"clone" 

  copy :: (FromJSVal material, ToArgs material) => Method material material material
  copy = MisoString -> Method material material material
forall object return args.
(FromJSVal return, ToArgs args, ToObject object) =>
MisoString -> Method object args return
method MisoString
"copy" 

  dispose :: Method material () ()
  dispose = MisoString -> Method material () ()
forall object return args.
(FromJSVal return, ToArgs args, ToObject object) =>
MisoString -> Method object args return
method MisoString
"dispose" 

  -- onBeforeCompile, onBeforeRender: 
  -- See onBeforeCompileMaterial and onBeforeRenderMaterial in WebGLRenderer.
  -- (cannot be defined here because of circular module dependencies)

  customProgramCacheKey :: Method material () MisoString
  customProgramCacheKey = MisoString -> Method material () MisoString
forall object return args.
(FromJSVal return, ToArgs args, ToObject object) =>
MisoString -> Method object args return
method MisoString
"customProgramCacheKey" 

  setValues :: Method material Object ()
  setValues = MisoString -> Method material Object ()
forall object return args.
(FromJSVal return, ToArgs args, ToObject object) =>
MisoString -> Method object args return
method MisoString
"setValues" 

  toJSON :: Method material Object Object
  toJSON = MisoString -> Method material Object Object
forall object return args.
(FromJSVal return, ToArgs args, ToObject object) =>
MisoString -> Method object args return
method MisoString
"toJSON"

-----------------------------------------------------------------------------
instance Material JSVal
-----------------------------------------------------------------------------