{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE DeriveAnyClass #-}

module Data.VRML.Nodes where
import Data.VRML.Types
import GHC.Generics
import Data.Int

data Anchor = Anchor
  { children :: [Node]
  , description :: String
  , parameter :: [String]
  , url :: [String]
  , bboxCenter :: (Float,Float,Float)
  , bboxSize :: (Float,Float,Float)
  } deriving (Generic,Show,Eq,ToNode)

data Appearance = Appearance
  { material :: Maybe Node
  , texture :: Maybe Node
  , textureTransform :: Maybe Node
  } deriving (Generic,Show,Eq,ToNode)

data AudioClip = AudioClip
  { description :: String
  , loop :: Bool
  , pitch :: Float
  , startTime :: Time
  , stopTime :: Time
  , url :: [String]
  } deriving (Generic,Show,Eq,ToNode)

data Billboard = Billboard
  { axisOfRotation :: (Float,Float,Float)
  , children :: [Node]
  , bboxCenter :: (Float,Float,Float)
  , bboxSize :: (Float,Float,Float)
  } deriving (Generic,Show,Eq,ToNode)

data Box = Box
  { size :: (Float,Float,Float)
  } deriving (Generic,Show,Eq,ToNode)

data Collision = Collision
  { children :: [Node]
  , collide :: Bool
  , bboxCenter :: (Float,Float,Float)
  , bboxSize :: (Float,Float,Float)
  , proxy :: Maybe Node
  } deriving (Generic,Show,Eq,ToNode)

{-
data Color' = Color'
  { color :: [Color]
  } deriving (Generic,Show,Eq,ToNode)
-}

data ColorInterpolator = ColorInterpolator
  { key :: [Float]
  , keyValue :: [Color]
  } deriving (Generic,Show,Eq,ToNode)

data Cone = Cone
  { bottomRadius :: Float
  , height :: Float
  , side :: Bool
  , bottom :: Bool
  } deriving (Generic,Show,Eq,ToNode)

data Coordinate = Coordinate
  { point :: [(Float,Float,Float)]
  } deriving (Generic,Show,Eq,ToNode)

data CoordinateInterpolator = CoordinateInterpolator
  { key :: [Float]
  , keyValue :: [(Float,Float,Float)]
  } deriving (Generic,Show,Eq,ToNode)

data Cylinder = Cylinder
  { bottom :: Bool
  , height :: Float
  , radius :: Float
  , side :: Bool
  , top :: Bool
  } deriving (Generic,Show,Eq,ToNode)

data CylinderSensor = CylinderSensor
  { autoOffset :: Bool
  , diskAngle :: Float
  , enabled :: Bool
  , maxAngle :: Float
  , minAngle :: Float
  , offset :: Float
  } deriving (Generic,Show,Eq,ToNode)

data DirectionalLight = DirectionalLight
  { ambientIntensity :: Float
  , color :: Color
  , direction :: (Float,Float,Float)
  , intensity :: Float
  , on :: Bool
  } deriving (Generic,Show,Eq,ToNode)

data ElevationGrid = ElevationGrid
  { color :: Maybe Node
  , normal :: Maybe Node
  , texCoord :: Maybe Node
  , height :: [Float]
  , ccw :: Bool
  , colorPerVertex :: Bool
  , creaseAngle :: Float
  , normalPerVertex :: Bool
  , solid :: Bool
  , xDimension :: Int32
  , xSpacing :: Float
  , zDimension :: Int32
  , zSpacing :: Float
  } deriving (Generic,Show,Eq,ToNode)

data Extrusion = Extrusion
  { beginCap :: Bool
  , ccw :: Bool
  , convex :: Bool
  , creaseAngle :: Float
  , crossSection :: [(Float,Float)]
  , endCap :: Bool
  , orientation :: [(Float,Float,Float,Float)]
  , scale :: [(Float,Float)]
  , solid :: Bool
  , spine :: [(Float,Float,Float)]
  } deriving (Generic,Show,Eq,ToNode)

data Fog = Fog
  { color :: Color
  , fogType :: String
  , visibilityRange :: Float
  } deriving (Generic,Show,Eq,ToNode)

data FontStyle = FontStyle
  { family :: String
  , horizontal :: Bool
  , justify :: [String]
  , language :: String
  , leftToRight :: Bool
  , size :: Float
  , spacing :: Float
  , style :: String
  , topToBottom :: Bool
  } deriving (Generic,Show,Eq,ToNode)

data Group = Group
  { children :: [Node]
  , bboxCenter :: (Float,Float,Float)
  , bboxSize :: (Float,Float,Float)
  } deriving (Generic,Show,Eq,ToNode)

data ImageTexture = ImageTexture
  { url :: [String]
  , repeatS :: Bool
  , repeatT :: Bool
  } deriving (Generic,Show,Eq,ToNode)

data IndexedFaceSet = IndexedFaceSet
  { color :: Maybe Node
  , coord :: Maybe Node
  , normal :: Maybe Node
  , texCoord :: Maybe Node
  , ccw :: Bool
  , colorIndex :: [Int32]
  , colorPerVertex :: Bool
  , convex :: Bool
  , coordIndex :: [Int32]
  , creaseAngle :: Float
  , normalIndex :: [Int32]
  , normalPerVertex :: Bool
  , solid :: Bool
  , texCoordIndex :: [Int32]
  } deriving (Generic,Show,Eq,ToNode)

data IndexedLineSet = IndexedLineSet
  { color :: Maybe Node
  , coord :: Maybe Node
  , colorIndex :: [Int32]
  , colorPerVertex :: Bool
  , coordIndex :: [Int32]
  } deriving (Generic,Show,Eq,ToNode)

data Inline = Inline
  { url :: [String]
  , bboxCenter :: (Float,Float,Float)
  , bboxSize :: (Float,Float,Float)
  } deriving (Generic,Show,Eq,ToNode)

data LOD = LOD
  { level :: [Node]
  , center :: (Float,Float,Float)
  , range :: [Float]
  } deriving (Generic,Show,Eq,ToNode)

data Material = Material
  { ambientIntensity :: Float
  , diffuseColor :: Color
  , emissiveColor :: Color
  , shininess :: Float
  , specularColor :: Color
  , transparency :: Float
  } deriving (Generic,Show,Eq,ToNode)

data MovieTexture = MovieTexture
  { loop :: Bool
  , speed :: Float
  , startTime :: Time
  , stopTime :: Time
  , url :: [String]
  , repeatS :: Bool
  , repeatT :: Bool
  } deriving (Generic,Show,Eq,ToNode)

data NavigationInfo = NavigationInfo
  { avatarSize :: [Float]
  , headlight :: Bool
  , speed :: Float
--  , type :: [String]
  , visibilityLimit :: Float
  } deriving (Generic,Show,Eq,ToNode)

data Normal = Normal
  { vector :: [(Float,Float,Float)]
  } deriving (Generic,Show,Eq,ToNode)


data NormalInterpolator = NormalInterpolator
  { key :: [Float]
  , keyValue :: [(Float,Float,Float)]
  } deriving (Generic,Show,Eq,ToNode)

data OrientationInterpolator = OrientationInterpolator
  { key :: [Float]
  , keyValue :: [(Float,Float,Float,Float)]
  } deriving (Generic,Show,Eq,ToNode)

data PixelTexture = PixelTexture
  { image :: [Int32]
  , repeatS :: Bool
  , repeatT :: Bool
  } deriving (Generic,Show,Eq,ToNode)

data PlaneSensor = PlaneSensor
  { autoOffset :: Bool
  , enabled :: Bool
  , maxPosition :: (Float,Float)
  , minPosition :: (Float,Float)
  , offset :: (Float,Float,Float)
  } deriving (Generic,Show,Eq,ToNode)

data PointLight = PointLight
  { ambientIntensity :: Float
  , attenuation :: (Float,Float,Float)
  , color :: Color
  , intensity :: Float
  , location :: (Float,Float,Float)
  , on :: Bool
  , radius :: Float
  } deriving (Generic,Show,Eq,ToNode)

data PointSet = PointSet
  { color :: Maybe Node
  , coord :: Maybe Node
  } deriving (Generic,Show,Eq,ToNode)

data PositionInterpolator = PositionInterpolator
  { key :: [Float]
  , keyValue :: [(Float,Float,Float)]
  } deriving (Generic,Show,Eq,ToNode)

data ProximitySensor = ProximitySensor
  { center :: (Float,Float,Float)
  , size :: (Float,Float,Float)
  , enabled :: Bool
  } deriving (Generic,Show,Eq,ToNode)

data ScalarInterpolator = ScalarInterpolator
  { key :: [Float]
  , keyValue :: [Float]
  } deriving (Generic,Show,Eq,ToNode)

data Shape = Shape
  { appearance :: Maybe Node
  , geometry :: Maybe Node
  } deriving (Generic,Show,Eq,ToNode)

data Sound = Sound
  { direction :: (Float,Float,Float)
  , intensity :: Float
  , location :: (Float,Float,Float)
  , maxBack :: Float
  , maxFront :: Float
  , minBack :: Float
  , minFront :: Float
  , priority :: Float
  , source :: Maybe Node
  , spatialize :: Bool
  } deriving (Generic,Show,Eq,ToNode)

data Sphere = Sphere
  { radius :: Float
  } deriving (Generic,Show,Eq,ToNode)

data SphereSensor = SphereSensor
  { autoOffset :: Bool
  , enabled :: Bool
  , offset :: (Float,Float,Float,Float)
  } deriving (Generic,Show,Eq,ToNode)

data SpotLight = SpotLight
  { ambientIntensity :: Float
  , attenuation :: (Float,Float,Float)
  , beamWidth :: Float
  , color :: Color
  , cutOffAngle :: Float
  , direction :: (Float,Float,Float)
  , intensity :: Float
  , location :: (Float,Float,Float)
  , on :: Bool
  , radius :: Float
  } deriving (Generic,Show,Eq,ToNode)

data Switch = Switch
  { choice :: [Node]
  , whichChoice :: Int32
  } deriving (Generic,Show,Eq,ToNode)

data Text = Text
  { string :: [String]
  , fontStyle :: Maybe Node
  , length :: [Float]
  , maxExtent :: Float
  } deriving (Generic,Show,Eq,ToNode)

data TextureCoordinate = TextureCoordinate
  { point :: [(Float,Float)]
  } deriving (Generic,Show,Eq,ToNode)

data TextureTransform = TextureTransform
  { center :: (Float,Float)
  , rotation :: Float
  , scale :: (Float,Float)
  , translation :: (Float,Float)
  } deriving (Generic,Show,Eq,ToNode)

data TimeSensor = TimeSensor
  { cycleInterval :: Time
  , enabled :: Bool
  , loop :: Bool
  , startTime :: Time
  , stopTime :: Time
  } deriving (Generic,Show,Eq,ToNode)

data TouchSensor = TouchSensor
  { enabled :: Bool
  } deriving (Generic,Show,Eq,ToNode)

data Transform = Transform
  { center :: (Float,Float,Float)
  , children :: [Node]
  , rotation :: (Float,Float,Float,Float)
  , scale :: (Float,Float,Float)
  , scaleOrientation :: (Float,Float,Float,Float)
  , translation :: (Float,Float,Float)
  , bboxCenter :: (Float,Float,Float)
  , bboxSize :: (Float,Float,Float)
  } deriving (Generic,Show,Eq,ToNode)

data Viewpoint = Viewpoint
  { fieldOfView :: Float
  , jump :: Bool
  , orientation :: (Float,Float,Float,Float)
  , position :: (Float,Float,Float)
  , description :: String
  } deriving (Generic,Show,Eq,ToNode)

data VisibilitySensor = VisibilitySensor
  { center :: (Float,Float,Float)
  , enabled :: Bool
  , size :: (Float,Float,Float)
  } deriving (Generic,Show,Eq,ToNode)

data WorldInfo = WorldInfo
  { info :: [String]
  , title :: String
  } deriving (Generic,Show,Eq,ToNode)