module Graphics.LambdaCube.Entity where
import Data.Maybe
import Graphics.LambdaCube.GpuProgram
import Graphics.LambdaCube.HardwareIndexBuffer
import Graphics.LambdaCube.HardwareVertexBuffer
import Graphics.LambdaCube.Material
import Graphics.LambdaCube.Mesh
import Graphics.LambdaCube.RenderOperation
import Graphics.LambdaCube.RenderSystem
import Graphics.LambdaCube.Technique
import Graphics.LambdaCube.Texture
import Graphics.LambdaCube.Types
data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => SubEntity vb ib t lp
= SubEntity
{ seMaterial :: Material t lp
, seSubMesh :: SubMesh vb ib
}
data VertexDataBindChoice
= BIND_ORIGINAL
| BIND_SOFTWARE_SKELETAL
| BIND_SOFTWARE_MORPH
| BIND_HARDWARE_MORPH
data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => Entity vb ib t lp
= Entity
{ enName :: String
, enRenderQueue :: Int
, enMesh :: Mesh vb ib
, enSubEntityList :: [SubEntity vb ib t lp]
}
instance (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => Renderable (Entity vb ib t lp) vb ib t lp where
prepare = prepareEntity
prepareEntity :: (HardwareIndexBuffer ib, HardwareVertexBuffer vb, Texture t, LinkedGpuProgram lp) => Proj4 -> Entity vb ib t lp -> [RenderEntity vb ib t lp]
prepareEntity m ent = map mkRenderEntity (enSubEntityList ent)
where
boundRadius = msBoundRadius $ enMesh ent
mkRenderEntity e = RenderEntity
{ rePassList = fromMaybe [] (fmap (tchPasses . head) (mtSupportedTechniques (seMaterial e)))
, reOperation = mkOperation . seSubMesh $ e
, reMatrix = m
, reBoundRadius = boundRadius
}
mkOperation sm = RenderOperation
{ roVertexData = case smVertexData sm of
Just vd -> vd
Nothing -> fromMaybe (error "fromJust 11") . msSharedVertexData . enMesh $ ent
, roOperationType = smOperationType sm
, roIndexData = smIndexData sm
}