diff --git a/changes.txt b/changes.txt
index 353fdfc6..0fc043f2 100644
--- a/changes.txt
+++ b/changes.txt
@@ -10,6 +10,10 @@ Changes in ogl-es (not yet released - will be merged with trunk at some point)
--------------------------
Changes in 1.9 (not yet released)
+- Reduce log-messages for "loaded texture" and "loaded mesh" from ELL_INFORMATION to ELL_DEBUG.
+- Add IGUIButton::setOverrideColor to allow overriding text-color (same function as statictexts and editboxes have).
+- Add functions IGUIButton::getClickShiftState and IGUIButton::getClickControlState to get shift/ctrl key-state when a button was clicked. Thanks @StarSonata for patch.
+- Add function ISceneManager::clearAllRegisteredNodesForRendering.
- Add function IVideoDriver::queryTextureFormat to allow checking if a driver supports textures with a specific color format.
- ISceneManager::getMesh can now creates meshes with alternative cache-names.
- Lets the BSP loader find textures inserted with relative paths. Thx@ curaga for patch
diff --git a/examples/01.HelloWorld_Android/AndroidManifest.xml b/examples/01.HelloWorld_Android/AndroidManifest.xml
index 81b015b7..b26b4d40 100755
--- a/examples/01.HelloWorld_Android/AndroidManifest.xml
+++ b/examples/01.HelloWorld_Android/AndroidManifest.xml
@@ -10,7 +10,6 @@
android:label="HelloWorldMobile"
android:launchMode="singleTask"
android:configChanges="orientation|keyboardHidden"
- android:screenOrientation="portrait"
android:clearTaskOnLaunch="true">
diff --git a/examples/01.HelloWorld_Android/main.cpp b/examples/01.HelloWorld_Android/main.cpp
index 77fb1b10..087da556 100644
--- a/examples/01.HelloWorld_Android/main.cpp
+++ b/examples/01.HelloWorld_Android/main.cpp
@@ -242,7 +242,7 @@ void android_main(android_app* app)
SIrrlichtCreationParameters param;
// param.DriverType = EDT_OGLES1; // android:glEsVersion in AndroidManifest.xml should be "0x00010000" (requesting 0x00020000 will also guarantee that ES1 works)
param.DriverType = EDT_OGLES2; // android:glEsVersion in AndroidManifest.xml should be "0x00020000"
- param.WindowSize = dimension2d(0,0); // using 0,0 it will automatically set it to the maximal size
+ param.WindowSize = dimension2d(300,300); // using 0,0 it will automatically set it to the maximal size
param.PrivateData = app;
param.Bits = 24;
param.ZBufferBits = 16;
diff --git a/examples/09.Meshviewer/main.cpp b/examples/09.Meshviewer/main.cpp
index aa21c2bc..0998f49d 100644
--- a/examples/09.Meshviewer/main.cpp
+++ b/examples/09.Meshviewer/main.cpp
@@ -265,7 +265,7 @@ void loadModel(const c8* fn)
/*
Function createToolBox() creates a toolbox window. In this simple mesh
-viewer, this toolbox only contains a controls to change the scale
+viewer, this toolbox only contains a controls to change the scale
and animation speed of the model and a control to set the transparency
of the GUI-elements.
*/
@@ -944,9 +944,9 @@ int main(int argc, char* argv[])
Device->setWindowCaption(Caption.c_str());
/*
- Now we show the about message box at start up, and load the first model.
- To make everything look better a skybox is created. We also add a user
- controlled camera, to make the application more interactive.
+ Now we show the about message box at start up, and load the first model.
+ To make everything look better a skybox is created. We also add a user
+ controlled camera, to make the application more interactive.
Finally, everything is drawn in a standard drawing loop.
*/
diff --git a/include/IGUIButton.h b/include/IGUIButton.h
index d90d8c0d..1976adaf 100644
--- a/include/IGUIButton.h
+++ b/include/IGUIButton.h
@@ -128,6 +128,27 @@ namespace gui
font of the active skin otherwise */
virtual IGUIFont* getActiveFont() const = 0;
+ //! Sets another color for the button text.
+ /** When set, this color is used instead of EGDC_BUTTON_TEXT/EGDC_GRAY_TEXT.
+ You don't need to call enableOverrideColor(true), that's done by this function.
+ If you want the the color of the skin back, call enableOverrideColor(false);
+ \param color: New color of the text. */
+ virtual void setOverrideColor(video::SColor color) = 0;
+
+ //! Gets the override color
+ /** \return: The override color */
+ virtual video::SColor getOverrideColor(void) const = 0;
+
+ //! Sets if the button text should use the override color or the color in the gui skin.
+ /** \param enable: If set to true, the override color, which can be set
+ with IGUIStaticText::setOverrideColor is used, otherwise the
+ EGDC_BUTTON_TEXT or EGDC_GRAY_TEXT color of the skin. */
+ virtual void enableOverrideColor(bool enable) = 0;
+
+ //! Checks if an override color is enabled
+ /** \return true if the override color is enabled, false otherwise */
+ virtual bool isOverrideColorEnabled(void) const = 0;
+
//! Sets an image which should be displayed on the button when it is in the given state.
/** Only one image-state can be active at a time. Images are drawn below sprites.
If a state is without image it will try to use images from other states as described
@@ -225,6 +246,14 @@ namespace gui
//! Checks whether the button scales the used images
virtual bool isScalingImage() const = 0;
+
+ //! Get if the shift key was pressed in last EGET_BUTTON_CLICKED event
+ /** Generated together with event, so info is available in the event-receiver. */
+ virtual bool getClickShiftState() const = 0;
+
+ //! Get if the control key was pressed in last EGET_BUTTON_CLICKED event
+ /** Generated together with event, so info is available in the event-receiver. */
+ virtual bool getClickControlState() const = 0;
};
diff --git a/include/ISceneManager.h b/include/ISceneManager.h
index 7d2fdc50..81c5d98c 100644
--- a/include/ISceneManager.h
+++ b/include/ISceneManager.h
@@ -1119,6 +1119,12 @@ namespace scene
virtual u32 registerNodeForRendering(ISceneNode* node,
E_SCENE_NODE_RENDER_PASS pass = ESNRP_AUTOMATIC) = 0;
+ //! Clear all nodes which are currently registered for rendering
+ /** Usually you don't have to care about this as drawAll will clear nodes
+ after rendering them. But sometimes you might have to manully reset this.
+ For example when you deleted nodes between registering and rendering. */
+ virtual void clearAllRegisteredNodesForRendering() = 0;
+
//! Draws all the scene nodes.
/** This can only be invoked between
IVideoDriver::beginScene() and IVideoDriver::endScene(). Please note that
diff --git a/source/Irrlicht/CGUIButton.cpp b/source/Irrlicht/CGUIButton.cpp
index 7b5c944e..1a0bb7a6 100644
--- a/source/Irrlicht/CGUIButton.cpp
+++ b/source/Irrlicht/CGUIButton.cpp
@@ -21,7 +21,9 @@ CGUIButton::CGUIButton(IGUIEnvironment* environment, IGUIElement* parent,
s32 id, core::rect rectangle, bool noclip)
: IGUIButton(environment, parent, id, rectangle),
SpriteBank(0), OverrideFont(0),
+ OverrideColorEnabled(false), OverrideColor(video::SColor(101,255,255,255)),
ClickTime(0), HoverTime(0), FocusTime(0),
+ ClickShiftState(false), ClickControlState(false),
IsPushButton(false), Pressed(false),
UseAlphaChannel(false), DrawBorder(true), ScaleImage(false)
{
@@ -146,6 +148,9 @@ bool CGUIButton::OnEvent(const SEvent& event)
if (Parent)
{
+ ClickShiftState = event.KeyInput.Shift;
+ ClickControlState = event.KeyInput.Control;
+
SEvent newEvent;
newEvent.EventType = EET_GUI_EVENT;
newEvent.GUIEvent.Caller = this;
@@ -205,6 +210,9 @@ bool CGUIButton::OnEvent(const SEvent& event)
if ((!IsPushButton && wasPressed && Parent) ||
(IsPushButton && wasPressed != Pressed))
{
+ ClickShiftState = event.MouseInput.Shift;
+ ClickControlState = event.MouseInput.Control;
+
SEvent newEvent;
newEvent.EventType = EET_GUI_EVENT;
newEvent.GUIEvent.Caller = this;
@@ -320,7 +328,7 @@ void CGUIButton::draw()
if (font)
font->draw(Text.c_str(), rect,
- skin->getColor(isEnabled() ? EGDC_BUTTON_TEXT : EGDC_GRAY_TEXT),
+ OverrideColorEnabled ? OverrideColor : skin->getColor(isEnabled() ? EGDC_BUTTON_TEXT : EGDC_GRAY_TEXT),
true, true, &AbsoluteClippingRect);
}
@@ -447,6 +455,28 @@ IGUIFont* CGUIButton::getActiveFont() const
return 0;
}
+//! Sets another color for the text.
+void CGUIButton::setOverrideColor(video::SColor color)
+{
+ OverrideColor = color;
+ OverrideColorEnabled = true;
+}
+
+video::SColor CGUIButton::getOverrideColor() const
+{
+ return OverrideColor;
+}
+
+void CGUIButton::enableOverrideColor(bool enable)
+{
+ OverrideColorEnabled = enable;
+}
+
+bool CGUIButton::isOverrideColorEnabled() const
+{
+ return OverrideColorEnabled;
+}
+
void CGUIButton::setImage(EGUI_BUTTON_IMAGE_STATE state, video::ITexture* image, const core::rect& sourceRect)
{
if ( state >= EGBIS_COUNT )
diff --git a/source/Irrlicht/CGUIButton.h b/source/Irrlicht/CGUIButton.h
index a3eebe04..ab383db7 100644
--- a/source/Irrlicht/CGUIButton.h
+++ b/source/Irrlicht/CGUIButton.h
@@ -44,6 +44,18 @@ namespace gui
//! Get the font which is used right now for drawing
virtual IGUIFont* getActiveFont() const _IRR_OVERRIDE_;
+ //! Sets another color for the button text.
+ virtual void setOverrideColor(video::SColor color) _IRR_OVERRIDE_;
+
+ //! Gets the override color
+ virtual video::SColor getOverrideColor(void) const _IRR_OVERRIDE_;
+
+ //! Sets if the button text should use the override color or the color in the gui skin.
+ virtual void enableOverrideColor(bool enable) _IRR_OVERRIDE_;
+
+ //! Checks if an override color is enabled
+ virtual bool isOverrideColorEnabled(void) const _IRR_OVERRIDE_;
+
//! Sets an image which should be displayed on the button when it is in the given state.
virtual void setImage(EGUI_BUTTON_IMAGE_STATE state, video::ITexture* image=0, const core::rect& sourceRect=core::rect(0,0,0,0)) _IRR_OVERRIDE_;
@@ -128,6 +140,18 @@ namespace gui
//! Checks whether the button scales the used images
virtual bool isScalingImage() const _IRR_OVERRIDE_;
+ //! Get if the shift key was pressed in last EGET_BUTTON_CLICKED event
+ virtual bool getClickShiftState() const _IRR_OVERRIDE_
+ {
+ return ClickShiftState;
+ }
+
+ //! Get if the control key was pressed in last EGET_BUTTON_CLICKED event
+ virtual bool getClickControlState() const _IRR_OVERRIDE_
+ {
+ return ClickControlState;
+ }
+
//! Writes attributes of the element.
virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const _IRR_OVERRIDE_;
@@ -205,8 +229,14 @@ namespace gui
IGUIFont* OverrideFont;
+ bool OverrideColorEnabled;
+ video::SColor OverrideColor;
+
u32 ClickTime, HoverTime, FocusTime;
+ bool ClickShiftState;
+ bool ClickControlState;
+
bool IsPushButton;
bool Pressed;
bool UseAlphaChannel;
diff --git a/source/Irrlicht/CNullDriver.cpp b/source/Irrlicht/CNullDriver.cpp
index ff15c457..7b3183e2 100644
--- a/source/Irrlicht/CNullDriver.cpp
+++ b/source/Irrlicht/CNullDriver.cpp
@@ -648,7 +648,7 @@ video::ITexture* CNullDriver::loadTextureFromFile(io::IReadFile* file, const io:
}
if (texture)
- os::Printer::log("Loaded texture", file->getFileName());
+ os::Printer::log("Loaded texture", file->getFileName(), ELL_DEBUG);
}
for (u32 i = 0; i < imageArray.size(); ++i)
diff --git a/source/Irrlicht/CSceneManager.cpp b/source/Irrlicht/CSceneManager.cpp
index 0cd97d22..25d52717 100644
--- a/source/Irrlicht/CSceneManager.cpp
+++ b/source/Irrlicht/CSceneManager.cpp
@@ -415,31 +415,10 @@ IAnimatedMesh* CSceneManager::getMesh(const io::path& filename, const io::path&
return 0;
}
- // iterate the list in reverse order so user-added loaders can override the built-in ones
- s32 count = MeshLoaderList.size();
- for (s32 i=count-1; i>=0; --i)
- {
- if (MeshLoaderList[i]->isALoadableFileExtension(filename))
- {
- // reset file to avoid side effects of previous calls to createMesh
- file->seek(0);
- msh = MeshLoaderList[i]->createMesh(file);
- if (msh)
- {
- MeshCache->addMesh(cacheName, msh);
- msh->drop();
- break;
- }
- }
- }
+ msh = getUncachedMesh(file, filename, cacheName);
file->drop();
- if (!msh)
- os::Printer::log("Could not load mesh, file format seems to be unsupported", filename, ELL_ERROR);
- else
- os::Printer::log("Loaded mesh", filename, ELL_INFORMATION);
-
return msh;
}
@@ -451,22 +430,32 @@ IAnimatedMesh* CSceneManager::getMesh(io::IReadFile* file)
return 0;
io::path name = file->getFileName();
- IAnimatedMesh* msh = MeshCache->getMeshByName(file->getFileName());
+ IAnimatedMesh* msh = MeshCache->getMeshByName(name);
if (msh)
return msh;
+ msh = getUncachedMesh(file, name, name);
+
+ return msh;
+}
+
+// load and create a mesh which we know already isn't in the cache and put it in there
+IAnimatedMesh* CSceneManager::getUncachedMesh(io::IReadFile* file, const io::path& filename, const io::path& cachename)
+{
+ IAnimatedMesh* msh = 0;
+
// iterate the list in reverse order so user-added loaders can override the built-in ones
s32 count = MeshLoaderList.size();
for (s32 i=count-1; i>=0; --i)
{
- if (MeshLoaderList[i]->isALoadableFileExtension(name))
+ if (MeshLoaderList[i]->isALoadableFileExtension(filename))
{
// reset file to avoid side effects of previous calls to createMesh
file->seek(0);
msh = MeshLoaderList[i]->createMesh(file);
if (msh)
{
- MeshCache->addMesh(file->getFileName(), msh);
+ MeshCache->addMesh(cachename, msh);
msh->drop();
break;
}
@@ -474,14 +463,13 @@ IAnimatedMesh* CSceneManager::getMesh(io::IReadFile* file)
}
if (!msh)
- os::Printer::log("Could not load mesh, file format seems to be unsupported", file->getFileName(), ELL_ERROR);
+ os::Printer::log("Could not load mesh, file format seems to be unsupported", filename, ELL_ERROR);
else
- os::Printer::log("Loaded mesh", file->getFileName(), ELL_INFORMATION);
+ os::Printer::log("Loaded mesh", filename, ELL_DEBUG);
return msh;
}
-
//! returns the video driver
video::IVideoDriver* CSceneManager::getVideoDriver()
{
@@ -1377,6 +1365,16 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE
return taken;
}
+void CSceneManager::clearAllRegisteredNodesForRendering()
+{
+ CameraList.clear();
+ LightList.clear();
+ SkyBoxList.clear();
+ SolidNodeList.clear();
+ TransparentNodeList.clear();
+ TransparentEffectNodeList.clear();
+ ShadowNodeList.clear();
+}
//! This method is called just before the rendering process of the whole scene.
//! draws all scene nodes
diff --git a/source/Irrlicht/CSceneManager.h b/source/Irrlicht/CSceneManager.h
index e8f39902..c145dd65 100644
--- a/source/Irrlicht/CSceneManager.h
+++ b/source/Irrlicht/CSceneManager.h
@@ -112,6 +112,9 @@ namespace scene
//! registers a node for rendering it at a specific time.
virtual u32 registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDER_PASS pass = ESNRP_AUTOMATIC) _IRR_OVERRIDE_;
+ //! Clear all nodes which are currently registered for rendering
+ virtual void clearAllRegisteredNodesForRendering() _IRR_OVERRIDE_;
+
//! draws all scene nodes
virtual void drawAll() _IRR_OVERRIDE_;
@@ -531,6 +534,9 @@ namespace scene
private:
+ // load and create a mesh which we know already isn't in the cache and put it in there
+ IAnimatedMesh* getUncachedMesh(io::IReadFile* file, const io::path& filename, const io::path& cachename);
+
//! clears the deletion list
void clearDeletionList();