123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 |
- // Copyright (C) 2002-2012 Nikolaus Gebhardt
- // This file is part of the "Irrlicht Engine".
- // For conditions of distribution and use, see copyright notice in irrlicht.h
- #ifndef IRR_I_IRRLICHT_DEVICE_H_INCLUDED
- #define IRR_I_IRRLICHT_DEVICE_H_INCLUDED
- #include "IReferenceCounted.h"
- #include "dimension2d.h"
- #include "IVideoDriver.h"
- #include "EDriverTypes.h"
- #include "EDeviceTypes.h"
- #include "IEventReceiver.h"
- #include "ICursorControl.h"
- #include "IVideoModeList.h"
- #include "ITimer.h"
- #include "IOSOperator.h"
- namespace irr
- {
- class ILogger;
- class IEventReceiver;
- class IRandomizer;
- namespace io {
- class IFileSystem;
- } // end namespace io
- namespace gui {
- class IGUIEnvironment;
- } // end namespace gui
- namespace scene {
- class ISceneManager;
- } // end namespace scene
- namespace video {
- class IContextManager;
- } // end namespace video
- //! The Irrlicht device. You can create it with createDevice() or createDeviceEx().
- /** This is the most important class of the Irrlicht Engine. You can
- access everything in the engine if you have a pointer to an instance of
- this class. There should be only one instance of this class at any
- time.
- */
- class IrrlichtDevice : public virtual IReferenceCounted
- {
- public:
- //! Runs the device.
- /** Also increments the virtual timer by calling
- ITimer::tick();. You can prevent this
- by calling ITimer::stop(); before and ITimer::start() after
- calling IrrlichtDevice::run(). Returns false if device wants
- to be deleted. Use it in this way:
- \code
- while(device->run())
- {
- // draw everything here
- }
- \endcode
- If you want the device to do nothing if the window is inactive
- (recommended), use the slightly enhanced code shown at isWindowActive().
- Note if you are running Irrlicht inside an external, custom
- created window: Calling Device->run() will cause Irrlicht to
- dispatch windows messages internally.
- If you are running Irrlicht in your own custom window, you can
- also simply use your own message loop using GetMessage,
- DispatchMessage and whatever and simply don't use this method.
- But note that Irrlicht will not be able to fetch user input
- then. See irr::SIrrlichtCreationParameters::WindowId for more
- information and example code.
- */
- virtual bool run() = 0;
- //! Cause the device to temporarily pause execution and let other processes run.
- /** This should bring down processor usage without major performance loss for Irrlicht.
- But this is system dependent, so there's a chance your thread won't get control back quickly.
- */
- virtual void yield() = 0;
- //! Pause execution and let other processes to run for a specified amount of time.
- /** It may not wait the full given time, as sleep may be interrupted and also may wait longer on some OS.
- \param timeMs: Time to sleep for in milliseconds. Note that the OS can round up this number.
- On Windows you usually get at least 15ms sleep time minium for any value > 0.
- So if you call this in your main loop you can't get more than 65 FPS anymore in your game.
- On most Linux systems it's relatively exact, but also no guarantee.
- \param pauseTimer: If true, pauses the device timer while sleeping
- */
- virtual void sleep(u32 timeMs, bool pauseTimer=false) = 0;
- //! Provides access to the video driver for drawing 3d and 2d geometry.
- /** \return Pointer the video driver. */
- virtual video::IVideoDriver* getVideoDriver() = 0;
- //! Provides access to the virtual file system.
- /** \return Pointer to the file system. */
- virtual io::IFileSystem* getFileSystem() = 0;
- //! Provides access to the 2d user interface environment.
- /** \return Pointer to the gui environment. */
- virtual gui::IGUIEnvironment* getGUIEnvironment() = 0;
- //! Provides access to the scene manager.
- /** \return Pointer to the scene manager. */
- virtual scene::ISceneManager* getSceneManager() = 0;
- //! Provides access to the cursor control.
- /** \return Pointer to the mouse cursor control interface. */
- virtual gui::ICursorControl* getCursorControl() = 0;
- //! Provides access to the message logger.
- /** \return Pointer to the logger. */
- virtual ILogger* getLogger() = 0;
- //! Gets a list with all video modes available.
- /** You only need a null driver (ED_NULL) to access
- those video modes. So you can get the available modes
- before starting any other video driver.
- \return Pointer to a list with all video modes supported
- by the gfx adapter. */
- virtual video::IVideoModeList* getVideoModeList() = 0;
- //! Get context manager
- virtual video::IContextManager* getContextManager() = 0;
- //! Provides access to the operation system operator object.
- /** The OS operator provides methods for
- getting system specific information and doing system
- specific operations, such as exchanging data with the clipboard
- or reading the operation system version.
- \return Pointer to the OS operator. */
- virtual IOSOperator* getOSOperator() = 0;
- //! Provides access to the engine's timer.
- /** The system time can be retrieved by it as
- well as the virtual time, which also can be manipulated.
- \return Pointer to the ITimer object. */
- virtual ITimer* getTimer() = 0;
- //! Provides access to the engine's currently set randomizer.
- /** \return Pointer to the IRandomizer object. */
- virtual IRandomizer* getRandomizer() const =0;
- //! Sets a new randomizer.
- /** \param r Pointer to the new IRandomizer object. This object is
- grab()'ed by the engine and will be released upon the next setRandomizer
- call or upon device destruction. */
- virtual void setRandomizer(IRandomizer* r) =0;
- //! Creates a new default randomizer.
- /** The default randomizer provides the random sequence known from previous
- Irrlicht versions and is the initial randomizer set on device creation.
- \return Pointer to the default IRandomizer object. */
- virtual IRandomizer* createDefaultRandomizer() const =0;
- //! Sets the caption of the window.
- /** \param text: New text of the window caption. */
- virtual void setWindowCaption(const wchar_t* text) = 0;
- //! Returns if the window is active.
- /** If the window is inactive,
- nothing needs to be drawn. So if you don't want to draw anything
- when the window is inactive, create your drawing loop this way:
- \code
- while(device->run())
- {
- if (device->isWindowActive())
- {
- // draw everything here
- }
- else
- device->yield();
- }
- \endcode
- \return True if window is active. */
- virtual bool isWindowActive() const = 0;
- //! Checks if the Irrlicht window has the input focus
- /** \return True if window has focus. */
- virtual bool isWindowFocused() const = 0;
- //! Checks if the Irrlicht window is minimized
- /** \return True if window is minimized. */
- virtual bool isWindowMinimized() const = 0;
- //! Checks if the Irrlicht window is running in fullscreen mode
- /** \return True if window is fullscreen. */
- virtual bool isFullscreen() const = 0;
- //! Get the current color format of the window
- /** \return Color format of the window. */
- virtual video::ECOLOR_FORMAT getColorFormat() const = 0;
- //! Notifies the device that it should close itself.
- /** IrrlichtDevice::run() will always return false after closeDevice() was called. */
- virtual void closeDevice() = 0;
- //! Get the version of the engine.
- /** The returned string
- will look like this: "1.2.3" or this: "1.2".
- \return String which contains the version. */
- virtual const c8* getVersion() const = 0;
- //! Sets a new user event receiver which will receive events from the engine.
- /** Return true in IEventReceiver::OnEvent to prevent the event from continuing along
- the chain of event receivers. The path that an event takes through the system depends
- on its type. See irr::EEVENT_TYPE for details.
- \param receiver New receiver to be used. */
- virtual void setEventReceiver(IEventReceiver* receiver) = 0;
- //! Provides access to the current event receiver.
- /** \return Pointer to the current event receiver. Returns 0 if there is none. */
- virtual IEventReceiver* getEventReceiver() = 0;
- //! Sends a user created event to the engine.
- /** Is is usually not necessary to use this. However, if you
- are using an own input library for example for doing joystick
- input, you can use this to post key or mouse input events to
- the engine. Internally, this method only delegates the events
- further to the scene manager and the GUI environment. */
- virtual bool postEventFromUser(const SEvent& event) = 0;
- //! Sets the input receiving scene manager.
- /** If set to null, the main scene manager (returned by
- GetSceneManager()) will receive the input
- \param sceneManager New scene manager to be used. */
- virtual void setInputReceivingSceneManager(scene::ISceneManager* sceneManager) = 0;
- //! Sets if the window should be resizable in windowed mode.
- /** The default is false. This method only works in windowed
- mode.
- \param resize Flag whether the window should be resizable. */
- virtual void setResizable(bool resize=false) = 0;
- //! Resize the render window.
- /** This will only work in windowed mode and is not yet supported on all systems.
- It does set the drawing/clientDC size of the window, the window decorations are added to that.
- You get the current window size with IVideoDriver::getScreenSize() (might be unified in future)
- */
- virtual void setWindowSize(const irr::core::dimension2d<u32>& size) = 0;
- //! Minimizes the window if possible.
- virtual void minimizeWindow() =0;
- //! Maximizes the window if possible.
- virtual void maximizeWindow() =0;
- //! Restore the window to normal size if possible.
- virtual void restoreWindow() =0;
- //! Get the position of the frame on-screen
- virtual core::position2di getWindowPosition() = 0;
- //! Activate any joysticks, and generate events for them.
- /** Irrlicht contains support for joysticks, but does not generate joystick events by default,
- as this would consume joystick info that 3rd party libraries might rely on. Call this method to
- activate joystick support in Irrlicht and to receive irr::SJoystickEvent events.
- \param joystickInfo On return, this will contain an array of each joystick that was found and activated.
- \return true if joysticks are supported on this device and _IRR_COMPILE_WITH_JOYSTICK_EVENTS_
- is defined, false if joysticks are not supported or support is compiled out.
- */
- virtual bool activateJoysticks(core::array<SJoystickInfo>& joystickInfo) =0;
- //! Set the current Gamma Value for the Display
- virtual bool setGammaRamp(f32 red, f32 green, f32 blue,
- f32 relativebrightness, f32 relativecontrast) =0;
- //! Get the current Gamma Value for the Display
- virtual bool getGammaRamp(f32 &red, f32 &green, f32 &blue,
- f32 &brightness, f32 &contrast) =0;
- //! Set the maximal elapsed time between 2 clicks to generate doubleclicks for the mouse. It also affects tripleclick behavior.
- /** When set to 0 no double- and tripleclicks will be generated.
- \param timeMs maximal time in milliseconds for two consecutive clicks to be recognized as double click
- */
- virtual void setDoubleClickTime(u32 timeMs) =0;
- //! Get the maximal elapsed time between 2 clicks to generate double- and tripleclicks for the mouse.
- /** When return value is 0 no double- and tripleclicks will be generated.
- \return maximal time in milliseconds for two consecutive clicks to be recognized as double click
- */
- virtual u32 getDoubleClickTime() const =0;
- //! Remove messages pending in the system message loop
- /** This function is usually used after messages have been buffered for a longer time, for example
- when loading a large scene. Clearing the message loop prevents that mouse- or buttonclicks which users
- have pressed in the meantime will now trigger unexpected actions in the gui. <br>
- So far the following messages are cleared:<br>
- Win32: All keyboard and mouse messages<br>
- Linux: All keyboard and mouse messages<br>
- All other devices are not yet supported here.<br>
- The function is still somewhat experimental, as the kind of messages we clear is based on just a few use-cases.
- If you think further messages should be cleared, or some messages should not be cleared here, then please tell us. */
- virtual void clearSystemMessages() = 0;
- //! Get the type of the device.
- /** This allows the user to check which windowing system is currently being
- used. */
- virtual E_DEVICE_TYPE getType() const = 0;
- //! Check if a driver type is supported by the engine.
- /** Even if true is returned the driver may not be available
- for a configuration requested when creating the device. */
- static bool isDriverSupported(video::E_DRIVER_TYPE driver)
- {
- switch (driver)
- {
- case video::EDT_NULL:
- return true;
- case video::EDT_SOFTWARE:
- #ifdef _IRR_COMPILE_WITH_SOFTWARE_
- return true;
- #else
- return false;
- #endif
- case video::EDT_BURNINGSVIDEO:
- #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_
- return true;
- #else
- return false;
- #endif
- case video::EDT_DIRECT3D9:
- #ifdef _IRR_COMPILE_WITH_DIRECT3D_9_
- return true;
- #else
- return false;
- #endif
- case video::EDT_OPENGL:
- #ifdef _IRR_COMPILE_WITH_OPENGL_
- return true;
- #else
- return false;
- #endif
- default:
- return false;
- }
- }
- };
- } // end namespace irr
- #endif
|