-----------------------------------------------------------------------------
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
-----------------------------------------------------------------------------
module THREE.WebGLRenderer
  ( -- * Types
    WebGLRenderer (..)
    -- * Constructors
  , THREE.WebGLRenderer.new
    -- * Read-only Properties
  , domElement
    -- * Properties
    -- * Optional properties
    -- * Methods
  , render
  , setAnimationLoop
  , setSize
    -- * Helper functions
  , onBeforeCompileMaterial
  , onBeforeRenderMaterial
  ) where
-----------------------------------------------------------------------------
import Control.Monad (void)
import Miso
-----------------------------------------------------------------------------
import THREE.BufferGeometry
import THREE.Camera
import THREE.Group
import THREE.Internal as THREE
import THREE.Material
import THREE.Object3D
import THREE.Scene
-----------------------------------------------------------------------------
-- | https://threejs.org/docs/#api/en/renderers/WebGLRenderer
newtype WebGLRenderer
  = WebGLRenderer
  { WebGLRenderer -> JSVal
unWebGLRenderer :: JSVal
  } deriving (WebGLRenderer -> IO [JSVal]
(WebGLRenderer -> IO [JSVal]) -> ToArgs WebGLRenderer
forall args. (args -> IO [JSVal]) -> ToArgs args
$ctoArgs :: WebGLRenderer -> IO [JSVal]
toArgs :: WebGLRenderer -> IO [JSVal]
ToArgs, WebGLRenderer -> IO Object
(WebGLRenderer -> IO Object) -> ToObject WebGLRenderer
forall a. (a -> IO Object) -> ToObject a
$ctoObject :: WebGLRenderer -> IO Object
toObject :: WebGLRenderer -> IO Object
ToObject, WebGLRenderer -> IO JSVal
(WebGLRenderer -> IO JSVal) -> ToJSVal WebGLRenderer
forall a. (a -> IO JSVal) -> ToJSVal a
$ctoJSVal :: WebGLRenderer -> IO JSVal
toJSVal :: WebGLRenderer -> IO JSVal
ToJSVal) 
-----------------------------------------------------------------------------
instance FromJSVal WebGLRenderer where
  fromJSVal :: JSVal -> IO (Maybe WebGLRenderer)
fromJSVal = Maybe WebGLRenderer -> IO (Maybe WebGLRenderer)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe WebGLRenderer -> IO (Maybe WebGLRenderer))
-> (JSVal -> Maybe WebGLRenderer)
-> JSVal
-> IO (Maybe WebGLRenderer)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WebGLRenderer -> Maybe WebGLRenderer
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (WebGLRenderer -> Maybe WebGLRenderer)
-> (JSVal -> WebGLRenderer) -> JSVal -> Maybe WebGLRenderer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSVal -> WebGLRenderer
WebGLRenderer
-----------------------------------------------------------------------------
new :: Maybe JSVal -> Three WebGLRenderer
new :: Maybe JSVal -> IO WebGLRenderer
new Maybe JSVal
Nothing = (JSVal -> WebGLRenderer) -> MisoString -> () -> IO WebGLRenderer
forall args con.
ToArgs args =>
(JSVal -> con) -> MisoString -> args -> Three con
THREE.new JSVal -> WebGLRenderer
WebGLRenderer MisoString
"WebGLRenderer" ()
new (Just JSVal
canvasRef) = do
  o <- IO Object
create
  setProp "canvas" canvasRef o
  THREE.new WebGLRenderer "WebGLRenderer" o
-----------------------------------------------------------------------------
-- | The WebGLRenderer constructor creates a canvas element which can be added
-- in the DOM.
domElement :: Property WebGLRenderer JSVal
domElement :: Property WebGLRenderer JSVal
domElement = MisoString -> Property WebGLRenderer JSVal
forall object field.
(ToObject object, ToJSVal field, FromJSVal field) =>
MisoString -> Property object field
property MisoString
"domElement"
-----------------------------------------------------------------------------
render
  :: (Object3D object, Camera camera) 
  => (object, camera)
  -> WebGLRenderer
  -> Three ()
render :: forall object camera.
(Object3D object, Camera camera) =>
(object, camera) -> WebGLRenderer -> IO ()
render (object, camera)
args (WebGLRenderer JSVal
v) =
  IO JSVal -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (IO JSVal -> IO ()) -> IO JSVal -> IO ()
forall a b. (a -> b) -> a -> b
$ JSVal
v JSVal -> MisoString -> (object, camera) -> IO JSVal
forall object args.
(ToObject object, ToArgs args) =>
object -> MisoString -> args -> IO JSVal
# (MisoString
"render" :: MisoString) ((object, camera) -> IO JSVal) -> (object, camera) -> IO JSVal
forall a b. (a -> b) -> a -> b
$ (object, camera)
args
-----------------------------------------------------------------------------
setAnimationLoop :: Function -> WebGLRenderer -> IO ()
setAnimationLoop :: Function -> WebGLRenderer -> IO ()
setAnimationLoop Function
f (WebGLRenderer JSVal
v) =
  IO JSVal -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (IO JSVal -> IO ()) -> IO JSVal -> IO ()
forall a b. (a -> b) -> a -> b
$  JSVal
v JSVal -> MisoString -> Function -> IO JSVal
forall object args.
(ToObject object, ToArgs args) =>
object -> MisoString -> args -> IO JSVal
# (MisoString
"setAnimationLoop" :: MisoString) (Function -> IO JSVal) -> Function -> IO JSVal
forall a b. (a -> b) -> a -> b
$ Function
f
-----------------------------------------------------------------------------
setSize :: (Int, Int, Bool) -> WebGLRenderer -> IO ()
setSize :: (Int, Int, Bool) -> WebGLRenderer -> IO ()
setSize (Int
width, Int
height, Bool
updateStyle) (WebGLRenderer JSVal
v) = 
  IO JSVal -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (IO JSVal -> IO ()) -> IO JSVal -> IO ()
forall a b. (a -> b) -> a -> b
$ JSVal
v JSVal -> MisoString -> (Int, Int, Bool) -> IO JSVal
forall object args.
(ToObject object, ToArgs args) =>
object -> MisoString -> args -> IO JSVal
# (MisoString
"setSize" :: MisoString) ((Int, Int, Bool) -> IO JSVal) -> (Int, Int, Bool) -> IO JSVal
forall a b. (a -> b) -> a -> b
$ (Int
width, Int
height, Bool
updateStyle)
-----------------------------------------------------------------------------
-- | https://threejs.org/docs/#api/en/materials/Material.onBeforeCompile
-- 
-- Wraps Material.onBeforeCompile.
onBeforeCompileMaterial :: Material material => Method material (Object, WebGLRenderer) ()
onBeforeCompileMaterial :: forall material.
Material material =>
Method material (Object, WebGLRenderer) ()
onBeforeCompileMaterial = MisoString -> Method material (Object, WebGLRenderer) ()
forall object return args.
(FromJSVal return, ToArgs args, ToObject object) =>
MisoString -> Method object args return
method MisoString
"onBeforeCompile" 
-----------------------------------------------------------------------------
-- | https://threejs.org/docs/#api/en/materials/Material.onBeforeRender
--
-- Wraps Material.onBeforeRender.
-- Not to be confused with Object3D.onBeforeRender.
onBeforeRenderMaterial
  :: (Material material, Camera camera, BufferGeometryClass geometry, Object3D object) 
  => Method material (WebGLRenderer, Scene, camera, geometry, object, Group) ()
onBeforeRenderMaterial :: forall material camera geometry object.
(Material material, Camera camera, BufferGeometryClass geometry,
 Object3D object) =>
Method
  material (WebGLRenderer, Scene, camera, geometry, object, Group) ()
onBeforeRenderMaterial = MisoString
-> Method
     material (WebGLRenderer, Scene, camera, geometry, object, Group) ()
forall object return args.
(FromJSVal return, ToArgs args, ToObject object) =>
MisoString -> Method object args return
method MisoString
"onBeforeRender" 
-----------------------------------------------------------------------------