module Escena where   

import Elem3D
    ( Foton,
      Luz(..),
      RGB(..),
      Base(Base),
      Ray,
      Direction(Direction),
      Point3D(..),
      escalatePoint,
      degToRad,
      rotatePoint,movePoint
    )

import Figuras
    ( Obj, Point2D(..),
      Shape(Sphere, Plane, Cylinder,Rectangle,Cone,Triangle),
      Plano(Plano),
      Esfera(Esfera),
      Cilindro(Cilindro),
      Rectangulo(Rectangulo),
      Camara(Camara),
      Cono(Cono),
      Triangulo(Triangulo),
      addFigMult,
      parametricShapeCollision,
      loadObjFile,
      convertToCustomFormat, encenderShape ,encenderShapes
      )
import qualified Data.DList as DL
import qualified Data.Set as Set


-- CARGAKD
intMxKd :: Float
intMxKd :: Float
intMxKd = Float
50
n :: Float
n :: Float
n=Float
50000
nRebotes :: Int
nRebotes :: Int
nRebotes = Int
6
-- SIMULACION
aspectR :: Float
aspectR :: Float
aspectR = Float
1
pix :: Float
pix :: Float
pix = Float
500
piCam :: Float
piCam :: Float
piCam = Float
15
gamma :: Float
gamma :: Float
gamma = Float
2.4
maxN :: Int
maxN :: Int
maxN = Int
10
etapasY :: Int
etapasY :: Int
etapasY = Int
10
etapasX:: Int
etapasX :: Int
etapasX = Int
10
nRay :: Int
nRay :: Int
nRay = Int
200
intMxSim :: Float
intMxSim :: Float
intMxSim = Float
1.0

basCam :: Base
basCam :: Base
basCam = Direction -> Direction -> Direction -> Base
Base (Float -> Float -> Float -> Direction
Direction (Float
piCamFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
aspectR) Float
0 Float
0) (Float -> Float -> Float -> Direction
Direction Float
0 Float
piCam Float
0) (Float -> Float -> Float -> Direction
Direction Float
0 Float
0 (Float
17.5))

cam :: Point3D
cam :: Point3D
cam =  Float -> Float -> Float -> Point3D
Point3D Float
0 Float
0 Float
35

-- ESCENA
centr :: Point3D
centr :: Point3D
centr = Float -> Float -> Float -> Point3D
Point3D (-Float
9) (-Float
8) (Float
1)
-- centr' :: Point3D
centr' :: Point3D
centr' = Float -> Float -> Float -> Point3D
Point3D (Float
10) (-Float
8) (Float
2)
-- centr'' :: Point3D
-- centr'' = Point3D 0 (-15) (-44)
-- centr''' :: Point3D
-- centr''' = Point3D 15 (-10) (-22)

luz :: Luz
luz :: Luz
luz = Point3D -> RGB -> Float -> Luz
Luz (Float -> Float -> Float -> Point3D
Point3D (Float
0) Float
8 (-Float
3)) (Float -> Float -> Float -> RGB
RGB Float
255 Float
255 Float
255) Float
1 -- Dentro
luz' :: Luz
luz' :: Luz
luz' = Point3D -> RGB -> Float -> Luz
Luz (Float -> Float -> Float -> Point3D
Point3D (Float
10) (Float
5) (-Float
50)) (Float -> Float -> Float -> RGB
RGB Float
255 Float
255 Float
255) (Float
intMxKdFloat -> Float -> Float
forall a. Fractional a => a -> a -> a
/Float
2) -- Fuera de la escena
luz'' :: Luz
luz'' :: Luz
luz'' = Point3D -> RGB -> Float -> Luz
Luz (Float -> Float -> Float -> Point3D
Point3D Float
8 Float
3 (-Float
12))  (Float -> Float -> Float -> RGB
RGB Float
255 Float
255 Float
255) Float
intMxKd -- Al lado de columna
luz''' :: Luz
luz''' :: Luz
luz''' = Point3D -> RGB -> Float -> Luz
Luz (Float -> Float -> Float -> Point3D
Point3D Float
0 Float
0 (Float
30))  (Float -> Float -> Float -> RGB
RGB Float
255 Float
255 Float
255) Float
1 -- Al lado de columna

plano0 :: Shape
plano0 :: Shape
plano0 = Plano -> Shape
Plane (Point3D
-> Direction
-> RGB
-> (Float, Float, Float)
-> Float
-> Int
-> Plano
Plano (Float -> Float -> Float -> Point3D
Point3D (-Float
15) Float
0 Float
0) (Float -> Float -> Float -> Direction
Direction Float
1 Float
0 Float
0) (Float -> Float -> Float -> RGB
RGB Float
255 Float
10 Float
10) (Float
0.85,Float
0,Float
0) Float
0 Int
0) --Izq
plano1 :: Shape
plano1 :: Shape
plano1 =  Plano -> Shape
Plane (Point3D
-> Direction
-> RGB
-> (Float, Float, Float)
-> Float
-> Int
-> Plano
Plano (Float -> Float -> Float -> Point3D
Point3D Float
15 Float
0 Float
0) (Float -> Float -> Float -> Direction
Direction Float
1 Float
0 Float
0) (Float -> Float -> Float -> RGB
RGB Float
10 Float
255 Float
10) (Float
0.85,Float
0,Float
0) Float
0 Int
0) -- Der
plano2 :: Shape
plano2 :: Shape
plano2 =  Plano -> Shape
Plane (Point3D
-> Direction
-> RGB
-> (Float, Float, Float)
-> Float
-> Int
-> Plano
Plano (Float -> Float -> Float -> Point3D
Point3D Float
0 Float
15 Float
0) (Float -> Float -> Float -> Direction
Direction Float
0 Float
1 Float
0) (Float -> Float -> Float -> RGB
RGB Float
100 Float
100 Float
100) (Float
0.85,Float
0,Float
0) Float
0 Int
0) -- Techo
plano3 :: Shape
plano3 :: Shape
plano3 =  Plano -> Shape
Plane (Point3D
-> Direction
-> RGB
-> (Float, Float, Float)
-> Float
-> Int
-> Plano
Plano (Float -> Float -> Float -> Point3D
Point3D Float
0 Float
0 (-Float
15)) (Float -> Float -> Float -> Direction
Direction Float
0 Float
0 (-Float
1)) (Float -> Float -> Float -> RGB
RGB Float
1 Float
1 Float
1) (Float
0.85,Float
0,Float
0) Float
0 Int
0) -- Fondo
-- plano4 :: Shape
plano4 :: Shape
plano4 =  Plano -> Shape
Plane (Point3D
-> Direction
-> RGB
-> (Float, Float, Float)
-> Float
-> Int
-> Plano
Plano (Float -> Float -> Float -> Point3D
Point3D Float
0 (-Float
15) Float
0) (Float -> Float -> Float -> Direction
Direction Float
0 Float
1 Float
0) (Float -> Float -> Float -> RGB
RGB Float
100 Float
100 Float
100) (Float
0.85,Float
0,Float
0) Float
1.6 Int
0) -- Suelo
plano5 :: Shape
plano5 :: Shape
plano5 =  Plano -> Shape
Plane (Point3D
-> Direction
-> RGB
-> (Float, Float, Float)
-> Float
-> Int
-> Plano
Plano (Float -> Float -> Float -> Point3D
Point3D Float
0 Float
0 Float
50.5) (Float -> Float -> Float -> Direction
Direction Float
0 Float
0 Float
1) (Float -> Float -> Float -> RGB
RGB Float
1 Float
1 Float
1) (Float
0.85,Float
0,Float
0) Float
0 Int
0) -- Detras Camara
bola :: Shape
bola :: Shape
bola =  Esfera -> Shape
Sphere (Point3D
-> Float -> RGB -> (Float, Float, Float) -> Float -> Int -> Esfera
Esfera Point3D
centr Float
2 (Float -> Float -> Float -> RGB
RGB Float
250 Float
10 Float
208) (Float
0.5, Float
0,Float
0) Float
1.5 Int
0)
bola' :: Shape
bola' :: Shape
bola' =  Esfera -> Shape
Sphere (Point3D
-> Float -> RGB -> (Float, Float, Float) -> Float -> Int -> Esfera
Esfera Point3D
centr' Float
2 (Float -> Float -> Float -> RGB
RGB Float
10 Float
250 Float
200) (Float
0.85,Float
0,Float
0) Float
1.5 Int
0)
-- bola'' :: Shape
-- bola'' =  Sphere (Esfera centr'' 4 (RGB 150 0 0 ) (0.8, 0, 0) 0 0)
-- bola''' :: Shape
-- bola''' =  Sphere (Esfera centr''' 5 (RGB 122 210 155) (0.8,0,0) 1.5 0)
-- rect0 :: Shape
rect0 :: Shape
rect0 = Rectangulo -> Shape
Rectangle (Point3D
-> Direction
-> Direction
-> Float
-> Float
-> RGB
-> (Float, Float, Float)
-> Float
-> Int
-> Rectangulo
Rectangulo (Float -> Float -> Float -> Point3D
Point3D Float
15 Float
0 (-Float
10)) (Float -> Float -> Float -> Direction
Direction (Float
1) Float
0 Float
0) (Float -> Float -> Float -> Direction
Direction Float
0 Float
0 (-Float
1)) Float
30 Float
30 (Float -> Float -> Float -> RGB
RGB Float
10 Float
255 Float
10) (Float
0.85,Float
0,Float
0) Float
0 Int
0) -- Der
-- rect1 :: Shape
rect1 :: Shape
rect1 = Rectangulo -> Shape
Rectangle (Point3D
-> Direction
-> Direction
-> Float
-> Float
-> RGB
-> (Float, Float, Float)
-> Float
-> Int
-> Rectangulo
Rectangulo (Float -> Float -> Float -> Point3D
Point3D (-Float
15) Float
0 (-Float
10)) (Float -> Float -> Float -> Direction
Direction Float
1 Float
0 Float
0) (Float -> Float -> Float -> Direction
Direction Float
0 Float
0 Float
1) Float
30 Float
30 (Float -> Float -> Float -> RGB
RGB Float
255 Float
10 Float
10) (Float
0.85,Float
0,Float
0) Float
0 Int
0) -- Izq
-- rect2 :: Shape
rect2 :: Shape
rect2 = Rectangulo -> Shape
Rectangle (Point3D
-> Direction
-> Direction
-> Float
-> Float
-> RGB
-> (Float, Float, Float)
-> Float
-> Int
-> Rectangulo
Rectangulo (Float -> Float -> Float -> Point3D
Point3D Float
0 Float
0 (-Float
15)) (Float -> Float -> Float -> Direction
Direction Float
0 Float
0 (Float
1)) (Float -> Float -> Float -> Direction
Direction (-Float
1) Float
0 Float
0) Float
30 Float
30 (Float -> Float -> Float -> RGB
RGB Float
100 Float
100 Float
100) (Float
0.85,Float
0,Float
0) Float
0 Int
0) -- Fondo
-- rect3 :: Shape
rect3 :: Shape
rect3 = Rectangulo -> Shape
Rectangle (Point3D
-> Direction
-> Direction
-> Float
-> Float
-> RGB
-> (Float, Float, Float)
-> Float
-> Int
-> Rectangulo
Rectangulo (Float -> Float -> Float -> Point3D
Point3D Float
0 Float
15 (-Float
0)) (Float -> Float -> Float -> Direction
Direction Float
0 (-Float
1) Float
0) (Float -> Float -> Float -> Direction
Direction (-Float
1) Float
0 Float
0) Float
40 Float
40  (Float -> Float -> Float -> RGB
RGB Float
100 Float
100 Float
100) (Float
0.85,Float
0,Float
0) Float
0 Int
0)--Techo
-- Cilindro Point3D Direction Float RGB (Float, Float, Float) Float Int
cilindro :: Shape
cilindro :: Shape
cilindro = Cilindro -> Shape
Cylinder (Point3D
-> Direction
-> Float
-> RGB
-> (Float, Float, Float)
-> Float
-> Int
-> Cilindro
Cilindro Point3D
centr (Float -> Float -> Float -> Direction
Direction Float
0 Float
1 Float
0) Float
5 (Float -> Float -> Float -> RGB
RGB Float
200 Float
0 Float
200) (Float
0, Float
0.0, Float
0.0) Float
0 Int
0)
cono :: Shape
cono = Cono -> Shape
Cone(Point3D
-> Float
-> Float
-> RGB
-> (Float, Float, Float)
-> Float
-> Int
-> Cono
Cono (Float -> Float -> Float -> Point3D
Point3D Float
0 Float
0 (-Float
8)) Float
1 Float
1 (Float -> Float -> Float -> RGB
RGB Float
200 Float
0 Float
200) (Float
0.85, Float
0.0, Float
0.0) Float
0 Int
0)
tri :: Shape
tri = Triangulo -> Shape
Triangle(Point3D
-> Point3D
-> Point3D
-> Point2D
-> Point2D
-> Point2D
-> RGB
-> (Float, Float, Float)
-> Float
-> Int
-> Triangulo
Triangulo (Float -> Float -> Float -> Point3D
Point3D (-Float
2) Float
0 (-Float
8)) (Float -> Float -> Float -> Point3D
Point3D Float
0 Float
4 (-Float
8)) (Float -> Float -> Float -> Point3D
Point3D (Float
2) Float
0 (-Float
8)) (Float -> Float -> Point2D
Point2D Float
0 Float
1) (Float -> Float -> Point2D
Point2D Float
1 Float
0) (Float -> Float -> Point2D
Point2D Float
0 Float
0) (Float -> Float -> Float -> RGB
RGB Float
200 Float
0 Float
200) (Float
0.85, Float
0.0, Float
0.0) Float
0 Int
0)
camara :: Camara
camara :: Camara
camara = Point3D -> Base -> Camara
Camara Point3D
cam Base
basCam

camara' :: Camara
camara' :: Camara
camara' = Point3D -> Base -> Camara
Camara (Float -> Float -> Float -> Point3D
Point3D Float
0.5 Float
0.5 Float
20) Base
basCam

fmx :: Float
fmx :: Float
fmx = Float
intMxSim

bola'' :: Shape
bola'' = Esfera -> Shape
Sphere (Point3D
-> Float -> RGB -> (Float, Float, Float) -> Float -> Int -> Esfera
Esfera (Float -> Float -> Float -> Point3D
Point3D (-Float
6) (-Float
10) (-Float
3)) Float
2 (Float -> Float -> Float -> RGB
RGB Float
200 Float
200 Float
200) (Float
0.85,Float
0,Float
0) Float
1 Int
0)
bola''' :: Shape
bola''' = Esfera -> Shape
Sphere (Point3D
-> Float -> RGB -> (Float, Float, Float) -> Float -> Int -> Esfera
Esfera (Float -> Float -> Float -> Point3D
Point3D (-Float
2) (-Float
10) (-Float
6)) Float
2 (Float -> Float -> Float -> RGB
RGB Float
200 Float
200 Float
200) (Float
0.85,Float
0,Float
0) Float
1 Int
0)
bola'''' :: Shape
bola'''' = Esfera -> Shape
Sphere (Point3D
-> Float -> RGB -> (Float, Float, Float) -> Float -> Int -> Esfera
Esfera (Float -> Float -> Float -> Point3D
Point3D (-Float
10) (-Float
10) (Float
0)) Float
2 (Float -> Float -> Float -> RGB
RGB Float
200 Float
200 Float
200) (Float
0.85,Float
0,Float
0) Float
1 Int
0)
bolo :: Shape
bolo = Esfera -> Shape
Sphere (Point3D
-> Float -> RGB -> (Float, Float, Float) -> Float -> Int -> Esfera
Esfera (Float -> Float -> Float -> Point3D
Point3D (Float
0) (Float
0) (Float
0)) Float
180 (Float -> Float -> Float -> RGB
RGB Float
200 Float
200 Float
200) (Float
0.85,Float
0,Float
0) Float
1 Int
0)
bolo' :: Shape
bolo' = Esfera -> Shape
Sphere (Point3D
-> Float -> RGB -> (Float, Float, Float) -> Float -> Int -> Esfera
Esfera (Float -> Float -> Float -> Point3D
Point3D (Float
6) (-Float
10) (-Float
14)) Float
2 (Float -> Float -> Float -> RGB
RGB Float
200 Float
200 Float
200) (Float
0.85,Float
0,Float
0) Float
1 Int
0)
bolo'' :: Shape
bolo'' = Esfera -> Shape
Sphere (Point3D
-> Float -> RGB -> (Float, Float, Float) -> Float -> Int -> Esfera
Esfera (Float -> Float -> Float -> Point3D
Point3D (Float
10) (-Float
10) (-Float
18)) Float
2 (Float -> Float -> Float -> RGB
RGB Float
200 Float
200 Float
200) (Float
0.85,Float
0,Float
0) Float
1 Int
0)


figuras :: Set.Set Shape
figuras :: Set Shape
figuras = [Shape] -> Set Shape
forall a. Ord a => [a] -> Set a
Set.fromList ([Shape] -> Set Shape) -> [Shape] -> Set Shape
forall a b. (a -> b) -> a -> b
$ [Shape] -> [Shape] -> [Shape]
addFigMult [Shape
plano0,Shape
plano1,Shape
rect2,Shape
bola,Shape
plano2,Shape
bola',Shape
plano4,Shape
bola] []

-- a :: Shape
-- a =  Sphere (Esfera (Point3D 5 5 (-10)) 2 (RGB 200 200 200) (1, 0, 0) 1.7 0)

-- b :: Shape
-- b =  Sphere (Esfera (Point3D 5 (-5) (-10)) 2 (RGB 200 200 200) (1, 0, 0) 1.7 0)

-- c :: Shape
-- c =  Sphere (Esfera (Point3D (-5) (-5) (-10)) 2 (RGB 200 200 200) (1, 0, 0) 1.7 0)

-- figuras :: Set.Set Shape
-- figuras = Set.fromList $ addFigMult [a, b, c, plano3] []

luces :: [Luz]
luces :: [Luz]
luces = [Luz
luz]