{-# LANGUAGE FlexibleContexts #-} -- This source file is part of HGamer3D -- (A project to enable 3D game development in Haskell) -- For the latest info, see http://www.hgamer3d.org -- -- (c) 2011-2013 Peter Althainz -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- See the License for the specific language governing permissions and -- limitations under the License. -- EngineHelper.hs -- | Initialization functions for the Graphics3D module module HGamer3D.Graphics3D.Engine ( initGraphics3D, graphics3DPumpWindowMessages, exitGraphics3D, loopGraphics3D, renderOneFrame, checkQuitReceived ) where import HGamer3D.Data import HGamer3D.Util import qualified HGamer3D.Bindings.Ogre.ClassRoot as Root import HGamer3D.Bindings.Ogre.ClassSceneManager as SceneManager import HGamer3D.Bindings.Ogre.ClassResourceGroupManager as ResourceGroupManager import HGamer3D.Bindings.Ogre.ClassTextureManager as TextureManager import HGamer3D.Bindings.Ogre.ClassControllerManager as ControllerManager import HGamer3D.Bindings.Ogre.ClassViewport as Viewport import HGamer3D.Bindings.Ogre.ClassFrustum as Frustum import HGamer3D.Bindings.Ogre.ClassAnimationState as AnimationState import HGamer3D.Bindings.Ogre.ClassEntity as Entity import HGamer3D.Bindings.Ogre.ClassControllerManager as ControllerManager import HGamer3D.Bindings.Ogre.ClassLogManager as LogManager import HGamer3D.Bindings.Ogre.ClassLog as Log import HGamer3D.Bindings.Ogre.ClassHG3DUtilities as Util import HGamer3D.Bindings.Ogre.ClassRenderTarget as RenderTarget import HGamer3D.Bindings.Ogre.ClassManualObject as ManualObject import HGamer3D.Bindings.Ogre.EnumRenderOperationOperationType import HGamer3D.Bindings.Ogre.StructHG3DClass import HGamer3D.Bindings.Ogre.EnumSceneManagerPrefabType import HGamer3D.Bindings.Ogre.ClassWindowEventUtilities as WindowEventUtilities import HGamer3D.Graphics3D.Types import HGamer3D.Graphics3D.Basic3D import Control.Monad import Control.Monad.Trans import Control.Monad.IO.Class import Control.Monad.State.Class import Control.Concurrent import Data.Maybe -- | pump window messages for graphics -- Not to be used, if WinEvent pollWinEvent or pumpWinEvents is used! graphics3DPumpWindowMessages :: IO () graphics3DPumpWindowMessages = do WindowEventUtilities.messagePump return () -- | renders one frame on the screen renderOneFrame :: Graphics3DSystem -> IO () renderOneFrame g3ds = do let (RootObject root) = g3dsRoot g3ds Root.renderOneFrame root return () loopGraphics3D :: Graphics3DSystem -> IO Bool loopGraphics3D g3ds = do renderOneFrame g3ds graphics3DPumpWindowMessages i <- checkQuitReceived return (i == 1) exitGraphics3D :: Graphics3DSystem -> IO () exitGraphics3D g3ds = do let (RootObject root) = g3dsRoot g3ds let (RenderTarget rt) = g3dsRenderTarget g3ds Root.destroyRenderTarget root rt Root.delete root return () -- | initializes the 3d graphics module initGraphics3D :: String -- ^ Name of the window, displayed -> String -- ^ SceneManager type used -> Bool -- ^ flag, show configuration dialogue -> Bool -- ^ flag, is logging enabled -> IO (Graphics3DSystem, Camera, Viewport, Window) initGraphics3D windowName sceneManagerType fConfig fLog = do -- configuration path can be app user dir or local dir localDir <- getAppConfigDirectory appDir <- getExeConfigDirectory configFile <- findFileInDirs "engine.cfg" [localDir, appDir] pluginsFile <- findFileInDirs "plugins.cfg" [localDir, appDir] -- check both files exists let config = case configFile of Just cf -> cf Nothing -> error $ "HGamer3D - Graphics3D: could not find engine configuration file engine.cfg" let plugins = case pluginsFile of Just pf -> pf Nothing -> error $ "HGamer3D - Graphics3D: could not find plugins configuration file plugins.cfg" root <- Root.new plugins config "" lmgr <- LogManager.getSingletonPtr if not fLog then do newlog <- LogManager.createLog lmgr "SilentLog" True False True return () else do newlog <- LogManager.createLog lmgr "hgamer3d-engine.log" True False False return () fOk <- if fConfig then Root.showConfigDialog root else do fLoaded <- Root.restoreConfig root if not fLoaded then Root.showConfigDialog root else return True -- fUAddResourceLocations "resources.cfg" renderWindow <-Root.initialise root True windowName "" setupCloseEventHandler renderWindow windowHandle <- Util.getWindowHandle renderWindow -- Suppress logging unless, fLog sceneManager <- Root.createSceneManager root sceneManagerType "SceneManager" camera <- SceneManager.createCamera sceneManager "SimpleCamera" Frustum.setNearClipDistance camera 5.0 Frustum.setFarClipDistance camera 5000.0 viewport <- RenderTarget.addViewport renderWindow camera 0 0.0 0.0 1.0 1.0 let bgColor = Colour 0.0 0.0 0.0 1.0 Viewport.setBackgroundColour viewport bgColor height <- Viewport.getActualHeight viewport width <- Viewport.getActualWidth viewport Frustum.setAspectRatio camera ((fromIntegral width) / (fromIntegral height)) tm <- TextureManager.getSingletonPtr TextureManager.setDefaultNumMipmaps tm 20 -- resource locations, if path given, use this as base, if not use standard locations rgm <- ResourceGroupManager.getSingletonPtr ResourceGroupManager.createResourceGroup rgm "Schemes" False ResourceGroupManager.createResourceGroup rgm "Imagesets" False ResourceGroupManager.createResourceGroup rgm "Fonts" False ResourceGroupManager.createResourceGroup rgm "Layouts" False ResourceGroupManager.createResourceGroup rgm "LookNFeel" False ResourceGroupManager.createResourceGroup rgm "LuaScripts" False ResourceGroupManager.createResourceGroup rgm "XMLSchemas" False mediapath1 <- getAppMediaDirectory mediapath2 <- getExeMediaDirectory mapM (\mediapath -> do ResourceGroupManager.addResourceLocation rgm (mediapath ++ osSep ++ "materials") "FileSystem" "General" False ResourceGroupManager.addResourceLocation rgm (mediapath ++ osSep ++ "schemes") "FileSystem" "Schemes" False ResourceGroupManager.addResourceLocation rgm (mediapath ++ osSep ++ "imagesets") "FileSystem" "Imagesets" False ResourceGroupManager.addResourceLocation rgm (mediapath ++ osSep ++ "fonts") "FileSystem" "Fonts" False ResourceGroupManager.addResourceLocation rgm (mediapath ++ osSep ++ "layouts") "FileSystem" "Layouts" False ResourceGroupManager.addResourceLocation rgm (mediapath ++ osSep ++ "looknfeel") "FileSystem" "LookNFeel" False ResourceGroupManager.addResourceLocation rgm (mediapath ++ osSep ++ "lua_scripts") "FileSystem" "LuaScripts" False ResourceGroupManager.addResourceLocation rgm (mediapath ++ osSep ++ "xml_schemas") "FileSystem" "XMLSchemas" False return ()) [mediapath1, mediapath2] ResourceGroupManager.initialiseAllResourceGroups rgm uniqueName <- createUniqueName "HG3DObj" return $ (Graphics3DSystem (RootObject root) (SceneManager sceneManager) (ResourceGroupManager rgm) (LogManager lmgr) (TextureManager tm) (RenderTarget renderWindow) uniqueName, (Camera camera), (Viewport viewport), (Window windowHandle))