MogreQuickStart is a .NET class written in Visual Basic 2008. It's goal is to provide a quick entry point to easily write Mogre applications. I developped it for myself to use it in my project (KSEditor), but everyone can use it. It takes in input as an OSM file to load.

There is also a topic in the Mogre forum to discuss it. This is the thread.

Note: The old name of MogreQuickStart was clOgre.



Introduction


What you need to use this class in your executable path is:

MogreQuickStart.dll (this class)
Mogre.dll
MogreNewt.dll
Mois.dll
Newton.dll
ofusionLoader.dll (see forward)
OgreMain.dll
OIS.DLL
Plugins.cfg:

To use video capture system, you will have to download AVIFILEWRAPPER that you can found here.
I have modified it so the functions can accept the new parameter _ChoixDuCodec and when codec is choosen, it will be save in registry for later use.

You can download it as a DLL here.
For source code, ask me by PM in forum.

The whole VB 2008 solution can be downloaded here (complete with help file in french): http://www.trokus.fr/index.php/files/get/D06GlwHU77/clogre.rar.

# Defines plugins to load

# Define plugin folder
PluginFolder=.\Plugins

# Define plugins
Plugin=RenderSystem_Direct3D9
Plugin=RenderSystem_GL


You also need a folder Plugins which contains the specified plugins from plugins.cfg.

To compile oFusionLoader.dll of [OFusion)), use C# Express 2008. It works fine.

Of course, you also need an OSM scene to load.

Here is the class:

Imports Mogre
Imports MOIS
Imports MogreNewt
Imports OFusion
Imports System

Public Class MogreQuickStart

Imports Mogre
Imports MOIS
Imports MogreNewt
Imports OFusion
Imports System
Imports System.Drawing
Imports System.ComponentModel

#Region "Déclarations"

    'Cette fonction sert à capturer une image (utilisé pour le système de capture vidéo)
    'function to capturing content of a graphic (use to make video capture)
    Private Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Int32, _
                                                                ByVal x As Int32, _
                                                                ByVal y As Int32, _
                                                                ByVal nWidth As Int32, _
                                                                ByVal nHeight As Int32, _
                                                                ByVal hSrcDC As Int32, _
                                                                ByVal xSrc As Int32, _
                                                                ByVal ySrc As Int32, _
                                                                ByVal dwRop As Int32) As Boolean

    Structure Camera 'Permet de contenir les informations de caméra / contains camera information
        Dim Camera As Mogre.Camera
        Dim CamNode As Mogre.SceneNode
        Dim CamViewNode As Mogre.SceneNode
        Dim CamBody As MogreNewt.Body
    End Structure

    Private _OgreRacine As Mogre.Root 'La racine OGRE / Ogre Root
    Private _OgreSceneManager As Mogre.SceneManager 'Le SceneManager OGRE / Ogre Scene Manager
    Private _OgreCamera As Mogre.Camera 'La caméra sélectionnée / Currently selected camera
    Private _RenderWindow As Mogre.RenderWindow 'la fenêtre de rendu / Render Window
    Private _ShowAxesMonde As Boolean = False 'Axe du monde visible ou pas / World axes visible or not
    Private _ShowAxesObjet As Boolean = False 'Axe d'un objet sélectioné visible ou pas / Selected object axes visible or not
    Private _TrackObjet As Boolean = False 'Autotracking de la caméra actif ou pas / Camera autotracking enable or not
    Private _Gravity As Single = -9.81 'Et oui, on aura un poid...(Sur terre = 9.81m/s² / gravity forces
    Private _RenderWindowHandle As System.IntPtr 'Le handle du contrôle qui affichera le rendu / handle of the control to render on
    Private _TopWindowHandle As System.IntPtr 'Le handle de la fenêtre contenant le contrôle de rendu / handle of main window
    Private _CollisionDetection As Boolean = True 'Détection de collision activée ou pas / collision detection enable or not
    Private _Application As Object 'Pour permettre de gérer le doevents dans la boucle de rendu / To handle 'doevent' in render loop
    Private _init As Boolean = True 'Permettra de savoir si on est en cours d'initialisation de l'application / if we are in initialiastion of the class
    Private _showLoad As Boolean = True 'Afficher ou pas la fenêtre d'info au chargement / 'show or not the splash screen
    Private _GravityOnOff As Boolean = True 'Gravité active ou pas / gravity on or off
    Private _LoadAxe As Boolean = False 'on charge les axex ou pas / axes loaded or not
    Private _RenderOn As Boolean = True 'Sert à savoir si on à quitter l'appli pour stopper le rendu / if quitting application, stop render
    Private _MoveFactor As Single = 2 'Vitesse de déplacement / speed of move
    Private _DebugNewton As Boolean = False 'Permet de demander l'activation du debuger Newton / Init or not Newton Debuger
    Private _ShowDebugNewtonInfo As Boolean = False 'Si vraie, montre les infos de debug Newton / If true, show Newton debug Info
    Private _OgreMaxFPS As Integer = 1000
    Private _MaxFrameSkip As Integer = 5
    'La taille du body représentant le corp physique de la caméra Ajuster cette valeur en fonction de la scène. 
    'Size of body of the camera. Adjust this value depending of the scene. 
    Private _CamSize As Mogre.Vector3 = New Mogre.Vector3(1, 1.7, 1) 'Taille du body de la caméra / Camera body size
    Private _CammMass As Single = 90 'Masse de la caméra / Camera mass
    Private _GetPerformanceCounter As Decimal 'Pour le timer (non implémenté) / For high resolution timer (not implemented yet)
    Private _GetPerformanceFreqency As Decimal 'Pour le timer (non implémenté) / For high resolution timer (not implemented yet)
    Private _SceneType As Mogre.SceneType = SceneType.ST_GENERIC 'Comme son nom l'indique / As name says
    Private _StartupPath As String 'Chemin de démarrage de l'application pour l'ajout au Ressources Manager / application startup path for ressources manager
    Private _NewtonUpdateFps As Single = 60 'Nombre de FPS à gérer par Newton / Number of FPS to handle by Newton
    Private _TimeFactor As Single = 1 'Echelle de temp pour Newton / Time scale for Newton
    Private _SuspendRender As Boolean = False 'Permet de suspendre le rendu durant une période / Allows to suspend render for a reason or another
    Private _SceneToLoad As String 'Le nom de la scène à charger / Scene'name to load
    Private _RessourcesToLoad As ArrayList = New ArrayList 'La liste des ressources à charger / list of ressources needed
    Private _moving As Boolean 'vraie si on a cliqué dans le control de rendu (permet le déplacement) / true if render control is clicked (allow to move)
    Private _AvgFPS As Single 'Nombre moyen de FPS / average FPS..
    Private _CurrentCamBody As MogreNewt.Body 'Le corps physique de la caméra sélectionnée / the body of selected camera
    Private _NewtonWorldSizeMin As Mogre.Vector3 = New Mogre.Vector3(-1000, -1000, -1000)
    Private _NewtonWorldSizeMax As Mogre.Vector3 = New Mogre.Vector3(1000, 1000, 1000)

    Private _mReflectSceneNode As Mogre.SceneNode 'le scene node de l'objet de la scène sur lequel sera basé la réflection / scene node to base reflection on
    Private _ReflecionIntensity As Single = 0.35F 'degrée de réflection (1 pour mirroir) / quantity of reflection (1 for a mirror)
    Private _UScaleReflect As Single = 0.1F 'pour mise à l'échelle de la texture originale de l'objet de base / for scaling of base object texture
    Private _vScaleReflect As Single = 0.1F
    Private _SceneBlendingType As Mogre.SceneBlendType = SceneBlendType.SBT_TRANSPARENT_ALPHA 'le type de fondu de la texture de base et de la texture réfléchie / blending type for base and reflected texture
    Private _ReflectPlaneNormal As Mogre.Vector3 = Mogre.Vector3.UNIT_Y 'Pour définir l'orientation du plan de réflection / To define reflect plane orientation
    Private _myWorld As World = Nothing 'Le monde physique / Newton physical world


    Private _Translate As Single = 2 'La valeur de translation pour la gestion sans détection de collisions / movement speed if Newwton is nont used
    Private _Rotate As Single = 1 'Pareil mais pour les rotations / same for rotation
    Private _FSAA As Integer = 0 'antialiasing 
    Private _NbCapturedFrameBySecond As Integer = 24 'Nombre d'image à capturer pour la capture vidéo / Numbre of frame to be captured for video

    Private ListeCamera As ArrayList = New ArrayList 'La liste des caméra de la scène  / camera scene list
    Private _InfoMessage As String = "" 'Message à afficher dans la fenêtre d'info

    'Variable pour la capture video / variables for video capture
    Private _CtrlToCapture As Object 'Le control à capture / control to capture
    Private _ChoixDuCodec As Boolean 'true : affichera la fenêtre de choix du codec / true : allow to chow codec window choice
    Private _RecordDate As String 'Date de l'enregistrement / record date
    Private FilmManager As AviFile.AviManager
    Private FilmStream As AviFile.VideoStream
    Private bRecordVideo As Boolean = False 'true si capture video en cours / true if capture video is running

    Private TimeUpdate As Single = 1 / _NewtonUpdateFps 'Vitesse d'update de Newton / Newton update speed
    Private TimeElapsed As Single = 0 'Pour Newton / for Newton
    Private TimeSinceLastFrame As Single 'Pour Newton / for Newton

    Private NodeAxe As Mogre.SceneNode 'L'axe des objets / Object axes
    Private NodeAxeMonde As Mogre.SceneNode 'L'axe du monde / world axes
    Private myfrminfo As New frmInfo 'Splash screen

    Private Scene As OSMScene 'La variable pour le chargement de la scene oFusion / oFusion scene

    'Déclarations pour Newton

    Private CurrentCamNode As Mogre.SceneNode 'Le node de la caméra sélectionnée / currently selected camera node
    Private CurrentCamViewNode As Mogre.SceneNode 'Le View Node de la caméra sélectionnée / currently selected view node
    Private camera_rotation_x As Single
    Private camera_rotation_y As Mogre.Degree
    Private y_rotation_cont As Degree
    Private y_limit_a As Single = 90 'Les limites hautes et basses de rotation de la caméra / movement limitation on Y
    Private y_limit_b As Single = -90
    Private InitialCamBodyPos As Mogre.Vector3 'Position et orientation de départ de la caméra / initial position and orientation of camera
    Private InitialCamBodyOrient As Mogre.Quaternion


    'Déclaration pour MOIS / MOIS declaration
    Private inputManager As MOIS.InputManager
    Private inputKeyboard As MOIS.Keyboard = Nothing
    Private inputMouse As MOIS.Mouse = Nothing

    'Les déclarations pour le plan de réflection / Reflection plane declaration
    Private ReflectionPlane As Mogre.Plane 'Le plan suivant lequel se fera la réflection / Reflection plane
    Private mPlaneEnt As Mogre.Entity 'l'entity de plan / Plane entity
    Private mPlaneNode As Mogre.SceneNode 'son scene node / It's scene node
    Private ReflectOn As Boolean = False 'reflection active ou pas / reflection on or off
    Private ReflectInit As Boolean = False 'vraie si les réflection sont actives / true if reflection active
    Private texture As Mogre.TexturePtr
    Private ReflectPlane As Mogre.MeshPtr
    Private rttTex As Mogre.RenderTarget

    'Private FrameTime As New System.TimeSpan
    'Private LastFrameTime As New System.TimeSpan
    'Private TimeSinceLastFrames As New System.TimeSpan
    Private FrameTime As UInteger
    Private LastFrameTime As UInteger
    Private TimeSinceLastFrames As UInteger
    Private Counter As Integer

    Private OgreTimer As Mogre.Timer = New Mogre.Timer

#End Region

#Region "Définition des API / API definitions"

    'Pour le timer haute résolution (non implémenté) / for high resolution timer (not implemented yet)

    Declare Function QueryPerformanceCounter Lib "Kernel32" (ByVal X As Decimal) As Boolean
    Declare Function QueryPerformanceFrequency Lib "Kernel32" (ByVal X As Decimal) As Boolean

#End Region

#Region "Les propiétés / Property"

    'Les actions ci dessous permettent d'affecter ou lire les différentes propriétés exposée. Ce passe de commentaire
    'This actions allow to get or set exposed property of the class

    ReadOnly Property OgreRacine() As Mogre.Root
        Get
            Return _OgreRacine
        End Get

    End Property

    ReadOnly Property OgreSceneManager() As Mogre.SceneManager
        Get
            Return _OgreSceneManager
        End Get
    End Property

    Property OgreCamera() As Mogre.Camera
        Get
            Return _OgreCamera
        End Get
        Set(ByVal value As Mogre.Camera)
            _OgreCamera = value
        End Set
    End Property

    Property ShowAxesMonde() As Boolean
        Get
            Return _ShowAxesMonde
        End Get
        Set(ByVal value As Boolean)
            _ShowAxesMonde = value
        End Set
    End Property

    WriteOnly Property osmSceneName() As String
        Set(ByVal value As String)
            _SceneToLoad = value
        End Set
    End Property

    WriteOnly Property RessourcesToLoad() As String()
        Set(ByVal value As String())
            For i As Integer = 0 To value.Length - 1
                _RessourcesToLoad.Add(value(i))
            Next
        End Set
    End Property

    WriteOnly Property RenderWindowHandle() As System.IntPtr
        Set(ByVal value As System.IntPtr)
            _RenderWindowHandle = value
        End Set
    End Property

    WriteOnly Property TopWindowHandle() As System.IntPtr
        Set(ByVal value As System.IntPtr)
            _TopWindowHandle = value
            _RenderWindowHandle = value
        End Set
    End Property

    Property CollisionDetection() As Boolean
        Get
            Return _CollisionDetection
        End Get
        Set(ByVal value As Boolean)
            _CollisionDetection = value
        End Set
    End Property

    WriteOnly Property Application()
        Set(ByVal value)
            _Application = value
        End Set
    End Property

    WriteOnly Property Moving() As Boolean
        Set(ByVal value As Boolean)
            _moving = value
        End Set
    End Property

    WriteOnly Property Init() As Boolean
        Set(ByVal value As Boolean)
            _init = value
        End Set
    End Property

    WriteOnly Property ShowInfo() As Boolean
        Set(ByVal value As Boolean)
            _showLoad = value
        End Set
    End Property

    WriteOnly Property RenderOn() As Boolean
        Set(ByVal value As Boolean)
            _RenderOn = value
        End Set
    End Property

    WriteOnly Property GravityOn() As Boolean
        Set(ByVal value As Boolean)
            _GravityOnOff = value
        End Set
    End Property

    Property Gravity() As Single
        Get
            Return _Gravity
        End Get
        Set(ByVal value As Single)
            _Gravity = value
        End Set
    End Property

    Property MoveFactor() As Single
        Get
            Return _MoveFactor
        End Get
        Set(ByVal value As Single)
            _MoveFactor = value
        End Set
    End Property

    WriteOnly Property TranslatFactor() As Single
        Set(ByVal value As Single)
            _Translate = value
        End Set
    End Property

    WriteOnly Property RotateFactor() As Single
        Set(ByVal value As Single)
            _Rotate = value
        End Set
    End Property

    WriteOnly Property AxeLoaded() As Boolean
        Set(ByVal value As Boolean)
            _LoadAxe = value
        End Set
    End Property

    WriteOnly Property CameraSize() As Mogre.Vector3
        Set(ByVal value As Mogre.Vector3)
            _CamSize = value
            If Not _CurrentCamBody Is Nothing Then
                CurrentCamNode.SetScale(_CamSize)
            End If
        End Set
    End Property

    ReadOnly Property GetPerformanceCounter() As Decimal
        Get
            Return _GetPerformanceCounter
        End Get
    End Property

    ReadOnly Property GetPerformanceFrequency() As Decimal
        Get
            Return _GetPerformanceFreqency
        End Get
    End Property

    WriteOnly Property AssignSceneType() As Mogre.SceneType
        Set(ByVal value As Mogre.SceneType)
            _SceneType = value
        End Set
    End Property

    WriteOnly Property StartupPath() As String
        Set(ByVal value As String)
            _StartupPath = value
        End Set
    End Property

    WriteOnly Property DebugOnOff() As Boolean
        Set(ByVal value As Boolean)
            If value Then
                MogreNewt.Debugger.Instance.ShowLines(_myWorld)
            Else
                MogreNewt.Debugger.Instance.HideLines()
            End If
        End Set
    End Property

    WriteOnly Property NewtonUpdateFps() As Single
        Set(ByVal value As Single)
            _NewtonUpdateFps = value
            If Not _myWorld Is Nothing Then
                _myWorld.SetMinimumFrameRate(_NewtonUpdateFps)
                TimeUpdate = 1 / _NewtonUpdateFps
            End If
        End Set
    End Property

    WriteOnly Property NewtonTimeFactor() As Single
        Set(ByVal value As Single)
            _TimeFactor = value
        End Set
    End Property

    ReadOnly Property OgreRenderWindow() As Mogre.RenderWindow
        Get
            Return _RenderWindow
        End Get

    End Property

    WriteOnly Property SuspendRender() As Boolean
        Set(ByVal value As Boolean)
            _SuspendRender = value
        End Set
    End Property

    WriteOnly Property ShowDebugNewtonInfo() As Boolean
        Set(ByVal value As Boolean)
            _ShowDebugNewtonInfo = value
        End Set
    End Property

    WriteOnly Property CamMass() As Single
        Set(ByVal value As Single)
            _CammMass = value
        End Set
    End Property

    ReadOnly Property FPS() As Single
        Get
            Return OgreRenderWindow.AverageFPS
        End Get
    End Property

    ReadOnly Property CamBody() As MogreNewt.Body
        Get
            Return _CurrentCamBody
        End Get
    End Property

    ReadOnly Property NewtonWorld() As MogreNewt.World
        Get
            Return _myWorld
        End Get
    End Property

    WriteOnly Property ReflectSceneNode() As Mogre.SceneNode
        Set(ByVal value As Mogre.SceneNode)
            _mReflectSceneNode = value
        End Set
    End Property

    WriteOnly Property Reflectionintensity() As Single
        Set(ByVal value As Single)
            _ReflecionIntensity = value
        End Set
    End Property

    WriteOnly Property uScale() As Single
        Set(ByVal value As Single)
            _UScaleReflect = value
        End Set
    End Property

    WriteOnly Property vScale() As Single
        Set(ByVal value As Single)
            _vScaleReflect = value
        End Set
    End Property

    WriteOnly Property SceneBlendingType() As Mogre.SceneBlendType
        Set(ByVal value As Mogre.SceneBlendType)
            _SceneBlendingType = value
        End Set
    End Property

    WriteOnly Property ReflectPlaneNorma() As Mogre.Vector3
        Set(ByVal value As Mogre.Vector3)
            _ReflectPlaneNormal = value
        End Set
    End Property

    WriteOnly Property OgreMaxFPS() As Integer
        Set(ByVal value As Integer)
            _OgreMaxFPS = value
        End Set
    End Property

    WriteOnly Property MaxFrameSkip() As Integer
        Set(ByVal value As Integer)
            _MaxFrameSkip = value
        End Set
    End Property

    WriteOnly Property NewtonWorldSizeMin() As Mogre.Vector3
        Set(ByVal value As Mogre.Vector3)
            _NewtonWorldSizeMin = value
        End Set
    End Property

    WriteOnly Property NewtonWorldSizeMax() As Mogre.Vector3
        Set(ByVal value As Mogre.Vector3)
            _NewtonWorldSizeMax = value
        End Set
    End Property

    WriteOnly Property DebugNewton() As Boolean
        Set(ByVal value As Boolean)
            _DebugNewton = value
        End Set
    End Property

    WriteOnly Property InfoMessage() As String
        Set(ByVal value As String)
            _InfoMessage = value
        End Set
    End Property

    WriteOnly Property FSAA() As Integer
        Set(ByVal value As Integer)
            _FSAA = value
        End Set
    End Property

    'WriteOnly Property ArrayImg()
    '    Set(ByVal value)
    '        _tArrayImg.Add(value)
    '    End Set
    'End Property

    WriteOnly Property CtrlToCapture()
        Set(ByVal value)
            _CtrlToCapture = value
        End Set
    End Property

    WriteOnly Property ChoixDuCodec() As Boolean
        Set(ByVal value As Boolean)
            _ChoixDuCodec = value
        End Set
    End Property

    ReadOnly Property RecordDate() As String
        Get
            Return _RecordDate
        End Get
    End Property

    WriteOnly Property NbCapturedFrameBySecond() As Integer
        Set(ByVal value As Integer)
            _NbCapturedFrameBySecond = value
        End Set
    End Property



#End Region

#Region "Procédures et fonctions / Proc and sub"

#Region "Publics"

    Public Sub ChangeMessage()
        If _showLoad Then
            myfrminfo.lblInfo.Text = _InfoMessage
            myfrminfo.Refresh()
        End If
    End Sub

    Public Function Timer() As Single

        'Une fonction Timer haute résolution basée sur les performances de l'ordi
        'Pour la gestion de l'update de Newton, non encore implémenté

        Static Start As Decimal = 0
        Static Frequency As Decimal = 0

        If Start = 0 Then
            'Si premier appel, on initialise les variables statiques
            Dim bool As Boolean = QueryPerformanceCounter(Start)
            QueryPerformanceFrequency(Frequency)
            Return 0.0F
        End If

        Dim counter As Decimal
        QueryPerformanceCounter(counter)

        'On renvoi la valeur depuis le premier appel
        Return ((counter - Start) / Frequency)



    End Function

    Public Function InitOgre(ByVal PluginFiles As String, ByVal CfgFile As String, ByVal LogFile As String) As Boolean
        'Création de la racine OGRE et du SceneManager. 
        'Affichage de la fenêtre de paramètres OGRES, le cas échéant
        'Ogre root, scenen manager initialisation and showing of ogre configuration window if necessary

        _OgreRacine = New Root(PluginFiles, CfgFile, LogFile)
        If Not _OgreRacine.RestoreConfig() Then
            If Not _OgreRacine.ShowConfigDialog Then
                Return False
            End If
        End If
        Try
            _OgreSceneManager = _OgreRacine.CreateSceneManager(_SceneType)
        Catch ex As System.Runtime.InteropServices.SEHException
            'en cas d'erreur..../ if error is raised
            If OgreException.IsThrown Then
                MsgBox(OgreException.LastException.FullDescription, MsgBoxStyle.Critical, _
                     "Exeption OGRE!")
                Return False
            Else
                MsgBox(ex.ToString, "Erreur")
                Return False
            End If
        End Try
        Try
            'On initialise OGRE/ OGRE initialisation
            _OgreRacine.Initialise(False)
        Catch ex As System.Runtime.InteropServices.SEHException
            'en cas d'erreur..../ if error is raised
            FileIO.FileSystem.DeleteFile(_StartupPath + "\ogre.cfg")
            If Not _OgreRacine.ShowConfigDialog Then
                Return False
            End If
        End Try

        Return True

    End Function

    Public Function InitScene(ByVal Langue As String) As Boolean
        If _showLoad Then
            Langue = Langue.ToUpper
            If Langue = "FR" Then
                myfrminfo.lblInfo.Text = "Chargement de la scène en cours....Merci de patienter."
            ElseIf Langue = "DE" Then
                myfrminfo.lblInfo.Text = "Laden der aktuellen Szene.... Bitte sich gedulden."
            ElseIf Langue = "ES" Then
                myfrminfo.lblInfo.Text = "Carga de la escena corriente.... Gracias por tener paciencia."
            ElseIf Langue = "IT" Then
                myfrminfo.lblInfo.Text = "Caricando del palcoscenico in progresso....Grazie essere paziente."
            ElseIf Langue = "PO" Then
                myfrminfo.lblInfo.Text = "Carregando em desenvolvimento da fase....Lhe agradeça ser paciente."
            Else
                myfrminfo.lblInfo.Text = "Scene loading in progress....Please wait"
            End If
            myfrminfo.Show()
            myfrminfo.Refresh()
        End If
        Try
            'On initialise OGRE/ OGRE initialisation
            '_OgreRacine.Initialise(False)

            'On crè la fenêtre, ici ce sera dans un contrôle, une picturebox / OGRE window creation, here in a control
            Dim misc As NameValuePairList = New NameValuePairList
            misc("externalWindowHandle") = _RenderWindowHandle.ToString
            misc("FSAA") = _FSAA
            Dim const_list As Const_NameValuePairList = misc.ReadOnlyInstance
            _RenderWindow = _OgreRacine.CreateRenderWindow("OgreWieport", 0, 0, False, const_list)

            'On crés le ressource manager avec les ressources passées en paramètre dans la liste des ressources.
            'Ressource manager creation withe ressources given in parameters in ressources list
            'Par défaut, on prend le chemin de la scène / pth of the scene by default
            ResourceGroupManager.Singleton.AddResourceLocation(System.IO.Path.GetDirectoryName(_SceneToLoad), "FileSystem", "General")

            'On ajoute le répertoires OBJETS de l'application qui contient, entre autre, les axes
            'adding objets path that contain such thing as axes for example
            ResourceGroupManager.Singleton.AddResourceLocation(_StartupPath + "\Objets", "FileSystem", "General")

            'et on parcourt la variable _RessourcesToLoad pour ajouter les ressources supplémentaires (répertoires ou fichiers zip)
            'iteration of _RessourceToLoad to add other ressources (Directory or zip files)
            Dim SplitRessource() As String
            For i As Integer = 0 To _RessourcesToLoad.Count - 1
                SplitRessource = _RessourcesToLoad(i).ToString.Split("|")
                ResourceGroupManager.Singleton.AddResourceLocation(SplitRessource(0), SplitRessource(1), "General")
            Next

            'Fini, on initialise toutes les ressources / Initailisation of all ressources
            ResourceGroupManager.Singleton.InitialiseAllResourceGroups()

            'On charge la scène OSM grâce à la dll oFusion / OSM scene loading with oFusion DLL
            Scene = New OSMScene(_OgreSceneManager, _RenderWindow)
            Scene.Initialize(_SceneToLoad)
            Scene.CreateScene(_OgreSceneManager.RootSceneNode)

            'création de la caméra / camera creation
            If Scene.CameraList.Count > 0 Then
                'Si la scene contient au moins une caméra, on sélectionne la première / if there is at least one cam in scene we select it
                _OgreCamera = Scene.CameraList(0)
            Else
                'sinon, on en crè une par défaut / else we create one
                _OgreCamera = Scene.SceneMgr.CreateCamera("CameraDefaut")
                _OgreCamera.SetPosition(0, 0, 0)
                _OgreCamera.SetDirection(0, 0, 0)
                _OgreCamera.FOVy = CType(1, Mogre.Radian)
                Dim camNode As SceneNode = _OgreSceneManager.CreateSceneNode("CameraDefaut")
                camNode.AttachObject(_OgreCamera)

                Dim CameraTarget As Mogre.SceneNode = _OgreSceneManager.CreateSceneNode("CameraDefaut.target")
                CameraTarget.SetPosition(1000, 1000, 1000)
                CameraTarget.SetDirection(0, 0, 0)
                CameraTarget.SetScale(1, 1, 1)

                'On crè le viewport / vieport creation
                Dim ViewPort As Mogre.Viewport = _RenderWindow.AddViewport(_OgreCamera)
                _OgreCamera.AspectRatio = ViewPort.ActualWidth / ViewPort.ActualHeight
            End If
            _OgreCamera.NearClipDistance = 5

            InitialCamBodyOrient = _OgreCamera.Orientation
            InitialCamBodyPos = _OgreCamera.Position

            'si on a décidé d'activer la gestion des collisions, on initialise Newton / if colision detection enable, Newton init
            If _CollisionDetection Then
                InitNewton(Langue)
            End If

            'initialisation de l'inputmanager MOIS / input manager initialisation
            InitInputHandler()

            If _LoadAxe Then
                LoadAxe() 'Chargement et instanciation des axes / axes loading
            End If

        Catch ex As System.Runtime.InteropServices.SEHException
            If _showLoad Then
                myfrminfo.Hide()
                myfrminfo.Dispose()
            End If
            'en cas d'erreur..../if error
            If OgreException.IsThrown Then
                MsgBox(OgreException.LastException.FullDescription, MsgBoxStyle.Critical, _
                     "Exeption OGRE!")
                Return False
            Else
                MsgBox(ex.ToString, "Erreur")
                Return False
            End If
        End Try
        'If _showLoad Then
        '    myfrminfo.Hide()
        '    myfrminfo.Dispose()
        'End If
        Return True
    End Function

    Public Sub OgreGo()
        If _showLoad Then
            myfrminfo.Hide()
            myfrminfo.Dispose()
        End If


        While _RenderOn
            If _ShowDebugNewtonInfo Then
                MogreNewt.Debugger.Instance.ShowLines(_myWorld)
            End If
            If Not _SuspendRender Then
                'et on rend une frame / render of one frame
                Try
                    _OgreRacine.RenderOneFrame()
                Catch ex As Exception

                End Try
                'Update du monde physique / physical worl update
                If _CollisionDetection Then
                    _NewtonUpdateFps = _AvgFPS
                    UpdateNewton(TimeSinceLastFrame)
                End If
                If _ShowDebugNewtonInfo Then
                    MogreNewt.Debugger.Instance.ShowLines(_myWorld)
                    MogreNewt.Debugger.Instance.HideLines()
                End If
            End If
            _Application.doevents()
            If _ShowDebugNewtonInfo Then
                MogreNewt.Debugger.Instance.HideLines()
            End If
        End While
    End Sub

    Public Sub OgreUpdate()
        If _showLoad Then
            myfrminfo.Hide()
            myfrminfo.Dispose()
        End If
        'A utiliser dans les fenêtre de dialogue modale à l'aide d'un timer
        'To use in a modal window wihtin a timer of that window
        If _ShowDebugNewtonInfo Then
            MogreNewt.Debugger.Instance.ShowLines(_myWorld)
        End If
        If Not _SuspendRender Then
            'et on rend une frame / render one frame
            _OgreRacine.RenderOneFrame()
            'Update du monde physique / physical world update
            If _CollisionDetection Then
                _NewtonUpdateFps = _AvgFPS
                UpdateNewton(TimeSinceLastFrame)
            End If
            If _ShowDebugNewtonInfo Then
                MogreNewt.Debugger.Instance.ShowLines(_myWorld)
                MogreNewt.Debugger.Instance.HideLines()
            End If
        End If
        If _ShowDebugNewtonInfo Then
            MogreNewt.Debugger.Instance.HideLines()
        End If
    End Sub

    Public Sub ReSize(ByVal width As Single, ByVal height As Single)

        'Pour redimensionner le vieport de manière correcte quand on redimmensionne la picturebox (du à un resize de la form ou un déplacement des splitter)
        'to resize vieport when render control is resized

        If Not _init Then
            _RenderWindow.WindowMovedOrResized()
            _OgreCamera.AspectRatio = width / height
        End If
    End Sub

    Public Sub SelectCamera(ByVal CameraName As String, ByVal GravityOn As Boolean)

        'Permet de changer de caméra sur une scène multi caméra / allow to choose camera in a multi camera scene

        _OgreCamera = OgreSceneManager.GetCamera(CameraName) 'on récupère le nom de la caméra sélectionnée/ selected camera's name
        _RenderWindow.GetViewport(0).Camera = _OgreCamera 'et on change de caméra / affecting camera to vieport
        If ReflectOn Then
            rttTex.GetViewport(0).Camera = _OgreCamera 'si on affiche les réflecion, on change aussi la caméra / if reflection on, we change camera too
        End If
        _GravityOnOff = GravityOn

        For i As Integer = 0 To ListeCamera.Count - 1
            'Important, il faut bien resélectionner les cambody et autre associés à la caméra choisi / and important, getting the good cam body
            If ListeCamera.Item(i).Camera.name = CameraName Then
                CurrentCamNode = ListeCamera.Item(i).CamNode
                _CurrentCamBody = ListeCamera.Item(i).CamBody
                CurrentCamViewNode = ListeCamera.Item(i).CamViewNode
                Exit For
            End If
        Next
        Dim myViewport As Mogre.Viewport = _RenderWindow.GetViewport(0)
        _OgreCamera.AspectRatio = myViewport.ActualWidth / myViewport.ActualHeight
        If ReflectOn Then
            myViewport = rttTex.GetViewport(0)
            _OgreCamera.AspectRatio = myViewport.ActualWidth / myViewport.ActualHeight
        End If

    End Sub

    Public Sub Shutdown()
        'On arrête le rendu / render stop
        _RenderOn = False
    End Sub

    Public Sub DisposeOgre()
        'Pemet de nettoyer les instances OGRES en cas de rechargement de la scène ou de l'ouverture d'une nouvelle
        'Allow to destroy all ogre instances

        If ReflectOn Then
            texture = Nothing
            texture.Dispose()
            ReflectPlane = Nothing
            ReflectPlane.Dispose()
            Mogre.MeshManager.Singleton.RemoveAll()
            Mogre.MeshManager.Singleton.Dispose()
            Mogre.TextureManager.Singleton.RemoveAll()
            Mogre.TextureManager.Singleton.Dispose()
        End If

        ResourceGroupManager.Singleton.DestroyResourceGroup("General")
        ResourceGroupManager.Singleton.Dispose()

        _RenderWindow.RemoveAllViewports()
        _OgreRacine.DetachRenderTarget(_RenderWindow)
        _RenderWindow.Destroy()

        _OgreRacine.DestroySceneManager(_OgreSceneManager)
        _OgreRacine.DestroyAllRenderQueueInvocationSequences()
        _OgreRacine.Shutdown()
        _OgreRacine.Dispose()


    End Sub

    Public Sub DisposeNewton()

        'Permet de liberer les instances Newton
        'allow to clear newton world

        If _CollisionDetection Then
            Try
                _myWorld.DestroyAllBodies()
                _myWorld.Dispose()

            Catch ex As Exception

            End Try
        End If

    End Sub

    Public Sub ReflectionOff()
        'Permet de suspendre la reflection / allow to suspend reflection

        mPlaneEnt.Visible = False 'on cache le plan de reflection / hiding reflection plane
        _mReflectSceneNode.GetAttachedObject(CType(0, UShort)).Visible = True 'on montre l'objet initial / showing base object
        ReflectOn = False 'on ne fait plus de reflection / no reflection

    End Sub

    Public Sub ReflectionOn()

        'Permet d'initialiser les reflections ou de les réactiver si elles avaient été suspendue
        'Allow to initialise reflection or reactivat it if the have been suspended

        If ReflectInit Then 'si elle ont été suspendus, alors, on les réactive / if suspended, reactivate it
            mPlaneEnt.Visible = True 'on montre le plan de réflection / showing reflection plane
            _mReflectSceneNode.GetAttachedObject(CType(0, UShort)).Visible = False 'on cache l'objet de base / hiding base object
            ReflectOn = True 'on réfléchit / recflection on
            Exit Sub
        End If

        ReflectionPlane.normal = _ReflectPlaneNormal 'par défaut un plan horizontal / horizontal plane
        ReflectionPlane.d = 0 '?
        'Creation du plan / plane creation
        ReflectPlane = Mogre.MeshManager.Singleton.CreatePlane("ReflectPlane", Mogre.ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME, ReflectionPlane, 1024, 1024, 16, 16, True, 1, 1, 1, Mogre.Vector3.UNIT_Z)

        'Tou ce qui suit est pour ajouter le plan à la scene / all that follow is to add plane to scene
        mPlaneEnt = _OgreSceneManager.CreateEntity("ReflectPlaneEnt", "ReflectPlane")
        mPlaneNode = _OgreSceneManager.RootSceneNode.CreateChildSceneNode
        mPlaneNode.AttachObject(mPlaneEnt)
        'Le plan pend les même taile et position que l'objet de base / plane take same size and position than base object
        mPlaneNode.Position = _mReflectSceneNode.Position
        mPlaneNode.Orientation = _mReflectSceneNode.Orientation
        mPlaneNode.Scale(_mReflectSceneNode.GetScale)

        'Creation de la texture pour le calcul des réflections / texture creation for reflection 
        texture = Mogre.TextureManager.Singleton.CreateManual("RttTex", "General", Mogre.TextureType.TEX_TYPE_2D, CType(512, UInteger), CType(512, UInteger), 0, Mogre.PixelFormat.PF_R8G8B8, Mogre.TextureUsage.TU_RENDERTARGET)
        rttTex = texture.GetBuffer.GetRenderTarget()

        'Creation du viewport pour calculer les réflections / creation of reflection viewport
        Dim v As Mogre.Viewport = rttTex.AddViewport(_OgreCamera)
        v.SetClearEveryFrame(True)
        v.BackgroundColour = Mogre.ColourValue.Black

        'Récupération de la texture de l'objet de base / getting texture from base object
        Dim OrigObjet As Mogre.Entity = _mReflectSceneNode.GetAttachedObject(CType(0, UShort))
        Dim MatToBlend As Mogre.MaterialPtr = OrigObjet.GetSubEntity(CType(0, UShort)).GetMaterial().Clone("ReflectMat") 'on la clone pour ne pas alterer celle de l'objet / cloning it to not alter base object texture

        'on crè une nouvelle technique dans la texture / creation of a new ehcnique in texture
        Dim t As Mogre.TextureUnitState = MatToBlend.GetTechnique(CType(0, UShort)).GetPass(CType(0, UShort)).CreateTextureUnitState("RttTex")
        'on récupère la première technique de la texture pour permettre sa mise à l'échelle / getting first technique to scaling texture
        Dim t1 As Mogre.TextureUnitState = MatToBlend.GetTechnique(CType(0, UShort)).GetPass(CType(0, UShort)).GetTextureUnitState(CType(0, UShort))

        'le paramètrage pour le fondu des deux texture / applying param to blend textures
        t.SetColourOperationEx(LayerBlendOperationEx.LBX_BLEND_MANUAL, LayerBlendSource.LBS_TEXTURE, LayerBlendSource.LBS_CURRENT, Mogre.ColourValue.White, Mogre.ColourValue.White, _ReflecionIntensity)
        t.SetTextureAddressingMode(TextureUnitState.TextureAddressingMode.TAM_CLAMP)
        t.SetProjectiveTexturing(True, _OgreCamera)
        MatToBlend.SetSceneBlending(_SceneBlendingType)

        'mise à l'échelle de la première texture / scaling first texture
        t1.TextureUScale = _UScaleReflect
        t1.TextureVScale = _vScaleReflect

        'on affecte les évènement à faire avant et après rendu du viewport / affecting event in pre and post viewport render
        AddHandler rttTex.PostRenderTargetUpdate, AddressOf postRenderTargetUpdate
        AddHandler rttTex.PreRenderTargetUpdate, AddressOf preRenderTargetUpdate

        'on affecte le materiel au plan / adding material to plan
        mPlaneEnt.SetMaterialName(MatToBlend.Name)

        OrigObjet.Visible = False 'on cache l'objet de base / hiding base object
        ReflectOn = True 'on active les réflections / activate reflection
        ReflectInit = True 'les reflection on été initialisées / reflection are initialised
    End Sub

    Public Sub OpenVideoStream(ByVal CheminFilm As String, ByVal NomFilm As String)

        'Permet d'initialiser la capture video / Allow to initialisz video capture

        Dim g As Graphics = _CtrlToCapture.CreateGraphics()
        Dim newImage As System.Drawing.Image = New Bitmap(_CtrlToCapture.Size.Width, _CtrlToCapture.Size.Height, g)

        g = _CtrlToCapture.CreateGraphics()
        newImage = New Bitmap(_CtrlToCapture.Size.Width, _CtrlToCapture.Size.Height, g)

        _RecordDate = Date.Now.ToString
        _RecordDate = RecordDate.Replace("/", "-")
        _RecordDate = RecordDate.Replace(":", "-")

        FilmManager = New AviFile.AviManager(CheminFilm + "\" + NomFilm + "_" + _RecordDate + ".avi", False)
        bRecordVideo = True
        FilmStream = FilmManager.AddVideoStream(True, _NbCapturedFrameBySecond, newImage, _ChoixDuCodec)

    End Sub

    Public Sub CloseVideoStream()

        'Arrête la capture vidéo / stop video capture
        bRecordVideo = False
        FilmManager.Close()


    End Sub

#End Region

#Region "Privées"

    Private Sub InitNewton(ByVal Langue)

        Dim CamNode As ArrayList = New ArrayList 'Le node de la caméra / camera node
        Dim CamViewNode As ArrayList = New ArrayList
        Dim CamBody As ArrayList = New ArrayList 'Le corps physique de la caméra / physical cam body
        Dim CamColl As CollisionPrimitives.Ellipsoid 'Le type de collision / collision type


        If Langue = "FR" Then
            myfrminfo.lblInfo.Text = "Initialisation du moteur physique....Merci de patienter."
        ElseIf Langue = "DE" Then
            myfrminfo.lblInfo.Text = "Initialisierung der körperlichen Maschine.... Bitte sich gedulden."
        ElseIf Langue = "ES" Then
            myfrminfo.lblInfo.Text = "Inicialización del motor físico.... Gracias por tener paciencia."
        ElseIf Langue = "IT" Then
            myfrminfo.lblInfo.Text = "Inizio del motore fisico....Grazie essere paziente.."
        ElseIf Langue = "PO" Then
            myfrminfo.lblInfo.Text = "Iniciação do motor físico....Lhe agradeça ser paciente."
        Else
            myfrminfo.lblInfo.Text = "Initialization of the physics engine.....Please wait"
        End If
        myfrminfo.Refresh()

        'Initialisation de Newton pour la gestion des collision caméras
        'Newton init to handle cam colision
        If _myWorld Is Nothing Then
            _myWorld = New World 'le monde physique / physical world
            'et initialisation de sa taille, par défaut elle est de 100 sur chaque axes. 
            'and init of it's size by default it's 100 on each axes
            'myWorld.SetWorldSize(_NewtonWorldSizeMin, _NewtonWorldSizeMax)
            _myWorld.SetWorldSize(New Mogre.Vector3(-100000, -100000, -100000), New Mogre.Vector3(100000, 100000, 100000))
        End If

        _myWorld.SetMinimumFrameRate(_NewtonUpdateFps)
        TimeUpdate = 1 / _NewtonUpdateFps

        'Création du monde physique pour Newton / creating newton physical world

        Dim stat_col As MogreNewt.CollisionPrimitives.TreeCollisionSceneParser = New MogreNewt.CollisionPrimitives.TreeCollisionSceneParser(_myWorld)
        stat_col.ParseScene(_OgreSceneManager.RootSceneNode, False) 'Utilisation du parser de scène Newton, attention, à ce jour (juillet 2008), le parmètre true, au mieux, ne fonctionne pas et au pire plante le programme.
        'use of newton scene parser. Beware if true is use, physical world is not well initialised

        'Création et paramétrage du body pour le monde / creation and initialisation of body world
        Dim bod As MogreNewt.Body = New MogreNewt.Body(_myWorld, stat_col)
        stat_col.Dispose()
        bod.AttachToNode(_OgreSceneManager.RootSceneNode)
        bod.SetPositionOrientation(New Mogre.Vector3(0.0, 0.0, 0.0), Quaternion.IDENTITY)

        For i As Integer = 0 To Scene.CameraList.Count - 1
            _OgreCamera = Scene.CameraList(i)

            'Collision de la caméra / camera collision
            Dim PosCam As Mogre.Vector3 = _OgreSceneManager.GetSceneNode(_OgreCamera.Name).Position 'on récupère la position de la caméra / cam position
            Dim OrientCam As Quaternion = _OgreSceneManager.GetSceneNode(_OgreCamera.Name).Orientation 'on récupère l'orientation de la caméra / cam orientation
            Dim localcambody As MogreNewt.Body

            CamNode.Add(Nothing)
            CamBody.Add(Nothing)
            CamViewNode.Add(Nothing)


            CamNode(i) = _OgreSceneManager.RootSceneNode.CreateChildSceneNode("N" + _OgreCamera.Name) 'on crè un Scennode / scenenode creation
            CamNode(i).SetScale(_CamSize) 'on le met à la taille de la caméra / applying cam size
            CamColl = New CollisionPrimitives.Ellipsoid(_myWorld, _CamSize) 'on crè le système de collision / collision system creation
            localcambody = New Body(_myWorld, CamColl) 'on l'applique au body représentant la caméra / applying it to cam body
            CamColl.Dispose() 'on libère la collision / freeing collision
            localcambody.AttachToNode(CamNode(i)) 'et on l'attache au noeud créé précédement / attach it to node

            'calcul de l'inertie de la caméra / inertia camera
            Dim cam_inertia As Mogre.Vector3 = MomentOfInertia.CalcEllipsoidSolid(_CammMass, _CamSize)
            localcambody.SetMassMatrix(_CammMass, cam_inertia)
            AddHandler localcambody.ForceCallback, AddressOf camera_force_callback 'la fonction appelée lors de l'update du monde physique / function call at each physical update
            localcambody.AutoFreeze = False 'Important, sinon, impossible de déplacer le body... / important else body don't move
            CamBody(i) = localcambody
            'Création d'un "UP Vector" pour empécher le body de tomber / creation of a "UP Vector" so body can't fall
            Dim uv2 As BasicJoints.UpVector = New BasicJoints.UpVector(_myWorld, CamBody(i), Mogre.Vector3.UNIT_Y)

            'Création d'un scenenode 1 unités au dessus du camnode pour y mettre la caméra
            'Creation of a scene node 1 units above camnode to put camera in

            CamViewNode(i) = CamNode(i).CreateChildSceneNode("Newt" + _OgreCamera.Name, New Mogre.Vector3(0, 1, 0)) 'création du scenenode / scene node creation
            _OgreSceneManager.RootSceneNode.DetachObject(_OgreCamera) 'on détache la caméra du rootscenenode (créé par OSMLoader) / detaching camera from root scene node (create by OSM Loader)
            CamViewNode(i).AttachObject(_OgreCamera) 'et on attache la caméra au viewnode / attachin cam to viewnode

            CamBody(i).SetPositionOrientation(PosCam, OrientCam) 'Sert à récupérer la position et orientation initiale de la caméra pour positionner son corp. / Puting body in initial cam position and orientation
            InitialCamBodyOrient = get_body_orientation(CamBody(i))
            InitialCamBodyPos = get_body_position(CamBody(i))

            Dim StructCam As New Camera

            StructCam.Camera = _OgreCamera
            StructCam.CamNode = CamNode(i)
            StructCam.CamViewNode = CamViewNode(i)
            StructCam.CamBody = CamBody(i)

            ListeCamera.Add(StructCam)

        Next
        _CurrentCamBody = CamBody(0)
        CurrentCamNode = CamNode(0)
        CurrentCamViewNode = CamViewNode(0)
        _OgreCamera = Scene.CameraList(0)

        If _DebugNewton Then
            MogreNewt.Debugger.Instance.Init(_OgreSceneManager) 'et on initialise le debugger newton. / newton debugger initialisation
        End If

    End Sub

    Private Sub preRenderTargetUpdate()
        'Procedure exécutée avant le render de la texture de réflection
        'On cache le plan de réflextion et on active la reflection de la caméra
        'Proc executed before reflection render
        'we hide reflection plan, and activate camera reflection
        If ReflectOn Then 'si la reflection est active/ if reflection on 
            mPlaneEnt.Visible = False
            _OgreCamera.EnableReflection(ReflectionPlane)
        End If
    End Sub

    Private Sub postRenderTargetUpdate()
        'Procedure exécutée après le render de la texture de réflection
        'On désactive la reflection de la caméra et on réaffiche le plan de réflection
        'Proc executed after reflection render
        'we show reflection plan, and deactivate camera reflection
        If ReflectOn Then 'si la reflection est active / if reflection on 
            _OgreCamera.DisableReflection()
            mPlaneEnt.Visible = True
        End If
    End Sub

    Private Sub InitInputHandler()

        Dim param As MOIS.ParamList = New MOIS.ParamList()

        'Les 4 premiers paramètres servent à signaler que MOIS ne sera pas le seul à être capable de gérer le clavier et la souris
        'ceci permet de disposer du curseur de la souris pour faire autre chose pendant que Ogre rend ses frames
        'The first four parameters are to say to MOIs than it's not the only one than can handle keyboard and mouse
        'this permit to do other things with mouse and keyboard whne ogre is rendereing
        param.Insert("w32_mouse", "DISCL_NONEXCLUSIVE")
        param.Insert("w32_mouse", "DISCL_FOREGROUND")
        param.Insert("w32_keyboard", "DISCL_NONEXCLUSIVE")
        param.Insert("w32_keyboard", "DISCL_FOREGROUND")
        param.Insert("WINDOW", _TopWindowHandle.ToString) 'ici, on passe le handle de notre "top level window" (cf. DirectX et DirectInput) / handle of "top level window" (see DirectX and DirectInput)

        'Hook de l'input manager à la fenêtre / hook of window input manager
        inputManager = MOIS.InputManager.CreateInputSystem(param)
        If Not inputManager Is Nothing Then

            'Creation des device de capture MOIS / creating device capture
            Try
                'Le clavier / keyboard
                inputKeyboard = CType(inputManager.CreateInputObject(MOIS.Type.OISKeyboard, False), MOIS.Keyboard)
            Catch ex As System.Runtime.InteropServices.SEHException
                'en cas d'erreur.... / if error
                If OISException.IsThrown Then
                    MsgBox(OISException.LastException.eText, MsgBoxStyle.Critical, _
                         "Exeption OIS!")
                Else
                    MsgBox(ex.ToString, "Erreur")
                End If
            End Try
            Try
                'La souris / mouse
                inputMouse = CType(inputManager.CreateInputObject(MOIS.Type.OISMouse, False), MOIS.Mouse)
            Catch ex As System.Runtime.InteropServices.SEHException
                'en cas d'erreur.... / if error
                If OISException.IsThrown Then
                    MsgBox(OISException.LastException.eText, MsgBoxStyle.Critical, _
                         "Exeption OIS!")
                Else
                    MsgBox(ex.ToString, "Erreur")
                End If
            End Try
            'A répéter pour d'autre input, joystick par exemple :
            'to repeat for another input, joystick for example : 
            '' ''Try
            '' ''    inputJoy = CType(inputManager.CreateInputObject(MOIS.Type.OISJoyStick, False), MOIS.JoyStick)
            '' ''Catch ex As System.Runtime.InteropServices.SEHException
            '' ''    'en cas d'erreur....
            '' ''    If OISException.IsThrown Then
            '' ''        MsgBox(OISException.LastException.eText, MsgBoxStyle.Critical, _
            '' ''             "Exeption OIS!")
            '' ''    Else
            '' ''        MsgBox(ex.ToString, "Erreur")
            '' ''    End If
            '' ''End Try
        End If

        ' Et l'évènement qui sera attaché au FrameStarted / and event to attach to framestarded
        AddHandler _OgreRacine.FrameStarted, AddressOf FrameStarted

        AddHandler _OgreRacine.FrameEnded, AddressOf FrameEnded

    End Sub

    Private Function FrameStarted(ByVal evt As FrameEvent) As Boolean

        'Gère les évènements clavier et souris
        'handle mouse and keyboard events

        'le test pour annuler le mouvement de la caméra est mis en externe par rapport
        'au test de detection de collision car si on relache la souris avant les touches
        'la caméra continue à se déplacer, donc, on annule sa vélocité et sa rotation à la fin de la fonction

        'test to cancel cam movement is externalise because if we release mouse buton befor keyboard
        'cam continue to move, so, we cancel is velocity and rotation at end of function

        'Le code du système pour réduire le nombre de FPS est du à Beauty sur le forum MOGRE, merci beaucoup
        'FPS reduction system is due to Beauty on MOGRE forum. Thanks a lot.
        If FPS = 0 Then
            '-- initialize at first run --
            'FPSMax = 85  ' set wanted fps 'C'est un paramètre passé à la classe / it's a parameters pass to the class
            FrameTime = 1000 / _OgreMaxFPS  ' wanted time for one frame
            'LastFrameTime = New TimeSpan(DateTime.Now.Ticks)
            LastFrameTime = OgreTimer.MillisecondsCPU

        End If

        'TimeSinceLastFrames = New TimeSpan(DateTime.Now.Ticks - LastFrameTime.Ticks)
        'LastFrameTime = New TimeSpan(DateTime.Now.Ticks)
        TimeSinceLastFrames = OgreTimer.MillisecondsCPU - LastFrameTime
        LastFrameTime = OgreTimer.MillisecondsCPU
        If TimeSinceLastFrames < FrameTime Then
            'wait if needed
            Try
                If FrameTime - TimeSinceLastFrame > 0 Then
                    System.Threading.Thread.Sleep(FrameTime - TimeSinceLastFrame)
                End If
            Catch ex As Exception
            End Try

        End If

        Dim PasdeMouvement As Boolean = True

        CaptureFunction() 'on lance la capture clavier/souris par MOIS / go capture

        If inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_SYSRQ) Then 'Capture de l'écran / to capture screen
            Dim temp As String() = System.IO.Directory.GetFiles(Environment.CurrentDirectory, "screenshot*.jpg")
            Dim fileName As String = _StartupPath + "\" + String.Format("screenshot{0}.jpg", temp.Length + 1)
            OgreRenderWindow.WriteContentsToFile(fileName)
        ElseIf inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_ESCAPE) Then 'On stop le rendu / stop render
            _RenderOn = False
        End If


        TimeSinceLastFrame = evt.timeSinceLastFrame

        If _moving Then 'Si on a cliqué sur le bouton gauche de la souris, on se déplace dans le monde / if mouse button lef clicked, we move

            'Il y a 2 systèmes de mouvement, avec ou sans détection de collisions / there is 2 movement systeme one with newton, and the other not
            If _CollisionDetection Then
                'Avec / with

                'Le principe est de récupérer l'orientation du corps de la caméra sur l'axe de déplacement choisi
                'et de lui affecter une vitesse de déplacement sur cette axe.
                'Lorsque l'on arrête le déplacement, on annule la vitesse.

                'we get cam body orientation then applying it a velocity on move axe. When we stop, we cancel velocity

                Dim direction As Mogre.Vector3

                If inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_UP) Then
                    direction = get_body_orientation(_CurrentCamBody) * Mogre.Vector3.NEGATIVE_UNIT_Z
                    _CurrentCamBody.Velocity = _CurrentCamBody.Velocity * New Mogre.Vector3(0, 1, 0) + direction * _MoveFactor
                    PasdeMouvement = False
                End If

                If inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_DOWN) Then
                    direction = get_body_orientation(_CurrentCamBody) * Mogre.Vector3.UNIT_Z
                    _CurrentCamBody.Velocity = _CurrentCamBody.Velocity * New Mogre.Vector3(0, 1, 0) + direction * _MoveFactor
                    PasdeMouvement = False
                End If

                If inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_LEFT) Then
                    direction = get_body_orientation(_CurrentCamBody) * Mogre.Vector3.NEGATIVE_UNIT_X
                    _CurrentCamBody.Velocity = _CurrentCamBody.Velocity * New Mogre.Vector3(0, 1, 0) + direction * _MoveFactor
                    PasdeMouvement = False
                End If

                If inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_RIGHT) Then
                    direction = get_body_orientation(_CurrentCamBody) * Mogre.Vector3.UNIT_X
                    _CurrentCamBody.Velocity = _CurrentCamBody.Velocity * New Mogre.Vector3(0, 1, 0) + direction * _MoveFactor
                    PasdeMouvement = False
                End If

                'Pour le déplacement sur Y (vertical) on se déplace sur le Y du monde et pas de la caméra
                'Donc, pas besoin de récupérer la direction de la caméra
                'For moving on Y (vertical) we move on worl Y and not cam Y so, no needs to get cam orientation
                If inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_PGUP) Then
                    _CurrentCamBody.Velocity = New Mogre.Vector3(0, 1, 0) * _MoveFactor * 2
                    PasdeMouvement = False
                End If

                If inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_PGDOWN) Then
                    _CurrentCamBody.Velocity = New Mogre.Vector3(0, -1, 0) * _MoveFactor
                    PasdeMouvement = False
                End If

                'Pour la rotation de la caméra, on récupère le déplacement de la souris sur X et Y
                'Fot cam rotation, we get x y mouse movement
                Dim mouseState As MOIS.MouseState_NativePtr = inputMouse.MouseState

                camera_rotation_x = -mouseState.X.rel * _Rotate
                If camera_rotation_x <> 0 Then
                    PasdeMouvement = False
                End If
                camera_rotation_y = -mouseState.Y.rel * 0.5F

                'On travaille sur le camviewnode pour que l'axe de la caméra soit orienté correctement
                'working on cam view node for cam axes well oriented
                CurrentCamViewNode.Pitch(camera_rotation_y)

                'Si on atteint un angle de rotation maximale vers le haut ou le bas, on annule la rotation
                'if we reach max vertical movement, we cancel it
                y_rotation_cont += camera_rotation_y
                If y_rotation_cont > y_limit_a Or y_rotation_cont < y_limit_b Then
                    CurrentCamViewNode.Pitch(-camera_rotation_y)
                    y_rotation_cont -= camera_rotation_y
                End If

            Else
                'Sans / without

                'On applique simplement une translation ou une rotation à la caméra
                'It's a simpl translation or rotation on camera

                Dim myTranslation As Mogre.Vector3 = Mogre.Vector3.ZERO 'Pour le déplacement de la caméra sur ces axes sans détection de collision / for mowing camera without collision detection

                myTranslation.z = 0
                myTranslation.x = 0
                myTranslation.y = 0

                If inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_UP) Then
                    myTranslation.z += -_Translate
                End If

                If inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_DOWN) Then
                    myTranslation.z += _Translate
                End If

                If inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_LEFT) Then
                    myTranslation.x += -_Translate
                End If

                If inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_RIGHT) Then
                    myTranslation.x += _Translate
                End If

                If inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_PGUP) Then
                    myTranslation.y += _Translate
                End If

                If inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_PGDOWN) Then
                    myTranslation.y += -_Translate
                End If

                Dim mouseState As MOIS.MouseState_NativePtr = inputMouse.MouseState

                camera_rotation_x = mouseState.X.rel * -_Rotate
                camera_rotation_y = mouseState.Y.rel * -_Rotate


                'Et on déplace la caméra / and move camera
                _OgreCamera.Position += _OgreCamera.Orientation * myTranslation * evt.timeSinceLastFrame
                _OgreCamera.Yaw(camera_rotation_x * evt.timeSinceLastFrame)
                _OgreCamera.Pitch(camera_rotation_y) 'si on multiplie par timesincelastframe, le résultat est plus qu'étrange...A voir. / if multiplying by timesincelastframe, stange result appear...Must see that

            End If

        End If
        'C'est ici que l'on annule la vélocité et la rotation de la caméra. / it's here tha we cancel velocity and camera rotation
        If PasdeMouvement And _CollisionDetection Then
            _CurrentCamBody.Velocity = New Mogre.Vector3(0, 0, 0)
            camera_rotation_x = 0
        End If

        Return _RenderOn 'tant que l'on ne quitte pas l'appli, on renvoi True. / if not quiting, return true

    End Function

    Private Function FrameEnded(ByVal evt As FrameEvent) As Boolean
        'Fonction exécuté àaprès le dessin d'une frame. Ici, sert à la capture vidéo
        'Function executed after a frame is drawn. Here, it's used to cature a video

        If bRecordVideo Then

            Dim g As Graphics = _CtrlToCapture.CreateGraphics()
            Dim MyImage As System.Drawing.Image = New Bitmap(_CtrlToCapture.Size.Width, _CtrlToCapture.Size.Height, g)
            Dim memoryGraphics As Graphics = Graphics.FromImage(MyImage)
            'get handle
            Dim src As IntPtr = g.GetHdc()
            Dim dest As IntPtr = memoryGraphics.GetHdc()

            ' more information here:
            ' http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceui40/html/_celrfternaryrasteroperations.asp
            BitBlt(dest, 0, 0, _CtrlToCapture.Size.Width, _CtrlToCapture.Size.Height, src, 0, 0, 13369376)

            ' release handles

            g.ReleaseHdc(dest)
            g.Dispose()

            memoryGraphics.ReleaseHdc(src)
            memoryGraphics.Dispose()

            FilmStream.AddFrame(MyImage)

        End If

        Return True
    End Function

    Private Sub CaptureFunction()
        'Lance la capture du clavier et de la souris / lauch keyboard and mouse capture
        inputKeyboard.Capture()
        inputMouse.Capture()
    End Sub

    Private Function get_body_position(ByVal bod As Body) As Mogre.Vector3 'retourne la position du body  / return body position
        Dim orient As Quaternion
        Dim pos As Mogre.Vector3

        bod.GetPositionOrientation(pos, orient)

        Return pos

    End Function

    Private Function get_body_orientation(ByVal bod As Body) As Quaternion  ' retourne l'orientation du body / return body orientation
        Dim orient As Quaternion
        Dim pos As Mogre.Vector3

        bod.GetPositionOrientation(pos, orient)

        Return orient

    End Function

    Private Sub camera_force_callback(ByVal Corps As Body)

        'Cette procédure est appelée à chaque update du monde physique.
        'On y applique la gravité ainsi que la rotation sur l'axe des X

        'this proc is called by each physical worl update
        'we put gravity force and X rotation

        If _GravityOnOff Then
            Dim masse As Single
            Dim inertie As Mogre.Vector3
            Dim Force As Mogre.Vector3 = New Mogre.Vector3(0, _Gravity * 10, 0)

            'on récupère la position et l'orientation du corp passé en paramètre / gettinf position and orientation of param body
            Dim posBody As Mogre.Vector3 = get_body_position(_CurrentCamBody) * Mogre.Vector3.NEGATIVE_UNIT_Z
            Dim OrientBody As Quaternion = get_body_orientation(_CurrentCamBody)

            Corps.GetMassMatrix(masse, inertie) 'on récupère sa masse et son inertie / getting it's mass and inertia

            'on y applique la gravité / applying gravity
            Force *= masse
            Corps.AddForce(Force) 'on applique la force de gravité / applying forces

        End If
        Corps.Omega = New Mogre.Vector3(0, camera_rotation_x, 0) 'pour la rotation sur X / rotation on X

    End Sub

    Private Sub LoadAxe()
        'Permet de charger l'objet Axe et de l'ajouter à la scene
        'allow to load axe object and adding to scene

        Dim Axe01 As Entity 'Sera l'axe afficher sur les objets / object axe
        Dim AxeMonde As Entity 'Comme son nom l'indique / world axe


        Try

            Axe01 = _OgreSceneManager.CreateEntity("Axe01", "Axe.mesh") 'on charge l'objet / loading object
            AxeMonde = Axe01.Clone("AxeMonde") 'on le clone pour avoir deux axes séparés / cloning it to have 2 of it

            'On crè le node qui contiendra l'axe du monde / world axe node
            NodeAxeMonde = _OgreSceneManager.RootSceneNode.CreateChild("AxeMonde")
            NodeAxeMonde.AttachObject(AxeMonde)
            NodeAxeMonde.SetPosition(0, 0, 0)
            NodeAxeMonde.SetScale(1, 1, 1)
            NodeAxeMonde.SetVisible(False)
            NodeAxeMonde.ResetToInitialState()

            'on fait pareil pour l'axe des objets / world axe object
            NodeAxe = _OgreSceneManager.RootSceneNode.CreateChild("Axe01")
            NodeAxe.AttachObject(Axe01)
            NodeAxe.SetPosition(0, 0, 0)
            NodeAxe.SetScale(1, 1, 1)
            NodeAxe.InheritOrientation = False 'si on ne fait pas ça, l'axe se comporte étrangement lorsque l'objet tourne / to handle correct rotation axe
            NodeAxe.InheritScale = False 'Pareil, le scale de l'objet s'ajoute au scale de l'axe / same for scale
            NodeAxe.SetVisible(False)

        Catch ex As System.Runtime.InteropServices.SEHException
            'en cas d'erreur.... / if error
            If OgreException.IsThrown Then
                MsgBox(OgreException.LastException.FullDescription, MsgBoxStyle.Critical, _
                     "Exeption OGRE!")
            Else
                MsgBox(ex.ToString, "Erreur")
            End If

        End Try
    End Sub

    Private Sub UpdateNewton(ByVal TimeSinceLastFrame As Single)

        'La fonction d'update du monde physique / function to update physical world

        If _TimeFactor <> 0 Then
            TimeElapsed = 3.5 * TimeSinceLastFrame * _TimeFactor
        End If

        'If TimeElapsed > TimeUpdate Then 'si le temps passé depuis le dernier update est plus grand que le temp minimum choisi, on se rattrape / if time passed since last update greater than minimum time, running after time
        '    While TimeElapsed > TimeUpdate
        '        myWorld.Update(TimeUpdate)
        '        TimeElapsed -= TimeUpdate
        '    End While
        'Else 'sinons / else...
        If TimeElapsed < TimeUpdate Then
            'Le temps passé est plus petit que le temps minimum, on ne fait rien / time elapsed smaller than minimum time
        Else
            _myWorld.Update(TimeUpdate) 'sinon, on update / else updating
        End If
        'End If
    End Sub

#End Region

#End Region

End Class


By the way, you need to define object in the form. The most important is the panel to render to, here panRender.

You will need this too, it's the ofusion loader library. I found it somewhere in the wiki. It's not of my own programation, I change only the log system, because it cause crash if I use the class more than one time in soft.

Note: The code is from the wiki page MOGRE OSMSceneLoader 2

/**********************************************************************
 *<
	oFusion Scene Loader CE (see License.txt)

	FILE: OgreOSMScene.cpp

	DESCRIPTION: Contains the OE_XMLScene reader (oe_scene)	

	IMPLEMENTED BY: Andres Carrera

	HISTORY: 

		Original implementation by Lasse Tassing (Channex)
		2005 ITE ApS, Lasse Tassing

 *>	Copyright (c) 2006, All Rights Reserved.
 **********************************************************************/

/* Mogre port notes (28/Jan/2007) by smernesto (Ernesto Gutierrez):
 * Tested with Mogre 0.1.9 + OGRE 1.2.5
 * Changed initilise -> Initialize
 * Changed Ogre Exceptions with .Net Exceptions
 * I ported the code very similar to the C++ code.
 * I used the same event convention as in the old mogre osm loader.
 * I used List<> for the created objects because the C++ code also use lists.
 * Only one line not ported. mSceneMgr.SetOption("PrimaryCamera", primaryCamera.NativePtr); //unsafe
 * The commented code was commented also in the C++ code and is code not used in the oFusion CE version.
 * Added StandardisePath() because Mogre doesn´t have a wrapper to the Ogre::StringUtil class.
 * */

using System;
using System.Collections.Generic;
using System.Xml;
using System.Globalization;
using Mogre;

namespace OFusion
{
    public class OSMScene
    {
        //For culture independent code
        private NumberFormatInfo numberFormat = new NumberFormatInfo();

        private const int SceneSkyPlane = 1;
        private const int SceneSkyBox = 2;
        private const int SceneSkyDome = 3;

        // Created objects
        private List<Camera> mCameras = new List<Camera>();
        private List<Light> mLights = new List<Light>();
        private List<Entity> mEntities = new List<Entity>();

        // Callback interface (Changed to Events)        
        public delegate void LoadedSceneObjectEventHandler(Object objectCreated, XmlElement xmlElement);
        public event LoadedSceneObjectEventHandler OnCameraCreate;
        public event LoadedSceneObjectEventHandler OnNodeCreate;
        public event LoadedSceneObjectEventHandler OnLightCreate;
        public event LoadedSceneObjectEventHandler OnEntityCreate;
        //virtual void OnHelperCreated(Ogre::SceneNode* pHelper, XmlElement pHelperDesc) {};
        //virtual void OnShapeLoaded(const Ogre::SimpleSpline& spline) 
        //virtual bool OnStaticGeometryCreated(Ogre::StaticGeometry* pStatic, const NodeList& nodeList) 

        // Scene manager
        private SceneManager mSceneMgr;
        private RenderWindow mWindow;

        // Scene XML document
        private XmlDocument mXMLDoc;

        public OSMScene(SceneManager pSceneMgr, RenderWindow win)
        {
            numberFormat.CurrencyDecimalSeparator = ".";
            mSceneMgr = pSceneMgr;

            if (win != null)
                mWindow = win;
            else
                mWindow = Mogre.Root.Singleton.AutoCreatedWindow;
        }

        // Init overloads - use either of them        
        public bool Initialize(string pszXMLFile)
        {
            //LogManager.Singleton.LogMessage("********************************");
            //LogManager.Singleton.LogMessage("**     oScene Loader Lib      **");
            //LogManager.Singleton.LogMessage("********************************");

            string msg = "oSceneLoader: Loading '";
            msg += pszXMLFile;
            msg += "' file";
            //LogManager.Singleton.LogMessage(msg);

            // Create new XML document
            mXMLDoc = new XmlDocument();

            DataStreamPtr pStream = ResourceGroupManager.Singleton.OpenResource(pszXMLFile);

            if (!(pStream.Size() > 0))
            {
                throw new System.IO.InvalidDataException("oSceneLoader: Empty scene file");
            }

            string pBuf = pStream.AsString;
            pStream = null;

            try
            {
                mXMLDoc.LoadXml(pBuf);
            }
            catch (XmlException ex)
            {
                mXMLDoc = null;
                throw ex;
            }


            XmlElement locations = (XmlElement)mXMLDoc.DocumentElement.SelectSingleNode("locations");

            if (locations != null)
            {

                FileInfoListPtr fileInfo = ResourceGroupManager.Singleton.FindResourceFileInfo(ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME, pszXMLFile);

                string strPath = fileInfo[0].archive.Name;

                strPath = StandardisePath(strPath); //In C++ StringUtil::standardisePath

                foreach (XmlElement pLocationElem in locations.ChildNodes)
                {
                    // Ogre could cast an exception, in which case we just try to 
                    // continue reading the other location paths
                    try
                    {
                        string pszName = pLocationElem.GetAttribute("path");
                        string strDir = strPath + pszName;

                        ResourceGroupManager.Singleton.AddResourceLocation(strDir, "FileSystem");


                    }
                    catch
                    {
                    }
                }
            }



            return true;
        }

        // Declare all resources used in the scene
        public void DeclareResources()
        {
            if (mXMLDoc != null)
            {

                XmlElement rootElem = mXMLDoc.DocumentElement;

                try
                {
                    // Get mesh filename from entities
                    XmlElement pMeshNode = (XmlElement)rootElem.SelectSingleNode("entities");
                    if (pMeshNode != null)
                    {
                        // Iterate all meshes, creating them. 
                        foreach (XmlElement pMeshElem in pMeshNode.ChildNodes)
                        {
                            //Verify the Element is an entity element.
                            if (pMeshElem.Name != "entity")
                                continue;

                            // Declare mesh resource
                            string pszFileName = pMeshElem.GetAttribute("filename");
                            ResourceGroupManager.Singleton.DeclareResource(pszFileName, "Mesh");
                        }
                    }
                }
                catch
                {
                }

            }
        }

        // Create scene, optionally attaching it to a parent node
        public bool CreateScene(SceneNode pParent)
        {
            if (mXMLDoc != null)
            {
                string msg = "oSceneLoader: Creating scene on '";
                msg += pParent != null ? pParent.Name : "Root";
                msg += "' node";
                //LogManager.Singleton.LogMessage(msg);

                bool bHandled = false;

                XmlElement rootElem = mXMLDoc.DocumentElement;

                if (mSceneMgr == null)
                {
                    if (rootElem.SelectSingleNode("sceneManager") != null)
                        pParent = CreateSceneManager(rootElem, ref bHandled);
                    else
                        mSceneMgr = Root.Singleton.CreateSceneManager(SceneType.ST_GENERIC);
                }

                if (pParent == null)
                    pParent = mSceneMgr.RootSceneNode.CreateChildSceneNode();

                System.Diagnostics.Debug.Assert(pParent != null);

                XmlElement list;

                try
                {
                    // Entities
                    list = (XmlElement)rootElem.SelectSingleNode("entities");
                    if (list != null)
                        CreateEntities(list, pParent);
                }
                catch (Exception ex)
                {
                    //LogManager.Singleton.LogMessage("Error while loading entities");

                    throw new Exception("oSceneLoader: Error while loading entities. " + ex.Message);
                }

                try
                {
                    // lights
                    list = (XmlElement)rootElem.SelectSingleNode("lights");
                    if (list != null)
                        CreateLights(list, pParent);
                }
                catch (Exception ex)
                {
                    //LogManager.Singleton.LogMessage("Error while loading lights");

                    throw new Exception("oSceneLoader: Error while loading lights. " + ex.Message);

                }

                if (!bHandled)
                {
                    try
                    {
                        // cameras
                        list = (XmlElement)rootElem.SelectSingleNode("cameras");
                        if (list != null)
                            CreateCameras(list, pParent);
                    }
                    catch (Exception ex)
                    {
                        //LogManager.Singleton.LogMessage("Error while loading cameras");

                        throw new Exception("oSceneLoader: Error while loading cameras. " + ex.Message);
                    }
                }

                /*
                try {
                    // helpers
                    list = rootElem.SelectSingleNode("helpers");
                    if(list)
                        createHelpers(list, pParent);
                } catch(...)
                {
                    LogManager.Singleton.LogMessage("Error while loading helpers");

                    OGRE_EXCEPT(Exception::ERR_RT_ASSERTION_FAILED,
                        "oSceneLoader: Error while loading helpers",
                        "OSMScene::createScene");
                }

                try {
                    // shapes
                    list = rootElem.SelectSingleNode("shapes");
                    if(list)
                        createShapes(list);
                } catch(...)
                {
                    LogManager.Singleton.LogMessage("Error while loading shapes");

                    OGRE_EXCEPT(Exception::ERR_RT_ASSERTION_FAILED,
                        "oSceneLoader: Error while loading shapes",
                        "OSMScene::createScene");
                }		

                try {
                    // External skeletal animation files
                    list = rootElem.SelectSingleNode("skeletal_animations");
                    if(list)
                    {
                        SkeletonHandles skelHandles;
                        loadAnimations(list, skelHandles);				
                    }
                }catch(...)
                {
                    LogManager.Singleton.LogMessage("Error while loading external animations");

                    OGRE_EXCEPT(Exception::ERR_RT_ASSERTION_FAILED,
                        "oSceneLoader: Error while loading external animations",
                        "OSMScene::createScene");
                }
                */

                // Set scene properties
                SetSceneProperties(rootElem);

                // Static Geometry
                list = (XmlElement)rootElem.SelectSingleNode("staticGeometry");
                if (list != null)
                    CreateStaticGeometry(list);

                //LogManager.Singleton.LogMessage("********************************");
                //LogManager.Singleton.LogMessage("** oSceneLoader: Scene loaded **");
                //LogManager.Singleton.LogMessage("********************************");

                return true;
            }

            return false;


        }

        // Get list of cameras in this scene
        public List<Camera> CameraList
        {
            get { return mCameras; }
        }

        // Get list of lights in this scene
        public List<Light> LightList
        {
            get { return mLights; }
        }

        // Get list of entities in this scene
        public List<Entity> EntityList
        {
            get { return mEntities; }
        }

        public SceneManager SceneMgr
        {
            get { return mSceneMgr; }
        }

        private SceneNode CreateNode(XmlElement pElem, SceneNode pSceneRoot)
        {
            SceneNode pNode = null;

            // Try to find the parent node
            string pszName = pElem.GetAttribute("name");
            if (pszName == string.Empty) return null;

            // Check if this node has a parent
            string pszParent = pElem.GetAttribute("parent");
            if (pszParent == string.Empty)
            {
                // Check if the scene node has already been created by a child
                //DisableLogManager();

                try
                {
                    pNode = mSceneMgr.GetSceneNode(pszName);
                }
                catch
                {
                    pNode = pSceneRoot.CreateChildSceneNode(pszName);
                }

                //EnableLogManager();

            }
            else
            {
                SceneNode pParent = null;
                DisableLogManager();

                try
                {
                    // Try to find parent scenenode
                    pParent = mSceneMgr.GetSceneNode(pszParent);
                }
                catch
                {
                    // We try to create the parent node as child of root node.
                    // Later when the parent (hopefully) is created, we can adjust it,
                    // if it is child of another node.
                    pParent = pSceneRoot.CreateChildSceneNode(pszParent);
                }


                try
                {
                    // Check if the scene node has already been created by a child
                    // In this case we would have to change the parent.
                    pNode = mSceneMgr.GetSceneNode(pszName);

                    // Get old parent (probably scene root)
                    SceneNode pOldParent = pNode.ParentSceneNode;

                    // Remove this node
                    pOldParent.RemoveChild(pNode);

                    // Insert us as child on the "real" parent
                    pParent.AddChild(pNode);
                }
                catch
                {
                    pNode = pParent.CreateChildSceneNode(pszName);
                }

                EnableLogManager();
            }

            // Position
            XmlElement posElem = (XmlElement)pElem.SelectSingleNode("position");
            if (posElem != null)
            {
                Vector3 pos = new Vector3();
                pos.x = float.Parse(posElem.GetAttribute("x"), numberFormat);
                pos.y = float.Parse(posElem.GetAttribute("y"), numberFormat);
                pos.z = float.Parse(posElem.GetAttribute("z"), numberFormat);
                /*pos.x /= 100;
                pos.y /= 100;
                pos.z /= 100;*/
                pNode.Position = pos;
            }

            // Rotation
            XmlElement rotElem = (XmlElement)pElem.SelectSingleNode("rotation");
            if (rotElem != null)
            {
                pNode.SetOrientation(
                    float.Parse(rotElem.GetAttribute("w"), numberFormat),
                    float.Parse(rotElem.GetAttribute("x"), numberFormat),
                    float.Parse(rotElem.GetAttribute("y"), numberFormat),
                    float.Parse(rotElem.GetAttribute("z"), numberFormat));

            }

            // Scale
            XmlElement scaleElem = (XmlElement)pElem.SelectSingleNode("scale");
            if (scaleElem != null)
            {
                Vector3 scale;
                scale.x = float.Parse(scaleElem.GetAttribute("x"), numberFormat);
                scale.y = float.Parse(scaleElem.GetAttribute("y"), numberFormat);
                scale.z = float.Parse(scaleElem.GetAttribute("z"), numberFormat);
                pNode.SetScale(scale);
            }

            // Notify
            if (OnNodeCreate != null)
                OnNodeCreate(pNode, pElem);

            // Animation
            XmlElement animList = (XmlElement)pElem.SelectSingleNode("animations");
            if (animList != null)
            {
                // 
                foreach (XmlElement animElem in animList.ChildNodes)
                {
                    if (animElem.Name != "animation")
                        continue;

                    // Get name of animation
                    string pszName1 = animElem.GetAttribute("name");

                    Animation pAnim = null;
                    DisableLogManager();
                    try
                    {
                        pAnim = mSceneMgr.GetAnimation(pszName1);
                    }
                    catch
                    {
                    }
                    EnableLogManager();

                    // If this animation has not been created yet, we create it
                    if (pAnim == null)
                    {
                        float fLength = float.Parse(animElem.GetAttribute("length"), numberFormat);
                        pAnim = mSceneMgr.CreateAnimation(pszName1, fLength);
                        pAnim.SetInterpolationMode(Animation.InterpolationMode.IM_LINEAR);
                    }

                    // Create animation track for this node
                    NodeAnimationTrack pTrack = pAnim.CreateNodeTrack((ushort)(pAnim.NumNodeTracks + 1), pNode);

                    // Iterate all keyframes for this node
                    foreach (XmlElement pKeyframeElem in animElem.ChildNodes)
                    {
                        if (pKeyframeElem.Name != "keyframe")
                            continue;

                        float fTime = float.Parse(pKeyframeElem.GetAttribute("time"), numberFormat);
                        TransformKeyFrame pKeyFrame = pTrack.CreateNodeKeyFrame(fTime);

                        // Position
                        XmlElement posElem1 = (XmlElement)pKeyframeElem.SelectSingleNode("position");
                        if (posElem1 != null)
                        {
                            Vector3 trans = new Vector3();
                            trans.x = float.Parse(posElem1.GetAttribute("x"), numberFormat);
                            trans.y = float.Parse(posElem1.GetAttribute("y"), numberFormat);
                            trans.z = float.Parse(posElem1.GetAttribute("z"), numberFormat);
                            pKeyFrame.Translate = trans;
                        }

                        // Rotation
                        XmlElement rotElem1 = (XmlElement)pKeyframeElem.SelectSingleNode("rotation");
                        if (rotElem1 != null)
                        {
                            Quaternion qRot = new Quaternion();
                            qRot.x = float.Parse(rotElem1.GetAttribute("x"), numberFormat);
                            qRot.y = float.Parse(rotElem1.GetAttribute("y"), numberFormat);
                            qRot.z = float.Parse(rotElem1.GetAttribute("z"), numberFormat);
                            qRot.w = float.Parse(rotElem1.GetAttribute("w"), numberFormat);
                            pKeyFrame.Rotation = qRot;
                        }

                        // Scale
                        XmlElement scaleElem1 = (XmlElement)pKeyframeElem.SelectSingleNode("scale");
                        if (scaleElem1 != null)
                        {
                            Vector3 scale = new Vector3();
                            scale.x = float.Parse(scaleElem1.GetAttribute("x"), numberFormat);
                            scale.y = float.Parse(scaleElem1.GetAttribute("y"), numberFormat);
                            scale.z = float.Parse(scaleElem1.GetAttribute("z"), numberFormat);
                            pKeyFrame.Scale = scale;
                        }
                    }
                }
            }

            return pNode;
        }

        // Create SceneManager
        private SceneNode CreateSceneManager(XmlElement sceneProp, ref bool bHandled)
        {
            System.Diagnostics.Debug.Assert(sceneProp != null);

            // Scene manager
            XmlElement sceneMgrElem = (XmlElement)sceneProp.SelectSingleNode("sceneManager");
            int type = int.Parse(sceneMgrElem.GetAttribute("type"));

            SceneType sceneType = (SceneType)(1 << (type - 1));
            mSceneMgr = Mogre.Root.Singleton.CreateSceneManager(sceneType);
            System.Diagnostics.Debug.Assert(mSceneMgr != null);

            SceneNode pSceneRoot = mSceneMgr.RootSceneNode.CreateChildSceneNode();
            System.Diagnostics.Debug.Assert(pSceneRoot != null);

            // Scene shadows
            XmlElement shadowsElem = (XmlElement)sceneProp.SelectSingleNode("shadowTechnique");
            if (shadowsElem != null)
            {
                int type1 = int.Parse(shadowsElem.GetAttribute("type"));
                ShadowTechnique shadowType = (ShadowTechnique)type1;

                mSceneMgr.ShadowTechnique = shadowType;

                ushort tex_size = ushort.Parse(shadowsElem.GetAttribute("tex_size"));
                ushort tex_count = ushort.Parse(shadowsElem.GetAttribute("tex_count"));

                mSceneMgr.SetShadowTextureSettings(tex_size, tex_count);

                // Shadow Color
                XmlElement colorElem = (XmlElement)shadowsElem.SelectSingleNode("color");
                if (colorElem != null)
                {
                    ColourValue color = new ColourValue();
                    color.r = float.Parse(colorElem.GetAttribute("r"), numberFormat);
                    color.g = float.Parse(colorElem.GetAttribute("g"), numberFormat);
                    color.b = float.Parse(colorElem.GetAttribute("b"), numberFormat);

                    mSceneMgr.ShadowColour = color;
                }
            }

            // Scene fog
            XmlElement fogElem = (XmlElement)sceneProp.SelectSingleNode("fogMode");
            if (fogElem != null)
            {
                int type2 = int.Parse(fogElem.GetAttribute("type"));
                FogMode mode = (FogMode)type2;

                float density = float.Parse(fogElem.GetAttribute("density"), numberFormat);
                float linearStart = float.Parse(fogElem.GetAttribute("linearStart"), numberFormat);
                float linearEnd = float.Parse(fogElem.GetAttribute("linearEnd"), numberFormat);

                ColourValue color = new ColourValue();

                // Fog Color
                XmlElement colorElem = (XmlElement)fogElem.SelectSingleNode("color");
                if (colorElem != null)
                {
                    color.r = float.Parse(colorElem.GetAttribute("r"), numberFormat);
                    color.g = float.Parse(colorElem.GetAttribute("g"), numberFormat);
                    color.b = float.Parse(colorElem.GetAttribute("b"), numberFormat);
                }

                mSceneMgr.SetFog(mode, color, density, linearStart, linearEnd);
            }

            // World Geometry
            string worldGeometry = sceneMgrElem.GetAttribute("worldGeometry");
            if (worldGeometry != string.Empty)
            {
                // Some scene managers need cameras created before the world geometry
                try
                {
                    // cameras
                    XmlElement list = (XmlElement)sceneProp.SelectSingleNode("cameras");
                    if (list != null)
                        CreateCameras(list, pSceneRoot);

                    if (sceneType == SceneType.ST_EXTERIOR_CLOSE)
                    {

                        if (mCameras.Count == 0)
                        {
                            throw new System.InvalidOperationException("oSceneLoader: Scene dont contain cameras, Terrain Scene Manager needs a camera to initialize");
                        }

                        Camera primaryCamera = mCameras[0];

                        mWindow.GetViewport(0).Camera = primaryCamera;


                        //mSceneMgr.SetOption("PrimaryCamera", primaryCamera.NativePtr); //unsafe

                    }

                    // cameras created, the main scene loader method should not re-parse the list
                    bHandled = true;
                }
                catch
                {
                }

                mSceneMgr.SetWorldGeometry(worldGeometry);
            }

            return pSceneRoot;
        }

        // Set Scene Properties
        private void SetSceneProperties(XmlElement sceneProp)
        {
            // Ambient light Color
            XmlElement colorElem = (XmlElement)sceneProp.SelectSingleNode("lightColor");
            if (colorElem != null)
            {
                ColourValue color = new ColourValue();
                color.r = float.Parse(colorElem.GetAttribute("r"), numberFormat);
                color.g = float.Parse(colorElem.GetAttribute("g"), numberFormat);
                color.b = float.Parse(colorElem.GetAttribute("b"), numberFormat);

                mSceneMgr.AmbientLight = color;
            }

            // Background Color
            colorElem = (XmlElement)sceneProp.SelectSingleNode("bkgcolor");
            if (colorElem != null && mWindow != null)
            {
                int numViewports = mWindow.NumViewports;
                if (numViewports > 0)
                {
                    ColourValue color = new ColourValue();
                    color.r = float.Parse(colorElem.GetAttribute("r"), numberFormat);
                    color.g = float.Parse(colorElem.GetAttribute("g"), numberFormat);
                    color.b = float.Parse(colorElem.GetAttribute("b"), numberFormat);

                    for (ushort i = 0; i < numViewports; ++i)
                        mWindow.GetViewport(i).BackgroundColour = color;
                }
            }

            // Scene sky
            XmlElement skyElem = (XmlElement)sceneProp.SelectSingleNode("skyTechnique");
            if (skyElem != null)
            {
                int type = int.Parse(skyElem.GetAttribute("type"));
                string materialName = skyElem.GetAttribute("material");

                if (materialName != " ")
                {
                    string drawFirstAttribute = skyElem.GetAttribute("drawFirst");
                    bool drawFirst = drawFirstAttribute == "yes";
                    float tiling = float.Parse(skyElem.GetAttribute("tiling"), numberFormat);
                    float scale = float.Parse(skyElem.GetAttribute("scale"), numberFormat);
                    float dist = float.Parse(skyElem.GetAttribute("dist"), numberFormat);
                    float bow = float.Parse(skyElem.GetAttribute("bow"), numberFormat);
                    int xSegments = int.Parse(skyElem.GetAttribute("xSegments"));
                    int ySegments = int.Parse(skyElem.GetAttribute("ySegments"));
                    Quaternion quat = Quaternion.IDENTITY;
                    Plane plane = new Plane();
                    plane.d = dist;
                    plane.normal = -(Vector3.UNIT_Y);

                    switch (type)
                    {

                        case SceneSkyPlane:

                            mSceneMgr.SetSkyPlane(true, plane, materialName, scale,
                                                   tiling, drawFirst, bow, xSegments, ySegments);

                            mSceneMgr.SetSkyBox(false, "");
                            mSceneMgr.SetSkyDome(false, "");

                            break;

                        case SceneSkyBox:

                            mSceneMgr.SetSkyBox(true, materialName, dist, drawFirst, quat);
                            mSceneMgr.SetSkyPlane(false, plane, "");
                            mSceneMgr.SetSkyDome(false, "");

                            break;

                        case SceneSkyDome:

                            mSceneMgr.SetSkyDome(true, materialName, bow, tiling, dist,
                                                  drawFirst, quat, xSegments, ySegments);

                            mSceneMgr.SetSkyPlane(false, plane, "");
                            mSceneMgr.SetSkyBox(false, "");

                            break;

                    }
                }
            }
        }

        // Create all entities in scene
        private void CreateEntities(XmlElement pEntityNode, SceneNode pSceneRoot)
        {
            // Iterate all meshes, creating them. 
            foreach (XmlElement pMeshElem in pEntityNode.ChildNodes)
            {
                if (pMeshElem.Name != "entity")
                    continue;

                // Ogre could cast an exception, in which case we just try to 
                // continue reading the other meshes
                try
                {
                    string pszName = pMeshElem.GetAttribute("name");
                    string pszFileName = pMeshElem.GetAttribute("filename");

                    // try to create the mesh
                    Entity pEntity = mSceneMgr.CreateEntity(pszName, pszFileName);
                    if (pEntity == null) continue;

                    // Check if the object should cast shadows
                    string pszCastShadows = pMeshElem.GetAttribute("CastShadows");
                    if (pszCastShadows == "no")
                        pEntity.CastShadows = false;
                    else
                        pEntity.CastShadows = true;

                    // Create node with full information
                    SceneNode pObjNode = CreateNode(pMeshElem, pSceneRoot);

                    // Attach the mesh entity to node
                    pObjNode.AttachObject(pEntity);

                    // Notify
                    if (OnEntityCreate != null)
                        OnEntityCreate(pEntity, pMeshElem);

                    // Add to entity list
                    mEntities.Add(pEntity);
                }
                catch
                {
                    continue;
                }
            }
        }

        // Create all Lights in scene
        private void CreateLights(XmlElement pLightNode, SceneNode pSceneRoot)
        {
            // Iterate all Lights, creating them. We do not attach them yet, since
            // we need to make sure all potential parent entities have been created.
            foreach (XmlElement pLightElem in pLightNode.ChildNodes)
            {
                if (pLightElem.Name != "light")
                    continue;

                // Ogre could cast an exception, in which case we just try to 
                // continue reading the other Lights
                try
                {
                    string pszName = pLightElem.GetAttribute("name");

                    Light pLight = mSceneMgr.CreateLight(pszName);
                    if (pLight == null) continue;

                    // Figure out which type of light we are using
                    string pszType = pLightElem.GetAttribute("type");
                    if (pszType == "omni")
                    {
                        pLight.Type = Light.LightTypes.LT_POINT;
                    }
                    else if (pszType == "spot")
                    {
                        pLight.Type = Light.LightTypes.LT_SPOTLIGHT;
                        pLight.SetSpotlightRange(
                                new Radian(new Degree(float.Parse(pLightElem.GetAttribute("hotspot"), numberFormat))),
                                new Radian(new Degree(float.Parse(pLightElem.GetAttribute("falloff"), numberFormat))));
                        pLight.SetDirection(0f, 0f, -1f);

                    }
                    else if (pszType == "directional")
                    {
                        pLight.Type = Light.LightTypes.LT_DIRECTIONAL;
                    }

                    // Check if the light should be on
                    string pszOn = pLightElem.GetAttribute("on");
                    if (pszOn == "true")
                        pLight.Visible = true;
                    else
                        pLight.Visible = false;

                    // Check if the object should cast shadows
                    string pszCastShadows = pLightElem.GetAttribute("CastShadows");
                    if (pszCastShadows == "no")
                        pLight.CastShadows = false;
                    else
                        pLight.CastShadows = true;

                    // Diffuse Color
                    XmlElement colorElem = (XmlElement)pLightElem.SelectSingleNode("color");
                    if (colorElem != null)
                    {
                        pLight.DiffuseColour = new ColourValue(
                            float.Parse(colorElem.GetAttribute("r"), numberFormat),
                            float.Parse(colorElem.GetAttribute("g"), numberFormat),
                            float.Parse(colorElem.GetAttribute("b"), numberFormat));
                    }

                    // Specular Color
                    XmlElement specularElem = (XmlElement)pLightElem.SelectSingleNode("specular");
                    if (specularElem != null)
                    {
                        pLight.SpecularColour = new ColourValue(
                            float.Parse(specularElem.GetAttribute("r"), numberFormat),
                            float.Parse(specularElem.GetAttribute("g"), numberFormat),
                            float.Parse(specularElem.GetAttribute("b"), numberFormat));
                    }

                    // Attenuation
                    XmlElement attenElem = (XmlElement)pLightElem.SelectSingleNode("attenuation");
                    if (attenElem != null)
                    {
                        pLight.SetAttenuation(
                            float.Parse(attenElem.GetAttribute("range"), numberFormat),
                            float.Parse(attenElem.GetAttribute("constant"), numberFormat),
                            float.Parse(attenElem.GetAttribute("linear"), numberFormat),
                            float.Parse(attenElem.GetAttribute("quadratic"), numberFormat));
                    }

                    // Create node with full information
                    SceneNode pLightNode1 = CreateNode(pLightElem, pSceneRoot);

                    // Attach the Light entity to node
                    pLightNode1.AttachObject(pLight);

                    // Target
                    XmlElement targetElem = (XmlElement)pLightElem.SelectSingleNode("target");
                    if (targetElem != null)
                    {
                        // Create node with full information
                        SceneNode pTargetNode = CreateNode(targetElem, pSceneRoot);
                        pLightNode1.SetAutoTracking(true, pTargetNode);
                    }

                    // Notify
                    if (OnLightCreate != null)
                        OnLightCreate(pLight, pLightElem);

                    // Add to light list
                    mLights.Add(pLight);
                }
                catch
                {
                    continue;
                }
            }
        }

        // Create all Cameras in scene
        private void CreateCameras(XmlElement pCameraNode, SceneNode pSceneRoot)
        {
            // Iterate all Cameras, creating them. We do not attach them yet, since
            // we need to make sure all potential parent entities have been created.
            foreach (XmlElement pCameraElem in pCameraNode.ChildNodes)
            {
                if (pCameraElem.Name != "camera")
                    continue;

                // Ogre could cast an exception, in which case we just try to 
                // continue reading the other Cameras
                try
                {
                    string pszName = pCameraElem.GetAttribute("name");

                    // Create camera
                    Camera pCamera = mSceneMgr.CreateCamera(pszName);
                    if (pCamera == null) continue;

                    // Set Field of View on camera
                    pCamera.FOVy = new Radian(float.Parse(pCameraElem.GetAttribute("FOV"), numberFormat));
                    pCamera.NearClipDistance = 5f;

                    // Create node with full information
                    SceneNode pCameraNode1 = CreateNode(pCameraElem, pSceneRoot);

                    // Attach the Camera entity to node
                    pCameraNode1.AttachObject(pCamera);

                    // Target
                    XmlElement targetElem = (XmlElement)pCameraElem.SelectSingleNode("target");
                    if (targetElem != null)
                    {
                        // Create node with full information
                        SceneNode pTargetNode = CreateNode(targetElem, pSceneRoot);
                        pCameraNode1.SetAutoTracking(true, pTargetNode);
                    }

                    if (mWindow == null)
                    {
                        throw new InvalidOperationException("oSceneLoader: RenderWindow not valid, If the RenderWindow was not auto created you must add it in the OSMScene object contructor");
                    }

                    // If viewport(s) are not present, create a default viewport
                    if (mWindow.NumViewports == 0)
                    {
                        Viewport vp = mWindow.AddViewport(pCamera);

                        // Alter the camera aspect ratio to match the viewport
                        pCamera.AspectRatio = (float)vp.ActualWidth / (float)vp.ActualHeight;
                    }


                    // Notify
                    if (OnCameraCreate != null)
                        OnCameraCreate(pCamera, pCameraElem);

                    // Add to camera list
                    mCameras.Add(pCamera);
                }
                catch
                {
                    continue;
                }
            }

        }

        // For CE version, helpers, shapes, static geometry 
        // and external skeleton animation support is not provided
        private void CreateHelpers(XmlElement pHelperNode, SceneNode pSceneRoot)
        {

        }

        private void CreateShapes(XmlElement pShapeNode)
        {


        }

        private void CreateStaticGeometry(XmlElement pStaticGeom)
        {

        }

        //void LoadAnimations(XmlElement animationsNode, SkeletonHandles& handles) {

        // Iterate all skeletons, adding animations from ".anim" files	
        //}

        private void EnableLogManager()
        {
            LogManager.Singleton.SetLogDetail(LoggingLevel.LL_NORMAL);
        }
        private void DisableLogManager()
        {
            LogManager.Singleton.SetLogDetail(LoggingLevel.LL_LOW);
        }


        //This method is used because Mogre doesn´t have a wrapper for the Ogre::StringUtil class
        //It was ported from the c++ source of Ogre.
        private string StandardisePath(string init)
        {
            string path = init;

            path = path.Replace('\\', '/');
            if (path[path.Length - 1] != '/')
                path += '/';

            return path;
        }
    }

    //OSMAnimSerializer::OSMAnimSerializer() {

    //}

    //void OSMAnimSerializer::addAnimation(Ogre::SkeletonPtr skel, const Ogre::String& filename) {


}


Alias: clOgre

<HR>
Creative Commons Copyright -- Some rights reserved.


THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.

BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.

1. Definitions

  • "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License.
  • "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License.
  • "Licensor" means the individual or entity that offers the Work under the terms of this License.
  • "Original Author" means the individual or entity who created the Work.
  • "Work" means the copyrightable work of authorship offered under the terms of this License.
  • "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
  • "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, ShareAlike.

2. Fair Use Rights

Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.

3. License Grant

Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:

  • to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works;
  • to create and reproduce Derivative Works;
  • to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works;
  • to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works.
  • For the avoidance of doubt, where the work is a musical composition:
    • Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work.
    • Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights society or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions).
    • Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions).


The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved.

4. Restrictions

The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:

  • You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any credit as required by clause 4(c), as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any credit as required by clause 4(c), as requested.
  • You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, a later version of this License with the same License Elements as this License, or a Creative Commons iCommons license that contains the same License Elements as this License (e.g. Attribution-ShareAlike 2.5 Japan). You must include a copy of, or the Uniform Resource Identifier for, this License or other license specified in the previous sentence with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License.
  • If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor designate another party or parties (e.g. a sponsor institute, publishing entity, journal) for attribution in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit.

5. Representations, Warranties and Disclaimer

UNLESS OTHERWISE AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE MATERIALS, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.

6. Limitation on Liability.

EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. Termination

  • This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
  • Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.

8. Miscellaneous

  • Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
  • Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
  • If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
  • No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
  • This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.