diff --git a/include/EMessageBoxFlags.h b/include/EMessageBoxFlags.h deleted file mode 100644 index 06468043..00000000 --- a/include/EMessageBoxFlags.h +++ /dev/null @@ -1,36 +0,0 @@ -// 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 __E_MESSAGE_BOX_FLAGS_H_INCLUDED__ -#define __E_MESSAGE_BOX_FLAGS_H_INCLUDED__ - -namespace irr -{ -namespace gui -{ - -//! enumeration for message box layout flags -enum EMESSAGE_BOX_FLAG -{ - //! Flag for the OK button - EMBF_OK = 0x1, - - //! Flag for the cancel button - EMBF_CANCEL = 0x2, - - //! Flag for the yes button - EMBF_YES = 0x4, - - //! Flag for the no button - EMBF_NO = 0x8, - - //! This value is not used. It only forces this enumeration to compile in 32 bit. - EMBF_FORCE_32BIT = 0x7fffffff -}; - -} // namespace gui -} // namespace irr - -#endif - diff --git a/include/IEventReceiver.h b/include/IEventReceiver.h index 4b0af179..91588a3c 100644 --- a/include/IEventReceiver.h +++ b/include/IEventReceiver.h @@ -280,18 +280,6 @@ namespace irr //! A file open dialog has been closed without choosing a file EGET_FILE_CHOOSE_DIALOG_CANCELLED, - //! 'Yes' was clicked on a messagebox - EGET_MESSAGEBOX_YES, - - //! 'No' was clicked on a messagebox - EGET_MESSAGEBOX_NO, - - //! 'OK' was clicked on a messagebox - EGET_MESSAGEBOX_OK, - - //! 'Cancel' was clicked on a messagebox - EGET_MESSAGEBOX_CANCEL, - //! In an editbox 'ENTER' was pressed EGET_EDITBOX_ENTER, @@ -304,36 +292,14 @@ namespace irr //! The tab was changed in an tab control EGET_TAB_CHANGED, - //! A menu item was selected in a (context) menu - EGET_MENU_ITEM_SELECTED, - //! The selection in a combo box has been changed EGET_COMBO_BOX_CHANGED, - //! The value of a spin box has changed - EGET_SPINBOX_CHANGED, - //! A table has changed EGET_TABLE_CHANGED, EGET_TABLE_HEADER_CHANGED, EGET_TABLE_SELECTED_AGAIN, - //! A tree view node lost selection. See IGUITreeView::getLastEventNode(). - EGET_TREEVIEW_NODE_DESELECT, - - //! A tree view node was selected. See IGUITreeView::getLastEventNode(). - EGET_TREEVIEW_NODE_SELECT, - - //! A tree view node was expanded. See IGUITreeView::getLastEventNode(). - EGET_TREEVIEW_NODE_EXPAND, - - //! A tree view node was collapsed. See IGUITreeView::getLastEventNode(). - EGET_TREEVIEW_NODE_COLLAPSE, - - //! deprecated - use EGET_TREEVIEW_NODE_COLLAPSE instead. This - //! may be removed by Irrlicht 1.9 - EGET_TREEVIEW_NODE_COLLAPS = EGET_TREEVIEW_NODE_COLLAPSE, - //! No real event. Just for convenience to get number of events EGET_COUNT }; diff --git a/include/IGUIColorSelectDialog.h b/include/IGUIColorSelectDialog.h deleted file mode 100644 index a27991c9..00000000 --- a/include/IGUIColorSelectDialog.h +++ /dev/null @@ -1,37 +0,0 @@ -// 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 __I_GUI_COLOR_SELECT_DIALOG_H_INCLUDED__ -#define __I_GUI_COLOR_SELECT_DIALOG_H_INCLUDED__ - -#include "IGUIElement.h" - -namespace irr -{ -namespace gui -{ - - //! Standard color chooser dialog. - class IGUIColorSelectDialog : public IGUIElement - { - public: - - //! constructor - IGUIColorSelectDialog(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle) - : IGUIElement(EGUIET_COLOR_SELECT_DIALOG, environment, parent, id, rectangle) {} - - //! get chosen color as usual SColor struct - virtual video::SColor getColor() =0; - - //! get chosen color as HSL values - virtual video::SColorHSL getColorHSL() =0; - - }; - - -} // end namespace gui -} // end namespace irr - -#endif - diff --git a/include/IGUIContextMenu.h b/include/IGUIContextMenu.h deleted file mode 100644 index 66237632..00000000 --- a/include/IGUIContextMenu.h +++ /dev/null @@ -1,162 +0,0 @@ -// 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 __I_GUI_CONTEXT_MENU_H_INCLUDED__ -#define __I_GUI_CONTEXT_MENU_H_INCLUDED__ - -#include "IGUIElement.h" - -namespace irr -{ -namespace gui -{ - //! Close behavior. - //! Default is ECMC_REMOVE - enum ECONTEXT_MENU_CLOSE - { - //! do nothing - menu stays open - ECMC_IGNORE = 0, - - //! remove the gui element - ECMC_REMOVE = 1, - - //! call setVisible(false) - ECMC_HIDE = 2 - - // note to implementers - this is planned as bitset, so continue with 4 if you need to add further flags. - }; - - //! GUI Context menu interface. - /** \par This element can create the following events of type EGUI_EVENT_TYPE: - \li EGET_ELEMENT_CLOSED - \li EGET_MENU_ITEM_SELECTED - */ - class IGUIContextMenu : public IGUIElement - { - public: - - //! constructor - IGUIContextMenu(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle) - : IGUIElement(EGUIET_CONTEXT_MENU, environment, parent, id, rectangle) {} - - //! set behavior when menus are closed - virtual void setCloseHandling(ECONTEXT_MENU_CLOSE onClose) = 0; - - //! get current behavior when the menu will be closed - virtual ECONTEXT_MENU_CLOSE getCloseHandling() const = 0; - - //! Get amount of menu items - virtual u32 getItemCount() const = 0; - - //! Adds a menu item. - /** \param text: Text of menu item. Set this to 0 to create - an separator instead of a real item, which is the same like - calling addSeparator(); - \param commandId: Command id of menu item, a simple id you may - set to whatever you want. - \param enabled: Specifies if the menu item should be enabled. - \param hasSubMenu: Set this to true if there should be a submenu - at this item. You can access this submenu via getSubMenu(). - \param checked: Specifies if the menu item should be initially checked. - \param autoChecking: Specifies if the item should be checked by clicking - \return Returns the index of the new item */ - virtual u32 addItem(const wchar_t* text, s32 commandId=-1, bool enabled=true, - bool hasSubMenu=false, bool checked=false, bool autoChecking=false) = 0; - - //! Insert a menu item at specified position. - /** \param idx: Position to insert the new element, - should be smaller than itemcount otherwise the item is added to the end. - \param text: Text of menu item. Set this to 0 to create - an separator instead of a real item, which is the same like - calling addSeparator(); - \param commandId: Command id of menu item, a simple id you may - set to whatever you want. - \param enabled: Specifies if the menu item should be enabled. - \param hasSubMenu: Set this to true if there should be a submenu - at this item. You can access this submenu via getSubMenu(). - \param checked: Specifies if the menu item should be initially checked. - \param autoChecking: Specifies if the item should be checked by clicking - \return Returns the index of the new item */ - virtual u32 insertItem(u32 idx, const wchar_t* text, s32 commandId=-1, bool enabled=true, - bool hasSubMenu=false, bool checked=false, bool autoChecking=false) = 0; - - //! Find an item by its CommandID - /** - \param commandId: We are looking for the first item which has this commandID - \param idxStartSearch: Start searching from this index. - \return Returns the index of the item when found or otherwise -1. */ - virtual s32 findItemWithCommandId(s32 commandId, u32 idxStartSearch=0) const = 0; - - //! Adds a separator item to the menu - virtual void addSeparator() = 0; - - //! Get text of the menu item. - /** \param idx: Zero based index of the menu item */ - virtual const wchar_t* getItemText(u32 idx) const = 0; - - //! Sets text of the menu item. - /** \param idx: Zero based index of the menu item - \param text: New text of the item. */ - virtual void setItemText(u32 idx, const wchar_t* text) = 0; - - //! Check if a menu item is enabled - /** \param idx: Zero based index of the menu item */ - virtual bool isItemEnabled(u32 idx) const = 0; - - //! Sets if the menu item should be enabled. - /** \param idx: Zero based index of the menu item - \param enabled: True if it is enabled, otherwise false. */ - virtual void setItemEnabled(u32 idx, bool enabled) = 0; - - //! Sets if the menu item should be checked. - /** \param idx: Zero based index of the menu item - \param enabled: True if it is enabled, otherwise false. */ - virtual void setItemChecked(u32 idx, bool enabled) = 0; - - //! Check if a menu item is checked - /** \param idx: Zero based index of the menu item */ - virtual bool isItemChecked(u32 idx) const = 0; - - //! Removes a menu item - /** \param idx: Zero based index of the menu item */ - virtual void removeItem(u32 idx) = 0; - - //! Removes all menu items - virtual void removeAllItems() = 0; - - //! Get the selected item in the menu - /** \return Index of the selected item, -1 if none selected. */ - virtual s32 getSelectedItem() const = 0; - - //! Get the command id of a menu item - /** \param idx: Zero based index of the menu item */ - virtual s32 getItemCommandId(u32 idx) const = 0; - - //! Sets the command id of a menu item - /** \param idx: Zero based index of the menu item - \param id: Command id of menu item, a simple id you may - set to whatever you want. */ - virtual void setItemCommandId(u32 idx, s32 id) = 0; - - //! Get a pointer to the submenu of an item. - /** 0 is returned if there is no submenu - \param idx: Zero based index of the menu item - \return Returns a pointer to the submenu of an item. */ - virtual IGUIContextMenu* getSubMenu(u32 idx) const = 0; - - //! should the element change the checked status on clicking - virtual void setItemAutoChecking(u32 idx, bool autoChecking) = 0; - - //! does the element change the checked status on clicking - virtual bool getItemAutoChecking(u32 idx) const = 0; - - //! When an eventparent is set it receives events instead of the usual parent element - virtual void setEventParent(IGUIElement *parent) = 0; - }; - -} // end namespace gui -} // end namespace irr - -#endif - diff --git a/include/IGUIElement.h b/include/IGUIElement.h index 2efeb05c..9c4b6423 100644 --- a/include/IGUIElement.h +++ b/include/IGUIElement.h @@ -743,8 +743,7 @@ public: //! Returns the type name of the gui element. - /** This is needed serializing elements. For serializing your own elements, override this function - and return your own type name which is created by your IGUIElementFactory */ + /** This is needed serializing elements. */ virtual const c8* getTypeName() const { return GUIElementTypeNames[Type]; diff --git a/include/IGUIElementFactory.h b/include/IGUIElementFactory.h deleted file mode 100644 index a447c048..00000000 --- a/include/IGUIElementFactory.h +++ /dev/null @@ -1,66 +0,0 @@ -// 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 __I_GUI_ELEMENT_FACTORY_H_INCLUDED__ -#define __I_GUI_ELEMENT_FACTORY_H_INCLUDED__ - -#include "IReferenceCounted.h" -#include "EGUIElementTypes.h" - -namespace irr -{ - -namespace gui -{ - class IGUIElement; - - //! Interface making it possible to dynamically create GUI elements - /** To be able to add custom elements to Irrlicht and to make it possible for the - scene manager to save and load them, simply implement this interface and register it - in your gui environment via IGUIEnvironment::registerGUIElementFactory. - Note: When implementing your own element factory, don't call IGUIEnvironment::grab() to - increase the reference counter of the environment. This is not necessary because the - it will grab() the factory anyway, and otherwise cyclic references will be created. - */ - class IGUIElementFactory : public virtual IReferenceCounted - { - public: - - //! adds an element to the gui environment based on its type id - /** \param type: Type of the element to add. - \param parent: Parent scene node of the new element, can be null to add to the root. - \return Pointer to the new element or null if not successful. */ - virtual IGUIElement* addGUIElement(EGUI_ELEMENT_TYPE type, IGUIElement* parent=0) = 0; - - //! adds a GUI element to the GUI Environment based on its type name - /** \param typeName: Type name of the element to add. - \param parent: Parent scene node of the new element, can be null to add it to the root. - \return Pointer to the new element or null if not successful. */ - virtual IGUIElement* addGUIElement(const c8* typeName, IGUIElement* parent=0) = 0; - - //! Get amount of GUI element types this factory is able to create - virtual s32 getCreatableGUIElementTypeCount() const = 0; - - //! Get type of a creatable element type - /** \param idx: Index of the element type in this factory. Must be a value between 0 and - getCreatableGUIElementTypeCount() */ - virtual EGUI_ELEMENT_TYPE getCreateableGUIElementType(s32 idx) const = 0; - - //! Get type name of a creatable GUI element type by index - /** \param idx: Index of the type in this factory. Must be a value between 0 and - getCreatableGUIElementTypeCount() */ - virtual const c8* getCreateableGUIElementTypeName(s32 idx) const = 0; - - //! returns type name of a creatable GUI element - /** \param type: Type of GUI element. - \return Name of the type if this factory can create the type, otherwise 0. */ - virtual const c8* getCreateableGUIElementTypeName(EGUI_ELEMENT_TYPE type) const = 0; - }; - - -} // end namespace gui -} // end namespace irr - -#endif // __I_GUI_ELEMENT_FACTORY_H_INCLUDED__ - diff --git a/include/IGUIEnvironment.h b/include/IGUIEnvironment.h index f00a8f6b..40b73afd 100644 --- a/include/IGUIEnvironment.h +++ b/include/IGUIEnvironment.h @@ -8,7 +8,6 @@ #include "IReferenceCounted.h" #include "IGUISkin.h" #include "rect.h" -#include "EMessageBoxFlags.h" #include "EFocusFlags.h" #include "IEventReceiver.h" #include "path.h" @@ -38,27 +37,17 @@ class IGUIFont; class IGUISpriteBank; class IGUIScrollBar; class IGUIImage; -class IGUIMeshViewer; class IGUICheckBox; class IGUIListBox; -class IGUITreeView; class IGUIImageList; class IGUIFileOpenDialog; -class IGUIColorSelectDialog; -class IGUIInOutFader; class IGUIStaticText; class IGUIEditBox; -class IGUISpinBox; class IGUITabControl; class IGUITab; -class IGUITable; -class IGUIContextMenu; class IGUIComboBox; -class IGUIToolBar; class IGUIButton; class IGUIWindow; -class IGUIProfiler; -class IGUIElementFactory; //! GUI Environment. Used as factory and manager of all other GUI elements. /** \par This element can create the following events of type EGUI_EVENT_TYPE (which are passed on to focused sub-elements): @@ -235,55 +224,6 @@ public: virtual IGUIButton* addButton(const core::rect& rectangle, IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0, const wchar_t* tooltiptext = 0) = 0; - //! Adds an empty window element. - /** \param rectangle Rectangle specifying the borders of the window. - \param modal Defines if the dialog is modal. This means, that all other - gui elements which were created before the window cannot be used until - it is removed. - \param text Text displayed as the window title. - \param parent Parent gui element of the window. - \param id Id with which the gui element can be identified. - \return Pointer to the created window. Returns 0 if an error occurred. - This pointer should not be dropped. See IReferenceCounted::drop() for - more information. */ - virtual IGUIWindow* addWindow(const core::rect& rectangle, bool modal = false, - const wchar_t* text=0, IGUIElement* parent=0, s32 id=-1) = 0; - - //! Adds a modal screen. - /** Input focus stays with children of the modal screen. - If you have some window x which should keep the input focus you - do something like: addModalScreen()->addChild(x). And x will then get the focus - and not lose it anymore. - The modal screen removes itself when it no longer has any children. - Note that it usually works badly to pass the modal screen already as parent when creating - a new element. It's better to add that new element later to the modal screen with addChild. - \param parent Parent gui element of the modal. - \param blinkMode Bitset of when to blink (can be combined) - 0 = never - 1 = focus changes - 2 = Left mouse button pressed down - \return Pointer to the created modal. Returns 0 if an error occurred. - This pointer should not be dropped. See IReferenceCounted::drop() for - more information. */ - virtual IGUIElement* addModalScreen(IGUIElement* parent, int blinkMode = 3) = 0; - - //! Adds a message box. - /** \param caption Text to be displayed the title of the message box. - \param text Text to be displayed in the body of the message box. - \param modal Defines if the dialog is modal. This means, that all other - gui elements which were created before the message box cannot be used - until this messagebox is removed. - \param flags Flags specifying the layout of the message box using ::EMESSAGE_BOX_FLAG. - Create a message box with an OK and CANCEL button for example with (EMBF_OK | EMBF_CANCEL). - \param parent Parent gui element of the message box. - \param id Id with which the gui element can be identified. - \param image Optional texture which will be displayed beside the text as an image - \return Pointer to the created message box. Returns 0 if an error - occurred. This pointer should not be dropped. See - IReferenceCounted::drop() for more information. */ - virtual IGUIWindow* addMessageBox(const wchar_t* caption, const wchar_t* text=0, - bool modal = true, s32 flags = EMBF_OK, IGUIElement* parent=0, s32 id=-1, video::ITexture* image=0) = 0; - //! Adds a scrollbar. /** \param horizontal Specifies if the scroll bar is drawn horizontal or vertical. @@ -348,31 +288,6 @@ public: virtual IGUIListBox* addListBox(const core::rect& rectangle, IGUIElement* parent=0, s32 id=-1, bool drawBackground=false) = 0; - //! Adds a tree view element. - /** \param rectangle Position and dimension of list box. - \param parent Parent gui element of the list box. - \param id Id to identify the gui element. - \param drawBackground Flag whether the background should be drawn. - \param scrollBarVertical Flag whether a vertical scrollbar should be used - \param scrollBarHorizontal Flag whether a horizontal scrollbar should be used - \return Pointer to the created list box. Returns 0 if an error occurred. - This pointer should not be dropped. See IReferenceCounted::drop() for - more information. */ - virtual IGUITreeView* addTreeView(const core::rect& rectangle, - IGUIElement* parent=0, s32 id=-1, bool drawBackground=false, - bool scrollBarVertical = true, bool scrollBarHorizontal = false) = 0; - - //! Adds a mesh viewer. Not 100% implemented yet. - /** \param rectangle Rectangle specifying the borders of the mesh viewer. - \param parent Parent gui element of the mesh viewer. - \param id Id to identify the gui element. - \param text Title text of the mesh viewer. - \return Pointer to the created mesh viewer. Returns 0 if an error - occurred. This pointer should not be dropped. See - IReferenceCounted::drop() for more information. */ - virtual IGUIMeshViewer* addMeshViewer(const core::rect& rectangle, - IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0) = 0; - //! Adds a file open dialog. /** \param title Text to be displayed as the title of the dialog. \param modal Defines if the dialog is modal. This means, that all other @@ -391,19 +306,6 @@ public: bool modal=true, IGUIElement* parent=0, s32 id=-1, bool restoreCWD=false, io::path::char_type* startDir=0) = 0; - //! Adds a color select dialog. - /** \param title The title of the dialog. - \param modal Defines if the dialog is modal. This means, that all other - gui elements which were created before the dialog cannot be used - until it is removed. - \param parent The parent of the dialog. - \param id The ID of the dialog. - \return Pointer to the created file open dialog. Returns 0 if an error - occurred. This pointer should not be dropped. See - IReferenceCounted::drop() for more information. */ - virtual IGUIColorSelectDialog* addColorSelectDialog(const wchar_t* title = 0, - bool modal=true, IGUIElement* parent=0, s32 id=-1) = 0; - //! Adds a static text. /** \param text Text to be displayed. Can be altered after creation by SetText(). \param rectangle Rectangle specifying the borders of the static text @@ -438,30 +340,6 @@ public: virtual IGUIEditBox* addEditBox(const wchar_t* text, const core::rect& rectangle, bool border=true, IGUIElement* parent=0, s32 id=-1) = 0; - //! Adds a spin box. - /** An edit box with up and down buttons - \param text Text to be displayed. Can be altered after creation by setText(). - \param rectangle Rectangle specifying the borders of the spin box. - \param border Set to true if the spin box should have a 3d border. - \param parent Parent item of the element, e.g. a window. - Set it to 0 to place the spin box directly in the environment. - \param id The ID of the element. - \return Pointer to the created spin box. Returns 0 if an error occurred. - This pointer should not be dropped. See IReferenceCounted::drop() for - more information. */ - virtual IGUISpinBox* addSpinBox(const wchar_t* text, const core::rect& rectangle, - bool border=true,IGUIElement* parent=0, s32 id=-1) = 0; - - //! Adds an element for fading in or out. - /** \param rectangle Rectangle specifying the borders of the fader. - If the pointer is NULL, the whole screen is used. - \param parent Parent item of the element, e.g. a window. - \param id An identifier for the fader. - \return Pointer to the created in-out-fader. Returns 0 if an error - occurred. This pointer should not be dropped. See - IReferenceCounted::drop() for more information. */ - virtual IGUIInOutFader* addInOutFader(const core::rect* rectangle=0, IGUIElement* parent=0, s32 id=-1) = 0; - //! Adds a tab control to the environment. /** \param rectangle Rectangle specifying the borders of the tab control. \param parent Parent item of the element, e.g. a window. @@ -493,40 +371,6 @@ public: virtual IGUITab* addTab(const core::rect& rectangle, IGUIElement* parent=0, s32 id=-1) = 0; - //! Adds a context menu to the environment. - /** \param rectangle Rectangle specifying the borders of the menu. - Note that the menu is resizing itself based on what items you add. - \param parent Parent item of the element, e.g. a window. - Set it to 0 to place the menu directly in the environment. - \param id An identifier for the menu. - \return Pointer to the created context menu. Returns 0 if an - error occurred. This pointer should not be dropped. See - IReferenceCounted::drop() for more information. */ - virtual IGUIContextMenu* addContextMenu(const core::rect& rectangle, - IGUIElement* parent=0, s32 id=-1) = 0; - - //! Adds a menu to the environment. - /** This is like the menu you can find on top of most windows in modern - graphical user interfaces. - \param parent Parent item of the element, e.g. a window. - Set it to 0 to place the menu directly in the environment. - \param id An identifier for the menu. - \return Pointer to the created menu. Returns 0 if an - error occurred. This pointer should not be dropped. See - IReferenceCounted::drop() for more information. */ - virtual IGUIContextMenu* addMenu(IGUIElement* parent=0, s32 id=-1) = 0; - - //! Adds a toolbar to the environment. - /** It is like a menu that is always placed on top of its parent, and - contains buttons. - \param parent Parent item of the element, e.g. a window. - Set it to 0 to place the tool bar directly in the environment. - \param id An identifier for the tool bar. - \return Pointer to the created tool bar. Returns 0 if an - error occurred. This pointer should not be dropped. See - IReferenceCounted::drop() for more information. */ - virtual IGUIToolBar* addToolBar(IGUIElement* parent=0, s32 id=-1) = 0; - //! Adds a combo box to the environment. /** \param rectangle Rectangle specifying the borders of the combo box. \param parent Parent item of the element, e.g. a window. @@ -538,86 +382,6 @@ public: virtual IGUIComboBox* addComboBox(const core::rect& rectangle, IGUIElement* parent=0, s32 id=-1) = 0; - //! Adds a table to the environment - /** \param rectangle Rectangle specifying the borders of the table. - \param parent Parent item of the element, e.g. a window. Set it to 0 - to place the element directly in the environment. - \param id An identifier for the table. - \param drawBackground Flag whether the background should be drawn. - \return Pointer to the created table. Returns 0 if an error occurred. - This pointer should not be dropped. See IReferenceCounted::drop() for - more information. */ - virtual IGUITable* addTable(const core::rect& rectangle, - IGUIElement* parent=0, s32 id=-1, bool drawBackground=false) =0; - - //! Adds an element to display the information from the Irrlicht profiler - /** \param rectangle Rectangle specifying the borders of the element. - \param parent Parent of the element. When 0 the environment itself will - be the parent. - \param id An identifier for the element. */ - virtual IGUIProfiler* addProfilerDisplay(const core::rect& rectangle, - IGUIElement* parent=0, s32 id=-1) = 0; - - //! Get the default element factory which can create all built-in elements - /** \return Pointer to the factory. - This pointer should not be dropped. See IReferenceCounted::drop() for - more information. */ - virtual IGUIElementFactory* getDefaultGUIElementFactory() const = 0; - - //! Adds an element factory to the gui environment. - /** Use this to extend the gui environment with new element types which - it should be able to create automatically, for example when loading - data from xml files. - \param factoryToAdd Pointer to new factory. */ - virtual void registerGUIElementFactory(IGUIElementFactory* factoryToAdd) = 0; - - //! Get amount of registered gui element factories. - /** \return Amount of registered gui element factories. */ - virtual u32 getRegisteredGUIElementFactoryCount() const = 0; - - //! Get a gui element factory by index - /** \param index Index of the factory. - \return Factory at given index, or 0 if no such factory exists. */ - virtual IGUIElementFactory* getGUIElementFactory(u32 index) const = 0; - - //! Adds a GUI element by its name - /** Each factory is checked if it can create an element of the given - name. The first match will be created. - \param elementName Name of the element to be created. - \param parent Parent of the new element, if not 0. - \return New GUI element, or 0 if no such element exists. */ - virtual IGUIElement* addGUIElement(const c8* elementName, IGUIElement* parent=0) = 0; - - //! Saves the current gui into a file. - /** \param filename Name of the file. - \param start The GUIElement to start with. Root if 0. - \return True if saving succeeded, else false. */ - virtual bool saveGUI(const io::path& filename, IGUIElement* start=0) = 0; - - //! Saves the current gui into a file. - /** \param file The file to write to. - \param start The GUIElement to start with. Root if 0. - \return True if saving succeeded, else false. */ - virtual bool saveGUI(io::IWriteFile* file, IGUIElement* start=0) = 0; - - //! Loads the gui. Note that the current gui is not cleared before. - /** When a parent is set the elements will be added below the parent, the parent itself does not deserialize. - When the file contains skin-settings from the gui-environment those are always serialized into the - guienvironment independent of the parent setting. - \param filename Name of the file. - \param parent Parent for the loaded GUI, root if 0. - \return True if loading succeeded, else false. */ - virtual bool loadGUI(const io::path& filename, IGUIElement* parent=0) = 0; - - //! Loads the gui. Note that the current gui is not cleared before. - /** When a parent is set the elements will be added below the parent, the parent itself does not deserialize. - When the file contains skin-settings from the gui-environment those are always serialized into the - guienvironment independent of the parent setting. - \param file The file to load from. - \param parent Parent for the loaded GUI, root if 0. - \return True if loading succeeded, else false. */ - virtual bool loadGUI(io::IReadFile* file, IGUIElement* parent=0) = 0; - //! Find the next element which would be selected when pressing the tab-key /** If you set the focus for the result you can manually force focus-changes like they would happen otherwise by the tab-keys. diff --git a/include/IGUIInOutFader.h b/include/IGUIInOutFader.h deleted file mode 100644 index a89f615f..00000000 --- a/include/IGUIInOutFader.h +++ /dev/null @@ -1,67 +0,0 @@ -// 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 __I_GUI_IN_OUT_FADER_H_INCLUDED__ -#define __I_GUI_IN_OUT_FADER_H_INCLUDED__ - -#include "IGUIElement.h" -#include "SColor.h" - -namespace irr -{ -namespace gui -{ - - //! Element for fading out or in - /** Here is a small example on how the class is used. In this example we fade - in from a total red screen in the beginning. As you can see, the fader is not - only useful for dramatic in and out fading, but also to show that the player - is hit in a first person shooter game for example. - \code - gui::IGUIInOutFader* fader = device->getGUIEnvironment()->addInOutFader(); - fader->setColor(video::SColor(0,255,0,0)); - fader->fadeIn(4000); - \endcode - */ - class IGUIInOutFader : public IGUIElement - { - public: - - //! constructor - IGUIInOutFader(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle) - : IGUIElement(EGUIET_IN_OUT_FADER, environment, parent, id, rectangle) {} - - //! Gets the color to fade out to or to fade in from. - virtual video::SColor getColor() const = 0; - - //! Sets the color to fade out to or to fade in from. - /** \param color: Color to where it is faded out od from it is faded in. */ - virtual void setColor(video::SColor color) = 0; - virtual void setColor(video::SColor source, video::SColor dest) = 0; - - //! Starts the fade in process. - /** In the beginning the whole rect is drawn by the set color - (black by default) and at the end of the overgiven time the - color has faded out. - \param time: Time specifying how long it should need to fade in, - in milliseconds. */ - virtual void fadeIn(u32 time) = 0; - - //! Starts the fade out process. - /** In the beginning everything is visible, and at the end of - the time only the set color (black by the fault) will be drawn. - \param time: Time specifying how long it should need to fade out, - in milliseconds. */ - virtual void fadeOut(u32 time) = 0; - - //! Returns if the fade in or out process is done. - virtual bool isReady() const = 0; - }; - - -} // end namespace gui -} // end namespace irr - -#endif - diff --git a/include/IGUIMeshViewer.h b/include/IGUIMeshViewer.h deleted file mode 100644 index 3255f4ed..00000000 --- a/include/IGUIMeshViewer.h +++ /dev/null @@ -1,53 +0,0 @@ -// 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 __I_GUI_MESH_VIEWER_H_INCLUDED__ -#define __I_GUI_MESH_VIEWER_H_INCLUDED__ - -#include "IGUIElement.h" - -namespace irr -{ - -namespace video -{ - class SMaterial; -} // end namespace video - -namespace scene -{ - class IAnimatedMesh; -} // end namespace scene - -namespace gui -{ - - //! 3d mesh viewing GUI element. - class IGUIMeshViewer : public IGUIElement - { - public: - - //! constructor - IGUIMeshViewer(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle) - : IGUIElement(EGUIET_MESH_VIEWER, environment, parent, id, rectangle) {} - - //! Sets the mesh to be shown - virtual void setMesh(scene::IAnimatedMesh* mesh) = 0; - - //! Gets the displayed mesh - virtual scene::IAnimatedMesh* getMesh() const = 0; - - //! Sets the material - virtual void setMaterial(const video::SMaterial& material) = 0; - - //! Gets the material - virtual const video::SMaterial& getMaterial() const = 0; - }; - - -} // end namespace gui -} // end namespace irr - -#endif - diff --git a/include/IGUIProfiler.h b/include/IGUIProfiler.h deleted file mode 100644 index 995899c1..00000000 --- a/include/IGUIProfiler.h +++ /dev/null @@ -1,82 +0,0 @@ -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h -// Written by Michael Zeilfelder - -#ifndef I_GUI_PROFILER_H_INCLUDED__ -#define I_GUI_PROFILER_H_INCLUDED__ - -#include "IGUIElement.h" - -namespace irr -{ -class IProfiler; - -namespace gui -{ - class IGUIFont; - - //! Element to display profiler information - class IGUIProfiler : public IGUIElement - { - public: - //! constructor - /** \param profiler You can pass a custom profiler, but typically you can pass 0 in which cases it takes the global profiler from Irrlicht */ - IGUIProfiler(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle, IProfiler* profiler = NULL) - : IGUIElement(EGUIET_PROFILER, environment, parent, id, rectangle) - {} - - //! Show first page of profile data - /** \param includeOverview When true show the group-overview page, when false show the profile data of the first group */ - virtual void firstPage(bool includeOverview=true) = 0; - - //! Show next page of profile data - /** \param includeOverview Include the group-overview page */ - virtual void nextPage(bool includeOverview=true) = 0; - - //! Show previous page of profile data - /** \param includeOverview Include the group-overview page */ - virtual void previousPage(bool includeOverview=true) = 0; - - //! Try to show as many group-pages together as possible instead of showing at most one group per page. - /** \param groupsTogether When true show several groups on one page, when false show max. one group per page. Default is false. */ - virtual void setShowGroupsTogether(bool groupsTogether) = 0; - - //! Can several groups be displayed per page? - virtual bool getShowGroupsTogether() const = 0; - - //! Sets another skin independent font. - /** If this is set to zero, the button uses the font of the skin. - \param font: New font to set. */ - virtual void setOverrideFont(IGUIFont* font=0) = 0; - - //! Gets the override font (if any) - /** \return The override font (may be 0) */ - virtual IGUIFont* getOverrideFont(void) const = 0; - - //! Get the font which is used right now for drawing - /** Currently this is the override font when one is set and the - font of the active skin otherwise */ - virtual IGUIFont* getActiveFont() const = 0; - - //! Sets whether to draw the background. By default disabled, - virtual void setDrawBackground(bool draw) = 0; - - //! Checks if background drawing is enabled - /** \return true if background drawing is enabled, false otherwise */ - virtual bool isDrawBackgroundEnabled() const = 0; - - //! Allows to freeze updates which makes it easier to read the numbers - /** Numbers are updated once when you switch pages. */ - virtual void setFrozen(bool freeze) = 0; - - //! Are updates currently frozen - virtual bool getFrozen() const = 0; - - //! Filters prevents data that doesn't achieve the conditions from being displayed - virtual void setFilters(irr::u32 minCalls = 0, irr::u32 minTimeSum = 0, irr::f32 minTimeAverage = 0.f, irr::u32 minTimeMax = 0) = 0; - }; - -} // end namespace gui -} // end namespace irr - -#endif diff --git a/include/IGUISpinBox.h b/include/IGUISpinBox.h deleted file mode 100644 index 1c647627..00000000 --- a/include/IGUISpinBox.h +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (C) 2006-2012 Michael Zeilfelder -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_GUI_SPIN_BOX_H_INCLUDED__ -#define __I_GUI_SPIN_BOX_H_INCLUDED__ - -#include "IGUIElement.h" - -namespace irr -{ -namespace gui -{ - class IGUIEditBox; - - //! Enumeration bitflag for when to validate the text typed into the spinbox - //! Default used by Irrlicht is: (EGUI_SBV_ENTER|EGUI_SBV_LOSE_FOCUS) - enum EGUI_SPINBOX_VALIDATION - { - //! Does not validate typed text, probably a bad idea setting this usually. - EGUI_SBV_NEVER = 0, - //! Validate on each change. Was default up to Irrlicht 1.8 - EGUI_SBV_CHANGE = 1, - //! Validate when enter was pressed - EGUI_SBV_ENTER = 2, - //! Validate when the editbox loses the focus - EGUI_SBV_LOSE_FOCUS = 4 - }; - - - //! Single line edit box + spin buttons - /** \par This element can create the following events of type EGUI_EVENT_TYPE: - \li EGET_SPINBOX_CHANGED - */ - class IGUISpinBox : public IGUIElement - { - public: - - //! constructor - IGUISpinBox(IGUIEnvironment* environment, IGUIElement* parent, - s32 id, core::rect rectangle) - : IGUIElement(EGUIET_SPIN_BOX, environment, parent, id, rectangle) {} - - //! Access the edit box used in the spin control - virtual IGUIEditBox* getEditBox() const = 0; - - //! set the current value of the spinbox - /** \param val: value to be set in the spinbox */ - virtual void setValue(f32 val) = 0; - - //! Get the current value of the spinbox - virtual f32 getValue() const = 0; - - //! set the range of values which can be used in the spinbox - /** \param min: minimum value - \param max: maximum value */ - virtual void setRange(f32 min, f32 max) = 0; - - //! get the minimum value which can be used in the spinbox - virtual f32 getMin() const = 0; - - //! get the maximum value which can be used in the spinbox - virtual f32 getMax() const = 0; - - //! Step size by which values are changed when pressing the spinbuttons - /** The step size also determines the number of decimal places to display - \param step: stepsize used for value changes when pressing spinbuttons */ - virtual void setStepSize(f32 step=1.f) = 0; - - //! Sets the number of decimal places to display. - //! Note that this also rounds the range to the same number of decimal places. - /** \param places: The number of decimal places to display, use -1 to reset */ - virtual void setDecimalPlaces(s32 places) = 0; - - //! get the current step size - virtual f32 getStepSize() const = 0; - - //! Sets when the spinbox has to validate entered text. - /** \param validateOn Can be any combination of EGUI_SPINBOX_VALIDATION bit flags */ - virtual void setValidateOn(u32 validateOn) = 0; - - //! Gets when the spinbox has to validate entered text. - /** \return A combination of EGUI_SPINBOX_VALIDATION bit flags */ - virtual u32 getValidateOn() const = 0; - }; - - -} // end namespace gui -} // end namespace irr - -#endif // __I_GUI_SPIN_BOX_H_INCLUDED__ - diff --git a/include/IGUITable.h b/include/IGUITable.h deleted file mode 100644 index ea3afccc..00000000 --- a/include/IGUITable.h +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright (C) 2003-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_GUI_TABLE_H_INCLUDED__ -#define __I_GUI_TABLE_H_INCLUDED__ - -#include "IGUIElement.h" -#include "SColor.h" - -namespace irr -{ -namespace gui -{ - class IGUIFont; - class IGUIScrollBar; - - //! modes for ordering used when a column header is clicked - enum EGUI_COLUMN_ORDERING - { - //! Do not use ordering - EGCO_NONE, - - //! Send a EGET_TABLE_HEADER_CHANGED message when a column header is clicked. - EGCO_CUSTOM, - - //! Sort it ascending by it's ascii value like: a,b,c,... - EGCO_ASCENDING, - - //! Sort it descending by it's ascii value like: z,x,y,... - EGCO_DESCENDING, - - //! Sort it ascending on first click, descending on next, etc - EGCO_FLIP_ASCENDING_DESCENDING, - - //! Not used as mode, only to get maximum value for this enum - EGCO_COUNT - }; - - //! Names for EGUI_COLUMN_ORDERING types - const c8* const GUIColumnOrderingNames[] = - { - "none", - "custom", - "ascend", - "descend", - "ascend_descend", - 0, - }; - - enum EGUI_ORDERING_MODE - { - //! No element ordering - EGOM_NONE, - - //! Elements are ordered from the smallest to the largest. - EGOM_ASCENDING, - - //! Elements are ordered from the largest to the smallest. - EGOM_DESCENDING, - - //! this value is not used, it only specifies the amount of default ordering types - //! available. - EGOM_COUNT - }; - - const c8* const GUIOrderingModeNames[] = - { - "none", - "ascending", - "descending", - 0 - }; - - enum EGUI_TABLE_DRAW_FLAGS - { - EGTDF_ROWS = 1, - EGTDF_COLUMNS = 2, - EGTDF_ACTIVE_ROW = 4, - EGTDF_COUNT - }; - - //! Default list box GUI element. - /** \par This element can create the following events of type EGUI_EVENT_TYPE: - \li EGET_TABLE_CHANGED - \li EGET_TABLE_SELECTED_AGAIN - \li EGET_TABLE_HEADER_CHANGED - */ - class IGUITable : public IGUIElement - { - public: - //! constructor - IGUITable(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle) - : IGUIElement(EGUIET_TABLE, environment, parent, id, rectangle) {} - - //! Adds a column - /** If columnIndex is outside the current range, do push new column at the end */ - virtual void addColumn(const wchar_t* caption, s32 columnIndex=-1) = 0; - - //! remove a column from the table - virtual void removeColumn(u32 columnIndex) = 0; - - //! Returns the number of columns in the table control - virtual s32 getColumnCount() const = 0; - - //! Makes a column active. This will trigger an ordering process. - /** \param idx: The id of the column to make active or a negative number to make non active. - \param doOrder: Do also the ordering which depending on mode for active column - \return True when the column could be set active (aka - it did exist). */ - virtual bool setActiveColumn(s32 idx, bool doOrder=false) = 0; - - //! Returns which header is currently active - virtual s32 getActiveColumn() const = 0; - - //! Returns the ordering used by the currently active column - virtual EGUI_ORDERING_MODE getActiveColumnOrdering() const = 0; - - //! Set the width of a column - virtual void setColumnWidth(u32 columnIndex, u32 width) = 0; - - //! Get the width of a column - virtual u32 getColumnWidth(u32 columnIndex) const = 0; - - //! columns can be resized by drag 'n drop - virtual void setResizableColumns(bool resizable) = 0; - - //! can columns be resized by drag 'n drop? - virtual bool hasResizableColumns() const = 0; - - //! This tells the table control which ordering mode should be used when a column header is clicked. - /** \param columnIndex The index of the column header. - \param mode: One of the modes defined in EGUI_COLUMN_ORDERING */ - virtual void setColumnOrdering(u32 columnIndex, EGUI_COLUMN_ORDERING mode) = 0; - - //! Returns which row is currently selected - virtual s32 getSelected() const = 0; - - //! set which row is currently selected - virtual void setSelected( s32 index ) = 0; - - //! Get amount of rows in the tabcontrol - virtual s32 getRowCount() const = 0; - - //! adds a row to the table - /** \param rowIndex Zero based index of rows. The row will be - inserted at this position, if a row already exist there, it - will be placed after it. If the row is larger than the actual - number of row by more than one, it won't be created. Note that - if you create a row that's not at the end, there might be - performance issues. - \return index of inserted row. */ - virtual u32 addRow(u32 rowIndex) = 0; - - //! Remove a row from the table - virtual void removeRow(u32 rowIndex) = 0; - - //! clears the table rows, but keeps the columns intact - virtual void clearRows() = 0; - - //! Swap two row positions. - virtual void swapRows(u32 rowIndexA, u32 rowIndexB) = 0; - - //! This tells the table to start ordering all the rows. - /** You need to explicitly tell the table to re order the rows - when a new row is added or the cells data is changed. This - makes the system more flexible and doesn't make you pay the - cost of ordering when adding a lot of rows. - \param columnIndex: When set to -1 the active column is used. - \param mode Ordering mode of the rows. */ - virtual void orderRows(s32 columnIndex=-1, EGUI_ORDERING_MODE mode=EGOM_NONE) = 0; - - //! Set the text of a cell - virtual void setCellText(u32 rowIndex, u32 columnIndex, const core::stringw& text) = 0; - - //! Set the text of a cell, and set a color of this cell. - virtual void setCellText(u32 rowIndex, u32 columnIndex, const core::stringw& text, video::SColor color) = 0; - - //! Set the data of a cell - virtual void setCellData(u32 rowIndex, u32 columnIndex, void *data) = 0; - - //! Set the color of a cell text - virtual void setCellColor(u32 rowIndex, u32 columnIndex, video::SColor color) = 0; - - //! Get the text of a cell - virtual const wchar_t* getCellText(u32 rowIndex, u32 columnIndex ) const = 0; - - //! Get the data of a cell - virtual void* getCellData(u32 rowIndex, u32 columnIndex ) const = 0; - - //! clears the table, deletes all items in the table - virtual void clear() = 0; - - //! Set flags, as defined in ::EGUI_TABLE_DRAW_FLAGS, which influence the layout - virtual void setDrawFlags(s32 flags) = 0; - - //! Get the flags, as defined in ::EGUI_TABLE_DRAW_FLAGS, which influence the layout - virtual s32 getDrawFlags() const = 0; - - //! Sets another skin independent font. - /** If this is set to zero, the button uses the font of the skin. - \param font: New font to set. */ - virtual void setOverrideFont(IGUIFont* font=0) = 0; - - //! Gets the override font (if any) - /** \return The override font (may be 0) */ - virtual IGUIFont* getOverrideFont(void) const = 0; - - //! Get the font which is used right now for drawing - /** Currently this is the override font when one is set and the - font of the active skin otherwise */ - virtual IGUIFont* getActiveFont() const = 0; - - //! Get the height of items/rows - virtual s32 getItemHeight() const = 0; - - //! Access the vertical scrollbar - virtual IGUIScrollBar* getVerticalScrollBar() const = 0; - - //! Access the horizontal scrollbar - virtual IGUIScrollBar* getHorizontalScrollBar() const = 0; - - //! Sets whether to draw the background. - virtual void setDrawBackground(bool draw) = 0; - - //! Checks if background drawing is enabled - /** \return true if background drawing is enabled, false otherwise */ - virtual bool isDrawBackgroundEnabled() const = 0; - }; - - -} // end namespace gui -} // end namespace irr - -#endif - diff --git a/include/IGUITreeView.h b/include/IGUITreeView.h deleted file mode 100644 index 8bcd824d..00000000 --- a/include/IGUITreeView.h +++ /dev/null @@ -1,298 +0,0 @@ -// written by Reinhard Ostermeier, reinhard@nospam.r-ostermeier.de -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __I_GUI_TREE_VIEW_H_INCLUDED__ -#define __I_GUI_TREE_VIEW_H_INCLUDED__ - -#include "IGUIElement.h" -#include "IGUIImageList.h" -#include "irrTypes.h" - -namespace irr -{ -namespace gui -{ - class IGUIFont; - class IGUITreeView; - class IGUIScrollBar; - - - //! Node for gui tree view - /** \par This element can create the following events of type EGUI_EVENT_TYPE: - \li EGET_TREEVIEW_NODE_EXPAND - \li EGET_TREEVIEW_NODE_COLLAPS - \li EGET_TREEVIEW_NODE_DESELECT - \li EGET_TREEVIEW_NODE_SELECT - */ - class IGUITreeViewNode : public IReferenceCounted - { - public: - //! returns the owner (tree view) of this node - virtual IGUITreeView* getOwner() const = 0; - - //! Returns the parent node of this node. - /** For the root node this will return 0. */ - virtual IGUITreeViewNode* getParent() const = 0; - - //! returns the text of the node - virtual const wchar_t* getText() const = 0; - - //! sets the text of the node - virtual void setText( const wchar_t* text ) = 0; - - //! returns the icon text of the node - virtual const wchar_t* getIcon() const = 0; - - //! sets the icon text of the node - virtual void setIcon( const wchar_t* icon ) = 0; - - //! returns the image index of the node - virtual u32 getImageIndex() const = 0; - - //! sets the image index of the node - virtual void setImageIndex( u32 imageIndex ) = 0; - - //! returns the image index of the node - virtual u32 getSelectedImageIndex() const = 0; - - //! sets the image index of the node - virtual void setSelectedImageIndex( u32 imageIndex ) = 0; - - //! returns the user data (void*) of this node - virtual void* getData() const = 0; - - //! sets the user data (void*) of this node - virtual void setData( void* data ) = 0; - - //! returns the user data2 (IReferenceCounted) of this node - virtual IReferenceCounted* getData2() const = 0; - - //! sets the user data2 (IReferenceCounted) of this node - virtual void setData2( IReferenceCounted* data ) = 0; - - //! returns the child item count - virtual u32 getChildCount() const = 0; - - //! removes all children (recursive) from this node - virtual void clearChildren() = 0; - - //! removes all children (recursive) from this node - /** \deprecated Deprecated in 1.8, use clearChildren() instead. - This method may be removed by Irrlicht 1.9 */ - _IRR_DEPRECATED_ void clearChilds() - { - return clearChildren(); - } - - //! returns true if this node has child nodes - virtual bool hasChildren() const = 0; - - //! returns true if this node has child nodes - /** \deprecated Deprecated in 1.8, use hasChildren() instead. - This method may be removed by Irrlicht 1.9 */ - _IRR_DEPRECATED_ bool hasChilds() const - { - return hasChildren(); - } - - //! Adds a new node behind the last child node. - /** \param text text of the new node - \param icon icon text of the new node - \param imageIndex index of the image for the new node (-1 = none) - \param selectedImageIndex index of the selected image for the new node (-1 = same as imageIndex) - \param data user data (void*) of the new node - \param data2 user data2 (IReferenceCounted*) of the new node - \return The new node - */ - virtual IGUITreeViewNode* addChildBack( - const wchar_t* text, const wchar_t* icon = 0, - s32 imageIndex=-1, s32 selectedImageIndex=-1, - void* data=0, IReferenceCounted* data2=0) =0; - - //! Adds a new node before the first child node. - /** \param text text of the new node - \param icon icon text of the new node - \param imageIndex index of the image for the new node (-1 = none) - \param selectedImageIndex index of the selected image for the new node (-1 = same as imageIndex) - \param data user data (void*) of the new node - \param data2 user data2 (IReferenceCounted*) of the new node - \return The new node - */ - virtual IGUITreeViewNode* addChildFront( - const wchar_t* text, const wchar_t* icon = 0, - s32 imageIndex=-1, s32 selectedImageIndex=-1, - void* data=0, IReferenceCounted* data2=0 ) =0; - - //! Adds a new node behind the other node. - /** The other node has also to be a child node from this node. - \param other Node to insert after - \param text text of the new node - \param icon icon text of the new node - \param imageIndex index of the image for the new node (-1 = none) - \param selectedImageIndex index of the selected image for the new node (-1 = same as imageIndex) - \param data user data (void*) of the new node - \param data2 user data2 (IReferenceCounted*) of the new node - \return The new node or 0 if other is no child node from this - */ - virtual IGUITreeViewNode* insertChildAfter( - IGUITreeViewNode* other, - const wchar_t* text, const wchar_t* icon = 0, - s32 imageIndex=-1, s32 selectedImageIndex=-1, - void* data=0, IReferenceCounted* data2=0) =0; - - //! Adds a new node before the other node. - /** The other node has also to be a child node from this node. - \param other Node to insert before - \param text text of the new node - \param icon icon text of the new node - \param imageIndex index of the image for the new node (-1 = none) - \param selectedImageIndex index of the selected image for the new node (-1 = same as imageIndex) - \param data user data (void*) of the new node - \param data2 user data2 (IReferenceCounted*) of the new node - \return The new node or 0 if other is no child node from this - */ - virtual IGUITreeViewNode* insertChildBefore( - IGUITreeViewNode* other, - const wchar_t* text, const wchar_t* icon = 0, - s32 imageIndex=-1, s32 selectedImageIndex=-1, - void* data=0, IReferenceCounted* data2=0) = 0; - - //! Return the first child node from this node. - /** \return The first child node or 0 if this node has no children. */ - virtual IGUITreeViewNode* getFirstChild() const = 0; - - //! Return the last child node from this node. - /** \return The last child node or 0 if this node has no children. */ - virtual IGUITreeViewNode* getLastChild() const = 0; - - //! Returns the previous sibling node from this node. - /** \return The previous sibling node from this node or 0 if this is - the first node from the parent node. - */ - virtual IGUITreeViewNode* getPrevSibling() const = 0; - - //! Returns the next sibling node from this node. - /** \return The next sibling node from this node or 0 if this is - the last node from the parent node. - */ - virtual IGUITreeViewNode* getNextSibling() const = 0; - - //! Returns the next visible (expanded, may be out of scrolling) node from this node. - /** \return The next visible node from this node or 0 if this is - the last visible node. */ - virtual IGUITreeViewNode* getNextVisible() const = 0; - - //! Deletes a child node. - /** \return Returns true if the node was found as a child and is deleted. */ - virtual bool deleteChild( IGUITreeViewNode* child ) = 0; - - //! Moves a child node one position up. - /** \return True if the node was found as a child node and was not already the first child. */ - virtual bool moveChildUp( IGUITreeViewNode* child ) = 0; - - //! Moves a child node one position down. - /** \return True if the node was found as a child node and was not already the last child. */ - virtual bool moveChildDown( IGUITreeViewNode* child ) = 0; - - //! Returns true if the node is expanded (children are visible). - virtual bool getExpanded() const = 0; - - //! Sets if the node is expanded. - virtual void setExpanded( bool expanded ) = 0; - - //! Returns true if the node is currently selected. - virtual bool getSelected() const = 0; - - //! Sets this node as selected. - virtual void setSelected( bool selected ) = 0; - - //! Returns true if this node is the root node. - virtual bool isRoot() const = 0; - - //! Returns the level of this node. - /** The root node has level 0. Direct children of the root has level 1 ... */ - virtual s32 getLevel() const = 0; - - //! Returns true if this node is visible (all parents are expanded). - virtual bool isVisible() const = 0; - }; - - - //! Default tree view GUI element. - /** Displays a windows like tree buttons to expand/collapse the child - nodes of an node and optional tree lines. Each node consists of an - text, an icon text and a void pointer for user data. */ - class IGUITreeView : public IGUIElement - { - public: - //! constructor - IGUITreeView(IGUIEnvironment* environment, IGUIElement* parent, - s32 id, core::rect rectangle) - : IGUIElement( EGUIET_TREE_VIEW, environment, parent, id, rectangle ) {} - - //! returns the root node (not visible) from the tree. - virtual IGUITreeViewNode* getRoot() const = 0; - - //! returns the selected node of the tree or 0 if none is selected - virtual IGUITreeViewNode* getSelected() const = 0; - - //! returns true if the tree lines are visible - virtual bool getLinesVisible() const = 0; - - //! sets if the tree lines are visible - /** \param visible true for visible, false for invisible */ - virtual void setLinesVisible( bool visible ) = 0; - - //! Sets the font which should be used as icon font. - /** This font is set to the Irrlicht engine built-in-font by - default. Icons can be displayed in front of every list item. - An icon is a string, displayed with the icon font. When using - the build-in-font of the Irrlicht engine as icon font, the icon - strings defined in GUIIcons.h can be used. - */ - virtual void setIconFont( IGUIFont* font ) = 0; - - //! Sets a skin independent font. - /** \param font: New font to set or 0 to use the skin-font. */ - virtual void setOverrideFont(IGUIFont* font=0) = 0; - - //! Gets the override font (if any) - /** \return The override font (may be 0) */ - virtual IGUIFont* getOverrideFont(void) const = 0; - - //! Get the font which is used for drawing - /** This is the override font when one is set and the - font of the skin otherwise. */ - virtual IGUIFont* getActiveFont() const = 0; - - //! Sets the image list which should be used for the image and selected image of every node. - /** The default is 0 (no images). */ - virtual void setImageList( IGUIImageList* imageList ) = 0; - - //! Returns the image list which is used for the nodes. - virtual IGUIImageList* getImageList() const = 0; - - //! Sets if the image is left of the icon. Default is true. - virtual void setImageLeftOfIcon( bool bLeftOf ) = 0; - - //! Returns if the Image is left of the icon. Default is true. - virtual bool getImageLeftOfIcon() const = 0; - - //! Returns the node which is associated to the last event. - /** This pointer is only valid inside the OnEvent call! */ - virtual IGUITreeViewNode* getLastEventNode() const = 0; - - //! Access the vertical scrollbar - virtual IGUIScrollBar* getVerticalScrollBar() const = 0; - - //! Access the horizontal scrollbar - virtual IGUIScrollBar* getHorizontalScrollBar() const = 0; - }; - - -} // end namespace gui -} // end namespace irr - -#endif - diff --git a/include/IGUIWindow.h b/include/IGUIWindow.h deleted file mode 100644 index 60349d67..00000000 --- a/include/IGUIWindow.h +++ /dev/null @@ -1,74 +0,0 @@ -// 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 __I_GUI_WINDOW_H_INCLUDED__ -#define __I_GUI_WINDOW_H_INCLUDED__ - -#include "IGUIElement.h" -#include "EMessageBoxFlags.h" - -namespace irr -{ -namespace gui -{ - class IGUIButton; - - //! Default moveable window GUI element with border, caption and close icons. - /** \par This element can create the following events of type EGUI_EVENT_TYPE: - \li EGET_ELEMENT_CLOSED - */ - class IGUIWindow : public IGUIElement - { - public: - - //! constructor - IGUIWindow(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle) - : IGUIElement(EGUIET_WINDOW, environment, parent, id, rectangle) {} - - //! Returns pointer to the close button - /** You can hide the button by calling setVisible(false) on the result. */ - virtual IGUIButton* getCloseButton() const = 0; - - //! Returns pointer to the minimize button - /** You can hide the button by calling setVisible(false) on the result. */ - virtual IGUIButton* getMinimizeButton() const = 0; - - //! Returns pointer to the maximize button - /** You can hide the button by calling setVisible(false) on the result. */ - virtual IGUIButton* getMaximizeButton() const = 0; - - //! Returns true if the window can be dragged with the mouse, false if not - virtual bool isDraggable() const = 0; - - //! Sets whether the window can be dragged by the mouse - virtual void setDraggable(bool draggable) = 0; - - //! Set if the window background will be drawn - virtual void setDrawBackground(bool draw) = 0; - - //! Get if the window background will be drawn - virtual bool getDrawBackground() const = 0; - - //! Set if the window titlebar will be drawn - //! Note: If the background is not drawn, then the titlebar is automatically also not drawn - virtual void setDrawTitlebar(bool draw) = 0; - - //! Get if the window titlebar will be drawn - virtual bool getDrawTitlebar() const = 0; - - //! Returns the rectangle of the drawable area (without border and without titlebar) - /** The coordinates are given relative to the top-left position of the gui element.
- So to get absolute positions you have to add the resulting rectangle to getAbsolutePosition().UpperLeftCorner.
- To get it relative to the parent element you have to add the resulting rectangle to getRelativePosition().UpperLeftCorner. - Beware that adding a menu will not change the clientRect as menus are own gui elements, so in that case you might want to subtract - the menu area additionally. */ - virtual core::rect getClientRect() const = 0; - }; - - -} // end namespace gui -} // end namespace irr - -#endif - diff --git a/include/IMeshManipulator.h b/include/IMeshManipulator.h index 8ff59564..8f9777a4 100644 --- a/include/IMeshManipulator.h +++ b/include/IMeshManipulator.h @@ -30,44 +30,6 @@ namespace scene { public: - //! Flips the direction of surfaces. - /** Changes backfacing triangles to frontfacing - triangles and vice versa. - \param mesh Mesh on which the operation is performed. */ - virtual void flipSurfaces(IMesh* mesh) const = 0; - - //! Sets the alpha vertex color value of the whole mesh to a new value. - /** \param mesh Mesh on which the operation is performed. - \param alpha New alpha value. Must be a value between 0 and 255. */ - void setVertexColorAlpha(IMesh* mesh, s32 alpha) const - { - apply(scene::SVertexColorSetAlphaManipulator(alpha), mesh); - } - - //! Sets the alpha vertex color value of the whole mesh to a new value. - /** \param buffer Meshbuffer on which the operation is performed. - \param alpha New alpha value. Must be a value between 0 and 255. */ - void setVertexColorAlpha(IMeshBuffer* buffer, s32 alpha) const - { - apply(scene::SVertexColorSetAlphaManipulator(alpha), buffer); - } - - //! Sets the colors of all vertices to one color - /** \param mesh Mesh on which the operation is performed. - \param color New color. */ - void setVertexColors(IMesh* mesh, video::SColor color) const - { - apply(scene::SVertexColorSetManipulator(color), mesh); - } - - //! Sets the colors of all vertices to one color - /** \param buffer Meshbuffer on which the operation is performed. - \param color New color. */ - void setVertexColors(IMeshBuffer* buffer, video::SColor color) const - { - apply(scene::SVertexColorSetManipulator(color), buffer); - } - //! Recalculates all normals of the mesh. /** \param mesh: Mesh on which the operation is performed. \param smooth: If the normals shall be smoothed. @@ -82,26 +44,6 @@ namespace scene virtual void recalculateNormals(IMeshBuffer* buffer, bool smooth = false, bool angleWeighted = false) const=0; - //! Recalculates tangents, requires a tangent mesh - /** \param mesh Mesh on which the operation is performed. - \param recalculateNormals If the normals shall be recalculated, otherwise original normals of the mesh are used unchanged. - \param smooth If the normals shall be smoothed. - \param angleWeighted If the normals shall be smoothed in relation to their angles. More expensive, but also higher precision. - */ - virtual void recalculateTangents(IMesh* mesh, - bool recalculateNormals=false, bool smooth=false, - bool angleWeighted=false) const=0; - - //! Recalculates tangents, requires a tangent mesh buffer - /** \param buffer Meshbuffer on which the operation is performed. - \param recalculateNormals If the normals shall be recalculated, otherwise original normals of the buffer are used unchanged. - \param smooth If the normals shall be smoothed. - \param angleWeighted If the normals shall be smoothed in relation to their angles. More expensive, but also higher precision. - */ - virtual void recalculateTangents(IMeshBuffer* buffer, - bool recalculateNormals=false, bool smooth=false, - bool angleWeighted=false) const=0; - //! Scales the actual mesh, not a scene node. /** \param mesh Mesh on which the operation is performed. \param factor Scale factor for each axis. */ @@ -118,116 +60,6 @@ namespace scene apply(SVertexPositionScaleManipulator(factor), buffer, true); } - //! Scales the actual mesh, not a scene node. - /** \deprecated Use scale() instead. This method may be removed by Irrlicht 1.9 - \param mesh Mesh on which the operation is performed. - \param factor Scale factor for each axis. */ - _IRR_DEPRECATED_ void scaleMesh(IMesh* mesh, const core::vector3df& factor) const {return scale(mesh,factor);} - - //! Scale the texture coords of a mesh. - /** \param mesh Mesh on which the operation is performed. - \param factor Vector which defines the scale for each axis. - \param level Number of texture coord, starting from 1. Support for level 2 exists for LightMap buffers. */ - void scaleTCoords(scene::IMesh* mesh, const core::vector2df& factor, u32 level=1) const - { - apply(SVertexTCoordsScaleManipulator(factor, level), mesh); - } - - //! Scale the texture coords of a meshbuffer. - /** \param buffer Meshbuffer on which the operation is performed. - \param factor Vector which defines the scale for each axis. - \param level Number of texture coord, starting from 1. Support for level 2 exists for LightMap buffers. */ - void scaleTCoords(scene::IMeshBuffer* buffer, const core::vector2df& factor, u32 level=1) const - { - apply(SVertexTCoordsScaleManipulator(factor, level), buffer); - } - - //! Applies a transformation to a mesh - /** \param mesh Mesh on which the operation is performed. - \param m transformation matrix. - \param normalsUpdate When 0 - don't update normals. - When 1 - update normals with inverse transposed of the transformation matrix - */ - void transform(IMesh* mesh, const core::matrix4& m, u32 normalsUpdate = 0) const - { - apply(SVertexPositionTransformManipulator(m), mesh, true); - - if ( normalsUpdate == 1 ) - { - core::matrix4 invT; - if ( m.getInverse(invT) ) - { - invT = invT.getTransposed(); - apply(SVertexNormalTransformManipulator(invT), mesh, false); - } - } - } - - //! Applies a transformation to a meshbuffer - /** \param buffer Meshbuffer on which the operation is performed. - \param m transformation matrix. - \param normalsUpdate When 0 - don't update normals. - When 1 - update normals with inverse transposed of the transformation matrix - */ - void transform(IMeshBuffer* buffer, const core::matrix4& m, u32 normalsUpdate = 0) const - { - apply(SVertexPositionTransformManipulator(m), buffer, true); - - if ( normalsUpdate == 1 ) - { - core::matrix4 invT; - if ( m.getInverse(invT) ) - { - invT = invT.getTransposed(); - apply(SVertexNormalTransformManipulator(invT), buffer, false); - } - } - } - - //! Applies a transformation to a mesh - /** \deprecated Use transform() instead. This method may be removed by Irrlicht 1.9 - \param mesh Mesh on which the operation is performed. - \param m transformation matrix. */ - _IRR_DEPRECATED_ virtual void transformMesh(IMesh* mesh, const core::matrix4& m) const {return transform(mesh,m);} - - //! Creates a planar texture mapping on the mesh - /** \param mesh: Mesh on which the operation is performed. - \param resolution: resolution of the planar mapping. This is - the value specifying which is the relation between world space - and texture coordinate space. */ - virtual void makePlanarTextureMapping(IMesh* mesh, f32 resolution=0.001f) const=0; - - //! Creates a planar texture mapping on the meshbuffer - /** \param meshbuffer: Buffer on which the operation is performed. - \param resolution: resolution of the planar mapping. This is - the value specifying which is the relation between world space - and texture coordinate space. */ - virtual void makePlanarTextureMapping(scene::IMeshBuffer* meshbuffer, f32 resolution=0.001f) const=0; - - //! Creates a planar texture mapping on the buffer - /** This method is currently implemented towards the LWO planar mapping. A more general biasing might be required. - \param mesh Mesh on which the operation is performed. - \param resolutionS Resolution of the planar mapping in horizontal direction. This is the ratio between object space and texture space. - \param resolutionT Resolution of the planar mapping in vertical direction. This is the ratio between object space and texture space. - \param axis The axis along which the texture is projected. The allowed values are 0 (X), 1(Y), and 2(Z). - \param offset Vector added to the vertex positions (in object coordinates). - */ - virtual void makePlanarTextureMapping(scene::IMesh* mesh, - f32 resolutionS, f32 resolutionT, - u8 axis, const core::vector3df& offset) const=0; - - //! Creates a planar texture mapping on the meshbuffer - /** This method is currently implemented towards the LWO planar mapping. A more general biasing might be required. - \param buffer Buffer on which the operation is performed. - \param resolutionS Resolution of the planar mapping in horizontal direction. This is the ratio between object space and texture space. - \param resolutionT Resolution of the planar mapping in vertical direction. This is the ratio between object space and texture space. - \param axis The axis along which the texture is projected. The allowed values are 0 (X), 1(Y), and 2(Z). - \param offset Vector added to the vertex positions (in object coordinates). - */ - virtual void makePlanarTextureMapping(scene::IMeshBuffer* buffer, - f32 resolutionS, f32 resolutionT, - u8 axis, const core::vector3df& offset) const=0; - //! Clones a static IMesh into a modifiable SMesh. /** All meshbuffers in the returned SMesh are of type SMeshBuffer or SMeshBufferLightMap. @@ -237,59 +69,6 @@ namespace scene IReferenceCounted::drop() for more information. */ virtual SMesh* createMeshCopy(IMesh* mesh) const = 0; - //! Creates a copy of the mesh, which will only consist of S3DVertexTangents vertices. - /** This is useful if you want to draw tangent space normal - mapped geometry because it calculates the tangent and binormal - data which is needed there. - \param mesh Input mesh - \param recalculateNormals The normals are recalculated if set, - otherwise the original ones are kept. Note that keeping the - normals may introduce inaccurate tangents if the normals are - very different to those calculated from the faces. - \param smooth The normals/tangents are smoothed across the - meshbuffer's faces if this flag is set. - \param angleWeighted Improved smoothing calculation used - \param recalculateTangents Whether are actually calculated, or just the mesh with proper type is created. - \return Mesh consisting only of S3DVertexTangents vertices. If - you no longer need the cloned mesh, you should call - IMesh::drop(). See IReferenceCounted::drop() for more - information. */ - virtual IMesh* createMeshWithTangents(IMesh* mesh, - bool recalculateNormals=false, bool smooth=false, - bool angleWeighted=false, bool recalculateTangents=true) const=0; - - //! Creates a copy of the mesh, which will only consist of S3DVertex2TCoord vertices. - /** \param mesh Input mesh - \return Mesh consisting only of S3DVertex2TCoord vertices. If - you no longer need the cloned mesh, you should call - IMesh::drop(). See IReferenceCounted::drop() for more - information. */ - virtual IMesh* createMeshWith2TCoords(IMesh* mesh) const = 0; - - //! Creates a copy of the mesh, which will only consist of S3DVertex vertices. - /** \param mesh Input mesh - \return Mesh consisting only of S3DVertex vertices. If - you no longer need the cloned mesh, you should call - IMesh::drop(). See IReferenceCounted::drop() for more - information. */ - virtual IMesh* createMeshWith1TCoords(IMesh* mesh) const = 0; - - //! Creates a copy of a mesh with all vertices unwelded - /** \param mesh Input mesh - \return Mesh consisting only of unique faces. All vertices - which were previously shared are now duplicated. If you no - longer need the cloned mesh, you should call IMesh::drop(). See - IReferenceCounted::drop() for more information. */ - virtual IMesh* createMeshUniquePrimitives(IMesh* mesh) const = 0; - - //! Creates a copy of a mesh with vertices welded - /** \param mesh Input mesh - \param tolerance The threshold for vertex comparisons. - \return Mesh without redundant vertices. If you no longer need - the cloned mesh, you should call IMesh::drop(). See - IReferenceCounted::drop() for more information. */ - virtual IMesh* createMeshWelded(IMesh* mesh, f32 tolerance=core::ROUNDING_ERROR_f32) const = 0; - //! Get amount of polygons in mesh. /** \param mesh Input mesh \return Number of polygons in mesh. */ @@ -310,43 +89,6 @@ namespace scene virtual IAnimatedMesh * createAnimatedMesh(IMesh* mesh, scene::E_ANIMATED_MESH_TYPE type = scene::EAMT_UNKNOWN) const = 0; - //! Vertex cache optimization according to the Forsyth paper - /** More information can be found at - http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html - - The function is thread-safe (read: you can optimize several - meshes in different threads). - - \param mesh Source mesh for the operation. - \return A new mesh optimized for the vertex cache. */ - virtual IMesh* createForsythOptimizedMesh(const IMesh *mesh) const = 0; - - //! Optimize the mesh with an algorithm tuned for heightmaps. - /** - This differs from usual simplification methods in two ways: - - it's intended to be lossless - - it has special care for the borders, which are useful with heightmap tiles - - This function is thread-safe. Remember to weld afterwards - this - function only moves vertices, it does not weld. - - \param mesh Mesh to operate on. - */ - virtual void heightmapOptimizeMesh(IMesh * const mesh, const f32 tolerance = core::ROUNDING_ERROR_f32) const = 0; - - //! Optimize the meshbuffer with an algorithm tuned for heightmaps. - /** - This differs from usual simplification methods in two ways: - - it's intended to be lossless - - it has special care for the borders, which are useful with heightmap tiles - - This function is thread-safe. Remember to weld afterward - this - function only moves vertices, it does not weld. - - \param mb Meshbuffer to operate on. - */ - virtual void heightmapOptimizeMesh(IMeshBuffer * const mb, const f32 tolerance = core::ROUNDING_ERROR_f32) const = 0; - //! Apply a manipulator on the Meshbuffer /** \param func A functor defining the mesh manipulation. \param buffer The Meshbuffer to apply the manipulator to. diff --git a/include/IRandomizer.h b/include/IRandomizer.h deleted file mode 100644 index e821190e..00000000 --- a/include/IRandomizer.h +++ /dev/null @@ -1,30 +0,0 @@ -// 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 __I_RANDOMIZER_H_INCLUDED__ -#define __I_RANDOMIZER_H_INCLUDED__ - -#include "IReferenceCounted.h" - -namespace irr -{ - -//! Interface for generating random numbers -class IRandomizer : public virtual IReferenceCounted -{ -public: - //! resets the randomizer - /** \param value Initialization value (seed) */ - virtual void reset(s32 value=0x0f0f0f0f) =0; - - //! generates a pseudo random number in the range 0..randMax() - virtual s32 rand() const =0; - - //! get maxmimum number generated by rand() - virtual s32 randMax() const =0; -}; - -} // end namespace irr - -#endif diff --git a/include/ISceneManager.h b/include/ISceneManager.h index f98e7881..660d0aa8 100644 --- a/include/ISceneManager.h +++ b/include/ISceneManager.h @@ -602,32 +602,6 @@ namespace scene pass currently is active they can render the correct part of their geometry. */ virtual E_SCENE_NODE_RENDER_PASS getSceneNodeRenderPass() const = 0; - //! Get the default scene node factory which can create all built in scene nodes - /** \return Pointer to the default scene node factory - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual ISceneNodeFactory* getDefaultSceneNodeFactory() = 0; - - //! Adds a scene node factory to the scene manager. - /** Use this to extend the scene manager with new scene node types which it should be - able to create automatically, for example when loading data from xml files. */ - virtual void registerSceneNodeFactory(ISceneNodeFactory* factoryToAdd) = 0; - - //! Get amount of registered scene node factories. - virtual u32 getRegisteredSceneNodeFactoryCount() const = 0; - - //! Get a scene node factory by index - /** \return Pointer to the requested scene node factory, or 0 if it does not exist. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual ISceneNodeFactory* getSceneNodeFactory(u32 index) = 0; - - //! Get typename from a scene node type or null if not found - virtual const c8* getSceneNodeTypeName(ESCENE_NODE_TYPE type) = 0; - - //! Adds a scene node to the scene by name - /** \return Pointer to the scene node added by a factory - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual ISceneNode* addSceneNode(const char* sceneNodeTypeName, ISceneNode* parent=0) = 0; - //! Creates a new scene manager. /** This can be used to easily draw and/or store two independent scenes at the same time. The mesh cache will be diff --git a/include/ISceneNodeFactory.h b/include/ISceneNodeFactory.h deleted file mode 100644 index 43043bd2..00000000 --- a/include/ISceneNodeFactory.h +++ /dev/null @@ -1,68 +0,0 @@ -// 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 __I_SCENE_NODE_FACTORY_H_INCLUDED__ -#define __I_SCENE_NODE_FACTORY_H_INCLUDED__ - -#include "IReferenceCounted.h" -#include "ESceneNodeTypes.h" - -namespace irr -{ - -namespace scene -{ - class ISceneNode; - - //! Interface for dynamic creation of scene nodes - /** To be able to add custom scene nodes to Irrlicht and to make it possible for the - scene manager to save and load those external scene nodes, simply implement this - interface and register it in you scene manager via ISceneManager::registerSceneNodeFactory. - Note: When implementing your own scene node factory, don't call ISceneNodeManager::grab() to - increase the reference counter of the scene node manager. This is not necessary because the - scene node manager will grab() the factory anyway, and otherwise cyclic references will - be created and the scene manager and all its nodes won't get deallocated. - */ - class ISceneNodeFactory : public virtual IReferenceCounted - { - public: - //! adds a scene node to the scene graph based on its type id - /** \param type: Type of the scene node to add. - \param parent: Parent scene node of the new node, can be null to add the scene node to the root. - \return Returns pointer to the new scene node or null if not successful. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual ISceneNode* addSceneNode(ESCENE_NODE_TYPE type, ISceneNode* parent=0) = 0; - - //! adds a scene node to the scene graph based on its type name - /** \param typeName: Type name of the scene node to add. - \param parent: Parent scene node of the new node, can be null to add the scene node to the root. - \return Returns pointer to the new scene node or null if not successful. - This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ - virtual ISceneNode* addSceneNode(const c8* typeName, ISceneNode* parent=0) = 0; - - //! returns amount of scene node types this factory is able to create - virtual u32 getCreatableSceneNodeTypeCount() const = 0; - - //! returns type of a creatable scene node type - /** \param idx: Index of scene node type in this factory. Must be a value between 0 and - getCreatableSceneNodeTypeCount() */ - virtual ESCENE_NODE_TYPE getCreateableSceneNodeType(u32 idx) const = 0; - - //! returns type name of a creatable scene node type by index - /** \param idx: Index of scene node type in this factory. Must be a value between 0 and - getCreatableSceneNodeTypeCount() */ - virtual const c8* getCreateableSceneNodeTypeName(u32 idx) const = 0; - - //! returns type name of a creatable scene node type - /** \param type: Type of scene node. - \return: Returns name of scene node type if this factory can create the type, otherwise 0. */ - virtual const c8* getCreateableSceneNodeTypeName(ESCENE_NODE_TYPE type) const = 0; - }; - - -} // end namespace scene -} // end namespace irr - -#endif - diff --git a/include/IVideoDriver.h b/include/IVideoDriver.h index 056ea00b..848a9b06 100644 --- a/include/IVideoDriver.h +++ b/include/IVideoDriver.h @@ -41,7 +41,6 @@ namespace video struct S3DVertex; struct S3DVertex2TCoords; struct S3DVertexTangents; - struct SLight; class IImageLoader; class IImageWriter; class IMaterialRenderer; @@ -1053,33 +1052,6 @@ namespace video \return Amount of primitives drawn in the last frame. */ virtual u32 getPrimitiveCountDrawn( u32 mode =0 ) const =0; - //! Deletes all dynamic lights which were previously added with addDynamicLight(). - virtual void deleteAllDynamicLights() =0; - - //! adds a dynamic light, returning an index to the light - //! \param light: the light data to use to create the light - //! \return An index to the light, or -1 if an error occurs - virtual s32 addDynamicLight(const SLight& light) =0; - - //! Returns the maximal amount of dynamic lights the device can handle - /** \return Maximal amount of dynamic lights. */ - virtual u32 getMaximalDynamicLightAmount() const =0; - - //! Returns amount of dynamic lights currently set - /** \return Amount of dynamic lights currently set */ - virtual u32 getDynamicLightCount() const =0; - - //! Returns light data which was previously set by IVideoDriver::addDynamicLight(). - /** \param idx Zero based index of the light. Must be 0 or - greater and smaller than IVideoDriver::getDynamicLightCount. - \return Light data. */ - virtual const SLight& getDynamicLight(u32 idx) const =0; - - //! Turns a dynamic light on or off - //! \param lightIndex: the index returned by addDynamicLight - //! \param turnOn: true to turn the light on, false to turn it off - virtual void turnLightOn(s32 lightIndex, bool turnOn) =0; - //! Gets name of this video driver. /** \return Returns the name of the video driver, e.g. in case of the Direct3D8 driver, it would return "Direct3D 8.1". */ diff --git a/include/IVideoModeList.h b/include/IVideoModeList.h deleted file mode 100644 index cc87b2e2..00000000 --- a/include/IVideoModeList.h +++ /dev/null @@ -1,58 +0,0 @@ -// 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_VIDEO_MODE_LIST_H_INCLUDED__ -#define __IRR_I_VIDEO_MODE_LIST_H_INCLUDED__ - -#include "IReferenceCounted.h" -#include "dimension2d.h" - -namespace irr -{ -namespace video -{ - - //! A list of all available video modes. - /** You can get a list via IrrlichtDevice::getVideoModeList(). - You only need the null device (EDT_NULL) to get the video-modes. */ - class IVideoModeList : public virtual IReferenceCounted - { - public: - - //! Gets amount of video modes in the list. - /** \return Returns amount of video modes. */ - virtual s32 getVideoModeCount() const = 0; - - //! Get the screen size of a video mode in pixels. - /** \param modeNumber: zero based index of the video mode. - \return Size of screen in pixels of the specified video mode. */ - virtual core::dimension2d getVideoModeResolution(s32 modeNumber) const = 0; - - //! Get a supported screen size with certain constraints. - /** \param minSize: Minimum dimensions required. - \param maxSize: Maximum dimensions allowed. - \return Size of screen in pixels which matches the requirements. - as good as possible. */ - virtual core::dimension2d getVideoModeResolution(const core::dimension2d& minSize, const core::dimension2d& maxSize) const = 0; - - //! Get the pixel depth of a video mode in bits. - /** \param modeNumber: zero based index of the video mode. - \return Size of each pixel of the specified video mode in bits. */ - virtual s32 getVideoModeDepth(s32 modeNumber) const = 0; - - //! Get current desktop screen resolution. - /** \return Size of screen in pixels of the current desktop video mode. */ - virtual const core::dimension2d& getDesktopResolution() const = 0; - - //! Get the pixel depth of a video mode in bits. - /** \return Size of each pixel of the current desktop video mode in bits. */ - virtual s32 getDesktopDepth() const = 0; - }; - -} // end namespace video -} // end namespace irr - - -#endif - diff --git a/include/IrrlichtDevice.h b/include/IrrlichtDevice.h index ac02342b..88415118 100644 --- a/include/IrrlichtDevice.h +++ b/include/IrrlichtDevice.h @@ -12,7 +12,6 @@ #include "EDeviceTypes.h" #include "IEventReceiver.h" #include "ICursorControl.h" -#include "IVideoModeList.h" #include "ITimer.h" #include "IOSOperator.h" @@ -20,7 +19,6 @@ namespace irr { class ILogger; class IEventReceiver; - class IRandomizer; namespace io { class IFileSystem; @@ -111,14 +109,6 @@ namespace irr /** \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; @@ -136,22 +126,6 @@ namespace irr \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; @@ -342,24 +316,6 @@ namespace irr { 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; diff --git a/include/SLight.h b/include/SLight.h deleted file mode 100644 index 8f725945..00000000 --- a/include/SLight.h +++ /dev/null @@ -1,101 +0,0 @@ -// 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 __S_LIGHT_H_INCLUDED__ -#define __S_LIGHT_H_INCLUDED__ - -#include "SColor.h" -#include "vector3d.h" - -namespace irr -{ -namespace video -{ - -//! Enumeration for different types of lights -enum E_LIGHT_TYPE -{ - //! point light, it has a position in space and radiates light in all directions - ELT_POINT, - //! spot light, it has a position in space, a direction, and a limited cone of influence - ELT_SPOT, - //! directional light, coming from a direction from an infinite distance - ELT_DIRECTIONAL, - - //! Only used for counting the elements of this enum - ELT_COUNT -}; - -//! Names for light types -const c8* const LightTypeNames[] = -{ - "Point", - "Spot", - "Directional", - 0 -}; - -//! structure for holding data describing a dynamic point light. -/** Irrlicht supports point lights, spot lights, and directional lights. -*/ -struct SLight -{ - SLight() : AmbientColor(0.f,0.f,0.f), DiffuseColor(1.f,1.f,1.f), - SpecularColor(1.f,1.f,1.f), Attenuation(1.f,0.f,0.f), - OuterCone(45.f), InnerCone(0.f), Falloff(2.f), - Position(0.f,0.f,0.f), Direction(0.f,0.f,1.f), - Radius(100.f), Type(ELT_POINT), CastShadows(true) - {} - - //! Ambient color emitted by the light - SColorf AmbientColor; - - //! Diffuse color emitted by the light. - /** This is the primary color you want to set. */ - SColorf DiffuseColor; - - //! Specular color emitted by the light. - /** For details how to use specular highlights, see SMaterial::Shininess */ - SColorf SpecularColor; - - //! Attenuation factors (constant, linear, quadratic) - /** Changes the light strength fading over distance. - Can also be altered by setting the radius, Attenuation will change to - (0,1.f/radius,0). Can be overridden after radius was set. */ - core::vector3df Attenuation; - - //! The angle of the spot's outer cone. Ignored for other lights. - f32 OuterCone; - - //! The angle of the spot's inner cone. Ignored for other lights. - f32 InnerCone; - - //! The light strength's decrease between Outer and Inner cone. Only for spot lights - f32 Falloff; - - //! Read-ONLY! Position of the light. - /** If Type is ELT_DIRECTIONAL, it is ignored. Changed via light scene node's position. */ - core::vector3df Position; - - //! Read-ONLY! Direction of the light. - /** If Type is ELT_POINT, it is ignored. Changed via light scene node's rotation. */ - core::vector3df Direction; - - //! Read-ONLY! Radius of light. Everything within this radius will be lighted. - /** On OpenGL light doesn't stop at radius. To get same light as in OpenGL in other drivers - do set the radius to a large value like sqrt(FLT_MAX) and then set the Attenuation afterwards. - */ - f32 Radius; - - //! Read-ONLY! Type of the light. Default: ELT_POINT - E_LIGHT_TYPE Type; - - //! Read-ONLY! Does the light cast shadows? - bool CastShadows:1; -}; - -} // end namespace video -} // end namespace irr - -#endif diff --git a/include/SVertexManipulator.h b/include/SVertexManipulator.h index 3cb1477c..db5e7f29 100644 --- a/include/SVertexManipulator.h +++ b/include/SVertexManipulator.h @@ -24,199 +24,6 @@ namespace scene struct IVertexManipulator { }; - //! Vertex manipulator to set color to a fixed color for all vertices - class SVertexColorSetManipulator : public IVertexManipulator - { - public: - SVertexColorSetManipulator(video::SColor color) : Color(color) {} - void operator()(video::S3DVertex& vertex) const - { - vertex.Color=Color; - } - private: - video::SColor Color; - }; - //! Vertex manipulator to set the alpha value of the vertex color to a fixed value - class SVertexColorSetAlphaManipulator : public IVertexManipulator - { - public: - SVertexColorSetAlphaManipulator(u32 alpha) : Alpha(alpha) {} - void operator()(video::S3DVertex& vertex) const - { - vertex.Color.setAlpha(Alpha); - } - private: - u32 Alpha; - }; - //! Vertex manipulator which inverts the RGB values - class SVertexColorInvertManipulator : public IVertexManipulator - { - public: - void operator()(video::S3DVertex& vertex) const - { - vertex.Color.setRed(255-vertex.Color.getRed()); - vertex.Color.setGreen(255-vertex.Color.getGreen()); - vertex.Color.setBlue(255-vertex.Color.getBlue()); - } - }; - //! Vertex manipulator to set vertex color to one of two values depending on a given threshold - /** If average of the color value is >Threshold the High color is chosen, else Low. */ - class SVertexColorThresholdManipulator : public IVertexManipulator - { - public: - SVertexColorThresholdManipulator(u8 threshold, video::SColor low, - video::SColor high) : Threshold(threshold), Low(low), High(high) {} - void operator()(video::S3DVertex& vertex) const - { - vertex.Color = ((u8)vertex.Color.getAverage()>Threshold)?High:Low; - } - private: - u8 Threshold; - video::SColor Low; - video::SColor High; - }; - //! Vertex manipulator which adjusts the brightness by the given amount - /** A positive value increases brightness, a negative value darkens the colors. */ - class SVertexColorBrightnessManipulator : public IVertexManipulator - { - public: - SVertexColorBrightnessManipulator(s32 amount) : Amount(amount) {} - void operator()(video::S3DVertex& vertex) const - { - vertex.Color.setRed(core::clamp(vertex.Color.getRed()+Amount, 0u, 255u)); - vertex.Color.setGreen(core::clamp(vertex.Color.getGreen()+Amount, 0u, 255u)); - vertex.Color.setBlue(core::clamp(vertex.Color.getBlue()+Amount, 0u, 255u)); - } - private: - s32 Amount; - }; - //! Vertex manipulator which adjusts the contrast by the given factor - /** Factors over 1 increase contrast, below 1 reduce it. */ - class SVertexColorContrastManipulator : public IVertexManipulator - { - public: - SVertexColorContrastManipulator(f32 factor) : Factor(factor) {} - void operator()(video::S3DVertex& vertex) const - { - vertex.Color.setRed(core::clamp(core::round32((vertex.Color.getRed()-128)*Factor)+128, 0, 255)); - vertex.Color.setGreen(core::clamp(core::round32((vertex.Color.getGreen()-128)*Factor)+128, 0, 255)); - vertex.Color.setBlue(core::clamp(core::round32((vertex.Color.getBlue()-128)*Factor)+128, 0, 255)); - } - private: - f32 Factor; - }; - //! Vertex manipulator which adjusts the contrast by the given factor and brightness by a signed amount. - /** Factors over 1 increase contrast, below 1 reduce it. - A positive amount increases brightness, a negative one darkens the colors. */ - class SVertexColorContrastBrightnessManipulator : public IVertexManipulator - { - public: - SVertexColorContrastBrightnessManipulator(f32 factor, s32 amount) : Factor(factor), Amount(amount+128) {} - void operator()(video::S3DVertex& vertex) const - { - vertex.Color.setRed(core::clamp(core::round32((vertex.Color.getRed()-128)*Factor)+Amount, 0, 255)); - vertex.Color.setGreen(core::clamp(core::round32((vertex.Color.getGreen()-128)*Factor)+Amount, 0, 255)); - vertex.Color.setBlue(core::clamp(core::round32((vertex.Color.getBlue()-128)*Factor)+Amount, 0, 255)); - } - private: - f32 Factor; - s32 Amount; - }; - //! Vertex manipulator which adjusts the brightness by a gamma operation - /** A value over one increases brightness, one below darkens the colors. */ - class SVertexColorGammaManipulator : public IVertexManipulator - { - public: - SVertexColorGammaManipulator(f32 gamma) : Gamma(1.f) - { - if (gamma != 0.f) - Gamma = 1.f/gamma; - } - void operator()(video::S3DVertex& vertex) const - { - vertex.Color.setRed(core::clamp(core::round32(powf((f32)(vertex.Color.getRed()),Gamma)), 0, 255)); - vertex.Color.setGreen(core::clamp(core::round32(powf((f32)(vertex.Color.getGreen()),Gamma)), 0, 255)); - vertex.Color.setBlue(core::clamp(core::round32(powf((f32)(vertex.Color.getBlue()),Gamma)), 0, 255)); - } - private: - f32 Gamma; - }; - //! Vertex manipulator which scales the color values - /** Can e.g be used for white balance, factor would be 255.f/brightest color. */ - class SVertexColorScaleManipulator : public IVertexManipulator - { - public: - SVertexColorScaleManipulator(f32 factor) : Factor(factor) {} - void operator()(video::S3DVertex& vertex) const - { - vertex.Color.setRed(core::clamp(core::round32(vertex.Color.getRed()*Factor), 0, 255)); - vertex.Color.setGreen(core::clamp(core::round32(vertex.Color.getGreen()*Factor), 0, 255)); - vertex.Color.setBlue(core::clamp(core::round32(vertex.Color.getBlue()*Factor), 0, 255)); - } - private: - f32 Factor; - }; - //! Vertex manipulator which desaturates the color values - /** Uses the lightness value of the color. */ - class SVertexColorDesaturateToLightnessManipulator : public IVertexManipulator - { - public: - void operator()(video::S3DVertex& vertex) const - { - vertex.Color=core::round32(vertex.Color.getLightness()); - } - }; - //! Vertex manipulator which desaturates the color values - /** Uses the average value of the color. */ - class SVertexColorDesaturateToAverageManipulator : public IVertexManipulator - { - public: - void operator()(video::S3DVertex& vertex) const - { - vertex.Color=vertex.Color.getAverage(); - } - }; - //! Vertex manipulator which desaturates the color values - /** Uses the luminance value of the color. */ - class SVertexColorDesaturateToLuminanceManipulator : public IVertexManipulator - { - public: - void operator()(video::S3DVertex& vertex) const - { - vertex.Color=core::round32(vertex.Color.getLuminance()); - } - }; - //! Vertex manipulator which interpolates the color values - /** Uses linear interpolation. */ - class SVertexColorInterpolateLinearManipulator : public IVertexManipulator - { - public: - SVertexColorInterpolateLinearManipulator(video::SColor color, f32 factor) : - Color(color), Factor(factor) {} - void operator()(video::S3DVertex& vertex) const - { - vertex.Color=vertex.Color.getInterpolated(Color, Factor); - } - private: - video::SColor Color; - f32 Factor; - }; - //! Vertex manipulator which interpolates the color values - /** Uses linear interpolation. */ - class SVertexColorInterpolateQuadraticManipulator : public IVertexManipulator - { - public: - SVertexColorInterpolateQuadraticManipulator(video::SColor color1, video::SColor color2, f32 factor) : - Color1(color1), Color2(color2), Factor(factor) {} - void operator()(video::S3DVertex& vertex) const - { - vertex.Color=vertex.Color.getInterpolated_quadratic(Color1, Color2, Factor); - } - private: - video::SColor Color1; - video::SColor Color2; - f32 Factor; - }; //! Vertex manipulator which scales the position of the vertex class SVertexPositionScaleManipulator : public IVertexManipulator @@ -232,74 +39,6 @@ namespace scene core::vector3df Factor; }; - //! Vertex manipulator which scales the position of the vertex along the normals - /** This can look more pleasing than the usual Scale operator, but - depends on the mesh geometry. - */ - class SVertexPositionScaleAlongNormalsManipulator : public IVertexManipulator - { - public: - SVertexPositionScaleAlongNormalsManipulator(const core::vector3df& factor) : Factor(factor) {} - template - void operator()(VType& vertex) const - { - vertex.Pos += vertex.Normal*Factor; - } - private: - core::vector3df Factor; - }; - - //! Vertex manipulator which transforms the position of the vertex - class SVertexPositionTransformManipulator : public IVertexManipulator - { - public: - SVertexPositionTransformManipulator(const core::matrix4& m) : Transformation(m) {} - template - void operator()(VType& vertex) const - { - Transformation.transformVect(vertex.Pos); - } - private: - core::matrix4 Transformation; - }; - - //! Vertex manipulator which transforms the normal of the vertex - class SVertexNormalTransformManipulator : public IVertexManipulator - { - public: - SVertexNormalTransformManipulator(const core::matrix4& m) : Transformation(m) {} - template - void operator()(VType& vertex) const - { - Transformation.transformVect(vertex.Normal); - } - private: - core::matrix4 Transformation; - }; - - //! Vertex manipulator which scales the TCoords of the vertex - class SVertexTCoordsScaleManipulator : public IVertexManipulator - { - public: - SVertexTCoordsScaleManipulator(const core::vector2df& factor, u32 uvSet=1) : Factor(factor), UVSet(uvSet) {} - void operator()(video::S3DVertex2TCoords& vertex) const - { - if (1==UVSet) - vertex.TCoords *= Factor; - else if (2==UVSet) - vertex.TCoords2 *= Factor; - } - template - void operator()(VType& vertex) const - { - if (1==UVSet) - vertex.TCoords *= Factor; - } - private: - core::vector2df Factor; - u32 UVSet; - }; - } // end namespace scene } // end namespace irr diff --git a/include/driverChoice.h b/include/driverChoice.h deleted file mode 100644 index accd4034..00000000 --- a/include/driverChoice.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (C) 2009-2012 Christian Stehno -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __E_DRIVER_CHOICE_H_INCLUDED__ -#define __E_DRIVER_CHOICE_H_INCLUDED__ - -#include -#include -#include "EDriverTypes.h" -#include "IrrlichtDevice.h" - -namespace irr -{ - - //! ask user for driver - static irr::video::E_DRIVER_TYPE driverChoiceConsole(bool allDrivers=false) - { -#if defined (_IRR_IPHONE_PLATFORM_) || defined (_IRR_ANDROID_PLATFORM_) - return irr::video::EDT_OGLES2; -#else - printf("Please select the driver you want:\n"); - irr::u32 i=0; - char c = 'a'; - - for (i=irr::video::EDT_COUNT; i>0; --i) - { - if ( allDrivers || irr::IrrlichtDevice::isDriverSupported(irr::video::E_DRIVER_TYPE(i-1)) ) - { - printf(" (%c) %s\n", c, irr::video::DRIVER_TYPE_NAMES[i-1]); - ++c; - } - } - - char userSelection; - std::cin >> userSelection; - c = 'a'; - - for (i=irr::video::EDT_COUNT; i>0; --i) - { - if ( allDrivers || irr::IrrlichtDevice::isDriverSupported(irr::video::E_DRIVER_TYPE(i-1)) ) - { - if (userSelection == c) - return irr::video::E_DRIVER_TYPE(i-1); - ++c; - } - } - - return irr::video::EDT_COUNT; -#endif - } - -} // end namespace irr - -#endif diff --git a/include/irrlicht.h b/include/irrlicht.h index 4773e437..1cd81c12 100644 --- a/include/irrlicht.h +++ b/include/irrlicht.h @@ -47,7 +47,6 @@ #include "EMaterialFlags.h" #include "EMaterialTypes.h" #include "EMeshWriterEnums.h" -#include "EMessageBoxFlags.h" #include "ESceneNodeTypes.h" #include "fast_atof.h" #include "IAnimatedMesh.h" @@ -65,31 +64,21 @@ #include "IGPUProgrammingServices.h" #include "IGUIButton.h" #include "IGUICheckBox.h" -#include "IGUIColorSelectDialog.h" #include "IGUIComboBox.h" -#include "IGUIContextMenu.h" #include "IGUIEditBox.h" #include "IGUIElement.h" -#include "IGUIElementFactory.h" #include "IGUIEnvironment.h" #include "IGUIFileOpenDialog.h" #include "IGUIFont.h" #include "IGUIFontBitmap.h" #include "IGUIImage.h" -#include "IGUIInOutFader.h" #include "IGUIListBox.h" -#include "IGUIMeshViewer.h" #include "IGUIScrollBar.h" #include "IGUISkin.h" -#include "IGUISpinBox.h" #include "IGUISpriteBank.h" #include "IGUIStaticText.h" #include "IGUITabControl.h" -#include "IGUITable.h" #include "IGUIToolbar.h" -#include "IGUIWindow.h" -#include "IGUITreeView.h" -#include "IGUIProfiler.h" #include "IImage.h" #include "IImageLoader.h" #include "IImageWriter.h" @@ -108,7 +97,6 @@ #include "IReadFile.h" #include "IReferenceCounted.h" #include "irrArray.h" -#include "IRandomizer.h" #include "IRenderTarget.h" #include "IrrlichtDevice.h" #include "irrMath.h" @@ -118,14 +106,12 @@ #include "ISceneCollisionManager.h" #include "ISceneManager.h" #include "ISceneNode.h" -#include "ISceneNodeFactory.h" #include "IShaderConstantSetCallBack.h" #include "ISkinnedMesh.h" #include "ITexture.h" #include "ITimer.h" #include "IVertexBuffer.h" #include "IVideoDriver.h" -#include "IVideoModeList.h" #include "IWriteFile.h" #include "Keycodes.h" #include "line2d.h" @@ -141,7 +127,6 @@ #include "SColor.h" #include "SExposedVideoData.h" #include "SIrrCreationParameters.h" -#include "SLight.h" #include "SMaterial.h" #include "SMesh.h" #include "SMeshBuffer.h" diff --git a/media/Shaders/COGLES2Reflection2Layer.vsh b/media/Shaders/COGLES2Reflection2Layer.vsh index 069fac31..d4c49378 100644 --- a/media/Shaders/COGLES2Reflection2Layer.vsh +++ b/media/Shaders/COGLES2Reflection2Layer.vsh @@ -1,5 +1,3 @@ -#define MAX_LIGHTS 8 - /* Attributes */ attribute vec3 inVertexPosition; @@ -22,15 +20,6 @@ uniform vec4 uMaterialEmissive; uniform vec4 uMaterialSpecular; uniform float uMaterialShininess; -uniform int uLightCount; -uniform int uLightType[MAX_LIGHTS]; -uniform vec3 uLightPosition[MAX_LIGHTS]; -uniform vec3 uLightDirection[MAX_LIGHTS]; -uniform vec3 uLightAttenuation[MAX_LIGHTS]; -uniform vec4 uLightAmbient[MAX_LIGHTS]; -uniform vec4 uLightDiffuse[MAX_LIGHTS]; -uniform vec4 uLightSpecular[MAX_LIGHTS]; - uniform float uThickness; /* Varyings */ @@ -41,58 +30,6 @@ varying vec4 vVertexColor; varying vec4 vSpecularColor; varying float vFogCoord; -void dirLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) -{ - vec3 L = normalize(-(uNMatrix * vec4(uLightDirection[index], 0.0)).xyz); - - ambient += uLightAmbient[index]; - - float NdotL = dot(normal, L); - - if (NdotL > 0.0) - { - diffuse += uLightDiffuse[index] * NdotL; - - vec3 E = normalize(-position); - vec3 HalfVector = normalize(L + E); - float NdotH = max(0.0, dot(normal, HalfVector)); - - float SpecularFactor = pow(NdotH, uMaterialShininess); - specular += uLightSpecular[index] * SpecularFactor; - } -} - -void pointLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) -{ - vec3 L = uLightPosition[index] - position; - float D = length(L); - L = normalize(L); - - float Attenuation = 1.0 / (uLightAttenuation[index].x + uLightAttenuation[index].y * D + - uLightAttenuation[index].z * D * D); - - ambient += uLightAmbient[index] * Attenuation; - - float NdotL = dot(normal, L); - - if (NdotL > 0.0) - { - diffuse += uLightDiffuse[index] * NdotL * Attenuation; - - vec3 E = normalize(-position); - vec3 HalfVector = normalize(L + E); - float NdotH = max(0.0, dot(normal, HalfVector)); - - float SpecularFactor = pow(NdotH, uMaterialShininess); - specular += uLightSpecular[index] * SpecularFactor * Attenuation; - } -} - -void spotLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) -{ - // TO-DO -} - void main() { gl_Position = uWVPMatrix * vec4(inVertexPosition, 1.0); @@ -112,48 +49,5 @@ void main() vVertexColor = inVertexColor.bgra; vSpecularColor = vec4(0.0, 0.0, 0.0, 0.0); - if (uLightCount > 0) - { - vec3 Normal = normalize((uNMatrix * vec4(inVertexNormal, 0.0)).xyz); - - vec4 Ambient = vec4(0.0, 0.0, 0.0, 0.0); - vec4 Diffuse = vec4(0.0, 0.0, 0.0, 0.0); - - for (int i = 0; i < int(MAX_LIGHTS); i++) - { - if( i >= uLightCount ) // can't use uniform as loop-counter directly in glsl - break; - if (uLightType[i] == 0) - pointLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor); - } - - for (int i = 0; i < int(MAX_LIGHTS); i++) - { - if( i >= uLightCount ) - break; - if (uLightType[i] == 1) - spotLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor); - } - - for (int i = 0; i < int(MAX_LIGHTS); i++) - { - if( i >= uLightCount ) - break; - if (uLightType[i] == 2) - dirLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor); - } - - vec4 LightColor = Ambient * uMaterialAmbient + Diffuse * uMaterialDiffuse; - LightColor = clamp(LightColor, 0.0, 1.0); - LightColor.w = 1.0; - - vVertexColor *= LightColor; - vVertexColor += uMaterialEmissive; - vVertexColor += uGlobalAmbient * uMaterialAmbient; - vVertexColor = clamp(vVertexColor, 0.0, 1.0); - - vSpecularColor *= uMaterialSpecular; - } - vFogCoord = length(Position); } diff --git a/media/Shaders/COGLES2Solid.vsh b/media/Shaders/COGLES2Solid.vsh index 98824c48..79ab884e 100644 --- a/media/Shaders/COGLES2Solid.vsh +++ b/media/Shaders/COGLES2Solid.vsh @@ -1,5 +1,3 @@ -#define MAX_LIGHTS 8 - /* Attributes */ attribute vec3 inVertexPosition; @@ -21,15 +19,6 @@ uniform vec4 uMaterialEmissive; uniform vec4 uMaterialSpecular; uniform float uMaterialShininess; -uniform int uLightCount; -uniform int uLightType[MAX_LIGHTS]; -uniform vec3 uLightPosition[MAX_LIGHTS]; -uniform vec3 uLightDirection[MAX_LIGHTS]; -uniform vec3 uLightAttenuation[MAX_LIGHTS]; -uniform vec4 uLightAmbient[MAX_LIGHTS]; -uniform vec4 uLightDiffuse[MAX_LIGHTS]; -uniform vec4 uLightSpecular[MAX_LIGHTS]; - uniform float uThickness; /* Varyings */ @@ -39,58 +28,6 @@ varying vec4 vVertexColor; varying vec4 vSpecularColor; varying float vFogCoord; -void dirLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) -{ - vec3 L = normalize(-(uNMatrix * vec4(uLightDirection[index], 0.0)).xyz); - - ambient += uLightAmbient[index]; - - float NdotL = dot(normal, L); - - if (NdotL > 0.0) - { - diffuse += uLightDiffuse[index] * NdotL; - - vec3 E = normalize(-position); - vec3 HalfVector = normalize(L + E); - float NdotH = max(0.0, dot(normal, HalfVector)); - - float SpecularFactor = pow(NdotH, uMaterialShininess); - specular += uLightSpecular[index] * SpecularFactor; - } -} - -void pointLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) -{ - vec3 L = uLightPosition[index] - position; - float D = length(L); - L = normalize(L); - - float Attenuation = 1.0 / (uLightAttenuation[index].x + uLightAttenuation[index].y * D + - uLightAttenuation[index].z * D * D); - - ambient += uLightAmbient[index] * Attenuation; - - float NdotL = dot(normal, L); - - if (NdotL > 0.0) - { - diffuse += uLightDiffuse[index] * NdotL * Attenuation; - - vec3 E = normalize(-position); - vec3 HalfVector = normalize(L + E); - float NdotH = max(0.0, dot(normal, HalfVector)); - - float SpecularFactor = pow(NdotH, uMaterialShininess); - specular += uLightSpecular[index] * SpecularFactor * Attenuation; - } -} - -void spotLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) -{ - // TO-DO -} - void main() { gl_Position = uWVPMatrix * vec4(inVertexPosition, 1.0); @@ -104,48 +41,5 @@ void main() vec3 Position = (uWVMatrix * vec4(inVertexPosition, 1.0)).xyz; - if (uLightCount > 0) - { - vec3 Normal = normalize((uNMatrix * vec4(inVertexNormal, 0.0)).xyz); - - vec4 Ambient = vec4(0.0, 0.0, 0.0, 0.0); - vec4 Diffuse = vec4(0.0, 0.0, 0.0, 0.0); - - for (int i = 0; i < int(MAX_LIGHTS); i++) - { - if( i >= uLightCount ) // can't use uniform as loop-counter directly in glsl - break; - if (uLightType[i] == 0) - pointLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor); - } - - for (int i = 0; i < int(MAX_LIGHTS); i++) - { - if( i >= uLightCount ) - break; - if (uLightType[i] == 1) - spotLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor); - } - - for (int i = 0; i < int(MAX_LIGHTS); i++) - { - if( i >= uLightCount ) - break; - if (uLightType[i] == 2) - dirLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor); - } - - vec4 LightColor = Ambient * uMaterialAmbient + Diffuse * uMaterialDiffuse; - LightColor = clamp(LightColor, 0.0, 1.0); - LightColor.w = 1.0; - - vVertexColor *= LightColor; - vVertexColor += uMaterialEmissive; - vVertexColor += uGlobalAmbient * uMaterialAmbient; - vVertexColor = clamp(vVertexColor, 0.0, 1.0); - - vSpecularColor *= uMaterialSpecular; - } - vFogCoord = length(Position); } diff --git a/media/Shaders/COGLES2Solid2.vsh b/media/Shaders/COGLES2Solid2.vsh index 4575d170..85a44cf5 100644 --- a/media/Shaders/COGLES2Solid2.vsh +++ b/media/Shaders/COGLES2Solid2.vsh @@ -1,5 +1,3 @@ -#define MAX_LIGHTS 8 - /* Attributes */ attribute vec3 inVertexPosition; @@ -23,15 +21,6 @@ uniform vec4 uMaterialEmissive; uniform vec4 uMaterialSpecular; uniform float uMaterialShininess; -uniform int uLightCount; -uniform int uLightType[MAX_LIGHTS]; -uniform vec3 uLightPosition[MAX_LIGHTS]; -uniform vec3 uLightDirection[MAX_LIGHTS]; -uniform vec3 uLightAttenuation[MAX_LIGHTS]; -uniform vec4 uLightAmbient[MAX_LIGHTS]; -uniform vec4 uLightDiffuse[MAX_LIGHTS]; -uniform vec4 uLightSpecular[MAX_LIGHTS]; - uniform float uThickness; /* Varyings */ @@ -42,58 +31,6 @@ varying vec4 vVertexColor; varying vec4 vSpecularColor; varying float vFogCoord; -void dirLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) -{ - vec3 L = normalize(-(uNMatrix * vec4(uLightDirection[index], 0.0)).xyz); - - ambient += uLightAmbient[index]; - - float NdotL = dot(normal, L); - - if (NdotL > 0.0) - { - diffuse += uLightDiffuse[index] * NdotL; - - vec3 E = normalize(-position); - vec3 HalfVector = normalize(L + E); - float NdotH = max(0.0, dot(normal, HalfVector)); - - float SpecularFactor = pow(NdotH, uMaterialShininess); - specular += uLightSpecular[index] * SpecularFactor; - } -} - -void pointLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) -{ - vec3 L = uLightPosition[index] - position; - float D = length(L); - L = normalize(L); - - float Attenuation = 1.0 / (uLightAttenuation[index].x + uLightAttenuation[index].y * D + - uLightAttenuation[index].z * D * D); - - ambient += uLightAmbient[index] * Attenuation; - - float NdotL = dot(normal, L); - - if (NdotL > 0.0) - { - diffuse += uLightDiffuse[index] * NdotL * Attenuation; - - vec3 E = normalize(-position); - vec3 HalfVector = normalize(L + E); - float NdotH = max(0.0, dot(normal, HalfVector)); - - float SpecularFactor = pow(NdotH, uMaterialShininess); - specular += uLightSpecular[index] * SpecularFactor * Attenuation; - } -} - -void spotLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) -{ - // TO-DO -} - void main() { gl_Position = uWVPMatrix * vec4(inVertexPosition, 1.0); @@ -110,48 +47,5 @@ void main() vec3 Position = (uWVMatrix * vec4(inVertexPosition, 1.0)).xyz; - if (uLightCount > 0) - { - vec3 Normal = normalize((uNMatrix * vec4(inVertexNormal, 0.0)).xyz); - - vec4 Ambient = vec4(0.0, 0.0, 0.0, 0.0); - vec4 Diffuse = vec4(0.0, 0.0, 0.0, 0.0); - - for (int i = 0; i < int(MAX_LIGHTS); i++) - { - if( i >= uLightCount ) // can't use uniform as loop-counter directly in glsl - break; - if (uLightType[i] == 0) - pointLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor); - } - - for (int i = 0; i < int(MAX_LIGHTS); i++) - { - if( i >= uLightCount ) - break; - if (uLightType[i] == 1) - spotLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor); - } - - for (int i = 0; i < int(MAX_LIGHTS); i++) - { - if( i >= uLightCount ) - break; - if (uLightType[i] == 2) - dirLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor); - } - - vec4 LightColor = Ambient * uMaterialAmbient + Diffuse * uMaterialDiffuse; - LightColor = clamp(LightColor, 0.0, 1.0); - LightColor.w = 1.0; - - vVertexColor *= LightColor; - vVertexColor += uMaterialEmissive; - vVertexColor += uGlobalAmbient * uMaterialAmbient; - vVertexColor = clamp(vVertexColor, 0.0, 1.0); - - vSpecularColor *= uMaterialSpecular; - } - vFogCoord = length(Position); } diff --git a/media/Shaders/COGLES2SphereMap.vsh b/media/Shaders/COGLES2SphereMap.vsh index a178bb6d..d83a5f71 100644 --- a/media/Shaders/COGLES2SphereMap.vsh +++ b/media/Shaders/COGLES2SphereMap.vsh @@ -1,5 +1,3 @@ -#define MAX_LIGHTS 8 - /* Attributes */ attribute vec3 inVertexPosition; @@ -21,15 +19,6 @@ uniform vec4 uMaterialEmissive; uniform vec4 uMaterialSpecular; uniform float uMaterialShininess; -uniform int uLightCount; -uniform int uLightType[MAX_LIGHTS]; -uniform vec3 uLightPosition[MAX_LIGHTS]; -uniform vec3 uLightDirection[MAX_LIGHTS]; -uniform vec3 uLightAttenuation[MAX_LIGHTS]; -uniform vec4 uLightAmbient[MAX_LIGHTS]; -uniform vec4 uLightDiffuse[MAX_LIGHTS]; -uniform vec4 uLightSpecular[MAX_LIGHTS]; - uniform float uThickness; /* Varyings */ @@ -39,58 +28,6 @@ varying vec4 vVertexColor; varying vec4 vSpecularColor; varying float vFogCoord; -void dirLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) -{ - vec3 L = normalize(-(uNMatrix * vec4(uLightDirection[index], 0.0)).xyz); - - ambient += uLightAmbient[index]; - - float NdotL = dot(normal, L); - - if (NdotL > 0.0) - { - diffuse += uLightDiffuse[index] * NdotL; - - vec3 E = normalize(-position); - vec3 HalfVector = normalize(L + E); - float NdotH = max(0.0, dot(normal, HalfVector)); - - float SpecularFactor = pow(NdotH, uMaterialShininess); - specular += uLightSpecular[index] * SpecularFactor; - } -} - -void pointLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) -{ - vec3 L = uLightPosition[index] - position; - float D = length(L); - L = normalize(L); - - float Attenuation = 1.0 / (uLightAttenuation[index].x + uLightAttenuation[index].y * D + - uLightAttenuation[index].z * D * D); - - ambient += uLightAmbient[index] * Attenuation; - - float NdotL = dot(normal, L); - - if (NdotL > 0.0) - { - diffuse += uLightDiffuse[index] * NdotL * Attenuation; - - vec3 E = normalize(-position); - vec3 HalfVector = normalize(L + E); - float NdotH = max(0.0, dot(normal, HalfVector)); - - float SpecularFactor = pow(NdotH, uMaterialShininess); - specular += uLightSpecular[index] * SpecularFactor * Attenuation; - } -} - -void spotLight(in int index, in vec3 position, in vec3 normal, inout vec4 ambient, inout vec4 diffuse, inout vec4 specular) -{ - // TO-DO -} - void main() { gl_Position = uWVPMatrix * vec4(inVertexPosition, 1.0); @@ -107,48 +44,5 @@ void main() vVertexColor = inVertexColor.bgra; vSpecularColor = vec4(0.0, 0.0, 0.0, 0.0); - if (uLightCount > 0) - { - vec3 Normal = normalize((uNMatrix * vec4(inVertexNormal, 0.0)).xyz); - - vec4 Ambient = vec4(0.0, 0.0, 0.0, 0.0); - vec4 Diffuse = vec4(0.0, 0.0, 0.0, 0.0); - - for (int i = 0; i < int(MAX_LIGHTS); i++) - { - if( i >= uLightCount ) // can't use uniform as loop-counter directly in glsl - break; - if (uLightType[i] == 0) - pointLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor); - } - - for (int i = 0; i < int(MAX_LIGHTS); i++) - { - if( i >= uLightCount ) - break; - if (uLightType[i] == 1) - spotLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor); - } - - for (int i = 0; i < int(MAX_LIGHTS); i++) - { - if( i >= uLightCount ) - break; - if (uLightType[i] == 2) - dirLight(i, Position, Normal, Ambient, Diffuse, vSpecularColor); - } - - vec4 LightColor = Ambient * uMaterialAmbient + Diffuse * uMaterialDiffuse; - LightColor = clamp(LightColor, 0.0, 1.0); - LightColor.w = 1.0; - - vVertexColor *= LightColor; - vVertexColor += uMaterialEmissive; - vVertexColor += uGlobalAmbient * uMaterialAmbient; - vVertexColor = clamp(vVertexColor, 0.0, 1.0); - - vSpecularColor *= uMaterialSpecular; - } - vFogCoord = length(Position); } diff --git a/source/Irrlicht/CDefaultGUIElementFactory.cpp b/source/Irrlicht/CDefaultGUIElementFactory.cpp deleted file mode 100644 index d21fbd68..00000000 --- a/source/Irrlicht/CDefaultGUIElementFactory.cpp +++ /dev/null @@ -1,167 +0,0 @@ -// 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 - -#include "CDefaultGUIElementFactory.h" - -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUIEnvironment.h" - -#include "IGUIButton.h" -#include "IGUICheckBox.h" -#include "IGUIColorSelectDialog.h" -#include "IGUIComboBox.h" -#include "IGUIContextMenu.h" -#include "IGUIEditBox.h" -#include "IGUIFileOpenDialog.h" -#include "IGUIInOutFader.h" -#include "IGUIImage.h" -#include "IGUIListBox.h" -#include "IGUIMeshViewer.h" -#include "IGUIScrollBar.h" -#include "IGUISpinBox.h" -#include "IGUIStaticText.h" -#include "IGUITabControl.h" -#include "IGUITable.h" -#include "IGUIToolbar.h" -#include "IGUIWindow.h" -#include "IGUITreeView.h" -#include "IGUIProfiler.h" - -namespace irr -{ -namespace gui -{ - -CDefaultGUIElementFactory::CDefaultGUIElementFactory(IGUIEnvironment* env) -: Environment(env) -{ - - #ifdef _DEBUG - setDebugName("CDefaultGUIElementFactory"); - #endif - - // don't grab the gui environment here to prevent cyclic references -} - - -//! adds an element to the env based on its type id -IGUIElement* CDefaultGUIElementFactory::addGUIElement(EGUI_ELEMENT_TYPE type, IGUIElement* parent) -{ - switch(type) - { - case EGUIET_BUTTON: - return Environment->addButton(core::rect(0,0,100,100),parent); - case EGUIET_CHECK_BOX: - return Environment->addCheckBox(false, core::rect(0,0,100,100), parent); - case EGUIET_COLOR_SELECT_DIALOG: - return Environment->addColorSelectDialog(0,true,parent); - case EGUIET_COMBO_BOX: - return Environment->addComboBox(core::rect(0,0,100,100),parent); - case EGUIET_CONTEXT_MENU: - return Environment->addContextMenu(core::rect(0,0,100,100),parent); - case EGUIET_MENU: - return Environment->addMenu(parent); - case EGUIET_EDIT_BOX: - return Environment->addEditBox(0,core::rect(0,0,100,100),true, parent); - case EGUIET_FILE_OPEN_DIALOG: - return Environment->addFileOpenDialog(0,true,parent); - case EGUIET_IMAGE: - return Environment->addImage(0,core::position2di(0,0), true, parent); - case EGUIET_IN_OUT_FADER: - return Environment->addInOutFader(0,parent); - case EGUIET_LIST_BOX: - return Environment->addListBox(core::rect(0,0,100,100),parent); - case EGUIET_MESH_VIEWER: - return Environment->addMeshViewer(core::rect(0,0,100,100),parent); - case EGUIET_MODAL_SCREEN: - return Environment->addModalScreen(parent); - case EGUIET_MESSAGE_BOX: - return Environment->addMessageBox(0,0,false,0,parent); - case EGUIET_SCROLL_BAR: - return Environment->addScrollBar(false,core::rect(0,0,100,100),parent); - case EGUIET_STATIC_TEXT: - return Environment->addStaticText(0,core::rect(0,0,100,100),false,true,parent); - case EGUIET_TAB: - return Environment->addTab(core::rect(0,0,100,100),parent); - case EGUIET_TAB_CONTROL: - return Environment->addTabControl(core::rect(0,0,100,100),parent); - case EGUIET_TABLE: - return Environment->addTable(core::rect(0,0,100,100), parent); - case EGUIET_TOOL_BAR: - return Environment->addToolBar(parent); - case EGUIET_WINDOW: - return Environment->addWindow(core::rect(0,0,100,100),false,0,parent); - case EGUIET_SPIN_BOX: - return Environment->addSpinBox(L"0.0", core::rect(0,0,100,100), true, parent); - case EGUIET_TREE_VIEW: - return Environment->addTreeView(core::rect(0,0,100,100),parent); - case EGUIET_PROFILER: - return Environment->addProfilerDisplay(core::rect(0,0,100,100), parent); - default: - return 0; - } -} - - -//! adds an element to the environment based on its type name -IGUIElement* CDefaultGUIElementFactory::addGUIElement(const c8* typeName, IGUIElement* parent) -{ - return addGUIElement( getTypeFromName(typeName), parent ); -} - - -//! Returns the amount of element types this factory is able to create. -s32 CDefaultGUIElementFactory::getCreatableGUIElementTypeCount() const -{ - return EGUIET_COUNT; -} - - -//! Returns the type of a creatable element type. -EGUI_ELEMENT_TYPE CDefaultGUIElementFactory::getCreateableGUIElementType(s32 idx) const -{ - if (idx>=0 && idx=0 && idx=0 && typeaddMeshSceneNode(0, parent, -1, core::vector3df(), - core::vector3df(), core::vector3df(1,1,1), true); - case ESNT_EMPTY: - return Manager->addEmptySceneNode(parent); - case ESNT_DUMMY_TRANSFORMATION: - return Manager->addDummyTransformationSceneNode(parent); - case ESNT_CAMERA: - return Manager->addCameraSceneNode(parent); - case ESNT_BILLBOARD: - return Manager->addBillboardSceneNode(parent); - case ESNT_ANIMATED_MESH: - return Manager->addAnimatedMeshSceneNode(0, parent, -1, core::vector3df(), - core::vector3df(), core::vector3df(1,1,1), true); - default: - break; - } - - return 0; -} - - -//! adds a scene node to the scene graph based on its type name -ISceneNode* CDefaultSceneNodeFactory::addSceneNode(const c8* typeName, ISceneNode* parent) -{ - return addSceneNode( getTypeFromName(typeName), parent ); -} - - -//! returns amount of scene node types this factory is able to create -u32 CDefaultSceneNodeFactory::getCreatableSceneNodeTypeCount() const -{ - return SupportedSceneNodeTypes.size(); -} - - -//! returns type of a creatable scene node type -ESCENE_NODE_TYPE CDefaultSceneNodeFactory::getCreateableSceneNodeType(u32 idx) const -{ - if (idx SupportedSceneNodeTypes; - - ISceneManager* Manager; - }; - - -} // end namespace scene -} // end namespace irr - -#endif - diff --git a/source/Irrlicht/CFileSystem.cpp b/source/Irrlicht/CFileSystem.cpp index 2adbe63b..45e8680c 100644 --- a/source/Irrlicht/CFileSystem.cpp +++ b/source/Irrlicht/CFileSystem.cpp @@ -8,7 +8,6 @@ #include "IReadFile.h" #include "IWriteFile.h" #include "CZipReader.h" -#include "CMountPointReader.h" #include "CFileList.h" #include "stdio.h" #include "os.h" @@ -55,26 +54,6 @@ CFileSystem::CFileSystem() //! reset current working directory getWorkingDirectory(); -#ifdef __IRR_COMPILE_WITH_PAK_ARCHIVE_LOADER_ - ArchiveLoader.push_back(new CArchiveLoaderPAK(this)); -#endif - -#ifdef __IRR_COMPILE_WITH_NPK_ARCHIVE_LOADER_ - ArchiveLoader.push_back(new CArchiveLoaderNPK(this)); -#endif - -#ifdef __IRR_COMPILE_WITH_TAR_ARCHIVE_LOADER_ - ArchiveLoader.push_back(new CArchiveLoaderTAR(this)); -#endif - -#ifdef __IRR_COMPILE_WITH_WAD_ARCHIVE_LOADER_ - ArchiveLoader.push_back(new CArchiveLoaderWAD(this)); -#endif - -#ifdef __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_ - ArchiveLoader.push_back(new CArchiveLoaderMount(this)); -#endif - #ifdef __IRR_COMPILE_WITH_ZIP_ARCHIVE_LOADER_ ArchiveLoader.push_back(new CArchiveLoaderZIP(this)); #endif @@ -219,8 +198,6 @@ bool CFileSystem::addFileArchive(const io::path& filename, bool ignoreCase, bool ret = false; // see if archive is already added - if (changeArchivePassword(filename, password, retArchive)) - return true; s32 i; @@ -316,29 +293,6 @@ bool CFileSystem::addFileArchive(const io::path& filename, bool ignoreCase, return ret; } -// don't expose! -bool CFileSystem::changeArchivePassword(const path& filename, - const core::stringc& password, - IFileArchive** archive) -{ - for (s32 idx = 0; idx < (s32)FileArchives.size(); ++idx) - { - // TODO: This should go into a path normalization method - // We need to check for directory names with trailing slash and without - const path absPath = getAbsolutePath(filename); - const path arcPath = FileArchives[idx]->getFileList()->getPath(); - if ((absPath == arcPath) || ((absPath+_IRR_TEXT("/")) == arcPath)) - { - if (password.size()) - FileArchives[idx]->Password=password; - if (archive) - *archive = FileArchives[idx]; - return true; - } - } - - return false; -} bool CFileSystem::addFileArchive(IReadFile* file, bool ignoreCase, bool ignorePaths, E_FILE_ARCHIVE_TYPE archiveType, @@ -349,9 +303,6 @@ bool CFileSystem::addFileArchive(IReadFile* file, bool ignoreCase, if (file) { - if (changeArchivePassword(file->getFileName(), password, retArchive)) - return true; - IFileArchive* archive = 0; s32 i; diff --git a/source/Irrlicht/CFileSystem.h b/source/Irrlicht/CFileSystem.h index d5e9ec5c..d9b5fbce 100644 --- a/source/Irrlicht/CFileSystem.h +++ b/source/Irrlicht/CFileSystem.h @@ -14,8 +14,6 @@ namespace io { class CZipReader; - class CPakReader; - class CMountPointReader; /*! FileSystem which uses normal files and one zipfile @@ -129,11 +127,6 @@ public: private: - // don't expose, needs refactoring - bool changeArchivePassword(const path& filename, - const core::stringc& password, - IFileArchive** archive = 0); - //! Currently used FileSystemType EFileSystemType FileSystemType; //! WorkingDirectory for Native and Virtual filesystems diff --git a/source/Irrlicht/CGUIColorSelectDialog.cpp b/source/Irrlicht/CGUIColorSelectDialog.cpp deleted file mode 100644 index 29c5482d..00000000 --- a/source/Irrlicht/CGUIColorSelectDialog.cpp +++ /dev/null @@ -1,479 +0,0 @@ -// 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 - -#include "CGUIColorSelectDialog.h" - -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUISkin.h" -#include "IGUIEnvironment.h" -#include "IVideoDriver.h" -#include "IGUIButton.h" -#include "IGUIStaticText.h" -#include "IGUIFont.h" -#include "IGUISpriteBank.h" -#include "IFileList.h" -#include "os.h" -#include "fast_atof.h" - -namespace irr -{ -namespace gui -{ - -const s32 CSD_WIDTH = 350; -const s32 CSD_HEIGHT = 300; - -namespace -{ - -struct subElementPredefines -{ - const wchar_t *pre; - const wchar_t *init; - const wchar_t *post; - int x, y; - int range_down ,range_up; -}; - -static const subElementPredefines Template [] = -{ - { L"A:", L"0", 0,50,165, 0, 255 }, - { L"R:", L"0", 0,20,205, 0, 255 }, - { L"G:", L"0", 0,20,230, 0, 255 }, - { L"B:", L"0", 0,20,255, 0, 255 }, - { L"H:", L"0", L"°",80,205, 0, 360 }, - { L"S:", L"0", L"%",80,230, 0, 100 }, - { L"L:", L"0", L"%",80,255, 0, 100 }, -}; - -} - -//! constructor -CGUIColorSelectDialog::CGUIColorSelectDialog(const wchar_t* title, IGUIEnvironment* environment, IGUIElement* parent, s32 id) - : IGUIColorSelectDialog(environment, parent, id, - core::rect((parent->getAbsolutePosition().getWidth()-CSD_WIDTH)/2, - (parent->getAbsolutePosition().getHeight()-CSD_HEIGHT)/2, - (parent->getAbsolutePosition().getWidth()-CSD_WIDTH)/2+CSD_WIDTH, - (parent->getAbsolutePosition().getHeight()-CSD_HEIGHT)/2+CSD_HEIGHT)), - Dragging(false) -{ - #ifdef _DEBUG - IGUIElement::setDebugName("CGUIColorSelectDialog"); - #endif - - Text = title; - - IGUISkin* skin = Environment->getSkin(); - - const s32 buttonw = environment->getSkin()->getSize(EGDS_WINDOW_BUTTON_WIDTH); - const s32 posx = RelativeRect.getWidth() - buttonw - 4; - - CloseButton = Environment->addButton(core::rect(posx, 3, posx + buttonw, 3 + buttonw), - this, -1, L"", skin ? skin->getDefaultText(EGDT_WINDOW_CLOSE) : L"Close"); - if (skin && skin->getSpriteBank()) - { - CloseButton->setSpriteBank(skin->getSpriteBank()); - CloseButton->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_WINDOW_CLOSE), skin->getColor(EGDC_WINDOW_SYMBOL)); - CloseButton->setSprite(EGBS_BUTTON_DOWN, skin->getIcon(EGDI_WINDOW_CLOSE), skin->getColor(EGDC_WINDOW_SYMBOL)); - } - CloseButton->setSubElement(true); - CloseButton->setTabStop(false); - CloseButton->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT); - CloseButton->grab(); - - OKButton = Environment->addButton( - core::rect(RelativeRect.getWidth()-80, 30, RelativeRect.getWidth()-10, 50), - this, -1, skin ? skin->getDefaultText(EGDT_MSG_BOX_OK) : L"OK"); - OKButton->setSubElement(true); - OKButton->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT); - OKButton->grab(); - - CancelButton = Environment->addButton( - core::rect(RelativeRect.getWidth()-80, 55, RelativeRect.getWidth()-10, 75), - this, -1, skin ? skin->getDefaultText(EGDT_MSG_BOX_CANCEL) : L"Cancel"); - CancelButton->setSubElement(true); - CancelButton->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT); - CancelButton->grab(); - - video::IVideoDriver* driver = Environment->getVideoDriver(); - ColorRing.Texture = driver->getTexture ( "#colorring" ); - if ( 0 == ColorRing.Texture ) - { - buildColorRing(core::dimension2d(128, 128), 1, - Environment->getSkin()->getColor(EGDC_3D_SHADOW)); - } - - core::rect r(20,20, 0,0); - - ColorRing.Control = Environment->addImage(ColorRing.Texture, r.UpperLeftCorner, true, this); - ColorRing.Control->setSubElement(true); - ColorRing.Control->grab(); - - for ( u32 i = 0; i != sizeof (Template) / sizeof ( subElementPredefines ); ++i ) - { - if ( Template[i].pre ) - { - r.UpperLeftCorner.X = Template[i].x; - r.UpperLeftCorner.Y = Template[i].y; - r.LowerRightCorner.X = r.UpperLeftCorner.X + 15; - r.LowerRightCorner.Y = r.UpperLeftCorner.Y + 20; - IGUIElement *t = Environment->addStaticText(Template[i].pre, r, false, false, this); - t->setSubElement(true); - } - - if ( Template[i].post ) - { - r.UpperLeftCorner.X = Template[i].x + 56; - r.UpperLeftCorner.Y = Template[i].y; - r.LowerRightCorner.X = r.UpperLeftCorner.X + 15; - r.LowerRightCorner.Y = r.UpperLeftCorner.Y + 20; - IGUIElement *t = Environment->addStaticText( Template[i].post, r, false, false, this); - t->setSubElement(true); - } - - r.UpperLeftCorner.X = Template[i].x + 15; - r.UpperLeftCorner.Y = Template[i].y-2; - r.LowerRightCorner.X = r.UpperLeftCorner.X + 40; - r.LowerRightCorner.Y = r.UpperLeftCorner.Y + 20; - - gui::IGUISpinBox* spin = Environment->addSpinBox( Template[i].init, r, true, this); - spin->setSubElement(true); - spin->setDecimalPlaces(0); - spin->setRange((f32)Template[i].range_down, (f32)Template[i].range_up); - spin->grab(); - - Battery.push_back(spin); - } - - bringToFront(CancelButton); - bringToFront(OKButton); -} - - -//! destructor -CGUIColorSelectDialog::~CGUIColorSelectDialog() -{ - if (CloseButton) - CloseButton->drop(); - - if (OKButton) - OKButton->drop(); - - if (CancelButton) - CancelButton->drop(); - - for (u32 i = 0; i != Battery.size(); ++i) - Battery[i]->drop(); - - if (ColorRing.Control) - ColorRing.Control->drop(); -} - - -//! renders a antialiased, colored ring -void CGUIColorSelectDialog::buildColorRing( const core::dimension2d & dim, s32 supersample, const video::SColor& borderColor ) -{ - const core::dimension2d d(dim.Width * supersample, dim.Height * supersample); - video::IVideoDriver* driver = Environment->getVideoDriver(); - - video::IImage *RawTexture = driver->createImage(video::ECF_A8R8G8B8, d); - - RawTexture->fill ( 0x00808080 ); - - const s32 radiusOut = ( d.Width / 2 ) - 4; - const s32 fullR2 = radiusOut * radiusOut; - - video::SColorf rgb(0,0,0); - video::SColorHSL hsl; - hsl.Luminance = 50; - hsl.Saturation = 100; - - core::position2d p; - for ( p.Y = -radiusOut; p.Y <= radiusOut; p.Y += 1 ) - { - s32 y2 = p.Y * p.Y; - - for (p.X = -radiusOut; p.X <= radiusOut; p.X += 1) - { - s32 r2 = y2 + ( p.X * p.X ); - - // test point in circle - s32 testa = r2 - fullR2; - - if ( testa < 0 ) - { - // dotproduct u ( x,y ) * v ( 1, 0 ) = cosinus(a) - - const f32 r = sqrtf((f32) r2); - - // normalize, dotproduct = xnorm - const f32 xn = r == 0.f ? 0.f : -p.X * core::reciprocal(r); - - hsl.Hue = acosf(xn)*core::RADTODEG; - if ( p.Y > 0 ) - hsl.Hue = 360 - hsl.Hue; - hsl.Hue -= 90; - - const f32 rTest = r / radiusOut; -#if 0 - if (rTest < 0.33f) - { - // luminance from 0 to 50 - hsl.Luminance = 50*(rTest/0.33); - hsl.Saturation = 0.f; - hsl.toRGB(rgb); - } - else - if ( rTest < 0.66f ) - { - // saturation from 0 to 100 - hsl.Saturation = 100*(( rTest - 0.33f ) / 0.33f); - hsl.Luminance = 50; - hsl.toRGB(rgb); - } - else - { - // luminance from 50 to 100 - hsl.Luminance = 100*(0.5f + ( ( rTest - 0.66f ) / .66f )); - hsl.Saturation = 100; - hsl.toRGB(rgb); - } - // borders should be slightly transparent - if ( rTest >= 0.95f ) - rgb.a = (1.f-rTest)*20; - else - rgb.a=1.f; -#else - if ( rTest > 0.5f ) - { - hsl.Saturation = 100; - hsl.Luminance = 50; - hsl.toRGB(rgb); - } - // borders should be slightly transparent - if ( rTest < 0.5f ) - rgb.a = 0; - else if ( rTest >= 0.95f ) - rgb.a = (1.f-rTest)*20; - else if ( rTest <= 0.55f ) - rgb.a = (rTest-0.5f)*20; - else - rgb.a=1.f; -#endif - RawTexture->setPixel(4+p.X+radiusOut, 4+p.Y+radiusOut, rgb.toSColor()); - } - } - } - - if ( supersample > 1 ) - { - video::IImage * filter = driver->createImage(video::ECF_A8R8G8B8, dim ); - RawTexture->copyToScalingBoxFilter(filter); - RawTexture->drop(); - RawTexture = filter; - } - - bool generateMipLevels = driver->getTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS); - driver->setTextureCreationFlag( video::ETCF_CREATE_MIP_MAPS, false); - - ColorRing.Texture = driver->addTexture ( "#colorring", RawTexture); - RawTexture->drop(); - - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, generateMipLevels); -} - - -//! called if an event happened. -bool CGUIColorSelectDialog::OnEvent(const SEvent& event) -{ - if (isEnabled()) - { - switch(event.EventType) - { - case EET_GUI_EVENT: - switch(event.GUIEvent.EventType) - { - case EGET_SPINBOX_CHANGED: - { - for ( u32 i = 0; i!= Battery.size (); ++i ) - { - if ( event.GUIEvent.Caller == Battery[i] ) - { - if (i<4) - { - video::SColor rgb((u32)Battery[0]->getValue(), (u32)Battery[1]->getValue(), - (u32)Battery[2]->getValue(), (u32)Battery[3]->getValue()); - video::SColorHSL hsl; - video::SColorf rgb2(rgb); - hsl.fromRGB(rgb2); - Battery[4]->setValue(hsl.Hue); - Battery[5]->setValue(hsl.Saturation); - Battery[6]->setValue(hsl.Luminance); - } - else - { - video::SColorHSL hsl(Battery[4]->getValue(), Battery[5]->getValue(), - Battery[6]->getValue()); - video::SColorf rgb2; - hsl.toRGB(rgb2); - video::SColor rgb = rgb2.toSColor(); - Battery[1]->setValue((f32)rgb.getRed()); - Battery[2]->setValue((f32)rgb.getGreen()); - Battery[3]->setValue((f32)rgb.getBlue()); - } - } - } - return true; - } - - case EGET_ELEMENT_FOCUS_LOST: - Dragging = false; - break; - case EGET_BUTTON_CLICKED: - if (event.GUIEvent.Caller == CloseButton || - event.GUIEvent.Caller == CancelButton) - { - sendCancelEvent(); - remove(); - return true; - } - else - if (event.GUIEvent.Caller == OKButton) - { - sendSelectedEvent(); - remove(); - return true; - } - break; - - case EGET_LISTBOX_CHANGED: - case EGET_LISTBOX_SELECTED_AGAIN: - default: - break; - } - break; - case EET_MOUSE_INPUT_EVENT: - switch(event.MouseInput.Event) - { - case EMIE_LMOUSE_PRESSED_DOWN: - DragStart.X = event.MouseInput.X; - DragStart.Y = event.MouseInput.Y; - Dragging = true; - return true; - case EMIE_LMOUSE_LEFT_UP: - Dragging = false; - return true; - case EMIE_MOUSE_MOVED: - if (Dragging) - { - // gui window should not be dragged outside its parent - if (Parent) - if (event.MouseInput.X < Parent->getAbsolutePosition().UpperLeftCorner.X +1 || - event.MouseInput.Y < Parent->getAbsolutePosition().UpperLeftCorner.Y +1 || - event.MouseInput.X > Parent->getAbsolutePosition().LowerRightCorner.X -1 || - event.MouseInput.Y > Parent->getAbsolutePosition().LowerRightCorner.Y -1) - - return true; - - move(core::position2d(event.MouseInput.X - DragStart.X, event.MouseInput.Y - DragStart.Y)); - DragStart.X = event.MouseInput.X; - DragStart.Y = event.MouseInput.Y; - return true; - } - default: - break; - } - default: - break; - } - } - - return IGUIElement::OnEvent(event); -} - - -//! draws the element and its children -void CGUIColorSelectDialog::draw() -{ - if (!IsVisible) - return; - - IGUISkin* skin = Environment->getSkin(); - core::rect rect = skin->draw3DWindowBackground(this, true, skin->getColor(EGDC_ACTIVE_BORDER), - AbsoluteRect, &AbsoluteClippingRect); - - if (Text.size()) - { - rect.UpperLeftCorner.X += 2; - rect.LowerRightCorner.X -= skin->getSize(EGDS_WINDOW_BUTTON_WIDTH) + 5; - - IGUIFont* font = skin->getFont(EGDF_WINDOW); - if (font) - font->draw(Text.c_str(), rect, skin->getColor(EGDC_ACTIVE_CAPTION), false, true, - &AbsoluteClippingRect); - } - - IGUIElement::draw(); - - // draw color selector after the window elements - core::vector2di pos(ColorRing.Control->getAbsolutePosition().UpperLeftCorner); - pos.X += ColorRing.Texture->getOriginalSize().Width/2; - pos.Y += ColorRing.Texture->getOriginalSize().Height/2; -#if 0 - const f32 h = Battery[4]->getValue(); - const f32 s = Battery[5]->getValue(); - const f32 l = Battery[6]->getValue(); - const f32 factor = 58.f*(((s==0)&&(l<50))?(l*0.33f/50):( - (s<100)?((.33f+(s*0.33f/100))):((0.66f+(l-50)*0.33f/50)))); - -#else - const f32 factor = 44; -#endif - pos.X += core::round32(sinf(Battery[4]->getValue()*core::DEGTORAD)*factor); - pos.Y -= core::round32(cosf(Battery[4]->getValue()*core::DEGTORAD)*factor); - Environment->getVideoDriver()->draw2DPolygon(pos, 4, 0xffffffff, 4); -} - - -video::SColor CGUIColorSelectDialog::getColor() -{ - return video::SColor((u32)Battery[0]->getValue(), (u32)Battery[1]->getValue(), - (u32)Battery[2]->getValue(), (u32)Battery[3]->getValue()); -} - -video::SColorHSL CGUIColorSelectDialog::getColorHSL() -{ - return video::SColorHSL(Battery[4]->getValue(), Battery[5]->getValue(), - Battery[6]->getValue()); -} - -//! sends the event that the file has been selected. -void CGUIColorSelectDialog::sendSelectedEvent() -{ - SEvent event; - event.EventType = EET_GUI_EVENT; - event.GUIEvent.Caller = this; - event.GUIEvent.Element = 0; - event.GUIEvent.EventType = EGET_FILE_SELECTED; - Parent->OnEvent(event); -} - - -//! sends the event that the file choose process has been canceld -void CGUIColorSelectDialog::sendCancelEvent() -{ - SEvent event; - event.EventType = EET_GUI_EVENT; - event.GUIEvent.Caller = this; - event.GUIEvent.Element = 0; - event.GUIEvent.EventType = EGET_FILE_CHOOSE_DIALOG_CANCELLED; - Parent->OnEvent(event); -} - - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ diff --git a/source/Irrlicht/CGUIColorSelectDialog.h b/source/Irrlicht/CGUIColorSelectDialog.h deleted file mode 100644 index 8dbad50e..00000000 --- a/source/Irrlicht/CGUIColorSelectDialog.h +++ /dev/null @@ -1,74 +0,0 @@ -// 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 __C_GUI_COLOR_SELECT_DIALOG_H_INCLUDED__ -#define __C_GUI_COLOR_SELECT_DIALOG_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUIColorSelectDialog.h" -#include "IGUIButton.h" -#include "IGUISpinBox.h" -#include "IGUIImage.h" -#include "irrArray.h" - - -namespace irr -{ -namespace gui -{ - - class CGUIColorSelectDialog : public IGUIColorSelectDialog - { - public: - - //! constructor - CGUIColorSelectDialog(const wchar_t* title, IGUIEnvironment* environment, IGUIElement* parent, s32 id); - - //! destructor - virtual ~CGUIColorSelectDialog(); - - //! called if an event happened. - virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_; - - //! draws the element and its children - virtual void draw() _IRR_OVERRIDE_; - - virtual video::SColor getColor() _IRR_OVERRIDE_; - virtual video::SColorHSL getColorHSL() _IRR_OVERRIDE_; - - private: - - //! sends the event that the file has been selected. - void sendSelectedEvent(); - - //! sends the event that the file choose process has been canceld - void sendCancelEvent(); - - core::position2d DragStart; - bool Dragging; - IGUIButton* CloseButton; - IGUIButton* OKButton; - IGUIButton* CancelButton; - - core::array Battery; - - struct SColorCircle - { - IGUIImage * Control; - video::ITexture * Texture; - }; - SColorCircle ColorRing; - - void buildColorRing( const core::dimension2d & dim, s32 supersample, const video::SColor& borderColor ); - }; - - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - -#endif // __C_GUI_COLOR_SELECT_DIALOG_H_INCLUDED__ diff --git a/source/Irrlicht/CGUIContextMenu.cpp b/source/Irrlicht/CGUIContextMenu.cpp deleted file mode 100644 index 74e7687b..00000000 --- a/source/Irrlicht/CGUIContextMenu.cpp +++ /dev/null @@ -1,773 +0,0 @@ -// 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 - -#include "CGUIContextMenu.h" - -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUISkin.h" -#include "IGUIEnvironment.h" -#include "IVideoDriver.h" -#include "IGUIFont.h" -#include "IGUISpriteBank.h" -#include "os.h" - -namespace irr -{ -namespace gui -{ - - -//! constructor -CGUIContextMenu::CGUIContextMenu(IGUIEnvironment* environment, - IGUIElement* parent, s32 id, - core::rect rectangle, bool getFocus, bool allowFocus) - : IGUIContextMenu(environment, parent, id, rectangle), EventParent(0), LastFont(0), - CloseHandling(ECMC_REMOVE), HighLighted(-1), ChangeTime(0), AllowFocus(allowFocus) -{ - #ifdef _DEBUG - setDebugName("CGUIContextMenu"); - #endif - - Pos = rectangle.UpperLeftCorner; - recalculateSize(); - - if (getFocus) - Environment->setFocus(this); - - setNotClipped(true); -} - - -//! destructor -CGUIContextMenu::~CGUIContextMenu() -{ - for (u32 i=0; idrop(); - - if (LastFont) - LastFont->drop(); -} - -//! set behavior when menus are closed -void CGUIContextMenu::setCloseHandling(ECONTEXT_MENU_CLOSE onClose) -{ - CloseHandling = onClose; -} - -//! get current behavior when the menue will be closed -ECONTEXT_MENU_CLOSE CGUIContextMenu::getCloseHandling() const -{ - return CloseHandling; -} - -//! Returns amount of menu items -u32 CGUIContextMenu::getItemCount() const -{ - return Items.size(); -} - - -//! Adds a menu item. -u32 CGUIContextMenu::addItem(const wchar_t* text, s32 commandId, bool enabled, bool hasSubMenu, bool checked, bool autoChecking) -{ - return insertItem(Items.size(), text, commandId, enabled, hasSubMenu, checked, autoChecking); -} - -//! Insert a menu item at specified position. -u32 CGUIContextMenu::insertItem(u32 idx, const wchar_t* text, s32 commandId, bool enabled, - bool hasSubMenu, bool checked, bool autoChecking) -{ - SItem s; - s.Enabled = enabled; - s.Checked = checked; - s.AutoChecking = autoChecking; - s.Text = text; - s.IsSeparator = (text == 0); - s.SubMenu = 0; - s.CommandId = commandId; - s.PosY = 0; - - if (hasSubMenu) - { - s.SubMenu = new CGUIContextMenu(Environment, this, commandId, - core::rect(0,0,100,100), false, false); - s.SubMenu->setVisible(false); - } - - u32 result = idx; - if ( idx < Items.size() ) - { - Items.insert(s, idx); - } - else - { - Items.push_back(s); - result = Items.size() - 1; - } - - recalculateSize(); - return result; -} - -s32 CGUIContextMenu::findItemWithCommandId(s32 commandId, u32 idxStartSearch) const -{ - for ( u32 i=idxStartSearch; i= Items.size()) - return; - - if (menu) - menu->grab(); - if (Items[index].SubMenu) - Items[index].SubMenu->drop(); - - Items[index].SubMenu = menu; - - if (menu) - { - menu->setVisible(false); - menu->AllowFocus = false; - if ( Environment->getFocus() == menu ) - { - Environment->setFocus( this ); - } - } - - recalculateSize(); -} - - -//! Adds a separator item to the menu -void CGUIContextMenu::addSeparator() -{ - addItem(0, -1, true, false, false, false); -} - - -//! Returns text of the menu item. -const wchar_t* CGUIContextMenu::getItemText(u32 idx) const -{ - if (idx >= Items.size()) - return 0; - - return Items[idx].Text.c_str(); -} - - -//! Sets text of the menu item. -void CGUIContextMenu::setItemText(u32 idx, const wchar_t* text) -{ - if (idx >= Items.size()) - return; - - Items[idx].Text = text; - recalculateSize(); -} - -//! should the element change the checked status on clicking -void CGUIContextMenu::setItemAutoChecking(u32 idx, bool autoChecking) -{ - if ( idx >= Items.size()) - return; - - Items[idx].AutoChecking = autoChecking; -} - -//! does the element change the checked status on clicking -bool CGUIContextMenu::getItemAutoChecking(u32 idx) const -{ - if (idx >= Items.size()) - return false; - - return Items[idx].AutoChecking; -} - - -//! Returns if a menu item is enabled -bool CGUIContextMenu::isItemEnabled(u32 idx) const -{ - if (idx >= Items.size()) - { - return false; - } - - return Items[idx].Enabled; -} - - -//! Returns if a menu item is checked -bool CGUIContextMenu::isItemChecked(u32 idx) const -{ - if (idx >= Items.size()) - { - return false; - } - - return Items[idx].Checked; -} - - -//! Sets if the menu item should be enabled. -void CGUIContextMenu::setItemEnabled(u32 idx, bool enabled) -{ - if (idx >= Items.size()) - return; - - Items[idx].Enabled = enabled; -} - - -//! Sets if the menu item should be checked. -void CGUIContextMenu::setItemChecked(u32 idx, bool checked ) -{ - if (idx >= Items.size()) - return; - - Items[idx].Checked = checked; -} - - -//! Removes a menu item -void CGUIContextMenu::removeItem(u32 idx) -{ - if (idx >= Items.size()) - return; - - if (Items[idx].SubMenu) - { - Items[idx].SubMenu->drop(); - Items[idx].SubMenu = 0; - } - - Items.erase(idx); - recalculateSize(); -} - - -//! Removes all menu items -void CGUIContextMenu::removeAllItems() -{ - for (u32 i=0; idrop(); - - Items.clear(); - recalculateSize(); -} - - -//! called if an event happened. -bool CGUIContextMenu::OnEvent(const SEvent& event) -{ - if (isEnabled()) - { - - switch(event.EventType) - { - case EET_GUI_EVENT: - switch(event.GUIEvent.EventType) - { - case EGET_ELEMENT_FOCUS_LOST: - if (event.GUIEvent.Caller == this && !isMyChild(event.GUIEvent.Element) && AllowFocus) - { - // set event parent of submenus - IGUIElement * p = EventParent ? EventParent : Parent; - if ( p ) // can be 0 when element got removed already - { - setEventParent(p); - - SEvent eventClose; - eventClose.EventType = EET_GUI_EVENT; - eventClose.GUIEvent.Caller = this; - eventClose.GUIEvent.Element = 0; - eventClose.GUIEvent.EventType = EGET_ELEMENT_CLOSED; - if ( !p->OnEvent(eventClose) ) - { - if ( CloseHandling & ECMC_HIDE ) - { - setVisible(false); - } - if ( CloseHandling & ECMC_REMOVE ) - { - remove(); - } - } - } - - return false; - } - break; - case EGET_ELEMENT_FOCUSED: - if (event.GUIEvent.Caller == this && !AllowFocus) - { - return true; - } - break; - default: - break; - } - break; - case EET_MOUSE_INPUT_EVENT: - switch(event.MouseInput.Event) - { - case EMIE_LMOUSE_LEFT_UP: - { - // menu might be removed if it loses focus in sendClick, so grab a reference - grab(); - const u32 t = sendClick(core::position2d(event.MouseInput.X, event.MouseInput.Y)); - if ((t==0 || t==1) && Environment->hasFocus(this)) - Environment->removeFocus(this); - drop(); - } - return true; - case EMIE_LMOUSE_PRESSED_DOWN: - return true; - case EMIE_MOUSE_MOVED: - if (Environment->hasFocus(this)) - highlight(core::position2d(event.MouseInput.X, event.MouseInput.Y), true); - return true; - default: - break; - } - break; - default: - break; - } - } - - return IGUIElement::OnEvent(event); -} - - -//! Sets the visible state of this element. -void CGUIContextMenu::setVisible(bool visible) -{ - HighLighted = -1; - ChangeTime = os::Timer::getTime(); - for (u32 j=0; jsetVisible(false); - - IGUIElement::setVisible(visible); -} - - -//! sends a click Returns: -//! 0 if click went outside of the element, -//! 1 if a valid button was clicked, -//! 2 if a nonclickable element was clicked -u32 CGUIContextMenu::sendClick(const core::position2d& p) -{ - u32 t = 0; - - // get number of open submenu - s32 openmenu = -1; - s32 j; - for (j=0; j<(s32)Items.size(); ++j) - if (Items[j].SubMenu && Items[j].SubMenu->isVisible()) - { - openmenu = j; - break; - } - - // delegate click operation to submenu - if (openmenu != -1) - { - t = Items[j].SubMenu->sendClick(p); - if (t != 0) - return t; // clicked something - } - - // check click on myself - if (isPointInside(p) && - (u32)HighLighted < Items.size()) - { - if (!Items[HighLighted].Enabled || - Items[HighLighted].IsSeparator || - Items[HighLighted].SubMenu) - return 2; - - if ( Items[HighLighted].AutoChecking ) - { - Items[HighLighted].Checked = Items[HighLighted].Checked ? false : true; - } - - SEvent event; - event.EventType = EET_GUI_EVENT; - event.GUIEvent.Caller = this; - event.GUIEvent.Element = 0; - event.GUIEvent.EventType = EGET_MENU_ITEM_SELECTED; - if (EventParent) - EventParent->OnEvent(event); - else if (Parent) - Parent->OnEvent(event); - - return 1; - } - - return 0; -} - - -//! returns true, if an element was highligted -bool CGUIContextMenu::highlight(const core::position2d& p, bool canOpenSubMenu) -{ - if (!isEnabled()) - { - return false; - } - - // get number of open submenu - s32 openmenu = -1; - s32 i; - for (i=0; i<(s32)Items.size(); ++i) - if (Items[i].Enabled && Items[i].SubMenu && Items[i].SubMenu->isVisible()) - { - openmenu = i; - break; - } - - // delegate highlight operation to submenu - if (openmenu != -1) - { - if (Items[openmenu].Enabled && Items[openmenu].SubMenu->highlight(p, canOpenSubMenu)) - { - HighLighted = openmenu; - ChangeTime = os::Timer::getTime(); - return true; - } - } - - // highlight myself - for (i=0; i<(s32)Items.size(); ++i) - { - if (Items[i].Enabled && getHRect(Items[i], AbsoluteRect).isPointInside(p)) - { - HighLighted = i; - ChangeTime = os::Timer::getTime(); - - // make submenus visible/invisible - for (s32 j=0; j<(s32)Items.size(); ++j) - if (Items[j].SubMenu) - { - if ( j == i && canOpenSubMenu && Items[j].Enabled ) - Items[j].SubMenu->setVisible(true); - else if ( j != i ) - Items[j].SubMenu->setVisible(false); - } - return true; - } - } - - HighLighted = openmenu; - return false; -} - - -//! returns the item highlight-area -core::rect CGUIContextMenu::getHRect(const SItem& i, const core::rect& absolute) const -{ - core::rect r = absolute; - r.UpperLeftCorner.Y += i.PosY; - r.LowerRightCorner.Y = r.UpperLeftCorner.Y + i.Dim.Height; - return r; -} - - -//! Gets drawing rect of Item -core::rect CGUIContextMenu::getRect(const SItem& i, const core::rect& absolute) const -{ - core::rect r = absolute; - r.UpperLeftCorner.Y += i.PosY; - r.LowerRightCorner.Y = r.UpperLeftCorner.Y + i.Dim.Height; - r.UpperLeftCorner.X += 20; - return r; -} - - -//! draws the element and its children -void CGUIContextMenu::draw() -{ - if (!IsVisible) - return; - - IGUISkin* skin = Environment->getSkin(); - - if (!skin) - return; - - IGUIFont* font = skin->getFont(EGDF_MENU); - if (font != LastFont) - { - if (LastFont) - LastFont->drop(); - LastFont = font; - if (LastFont) - LastFont->grab(); - - recalculateSize(); - } - - IGUISpriteBank* sprites = skin->getSpriteBank(); - - core::rect rect = AbsoluteRect; - core::rect* clip = 0; - - // draw frame - skin->draw3DMenuPane(this, AbsoluteRect, clip); - - // loop through all menu items - - rect = AbsoluteRect; - s32 y = AbsoluteRect.UpperLeftCorner.Y; - - for (s32 i=0; i<(s32)Items.size(); ++i) - { - if (Items[i].IsSeparator) - { - // draw separator - rect = AbsoluteRect; - rect.UpperLeftCorner.Y += Items[i].PosY + 3; - rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + 1; - rect.UpperLeftCorner.X += 5; - rect.LowerRightCorner.X -= 5; - skin->draw2DRectangle(this, skin->getColor(EGDC_3D_SHADOW), rect, clip); - - rect.LowerRightCorner.Y += 1; - rect.UpperLeftCorner.Y += 1; - skin->draw2DRectangle(this, skin->getColor(EGDC_3D_HIGH_LIGHT), rect, clip); - - y += 10; - } - else - { - rect = getRect(Items[i], AbsoluteRect); - - // draw highlighted - - if (i == HighLighted && Items[i].Enabled) - { - core::rect r = AbsoluteRect; - r.LowerRightCorner.Y = rect.LowerRightCorner.Y; - r.UpperLeftCorner.Y = rect.UpperLeftCorner.Y; - r.LowerRightCorner.X -= 5; - r.UpperLeftCorner.X += 5; - skin->draw2DRectangle(this, skin->getColor(EGDC_HIGH_LIGHT), r, clip); - } - - // draw text - - EGUI_DEFAULT_COLOR c = EGDC_BUTTON_TEXT; - - if (i == HighLighted) - c = EGDC_HIGH_LIGHT_TEXT; - - if (!Items[i].Enabled) - c = EGDC_GRAY_TEXT; - - if (font) - font->draw(Items[i].Text.c_str(), rect, - skin->getColor(c), false, true, clip); - - // draw submenu symbol - if (Items[i].SubMenu && sprites) - { - core::rect r = rect; - r.UpperLeftCorner.X = r.LowerRightCorner.X - 15; - - sprites->draw2DSprite(skin->getIcon(EGDI_CURSOR_RIGHT), - r.getCenter(), clip, skin->getColor(c), - (i == HighLighted) ? ChangeTime : 0, - (i == HighLighted) ? os::Timer::getTime() : 0, - (i == HighLighted), true); - } - - // draw checked symbol - if (Items[i].Checked && sprites) - { - core::rect r = rect; - r.LowerRightCorner.X = r.UpperLeftCorner.X - 15; - r.UpperLeftCorner.X = r.LowerRightCorner.X + 15; - sprites->draw2DSprite(skin->getIcon(EGDI_CHECK_BOX_CHECKED), - r.getCenter(), clip, skin->getColor(c), - (i == HighLighted) ? ChangeTime : 0, - (i == HighLighted) ? os::Timer::getTime() : 0, - (i == HighLighted), true); - } - } - } - - IGUIElement::draw(); -} - - -void CGUIContextMenu::recalculateSize() -{ - IGUIFont* font = Environment->getSkin()->getFont(EGDF_MENU); - - if (!font) - return; - - core::rect rect; - rect.UpperLeftCorner = RelativeRect.UpperLeftCorner; - u32 width = 100; - u32 height = 3; - - u32 i; - for (i=0; igetDimension(Items[i].Text.c_str()); - Items[i].Dim.Width += 40; - - if (Items[i].Dim.Width > width) - width = Items[i].Dim.Width; - } - - Items[i].PosY = height; - height += Items[i].Dim.Height; - } - - height += 5; - - if (height < 10) - height = 10; - - rect.LowerRightCorner.X = RelativeRect.UpperLeftCorner.X + width; - rect.LowerRightCorner.Y = RelativeRect.UpperLeftCorner.Y + height; - - setRelativePosition(rect); - - // recalculate submenus - for (i=0; igetAbsolutePosition().getWidth(); - const s32 h = Items[i].SubMenu->getAbsolutePosition().getHeight(); - - core::rect subRect(width-5, Items[i].PosY, width+w-5, Items[i].PosY+h); - - gui::IGUIElement * root = Environment->getRootGUIElement(); - if ( root ) - { - core::rect rectRoot( root->getAbsolutePosition() ); - - // if it would be drawn beyond the right border, then add it to the left side - if ( getAbsolutePosition().UpperLeftCorner.X+subRect.LowerRightCorner.X > rectRoot.LowerRightCorner.X ) - { - subRect.UpperLeftCorner.X = -w; - subRect.LowerRightCorner.X = 0; - } - - // if it would be drawn below bottom border, move it up, but not further than to top. - irr::s32 belowBottom = getAbsolutePosition().UpperLeftCorner.Y+subRect.LowerRightCorner.Y - rectRoot.LowerRightCorner.Y; - if ( belowBottom > 0 ) - { - irr::s32 belowTop = getAbsolutePosition().UpperLeftCorner.Y+subRect.UpperLeftCorner.Y; - irr::s32 moveUp = belowBottom < belowTop ? belowBottom : belowTop; - subRect.UpperLeftCorner.Y -= moveUp; - subRect.LowerRightCorner.Y -= moveUp; - } - } - - Items[i].SubMenu->setRelativePosition(subRect); - } - } -} - - -//! Returns the selected item in the menu -s32 CGUIContextMenu::getSelectedItem() const -{ - return HighLighted; -} - - -//! \return Returns a pointer to the submenu of an item. -IGUIContextMenu* CGUIContextMenu::getSubMenu(u32 idx) const -{ - if (idx >= Items.size()) - return 0; - - return Items[idx].SubMenu; -} - - -//! Returns command id of a menu item -s32 CGUIContextMenu::getItemCommandId(u32 idx) const -{ - if (idx >= Items.size()) - return -1; - - return Items[idx].CommandId; -} - - -//! Sets the command id of a menu item -void CGUIContextMenu::setItemCommandId(u32 idx, s32 id) -{ - if (idx >= Items.size()) - return; - - Items[idx].CommandId = id; -} - - -// because sometimes the element has no parent at click time -void CGUIContextMenu::setEventParent(IGUIElement *parent) -{ - EventParent = parent; - - for (u32 i=0; isetEventParent(parent); -} - - -bool CGUIContextMenu::hasOpenSubMenu() const -{ - for (u32 i=0; iisVisible()) - return true; - - return false; -} - - -void CGUIContextMenu::closeAllSubMenus() -{ - for (u32 i=0; isetVisible(false); - - //HighLighted = -1; -} - - -} // end namespace -} // end namespace - -#endif // _IRR_COMPILE_WITH_GUI_ - diff --git a/source/Irrlicht/CGUIContextMenu.h b/source/Irrlicht/CGUIContextMenu.h deleted file mode 100644 index f2780e82..00000000 --- a/source/Irrlicht/CGUIContextMenu.h +++ /dev/null @@ -1,168 +0,0 @@ -// 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 __C_GUI_CONTEXT_MENU_H_INCLUDED__ -#define __C_GUI_CONTEXT_MENU_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUIContextMenu.h" -#include "irrString.h" -#include "irrArray.h" -#include "IGUIFont.h" - -namespace irr -{ -namespace gui -{ - - //! GUI Context menu interface. - class CGUIContextMenu : public IGUIContextMenu - { - public: - - //! constructor - CGUIContextMenu(IGUIEnvironment* environment, - IGUIElement* parent, s32 id, core::rect rectangle, - bool getFocus = true, bool allowFocus = true); - - //! destructor - virtual ~CGUIContextMenu(); - - //! set behavior when menus are closed - virtual void setCloseHandling(ECONTEXT_MENU_CLOSE onClose) _IRR_OVERRIDE_; - - //! get current behavior when the menue will be closed - virtual ECONTEXT_MENU_CLOSE getCloseHandling() const _IRR_OVERRIDE_; - - //! Returns amount of menu items - virtual u32 getItemCount() const _IRR_OVERRIDE_; - - //! Adds a menu item. - virtual u32 addItem(const wchar_t* text, s32 commandid, - bool enabled, bool hasSubMenu, bool checked, bool autoChecking) _IRR_OVERRIDE_; - - //! Insert a menu item at specified position. - virtual u32 insertItem(u32 idx, const wchar_t* text, s32 commandId, bool enabled, - bool hasSubMenu, bool checked, bool autoChecking) _IRR_OVERRIDE_; - - //! Find a item which has the given CommandId starting from given index - virtual s32 findItemWithCommandId(s32 commandId, u32 idxStartSearch) const _IRR_OVERRIDE_; - - //! Adds a separator item to the menu - virtual void addSeparator() _IRR_OVERRIDE_; - - //! Returns text of the menu item. - virtual const wchar_t* getItemText(u32 idx) const _IRR_OVERRIDE_; - - //! Sets text of the menu item. - virtual void setItemText(u32 idx, const wchar_t* text) _IRR_OVERRIDE_; - - //! Returns if a menu item is enabled - virtual bool isItemEnabled(u32 idx) const _IRR_OVERRIDE_; - - //! Sets if the menu item should be enabled. - virtual void setItemEnabled(u32 idx, bool enabled) _IRR_OVERRIDE_; - - //! Returns if a menu item is checked - virtual bool isItemChecked(u32 idx) const _IRR_OVERRIDE_; - - //! Sets if the menu item should be checked. - virtual void setItemChecked(u32 idx, bool enabled) _IRR_OVERRIDE_; - - //! Removes a menu item - virtual void removeItem(u32 idx) _IRR_OVERRIDE_; - - //! Removes all menu items - virtual void removeAllItems() _IRR_OVERRIDE_; - - //! called if an event happened. - virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_; - - //! draws the element and its children - virtual void draw() _IRR_OVERRIDE_; - - //! Returns the selected item in the menu - virtual s32 getSelectedItem() const _IRR_OVERRIDE_; - - //! Returns a pointer to the submenu of an item. - //! \return Pointer to the submenu of an item. - virtual IGUIContextMenu* getSubMenu(u32 idx) const _IRR_OVERRIDE_; - - //! Sets the visible state of this element. - virtual void setVisible(bool visible) _IRR_OVERRIDE_; - - //! should the element change the checked status on clicking - virtual void setItemAutoChecking(u32 idx, bool autoChecking) _IRR_OVERRIDE_; - - //! does the element change the checked status on clicking - virtual bool getItemAutoChecking(u32 idx) const _IRR_OVERRIDE_; - - //! Returns command id of a menu item - virtual s32 getItemCommandId(u32 idx) const _IRR_OVERRIDE_; - - //! Sets the command id of a menu item - virtual void setItemCommandId(u32 idx, s32 id) _IRR_OVERRIDE_; - - //! Adds a sub menu from an element that already exists. - virtual void setSubMenu(u32 index, CGUIContextMenu* menu); - - //! When an eventparent is set it receives events instead of the usual parent element - virtual void setEventParent(IGUIElement *parent) _IRR_OVERRIDE_; - - protected: - - void closeAllSubMenus(); - bool hasOpenSubMenu() const; - - struct SItem - { - core::stringw Text; - bool IsSeparator; - bool Enabled; - bool Checked; - bool AutoChecking; - core::dimension2d Dim; - s32 PosY; - CGUIContextMenu* SubMenu; - s32 CommandId; - }; - - virtual void recalculateSize(); - - //! returns true, if an element was highlighted - virtual bool highlight(const core::position2d& p, bool canOpenSubMenu); - - //! sends a click Returns: - //! 0 if click went outside of the element, - //! 1 if a valid button was clicked, - //! 2 if a nonclickable element was clicked - virtual u32 sendClick(const core::position2d& p); - - //! returns the item highlight-area - virtual core::rect getHRect(const SItem& i, const core::rect& absolute) const; - - //! Gets drawing rect of Item - virtual core::rect getRect(const SItem& i, const core::rect& absolute) const; - - - core::array Items; - core::position2d Pos; - IGUIElement* EventParent; - IGUIFont *LastFont; - ECONTEXT_MENU_CLOSE CloseHandling; - s32 HighLighted; - u32 ChangeTime; - bool AllowFocus; - }; - - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - -#endif // __C_GUI_CONTEXT_MENU_H_INCLUDED__ - diff --git a/source/Irrlicht/CGUIEnvironment.cpp b/source/Irrlicht/CGUIEnvironment.cpp index 0a12af35..6d15706b 100644 --- a/source/Irrlicht/CGUIEnvironment.cpp +++ b/source/Irrlicht/CGUIEnvironment.cpp @@ -11,33 +11,19 @@ #include "CGUISkin.h" #include "CGUIButton.h" -#include "CGUIWindow.h" #include "CGUIScrollBar.h" #include "CGUIFont.h" #include "CGUISpriteBank.h" #include "CGUIImage.h" -#include "CGUIMeshViewer.h" #include "CGUICheckBox.h" #include "CGUIListBox.h" -#include "CGUITreeView.h" #include "CGUIImageList.h" #include "CGUIFileOpenDialog.h" -#include "CGUIColorSelectDialog.h" #include "CGUIStaticText.h" #include "CGUIEditBox.h" -#include "CGUISpinBox.h" -#include "CGUIInOutFader.h" -#include "CGUIMessageBox.h" -#include "CGUIModalScreen.h" #include "CGUITabControl.h" -#include "CGUIContextMenu.h" #include "CGUIComboBox.h" -#include "CGUIMenu.h" -#include "CGUIToolBar.h" -#include "CGUITable.h" -#include "CGUIProfiler.h" -#include "CDefaultGUIElementFactory.h" #include "IWriteFile.h" #include "BuiltInFont.h" @@ -69,11 +55,6 @@ CGUIEnvironment::CGUIEnvironment(io::IFileSystem* fs, video::IVideoDriver* drive IGUIEnvironment::setDebugName("CGUIEnvironment"); #endif - // gui factory - IGUIElementFactory* factory = new CDefaultGUIElementFactory(this); - registerGUIElementFactory(factory); - factory->drop(); - loadBuiltInFont(); IGUISkin* skin = createSkin( gui::EGST_WINDOWS_METALLIC ); @@ -140,10 +121,6 @@ CGUIEnvironment::~CGUIEnvironment() for (i=0; idrop(); - // remove all factories - for (i=0; idrop(); - if (Operator) { Operator->drop(); @@ -707,106 +684,6 @@ IGUISkin* CGUIEnvironment::createSkin(EGUI_SKIN_TYPE type) } -//! Returns the default element factory which can create all built in elements -IGUIElementFactory* CGUIEnvironment::getDefaultGUIElementFactory() const -{ - return getGUIElementFactory(0); -} - - -//! Adds an element factory to the gui environment. -/** Use this to extend the gui environment with new element types which it should be -able to create automatically, for example when loading data from xml files. */ -void CGUIEnvironment::registerGUIElementFactory(IGUIElementFactory* factoryToAdd) -{ - if (factoryToAdd) - { - factoryToAdd->grab(); - GUIElementFactoryList.push_back(factoryToAdd); - } -} - - -//! Returns amount of registered scene node factories. -u32 CGUIEnvironment::getRegisteredGUIElementFactoryCount() const -{ - return GUIElementFactoryList.size(); -} - - -//! Returns a scene node factory by index -IGUIElementFactory* CGUIEnvironment::getGUIElementFactory(u32 index) const -{ - if (index < GUIElementFactoryList.size()) - return GUIElementFactoryList[index]; - else - return 0; -} - - -//! adds a GUI Element using its name -IGUIElement* CGUIEnvironment::addGUIElement(const c8* elementName, IGUIElement* parent) -{ - IGUIElement* node=0; - - if (!parent) - parent = this; - - for (s32 i=GUIElementFactoryList.size()-1; i>=0 && !node; --i) - node = GUIElementFactoryList[i]->addGUIElement(elementName, parent); - - - return node; -} - - -//! Saves the current gui into a file. -//! \param filename: Name of the file . -bool CGUIEnvironment::saveGUI(const io::path& filename, IGUIElement* start) -{ - io::IWriteFile* file = FileSystem->createAndWriteFile(filename); - if (!file) - { - return false; - } - - bool ret = saveGUI(file, start); - file->drop(); - return ret; -} - - -//! Saves the current gui into a file. -bool CGUIEnvironment::saveGUI(io::IWriteFile* file, IGUIElement* start) -{ - return false; -} - - -//! Loads the gui. Note that the current gui is not cleared before. -//! \param filename: Name of the file. -bool CGUIEnvironment::loadGUI(const io::path& filename, IGUIElement* parent) -{ - io::IReadFile* read = FileSystem->createAndOpenFile(filename); - if (!read) - { - os::Printer::log("Unable to open gui file", filename, ELL_ERROR); - return false; - } - - bool ret = loadGUI(read, parent); - read->drop(); - - return ret; -} - - -//! Loads the gui. Note that the current gui is not cleared before. -bool CGUIEnvironment::loadGUI(io::IReadFile* file, IGUIElement* parent) -{ - return false; -} - //! adds a button. The returned pointer must not be dropped. IGUIButton* CGUIEnvironment::addButton(const core::rect& rectangle, IGUIElement* parent, s32 id, const wchar_t* text, const wchar_t *tooltiptext) { @@ -822,83 +699,6 @@ IGUIButton* CGUIEnvironment::addButton(const core::rect& rectangle, IGUIEle } -//! adds a window. The returned pointer must not be dropped. -IGUIWindow* CGUIEnvironment::addWindow(const core::rect& rectangle, bool modal, - const wchar_t* text, IGUIElement* parent, s32 id) -{ - parent = parent ? parent : this; - - IGUIWindow* win = new CGUIWindow(this, parent, id, rectangle); - if (text) - win->setText(text); - win->drop(); - - if (modal) - { - // Careful, don't just set the modal as parent above. That will mess up the focus (and is hard to change because we have to be very - // careful not to get virtual function call, like OnEvent, in the window. - CGUIModalScreen * modalScreen = new CGUIModalScreen(this, parent, -1); - modalScreen->drop(); - modalScreen->addChild(win); - } - - return win; -} - - -//! adds a modal screen. The returned pointer must not be dropped. -IGUIElement* CGUIEnvironment::addModalScreen(IGUIElement* parent, int blinkMode) -{ - parent = parent ? parent : this; - - CGUIModalScreen *win = new CGUIModalScreen(this, parent, -1); - win->setBlinkMode(blinkMode); - win->drop(); - - return win; -} - - -//! Adds a message box. -IGUIWindow* CGUIEnvironment::addMessageBox(const wchar_t* caption, const wchar_t* text, - bool modal, s32 flag, IGUIElement* parent, s32 id, video::ITexture* image) -{ - if (!CurrentSkin) - return 0; - - parent = parent ? parent : this; - - core::rect rect; - core::dimension2d screenDim, msgBoxDim; - - screenDim.Width = parent->getAbsolutePosition().getWidth(); - screenDim.Height = parent->getAbsolutePosition().getHeight(); - msgBoxDim.Width = 2; - msgBoxDim.Height = 2; - - rect.UpperLeftCorner.X = (screenDim.Width - msgBoxDim.Width) / 2; - rect.UpperLeftCorner.Y = (screenDim.Height - msgBoxDim.Height) / 2; - rect.LowerRightCorner.X = rect.UpperLeftCorner.X + msgBoxDim.Width; - rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + msgBoxDim.Height; - - IGUIWindow* win = new CGUIMessageBox(this, caption, text, flag, - parent, id, rect, image); - win->drop(); - - if (modal) - { - // Careful, don't just set the modal as parent above. That will mess up the focus (and is hard to change because we have to be very - // careful not to get virtual function call, like OnEvent, in the CGUIMessageBox. - CGUIModalScreen * modalScreen = new CGUIModalScreen(this, parent, -1); - modalScreen->drop(); - modalScreen->addChild( win ); - } - - - return win; -} - - //! adds a scrollbar. The returned pointer must not be dropped. IGUIScrollBar* CGUIEnvironment::addScrollBar(bool horizontal, const core::rect& rectangle, IGUIElement* parent, s32 id) { @@ -907,21 +707,6 @@ IGUIScrollBar* CGUIEnvironment::addScrollBar(bool horizontal, const core::rect& rectangle, IGUIElement* parent, s32 id, bool drawBackground) -{ - CGUITable* b = new CGUITable(this, parent ? parent : this, id, rectangle, true, drawBackground, false); - b->drop(); - return b; -} - - //! Adds an element to display the information from the Irrlicht profiler -IGUIProfiler* CGUIEnvironment::addProfilerDisplay(const core::rect& rectangle, IGUIElement* parent, s32 id) -{ - CGUIProfiler* p = new CGUIProfiler(this, parent ? parent : this, id, rectangle, NULL); - p->drop(); - return p; -} //! Adds an image element. IGUIImage* CGUIEnvironment::addImage(video::ITexture* image, core::position2d pos, @@ -965,20 +750,6 @@ IGUIImage* CGUIEnvironment::addImage(const core::rect& rectangle, IGUIEleme } -//! adds an mesh viewer. The returned pointer must not be dropped. -IGUIMeshViewer* CGUIEnvironment::addMeshViewer(const core::rect& rectangle, IGUIElement* parent, s32 id, const wchar_t* text) -{ - IGUIMeshViewer* v = new CGUIMeshViewer(this, parent ? parent : this, - id, rectangle); - - if (text) - v->setText(text); - - v->drop(); - return v; -} - - //! adds a checkbox IGUICheckBox* CGUIEnvironment::addCheckBox(bool checked, const core::rect& rectangle, IGUIElement* parent, s32 id, const wchar_t* text) { @@ -1013,19 +784,6 @@ IGUIListBox* CGUIEnvironment::addListBox(const core::rect& rectangle, return b; } -//! adds a tree view -IGUITreeView* CGUIEnvironment::addTreeView(const core::rect& rectangle, - IGUIElement* parent, s32 id, - bool drawBackground, - bool scrollBarVertical, bool scrollBarHorizontal) -{ - IGUITreeView* b = new CGUITreeView(this, parent ? parent : this, id, rectangle, - true, drawBackground, scrollBarVertical, scrollBarHorizontal); - - b->setIconFont ( getBuiltInFont () ); - b->drop(); - return b; -} //! adds a file open dialog. The returned pointer must not be dropped. IGUIFileOpenDialog* CGUIEnvironment::addFileOpenDialog(const wchar_t* title, @@ -1034,42 +792,13 @@ IGUIFileOpenDialog* CGUIEnvironment::addFileOpenDialog(const wchar_t* title, { parent = parent ? parent : this; + if (modal) + return nullptr; + IGUIFileOpenDialog* d = new CGUIFileOpenDialog(title, this, parent, id, restoreCWD, startDir); d->drop(); - if (modal) - { - // Careful, don't just set the modal as parent above. That will mess up the focus (and is hard to change because we have to be very - // careful not to get virtual function call, like OnEvent, in the window. - CGUIModalScreen * modalScreen = new CGUIModalScreen(this, parent, -1); - modalScreen->drop(); - modalScreen->addChild(d); - } - - return d; -} - - -//! adds a color select dialog. The returned pointer must not be dropped. -IGUIColorSelectDialog* CGUIEnvironment::addColorSelectDialog(const wchar_t* title, - bool modal, IGUIElement* parent, s32 id) -{ - parent = parent ? parent : this; - - IGUIColorSelectDialog* d = new CGUIColorSelectDialog( title, - this, parent, id); - d->drop(); - - if (modal) - { - // Careful, don't just set the modal as parent above. That will mess up the focus (and is hard to change because we have to be very - // careful not to get virtual function call, like OnEvent, in the window. - CGUIModalScreen * modalScreen = new CGUIModalScreen(this, parent, -1); - modalScreen->drop(); - modalScreen->addChild(d); - } - return d; } @@ -1103,19 +832,6 @@ IGUIEditBox* CGUIEnvironment::addEditBox(const wchar_t* text, } -//! Adds a spin box to the environment -IGUISpinBox* CGUIEnvironment::addSpinBox(const wchar_t* text, - const core::rect &rectangle, - bool border,IGUIElement* parent, s32 id) -{ - IGUISpinBox* d = new CGUISpinBox(text, border,this, - parent ? parent : this, id, rectangle); - - d->drop(); - return d; -} - - //! Adds a tab control to the environment. IGUITabControl* CGUIEnvironment::addTabControl(const core::rect& rectangle, IGUIElement* parent, bool fillbackground, bool border, s32 id) @@ -1138,65 +854,6 @@ IGUITab* CGUIEnvironment::addTab(const core::rect& rectangle, } -//! Adds a context menu to the environment. -IGUIContextMenu* CGUIEnvironment::addContextMenu(const core::rect& rectangle, - IGUIElement* parent, s32 id) -{ - IGUIContextMenu* c = new CGUIContextMenu(this, - parent ? parent : this, id, rectangle, true); - c->drop(); - return c; -} - - -//! Adds a menu to the environment. -IGUIContextMenu* CGUIEnvironment::addMenu(IGUIElement* parent, s32 id) -{ - if (!parent) - parent = this; - - IGUIContextMenu* c = new CGUIMenu(this, - parent, id, core::rect(0,0, - parent->getAbsolutePosition().getWidth(), - parent->getAbsolutePosition().getHeight())); - - c->drop(); - return c; -} - - -//! Adds a toolbar to the environment. It is like a menu is always placed on top -//! in its parent, and contains buttons. -IGUIToolBar* CGUIEnvironment::addToolBar(IGUIElement* parent, s32 id) -{ - if (!parent) - parent = this; - - IGUIToolBar* b = new CGUIToolBar(this, parent, id, core::rect(0,0,10,10)); - b->drop(); - return b; -} - - -//! Adds an element for fading in or out. -IGUIInOutFader* CGUIEnvironment::addInOutFader(const core::rect* rectangle, IGUIElement* parent, s32 id) -{ - core::rect rect; - - if (rectangle) - rect = *rectangle; - else if (Driver) - rect = core::rect(core::dimension2di(Driver->getScreenSize())); - - if (!parent) - parent = this; - - IGUIInOutFader* fader = new CGUIInOutFader(this, parent, id, rect); - fader->drop(); - return fader; -} - - //! Adds a combo box to the environment. IGUIComboBox* CGUIEnvironment::addComboBox(const core::rect& rectangle, IGUIElement* parent, s32 id) diff --git a/source/Irrlicht/CGUIEnvironment.h b/source/Irrlicht/CGUIEnvironment.h index 87694e95..5cf30c8b 100644 --- a/source/Irrlicht/CGUIEnvironment.h +++ b/source/Irrlicht/CGUIEnvironment.h @@ -92,17 +92,6 @@ public: //! adds an button. The returned pointer must not be dropped. virtual IGUIButton* addButton(const core::rect& rectangle, IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0,const wchar_t* tooltiptext = 0) _IRR_OVERRIDE_; - //! adds a window. The returned pointer must not be dropped. - virtual IGUIWindow* addWindow(const core::rect& rectangle, bool modal = false, - const wchar_t* text=0, IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_; - - //! adds a modal screen. The returned pointer must not be dropped. - virtual IGUIElement* addModalScreen(IGUIElement* parent, int blinkMode) _IRR_OVERRIDE_; - - //! Adds a message box. - virtual IGUIWindow* addMessageBox(const wchar_t* caption, const wchar_t* text=0, - bool modal = true, s32 flag = EMBF_OK, IGUIElement* parent=0, s32 id=-1, video::ITexture* image=0) _IRR_OVERRIDE_; - //! adds a scrollbar. The returned pointer must not be dropped. virtual IGUIScrollBar* addScrollBar(bool horizontal, const core::rect& rectangle, IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_; @@ -123,24 +112,11 @@ public: virtual IGUIListBox* addListBox(const core::rect& rectangle, IGUIElement* parent=0, s32 id=-1, bool drawBackground=false) _IRR_OVERRIDE_; - //! adds a tree view - virtual IGUITreeView* addTreeView(const core::rect& rectangle, - IGUIElement* parent=0, s32 id=-1, bool drawBackground=false, - bool scrollBarVertical = true, bool scrollBarHorizontal = false) _IRR_OVERRIDE_; - - //! adds an mesh viewer. The returned pointer must not be dropped. - virtual IGUIMeshViewer* addMeshViewer(const core::rect& rectangle, - IGUIElement* parent=0, s32 id=-1, const wchar_t* text=0) _IRR_OVERRIDE_; - //! Adds a file open dialog. virtual IGUIFileOpenDialog* addFileOpenDialog(const wchar_t* title = 0, bool modal=true, IGUIElement* parent=0, s32 id=-1, bool restoreCWD=false, io::path::char_type* startDir=0) _IRR_OVERRIDE_; - //! Adds a color select dialog. - virtual IGUIColorSelectDialog* addColorSelectDialog(const wchar_t* title = 0, - bool modal=true, IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_; - //! adds a static text. The returned pointer must not be dropped. virtual IGUIStaticText* addStaticText(const wchar_t* text, const core::rect& rectangle, bool border=false, bool wordWrap=true, IGUIElement* parent=0, s32 id=-1, bool drawBackground = false) _IRR_OVERRIDE_; @@ -149,10 +125,6 @@ public: virtual IGUIEditBox* addEditBox(const wchar_t* text, const core::rect& rectangle, bool border=false, IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_; - //! Adds a spin box to the environment - virtual IGUISpinBox* addSpinBox(const wchar_t* text, const core::rect& rectangle, - bool border=false,IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_; - //! Adds a tab control to the environment. virtual IGUITabControl* addTabControl(const core::rect& rectangle, IGUIElement* parent=0, bool fillbackground=false, bool border=true, s32 id=-1) _IRR_OVERRIDE_; @@ -161,29 +133,10 @@ public: virtual IGUITab* addTab(const core::rect& rectangle, IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_; - //! Adds a context menu to the environment. - virtual IGUIContextMenu* addContextMenu(const core::rect& rectangle, - IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_; - - //! Adds a menu to the environment. - virtual IGUIContextMenu* addMenu(IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_; - - //! Adds a toolbar to the environment. It is like a menu is always placed on top - //! in its parent, and contains buttons. - virtual IGUIToolBar* addToolBar(IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_; - //! Adds a combo box to the environment. virtual IGUIComboBox* addComboBox(const core::rect& rectangle, IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_; - //! Adds a table element. - virtual IGUITable* addTable(const core::rect& rectangle, - IGUIElement* parent=0, s32 id=-1, bool drawBackground=false) _IRR_OVERRIDE_; - - //! Adds an element to display the information from the Irrlicht profiler - virtual IGUIProfiler* addProfilerDisplay(const core::rect& rectangle, - IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_; - //! sets the focus to an element virtual bool setFocus(IGUIElement* element) _IRR_OVERRIDE_; @@ -199,55 +152,11 @@ public: //! Returns the element last known to be under the mouse virtual IGUIElement* getHovered() const _IRR_OVERRIDE_; - //! Adds an element for fading in or out. - virtual IGUIInOutFader* addInOutFader(const core::rect* rectangle=0, IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_; - //! Returns the root gui element. virtual IGUIElement* getRootGUIElement() _IRR_OVERRIDE_; virtual void OnPostRender( u32 time ) _IRR_OVERRIDE_; - //! Returns the default element factory which can create all built in elements - virtual IGUIElementFactory* getDefaultGUIElementFactory() const _IRR_OVERRIDE_; - - //! Adds an element factory to the gui environment. - /** Use this to extend the gui environment with new element types which it should be - able to create automatically, for example when loading data from xml files. */ - virtual void registerGUIElementFactory(IGUIElementFactory* factoryToAdd) _IRR_OVERRIDE_; - - //! Returns amount of registered scene node factories. - virtual u32 getRegisteredGUIElementFactoryCount() const _IRR_OVERRIDE_; - - //! Returns a scene node factory by index - virtual IGUIElementFactory* getGUIElementFactory(u32 index) const _IRR_OVERRIDE_; - - //! Adds a GUI Element by its name - virtual IGUIElement* addGUIElement(const c8* elementName, IGUIElement* parent=0) _IRR_OVERRIDE_; - - //! Saves the current gui into a file. - /** \param filename: Name of the file. - \param start: The element to start saving from. - if not specified, the root element will be used */ - virtual bool saveGUI( const io::path& filename, IGUIElement* start=0) _IRR_OVERRIDE_; - - //! Saves the current gui into a file. - /** \param file: The file to save the GUI to. - \param start: The element to start saving from. - if not specified, the root element will be used */ - virtual bool saveGUI(io::IWriteFile* file, IGUIElement* start=0) _IRR_OVERRIDE_; - - //! Loads the gui. Note that the current gui is not cleared before. - /** \param filename: Name of the file. - \param parent: The parent of all loaded GUI elements, - if not specified, the root element will be used */ - virtual bool loadGUI(const io::path& filename, IGUIElement* parent=0) _IRR_OVERRIDE_; - - //! Loads the gui. Note that the current gui is not cleared before. - /** \param file: IReadFile to load the GUI from - \param parent: The parent of all loaded GUI elements, - if not specified, the root element will be used */ - virtual bool loadGUI(io::IReadFile* file, IGUIElement* parent=0) _IRR_OVERRIDE_; - //! Find the next element which would be selected when pressing the tab-key virtual IGUIElement* getNextElement(bool reverse=false, bool group=false) _IRR_OVERRIDE_; @@ -302,8 +211,6 @@ private: SToolTip ToolTip; - core::array GUIElementFactoryList; - core::array Fonts; core::array Banks; video::IVideoDriver* Driver; diff --git a/source/Irrlicht/CGUIInOutFader.cpp b/source/Irrlicht/CGUIInOutFader.cpp deleted file mode 100644 index e909e0e4..00000000 --- a/source/Irrlicht/CGUIInOutFader.cpp +++ /dev/null @@ -1,156 +0,0 @@ -// 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 - -#include "CGUIInOutFader.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUIEnvironment.h" -#include "IVideoDriver.h" -#include "os.h" - -namespace irr -{ -namespace gui -{ - - -//! constructor -CGUIInOutFader::CGUIInOutFader(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle) -: IGUIInOutFader(environment, parent, id, rectangle) -{ - #ifdef _DEBUG - setDebugName("CGUIInOutFader"); - #endif - - Action = EFA_NOTHING; - StartTime = 0; - EndTime = 0; - - setColor(video::SColor(0,0,0,0)); -} - - -//! draws the element and its children -void CGUIInOutFader::draw() -{ - if (!IsVisible || !Action) - return; - - u32 now = os::Timer::getTime(); - if (now > EndTime && Action == EFA_FADE_IN) - { - Action = EFA_NOTHING; - return; - } - - video::IVideoDriver* driver = Environment->getVideoDriver(); - - if (driver) - { - f32 d; - - if (now > EndTime) - d = 0.0f; - else - d = (EndTime - now) / (f32)(EndTime - StartTime); - - video::SColor newCol = FullColor.getInterpolated(TransColor, d); - driver->draw2DRectangle(newCol, AbsoluteRect, &AbsoluteClippingRect); - } - - IGUIElement::draw(); -} - - -//! Gets the color to fade out to or to fade in from. -video::SColor CGUIInOutFader::getColor() const -{ - return Color[1]; -} - - -//! Sets the color to fade out to or to fade in from. -void CGUIInOutFader::setColor(video::SColor color) -{ - video::SColor s = color; - video::SColor d = color; - - s.setAlpha ( 255 ); - d.setAlpha ( 0 ); - setColor ( s,d ); - -/* - Color[0] = color; - - FullColor = Color[0]; - TransColor = Color[0]; - - if (Action == EFA_FADE_OUT) - { - FullColor.setAlpha(0); - TransColor.setAlpha(255); - } - else - if (Action == EFA_FADE_IN) - { - FullColor.setAlpha(255); - TransColor.setAlpha(0); - } -*/ -} - - -void CGUIInOutFader::setColor(video::SColor source, video::SColor dest) -{ - Color[0] = source; - Color[1] = dest; - - if (Action == EFA_FADE_OUT) - { - FullColor = Color[1]; - TransColor = Color[0]; - } - else - if (Action == EFA_FADE_IN) - { - FullColor = Color[0]; - TransColor = Color[1]; - } - -} - - -//! Returns if the fade in or out process is done. -bool CGUIInOutFader::isReady() const -{ - u32 now = os::Timer::getTime(); - bool ret = (now > EndTime); - return ret; -} - - -//! Starts the fade in process. -void CGUIInOutFader::fadeIn(u32 time) -{ - StartTime = os::Timer::getTime(); - EndTime = StartTime + time; - Action = EFA_FADE_IN; - setColor(Color[0],Color[1]); -} - - -//! Starts the fade out process. -void CGUIInOutFader::fadeOut(u32 time) -{ - StartTime = os::Timer::getTime(); - EndTime = StartTime + time; - Action = EFA_FADE_OUT; - setColor(Color[0],Color[1]); -} - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - diff --git a/source/Irrlicht/CGUIInOutFader.h b/source/Irrlicht/CGUIInOutFader.h deleted file mode 100644 index 2321c85e..00000000 --- a/source/Irrlicht/CGUIInOutFader.h +++ /dev/null @@ -1,69 +0,0 @@ -// 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 __C_GUI_IN_OUT_FADER_H_INCLUDED__ -#define __C_GUI_IN_OUT_FADER_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUIInOutFader.h" - -namespace irr -{ -namespace gui -{ - - class CGUIInOutFader : public IGUIInOutFader - { - public: - - //! constructor - CGUIInOutFader(IGUIEnvironment* environment, IGUIElement* parent, - s32 id, core::rect rectangle); - - //! draws the element and its children - virtual void draw() _IRR_OVERRIDE_; - - //! Gets the color to fade out to or to fade in from. - virtual video::SColor getColor() const _IRR_OVERRIDE_; - - //! Sets the color to fade out to or to fade in from. - virtual void setColor(video::SColor color ) _IRR_OVERRIDE_; - virtual void setColor(video::SColor source, video::SColor dest) _IRR_OVERRIDE_; - - //! Starts the fade in process. - virtual void fadeIn(u32 time) _IRR_OVERRIDE_; - - //! Starts the fade out process. - virtual void fadeOut(u32 time) _IRR_OVERRIDE_; - - //! Returns if the fade in or out process is done. - virtual bool isReady() const _IRR_OVERRIDE_; - - private: - - enum EFadeAction - { - EFA_NOTHING = 0, - EFA_FADE_IN, - EFA_FADE_OUT - }; - - u32 StartTime; - u32 EndTime; - EFadeAction Action; - - video::SColor Color[2]; - video::SColor FullColor; - video::SColor TransColor; - }; - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - -#endif // __C_GUI_IN_OUT_FADER_H_INCLUDED__ - diff --git a/source/Irrlicht/CGUIMenu.cpp b/source/Irrlicht/CGUIMenu.cpp deleted file mode 100644 index 37e9ec31..00000000 --- a/source/Irrlicht/CGUIMenu.cpp +++ /dev/null @@ -1,289 +0,0 @@ -// 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 - -#include "CGUIMenu.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUISkin.h" -#include "IGUIEnvironment.h" -#include "IVideoDriver.h" -#include "IGUIFont.h" -#include "IGUIWindow.h" - -#include "os.h" - -namespace irr -{ -namespace gui -{ - -//! constructor -CGUIMenu::CGUIMenu(IGUIEnvironment* environment, IGUIElement* parent, - s32 id, core::rect rectangle) - : CGUIContextMenu(environment, parent, id, rectangle, false, true) -{ - #ifdef _DEBUG - setDebugName("CGUIMenu"); - #endif - - Type = EGUIET_MENU; - - setNotClipped(false); - - recalculateSize(); -} - - -//! draws the element and its children -void CGUIMenu::draw() -{ - if (!IsVisible) - return; - - IGUISkin* skin = Environment->getSkin(); - IGUIFont* font = skin->getFont(EGDF_MENU); - - if (font != LastFont) - { - if (LastFont) - LastFont->drop(); - LastFont = font; - if (LastFont) - LastFont->grab(); - - recalculateSize(); - } - - core::rect rect = AbsoluteRect; - - // draw frame - - skin->draw3DToolBar(this, rect, &AbsoluteClippingRect); - - // loop through all menu items - - rect = AbsoluteRect; - - for (s32 i=0; i<(s32)Items.size(); ++i) - { - if (!Items[i].IsSeparator) - { - rect = getRect(Items[i], AbsoluteRect); - - // draw highlighted - if (i == HighLighted && Items[i].Enabled) - { - skin->draw3DSunkenPane(this, skin->getColor(EGDC_3D_DARK_SHADOW), - true, true, rect, &AbsoluteClippingRect); - } - // draw text - - EGUI_DEFAULT_COLOR c = EGDC_BUTTON_TEXT; - - if (i == HighLighted) - c = EGDC_HIGH_LIGHT_TEXT; - - if (!Items[i].Enabled) - c = EGDC_GRAY_TEXT; - - if (font) - font->draw(Items[i].Text.c_str(), rect, - skin->getColor(c), true, true, &AbsoluteClippingRect); - } - } - - IGUIElement::draw(); -} - - -//! called if an event happened. -bool CGUIMenu::OnEvent(const SEvent& event) -{ - if (isEnabled()) - { - - switch(event.EventType) - { - case EET_GUI_EVENT: - switch(event.GUIEvent.EventType) - { - case gui::EGET_ELEMENT_FOCUS_LOST: - if (event.GUIEvent.Caller == this && !isMyChild(event.GUIEvent.Element)) - { - closeAllSubMenus(); - HighLighted = -1; - } - break; - case gui::EGET_ELEMENT_FOCUSED: - if (event.GUIEvent.Caller == this && Parent) - { - Parent->bringToFront(this); - } - break; - default: - break; - } - break; - case EET_MOUSE_INPUT_EVENT: - switch(event.MouseInput.Event) - { - case EMIE_LMOUSE_PRESSED_DOWN: - { - if (Parent) - Parent->bringToFront(this); - - core::position2d p(event.MouseInput.X, event.MouseInput.Y); - bool shouldCloseSubMenu = hasOpenSubMenu(); - if (!AbsoluteClippingRect.isPointInside(p)) - { - shouldCloseSubMenu = false; - } - highlight(core::position2d(event.MouseInput.X, event.MouseInput.Y), true); - if ( shouldCloseSubMenu ) - { - Environment->removeFocus(this); - } - - return true; - } - case EMIE_LMOUSE_LEFT_UP: - { - core::position2d p(event.MouseInput.X, event.MouseInput.Y); - if (!AbsoluteClippingRect.isPointInside(p)) - { - s32 t = sendClick(p); - if ((t==0 || t==1) && Environment->hasFocus(this)) - Environment->removeFocus(this); - } - - return true; - } - case EMIE_MOUSE_MOVED: - if (Environment->hasFocus(this) && HighLighted >= 0) - { - s32 oldHighLighted = HighLighted; - highlight(core::position2d(event.MouseInput.X, event.MouseInput.Y), true); - if ( HighLighted < 0 ) - HighLighted = oldHighLighted; // keep last hightlight active when moving outside the area - } - return true; - default: - break; - } - break; - default: - break; - } - } - - return IGUIElement::OnEvent(event); -} - -void CGUIMenu::recalculateSize() -{ - core::rect clientRect; // client rect of parent - if ( Parent && Parent->hasType(EGUIET_WINDOW) ) - { - clientRect = static_cast(Parent)->getClientRect(); - } - else if ( Parent ) - { - clientRect = core::rect(0,0, Parent->getAbsolutePosition().getWidth(), - Parent->getAbsolutePosition().getHeight()); - } - else - { - clientRect = RelativeRect; - } - - - IGUISkin* skin = Environment->getSkin(); - IGUIFont* font = skin->getFont(EGDF_MENU); - - if (!font) - { - if (Parent && skin) - RelativeRect = core::rect(clientRect.UpperLeftCorner.X, clientRect.UpperLeftCorner.Y, - clientRect.LowerRightCorner.X, clientRect.UpperLeftCorner.Y+skin->getSize(EGDS_MENU_HEIGHT)); - return; - } - - core::rect rect; - rect.UpperLeftCorner = clientRect.UpperLeftCorner; - s32 height = font->getDimension(L"A").Height + 5; - //if (skin && height < skin->getSize ( EGDS_MENU_HEIGHT )) - // height = skin->getSize(EGDS_MENU_HEIGHT); - s32 width = rect.UpperLeftCorner.X; - s32 i; - - for (i=0; i<(s32)Items.size(); ++i) - { - if (Items[i].IsSeparator) - { - Items[i].Dim.Width = 0; - Items[i].Dim.Height = height; - } - else - { - Items[i].Dim = font->getDimension(Items[i].Text.c_str()); - Items[i].Dim.Width += 20; - } - - Items[i].PosY = width; - width += Items[i].Dim.Width; - } - - width = clientRect.getWidth(); - - rect.LowerRightCorner.X = rect.UpperLeftCorner.X + width; - rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + height; - - setRelativePosition(rect); - - // recalculate submenus - for (i=0; i<(s32)Items.size(); ++i) - if (Items[i].SubMenu) - { - // move submenu - s32 w = Items[i].SubMenu->getAbsolutePosition().getWidth(); - s32 h = Items[i].SubMenu->getAbsolutePosition().getHeight(); - - Items[i].SubMenu->setRelativePosition( - core::rect(Items[i].PosY, height , - Items[i].PosY+w-5, height+h)); - } -} - - -//! returns the item highlight-area -core::rect CGUIMenu::getHRect(const SItem& i, const core::rect& absolute) const -{ - core::rect r = absolute; - r.UpperLeftCorner.X += i.PosY; - r.LowerRightCorner.X = r.UpperLeftCorner.X + i.Dim.Width; - return r; -} - - -//! Gets drawing rect of Item -core::rect CGUIMenu::getRect(const SItem& i, const core::rect& absolute) const -{ - return getHRect(i, absolute); -} - - -void CGUIMenu::updateAbsolutePosition() -{ - if (Parent) - DesiredRect.LowerRightCorner.X = Parent->getAbsolutePosition().getWidth(); - - IGUIElement::updateAbsolutePosition(); -} - - -} // end namespace -} // end namespace - -#endif // _IRR_COMPILE_WITH_GUI_ - diff --git a/source/Irrlicht/CGUIMenu.h b/source/Irrlicht/CGUIMenu.h deleted file mode 100644 index 7e5f9fcd..00000000 --- a/source/Irrlicht/CGUIMenu.h +++ /dev/null @@ -1,52 +0,0 @@ -// 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 __C_GUI_MENU_H_INCLUDED__ -#define __C_GUI_MENU_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "CGUIContextMenu.h" - -namespace irr -{ -namespace gui -{ - - //! GUI menu interface. - class CGUIMenu : public CGUIContextMenu - { - public: - - //! constructor - CGUIMenu(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle); - - //! draws the element and its children - virtual void draw() _IRR_OVERRIDE_; - - //! called if an event happened. - virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_; - - //! Updates the absolute position. - virtual void updateAbsolutePosition() _IRR_OVERRIDE_; - - protected: - - virtual void recalculateSize() _IRR_OVERRIDE_; - - //! returns the item highlight-area - virtual core::rect getHRect(const SItem& i, const core::rect& absolute) const _IRR_OVERRIDE_; - - //! Gets drawing rect of Item - virtual core::rect getRect(const SItem& i, const core::rect& absolute) const _IRR_OVERRIDE_; - }; - -} // end namespace gui -} // end namespace irr - - -#endif // __C_GUI_MENU_H_INCLUDED__ -#endif // _IRR_COMPILE_WITH_GUI_ - diff --git a/source/Irrlicht/CGUIMeshViewer.cpp b/source/Irrlicht/CGUIMeshViewer.cpp deleted file mode 100644 index fa310f84..00000000 --- a/source/Irrlicht/CGUIMeshViewer.cpp +++ /dev/null @@ -1,171 +0,0 @@ -// 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 - -#include "CGUIMeshViewer.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUIEnvironment.h" -#include "IVideoDriver.h" -#include "IAnimatedMesh.h" -#include "IMesh.h" -#include "os.h" -#include "IGUISkin.h" - -namespace irr -{ - -namespace gui -{ - - -//! constructor -CGUIMeshViewer::CGUIMeshViewer(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle) -: IGUIMeshViewer(environment, parent, id, rectangle), Mesh(0) -{ - #ifdef _DEBUG - setDebugName("CGUIMeshViewer"); - #endif -} - - -//! destructor -CGUIMeshViewer::~CGUIMeshViewer() -{ - if (Mesh) - Mesh->drop(); -} - - -//! sets the mesh to be shown -void CGUIMeshViewer::setMesh(scene::IAnimatedMesh* mesh) -{ - if (mesh) - mesh->grab(); - if (Mesh) - Mesh->drop(); - - Mesh = mesh; - - /* This might be used for proper transformation etc. - core::vector3df center(0.0f,0.0f,0.0f); - core::aabbox3d box; - - box = Mesh->getMesh(0)->getBoundingBox(); - center = (box.MaxEdge + box.MinEdge) / 2; - */ -} - - -//! Gets the displayed mesh -scene::IAnimatedMesh* CGUIMeshViewer::getMesh() const -{ - return Mesh; -} - - -//! sets the material -void CGUIMeshViewer::setMaterial(const video::SMaterial& material) -{ - Material = material; -} - - -//! gets the material -const video::SMaterial& CGUIMeshViewer::getMaterial() const -{ - return Material; -} - - -//! called if an event happened. -bool CGUIMeshViewer::OnEvent(const SEvent& event) -{ - return IGUIElement::OnEvent(event); -} - - -//! draws the element and its children -void CGUIMeshViewer::draw() -{ - if (!IsVisible) - return; - - IGUISkin* skin = Environment->getSkin(); - video::IVideoDriver* driver = Environment->getVideoDriver(); - core::rect viewPort = AbsoluteRect; - viewPort.LowerRightCorner.X -= 1; - viewPort.LowerRightCorner.Y -= 1; - viewPort.UpperLeftCorner.X += 1; - viewPort.UpperLeftCorner.Y += 1; - - viewPort.clipAgainst(AbsoluteClippingRect); - - // draw the frame - - core::rect frameRect(AbsoluteRect); - frameRect.LowerRightCorner.Y = frameRect.UpperLeftCorner.Y + 1; - skin->draw2DRectangle(this, skin->getColor(EGDC_3D_SHADOW), frameRect, &AbsoluteClippingRect); - - frameRect.LowerRightCorner.Y = AbsoluteRect.LowerRightCorner.Y; - frameRect.LowerRightCorner.X = frameRect.UpperLeftCorner.X + 1; - skin->draw2DRectangle(this, skin->getColor(EGDC_3D_SHADOW), frameRect, &AbsoluteClippingRect); - - frameRect = AbsoluteRect; - frameRect.UpperLeftCorner.X = frameRect.LowerRightCorner.X - 1; - skin->draw2DRectangle(this, skin->getColor(EGDC_3D_HIGH_LIGHT), frameRect, &AbsoluteClippingRect); - - frameRect = AbsoluteRect; - frameRect.UpperLeftCorner.Y = AbsoluteRect.LowerRightCorner.Y - 1; - skin->draw2DRectangle(this, skin->getColor(EGDC_3D_HIGH_LIGHT), frameRect, &AbsoluteClippingRect); - - // draw the mesh - - if (Mesh) - { - //TODO: if outside of screen, dont draw. - // - why is the absolute clipping rect not already the screen? - - core::rect oldViewPort = driver->getViewPort(); - - driver->setViewPort(viewPort); - - core::matrix4 mat; - - //CameraControl->calculateProjectionMatrix(mat); - //driver->setTransform(video::TS_PROJECTION, mat); - - mat.makeIdentity(); - mat.setTranslation(core::vector3df(0,0,0)); - driver->setTransform(video::ETS_WORLD, mat); - - //CameraControl->calculateViewMatrix(mat); - //driver->setTransform(video::TS_VIEW, mat); - - driver->setMaterial(Material); - - u32 frame = 0; - if(Mesh->getFrameCount()) - frame = (os::Timer::getTime()/20)%Mesh->getFrameCount(); - const scene::IMesh* const m = Mesh->getMesh(frame); - for (u32 i=0; igetMeshBufferCount(); ++i) - { - scene::IMeshBuffer* mb = m->getMeshBuffer(i); - driver->drawVertexPrimitiveList(mb->getVertices(), - mb->getVertexCount(), mb->getIndices(), - mb->getPrimitiveCount(), mb->getVertexType(), - mb->getPrimitiveType(), mb->getIndexType()); - } - - driver->setViewPort(oldViewPort); - } - - IGUIElement::draw(); -} - - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - diff --git a/source/Irrlicht/CGUIMeshViewer.h b/source/Irrlicht/CGUIMeshViewer.h deleted file mode 100644 index 431a9dc9..00000000 --- a/source/Irrlicht/CGUIMeshViewer.h +++ /dev/null @@ -1,61 +0,0 @@ -// 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 __C_GUI_MESH_VIEWER_H_INCLUDED__ -#define __C_GUI_MESH_VIEWER_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUIMeshViewer.h" -#include "SMaterial.h" - -namespace irr -{ - -namespace gui -{ - - class CGUIMeshViewer : public IGUIMeshViewer - { - public: - - //! constructor - CGUIMeshViewer(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle); - - //! destructor - virtual ~CGUIMeshViewer(); - - //! sets the mesh to be shown - virtual void setMesh(scene::IAnimatedMesh* mesh) _IRR_OVERRIDE_; - - //! Gets the displayed mesh - virtual scene::IAnimatedMesh* getMesh() const _IRR_OVERRIDE_; - - //! sets the material - virtual void setMaterial(const video::SMaterial& material) _IRR_OVERRIDE_; - - //! gets the material - virtual const video::SMaterial& getMaterial() const _IRR_OVERRIDE_; - - //! called if an event happened. - virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_; - - //! draws the element and its children - virtual void draw() _IRR_OVERRIDE_; - - private: - - video::SMaterial Material; - scene::IAnimatedMesh* Mesh; - }; - - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - -#endif // __C_GUI_MESH_VIEWER_H_INCLUDED__ - diff --git a/source/Irrlicht/CGUIMessageBox.cpp b/source/Irrlicht/CGUIMessageBox.cpp deleted file mode 100644 index f6281af7..00000000 --- a/source/Irrlicht/CGUIMessageBox.cpp +++ /dev/null @@ -1,420 +0,0 @@ -// 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 - -#include "CGUIMessageBox.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUISkin.h" -#include "IGUIEnvironment.h" -#include "IGUIButton.h" -#include "IGUIFont.h" -#include "ITexture.h" - -namespace irr -{ -namespace gui -{ - -//! constructor -CGUIMessageBox::CGUIMessageBox(IGUIEnvironment* environment, const wchar_t* caption, - const wchar_t* text, s32 flags, - IGUIElement* parent, s32 id, core::rect rectangle, video::ITexture* image) -: CGUIWindow(environment, parent, id, rectangle), - OkButton(0), CancelButton(0), YesButton(0), NoButton(0), StaticText(0), - Icon(0), IconTexture(image), - Flags(flags), MessageText(text), Pressed(false) -{ - #ifdef _DEBUG - setDebugName("CGUIMessageBox"); - #endif - - // set element type - Type = EGUIET_MESSAGE_BOX; - - // remove focus - Environment->setFocus(0); - - // remove buttons - - getMaximizeButton()->remove(); - getMinimizeButton()->remove(); - - if (caption) - setText(caption); - - Environment->setFocus(this); - - if ( IconTexture ) - IconTexture->grab(); - - refreshControls(); -} - - -//! destructor -CGUIMessageBox::~CGUIMessageBox() -{ - if (StaticText) - StaticText->drop(); - - if (OkButton) - OkButton->drop(); - - if (CancelButton) - CancelButton->drop(); - - if (YesButton) - YesButton->drop(); - - if (NoButton) - NoButton->drop(); - - if (Icon) - Icon->drop(); - - if ( IconTexture ) - IconTexture->drop(); -} - -void CGUIMessageBox::setButton(IGUIButton*& button, bool isAvailable, const core::rect & btnRect, const wchar_t * text, IGUIElement*& focusMe) -{ - // add/remove ok button - if (isAvailable) - { - if (!button) - { - button = Environment->addButton(btnRect, this); - button->setSubElement(true); - button->grab(); - } - else - button->setRelativePosition(btnRect); - - button->setText(text); - - focusMe = button; - } - else if (button) - { - button->drop(); - button->remove(); - button =0; - } -} - -void CGUIMessageBox::refreshControls() -{ - // Layout can be seen as 4 boxes (a layoutmanager would be nice) - // One box at top over the whole width for title - // Two boxes with same height at the middle beside each other for icon and for text - // One box at the bottom for the buttons - - const IGUISkin* skin = Environment->getSkin(); - - const s32 buttonHeight = skin->getSize(EGDS_BUTTON_HEIGHT); - const s32 buttonWidth = skin->getSize(EGDS_BUTTON_WIDTH); - const s32 titleHeight = skin->getSize(EGDS_WINDOW_BUTTON_WIDTH)+2; // titlebar has no own constant - const s32 buttonDistance = skin->getSize(EGDS_WINDOW_BUTTON_WIDTH); - const s32 borderWidth = skin->getSize(EGDS_MESSAGE_BOX_GAP_SPACE); - - // add the static text for the message - core::rect staticRect; - staticRect.UpperLeftCorner.X = borderWidth; - staticRect.UpperLeftCorner.Y = titleHeight + borderWidth; - staticRect.LowerRightCorner.X = staticRect.UpperLeftCorner.X + skin->getSize(EGDS_MESSAGE_BOX_MAX_TEXT_WIDTH); - staticRect.LowerRightCorner.Y = staticRect.UpperLeftCorner.Y + skin->getSize(EGDS_MESSAGE_BOX_MAX_TEXT_HEIGHT); - if (!StaticText) - { - StaticText = Environment->addStaticText(MessageText.c_str(), staticRect, false, false, this); - - StaticText->setWordWrap(true); - StaticText->setSubElement(true); - StaticText->grab(); - } - else - { - StaticText->setRelativePosition(staticRect); - StaticText->setText(MessageText.c_str()); - } - - s32 textHeight = StaticText->getTextHeight(); - s32 textWidth = StaticText->getTextWidth() + 6; // +6 because the static itself needs that - const s32 iconHeight = IconTexture ? IconTexture->getOriginalSize().Height : 0; - - if ( textWidth < skin->getSize(EGDS_MESSAGE_BOX_MIN_TEXT_WIDTH) ) - textWidth = skin->getSize(EGDS_MESSAGE_BOX_MIN_TEXT_WIDTH) + 6; - // no neeed to check for max because it couldn't get larger due to statictextbox. - if ( textHeight < skin->getSize(EGDS_MESSAGE_BOX_MIN_TEXT_HEIGHT) ) - textHeight = skin->getSize(EGDS_MESSAGE_BOX_MIN_TEXT_HEIGHT); - if ( textHeight > skin->getSize(EGDS_MESSAGE_BOX_MAX_TEXT_HEIGHT) ) - textHeight = skin->getSize(EGDS_MESSAGE_BOX_MAX_TEXT_HEIGHT); - - // content is text + icons + borders (but not titlebar) - s32 contentHeight = textHeight > iconHeight ? textHeight : iconHeight; - contentHeight += borderWidth; - s32 contentWidth = 0; - - // add icon - if ( IconTexture ) - { - core::position2d iconPos; - iconPos.Y = titleHeight + borderWidth; - if ( iconHeight < textHeight ) - iconPos.Y += (textHeight-iconHeight) / 2; - iconPos.X = borderWidth; - - if (!Icon) - { - Icon = Environment->addImage(IconTexture, iconPos, true, this); - Icon->setSubElement(true); - Icon->grab(); - } - else - { - core::rect iconRect( iconPos.X, iconPos.Y, iconPos.X + IconTexture->getOriginalSize().Width, iconPos.Y + IconTexture->getOriginalSize().Height ); - Icon->setRelativePosition(iconRect); - } - - contentWidth += borderWidth + IconTexture->getOriginalSize().Width; - } - else if ( Icon ) - { - Icon->drop(); - Icon->remove(); - Icon = 0; - } - - // position text - core::rect textRect; - textRect.UpperLeftCorner.X = contentWidth + borderWidth; - textRect.UpperLeftCorner.Y = titleHeight + borderWidth; - if ( textHeight < iconHeight ) - textRect.UpperLeftCorner.Y += (iconHeight-textHeight) / 2; - textRect.LowerRightCorner.X = textRect.UpperLeftCorner.X + textWidth; - textRect.LowerRightCorner.Y = textRect.UpperLeftCorner.Y + textHeight; - contentWidth += 2*borderWidth + textWidth; - StaticText->setRelativePosition( textRect ); - - // find out button size needs - s32 countButtons = 0; - if (Flags & EMBF_OK) - ++countButtons; - if (Flags & EMBF_CANCEL) - ++countButtons; - if (Flags & EMBF_YES) - ++countButtons; - if (Flags & EMBF_NO) - ++countButtons; - - s32 buttonBoxWidth = countButtons * buttonWidth + 2 * borderWidth; - if ( countButtons > 1 ) - buttonBoxWidth += (countButtons-1) * buttonDistance; - s32 buttonBoxHeight = buttonHeight + 2 * borderWidth; - - // calc new message box sizes - core::rect tmp = getRelativePosition(); - s32 msgBoxHeight = titleHeight + contentHeight + buttonBoxHeight; - s32 msgBoxWidth = contentWidth > buttonBoxWidth ? contentWidth : buttonBoxWidth; - - // adjust message box position - tmp.UpperLeftCorner.Y = (Parent->getAbsolutePosition().getHeight() - msgBoxHeight) / 2; - tmp.LowerRightCorner.Y = tmp.UpperLeftCorner.Y + msgBoxHeight; - tmp.UpperLeftCorner.X = (Parent->getAbsolutePosition().getWidth() - msgBoxWidth) / 2; - tmp.LowerRightCorner.X = tmp.UpperLeftCorner.X + msgBoxWidth; - setRelativePosition(tmp); - - // add buttons - - core::rect btnRect; - btnRect.UpperLeftCorner.Y = titleHeight + contentHeight + borderWidth; - btnRect.LowerRightCorner.Y = btnRect.UpperLeftCorner.Y + buttonHeight; - btnRect.UpperLeftCorner.X = borderWidth; - if ( contentWidth > buttonBoxWidth ) - btnRect.UpperLeftCorner.X += (contentWidth - buttonBoxWidth) / 2; // center buttons - btnRect.LowerRightCorner.X = btnRect.UpperLeftCorner.X + buttonWidth; - - IGUIElement* focusMe = 0; - setButton(OkButton, (Flags & EMBF_OK) != 0, btnRect, skin->getDefaultText(EGDT_MSG_BOX_OK), focusMe); - if ( Flags & EMBF_OK ) - btnRect += core::position2d(buttonWidth + buttonDistance, 0); - setButton(CancelButton, (Flags & EMBF_CANCEL) != 0, btnRect, skin->getDefaultText(EGDT_MSG_BOX_CANCEL), focusMe); - if ( Flags & EMBF_CANCEL ) - btnRect += core::position2d(buttonWidth + buttonDistance, 0); - setButton(YesButton, (Flags & EMBF_YES) != 0, btnRect, skin->getDefaultText(EGDT_MSG_BOX_YES), focusMe); - if ( Flags & EMBF_YES ) - btnRect += core::position2d(buttonWidth + buttonDistance, 0); - setButton(NoButton, (Flags & EMBF_NO) != 0, btnRect, skin->getDefaultText(EGDT_MSG_BOX_NO), focusMe); - - if (Environment->hasFocus(this) && focusMe) - Environment->setFocus(focusMe); -} - - -//! called if an event happened. -bool CGUIMessageBox::OnEvent(const SEvent& event) -{ - if (isEnabled()) - { - SEvent outevent; - outevent.EventType = EET_GUI_EVENT; - outevent.GUIEvent.Caller = this; - outevent.GUIEvent.Element = 0; - - switch(event.EventType) - { - case EET_KEY_INPUT_EVENT: - - if (event.KeyInput.PressedDown) - { - switch (event.KeyInput.Key) - { - case KEY_RETURN: - if (OkButton) - { - OkButton->setPressed(true); - Pressed = true; - } - break; - case KEY_KEY_Y: - if (YesButton) - { - YesButton->setPressed(true); - Pressed = true; - } - break; - case KEY_KEY_N: - if (NoButton) - { - NoButton->setPressed(true); - Pressed = true; - } - break; - case KEY_ESCAPE: - if (Pressed) - { - // cancel press - if (OkButton) OkButton->setPressed(false); - if (YesButton) YesButton->setPressed(false); - if (NoButton) NoButton->setPressed(false); - Pressed = false; - } - else - if (CancelButton) - { - CancelButton->setPressed(true); - Pressed = true; - } - else - if (CloseButton && CloseButton->isVisible()) - { - CloseButton->setPressed(true); - Pressed = true; - } - break; - default: // no other key is handled here - break; - } - } - else - if (Pressed) - { - if (OkButton && event.KeyInput.Key == KEY_RETURN) - { - setVisible(false); // this is a workaround to make sure it's no longer the hovered element, crashes on pressing 1-2 times ESC - Environment->setFocus(0); - outevent.GUIEvent.EventType = EGET_MESSAGEBOX_OK; - Parent->OnEvent(outevent); - remove(); - return true; - } - else - if ((CancelButton || CloseButton) && event.KeyInput.Key == KEY_ESCAPE) - { - setVisible(false); // this is a workaround to make sure it's no longer the hovered element, crashes on pressing 1-2 times ESC - Environment->setFocus(0); - outevent.GUIEvent.EventType = EGET_MESSAGEBOX_CANCEL; - Parent->OnEvent(outevent); - remove(); - return true; - } - else - if (YesButton && event.KeyInput.Key == KEY_KEY_Y) - { - setVisible(false); // this is a workaround to make sure it's no longer the hovered element, crashes on pressing 1-2 times ESC - Environment->setFocus(0); - outevent.GUIEvent.EventType = EGET_MESSAGEBOX_YES; - Parent->OnEvent(outevent); - remove(); - return true; - } - else - if (NoButton && event.KeyInput.Key == KEY_KEY_N) - { - setVisible(false); // this is a workaround to make sure it's no longer the hovered element, crashes on pressing 1-2 times ESC - Environment->setFocus(0); - outevent.GUIEvent.EventType = EGET_MESSAGEBOX_NO; - Parent->OnEvent(outevent); - remove(); - return true; - } - } - break; - case EET_GUI_EVENT: - if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED) - { - if (event.GUIEvent.Caller == OkButton) - { - setVisible(false); // this is a workaround to make sure it's no longer the hovered element, crashes on pressing 1-2 times ESC - Environment->setFocus(0); - outevent.GUIEvent.EventType = EGET_MESSAGEBOX_OK; - Parent->OnEvent(outevent); - remove(); - return true; - } - else - if (event.GUIEvent.Caller == CancelButton || - event.GUIEvent.Caller == CloseButton) - { - setVisible(false); // this is a workaround to make sure it's no longer the hovered element, crashes on pressing 1-2 times ESC - Environment->setFocus(0); - outevent.GUIEvent.EventType = EGET_MESSAGEBOX_CANCEL; - Parent->OnEvent(outevent); - remove(); - return true; - } - else - if (event.GUIEvent.Caller == YesButton) - { - setVisible(false); // this is a workaround to make sure it's no longer the hovered element, crashes on pressing 1-2 times ESC - Environment->setFocus(0); - outevent.GUIEvent.EventType = EGET_MESSAGEBOX_YES; - Parent->OnEvent(outevent); - remove(); - return true; - } - else - if (event.GUIEvent.Caller == NoButton) - { - setVisible(false); // this is a workaround to make sure it's no longer the hovered element, crashes on pressing 1-2 times ESC - Environment->setFocus(0); - outevent.GUIEvent.EventType = EGET_MESSAGEBOX_NO; - Parent->OnEvent(outevent); - remove(); - return true; - } - } - break; - default: - break; - } - } - - return CGUIWindow::OnEvent(event); -} - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - diff --git a/source/Irrlicht/CGUIMessageBox.h b/source/Irrlicht/CGUIMessageBox.h deleted file mode 100644 index d51861ca..00000000 --- a/source/Irrlicht/CGUIMessageBox.h +++ /dev/null @@ -1,58 +0,0 @@ -// 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 __C_GUI_MESSAGE_BOX_H_INCLUDED__ -#define __C_GUI_MESSAGE_BOX_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "CGUIWindow.h" -#include "IGUIStaticText.h" -#include "IGUIImage.h" -#include "irrArray.h" - -namespace irr -{ -namespace gui -{ - class CGUIMessageBox : public CGUIWindow - { - public: - - //! constructor - CGUIMessageBox(IGUIEnvironment* environment, const wchar_t* caption, - const wchar_t* text, s32 flag, - IGUIElement* parent, s32 id, core::rect rectangle, video::ITexture* image=0); - - //! destructor - virtual ~CGUIMessageBox(); - - //! called if an event happened. - virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_; - - private: - - void refreshControls(); - void setButton(IGUIButton*& button, bool isAvailable, const core::rect & btnRect, const wchar_t * text, IGUIElement*& focusMe); - - IGUIButton* OkButton; - IGUIButton* CancelButton; - IGUIButton* YesButton; - IGUIButton* NoButton; - IGUIStaticText* StaticText; - IGUIImage * Icon; - video::ITexture * IconTexture; - - s32 Flags; - core::stringw MessageText; - bool Pressed; - }; - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - -#endif diff --git a/source/Irrlicht/CGUIModalScreen.cpp b/source/Irrlicht/CGUIModalScreen.cpp deleted file mode 100644 index 5318d55b..00000000 --- a/source/Irrlicht/CGUIModalScreen.cpp +++ /dev/null @@ -1,231 +0,0 @@ -// 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 - -#include "CGUIModalScreen.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUIEnvironment.h" -#include "os.h" -#include "IVideoDriver.h" -#include "IGUISkin.h" - -namespace irr -{ -namespace gui -{ - -//! constructor -CGUIModalScreen::CGUIModalScreen(IGUIEnvironment* environment, IGUIElement* parent, s32 id) -: IGUIElement(EGUIET_MODAL_SCREEN, environment, parent, id, core::recti(0, 0, parent->getAbsolutePosition().getWidth(), parent->getAbsolutePosition().getHeight()) ), - BlinkMode(3), - MouseDownTime(0) -{ - #ifdef _DEBUG - setDebugName("CGUIModalScreen"); - #endif - setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT); - - // this element is a tab group - setTabGroup(true); -} - -bool CGUIModalScreen::canTakeFocus(IGUIElement* target) const -{ - return (target && ((const IGUIElement*)target == this // this element can take it - || isMyChild(target) // own children also - || (target->getType() == EGUIET_MODAL_SCREEN ) // other modals also fine (is now on top or explicitely requested) - || (target->getParent() && target->getParent()->getType() == EGUIET_MODAL_SCREEN ))) // children of other modals will do - ; -} - -bool CGUIModalScreen::isVisible() const -{ - // any parent invisible? - IGUIElement * parentElement = getParent(); - while ( parentElement ) - { - if ( !parentElement->isVisible() ) - return false; - parentElement = parentElement->getParent(); - } - - // if we have no children then the modal is probably abused as a way to block input - if ( Children.empty() ) - { - return IGUIElement::isVisible(); - } - - // any child visible? - for (const auto& child : Children) - { - if ( child->isVisible() ) - return true; - } - return false; -} - -bool CGUIModalScreen::isPointInside(const core::position2d& point) const -{ - return true; -} - -//! called if an event happened. -bool CGUIModalScreen::OnEvent(const SEvent& event) -{ - if (!isEnabled() || !isVisible() ) - return IGUIElement::OnEvent(event); - - switch(event.EventType) - { - case EET_GUI_EVENT: - switch(event.GUIEvent.EventType) - { - case EGET_ELEMENT_FOCUSED: - if ( event.GUIEvent.Caller == this && isMyChild(event.GUIEvent.Element) ) - { - Environment->removeFocus(0); // can't setFocus otherwise at it still has focus here - Environment->setFocus(event.GUIEvent.Element); - if ( BlinkMode&1 ) - MouseDownTime = os::Timer::getTime(); - return true; - } - if ( !canTakeFocus(event.GUIEvent.Caller)) - { - if ( !Children.empty() ) - Environment->setFocus(Children.front()); - else - Environment->setFocus(this); - } - IGUIElement::OnEvent(event); - return false; - case EGET_ELEMENT_FOCUS_LOST: - if ( !canTakeFocus(event.GUIEvent.Element)) - { - if ( isMyChild(event.GUIEvent.Caller) ) - { - if ( !Children.empty() ) - Environment->setFocus(Children.front()); - else - Environment->setFocus(this); - } - else if ( BlinkMode&1 ) - { - MouseDownTime = os::Timer::getTime(); - } - return true; - } - else - { - return IGUIElement::OnEvent(event); - } - case EGET_ELEMENT_CLOSED: - // do not interfere with children being removed - return IGUIElement::OnEvent(event); - default: - break; - } - break; - case EET_MOUSE_INPUT_EVENT: - if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN && (BlinkMode & 2)) - { - MouseDownTime = os::Timer::getTime(); - } - break; - case EET_KEY_INPUT_EVENT: - // CAREFUL when changing - there's an identical check in CGUIEnvironment::postEventFromUser - if (Environment->getFocusBehavior() & EFF_SET_ON_TAB && - event.KeyInput.PressedDown && - event.KeyInput.Key == KEY_TAB) - { - IGUIElement* next = Environment->getNextElement(event.KeyInput.Shift, event.KeyInput.Control); - if ( next && isMyChild(next) ) - { - // Pass on the TAB-key, otherwise focus-tabbing inside modal screens breaks - return false; - } - } - default: - break; - } - - IGUIElement::OnEvent(event); // anyone knows why events are passed on here? Causes p.e. problems when this is child of a CGUIWindow. - - return true; // absorb everything else -} - - -//! draws the element and its children -void CGUIModalScreen::draw() -{ - IGUISkin *skin = Environment->getSkin(); - - if (!skin) - return; - - u32 now = os::Timer::getTime(); - if (BlinkMode && now - MouseDownTime < 300 && (now / 70)%2) - { - core::rect r; - video::SColor c = Environment->getSkin()->getColor(gui::EGDC_3D_HIGH_LIGHT); - - for (auto child : Children) - { - if (child->isVisible()) - { - r = child->getAbsolutePosition(); - r.LowerRightCorner.X += 1; - r.LowerRightCorner.Y += 1; - r.UpperLeftCorner.X -= 1; - r.UpperLeftCorner.Y -= 1; - - skin->draw2DRectangle(this, c, r, &AbsoluteClippingRect); - } - } - } - - IGUIElement::draw(); -} - - -//! Removes a child. -void CGUIModalScreen::removeChild(IGUIElement* child) -{ - IGUIElement::removeChild(child); - - if (Children.empty()) - { - remove(); - } -} - - -//! adds a child -void CGUIModalScreen::addChild(IGUIElement* child) -{ - IGUIElement::addChild(child); - Environment->setFocus(child); -} - - -void CGUIModalScreen::updateAbsolutePosition() -{ - core::rect parentRect(0,0,0,0); - - if (Parent) - { - parentRect = Parent->getAbsolutePosition(); - RelativeRect.UpperLeftCorner.X = 0; - RelativeRect.UpperLeftCorner.Y = 0; - RelativeRect.LowerRightCorner.X = parentRect.getWidth(); - RelativeRect.LowerRightCorner.Y = parentRect.getHeight(); - } - - IGUIElement::updateAbsolutePosition(); -} - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - diff --git a/source/Irrlicht/CGUIModalScreen.h b/source/Irrlicht/CGUIModalScreen.h deleted file mode 100644 index 0f3a973a..00000000 --- a/source/Irrlicht/CGUIModalScreen.h +++ /dev/null @@ -1,80 +0,0 @@ -// 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 __C_GUI_MODAL_SCREEN_H_INCLUDED__ -#define __C_GUI_MODAL_SCREEN_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUIElement.h" - -namespace irr -{ -namespace gui -{ - - class CGUIModalScreen : public IGUIElement - { - public: - - //! constructor - CGUIModalScreen(IGUIEnvironment* environment, IGUIElement* parent, s32 id); - - //! called if an event happened. - virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_; - - //! Removes a child. - virtual void removeChild(IGUIElement* child) _IRR_OVERRIDE_; - - //! Adds a child - virtual void addChild(IGUIElement* child) _IRR_OVERRIDE_; - - - //! draws the element and its children - virtual void draw() _IRR_OVERRIDE_; - - //! Updates the absolute position. - virtual void updateAbsolutePosition() _IRR_OVERRIDE_; - - //! Modalscreen is not a typical element, but rather acts like a state for it's children. - //! isVisible is overriden to give this a useful behavior, so that a modal will no longer - //! be active when its parent is invisible or all its children are invisible. - virtual bool isVisible() const _IRR_OVERRIDE_; - - //! Modals are infinite so every point is inside - virtual bool isPointInside(const core::position2d& point) const _IRR_OVERRIDE_; - - //! Set when to blink. - //! Bitset of following values (can be combined) - //! 0 = never - //! 1 = focus changes - //! 2 = Left mouse button pressed down - void setBlinkMode(u32 blink) - { - BlinkMode = blink; - } - - u32 getBlinkMode() const - { - return BlinkMode; - } - - protected: - virtual bool canTakeFocus(IGUIElement* target) const; - - private: - - u32 BlinkMode; - u32 MouseDownTime; - }; - - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - -#endif - diff --git a/source/Irrlicht/CGUIProfiler.cpp b/source/Irrlicht/CGUIProfiler.cpp deleted file mode 100644 index 693fc88c..00000000 --- a/source/Irrlicht/CGUIProfiler.cpp +++ /dev/null @@ -1,331 +0,0 @@ -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h -// Written by Michael Zeilfelder - -#include "CGUIProfiler.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUITable.h" -#include "IGUIScrollBar.h" -#include "IGUIEnvironment.h" -#include "CProfiler.h" - -namespace irr -{ -namespace gui -{ - -//! constructor -CGUIProfiler::CGUIProfiler(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle, IProfiler* profiler) - : IGUIProfiler(environment, parent, id, rectangle, profiler) - , Profiler(profiler) - , DisplayTable(0), CurrentGroupIdx(0), CurrentGroupPage(0), NumGroupPages(1) - , DrawBackground(false), Frozen(false), UnfreezeOnce(false), ShowGroupsTogether(false) - , MinCalls(0), MinTimeSum(0), MinTimeAverage(0.f), MinTimeMax(0) -{ - if ( !Profiler ) - Profiler = &getProfiler(); - - core::recti r(0, 0, rectangle.getWidth(), rectangle.getHeight()); - - // Really just too lazy to code a complete new element for this. - // If anyone can do this nicer he's welcome. - DisplayTable = Environment->addTable(r, this, -1, DrawBackground); - DisplayTable->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT); - DisplayTable->setSubElement(true); - rebuildColumns(); -} - -void CGUIProfiler::fillRow(u32 rowIndex, const SProfileData& data, bool overviewTitle, bool groupTitle) -{ - DisplayTable->setCellText(rowIndex, 0, data.getName()); - - if ( !overviewTitle ) - DisplayTable->setCellText(rowIndex, 1, core::stringw(data.getCallsCounter())); - if ( data.getCallsCounter() > 0 ) - { - DisplayTable->setCellText(rowIndex, 2, core::stringw(data.getTimeSum())); - DisplayTable->setCellText(rowIndex, 3, core::stringw((u32)((f32)data.getTimeSum()/(f32)data.getCallsCounter()))); - DisplayTable->setCellText(rowIndex, 4, core::stringw(data.getLongestTime())); - } - - if ( overviewTitle || groupTitle ) - { - const video::SColor titleColor(255, 0, 0, 255); - DisplayTable->setCellColor(rowIndex, 0, titleColor); - } -} - -void CGUIProfiler::rebuildColumns() -{ - if ( DisplayTable ) - { - DisplayTable->clear(); - DisplayTable->addColumn(L"name "); - DisplayTable->addColumn(L"count calls"); - DisplayTable->addColumn(L"time(sum)"); - DisplayTable->addColumn(L"time(avg)"); - DisplayTable->addColumn(L"time(max) "); - DisplayTable->setActiveColumn(-1); - } -} - -u32 CGUIProfiler::addDataToTable(u32 rowIndex, u32 dataIndex, u32 groupIndex) -{ - const SProfileData& data = Profiler->getProfileDataByIndex(dataIndex); - if ( data.getGroupIndex() == groupIndex - && data.getCallsCounter() >= MinCalls - && ( data.getCallsCounter() == 0 || - (data.getTimeSum() >= MinTimeSum && - (f32)data.getTimeSum()/(f32)data.getCallsCounter() >= MinTimeAverage && - data.getLongestTime() >= MinTimeMax)) - ) - { - rowIndex = DisplayTable->addRow(rowIndex); - fillRow(rowIndex, data, false, false); - ++rowIndex; - } - return rowIndex; -} - -void CGUIProfiler::updateDisplay() -{ - if ( DisplayTable ) - { - DisplayTable->clearRows(); - - if ( CurrentGroupIdx < Profiler->getGroupCount() ) - { - bool overview = CurrentGroupIdx == 0; - u32 rowIndex = 0; - - // show description row (overview or name of the following group) - const SProfileData& groupData = Profiler->getGroupData(CurrentGroupIdx); - if ( !ShowGroupsTogether && (overview || groupData.getCallsCounter() >= MinCalls) ) - { - rowIndex = DisplayTable->addRow(rowIndex); - fillRow(rowIndex, groupData, overview, true); - ++rowIndex; - } - - // show overview over all groups? - if ( overview ) - { - for ( u32 i=1; igetGroupCount(); ++i ) - { - const SProfileData& groupDataOv = Profiler->getGroupData(i); - if (groupDataOv.getCallsCounter() >= MinCalls ) - { - rowIndex = DisplayTable->addRow(rowIndex); - fillRow(rowIndex, groupDataOv, false, false); - ++rowIndex; - } - } - } - // show data for all elements in current group - else - { - for ( u32 i=0; i < Profiler->getProfileDataCount(); ++i ) - { - rowIndex = addDataToTable(rowIndex, i, CurrentGroupIdx); - } - } - // Show the rest of the groups - if (ShowGroupsTogether) - { - for ( u32 groupIdx = CurrentGroupIdx+1; groupIdx < Profiler->getGroupCount(); ++groupIdx) - { - for ( u32 i=0; i < Profiler->getProfileDataCount(); ++i ) - { - rowIndex = addDataToTable(rowIndex, i, groupIdx); - } - } - } - } - - // IGUITable has no page-wise scrolling yet. The following code can be replaced when we add that. - // For now we use some CGUITable implementation info to figure this out. - // (If you wonder why I didn't code page-scrolling directly in CGUITable ... because then it needs to be a - // public interface and I don't have enough time currently to design & implement that well) - s32 itemsTotalHeight = DisplayTable->getRowCount() * DisplayTable->getItemHeight(); - s32 tableHeight = DisplayTable->getAbsolutePosition().getHeight(); - s32 heightTitleRow = DisplayTable->getItemHeight()+1; - if ( itemsTotalHeight+heightTitleRow < tableHeight ) - { - NumGroupPages = 1; - } - else - { - s32 heightHScrollBar = DisplayTable->getHorizontalScrollBar() ? DisplayTable->getHorizontalScrollBar()->getAbsolutePosition().getHeight() : 0; - s32 pageHeight = tableHeight - (heightTitleRow+heightHScrollBar); - if ( pageHeight > 0 ) - { - NumGroupPages = (itemsTotalHeight/pageHeight); - if ( itemsTotalHeight % pageHeight ) - ++NumGroupPages; - } - else // won't see anything, but that's up to the user - { - NumGroupPages = DisplayTable->getRowCount(); - } - if ( NumGroupPages < 1 ) - NumGroupPages = 1; - } - if ( CurrentGroupPage < 0 ) - CurrentGroupPage = (s32)NumGroupPages-1; - - IGUIScrollBar* vScrollBar = DisplayTable->getVerticalScrollBar(); - if ( vScrollBar ) - { - if ( NumGroupPages < 2 ) - vScrollBar->setPos(0); - else - { - f32 factor = (f32)CurrentGroupPage/(f32)(NumGroupPages-1); - vScrollBar->setPos( s32(factor * (f32)vScrollBar->getMax()) ); - } - } - } -} - -void CGUIProfiler::draw() -{ - if ( isVisible() ) - { - if (!Frozen || UnfreezeOnce) - { - UnfreezeOnce = false; - updateDisplay(); - } - } - - IGUIElement::draw(); -} - -void CGUIProfiler::nextPage(bool includeOverview) -{ - UnfreezeOnce = true; - if ( CurrentGroupPage < NumGroupPages-1 ) - ++CurrentGroupPage; - else - { - CurrentGroupPage = 0; - if ( ++CurrentGroupIdx >= Profiler->getGroupCount() ) - { - if ( includeOverview ) - CurrentGroupIdx = 0; - else - CurrentGroupIdx = 1; // can be invalid - } - } -} - -void CGUIProfiler::previousPage(bool includeOverview) -{ - UnfreezeOnce = true; - if ( CurrentGroupPage > 0 ) - { - --CurrentGroupPage; - } - else - { - CurrentGroupPage = -1; // unknown because NumGroupPages has to be re-calculated first - if ( CurrentGroupIdx > 0 ) - --CurrentGroupIdx; - else - CurrentGroupIdx = Profiler->getGroupCount()-1; - if ( CurrentGroupIdx == 0 && !includeOverview ) - { - if ( Profiler->getGroupCount() ) - CurrentGroupIdx = Profiler->getGroupCount()-1; - if ( CurrentGroupIdx == 0 ) - CurrentGroupIdx = 1; // invalid to avoid showing the overview - } - } -} - -void CGUIProfiler::setShowGroupsTogether(bool groupsTogether) -{ - ShowGroupsTogether = groupsTogether; -} - -bool CGUIProfiler::getShowGroupsTogether() const -{ - return ShowGroupsTogether; -} - -void CGUIProfiler::firstPage(bool includeOverview) -{ - UnfreezeOnce = true; - if ( includeOverview ) - CurrentGroupIdx = 0; - else - CurrentGroupIdx = 1; // can be invalid - CurrentGroupPage = 0; -} - -//! Sets another skin independent font. -void CGUIProfiler::setOverrideFont(IGUIFont* font) -{ - if ( DisplayTable ) - { - DisplayTable->setOverrideFont(font); - rebuildColumns(); - } -} - -//! Gets the override font (if any) -IGUIFont * CGUIProfiler::getOverrideFont() const -{ - if ( DisplayTable ) - return DisplayTable->getOverrideFont(); - return 0; -} - -//! Get the font which is used right now for drawing -IGUIFont* CGUIProfiler::getActiveFont() const -{ - if ( DisplayTable ) - return DisplayTable->getActiveFont(); - return 0; -} - -//! Sets whether to draw the background. By default disabled, -void CGUIProfiler::setDrawBackground(bool draw) -{ - DrawBackground = draw; - if ( DisplayTable ) - DisplayTable->setDrawBackground(draw); -} - -//! Checks if background drawing is enabled -bool CGUIProfiler::isDrawBackgroundEnabled() const -{ - return DrawBackground; -} - -//! Allows to freeze updates which makes it easier to read the numbers -void CGUIProfiler::setFrozen(bool freeze) -{ - Frozen = freeze; -} - -//! Are updates currently frozen -bool CGUIProfiler::getFrozen() const -{ - return Frozen; -} - -void CGUIProfiler::setFilters(irr::u32 minCalls, irr::u32 minTimeSum, irr::f32 minTimeAverage, irr::u32 minTimeMax) -{ - MinCalls = minCalls; - MinTimeSum = minTimeSum; - MinTimeAverage = minTimeAverage; - MinTimeMax = minTimeMax; -} - -} // end namespace gui -} // end namespace irr - - -#endif // _IRR_COMPILE_WITH_GUI_ diff --git a/source/Irrlicht/CGUIProfiler.h b/source/Irrlicht/CGUIProfiler.h deleted file mode 100644 index a3c5399a..00000000 --- a/source/Irrlicht/CGUIProfiler.h +++ /dev/null @@ -1,106 +0,0 @@ -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h -// Written by Michael Zeilfelder - -#ifndef C_GUI_PROFILER_H_INCLUDED__ -#define C_GUI_PROFILER_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUIProfiler.h" - -namespace irr -{ - -class IProfiler; -struct SProfileData; - -namespace gui -{ - class IGUITable; - - //! Element to display profiler information - class CGUIProfiler : public IGUIProfiler - { - public: - //! constructor - CGUIProfiler(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle, IProfiler* profiler); - - //! Show first page of profile data - virtual void firstPage(bool includeOverview) _IRR_OVERRIDE_; - - //! Show next page of profile data - virtual void nextPage(bool includeOverview) _IRR_OVERRIDE_; - - //! Show previous page of profile data - virtual void previousPage(bool includeOverview) _IRR_OVERRIDE_; - - //! Try to show as many group-pages together as possible instead of showing at most one group per page. - /** \param groupsTogether When true show several groups on one page, when false show max. one group per page. Default is false. */ - virtual void setShowGroupsTogether(bool groupsTogether) _IRR_OVERRIDE_; - - //! Can several groups be displayed per page? - virtual bool getShowGroupsTogether() const _IRR_OVERRIDE_; - - //! Sets another skin independent font. - virtual void setOverrideFont(IGUIFont* font) _IRR_OVERRIDE_; - - //! Gets the override font (if any) - virtual IGUIFont* getOverrideFont() const _IRR_OVERRIDE_; - - //! Get the font which is used right now for drawing - virtual IGUIFont* getActiveFont() const _IRR_OVERRIDE_; - - //! Sets whether to draw the background. By default disabled, - virtual void setDrawBackground(bool draw) _IRR_OVERRIDE_; - - //! Checks if background drawing is enabled - /** \return true if background drawing is enabled, false otherwise */ - virtual bool isDrawBackgroundEnabled() const _IRR_OVERRIDE_; - - //! Allows to freeze updates which makes it easier to read the numbers - virtual void setFrozen(bool freeze) _IRR_OVERRIDE_; - - //! Are updates currently frozen - virtual bool getFrozen() const _IRR_OVERRIDE_; - - //! Filters prevents data that doesn't achieve the conditions from being displayed - virtual void setFilters(irr::u32 minCalls, irr::u32 minTimeSum, irr::f32 minTimeAverage, irr::u32 minTimeMax) _IRR_OVERRIDE_; - - virtual IGUIElement* getElementFromPoint(const core::position2d& point) _IRR_OVERRIDE_ - { - // This element should never get focus from mouse-clicks - return 0; - } - - virtual void draw() _IRR_OVERRIDE_; - - protected: - - void updateDisplay(); - void fillRow(u32 rowIndex, const SProfileData& data, bool overviewTitle, bool groupTitle); - u32 addDataToTable(u32 rowIndex, u32 dataIndex, u32 groupIndex); - void rebuildColumns(); - - IProfiler * Profiler; - irr::gui::IGUITable* DisplayTable; - irr::u32 CurrentGroupIdx; - irr::s32 CurrentGroupPage; - irr::s32 NumGroupPages; - bool DrawBackground; - bool Frozen; - bool UnfreezeOnce; - bool ShowGroupsTogether; - irr::u32 MinCalls; - irr::u32 MinTimeSum; - irr::f32 MinTimeAverage; - irr::u32 MinTimeMax; - }; - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - -#endif // __C_GUI_IMAGE_H_INCLUDED__ diff --git a/source/Irrlicht/CGUISpinBox.cpp b/source/Irrlicht/CGUISpinBox.cpp deleted file mode 100644 index af7ce843..00000000 --- a/source/Irrlicht/CGUISpinBox.cpp +++ /dev/null @@ -1,323 +0,0 @@ -// Copyright (C) 2006-2012 Michael Zeilfelder -// This file uses the licence of the Irrlicht Engine. - -#include "CGUISpinBox.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "CGUIEditBox.h" -#include "CGUIButton.h" -#include "IGUIEnvironment.h" -#include "IEventReceiver.h" -#include "fast_atof.h" -#include - - -namespace irr -{ -namespace gui -{ - -//! constructor -CGUISpinBox::CGUISpinBox(const wchar_t* text, bool border,IGUIEnvironment* environment, - IGUIElement* parent, s32 id, const core::rect& rectangle) -: IGUISpinBox(environment, parent, id, rectangle), - EditBox(0), ButtonSpinUp(0), ButtonSpinDown(0), StepSize(1.f), - RangeMin(-FLT_MAX), RangeMax(FLT_MAX), FormatString(L"%f"), - DecimalPlaces(-1), ValidateOn(EGUI_SBV_ENTER|EGUI_SBV_LOSE_FOCUS) -{ - #ifdef _DEBUG - setDebugName("CGUISpinBox"); - #endif - - CurrentIconColor = video::SColor(255,255,255,255); - s32 ButtonWidth = 16; - - ButtonSpinDown = Environment->addButton( - core::rect(rectangle.getWidth() - ButtonWidth, rectangle.getHeight()/2 +1, - rectangle.getWidth(), rectangle.getHeight()), this); - ButtonSpinDown->grab(); - ButtonSpinDown->setSubElement(true); - ButtonSpinDown->setTabStop(false); - ButtonSpinDown->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_CENTER, EGUIA_LOWERRIGHT); - - ButtonSpinUp = Environment->addButton( - core::rect(rectangle.getWidth() - ButtonWidth, 0, - rectangle.getWidth(), rectangle.getHeight()/2), this); - ButtonSpinUp->grab(); - ButtonSpinUp->setSubElement(true); - ButtonSpinUp->setTabStop(false); - ButtonSpinUp->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_CENTER); - - const core::rect rectEdit(0, 0, rectangle.getWidth() - ButtonWidth - 1, rectangle.getHeight()); - EditBox = Environment->addEditBox(text, rectEdit, border, this, -1); - EditBox->grab(); - EditBox->setSubElement(true); - EditBox->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT); - - refreshSprites(); -} - - -//! destructor -CGUISpinBox::~CGUISpinBox() -{ - if (ButtonSpinUp) - ButtonSpinUp->drop(); - if (ButtonSpinDown) - ButtonSpinDown->drop(); - if (EditBox) - EditBox->drop(); -} - -void CGUISpinBox::refreshSprites() -{ - IGUISpriteBank *sb = 0; - if (Environment && Environment->getSkin()) - { - sb = Environment->getSkin()->getSpriteBank(); - } - - if (sb) - { - IGUISkin * skin = Environment->getSkin(); - CurrentIconColor = skin->getColor(isEnabled() ? EGDC_WINDOW_SYMBOL : EGDC_GRAY_WINDOW_SYMBOL); - ButtonSpinDown->setSpriteBank(sb); - ButtonSpinDown->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_SMALL_CURSOR_DOWN), CurrentIconColor); - ButtonSpinDown->setSprite(EGBS_BUTTON_DOWN, skin->getIcon(EGDI_SMALL_CURSOR_DOWN), CurrentIconColor); - ButtonSpinUp->setSpriteBank(sb); - ButtonSpinUp->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_SMALL_CURSOR_UP), CurrentIconColor); - ButtonSpinUp->setSprite(EGBS_BUTTON_DOWN, skin->getIcon(EGDI_SMALL_CURSOR_UP), CurrentIconColor); - } - else - { - ButtonSpinDown->setText(L"-"); - ButtonSpinUp->setText(L"+"); - } -} - -IGUIEditBox* CGUISpinBox::getEditBox() const -{ - return EditBox; -} - - -void CGUISpinBox::setValue(f32 val) -{ - wchar_t str[100]; - - swprintf_irr(str, 99, FormatString.c_str(), val); - EditBox->setText(str); - verifyValueRange(); -} - - -f32 CGUISpinBox::getValue() const -{ - const wchar_t* val = EditBox->getText(); - if ( !val ) - return 0.f; - core::stringc tmp(val); - return core::fast_atof(tmp.c_str()); -} - - -void CGUISpinBox::setRange(f32 min, f32 max) -{ - if (maxOnEvent(e); - if ( eatEvent ) - return true; - } - } - - return IGUIElement::OnEvent(event); -} - - -void CGUISpinBox::draw() -{ - if ( !isVisible() ) - return; - - IGUISkin* skin = Environment->getSkin(); - if (!skin) - return; - - video::SColor iconColor = skin->getColor(isEnabled() ? EGDC_WINDOW_SYMBOL : EGDC_GRAY_WINDOW_SYMBOL); - if ( iconColor != CurrentIconColor ) - { - refreshSprites(); - } - - IGUISpinBox::draw(); -} - -void CGUISpinBox::verifyValueRange() -{ - f32 val = getValue(); - if ( val+core::ROUNDING_ERROR_f32 < RangeMin ) - val = RangeMin; - else if ( val-core::ROUNDING_ERROR_f32 > RangeMax ) - val = RangeMax; - else - return; - - setValue(val); -} - - -//! Sets the new caption of the element -void CGUISpinBox::setText(const wchar_t* text) -{ - EditBox->setText(text); - setValue(getValue()); - verifyValueRange(); -} - - -//! Returns caption of this element. -const wchar_t* CGUISpinBox::getText() const -{ - return EditBox->getText(); -} - - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - diff --git a/source/Irrlicht/CGUISpinBox.h b/source/Irrlicht/CGUISpinBox.h deleted file mode 100644 index 4f77e264..00000000 --- a/source/Irrlicht/CGUISpinBox.h +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (C) 2006-2012 Michael Zeilfelder -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __C_GUI_SPIN_BOX_H_INCLUDED__ -#define __C_GUI_SPIN_BOX_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUISpinBox.h" - -namespace irr -{ -namespace gui -{ - class IGUIEditBox; - class IGUIButton; - - class CGUISpinBox : public IGUISpinBox - { - public: - - //! constructor - CGUISpinBox(const wchar_t* text, bool border, IGUIEnvironment* environment, - IGUIElement* parent, s32 id, const core::rect& rectangle); - - //! destructor - virtual ~CGUISpinBox(); - - //! Access the edit box used in the spin control - /** \param enable: If set to true, the override color, which can be set - with IGUIEditBox::setOverrideColor is used, otherwise the - EGDC_BUTTON_TEXT color of the skin. */ - virtual IGUIEditBox* getEditBox() const _IRR_OVERRIDE_; - - //! set the current value of the spinbox - /** \param val: value to be set in the spinbox */ - virtual void setValue(f32 val) _IRR_OVERRIDE_; - - //! Get the current value of the spinbox - virtual f32 getValue() const _IRR_OVERRIDE_; - - //! set the range of values which can be used in the spinbox - /** \param min: minimum value - \param max: maximum value */ - virtual void setRange(f32 min, f32 max) _IRR_OVERRIDE_; - - //! get the minimum value which can be used in the spinbox - virtual f32 getMin() const _IRR_OVERRIDE_; - - //! get the maximum value which can be used in the spinbox - virtual f32 getMax() const _IRR_OVERRIDE_; - - //! step size by which values are changed when pressing the spin buttons - /** \param step: stepsize used for value changes when pressing spin buttons */ - virtual void setStepSize(f32 step=1.f) _IRR_OVERRIDE_; - - //! returns the step size - virtual f32 getStepSize() const _IRR_OVERRIDE_; - - //! called if an event happened. - virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_; - - //! Draws the element and its children. - virtual void draw() _IRR_OVERRIDE_; - - //! Sets the new caption of the element - virtual void setText(const wchar_t* text) _IRR_OVERRIDE_; - - //! Returns caption of this element. - virtual const wchar_t* getText() const _IRR_OVERRIDE_; - - //! Sets the number of decimal places to display. - //! Note that this also rounds the range to the same number of decimal places. - /** \param places: The number of decimal places to display, use -1 to reset */ - virtual void setDecimalPlaces(s32 places) _IRR_OVERRIDE_; - - //! Sets when the spinbox has to validate entered text. - /** \param validateOn Can be any combination of EGUI_SPINBOX_VALIDATION bit flags */ - virtual void setValidateOn(u32 validateOn) _IRR_OVERRIDE_; - - //! Gets when the spinbox has to validate entered text. - virtual u32 getValidateOn() const _IRR_OVERRIDE_; - - protected: - virtual void verifyValueRange(); - void refreshSprites(); - - IGUIEditBox * EditBox; - IGUIButton * ButtonSpinUp; - IGUIButton * ButtonSpinDown; - video::SColor CurrentIconColor; - f32 StepSize; - f32 RangeMin; - f32 RangeMax; - - core::stringw FormatString; - s32 DecimalPlaces; - u32 ValidateOn; // combination of EGUI_SPINBOX_VALIDATION bit-flags - }; - - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - -#endif // __C_GUI_SPIN_BOX_H_INCLUDED__ - diff --git a/source/Irrlicht/CGUITable.cpp b/source/Irrlicht/CGUITable.cpp deleted file mode 100644 index e88e9147..00000000 --- a/source/Irrlicht/CGUITable.cpp +++ /dev/null @@ -1,1142 +0,0 @@ -// 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 - -// 07.10.2005 - Multicolor-Listbox added by A. Buschhueter (Acki) -// A_Buschhueter@gmx.de - -#include "CGUITable.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUISkin.h" -#include "IGUIEnvironment.h" -#include "IVideoDriver.h" -#include "IGUIFont.h" -#include "CGUIScrollBar.h" -#include "os.h" - -#define ARROW_PAD 15 - -namespace irr -{ -namespace gui -{ - -//! constructor -CGUITable::CGUITable(IGUIEnvironment* environment, IGUIElement* parent, - s32 id, const core::rect& rectangle, bool clip, - bool drawBack, bool moveOverSelect) -: IGUITable(environment, parent, id, rectangle), - VerticalScrollBar(0), HorizontalScrollBar(0), - Clip(clip), DrawBack(drawBack), MoveOverSelect(moveOverSelect), - Selecting(false), CurrentResizedColumn(-1), ResizeStart(0), ResizableColumns(true), - ItemHeight(0), TotalItemHeight(0), TotalItemWidth(0), Selected(-1), - CellHeightPadding(2), CellWidthPadding(5), ActiveTab(-1), - CurrentOrdering(EGOM_NONE), DrawFlags(EGTDF_ROWS | EGTDF_COLUMNS | EGTDF_ACTIVE_ROW ), - ScrollBarSize(0), - OverrideFont(0) -{ - #ifdef _DEBUG - setDebugName("CGUITable"); - #endif - - VerticalScrollBar = Environment->addScrollBar(false, core::rect(0, 0, 100, 100), this, -1); - if (VerticalScrollBar) - { - VerticalScrollBar->grab(); - VerticalScrollBar->setNotClipped(false); - VerticalScrollBar->setSubElement(true); - } - - HorizontalScrollBar = Environment->addScrollBar(true, core::rect(0, 0, 100, 100), this, -1); - if ( HorizontalScrollBar ) - { - HorizontalScrollBar->grab(); - HorizontalScrollBar->setNotClipped(false); - HorizontalScrollBar->setSubElement(true); - } - - refreshControls(); -} - - -//! destructor -CGUITable::~CGUITable() -{ - if (VerticalScrollBar) - VerticalScrollBar->drop(); - if ( HorizontalScrollBar ) - HorizontalScrollBar->drop(); - - if (OverrideFont) - OverrideFont->drop(); -} - - -void CGUITable::addColumn(const wchar_t* caption, s32 columnIndex) -{ - Column tabHeader; - tabHeader.Name = caption; - tabHeader.Width = getActiveFont()->getDimension(caption).Width + (CellWidthPadding * 2) + ARROW_PAD; - tabHeader.OrderingMode = EGCO_NONE; - - if ( columnIndex < 0 || columnIndex >= (s32)Columns.size() ) - { - Columns.push_back(tabHeader); - for ( u32 i=0; i < Rows.size(); ++i ) - { - Cell cell; - Rows[i].Items.push_back(cell); - } - } - else - { - Columns.insert(tabHeader, columnIndex); - for ( u32 i=0; i < Rows.size(); ++i ) - { - Cell cell; - Rows[i].Items.insert(cell, columnIndex); - } - } - - if (ActiveTab == -1 && Columns.size() == 1) // first column added - make it active automatically - ActiveTab = 0; - - recalculateWidths(); -} - - -//! remove a column from the table -void CGUITable::removeColumn(u32 columnIndex) -{ - if ( columnIndex < Columns.size() ) - { - Columns.erase(columnIndex); - for ( u32 i=0; i < Rows.size(); ++i ) - { - Rows[i].Items.erase(columnIndex); - } - } - if ( (s32)columnIndex <= ActiveTab ) - ActiveTab = Columns.size() ? 0 : -1; - - recalculateWidths(); -} - - -s32 CGUITable::getColumnCount() const -{ - return Columns.size(); -} - - -s32 CGUITable::getRowCount() const -{ - return Rows.size(); -} - - -bool CGUITable::setActiveColumn(s32 idx, bool doOrder ) -{ - if ( idx >= (s32)Columns.size() ) - idx = -1; - - bool changed = (ActiveTab != idx); - ActiveTab = idx; - if ( ActiveTab < 0 ) - return false; - - if ( doOrder ) - { - switch ( Columns[idx].OrderingMode ) - { - case EGCO_NONE: - CurrentOrdering = EGOM_NONE; - break; - - case EGCO_CUSTOM: - CurrentOrdering = EGOM_NONE; - if (Parent) - { - SEvent event; - event.EventType = EET_GUI_EVENT; - event.GUIEvent.Caller = this; - event.GUIEvent.Element = 0; - event.GUIEvent.EventType = EGET_TABLE_HEADER_CHANGED; - Parent->OnEvent(event); - } - - break; - - case EGCO_ASCENDING: - CurrentOrdering = EGOM_ASCENDING; - break; - - case EGCO_DESCENDING: - CurrentOrdering = EGOM_DESCENDING; - break; - - case EGCO_FLIP_ASCENDING_DESCENDING: - CurrentOrdering = EGOM_ASCENDING == CurrentOrdering ? EGOM_DESCENDING : EGOM_ASCENDING; - break; - default: - CurrentOrdering = EGOM_NONE; - } - - orderRows(getActiveColumn(), CurrentOrdering); - } - - if (changed) - { - SEvent event; - event.EventType = EET_GUI_EVENT; - event.GUIEvent.Caller = this; - event.GUIEvent.Element = 0; - event.GUIEvent.EventType = EGET_TABLE_HEADER_CHANGED; - Parent->OnEvent(event); - } - - return true; -} - - -s32 CGUITable::getActiveColumn() const -{ - return ActiveTab; -} - - -EGUI_ORDERING_MODE CGUITable::getActiveColumnOrdering() const -{ - return CurrentOrdering; -} - - -void CGUITable::setColumnWidth(u32 columnIndex, u32 width) -{ - if ( columnIndex < Columns.size() ) - { - const u32 MIN_WIDTH = getActiveFont()->getDimension(Columns[columnIndex].Name.c_str() ).Width + (CellWidthPadding * 2); - if ( width < MIN_WIDTH ) - width = MIN_WIDTH; - - Columns[columnIndex].Width = width; - - for ( u32 i=0; i < Rows.size(); ++i ) - { - breakText( Rows[i].Items[columnIndex].Text, Rows[i].Items[columnIndex].BrokenText, Columns[columnIndex].Width ); - } - } - recalculateWidths(); -} - -//! Get the width of a column -u32 CGUITable::getColumnWidth(u32 columnIndex) const -{ - if ( columnIndex >= Columns.size() ) - return 0; - - return Columns[columnIndex].Width; -} - -void CGUITable::setResizableColumns(bool resizable) -{ - ResizableColumns = resizable; -} - - -bool CGUITable::hasResizableColumns() const -{ - return ResizableColumns; -} - - -u32 CGUITable::addRow(u32 rowIndex) -{ - if ( rowIndex > Rows.size() ) - { - rowIndex = Rows.size(); - } - - Row row; - - if ( rowIndex == Rows.size() ) - Rows.push_back(row); - else - Rows.insert(row, rowIndex); - - Rows[rowIndex].Items.reallocate(Columns.size()); - for ( u32 i = 0 ; i < Columns.size() ; ++i ) - { - Rows[rowIndex].Items.push_back(Cell()); - } - - recalculateHeights(); - return rowIndex; -} - - -void CGUITable::removeRow(u32 rowIndex) -{ - if ( rowIndex > Rows.size() ) - return; - - Rows.erase( rowIndex ); - - if ( !(Selected < s32(Rows.size())) ) - Selected = Rows.size() - 1; - - recalculateHeights(); -} - - -//! adds an list item, returns id of item -void CGUITable::setCellText(u32 rowIndex, u32 columnIndex, const core::stringw& text) -{ - if ( rowIndex < Rows.size() && columnIndex < Columns.size() ) - { - Rows[rowIndex].Items[columnIndex].Text = text; - breakText( Rows[rowIndex].Items[columnIndex].Text, Rows[rowIndex].Items[columnIndex].BrokenText, Columns[columnIndex].Width ); - - IGUISkin* skin = Environment->getSkin(); - if ( skin ) - Rows[rowIndex].Items[columnIndex].Color = skin->getColor(EGDC_BUTTON_TEXT); - } -} - -void CGUITable::setCellText(u32 rowIndex, u32 columnIndex, const core::stringw& text, video::SColor color) -{ - if ( rowIndex < Rows.size() && columnIndex < Columns.size() ) - { - Rows[rowIndex].Items[columnIndex].Text = text; - breakText( Rows[rowIndex].Items[columnIndex].Text, Rows[rowIndex].Items[columnIndex].BrokenText, Columns[columnIndex].Width ); - Rows[rowIndex].Items[columnIndex].Color = color; - Rows[rowIndex].Items[columnIndex].IsOverrideColor = true; - } -} - - -void CGUITable::setCellColor(u32 rowIndex, u32 columnIndex, video::SColor color) -{ - if ( rowIndex < Rows.size() && columnIndex < Columns.size() ) - { - Rows[rowIndex].Items[columnIndex].Color = color; - Rows[rowIndex].Items[columnIndex].IsOverrideColor = true; - } -} - - -void CGUITable::setCellData(u32 rowIndex, u32 columnIndex, void *data) -{ - if ( rowIndex < Rows.size() && columnIndex < Columns.size() ) - { - Rows[rowIndex].Items[columnIndex].Data = data; - } -} - - -const wchar_t* CGUITable::getCellText(u32 rowIndex, u32 columnIndex ) const -{ - if ( rowIndex < Rows.size() && columnIndex < Columns.size() ) - { - return Rows[rowIndex].Items[columnIndex].Text.c_str(); - } - - return 0; -} - - -void* CGUITable::getCellData(u32 rowIndex, u32 columnIndex ) const -{ - if ( rowIndex < Rows.size() && columnIndex < Columns.size() ) - { - return Rows[rowIndex].Items[columnIndex].Data; - } - - return 0; -} - - -//! clears the list -void CGUITable::clear() -{ - Selected = -1; - Rows.clear(); - Columns.clear(); - - if (VerticalScrollBar) - VerticalScrollBar->setPos(0); - if ( HorizontalScrollBar ) - HorizontalScrollBar->setPos(0); - - recalculateHeights(); - recalculateWidths(); -} - - -void CGUITable::clearRows() -{ - Selected = -1; - Rows.clear(); - - if (VerticalScrollBar) - VerticalScrollBar->setPos(0); - - recalculateHeights(); -} - - -/*! -*/ -s32 CGUITable::getSelected() const -{ - return Selected; -} - -//! set which row is currently selected -void CGUITable::setSelected( s32 index ) -{ - Selected = -1; - if ( index >= 0 && index < (s32) Rows.size() ) - Selected = index; -} - - -void CGUITable::recalculateWidths() -{ - TotalItemWidth=0; - for ( u32 i=0; i < Columns.size(); ++i ) - { - TotalItemWidth += Columns[i].Width; - } - checkScrollbars(); -} - - -void CGUITable::recalculateHeights() -{ - IGUIFont* activeFont = getActiveFont(); - if(activeFont) - { - ItemHeight = activeFont->getDimension(L"A").Height + (CellHeightPadding * 2); - TotalItemHeight = ItemHeight * Rows.size(); // header is not counted, because we only want items - } - else - { - ItemHeight = 0; - TotalItemHeight = 0; - } - checkScrollbars(); -} - - -// automatic enabled/disabling and resizing of scrollbars -void CGUITable::checkScrollbars() -{ - IGUISkin* skin = Environment->getSkin(); - if ( !HorizontalScrollBar || !VerticalScrollBar || !skin) - return; - - ScrollBarSize = skin->getSize(EGDS_SCROLLBAR_SIZE); - - bool wasHorizontalScrollBarVisible = HorizontalScrollBar->isVisible(); - bool wasVerticalScrollBarVisible = VerticalScrollBar->isVisible(); - HorizontalScrollBar->setVisible(false); - VerticalScrollBar->setVisible(false); - - // CAREFUL: near identical calculations for tableRect and clientClip are also done in draw - // area of table used for drawing without scrollbars - core::rect tableRect(AbsoluteRect); - tableRect.UpperLeftCorner.X += 1; - tableRect.UpperLeftCorner.Y += 1; - s32 headerBottom = tableRect.UpperLeftCorner.Y + ItemHeight; - - // area of for the items (without header and without scrollbars) - core::rect clientClip(tableRect); - clientClip.UpperLeftCorner.Y = headerBottom + 1; - - // needs horizontal scroll be visible? - if( TotalItemWidth > clientClip.getWidth() ) - { - clientClip.LowerRightCorner.Y -= ScrollBarSize; - HorizontalScrollBar->setVisible(true); - HorizontalScrollBar->setMax(core::max_(0,TotalItemWidth - clientClip.getWidth())); - } - - // needs vertical scroll be visible? - if( TotalItemHeight > clientClip.getHeight() ) - { - clientClip.LowerRightCorner.X -= ScrollBarSize; - VerticalScrollBar->setVisible(true); - VerticalScrollBar->setMax(core::max_(0,TotalItemHeight - clientClip.getHeight())); - - // check horizontal again because we have now smaller clientClip - if ( !HorizontalScrollBar->isVisible() ) - { - if( TotalItemWidth > clientClip.getWidth() ) - { - clientClip.LowerRightCorner.Y -= ScrollBarSize; - HorizontalScrollBar->setVisible(true); - HorizontalScrollBar->setMax(core::max_(0,TotalItemWidth - clientClip.getWidth())); - } - } - } - - // find the correct size for the vertical scrollbar - if ( VerticalScrollBar->isVisible() ) - { - if (!wasVerticalScrollBarVisible ) - VerticalScrollBar->setPos(0); - - if ( HorizontalScrollBar->isVisible() ) - { - VerticalScrollBar->setRelativePosition( - core::rect(RelativeRect.getWidth() - ScrollBarSize, 1, - RelativeRect.getWidth()-1, RelativeRect.getHeight()-(1+ScrollBarSize) ) ); - } - else - { - VerticalScrollBar->setRelativePosition( - core::rect(RelativeRect.getWidth() - ScrollBarSize, 1, - RelativeRect.getWidth()-1, RelativeRect.getHeight()-1) ); - } - } - - // find the correct size for the horizontal scrollbar - if ( HorizontalScrollBar->isVisible() ) - { - if ( !wasHorizontalScrollBarVisible ) - HorizontalScrollBar->setPos(0); - - if ( VerticalScrollBar->isVisible() ) - { - HorizontalScrollBar->setRelativePosition( core::rect(1, RelativeRect.getHeight() - ScrollBarSize, RelativeRect.getWidth()-(1+ScrollBarSize), RelativeRect.getHeight()-1) ); - } - else - { - HorizontalScrollBar->setRelativePosition( core::rect(1, RelativeRect.getHeight() - ScrollBarSize, RelativeRect.getWidth()-1, RelativeRect.getHeight()-1) ); - } - } -} - - -void CGUITable::refreshControls() -{ - updateAbsolutePosition(); - - if ( VerticalScrollBar ) - VerticalScrollBar->setVisible(false); - - if ( HorizontalScrollBar ) - HorizontalScrollBar->setVisible(false); - - recalculateHeights(); - recalculateWidths(); -} - - -//! called if an event happened. -bool CGUITable::OnEvent(const SEvent &event) -{ - if (isEnabled()) - { - - switch(event.EventType) - { - case EET_GUI_EVENT: - switch(event.GUIEvent.EventType) - { - case gui::EGET_SCROLL_BAR_CHANGED: - if (event.GUIEvent.Caller == VerticalScrollBar) - { - // current position will get read out in draw - return true; - } - if (event.GUIEvent.Caller == HorizontalScrollBar) - { - // current position will get read out in draw - return true; - } - break; - case gui::EGET_ELEMENT_FOCUS_LOST: - { - CurrentResizedColumn = -1; - Selecting = false; - } - break; - default: - break; - } - break; - case EET_MOUSE_INPUT_EVENT: - { - if ( !isEnabled() ) - return false; - - core::position2d p(event.MouseInput.X, event.MouseInput.Y); - - switch(event.MouseInput.Event) - { - case EMIE_MOUSE_WHEEL: - VerticalScrollBar->setPos(VerticalScrollBar->getPos() + (event.MouseInput.Wheel < 0 ? -1 : 1)*-10); - return true; - - case EMIE_LMOUSE_PRESSED_DOWN: - - if (VerticalScrollBar->isVisible() && - VerticalScrollBar->getAbsolutePosition().isPointInside(p) && - VerticalScrollBar->OnEvent(event)) - return true; - - if (HorizontalScrollBar->isVisible() && - HorizontalScrollBar->getAbsolutePosition().isPointInside(p) && - HorizontalScrollBar->OnEvent(event)) - return true; - - if ( dragColumnStart( event.MouseInput.X, event.MouseInput.Y ) ) - { - return true; - } - - if ( selectColumnHeader( event.MouseInput.X, event.MouseInput.Y ) ) - return true; - - Selecting = true; - return true; - - case EMIE_LMOUSE_LEFT_UP: - - CurrentResizedColumn = -1; - Selecting = false; - - if (VerticalScrollBar->isVisible() && - VerticalScrollBar->getAbsolutePosition().isPointInside(p) && - VerticalScrollBar->OnEvent(event)) - { - return true; - } - - if (HorizontalScrollBar->isVisible() && - HorizontalScrollBar->getAbsolutePosition().isPointInside(p) && - HorizontalScrollBar->OnEvent(event)) - { - return true; - } - - selectNew(event.MouseInput.Y); - return true; - - case EMIE_MOUSE_MOVED: - if ( CurrentResizedColumn >= 0 ) - { - if ( dragColumnUpdate(event.MouseInput.X) ) - { - return true; - } - } - if (Selecting || MoveOverSelect) - { - if (getAbsolutePosition().isPointInside(p)) - { - selectNew(event.MouseInput.Y); - return true; - } - } - break; - default: - break; - } - } - break; - default: - break; - } - } - - return IGUIElement::OnEvent(event); -} - - -void CGUITable::setColumnOrdering(u32 columnIndex, EGUI_COLUMN_ORDERING mode) -{ - if ( columnIndex < Columns.size() ) - Columns[columnIndex].OrderingMode = mode; -} - - -void CGUITable::swapRows(u32 rowIndexA, u32 rowIndexB) -{ - if ( rowIndexA >= Rows.size() ) - return; - - if ( rowIndexB >= Rows.size() ) - return; - - Row swap = Rows[rowIndexA]; - Rows[rowIndexA] = Rows[rowIndexB]; - Rows[rowIndexB] = swap; - - if ( Selected == s32(rowIndexA) ) - Selected = rowIndexB; - else if( Selected == s32(rowIndexB) ) - Selected = rowIndexA; - -} - - -bool CGUITable::dragColumnStart(s32 xpos, s32 ypos) -{ - if ( !ResizableColumns ) - return false; - - if ( ypos > ( AbsoluteRect.UpperLeftCorner.Y + ItemHeight ) ) - return false; - - const s32 CLICK_AREA = 12; // to left and right of line which can be dragged - s32 pos = AbsoluteRect.UpperLeftCorner.X+1; - - if ( HorizontalScrollBar && HorizontalScrollBar->isVisible() ) - pos -= HorizontalScrollBar->getPos(); - - pos += TotalItemWidth; - - // have to search from the right as otherwise lines could no longer be resized when a column width is 0 - for ( s32 i = (s32)Columns.size()-1; i >= 0 ; --i ) - { - u32 colWidth = Columns[i].Width; - - if ( xpos >= (pos - CLICK_AREA) && xpos < ( pos + CLICK_AREA ) ) - { - CurrentResizedColumn = i; - ResizeStart = xpos; - return true; - } - - pos -= colWidth; - } - - return false; -} - - -bool CGUITable::dragColumnUpdate(s32 xpos) -{ - if ( !ResizableColumns || CurrentResizedColumn < 0 || CurrentResizedColumn >= s32(Columns.size()) ) - { - CurrentResizedColumn = -1; - return false; - } - - s32 width = s32(Columns[CurrentResizedColumn].Width) + (xpos-ResizeStart); - if ( width < 0 ) - width = 0; - setColumnWidth(CurrentResizedColumn, u32(width)); - ResizeStart = xpos; - - return false; -} - - -bool CGUITable::selectColumnHeader(s32 xpos, s32 ypos) -{ - if ( ypos > ( AbsoluteRect.UpperLeftCorner.Y + ItemHeight ) ) - return false; - - s32 pos = AbsoluteRect.UpperLeftCorner.X+1; - - if ( HorizontalScrollBar && HorizontalScrollBar->isVisible() ) - pos -= HorizontalScrollBar->getPos(); - - for ( u32 i = 0 ; i < Columns.size() ; ++i ) - { - u32 colWidth = Columns[i].Width; - - if ( xpos >= pos && xpos < ( pos + s32(colWidth) ) ) - { - setActiveColumn( i, true ); - - return true; - } - - pos += colWidth; - } - - return false; -} - - -void CGUITable::orderRows(s32 columnIndex, EGUI_ORDERING_MODE mode) -{ - Row swap; - - if ( columnIndex == -1 ) - columnIndex = getActiveColumn(); - if ( columnIndex < 0 ) - return; - - if ( mode == EGOM_ASCENDING ) - { - for ( s32 i = 0 ; i < s32(Rows.size()) - 1 ; ++i ) - { - for ( s32 j = 0 ; j < s32(Rows.size()) - i - 1 ; ++j ) - { - if ( Rows[j+1].Items[columnIndex].Text < Rows[j].Items[columnIndex].Text ) - { - swap = Rows[j]; - Rows[j] = Rows[j+1]; - Rows[j+1] = swap; - - if ( Selected == j ) - Selected = j+1; - else if( Selected == j+1 ) - Selected = j; - } - } - } - } - else if ( mode == EGOM_DESCENDING ) - { - for ( s32 i = 0 ; i < s32(Rows.size()) - 1 ; ++i ) - { - for ( s32 j = 0 ; j < s32(Rows.size()) - i - 1 ; ++j ) - { - if ( Rows[j].Items[columnIndex].Text < Rows[j+1].Items[columnIndex].Text) - { - swap = Rows[j]; - Rows[j] = Rows[j+1]; - Rows[j+1] = swap; - - if ( Selected == j ) - Selected = j+1; - else if( Selected == j+1 ) - Selected = j; - } - } - } - } -} - - -void CGUITable::selectNew(s32 ypos, bool onlyHover) -{ - IGUISkin* skin = Environment->getSkin(); - if (!skin) - return; - - s32 oldSelected = Selected; - - if ( ypos < ( AbsoluteRect.UpperLeftCorner.Y + ItemHeight ) ) - return; - - // find new selected item. - if (ItemHeight!=0) - Selected = ((ypos - AbsoluteRect.UpperLeftCorner.Y - ItemHeight - 1) + VerticalScrollBar->getPos()) / ItemHeight; - - if (Selected >= (s32)Rows.size()) - Selected = Rows.size() - 1; - else if (Selected<0) - Selected = 0; - - // post the news - if (Parent && !onlyHover) - { - SEvent event; - event.EventType = EET_GUI_EVENT; - event.GUIEvent.Caller = this; - event.GUIEvent.Element = 0; - event.GUIEvent.EventType = (Selected != oldSelected) ? EGET_TABLE_CHANGED : EGET_TABLE_SELECTED_AGAIN; - Parent->OnEvent(event); - } -} - - -//! draws the element and its children -void CGUITable::draw() -{ - if (!IsVisible) - return; - - irr::video::IVideoDriver* driver = Environment->getVideoDriver(); - - IGUISkin* skin = Environment->getSkin(); - if (!skin) - return; - - IGUIFont* font = getActiveFont(); - if (!font) - return; - - if ( ScrollBarSize != skin->getSize(EGDS_SCROLLBAR_SIZE) ) - checkScrollbars(); - - // CAREFUL: near identical calculations for tableRect and clientClip are also done in checkScrollbars and selectColumnHeader - // Area of table used for drawing without scrollbars - core::rect tableRect(AbsoluteRect); - tableRect.UpperLeftCorner.X += 1; - tableRect.UpperLeftCorner.Y += 1; - if ( VerticalScrollBar && VerticalScrollBar->isVisible() ) - tableRect.LowerRightCorner.X -= ScrollBarSize; - if ( HorizontalScrollBar && HorizontalScrollBar->isVisible() ) - tableRect.LowerRightCorner.Y -= ScrollBarSize; - - s32 headerBottom = tableRect.UpperLeftCorner.Y + ItemHeight; - - // area of for the items (without header and without scrollbars) - core::rect clientClip(tableRect); - clientClip.UpperLeftCorner.Y = headerBottom + 1; - clientClip.clipAgainst(AbsoluteClippingRect); - - // draw background for whole element - skin->draw3DSunkenPane(this, skin->getColor(EGDC_3D_HIGH_LIGHT), true, DrawBack, AbsoluteRect, &AbsoluteClippingRect); - - // scrolledTableClient is the area where the table items would be if it could be drawn completely - core::rect scrolledTableClient(tableRect); - scrolledTableClient.UpperLeftCorner.Y = headerBottom + 1; - scrolledTableClient.LowerRightCorner.Y = scrolledTableClient.UpperLeftCorner.Y + TotalItemHeight; - scrolledTableClient.LowerRightCorner.X = scrolledTableClient.UpperLeftCorner.X + TotalItemWidth; - if ( VerticalScrollBar && VerticalScrollBar->isVisible() ) - { - scrolledTableClient.UpperLeftCorner.Y -= VerticalScrollBar->getPos(); - scrolledTableClient.LowerRightCorner.Y -= VerticalScrollBar->getPos(); - } - if ( HorizontalScrollBar && HorizontalScrollBar->isVisible() ) - { - scrolledTableClient.UpperLeftCorner.X -= HorizontalScrollBar->getPos(); - scrolledTableClient.LowerRightCorner.X -= HorizontalScrollBar->getPos(); - } - - // rowRect is around the scrolled row - core::rect rowRect(scrolledTableClient); - rowRect.LowerRightCorner.Y = rowRect.UpperLeftCorner.Y + ItemHeight; - - u32 pos; - for ( u32 i = 0 ; i < Rows.size() ; ++i ) - { - if (rowRect.LowerRightCorner.Y >= AbsoluteRect.UpperLeftCorner.Y && - rowRect.UpperLeftCorner.Y <= AbsoluteRect.LowerRightCorner.Y) - { - // draw row separator - if ( DrawFlags & EGTDF_ROWS ) - { - core::rect lineRect(rowRect); - lineRect.UpperLeftCorner.Y = lineRect.LowerRightCorner.Y - 1; - driver->draw2DRectangle(skin->getColor(EGDC_3D_SHADOW), lineRect, &clientClip); - } - - core::rect textRect(rowRect); - pos = rowRect.UpperLeftCorner.X; - - // draw selected row background highlighted - if ((s32)i == Selected && DrawFlags & EGTDF_ACTIVE_ROW ) - driver->draw2DRectangle(skin->getColor(EGDC_HIGH_LIGHT), rowRect, &clientClip); - - for ( u32 j = 0 ; j < Columns.size() ; ++j ) - { - textRect.UpperLeftCorner.X = pos + CellWidthPadding; - textRect.LowerRightCorner.X = pos + Columns[j].Width - CellWidthPadding; - - // draw item text - if ((s32)i == Selected) - { - font->draw(Rows[i].Items[j].BrokenText.c_str(), textRect, skin->getColor(isEnabled() ? EGDC_HIGH_LIGHT_TEXT : EGDC_GRAY_TEXT), false, true, &clientClip); - } - else - { - if ( !Rows[i].Items[j].IsOverrideColor ) // skin-colors can change - Rows[i].Items[j].Color = skin->getColor(EGDC_BUTTON_TEXT); - font->draw(Rows[i].Items[j].BrokenText.c_str(), textRect, isEnabled() ? Rows[i].Items[j].Color : skin->getColor(EGDC_GRAY_TEXT), false, true, &clientClip); - } - - pos += Columns[j].Width; - } - } - - rowRect.UpperLeftCorner.Y += ItemHeight; - rowRect.LowerRightCorner.Y += ItemHeight; - } - - core::rect columnSeparator(clientClip); - pos = scrolledTableClient.UpperLeftCorner.X; - - core::rect tableClip(tableRect); - tableClip.clipAgainst(AbsoluteClippingRect); - - for (u32 i = 0 ; i < Columns.size() ; ++i ) - { - const wchar_t* text = Columns[i].Name.c_str(); - u32 colWidth = Columns[i].Width; - - core::rect columnrect(pos, tableRect.UpperLeftCorner.Y, pos + colWidth, headerBottom); - - // draw column background - skin->draw3DButtonPaneStandard(this, columnrect, &tableClip); - - // draw column separator - if ( DrawFlags & EGTDF_COLUMNS ) - { - columnSeparator.UpperLeftCorner.X = pos; - columnSeparator.LowerRightCorner.X = pos + 1; - driver->draw2DRectangle(skin->getColor(EGDC_3D_SHADOW), columnSeparator, &tableClip); - } - - // draw header column text - columnrect.UpperLeftCorner.X += CellWidthPadding; - font->draw(text, columnrect, skin->getColor( isEnabled() ? EGDC_BUTTON_TEXT : EGDC_GRAY_TEXT), false, true, &tableClip); - - // draw icon for active column tab - if ( (s32)i == ActiveTab ) - { - if ( CurrentOrdering == EGOM_ASCENDING ) - { - columnrect.UpperLeftCorner.X = columnrect.LowerRightCorner.X - CellWidthPadding - ARROW_PAD / 2 + 2; - columnrect.UpperLeftCorner.Y += 7; - skin->drawIcon(this,EGDI_CURSOR_UP,columnrect.UpperLeftCorner,0,0,false,&tableClip); - } - else - { - columnrect.UpperLeftCorner.X = columnrect.LowerRightCorner.X - CellWidthPadding - ARROW_PAD / 2 + 2; - columnrect.UpperLeftCorner.Y += 7; - skin->drawIcon(this,EGDI_CURSOR_DOWN,columnrect.UpperLeftCorner,0,0,false,&tableClip); - } - } - - pos += colWidth; - } - - // fill up header background up to the right side - core::rect columnrect(pos, tableRect.UpperLeftCorner.Y, tableRect.LowerRightCorner.X , headerBottom); - skin->draw3DButtonPaneStandard(this, columnrect, &tableClip); - - IGUIElement::draw(); -} - - -void CGUITable::breakText(const core::stringw& text, core::stringw& brokenText, u32 cellWidth) -{ - IGUISkin* skin = Environment->getSkin(); - - if (!skin) - return; - - IGUIFont* font = getActiveFont(); - if (!font) - return; - - core::stringw line, lineDots; - wchar_t c[2]; - c[1] = L'\0'; - - const u32 maxLength = cellWidth - (CellWidthPadding * 2); - const u32 maxLengthDots = cellWidth - (CellWidthPadding * 2) - font->getDimension(L"...").Width; - const u32 size = text.size(); - u32 pos = 0; - - u32 i; - - for (i=0; igetDimension(c).Width; - if ( pos > maxLength ) - break; - - if ( font->getDimension( (line + c).c_str() ).Width > maxLengthDots ) - lineDots = line; - - line += c[0]; - } - - if ( i < size ) - brokenText = lineDots + L"..."; - else - brokenText = line; -} - - -//! Set some flags influencing the layout of the table -void CGUITable::setDrawFlags(s32 flags) -{ - DrawFlags = flags; -} - - -//! Get the flags which influence the layout of the table -s32 CGUITable::getDrawFlags() const -{ - return DrawFlags; -} - -//! Sets another skin independent font. -void CGUITable::setOverrideFont(IGUIFont* font) -{ - if (OverrideFont == font) - return; - - if (OverrideFont) - OverrideFont->drop(); - - OverrideFont = font; - - if (OverrideFont) - OverrideFont->grab(); - - refreshControls(); -} - -//! Gets the override font (if any) -IGUIFont * CGUITable::getOverrideFont() const -{ - return OverrideFont; -} - -//! Get the font which is used right now for drawing -IGUIFont* CGUITable::getActiveFont() const -{ - if ( OverrideFont ) - return OverrideFont; - IGUISkin* skin = Environment->getSkin(); - if (skin) - return skin->getFont(); - return 0; -} - -//! Get the height of items/rows -s32 CGUITable::getItemHeight() const -{ - return ItemHeight; -} - -//! Access the vertical scrollbar -IGUIScrollBar* CGUITable::getVerticalScrollBar() const -{ - return VerticalScrollBar; -} - -//! Access the horizontal scrollbar -IGUIScrollBar* CGUITable::getHorizontalScrollBar() const -{ - return HorizontalScrollBar; -} - -//! Sets whether to draw the background. -void CGUITable::setDrawBackground(bool draw) -{ - DrawBack = draw; -} - -//! Checks if background drawing is enabled -/** \return true if background drawing is enabled, false otherwise */ -bool CGUITable::isDrawBackgroundEnabled() const -{ - return DrawBack; -} - -} // end namespace gui -} // end namespace irr - -#endif - diff --git a/source/Irrlicht/CGUITable.h b/source/Irrlicht/CGUITable.h deleted file mode 100644 index b5264a9f..00000000 --- a/source/Irrlicht/CGUITable.h +++ /dev/null @@ -1,244 +0,0 @@ -// 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 - -// 07.10.2005 - Multicolor-Listbox addet by A. Buschhueter (Acki) -// A_Buschhueter@gmx.de - -#ifndef __C_GUI_TABLE_BAR_H_INCLUDED__ -#define __C_GUI_TABLE_BAR_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUITable.h" -#include "irrArray.h" - -namespace irr -{ -namespace gui -{ - - class IGUIFont; - class IGUIScrollBar; - - class CGUITable : public IGUITable - { - public: - //! constructor - CGUITable(IGUIEnvironment* environment, IGUIElement* parent, - s32 id, const core::rect& rectangle, bool clip=true, - bool drawBack=false, bool moveOverSelect=true); - - //! destructor - ~CGUITable(); - - //! Adds a column - //! If columnIndex is outside the current range, do push new column at the end - virtual void addColumn(const wchar_t* caption, s32 columnIndex=-1) _IRR_OVERRIDE_; - - //! remove a column from the table - virtual void removeColumn(u32 columnIndex) _IRR_OVERRIDE_; - - //! Returns the number of columns in the table control - virtual s32 getColumnCount() const _IRR_OVERRIDE_; - - //! Makes a column active. This will trigger an ordering process. - /** \param idx: The id of the column to make active. - \return True if successful. */ - virtual bool setActiveColumn(s32 columnIndex, bool doOrder=false) _IRR_OVERRIDE_; - - //! Returns which header is currently active - virtual s32 getActiveColumn() const _IRR_OVERRIDE_; - - //! Returns the ordering used by the currently active column - virtual EGUI_ORDERING_MODE getActiveColumnOrdering() const _IRR_OVERRIDE_; - - //! set a column width - virtual void setColumnWidth(u32 columnIndex, u32 width) _IRR_OVERRIDE_; - - //! Get the width of a column - virtual u32 getColumnWidth(u32 columnIndex) const _IRR_OVERRIDE_; - - //! columns can be resized by drag 'n drop - virtual void setResizableColumns(bool resizable) _IRR_OVERRIDE_; - - //! can columns be resized by drag 'n drop? - virtual bool hasResizableColumns() const _IRR_OVERRIDE_; - - //! This tells the table control which ordering mode should be used when - //! a column header is clicked. - /** \param columnIndex: The index of the column header. - \param state: If true, a EGET_TABLE_HEADER_CHANGED message will be sent and you can order the table data as you whish.*/ - //! \param mode: One of the modes defined in EGUI_COLUMN_ORDERING - virtual void setColumnOrdering(u32 columnIndex, EGUI_COLUMN_ORDERING mode) _IRR_OVERRIDE_; - - //! Returns which row is currently selected - virtual s32 getSelected() const _IRR_OVERRIDE_; - - //! set currently selected row - virtual void setSelected( s32 index ) _IRR_OVERRIDE_; - - //! Returns amount of rows in the tab control - virtual s32 getRowCount() const _IRR_OVERRIDE_; - - //! adds a row to the table - /** \param rowIndex: zero based index of rows. The row will be - inserted at this position. If a row already exists - there, it will be placed after it. If the row is larger - than the actual number of rows by more than one, it - won't be created. Note that if you create a row that is - not at the end, there might be performance issues*/ - virtual u32 addRow(u32 rowIndex) _IRR_OVERRIDE_; - - //! Remove a row from the table - virtual void removeRow(u32 rowIndex) _IRR_OVERRIDE_; - - //! clear the table rows, but keep the columns intact - virtual void clearRows() _IRR_OVERRIDE_; - - //! Swap two row positions. This is useful for a custom ordering algo. - virtual void swapRows(u32 rowIndexA, u32 rowIndexB) _IRR_OVERRIDE_; - - //! This tells the table to start ordering all the rows. You - //! need to explicitly tell the table to reorder the rows when - //! a new row is added or the cells data is changed. This makes - //! the system more flexible and doesn't make you pay the cost - //! of ordering when adding a lot of rows. - //! \param columnIndex: When set to -1 the active column is used. - virtual void orderRows(s32 columnIndex=-1, EGUI_ORDERING_MODE mode=EGOM_NONE) _IRR_OVERRIDE_; - - - //! Set the text of a cell - virtual void setCellText(u32 rowIndex, u32 columnIndex, const core::stringw& text) _IRR_OVERRIDE_; - - //! Set the text of a cell, and set a color of this cell. - virtual void setCellText(u32 rowIndex, u32 columnIndex, const core::stringw& text, video::SColor color) _IRR_OVERRIDE_; - - //! Set the data of a cell - //! data will not be serialized. - virtual void setCellData(u32 rowIndex, u32 columnIndex, void *data) _IRR_OVERRIDE_; - - //! Set the color of a cell text - virtual void setCellColor(u32 rowIndex, u32 columnIndex, video::SColor color) _IRR_OVERRIDE_; - - //! Get the text of a cell - virtual const wchar_t* getCellText(u32 rowIndex, u32 columnIndex ) const _IRR_OVERRIDE_; - - //! Get the data of a cell - virtual void* getCellData(u32 rowIndex, u32 columnIndex ) const _IRR_OVERRIDE_; - - //! clears the table, deletes all items in the table - virtual void clear() _IRR_OVERRIDE_; - - //! called if an event happened. - virtual bool OnEvent(const SEvent &event) _IRR_OVERRIDE_; - - //! draws the element and its children - virtual void draw() _IRR_OVERRIDE_; - - //! Set flags, as defined in EGUI_TABLE_DRAW_FLAGS, which influence the layout - virtual void setDrawFlags(s32 flags) _IRR_OVERRIDE_; - - //! Get the flags, as defined in EGUI_TABLE_DRAW_FLAGS, which influence the layout - virtual s32 getDrawFlags() const _IRR_OVERRIDE_; - - //! Sets another skin independent font. - virtual void setOverrideFont(IGUIFont* font=0) _IRR_OVERRIDE_; - - //! Gets the override font (if any) - virtual IGUIFont* getOverrideFont() const _IRR_OVERRIDE_; - - //! Get the font which is used right now for drawing - virtual IGUIFont* getActiveFont() const _IRR_OVERRIDE_; - - //! Get the height of items/rows - virtual s32 getItemHeight() const _IRR_OVERRIDE_; - - //! Access the vertical scrollbar - virtual IGUIScrollBar* getVerticalScrollBar() const _IRR_OVERRIDE_; - - //! Access the horizontal scrollbar - virtual IGUIScrollBar* getHorizontalScrollBar() const _IRR_OVERRIDE_; - - //! Sets whether to draw the background. - virtual void setDrawBackground(bool draw) _IRR_OVERRIDE_; - - //! Checks if background drawing is enabled - /** \return true if background drawing is enabled, false otherwise */ - virtual bool isDrawBackgroundEnabled() const _IRR_OVERRIDE_; - - protected: - void refreshControls(); - void checkScrollbars(); - - private: - - struct Cell - { - Cell() : IsOverrideColor(false), Data(0) {} - - core::stringw Text; - core::stringw BrokenText; - bool IsOverrideColor; - video::SColor Color; - void *Data; - }; - - struct Row - { - Row() {} - - core::array Items; - }; - - struct Column - { - Column() : Width(0), OrderingMode(EGCO_NONE) {} - - core::stringw Name; - u32 Width; - EGUI_COLUMN_ORDERING OrderingMode; - }; - - void breakText(const core::stringw &text, core::stringw & brokenText, u32 cellWidth); - void selectNew(s32 ypos, bool onlyHover=false); - bool selectColumnHeader(s32 xpos, s32 ypos); - bool dragColumnStart(s32 xpos, s32 ypos); - bool dragColumnUpdate(s32 xpos); - void recalculateHeights(); - void recalculateWidths(); - - core::array< Column > Columns; - core::array< Row > Rows; - gui::IGUIScrollBar* VerticalScrollBar; - gui::IGUIScrollBar* HorizontalScrollBar; - bool Clip; - bool DrawBack; - bool MoveOverSelect; - bool Selecting; - s32 CurrentResizedColumn; - s32 ResizeStart; - bool ResizableColumns; - - s32 ItemHeight; - s32 TotalItemHeight; - s32 TotalItemWidth; - s32 Selected; - s32 CellHeightPadding; - s32 CellWidthPadding; - s32 ActiveTab; - EGUI_ORDERING_MODE CurrentOrdering; - s32 DrawFlags; - s32 ScrollBarSize; - - gui::IGUIFont* OverrideFont; - }; - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - -#endif - diff --git a/source/Irrlicht/CGUIToolBar.cpp b/source/Irrlicht/CGUIToolBar.cpp deleted file mode 100644 index 6d4cf93c..00000000 --- a/source/Irrlicht/CGUIToolBar.cpp +++ /dev/null @@ -1,185 +0,0 @@ -// 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 - -#include "CGUIToolBar.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUISkin.h" -#include "IGUIEnvironment.h" -#include "IVideoDriver.h" -#include "IGUIButton.h" -#include "IGUIFont.h" -#include "CGUIButton.h" - -namespace irr -{ -namespace gui -{ - -//! constructor -CGUIToolBar::CGUIToolBar(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle) -:IGUIToolBar(environment, parent, id, rectangle), ButtonX(5) -{ - #ifdef _DEBUG - setDebugName("CGUIToolBar"); - #endif - - // calculate position and find other menubars - s32 y = 0; - s32 parentwidth = 100; - - if (parent) - { - parentwidth = Parent->getAbsolutePosition().getWidth(); - s32 parentheight = Parent->getAbsolutePosition().getHeight(); - - for (const auto& e : parent->getChildren()) - { - if ( e->hasType(EGUIET_CONTEXT_MENU) - || e->hasType(EGUIET_MENU) - || e->hasType(EGUIET_TOOL_BAR) ) - { - core::rect r = e->getAbsolutePosition(); - if (r.UpperLeftCorner.X == 0 && r.UpperLeftCorner.Y <= y && - r.LowerRightCorner.X == parentwidth - && parentheight > r.LowerRightCorner.Y ) - y = r.LowerRightCorner.Y; - } - else - { - e->getType(); - } - } - } - - core::rect rr; - rr.UpperLeftCorner.X = 0; - rr.UpperLeftCorner.Y = y; - s32 height = Environment->getSkin()->getSize ( EGDS_MENU_HEIGHT ); - - /*IGUISkin* skin = Environment->getSkin(); - IGUIFont* font = skin->getFont(); - if (font) - { - s32 t = font->getDimension(L"A").Height + 5; - if (t > height) - height = t; - }*/ - - rr.LowerRightCorner.X = parentwidth; - rr.LowerRightCorner.Y = rr.UpperLeftCorner.Y + height; - setRelativePosition(rr); -} - - -//! called if an event happened. -bool CGUIToolBar::OnEvent(const SEvent& event) -{ - if (isEnabled()) - { - if (event.EventType == EET_MOUSE_INPUT_EVENT && - event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) - { - if (AbsoluteClippingRect.isPointInside(core::position2di(event.MouseInput.X, event.MouseInput.Y))) - return true; - } - } - - return IGUIElement::OnEvent(event); -} - - -//! draws the element and its children -void CGUIToolBar::draw() -{ - if (!IsVisible) - return; - - IGUISkin* skin = Environment->getSkin(); - if (!skin) - return; - - core::rect rect = AbsoluteRect; - core::rect* clip = &AbsoluteClippingRect; - - // draw frame - skin->draw3DToolBar(this, rect, clip); - - IGUIElement::draw(); -} - - -//! Updates the absolute position. -void CGUIToolBar::updateAbsolutePosition() -{ - if (Parent) - { - DesiredRect.UpperLeftCorner.X = 0; - DesiredRect.LowerRightCorner.X = Parent->getAbsolutePosition().getWidth(); - } - - IGUIElement::updateAbsolutePosition(); -} - - -//! Adds a button to the tool bar -IGUIButton* CGUIToolBar::addButton(s32 id, const wchar_t* text,const wchar_t* tooltiptext, - video::ITexture* img, video::ITexture* pressed, bool isPushButton, - bool useAlphaChannel) -{ - ButtonX += 3; - - core::rect rectangle(ButtonX,2,ButtonX+1,3); - if ( img ) - { - const core::dimension2du &size = img->getOriginalSize(); - rectangle.LowerRightCorner.X = rectangle.UpperLeftCorner.X + size.Width + 8; - rectangle.LowerRightCorner.Y = rectangle.UpperLeftCorner.Y + size.Height + 6; - } - - if ( text ) - { - IGUISkin* skin = Environment->getSkin(); - IGUIFont * font = skin->getFont(EGDF_BUTTON); - if ( font ) - { - core::dimension2d dim = font->getDimension(text); - if ( (s32)dim.Width > rectangle.getWidth() ) - rectangle.LowerRightCorner.X = rectangle.UpperLeftCorner.X + dim.Width + 8; - if ( (s32)dim.Height > rectangle.getHeight() ) - rectangle.LowerRightCorner.Y = rectangle.UpperLeftCorner.Y + dim.Height + 6; - } - } - - ButtonX += rectangle.getWidth(); - - IGUIButton* button = new CGUIButton(Environment, this, id, rectangle); - button->drop(); - - if (text) - button->setText(text); - - if (tooltiptext) - button->setToolTipText(tooltiptext); - - if (img) - button->setImage(img); - - if (pressed) - button->setPressedImage(pressed); - - if (isPushButton) - button->setIsPushButton(isPushButton); - - if (useAlphaChannel) - button->setUseAlphaChannel(useAlphaChannel); - - return button; -} - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - diff --git a/source/Irrlicht/CGUIToolBar.h b/source/Irrlicht/CGUIToolBar.h deleted file mode 100644 index 316a926b..00000000 --- a/source/Irrlicht/CGUIToolBar.h +++ /dev/null @@ -1,52 +0,0 @@ -// 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 __C_GUI_TOOL_BAR_H_INCLUDED__ -#define __C_GUI_TOOL_BAR_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUIToolbar.h" - -namespace irr -{ -namespace gui -{ - - //! Stays at the top of its parent like the menu bar and contains tool buttons - class CGUIToolBar : public IGUIToolBar - { - public: - - //! constructor - CGUIToolBar(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle); - - //! called if an event happened. - virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_; - - //! draws the element and its children - virtual void draw() _IRR_OVERRIDE_; - - //! Updates the absolute position. - virtual void updateAbsolutePosition() _IRR_OVERRIDE_; - - //! Adds a button to the tool bar - virtual IGUIButton* addButton(s32 id=-1, const wchar_t* text=0,const wchar_t* tooltiptext=0, - video::ITexture* img=0, video::ITexture* pressed=0, - bool isPushButton=false, bool useAlphaChannel=false) _IRR_OVERRIDE_; - - private: - - s32 ButtonX; - }; - - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - -#endif - diff --git a/source/Irrlicht/CGUITreeView.cpp b/source/Irrlicht/CGUITreeView.cpp deleted file mode 100644 index 5c082e02..00000000 --- a/source/Irrlicht/CGUITreeView.cpp +++ /dev/null @@ -1,1080 +0,0 @@ -// This file is part of the "Irrlicht Engine". -// Written by Reinhard Ostermeier, reinhard@nospam.r-ostermeier.de -// Expanded by burningwater -// Bugfixes by Michael Zeilfelder -// Bugfixes by Andreas Reichl - -#include "CGUITreeView.h" - -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUISkin.h" -#include "IGUIEnvironment.h" -#include "IVideoDriver.h" -#include "IGUIFont.h" -#include "CGUIScrollBar.h" -#include "os.h" - -namespace irr -{ -namespace gui -{ - -CGUITreeViewNode::CGUITreeViewNode( CGUITreeView* owner, CGUITreeViewNode* parent ) - : Owner(owner), Parent(parent), ImageIndex(-1), SelectedImageIndex(-1), - Data(0), Data2(0), Expanded(false) -{ -#ifdef _DEBUG - setDebugName( "CGUITreeView" ); -#endif -} - -CGUITreeViewNode::~CGUITreeViewNode() -{ - if( Owner && this == Owner->getSelected() ) - { - setSelected( false ); - } - - clearChildren(); - - if( Data2 ) - { - Data2->drop(); - } -} - -IGUITreeView* CGUITreeViewNode::getOwner() const -{ - return Owner; -} - -IGUITreeViewNode* CGUITreeViewNode::getParent() const -{ - return Parent; -} - -void CGUITreeViewNode::setText( const wchar_t* text ) -{ - Text = text; -} - -void CGUITreeViewNode::setIcon( const wchar_t* icon ) -{ - Icon = icon; -} - -void CGUITreeViewNode::clearChildren() -{ - for (auto child : Children) - { - child->Parent = nullptr; - child->drop(); - } - Children.clear(); -} - -IGUITreeViewNode* CGUITreeViewNode::addChildBack( - const wchar_t* text, - const wchar_t* icon /*= 0*/, - s32 imageIndex /*= -1*/, - s32 selectedImageIndex /*= -1*/, - void* data /*= 0*/, - IReferenceCounted* data2 /*= 0*/ ) -{ - auto newChild = new CGUITreeViewNode( Owner, this ); - newChild->ParentPos = Children.insert(Children.end(), newChild); - newChild->Text = text; - newChild->Icon = icon; - newChild->ImageIndex = imageIndex; - newChild->SelectedImageIndex = selectedImageIndex; - newChild->Data = data; - newChild->Data2 = data2; - if( data2 ) - { - data2->grab(); - } - return newChild; -} - -IGUITreeViewNode* CGUITreeViewNode::addChildFront( - const wchar_t* text, - const wchar_t* icon /*= 0*/, - s32 imageIndex /*= -1*/, - s32 selectedImageIndex /*= -1*/, - void* data /*= 0*/, - IReferenceCounted* data2 /*= 0*/ ) -{ - auto newChild = new CGUITreeViewNode( Owner, this ); - newChild->ParentPos = Children.insert(Children.begin(), newChild); - newChild->Text = text; - newChild->Icon = icon; - newChild->ImageIndex = imageIndex; - newChild->SelectedImageIndex = selectedImageIndex; - newChild->Data = data; - newChild->Data2 = data2; - if( data2 ) - { - data2->grab(); - } - return newChild; -} - -IGUITreeViewNode* CGUITreeViewNode::insertChildAfter( - IGUITreeViewNode* iother, - const wchar_t* text, - const wchar_t* icon /*= 0*/, - s32 imageIndex /*= -1*/, - s32 selectedImageIndex /*= -1*/, - void* data /*= 0*/, - IReferenceCounted* data2/* = 0*/ ) -{ - // This cast is needed to access the ParentPos member of `other`. - // The abstraction was already broken, because Children is a list of - // CGUITreeViewNode, not IGUITreeViewNode. The existing code was - // implicitly casting through pointer comparison. - auto other = static_cast(iother); - assert(other->Parent == this); - auto newChild = new CGUITreeViewNode( Owner, this ); - newChild->ParentPos = Children.insert(std::next(other->ParentPos), newChild); - newChild->Text = text; - newChild->Icon = icon; - newChild->ImageIndex = imageIndex; - newChild->SelectedImageIndex = selectedImageIndex; - newChild->Data = data; - newChild->Data2 = data2; - if( data2 ) - data2->grab(); - return newChild; -} - -IGUITreeViewNode* CGUITreeViewNode::insertChildBefore( - IGUITreeViewNode* iother, - const wchar_t* text, - const wchar_t* icon /*= 0*/, - s32 imageIndex /*= -1*/, - s32 selectedImageIndex /*= -1*/, - void* data /*= 0*/, - IReferenceCounted* data2/* = 0*/ ) -{ - auto other = static_cast(iother); - assert(other->Parent == this); - auto newChild = new CGUITreeViewNode( Owner, this ); - newChild->ParentPos = Children.insert(other->ParentPos, newChild); - newChild->Text = text; - newChild->Icon = icon; - newChild->ImageIndex = imageIndex; - newChild->SelectedImageIndex = selectedImageIndex; - newChild->Data = data; - newChild->Data2 = data2; - if( data2 ) - data2->grab(); - return newChild; -} - -IGUITreeViewNode* CGUITreeViewNode::getFirstChild() const -{ - if( Children.empty() ) - { - return 0; - } - else - { - return Children.front(); - } -} - -IGUITreeViewNode* CGUITreeViewNode::getLastChild() const -{ - if( Children.empty() ) - { - return 0; - } - else - { - return Children.back(); - } -} - -IGUITreeViewNode* CGUITreeViewNode::getPrevSibling() const -{ - if (!Parent || ParentPos == Parent->Children.begin()) - return nullptr; - return *std::prev(ParentPos); -} - -IGUITreeViewNode* CGUITreeViewNode::getNextSibling() const -{ - if (!Parent) - return nullptr; - auto nextIt = std::next(ParentPos); - if (nextIt == Parent->Children.end()) - return nullptr; - return *nextIt; -} - -IGUITreeViewNode* CGUITreeViewNode::getNextVisible() const -{ - IGUITreeViewNode* next = 0; - const IGUITreeViewNode* node = this; - - if( node->getExpanded() && node->hasChildren() ) - { - next = node->getFirstChild(); - } - else - { - next = node->getNextSibling(); - } - while( !next && node->getParent() ) - { - next = node->getParent()->getNextSibling(); - if( !next ) - { - node = node->getParent(); - } - } - - return next; -} - -bool CGUITreeViewNode::deleteChild( IGUITreeViewNode* ichild ) -{ - auto child = static_cast(ichild); - assert(child->Parent == this); - Children.erase(child->ParentPos); - child->Parent = nullptr; - child->drop(); - return true; -} - -bool CGUITreeViewNode::moveChildUp( IGUITreeViewNode* ichild ) -{ - auto child = static_cast(ichild); - assert(child->Parent == this); - if (child->ParentPos == Children.begin()) - return false; - auto curPos = child->ParentPos; - auto prevPos = std::prev(child->ParentPos); - std::swap(*curPos, *prevPos); - std::swap((*curPos)->ParentPos, (*prevPos)->ParentPos); - return true; -} - -bool CGUITreeViewNode::moveChildDown( IGUITreeViewNode* ichild ) -{ - auto child = static_cast(ichild); - assert(child->Parent == this); - auto nextPos = std::next(child->ParentPos); - if (nextPos == Children.end()) - return false; - auto curPos = child->ParentPos; - std::swap(*curPos, *nextPos); - std::swap((*curPos)->ParentPos, (*nextPos)->ParentPos); - return true; -} - -void CGUITreeViewNode::setExpanded( bool expanded ) -{ - Expanded = expanded; -} - -void CGUITreeViewNode::setSelected( bool selected ) -{ - if( Owner ) - { - if( selected ) - { - Owner->Selected = this; - } - else - { - if( Owner->Selected == this ) - { - Owner->Selected = 0; - } - } - } -} - -bool CGUITreeViewNode::getSelected() const -{ - if( Owner ) - { - return Owner->Selected == (IGUITreeViewNode*)this; - } - else - { - return false; - } -} - -bool CGUITreeViewNode::isRoot() const -{ - return ( Owner && ( this == Owner->Root ) ); -} - -s32 CGUITreeViewNode::getLevel() const -{ - if( Parent ) - { - return Parent->getLevel() + 1; - } - else - { - return 0; - } -} - -bool CGUITreeViewNode::isVisible() const -{ - if( Parent ) - { - return Parent->getExpanded() && Parent->isVisible(); - } - else - { - return true; - } -} - - -//! constructor -CGUITreeView::CGUITreeView(IGUIEnvironment* environment, IGUIElement* parent, - s32 id, core::rect rectangle, bool clip, - bool drawBack,bool scrollBarVertical, bool scrollBarHorizontal) - : IGUITreeView( environment, parent, id, rectangle ), - Root(0), Selected(0), - ItemHeight( 0 ), - IndentWidth( 0 ), - TotalItemHeight( 0 ), - TotalItemWidth ( 0 ), - ScrollBarSize( 0 ), - Font( 0 ), - OverrideFont( 0 ), - IconFont( 0 ), - ScrollBarH( 0 ), - ScrollBarV( 0 ), - ImageList( 0 ), - LastEventNode( 0 ), - LinesVisible( true ), - Selecting( false ), - Clip( clip ), - DrawBack( drawBack ), - ImageLeftOfIcon( true ) -{ -#ifdef _DEBUG - setDebugName( "CGUITreeView" ); -#endif - - IGUISkin* skin = Environment->getSkin(); - ScrollBarSize = skin->getSize( EGDS_SCROLLBAR_SIZE ); - - if ( scrollBarVertical ) - { - ScrollBarV = new CGUIScrollBar( false, Environment, this, -1, - core::rect( RelativeRect.getWidth() - ScrollBarSize, - 0, - RelativeRect.getWidth(), - RelativeRect.getHeight() - ScrollBarSize - ), !clip ); - ScrollBarV->drop(); - - ScrollBarV->setSubElement(true); - ScrollBarV->setPos( 0 ); - ScrollBarV->grab(); - } - - if ( scrollBarHorizontal ) - { - ScrollBarH = new CGUIScrollBar( true, Environment, this, -1, - core::rect( 0, - RelativeRect.getHeight() - ScrollBarSize, - RelativeRect.getWidth() - ScrollBarSize, - RelativeRect.getHeight() - ), !clip ); - ScrollBarH->drop(); - - ScrollBarH->setSubElement(true); - ScrollBarH->setPos( 0 ); - ScrollBarH->grab(); - } - - Root = new CGUITreeViewNode( this, 0 ); - Root->Expanded = true; - - recalculateItemHeight(); -} - - -//! destructor -CGUITreeView::~CGUITreeView() -{ - if( ScrollBarV ) - { - ScrollBarV->drop(); - } - - if( ScrollBarH ) - { - ScrollBarH->drop(); - } - - if( Font ) - { - Font->drop(); - } - - if( IconFont ) - { - IconFont->drop(); - } - - if( ImageList ) - { - ImageList->drop(); - } - - if( Root ) - { - Root->drop(); - } -} - -//! Sets another skin independent font. -void CGUITreeView::setOverrideFont(IGUIFont* font) -{ - if (OverrideFont == font) - return; - - if (OverrideFont) - OverrideFont->drop(); - - OverrideFont = font; - - if (OverrideFont) - OverrideFont->grab(); - - recalculateItemHeight(); -} - -//! Gets the override font (if any) -IGUIFont * CGUITreeView::getOverrideFont() const -{ - return OverrideFont; -} - -//! Get the font which is used right now for drawing -IGUIFont* CGUITreeView::getActiveFont() const -{ - if ( OverrideFont ) - return OverrideFont; - IGUISkin* skin = Environment->getSkin(); - if (skin) - return skin->getFont(); - return 0; -} - -void CGUITreeView::recalculateItemHeight() -{ - if( Font != getActiveFont() ) - { - if( Font ) - { - Font->drop(); - } - - Font = getActiveFont(); - ItemHeight = 0; - - if( Font ) - { - ItemHeight = Font->getDimension( L"A" ).Height + 4; - Font->grab(); - } - - if( IconFont ) - { - s32 height = IconFont->getDimension( L" " ).Height; - if( height > ItemHeight ) - { - ItemHeight = height; - } - } - if( ImageList ) - { - if( ImageList->getImageSize().Height + 1 > ItemHeight ) - { - ItemHeight = ImageList->getImageSize().Height + 1; - } - } - } - - IndentWidth = ItemHeight; - if( IndentWidth < 9 ) - { - IndentWidth = 9; - } - else if( IndentWidth > 15 ) - { - IndentWidth = 15; - } - else - { - if( ( ( IndentWidth >> 1 ) << 1 ) - IndentWidth == 0 ) - { - --IndentWidth; - } - } - - TotalItemHeight = 0; - TotalItemWidth = AbsoluteRect.getWidth() * 2; - IGUITreeViewNode* node = Root->getFirstChild(); - while( node ) - { - TotalItemHeight += ItemHeight; - node = node->getNextVisible(); - } - - if ( ScrollBarV ) - { - s32 diffHor = TotalItemHeight - AbsoluteRect.getHeight(); - if ( ScrollBarH ) - { - diffHor += ScrollBarH->getAbsolutePosition().getHeight(); - } - ScrollBarV->setMax( core::max_( 0, diffHor) ); - } - - if ( ScrollBarH ) - { - s32 diffVert = TotalItemWidth - AbsoluteRect.getWidth(); - if ( ScrollBarV ) - { - // TODO: not sure yet if it needs handling - } - ScrollBarH->setMax( core::max_( 0, diffVert ) ); - } - -} - -void CGUITreeView::updateScrollBarSize(s32 size) -{ - if ( size != ScrollBarSize ) - { - ScrollBarSize = size; - - if ( ScrollBarV ) - { - core::recti r(RelativeRect.getWidth() - ScrollBarSize, 0, - RelativeRect.getWidth(), RelativeRect.getHeight() - ScrollBarSize); - ScrollBarV->setRelativePosition(r); - } - - if ( ScrollBarH ) - { - core::recti r(0, RelativeRect.getHeight() - ScrollBarSize, - RelativeRect.getWidth() - ScrollBarSize, RelativeRect.getHeight()); - ScrollBarH->setRelativePosition(r); - } - } -} - -//! called if an event happened. -bool CGUITreeView::OnEvent( const SEvent &event ) -{ - if ( isEnabled() ) - { - switch( event.EventType ) - { - case EET_GUI_EVENT: - switch( event.GUIEvent.EventType ) - { - case gui::EGET_SCROLL_BAR_CHANGED: - if( event.GUIEvent.Caller == ScrollBarV || event.GUIEvent.Caller == ScrollBarH ) - { - //s32 pos = ( ( gui::IGUIScrollBar* )event.GUIEvent.Caller )->getPos(); - return true; - } - break; - case gui::EGET_ELEMENT_FOCUS_LOST: - { - Selecting = false; - return false; - } - break; - default: - break; - } - break; - case EET_MOUSE_INPUT_EVENT: - { - core::position2d p( event.MouseInput.X, event.MouseInput.Y ); - - switch( event.MouseInput.Event ) - { - case EMIE_MOUSE_WHEEL: - if ( ScrollBarV ) - ScrollBarV->setPos( ScrollBarV->getPos() + (event.MouseInput.Wheel < 0 ? -1 : 1) * -10 ); - return true; - break; - - case EMIE_LMOUSE_PRESSED_DOWN: - if( ( ScrollBarV && ScrollBarV->getAbsolutePosition().isPointInside( p ) && ScrollBarV->OnEvent( event ) ) || - ( ScrollBarH && ScrollBarH->getAbsolutePosition().isPointInside( p ) && ScrollBarH->OnEvent( event ) ) - ) - { - return true; - } - - Selecting = true; - return true; - break; - - case EMIE_LMOUSE_LEFT_UP: - if( ( ScrollBarV && ScrollBarV->getAbsolutePosition().isPointInside( p ) && ScrollBarV->OnEvent( event ) ) || - ( ScrollBarH && ScrollBarH->getAbsolutePosition().isPointInside( p ) && ScrollBarH->OnEvent( event ) ) - ) - { - return true; - } - - Selecting = false; - mouseAction( event.MouseInput.X, event.MouseInput.Y ); - return true; - break; - - case EMIE_MOUSE_MOVED: - if( Selecting ) - { - if( getAbsolutePosition().isPointInside( p ) ) - { - mouseAction( event.MouseInput.X, event.MouseInput.Y, true ); - return true; - } - } - break; - - default: - break; - } - } - break; - default: - break; - } - } - - return Parent ? Parent->OnEvent( event ) : false; -} - -/*! -*/ -void CGUITreeView::mouseAction( s32 xpos, s32 ypos, bool onlyHover /*= false*/ ) -{ - IGUITreeViewNode* oldSelected = Selected; - s32 selIdx=-1; - SEvent event; - - event.EventType = EET_GUI_EVENT; - event.GUIEvent.Caller = this; - event.GUIEvent.Element = 0; - - xpos -= AbsoluteRect.UpperLeftCorner.X; - ypos -= AbsoluteRect.UpperLeftCorner.Y; - - // find new selected item. - s32 scrollBarVPos = ScrollBarV ? ScrollBarV->getPos() : 0; - if( ItemHeight != 0 ) - { - selIdx = ( ( ypos - 1 ) + scrollBarVPos ) / ItemHeight; - } - - IGUITreeViewNode* hitNode = 0; - IGUITreeViewNode* node = Root->getFirstChild(); - s32 n = 0; - while( node ) - { - if( selIdx == n ) - { - hitNode = node; - break; - } - node = node->getNextVisible(); - ++n; - } - - s32 scrollBarHPos = ScrollBarH ? ScrollBarH->getPos() : 0; - xpos += scrollBarHPos; // correction for shift - if( hitNode && xpos > hitNode->getLevel() * IndentWidth ) - { - Selected = hitNode; - } - - if( hitNode && !onlyHover - && xpos < hitNode->getLevel() * IndentWidth - && xpos > ( hitNode->getLevel() - 1 ) * IndentWidth - && hitNode->hasChildren() ) - { - hitNode->setExpanded( !hitNode->getExpanded() ); - - // post expand/collaps news - if( hitNode->getExpanded() ) - { - event.GUIEvent.EventType = EGET_TREEVIEW_NODE_EXPAND; - } - else - { - event.GUIEvent.EventType = EGET_TREEVIEW_NODE_COLLAPS; - } - LastEventNode = hitNode; - Parent->OnEvent( event ); - LastEventNode = 0; - } - - if( Selected && !Selected->isVisible() ) - { - Selected = 0; - } - - // post selection news - - if( Parent && !onlyHover && Selected != oldSelected ) - { - if( oldSelected ) - { - event.GUIEvent.EventType = EGET_TREEVIEW_NODE_DESELECT; - LastEventNode = oldSelected; - Parent->OnEvent( event ); - LastEventNode = 0; - } - if( Selected ) - { - event.GUIEvent.EventType = EGET_TREEVIEW_NODE_SELECT; - LastEventNode = Selected; - Parent->OnEvent( event ); - LastEventNode = 0; - } - } -} - -//! draws the element and its children -void CGUITreeView::draw() -{ - if( !IsVisible ) - { - return; - } - - IGUISkin* skin = Environment->getSkin(); - - updateScrollBarSize(skin->getSize(EGDS_SCROLLBAR_SIZE)); - recalculateItemHeight(); // if the font changed - - irr::video::IVideoDriver* driver = Environment->getVideoDriver(); - - core::rect* clipRect = 0; - if( Clip ) - { - clipRect = &AbsoluteClippingRect; - } - - // draw background - - core::rect frameRect( AbsoluteRect ); - - if( DrawBack ) - { - driver->draw2DRectangle( skin->getColor( EGDC_3D_HIGH_LIGHT ), frameRect, clipRect ); - } - - // draw the border - - frameRect.LowerRightCorner.Y = frameRect.UpperLeftCorner.Y + 1; - driver->draw2DRectangle( skin->getColor( EGDC_3D_SHADOW ), frameRect, clipRect ); - - frameRect.LowerRightCorner.Y = AbsoluteRect.LowerRightCorner.Y; - frameRect.LowerRightCorner.X = frameRect.UpperLeftCorner.X + 1; - driver->draw2DRectangle( skin->getColor( EGDC_3D_SHADOW ), frameRect, clipRect ); - - frameRect = AbsoluteRect; - frameRect.UpperLeftCorner.X = frameRect.LowerRightCorner.X - 1; - driver->draw2DRectangle( skin->getColor( EGDC_3D_HIGH_LIGHT ), frameRect, clipRect ); - - frameRect = AbsoluteRect; - frameRect.UpperLeftCorner.Y = AbsoluteRect.LowerRightCorner.Y - 1; - frameRect.LowerRightCorner.Y = AbsoluteRect.LowerRightCorner.Y; - driver->draw2DRectangle( skin->getColor( EGDC_3D_HIGH_LIGHT ), frameRect, clipRect ); - - // draw items - - core::rect clientClip( AbsoluteRect ); - clientClip.UpperLeftCorner.X += 1; - clientClip.UpperLeftCorner.Y += 1; - clientClip.LowerRightCorner.X = AbsoluteRect.LowerRightCorner.X; - clientClip.LowerRightCorner.Y -= 1; - - if ( ScrollBarV ) - clientClip.LowerRightCorner.X -= ScrollBarSize; - if ( ScrollBarH ) - clientClip.LowerRightCorner.Y -= ScrollBarSize; - - if( clipRect ) - { - clientClip.clipAgainst( *clipRect ); - } - - frameRect = AbsoluteRect; - frameRect.LowerRightCorner.X = AbsoluteRect.LowerRightCorner.X - ScrollBarSize; - frameRect.LowerRightCorner.Y = AbsoluteRect.UpperLeftCorner.Y + ItemHeight; - - if ( ScrollBarV ) - { - frameRect.UpperLeftCorner.Y -= ScrollBarV->getPos(); - frameRect.LowerRightCorner.Y -= ScrollBarV->getPos(); - } - - IGUITreeViewNode* node = Root->getFirstChild(); - while( node ) - { - frameRect.UpperLeftCorner.X = AbsoluteRect.UpperLeftCorner.X + 1 + node->getLevel() * IndentWidth; - if ( ScrollBarH ) - { - frameRect.UpperLeftCorner.X -= ScrollBarH->getPos(); - } - - if( frameRect.LowerRightCorner.Y >= AbsoluteRect.UpperLeftCorner.Y - && frameRect.UpperLeftCorner.Y <= AbsoluteRect.LowerRightCorner.Y ) - { - if( node == Selected ) - { - // selection box beginning from far left - core::rect copyFrameRect( frameRect ); // local copy to keep original untouched - copyFrameRect.UpperLeftCorner.X = AbsoluteRect.UpperLeftCorner.X + 1; - driver->draw2DRectangle( skin->getColor( EGDC_HIGH_LIGHT ), copyFrameRect, &clientClip ); - } - - if( node->hasChildren() ) - { - core::rect rc; - core::rect expanderRect; - - expanderRect.UpperLeftCorner.X = frameRect.UpperLeftCorner.X - IndentWidth + 2; - expanderRect.UpperLeftCorner.Y = frameRect.UpperLeftCorner.Y + ( ( frameRect.getHeight() - ( IndentWidth - 4 ) ) >> 1 ); - expanderRect.LowerRightCorner.X = expanderRect.UpperLeftCorner.X + IndentWidth - 4; - expanderRect.LowerRightCorner.Y = expanderRect.UpperLeftCorner.Y + IndentWidth - 4; - - // box upper line - rc.UpperLeftCorner.X = expanderRect.UpperLeftCorner.X; - rc.UpperLeftCorner.Y = expanderRect.UpperLeftCorner.Y; - rc.LowerRightCorner.X = expanderRect.LowerRightCorner.X; - rc.LowerRightCorner.Y = rc.UpperLeftCorner.Y + 1; - driver->draw2DRectangle( skin->getColor( EGDC_3D_DARK_SHADOW ), rc, clipRect ); - - // box left line - rc.UpperLeftCorner.X = expanderRect.UpperLeftCorner.X; - rc.UpperLeftCorner.Y = expanderRect.UpperLeftCorner.Y; - rc.LowerRightCorner.X = rc.UpperLeftCorner.X + 1; - rc.LowerRightCorner.Y = expanderRect.LowerRightCorner.Y; - driver->draw2DRectangle( skin->getColor( EGDC_3D_DARK_SHADOW ), rc, clipRect ); - - // box right line - rc.UpperLeftCorner.X = expanderRect.LowerRightCorner.X - 1; - rc.UpperLeftCorner.Y = expanderRect.UpperLeftCorner.Y; - rc.LowerRightCorner.X = rc.UpperLeftCorner.X + 1; - rc.LowerRightCorner.Y = expanderRect.LowerRightCorner.Y; - driver->draw2DRectangle( skin->getColor( EGDC_3D_DARK_SHADOW ), rc, clipRect ); - - // box bottom line - rc.UpperLeftCorner.X = expanderRect.UpperLeftCorner.X; - rc.UpperLeftCorner.Y = expanderRect.LowerRightCorner.Y - 1; - rc.LowerRightCorner.X = expanderRect.LowerRightCorner.X; - rc.LowerRightCorner.Y = rc.UpperLeftCorner.Y + 1; - driver->draw2DRectangle( skin->getColor( EGDC_3D_DARK_SHADOW ), rc, clipRect ); - - // horizontal '-' line - rc.UpperLeftCorner.X = expanderRect.UpperLeftCorner.X + 2; - rc.UpperLeftCorner.Y = expanderRect.UpperLeftCorner.Y + ( expanderRect.getHeight() >> 1 ); - rc.LowerRightCorner.X = rc.UpperLeftCorner.X + expanderRect.getWidth() - 4; - rc.LowerRightCorner.Y = rc.UpperLeftCorner.Y + 1; - driver->draw2DRectangle( skin->getColor( EGDC_BUTTON_TEXT ), rc, clipRect ); - - if( !node->getExpanded() ) - { - // vertical '+' line - rc.UpperLeftCorner.X = expanderRect.UpperLeftCorner.X + ( expanderRect.getWidth() >> 1 ); - rc.UpperLeftCorner.Y = expanderRect.UpperLeftCorner.Y + 2; - rc.LowerRightCorner.X = rc.UpperLeftCorner.X + 1; - rc.LowerRightCorner.Y = rc.UpperLeftCorner.Y + expanderRect.getHeight() - 4; - driver->draw2DRectangle( skin->getColor( EGDC_BUTTON_TEXT ), rc, clipRect ); - } - } - - core::rect textRect = frameRect; - - if( Font ) - { - EGUI_DEFAULT_COLOR textCol = EGDC_GRAY_TEXT; - if ( isEnabled() ) - textCol = ( node == Selected ) ? EGDC_HIGH_LIGHT_TEXT : EGDC_BUTTON_TEXT; - - s32 iconWidth = 0; - for( s32 n = 0; n < 2; ++n ) - { - s32 index = node->getImageIndex(); - if( ( ImageList && index >= 0 ) - && ( ( ImageLeftOfIcon && n == 0 ) - || ( !ImageLeftOfIcon && n == 1 ) ) ) - { - index = node->getSelectedImageIndex(); - if( node != Selected || index < 0 ) - { - index = node->getImageIndex(); - } - ImageList->draw( - index, - core::position2d( - textRect.UpperLeftCorner.X, - textRect.UpperLeftCorner.Y + ( ( textRect.getHeight() - ImageList->getImageSize().Height ) >> 1 ) ), - &clientClip ); - iconWidth += ImageList->getImageSize().Width + 3; - textRect.UpperLeftCorner.X += ImageList->getImageSize().Width + 3; - } - else if( ( IconFont && static_cast( node )->Icon.size() ) - && ( ( ImageLeftOfIcon && n == 1 ) - || ( !ImageLeftOfIcon && n == 0 ) ) ) - { - IconFont->draw( node->getIcon(), textRect, skin->getColor(textCol), false, true, &clientClip ); - iconWidth += IconFont->getDimension( node->getIcon() ).Width + 3; - textRect.UpperLeftCorner.X += IconFont->getDimension( node->getIcon() ).Width + 3; - } - } - - Font->draw( node->getText(), textRect, skin->getColor(textCol), false, true, &clientClip ); - - textRect.UpperLeftCorner.X -= iconWidth; - } - - // draw the lines if neccessary - if( LinesVisible ) - { - core::rect rc; - - // horizontal line - rc.UpperLeftCorner.X = frameRect.UpperLeftCorner.X - IndentWidth - ( IndentWidth >> 1 ) - 1; - rc.UpperLeftCorner.Y = frameRect.UpperLeftCorner.Y + ( ( frameRect.getHeight() ) >> 1 ); - if( node->hasChildren() ) - { - rc.LowerRightCorner.X = frameRect.UpperLeftCorner.X - IndentWidth; - } - else - { - rc.LowerRightCorner.X = frameRect.UpperLeftCorner.X - 2; - } - rc.LowerRightCorner.Y = rc.UpperLeftCorner.Y + 1; - driver->draw2DRectangle( skin->getColor( EGDC_3D_SHADOW ), rc, clipRect ); - - if( node->getParent() != Root ) - { - // vertical line - if( node == node->getParent()->getFirstChild() ) - { - rc.UpperLeftCorner.Y = frameRect.UpperLeftCorner.Y - ( ( frameRect.getHeight() - IndentWidth ) >> 1 ); - } - else - { - rc.UpperLeftCorner.Y = frameRect.UpperLeftCorner.Y - ( frameRect.getHeight() >> 1 ); - } - rc.LowerRightCorner.X = rc.UpperLeftCorner.X + 1; - driver->draw2DRectangle( skin->getColor( EGDC_3D_SHADOW ), rc, clipRect ); - - // the vertical lines of all parents - IGUITreeViewNode* nodeTmp = node->getParent(); - rc.UpperLeftCorner.Y = frameRect.UpperLeftCorner.Y - ( frameRect.getHeight() >> 1 ); - for( s32 n = 0; n < node->getLevel() - 2; ++n ) - { - rc.UpperLeftCorner.X -= IndentWidth; - rc.LowerRightCorner.X -= IndentWidth; - if( nodeTmp != nodeTmp->getParent()->getLastChild() ) - { - driver->draw2DRectangle( skin->getColor( EGDC_3D_SHADOW ), rc, clipRect ); - } - nodeTmp = nodeTmp->getParent(); - } - } - } - } - - frameRect.UpperLeftCorner.Y += ItemHeight; - frameRect.LowerRightCorner.Y += ItemHeight; - - node = node->getNextVisible(); - } - - IGUIElement::draw(); -} - -//! Sets the font which should be used as icon font. This font is set to the Irrlicht engine -//! built-in-font by default. Icons can be displayed in front of every list item. -//! An icon is a string, displayed with the icon font. When using the build-in-font of the -//! Irrlicht engine as icon font, the icon strings defined in GUIIcons.h can be used. -void CGUITreeView::setIconFont( IGUIFont* font ) -{ - s32 height; - - if ( font ) - font->grab(); - if ( IconFont ) - { - IconFont->drop(); - } - - IconFont = font; - if( IconFont ) - { - height = IconFont->getDimension( L" " ).Height; - if( height > ItemHeight ) - { - ItemHeight = height; - } - } -} - -//! Sets the image list which should be used for the image and selected image of every node. -//! The default is 0 (no images). -void CGUITreeView::setImageList( IGUIImageList* imageList ) -{ - if (imageList ) - imageList->grab(); - if( ImageList ) - { - ImageList->drop(); - } - - ImageList = imageList; - if( ImageList ) - { - if( ImageList->getImageSize().Height + 1 > ItemHeight ) - { - ItemHeight = ImageList->getImageSize().Height + 1; - } - } -} - -//! Access the vertical scrollbar -IGUIScrollBar* CGUITreeView::getVerticalScrollBar() const -{ - return ScrollBarV; -} - -//! Access the horizontal scrollbar -IGUIScrollBar* CGUITreeView::getHorizontalScrollBar() const -{ - return ScrollBarH; -} - -} // end namespace gui -} // end namespace irr - - -#endif // _IRR_COMPILE_WITH_GUI_ diff --git a/source/Irrlicht/CGUITreeView.h b/source/Irrlicht/CGUITreeView.h deleted file mode 100644 index 1c34eb56..00000000 --- a/source/Irrlicht/CGUITreeView.h +++ /dev/null @@ -1,357 +0,0 @@ -// This file is part of the "Irrlicht Engine". -// written by Reinhard Ostermeier, reinhard@nospam.r-ostermeier.de - -#ifndef __C_GUI_TREE_VIEW_H_INCLUDED__ -#define __C_GUI_TREE_VIEW_H_INCLUDED__ - -#include "IGUITreeView.h" - - -namespace irr -{ -namespace gui -{ - // forward declarations - class IGUIFont; - class IGUIScrollBar; - class CGUITreeView; - - //! Node for gui tree view - class CGUITreeViewNode : public IGUITreeViewNode - { - friend class CGUITreeView; - - public: - //! constructor - CGUITreeViewNode( CGUITreeView* owner, CGUITreeViewNode* parent ); - - //! destructor - ~CGUITreeViewNode(); - - //! returns the owner (tree view) of this node - virtual IGUITreeView* getOwner() const _IRR_OVERRIDE_; - - //! Returns the parent node of this node. - virtual IGUITreeViewNode* getParent() const _IRR_OVERRIDE_; - - //! returns the text of the node - virtual const wchar_t* getText() const _IRR_OVERRIDE_ - { return Text.c_str(); } - - //! sets the text of the node - virtual void setText( const wchar_t* text ) _IRR_OVERRIDE_; - - //! returns the icon text of the node - virtual const wchar_t* getIcon() const _IRR_OVERRIDE_ - { return Icon.c_str(); } - - //! sets the icon text of the node - virtual void setIcon( const wchar_t* icon ) _IRR_OVERRIDE_; - - //! returns the image index of the node - virtual u32 getImageIndex() const _IRR_OVERRIDE_ - { return ImageIndex; } - - //! sets the image index of the node - virtual void setImageIndex( u32 imageIndex ) _IRR_OVERRIDE_ - { ImageIndex = imageIndex; } - - //! returns the image index of the node - virtual u32 getSelectedImageIndex() const _IRR_OVERRIDE_ - { return SelectedImageIndex; } - - //! sets the image index of the node - virtual void setSelectedImageIndex( u32 imageIndex ) _IRR_OVERRIDE_ - { SelectedImageIndex = imageIndex; } - - //! returns the user data (void*) of this node - virtual void* getData() const _IRR_OVERRIDE_ - { return Data; } - - //! sets the user data (void*) of this node - virtual void setData( void* data ) _IRR_OVERRIDE_ - { Data = data; } - - //! returns the user data2 (IReferenceCounted) of this node - virtual IReferenceCounted* getData2() const _IRR_OVERRIDE_ - { return Data2; } - - //! sets the user data2 (IReferenceCounted) of this node - virtual void setData2( IReferenceCounted* data ) _IRR_OVERRIDE_ - { - if( Data2 ) - { - Data2->drop(); - } - Data2 = data; - if( Data2 ) - { - Data2->grab(); - } - } - - //! returns the child item count - virtual u32 getChildCount() const _IRR_OVERRIDE_ - { return Children.size(); } - - //! removes all children (recursive) from this node - virtual void clearChildren() _IRR_OVERRIDE_; - - //! returns true if this node has child nodes - virtual bool hasChildren() const _IRR_OVERRIDE_ - { return !Children.empty(); } - - //! Adds a new node behind the last child node. - //! \param text text of the new node - //! \param icon icon text of the new node - //! \param imageIndex index of the image for the new node (-1 = none) - //! \param selectedImageIndex index of the selected image for the new node (-1 = same as imageIndex) - //! \param data user data (void*) of the new node - //! \param data2 user data2 (IReferenceCounted*) of the new node - //! \return - //! returns the new node - virtual IGUITreeViewNode* addChildBack( - const wchar_t* text, - const wchar_t* icon = 0, - s32 imageIndex = -1, - s32 selectedImageIndex = -1, - void* data = 0, - IReferenceCounted* data2 = 0) _IRR_OVERRIDE_; - - //! Adds a new node before the first child node. - //! \param text text of the new node - //! \param icon icon text of the new node - //! \param imageIndex index of the image for the new node (-1 = none) - //! \param selectedImageIndex index of the selected image for the new node (-1 = same as imageIndex) - //! \param data user data (void*) of the new node - //! \param data2 user data2 (IReferenceCounted*) of the new node - //! \return - //! returns the new node - virtual IGUITreeViewNode* addChildFront( - const wchar_t* text, - const wchar_t* icon = 0, - s32 imageIndex = -1, - s32 selectedImageIndex = -1, - void* data = 0, - IReferenceCounted* data2 = 0 ) _IRR_OVERRIDE_; - - //! Adds a new node behind the other node. - //! The other node has also te be a child node from this node. - //! \param text text of the new node - //! \param icon icon text of the new node - //! \param imageIndex index of the image for the new node (-1 = none) - //! \param selectedImageIndex index of the selected image for the new node (-1 = same as imageIndex) - //! \param data user data (void*) of the new node - //! \param data2 user data2 (IReferenceCounted*) of the new node - //! \return - //! returns the new node or 0 if other is no child node from this - virtual IGUITreeViewNode* insertChildAfter( - IGUITreeViewNode* other, - const wchar_t* text, - const wchar_t* icon = 0, - s32 imageIndex = -1, - s32 selectedImageIndex = -1, - void* data = 0, - IReferenceCounted* data2 = 0 ) _IRR_OVERRIDE_; - - //! Adds a new node before the other node. - //! The other node has also te be a child node from this node. - //! \param text text of the new node - //! \param icon icon text of the new node - //! \param imageIndex index of the image for the new node (-1 = none) - //! \param selectedImageIndex index of the selected image for the new node (-1 = same as imageIndex) - //! \param data user data (void*) of the new node - //! \param data2 user data2 (IReferenceCounted*) of the new node - //! \return - //! returns the new node or 0 if other is no child node from this - virtual IGUITreeViewNode* insertChildBefore( - IGUITreeViewNode* other, - const wchar_t* text, - const wchar_t* icon = 0, - s32 imageIndex = -1, - s32 selectedImageIndex = -1, - void* data = 0, - IReferenceCounted* data2 = 0 ) _IRR_OVERRIDE_; - - //! Return the first child note from this node. - virtual IGUITreeViewNode* getFirstChild() const _IRR_OVERRIDE_; - - //! Return the last child note from this node. - virtual IGUITreeViewNode* getLastChild() const _IRR_OVERRIDE_; - - //! Returns the preverse sibling node from this node. - virtual IGUITreeViewNode* getPrevSibling() const _IRR_OVERRIDE_; - - //! Returns the next sibling node from this node. - virtual IGUITreeViewNode* getNextSibling() const _IRR_OVERRIDE_; - - //! Returns the next visible (expanded, may be out of scrolling) node from this node. - virtual IGUITreeViewNode* getNextVisible() const _IRR_OVERRIDE_; - - //! Deletes a child node. - virtual bool deleteChild( IGUITreeViewNode* child ) _IRR_OVERRIDE_; - - //! Moves a child node one position up. - virtual bool moveChildUp( IGUITreeViewNode* child ) _IRR_OVERRIDE_; - - //! Moves a child node one position down. - virtual bool moveChildDown( IGUITreeViewNode* child ) _IRR_OVERRIDE_; - - //! Returns true if the node is expanded (children are visible). - virtual bool getExpanded() const _IRR_OVERRIDE_ - { return Expanded; } - - //! Sets if the node is expanded. - virtual void setExpanded( bool expanded ) _IRR_OVERRIDE_; - - //! Returns true if the node is currently selected. - virtual bool getSelected() const _IRR_OVERRIDE_; - - //! Sets this node as selected. - virtual void setSelected( bool selected ) _IRR_OVERRIDE_; - - //! Returns true if this node is the root node. - virtual bool isRoot() const _IRR_OVERRIDE_; - - //! Returns the level of this node. - virtual s32 getLevel() const _IRR_OVERRIDE_; - - //! Returns true if this node is visible (all parents are expanded). - virtual bool isVisible() const _IRR_OVERRIDE_; - - private: - - CGUITreeView* Owner; - CGUITreeViewNode* Parent; - core::stringw Text; - core::stringw Icon; - s32 ImageIndex; - s32 SelectedImageIndex; - void* Data; - IReferenceCounted* Data2; - bool Expanded; - std::list Children; - // Position of this node in Parent->Children. - // Only valid when Parent != NULL - std::list::iterator ParentPos; - }; - - - //! Default tree view GUI element. - class CGUITreeView : public IGUITreeView - { - friend class CGUITreeViewNode; - - public: - //! constructor - CGUITreeView( IGUIEnvironment* environment, IGUIElement* parent, - s32 id, core::rect rectangle, bool clip = true, - bool drawBack = false, bool scrollBarVertical = true, bool scrollBarHorizontal = true ); - - //! destructor - virtual ~CGUITreeView(); - - //! returns the root node (not visible) from the tree. - virtual IGUITreeViewNode* getRoot() const _IRR_OVERRIDE_ - { return Root; } - - //! returns the selected node of the tree or 0 if none is selected - virtual IGUITreeViewNode* getSelected() const _IRR_OVERRIDE_ - { return Selected; } - - //! returns true if the tree lines are visible - virtual bool getLinesVisible() const _IRR_OVERRIDE_ - { return LinesVisible; } - - //! sets if the tree lines are visible - virtual void setLinesVisible( bool visible ) _IRR_OVERRIDE_ - { LinesVisible = visible; } - - //! called if an event happened. - virtual bool OnEvent( const SEvent &event ) _IRR_OVERRIDE_; - - //! draws the element and its children - virtual void draw() _IRR_OVERRIDE_; - - //! Sets the font which should be used as icon font. This font is set to the Irrlicht engine - //! built-in-font by default. Icons can be displayed in front of every list item. - //! An icon is a string, displayed with the icon font. When using the build-in-font of the - //! Irrlicht engine as icon font, the icon strings defined in GUIIcons.h can be used. - virtual void setIconFont( IGUIFont* font ) _IRR_OVERRIDE_; - - //! Sets a skin independent font. - /** \param font: New font to set or 0 to use the skin-font. */ - virtual void setOverrideFont(IGUIFont* font=0) _IRR_OVERRIDE_; - - //! Gets the override font (if any) - /** \return The override font (may be 0) */ - virtual IGUIFont* getOverrideFont(void) const _IRR_OVERRIDE_; - - //! Get the font which is used for drawing - /** This is the override font when one is set and the - font of the skin otherwise. */ - virtual IGUIFont* getActiveFont() const _IRR_OVERRIDE_; - - //! Sets the image list which should be used for the image and selected image of every node. - //! The default is 0 (no images). - virtual void setImageList( IGUIImageList* imageList ) _IRR_OVERRIDE_; - - //! Returns the image list which is used for the nodes. - virtual IGUIImageList* getImageList() const _IRR_OVERRIDE_ - { return ImageList; } - - //! Sets if the image is left of the icon. Default is true. - virtual void setImageLeftOfIcon( bool bLeftOf ) _IRR_OVERRIDE_ - { ImageLeftOfIcon = bLeftOf; } - - //! Returns if the Image is left of the icon. Default is true. - virtual bool getImageLeftOfIcon() const _IRR_OVERRIDE_ - { return ImageLeftOfIcon; } - - //! Returns the node which is associated to the last event. - virtual IGUITreeViewNode* getLastEventNode() const _IRR_OVERRIDE_ - { return LastEventNode; } - - //! Access the vertical scrollbar - virtual IGUIScrollBar* getVerticalScrollBar() const _IRR_OVERRIDE_; - - //! Access the horizontal scrollbar - virtual IGUIScrollBar* getHorizontalScrollBar() const _IRR_OVERRIDE_; - - private: - //! calculates the heigth of an node and of all visible nodes. - void recalculateItemHeight(); - - //! Resize scrollbars when their size in the skin has changed - void updateScrollBarSize(s32 size); - - //! executes an mouse action (like selectNew of CGUIListBox) - void mouseAction( s32 xpos, s32 ypos, bool onlyHover = false ); - - CGUITreeViewNode* Root; - IGUITreeViewNode* Selected; - s32 ItemHeight; - s32 IndentWidth; - s32 TotalItemHeight; - s32 TotalItemWidth; - s32 ScrollBarSize; - IGUIFont* Font; - gui::IGUIFont* OverrideFont; - IGUIFont* IconFont; - IGUIScrollBar* ScrollBarH; - IGUIScrollBar* ScrollBarV; - IGUIImageList* ImageList; - IGUITreeViewNode* LastEventNode; - bool LinesVisible; - bool Selecting; - bool Clip; - bool DrawBack; - bool ImageLeftOfIcon; - }; - - -} // end namespace gui -} // end namespace irr - -#endif - diff --git a/source/Irrlicht/CGUIWindow.cpp b/source/Irrlicht/CGUIWindow.cpp deleted file mode 100644 index 1af2d153..00000000 --- a/source/Irrlicht/CGUIWindow.cpp +++ /dev/null @@ -1,363 +0,0 @@ -// 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 - -#include "CGUIWindow.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUISkin.h" -#include "IGUIEnvironment.h" -#include "IVideoDriver.h" -#include "IGUIButton.h" -#include "IGUIFont.h" -#include "IGUIFontBitmap.h" - -namespace irr -{ -namespace gui -{ - -//! constructor -CGUIWindow::CGUIWindow(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle) -: IGUIWindow(environment, parent, id, rectangle), Dragging(false), IsDraggable(true), DrawBackground(true), DrawTitlebar(true), IsActive(false) -{ - #ifdef _DEBUG - setDebugName("CGUIWindow"); - #endif - - IGUISkin* skin = 0; - if (environment) - skin = environment->getSkin(); - - CurrentIconColor = video::SColor(255,255,255,255); - - s32 buttonw = 15; - if (skin) - { - buttonw = skin->getSize(EGDS_WINDOW_BUTTON_WIDTH); - } - s32 posx = RelativeRect.getWidth() - buttonw - 4; - - CloseButton = Environment->addButton(core::rect(posx, 3, posx + buttonw, 3 + buttonw), this, -1, - L"", skin ? skin->getDefaultText(EGDT_WINDOW_CLOSE) : L"Close" ); - CloseButton->setSubElement(true); - CloseButton->setTabStop(false); - CloseButton->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT); - posx -= buttonw + 2; - - RestoreButton = Environment->addButton(core::rect(posx, 3, posx + buttonw, 3 + buttonw), this, -1, - L"", skin ? skin->getDefaultText(EGDT_WINDOW_RESTORE) : L"Restore" ); - RestoreButton->setVisible(false); - RestoreButton->setSubElement(true); - RestoreButton->setTabStop(false); - RestoreButton->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT); - posx -= buttonw + 2; - - MinButton = Environment->addButton(core::rect(posx, 3, posx + buttonw, 3 + buttonw), this, -1, - L"", skin ? skin->getDefaultText(EGDT_WINDOW_MINIMIZE) : L"Minimize" ); - MinButton->setVisible(false); - MinButton->setSubElement(true); - MinButton->setTabStop(false); - MinButton->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT); - - MinButton->grab(); - RestoreButton->grab(); - CloseButton->grab(); - - // this element is a tab group - setTabGroup(true); - setTabStop(true); - setTabOrder(-1); - - refreshSprites(); - updateClientRect(); -} - - -//! destructor -CGUIWindow::~CGUIWindow() -{ - if (MinButton) - MinButton->drop(); - - if (RestoreButton) - RestoreButton->drop(); - - if (CloseButton) - CloseButton->drop(); -} - -void CGUIWindow::refreshSprites() -{ - if (!Environment) - return; - IGUISkin* skin = Environment->getSkin(); - if ( !skin ) - return; - - IGUISpriteBank* sprites = skin->getSpriteBank(); - if ( !sprites ) - return; - - CurrentIconColor = skin->getColor(isEnabled() ? EGDC_WINDOW_SYMBOL : EGDC_GRAY_WINDOW_SYMBOL); - - if (sprites) - { - CloseButton->setSpriteBank(sprites); - CloseButton->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_WINDOW_CLOSE), CurrentIconColor); - CloseButton->setSprite(EGBS_BUTTON_DOWN, skin->getIcon(EGDI_WINDOW_CLOSE), CurrentIconColor); - - RestoreButton->setSpriteBank(sprites); - RestoreButton->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_WINDOW_RESTORE), CurrentIconColor); - RestoreButton->setSprite(EGBS_BUTTON_DOWN, skin->getIcon(EGDI_WINDOW_RESTORE), CurrentIconColor); - - MinButton->setSpriteBank(sprites); - MinButton->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_WINDOW_MINIMIZE), CurrentIconColor); - MinButton->setSprite(EGBS_BUTTON_DOWN, skin->getIcon(EGDI_WINDOW_MINIMIZE), CurrentIconColor); - } -} - -//! called if an event happened. -bool CGUIWindow::OnEvent(const SEvent& event) -{ - if (isEnabled()) - { - - switch(event.EventType) - { - case EET_GUI_EVENT: - if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST) - { - Dragging = false; - IsActive = false; - } - else - if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUSED) - { - if (Parent && ((event.GUIEvent.Caller == this) || isMyChild(event.GUIEvent.Caller))) - { - Parent->bringToFront(this); - IsActive = true; - } - else - { - IsActive = false; - } - } - else - if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED) - { - if (event.GUIEvent.Caller == CloseButton) - { - if (Parent) - { - // send close event to parent - SEvent e; - e.EventType = EET_GUI_EVENT; - e.GUIEvent.Caller = this; - e.GUIEvent.Element = 0; - e.GUIEvent.EventType = EGET_ELEMENT_CLOSED; - - // if the event was not absorbed - if (!Parent->OnEvent(e)) - remove(); - - return true; - - } - else - { - remove(); - return true; - } - } - } - break; - case EET_MOUSE_INPUT_EVENT: - switch(event.MouseInput.Event) - { - case EMIE_LMOUSE_PRESSED_DOWN: - DragStart.X = event.MouseInput.X; - DragStart.Y = event.MouseInput.Y; - Dragging = IsDraggable; - if (Parent) - Parent->bringToFront(this); - return true; - case EMIE_LMOUSE_LEFT_UP: - Dragging = false; - return true; - case EMIE_MOUSE_MOVED: - if (!event.MouseInput.isLeftPressed()) - Dragging = false; - - if (Dragging) - { - // gui window should not be dragged outside its parent - if (Parent && - (event.MouseInput.X < Parent->getAbsolutePosition().UpperLeftCorner.X +1 || - event.MouseInput.Y < Parent->getAbsolutePosition().UpperLeftCorner.Y +1 || - event.MouseInput.X > Parent->getAbsolutePosition().LowerRightCorner.X -1 || - event.MouseInput.Y > Parent->getAbsolutePosition().LowerRightCorner.Y -1)) - return true; - - move(core::position2d(event.MouseInput.X - DragStart.X, event.MouseInput.Y - DragStart.Y)); - DragStart.X = event.MouseInput.X; - DragStart.Y = event.MouseInput.Y; - return true; - } - break; - default: - break; - } - default: - break; - } - } - - return IGUIElement::OnEvent(event); -} - - -//! Updates the absolute position. -void CGUIWindow::updateAbsolutePosition() -{ - IGUIElement::updateAbsolutePosition(); -} - - -//! draws the element and its children -void CGUIWindow::draw() -{ - if (IsVisible) - { - IGUISkin* skin = Environment->getSkin(); - - - // update each time because the skin is allowed to change this always. - updateClientRect(); - - if ( CurrentIconColor != skin->getColor(isEnabled() ? EGDC_WINDOW_SYMBOL : EGDC_GRAY_WINDOW_SYMBOL) ) - refreshSprites(); - - core::rect rect = AbsoluteRect; - - // draw body fast - if (DrawBackground) - { - rect = skin->draw3DWindowBackground(this, DrawTitlebar, - skin->getColor(IsActive ? EGDC_ACTIVE_BORDER : EGDC_INACTIVE_BORDER), - AbsoluteRect, &AbsoluteClippingRect); - - if (DrawTitlebar && Text.size()) - { - rect.UpperLeftCorner.X += skin->getSize(EGDS_TITLEBARTEXT_DISTANCE_X); - rect.UpperLeftCorner.Y += skin->getSize(EGDS_TITLEBARTEXT_DISTANCE_Y); - rect.LowerRightCorner.X -= skin->getSize(EGDS_WINDOW_BUTTON_WIDTH) + 5; - - IGUIFont* font = skin->getFont(EGDF_WINDOW); - if (font) - { - font->draw(Text.c_str(), rect, - skin->getColor(IsActive ? EGDC_ACTIVE_CAPTION:EGDC_INACTIVE_CAPTION), - false, true, &AbsoluteClippingRect); - } - } - } - } - - IGUIElement::draw(); -} - - -//! Returns pointer to the close button -IGUIButton* CGUIWindow::getCloseButton() const -{ - return CloseButton; -} - - -//! Returns pointer to the minimize button -IGUIButton* CGUIWindow::getMinimizeButton() const -{ - return MinButton; -} - - -//! Returns pointer to the maximize button -IGUIButton* CGUIWindow::getMaximizeButton() const -{ - return RestoreButton; -} - - -//! Returns true if the window is draggable, false if not -bool CGUIWindow::isDraggable() const -{ - return IsDraggable; -} - - -//! Sets whether the window is draggable -void CGUIWindow::setDraggable(bool draggable) -{ - IsDraggable = draggable; - - if (Dragging && !IsDraggable) - Dragging = false; -} - - -//! Set if the window background will be drawn -void CGUIWindow::setDrawBackground(bool draw) -{ - DrawBackground = draw; -} - - -//! Get if the window background will be drawn -bool CGUIWindow::getDrawBackground() const -{ - return DrawBackground; -} - - -//! Set if the window titlebar will be drawn -void CGUIWindow::setDrawTitlebar(bool draw) -{ - DrawTitlebar = draw; -} - - -//! Get if the window titlebar will be drawn -bool CGUIWindow::getDrawTitlebar() const -{ - return DrawTitlebar; -} - - -void CGUIWindow::updateClientRect() -{ - if (! DrawBackground ) - { - ClientRect = core::rect(0,0, AbsoluteRect.getWidth(), AbsoluteRect.getHeight()); - return; - } - IGUISkin* skin = Environment->getSkin(); - skin->draw3DWindowBackground(this, DrawTitlebar, - skin->getColor(IsActive ? EGDC_ACTIVE_BORDER : EGDC_INACTIVE_BORDER), - AbsoluteRect, &AbsoluteClippingRect, &ClientRect); - ClientRect -= AbsoluteRect.UpperLeftCorner; -} - - -//! Returns the rectangle of the drawable area (without border, without titlebar and without scrollbars) -core::rect CGUIWindow::getClientRect() const -{ - return ClientRect; -} - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - diff --git a/source/Irrlicht/CGUIWindow.h b/source/Irrlicht/CGUIWindow.h deleted file mode 100644 index 3024295f..00000000 --- a/source/Irrlicht/CGUIWindow.h +++ /dev/null @@ -1,93 +0,0 @@ -// 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 __C_GUI_WINDOW_H_INCLUDED__ -#define __C_GUI_WINDOW_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_GUI_ - -#include "IGUIWindow.h" - -namespace irr -{ -namespace gui -{ - class IGUIButton; - - class CGUIWindow : public IGUIWindow - { - public: - - //! constructor - CGUIWindow(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect rectangle); - - //! destructor - virtual ~CGUIWindow(); - - //! called if an event happened. - virtual bool OnEvent(const SEvent& event) _IRR_OVERRIDE_; - - //! update absolute position - virtual void updateAbsolutePosition() _IRR_OVERRIDE_; - - //! draws the element and its children - virtual void draw() _IRR_OVERRIDE_; - - //! Returns pointer to the close button - virtual IGUIButton* getCloseButton() const _IRR_OVERRIDE_; - - //! Returns pointer to the minimize button - virtual IGUIButton* getMinimizeButton() const _IRR_OVERRIDE_; - - //! Returns pointer to the maximize button - virtual IGUIButton* getMaximizeButton() const _IRR_OVERRIDE_; - - //! Returns true if the window is draggable, false if not - virtual bool isDraggable() const _IRR_OVERRIDE_; - - //! Sets whether the window is draggable - virtual void setDraggable(bool draggable) _IRR_OVERRIDE_; - - //! Set if the window background will be drawn - virtual void setDrawBackground(bool draw) _IRR_OVERRIDE_; - - //! Get if the window background will be drawn - virtual bool getDrawBackground() const _IRR_OVERRIDE_; - - //! Set if the window titlebar will be drawn - //! Note: If the background is not drawn, then the titlebar is automatically also not drawn - virtual void setDrawTitlebar(bool draw) _IRR_OVERRIDE_; - - //! Get if the window titlebar will be drawn - virtual bool getDrawTitlebar() const _IRR_OVERRIDE_; - - //! Returns the rectangle of the drawable area (without border and without titlebar) - virtual core::rect getClientRect() const _IRR_OVERRIDE_; - - protected: - - void updateClientRect(); - void refreshSprites(); - - IGUIButton* CloseButton; - IGUIButton* MinButton; - IGUIButton* RestoreButton; - core::rect ClientRect; - video::SColor CurrentIconColor; - - core::position2d DragStart; - bool Dragging, IsDraggable; - bool DrawBackground; - bool DrawTitlebar; - bool IsActive; - }; - -} // end namespace gui -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_GUI_ - -#endif - diff --git a/source/Irrlicht/CIrrDeviceStub.cpp b/source/Irrlicht/CIrrDeviceStub.cpp index 800d3720..3bad68ae 100644 --- a/source/Irrlicht/CIrrDeviceStub.cpp +++ b/source/Irrlicht/CIrrDeviceStub.cpp @@ -13,7 +13,6 @@ #include "CTimer.h" #include "CLogger.h" #include "irrString.h" -#include "IRandomizer.h" namespace irr { @@ -21,8 +20,8 @@ namespace irr CIrrDeviceStub::CIrrDeviceStub(const SIrrlichtCreationParameters& params) : IrrlichtDevice(), VideoDriver(0), GUIEnvironment(0), SceneManager(0), Timer(0), CursorControl(0), UserReceiver(params.EventReceiver), - Logger(0), Operator(0), Randomizer(0), FileSystem(0), - InputReceivingSceneManager(0), VideoModeList(0), ContextManager(0), + Logger(0), Operator(0), FileSystem(0), + InputReceivingSceneManager(0), ContextManager(0), CreationParams(params), Close(false) { Timer = new CTimer(params.UsePerformanceTimer); @@ -40,10 +39,8 @@ CIrrDeviceStub::CIrrDeviceStub(const SIrrlichtCreationParameters& params) Logger->setLogLevel(CreationParams.LoggingLevel); os::Printer::Logger = Logger; - Randomizer = createDefaultRandomizer(); FileSystem = io::createFileSystem(); - VideoModeList = new video::CVideoModeList(); core::stringc s = "Irrlicht Engine version "; s.append(getVersion()); @@ -55,8 +52,6 @@ CIrrDeviceStub::CIrrDeviceStub(const SIrrlichtCreationParameters& params) CIrrDeviceStub::~CIrrDeviceStub() { - VideoModeList->drop(); - if (GUIEnvironment) GUIEnvironment->drop(); @@ -81,9 +76,6 @@ CIrrDeviceStub::~CIrrDeviceStub() if (Operator) Operator->drop(); - if (Randomizer) - Randomizer->drop(); - CursorControl = 0; if (Timer) @@ -159,13 +151,6 @@ gui::ICursorControl* CIrrDeviceStub::getCursorControl() } -//! \return Returns a pointer to a list with all video modes supported -//! by the gfx adapter. -video::IVideoModeList* CIrrDeviceStub::getVideoModeList() -{ - return VideoModeList; -} - //! return the context manager video::IContextManager* CIrrDeviceStub::getContextManager() { @@ -275,56 +260,6 @@ IOSOperator* CIrrDeviceStub::getOSOperator() } -//! Provides access to the engine's currently set randomizer. -IRandomizer* CIrrDeviceStub::getRandomizer() const -{ - return Randomizer; -} - -//! Sets a new randomizer. -void CIrrDeviceStub::setRandomizer(IRandomizer* r) -{ - if (r!=Randomizer) - { - if (Randomizer) - Randomizer->drop(); - Randomizer=r; - if (Randomizer) - Randomizer->grab(); - } -} - -namespace -{ - struct SDefaultRandomizer : public IRandomizer - { - virtual void reset(s32 value=0x0f0f0f0f) _IRR_OVERRIDE_ - { - os::Randomizer::reset(value); - } - - virtual s32 rand() const _IRR_OVERRIDE_ - { - return os::Randomizer::rand(); - } - - virtual s32 randMax() const _IRR_OVERRIDE_ - { - return os::Randomizer::randMax(); - } - }; -} - -//! Creates a new default randomizer. -IRandomizer* CIrrDeviceStub::createDefaultRandomizer() const -{ - IRandomizer* r = new SDefaultRandomizer(); - if (r) - r->reset(); - return r; -} - - //! Sets the input receiving scene manager. void CIrrDeviceStub::setInputReceivingSceneManager(scene::ISceneManager* sceneManager) { diff --git a/source/Irrlicht/CIrrDeviceStub.h b/source/Irrlicht/CIrrDeviceStub.h index 7ea05bc5..546b2bad 100644 --- a/source/Irrlicht/CIrrDeviceStub.h +++ b/source/Irrlicht/CIrrDeviceStub.h @@ -8,7 +8,6 @@ #include "IrrlichtDevice.h" #include "IImagePresenter.h" #include "SIrrCreationParameters.h" -#include "CVideoModeList.h" #include "IContextManager.h" namespace irr @@ -16,7 +15,6 @@ namespace irr // lots of prototypes: class ILogger; class CLogger; - class IRandomizer; namespace gui { @@ -74,9 +72,6 @@ namespace irr //! \return Returns a pointer to the mouse cursor control interface. virtual gui::ICursorControl* getCursorControl() _IRR_OVERRIDE_; - //! Returns a pointer to a list with all video modes supported by the gfx adapter. - virtual video::IVideoModeList* getVideoModeList() _IRR_OVERRIDE_; - //! return the context manager virtual video::IContextManager* getContextManager() _IRR_OVERRIDE_; @@ -102,15 +97,6 @@ namespace irr //! Returns a pointer to the logger. virtual ILogger* getLogger() _IRR_OVERRIDE_; - //! Provides access to the engine's currently set randomizer. - virtual IRandomizer* getRandomizer() const _IRR_OVERRIDE_; - - //! Sets a new randomizer. - virtual void setRandomizer(IRandomizer* r) _IRR_OVERRIDE_; - - //! Creates a new default randomizer. - virtual IRandomizer* createDefaultRandomizer() const _IRR_OVERRIDE_; - //! Returns the operation system opertator object. virtual IOSOperator* getOSOperator() _IRR_OVERRIDE_; @@ -205,7 +191,6 @@ namespace irr IEventReceiver* UserReceiver; CLogger* Logger; IOSOperator* Operator; - IRandomizer* Randomizer; io::IFileSystem* FileSystem; scene::ISceneManager* InputReceivingSceneManager; @@ -222,7 +207,6 @@ namespace irr EMOUSE_INPUT_EVENT LastMouseInputEvent; }; SMouseMultiClicks MouseMultiClicks; - video::CVideoModeList* VideoModeList; video::IContextManager* ContextManager; SIrrlichtCreationParameters CreationParams; bool Close; diff --git a/source/Irrlicht/CMakeLists.txt b/source/Irrlicht/CMakeLists.txt index d63361d7..144ca04d 100644 --- a/source/Irrlicht/CMakeLists.txt +++ b/source/Irrlicht/CMakeLists.txt @@ -167,7 +167,6 @@ add_library(IRROBJ OBJECT CSceneCollisionManager.cpp CSceneManager.cpp CMeshCache.cpp - CDefaultSceneNodeFactory.cpp ) set(IRRDRVROBJ @@ -204,7 +203,6 @@ set(IRRIMAGEOBJ ) add_library(IRRVIDEOOBJ OBJECT - CVideoModeList.cpp CFPSCounter.cpp ${IRRDRVROBJ} ${IRRIMAGEOBJ} @@ -218,7 +216,6 @@ add_library(IRRIOOBJ OBJECT CReadFile.cpp CWriteFile.cpp CZipReader.cpp - CMountPointReader.cpp CAttributes.cpp ) @@ -257,32 +254,18 @@ add_library(IRRGUIOBJ OBJECT CGUIButton.cpp CGUICheckBox.cpp CGUIComboBox.cpp - CGUIContextMenu.cpp CGUIEditBox.cpp CGUIEnvironment.cpp CGUIFileOpenDialog.cpp CGUIFont.cpp CGUIImage.cpp - CGUIInOutFader.cpp CGUIListBox.cpp - CGUIMenu.cpp - CGUIMeshViewer.cpp - CGUIMessageBox.cpp - CGUIModalScreen.cpp CGUIScrollBar.cpp - CGUISpinBox.cpp CGUISkin.cpp CGUIStaticText.cpp CGUITabControl.cpp - CGUITable.cpp - CGUIToolBar.cpp - CGUIWindow.cpp - CGUIColorSelectDialog.cpp - CDefaultGUIElementFactory.cpp CGUISpriteBank.cpp CGUIImageList.cpp - CGUITreeView.cpp - CGUIProfiler.cpp ) # Library diff --git a/source/Irrlicht/CMeshManipulator.cpp b/source/Irrlicht/CMeshManipulator.cpp index 8b07afa9..164d3591 100644 --- a/source/Irrlicht/CMeshManipulator.cpp +++ b/source/Irrlicht/CMeshManipulator.cpp @@ -9,7 +9,6 @@ #include "SAnimatedMesh.h" #include "os.h" #include "triangle3d.h" -#include namespace irr { @@ -37,43 +36,6 @@ static inline core::vector3df getAngleWeight(const core::vector3df& v1, } -//! Flips the direction of surfaces. Changes backfacing triangles to frontfacing -//! triangles and vice versa. -//! \param mesh: Mesh on which the operation is performed. -void CMeshManipulator::flipSurfaces(scene::IMesh* mesh) const -{ - if (!mesh) - return; - - const u32 bcount = mesh->getMeshBufferCount(); - for (u32 b=0; bgetMeshBuffer(b); - const u32 idxcnt = buffer->getIndexCount(); - if (buffer->getIndexType() == video::EIT_16BIT) - { - u16* idx = buffer->getIndices(); - for (u32 i=0; i(buffer->getIndices()); - for (u32 i=0; i @@ -165,431 +127,6 @@ void CMeshManipulator::recalculateNormals(scene::IMesh* mesh, bool smooth, bool } -namespace -{ -void calculateTangents( - core::vector3df& normal, - core::vector3df& tangent, - core::vector3df& binormal, - const core::vector3df& vt1, const core::vector3df& vt2, const core::vector3df& vt3, // vertices - const core::vector2df& tc1, const core::vector2df& tc2, const core::vector2df& tc3) // texture coords -{ - // choose one of them: - //#define USE_NVIDIA_GLH_VERSION // use version used by nvidia in glh headers - #define USE_IRR_VERSION - -#ifdef USE_IRR_VERSION - - core::vector3df v1 = vt1 - vt2; - core::vector3df v2 = vt3 - vt1; - normal = v2.crossProduct(v1); - normal.normalize(); - - // binormal - - f32 deltaX1 = tc1.X - tc2.X; - f32 deltaX2 = tc3.X - tc1.X; - binormal = (v1 * deltaX2) - (v2 * deltaX1); - binormal.normalize(); - - // tangent - - f32 deltaY1 = tc1.Y - tc2.Y; - f32 deltaY2 = tc3.Y - tc1.Y; - tangent = (v1 * deltaY2) - (v2 * deltaY1); - tangent.normalize(); - - // adjust - - core::vector3df txb = tangent.crossProduct(binormal); - if (txb.dotProduct(normal) < 0.0f) - { - tangent *= -1.0f; - binormal *= -1.0f; - } - -#endif // USE_IRR_VERSION - -#ifdef USE_NVIDIA_GLH_VERSION - - tangent.set(0,0,0); - binormal.set(0,0,0); - - core::vector3df v1(vt2.X - vt1.X, tc2.X - tc1.X, tc2.Y - tc1.Y); - core::vector3df v2(vt3.X - vt1.X, tc3.X - tc1.X, tc3.Y - tc1.Y); - - core::vector3df txb = v1.crossProduct(v2); - if ( !core::iszero ( txb.X ) ) - { - tangent.X = -txb.Y / txb.X; - binormal.X = -txb.Z / txb.X; - } - - v1.X = vt2.Y - vt1.Y; - v2.X = vt3.Y - vt1.Y; - txb = v1.crossProduct(v2); - - if ( !core::iszero ( txb.X ) ) - { - tangent.Y = -txb.Y / txb.X; - binormal.Y = -txb.Z / txb.X; - } - - v1.X = vt2.Z - vt1.Z; - v2.X = vt3.Z - vt1.Z; - txb = v1.crossProduct(v2); - - if ( !core::iszero ( txb.X ) ) - { - tangent.Z = -txb.Y / txb.X; - binormal.Z = -txb.Z / txb.X; - } - - tangent.normalize(); - binormal.normalize(); - - normal = tangent.crossProduct(binormal); - normal.normalize(); - - binormal = tangent.crossProduct(normal); - binormal.normalize(); - - core::plane3d pl(vt1, vt2, vt3); - - if(normal.dotProduct(pl.Normal) < 0.0f ) - normal *= -1.0f; - -#endif // USE_NVIDIA_GLH_VERSION -} - - -//! Recalculates tangents for a tangent mesh buffer -template -void recalculateTangentsT(IMeshBuffer* buffer, bool recalculateNormals, bool smooth, bool angleWeighted) -{ - if (!buffer || (buffer->getVertexType()!= video::EVT_TANGENTS)) - return; - - const u32 vtxCnt = buffer->getVertexCount(); - const u32 idxCnt = buffer->getIndexCount(); - - T* idx = reinterpret_cast(buffer->getIndices()); - video::S3DVertexTangents* v = - (video::S3DVertexTangents*)buffer->getVertices(); - - if (smooth) - { - u32 i; - - for ( i = 0; i!= vtxCnt; ++i ) - { - if (recalculateNormals) - v[i].Normal.set( 0.f, 0.f, 0.f ); - v[i].Tangent.set( 0.f, 0.f, 0.f ); - v[i].Binormal.set( 0.f, 0.f, 0.f ); - } - - //Each vertex gets the sum of the tangents and binormals from the faces around it - for ( i=0; igetVertexType() == video::EVT_TANGENTS)) - { - if (buffer->getIndexType() == video::EIT_16BIT) - recalculateTangentsT(buffer, recalculateNormals, smooth, angleWeighted); - else - recalculateTangentsT(buffer, recalculateNormals, smooth, angleWeighted); - } -} - - -//! Recalculates tangents for all tangent mesh buffers -void CMeshManipulator::recalculateTangents(IMesh* mesh, bool recalculateNormals, bool smooth, bool angleWeighted) const -{ - if (!mesh) - return; - - const u32 meshBufferCount = mesh->getMeshBufferCount(); - for (u32 b=0; bgetMeshBuffer(b), recalculateNormals, smooth, angleWeighted); - } -} - - -namespace -{ -//! Creates a planar texture mapping on the meshbuffer -template -void makePlanarTextureMappingT(scene::IMeshBuffer* buffer, f32 resolution) -{ - u32 idxcnt = buffer->getIndexCount(); - T* idx = reinterpret_cast(buffer->getIndices()); - - for (u32 i=0; igetPosition(idx[i+0]), buffer->getPosition(idx[i+1]), buffer->getPosition(idx[i+2])); - p.Normal.X = fabsf(p.Normal.X); - p.Normal.Y = fabsf(p.Normal.Y); - p.Normal.Z = fabsf(p.Normal.Z); - // calculate planar mapping worldspace coordinates - - if (p.Normal.X > p.Normal.Y && p.Normal.X > p.Normal.Z) - { - for (u32 o=0; o!=3; ++o) - { - buffer->getTCoords(idx[i+o]).X = buffer->getPosition(idx[i+o]).Y * resolution; - buffer->getTCoords(idx[i+o]).Y = buffer->getPosition(idx[i+o]).Z * resolution; - } - } - else - if (p.Normal.Y > p.Normal.X && p.Normal.Y > p.Normal.Z) - { - for (u32 o=0; o!=3; ++o) - { - buffer->getTCoords(idx[i+o]).X = buffer->getPosition(idx[i+o]).X * resolution; - buffer->getTCoords(idx[i+o]).Y = buffer->getPosition(idx[i+o]).Z * resolution; - } - } - else - { - for (u32 o=0; o!=3; ++o) - { - buffer->getTCoords(idx[i+o]).X = buffer->getPosition(idx[i+o]).X * resolution; - buffer->getTCoords(idx[i+o]).Y = buffer->getPosition(idx[i+o]).Y * resolution; - } - } - } -} -} - - -//! Creates a planar texture mapping on the meshbuffer -void CMeshManipulator::makePlanarTextureMapping(scene::IMeshBuffer* buffer, f32 resolution) const -{ - if (!buffer) - return; - - if (buffer->getIndexType()==video::EIT_16BIT) - makePlanarTextureMappingT(buffer, resolution); - else - makePlanarTextureMappingT(buffer, resolution); -} - - -//! Creates a planar texture mapping on the mesh -void CMeshManipulator::makePlanarTextureMapping(scene::IMesh* mesh, f32 resolution) const -{ - if (!mesh) - return; - - const u32 bcount = mesh->getMeshBufferCount(); - for ( u32 b=0; bgetMeshBuffer(b), resolution); - } -} - - -namespace -{ -//! Creates a planar texture mapping on the meshbuffer -template -void makePlanarTextureMappingT(scene::IMeshBuffer* buffer, f32 resolutionS, f32 resolutionT, u8 axis, const core::vector3df& offset) -{ - u32 idxcnt = buffer->getIndexCount(); - T* idx = reinterpret_cast(buffer->getIndices()); - - for (u32 i=0; igetTCoords(idx[i+o]).X = 0.5f+(buffer->getPosition(idx[i+o]).Z + offset.Z) * resolutionS; - buffer->getTCoords(idx[i+o]).Y = 0.5f-(buffer->getPosition(idx[i+o]).Y + offset.Y) * resolutionT; - } - } - else if (axis==1) - { - for (u32 o=0; o!=3; ++o) - { - buffer->getTCoords(idx[i+o]).X = 0.5f+(buffer->getPosition(idx[i+o]).X + offset.X) * resolutionS; - buffer->getTCoords(idx[i+o]).Y = 1.f-(buffer->getPosition(idx[i+o]).Z + offset.Z) * resolutionT; - } - } - else if (axis==2) - { - for (u32 o=0; o!=3; ++o) - { - buffer->getTCoords(idx[i+o]).X = 0.5f+(buffer->getPosition(idx[i+o]).X + offset.X) * resolutionS; - buffer->getTCoords(idx[i+o]).Y = 0.5f-(buffer->getPosition(idx[i+o]).Y + offset.Y) * resolutionT; - } - } - } -} -} - - -//! Creates a planar texture mapping on the meshbuffer -void CMeshManipulator::makePlanarTextureMapping(scene::IMeshBuffer* buffer, f32 resolutionS, f32 resolutionT, u8 axis, const core::vector3df& offset) const -{ - if (!buffer) - return; - - if (buffer->getIndexType()==video::EIT_16BIT) - makePlanarTextureMappingT(buffer, resolutionS, resolutionT, axis, offset); - else - makePlanarTextureMappingT(buffer, resolutionS, resolutionT, axis, offset); -} - - -//! Creates a planar texture mapping on the mesh -void CMeshManipulator::makePlanarTextureMapping(scene::IMesh* mesh, f32 resolutionS, f32 resolutionT, u8 axis, const core::vector3df& offset) const -{ - if (!mesh) - return; - - const u32 bcount = mesh->getMeshBufferCount(); - for ( u32 b=0; bgetMeshBuffer(b), resolutionS, resolutionT, axis, offset); - } -} - - //! Clones a static IMesh into a modifyable SMesh. // not yet 32bit SMesh* CMeshManipulator::createMeshCopy(scene::IMesh* mesh) const @@ -669,833 +206,6 @@ SMesh* CMeshManipulator::createMeshCopy(scene::IMesh* mesh) const } -//! Creates a copy of the mesh, which will only consist of unique primitives -// not yet 32bit -IMesh* CMeshManipulator::createMeshUniquePrimitives(IMesh* mesh) const -{ - if (!mesh) - return 0; - - SMesh* clone = new SMesh(); - - const u32 meshBufferCount = mesh->getMeshBufferCount(); - - for ( u32 b=0; bgetMeshBuffer(b); - const s32 idxCnt = mb->getIndexCount(); - const u16* idx = mb->getIndices(); - - switch(mb->getVertexType()) - { - case video::EVT_STANDARD: - { - SMeshBuffer* buffer = new SMeshBuffer(); - buffer->Material = mb->getMaterial(); - - video::S3DVertex* v = - (video::S3DVertex*)mb->getVertices(); - - buffer->Vertices.reallocate(idxCnt); - buffer->Indices.reallocate(idxCnt); - for (s32 i=0; iVertices.push_back( v[idx[i + 0 ]] ); - buffer->Vertices.push_back( v[idx[i + 1 ]] ); - buffer->Vertices.push_back( v[idx[i + 2 ]] ); - - buffer->Indices.push_back( i + 0 ); - buffer->Indices.push_back( i + 1 ); - buffer->Indices.push_back( i + 2 ); - } - - buffer->setBoundingBox(mb->getBoundingBox()); - clone->addMeshBuffer(buffer); - buffer->drop(); - } - break; - case video::EVT_2TCOORDS: - { - SMeshBufferLightMap* buffer = new SMeshBufferLightMap(); - buffer->Material = mb->getMaterial(); - - video::S3DVertex2TCoords* v = - (video::S3DVertex2TCoords*)mb->getVertices(); - - buffer->Vertices.reallocate(idxCnt); - buffer->Indices.reallocate(idxCnt); - for (s32 i=0; iVertices.push_back( v[idx[i + 0 ]] ); - buffer->Vertices.push_back( v[idx[i + 1 ]] ); - buffer->Vertices.push_back( v[idx[i + 2 ]] ); - - buffer->Indices.push_back( i + 0 ); - buffer->Indices.push_back( i + 1 ); - buffer->Indices.push_back( i + 2 ); - } - buffer->setBoundingBox(mb->getBoundingBox()); - clone->addMeshBuffer(buffer); - buffer->drop(); - } - break; - case video::EVT_TANGENTS: - { - SMeshBufferTangents* buffer = new SMeshBufferTangents(); - buffer->Material = mb->getMaterial(); - - video::S3DVertexTangents* v = - (video::S3DVertexTangents*)mb->getVertices(); - - buffer->Vertices.reallocate(idxCnt); - buffer->Indices.reallocate(idxCnt); - for (s32 i=0; iVertices.push_back( v[idx[i + 0 ]] ); - buffer->Vertices.push_back( v[idx[i + 1 ]] ); - buffer->Vertices.push_back( v[idx[i + 2 ]] ); - - buffer->Indices.push_back( i + 0 ); - buffer->Indices.push_back( i + 1 ); - buffer->Indices.push_back( i + 2 ); - } - - buffer->setBoundingBox(mb->getBoundingBox()); - clone->addMeshBuffer(buffer); - buffer->drop(); - } - break; - }// end switch - - }// end for all mesh buffers - - clone->BoundingBox = mesh->getBoundingBox(); - return clone; -} - - -//! Creates a copy of a mesh, which will have identical vertices welded together -// not yet 32bit -IMesh* CMeshManipulator::createMeshWelded(IMesh *mesh, f32 tolerance) const -{ - SMesh* clone = new SMesh(); - clone->BoundingBox = mesh->getBoundingBox(); - - core::array redirects; - - for (u32 b=0; bgetMeshBufferCount(); ++b) - { - const IMeshBuffer* const mb = mesh->getMeshBuffer(b); - // reset redirect list - redirects.set_used(mb->getVertexCount()); - - const u16* indices = 0; - u32 indexCount = 0; - core::array* outIdx = 0; - - switch(mb->getVertexType()) - { - case video::EVT_STANDARD: - { - SMeshBuffer* buffer = new SMeshBuffer(); - buffer->BoundingBox = mb->getBoundingBox(); - buffer->Material = mb->getMaterial(); - clone->addMeshBuffer(buffer); - buffer->drop(); - - video::S3DVertex* v = - (video::S3DVertex*)mb->getVertices(); - - u32 vertexCount = mb->getVertexCount(); - - indices = mb->getIndices(); - indexCount = mb->getIndexCount(); - outIdx = &buffer->Indices; - - buffer->Vertices.reallocate(vertexCount); - - for (u32 i=0; i < vertexCount; ++i) - { - bool found = false; - for (u32 j=0; j < i; ++j) - { - if ( v[i].Pos.equals( v[j].Pos, tolerance) && - v[i].Normal.equals( v[j].Normal, tolerance) && - v[i].TCoords.equals( v[j].TCoords ) && - (v[i].Color == v[j].Color) ) - { - redirects[i] = redirects[j]; - found = true; - break; - } - } - if (!found) - { - redirects[i] = buffer->Vertices.size(); - buffer->Vertices.push_back(v[i]); - } - } - - break; - } - case video::EVT_2TCOORDS: - { - SMeshBufferLightMap* buffer = new SMeshBufferLightMap(); - buffer->BoundingBox = mb->getBoundingBox(); - buffer->Material = mb->getMaterial(); - clone->addMeshBuffer(buffer); - buffer->drop(); - - video::S3DVertex2TCoords* v = - (video::S3DVertex2TCoords*)mb->getVertices(); - - u32 vertexCount = mb->getVertexCount(); - - indices = mb->getIndices(); - indexCount = mb->getIndexCount(); - outIdx = &buffer->Indices; - - buffer->Vertices.reallocate(vertexCount); - - for (u32 i=0; i < vertexCount; ++i) - { - bool found = false; - for (u32 j=0; j < i; ++j) - { - if ( v[i].Pos.equals( v[j].Pos, tolerance) && - v[i].Normal.equals( v[j].Normal, tolerance) && - v[i].TCoords.equals( v[j].TCoords ) && - v[i].TCoords2.equals( v[j].TCoords2 ) && - (v[i].Color == v[j].Color) ) - { - redirects[i] = redirects[j]; - found = true; - break; - } - } - if (!found) - { - redirects[i] = buffer->Vertices.size(); - buffer->Vertices.push_back(v[i]); - } - } - break; - } - case video::EVT_TANGENTS: - { - SMeshBufferTangents* buffer = new SMeshBufferTangents(); - buffer->BoundingBox = mb->getBoundingBox(); - buffer->Material = mb->getMaterial(); - clone->addMeshBuffer(buffer); - buffer->drop(); - - video::S3DVertexTangents* v = - (video::S3DVertexTangents*)mb->getVertices(); - - u32 vertexCount = mb->getVertexCount(); - - indices = mb->getIndices(); - indexCount = mb->getIndexCount(); - outIdx = &buffer->Indices; - - buffer->Vertices.reallocate(vertexCount); - - for (u32 i=0; i < vertexCount; ++i) - { - bool found = false; - for (u32 j=0; j < i; ++j) - { - if ( v[i].Pos.equals( v[j].Pos, tolerance) && - v[i].Normal.equals( v[j].Normal, tolerance) && - v[i].TCoords.equals( v[j].TCoords ) && - v[i].Tangent.equals( v[j].Tangent, tolerance ) && - v[i].Binormal.equals( v[j].Binormal, tolerance ) && - (v[i].Color == v[j].Color) ) - { - redirects[i] = redirects[j]; - found = true; - break; - } - } - if (!found) - { - redirects[i] = buffer->Vertices.size(); - buffer->Vertices.push_back(v[i]); - } - } - break; - } - default: - os::Printer::log("Cannot create welded mesh, vertex type unsupported", ELL_ERROR); - break; - } - - // Clean up any degenerate tris - core::array &Indices = *outIdx; - Indices.clear(); - Indices.reallocate(indexCount); - for (u32 i = 0; i < indexCount; i+=3) - { - u16 a, b, c; - a = redirects[indices[i]]; - b = redirects[indices[i+1]]; - c = redirects[indices[i+2]]; - - bool drop = false; - - if (a == b || b == c || a == c) - drop = true; - - // Open for other checks - - if (!drop) - { - Indices.push_back(a); - Indices.push_back(b); - Indices.push_back(c); - } - } - } - return clone; -} - - -//! Creates a copy of the mesh, which will only consist of S3DVertexTangents vertices. -// not yet 32bit -IMesh* CMeshManipulator::createMeshWithTangents(IMesh* mesh, bool recalculateNormals, bool smooth, bool angleWeighted, bool calculateTangents) const -{ - using namespace video; - - if (!mesh) - return 0; - - // copy mesh and fill data into SMeshBufferTangents - SMesh* clone = new SMesh(); - const u32 meshBufferCount = mesh->getMeshBufferCount(); - - for (u32 b=0; bgetMeshBuffer(b); - SMeshBufferTangents* buffer = new SMeshBufferTangents(); - - // copy material - buffer->Material = original->getMaterial(); - - // copy indices - const u32 idxCnt = original->getIndexCount(); - const u16* indices = original->getIndices(); - buffer->Indices.reallocate(idxCnt); - for (u32 i=0; i < idxCnt; ++i) - buffer->Indices.push_back(indices[i]); - - // copy vertices - const u32 vtxCnt = original->getVertexCount(); - buffer->Vertices.reallocate(vtxCnt); - - const E_VERTEX_TYPE vType = original->getVertexType(); - switch(vType) - { - case video::EVT_STANDARD: - { - const S3DVertex* v = (const S3DVertex*)original->getVertices(); - - for (u32 i=0; i < vtxCnt; ++i) - buffer->Vertices.push_back( S3DVertexTangents( - v[i].Pos, v[i].Normal, v[i].Color, v[i].TCoords) ); - } - break; - case video::EVT_2TCOORDS: - { - const S3DVertex2TCoords* v =(const S3DVertex2TCoords*)original->getVertices(); - - for (u32 i=0; i < vtxCnt; ++i) - buffer->Vertices.push_back( S3DVertexTangents( - v[i].Pos, v[i].Normal, v[i].Color, v[i].TCoords) ); - } - break; - case video::EVT_TANGENTS: - { - const S3DVertexTangents* v =(const S3DVertexTangents*)original->getVertices(); - - for (u32 i=0; i < vtxCnt; ++i) - buffer->Vertices.push_back(v[i]); - } - break; - } - buffer->recalculateBoundingBox(); - - // add new buffer - clone->addMeshBuffer(buffer); - buffer->drop(); - } - - clone->recalculateBoundingBox(); - if (calculateTangents) - recalculateTangents(clone, recalculateNormals, smooth, angleWeighted); - - return clone; -} - -namespace -{ - -struct height_edge -{ - u32 far; - - u32 polycount; - u32 polys[2]; - core::vector3df normal[2]; -}; - -enum -{ - HEIGHT_TRIACCEL_MAX = 1024 -}; - -} - -//! Optimizes the mesh using an algorithm tuned for heightmaps. -void CMeshManipulator::heightmapOptimizeMesh(IMesh * const m, const f32 tolerance) const -{ - const u32 max = m->getMeshBufferCount(); - - for (u32 i = 0; i < max; i++) - { - IMeshBuffer * const mb = m->getMeshBuffer(i); - - heightmapOptimizeMesh(mb, tolerance); - } -} - -//! Optimizes the mesh using an algorithm tuned for heightmaps. -void CMeshManipulator::heightmapOptimizeMesh(IMeshBuffer * const mb, const f32 tolerance) const -{ - using namespace core; - using namespace video; - - array edges; - - const u32 idxs = mb->getIndexCount(); - const u32 verts = mb->getVertexCount(); - - u16 *ind = mb->getIndices(); - S3DVertex *vert = (S3DVertex *) mb->getVertices(); - - // First an acceleration structure: given this vert, which triangles touch it? - // Using this drops two exponents off the algorightm complexity, O(n^4) > O(n^2) - // Other optimizations brought it down to O(n). - u32 **accel = (u32 **) malloc(verts * sizeof(u32 *)); - for (u32 i = 0; i < verts; i++) - { - accel[i] = (u32 *) calloc(HEIGHT_TRIACCEL_MAX, sizeof(u32)); - for (u32 j = 0; j < HEIGHT_TRIACCEL_MAX; j++) - { - accel[i][j] = USHRT_MAX; - } - } - - u16 *cur = (u16 *) calloc(verts, sizeof(u16)); - for (u32 j = 0; j < idxs; j+=3) - { - u32 v = ind[j]; - - if (cur[v] >= HEIGHT_TRIACCEL_MAX) - { - os::Printer::log("Too complex mesh to optimize, aborting."); - goto donehere; - } - - accel[v][cur[v]] = j; - cur[v]++; - - // Unrolled tri loop, parts 2 and 3 - v = ind[j+1]; - - if (cur[v] >= HEIGHT_TRIACCEL_MAX) - { - os::Printer::log("Too complex mesh to optimize, aborting."); - goto donehere; - } - - accel[v][cur[v]] = j; - cur[v]++; - - v = ind[j+2]; - - if (cur[v] >= HEIGHT_TRIACCEL_MAX) - { - os::Printer::log("Too complex mesh to optimize, aborting."); - goto donehere; - } - - accel[v][cur[v]] = j; - cur[v]++; - } - free(cur); - - // Built, go - for (u32 i = 0; i < verts; i++) - { - const vector3df &mypos = vert[i].Pos; - - // find all edges of this vert - edges.clear(); - - bool gotonext = false; - u32 j; - u16 cur; - for (cur = 0; accel[i][cur] != USHRT_MAX && cur < HEIGHT_TRIACCEL_MAX; cur++) - { - j = accel[i][cur]; - - u32 far1 = -1, far2 = -1; - if (ind[j] == i) - { - far1 = ind[j+1]; - far2 = ind[j+2]; - } - else if (ind[j+1] == i) - { - far1 = ind[j]; - far2 = ind[j+2]; - } - else if (ind[j+2] == i) - { - far1 = ind[j]; - far2 = ind[j+1]; - } - - // Skip degenerate tris - if (vert[i].Pos == vert[far1].Pos || - vert[far1].Pos == vert[far2].Pos) - { -// puts("skipping degenerate tri"); - continue; - } - - // Edges found, check if we already added them - const u32 ecount = edges.size(); - bool far1new = true, far2new = true; - - for (u32 e = 0; e < ecount; e++) - { - if (edges[e].far == far1 || - edges[e].far == far2) - { - - // Skip if over 2 polys - if (edges[e].polycount > 2) - { - gotonext = true; - goto almostnext; - } - edges[e].polys[edges[e].polycount] = j; - edges[e].normal[edges[e].polycount] = - vert[i].Normal; - edges[e].polycount++; - - if (edges[e].far == far1) - far1new = false; - else - far2new = false; - } - } - - if (far1new) - { - // New edge - height_edge ed; - - ed.far = far1; - ed.polycount = 1; - ed.polys[0] = j; - ed.normal[0] = vert[i].Normal; - - edges.push_back(ed); - } - if (far2new) - { - // New edge - height_edge ed; - - ed.far = far2; - ed.polycount = 1; - ed.polys[0] = j; - ed.normal[0] = vert[i].Normal; - - edges.push_back(ed); - } - } - - almostnext: - if (gotonext) - continue; - - // Edges found. Possible to simplify? - - const u32 ecount = edges.size(); -// printf("Vert %u has %u edges\n", i, ecount); - for (u32 e = 0; e < ecount; e++) - { - for (u32 f = 0; f < ecount; f++) - { - if (f == e) continue; - - vector3df one = mypos - vert[edges[e].far].Pos; - vector3df two = vert[edges[f].far].Pos - mypos; - - one.normalize(); - two.normalize(); - - // Straight line ? - if (!one.equals(two, tolerance) || one.getLengthSQ() < 0.5f) - continue; - - // All other edges must have two polys - for (u32 g = 0; g < ecount; g++) - { - if (g == e || g == f) - continue; - - if (edges[g].polycount != 2) - { -// printf("%u: polycount not 2 (%u)\n", -// g, edges[g].polycount); - goto testnext; - } - - // Normals must match - if (!edges[g].normal[0].equals(edges[g].normal[1], - tolerance)) - { -// puts("Normals don't match"); - goto testnext; - } - - // Normals must not flip - for (u32 z = 0; z < edges[g].polycount; z++) - { - bool flat = false; - vector3df pos[3]; - pos[0] = - vert[ind[edges[g].polys[z]]].Pos; - pos[1] = - vert[ind[edges[g].polys[z] + 1]].Pos; - pos[2] = - vert[ind[edges[g].polys[z] + 2]].Pos; - - for (u32 y = 0; y < 3; y++) - { - if (edges[g].polys[z] + y == i) - { - pos[y] = vert[edges[e].far].Pos; - } - else if (edges[g].polys[z] + y - == edges[e].far) - { - flat = true; - break; - } - } - if (!flat) - { - triangle3df temp(pos[0], - pos[1], pos[2]); - vector3df N = temp.getNormal(); - N.normalize(); -// if (N.getLengthSQ() < 0.5f) -// puts("empty"); - - if (!N.equals(edges[g].normal[z], tolerance)) - { -// puts("wouldflip"); - goto testnext; - } - } - } - - // Must not be on model edge - if (edges[g].polycount == 1) - { - goto testnext; - } - - } - - // Must not be on model edge - if (edges[e].polycount == 1) - { - goto testnext; - } - - // OK, moving to welding position - vert[i] = vert[edges[e].far]; -// printf("Contracted vert %u to %u\n", -// i, edges[e].far); - } - } - - - testnext:; - } - -donehere: - for (u32 i = 0; i < verts; i++) - { - free(accel[i]); - } - free(accel); -} - -//! Creates a copy of the mesh, which will only consist of S3DVertex2TCoords vertices. -// not yet 32bit -IMesh* CMeshManipulator::createMeshWith2TCoords(IMesh* mesh) const -{ - using namespace video; - - if (!mesh) - return 0; - - // copy mesh and fill data into SMeshBufferLightMap - - SMesh* clone = new SMesh(); - const u32 meshBufferCount = mesh->getMeshBufferCount(); - - for (u32 b=0; bgetMeshBuffer(b); - SMeshBufferLightMap* buffer = new SMeshBufferLightMap(); - - // copy material - buffer->Material = original->getMaterial(); - - // copy indices - const u32 idxCnt = original->getIndexCount(); - const u16* indices = original->getIndices(); - buffer->Indices.reallocate(idxCnt); - for (u32 i=0; i < idxCnt; ++i) - buffer->Indices.push_back(indices[i]); - - // copy vertices - const u32 vtxCnt = original->getVertexCount(); - buffer->Vertices.reallocate(vtxCnt); - - const video::E_VERTEX_TYPE vType = original->getVertexType(); - switch(vType) - { - case video::EVT_STANDARD: - { - const S3DVertex* v = (const S3DVertex*)original->getVertices(); - - for (u32 i=0; i < vtxCnt; ++i) - buffer->Vertices.push_back( video::S3DVertex2TCoords( - v[i].Pos, v[i].Normal, v[i].Color, v[i].TCoords, v[i].TCoords)); - } - break; - case video::EVT_2TCOORDS: - { - const S3DVertex2TCoords* v =(const S3DVertex2TCoords*)original->getVertices(); - for (u32 i=0; i < vtxCnt; ++i) - buffer->Vertices.push_back(v[i]); - } - break; - case video::EVT_TANGENTS: - { - const S3DVertexTangents* v =(const S3DVertexTangents*)original->getVertices(); - - for (u32 i=0; i < vtxCnt; ++i) - buffer->Vertices.push_back( S3DVertex2TCoords( - v[i].Pos, v[i].Normal, v[i].Color, v[i].TCoords, v[i].TCoords) ); - } - break; - } - buffer->recalculateBoundingBox(); - - // add new buffer - clone->addMeshBuffer(buffer); - buffer->drop(); - } - - clone->recalculateBoundingBox(); - return clone; -} - - -//! Creates a copy of the mesh, which will only consist of S3DVertex vertices. -// not yet 32bit -IMesh* CMeshManipulator::createMeshWith1TCoords(IMesh* mesh) const -{ - using namespace video; - - if (!mesh) - return 0; - - // copy mesh and fill data into SMeshBuffer - SMesh* clone = new SMesh(); - const u32 meshBufferCount = mesh->getMeshBufferCount(); - - for (u32 b=0; bgetMeshBuffer(b); - SMeshBuffer* buffer = new SMeshBuffer(); - - // copy material - buffer->Material = original->getMaterial(); - - // copy indices - const u32 idxCnt = original->getIndexCount(); - const u16* indices = original->getIndices(); - buffer->Indices.reallocate(idxCnt); - for (u32 i=0; i < idxCnt; ++i) - buffer->Indices.push_back(indices[i]); - - // copy vertices - const u32 vtxCnt = original->getVertexCount(); - buffer->Vertices.reallocate(vtxCnt); - - const video::E_VERTEX_TYPE vType = original->getVertexType(); - switch(vType) - { - case video::EVT_STANDARD: - { - const S3DVertex* v = (const S3DVertex*)original->getVertices(); - - for (u32 i=0; i < vtxCnt; ++i) - buffer->Vertices.push_back( v[i] ); - } - break; - case video::EVT_2TCOORDS: - { - const S3DVertex2TCoords* v =(const S3DVertex2TCoords*)original->getVertices(); - - for (u32 i=0; i < vtxCnt; ++i) - buffer->Vertices.push_back( S3DVertex( - v[i].Pos, v[i].Normal, v[i].Color, v[i].TCoords) ); - } - break; - case video::EVT_TANGENTS: - { - const S3DVertexTangents* v =(const S3DVertexTangents*)original->getVertices(); - - for (u32 i=0; i < vtxCnt; ++i) - buffer->Vertices.push_back( S3DVertex( - v[i].Pos, v[i].Normal, v[i].Color, v[i].TCoords) ); - } - break; - } - - buffer->recalculateBoundingBox(); - // add new buffer - clone->addMeshBuffer(buffer); - buffer->drop(); - } - - clone->recalculateBoundingBox(); - return clone; -} - - //! Returns amount of polygons in mesh. s32 CMeshManipulator::getPolyCount(scene::IMesh* mesh) const { @@ -1527,604 +237,6 @@ IAnimatedMesh * CMeshManipulator::createAnimatedMesh(scene::IMesh* mesh, scene:: return new SAnimatedMesh(mesh, type); } -namespace -{ - -struct vcache -{ - core::array tris; - float score; - s16 cachepos; - u16 NumActiveTris; -}; - -struct tcache -{ - u16 ind[3]; - float score; - bool drawn; -}; - -const u16 cachesize = 32; - -float FindVertexScore(vcache *v) -{ - const float CacheDecayPower = 1.5f; - const float LastTriScore = 0.75f; - const float ValenceBoostScale = 2.0f; - const float ValenceBoostPower = 0.5f; - const float MaxSizeVertexCache = 32.0f; - - if (v->NumActiveTris == 0) - { - // No tri needs this vertex! - return -1.0f; - } - - float Score = 0.0f; - int CachePosition = v->cachepos; - if (CachePosition < 0) - { - // Vertex is not in FIFO cache - no score. - } - else - { - if (CachePosition < 3) - { - // This vertex was used in the last triangle, - // so it has a fixed score. - Score = LastTriScore; - } - else - { - // Points for being high in the cache. - const float Scaler = 1.0f / (MaxSizeVertexCache - 3); - Score = 1.0f - (CachePosition - 3) * Scaler; - Score = powf(Score, CacheDecayPower); - } - } - - // Bonus points for having a low number of tris still to - // use the vert, so we get rid of lone verts quickly. - float ValenceBoost = powf(v->NumActiveTris, - -ValenceBoostPower); - Score += ValenceBoostScale * ValenceBoost; - - return Score; -} - -/* - A specialized LRU cache for the Forsyth algorithm. -*/ - -class f_lru -{ - -public: - f_lru(vcache *v, tcache *t): vc(v), tc(t) - { - for (u16 i = 0; i < cachesize; i++) - { - cache[i] = -1; - } - } - - // Adds this vertex index and returns the highest-scoring triangle index - u32 add(u16 vert, bool updatetris = false) - { - bool found = false; - - // Mark existing pos as empty - for (u16 i = 0; i < cachesize; i++) - { - if (cache[i] == vert) - { - // Move everything down - for (u16 j = i; j; j--) - { - cache[j] = cache[j - 1]; - } - - found = true; - break; - } - } - - if (!found) - { - if (cache[cachesize-1] != -1) - vc[cache[cachesize-1]].cachepos = -1; - - // Move everything down - for (u16 i = cachesize - 1; i; i--) - { - cache[i] = cache[i - 1]; - } - } - - cache[0] = vert; - - u32 highest = 0; - float hiscore = 0; - - if (updatetris) - { - // Update cache positions - for (u16 i = 0; i < cachesize; i++) - { - if (cache[i] == -1) - break; - - vc[cache[i]].cachepos = i; - vc[cache[i]].score = FindVertexScore(&vc[cache[i]]); - } - - // Update triangle scores - for (u16 i = 0; i < cachesize; i++) - { - if (cache[i] == -1) - break; - - const u16 trisize = vc[cache[i]].tris.size(); - for (u16 t = 0; t < trisize; t++) - { - tcache *tri = &tc[vc[cache[i]].tris[t]]; - - tri->score = - vc[tri->ind[0]].score + - vc[tri->ind[1]].score + - vc[tri->ind[2]].score; - - if (tri->score > hiscore) - { - hiscore = tri->score; - highest = vc[cache[i]].tris[t]; - } - } - } - } - - return highest; - } - -private: - s32 cache[cachesize]; - vcache *vc; - tcache *tc; -}; - -} // end anonymous namespace - -/** -Vertex cache optimization according to the Forsyth paper: -http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html - -The function is thread-safe (read: you can optimize several meshes in different threads) - -\param mesh Source mesh for the operation. */ -IMesh* CMeshManipulator::createForsythOptimizedMesh(const IMesh *mesh) const -{ - if (!mesh) - return 0; - - SMesh *newmesh = new SMesh(); - newmesh->BoundingBox = mesh->getBoundingBox(); - - const u32 mbcount = mesh->getMeshBufferCount(); - - for (u32 b = 0; b < mbcount; ++b) - { - const IMeshBuffer *mb = mesh->getMeshBuffer(b); - - if (mb->getIndexType() != video::EIT_16BIT) - { - os::Printer::log("Cannot optimize a mesh with 32bit indices", ELL_ERROR); - newmesh->drop(); - return 0; - } - - const u32 icount = mb->getIndexCount(); - const u32 tcount = icount / 3; - const u32 vcount = mb->getVertexCount(); - const u16 *ind = mb->getIndices(); - - vcache *vc = new vcache[vcount]; - tcache *tc = new tcache[tcount]; - - f_lru lru(vc, tc); - - // init - for (u16 i = 0; i < vcount; i++) - { - vc[i].score = 0; - vc[i].cachepos = -1; - vc[i].NumActiveTris = 0; - } - - // First pass: count how many times a vert is used - for (u32 i = 0; i < icount; i += 3) - { - vc[ind[i]].NumActiveTris++; - vc[ind[i + 1]].NumActiveTris++; - vc[ind[i + 2]].NumActiveTris++; - - const u32 tri_ind = i/3; - tc[tri_ind].ind[0] = ind[i]; - tc[tri_ind].ind[1] = ind[i + 1]; - tc[tri_ind].ind[2] = ind[i + 2]; - } - - // Second pass: list of each triangle - for (u32 i = 0; i < tcount; i++) - { - vc[tc[i].ind[0]].tris.push_back(i); - vc[tc[i].ind[1]].tris.push_back(i); - vc[tc[i].ind[2]].tris.push_back(i); - - tc[i].drawn = false; - } - - // Give initial scores - for (u16 i = 0; i < vcount; i++) - { - vc[i].score = FindVertexScore(&vc[i]); - } - for (u32 i = 0; i < tcount; i++) - { - tc[i].score = - vc[tc[i].ind[0]].score + - vc[tc[i].ind[1]].score + - vc[tc[i].ind[2]].score; - } - - switch(mb->getVertexType()) - { - case video::EVT_STANDARD: - { - video::S3DVertex *v = (video::S3DVertex *) mb->getVertices(); - - SMeshBuffer *buf = new SMeshBuffer(); - buf->Material = mb->getMaterial(); - - buf->Vertices.reallocate(vcount); - buf->Indices.reallocate(icount); - - std::map sind; // search index for fast operation - typedef std::map::iterator snode; - - // Main algorithm - u32 highest = 0; - u32 drawcalls = 0; - for (;;) - { - if (tc[highest].drawn) - { - bool found = false; - float hiscore = 0; - for (u32 t = 0; t < tcount; t++) - { - if (!tc[t].drawn) - { - if (tc[t].score > hiscore) - { - highest = t; - hiscore = tc[t].score; - found = true; - } - } - } - if (!found) - break; - } - - // Output the best triangle - u16 newind = buf->Vertices.size(); - - snode s = sind.find(v[tc[highest].ind[0]]); - - if (s == sind.end()) - { - buf->Vertices.push_back(v[tc[highest].ind[0]]); - buf->Indices.push_back(newind); - sind.emplace(v[tc[highest].ind[0]], newind); - newind++; - } - else - { - buf->Indices.push_back(s->second); - } - - s = sind.find(v[tc[highest].ind[1]]); - - if (s == sind.end()) - { - buf->Vertices.push_back(v[tc[highest].ind[1]]); - buf->Indices.push_back(newind); - sind.emplace(v[tc[highest].ind[1]], newind); - newind++; - } - else - { - buf->Indices.push_back(s->second); - } - - s = sind.find(v[tc[highest].ind[2]]); - - if (s == sind.end()) - { - buf->Vertices.push_back(v[tc[highest].ind[2]]); - buf->Indices.push_back(newind); - sind.emplace(v[tc[highest].ind[2]], newind); - } - else - { - buf->Indices.push_back(s->second); - } - - vc[tc[highest].ind[0]].NumActiveTris--; - vc[tc[highest].ind[1]].NumActiveTris--; - vc[tc[highest].ind[2]].NumActiveTris--; - - tc[highest].drawn = true; - - for (u16 j = 0; j < 3; j++) - { - vcache *vert = &vc[tc[highest].ind[j]]; - for (u16 t = 0; t < vert->tris.size(); t++) - { - if (highest == vert->tris[t]) - { - vert->tris.erase(t); - break; - } - } - } - - lru.add(tc[highest].ind[0]); - lru.add(tc[highest].ind[1]); - highest = lru.add(tc[highest].ind[2], true); - drawcalls++; - } - - buf->setBoundingBox(mb->getBoundingBox()); - newmesh->addMeshBuffer(buf); - buf->drop(); - } - break; - case video::EVT_2TCOORDS: - { - video::S3DVertex2TCoords *v = (video::S3DVertex2TCoords *) mb->getVertices(); - - SMeshBufferLightMap *buf = new SMeshBufferLightMap(); - buf->Material = mb->getMaterial(); - - buf->Vertices.reallocate(vcount); - buf->Indices.reallocate(icount); - - std::map sind; // search index for fast operation - typedef std::map::iterator snode; - - // Main algorithm - u32 highest = 0; - u32 drawcalls = 0; - for (;;) - { - if (tc[highest].drawn) - { - bool found = false; - float hiscore = 0; - for (u32 t = 0; t < tcount; t++) - { - if (!tc[t].drawn) - { - if (tc[t].score > hiscore) - { - highest = t; - hiscore = tc[t].score; - found = true; - } - } - } - if (!found) - break; - } - - // Output the best triangle - u16 newind = buf->Vertices.size(); - - snode s = sind.find(v[tc[highest].ind[0]]); - - if (s == sind.end()) - { - buf->Vertices.push_back(v[tc[highest].ind[0]]); - buf->Indices.push_back(newind); - sind.emplace(v[tc[highest].ind[0]], newind); - newind++; - } - else - { - buf->Indices.push_back(s->second); - } - - s = sind.find(v[tc[highest].ind[1]]); - - if (s == sind.end()) - { - buf->Vertices.push_back(v[tc[highest].ind[1]]); - buf->Indices.push_back(newind); - sind.emplace(v[tc[highest].ind[1]], newind); - newind++; - } - else - { - buf->Indices.push_back(s->second); - } - - s = sind.find(v[tc[highest].ind[2]]); - - if (s == sind.end()) - { - buf->Vertices.push_back(v[tc[highest].ind[2]]); - buf->Indices.push_back(newind); - sind.emplace(v[tc[highest].ind[2]], newind); - } - else - { - buf->Indices.push_back(s->second); - } - - vc[tc[highest].ind[0]].NumActiveTris--; - vc[tc[highest].ind[1]].NumActiveTris--; - vc[tc[highest].ind[2]].NumActiveTris--; - - tc[highest].drawn = true; - - for (u16 j = 0; j < 3; j++) - { - vcache *vert = &vc[tc[highest].ind[j]]; - for (u16 t = 0; t < vert->tris.size(); t++) - { - if (highest == vert->tris[t]) - { - vert->tris.erase(t); - break; - } - } - } - - lru.add(tc[highest].ind[0]); - lru.add(tc[highest].ind[1]); - highest = lru.add(tc[highest].ind[2]); - drawcalls++; - } - - buf->setBoundingBox(mb->getBoundingBox()); - newmesh->addMeshBuffer(buf); - buf->drop(); - - } - break; - case video::EVT_TANGENTS: - { - video::S3DVertexTangents *v = (video::S3DVertexTangents *) mb->getVertices(); - - SMeshBufferTangents *buf = new SMeshBufferTangents(); - buf->Material = mb->getMaterial(); - - buf->Vertices.reallocate(vcount); - buf->Indices.reallocate(icount); - - std::map sind; // search index for fast operation - typedef std::map::iterator snode; - - // Main algorithm - u32 highest = 0; - u32 drawcalls = 0; - for (;;) - { - if (tc[highest].drawn) - { - bool found = false; - float hiscore = 0; - for (u32 t = 0; t < tcount; t++) - { - if (!tc[t].drawn) - { - if (tc[t].score > hiscore) - { - highest = t; - hiscore = tc[t].score; - found = true; - } - } - } - if (!found) - break; - } - - // Output the best triangle - u16 newind = buf->Vertices.size(); - - snode s = sind.find(v[tc[highest].ind[0]]); - - if (s == sind.end()) - { - buf->Vertices.push_back(v[tc[highest].ind[0]]); - buf->Indices.push_back(newind); - sind.emplace(v[tc[highest].ind[0]], newind); - newind++; - } - else - { - buf->Indices.push_back(s->second); - } - - s = sind.find(v[tc[highest].ind[1]]); - - if (s == sind.end()) - { - buf->Vertices.push_back(v[tc[highest].ind[1]]); - buf->Indices.push_back(newind); - sind.emplace(v[tc[highest].ind[1]], newind); - newind++; - } - else - { - buf->Indices.push_back(s->second); - } - - s = sind.find(v[tc[highest].ind[2]]); - - if (s == sind.end()) - { - buf->Vertices.push_back(v[tc[highest].ind[2]]); - buf->Indices.push_back(newind); - sind.emplace(v[tc[highest].ind[2]], newind); - } - else - { - buf->Indices.push_back(s->second); - } - - vc[tc[highest].ind[0]].NumActiveTris--; - vc[tc[highest].ind[1]].NumActiveTris--; - vc[tc[highest].ind[2]].NumActiveTris--; - - tc[highest].drawn = true; - - for (u16 j = 0; j < 3; j++) - { - vcache *vert = &vc[tc[highest].ind[j]]; - for (u16 t = 0; t < vert->tris.size(); t++) - { - if (highest == vert->tris[t]) - { - vert->tris.erase(t); - break; - } - } - } - - lru.add(tc[highest].ind[0]); - lru.add(tc[highest].ind[1]); - highest = lru.add(tc[highest].ind[2]); - drawcalls++; - } - - buf->setBoundingBox(mb->getBoundingBox()); - newmesh->addMeshBuffer(buf); - buf->drop(); - } - break; - } - - delete [] vc; - delete [] tc; - - } // for each meshbuffer - - return newmesh; -} } // end namespace scene } // end namespace irr diff --git a/source/Irrlicht/CMeshManipulator.h b/source/Irrlicht/CMeshManipulator.h index c7518a67..eb17d8bc 100644 --- a/source/Irrlicht/CMeshManipulator.h +++ b/source/Irrlicht/CMeshManipulator.h @@ -20,11 +20,6 @@ not intended for doing mesh modifications and/or animations during runtime. class CMeshManipulator : public IMeshManipulator { public: - //! Flips the direction of surfaces. - /** Changes backfacing triangles to frontfacing triangles and vice versa. - \param mesh: Mesh on which the operation is performed. */ - virtual void flipSurfaces(scene::IMesh* mesh) const _IRR_OVERRIDE_; - //! Recalculates all normals of the mesh. /** \param mesh: Mesh on which the operation is performed. \param smooth: Whether to use smoothed normals. */ @@ -38,43 +33,6 @@ public: //! Clones a static IMesh into a modifiable SMesh. virtual SMesh* createMeshCopy(scene::IMesh* mesh) const _IRR_OVERRIDE_; - //! Creates a planar texture mapping on the mesh - /** \param mesh: Mesh on which the operation is performed. - \param resolution: resolution of the planar mapping. This is the value - specifying which is the relation between world space and - texture coordinate space. */ - virtual void makePlanarTextureMapping(scene::IMesh* mesh, f32 resolution=0.001f) const _IRR_OVERRIDE_; - - //! Creates a planar texture mapping on the meshbuffer - virtual void makePlanarTextureMapping(scene::IMeshBuffer* meshbuffer, f32 resolution=0.001f) const _IRR_OVERRIDE_; - - //! Creates a planar texture mapping on the meshbuffer - void makePlanarTextureMapping(scene::IMeshBuffer* buffer, f32 resolutionS, f32 resolutionT, u8 axis, const core::vector3df& offset) const _IRR_OVERRIDE_; - - //! Creates a planar texture mapping on the mesh - void makePlanarTextureMapping(scene::IMesh* mesh, f32 resolutionS, f32 resolutionT, u8 axis, const core::vector3df& offset) const _IRR_OVERRIDE_; - - //! Recalculates tangents, requires a tangent mesh buffer - virtual void recalculateTangents(IMeshBuffer* buffer, bool recalculateNormals=false, bool smooth=false, bool angleWeighted=false) const _IRR_OVERRIDE_; - - //! Recalculates tangents, requires a tangent mesh - virtual void recalculateTangents(IMesh* mesh, bool recalculateNormals=false, bool smooth=false, bool angleWeighted=false) const _IRR_OVERRIDE_; - - //! Creates a copy of the mesh, which will only consist of S3DVertexTangents vertices. - virtual IMesh* createMeshWithTangents(IMesh* mesh, bool recalculateNormals=false, bool smooth=false, bool angleWeighted=false, bool recalculateTangents=true) const _IRR_OVERRIDE_; - - //! Creates a copy of the mesh, which will only consist of S3D2TCoords vertices. - virtual IMesh* createMeshWith2TCoords(IMesh* mesh) const _IRR_OVERRIDE_; - - //! Creates a copy of the mesh, which will only consist of S3DVertex vertices. - virtual IMesh* createMeshWith1TCoords(IMesh* mesh) const _IRR_OVERRIDE_; - - //! Creates a copy of the mesh, which will only consist of unique triangles, i.e. no vertices are shared. - virtual IMesh* createMeshUniquePrimitives(IMesh* mesh) const _IRR_OVERRIDE_; - - //! Creates a copy of the mesh, which will have all duplicated vertices removed, i.e. maximal amount of vertices are shared via indexing. - virtual IMesh* createMeshWelded(IMesh *mesh, f32 tolerance=core::ROUNDING_ERROR_f32) const _IRR_OVERRIDE_; - //! Returns amount of polygons in mesh. virtual s32 getPolyCount(scene::IMesh* mesh) const _IRR_OVERRIDE_; @@ -83,15 +41,6 @@ public: //! create a new AnimatedMesh and adds the mesh to it virtual IAnimatedMesh * createAnimatedMesh(scene::IMesh* mesh,scene::E_ANIMATED_MESH_TYPE type) const _IRR_OVERRIDE_; - - //! create a mesh optimized for the vertex cache - virtual IMesh* createForsythOptimizedMesh(const scene::IMesh *mesh) const _IRR_OVERRIDE_; - - //! Optimizes the mesh using an algorithm tuned for heightmaps - virtual void heightmapOptimizeMesh(IMesh * const m, const f32 tolerance = core::ROUNDING_ERROR_f32) const _IRR_OVERRIDE_; - - //! Optimizes the mesh using an algorithm tuned for heightmaps - virtual void heightmapOptimizeMesh(IMeshBuffer * const m, const f32 tolerance = core::ROUNDING_ERROR_f32) const _IRR_OVERRIDE_; }; } // end namespace scene diff --git a/source/Irrlicht/CMountPointReader.cpp b/source/Irrlicht/CMountPointReader.cpp deleted file mode 100644 index 1f5049db..00000000 --- a/source/Irrlicht/CMountPointReader.cpp +++ /dev/null @@ -1,175 +0,0 @@ -// 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 - -#include "CMountPointReader.h" - -#ifdef __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_ - -#include "CReadFile.h" -#include "os.h" - -namespace irr -{ -namespace io -{ - -//! Constructor -CArchiveLoaderMount::CArchiveLoaderMount( io::IFileSystem* fs) -: FileSystem(fs) -{ - #ifdef _DEBUG - setDebugName("CArchiveLoaderMount"); - #endif -} - - -//! returns true if the file maybe is able to be loaded by this class -bool CArchiveLoaderMount::isALoadableFileFormat(const io::path& filename) const -{ - io::path fname(filename); - deletePathFromFilename(fname); - - if (!fname.size()) - return true; - IFileList* list = FileSystem->createFileList(); - bool ret = false; - if (list) - { - // check if name is found as directory - if (list->findFile(filename, true)) - ret=true; - list->drop(); - } - return ret; -} - -//! Check to see if the loader can create archives of this type. -bool CArchiveLoaderMount::isALoadableFileFormat(E_FILE_ARCHIVE_TYPE fileType) const -{ - return fileType == EFAT_FOLDER; -} - -//! Check if the file might be loaded by this class -bool CArchiveLoaderMount::isALoadableFileFormat(io::IReadFile* file) const -{ - return false; -} - -//! Creates an archive from the filename -IFileArchive* CArchiveLoaderMount::createArchive(const io::path& filename, bool ignoreCase, bool ignorePaths) const -{ - IFileArchive *archive = 0; - - EFileSystemType current = FileSystem->setFileListSystem(FILESYSTEM_NATIVE); - - const io::path save = FileSystem->getWorkingDirectory(); - io::path fullPath = FileSystem->getAbsolutePath(filename); - FileSystem->flattenFilename(fullPath); - - if (FileSystem->changeWorkingDirectoryTo(fullPath)) - { - archive = new CMountPointReader(FileSystem, fullPath, ignoreCase, ignorePaths); - } - - FileSystem->changeWorkingDirectoryTo(save); - FileSystem->setFileListSystem(current); - - return archive; -} - -//! creates/loads an archive from the file. -//! \return Pointer to the created archive. Returns 0 if loading failed. -IFileArchive* CArchiveLoaderMount::createArchive(io::IReadFile* file, bool ignoreCase, bool ignorePaths) const -{ - return 0; -} - -//! compatible Folder Architecture -CMountPointReader::CMountPointReader(IFileSystem * parent, const io::path& basename, bool ignoreCase, bool ignorePaths) - : CFileList(basename, ignoreCase, ignorePaths), Parent(parent) -{ - //! ensure CFileList path ends in a slash - if (Path.lastChar() != '/' ) - Path.append('/'); - - const io::path& work = Parent->getWorkingDirectory(); - - Parent->changeWorkingDirectoryTo(basename); - buildDirectory(); - Parent->changeWorkingDirectoryTo(work); - - sort(); -} - - -//! returns the list of files -const IFileList* CMountPointReader::getFileList() const -{ - return this; -} - -void CMountPointReader::buildDirectory() -{ - IFileList * list = Parent->createFileList(); - if (!list) - return; - - const u32 size = list->getFileCount(); - for (u32 i=0; i < size; ++i) - { - io::path full = list->getFullFileName(i); - full = full.subString(Path.size(), full.size() - Path.size()); - - if (!list->isDirectory(i)) - { - addItem(full, list->getFileOffset(i), list->getFileSize(i), false, RealFileNames.size()); - RealFileNames.push_back(list->getFullFileName(i)); - } - else - { - const io::path rel = list->getFileName(i); - RealFileNames.push_back(list->getFullFileName(i)); - - io::path pwd = Parent->getWorkingDirectory(); - if (pwd.lastChar() != '/') - pwd.append('/'); - pwd.append(rel); - - if ( rel != "." && rel != ".." ) - { - addItem(full, 0, 0, true, 0); - Parent->changeWorkingDirectoryTo(pwd); - buildDirectory(); - Parent->changeWorkingDirectoryTo(".."); - } - } - } - - list->drop(); -} - -//! opens a file by index -IReadFile* CMountPointReader::createAndOpenFile(u32 index) -{ - if (index >= Files.size()) - return 0; - - return CReadFile::createReadFile(RealFileNames[Files[index].ID]); -} - -//! opens a file by file name -IReadFile* CMountPointReader::createAndOpenFile(const io::path& filename) -{ - s32 index = findFile(filename, false); - if (index != -1) - return createAndOpenFile(index); - else - return 0; -} - - -} // io -} // irr - -#endif // __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_ diff --git a/source/Irrlicht/CMountPointReader.h b/source/Irrlicht/CMountPointReader.h deleted file mode 100644 index 24f49720..00000000 --- a/source/Irrlicht/CMountPointReader.h +++ /dev/null @@ -1,92 +0,0 @@ -// 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 __C_MOUNT_READER_H_INCLUDED__ -#define __C_MOUNT_READER_H_INCLUDED__ - -#include "IrrCompileConfig.h" - -#ifdef __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_ - -#include "IFileSystem.h" -#include "CFileList.h" - -namespace irr -{ -namespace io -{ - - //! Archiveloader capable of loading MountPoint Archives - class CArchiveLoaderMount : public IArchiveLoader - { - public: - - //! Constructor - CArchiveLoaderMount(io::IFileSystem* fs); - - //! returns true if the file maybe is able to be loaded by this class - //! based on the file extension (e.g. ".zip") - virtual bool isALoadableFileFormat(const io::path& filename) const _IRR_OVERRIDE_; - - //! Check if the file might be loaded by this class - /** Check might look into the file. - \param file File handle to check. - \return True if file seems to be loadable. */ - virtual bool isALoadableFileFormat(io::IReadFile* file) const _IRR_OVERRIDE_; - - //! Check to see if the loader can create archives of this type. - /** Check based on the archive type. - \param fileType The archive type to check. - \return True if the archile loader supports this type, false if not */ - virtual bool isALoadableFileFormat(E_FILE_ARCHIVE_TYPE fileType) const _IRR_OVERRIDE_; - - //! Creates an archive from the filename - /** \param file File handle to check. - \return Pointer to newly created archive, or 0 upon error. */ - virtual IFileArchive* createArchive(const io::path& filename, bool ignoreCase, bool ignorePaths) const _IRR_OVERRIDE_; - - //! creates/loads an archive from the file. - //! \return Pointer to the created archive. Returns 0 if loading failed. - virtual IFileArchive* createArchive(io::IReadFile* file, bool ignoreCase, bool ignorePaths) const _IRR_OVERRIDE_; - - private: - io::IFileSystem* FileSystem; - }; - - //! A File Archive which uses a mountpoint - class CMountPointReader : public virtual IFileArchive, virtual CFileList - { - public: - - //! Constructor - CMountPointReader(IFileSystem *parent, const io::path& basename, - bool ignoreCase, bool ignorePaths); - - //! opens a file by index - virtual IReadFile* createAndOpenFile(u32 index) _IRR_OVERRIDE_; - - //! opens a file by file name - virtual IReadFile* createAndOpenFile(const io::path& filename) _IRR_OVERRIDE_; - - //! returns the list of files - virtual const IFileList* getFileList() const _IRR_OVERRIDE_; - - //! get the class Type - virtual E_FILE_ARCHIVE_TYPE getType() const _IRR_OVERRIDE_ { return EFAT_FOLDER; } - - //! return the name (id) of the file Archive - virtual const io::path& getArchiveName() const _IRR_OVERRIDE_ {return Path;} - - private: - - core::array RealFileNames; - - IFileSystem *Parent; - void buildDirectory(); - }; -} // io -} // irr - -#endif // __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_ -#endif // __C_MOUNT_READER_H_INCLUDED__ diff --git a/source/Irrlicht/CNullDriver.cpp b/source/Irrlicht/CNullDriver.cpp index 98b2bf77..775a22c9 100644 --- a/source/Irrlicht/CNullDriver.cpp +++ b/source/Irrlicht/CNullDriver.cpp @@ -97,7 +97,6 @@ CNullDriver::CNullDriver(io::IFileSystem* io, const core::dimension2d& scre DriverAttributes = new io::CAttributes(); DriverAttributes->addInt("MaxTextures", _IRR_MATERIAL_MAX_TEXTURES_); DriverAttributes->addInt("MaxSupportedTextures", _IRR_MATERIAL_MAX_TEXTURES_); - DriverAttributes->addInt("MaxLights", getMaximalDynamicLightAmount()); DriverAttributes->addInt("MaxAnisotropy", 1); // DriverAttributes->addInt("MaxUserClipPlanes", 0); // DriverAttributes->addInt("MaxAuxBuffers", 0); @@ -1095,61 +1094,6 @@ void CNullDriver::drawStencilShadow(bool clearStencilBuffer, } -//! deletes all dynamic lights there are -void CNullDriver::deleteAllDynamicLights() -{ - Lights.set_used(0); -} - - -//! adds a dynamic light -s32 CNullDriver::addDynamicLight(const SLight& light) -{ - Lights.push_back(light); - return Lights.size() - 1; -} - -//! Turns a dynamic light on or off -//! \param lightIndex: the index returned by addDynamicLight -//! \param turnOn: true to turn the light on, false to turn it off -void CNullDriver::turnLightOn(s32 lightIndex, bool turnOn) -{ - // Do nothing -} - - -//! returns the maximal amount of dynamic lights the device can handle -u32 CNullDriver::getMaximalDynamicLightAmount() const -{ - return 0; -} - - -//! Returns current amount of dynamic lights set -//! \return Current amount of dynamic lights set -u32 CNullDriver::getDynamicLightCount() const -{ - return Lights.size(); -} - - -//! Returns light data which was previously set by IVideoDriver::addDynamicLight(). -//! \param idx: Zero based index of the light. Must be greater than 0 and smaller -//! than IVideoDriver()::getDynamicLightCount. -//! \return Light data. -const SLight& CNullDriver::getDynamicLight(u32 idx) const -{ - if ( idx < Lights.size() ) - return Lights[idx]; - else - { - _IRR_DEBUG_BREAK_IF(true) - static const SLight dummy; - return dummy; - } -} - - //! Creates a boolean alpha channel of the texture based of an color key. void CNullDriver::makeColorKeyTexture(video::ITexture* texture, video::SColor color, diff --git a/source/Irrlicht/CNullDriver.h b/source/Irrlicht/CNullDriver.h index 85f484b9..d73f96ea 100644 --- a/source/Irrlicht/CNullDriver.h +++ b/source/Irrlicht/CNullDriver.h @@ -18,7 +18,6 @@ #include "CFPSCounter.h" #include "S3DVertex.h" #include "SVertexIndex.h" -#include "SLight.h" #include "SExposedVideoData.h" #include @@ -249,22 +248,6 @@ namespace video //! very useful method for statistics. virtual u32 getPrimitiveCountDrawn( u32 param = 0 ) const _IRR_OVERRIDE_; - //! deletes all dynamic lights there are - virtual void deleteAllDynamicLights() _IRR_OVERRIDE_; - - //! adds a dynamic light, returning an index to the light - //! \param light: the light data to use to create the light - //! \return An index to the light, or -1 if an error occurs - virtual s32 addDynamicLight(const SLight& light) _IRR_OVERRIDE_; - - //! Turns a dynamic light on or off - //! \param lightIndex: the index returned by addDynamicLight - //! \param turnOn: true to turn the light on, false to turn it off - virtual void turnLightOn(s32 lightIndex, bool turnOn) _IRR_OVERRIDE_; - - //! returns the maximal amount of dynamic lights the device can handle - virtual u32 getMaximalDynamicLightAmount() const _IRR_OVERRIDE_; - //! \return Returns the name of the video driver. Example: In case of the DIRECT3D8 //! driver, it would return "Direct3D8.1". virtual const wchar_t* getName() const _IRR_OVERRIDE_; @@ -298,15 +281,6 @@ namespace video video::SColor leftDownEdge = video::SColor(0,0,0,0), video::SColor rightDownEdge = video::SColor(0,0,0,0)) _IRR_OVERRIDE_; - //! Returns current amount of dynamic lights set - //! \return Current amount of dynamic lights set - virtual u32 getDynamicLightCount() const _IRR_OVERRIDE_; - - //! Returns light data which was previously set with IVideDriver::addDynamicLight(). - //! \param idx: Zero based index of the light. Must be greater than 0 and smaller - //! than IVideoDriver()::getDynamicLightCount. - //! \return Light data. - virtual const SLight& getDynamicLight(u32 idx) const _IRR_OVERRIDE_; //! Removes a texture from the texture cache and deletes it, freeing lot of //! memory. @@ -819,7 +793,6 @@ namespace video core::array SurfaceLoader; core::array SurfaceWriter; - core::array Lights; core::array MaterialRenderers; std::list HWBufferList; diff --git a/source/Irrlicht/COGLES2Driver.cpp b/source/Irrlicht/COGLES2Driver.cpp index 57145aab..80f806ff 100644 --- a/source/Irrlicht/COGLES2Driver.cpp +++ b/source/Irrlicht/COGLES2Driver.cpp @@ -81,8 +81,6 @@ COGLES2Driver::COGLES2Driver(const SIrrlichtCreationParameters& params, io::IFil COGLES2Driver::~COGLES2Driver() { - RequestedLights.clear(); - deleteMaterialRenders(); CacheHandler->getTextureCache().clear(); @@ -2007,46 +2005,6 @@ COGLES2Driver::~COGLES2Driver() return Name.c_str(); } - - //! deletes all dynamic lights there are - void COGLES2Driver::deleteAllDynamicLights() - { - RequestedLights.clear(); - CNullDriver::deleteAllDynamicLights(); - } - - - //! adds a dynamic light - s32 COGLES2Driver::addDynamicLight(const SLight& light) - { - CNullDriver::addDynamicLight(light); - - RequestedLights.push_back(RequestedLight(light)); - - u32 newLightIndex = RequestedLights.size() - 1; - - return (s32)newLightIndex; - } - - //! Turns a dynamic light on or off - //! \param lightIndex: the index returned by addDynamicLight - //! \param turnOn: true to turn the light on, false to turn it off - void COGLES2Driver::turnLightOn(s32 lightIndex, bool turnOn) - { - if (lightIndex < 0 || lightIndex >= (s32)RequestedLights.size()) - return; - - RequestedLight & requestedLight = RequestedLights[lightIndex]; - requestedLight.DesireToBeOn = turnOn; - } - - - //! returns the maximal amount of dynamic lights the device can handle - u32 COGLES2Driver::getMaximalDynamicLightAmount() const - { - return 8; - } - void COGLES2Driver::setViewPort(const core::rect& area) { core::rect vp = area; diff --git a/source/Irrlicht/COGLES2Driver.h b/source/Irrlicht/COGLES2Driver.h index b0d734a2..6ca303bc 100644 --- a/source/Irrlicht/COGLES2Driver.h +++ b/source/Irrlicht/COGLES2Driver.h @@ -19,14 +19,6 @@ #include "COGLES2ExtensionHandler.h" #include "IContextManager.h" -#if defined(_IRR_WINDOWS_API_) -// include windows headers for HWND -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include -#endif - namespace irr { namespace video @@ -158,20 +150,6 @@ namespace video //! Returns the name of the video driver. virtual const wchar_t* getName() const _IRR_OVERRIDE_; - //! deletes all dynamic lights there are - virtual void deleteAllDynamicLights() _IRR_OVERRIDE_; - - //! adds a dynamic light - virtual s32 addDynamicLight(const SLight& light) _IRR_OVERRIDE_; - - //! Turns a dynamic light on or off - /** \param lightIndex: the index returned by addDynamicLight - \param turnOn: true to turn the light on, false to turn it off */ - virtual void turnLightOn(s32 lightIndex, bool turnOn) _IRR_OVERRIDE_; - - //! returns the maximal amount of dynamic lights the device can handle - virtual u32 getMaximalDynamicLightAmount() const _IRR_OVERRIDE_; - //! Returns the maximum texture size supported. virtual core::dimension2du getMaxTextureSize() const _IRR_OVERRIDE_; @@ -421,19 +399,6 @@ private: //! Color buffer format ECOLOR_FORMAT ColorFormat; - //! All the lights that have been requested; a hardware limited - //! number of them will be used at once. - struct RequestedLight - { - RequestedLight(SLight const & lightData) - : LightData(lightData), DesireToBeOn(true) { } - - SLight LightData; - bool DesireToBeOn; - }; - - core::array RequestedLights; - IContextManager* ContextManager; }; diff --git a/source/Irrlicht/COGLES2FixedPipelineRenderer.cpp b/source/Irrlicht/COGLES2FixedPipelineRenderer.cpp index 369e422d..5b275d37 100644 --- a/source/Irrlicht/COGLES2FixedPipelineRenderer.cpp +++ b/source/Irrlicht/COGLES2FixedPipelineRenderer.cpp @@ -7,7 +7,6 @@ #ifdef _IRR_COMPILE_WITH_OGLES2_ #include "IVideoDriver.h" -#include "SLight.h" namespace irr { @@ -17,21 +16,11 @@ namespace video // Base callback COGLES2MaterialBaseCB::COGLES2MaterialBaseCB() : - FirstUpdateBase(true), WVPMatrixID(-1), WVMatrixID(-1), NMatrixID(-1), GlobalAmbientID(-1), MaterialAmbientID(-1), MaterialDiffuseID(-1), MaterialEmissiveID(-1), MaterialSpecularID(-1), MaterialShininessID(-1), LightCountID(-1), LightTypeID(-1), - LightPositionID(-1), LightDirectionID(-1), LightAttenuationID(-1), LightAmbientID(-1), LightDiffuseID(-1), LightSpecularID(-1), FogEnableID(-1), FogTypeID(-1), FogColorID(-1), FogStartID(-1), + FirstUpdateBase(true), WVPMatrixID(-1), WVMatrixID(-1), NMatrixID(-1), GlobalAmbientID(-1), MaterialAmbientID(-1), MaterialDiffuseID(-1), MaterialEmissiveID(-1), MaterialSpecularID(-1), MaterialShininessID(-1), + FogEnableID(-1), FogTypeID(-1), FogColorID(-1), FogStartID(-1), FogEndID(-1), FogDensityID(-1), ThicknessID(-1), LightEnable(false), MaterialAmbient(SColorf(0.f, 0.f, 0.f)), MaterialDiffuse(SColorf(0.f, 0.f, 0.f)), MaterialEmissive(SColorf(0.f, 0.f, 0.f)), MaterialSpecular(SColorf(0.f, 0.f, 0.f)), MaterialShininess(0.f), FogEnable(0), FogType(1), FogColor(SColorf(0.f, 0.f, 0.f, 1.f)), FogStart(0.f), FogEnd(0.f), FogDensity(0.f), Thickness(1.f) { - for (u32 i = 0; i < 8; ++i) - { - LightType[i] = 0; - LightPosition[i] = core::vector3df(0.f, 0.f, 0.f); - LightDirection[i] = core::vector3df(0.f, 0.f, 0.f); - LightAttenuation[i] = core::vector3df(0.f, 0.f, 0.f); - LightAmbient[i] = SColorf(0.f, 0.f, 0.f); - LightDiffuse[i] = SColorf(0.f, 0.f, 0.f); - LightSpecular[i] = SColorf(0.f, 0.f, 0.f); - } } void COGLES2MaterialBaseCB::OnSetMaterial(const SMaterial& material) @@ -63,14 +52,6 @@ void COGLES2MaterialBaseCB::OnSetConstants(IMaterialRendererServices* services, MaterialEmissiveID = services->getVertexShaderConstantID("uMaterialEmissive"); MaterialSpecularID = services->getVertexShaderConstantID("uMaterialSpecular"); MaterialShininessID = services->getVertexShaderConstantID("uMaterialShininess"); - LightCountID = services->getVertexShaderConstantID("uLightCount"); - LightTypeID = services->getVertexShaderConstantID("uLightType"); - LightPositionID = services->getVertexShaderConstantID("uLightPosition"); - LightDirectionID = services->getVertexShaderConstantID("uLightDirection"); - LightAttenuationID = services->getVertexShaderConstantID("uLightAttenuation"); - LightAmbientID = services->getVertexShaderConstantID("uLightAmbient"); - LightDiffuseID = services->getVertexShaderConstantID("uLightDiffuse"); - LightSpecularID = services->getVertexShaderConstantID("uLightSpecular"); FogEnableID = services->getVertexShaderConstantID("uFogEnable"); FogTypeID = services->getVertexShaderConstantID("uFogType"); FogColorID = services->getVertexShaderConstantID("uFogColor"); @@ -95,60 +76,6 @@ void COGLES2MaterialBaseCB::OnSetConstants(IMaterialRendererServices* services, Matrix.makeInverse(); services->setPixelShaderConstant(NMatrixID, Matrix.getTransposed().pointer(), 16); - s32 LightCount = LightEnable ? driver->getDynamicLightCount() : 0; - services->setPixelShaderConstant(LightCountID, &LightCount, 1); - - if (LightCount > 0) - { - video::SColorf globalAmbient(driver->getAmbientLight()); - services->setVertexShaderConstant(GlobalAmbientID, reinterpret_cast(&globalAmbient), 4); - - // TODO: this are all vertex shader constants, why are they all set as pixel shader constants? (it currently works so I'm scared to change it...) - services->setPixelShaderConstant(MaterialAmbientID, reinterpret_cast(&MaterialAmbient), 4); - services->setPixelShaderConstant(MaterialDiffuseID, reinterpret_cast(&MaterialDiffuse), 4); - services->setPixelShaderConstant(MaterialEmissiveID, reinterpret_cast(&MaterialEmissive), 4); - services->setPixelShaderConstant(MaterialSpecularID, reinterpret_cast(&MaterialSpecular), 4); - services->setPixelShaderConstant(MaterialShininessID, &MaterialShininess, 1); - - Matrix = V; - - for (s32 i = 0; i < LightCount; ++i) - { - SLight CurrentLight = driver->getDynamicLight(i); - - Matrix.transformVect(CurrentLight.Position); - - switch (CurrentLight.Type) - { - case ELT_DIRECTIONAL: - LightType[i] = 2; - break; - case ELT_SPOT: - LightType[i] = 1; - break; - default: // ELT_POINT - LightType[i] = 0; - break; - } - - LightPosition[i] = CurrentLight.Position; - LightDirection[i] = CurrentLight.Direction; - LightAttenuation[i] = CurrentLight.Attenuation; - LightAmbient[i] = CurrentLight.AmbientColor; - LightDiffuse[i] = CurrentLight.DiffuseColor; - LightSpecular[i] = CurrentLight.SpecularColor; - } - - const int MAX_SHADER_LIGHTS = 8; // must be the same as MAX_LIGHTS define in the shader - services->setPixelShaderConstant(LightTypeID, LightType, MAX_SHADER_LIGHTS); - services->setPixelShaderConstant(LightPositionID, reinterpret_cast(LightPosition), 3*MAX_SHADER_LIGHTS); - services->setPixelShaderConstant(LightDirectionID, reinterpret_cast(LightDirection), 3*MAX_SHADER_LIGHTS); - services->setPixelShaderConstant(LightAttenuationID, reinterpret_cast(LightAttenuation), 3*MAX_SHADER_LIGHTS); - services->setPixelShaderConstant(LightAmbientID, reinterpret_cast(LightAmbient), 4*MAX_SHADER_LIGHTS); - services->setPixelShaderConstant(LightDiffuseID, reinterpret_cast(LightDiffuse), 4*MAX_SHADER_LIGHTS); - services->setPixelShaderConstant(LightSpecularID, reinterpret_cast(LightSpecular), 4*MAX_SHADER_LIGHTS); - } - services->setPixelShaderConstant(FogEnableID, &FogEnable, 1); if (FogEnable) diff --git a/source/Irrlicht/COGLES2FixedPipelineRenderer.h b/source/Irrlicht/COGLES2FixedPipelineRenderer.h index 78ae4939..f5882f17 100644 --- a/source/Irrlicht/COGLES2FixedPipelineRenderer.h +++ b/source/Irrlicht/COGLES2FixedPipelineRenderer.h @@ -39,15 +39,6 @@ protected: s32 MaterialSpecularID; s32 MaterialShininessID; - s32 LightCountID; - s32 LightTypeID; - s32 LightPositionID; - s32 LightDirectionID; - s32 LightAttenuationID; - s32 LightAmbientID; - s32 LightDiffuseID; - s32 LightSpecularID; - s32 FogEnableID; s32 FogTypeID; s32 FogColorID; @@ -65,14 +56,6 @@ protected: SColorf MaterialSpecular; f32 MaterialShininess; - s32 LightType[8]; - core::vector3df LightPosition[8]; - core::vector3df LightDirection[8]; - core::vector3df LightAttenuation[8]; - SColorf LightAmbient[8]; - SColorf LightDiffuse[8]; - SColorf LightSpecular[8]; - s32 FogEnable; s32 FogType; SColorf FogColor; diff --git a/source/Irrlicht/COGLESDriver.cpp b/source/Irrlicht/COGLESDriver.cpp index 4ee95eab..123e2ae2 100644 --- a/source/Irrlicht/COGLESDriver.cpp +++ b/source/Irrlicht/COGLESDriver.cpp @@ -56,8 +56,6 @@ COGLES1Driver::COGLES1Driver(const SIrrlichtCreationParameters& params, io::IFil COGLES1Driver::~COGLES1Driver() { - RequestedLights.clear(); - deleteMaterialRenders(); CacheHandler->getTextureCache().clear(); @@ -2122,177 +2120,6 @@ const wchar_t* COGLES1Driver::getName() const } -//! deletes all dynamic lights there are -void COGLES1Driver::deleteAllDynamicLights() -{ - for (s32 i=0; i= (s32)RequestedLights.size()) - return; - - RequestedLight & requestedLight = RequestedLights[lightIndex]; - - requestedLight.DesireToBeOn = turnOn; - - if(turnOn) - { - if(-1 == requestedLight.HardwareLightIndex) - assignHardwareLight(lightIndex); - } - else - { - if(-1 != requestedLight.HardwareLightIndex) - { - // It's currently assigned, so free up the hardware light - glDisable(requestedLight.HardwareLightIndex); - requestedLight.HardwareLightIndex = -1; - - // Now let the first light that's waiting on a free hardware light grab it - for(u32 requested = 0; requested < RequestedLights.size(); ++requested) - if(RequestedLights[requested].DesireToBeOn - && - -1 == RequestedLights[requested].HardwareLightIndex) - { - assignHardwareLight(requested); - break; - } - } - } -} - - -//! returns the maximal amount of dynamic lights the device can handle -u32 COGLES1Driver::getMaximalDynamicLightAmount() const -{ - return MaxLights; -} - - //! Sets the dynamic ambient light color. void COGLES1Driver::setAmbientLight(const SColorf& color) { diff --git a/source/Irrlicht/COGLESDriver.h b/source/Irrlicht/COGLESDriver.h index 2e04848e..ee01fa77 100644 --- a/source/Irrlicht/COGLESDriver.h +++ b/source/Irrlicht/COGLESDriver.h @@ -18,14 +18,6 @@ #include "COGLESExtensionHandler.h" #include "IContextManager.h" -#if defined(_IRR_WINDOWS_API_) -// include windows headers for HWND -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include -#endif - namespace irr { namespace video @@ -149,20 +141,6 @@ namespace video //! Returns the name of the video driver. virtual const wchar_t* getName() const _IRR_OVERRIDE_; - //! deletes all dynamic lights there are - virtual void deleteAllDynamicLights() _IRR_OVERRIDE_; - - //! adds a dynamic light - virtual s32 addDynamicLight(const SLight& light) _IRR_OVERRIDE_; - - //! Turns a dynamic light on or off - //! \param lightIndex: the index returned by addDynamicLight - //! \param turnOn: true to turn the light on, false to turn it off - virtual void turnLightOn(s32 lightIndex, bool turnOn) _IRR_OVERRIDE_; - - //! returns the maximal amount of dynamic lights the device can handle - virtual u32 getMaximalDynamicLightAmount() const _IRR_OVERRIDE_; - //! Sets the dynamic ambient light color. virtual void setAmbientLight(const SColorf& color) _IRR_OVERRIDE_; @@ -374,19 +352,6 @@ namespace video SIrrlichtCreationParameters Params; - //! All the lights that have been requested; a hardware limited - //! number of them will be used at once. - struct RequestedLight - { - RequestedLight(SLight const & lightData) - : LightData(lightData), HardwareLightIndex(-1), DesireToBeOn(true) { } - - SLight LightData; - s32 HardwareLightIndex; // GL_LIGHT0 - GL_LIGHT7 - bool DesireToBeOn; - }; - core::array RequestedLights; - IContextManager* ContextManager; }; diff --git a/source/Irrlicht/COpenGLDriver.cpp b/source/Irrlicht/COpenGLDriver.cpp index 8883a3e4..81c7250a 100644 --- a/source/Irrlicht/COpenGLDriver.cpp +++ b/source/Irrlicht/COpenGLDriver.cpp @@ -59,8 +59,6 @@ bool COpenGLDriver::initDriver() //! destructor COpenGLDriver::~COpenGLDriver() { - RequestedLights.clear(); - deleteMaterialRenders(); CacheHandler->getTextureCache().clear(); @@ -2984,177 +2982,6 @@ const wchar_t* COpenGLDriver::getName() const } -//! deletes all dynamic lights there are -void COpenGLDriver::deleteAllDynamicLights() -{ - for (s32 i=0; i= (s32)RequestedLights.size()) - return; - - RequestedLight & requestedLight = RequestedLights[lightIndex]; - - requestedLight.DesireToBeOn = turnOn; - - if(turnOn) - { - if(-1 == requestedLight.HardwareLightIndex) - assignHardwareLight(lightIndex); - } - else - { - if(-1 != requestedLight.HardwareLightIndex) - { - // It's currently assigned, so free up the hardware light - glDisable(requestedLight.HardwareLightIndex); - requestedLight.HardwareLightIndex = -1; - - // Now let the first light that's waiting on a free hardware light grab it - for(u32 requested = 0; requested < RequestedLights.size(); ++requested) - if(RequestedLights[requested].DesireToBeOn - && - -1 == RequestedLights[requested].HardwareLightIndex) - { - assignHardwareLight(requested); - break; - } - } - } -} - - -//! returns the maximal amount of dynamic lights the device can handle -u32 COpenGLDriver::getMaximalDynamicLightAmount() const -{ - return MaxLights; -} - - //! Sets the dynamic ambient light color. The default color is //! (0,0,0,0) which means it is dark. //! \param color: New color of the ambient light. diff --git a/source/Irrlicht/COpenGLDriver.h b/source/Irrlicht/COpenGLDriver.h index a82f6837..7121549b 100644 --- a/source/Irrlicht/COpenGLDriver.h +++ b/source/Irrlicht/COpenGLDriver.h @@ -210,22 +210,6 @@ namespace video //! driver, it would return "Direct3D8.1". virtual const wchar_t* getName() const _IRR_OVERRIDE_; - //! deletes all dynamic lights there are - virtual void deleteAllDynamicLights() _IRR_OVERRIDE_; - - //! adds a dynamic light, returning an index to the light - //! \param light: the light data to use to create the light - //! \return An index to the light, or -1 if an error occurs - virtual s32 addDynamicLight(const SLight& light) _IRR_OVERRIDE_; - - //! Turns a dynamic light on or off - //! \param lightIndex: the index returned by addDynamicLight - //! \param turnOn: true to turn the light on, false to turn it off - virtual void turnLightOn(s32 lightIndex, bool turnOn) _IRR_OVERRIDE_; - - //! returns the maximal amount of dynamic lights the device can handle - virtual u32 getMaximalDynamicLightAmount() const _IRR_OVERRIDE_; - //! Sets the dynamic ambient light color. The default color is //! (0,0,0,0) which means it is dark. //! \param color: New color of the ambient light. @@ -497,19 +481,6 @@ namespace video SIrrlichtCreationParameters Params; - //! All the lights that have been requested; a hardware limited - //! number of them will be used at once. - struct RequestedLight - { - RequestedLight(SLight const & lightData) - : LightData(lightData), HardwareLightIndex(-1), DesireToBeOn(true) { } - - SLight LightData; - s32 HardwareLightIndex; // GL_LIGHT0 - GL_LIGHT7 - bool DesireToBeOn; - }; - core::array RequestedLights; - //! Built-in 2D quad for 2D rendering. S3DVertex Quad2DVertices[4]; static const u16 Quad2DIndices[4]; diff --git a/source/Irrlicht/CSceneManager.cpp b/source/Irrlicht/CSceneManager.cpp index 0e497893..44f70970 100644 --- a/source/Irrlicht/CSceneManager.cpp +++ b/source/Irrlicht/CSceneManager.cpp @@ -44,8 +44,6 @@ #include "CDummyTransformationSceneNode.h" #include "CEmptySceneNode.h" -#include "CDefaultSceneNodeFactory.h" - #include "CSceneCollisionManager.h" namespace irr @@ -110,11 +108,6 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs, MeshLoaderList.push_back(new CB3DMeshFileLoader(this)); #endif - // factories - ISceneNodeFactory* factory = new CDefaultSceneNodeFactory(this); - registerSceneNodeFactory(factory); - factory->drop(); - IRR_PROFILE( static bool initProfile = false; if (!initProfile ) @@ -173,9 +166,6 @@ CSceneManager::~CSceneManager() if (Parameters) Parameters->drop(); - for (i=0; idrop(); - // remove all nodes before dropping the driver // as render targets may be destroyed twice @@ -998,62 +988,6 @@ ISceneManager* CSceneManager::createNewSceneManager(bool cloneContent) } -//! Returns the default scene node factory which can create all built in scene nodes -ISceneNodeFactory* CSceneManager::getDefaultSceneNodeFactory() -{ - return getSceneNodeFactory(0); -} - - -//! Adds a scene node factory to the scene manager. -void CSceneManager::registerSceneNodeFactory(ISceneNodeFactory* factoryToAdd) -{ - if (factoryToAdd) - { - factoryToAdd->grab(); - SceneNodeFactoryList.push_back(factoryToAdd); - } -} - - -//! Returns amount of registered scene node factories. -u32 CSceneManager::getRegisteredSceneNodeFactoryCount() const -{ - return SceneNodeFactoryList.size(); -} - - -//! Returns a scene node factory by index -ISceneNodeFactory* CSceneManager::getSceneNodeFactory(u32 index) -{ - if (index < SceneNodeFactoryList.size()) - return SceneNodeFactoryList[index]; - - return 0; -} - -//! Returns a typename from a scene node type or null if not found -const c8* CSceneManager::getSceneNodeTypeName(ESCENE_NODE_TYPE type) -{ - const char* name = 0; - - for (s32 i=(s32)SceneNodeFactoryList.size()-1; !name && i>=0; --i) - name = SceneNodeFactoryList[i]->getCreateableSceneNodeTypeName(type); - - return name; -} - -//! Adds a scene node to the scene by name -ISceneNode* CSceneManager::addSceneNode(const char* sceneNodeTypeName, ISceneNode* parent) -{ - ISceneNode* node = 0; - - for (s32 i=(s32)SceneNodeFactoryList.size()-1; i>=0 && !node; --i) - node = SceneNodeFactoryList[i]->addSceneNode(sceneNodeTypeName, parent); - - return node; -} - //! Sets ambient color of the scene void CSceneManager::setAmbientLight(const video::SColorf &ambientColor) { diff --git a/source/Irrlicht/CSceneManager.h b/source/Irrlicht/CSceneManager.h index 6af151f8..d17b53bc 100644 --- a/source/Irrlicht/CSceneManager.h +++ b/source/Irrlicht/CSceneManager.h @@ -180,26 +180,6 @@ namespace scene //! Returns type of the scene node virtual ESCENE_NODE_TYPE getType() const _IRR_OVERRIDE_ { return ESNT_SCENE_MANAGER; } - //! Returns the default scene node factory which can create all built in scene nodes - virtual ISceneNodeFactory* getDefaultSceneNodeFactory() _IRR_OVERRIDE_; - - //! Adds a scene node factory to the scene manager. - /** Use this to extend the scene manager with new scene node types which it should be - able to create automatically, for example when loading data from xml files. */ - virtual void registerSceneNodeFactory(ISceneNodeFactory* factoryToAdd) _IRR_OVERRIDE_; - - //! Returns amount of registered scene node factories. - virtual u32 getRegisteredSceneNodeFactoryCount() const _IRR_OVERRIDE_; - - //! Returns a scene node factory by index - virtual ISceneNodeFactory* getSceneNodeFactory(u32 index) _IRR_OVERRIDE_; - - //! Returns a typename from a scene node type or null if not found - virtual const c8* getSceneNodeTypeName(ESCENE_NODE_TYPE type) _IRR_OVERRIDE_; - - //! Adds a scene node to the scene by name - virtual ISceneNode* addSceneNode(const char* sceneNodeTypeName, ISceneNode* parent=0) _IRR_OVERRIDE_; - //! Returns a mesh writer implementation if available virtual IMeshWriter* createMeshWriter(EMESH_WRITER_TYPE type) _IRR_OVERRIDE_; @@ -324,7 +304,6 @@ namespace scene core::array MeshLoaderList; core::array DeletionList; - core::array SceneNodeFactoryList; //! current active camera ICameraSceneNode* ActiveCamera; diff --git a/source/Irrlicht/CVideoModeList.cpp b/source/Irrlicht/CVideoModeList.cpp deleted file mode 100644 index 9ae7fb27..00000000 --- a/source/Irrlicht/CVideoModeList.cpp +++ /dev/null @@ -1,132 +0,0 @@ -// 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 - -#include "CVideoModeList.h" -#include "irrMath.h" - -namespace irr -{ -namespace video -{ - -//! constructor -CVideoModeList::CVideoModeList() -{ - #ifdef _DEBUG - setDebugName("CVideoModeList"); - #endif - - Desktop.depth = 0; - Desktop.size = core::dimension2d(0,0); -} - - -void CVideoModeList::setDesktop(s32 desktopDepth, const core::dimension2d& desktopSize) -{ - Desktop.depth = desktopDepth; - Desktop.size = desktopSize; -} - - -//! Gets amount of video modes in the list. -s32 CVideoModeList::getVideoModeCount() const -{ - return (s32)VideoModes.size(); -} - - -//! Returns the screen size of a video mode in pixels. -core::dimension2d CVideoModeList::getVideoModeResolution(s32 modeNumber) const -{ - if (modeNumber < 0 || modeNumber > (s32)VideoModes.size()) - return core::dimension2d(0,0); - - return VideoModes[modeNumber].size; -} - - -core::dimension2d CVideoModeList::getVideoModeResolution( - const core::dimension2d& minSize, - const core::dimension2d& maxSize) const -{ - u32 best=VideoModes.size(); - // if only one or no mode - if (best<2) - return getVideoModeResolution(0); - - u32 i; - for (i=0; i=minSize.Width && - VideoModes[i].size.Height>=minSize.Height && - VideoModes[i].size.Width<=maxSize.Width && - VideoModes[i].size.Height<=maxSize.Height) - best=i; - } - // we take the last one found, the largest one fitting - if (best (s32)VideoModes.size()) - return 0; - - return VideoModes[modeNumber].depth; -} - - -//! Returns current desktop screen resolution. -const core::dimension2d& CVideoModeList::getDesktopResolution() const -{ - return Desktop.size; -} - - -//! Returns the pixel depth of a video mode in bits. -s32 CVideoModeList::getDesktopDepth() const -{ - return Desktop.depth; -} - - -//! adds a new mode to the list -void CVideoModeList::addMode(const core::dimension2d& size, s32 depth) -{ - SVideoMode m; - m.depth = depth; - m.size = size; - - for (u32 i=0; i getVideoModeResolution(s32 modeNumber) const _IRR_OVERRIDE_; - - //! Returns the screen size of an optimal video mode in pixels. - virtual core::dimension2d getVideoModeResolution(const core::dimension2d& minSize, const core::dimension2d& maxSize) const _IRR_OVERRIDE_; - - //! Returns the pixel depth of a video mode in bits. - virtual s32 getVideoModeDepth(s32 modeNumber) const _IRR_OVERRIDE_; - - //! Returns current desktop screen resolution. - virtual const core::dimension2d& getDesktopResolution() const _IRR_OVERRIDE_; - - //! Returns the pixel depth of a video mode in bits. - virtual s32 getDesktopDepth() const _IRR_OVERRIDE_; - - //! adds a new mode to the list - void addMode(const core::dimension2d& size, s32 depth); - - void setDesktop(s32 desktopDepth, const core::dimension2d& desktopSize); - - private: - - struct SVideoMode - { - core::dimension2d size; - s32 depth; - - bool operator==(const SVideoMode& other) const - { - return size == other.size && depth == other.depth; - } - - bool operator <(const SVideoMode& other) const - { - return (size.Width < other.size.Width || - (size.Width == other.size.Width && - size.Height < other.size.Height) || - (size.Width == other.size.Width && - size.Height == other.size.Height && - depth < other.depth)); - } - }; - - core::array VideoModes; - SVideoMode Desktop; - }; - -} // end namespace video -} // end namespace irr - - -#endif - diff --git a/source/Irrlicht/CZBuffer.cpp b/source/Irrlicht/CZBuffer.cpp deleted file mode 100644 index 23b515b0..00000000 --- a/source/Irrlicht/CZBuffer.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// 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 - -#include "IrrCompileConfig.h" -#include "CZBuffer.h" -#include "irrString.h" - -#ifdef _IRR_COMPILE_WITH_SOFTWARE_ - -namespace irr -{ -namespace video -{ - - -//! constructor -CZBuffer::CZBuffer(const core::dimension2d& size) -: Buffer(0), BufferEnd(0), Size(0,0), TotalSize(0) -{ - #ifdef _DEBUG - setDebugName("CZBuffer"); - #endif - - setSize(size); -} - - - -//! destructor -CZBuffer::~CZBuffer() -{ - delete [] Buffer; -} - - - -//! clears the zbuffer -void CZBuffer::clear() -{ - memset(Buffer, 0, (BufferEnd-Buffer)*sizeof(TZBufferType)); -} - - - -//! sets the new size of the zbuffer -void CZBuffer::setSize(const core::dimension2d& size) -{ - if (size == Size) - return; - - Size = size; - - delete [] Buffer; - - TotalSize = size.Width * size.Height; - Buffer = new TZBufferType[TotalSize]; - BufferEnd = Buffer + TotalSize; -} - - - -//! returns the size of the zbuffer -const core::dimension2d& CZBuffer::getSize() const -{ - return Size; -} - - - -//! locks the zbuffer -TZBufferType* CZBuffer::lock() -{ - return Buffer; -} - - - -//! unlocks the zbuffer -void CZBuffer::unlock() -{ -} - -} // end namespace video -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_SOFTWARE_ - -namespace irr -{ -namespace video -{ - -//! creates a ZBuffer -IZBuffer* createZBuffer(const core::dimension2d& size) -{ - #ifdef _IRR_COMPILE_WITH_SOFTWARE_ - return new CZBuffer(size); - #else - return 0; - #endif // _IRR_COMPILE_WITH_SOFTWARE_ -} - - -} // end namespace video -} // end namespace irr - - - diff --git a/source/Irrlicht/CZBuffer.h b/source/Irrlicht/CZBuffer.h deleted file mode 100644 index ff517740..00000000 --- a/source/Irrlicht/CZBuffer.h +++ /dev/null @@ -1,52 +0,0 @@ -// 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 __C_Z_BUFFER_H_INCLUDED__ -#define __C_Z_BUFFER_H_INCLUDED__ - -#include "IZBuffer.h" - -namespace irr -{ -namespace video -{ - - class CZBuffer : public IZBuffer - { - public: - - //! constructor - CZBuffer(const core::dimension2d& size); - - //! destructor - virtual ~CZBuffer(); - - //! clears the zbuffer - virtual void clear() _IRR_OVERRIDE_; - - //! sets the new size of the zbuffer - virtual void setSize(const core::dimension2d& size) _IRR_OVERRIDE_; - - //! returns the size of the zbuffer - virtual const core::dimension2d& getSize() const _IRR_OVERRIDE_; - - //! locks the zbuffer - virtual TZBufferType* lock() _IRR_OVERRIDE_; - - //! unlocks the zbuffer - virtual void unlock() _IRR_OVERRIDE_; - - private: - - TZBufferType* Buffer; - TZBufferType* BufferEnd; - core::dimension2d Size; - s32 TotalSize; - }; - -} // end namespace video -} // end namespace irr - -#endif - diff --git a/source/Irrlicht/ITriangleRenderer.h b/source/Irrlicht/ITriangleRenderer.h deleted file mode 100644 index 954ce6de..00000000 --- a/source/Irrlicht/ITriangleRenderer.h +++ /dev/null @@ -1,68 +0,0 @@ -// 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 __I_TRIANGLE_RENDERER_H_INCLUDED__ -#define __I_TRIANGLE_RENDERER_H_INCLUDED__ - -#include "IReferenceCounted.h" -#include "S2DVertex.h" -#include "rect.h" -#include "IZBuffer.h" - -namespace irr -{ -namespace video -{ - class IImage; - - enum ETriangleRenderer - { - ETR_FLAT = 0, - ETR_FLAT_WIRE, - ETR_GOURAUD, - ETR_GOURAUD_WIRE, - ETR_TEXTURE_FLAT, - ETR_TEXTURE_FLAT_WIRE, - ETR_TEXTURE_GOURAUD, - ETR_TEXTURE_GOURAUD_WIRE, - ETR_TEXTURE_GOURAUD_NOZ, - ETR_TEXTURE_GOURAUD_ADD, - ETR_COUNT - }; - - class ITriangleRenderer : public virtual IReferenceCounted - { - public: - - //! sets a render target - virtual void setRenderTarget(video::IImage* surface, const core::rect& viewPort) = 0; - - //! en or disables the backface culling - virtual void setBackfaceCulling(bool enabled = true) = 0; - - //! sets the Texture - virtual void setTexture(video::IImage* texture) = 0; - - //! draws an indexed triangle list - virtual void drawIndexedTriangleList(S2DVertex* vertices, s32 vertexCount, const u16* indexList, s32 triangleCount) = 0; - }; - - - ITriangleRenderer* createTriangleRendererTextureGouraud(IZBuffer* zbuffer); - ITriangleRenderer* createTriangleRendererTextureGouraudWire(IZBuffer* zbuffer); - ITriangleRenderer* createTriangleRendererGouraud(IZBuffer* zbuffer); - ITriangleRenderer* createTriangleRendererGouraudWire(IZBuffer* zbuffer); - ITriangleRenderer* createTriangleRendererTextureFlat(IZBuffer* zbuffer); - ITriangleRenderer* createTriangleRendererTextureFlatWire(IZBuffer* zbuffer); - ITriangleRenderer* createTriangleRendererFlat(IZBuffer* zbuffer); - ITriangleRenderer* createTriangleRendererFlatWire(IZBuffer* zbuffer); - ITriangleRenderer* createTriangleRendererTextureGouraudNoZ(); - ITriangleRenderer* createTriangleRendererTextureGouraudAdd(IZBuffer* zbuffer); - - -} // end namespace video -} // end namespace irr - -#endif - diff --git a/source/Irrlicht/IZBuffer.h b/source/Irrlicht/IZBuffer.h deleted file mode 100644 index 2c235a89..00000000 --- a/source/Irrlicht/IZBuffer.h +++ /dev/null @@ -1,47 +0,0 @@ -// 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 __I_Z_BUFFER_H_INCLUDED__ -#define __I_Z_BUFFER_H_INCLUDED__ - -#include "IReferenceCounted.h" -#include "dimension2d.h" -#include "S2DVertex.h" - -namespace irr -{ -namespace video -{ - class IZBuffer : public virtual IReferenceCounted - { - public: - - //! destructor - virtual ~IZBuffer() {}; - - //! clears the zbuffer - virtual void clear() = 0; - - //! sets the new size of the zbuffer - virtual void setSize(const core::dimension2d& size) = 0; - - //! returns the size of the zbuffer - virtual const core::dimension2d& getSize() const = 0; - - //! locks the zbuffer - virtual TZBufferType* lock() = 0; - - //! unlocks the zbuffer - virtual void unlock() = 0; - }; - - - //! creates a ZBuffer - IZBuffer* createZBuffer(const core::dimension2d& size); - -} // end namespace video -} // end namespace irr - -#endif - diff --git a/source/Irrlicht/os.cpp b/source/Irrlicht/os.cpp index 47031c98..2b894bcd 100644 --- a/source/Irrlicht/os.cpp +++ b/source/Irrlicht/os.cpp @@ -289,40 +289,6 @@ namespace os Logger->log(message, hint.c_str(), ll); } - // our Randomizer is not really os specific, so we - // code one for all, which should work on every platform the same, - // which is desirable. - - s32 Randomizer::seed = 0x0f0f0f0f; - - //! generates a pseudo random number - s32 Randomizer::rand() - { - // (a*seed)%m with Schrage's method - seed = a * (seed%q) - r* (seed/q); - if (seed<1) - seed += m; - - return seed-1; // -1 because we want it to start at 0 - } - - s32 Randomizer::randMax() - { - return rMax; - } - - //! resets the randomizer - void Randomizer::reset(s32 value) - { - if (value<0) - seed = value+m; - else if ( value == 0 || value == m) - seed = 1; - else - seed = value; - } - - // ------------------------------------------------------ // virtual timer implementation diff --git a/source/Irrlicht/os.h b/source/Irrlicht/os.h index 75127570..77012c28 100644 --- a/source/Irrlicht/os.h +++ b/source/Irrlicht/os.h @@ -44,37 +44,6 @@ namespace os static ILogger* Logger; }; - - // congruential pseudo-random generator - // numbers identical to std::minstd_rand0 - // period is somewhere around m-1 - class Randomizer - { - public: - - //! resets the randomizer - static void reset(s32 value=0x0f0f0f0f); - - //! generates a pseudo random number in the range 0..randMax() - static s32 rand(); - - //! get maximum number generated by rand() - static s32 randMax(); - - private: - - static s32 seed; - - static const s32 m = 2147483647; // a Mersenne prime (2^31-1) - static const s32 a = 16807; // another spectral success story - static const s32 q = m/a; - static const s32 r = m%a; // again less than q - static const s32 rMax = m-2; - }; - - - - class Timer { public: diff --git a/source/Irrlicht/resource.h b/source/Irrlicht/resource.h deleted file mode 100644 index c734d2a5..00000000 --- a/source/Irrlicht/resource.h +++ /dev/null @@ -1,14 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Irrlicht.rc - -// Nächste Standardwerte für neue Objekte -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif