crocodile-0.1: app/src/Primitive.hs-boot
-- Module for general primitives and intersections
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnboxedTuples #-}
module Primitive (primitiveBoundingRadius,
primitiveClosestIntersect,
primitiveAnyIntersect,
primitiveTangentSpace,
Object(Object),
Primitive(Sphere, Plane, TriangleMesh),
primitive,
material,
makeTriangle,
makeQuad,
quadsToTriangles,
vertPosition,
vertUV,
vertTangentSpace,
transform,
radius,
triangles,
getCentre,
planeDistance,
primitiveBoundingBox,
objectListBoundingBox,
intersectsBox,
infinite,
boundingBoxValid,
sphereIntersect,
TangentSpace) where
import Ray
import Vector
import Material
import Matrix
import BoundingBox
-- Triangle object used for triangle meshes
data Vertex = Vertex { vertPosition :: {-# UNPACK #-} !Position,
vertUV :: {-# UNPACK #-} !Position,
vertTangentSpace :: {-# UNPACK #-} !TangentSpace }
data Triangle = Triangle { vertices :: ![Vertex], plane :: !Primitive, halfPlanes :: ![Primitive] }
-- General object definition
data Object = Object { primitive :: Primitive,
material :: Material,
transform :: !Matrix}
-- Different kinds of primitives that an object can have
data Primitive = Sphere { radius :: {-# UNPACK #-} !Double }
| Plane { planeTangentSpace :: {-# UNPACK #-} !TangentSpace, planeDistance :: {-# UNPACK #-} !Double }
| TriangleMesh { triangles :: [Triangle] }
primitiveBoundingRadius :: Primitive -> Matrix -> Vector -> Double
primitiveBoundingBox :: Primitive -> Object -> Maybe AABB
primitiveClosestIntersect :: Primitive -> Ray -> Object -> Maybe (Double, Int)
primitiveAnyIntersect :: Primitive -> Ray -> Object -> Maybe (Double, Int)
primitiveTangentSpace :: Primitive -> Int -> Position -> Object -> TangentSpace
makeTriangle :: Position -> Position -> Position -> Triangle
makeQuad :: [Position] -> [Triangle]
quadsToTriangles :: [Position] -> [Triangle]
getCentre :: Object -> Vector
objectListBoundingBox :: [Object] -> AABB
intersectsBox :: Primitive -> Matrix -> AABB -> Bool
infinite :: Primitive -> Bool
sphereIntersect :: Double -> Vector -> Ray -> Maybe Double