packages feed

HGamer3D-API-0.1.0: HGamer3D/APIs/One.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
--
-- Copyright 2011 Dr. 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.

-- One.hs

-- This module provides a simple, generic API into the HGamer3D functionality.

module HGamer3D.APIs.One

(
	-- types
	ColourValue (ColourValue),
	Quaternion (Quaternion),
	Vector3 (Vector3),

	-- Enums
	module HGamer3D.Bindings.OIS.EnumKeyCode,
	
	-- Data types
	Entity (Entity),
	EngineStatus (EngineStatus),
	Light (Light),
	
	-- Functions
	--
	
	-- Initialize
	initializeHG3D,	
	
	-- Camera
	setCameraPos,
	setCameraLookAt,
	
	-- Light
	createLight,
	setLightPos,
	
	-- Entities
	loadEntity,
	getEntityOrientation,
	setEntityOrientation,
	getEntityFromObject,
	
	-- Object functions
	createLineObject,
	
	-- event functions
	isKeyDown,
	
	-- run it
	renderLoop,
	
)

where

import GHC.Ptr

import HGamer3D.Bindings.Ogre.ClassPtr
import HGamer3D.Bindings.OIS.ClassPtr

import HGamer3D.Bindings.Ogre.Utils

import HGamer3D.Data.ColourValue
import HGamer3D.Data.Quaternion
import HGamer3D.Data.Vector3

import HGamer3D.Bindings.Ogre.TypeColourValue
import HGamer3D.Bindings.Ogre.TypeQuaternion
import HGamer3D.Bindings.Ogre.TypeVector3

import HGamer3D.Bindings.Ogre.EnumSceneType

import HGamer3D.Bindings.Ogre.ClassCamera
import HGamer3D.Bindings.Ogre.ClassRoot
import HGamer3D.Bindings.Ogre.ClassLight
import HGamer3D.Bindings.Ogre.ClassNode
import HGamer3D.Bindings.Ogre.ClassSceneManager
import HGamer3D.Bindings.Ogre.ClassSceneNode
import HGamer3D.Bindings.Ogre.ClassRenderTarget
import HGamer3D.Bindings.Ogre.ClassRenderWindow
import HGamer3D.Bindings.Ogre.ClassResourceGroupManager
import HGamer3D.Bindings.Ogre.ClassTextureManager
import HGamer3D.Bindings.Ogre.ClassViewport
import HGamer3D.Bindings.Ogre.ClassFrustum

import HGamer3D.Bindings.OIS.Utils
import HGamer3D.Bindings.OIS.ClassInputManager
import HGamer3D.Bindings.OIS.EnumType
import HGamer3D.Bindings.OIS.EnumKeyCode
import HGamer3D.Bindings.OIS.ClassObject
import HGamer3D.Bindings.OIS.ClassKeyboard

import HGamer3D.Bindings.Ogre.ClassManualObject
import HGamer3D.Bindings.Ogre.EnumOperationType


import HGamer3D.Bindings.Ogre.TypeHG3DClass
import HGamer3D.Bindings.OIS.TypeHG3DClass

import HGamer3D.Data.Vector3
import HGamer3D.Data.Quaternion
import HGamer3D.Data.HG3DClass

-- data declarations for basic API

-- data EngineStatus = EngineStatus ClassRoot ClassSceneManager ClassResourceGroupManager ClassInputManager  ClassRenderWindow ClassCamera ClassViewport ClassKeyboard
data EngineStatus = EngineStatus HG3DClass HG3DClass HG3DClass HG3DClass HG3DClass HG3DClass HG3DClass HG3DClass
data Light = Light HG3DClass
data Entity = Entity HG3DClass HG3DClass

-- basic initialize function

initializeHG3D :: String -> String -> IO (EngineStatus)
initializeHG3D windowName sceneManagerType = do

		root <- cRNew
		let (HG3DClass ptr fptr) = root
		print ptr
		print fptr 
		cRShowConfigDialog root
		fUAddResourceLocations "resources.cfg"
		renderWindow <-cRInitialise root True windowName ""
		
		(inputManager, keyboard, mouse) <- fUInitializeOis renderWindow
--		keyboard <- cOISImCreateInputObject inputManager Oiskeyboard False ""
		
		sceneManager <- cRCreateSceneManager root sceneManagerType "SceneManager"
		
		camera <- cSmCreateCamera sceneManager "SimpleCamera"
		cFSetNearClipDistance camera 5.0
		cFSetFarClipDistance camera 5000.0
		
	
		viewport <- cRtAddViewport renderWindow camera 0 0.0 0.0 1.0 1.0
		let bgColor = ColourValue 0.0 0.0 0.0 1.0
		cVpSetBackgroundColour viewport bgColor
		
		height <- cVpGetActualHeight viewport
		width <- cVpGetActualWidth viewport
		
		cFSetAspectRatio camera ((fromIntegral width) / (fromIntegral height))
		
--		tm <- cTmGetSingletonPtr
--		cTmSetDefaultNumMipmaps tm 5
		
		rgm <- cRgmGetSingletonPtr
		cRgmInitialiseAllResourceGroups rgm

		return (EngineStatus root sceneManager rgm inputManager renderWindow camera viewport keyboard)


-- camera functions

setCameraPos :: EngineStatus -> Vector3 -> IO ()
setCameraPos (EngineStatus _ _ _ _ _ camera _ _) pos = do
	cCSetPosition2 camera pos

setCameraLookAt :: EngineStatus -> Vector3 -> IO ()
setCameraLookAt (EngineStatus _ _ _ _ _ camera _ _) vec3 = do
	cCLookAt camera vec3


-- light functions

createLight :: EngineStatus -> ColourValue -> Float -> Float -> Float -> String -> IO (Light) 
createLight (EngineStatus _ sceneManager _ _ _ _ _ _) colour x y z name = do
	cSmSetAmbientLight sceneManager colour
	light <- cSmCreateLight sceneManager name
	cLSetPosition light x y z
	return (Light light)
	
setLightPos :: Light -> Float -> Float -> Float -> IO ()
setLightPos (Light light) x y z = do
	cLSetPosition light x y z


-- entity functions

loadEntity :: EngineStatus -> String -> String -> IO (Entity)
loadEntity (EngineStatus _ sceneManager _ _ _ _ _ _) name mesh = do

	entity <- cSmCreateEntity sceneManager name mesh "General"
	rootNode <- cSmGetRootSceneNode sceneManager
	let vzero = Vector3 0.0 0.0 0.0
	let qident = Quaternion 1.0 0.0 0.0 0.0
	entityNode <- cSnCreateChildSceneNode rootNode vzero qident
	cSnAttachObject entityNode entity
	return (Entity entity entityNode)

getEntityFromObject :: EngineStatus -> HG3DClass -> IO (Entity)
getEntityFromObject (EngineStatus _ sceneManager _ _ _ _ _ _) object = do

	rootNode <- cSmGetRootSceneNode sceneManager
	let vzero = Vector3 0.0 0.0 0.0
	let qident = Quaternion 1.0 0.0 0.0 0.0
	entityNode <- cSnCreateChildSceneNode rootNode vzero qident
	cSnAttachObject entityNode object
	return (Entity object entityNode)


getEntityOrientation :: Entity -> IO (Quaternion)
getEntityOrientation (Entity entity entityNode) = do
	quat <- cNGetOrientation entityNode
	return (quat) 

setEntityOrientation :: Entity -> Quaternion -> IO ()
setEntityOrientation (Entity entity entityNode) quat = do
	cNSetOrientation entityNode quat
	return ()


-- object functions
createLineObject :: EngineStatus -> String -> String -> Vector3 -> Vector3 -> IO ()
createLineObject (EngineStatus _ sceneManager _ _ _ _ _ _) name materialName vStart vEnd = do
	mo <- cSmCreateManualObject sceneManager name
	cMnoBegin mo materialName OtLineList "General"
	cMnoPosition mo vStart
	cMnoPosition mo vEnd
	cMnoEnd mo
	rootNode <- cSmGetRootSceneNode sceneManager
	cSnAttachObject rootNode mo
	return ()


-- event functions

isKeyDown :: EngineStatus -> EnumKeyCode -> IO (Bool)
isKeyDown (EngineStatus _ _ _ _ _ _ _ keyboard) keycode = do
	isdown <- cOISKIsKeyDown keyboard keycode
	return (isdown)



-- renderLoop function

renderLoop :: EngineStatus -> (EngineStatus -> IO ()) -> IO ()
renderLoop (EngineStatus root sceneManager rgm inputManager window camera viewport keyboard) stepFunc = do
	fUMessagePump
	closed <- cRwIsClosed window
	if (closed) then
		return ()
		else do
			cRRenderOneFrame root
			cOISOCapture keyboard
			stepFunc (EngineStatus root sceneManager rgm inputManager window camera viewport keyboard)
			renderLoop (EngineStatus root sceneManager rgm inputManager window camera viewport keyboard) stepFunc