mirror of
https://github.com/minetest/irrlicht.git
synced 2025-07-03 00:30:26 +02:00
Compare commits
24 Commits
Author | SHA1 | Date | |
---|---|---|---|
3225007e8d | |||
e9f205f952 | |||
d733e03430 | |||
f0766c845f | |||
ff645cc876 | |||
f6ec00e1c4 | |||
51f0acb7c1 | |||
91edd214aa | |||
538c9e5cde | |||
abebac8bd4 | |||
67c0cb5740 | |||
748e005794 | |||
a7b306f702 | |||
074e81f78f | |||
25ae156944 | |||
c4ca31313f | |||
b787ec3e3e | |||
6db035e0aa | |||
6064e12133 | |||
53e1b52ff4 | |||
a04a0d2a4b | |||
392df9bae3 | |||
426730bf91 | |||
aa095d9525 |
63
.github/workflows/build.yml
vendored
63
.github/workflows/build.yml
vendored
@ -14,7 +14,7 @@ jobs:
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install g++ cmake libxxf86vm-dev libgl1-mesa-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
|
||||
sudo apt-get install g++ cmake libxi-dev libgl1-mesa-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
@ -38,7 +38,7 @@ jobs:
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install g++ cmake libxxf86vm-dev libgles2-mesa-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
|
||||
sudo apt-get install g++ cmake libxi-dev libgles2-mesa-dev libpng-dev libjpeg-dev zlib1g-dev xvfb -qyy
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
@ -118,3 +118,62 @@ jobs:
|
||||
- name: Test (headless)
|
||||
run: |
|
||||
./bin/OSX/AutomatedTest null
|
||||
|
||||
msvc:
|
||||
name: VS 2019 ${{ matrix.config.arch }}
|
||||
runs-on: windows-2019
|
||||
env:
|
||||
VCPKG_VERSION: 14e7bb4ae24616ec54ff6b2f6ef4e8659434ea44
|
||||
# 2022.05.10
|
||||
vcpkg_packages: zlib libpng libjpeg-turbo opengl-registry
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config:
|
||||
-
|
||||
arch: x86
|
||||
generator: "-G'Visual Studio 16 2019' -A Win32"
|
||||
vcpkg_triplet: x86-windows
|
||||
-
|
||||
arch: x64
|
||||
generator: "-G'Visual Studio 16 2019' -A x64"
|
||||
vcpkg_triplet: x64-windows
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Restore from cache and run vcpkg
|
||||
uses: lukka/run-vcpkg@v7
|
||||
with:
|
||||
vcpkgArguments: ${{env.vcpkg_packages}}
|
||||
vcpkgDirectory: '${{ github.workspace }}\vcpkg'
|
||||
appendedCacheKey: ${{ matrix.config.vcpkg_triplet }}
|
||||
vcpkgGitCommitId: ${{ env.VCPKG_VERSION }}
|
||||
vcpkgTriplet: ${{ matrix.config.vcpkg_triplet }}
|
||||
|
||||
- name: CMake
|
||||
run: |
|
||||
cmake ${{matrix.config.generator}} `
|
||||
-DCMAKE_TOOLCHAIN_FILE="${{ github.workspace }}\vcpkg\scripts\buildsystems\vcpkg.cmake" `
|
||||
-DCMAKE_BUILD_TYPE=Release .
|
||||
|
||||
- name: Build
|
||||
run: cmake --build . --config Release
|
||||
|
||||
- name: Create artifact folder
|
||||
run: |
|
||||
mkdir artifact/
|
||||
mkdir artifact/lib/
|
||||
|
||||
- name: Move dlls into artifact folder
|
||||
run: move bin\Win32-VisualStudio\Release\* artifact\lib\
|
||||
|
||||
- name: Move includes into artifact folder
|
||||
run: move include artifact/
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: msvc-${{ matrix.config.arch }}
|
||||
path: artifact/
|
||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -15,3 +15,7 @@ bin/Linux
|
||||
scripts/gl2ext.h
|
||||
scripts/glcorearb.h
|
||||
scripts/glext.h
|
||||
*.vcxproj*
|
||||
*.dir/
|
||||
*.sln
|
||||
*visualstudio/
|
||||
|
@ -7,8 +7,10 @@ else()
|
||||
cmake_policy(VERSION 3.9)
|
||||
endif()
|
||||
|
||||
set(IRRLICHTMT_REVISION 8)
|
||||
|
||||
project(Irrlicht
|
||||
VERSION 1.9.0
|
||||
VERSION 1.9.0.${IRRLICHTMT_REVISION}
|
||||
LANGUAGES CXX
|
||||
)
|
||||
|
||||
|
@ -3,7 +3,8 @@ IrrlichtMt version 1.9
|
||||
|
||||
The Irrlicht Engine is an open source realtime 3D engine written in C++.
|
||||
|
||||
This is a fork by the [Minetest](https://github.com/minetest) developers that contains features, customizations and fixes specifically for use in Minetest.
|
||||
This is a fork by the [Minetest](https://github.com/minetest) developers that was stripped-down and customized specifically for use in Minetest.
|
||||
It is intentionally not compatible to upstream and is planned to be eventually absorbed into Minetest.
|
||||
|
||||
Build
|
||||
-----
|
||||
|
@ -16,10 +16,6 @@ namespace irr
|
||||
/** This device uses the Win32 API and works in all versions of Windows. */
|
||||
EIDT_WIN32,
|
||||
|
||||
//! A device native to Windows CE devices
|
||||
/** This device works on Windows Mobile, Pocket PC and Microsoft SmartPhone devices */
|
||||
EIDT_WINCE,
|
||||
|
||||
//! A device native to Unix style operating systems.
|
||||
/** This device uses the X11 windowing system and works in Linux, Solaris, FreeBSD, OSX and
|
||||
other operating systems which support X11. */
|
||||
@ -38,18 +34,6 @@ namespace irr
|
||||
in by defining the _IRR_COMPILE_WITH_SDL_DEVICE_ macro in IrrCompileConfig.h */
|
||||
EIDT_SDL,
|
||||
|
||||
//! A device for raw framebuffer access
|
||||
/** Best used with embedded devices and mobile systems.
|
||||
Does not need X11 or other graphical subsystems.
|
||||
May support hw-acceleration via OpenGL-ES for FBDirect */
|
||||
EIDT_FRAMEBUFFER,
|
||||
|
||||
//! A simple text only device supported by all platforms.
|
||||
/** This device allows applications to run from the command line without opening a window.
|
||||
It can render the output of the software drivers to the console as ASCII. It only supports
|
||||
mouse and keyboard in Windows operating systems. */
|
||||
EIDT_CONSOLE,
|
||||
|
||||
//! This selection allows Irrlicht to choose the best device from the ones available.
|
||||
/** If this selection is chosen then Irrlicht will try to use the IrrlichtDevice native
|
||||
to your operating system. If this is unavailable then the X11, SDL and then console device
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
};
|
||||
|
@ -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<s32> 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
|
||||
|
@ -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<s32> 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
|
||||
|
@ -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];
|
||||
|
@ -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__
|
||||
|
@ -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<s32>& 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<s32>& 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<s32>& 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<s32>& 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<s32>& 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<s32>& 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<s32>& 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<s32>* 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<s32>& 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<s32>& 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<s32>& 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<s32>& 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<s32>& 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.
|
||||
|
@ -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<s32> 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
|
||||
|
@ -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<s32> 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
|
||||
|
@ -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<s32> 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
|
@ -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<s32> 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__
|
||||
|
@ -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<s32> 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
|
||||
|
@ -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<s32> 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
|
||||
|
@ -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<s32> 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.<br>
|
||||
So to get absolute positions you have to add the resulting rectangle to getAbsolutePosition().UpperLeftCorner.<br>
|
||||
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<s32> getClientRect() const = 0;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -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.
|
||||
|
@ -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
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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". */
|
||||
|
@ -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<u32> 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<u32> getVideoModeResolution(const core::dimension2d<u32>& minSize, const core::dimension2d<u32>& 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<u32>& 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
|
||||
|
@ -6,8 +6,8 @@
|
||||
#define __IRR_COMPILE_CONFIG_H_INCLUDED__
|
||||
|
||||
//! Identifies the IrrlichtMt fork customized for the Minetest engine
|
||||
#define IRRLICHT_VERSION_MT_REVISION 6
|
||||
#define IRRLICHT_VERSION_MT "mt6"
|
||||
#define IRRLICHT_VERSION_MT_REVISION 8
|
||||
#define IRRLICHT_VERSION_MT "mt8"
|
||||
|
||||
//! Irrlicht SDK Version
|
||||
#define IRRLICHT_VERSION_MAJOR 1
|
||||
@ -37,8 +37,6 @@
|
||||
//! _IRR_COMPILE_WITH_OSX_DEVICE_ for Cocoa native windowing on OSX
|
||||
//! _IRR_COMPILE_WITH_X11_DEVICE_ for Linux X11 based device
|
||||
//! _IRR_COMPILE_WITH_SDL_DEVICE_ for platform independent SDL framework
|
||||
//! _IRR_COMPILE_WITH_CONSOLE_DEVICE_ for no windowing system, used as a fallback
|
||||
//! _IRR_COMPILE_WITH_FB_DEVICE_ for framebuffer systems
|
||||
|
||||
//! Passing defines to the compiler which have NO in front of the _IRR definename is an alternative
|
||||
//! way which can be used to disable defines (instead of outcommenting them in this header).
|
||||
@ -52,12 +50,6 @@
|
||||
#undef _IRR_COMPILE_WITH_SDL_DEVICE_
|
||||
#endif
|
||||
|
||||
//! Comment this line to compile without the fallback console device.
|
||||
#define _IRR_COMPILE_WITH_CONSOLE_DEVICE_
|
||||
#ifdef NO_IRR_COMPILE_WITH_CONSOLE_DEVICE_
|
||||
#undef _IRR_COMPILE_WITH_CONSOLE_DEVICE_
|
||||
#endif
|
||||
|
||||
//! WIN32 for Windows32
|
||||
//! WIN64 for Windows64
|
||||
// The windows platform and API support SDL and WINDOW device
|
||||
@ -280,19 +272,9 @@ define out. */
|
||||
#undef _IRR_COMPILE_WITH_X11_
|
||||
#endif
|
||||
|
||||
//! On some Linux systems the XF86 vidmode extension, X11 RandR, or XInput2 are missing.
|
||||
//! Use these defines to add/remove support for those dependencies as needed.
|
||||
//! XInput2 (library called Xi) is currently only used to support touch-input.
|
||||
#if defined(_IRR_LINUX_PLATFORM_) && defined(_IRR_COMPILE_WITH_X11_)
|
||||
#define _IRR_LINUX_X11_VIDMODE_
|
||||
//#define _IRR_LINUX_X11_RANDR_
|
||||
//#define _IRR_LINUX_X11_XINPUT2_
|
||||
#ifdef NO_IRR_LINUX_X11_VIDMODE_
|
||||
#undef _IRR_LINUX_X11_VIDMODE_
|
||||
#endif
|
||||
#ifdef NO_IRR_LINUX_X11_RANDR_
|
||||
#undef _IRR_LINUX_X11_RANDR_
|
||||
#endif
|
||||
//! XInput2 (library called Xi) is currently only used to support touch-input.
|
||||
#define _IRR_LINUX_X11_XINPUT2_
|
||||
#ifdef NO_IRR_LINUX_X11_XINPUT2_
|
||||
#undef _IRR_LINUX_X11_XINPUT2_
|
||||
#endif
|
||||
|
@ -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;
|
||||
@ -296,14 +270,6 @@ namespace irr
|
||||
//! Is device motion available.
|
||||
virtual bool isDeviceMotionAvailable() = 0;
|
||||
|
||||
//! Set the current Gamma Value for the Display
|
||||
virtual bool setGammaRamp(f32 red, f32 green, f32 blue,
|
||||
f32 relativebrightness, f32 relativecontrast) =0;
|
||||
|
||||
//! Get the current Gamma Value for the Display
|
||||
virtual bool getGammaRamp(f32 &red, f32 &green, f32 &blue,
|
||||
f32 &brightness, f32 &contrast) =0;
|
||||
|
||||
//! Set the maximal elapsed time between 2 clicks to generate doubleclicks for the mouse. It also affects tripleclick behavior.
|
||||
/** When set to 0 no double- and tripleclicks will be generated.
|
||||
\param timeMs maximal time in milliseconds for two consecutive clicks to be recognized as double click
|
||||
@ -342,24 +308,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;
|
||||
|
@ -98,11 +98,9 @@ namespace irr
|
||||
/** This setting decides the windowing system used by the device, most device types are native
|
||||
to a specific operating system and so may not be available.
|
||||
EIDT_WIN32 is only available on Windows desktops,
|
||||
EIDT_WINCE is only available on Windows mobile devices,
|
||||
EIDT_COCOA is only available on Mac OSX,
|
||||
EIDT_X11 is available on Linux, Solaris, BSD and other operating systems which use X11,
|
||||
EIDT_SDL is available on most systems if compiled in,
|
||||
EIDT_CONSOLE is usually available but can only render to text,
|
||||
EIDT_BEST will select the best available device for your operating system.
|
||||
Default: EIDT_BEST. */
|
||||
E_DEVICE_TYPE DeviceType;
|
||||
|
101
include/SLight.h
101
include/SLight.h
@ -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
|
@ -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 <typename VType>
|
||||
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 <typename VType>
|
||||
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 <typename VType>
|
||||
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 <typename VType>
|
||||
void operator()(VType& vertex) const
|
||||
{
|
||||
if (1==UVSet)
|
||||
vertex.TCoords *= Factor;
|
||||
}
|
||||
private:
|
||||
core::vector2df Factor;
|
||||
u32 UVSet;
|
||||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
||||
|
@ -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 <iostream>
|
||||
#include <cstdio>
|
||||
#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
|
@ -227,7 +227,7 @@ public:
|
||||
/** \return Pointer to the array. */
|
||||
T* pointer()
|
||||
{
|
||||
return &m_data[0];
|
||||
return m_data.empty() ? nullptr : &m_data[0];
|
||||
}
|
||||
|
||||
|
||||
@ -235,7 +235,7 @@ public:
|
||||
/** \return Pointer to the array. */
|
||||
const T* const_pointer() const
|
||||
{
|
||||
return &m_data[0];
|
||||
return m_data.empty() ? nullptr : &m_data[0];
|
||||
}
|
||||
|
||||
|
||||
@ -394,7 +394,7 @@ public:
|
||||
{
|
||||
if (index >= m_data.size() || count < 1)
|
||||
return;
|
||||
count = std::min(count, (s32)m_data.size() - (s32)index);
|
||||
count = core::min_(count, (s32)m_data.size() - (s32)index);
|
||||
auto first = std::next(m_data.begin(), index);
|
||||
auto last = std::next(first, count);
|
||||
m_data.erase(first, last);
|
||||
|
@ -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"
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -276,6 +276,7 @@ void CAnimatedMeshSceneNode::render()
|
||||
#ifdef _DEBUG
|
||||
os::Printer::log("Animated Mesh returned no mesh to render.", Mesh->getDebugName(), ELL_WARNING);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
|
||||
|
@ -26,7 +26,7 @@ namespace scene
|
||||
|
||||
//! Constructor
|
||||
CB3DMeshFileLoader::CB3DMeshFileLoader(scene::ISceneManager* smgr)
|
||||
: AnimatedMesh(0), B3DFile(0), NormalsInFile(false),
|
||||
: AnimatedMesh(0), B3DFile(0), VerticesStart(0), NormalsInFile(false),
|
||||
HasVertexColors(false), ShowWarning(true)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
|
@ -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<s32>(0,0,100,100),parent);
|
||||
case EGUIET_CHECK_BOX:
|
||||
return Environment->addCheckBox(false, core::rect<s32>(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<s32>(0,0,100,100),parent);
|
||||
case EGUIET_CONTEXT_MENU:
|
||||
return Environment->addContextMenu(core::rect<s32>(0,0,100,100),parent);
|
||||
case EGUIET_MENU:
|
||||
return Environment->addMenu(parent);
|
||||
case EGUIET_EDIT_BOX:
|
||||
return Environment->addEditBox(0,core::rect<s32>(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<s32>(0,0,100,100),parent);
|
||||
case EGUIET_MESH_VIEWER:
|
||||
return Environment->addMeshViewer(core::rect<s32>(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<s32>(0,0,100,100),parent);
|
||||
case EGUIET_STATIC_TEXT:
|
||||
return Environment->addStaticText(0,core::rect<s32>(0,0,100,100),false,true,parent);
|
||||
case EGUIET_TAB:
|
||||
return Environment->addTab(core::rect<s32>(0,0,100,100),parent);
|
||||
case EGUIET_TAB_CONTROL:
|
||||
return Environment->addTabControl(core::rect<s32>(0,0,100,100),parent);
|
||||
case EGUIET_TABLE:
|
||||
return Environment->addTable(core::rect<s32>(0,0,100,100), parent);
|
||||
case EGUIET_TOOL_BAR:
|
||||
return Environment->addToolBar(parent);
|
||||
case EGUIET_WINDOW:
|
||||
return Environment->addWindow(core::rect<s32>(0,0,100,100),false,0,parent);
|
||||
case EGUIET_SPIN_BOX:
|
||||
return Environment->addSpinBox(L"0.0", core::rect<s32>(0,0,100,100), true, parent);
|
||||
case EGUIET_TREE_VIEW:
|
||||
return Environment->addTreeView(core::rect<s32>(0,0,100,100),parent);
|
||||
case EGUIET_PROFILER:
|
||||
return Environment->addProfilerDisplay(core::rect<s32>(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<EGUIET_COUNT)
|
||||
return (EGUI_ELEMENT_TYPE)idx;
|
||||
|
||||
return EGUIET_ELEMENT;
|
||||
}
|
||||
|
||||
|
||||
//! Returns the type name of a creatable element type.
|
||||
const c8* CDefaultGUIElementFactory::getCreateableGUIElementTypeName(s32 idx) const
|
||||
{
|
||||
if (idx>=0 && idx<EGUIET_COUNT)
|
||||
return GUIElementTypeNames[idx];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//! Returns the type name of a creatable element type.
|
||||
const c8* CDefaultGUIElementFactory::getCreateableGUIElementTypeName(EGUI_ELEMENT_TYPE type) const
|
||||
{
|
||||
// for this factory, type == index
|
||||
|
||||
if (type>=0 && type<EGUIET_COUNT)
|
||||
return GUIElementTypeNames[type];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EGUI_ELEMENT_TYPE CDefaultGUIElementFactory::getTypeFromName(const c8* name) const
|
||||
{
|
||||
for ( u32 i=0; GUIElementTypeNames[i]; ++i)
|
||||
if (!strcmp(name, GUIElementTypeNames[i]) )
|
||||
return (EGUI_ELEMENT_TYPE)i;
|
||||
|
||||
return EGUIET_ELEMENT;
|
||||
}
|
||||
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif // _IRR_COMPILE_WITH_GUI_
|
||||
|
@ -1,70 +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_DEFAULT_GUI_ELEMENT_FACTORY_H_INCLUDED__
|
||||
#define __C_DEFAULT_GUI_ELEMENT_FACTORY_H_INCLUDED__
|
||||
|
||||
#include "IrrCompileConfig.h"
|
||||
#ifdef _IRR_COMPILE_WITH_GUI_
|
||||
|
||||
#include "IGUIElementFactory.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
class IGUIElement;
|
||||
class IGUIEnvironment;
|
||||
|
||||
//! This interface makes it possible to dynamically create gui elements.
|
||||
class CDefaultGUIElementFactory : public IGUIElementFactory
|
||||
{
|
||||
public:
|
||||
|
||||
CDefaultGUIElementFactory(IGUIEnvironment* env);
|
||||
|
||||
//! 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. A value of 0 adds it to the root.
|
||||
\return Returns pointer to the new element or 0 if unsuccessful. */
|
||||
virtual IGUIElement* addGUIElement(EGUI_ELEMENT_TYPE type, IGUIElement* parent=0) _IRR_OVERRIDE_;
|
||||
|
||||
//! Adds a GUI element to the GUI Environment based on its type name.
|
||||
/** \param typeName: Type name of the element to add. Taken from the GUIElementTypeNames c8* array.
|
||||
\param parent: Parent scene node of the new element. A value of 0 adds it to the root.
|
||||
\return Returns pointer to the new element or 0 if unsuccessful. */
|
||||
virtual IGUIElement* addGUIElement(const c8* typeName, IGUIElement* parent=0) _IRR_OVERRIDE_;
|
||||
|
||||
//! Returns the amount of GUI element types this factory is able to create.
|
||||
virtual s32 getCreatableGUIElementTypeCount() const _IRR_OVERRIDE_;
|
||||
|
||||
//! Returns the type of a createable GUI element type based on the index.
|
||||
/** \param idx: Index of the element type in this factory. The value must be equal or greater than 0
|
||||
and lower than getCreatableGUIElementTypeCount(). */
|
||||
virtual EGUI_ELEMENT_TYPE getCreateableGUIElementType(s32 idx) const _IRR_OVERRIDE_;
|
||||
|
||||
//! Returns the type name of a createable GUI element type based on the index.
|
||||
/** \param idx: Index of the element type in this factory. The value must be equal or greater than 0
|
||||
and lower than getCreatableGUIElementTypeCount(). */
|
||||
virtual const c8* getCreateableGUIElementTypeName(s32 idx) const _IRR_OVERRIDE_;
|
||||
|
||||
//! Returns the type name of a createable GUI element based on its type.
|
||||
/** \param type: Type of the GUI element.
|
||||
\return: Returns the name of the type if this factory can create it, otherwise it returns 0. */
|
||||
virtual const c8* getCreateableGUIElementTypeName(EGUI_ELEMENT_TYPE type) const _IRR_OVERRIDE_;
|
||||
|
||||
private:
|
||||
|
||||
EGUI_ELEMENT_TYPE getTypeFromName(const c8* name) const;
|
||||
|
||||
IGUIEnvironment* Environment;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif // _IRR_COMPILE_WITH_GUI_
|
||||
|
||||
#endif // __C_DEFAULT_GUI_ELEMENT_FACTORY_H_INCLUDED__
|
@ -1,122 +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 "CDefaultSceneNodeFactory.h"
|
||||
#include "ISceneManager.h"
|
||||
#include "IDummyTransformationSceneNode.h"
|
||||
#include "ICameraSceneNode.h"
|
||||
#include "IBillboardSceneNode.h"
|
||||
#include "IAnimatedMeshSceneNode.h"
|
||||
#include "IMeshSceneNode.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
|
||||
|
||||
CDefaultSceneNodeFactory::CDefaultSceneNodeFactory(ISceneManager* mgr)
|
||||
: Manager(mgr)
|
||||
{
|
||||
|
||||
#ifdef _DEBUG
|
||||
setDebugName("CDefaultSceneNodeFactory");
|
||||
#endif
|
||||
|
||||
// don't grab the scene manager here to prevent cyclic references
|
||||
|
||||
SupportedSceneNodeTypes.push_back(SSceneNodeTypePair(ESNT_MESH, "mesh"));
|
||||
SupportedSceneNodeTypes.push_back(SSceneNodeTypePair(ESNT_EMPTY, "empty"));
|
||||
SupportedSceneNodeTypes.push_back(SSceneNodeTypePair(ESNT_DUMMY_TRANSFORMATION, "dummyTransformation"));
|
||||
SupportedSceneNodeTypes.push_back(SSceneNodeTypePair(ESNT_CAMERA, "camera"));
|
||||
SupportedSceneNodeTypes.push_back(SSceneNodeTypePair(ESNT_BILLBOARD, "billBoard"));
|
||||
SupportedSceneNodeTypes.push_back(SSceneNodeTypePair(ESNT_ANIMATED_MESH, "animatedMesh"));
|
||||
}
|
||||
|
||||
|
||||
//! adds a scene node to the scene graph based on its type id
|
||||
ISceneNode* CDefaultSceneNodeFactory::addSceneNode(ESCENE_NODE_TYPE type, ISceneNode* parent)
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case ESNT_MESH:
|
||||
return Manager->addMeshSceneNode(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.size())
|
||||
return SupportedSceneNodeTypes[idx].Type;
|
||||
else
|
||||
return ESNT_UNKNOWN;
|
||||
}
|
||||
|
||||
|
||||
//! returns type name of a creatable scene node type
|
||||
const c8* CDefaultSceneNodeFactory::getCreateableSceneNodeTypeName(u32 idx) const
|
||||
{
|
||||
if (idx<SupportedSceneNodeTypes.size())
|
||||
return SupportedSceneNodeTypes[idx].TypeName.c_str();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//! returns type name of a creatable scene node type
|
||||
const c8* CDefaultSceneNodeFactory::getCreateableSceneNodeTypeName(ESCENE_NODE_TYPE type) const
|
||||
{
|
||||
for (u32 i=0; i<SupportedSceneNodeTypes.size(); ++i)
|
||||
if (SupportedSceneNodeTypes[i].Type == type)
|
||||
return SupportedSceneNodeTypes[i].TypeName.c_str();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
ESCENE_NODE_TYPE CDefaultSceneNodeFactory::getTypeFromName(const c8* name) const
|
||||
{
|
||||
for (u32 i=0; i<SupportedSceneNodeTypes.size(); ++i)
|
||||
if (SupportedSceneNodeTypes[i].TypeName == name)
|
||||
return SupportedSceneNodeTypes[i].Type;
|
||||
|
||||
return ESNT_UNKNOWN;
|
||||
}
|
||||
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
@ -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_DEFAULT_SCENE_NODE_FACTORY_H_INCLUDED__
|
||||
#define __C_DEFAULT_SCENE_NODE_FACTORY_H_INCLUDED__
|
||||
|
||||
#include "ISceneNodeFactory.h"
|
||||
#include "irrArray.h"
|
||||
#include "irrString.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
class ISceneNode;
|
||||
class ISceneManager;
|
||||
|
||||
//! Interface making it possible to dynamicly create scene nodes and animators
|
||||
class CDefaultSceneNodeFactory : public ISceneNodeFactory
|
||||
{
|
||||
public:
|
||||
|
||||
CDefaultSceneNodeFactory(ISceneManager* mgr);
|
||||
|
||||
//! 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. */
|
||||
virtual ISceneNode* addSceneNode(ESCENE_NODE_TYPE type, ISceneNode* parent=0) _IRR_OVERRIDE_;
|
||||
|
||||
//! 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. */
|
||||
virtual ISceneNode* addSceneNode(const c8* typeName, ISceneNode* parent=0) _IRR_OVERRIDE_;
|
||||
|
||||
//! returns amount of scene node types this factory is able to create
|
||||
virtual u32 getCreatableSceneNodeTypeCount() const _IRR_OVERRIDE_;
|
||||
|
||||
//! 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
|
||||
uetCreatableSceneNodeTypeCount() */
|
||||
virtual const c8* getCreateableSceneNodeTypeName(u32 idx) const _IRR_OVERRIDE_;
|
||||
|
||||
//! 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 _IRR_OVERRIDE_;
|
||||
|
||||
//! returns type name of a creatable scene node type
|
||||
/** \param idx: 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 _IRR_OVERRIDE_;
|
||||
|
||||
private:
|
||||
|
||||
ESCENE_NODE_TYPE getTypeFromName(const c8* name) const;
|
||||
|
||||
struct SSceneNodeTypePair
|
||||
{
|
||||
SSceneNodeTypePair(ESCENE_NODE_TYPE type, const c8* name)
|
||||
: Type(type), TypeName(name)
|
||||
{}
|
||||
|
||||
ESCENE_NODE_TYPE Type;
|
||||
core::stringc TypeName;
|
||||
};
|
||||
|
||||
core::array<SSceneNodeTypePair> SupportedSceneNodeTypes;
|
||||
|
||||
ISceneManager* Manager;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
||||
#endif
|
||||
|
@ -9,7 +9,6 @@
|
||||
#include "irrString.h"
|
||||
#include "irrArray.h"
|
||||
#include "os.h"
|
||||
#include <dlfcn.h>
|
||||
|
||||
#if defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_)
|
||||
#include <android/native_activity.h>
|
||||
@ -21,7 +20,7 @@ namespace video
|
||||
{
|
||||
|
||||
CEGLManager::CEGLManager() : IContextManager(), EglWindow(0), EglDisplay(EGL_NO_DISPLAY),
|
||||
EglSurface(EGL_NO_SURFACE), EglContext(EGL_NO_CONTEXT), EglConfig(0), MajorVersion(0), MinorVersion(0), libHandle(NULL)
|
||||
EglSurface(EGL_NO_SURFACE), EglContext(EGL_NO_CONTEXT), EglConfig(0), MajorVersion(0), MinorVersion(0)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
setDebugName("CEGLManager");
|
||||
@ -110,9 +109,6 @@ void CEGLManager::terminate()
|
||||
|
||||
MajorVersion = 0;
|
||||
MinorVersion = 0;
|
||||
|
||||
if (libHandle)
|
||||
dlclose(libHandle);
|
||||
}
|
||||
|
||||
bool CEGLManager::generateSurface()
|
||||
@ -596,15 +592,7 @@ const SExposedVideoData& CEGLManager::getContext() const
|
||||
|
||||
void* CEGLManager::getProcAddress(const std::string &procName)
|
||||
{
|
||||
void* proc = NULL;
|
||||
proc = (void*)eglGetProcAddress(procName.c_str());
|
||||
if (!proc) { // fallback
|
||||
if (!libHandle)
|
||||
libHandle = dlopen("libGLESv2.so", RTLD_LAZY);
|
||||
if (libHandle)
|
||||
proc = dlsym(libHandle, procName.c_str());
|
||||
}
|
||||
return proc;
|
||||
return (void*)eglGetProcAddress(procName.c_str());
|
||||
}
|
||||
|
||||
bool CEGLManager::swapBuffers()
|
||||
|
@ -111,8 +111,6 @@ namespace video
|
||||
|
||||
EGLint MajorVersion;
|
||||
EGLint MinorVersion;
|
||||
|
||||
void* libHandle;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -7,7 +7,6 @@
|
||||
#ifdef _IRR_COMPILE_WITH_GLX_MANAGER_
|
||||
|
||||
#include "os.h"
|
||||
#include <dlfcn.h>
|
||||
|
||||
#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
|
||||
#define GL_GLEXT_LEGACY 1
|
||||
@ -29,7 +28,7 @@ namespace video
|
||||
{
|
||||
|
||||
CGLXManager::CGLXManager(const SIrrlichtCreationParameters& params, const SExposedVideoData& videodata, int screennr)
|
||||
: Params(params), PrimaryContext(videodata), VisualInfo(0), glxFBConfig(0), GlxWin(0), libHandle(NULL)
|
||||
: Params(params), PrimaryContext(videodata), VisualInfo(0), glxFBConfig(0), GlxWin(0)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
setDebugName("CGLXManager");
|
||||
@ -280,8 +279,6 @@ bool CGLXManager::initialize(const SIrrlichtCreationParameters& params, const SE
|
||||
|
||||
void CGLXManager::terminate()
|
||||
{
|
||||
if (libHandle)
|
||||
dlclose(libHandle);
|
||||
memset((void*)&CurrentContext, 0, sizeof(CurrentContext));
|
||||
}
|
||||
|
||||
@ -311,6 +308,16 @@ void CGLXManager::destroySurface()
|
||||
glXDestroyWindow((Display*)CurrentContext.OpenGLLinux.X11Display, GlxWin);
|
||||
}
|
||||
|
||||
#if defined(GLX_ARB_create_context)
|
||||
static int IrrIgnoreError(Display *display, XErrorEvent *event)
|
||||
{
|
||||
char msg[256];
|
||||
XGetErrorText(display, event->error_code, msg, 256);
|
||||
os::Printer::log("Ignoring an X error", msg, ELL_DEBUG);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool CGLXManager::generateContext()
|
||||
{
|
||||
GLXContext context = 0;
|
||||
@ -329,13 +336,16 @@ bool CGLXManager::generateContext()
|
||||
|
||||
if (glxCreateContextAttribsARB)
|
||||
{
|
||||
os::Printer::log("GLX with GLX_ARB_create_context", ELL_DEBUG);
|
||||
int contextAttrBuffer[] = {
|
||||
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
|
||||
GLX_CONTEXT_MINOR_VERSION_ARB, 0,
|
||||
// GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
|
||||
None
|
||||
};
|
||||
XErrorHandler old = XSetErrorHandler(IrrIgnoreError);
|
||||
context = glxCreateContextAttribsARB((Display*)CurrentContext.OpenGLLinux.X11Display, (GLXFBConfig)glxFBConfig, NULL, True, contextAttrBuffer);
|
||||
XSetErrorHandler(old);
|
||||
// transparently fall back to legacy call
|
||||
}
|
||||
if (!context)
|
||||
@ -456,15 +466,7 @@ void CGLXManager::destroyContext()
|
||||
|
||||
void* CGLXManager::getProcAddress(const std::string &procName)
|
||||
{
|
||||
void* proc = NULL;
|
||||
proc = (void*)glXGetProcAddressARB(reinterpret_cast<const GLubyte*>(procName.c_str()));
|
||||
if (!proc) {
|
||||
if (!libHandle)
|
||||
libHandle = dlopen("libGL.so", RTLD_LAZY);
|
||||
if (libHandle)
|
||||
proc = dlsym(libHandle, procName.c_str());
|
||||
}
|
||||
return proc;
|
||||
return (void*)glXGetProcAddressARB(reinterpret_cast<const GLubyte*>(procName.c_str()));
|
||||
}
|
||||
|
||||
bool CGLXManager::swapBuffers()
|
||||
|
@ -72,7 +72,6 @@ namespace video
|
||||
XVisualInfo* VisualInfo;
|
||||
void* glxFBConfig; // GLXFBConfig
|
||||
XID GlxWin; // GLXWindow
|
||||
void* libHandle; // handle to libGL.so
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -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<s32>((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<s32>(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<s32>(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<s32>(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<u32>(128, 128), 1,
|
||||
Environment->getSkin()->getColor(EGDC_3D_SHADOW));
|
||||
}
|
||||
|
||||
core::rect<s32> 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<u32> & dim, s32 supersample, const video::SColor& borderColor )
|
||||
{
|
||||
const core::dimension2d<u32> 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<s32> 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<s32>(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<s32> 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_
|
@ -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<s32> DragStart;
|
||||
bool Dragging;
|
||||
IGUIButton* CloseButton;
|
||||
IGUIButton* OKButton;
|
||||
IGUIButton* CancelButton;
|
||||
|
||||
core::array<IGUISpinBox*> Battery;
|
||||
|
||||
struct SColorCircle
|
||||
{
|
||||
IGUIImage * Control;
|
||||
video::ITexture * Texture;
|
||||
};
|
||||
SColorCircle ColorRing;
|
||||
|
||||
void buildColorRing( const core::dimension2d<u32> & 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__
|
@ -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<s32> 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; i<Items.size(); ++i)
|
||||
if (Items[i].SubMenu)
|
||||
Items[i].SubMenu->drop();
|
||||
|
||||
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<s32>(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(); ++i )
|
||||
{
|
||||
if ( Items[i].CommandId == commandId )
|
||||
{
|
||||
return (s32)i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
//! Adds a sub menu from an element that already exists.
|
||||
void CGUIContextMenu::setSubMenu(u32 index, CGUIContextMenu* menu)
|
||||
{
|
||||
if (index >= 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; i<Items.size(); ++i)
|
||||
if (Items[i].SubMenu)
|
||||
Items[i].SubMenu->drop();
|
||||
|
||||
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<s32>(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<s32>(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; j<Items.size(); ++j)
|
||||
if (Items[j].SubMenu)
|
||||
Items[j].SubMenu->setVisible(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<s32>& 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<s32>& 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<s32> CGUIContextMenu::getHRect(const SItem& i, const core::rect<s32>& absolute) const
|
||||
{
|
||||
core::rect<s32> 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<s32> CGUIContextMenu::getRect(const SItem& i, const core::rect<s32>& absolute) const
|
||||
{
|
||||
core::rect<s32> 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<s32> rect = AbsoluteRect;
|
||||
core::rect<s32>* 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<s32> 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<s32> 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<s32> 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<s32> rect;
|
||||
rect.UpperLeftCorner = RelativeRect.UpperLeftCorner;
|
||||
u32 width = 100;
|
||||
u32 height = 3;
|
||||
|
||||
u32 i;
|
||||
for (i=0; i<Items.size(); ++i)
|
||||
{
|
||||
if (Items[i].IsSeparator)
|
||||
{
|
||||
Items[i].Dim.Width = 100;
|
||||
Items[i].Dim.Height = 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
Items[i].Dim = font->getDimension(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; i<Items.size(); ++i)
|
||||
{
|
||||
if (Items[i].SubMenu)
|
||||
{
|
||||
// move submenu
|
||||
const s32 w = Items[i].SubMenu->getAbsolutePosition().getWidth();
|
||||
const s32 h = Items[i].SubMenu->getAbsolutePosition().getHeight();
|
||||
|
||||
core::rect<s32> subRect(width-5, Items[i].PosY, width+w-5, Items[i].PosY+h);
|
||||
|
||||
gui::IGUIElement * root = Environment->getRootGUIElement();
|
||||
if ( root )
|
||||
{
|
||||
core::rect<s32> 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; i<Items.size(); ++i)
|
||||
if (Items[i].SubMenu)
|
||||
Items[i].SubMenu->setEventParent(parent);
|
||||
}
|
||||
|
||||
|
||||
bool CGUIContextMenu::hasOpenSubMenu() const
|
||||
{
|
||||
for (u32 i=0; i<Items.size(); ++i)
|
||||
if (Items[i].SubMenu && Items[i].SubMenu->isVisible())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void CGUIContextMenu::closeAllSubMenus()
|
||||
{
|
||||
for (u32 i=0; i<Items.size(); ++i)
|
||||
if (Items[i].SubMenu)
|
||||
Items[i].SubMenu->setVisible(false);
|
||||
|
||||
//HighLighted = -1;
|
||||
}
|
||||
|
||||
|
||||
} // end namespace
|
||||
} // end namespace
|
||||
|
||||
#endif // _IRR_COMPILE_WITH_GUI_
|
||||
|
@ -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<s32> 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<u32> Dim;
|
||||
s32 PosY;
|
||||
CGUIContextMenu* SubMenu;
|
||||
s32 CommandId;
|
||||
};
|
||||
|
||||
virtual void recalculateSize();
|
||||
|
||||
//! returns true, if an element was highlighted
|
||||
virtual bool highlight(const core::position2d<s32>& 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<s32>& p);
|
||||
|
||||
//! returns the item highlight-area
|
||||
virtual core::rect<s32> getHRect(const SItem& i, const core::rect<s32>& absolute) const;
|
||||
|
||||
//! Gets drawing rect of Item
|
||||
virtual core::rect<s32> getRect(const SItem& i, const core::rect<s32>& absolute) const;
|
||||
|
||||
|
||||
core::array<SItem> Items;
|
||||
core::position2d<s32> 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__
|
||||
|
@ -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; i<Fonts.size(); ++i)
|
||||
Fonts[i].Font->drop();
|
||||
|
||||
// remove all factories
|
||||
for (i=0; i<GUIElementFactoryList.size(); ++i)
|
||||
GUIElementFactoryList[i]->drop();
|
||||
|
||||
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<s32>& rectangle, IGUIElement* parent, s32 id, const wchar_t* text, const wchar_t *tooltiptext)
|
||||
{
|
||||
@ -822,83 +699,6 @@ IGUIButton* CGUIEnvironment::addButton(const core::rect<s32>& rectangle, IGUIEle
|
||||
}
|
||||
|
||||
|
||||
//! adds a window. The returned pointer must not be dropped.
|
||||
IGUIWindow* CGUIEnvironment::addWindow(const core::rect<s32>& 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<s32> rect;
|
||||
core::dimension2d<u32> 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<s32>& rectangle, IGUIElement* parent, s32 id)
|
||||
{
|
||||
@ -907,21 +707,6 @@ IGUIScrollBar* CGUIEnvironment::addScrollBar(bool horizontal, const core::rect<s
|
||||
return bar;
|
||||
}
|
||||
|
||||
//! Adds a table to the environment
|
||||
IGUITable* CGUIEnvironment::addTable(const core::rect<s32>& 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<s32>& 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<s32> pos,
|
||||
@ -965,20 +750,6 @@ IGUIImage* CGUIEnvironment::addImage(const core::rect<s32>& rectangle, IGUIEleme
|
||||
}
|
||||
|
||||
|
||||
//! adds an mesh viewer. The returned pointer must not be dropped.
|
||||
IGUIMeshViewer* CGUIEnvironment::addMeshViewer(const core::rect<s32>& 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<s32>& rectangle, IGUIElement* parent, s32 id, const wchar_t* text)
|
||||
{
|
||||
@ -1013,19 +784,6 @@ IGUIListBox* CGUIEnvironment::addListBox(const core::rect<s32>& rectangle,
|
||||
return b;
|
||||
}
|
||||
|
||||
//! adds a tree view
|
||||
IGUITreeView* CGUIEnvironment::addTreeView(const core::rect<s32>& 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<s32> &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<s32>& rectangle,
|
||||
IGUIElement* parent, bool fillbackground, bool border, s32 id)
|
||||
@ -1138,65 +854,6 @@ IGUITab* CGUIEnvironment::addTab(const core::rect<s32>& rectangle,
|
||||
}
|
||||
|
||||
|
||||
//! Adds a context menu to the environment.
|
||||
IGUIContextMenu* CGUIEnvironment::addContextMenu(const core::rect<s32>& 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<s32>(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<s32>(0,0,10,10));
|
||||
b->drop();
|
||||
return b;
|
||||
}
|
||||
|
||||
|
||||
//! Adds an element for fading in or out.
|
||||
IGUIInOutFader* CGUIEnvironment::addInOutFader(const core::rect<s32>* rectangle, IGUIElement* parent, s32 id)
|
||||
{
|
||||
core::rect<s32> rect;
|
||||
|
||||
if (rectangle)
|
||||
rect = *rectangle;
|
||||
else if (Driver)
|
||||
rect = core::rect<s32>(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<s32>& rectangle,
|
||||
IGUIElement* parent, s32 id)
|
||||
|
@ -92,17 +92,6 @@ public:
|
||||
//! adds an button. The returned pointer must not be dropped.
|
||||
virtual IGUIButton* addButton(const core::rect<s32>& 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<s32>& 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<s32>& rectangle,
|
||||
IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_;
|
||||
@ -123,24 +112,11 @@ public:
|
||||
virtual IGUIListBox* addListBox(const core::rect<s32>& rectangle,
|
||||
IGUIElement* parent=0, s32 id=-1, bool drawBackground=false) _IRR_OVERRIDE_;
|
||||
|
||||
//! adds a tree view
|
||||
virtual IGUITreeView* addTreeView(const core::rect<s32>& 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<s32>& 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<s32>& 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<s32>& 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<s32>& 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<s32>& 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<s32>& rectangle,
|
||||
IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_;
|
||||
|
||||
//! Adds a context menu to the environment.
|
||||
virtual IGUIContextMenu* addContextMenu(const core::rect<s32>& 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<s32>& rectangle,
|
||||
IGUIElement* parent=0, s32 id=-1) _IRR_OVERRIDE_;
|
||||
|
||||
//! Adds a table element.
|
||||
virtual IGUITable* addTable(const core::rect<s32>& 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<s32>& 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<s32>* 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<IGUIElementFactory*> GUIElementFactoryList;
|
||||
|
||||
core::array<SFont> Fonts;
|
||||
core::array<SSpriteBank> Banks;
|
||||
video::IVideoDriver* Driver;
|
||||
|
@ -74,7 +74,7 @@ CGUIFileOpenDialog::CGUIFileOpenDialog(const wchar_t* title,
|
||||
L"", skin ? skin->getDefaultText(EGDT_WINDOW_CLOSE) : L"Close");
|
||||
CloseButton->setSubElement(true);
|
||||
CloseButton->setTabStop(false);
|
||||
if (sprites)
|
||||
if (sprites && skin)
|
||||
{
|
||||
CloseButton->setSpriteBank(sprites);
|
||||
CloseButton->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_WINDOW_CLOSE), color);
|
||||
|
@ -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<s32> 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_
|
||||
|
@ -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<s32> 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__
|
||||
|
@ -132,20 +132,16 @@ namespace gui
|
||||
|
||||
struct ListItem
|
||||
{
|
||||
ListItem() : Icon(-1)
|
||||
{}
|
||||
|
||||
core::stringw Text;
|
||||
s32 Icon;
|
||||
s32 Icon = -1;
|
||||
|
||||
// A multicolor extension
|
||||
struct ListItemOverrideColor
|
||||
{
|
||||
ListItemOverrideColor() : Use(false) {}
|
||||
bool Use;
|
||||
bool Use = false;
|
||||
video::SColor Color;
|
||||
};
|
||||
ListItemOverrideColor OverrideColors[EGUI_LBC_COUNT];
|
||||
ListItemOverrideColor OverrideColors[EGUI_LBC_COUNT]{};
|
||||
};
|
||||
|
||||
void recalculateItemHeight();
|
||||
|
@ -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<s32> 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<s32> 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<s32> p(event.MouseInput.X, event.MouseInput.Y);
|
||||
bool shouldCloseSubMenu = hasOpenSubMenu();
|
||||
if (!AbsoluteClippingRect.isPointInside(p))
|
||||
{
|
||||
shouldCloseSubMenu = false;
|
||||
}
|
||||
highlight(core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y), true);
|
||||
if ( shouldCloseSubMenu )
|
||||
{
|
||||
Environment->removeFocus(this);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
case EMIE_LMOUSE_LEFT_UP:
|
||||
{
|
||||
core::position2d<s32> 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<s32>(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<s32> clientRect; // client rect of parent
|
||||
if ( Parent && Parent->hasType(EGUIET_WINDOW) )
|
||||
{
|
||||
clientRect = static_cast<IGUIWindow*>(Parent)->getClientRect();
|
||||
}
|
||||
else if ( Parent )
|
||||
{
|
||||
clientRect = core::rect<s32>(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<s32>(clientRect.UpperLeftCorner.X, clientRect.UpperLeftCorner.Y,
|
||||
clientRect.LowerRightCorner.X, clientRect.UpperLeftCorner.Y+skin->getSize(EGDS_MENU_HEIGHT));
|
||||
return;
|
||||
}
|
||||
|
||||
core::rect<s32> 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<s32>(Items[i].PosY, height ,
|
||||
Items[i].PosY+w-5, height+h));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//! returns the item highlight-area
|
||||
core::rect<s32> CGUIMenu::getHRect(const SItem& i, const core::rect<s32>& absolute) const
|
||||
{
|
||||
core::rect<s32> 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<s32> CGUIMenu::getRect(const SItem& i, const core::rect<s32>& 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_
|
||||
|
@ -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<s32> 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<s32> getHRect(const SItem& i, const core::rect<s32>& absolute) const _IRR_OVERRIDE_;
|
||||
|
||||
//! Gets drawing rect of Item
|
||||
virtual core::rect<s32> getRect(const SItem& i, const core::rect<s32>& absolute) const _IRR_OVERRIDE_;
|
||||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
|
||||
#endif // __C_GUI_MENU_H_INCLUDED__
|
||||
#endif // _IRR_COMPILE_WITH_GUI_
|
||||
|
@ -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<s32> 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<f32> 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<s32> 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<s32> 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<s32> 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; i<m->getMeshBufferCount(); ++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_
|
||||
|
@ -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<s32> 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__
|
||||
|
@ -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<s32> 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<s32> & 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<s32> 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<s32> 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<s32> 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<s32> 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<s32> 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<s32> 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<s32>(buttonWidth + buttonDistance, 0);
|
||||
setButton(CancelButton, (Flags & EMBF_CANCEL) != 0, btnRect, skin->getDefaultText(EGDT_MSG_BOX_CANCEL), focusMe);
|
||||
if ( Flags & EMBF_CANCEL )
|
||||
btnRect += core::position2d<s32>(buttonWidth + buttonDistance, 0);
|
||||
setButton(YesButton, (Flags & EMBF_YES) != 0, btnRect, skin->getDefaultText(EGDT_MSG_BOX_YES), focusMe);
|
||||
if ( Flags & EMBF_YES )
|
||||
btnRect += core::position2d<s32>(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_
|
||||
|
@ -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<s32> 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<s32> & 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
|
@ -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<s32>& 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<s32> 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<s32> 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_
|
||||
|
@ -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<s32>& 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
|
||||
|
@ -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<s32> 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; i<Profiler->getGroupCount(); ++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_
|
@ -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<s32> 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<s32>& 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__
|
@ -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 <wchar.h>
|
||||
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
|
||||
//! constructor
|
||||
CGUISpinBox::CGUISpinBox(const wchar_t* text, bool border,IGUIEnvironment* environment,
|
||||
IGUIElement* parent, s32 id, const core::rect<s32>& 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<s32>(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<s32>(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<s32> 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 (max<min)
|
||||
core::swap(min, max);
|
||||
RangeMin = min;
|
||||
RangeMax = max;
|
||||
|
||||
// we have to round the range - otherwise we can get into an infinte setValue/verifyValueRange cycle.
|
||||
wchar_t str[100];
|
||||
swprintf_irr(str, 99, FormatString.c_str(), RangeMin);
|
||||
RangeMin = core::fast_atof(core::stringc(str).c_str());
|
||||
swprintf_irr(str, 99, FormatString.c_str(), RangeMax);
|
||||
RangeMax = core::fast_atof(core::stringc(str).c_str());
|
||||
|
||||
verifyValueRange();
|
||||
}
|
||||
|
||||
|
||||
f32 CGUISpinBox::getMin() const
|
||||
{
|
||||
return RangeMin;
|
||||
}
|
||||
|
||||
|
||||
f32 CGUISpinBox::getMax() const
|
||||
{
|
||||
return RangeMax;
|
||||
}
|
||||
|
||||
|
||||
f32 CGUISpinBox::getStepSize() const
|
||||
{
|
||||
return StepSize;
|
||||
}
|
||||
|
||||
void CGUISpinBox::setStepSize(f32 step)
|
||||
{
|
||||
StepSize = step;
|
||||
}
|
||||
|
||||
|
||||
//! Sets the number of decimal places to display.
|
||||
void CGUISpinBox::setDecimalPlaces(s32 places)
|
||||
{
|
||||
DecimalPlaces = places;
|
||||
if (places == -1)
|
||||
FormatString = "%f";
|
||||
else
|
||||
{
|
||||
FormatString = "%.";
|
||||
FormatString += places;
|
||||
FormatString += "f";
|
||||
}
|
||||
setRange( RangeMin, RangeMax );
|
||||
setValue(getValue());
|
||||
}
|
||||
|
||||
//! Sets when the spinbox has to validate entered text.
|
||||
void CGUISpinBox::setValidateOn(u32 validateOn)
|
||||
{
|
||||
ValidateOn = validateOn;
|
||||
}
|
||||
|
||||
//! Gets when the spinbox has to validate entered text.
|
||||
u32 CGUISpinBox::getValidateOn() const
|
||||
{
|
||||
return ValidateOn;
|
||||
}
|
||||
|
||||
bool CGUISpinBox::OnEvent(const SEvent& event)
|
||||
{
|
||||
if (IsEnabled)
|
||||
{
|
||||
bool changeEvent = false;
|
||||
bool eatEvent = false;
|
||||
switch(event.EventType)
|
||||
{
|
||||
case EET_MOUSE_INPUT_EVENT:
|
||||
switch(event.MouseInput.Event)
|
||||
{
|
||||
case EMIE_MOUSE_WHEEL:
|
||||
{
|
||||
f32 val = getValue() + (StepSize * (event.MouseInput.Wheel < 0 ? -1.f : 1.f));
|
||||
setValue(val);
|
||||
changeEvent = true;
|
||||
eatEvent = true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case EET_GUI_EVENT:
|
||||
|
||||
if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED)
|
||||
{
|
||||
if (event.GUIEvent.Caller == ButtonSpinUp)
|
||||
{
|
||||
f32 val = getValue();
|
||||
val += StepSize;
|
||||
setValue(val);
|
||||
changeEvent = true;
|
||||
}
|
||||
else if ( event.GUIEvent.Caller == ButtonSpinDown)
|
||||
{
|
||||
f32 val = getValue();
|
||||
val -= StepSize;
|
||||
setValue(val);
|
||||
changeEvent = true;
|
||||
}
|
||||
}
|
||||
if (event.GUIEvent.Caller == EditBox)
|
||||
{
|
||||
if ( (event.GUIEvent.EventType == EGET_EDITBOX_CHANGED && ValidateOn & EGUI_SBV_CHANGE)
|
||||
|| (event.GUIEvent.EventType == EGET_EDITBOX_ENTER && ValidateOn & EGUI_SBV_ENTER)
|
||||
|| (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST && ValidateOn & EGUI_SBV_LOSE_FOCUS)
|
||||
)
|
||||
{
|
||||
verifyValueRange();
|
||||
changeEvent = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if ( changeEvent )
|
||||
{
|
||||
SEvent e;
|
||||
e.EventType = EET_GUI_EVENT;
|
||||
e.GUIEvent.Caller = this;
|
||||
e.GUIEvent.Element = 0;
|
||||
|
||||
e.GUIEvent.EventType = EGET_SPINBOX_CHANGED;
|
||||
if ( Parent )
|
||||
Parent->OnEvent(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_
|
||||
|
@ -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<s32>& 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__
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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<s32>& 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<Cell> 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
|
||||
|
@ -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<s32> 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<s32> 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<s32> 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<s32> rect = AbsoluteRect;
|
||||
core::rect<s32>* 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<s32> 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<u32> 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_
|
||||
|
@ -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<s32> 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
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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<CGUITreeViewNode*> Children;
|
||||
// Position of this node in Parent->Children.
|
||||
// Only valid when Parent != NULL
|
||||
std::list<CGUITreeViewNode*>::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<s32> 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
|
||||
|
@ -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<s32> 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<s32>(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<s32>(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<s32>(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<s32>(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<s32> 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<s32>(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<s32> CGUIWindow::getClientRect() const
|
||||
{
|
||||
return ClientRect;
|
||||
}
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif // _IRR_COMPILE_WITH_GUI_
|
||||
|
@ -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<s32> 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<s32> getClientRect() const _IRR_OVERRIDE_;
|
||||
|
||||
protected:
|
||||
|
||||
void updateClientRect();
|
||||
void refreshSprites();
|
||||
|
||||
IGUIButton* CloseButton;
|
||||
IGUIButton* MinButton;
|
||||
IGUIButton* RestoreButton;
|
||||
core::rect<s32> ClientRect;
|
||||
video::SColor CurrentIconColor;
|
||||
|
||||
core::position2d<s32> DragStart;
|
||||
bool Dragging, IsDraggable;
|
||||
bool DrawBackground;
|
||||
bool DrawTitlebar;
|
||||
bool IsActive;
|
||||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
||||
#endif // _IRR_COMPILE_WITH_GUI_
|
||||
|
||||
#endif
|
||||
|
@ -183,7 +183,7 @@ void CImage::copyToScaling(void* target, u32 width, u32 height, ECOLOR_FORMAT fo
|
||||
return;
|
||||
}
|
||||
|
||||
if (!target || !width || !height)
|
||||
if (!target || !width || !height || !Size.Width || !Size.Height)
|
||||
return;
|
||||
|
||||
const u32 bpp=getBitsPerPixelFromFormat(format)/8;
|
||||
@ -298,8 +298,6 @@ void CImage::copyToScalingBoxFilter(IImage* target, s32 bias, bool blend)
|
||||
const f32 sourceXStep = (f32) Size.Width / (f32) destSize.Width;
|
||||
const f32 sourceYStep = (f32) Size.Height / (f32) destSize.Height;
|
||||
|
||||
target->getData();
|
||||
|
||||
s32 fx = core::ceil32( sourceXStep );
|
||||
s32 fy = core::ceil32( sourceYStep );
|
||||
f32 sx;
|
||||
|
@ -40,7 +40,7 @@ void PNGAPI user_read_data_fcn(png_structp png_ptr, png_bytep data, png_size_t l
|
||||
|
||||
// changed by zola {
|
||||
io::IReadFile* file=(io::IReadFile*)png_get_io_ptr(png_ptr);
|
||||
check=(png_size_t) file->read((void*)data,(u32)length);
|
||||
check=(png_size_t) file->read((void*)data, length);
|
||||
// }
|
||||
|
||||
if (check != length)
|
||||
|
@ -46,7 +46,7 @@ void PNGAPI user_write_data_fcn(png_structp png_ptr, png_bytep data, png_size_t
|
||||
png_size_t check;
|
||||
|
||||
io::IWriteFile* file=(io::IWriteFile*)png_get_io_ptr(png_ptr);
|
||||
check=(png_size_t) file->write((const void*)data,(u32)length);
|
||||
check=(png_size_t) file->write((const void*)data, length);
|
||||
|
||||
if (check != length)
|
||||
png_error(png_ptr, "Write Error");
|
||||
|
@ -1,474 +0,0 @@
|
||||
// Copyright (C) 2009-2012 Gaz Davidson
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#include "CIrrDeviceConsole.h"
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_CONSOLE_DEVICE_
|
||||
|
||||
#include "os.h"
|
||||
#include "IGUISkin.h"
|
||||
#include "IGUIEnvironment.h"
|
||||
|
||||
// to close the device on terminate signal
|
||||
irr::CIrrDeviceConsole *DeviceToClose;
|
||||
|
||||
#ifdef _IRR_WINDOWS_NT_CONSOLE_
|
||||
// Callback for Windows
|
||||
BOOL WINAPI ConsoleHandler(DWORD CEvent)
|
||||
{
|
||||
switch(CEvent)
|
||||
{
|
||||
case CTRL_C_EVENT:
|
||||
irr::os::Printer::log("Closing console device", "CTRL+C");
|
||||
break;
|
||||
case CTRL_BREAK_EVENT:
|
||||
irr::os::Printer::log("Closing console device", "CTRL+Break");
|
||||
break;
|
||||
case CTRL_CLOSE_EVENT:
|
||||
irr::os::Printer::log("Closing console device", "User closed console");
|
||||
break;
|
||||
case CTRL_LOGOFF_EVENT:
|
||||
irr::os::Printer::log("Closing console device", "User is logging off");
|
||||
break;
|
||||
case CTRL_SHUTDOWN_EVENT:
|
||||
irr::os::Printer::log("Closing console device", "Computer shutting down");
|
||||
break;
|
||||
}
|
||||
DeviceToClose->closeDevice();
|
||||
return TRUE;
|
||||
}
|
||||
#elif defined(_IRR_POSIX_API_)
|
||||
// sigterm handler
|
||||
#include <signal.h>
|
||||
|
||||
void sighandler(int sig)
|
||||
{
|
||||
irr::core::stringc code = "Signal ";
|
||||
code += sig;
|
||||
code += " received";
|
||||
irr::os::Printer::log("Closing console device", code.c_str());
|
||||
|
||||
DeviceToClose->closeDevice();
|
||||
}
|
||||
#endif
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
const c8 ASCIIArtChars[] = " .,'~:;!+>=icopjtJY56SB8XDQKHNWM"; //MWNHKQDX8BS65YJtjpoci=+>!;:~',. ";
|
||||
const u16 ASCIIArtCharsCount = 32;
|
||||
|
||||
//const c8 ASCIIArtChars[] = " \xb0\xb1\xf9\xb2\xdb";
|
||||
//const u16 ASCIIArtCharsCount = 5;
|
||||
|
||||
//! constructor
|
||||
CIrrDeviceConsole::CIrrDeviceConsole(const SIrrlichtCreationParameters& params)
|
||||
: CIrrDeviceStub(params), IsWindowFocused(true), ConsoleFont(0), OutFile(stdout)
|
||||
{
|
||||
DeviceToClose = this;
|
||||
|
||||
#ifdef _IRR_WINDOWS_NT_CONSOLE_
|
||||
MouseButtonStates = 0;
|
||||
|
||||
WindowsSTDIn = GetStdHandle(STD_INPUT_HANDLE);
|
||||
WindowsSTDOut = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
|
||||
if (CreationParams.Fullscreen)
|
||||
{
|
||||
PCOORD dimensions = 0;
|
||||
if (SetConsoleDisplayMode(WindowsSTDOut, CONSOLE_FULLSCREEN_MODE, dimensions))
|
||||
{
|
||||
CreationParams.WindowSize.Width = dimensions->X;
|
||||
CreationParams.WindowSize.Width = dimensions->Y;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
COORD ConsoleSize;
|
||||
ConsoleSize.X = CreationParams.WindowSize.Width;
|
||||
ConsoleSize.X = CreationParams.WindowSize.Height;
|
||||
SetConsoleScreenBufferSize(WindowsSTDOut, ConsoleSize);
|
||||
}
|
||||
|
||||
// catch windows close/break signals
|
||||
SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleHandler, TRUE);
|
||||
|
||||
#elif defined(_IRR_POSIX_API_)
|
||||
// catch other signals
|
||||
signal(SIGABRT, &sighandler);
|
||||
signal(SIGTERM, &sighandler);
|
||||
signal(SIGINT, &sighandler);
|
||||
|
||||
// set output stream
|
||||
if (params.WindowId)
|
||||
OutFile = (FILE*)(params.WindowId);
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_VT100_CONSOLE_
|
||||
// reset terminal
|
||||
fprintf(OutFile, "%cc", 27);
|
||||
// disable line wrapping
|
||||
fprintf(OutFile, "%c[7l", 27);
|
||||
#endif
|
||||
|
||||
switch (params.DriverType)
|
||||
{
|
||||
case video::EDT_SOFTWARE:
|
||||
#ifdef _IRR_COMPILE_WITH_SOFTWARE_
|
||||
VideoDriver = video::createSoftwareDriver(CreationParams.WindowSize, CreationParams.Fullscreen, FileSystem, this);
|
||||
#else
|
||||
os::Printer::log("Software driver was not compiled in.", ELL_ERROR);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case video::EDT_BURNINGSVIDEO:
|
||||
#ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_
|
||||
VideoDriver = video::createBurningVideoDriver(CreationParams, FileSystem, this);
|
||||
#else
|
||||
os::Printer::log("Burning's Video driver was not compiled in.", ELL_ERROR);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case video::EDT_DIRECT3D9:
|
||||
case video::EDT_OPENGL:
|
||||
os::Printer::log("The console device cannot use hardware drivers yet.", ELL_ERROR);
|
||||
break;
|
||||
case video::EDT_NULL:
|
||||
VideoDriver = video::createNullDriver(FileSystem, CreationParams.WindowSize);
|
||||
break;
|
||||
default:
|
||||
os::Printer::log("Unsupported device.", ELL_ERROR);
|
||||
break;
|
||||
}
|
||||
|
||||
// set up output buffer
|
||||
for (u32 y=0; y<CreationParams.WindowSize.Height; ++y)
|
||||
{
|
||||
core::stringc str;
|
||||
str.reserve(CreationParams.WindowSize.Width);
|
||||
for (u32 x=0; x<CreationParams.WindowSize.Width; ++x)
|
||||
str += " ";
|
||||
OutputBuffer.push_back(str);
|
||||
}
|
||||
|
||||
|
||||
#ifdef _IRR_WINDOWS_NT_CONSOLE_
|
||||
CursorControl = new CCursorControl(CreationParams.WindowSize);
|
||||
#endif
|
||||
|
||||
if (VideoDriver)
|
||||
{
|
||||
createGUIAndScene();
|
||||
#ifdef _IRR_USE_CONSOLE_FONT_
|
||||
if (GUIEnvironment)
|
||||
{
|
||||
ConsoleFont = new gui::CGUIConsoleFont(this);
|
||||
gui::IGUISkin *skin = GUIEnvironment->getSkin();
|
||||
if (skin)
|
||||
{
|
||||
for (u32 i=0; i < gui::EGDF_COUNT; ++i)
|
||||
skin->setFont(ConsoleFont, gui::EGUI_DEFAULT_FONT(i));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
//! destructor
|
||||
CIrrDeviceConsole::~CIrrDeviceConsole()
|
||||
{
|
||||
// GUI and scene are dropped in the stub
|
||||
if (CursorControl)
|
||||
{
|
||||
CursorControl->drop();
|
||||
CursorControl = 0;
|
||||
}
|
||||
if (ConsoleFont)
|
||||
{
|
||||
ConsoleFont->drop();
|
||||
ConsoleFont = 0;
|
||||
}
|
||||
#ifdef _IRR_VT100_CONSOLE_
|
||||
// reset terminal
|
||||
fprintf(OutFile, "%cc", 27);
|
||||
#endif
|
||||
}
|
||||
|
||||
//! runs the device. Returns false if device wants to be deleted
|
||||
bool CIrrDeviceConsole::run()
|
||||
{
|
||||
// increment timer
|
||||
os::Timer::tick();
|
||||
|
||||
// process Windows console input
|
||||
#ifdef _IRR_WINDOWS_NT_CONSOLE_
|
||||
|
||||
INPUT_RECORD in;
|
||||
DWORD oldMode;
|
||||
DWORD count, waste;
|
||||
|
||||
// get old input mode
|
||||
GetConsoleMode(WindowsSTDIn, &oldMode);
|
||||
SetConsoleMode(WindowsSTDIn, ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT);
|
||||
|
||||
GetNumberOfConsoleInputEvents(WindowsSTDIn, &count);
|
||||
|
||||
// read keyboard and mouse input
|
||||
while (count)
|
||||
{
|
||||
ReadConsoleInput(WindowsSTDIn, &in, 1, &waste );
|
||||
switch(in.EventType)
|
||||
{
|
||||
case KEY_EVENT:
|
||||
{
|
||||
SEvent e;
|
||||
e.EventType = EET_KEY_INPUT_EVENT;
|
||||
e.KeyInput.PressedDown = (in.Event.KeyEvent.bKeyDown == TRUE);
|
||||
e.KeyInput.Control = (in.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) != 0;
|
||||
e.KeyInput.Shift = (in.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED) != 0;
|
||||
e.KeyInput.Key = EKEY_CODE(in.Event.KeyEvent.wVirtualKeyCode);
|
||||
e.KeyInput.Char = in.Event.KeyEvent.uChar.UnicodeChar;
|
||||
postEventFromUser(e);
|
||||
break;
|
||||
}
|
||||
case MOUSE_EVENT:
|
||||
{
|
||||
SEvent e;
|
||||
e.EventType = EET_MOUSE_INPUT_EVENT;
|
||||
e.MouseInput.X = in.Event.MouseEvent.dwMousePosition.X;
|
||||
e.MouseInput.Y = in.Event.MouseEvent.dwMousePosition.Y;
|
||||
e.MouseInput.Wheel = 0.f;
|
||||
e.MouseInput.ButtonStates =
|
||||
( (in.Event.MouseEvent.dwButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) ? EMBSM_LEFT : 0 ) |
|
||||
( (in.Event.MouseEvent.dwButtonState & RIGHTMOST_BUTTON_PRESSED) ? EMBSM_RIGHT : 0 ) |
|
||||
( (in.Event.MouseEvent.dwButtonState & FROM_LEFT_2ND_BUTTON_PRESSED) ? EMBSM_MIDDLE : 0 ) |
|
||||
( (in.Event.MouseEvent.dwButtonState & FROM_LEFT_3RD_BUTTON_PRESSED) ? EMBSM_EXTRA1 : 0 ) |
|
||||
( (in.Event.MouseEvent.dwButtonState & FROM_LEFT_4TH_BUTTON_PRESSED) ? EMBSM_EXTRA2 : 0 );
|
||||
|
||||
if (in.Event.MouseEvent.dwEventFlags & MOUSE_MOVED)
|
||||
{
|
||||
CursorControl->setPosition(core::position2di(e.MouseInput.X, e.MouseInput.Y));
|
||||
|
||||
// create mouse moved event
|
||||
e.MouseInput.Event = EMIE_MOUSE_MOVED;
|
||||
postEventFromUser(e);
|
||||
}
|
||||
|
||||
if (in.Event.MouseEvent.dwEventFlags & MOUSE_WHEELED)
|
||||
{
|
||||
e.MouseInput.Event = EMIE_MOUSE_WHEEL;
|
||||
e.MouseInput.Wheel = (in.Event.MouseEvent.dwButtonState & 0xFF000000) ? -1.0f : 1.0f;
|
||||
postEventFromUser(e);
|
||||
}
|
||||
|
||||
if ( (MouseButtonStates & EMBSM_LEFT) != (e.MouseInput.ButtonStates & EMBSM_LEFT) )
|
||||
{
|
||||
e.MouseInput.Event = (e.MouseInput.ButtonStates & EMBSM_LEFT) ? EMIE_LMOUSE_PRESSED_DOWN : EMIE_LMOUSE_LEFT_UP;
|
||||
postEventFromUser(e);
|
||||
}
|
||||
|
||||
if ( (MouseButtonStates & EMBSM_RIGHT) != (e.MouseInput.ButtonStates & EMBSM_RIGHT) )
|
||||
{
|
||||
e.MouseInput.Event = (e.MouseInput.ButtonStates & EMBSM_RIGHT) ? EMIE_RMOUSE_PRESSED_DOWN : EMIE_RMOUSE_LEFT_UP;
|
||||
postEventFromUser(e);
|
||||
}
|
||||
|
||||
if ( (MouseButtonStates & EMBSM_MIDDLE) != (e.MouseInput.ButtonStates & EMBSM_MIDDLE) )
|
||||
{
|
||||
e.MouseInput.Event = (e.MouseInput.ButtonStates & EMBSM_MIDDLE) ? EMIE_MMOUSE_PRESSED_DOWN : EMIE_MMOUSE_LEFT_UP;
|
||||
postEventFromUser(e);
|
||||
}
|
||||
|
||||
// save current button states
|
||||
MouseButtonStates = e.MouseInput.ButtonStates;
|
||||
|
||||
break;
|
||||
}
|
||||
case WINDOW_BUFFER_SIZE_EVENT:
|
||||
VideoDriver->OnResize(
|
||||
core::dimension2d<u32>(in.Event.WindowBufferSizeEvent.dwSize.X,
|
||||
in.Event.WindowBufferSizeEvent.dwSize.Y));
|
||||
break;
|
||||
case FOCUS_EVENT:
|
||||
IsWindowFocused = (in.Event.FocusEvent.bSetFocus == TRUE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
GetNumberOfConsoleInputEvents(WindowsSTDIn, &count);
|
||||
}
|
||||
|
||||
// set input mode
|
||||
SetConsoleMode(WindowsSTDIn, oldMode);
|
||||
#else
|
||||
// todo: keyboard input from terminal in raw mode
|
||||
#endif
|
||||
|
||||
return !Close;
|
||||
}
|
||||
|
||||
//! Cause the device to temporarily pause execution and let other processes to run
|
||||
// This should bring down processor usage without major performance loss for Irrlicht
|
||||
void CIrrDeviceConsole::yield()
|
||||
{
|
||||
#ifdef _IRR_WINDOWS_API_
|
||||
Sleep(1);
|
||||
#else
|
||||
struct timespec ts = {0,0};
|
||||
nanosleep(&ts, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
//! Pause execution and let other processes to run for a specified amount of time.
|
||||
void CIrrDeviceConsole::sleep(u32 timeMs, bool pauseTimer)
|
||||
{
|
||||
const bool wasStopped = Timer ? Timer->isStopped() : true;
|
||||
|
||||
#ifdef _IRR_WINDOWS_API_
|
||||
Sleep(timeMs);
|
||||
#else
|
||||
struct timespec ts;
|
||||
ts.tv_sec = (time_t) (timeMs / 1000);
|
||||
ts.tv_nsec = (long) (timeMs % 1000) * 1000000;
|
||||
|
||||
if (pauseTimer && !wasStopped)
|
||||
Timer->stop();
|
||||
|
||||
nanosleep(&ts, NULL);
|
||||
#endif
|
||||
|
||||
if (pauseTimer && !wasStopped)
|
||||
Timer->start();
|
||||
}
|
||||
|
||||
//! sets the caption of the window
|
||||
void CIrrDeviceConsole::setWindowCaption(const wchar_t* text)
|
||||
{
|
||||
#ifdef _IRR_WINDOWS_NT_CONSOLE_
|
||||
SetConsoleTitleW(text);
|
||||
#endif
|
||||
}
|
||||
|
||||
//! returns if window is active. if not, nothing need to be drawn
|
||||
bool CIrrDeviceConsole::isWindowActive() const
|
||||
{
|
||||
// there is no window, but we always assume it is active
|
||||
return true;
|
||||
}
|
||||
|
||||
//! returns if window has focus
|
||||
bool CIrrDeviceConsole::isWindowFocused() const
|
||||
{
|
||||
return IsWindowFocused;
|
||||
}
|
||||
|
||||
//! returns if window is minimized
|
||||
bool CIrrDeviceConsole::isWindowMinimized() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//! presents a surface in the client area
|
||||
bool CIrrDeviceConsole::present(video::IImage* surface, void* windowId, core::rect<s32>* src)
|
||||
{
|
||||
|
||||
if (surface)
|
||||
{
|
||||
for (u32 y=0; y < surface->getDimension().Height; ++y)
|
||||
{
|
||||
for (u32 x=0; x< surface->getDimension().Width; ++x)
|
||||
{
|
||||
// get average pixel
|
||||
u32 avg = surface->getPixel(x,y).getAverage() * (ASCIIArtCharsCount-1);
|
||||
avg /= 255;
|
||||
OutputBuffer[y] [x] = ASCIIArtChars[avg];
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef _IRR_USE_CONSOLE_FONT_
|
||||
for (u32 i=0; i< Text.size(); ++i)
|
||||
{
|
||||
s32 y = Text[i].Pos.Y;
|
||||
|
||||
if ( y < (s32)OutputBuffer.size() && y > 0)
|
||||
for (u32 c=0; c < Text[i].Text.size() && c + Text[i].Pos.X < OutputBuffer[y].size(); ++c)
|
||||
//if (Text[i].Text[c] != ' ')
|
||||
OutputBuffer[y] [c+Text[i].Pos.X] = Text[i].Text[c];
|
||||
}
|
||||
Text.clear();
|
||||
#endif
|
||||
|
||||
// draw output
|
||||
for (u32 y=0; y<OutputBuffer.size(); ++y)
|
||||
{
|
||||
setTextCursorPos(0,y);
|
||||
fprintf(OutFile, "%s", OutputBuffer[y].c_str());
|
||||
}
|
||||
return surface != 0;
|
||||
}
|
||||
|
||||
//! notifies the device that it should close itself
|
||||
void CIrrDeviceConsole::closeDevice()
|
||||
{
|
||||
// return false next time we run()
|
||||
Close = true;
|
||||
}
|
||||
|
||||
|
||||
//! Sets if the window should be resizable in windowed mode.
|
||||
void CIrrDeviceConsole::setResizable(bool resize)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
|
||||
//! Minimize the window.
|
||||
void CIrrDeviceConsole::minimizeWindow()
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
|
||||
//! Maximize window
|
||||
void CIrrDeviceConsole::maximizeWindow()
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
|
||||
//! Restore original window size
|
||||
void CIrrDeviceConsole::restoreWindow()
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
|
||||
void CIrrDeviceConsole::setTextCursorPos(s16 x, s16 y)
|
||||
{
|
||||
#ifdef _IRR_WINDOWS_NT_CONSOLE_
|
||||
// move WinNT cursor
|
||||
COORD Position;
|
||||
Position.X = x;
|
||||
Position.Y = y;
|
||||
SetConsoleCursorPosition(WindowsSTDOut, Position);
|
||||
#elif defined(_IRR_VT100_CONSOLE_)
|
||||
// send escape code
|
||||
fprintf(OutFile, "%c[%d;%dH", 27, y, x);
|
||||
#else
|
||||
// not implemented
|
||||
#endif
|
||||
}
|
||||
|
||||
void CIrrDeviceConsole::addPostPresentText(s16 X, s16 Y, const wchar_t *text)
|
||||
{
|
||||
SPostPresentText p;
|
||||
p.Text = text;
|
||||
p.Pos.X = X;
|
||||
p.Pos.Y = Y;
|
||||
Text.push_back(p);
|
||||
}
|
||||
|
||||
} // end namespace irr
|
||||
|
||||
#endif // _IRR_COMPILE_WITH_CONSOLE_DEVICE_
|
@ -1,332 +0,0 @@
|
||||
// Copyright (C) 2009-2012 Gaz Davidson
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __C_IRR_DEVICE_CONSOLE_H_INCLUDED__
|
||||
#define __C_IRR_DEVICE_CONSOLE_H_INCLUDED__
|
||||
|
||||
#include "IrrCompileConfig.h"
|
||||
#ifdef _IRR_COMPILE_WITH_CONSOLE_DEVICE_
|
||||
|
||||
//#define _IRR_USE_CONSOLE_FONT_
|
||||
|
||||
#include "SIrrCreationParameters.h"
|
||||
#include "CIrrDeviceStub.h"
|
||||
#include "IImagePresenter.h"
|
||||
// for console font
|
||||
#include "IGUIFont.h"
|
||||
|
||||
#ifdef _IRR_WINDOWS_API_
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#define _IRR_WINDOWS_NT_CONSOLE_
|
||||
#else
|
||||
#include <time.h>
|
||||
#endif
|
||||
|
||||
// for now we assume all other terminal types are VT100
|
||||
#ifndef _IRR_WINDOWS_NT_CONSOLE_
|
||||
#define _IRR_VT100_CONSOLE_
|
||||
#endif
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
class CIrrDeviceConsole : public CIrrDeviceStub, video::IImagePresenter
|
||||
{
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
CIrrDeviceConsole(const SIrrlichtCreationParameters& params);
|
||||
|
||||
//! destructor
|
||||
virtual ~CIrrDeviceConsole();
|
||||
|
||||
//! runs the device. Returns false if device wants to be deleted
|
||||
virtual bool run() _IRR_OVERRIDE_;
|
||||
|
||||
//! Cause the device to temporarily pause execution and let other processes to run
|
||||
// This should bring down processor usage without major performance loss for Irrlicht
|
||||
virtual void yield() _IRR_OVERRIDE_;
|
||||
|
||||
//! Pause execution and let other processes to run for a specified amount of time.
|
||||
virtual void sleep(u32 timeMs, bool pauseTimer) _IRR_OVERRIDE_;
|
||||
|
||||
//! sets the caption of the window
|
||||
virtual void setWindowCaption(const wchar_t* text) _IRR_OVERRIDE_;
|
||||
|
||||
//! returns if window is active. if not, nothing need to be drawn
|
||||
virtual bool isWindowActive() const _IRR_OVERRIDE_;
|
||||
|
||||
//! returns if window has focus
|
||||
virtual bool isWindowFocused() const _IRR_OVERRIDE_;
|
||||
|
||||
//! returns if window is minimized
|
||||
virtual bool isWindowMinimized() const _IRR_OVERRIDE_;
|
||||
|
||||
//! returns current window position (not supported for this device)
|
||||
virtual core::position2di getWindowPosition() _IRR_OVERRIDE_
|
||||
{
|
||||
return core::position2di(-1, -1);
|
||||
}
|
||||
|
||||
//! presents a surface in the client area
|
||||
virtual bool present(video::IImage* surface, void* windowId=0, core::rect<s32>* src=0) _IRR_OVERRIDE_;
|
||||
|
||||
//! notifies the device that it should close itself
|
||||
virtual void closeDevice() _IRR_OVERRIDE_;
|
||||
|
||||
//! Sets if the window should be resizable in windowed mode.
|
||||
virtual void setResizable(bool resize=false) _IRR_OVERRIDE_;
|
||||
|
||||
//! Minimizes the window.
|
||||
virtual void minimizeWindow() _IRR_OVERRIDE_;
|
||||
|
||||
//! Maximizes the window.
|
||||
virtual void maximizeWindow() _IRR_OVERRIDE_;
|
||||
|
||||
//! Restores the window size.
|
||||
virtual void restoreWindow() _IRR_OVERRIDE_;
|
||||
|
||||
//! Get the device type
|
||||
virtual E_DEVICE_TYPE getType() const _IRR_OVERRIDE_
|
||||
{
|
||||
return EIDT_CONSOLE;
|
||||
}
|
||||
|
||||
void addPostPresentText(s16 X, s16 Y, const wchar_t *text);
|
||||
|
||||
//! Implementation of the win32 console mouse cursor
|
||||
class CCursorControl : public gui::ICursorControl
|
||||
{
|
||||
public:
|
||||
|
||||
CCursorControl(const core::dimension2d<u32>& wsize)
|
||||
: WindowSize(wsize), InvWindowSize(0.0f, 0.0f), IsVisible(true), UseReferenceRect(false)
|
||||
{
|
||||
if (WindowSize.Width!=0)
|
||||
InvWindowSize.Width = 1.0f / WindowSize.Width;
|
||||
|
||||
if (WindowSize.Height!=0)
|
||||
InvWindowSize.Height = 1.0f / WindowSize.Height;
|
||||
}
|
||||
|
||||
//! Changes the visible state of the mouse cursor.
|
||||
virtual void setVisible(bool visible) _IRR_OVERRIDE_
|
||||
{
|
||||
if(visible != IsVisible)
|
||||
{
|
||||
IsVisible = visible;
|
||||
setPosition(CursorPos.X, CursorPos.Y);
|
||||
}
|
||||
}
|
||||
|
||||
//! Returns if the cursor is currently visible.
|
||||
virtual bool isVisible() const _IRR_OVERRIDE_
|
||||
{
|
||||
return IsVisible;
|
||||
}
|
||||
|
||||
//! Sets the new position of the cursor.
|
||||
virtual void setPosition(const core::position2d<f32> &pos) _IRR_OVERRIDE_
|
||||
{
|
||||
setPosition(pos.X, pos.Y);
|
||||
}
|
||||
|
||||
//! Sets the new position of the cursor.
|
||||
virtual void setPosition(f32 x, f32 y) _IRR_OVERRIDE_
|
||||
{
|
||||
if (!UseReferenceRect)
|
||||
setPosition((s32)(x*WindowSize.Width), (s32)(y*WindowSize.Height));
|
||||
else
|
||||
setPosition((s32)(x*ReferenceRect.getWidth()), (s32)(y*ReferenceRect.getHeight()));
|
||||
}
|
||||
|
||||
//! Sets the new position of the cursor.
|
||||
virtual void setPosition(const core::position2d<s32> &pos) _IRR_OVERRIDE_
|
||||
{
|
||||
setPosition(pos.X, pos.Y);
|
||||
}
|
||||
|
||||
//! Sets the new position of the cursor.
|
||||
virtual void setPosition(s32 x, s32 y) _IRR_OVERRIDE_
|
||||
{
|
||||
setInternalCursorPosition(core::position2di(x,y));
|
||||
}
|
||||
|
||||
//! Returns the current position of the mouse cursor.
|
||||
virtual const core::position2d<s32>& getPosition(bool updateCursor) _IRR_OVERRIDE_
|
||||
{
|
||||
return CursorPos;
|
||||
}
|
||||
|
||||
//! Returns the current position of the mouse cursor.
|
||||
virtual core::position2d<f32> getRelativePosition(bool updateCursor) _IRR_OVERRIDE_
|
||||
{
|
||||
if (!UseReferenceRect)
|
||||
{
|
||||
return core::position2d<f32>(CursorPos.X * InvWindowSize.Width,
|
||||
CursorPos.Y * InvWindowSize.Height);
|
||||
}
|
||||
|
||||
return core::position2d<f32>(CursorPos.X / (f32)ReferenceRect.getWidth(),
|
||||
CursorPos.Y / (f32)ReferenceRect.getHeight());
|
||||
}
|
||||
|
||||
//! Sets an absolute reference rect for calculating the cursor position.
|
||||
virtual void setReferenceRect(core::rect<s32>* rect=0) _IRR_OVERRIDE_
|
||||
{
|
||||
if (rect)
|
||||
{
|
||||
ReferenceRect = *rect;
|
||||
UseReferenceRect = true;
|
||||
|
||||
// prevent division through zero and uneven sizes
|
||||
|
||||
if (!ReferenceRect.getHeight() || ReferenceRect.getHeight()%2)
|
||||
ReferenceRect.LowerRightCorner.Y += 1;
|
||||
|
||||
if (!ReferenceRect.getWidth() || ReferenceRect.getWidth()%2)
|
||||
ReferenceRect.LowerRightCorner.X += 1;
|
||||
}
|
||||
else
|
||||
UseReferenceRect = false;
|
||||
}
|
||||
|
||||
|
||||
//! Updates the internal cursor position
|
||||
void setInternalCursorPosition(const core::position2di &pos)
|
||||
{
|
||||
CursorPos = pos;
|
||||
|
||||
if (UseReferenceRect)
|
||||
CursorPos -= ReferenceRect.UpperLeftCorner;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
core::position2d<s32> CursorPos;
|
||||
core::dimension2d<u32> WindowSize;
|
||||
core::dimension2d<f32> InvWindowSize;
|
||||
bool IsVisible;
|
||||
bool UseReferenceRect;
|
||||
core::rect<s32> ReferenceRect;
|
||||
};
|
||||
|
||||
private:
|
||||
|
||||
//! Set the position of the text caret
|
||||
void setTextCursorPos(s16 x, s16 y);
|
||||
|
||||
// text to be added after drawing the screen
|
||||
struct SPostPresentText
|
||||
{
|
||||
core::position2d<s16> Pos;
|
||||
core::stringc Text;
|
||||
};
|
||||
|
||||
bool IsWindowFocused;
|
||||
|
||||
core::array<core::stringc> OutputBuffer;
|
||||
gui::IGUIFont *ConsoleFont;
|
||||
core::array<SPostPresentText> Text;
|
||||
|
||||
FILE *OutFile;
|
||||
|
||||
#ifdef _IRR_WINDOWS_NT_CONSOLE_
|
||||
HANDLE WindowsSTDIn, WindowsSTDOut;
|
||||
u32 MouseButtonStates;
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef _IRR_USE_CONSOLE_FONT_
|
||||
|
||||
namespace gui
|
||||
{
|
||||
class CGUIConsoleFont : public IGUIFont
|
||||
{
|
||||
public:
|
||||
|
||||
CGUIConsoleFont(CIrrDeviceConsole* device) : Device(device) { }
|
||||
|
||||
//! Draws some text and clips it to the specified rectangle if wanted.
|
||||
virtual void draw(const wchar_t* text, const core::rect<s32>& position,
|
||||
video::SColor color, bool hcenter=false, bool vcenter=false,
|
||||
const core::rect<s32>* clip=0) _IRR_OVERRIDE_
|
||||
{
|
||||
core::rect<s32> Area = clip ? *clip : position;
|
||||
|
||||
if (Area.UpperLeftCorner.X < 0)
|
||||
Area.UpperLeftCorner.X = 0;
|
||||
|
||||
if (Area.UpperLeftCorner.Y < 0)
|
||||
Area.UpperLeftCorner.Y = 0;
|
||||
|
||||
core::position2d<s16> pos;
|
||||
|
||||
// centre vertically
|
||||
pos.Y = vcenter ? (position.UpperLeftCorner.Y + position.LowerRightCorner.Y) / 2 : position.UpperLeftCorner.Y;
|
||||
|
||||
// nothing to display?
|
||||
if (pos.Y < Area.UpperLeftCorner.Y || pos.Y > Area.LowerRightCorner.Y)
|
||||
return;
|
||||
|
||||
tempText = text;
|
||||
|
||||
// centre horizontally
|
||||
pos.X = hcenter ? position.getCenter().X - ( tempText.size() / 2) : position.UpperLeftCorner.X;
|
||||
|
||||
// clip
|
||||
u32 xlclip = 0,
|
||||
xrclip = 0;
|
||||
|
||||
// get right clip
|
||||
if (pos.X + (s32)tempText.size() > Area.LowerRightCorner.X)
|
||||
xrclip = Area.LowerRightCorner.X - pos.X;
|
||||
|
||||
// get left clip
|
||||
if (pos.X < Area.UpperLeftCorner.X)
|
||||
xlclip = Area.UpperLeftCorner.X - pos.X;
|
||||
|
||||
// totally clipped?
|
||||
if ((s32)tempText.size() - xlclip - xrclip < 0)
|
||||
return;
|
||||
|
||||
// null terminate the string
|
||||
if (xrclip > 0)
|
||||
tempText[xrclip] = L'\0';
|
||||
|
||||
Device->addPostPresentText(pos.X + xlclip, pos.Y, &(tempText.c_str()[xlclip]));
|
||||
}
|
||||
|
||||
//! Calculates the dimension of some text.
|
||||
virtual core::dimension2d<u32> getDimension(const wchar_t* text) const _IRR_OVERRIDE_
|
||||
{
|
||||
return core::dimension2d<u32>(wcslen(text),1);
|
||||
}
|
||||
|
||||
//! Calculates the index of the character in the text which is on a specific position.
|
||||
virtual s32 getCharacterFromPos(const wchar_t* text, s32 pixel_x) const _IRR_OVERRIDE_ { return pixel_x; } _IRR_OVERRIDE_;
|
||||
|
||||
//! No kerning
|
||||
virtual void setKerningWidth (s32 kerning) _IRR_OVERRIDE_ { }
|
||||
virtual void setKerningHeight (s32 kerning) _IRR_OVERRIDE_ { }
|
||||
virtual s32 getKerningWidth(const wchar_t* thisLetter=0, const wchar_t* previousLetter=0) const _IRR_OVERRIDE_ {return 0;}
|
||||
virtual s32 getKerningHeight() const _IRR_OVERRIDE_ { return 0;}
|
||||
virtual void setInvisibleCharacters( const wchar_t *s ) _IRR_OVERRIDE_ { }
|
||||
// I guess this is an OS specific font
|
||||
virtual EGUI_FONT_TYPE getType() const _IRR_OVERRIDE_ { return EGFT_OS; }
|
||||
private:
|
||||
CIrrDeviceConsole* Device;
|
||||
core::stringw tempText;
|
||||
};
|
||||
|
||||
} // end namespace gui
|
||||
|
||||
#endif // _IRR_USE_CONSOLE_FONT_
|
||||
|
||||
} // end namespace irr
|
||||
|
||||
#endif // _IRR_COMPILE_WITH_CONSOLE_DEVICE_
|
||||
#endif // __C_IRR_DEVICE_CONSOLE_H_INCLUDED__
|
||||
|
@ -1,536 +0,0 @@
|
||||
// Copyright (C) 2002-2007 Nikolaus Gebhardt
|
||||
// Copyright (C) 2007-2012 Christian Stehno
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#include "CIrrDeviceFB.h"
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_FB_DEVICE_
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "IEventReceiver.h"
|
||||
#include "os.h"
|
||||
#include "CTimer.h"
|
||||
#include "irrString.h"
|
||||
#include "Keycodes.h"
|
||||
#include "COSOperator.h"
|
||||
#include "CColorConverter.h"
|
||||
#include "SIrrCreationParameters.h"
|
||||
#include "CEGLManager.h"
|
||||
|
||||
#include <linux/input.h>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
#ifdef _IRR_COMPILE_WITH_OGLES1_
|
||||
IVideoDriver* createOGLES1Driver(const SIrrlichtCreationParameters& params,
|
||||
io::IFileSystem* io, video::IContextManager* contextManager);
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_OGLES2_
|
||||
IVideoDriver* createOGLES2Driver(const SIrrlichtCreationParameters& params,
|
||||
io::IFileSystem* io, video::IContextManager* contextManager);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
//! constructor
|
||||
CIrrDeviceFB::CIrrDeviceFB(const SIrrlichtCreationParameters& params)
|
||||
: CIrrDeviceStub(params), Framebuffer(-1), EventDevice(-1), SoftwareImage(0),
|
||||
Pitch(0), FBColorFormat(video::ECF_A8R8G8B8), Close(false)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
setDebugName("CIrrDeviceFB");
|
||||
#endif
|
||||
|
||||
// print version, distribution etc.
|
||||
// thx to LynxLuna for pointing me to the uname function
|
||||
core::stringc linuxversion;
|
||||
struct utsname FBInfo;
|
||||
uname(&FBInfo);
|
||||
|
||||
linuxversion += FBInfo.sysname;
|
||||
linuxversion += " ";
|
||||
linuxversion += FBInfo.release;
|
||||
linuxversion += " ";
|
||||
linuxversion += FBInfo.version;
|
||||
linuxversion += " ";
|
||||
linuxversion += FBInfo.machine;
|
||||
|
||||
Operator = new COSOperator(linuxversion);
|
||||
os::Printer::log(linuxversion.c_str(), ELL_INFORMATION);
|
||||
|
||||
// create window
|
||||
if (params.DriverType != video::EDT_NULL)
|
||||
{
|
||||
// create the window, only if we do not use the null device
|
||||
if (!createWindow(params.WindowSize, params.Bits))
|
||||
return;
|
||||
}
|
||||
|
||||
// create cursor control
|
||||
CursorControl = new CCursorControl(this, params.DriverType == video::EDT_NULL);
|
||||
|
||||
// create driver
|
||||
createDriver();
|
||||
|
||||
if (!VideoDriver)
|
||||
return;
|
||||
|
||||
createGUIAndScene();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//! destructor
|
||||
CIrrDeviceFB::~CIrrDeviceFB()
|
||||
{
|
||||
if (SoftwareImage)
|
||||
munmap(SoftwareImage, CreationParams.WindowSize.Height*Pitch);
|
||||
// go back to previous format
|
||||
if (ioctl(Framebuffer, FBIOPUT_VSCREENINFO, &oldscreeninfo) <0)
|
||||
perror("Restoring old fb mode");
|
||||
|
||||
if (KeyboardDevice != -1)
|
||||
if (ioctl(KeyboardDevice, KDSETMODE, &KeyboardMode) <0)
|
||||
perror("Restoring keyboard mode");
|
||||
if (EventDevice != -1)
|
||||
close(EventDevice);
|
||||
if (KeyboardDevice != -1)
|
||||
close(KeyboardDevice);
|
||||
if (Framebuffer != -1)
|
||||
close(Framebuffer);
|
||||
}
|
||||
|
||||
|
||||
bool CIrrDeviceFB::createWindow(const core::dimension2d<u32>& windowSize, u32 bits)
|
||||
{
|
||||
char buf[256];
|
||||
CreationParams.WindowSize.Width = windowSize.Width;
|
||||
CreationParams.WindowSize.Height = windowSize.Height;
|
||||
|
||||
KeyboardDevice = open("/dev/tty", O_RDWR);
|
||||
if (KeyboardDevice == -1)
|
||||
perror("Open keyboard");
|
||||
if (ioctl(KeyboardDevice, KDGETMODE, &KeyboardMode) <0)
|
||||
perror("Read keyboard mode");
|
||||
if (ioctl(KeyboardDevice, KDSETMODE, KD_GRAPHICS) <0)
|
||||
perror("Set keyboard mode");
|
||||
|
||||
Framebuffer=open("/dev/fb/0", O_RDWR);
|
||||
if (Framebuffer == -1)
|
||||
{
|
||||
Framebuffer=open("/dev/fb0", O_RDWR);
|
||||
if (Framebuffer == -1)
|
||||
{
|
||||
perror("Open framebuffer");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
EventDevice = open("/dev/input/event0", O_RDONLY | O_NONBLOCK);
|
||||
if (EventDevice == -1)
|
||||
perror("Open event device");
|
||||
|
||||
// make format settings
|
||||
ioctl(Framebuffer, FBIOGET_FSCREENINFO, &fbfixscreeninfo);
|
||||
ioctl(Framebuffer, FBIOGET_VSCREENINFO, &oldscreeninfo);
|
||||
snprintf_irr(buf, 256, "Original resolution: %d x %d\nARGB%d%d%d%d\n",oldscreeninfo.xres,oldscreeninfo.yres,
|
||||
oldscreeninfo.transp.length,oldscreeninfo.red.length,oldscreeninfo.green.length,oldscreeninfo.blue.length);
|
||||
os::Printer::log(buf);
|
||||
memcpy(&fbscreeninfo, &oldscreeninfo, sizeof(struct fb_var_screeninfo));
|
||||
if (CreationParams.DriverType != video::EDT_NULL)
|
||||
{
|
||||
fbscreeninfo.xres = fbscreeninfo.xres_virtual = CreationParams.WindowSize.Width;
|
||||
fbscreeninfo.yres = fbscreeninfo.yres_virtual = CreationParams.WindowSize.Height;
|
||||
fbscreeninfo.bits_per_pixel = 16;
|
||||
fbscreeninfo.red.offset = 10;
|
||||
fbscreeninfo.red.length = 5;
|
||||
fbscreeninfo.green.offset = 5;
|
||||
fbscreeninfo.green.length = 5;
|
||||
fbscreeninfo.blue.offset = 0;
|
||||
fbscreeninfo.blue.length = 5;
|
||||
fbscreeninfo.transp.offset = 15;
|
||||
fbscreeninfo.transp.length = 1;
|
||||
ioctl(Framebuffer, FBIOPUT_VSCREENINFO, &fbscreeninfo);
|
||||
ioctl(Framebuffer, FBIOGET_VSCREENINFO, &fbscreeninfo);
|
||||
|
||||
snprintf_irr(buf, 256, "New resolution: %d x %d (%d x %d)\nARGB%d%d%d%d\n",fbscreeninfo.xres,fbscreeninfo.yres,fbscreeninfo.xres_virtual,fbscreeninfo.yres_virtual,
|
||||
fbscreeninfo.transp.length,fbscreeninfo.red.length,fbscreeninfo.green.length,fbscreeninfo.blue.length);
|
||||
os::Printer::log(buf);
|
||||
|
||||
CreationParams.WindowSize.Width = fbscreeninfo.xres;
|
||||
CreationParams.WindowSize.Height = fbscreeninfo.yres;
|
||||
CreationParams.Bits = fbscreeninfo.bits_per_pixel;
|
||||
Pitch = fbfixscreeninfo.line_length;
|
||||
if (fbscreeninfo.bits_per_pixel == 16)
|
||||
{
|
||||
if (fbscreeninfo.transp.length == 0)
|
||||
FBColorFormat = video::ECF_R5G6B5;
|
||||
else
|
||||
FBColorFormat = video::ECF_A1R5G5B5;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (fbscreeninfo.transp.length == 0)
|
||||
FBColorFormat = video::ECF_R8G8B8;
|
||||
else
|
||||
FBColorFormat = video::ECF_A8R8G8B8;
|
||||
}
|
||||
if (MAP_FAILED==(SoftwareImage=(u8*)mmap(0, CreationParams.WindowSize.Height*Pitch, PROT_READ|PROT_WRITE, MAP_SHARED, Framebuffer, 0)))
|
||||
{
|
||||
perror("mmap render target");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//! create the driver
|
||||
void CIrrDeviceFB::createDriver()
|
||||
{
|
||||
switch(CreationParams.DriverType)
|
||||
{
|
||||
case video::EDT_SOFTWARE:
|
||||
#ifdef _IRR_COMPILE_WITH_SOFTWARE_
|
||||
VideoDriver = video::createSoftwareDriver(CreationParams.WindowSize, CreationParams.Fullscreen, FileSystem, this);
|
||||
#else
|
||||
os::Printer::log("No Software driver support compiled in.", ELL_WARNING);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case video::EDT_BURNINGSVIDEO:
|
||||
#ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_
|
||||
VideoDriver = video::createBurningVideoDriver(CreationParams, FileSystem, this);
|
||||
#else
|
||||
os::Printer::log("Burning's video driver was not compiled in.", ELL_WARNING);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case video::EDT_OGLES2:
|
||||
#ifdef _IRR_COMPILE_WITH_OGLES2_
|
||||
{
|
||||
video::SExposedVideoData data;
|
||||
s32 width = 0;
|
||||
s32 height = 0;
|
||||
NativeDisplayType display = fbGetDisplay(0);
|
||||
fbGetDisplayGeometry(display, &width, &height);
|
||||
data.OpenGLFB.Window = (void*)fbCreateWindow(display, 0, 0, width, height);
|
||||
ContextManager = new video::CEGLManager();
|
||||
ContextManager->initialize(CreationParams, data);
|
||||
VideoDriver = video::createOGLES2Driver(CreationParams, FileSystem, ContextManager);
|
||||
}
|
||||
#else
|
||||
os::Printer::log("No OpenGL-ES2 support compiled in.", ELL_ERROR);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case video::EDT_OGLES1:
|
||||
#ifdef _IRR_COMPILE_WITH_OGLES1_
|
||||
{
|
||||
video::SExposedVideoData data;
|
||||
s32 width = 0;
|
||||
s32 height = 0;
|
||||
NativeDisplayType display = fbGetDisplay(0);
|
||||
fbGetDisplayGeometry(display, &width, &height);
|
||||
data.OpenGLFB.Window = (void*)fbCreateWindow(display, 0, 0, width, height);
|
||||
ContextManager = new video::CEGLManager();
|
||||
ContextManager->initialize(CreationParams, data);
|
||||
VideoDriver = video::createOGLES1Driver(CreationParams, FileSystem, ContextManager);
|
||||
}
|
||||
#else
|
||||
os::Printer::log("No OpenGL-ES1 support compiled in.", ELL_ERROR);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case video::DEPRECATED_EDT_DIRECT3D8_NO_LONGER_EXISTS:
|
||||
case video::EDT_OPENGL:
|
||||
case video::EDT_DIRECT3D9:
|
||||
os::Printer::log("This driver is not available in FB. Try Software renderer.",
|
||||
ELL_WARNING);
|
||||
break;
|
||||
|
||||
default:
|
||||
VideoDriver = video::createNullDriver(FileSystem, CreationParams.WindowSize);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//! runs the device. Returns false if device wants to be deleted
|
||||
bool CIrrDeviceFB::run()
|
||||
{
|
||||
os::Timer::tick();
|
||||
|
||||
struct input_event ev;
|
||||
if (EventDevice>=0)
|
||||
{
|
||||
if ((read(EventDevice, &ev, sizeof(input_event)) < 0) &&
|
||||
errno != EAGAIN)
|
||||
perror("Read input event");
|
||||
if (ev.type == EV_KEY)
|
||||
{
|
||||
irr::SEvent irrevent;
|
||||
irrevent.EventType = irr::EET_KEY_INPUT_EVENT;
|
||||
irrevent.KeyInput.PressedDown = (ev.value == 1);
|
||||
|
||||
switch (ev.code)
|
||||
{
|
||||
case KEY_RIGHTCTRL:
|
||||
case KEY_LEFTCTRL:
|
||||
irrevent.KeyInput.Control = true;
|
||||
break;
|
||||
case KEY_RIGHTSHIFT:
|
||||
case KEY_LEFTSHIFT:
|
||||
irrevent.KeyInput.Shift = true;
|
||||
break;
|
||||
case KEY_ESC:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x1B;
|
||||
break;
|
||||
case KEY_SPACE:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x20;
|
||||
break;
|
||||
case KEY_UP:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x26;
|
||||
break;
|
||||
case KEY_LEFT:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x25;
|
||||
break;
|
||||
case KEY_RIGHT:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x27;
|
||||
break;
|
||||
case KEY_DOWN:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x28;
|
||||
break;
|
||||
case KEY_A:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x41;
|
||||
break;
|
||||
case KEY_B:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x42;
|
||||
break;
|
||||
case KEY_C:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x43;
|
||||
break;
|
||||
case KEY_D:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x44;
|
||||
break;
|
||||
case KEY_E:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x45;
|
||||
break;
|
||||
case KEY_F:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x46;
|
||||
break;
|
||||
case KEY_G:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x47;
|
||||
break;
|
||||
case KEY_H:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x48;
|
||||
break;
|
||||
case KEY_I:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x49;
|
||||
break;
|
||||
case KEY_J:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x4A;
|
||||
break;
|
||||
case KEY_K:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x4B;
|
||||
break;
|
||||
case KEY_L:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x4C;
|
||||
break;
|
||||
case KEY_M:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x4D;
|
||||
break;
|
||||
case KEY_N:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x4E;
|
||||
break;
|
||||
case KEY_O:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x4F;
|
||||
break;
|
||||
case KEY_P:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x50;
|
||||
break;
|
||||
case KEY_Q:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x51;
|
||||
break;
|
||||
case KEY_R:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x52;
|
||||
break;
|
||||
case KEY_S:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x53;
|
||||
break;
|
||||
case KEY_T:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x54;
|
||||
break;
|
||||
case KEY_U:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x55;
|
||||
break;
|
||||
case KEY_V:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x56;
|
||||
break;
|
||||
case KEY_W:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x57;
|
||||
break;
|
||||
case KEY_X:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x58;
|
||||
break;
|
||||
case KEY_Y:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x59;
|
||||
break;
|
||||
case KEY_Z:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0x5A;
|
||||
break;
|
||||
default:
|
||||
irrevent.KeyInput.Key = (EKEY_CODE)0;
|
||||
break;
|
||||
}
|
||||
postEventFromUser(irrevent);
|
||||
}
|
||||
}
|
||||
|
||||
return !Close;
|
||||
}
|
||||
|
||||
|
||||
//! Pause the current process for the minimum time allowed only to allow other processes to execute
|
||||
void CIrrDeviceFB::yield()
|
||||
{
|
||||
struct timespec ts = {0,0};
|
||||
nanosleep(&ts, NULL);
|
||||
}
|
||||
|
||||
|
||||
//! Pause execution and let other processes to run for a specified amount of time.
|
||||
void CIrrDeviceFB::sleep(u32 timeMs, bool pauseTimer=false)
|
||||
{
|
||||
bool wasStopped = Timer ? Timer->isStopped() : true;
|
||||
|
||||
struct timespec ts;
|
||||
ts.tv_sec = (time_t) (timeMs / 1000);
|
||||
ts.tv_nsec = (long) (timeMs % 1000) * 1000000;
|
||||
|
||||
if (pauseTimer && !wasStopped)
|
||||
Timer->stop();
|
||||
|
||||
nanosleep(&ts, NULL);
|
||||
|
||||
if (pauseTimer && !wasStopped)
|
||||
Timer->start();
|
||||
}
|
||||
|
||||
|
||||
//! presents a surface in the client area
|
||||
bool CIrrDeviceFB::present(video::IImage* image, void* windowId, core::rect<s32>* src )
|
||||
{
|
||||
// this is only necessary for software drivers.
|
||||
if (CreationParams.DriverType != video::EDT_SOFTWARE && CreationParams.DriverType != video::EDT_BURNINGSVIDEO)
|
||||
return false;
|
||||
|
||||
if (!SoftwareImage)
|
||||
return false;
|
||||
|
||||
u8* destData = SoftwareImage;
|
||||
u32 srcwidth = (u32)image->getDimension().Width;
|
||||
u32 srcheight = (u32)image->getDimension().Height;
|
||||
// clip images
|
||||
srcheight = core::min_(srcheight, CreationParams.WindowSize.Height);
|
||||
srcwidth = core::min_(srcwidth, CreationParams.WindowSize.Width);
|
||||
|
||||
u8* srcdata = (u8*)image->lock();
|
||||
for (u32 y=0; y<srcheight; ++y)
|
||||
{
|
||||
video::CColorConverter::convert_viaFormat(srcdata, image->getColorFormat(), srcwidth, destData, FBColorFormat);
|
||||
srcdata+=image->getPitch();
|
||||
destData+=Pitch;
|
||||
}
|
||||
image->unlock();
|
||||
msync(SoftwareImage,CreationParams.WindowSize.Width*CreationParams.WindowSize.Height,MS_ASYNC);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//! notifies the device that it should close itself
|
||||
void CIrrDeviceFB::closeDevice()
|
||||
{
|
||||
Close = true;
|
||||
}
|
||||
|
||||
|
||||
//! returns if window is active. if not, nothing need to be drawn
|
||||
bool CIrrDeviceFB::isWindowActive() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//! returns if window has focus
|
||||
bool CIrrDeviceFB::isWindowFocused() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//! returns if window is minimized
|
||||
bool CIrrDeviceFB::isWindowMinimized() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//! sets the caption of the window
|
||||
void CIrrDeviceFB::setWindowCaption(const wchar_t* text)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//! Sets if the window should be resizeable in windowed mode.
|
||||
void CIrrDeviceFB::setResizable(bool resize)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//! Minimizes window
|
||||
void CIrrDeviceFB::minimizeWindow()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//! Maximizes window
|
||||
void CIrrDeviceFB::maximizeWindow()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//! Restores original window size
|
||||
void CIrrDeviceFB::restoreWindow()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//! Returns the type of this device
|
||||
E_DEVICE_TYPE CIrrDeviceFB::getType() const
|
||||
{
|
||||
return EIDT_FRAMEBUFFER;
|
||||
}
|
||||
|
||||
|
||||
} // end namespace irr
|
||||
|
||||
#endif // _IRR_USE_FB_DEVICE_
|
||||
|
@ -1,215 +0,0 @@
|
||||
// Copyright (C) 2002-2007 Nikolaus Gebhardt
|
||||
// Copyright (C) 2007-2012 Christian Stehno
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#ifndef __C_IRR_DEVICE_FB_H_INCLUDED__
|
||||
#define __C_IRR_DEVICE_FB_H_INCLUDED__
|
||||
|
||||
#include "IrrCompileConfig.h"
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_FB_DEVICE_
|
||||
|
||||
#include "CIrrDeviceStub.h"
|
||||
#include "SIrrCreationParameters.h"
|
||||
#include "IrrlichtDevice.h"
|
||||
#include "IImagePresenter.h"
|
||||
#include "ICursorControl.h"
|
||||
|
||||
#define KeySym s32
|
||||
#include <linux/fb.h>
|
||||
#include <linux/kd.h>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
class CIrrDeviceFB : public CIrrDeviceStub, public video::IImagePresenter
|
||||
{
|
||||
public:
|
||||
|
||||
//! constructor
|
||||
CIrrDeviceFB(const SIrrlichtCreationParameters& params);
|
||||
|
||||
//! destructor
|
||||
virtual ~CIrrDeviceFB();
|
||||
|
||||
//! runs the device. Returns false if device wants to be deleted
|
||||
virtual bool run() _IRR_OVERRIDE_;
|
||||
|
||||
//! Cause the device to temporarily pause execution and let other processes to run
|
||||
// This should bring down processor usage without major performance loss for Irrlicht
|
||||
virtual void yield() _IRR_OVERRIDE_;
|
||||
|
||||
//! Pause execution and let other processes to run for a specified amount of time.
|
||||
virtual void sleep(u32 timeMs, bool pauseTimer) _IRR_OVERRIDE_;
|
||||
|
||||
//! sets the caption of the window
|
||||
virtual void setWindowCaption(const wchar_t* text) _IRR_OVERRIDE_;
|
||||
|
||||
//! returns if window is active. if not, nothing need to be drawn
|
||||
virtual bool isWindowActive() const _IRR_OVERRIDE_;
|
||||
|
||||
//! returns if window has focus
|
||||
virtual bool isWindowFocused() const _IRR_OVERRIDE_;
|
||||
|
||||
//! returns if window is minimized
|
||||
virtual bool isWindowMinimized() const _IRR_OVERRIDE_;
|
||||
|
||||
//! Minimizes window
|
||||
virtual void minimizeWindow() _IRR_OVERRIDE_;
|
||||
|
||||
//! Maximizes window
|
||||
virtual void maximizeWindow() _IRR_OVERRIDE_;
|
||||
|
||||
//! Restores original window size
|
||||
virtual void restoreWindow() _IRR_OVERRIDE_;
|
||||
|
||||
//! returns current window position (not supported for this device)
|
||||
virtual core::position2di getWindowPosition() _IRR_OVERRIDE_
|
||||
{
|
||||
return core::position2di(-1, -1);
|
||||
}
|
||||
|
||||
//! presents a surface in the client area
|
||||
virtual bool present(video::IImage* surface, void* windowId = 0, core::rect<s32>* src=0 ) _IRR_OVERRIDE_;
|
||||
|
||||
//! notifies the device that it should close itself
|
||||
virtual void closeDevice() _IRR_OVERRIDE_;
|
||||
|
||||
//! Sets if the window should be resizeable in windowed mode.
|
||||
virtual void setResizable(bool resize=false) _IRR_OVERRIDE_;
|
||||
|
||||
//! Returns the type of this device
|
||||
virtual E_DEVICE_TYPE getType() const _IRR_OVERRIDE_;
|
||||
|
||||
private:
|
||||
|
||||
//! create the driver
|
||||
void createDriver();
|
||||
|
||||
bool createWindow(const core::dimension2d<u32>& windowSize, u32 bits);
|
||||
|
||||
//! Implementation of the cursor control
|
||||
class CCursorControl : public gui::ICursorControl
|
||||
{
|
||||
public:
|
||||
|
||||
CCursorControl(CIrrDeviceFB* dev, bool null)
|
||||
: Device(dev), IsVisible(true), Null(null)
|
||||
{
|
||||
Device->grab();
|
||||
}
|
||||
|
||||
~CCursorControl()
|
||||
{
|
||||
Device->drop();
|
||||
}
|
||||
|
||||
//! Changes the visible state of the mouse cursor.
|
||||
virtual void setVisible(bool visible) _IRR_OVERRIDE_
|
||||
{
|
||||
IsVisible = visible;
|
||||
}
|
||||
|
||||
//! Returns if the cursor is currently visible.
|
||||
virtual bool isVisible() const _IRR_OVERRIDE_
|
||||
{
|
||||
return IsVisible;
|
||||
}
|
||||
|
||||
//! Sets the new position of the cursor.
|
||||
virtual void setPosition(const core::position2d<f32> &pos) _IRR_OVERRIDE_
|
||||
{
|
||||
setPosition(pos.X, pos.Y);
|
||||
}
|
||||
|
||||
//! Sets the new position of the cursor.
|
||||
virtual void setPosition(f32 x, f32 y) _IRR_OVERRIDE_
|
||||
{
|
||||
setPosition((s32)(x*Device->CreationParams.WindowSize.Width), (s32)(y*Device->CreationParams.WindowSize.Height));
|
||||
}
|
||||
|
||||
//! Sets the new position of the cursor.
|
||||
virtual void setPosition(const core::position2d<s32> &pos) _IRR_OVERRIDE_
|
||||
{
|
||||
setPosition(pos.X, pos.Y);
|
||||
}
|
||||
|
||||
//! Sets the new position of the cursor.
|
||||
virtual void setPosition(s32 x, s32 y) _IRR_OVERRIDE_
|
||||
{
|
||||
}
|
||||
|
||||
//! Returns the current position of the mouse cursor.
|
||||
virtual const core::position2d<s32>& getPosition(bool updateCursor) _IRR_OVERRIDE_
|
||||
{
|
||||
if ( updateCursor )
|
||||
updateCursorPos();
|
||||
return CursorPos;
|
||||
}
|
||||
|
||||
//! Returns the current position of the mouse cursor.
|
||||
virtual core::position2d<f32> getRelativePosition(bool updateCursor) _IRR_OVERRIDE_
|
||||
{
|
||||
if ( updateCursor)
|
||||
updateCursorPos();
|
||||
return core::position2d<f32>(CursorPos.X / (f32)Device->CreationParams.WindowSize.Width,
|
||||
CursorPos.Y / (f32)Device->CreationParams.WindowSize.Height);
|
||||
}
|
||||
|
||||
virtual void setReferenceRect(core::rect<s32>* rect=0) _IRR_OVERRIDE_
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
void updateCursorPos()
|
||||
{
|
||||
}
|
||||
|
||||
core::position2d<s32> CursorPos;
|
||||
CIrrDeviceFB* Device;
|
||||
bool IsVisible;
|
||||
bool Null;
|
||||
};
|
||||
|
||||
friend class CCursorControl;
|
||||
|
||||
int Framebuffer;
|
||||
int EventDevice;
|
||||
int KeyboardDevice;
|
||||
struct fb_fix_screeninfo fbfixscreeninfo;
|
||||
struct fb_var_screeninfo fbscreeninfo;
|
||||
struct fb_var_screeninfo oldscreeninfo;
|
||||
long KeyboardMode;
|
||||
u8* SoftwareImage;
|
||||
|
||||
u32 Pitch;
|
||||
video::ECOLOR_FORMAT FBColorFormat;
|
||||
bool Close;
|
||||
|
||||
struct SKeyMap
|
||||
{
|
||||
SKeyMap() {}
|
||||
SKeyMap(s32 x11, s32 win32)
|
||||
: X11Key(x11), Win32Key(win32)
|
||||
{
|
||||
}
|
||||
|
||||
KeySym X11Key;
|
||||
s32 Win32Key;
|
||||
|
||||
bool operator<(const SKeyMap& o) const
|
||||
{
|
||||
return X11Key<o.X11Key;
|
||||
}
|
||||
};
|
||||
|
||||
core::array<SKeyMap> KeyMap;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace irr
|
||||
|
||||
#endif // _IRR_USE_FB_DEVICE_
|
||||
#endif // __C_IRR_DEVICE_FB_H_INCLUDED__
|
||||
|
@ -1763,97 +1763,6 @@ void CIrrDeviceLinux::pollJoysticks()
|
||||
}
|
||||
|
||||
|
||||
//! Set the current Gamma Value for the Display
|
||||
bool CIrrDeviceLinux::setGammaRamp( f32 red, f32 green, f32 blue, f32 brightness, f32 contrast )
|
||||
{
|
||||
#if defined(_IRR_LINUX_X11_VIDMODE_) || defined(_IRR_LINUX_X11_RANDR_)
|
||||
s32 eventbase, errorbase;
|
||||
#ifdef _IRR_LINUX_X11_VIDMODE_
|
||||
if (XF86VidModeQueryExtension(XDisplay, &eventbase, &errorbase))
|
||||
{
|
||||
XF86VidModeGamma gamma;
|
||||
gamma.red=red;
|
||||
gamma.green=green;
|
||||
gamma.blue=blue;
|
||||
XF86VidModeSetGamma(XDisplay, Screennr, &gamma);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
#if defined(_IRR_LINUX_X11_VIDMODE_) && defined(_IRR_LINUX_X11_RANDR_)
|
||||
else
|
||||
#endif
|
||||
#ifdef _IRR_LINUX_X11_RANDR_
|
||||
if (XRRQueryExtension(XDisplay, &eventbase, &errorbase))
|
||||
{
|
||||
XRRQueryVersion(XDisplay, &eventbase, &errorbase); // major, minor
|
||||
if (eventbase>=1 && errorbase>1)
|
||||
{
|
||||
#if (RANDR_MAJOR>1 || RANDR_MINOR>1)
|
||||
XRRCrtcGamma *gamma = XRRGetCrtcGamma(XDisplay, Screennr);
|
||||
if (gamma)
|
||||
{
|
||||
*gamma->red=(u16)red;
|
||||
*gamma->green=(u16)green;
|
||||
*gamma->blue=(u16)blue;
|
||||
XRRSetCrtcGamma(XDisplay, Screennr, gamma);
|
||||
XRRFreeGamma(gamma);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//! Get the current Gamma Value for the Display
|
||||
bool CIrrDeviceLinux::getGammaRamp( f32 &red, f32 &green, f32 &blue, f32 &brightness, f32 &contrast )
|
||||
{
|
||||
brightness = 0.f;
|
||||
contrast = 0.f;
|
||||
#if defined(_IRR_LINUX_X11_VIDMODE_) || defined(_IRR_LINUX_X11_RANDR_)
|
||||
s32 eventbase, errorbase;
|
||||
#ifdef _IRR_LINUX_X11_VIDMODE_
|
||||
if (XF86VidModeQueryExtension(XDisplay, &eventbase, &errorbase))
|
||||
{
|
||||
XF86VidModeGamma gamma;
|
||||
XF86VidModeGetGamma(XDisplay, Screennr, &gamma);
|
||||
red = gamma.red;
|
||||
green = gamma.green;
|
||||
blue = gamma.blue;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
#if defined(_IRR_LINUX_X11_VIDMODE_) && defined(_IRR_LINUX_X11_RANDR_)
|
||||
else
|
||||
#endif
|
||||
#ifdef _IRR_LINUX_X11_RANDR_
|
||||
if (XRRQueryExtension(XDisplay, &eventbase, &errorbase))
|
||||
{
|
||||
XRRQueryVersion(XDisplay, &eventbase, &errorbase); // major, minor
|
||||
if (eventbase>=1 && errorbase>1)
|
||||
{
|
||||
#if (RANDR_MAJOR>1 || RANDR_MINOR>1)
|
||||
XRRCrtcGamma *gamma = XRRGetCrtcGamma(XDisplay, Screennr);
|
||||
if (gamma)
|
||||
{
|
||||
red = *gamma->red;
|
||||
green = *gamma->green;
|
||||
blue= *gamma->blue;
|
||||
XRRFreeGamma(gamma);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//! gets text from the clipboard
|
||||
//! \return Returns 0 if no string is in there, otherwise utf-8 text.
|
||||
const c8 *CIrrDeviceLinux::getTextFromClipboard() const
|
||||
@ -2209,7 +2118,17 @@ CIrrDeviceLinux::CCursorControl::CCursorControl(CIrrDeviceLinux* dev, bool null)
|
||||
if (!Null)
|
||||
{
|
||||
#ifdef _IRR_LINUX_X11_XINPUT2_
|
||||
XIGetClientPointer(Device->XDisplay, Device->XWindow, &DeviceId);
|
||||
// XIWarpPointer is entirely broken on multi-head setups (see also [1]),
|
||||
// but behaves better in other cases so we can't just disable it outright.
|
||||
// [1] https://developer.blender.org/rB165caafb99c6846e53d11c4e966990aaffc06cea
|
||||
if (XScreenCount(Device->XDisplay) > 1)
|
||||
{
|
||||
os::Printer::log("Detected classic multi-head setup, not using XIWarpPointer");
|
||||
}
|
||||
else
|
||||
{
|
||||
XIGetClientPointer(Device->XDisplay, Device->XWindow, &DeviceId);
|
||||
}
|
||||
#endif
|
||||
|
||||
XGCValues values;
|
||||
|
@ -20,12 +20,6 @@
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include <X11/cursorfont.h>
|
||||
#ifdef _IRR_LINUX_X11_VIDMODE_
|
||||
#include <X11/extensions/xf86vmode.h>
|
||||
#endif
|
||||
#ifdef _IRR_LINUX_X11_RANDR_
|
||||
#include <X11/extensions/Xrandr.h>
|
||||
#endif
|
||||
#include <X11/keysym.h>
|
||||
|
||||
#ifdef _IRR_LINUX_X11_XINPUT2_
|
||||
@ -101,12 +95,6 @@ namespace irr
|
||||
//! Activate any joysticks, and generate events for them.
|
||||
virtual bool activateJoysticks(core::array<SJoystickInfo> & joystickInfo) _IRR_OVERRIDE_;
|
||||
|
||||
//! Set the current Gamma Value for the Display
|
||||
virtual bool setGammaRamp( f32 red, f32 green, f32 blue, f32 brightness, f32 contrast ) _IRR_OVERRIDE_;
|
||||
|
||||
//! Get the current Gamma Value for the Display
|
||||
virtual bool getGammaRamp( f32 &red, f32 &green, f32 &blue, f32 &brightness, f32 &contrast ) _IRR_OVERRIDE_;
|
||||
|
||||
//! gets text from the clipboard
|
||||
//! \return Returns 0 if no string is in there, otherwise utf-8 text.
|
||||
virtual const c8 *getTextFromClipboard() const;
|
||||
|
@ -1172,9 +1172,8 @@ void CIrrDeviceMacOSX::setMouseLocation(int x,int y)
|
||||
c.x = p.x;
|
||||
c.y = p.y;
|
||||
|
||||
CGEventRef ev = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, c, kCGMouseButtonLeft);
|
||||
CGEventPost(kCGHIDEventTap, ev);
|
||||
CFRelease(ev);
|
||||
CGWarpMouseCursorPosition(c);
|
||||
CGAssociateMouseAndMouseCursorPosition(YES);
|
||||
}
|
||||
|
||||
|
||||
|
@ -105,74 +105,6 @@ EM_BOOL CIrrDeviceSDL::MouseLeaveCallback(int eventType, const EmscriptenMouseEv
|
||||
}
|
||||
#endif
|
||||
|
||||
bool CIrrDeviceSDL::isNoUnicodeKey(EKEY_CODE key) const
|
||||
{
|
||||
switch ( key )
|
||||
{
|
||||
// keys which should not be mapped to a Unicode char
|
||||
case KEY_UNKNOWN:
|
||||
case KEY_SHIFT:
|
||||
case KEY_CONTROL:
|
||||
case KEY_MENU:
|
||||
case KEY_PAUSE:
|
||||
case KEY_CAPITAL:
|
||||
case KEY_ESCAPE:
|
||||
case KEY_PRIOR:
|
||||
case KEY_NEXT:
|
||||
case KEY_END:
|
||||
case KEY_HOME:
|
||||
case KEY_LEFT:
|
||||
case KEY_UP:
|
||||
case KEY_RIGHT:
|
||||
case KEY_DOWN:
|
||||
case KEY_PRINT:
|
||||
case KEY_SNAPSHOT:
|
||||
case KEY_INSERT:
|
||||
case KEY_DELETE:
|
||||
case KEY_HELP:
|
||||
case KEY_LWIN:
|
||||
case KEY_RWIN:
|
||||
case KEY_APPS:
|
||||
case KEY_SLEEP:
|
||||
case KEY_F1:
|
||||
case KEY_F2:
|
||||
case KEY_F3:
|
||||
case KEY_F4:
|
||||
case KEY_F5:
|
||||
case KEY_F6:
|
||||
case KEY_F7:
|
||||
case KEY_F8:
|
||||
case KEY_F9:
|
||||
case KEY_F10:
|
||||
case KEY_F11:
|
||||
case KEY_F12:
|
||||
case KEY_F13:
|
||||
case KEY_F14:
|
||||
case KEY_F15:
|
||||
case KEY_F16:
|
||||
case KEY_F17:
|
||||
case KEY_F18:
|
||||
case KEY_F19:
|
||||
case KEY_F20:
|
||||
case KEY_F21:
|
||||
case KEY_F22:
|
||||
case KEY_F23:
|
||||
case KEY_F24:
|
||||
case KEY_NUMLOCK:
|
||||
case KEY_SCROLL:
|
||||
case KEY_LSHIFT:
|
||||
case KEY_RSHIFT:
|
||||
case KEY_LCONTROL:
|
||||
case KEY_RCONTROL:
|
||||
case KEY_LMENU:
|
||||
case KEY_RMENU:
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//! constructor
|
||||
CIrrDeviceSDL::CIrrDeviceSDL(const SIrrlichtCreationParameters& param)
|
||||
: CIrrDeviceStub(param),
|
||||
@ -648,6 +580,17 @@ bool CIrrDeviceSDL::run()
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_TEXTINPUT:
|
||||
{
|
||||
irrevent.EventType = irr::EET_STRING_INPUT_EVENT;
|
||||
irrevent.StringInput.Str = new core::stringw();
|
||||
irr::core::multibyteToWString(*irrevent.StringInput.Str, SDL_event.text.text);
|
||||
postEventFromUser(irrevent);
|
||||
delete irrevent.StringInput.Str;
|
||||
irrevent.StringInput.Str = NULL;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_KEYDOWN:
|
||||
case SDL_KEYUP:
|
||||
{
|
||||
@ -670,25 +613,16 @@ bool CIrrDeviceSDL::run()
|
||||
}
|
||||
#endif
|
||||
irrevent.EventType = irr::EET_KEY_INPUT_EVENT;
|
||||
|
||||
if (isNoUnicodeKey(key))
|
||||
irrevent.KeyInput.Char = 0;
|
||||
else
|
||||
irrevent.KeyInput.Char = SDL_event.key.keysym.sym;
|
||||
|
||||
irrevent.KeyInput.Key = key;
|
||||
irrevent.KeyInput.PressedDown = (SDL_event.type == SDL_KEYDOWN);
|
||||
irrevent.KeyInput.Shift = (SDL_event.key.keysym.mod & KMOD_SHIFT) != 0;
|
||||
irrevent.KeyInput.Control = (SDL_event.key.keysym.mod & KMOD_CTRL ) != 0;
|
||||
|
||||
// SDL2 no longer provides unicode character in the key event so we ensure the character is in the correct case
|
||||
// TODO: Unicode input doesn't work like this, should probably use SDL_TextInputEvent
|
||||
bool convertCharToUppercase =
|
||||
irrevent.KeyInput.Shift != !!(SDL_event.key.keysym.mod & KMOD_CAPS);
|
||||
|
||||
if (convertCharToUppercase)
|
||||
irrevent.KeyInput.Char = irr::core::locale_upper(irrevent.KeyInput.Char);
|
||||
|
||||
// These keys are handled differently in CGUIEditBox.cpp (may become out of date!)
|
||||
// Control key is used in special character combinations, so keep that too
|
||||
// Pass through the keysym only then so no extra text gets input
|
||||
irrevent.KeyInput.Char = 0;
|
||||
if (mp.SDLKey == SDLK_DELETE || mp.SDLKey == SDLK_RETURN || mp.SDLKey == SDLK_BACKSPACE || irrevent.KeyInput.Control)
|
||||
irrevent.KeyInput.Char = mp.SDLKey;
|
||||
postEventFromUser(irrevent);
|
||||
}
|
||||
break;
|
||||
@ -1078,25 +1012,6 @@ bool CIrrDeviceSDL::isWindowMinimized() const
|
||||
}
|
||||
|
||||
|
||||
//! Set the current Gamma Value for the Display
|
||||
bool CIrrDeviceSDL::setGammaRamp( f32 red, f32 green, f32 blue, f32 brightness, f32 contrast )
|
||||
{
|
||||
/*
|
||||
// todo: Gamma in SDL takes ints, what does Irrlicht use?
|
||||
return (SDL_SetGamma(red, green, blue) != -1);
|
||||
*/
|
||||
return false;
|
||||
}
|
||||
|
||||
//! Get the current Gamma Value for the Display
|
||||
bool CIrrDeviceSDL::getGammaRamp( f32 &red, f32 &green, f32 &blue, f32 &brightness, f32 &contrast )
|
||||
{
|
||||
/* brightness = 0.f;
|
||||
contrast = 0.f;
|
||||
return (SDL_GetGamma(&red, &green, &blue) != -1);*/
|
||||
return false;
|
||||
}
|
||||
|
||||
//! returns color format of the window.
|
||||
video::ECOLOR_FORMAT CIrrDeviceSDL::getColorFormat() const
|
||||
{
|
||||
|
@ -88,12 +88,6 @@ namespace irr
|
||||
//! Activate any joysticks, and generate events for them.
|
||||
virtual bool activateJoysticks(core::array<SJoystickInfo> & joystickInfo) _IRR_OVERRIDE_;
|
||||
|
||||
//! Set the current Gamma Value for the Display
|
||||
virtual bool setGammaRamp( f32 red, f32 green, f32 blue, f32 brightness, f32 contrast ) _IRR_OVERRIDE_;
|
||||
|
||||
//! Get the current Gamma Value for the Display
|
||||
virtual bool getGammaRamp( f32 &red, f32 &green, f32 &blue, f32 &brightness, f32 &contrast ) _IRR_OVERRIDE_;
|
||||
|
||||
//! Get the device type
|
||||
virtual E_DEVICE_TYPE getType() const _IRR_OVERRIDE_
|
||||
{
|
||||
@ -224,9 +218,6 @@ namespace irr
|
||||
static EM_BOOL MouseLeaveCallback(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData);
|
||||
|
||||
#endif
|
||||
// Check if it's a special key like left, right, up down and so on which shouldn't have a Unicode character.
|
||||
bool isNoUnicodeKey(EKEY_CODE key) const;
|
||||
|
||||
//! create the driver
|
||||
void createDriver();
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
@ -428,60 +363,6 @@ bool CIrrDeviceStub::isDeviceMotionAvailable()
|
||||
return false;
|
||||
}
|
||||
|
||||
/*!
|
||||
*/
|
||||
void CIrrDeviceStub::calculateGammaRamp ( u16 *ramp, f32 gamma, f32 relativebrightness, f32 relativecontrast )
|
||||
{
|
||||
s32 i;
|
||||
s32 value;
|
||||
s32 rbright = (s32) ( relativebrightness * (65535.f / 4 ) );
|
||||
f32 rcontrast = 1.f / (255.f - ( relativecontrast * 127.5f ) );
|
||||
|
||||
gamma = gamma > 0.f ? 1.0f / gamma : 0.f;
|
||||
|
||||
for ( i = 0; i < 256; ++i )
|
||||
{
|
||||
value = (s32)(pow( rcontrast * i, gamma)*65535.f + 0.5f );
|
||||
ramp[i] = (u16) core::s32_clamp ( value + rbright, 0, 65535 );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CIrrDeviceStub::calculateGammaFromRamp ( f32 &gamma, const u16 *ramp )
|
||||
{
|
||||
/* The following is adapted from a post by Garrett Bass on OpenGL
|
||||
Gamedev list, March 4, 2000.
|
||||
*/
|
||||
f32 sum = 0.0;
|
||||
s32 i, count = 0;
|
||||
|
||||
gamma = 1.0;
|
||||
for ( i = 1; i < 256; ++i ) {
|
||||
if ( (ramp[i] != 0) && (ramp[i] != 65535) ) {
|
||||
f32 B = (f32)i / 256.f;
|
||||
f32 A = ramp[i] / 65535.f;
|
||||
sum += (f32) ( logf(A) / logf(B) );
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if ( count && sum ) {
|
||||
gamma = 1.0f / (sum / count);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//! Set the current Gamma Value for the Display
|
||||
bool CIrrDeviceStub::setGammaRamp( f32 red, f32 green, f32 blue, f32 brightness, f32 contrast )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//! Get the current Gamma Value for the Display
|
||||
bool CIrrDeviceStub::getGammaRamp( f32 &red, f32 &green, f32 &blue, f32 &brightness, f32 &contrast )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//! Set the maximal elapsed time between 2 clicks to generate doubleclicks for the mouse. It also affects tripleclick behavior.
|
||||
void CIrrDeviceStub::setDoubleClickTime( u32 timeMs )
|
||||
{
|
||||
|
@ -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_;
|
||||
|
||||
@ -159,12 +145,6 @@ namespace irr
|
||||
//! Is device motion available.
|
||||
virtual bool isDeviceMotionAvailable() _IRR_OVERRIDE_;
|
||||
|
||||
//! Set the current Gamma Value for the Display
|
||||
virtual bool setGammaRamp( f32 red, f32 green, f32 blue, f32 brightness, f32 contrast ) _IRR_OVERRIDE_;
|
||||
|
||||
//! Get the current Gamma Value for the Display
|
||||
virtual bool getGammaRamp( f32 &red, f32 &green, f32 &blue, f32 &brightness, f32 &contrast ) _IRR_OVERRIDE_;
|
||||
|
||||
//! Set the maximal elapsed time between 2 clicks to generate doubleclicks for the mouse. It also affects tripleclick behavior.
|
||||
//! When set to 0 no double- and tripleclicks will be generated.
|
||||
virtual void setDoubleClickTime( u32 timeMs ) _IRR_OVERRIDE_;
|
||||
@ -191,9 +171,6 @@ namespace irr
|
||||
*/
|
||||
virtual u32 checkSuccessiveClicks(s32 mouseX, s32 mouseY, EMOUSE_INPUT_EVENT inputEvent);
|
||||
|
||||
void calculateGammaRamp ( u16 *ramp, f32 gamma, f32 relativebrightness, f32 relativecontrast );
|
||||
void calculateGammaFromRamp ( f32 &gamma, const u16 *ramp );
|
||||
|
||||
//! Checks whether the input device should take input from the IME
|
||||
bool acceptsIME();
|
||||
|
||||
@ -205,7 +182,6 @@ namespace irr
|
||||
IEventReceiver* UserReceiver;
|
||||
CLogger* Logger;
|
||||
IOSOperator* Operator;
|
||||
IRandomizer* Randomizer;
|
||||
io::IFileSystem* FileSystem;
|
||||
scene::ISceneManager* InputReceivingSceneManager;
|
||||
|
||||
@ -222,7 +198,6 @@ namespace irr
|
||||
EMOUSE_INPUT_EVENT LastMouseInputEvent;
|
||||
};
|
||||
SMouseMultiClicks MouseMultiClicks;
|
||||
video::CVideoModeList* VideoModeList;
|
||||
video::IContextManager* ContextManager;
|
||||
SIrrlichtCreationParameters CreationParams;
|
||||
bool Close;
|
||||
|
@ -1383,46 +1383,6 @@ bool CIrrDeviceWin32::activateJoysticks(core::array<SJoystickInfo> & joystickInf
|
||||
}
|
||||
|
||||
|
||||
//! Set the current Gamma Value for the Display
|
||||
bool CIrrDeviceWin32::setGammaRamp( f32 red, f32 green, f32 blue, f32 brightness, f32 contrast )
|
||||
{
|
||||
bool r;
|
||||
u16 ramp[3][256];
|
||||
|
||||
calculateGammaRamp( ramp[0], red, brightness, contrast );
|
||||
calculateGammaRamp( ramp[1], green, brightness, contrast );
|
||||
calculateGammaRamp( ramp[2], blue, brightness, contrast );
|
||||
|
||||
HDC dc = GetDC(0);
|
||||
r = SetDeviceGammaRamp ( dc, ramp ) == TRUE;
|
||||
ReleaseDC(HWnd, dc);
|
||||
return r;
|
||||
}
|
||||
|
||||
//! Get the current Gamma Value for the Display
|
||||
bool CIrrDeviceWin32::getGammaRamp( f32 &red, f32 &green, f32 &blue, f32 &brightness, f32 &contrast )
|
||||
{
|
||||
bool r;
|
||||
u16 ramp[3][256];
|
||||
|
||||
HDC dc = GetDC(0);
|
||||
r = GetDeviceGammaRamp ( dc, ramp ) == TRUE;
|
||||
ReleaseDC(HWnd, dc);
|
||||
|
||||
if (r)
|
||||
{
|
||||
calculateGammaFromRamp(red, ramp[0]);
|
||||
calculateGammaFromRamp(green, ramp[1]);
|
||||
calculateGammaFromRamp(blue, ramp[2]);
|
||||
}
|
||||
|
||||
brightness = 0.f;
|
||||
contrast = 0.f;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
//! Process system events
|
||||
void CIrrDeviceWin32::handleSystemMessages()
|
||||
{
|
||||
|
@ -89,12 +89,6 @@ namespace irr
|
||||
//! Activate any joysticks, and generate events for them.
|
||||
virtual bool activateJoysticks(core::array<SJoystickInfo> & joystickInfo) _IRR_OVERRIDE_;
|
||||
|
||||
//! Set the current Gamma Value for the Display
|
||||
virtual bool setGammaRamp( f32 red, f32 green, f32 blue, f32 brightness, f32 contrast ) _IRR_OVERRIDE_;
|
||||
|
||||
//! Get the current Gamma Value for the Display
|
||||
virtual bool getGammaRamp( f32 &red, f32 &green, f32 &blue, f32 &brightness, f32 &contrast ) _IRR_OVERRIDE_;
|
||||
|
||||
//! Remove all messages pending in the system message loop
|
||||
virtual void clearSystemMessages() _IRR_OVERRIDE_;
|
||||
|
||||
|
@ -42,6 +42,20 @@ elseif(MSVC)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Sanity-check version
|
||||
|
||||
include(CheckCXXSourceCompiles)
|
||||
set(CMAKE_REQUIRED_INCLUDES ${PROJECT_SOURCE_DIR}/include)
|
||||
unset(REVISION_SANITY_CHECK CACHE)
|
||||
check_cxx_source_compiles("#include <IrrCompileConfig.h>\n\
|
||||
#if IRRLICHT_VERSION_MT_REVISION != ${IRRLICHTMT_REVISION}\n\
|
||||
#error\n\
|
||||
#endif\n\
|
||||
int main() {}" REVISION_SANITY_CHECK)
|
||||
if(NOT REVISION_SANITY_CHECK)
|
||||
message(FATAL_ERROR "IrrlichtMt revision number mismatches between CMake and headers.")
|
||||
endif()
|
||||
|
||||
# Required libs
|
||||
|
||||
find_package(ZLIB REQUIRED)
|
||||
@ -77,11 +91,8 @@ if(OGL_ENABLED)
|
||||
set(OpenGL_GL_PREFERENCE "LEGACY")
|
||||
find_package(OpenGL REQUIRED)
|
||||
endif()
|
||||
if(NOT ANDROID AND NOT APPLE)
|
||||
if(UNIX AND NOT ANDROID AND NOT APPLE)
|
||||
check_symbol_exists(_IRR_LINUX_X11_XINPUT2_ "IrrCompileConfig.h" XINPUT2_ENABLED)
|
||||
if(XINPUT2_ENABLED)
|
||||
find_library(XINPUT_LIBRARY Xi REQUIRED)
|
||||
endif()
|
||||
endif()
|
||||
check_symbol_exists(_IRR_COMPILE_WITH_SDL_DEVICE_ "IrrCompileConfig.h" SDL_ENABLED)
|
||||
if(SDL_ENABLED)
|
||||
@ -102,6 +113,9 @@ elseif(APPLE)
|
||||
else()
|
||||
# Unix probably
|
||||
find_package(X11 REQUIRED)
|
||||
if(XINPUT2_ENABLED AND NOT X11_Xi_FOUND)
|
||||
message(FATAL_ERROR "XInput not found")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(link_includes
|
||||
@ -131,7 +145,6 @@ set(link_libs
|
||||
${OPENGLES_LIBRARY}
|
||||
${OPENGLES2_LIBRARIES}
|
||||
${EGL_LIBRARY}
|
||||
${XINPUT_LIBRARY}
|
||||
|
||||
"$<$<PLATFORM_ID:Android>:native_app_glue -landroid -llog>"
|
||||
${COCOA_LIB}
|
||||
@ -139,7 +152,7 @@ set(link_libs
|
||||
"$<$<PLATFORM_ID:Windows>:gdi32>"
|
||||
"$<$<PLATFORM_ID:Windows>:winmm>"
|
||||
${X11_X11_LIB}
|
||||
${X11_Xxf86vm_LIB}
|
||||
${X11_Xi_LIB}
|
||||
)
|
||||
|
||||
# Source files
|
||||
@ -167,7 +180,6 @@ add_library(IRROBJ OBJECT
|
||||
CSceneCollisionManager.cpp
|
||||
CSceneManager.cpp
|
||||
CMeshCache.cpp
|
||||
CDefaultSceneNodeFactory.cpp
|
||||
)
|
||||
|
||||
set(IRRDRVROBJ
|
||||
@ -204,7 +216,6 @@ set(IRRIMAGEOBJ
|
||||
)
|
||||
|
||||
add_library(IRRVIDEOOBJ OBJECT
|
||||
CVideoModeList.cpp
|
||||
CFPSCounter.cpp
|
||||
${IRRDRVROBJ}
|
||||
${IRRIMAGEOBJ}
|
||||
@ -218,17 +229,14 @@ add_library(IRRIOOBJ OBJECT
|
||||
CReadFile.cpp
|
||||
CWriteFile.cpp
|
||||
CZipReader.cpp
|
||||
CMountPointReader.cpp
|
||||
CAttributes.cpp
|
||||
)
|
||||
|
||||
add_library(IRROTHEROBJ OBJECT
|
||||
CIrrDeviceSDL.cpp
|
||||
CIrrDeviceLinux.cpp
|
||||
CIrrDeviceConsole.cpp
|
||||
CIrrDeviceStub.cpp
|
||||
CIrrDeviceWin32.cpp
|
||||
CIrrDeviceFB.cpp
|
||||
CLogger.cpp
|
||||
COSOperator.cpp
|
||||
Irrlicht.cpp
|
||||
@ -257,32 +265,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
|
||||
@ -318,7 +312,6 @@ endif()
|
||||
|
||||
set_target_properties(IrrlichtMt PROPERTIES
|
||||
VERSION ${PROJECT_VERSION}
|
||||
SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
)
|
||||
|
||||
if(WIN32)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
@ -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_
|
@ -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<io::path> RealFileNames;
|
||||
|
||||
IFileSystem *Parent;
|
||||
void buildDirectory();
|
||||
};
|
||||
} // io
|
||||
} // irr
|
||||
|
||||
#endif // __IRR_COMPILE_WITH_MOUNT_ARCHIVE_LOADER_
|
||||
#endif // __C_MOUNT_READER_H_INCLUDED__
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user