show/hide crosshair correctly

This commit is contained in:
scrawl 2012-08-27 19:18:55 +02:00
parent 61923349e5
commit 9af0b48ad6
7 changed files with 134 additions and 85 deletions

View file

@ -177,6 +177,8 @@ namespace MWBase
virtual void unsetSelectedSpell() = 0; virtual void unsetSelectedSpell() = 0;
virtual void unsetSelectedWeapon() = 0; virtual void unsetSelectedWeapon() = 0;
virtual void showCrosshair(bool show) = 0;
virtual void disallowMouse() = 0; virtual void disallowMouse() = 0;
virtual void allowMouse() = 0; virtual void allowMouse() = 0;
virtual void notifyInputActionBound() = 0; virtual void notifyInputActionBound() = 0;

View file

@ -24,9 +24,9 @@ using namespace MWGui;
HUD::HUD(int width, int height, int fpsLevel, DragAndDrop* dragAndDrop) HUD::HUD(int width, int height, int fpsLevel, DragAndDrop* dragAndDrop)
: Layout("openmw_hud.layout") : Layout("openmw_hud.layout")
, health(NULL) , mHealth(NULL)
, magicka(NULL) , mMagicka(NULL)
, stamina(NULL) , mStamina(NULL)
, mWeapImage(NULL) , mWeapImage(NULL)
, mSpellImage(NULL) , mSpellImage(NULL)
, mWeapStatus(NULL) , mWeapStatus(NULL)
@ -36,10 +36,10 @@ HUD::HUD(int width, int height, int fpsLevel, DragAndDrop* dragAndDrop)
, mMinimap(NULL) , mMinimap(NULL)
, mCompass(NULL) , mCompass(NULL)
, mCrosshair(NULL) , mCrosshair(NULL)
, fpsbox(NULL) , mFpsBox(NULL)
, fpscounter(NULL) , mFpsCounter(NULL)
, trianglecounter(NULL) , mTriangleCounter(NULL)
, batchcounter(NULL) , mBatchCounter(NULL)
, mHealthManaStaminaBaseLeft(0) , mHealthManaStaminaBaseLeft(0)
, mWeapBoxBaseLeft(0) , mWeapBoxBaseLeft(0)
, mSpellBoxBaseLeft(0) , mSpellBoxBaseLeft(0)
@ -57,9 +57,9 @@ HUD::HUD(int width, int height, int fpsLevel, DragAndDrop* dragAndDrop)
// Energy bars // Energy bars
getWidget(mHealthFrame, "HealthFrame"); getWidget(mHealthFrame, "HealthFrame");
getWidget(health, "Health"); getWidget(mHealth, "Health");
getWidget(magicka, "Magicka"); getWidget(mMagicka, "Magicka");
getWidget(stamina, "Stamina"); getWidget(mStamina, "Stamina");
mHealthManaStaminaBaseLeft = mHealthFrame->getLeft(); mHealthManaStaminaBaseLeft = mHealthFrame->getLeft();
@ -104,8 +104,8 @@ HUD::HUD(int width, int height, int fpsLevel, DragAndDrop* dragAndDrop)
setFpsLevel(fpsLevel); setFpsLevel(fpsLevel);
getWidget(trianglecounter, "TriangleCounter"); getWidget(mTriangleCounter, "TriangleCounter");
getWidget(batchcounter, "BatchCounter"); getWidget(mBatchCounter, "BatchCounter");
setEffect("icons\\s\\tx_s_chameleon.dds"); setEffect("icons\\s\\tx_s_chameleon.dds");
@ -118,7 +118,7 @@ HUD::HUD(int width, int height, int fpsLevel, DragAndDrop* dragAndDrop)
void HUD::setFpsLevel(int level) void HUD::setFpsLevel(int level)
{ {
fpscounter = 0; mFpsCounter = 0;
MyGUI::Widget* fps; MyGUI::Widget* fps;
getWidget(fps, "FPSBoxAdv"); getWidget(fps, "FPSBoxAdv");
@ -128,32 +128,32 @@ void HUD::setFpsLevel(int level)
if (level == 2) if (level == 2)
{ {
getWidget(fpsbox, "FPSBoxAdv"); getWidget(mFpsBox, "FPSBoxAdv");
fpsbox->setVisible(true); mFpsBox->setVisible(true);
getWidget(fpscounter, "FPSCounterAdv"); getWidget(mFpsCounter, "FPSCounterAdv");
} }
else if (level == 1) else if (level == 1)
{ {
getWidget(fpsbox, "FPSBox"); getWidget(mFpsBox, "FPSBox");
fpsbox->setVisible(true); mFpsBox->setVisible(true);
getWidget(fpscounter, "FPSCounter"); getWidget(mFpsCounter, "FPSCounter");
} }
} }
void HUD::setFPS(float fps) void HUD::setFPS(float fps)
{ {
if (fpscounter) if (mFpsCounter)
fpscounter->setCaption(boost::lexical_cast<std::string>((int)fps)); mFpsCounter->setCaption(boost::lexical_cast<std::string>((int)fps));
} }
void HUD::setTriangleCount(unsigned int count) void HUD::setTriangleCount(unsigned int count)
{ {
trianglecounter->setCaption(boost::lexical_cast<std::string>(count)); mTriangleCounter->setCaption(boost::lexical_cast<std::string>(count));
} }
void HUD::setBatchCount(unsigned int count) void HUD::setBatchCount(unsigned int count)
{ {
batchcounter->setCaption(boost::lexical_cast<std::string>(count)); mBatchCounter->setCaption(boost::lexical_cast<std::string>(count));
} }
void HUD::setEffect(const char *img) void HUD::setEffect(const char *img)
@ -176,20 +176,20 @@ void HUD::setValue(const std::string& id, const MWMechanics::DynamicStat<int>& v
switch (i) switch (i)
{ {
case 0: case 0:
health->setProgressRange (value.getModified()); mHealth->setProgressRange (value.getModified());
health->setProgressPosition (value.getCurrent()); mHealth->setProgressPosition (value.getCurrent());
getWidget(w, "HealthFrame"); getWidget(w, "HealthFrame");
w->setUserString("Caption_HealthDescription", "#{sHealthDesc}\n" + valStr); w->setUserString("Caption_HealthDescription", "#{sHealthDesc}\n" + valStr);
break; break;
case 1: case 1:
magicka->setProgressRange (value.getModified()); mMagicka->setProgressRange (value.getModified());
magicka->setProgressPosition (value.getCurrent()); mMagicka->setProgressPosition (value.getCurrent());
getWidget(w, "MagickaFrame"); getWidget(w, "MagickaFrame");
w->setUserString("Caption_HealthDescription", "#{sIntDesc}\n" + valStr); w->setUserString("Caption_HealthDescription", "#{sIntDesc}\n" + valStr);
break; break;
case 2: case 2:
stamina->setProgressRange (value.getModified()); mStamina->setProgressRange (value.getModified());
stamina->setProgressPosition (value.getCurrent()); mStamina->setProgressPosition (value.getCurrent());
getWidget(w, "FatigueFrame"); getWidget(w, "FatigueFrame");
w->setUserString("Caption_HealthDescription", "#{sFatDesc}\n" + valStr); w->setUserString("Caption_HealthDescription", "#{sFatDesc}\n" + valStr);
break; break;
@ -197,44 +197,6 @@ void HUD::setValue(const std::string& id, const MWMechanics::DynamicStat<int>& v
} }
} }
void HUD::setBottomLeftVisibility(bool hmsVisible, bool weapVisible, bool spellVisible)
{
int weapDx = 0, spellDx = 0;
if (!hmsVisible)
spellDx = weapDx = mWeapBoxBaseLeft - mHealthManaStaminaBaseLeft;
if (!weapVisible)
spellDx += mSpellBoxBaseLeft - mWeapBoxBaseLeft;
mWeaponVisible = weapVisible;
mSpellVisible = spellVisible;
if (!mWeaponVisible && !mSpellVisible)
mWeaponSpellBox->setVisible(false);
health->setVisible(hmsVisible);
stamina->setVisible(hmsVisible);
magicka->setVisible(hmsVisible);
mWeapBox->setPosition(mWeapBoxBaseLeft - weapDx, mWeapBox->getTop());
mWeapBox->setVisible(weapVisible);
mSpellBox->setPosition(mSpellBoxBaseLeft - spellDx, mSpellBox->getTop());
mSpellBox->setVisible(spellVisible);
}
void HUD::setBottomRightVisibility(bool effectBoxVisible, bool minimapBoxVisible)
{
const MyGUI::IntSize& viewSize = MyGUI::RenderManager::getInstance().getViewSize();
// effect box can have variable width -> variable left coordinate
int effectsDx = 0;
if (!minimapBoxVisible)
effectsDx = (viewSize.width - mMinimapBoxBaseRight) - (viewSize.width - mEffectBoxBaseRight);
mMapVisible = minimapBoxVisible;
mMinimapBox->setVisible(minimapBoxVisible);
mEffectBox->setPosition((viewSize.width - mEffectBoxBaseRight) - mEffectBox->getWidth() + effectsDx, mEffectBox->getTop());
mEffectBox->setVisible(effectBoxVisible);
}
void HUD::onWorldClicked(MyGUI::Widget* _sender) void HUD::onWorldClicked(MyGUI::Widget* _sender)
{ {
if (!MWBase::Environment::get().getWindowManager ()->isGuiMode ()) if (!MWBase::Environment::get().getWindowManager ()->isGuiMode ())
@ -520,3 +482,68 @@ void HUD::unsetSelectedWeapon()
mWeapImage->setImageTexture("icons\\k\\stealth_handtohand.dds"); mWeapImage->setImageTexture("icons\\k\\stealth_handtohand.dds");
mWeapBox->clearUserStrings(); mWeapBox->clearUserStrings();
} }
void HUD::setCrosshairVisible(bool visible)
{
mCrosshair->setVisible (visible);
}
void HUD::setHmsVisible(bool visible)
{
mHealth->setVisible(visible);
mMagicka->setVisible(visible);
mStamina->setVisible(visible);
updatePositions();
}
void HUD::setWeapVisible(bool visible)
{
mWeapBox->setVisible(visible);
updatePositions();
}
void HUD::setSpellVisible(bool visible)
{
mSpellBox->setVisible(visible);
updatePositions();
}
void HUD::setEffectVisible(bool visible)
{
mEffectBox->setVisible (visible);
updatePositions();
}
void HUD::setMinimapVisible(bool visible)
{
mMinimapBox->setVisible (visible);
updatePositions();
}
void HUD::updatePositions()
{
int weapDx = 0, spellDx = 0;
if (!mHealth->getVisible())
spellDx = weapDx = mWeapBoxBaseLeft - mHealthManaStaminaBaseLeft;
if (!mWeapBox->getVisible())
spellDx += mSpellBoxBaseLeft - mWeapBoxBaseLeft;
mWeaponVisible = mWeapBox->getVisible();
mSpellVisible = mSpellBox->getVisible();
if (!mWeaponVisible && !mSpellVisible)
mWeaponSpellBox->setVisible(false);
mWeapBox->setPosition(mWeapBoxBaseLeft - weapDx, mWeapBox->getTop());
mSpellBox->setPosition(mSpellBoxBaseLeft - spellDx, mSpellBox->getTop());
const MyGUI::IntSize& viewSize = MyGUI::RenderManager::getInstance().getViewSize();
// effect box can have variable width -> variable left coordinate
int effectsDx = 0;
if (!mMinimapBox->getVisible ())
effectsDx = (viewSize.width - mMinimapBoxBaseRight) - (viewSize.width - mEffectBoxBaseRight);
mMapVisible = mMinimapBox->getVisible ();
mEffectBox->setPosition((viewSize.width - mEffectBoxBaseRight) - mEffectBox->getWidth() + effectsDx, mEffectBox->getTop());
}

View file

@ -18,8 +18,14 @@ namespace MWGui
void setFPS(float fps); void setFPS(float fps);
void setTriangleCount(unsigned int count); void setTriangleCount(unsigned int count);
void setBatchCount(unsigned int count); void setBatchCount(unsigned int count);
void setBottomLeftVisibility(bool hmsVisible, bool weapVisible, bool spellVisible);
void setBottomRightVisibility(bool effectBoxVisible, bool minimapVisible); void setHmsVisible(bool visible);
void setWeapVisible(bool visible);
void setSpellVisible(bool visible);
void setEffectVisible(bool visible);
void setMinimapVisible(bool visible);
void setFpsLevel(const int level); void setFpsLevel(const int level);
void setSelectedSpell(const std::string& spellId, int successChancePercent); void setSelectedSpell(const std::string& spellId, int successChancePercent);
@ -28,6 +34,8 @@ namespace MWGui
void unsetSelectedSpell(); void unsetSelectedSpell();
void unsetSelectedWeapon(); void unsetSelectedWeapon();
void setCrosshairVisible(bool visible);
void onFrame(float dt); void onFrame(float dt);
void onResChange(int width, int height); void onResChange(int width, int height);
@ -35,7 +43,8 @@ namespace MWGui
bool getWorldMouseOver() { return mWorldMouseOver; } bool getWorldMouseOver() { return mWorldMouseOver; }
MyGUI::ProgressPtr health, magicka, stamina; private:
MyGUI::ProgressPtr mHealth, mMagicka, mStamina;
MyGUI::Widget* mHealthFrame; MyGUI::Widget* mHealthFrame;
MyGUI::Widget *mWeapBox, *mSpellBox; MyGUI::Widget *mWeapBox, *mSpellBox;
MyGUI::ImageBox *mWeapImage, *mSpellImage; MyGUI::ImageBox *mWeapImage, *mSpellImage;
@ -50,12 +59,11 @@ namespace MWGui
MyGUI::Widget* mDummy; MyGUI::Widget* mDummy;
MyGUI::WidgetPtr fpsbox; MyGUI::WidgetPtr mFpsBox;
MyGUI::TextBox* fpscounter; MyGUI::TextBox* mFpsCounter;
MyGUI::TextBox* trianglecounter; MyGUI::TextBox* mTriangleCounter;
MyGUI::TextBox* batchcounter; MyGUI::TextBox* mBatchCounter;
private:
// bottom left elements // bottom left elements
int mHealthManaStaminaBaseLeft, mWeapBoxBaseLeft, mSpellBoxBaseLeft; int mHealthManaStaminaBaseLeft, mWeapBoxBaseLeft, mSpellBoxBaseLeft;
// bottom right elements // bottom right elements
@ -83,5 +91,7 @@ namespace MWGui
void onWeaponClicked(MyGUI::Widget* _sender); void onWeaponClicked(MyGUI::Widget* _sender);
void onMagicClicked(MyGUI::Widget* _sender); void onMagicClicked(MyGUI::Widget* _sender);
void onMapClicked(MyGUI::Widget* _sender); void onMapClicked(MyGUI::Widget* _sender);
void updatePositions();
}; };
} }

View file

@ -559,12 +559,12 @@ void WindowManager::setPlayerDir(const float x, const float y)
void WindowManager::setHMSVisibility(bool visible) void WindowManager::setHMSVisibility(bool visible)
{ {
mHud->setBottomLeftVisibility(visible, mHud->mWeapBox->getVisible(), mHud->mSpellBox->getVisible()); mHud->setHmsVisible (visible);
} }
void WindowManager::setMinimapVisibility(bool visible) void WindowManager::setMinimapVisibility(bool visible)
{ {
mHud->setBottomRightVisibility(mHud->mEffectBox->getVisible(), visible); mHud->setMinimapVisible (visible);
} }
void WindowManager::toggleFogOfWar() void WindowManager::toggleFogOfWar()
@ -595,13 +595,13 @@ bool WindowManager::getFullHelp() const
void WindowManager::setWeaponVisibility(bool visible) void WindowManager::setWeaponVisibility(bool visible)
{ {
mHud->setBottomLeftVisibility(mHud->health->getVisible(), visible, mHud->mSpellBox->getVisible()); mHud->setWeapVisible (visible);
} }
void WindowManager::setSpellVisibility(bool visible) void WindowManager::setSpellVisibility(bool visible)
{ {
mHud->setBottomLeftVisibility(mHud->health->getVisible(), mHud->mWeapBox->getVisible(), visible); mHud->setSpellVisible (visible);
mHud->setBottomRightVisibility(visible, mHud->mMinimapBox->getVisible()); mHud->setEffectVisible (visible);
} }
void WindowManager::setMouseVisible(bool visible) void WindowManager::setMouseVisible(bool visible)
@ -847,3 +847,8 @@ void WindowManager::notifyInputActionBound ()
mSettingsWindow->updateControlsBox (); mSettingsWindow->updateControlsBox ();
allowMouse(); allowMouse();
} }
void WindowManager::showCrosshair (bool show)
{
mHud->setCrosshairVisible (show);
}

View file

@ -157,6 +157,8 @@ namespace MWGui
virtual void unsetSelectedSpell(); virtual void unsetSelectedSpell();
virtual void unsetSelectedWeapon(); virtual void unsetSelectedWeapon();
virtual void showCrosshair(bool show);
virtual void disallowMouse(); virtual void disallowMouse();
virtual void allowMouse(); virtual void allowMouse();
virtual void notifyInputActionBound(); virtual void notifyInputActionBound();

View file

@ -176,23 +176,18 @@ namespace MWInput
toggleJournal (); toggleJournal ();
break; break;
case A_AutoMove: case A_AutoMove:
resetIdleTime();
toggleAutoMove (); toggleAutoMove ();
break; break;
case A_ToggleSneak: case A_ToggleSneak:
/// \todo implement /// \todo implement
resetIdleTime();
break; break;
case A_ToggleWalk: case A_ToggleWalk:
resetIdleTime();
toggleWalking (); toggleWalking ();
break; break;
case A_ToggleWeapon: case A_ToggleWeapon:
resetIdleTime();
toggleWeapon (); toggleWeapon ();
break; break;
case A_ToggleSpell: case A_ToggleSpell:
resetIdleTime();
toggleSpell (); toggleSpell ();
break; break;
} }
@ -303,6 +298,8 @@ namespace MWInput
// Disable mouse look // Disable mouse look
mMouseLookEnabled = false; mMouseLookEnabled = false;
mWindows.showCrosshair (false);
// Enable GUI events // Enable GUI events
mGuiCursorEnabled = true; mGuiCursorEnabled = true;
} }
@ -311,6 +308,8 @@ namespace MWInput
// Enable mouse look // Enable mouse look
mMouseLookEnabled = true; mMouseLookEnabled = true;
mWindows.showCrosshair (false);
// Disable GUI events // Disable GUI events
mGuiCursorEnabled = false; mGuiCursorEnabled = false;
} }

View file

@ -116,6 +116,10 @@ namespace MWRender
void Player::update(float duration) void Player::update(float duration)
{ {
// only show the crosshair in game mode and in first person mode.
MWBase::Environment::get().getWindowManager ()->showCrosshair
(!MWBase::Environment::get().getWindowManager ()->isGuiMode () && (mFirstPersonView && !mVanity.enabled && !mPreviewMode));
if (mAnimation) { if (mAnimation) {
mAnimation->runAnimation(duration); mAnimation->runAnimation(duration);
} }