Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/OgreMain/include/OgreRoot.h @ 5

Last change on this file since 5 was 5, checked in by anonymous, 17 years ago

=hoffentlich gehts jetzt

File size: 37.6 KB
Line 
1/*
2-----------------------------------------------------------------------------
3This source file is part of OGRE
4    (Object-oriented Graphics Rendering Engine)
5For the latest info, see http://www.ogre3d.org/
6
7Copyright (c) 2000-2006 Torus Knot Software Ltd
8Also see acknowledgements in Readme.html
9
10This program is free software; you can redistribute it and/or modify it under
11the terms of the GNU Lesser General Public License as published by the Free Software
12Foundation; either version 2 of the License, or (at your option) any later
13version.
14
15This program is distributed in the hope that it will be useful, but WITHOUT
16ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
18
19You should have received a copy of the GNU Lesser General Public License along with
20this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21Place - Suite 330, Boston, MA 02111-1307, USA, or go to
22http://www.gnu.org/copyleft/lesser.txt.
23
24You may alternatively use this source under the terms of a specific version of
25the OGRE Unrestricted License provided you have obtained such a license from
26Torus Knot Software Ltd.
27-----------------------------------------------------------------------------
28*/
29#ifndef __ROOT__
30#define __ROOT__
31
32// Precompiler options
33#include "OgrePrerequisites.h"
34
35#include "OgreSingleton.h"
36#include "OgreString.h"
37#include "OgreSceneManagerEnumerator.h"
38#include "OgreResourceGroupManager.h"
39
40#include <exception>
41
42namespace Ogre
43{
44    typedef std::vector<RenderSystem*> RenderSystemList;
45       
46    /** The root class of the Ogre system.
47        @remarks
48            The Ogre::Root class represents a starting point for the client
49            application. From here, the application can gain access to the
50            fundamentals of the system, namely the rendering systems
51            available, management of saved configurations, logging, and
52            access to other classes in the system. Acts as a hub from which
53            all other objects may be reached. An instance of Root must be
54            created before any other Ogre operations are called. Once an
55            instance has been created, the same instance is accessible
56            throughout the life of that object by using Root::getSingleton
57            (as a reference) or Root::getSingletonPtr (as a pointer).
58    */
59    class _OgreExport Root : public Singleton<Root>
60    {
61        // To allow update of active renderer if
62        // RenderSystem::initialise is used directly
63        friend class RenderSystem;
64    private:
65        RenderSystemList mRenderers;
66        RenderSystem* mActiveRenderer;
67        String mVersion;
68                String mConfigFileName;
69            bool mQueuedEnd;
70        // In case multiple render windows are created, only once are the resources loaded.
71        bool mFirstTimePostWindowInit;
72
73        // Singletons
74        LogManager* mLogManager;
75        ControllerManager* mControllerManager;
76        SceneManagerEnumerator* mSceneManagerEnum;
77        SceneManager* mCurrentSceneManager;
78        DynLibManager* mDynLibManager;
79        ArchiveManager* mArchiveManager;
80        MaterialManager* mMaterialManager;
81        MeshManager* mMeshManager;
82        ParticleSystemManager* mParticleManager;
83        SkeletonManager* mSkeletonManager;
84        OverlayElementFactory* mPanelFactory;
85        OverlayElementFactory* mBorderPanelFactory;
86        OverlayElementFactory* mTextAreaFactory;
87        OverlayManager* mOverlayManager;
88        FontManager* mFontManager;
89        ArchiveFactory *mZipArchiveFactory;
90        ArchiveFactory *mFileSystemArchiveFactory;
91                ResourceGroupManager* mResourceGroupManager;
92                ResourceBackgroundQueue* mResourceBackgroundQueue;
93                ShadowTextureManager* mShadowTextureManager;
94
95        Timer* mTimer;
96        RenderWindow* mAutoWindow;
97        Profiler* mProfiler;
98        HighLevelGpuProgramManager* mHighLevelGpuProgramManager;
99                ExternalTextureSourceManager* mExternalTextureSourceManager;
100        CompositorManager* mCompositorManager;     
101        unsigned long mCurrentFrame;
102                Real mFrameSmoothingTime;
103
104        public:
105                typedef std::vector<DynLib*> PluginLibList;
106                typedef std::vector<Plugin*> PluginInstanceList;
107        protected:
108                /// List of plugin DLLs loaded
109        PluginLibList mPluginLibs;
110                /// List of Plugin instances registered
111                PluginInstanceList mPlugins;
112
113                typedef std::map<String, MovableObjectFactory*> MovableObjectFactoryMap;
114                MovableObjectFactoryMap mMovableObjectFactoryMap;
115                uint32 mNextMovableObjectTypeFlag;
116                // stock movable factories
117                MovableObjectFactory* mEntityFactory;
118                MovableObjectFactory* mLightFactory;
119                MovableObjectFactory* mBillboardSetFactory;
120                MovableObjectFactory* mManualObjectFactory;
121                MovableObjectFactory* mBillboardChainFactory;
122                MovableObjectFactory* mRibbonTrailFactory;
123
124                typedef std::map<String, RenderQueueInvocationSequence*> RenderQueueInvocationSequenceMap;
125                RenderQueueInvocationSequenceMap mRQSequenceMap;
126
127                /// Are we initialised yet?
128                bool mIsInitialised;
129
130        /** Method reads a plugins configuration file and instantiates all
131            plugins.
132            @param
133                pluginsfile The file that contains plugins information.
134                Defaults to "plugins.cfg".
135        */
136        void loadPlugins( const String& pluginsfile = "plugins.cfg" );
137                /** Initialise all loaded plugins - allows plugins to perform actions
138                        once the renderer is initialised.
139                */
140                void initialisePlugins();
141                /** Shuts down all loaded plugins - allows things to be tidied up whilst
142                        all plugins are still loaded.
143                */
144                void shutdownPlugins();
145
146                /** Unloads all loaded plugins.
147        */
148        void unloadPlugins();
149
150        // Internal method for one-time tasks after first window creation
151        void oneTimePostWindowInit(void);
152
153        /** Set of registered frame listeners */
154        std::set<FrameListener*> mFrameListeners;
155
156        /** Set of frame listeners marked for removal*/
157        std::set<FrameListener*> mRemovedFrameListeners;
158
159        /** Indicates the type of event to be considered by calculateEventTime(). */
160        enum FrameEventTimeType {
161            FETT_ANY, FETT_STARTED, FETT_ENDED
162        };
163
164        /// Contains the times of recently fired events
165        std::deque<unsigned long> mEventTimes[3];
166
167        /** Internal method for calculating the average time between recently fired events.
168        @param now The current time in ms.
169        @param type The type of event to be considered.
170        */
171        Real calculateEventTime(unsigned long now, FrameEventTimeType type);
172    public:
173
174        /** Constructor
175        @param pluginFileName The file that contains plugins information.
176            Defaults to "plugins.cfg", may be left blank to ignore.
177                @param configFileName The file that contains the configuration to be loaded.
178                        Defaults to "ogre.cfg", may be left blank to load nothing.
179                @param logFileName The logfile to create, defaults to Ogre.log, may be
180                        left blank if you've already set up LogManager & Log yourself
181                */
182        Root(const String& pluginFileName = "plugins.cfg", 
183                        const String& configFileName = "ogre.cfg", 
184                        const String& logFileName = "Ogre.log");
185        ~Root();
186
187        /** Saves the details of the current configuration
188            @remarks
189                Stores details of the current configuration so it may be
190                restored later on.
191        */
192        void saveConfig(void);
193
194        /** Checks for saved video/sound/etc settings
195            @remarks
196                This method checks to see if there is a valid saved configuration
197                from a previous run. If there is, the state of the system will
198                be restored to that configuration.
199
200            @returns
201                If a valid configuration was found, <b>true</b> is returned.
202            @par
203                If there is no saved configuration, or if the system failed
204                with the last config settings, <b>false</b> is returned.
205        */
206        bool restoreConfig(void);
207
208        /** Displays a dialog asking the user to choose system settings.
209            @remarks
210                This method displays the default dialog allowing the user to
211                choose the renderering system, video mode etc. If there is are
212                any settings saved already, they will be restored automatically
213                before displaying the dialogue. When the user accepts a group of
214                settings, this will automatically call Root::setRenderSystem,
215                RenderSystem::setConfigOption and Root::saveConfig with the
216                user's choices. This is the easiest way to get the system
217                configured.
218            @returns
219                If the user clicked 'Ok', <b>true</b> is returned.
220            @par
221                If they clicked 'Cancel' (in which case the app should
222                strongly consider terminating), <b>false</b> is returned.
223         */
224        bool showConfigDialog(void);
225
226        /** Adds a new rendering subsystem to the list of available renderers.
227            @remarks
228                Intended for use by advanced users and plugin writers only!
229                Calling this method with a pointer to a valid RenderSystem
230                (sublcass) adds a rendering API implementation to the list of
231                available ones. Typical examples would be an OpenGL
232                implementation and a Direct3D implementation.
233            @note
234                <br>This should usually be called from the dllStartPlugin()
235                function of an extension plug-in.
236        */
237        void addRenderSystem(RenderSystem* newRend);
238
239        /** Retrieve a list of the available render systems.
240            @remarks
241                Retrieves a pointer to the list of available renderers as a
242                list of RenderSystem subclasses. Can be used to build a
243                custom settings dialog.
244        */
245        RenderSystemList* getAvailableRenderers(void);
246
247        /** Retrieve a pointer to the render system by the given name
248            @param
249                name Name of the render system intend to retrieve.
250            @returns
251                A pointer to the render system, <b>NULL</b> if no found.
252        */
253        RenderSystem* getRenderSystemByName(const String& name);
254
255        /** Sets the rendering subsystem to be used.
256            @remarks
257                This method indicates to OGRE which rendering system is to be
258                used (e.g. Direct3D, OpenGL etc). This is called
259                automatically by the default config dialog, and when settings
260                are restored from a previous configuraion. If used manually
261                it could be used to set the renderer from a custom settings
262                dialog. Once this has been done, the renderer can be
263                initialised using Root::initialise.
264            @par
265                This method is also called by render systems if they are
266                initialised directly.
267            @param
268                system Pointer to the render system to use.
269            @see
270                RenderSystem
271        */
272        void setRenderSystem(RenderSystem* system);
273
274        /** Retrieve a pointer to the currently selected render system.
275        */
276        RenderSystem* getRenderSystem(void);
277
278        /** Initialises the renderer.
279            @remarks
280                This method can only be called after a renderer has been
281                selected with Root::setRenderSystem, and it will initialise
282                the selected rendering system ready for use.
283            @param
284                autoCreateWindow If true, a rendering window will
285                automatically be created (saving a call to
286                RenderSystem::createRenderWindow). The window will be
287                created based on the options currently set on the render
288                system.
289            @returns
290                A pointer to the automatically created window, if
291                requested, otherwise <b>NULL</b>.
292        */
293            RenderWindow* initialise(bool autoCreateWindow, const String& windowTitle = "OGRE Render Window");
294
295                /** Returns whether the system is initialised or not. */
296                bool isInitialised(void) const { return mIsInitialised; }
297
298                /** Register a new SceneManagerFactory, a factory object for creating instances
299                        of specific SceneManagers.
300                @remarks
301                        Plugins should call this to register as new SceneManager providers.
302                */
303                void addSceneManagerFactory(SceneManagerFactory* fact);
304
305                /** Unregister a SceneManagerFactory.
306                */
307                void removeSceneManagerFactory(SceneManagerFactory* fact);
308
309                /** Get more information about a given type of SceneManager.
310                @remarks
311                        The metadata returned tells you a few things about a given type
312                        of SceneManager, which can be created using a factory that has been
313                        registered already.
314                @param typeName The type name of the SceneManager you want to enquire on.
315                        If you don't know the typeName already, you can iterate over the
316                        metadata for all types using getMetaDataIterator.
317                */
318                const SceneManagerMetaData* getSceneManagerMetaData(const String& typeName) const;
319
320                /** Iterate over all types of SceneManager available for construction,
321                        providing some information about each one.
322                */
323                SceneManagerEnumerator::MetaDataIterator getSceneManagerMetaDataIterator(void) const;
324
325                /** Create a SceneManager instance of a given type.
326                @remarks
327                        You can use this method to create a SceneManager instance of a
328                        given specific type. You may know this type already, or you may
329                        have discovered it by looking at the results from getMetaDataIterator.
330                @note
331                        This method throws an exception if the named type is not found.
332                @param typeName String identifying a unique SceneManager type
333                @param instanceName Optional name to given the new instance that is
334                        created. If you leave this blank, an auto name will be assigned.
335                */
336                SceneManager* createSceneManager(const String& typeName, 
337                        const String& instanceName = StringUtil::BLANK);
338
339                /** Create a SceneManager instance based on scene type support.
340                @remarks
341                        Creates an instance of a SceneManager which supports the scene types
342                        identified in the parameter. If more than one type of SceneManager
343                        has been registered as handling that combination of scene types,
344                        in instance of the last one registered is returned.
345                @note This method always succeeds, if a specific scene manager is not
346                        found, the default implementation is always returned.
347                @param typeMask A mask containing one or more SceneType flags
348                @param instanceName Optional name to given the new instance that is
349                        created. If you leave this blank, an auto name will be assigned.
350                */
351                SceneManager* createSceneManager(SceneTypeMask typeMask, 
352                        const String& instanceName = StringUtil::BLANK);
353
354                /** Destroy an instance of a SceneManager. */
355                void destroySceneManager(SceneManager* sm);
356
357                /** Get an existing SceneManager instance that has already been created,
358                        identified by the instance name.
359                @param instanceName The name of the instance to retrieve.
360                */
361                SceneManager* getSceneManager(const String& instanceName) const;
362
363                /** Get an iterator over all the existing SceneManager instances. */
364                SceneManagerEnumerator::SceneManagerIterator getSceneManagerIterator(void);
365
366        /** Retrieves a reference to the current TextureManager.
367            @remarks
368                This performs the same function as
369                TextureManager::getSingleton, but is provided for convenience
370                particularly to scripting engines.
371            @par
372                Note that a TextureManager will NOT be available until the
373                Ogre system has been initialised by selecting a RenderSystem,
374                calling Root::initialise and a window having been created
375                (this may have been done by initialise if required). This is
376                because the exact runtime subclass which will be implementing
377                the calls will differ depending on the rendering engine
378                selected, and these typically require a window upon which to
379                base texture format decisions.
380        */
381        TextureManager* getTextureManager(void);
382
383        /** Retrieves a reference to the current MeshManager.
384            @remarks
385                This performs the same function as MeshManager::getSingleton
386                and is provided for convenience to scripting engines.
387        */
388        MeshManager* getMeshManager(void);
389
390        /** Utility function for getting a better description of an error
391            code.
392        */
393        String getErrorDescription(long errorNumber);
394
395        /** Registers a FrameListener which will be called back every frame.
396            @remarks
397                A FrameListener is a class which implements methods which
398                will be called every frame.
399            @par
400                See the FrameListener class for more details on the specifics
401                It is imperitive that the instance passed to this method is
402                not destroyed before either the rendering loop ends, or the
403                class is removed from the listening list using
404                removeFrameListener.
405            @note
406                <br>This method can only be called after Root::initialise has
407                been called.
408            @see
409                FrameListener, Root::removeFrameListener
410        */
411        void addFrameListener(FrameListener* newListener);
412
413        /** Removes a FrameListener from the list of listening classes.
414            @see
415                FrameListener, Root::addFrameListener
416        */
417        void removeFrameListener(FrameListener* oldListener);
418
419        /** Queues the end of rendering.
420            @remarks
421                This method will do nothing unless startRendering() has
422                been called, in which case before the next frame is rendered
423                the rendering loop will bail out.
424            @see
425                Root, Root::startRendering
426        */
427        void queueEndRendering(void);
428
429        /** Starts / restarts the automatic rendering cycle.
430            @remarks
431                This method begins the automatic rendering of the scene. It
432                will <b>NOT</b> return until the rendering cycle is halted.
433            @par
434                During rendering, any FrameListener classes registered using
435                addFrameListener will be called back for each frame that is
436                to be rendered, These classes can tell OGRE to halt the
437                rendering if required, which will cause this method to
438                return.
439            @note
440                <br>Users of the OGRE library do not have to use this
441                automatic rendering loop. It is there as a convenience and is
442                most useful for high frame rate applications e.g. games. For
443                applications that don't need to constantly refresh the
444                rendering targets (e.g. an editor utility), it is better to
445                manually refresh each render target only when required by
446                calling RenderTarget::update, or if you want to run your own
447                                render loop you can update all targets on demand using
448                                Root::renderOneFrame.
449            @note
450                This frees up the CPU to do other things in between
451                refreshes, since in this case frame rate is less important.
452            @note
453                This method can only be called after Root::initialise has
454                been called.
455        */
456        void startRendering(void);
457
458        /** Render one frame.
459        @remarks
460            Updates all the render targets automatically and then returns,
461            raising frame events before and after.
462        */
463        bool renderOneFrame(void);
464        /** Shuts down the system manually.
465            @remarks
466                This is normally done by Ogre automatically so don't think
467                you have to call this yourself. However this is here for
468                convenience, especially for dealing with unexpected errors or
469                for systems which need to shut down Ogre on demand.
470        */
471        void shutdown(void);
472
473        /** Adds a location to the list of searchable locations for a
474            Resource type.
475            @remarks
476                Resource files (textures, models etc) need to be loaded from
477                specific locations. By calling this method, you add another
478                                search location to the list. Locations added first are preferred
479                                over locations added later.
480            @par
481                Locations can be folders, compressed archives, even perhaps
482                remote locations. Facilities for loading from different
483                locations are provided by plugins which provide
484                implementations of the Archive class.
485                All the application user has to do is specify a 'loctype'
486                string in order to indicate the type of location, which
487                should map onto one of the provided plugins. Ogre comes
488                configured with the 'FileSystem' (folders) and 'Zip' (archive
489                compressed with the pkzip / WinZip etc utilities) types.
490            @par
491                                You can also supply the name of a resource group which should
492                                have this location applied to it. The
493                                ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME group is the
494                                default, and one resource group which will always exist. You
495                                should consider defining resource groups for your more specific
496                                resources (e.g. per level) so that you can control loading /
497                                unloading better.
498            @param
499                name The name of the location, e.g. './data' or
500                '/compressed/gamedata.zip'
501            @param
502                locType A string identifying the location type, e.g.
503                'FileSystem' (for folders), 'Zip' etc. Must map to a
504                registered plugin which deals with this type (FileSystem and
505                Zip should always be available)
506            @param
507                groupName Type of name of the resource group which this location
508                                should apply to; defaults to the General group which applies to
509                                all non-specific resources.
510                        @param
511                                recursive If the resource location has a concept of recursive
512                                directory traversal, enabling this option will mean you can load
513                                resources in subdirectories using only their unqualified name.
514                                The default is to disable this so that resources in subdirectories
515                                with the same name are still unique.
516            @see
517                Archive
518        */
519        void addResourceLocation(const String& name, const String& locType, 
520                        const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, 
521                        bool recursive = false);
522
523                /** Removes a resource location from the list.
524                @see addResourceLocation
525                @param name The name of the resource location as specified in addResourceLocation
526                @param groupName The name of the resource group to which this location
527                        was assigned.
528                */
529                void removeResourceLocation(const String& name, 
530                        const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
531
532        /** Generates a packed data version of the passed in ColourValue suitable for
533            use with the current RenderSystem.
534        @remarks
535            Since different render systems have different colour data formats (eg
536            RGBA for GL, ARGB for D3D) this method allows you to use 1 method for all.
537        @param colour The colour to convert
538        @param pDest Pointer to location to put the result.
539        */
540        void convertColourValue(const ColourValue& colour, uint32* pDest);
541
542        /** Retrieves a pointer to the window that was created automatically
543            @remarks
544                When Root is initialised an optional window is created. This
545                method retreives a pointer to that window.
546            @note
547                returns a null pointer when Root has not been initialised with
548                the option of creating a window.
549        */
550        RenderWindow* getAutoCreatedWindow(void);
551
552        /** @copydoc RenderSystem::createRenderWindow
553        */
554                RenderWindow* createRenderWindow(const String &name, unsigned int width, unsigned int height, 
555                        bool fullScreen, const NameValuePairList *miscParams = 0) ;
556
557        /** Destroys a rendering window.
558        */
559        void detachRenderTarget( RenderTarget* pWin );
560
561        /** Destroys a named rendering window.
562        */
563        void detachRenderTarget( const String & name );
564
565        /** Retrieves a pointer to the a named render window.
566        */
567        RenderTarget * getRenderTarget(const String &name);
568
569                /** Manually load a Plugin contained in a DLL / DSO.
570                 @remarks
571                        Plugins embedded in DLLs can be loaded at startup using the plugin
572                        configuration file specified when you create Root (default: plugins.cfg).
573                        This method allows you to load plugin DLLs directly in code.
574                        The DLL in question is expected to implement a dllStartPlugin
575                        method which instantiates a Plugin subclass and calls Root::installPlugin.
576                        It should also implement dllStopPlugin (see Root::unloadPlugin)
577                @param pluginName Name of the plugin library to load
578                */
579                void loadPlugin(const String& pluginName);
580
581                /** Manually unloads a Plugin contained in a DLL / DSO.
582                 @remarks
583                        Plugin DLLs are unloaded at shutdown automatically. This method
584                        allows you to unload plugins in code, but make sure their
585                        dependencies are decoupled first. This method will call the
586                        dllStopPlugin method defined in the DLL, which in turn should call
587                        Root::uninstallPlugin.
588                @param pluginName Name of the plugin library to unload
589                */
590                void unloadPlugin(const String& pluginName);
591
592                /** Install a new plugin.
593                @remarks
594                        This installs a new extension to OGRE. The plugin itself may be loaded
595                        from a DLL / DSO, or it might be statically linked into your own
596                        application. Either way, something has to call this method to get
597                        it registered and functioning. You should only call this method directly
598                        if your plugin is not in a DLL that could otherwise be loaded with
599                        loadPlugin, since the DLL function dllStartPlugin should call this
600                        method when the DLL is loaded.
601                */
602                void installPlugin(Plugin* plugin);
603
604                /** Uninstall an existing plugin.
605                @remarks
606                        This uninstalls an extension to OGRE. Plugins are automatically
607                        uninstalled at shutdown but this lets you remove them early.
608                        If the plugin was loaded from a DLL / DSO you should call unloadPlugin
609                        which should result in this method getting called anyway (if the DLL
610                        is well behaved).
611                */
612                void uninstallPlugin(Plugin* plugin);
613
614                /** Gets a read-only list of the currently installed plugins. */
615                const PluginInstanceList& getInstalledPlugins() const { return mPlugins; }
616
617        /** Gets a pointer to the central timer used for all OGRE timings */
618        Timer* getTimer(void);
619
620        /** Method for raising frame started events.
621        @remarks
622            This method is only for internal use when you use OGRE's inbuilt rendering
623            loop (Root::startRendering). However, if you run your own rendering loop then
624            you should call this method to ensure that FrameListener objects are notified
625            of frame events; processes like texture animation and particle systems rely on
626            this.
627        @par
628            Calling this method also increments the frame number, which is
629            important for keeping some elements of the engine up to date.
630        @note
631            This method takes an event object as a parameter, so you can specify the times
632            yourself. If you are happy for OGRE to automatically calculate the frame time
633            for you, then call the other version of this method with no parameters.
634        @param evt Event object which includes all the timing information which you have
635            calculated for yourself
636        @returns False if one or more frame listeners elected that the rendering loop should
637            be terminated, true otherwise.
638        */
639        bool _fireFrameStarted(FrameEvent& evt);
640        /** Method for raising frame ended events.
641        @remarks
642            This method is only for internal use when you use OGRE's inbuilt rendering
643            loop (Root::startRendering). However, if you run your own rendering loop then
644            you should call this method to ensure that FrameListener objects are notified
645            of frame events; processes like texture animation and particle systems rely on
646            this.
647        @note
648            This method takes an event object as a parameter, so you can specify the times
649            yourself. If you are happy for OGRE to automatically calculate the frame time
650            for you, then call the other version of this method with no parameters.
651        @param evt Event object which includes all the timing information which you have
652            calculated for yourself
653        @returns False if one or more frame listeners elected that the rendering loop should
654            be terminated, true otherwise.
655        */
656        bool _fireFrameEnded(FrameEvent& evt);
657        /** Method for raising frame started events.
658        @remarks
659            This method is only for internal use when you use OGRE's inbuilt rendering
660            loop (Root::startRendering). However, if you run your own rendering loop then
661            you should call this method to ensure that FrameListener objects are notified
662            of frame events; processes like texture animation and particle systems rely on
663            this.
664        @par
665            Calling this method also increments the frame number, which is
666            important for keeping some elements of the engine up to date.
667        @note
668            This method calculates the frame timing information for you based on the elapsed
669            time. If you want to specify elapsed times yourself you should call the other
670            version of this method which takes event details as a parameter.
671        @returns False if one or more frame listeners elected that the rendering loop should
672            be terminated, true otherwise.
673        */
674        bool _fireFrameStarted();
675        /** Method for raising frame ended events.
676        @remarks
677            This method is only for internal use when you use OGRE's inbuilt rendering
678            loop (Root::startRendering). However, if you run your own rendering loop then
679            you should call this method to ensure that FrameListener objects are notified
680            of frame events; processes like texture animation and particle systems rely on
681            this.
682        @note
683            This method calculates the frame timing information for you based on the elapsed
684            time. If you want to specify elapsed times yourself you should call the other
685            version of this method which takes event details as a parameter.
686        @returns False if one or more frame listeners elected that the rendering loop should
687            be terminated, true otherwise.
688        */
689        bool _fireFrameEnded();
690
691        /** Gets the number of the current frame. */
692        unsigned long getCurrentFrameNumber(void) const { return mCurrentFrame; }
693
694        /** Returns the scene manager currently being used to render a frame.
695        @remarks
696            This is only intended for internal use; it is only valid during the
697            rendering of a frame.
698        */
699        SceneManager* _getCurrentSceneManager(void) const { return mCurrentSceneManager; }
700        /** Sets the scene manager currently being used to render a frame.
701        @remarks
702            This is only intended for internal use.
703        */
704        void _setCurrentSceneManager(SceneManager* sm);
705
706        /** Internal method used for updating all RenderTarget objects (windows,
707            renderable textures etc) which are set to auto-update.
708        @remarks
709            You don't need to use this method if you're using Ogre's own internal
710            rendering loop (Root::startRendering). If you're running your own loop
711            you may wish to call it to update all the render targets which are
712            set to auto update (RenderTarget::setAutoUpdated). You can also update
713            individual RenderTarget instances using their own update() method.
714        */
715        void _updateAllRenderTargets(void);
716
717                /** Create a new RenderQueueInvocationSequence, useful for linking to
718                        Viewport instances to perform custom rendering.
719                @param name The name to give the new sequence
720                */
721                RenderQueueInvocationSequence* createRenderQueueInvocationSequence(
722                        const String& name);
723
724                /** Get a RenderQueueInvocationSequence.
725                @param name The name to identify the sequence
726                */
727                RenderQueueInvocationSequence* getRenderQueueInvocationSequence(
728                        const String& name);
729
730                /** Destroy a RenderQueueInvocationSequence.
731                @remarks
732                        You must ensure that no Viewports are using this sequence.
733                @param name The name to identify the sequence
734                */
735                void destroyRenderQueueInvocationSequence(
736                        const String& name);
737
738                /** Destroy all RenderQueueInvocationSequences.
739                @remarks
740                        You must ensure that no Viewports are using custom sequences.
741                @param name The name to identify the sequence
742                */
743                void destroyAllRenderQueueInvocationSequences(void);
744
745        /** Override standard Singleton retrieval.
746            @remarks
747                Why do we do this? Well, it's because the Singleton
748                implementation is in a .h file, which means it gets compiled
749                into anybody who includes it. This is needed for the
750                Singleton template to work, but we actually only want it
751                compiled into the implementation of the class based on the
752                Singleton, not all of them. If we don't change this, we get
753                link errors when trying to use the Singleton-based class from
754                an outside dll.
755            @par
756                This method just delegates to the template version anyway,
757                but the implementation stays in this single compilation unit,
758                preventing link errors.
759        */
760        static Root& getSingleton(void);
761        /** Override standard Singleton retrieval.
762            @remarks
763                Why do we do this? Well, it's because the Singleton
764                implementation is in a .h file, which means it gets compiled
765                into anybody who includes it. This is needed for the
766                Singleton template to work, but we actually only want it
767                compiled into the implementation of the class based on the
768                Singleton, not all of them. If we don't change this, we get
769                link errors when trying to use the Singleton-based class from
770                an outside dll.
771            @par
772                This method just delegates to the template version anyway,
773                but the implementation stays in this single compilation unit,
774                preventing link errors.
775        */
776        static Root* getSingletonPtr(void);
777
778                /** Clears the history of all event times.
779                @remarks
780                        OGRE stores a history of the last few event times in order to smooth
781                        out any inaccuracies and temporary fluctuations. However, if you
782                        pause or don't render for a little while this can cause a lurch, so
783                        if you're resuming rendering after a break, call this method to reset
784                        the stored times
785                */
786                void clearEventTimes(void);
787
788                /** Sets the period over which OGRE smooths out fluctuations in frame times.
789                @remarks
790                        OGRE by default gives you the raw frame time, but can optionally
791                        smooths it out over several frames, in order to reduce the
792                        noticeable effect of occasional hiccups in framerate.
793                        These smoothed values are passed back as parameters to FrameListener
794                        calls.
795                @par
796                        This method allow you to tweak the smoothing period, and is expressed
797                        in seconds. Setting it to 0 will result in completely unsmoothed
798                        frame times (the default).
799                */
800                void setFrameSmoothingPeriod(Real period) { mFrameSmoothingTime = period; }
801                /** Gets the period over which OGRE smooths out fluctuations in frame times. */
802                Real getFrameSmoothingPeriod(void) const { return mFrameSmoothingTime; }
803
804                /** Register a new MovableObjectFactory which will create new MovableObject
805                        instances of a particular type, as identified by the getType() method.
806                @remarks
807                        Plugin creators can create subclasses of MovableObjectFactory which
808                        construct custom subclasses of MovableObject for insertion in the
809                        scene. This is the primary way that plugins can make custom objects
810                        available.
811                @param fact Pointer to the factory instance
812                @param overrideExisting Set this to true to override any existing
813                        factories which are registered for the same type. You should only
814                        change this if you are very sure you know what you're doing.
815                */
816                void addMovableObjectFactory(MovableObjectFactory* fact, 
817                        bool overrideExisting = false);
818                /** Removes a previously registered MovableObjectFactory.
819                @remarks
820                        All instances of objects created by this factory will be destroyed
821                        before removing the factory (by calling back the factories
822                        'destroyInstance' method). The plugin writer is responsible for actually
823                        destroying the factory.
824                */
825                void removeMovableObjectFactory(MovableObjectFactory* fact);
826                /// Checks whether a factory is registered for a given MovableObject type
827                bool hasMovableObjectFactory(const String& typeName) const;
828                /// Get a MovableObjectFactory for the given type
829                MovableObjectFactory* getMovableObjectFactory(const String& typeName);
830                /** Allocate the next MovableObject type flag.
831                @remarks
832                        This is done automatically if MovableObjectFactory::requestTypeFlags
833                        returns true; don't call this manually unless you're sure you need to.
834                */
835                uint32 _allocateNextMovableObjectTypeFlag(void);
836
837                typedef ConstMapIterator<MovableObjectFactoryMap> MovableObjectFactoryIterator;
838                /** Return an iterator over all the MovableObjectFactory instances currently
839                        registered.
840                */
841                MovableObjectFactoryIterator getMovableObjectFactoryIterator(void) const;
842    };
843} // Namespace Ogre
844#endif
Note: See TracBrowser for help on using the repository browser.