packages feed

HGamer3D-0.2.1: HGamer3D/APIs/Base/GUI/EngineHelper.hs

-- This source file is part of HGamer3D
-- (A project to enable 3D game development in Haskell)
-- For the latest info, see http://www.althainz.de/HGamer3D.html
--
-- (c) 2011 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

-- |Supporting GUI functionality for the Base API, used internally for the game loop.
module HGamer3D.APIs.Base.GUI.EngineHelper

(
		initGUIEngine,
		keypressInject
)

where

import GHC.Ptr

import HGamer3D.Data.HG3DClass
import HGamer3D.Data.Vector

import HGamer3D.Bindings.CEGUI.ClassPtr
import HGamer3D.Bindings.CEGUI.Utils

import HGamer3D.Bindings.CEGUI.ClassOgreRenderer as CEGUIOgreRenderer
import HGamer3D.Bindings.CEGUI.ClassSystem as CEGUISystem
import HGamer3D.Bindings.CEGUI.ClassSystemHG3D as CEGUISystemHG3D
import HGamer3D.Bindings.CEGUI.ClassWindowManagerHG3D as CEGUIWindowManagerHG3D
import HGamer3D.Bindings.CEGUI.ClassWindowManager as CEGUIWindowManager
import HGamer3D.Bindings.CEGUI.ClassResourceProvider as CEGUIResourceProvider
import HGamer3D.Bindings.CEGUI.ClassDefaultResourceProvider as CEGUIDefaultResourceProvider
import HGamer3D.Bindings.CEGUI.ClassImageset as CEGUIImageset
import HGamer3D.Bindings.CEGUI.ClassFont as CEGUIFont
import HGamer3D.Bindings.CEGUI.ClassScheme as CEGUIScheme
import HGamer3D.Bindings.CEGUI.ClassWidgetLookManager as CEGUIWidgetLookManager
import HGamer3D.Bindings.CEGUI.ClassScriptModule as CEGUIScriptModule
import HGamer3D.Bindings.CEGUI.ClassLogger as CEGUILogger
import HGamer3D.Bindings.CEGUI.EnumLoggingLevel
import HGamer3D.Bindings.CEGUI.EnumMouseButton as CEGUIButton
import HGamer3D.Bindings.CEGUI.ClassFontManager as CEGUIFontManager
import HGamer3D.Bindings.CEGUI.ClassSchemeManager as CEGUISchemeManager
import HGamer3D.Bindings.CEGUI.ClassDefaultLogger as CEGUIDefaultLogger
import HGamer3D.Bindings.CEGUI.ClassHG3DEventController as HG3DEventController
import HGamer3D.Bindings.CEGUI.ClassWindowManagerHG3D as HG3DWindowManager
import HGamer3D.Bindings.Ogre.ClassHG3DMessagePump as MessagePump


import HGamer3D.APIs.Base.Engine.Types

import Control.Monad.Trans
import Control.Monad.Reader


-- | initialize the GUI system, used internally
initGUIEngine :: Bool  -- ^ logging flag
			-> IO (GUISystem) -- ^ GUI system object
initGUIEngine fLog = do


	-- CEGUI system
	---------------
	
	-- first logger, loglevel
	
	if not fLog then do
	ceguilog <- CEGUISystemHG3D.createNoLogger 
	return ()
	else do
		ceguilog <- CEGUIDefaultLogger.new
		CEGUILogger.setLogFilename ceguilog "hgamer3d-gui.log" False
		CEGUILogger.setLoggingLevel  ceguilog LoggingLevelInformative
		return ()

	-- bootstrap complete cegui system
	
	guirenderer <- CEGUIOgreRenderer.bootstrapSystem
	
	guisystem <- CEGUISystem.getSingletonPtr
	guiwindowmgr <- CEGUIWindowManagerHG3D.getSingleton
	guifontmgr <- CEGUISystemHG3D.getFontManagerSingleton
	guischememgr <- CEGUISystemHG3D.getSchemeManagerSingleton
	
	CEGUIScheme.setDefaultResourceGroup "Schemes"
	CEGUIImageset.setDefaultResourceGroup "Imagesets"
	CEGUIFont.setDefaultResourceGroup "Fonts"
	CEGUIWidgetLookManager.setDefaultResourceGroup "LookNFeel"
	CEGUIWindowManager.setDefaultResourceGroup "Layouts"
--	CEGUIScriptModule.setDefaultResourceGroup "lua_scripts"

	CEGUISystemHG3D.schemeManagerCreate guischememgr "VanillaSkin.scheme"
	CEGUISystemHG3D.schemeManagerCreate guischememgr "WindowsLook.scheme"
	CEGUISystemHG3D.schemeManagerCreate guischememgr "WindowsLookWidgets.scheme"
	CEGUISystemHG3D.schemeManagerCreate guischememgr "TaharezLook.scheme"
	CEGUISystemHG3D.schemeManagerCreate guischememgr "TaharezLookWidgets.scheme"
        
	CEGUISystemHG3D.fontManagerCreate guifontmgr "DejaVuSans-10.font"
	
	CEGUISystem.setDefaultFont guisystem "DejaVuSans-10"
	CEGUISystem.setDefaultMouseCursor3 guisystem "Vanilla-Images" "MouseArrow"
	CEGUISystem.setDefaultTooltip2 guisystem "WindowsLook/Tooltip"
	
	-- set standard empty gui sheet
	myRoot <- CEGUIWindowManager.createWindow guiwindowmgr "DefaultWindow" "root"
	CEGUISystem.setGUISheet guisystem myRoot
		
	eventController <- HG3DEventController.new
	
	guiwmgrhg3d  <- HG3DWindowManager.new
	
	return (GUISystem guirenderer guisystem guiwindowmgr guiwmgrhg3d guifontmgr guischememgr eventController)


-- keypressInject

-- | injects key presses into the CEGUI engine, used internally
keypressInject :: MHGamer3D ()
keypressInject  = do
	rs <- ask
	let g3s = graphics3DSystem rs
	let gui = guiSystem rs
	let gSystem = guiGUI gui
	let messagePump = g3sMessagePump g3s
	
	processEvents <- liftIO $ MessagePump.eventsPending messagePump
	if processEvents then do
		key <- liftIO $ MessagePump.getKeyDownEvent messagePump
		if key /= 0 then do
			liftIO $ CEGUISystem.injectKeyDown gSystem key
			return ()
			else do
				return ()
		key <- liftIO $ MessagePump.getKeyUpEvent messagePump
		if key /= 0 then do
			liftIO $ CEGUISystem.injectKeyUp gSystem key
			return ()
			else do
				return ()
		char <- liftIO $ MessagePump.getCharEvent messagePump
		if char /= 0 then do
			liftIO $ CEGUISystem.injectChar gSystem char
			return ()
			else do
				return ()
                                
                keypressInject                
		return ()
		else do
			return ()