Make UI in example 22.MaterialViewer a bit nicer.

Less black on grey text.
Prevent controlling light and ui-elements same time.
Bit more compact code in a few places.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6311 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
cutealien 2022-03-19 16:07:38 +00:00
parent 8254c0848c
commit 73247f4a21
2 changed files with 65 additions and 67 deletions

@ -1,6 +1,6 @@
/** Example 022 Material Viewer /** Example 022 Material Viewer
This example can be used to play around with material settings and watch the results. This example can be used to experiment with material settings and watch the results.
Only the default non-shader materials are used in here. Only the default non-shader materials are used in here.
You have a node with a mesh, one dynamic light and global ambient light to play around with. You have a node with a mesh, one dynamic light and global ambient light to play around with.
@ -127,9 +127,8 @@ video::E_VERTEX_TYPE getVertexTypeForMaterialType(video::E_MATERIAL_TYPE materia
} }
/* /*
Custom GUI-control to edit colorvalues. Custom GUI-control to edit color values.
*/ */
// Constructor
CColorControl::CColorControl(gui::IGUIEnvironment* guiEnv, const core::position2d<s32> & pos, const wchar_t *text, IGUIElement* parent, s32 id) CColorControl::CColorControl(gui::IGUIEnvironment* guiEnv, const core::position2d<s32> & pos, const wchar_t *text, IGUIElement* parent, s32 id)
: gui::IGUIElement(gui::EGUIET_ELEMENT, guiEnv, parent,id, core::rect< s32 >(pos, pos+core::dimension2d<s32>(80, 75))) : gui::IGUIElement(gui::EGUIET_ELEMENT, guiEnv, parent,id, core::rect< s32 >(pos, pos+core::dimension2d<s32>(80, 75)))
, DirtyFlag(true) , DirtyFlag(true)
@ -147,12 +146,13 @@ CColorControl::CColorControl(gui::IGUIEnvironment* guiEnv, const core::position2
IGUIStaticText * groupElement = guiEnv->addStaticText (L"", rectControls, true, false, this, -1, false); IGUIStaticText * groupElement = guiEnv->addStaticText (L"", rectControls, true, false, this, -1, false);
groupElement->setNotClipped(true); groupElement->setNotClipped(true);
guiEnv->addStaticText (text, core::rect<s32>(0,0,80,15), false, false, groupElement, -1, false); s32 border=guiEnv->getSkin()->getSize(EGDS_TEXT_DISTANCE_X);
guiEnv->addStaticText(text, core::rect<s32>(border,border,80,15), false, false, groupElement, -1, true);
EditAlpha = addEditForNumbers(guiEnv, core::position2d<s32>(0,15), L"a", -1, groupElement ); EditAlpha = addEditForNumbers(guiEnv, core::position2d<s32>(border,15), L"a", -1, groupElement );
EditRed = addEditForNumbers(guiEnv, core::position2d<s32>(0,30), L"r", -1, groupElement ); EditRed = addEditForNumbers(guiEnv, core::position2d<s32>(border,30), L"r", -1, groupElement );
EditGreen = addEditForNumbers(guiEnv, core::position2d<s32>(0,45), L"g", -1, groupElement ); EditGreen = addEditForNumbers(guiEnv, core::position2d<s32>(border,45), L"g", -1, groupElement );
EditBlue = addEditForNumbers(guiEnv, core::position2d<s32>(0,60), L"b", -1, groupElement ); EditBlue = addEditForNumbers(guiEnv, core::position2d<s32>(border,60), L"b", -1, groupElement );
ColorStatic = guiEnv->addStaticText (L"", core::rect<s32>(60,15,80,75), true, false, groupElement, -1, true); ColorStatic = guiEnv->addStaticText (L"", core::rect<s32>(60,15,80,75), true, false, groupElement, -1, true);
@ -163,10 +163,9 @@ CColorControl::CColorControl(gui::IGUIEnvironment* guiEnv, const core::position2
// event receiver // event receiver
bool CColorControl::OnEvent(const SEvent &event) bool CColorControl::OnEvent(const SEvent &event)
{ {
if ( event.EventType != EET_GUI_EVENT ) if ( event.EventType == EET_GUI_EVENT
return false; && event.GUIEvent.Caller->getID() == ButtonSetId
&& event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED )
if ( event.GUIEvent.Caller->getID() == ButtonSetId && event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED )
{ {
Color = getColorFromEdits(); Color = getColorFromEdits();
setEditsFromColor(Color); setEditsFromColor(Color);
@ -188,8 +187,8 @@ gui::IGUIEditBox* CColorControl::addEditForNumbers(gui::IGUIEnvironment* guiEnv,
{ {
using namespace gui; using namespace gui;
core::rect< s32 > rect(pos, pos+core::dimension2d<s32>(10, 15)); core::recti rect(pos, pos+core::dimension2d<s32>(10, 15));
guiEnv->addStaticText (text, rect, false, false, parent, -1, false); guiEnv->addStaticText(text, rect, false, false, parent, -1, false);
rect += core::position2d<s32>( 20, 0 ); rect += core::position2d<s32>( 20, 0 );
rect.LowerRightCorner.X += 20; rect.LowerRightCorner.X += 20;
gui::IGUIEditBox* edit = guiEnv->addEditBox(L"0", rect, true, parent, id); gui::IGUIEditBox* edit = guiEnv->addEditBox(L"0", rect, true, parent, id);
@ -203,33 +202,25 @@ video::SColor CColorControl::getColorFromEdits() const
if (EditAlpha) if (EditAlpha)
{ {
u32 alpha = core::strtoul10(core::stringc(EditAlpha->getText()).c_str()); u32 alpha = core::min_(core::strtoul10(core::stringc(EditAlpha->getText()).c_str()), 255u);
if (alpha > 255)
alpha = 255;
col.setAlpha(alpha); col.setAlpha(alpha);
} }
if (EditRed) if (EditRed)
{ {
u32 red = core::strtoul10(core::stringc(EditRed->getText()).c_str()); u32 red = core::min_(core::strtoul10(core::stringc(EditRed->getText()).c_str()), 255u);
if (red > 255)
red = 255;
col.setRed(red); col.setRed(red);
} }
if (EditGreen) if (EditGreen)
{ {
u32 green = core::strtoul10(core::stringc(EditGreen->getText()).c_str()); u32 green = core::min_(core::strtoul10(core::stringc(EditGreen->getText()).c_str()), 255u);
if (green > 255)
green = 255;
col.setGreen(green); col.setGreen(green);
} }
if (EditBlue) if (EditBlue)
{ {
u32 blue = core::strtoul10(core::stringc(EditBlue->getText()).c_str()); u32 blue = core::min_(core::strtoul10(core::stringc(EditBlue->getText()).c_str()), 255u);
if (blue > 255)
blue = 255;
col.setBlue(blue); col.setBlue(blue);
} }
@ -345,10 +336,9 @@ CTextureControl::CTextureControl(gui::IGUIEnvironment* guiEnv, video::IVideoDriv
bool CTextureControl::OnEvent(const SEvent &event) bool CTextureControl::OnEvent(const SEvent &event)
{ {
if ( event.EventType != EET_GUI_EVENT ) if ( event.EventType == EET_GUI_EVENT
return false; && event.GUIEvent.Caller == ComboTexture
&& event.GUIEvent.EventType == gui::EGET_COMBO_BOX_CHANGED )
if ( event.GUIEvent.Caller == ComboTexture && event.GUIEvent.EventType == gui::EGET_COMBO_BOX_CHANGED )
{ {
DirtyFlag = true; DirtyFlag = true;
} }
@ -429,17 +419,16 @@ void CMaterialControl::init(scene::IMeshSceneNode* node, IrrlichtDevice * device
Driver = device->getVideoDriver (); Driver = device->getVideoDriver ();
gui::IGUIEnvironment* guiEnv = device->getGUIEnvironment(); gui::IGUIEnvironment* guiEnv = device->getGUIEnvironment();
//scene::ISceneManager* smgr = device->getSceneManager();
const video::SMaterial & material = node->getMaterial(0); const video::SMaterial & material = node->getMaterial(0);
s32 top = pos.Y; s32 top = pos.Y;
// Description // Description
guiEnv->addStaticText(description, core::rect<s32>(pos.X, top, pos.X+60, top+15), false, false, 0, -1, false); guiEnv->addStaticText(description, core::rect<s32>(pos.X, top, pos.X+150, top+15), true, false, 0, -1, true);
top += 15; top += 15;
// Control for material type // Control for material type
core::rect<s32> rectCombo(pos.X, top, 150, top+15); core::rect<s32> rectCombo(pos.X, top, pos.X+150, top+15);
top += 15; top += 15;
ComboMaterial = guiEnv->addComboBox (rectCombo); ComboMaterial = guiEnv->addComboBox (rectCombo);
for ( int i=0; i <= (int)video::EMT_ONETEXTURE_BLEND; ++i ) for ( int i=0; i <= (int)video::EMT_ONETEXTURE_BLEND; ++i )
@ -454,7 +443,7 @@ void CMaterialControl::init(scene::IMeshSceneNode* node, IrrlichtDevice * device
ButtonLighting = guiEnv->addButton (rectBtn, 0, -1, L"Lighting"); ButtonLighting = guiEnv->addButton (rectBtn, 0, -1, L"Lighting");
ButtonLighting->setIsPushButton(true); ButtonLighting->setIsPushButton(true);
ButtonLighting->setPressed(material.Lighting); ButtonLighting->setPressed(material.Lighting);
core::rect<s32> rectInfo( rectBtn.LowerRightCorner.X, rectBtn.UpperLeftCorner.Y, rectBtn.LowerRightCorner.X+40, rectBtn.UpperLeftCorner.Y+15 ); core::rect<s32> rectInfo( rectBtn.LowerRightCorner.X, rectBtn.UpperLeftCorner.Y, rectBtn.LowerRightCorner.X+50, rectBtn.UpperLeftCorner.Y+15 );
InfoLighting = guiEnv->addStaticText(L"", rectInfo, true, false ); InfoLighting = guiEnv->addStaticText(L"", rectInfo, true, false );
InfoLighting->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_CENTER ); InfoLighting->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_CENTER );
@ -464,12 +453,14 @@ void CMaterialControl::init(scene::IMeshSceneNode* node, IrrlichtDevice * device
TypicalColorsControl->setColorsToMaterialColors(material); TypicalColorsControl->setColorsToMaterialColors(material);
// Controls for selecting the material textures // Controls for selecting the material textures
guiEnv->addStaticText(L"Textures", core::rect<s32>(pos.X, top, pos.X+60, top+15), false, false, 0, -1, false); guiEnv->addStaticText(L"Textures", core::rect<s32>(pos.X, top, pos.X+150, top+15), true, false, 0, -1, true);
top += 15; top += 15;
for (irr::u32 i=0; i<irr::video::MATERIAL_MAX_TEXTURES; ++i) // The default material types only use first 2 textures
irr::u32 maxTextures = core::min_(2u, irr::video::MATERIAL_MAX_TEXTURES);
for (irr::u32 i=0; i<maxTextures; ++i)
{ {
TextureControls[i] = new CTextureControl(guiEnv, Driver, core::position2di(pos.X, top), guiEnv->getRootGUIElement()); TextureControls.push_back(new CTextureControl(guiEnv, Driver, core::position2di(pos.X, top), guiEnv->getRootGUIElement()));
top += 15; top += 15;
} }
@ -525,19 +516,19 @@ void CMaterialControl::update(scene::IMeshSceneNode* sceneNode, scene::IMeshScen
TypicalColorsControl->resetDirty(); TypicalColorsControl->resetDirty();
for (irr::u32 i=0; i<irr::video::MATERIAL_MAX_TEXTURES; ++i) for (irr::u32 i=0; i<TextureControls.size(); ++i)
TextureControls[i]->resetDirty(); TextureControls[i]->resetDirty();
} }
void CMaterialControl::updateTextures() void CMaterialControl::updateTextures()
{ {
for (irr::u32 i=0; i<irr::video::MATERIAL_MAX_TEXTURES; ++i) for (irr::u32 i=0; i<TextureControls.size(); ++i)
TextureControls[i]->updateTextures(Driver); TextureControls[i]->updateTextures(Driver);
} }
void CMaterialControl::selectTextures(const irr::core::stringw& name) void CMaterialControl::selectTextures(const irr::core::stringw& name)
{ {
for (irr::u32 i=0; i<irr::video::MATERIAL_MAX_TEXTURES; ++i) for (irr::u32 i=0; i<TextureControls.size(); ++i)
TextureControls[i]->selectTextureByName(name); TextureControls[i]->selectTextureByName(name);
} }
@ -550,11 +541,11 @@ void CMaterialControl::updateMaterial(video::SMaterial & material)
{ {
TypicalColorsControl->updateMaterialColors(material); TypicalColorsControl->updateMaterialColors(material);
material.Lighting = ButtonLighting->isPressed(); material.Lighting = ButtonLighting->isPressed();
for (irr::u32 i=0; i<irr::video::MATERIAL_MAX_TEXTURES; ++i) for (irr::u32 i=0; i<TextureControls.size(); ++i)
{ {
if ( TextureControls[i]->isDirty() ) if ( TextureControls[i]->isDirty() )
{ {
material.TextureLayer[i].Texture = Driver->getTexture( io::path(TextureControls[i]->getSelectedTextureName()) ); material.TextureLayer[i].Texture = Driver->findTexture( io::path(TextureControls[i]->getSelectedTextureName()) );
} }
} }
} }
@ -568,7 +559,7 @@ void CLightNodeControl::init(scene::ILightSceneNode* node, gui::IGUIEnvironment*
if ( Initialized || !node || !guiEnv) // initializing twice or with invalid data not allowed if ( Initialized || !node || !guiEnv) // initializing twice or with invalid data not allowed
return; return;
guiEnv->addStaticText(description, core::rect<s32>(pos.X, pos.Y, pos.X+70, pos.Y+15), false, false, 0, -1, false); guiEnv->addStaticText(description, core::rect<s32>(pos.X, pos.Y, pos.X+80, pos.Y+15), true, false, 0, -1, true);
TypicalColorsControl = new CTypicalColorsControl(guiEnv, core::position2d<s32>(pos.X, pos.Y+15), false, guiEnv->getRootGUIElement()); TypicalColorsControl = new CTypicalColorsControl(guiEnv, core::position2d<s32>(pos.X, pos.Y+15), false, guiEnv->getRootGUIElement());
const video::SLight & lightData = node->getLightData(); const video::SLight & lightData = node->getLightData();
TypicalColorsControl->setColorsToLightDataColors(lightData); TypicalColorsControl->setColorsToLightDataColors(lightData);
@ -711,10 +702,14 @@ bool CApp::init(int argc, char *argv[])
defaultMaterial.Shininess = 20.f; defaultMaterial.Shininess = 20.f;
// add the nodes which are used to show the materials // add the nodes which are used to show the materials
#if 1
SceneNode = smgr->addCubeSceneNode (30.0f, 0, -1, SceneNode = smgr->addCubeSceneNode (30.0f, 0, -1,
core::vector3df(0, 0, 0), core::vector3df(0, 0, 0),
core::vector3df(0.f, 45.f, 0.f), core::vector3df(0.f, 45.f, 0.f),
core::vector3df(1.0f, 1.0f, 1.0f)); core::vector3df(1.0f, 1.0f, 1.0f));
#else
SceneNode = smgr->addSphereSceneNode(30.f);
#endif
SceneNode->getMaterial(0) = defaultMaterial; SceneNode->getMaterial(0) = defaultMaterial;
const s32 controlsTop = 20; const s32 controlsTop = 20;
@ -749,8 +744,8 @@ bool CApp::init(int argc, char *argv[])
// Add a the mesh vertex color control // Add a the mesh vertex color control
guiEnv->addStaticText(L"Mesh", core::rect<s32>(200, controlsTop, 270, controlsTop+15), false, false, 0, -1, false); guiEnv->addStaticText(L"Mesh", core::rect<s32>(440, controlsTop, 520, controlsTop+15), true, false, 0, -1, true);
ControlVertexColors = new CColorControl( guiEnv, core::position2d<s32>(200, controlsTop+15), L"Vertex colors", guiEnv->getRootGUIElement()); ControlVertexColors = new CColorControl( guiEnv, core::position2d<s32>(440, controlsTop+15), L"Vertex colors", guiEnv->getRootGUIElement());
video::S3DVertex * vertices = (video::S3DVertex *)SceneNode->getMesh()->getMeshBuffer(0)->getVertices(); video::S3DVertex * vertices = (video::S3DVertex *)SceneNode->getMesh()->getMeshBuffer(0)->getVertices();
if ( vertices ) if ( vertices )
{ {
@ -769,8 +764,6 @@ bool CApp::init(int argc, char *argv[])
*/ */
bool CApp::update() bool CApp::update()
{ {
using namespace irr;
video::IVideoDriver* videoDriver = Device->getVideoDriver(); video::IVideoDriver* videoDriver = Device->getVideoDriver();
if ( !Device->run() ) if ( !Device->run() )
return false; return false;
@ -807,22 +800,30 @@ bool CApp::update()
GlobalAmbient->resetDirty(); GlobalAmbient->resetDirty();
} }
// Let the user move the light around
const float zoomSpeed = 10.f * deltaTime; const float zoomSpeed = 10.f * deltaTime;
const float rotationSpeed = 100.f * deltaTime; const float rotationSpeed = 100.f * deltaTime;
if ( KeysPressed[KEY_PLUS] || KeysPressed[KEY_ADD])
ZoomOut(NodeLight, zoomSpeed); // Let the user move the light around
if ( KeysPressed[KEY_MINUS] || KeysPressed[KEY_SUBTRACT]) irr::gui::IGUIElement* focus=guiEnv->getFocus(); // some checks to prevent interfering with UI input
ZoomOut(NodeLight, -zoomSpeed); if ( !focus || focus == guiEnv->getRootGUIElement()
if ( KeysPressed[KEY_RIGHT]) || focus->getType() == irr::gui::EGUIET_STATIC_TEXT
RotateHorizontal(NodeLight, rotationSpeed); || focus->getType() == irr::gui::EGUIET_BUTTON
if ( KeysPressed[KEY_LEFT]) )
RotateHorizontal(NodeLight, -rotationSpeed); {
UpdateRotationAxis(NodeLight, LightRotationAxis); if ( KeysPressed[KEY_PLUS] || KeysPressed[KEY_ADD])
if ( KeysPressed[KEY_UP]) ZoomOut(NodeLight, zoomSpeed);
RotateAroundAxis(NodeLight, rotationSpeed, LightRotationAxis); if ( KeysPressed[KEY_MINUS] || KeysPressed[KEY_SUBTRACT])
if ( KeysPressed[KEY_DOWN]) ZoomOut(NodeLight, -zoomSpeed);
RotateAroundAxis(NodeLight, -rotationSpeed, LightRotationAxis); if ( KeysPressed[KEY_RIGHT])
RotateHorizontal(NodeLight, rotationSpeed);
if ( KeysPressed[KEY_LEFT])
RotateHorizontal(NodeLight, -rotationSpeed);
UpdateRotationAxis(NodeLight, LightRotationAxis);
if ( KeysPressed[KEY_UP])
RotateAroundAxis(NodeLight, rotationSpeed, LightRotationAxis);
if ( KeysPressed[KEY_DOWN])
RotateAroundAxis(NodeLight, -rotationSpeed, LightRotationAxis);
}
// Let the user move the camera around // Let the user move the camera around
if (MousePressed) if (MousePressed)

@ -140,15 +140,12 @@ public:
CMaterialControl() CMaterialControl()
: Initialized(false), Driver(0) : Initialized(false), Driver(0)
, TypicalColorsControl(0), ButtonLighting(0), InfoLighting(0), ComboMaterial(0) , TypicalColorsControl(0), ButtonLighting(0), InfoLighting(0), ComboMaterial(0)
{ {}
for (irr::u32 i=0; i<irr::video::MATERIAL_MAX_TEXTURES; ++i)
TextureControls[i] = 0;
}
// Destructor // Destructor
~CMaterialControl() ~CMaterialControl()
{ {
for (irr::u32 i=0; i<irr::video::MATERIAL_MAX_TEXTURES; ++i) for (irr::u32 i=0; i<TextureControls.size(); ++i)
{ {
if (TextureControls[i] ) if (TextureControls[i] )
TextureControls[i]->drop(); TextureControls[i]->drop();
@ -177,7 +174,7 @@ protected:
irr::gui::IGUIButton * ButtonLighting; irr::gui::IGUIButton * ButtonLighting;
irr::gui::IGUIStaticText* InfoLighting; irr::gui::IGUIStaticText* InfoLighting;
irr::gui::IGUIComboBox * ComboMaterial; irr::gui::IGUIComboBox * ComboMaterial;
CTextureControl* TextureControls[irr::video::MATERIAL_MAX_TEXTURES]; irr::core::array<CTextureControl*> TextureControls;
}; };
/* /*