Fix menu/journal/book/scroll buttons when using localised MW-installations

This patch implements a custom widget that can switch its texture on-the-fly, making it obsolete having to use an atlas to get a hover animation. This also removes the predefined size restriction and should now work with all button texture sizes.
actorid
scrawl 12 years ago
parent ff74f687fb
commit 1718d735b5

@ -104,7 +104,6 @@ set(OENGINE_OGRE
${LIBDIR}/openengine/ogre/renderer.cpp ${LIBDIR}/openengine/ogre/renderer.cpp
${LIBDIR}/openengine/ogre/fader.cpp ${LIBDIR}/openengine/ogre/fader.cpp
${LIBDIR}/openengine/ogre/imagerotate.cpp ${LIBDIR}/openengine/ogre/imagerotate.cpp
${LIBDIR}/openengine/ogre/atlas.cpp
${LIBDIR}/openengine/ogre/selectionbuffer.cpp ${LIBDIR}/openengine/ogre/selectionbuffer.cpp
) )
set(OENGINE_GUI set(OENGINE_GUI

@ -30,7 +30,7 @@ add_openmw_dir (mwgui
formatting inventorywindow container hud countdialog tradewindow settingswindow formatting inventorywindow container hud countdialog tradewindow settingswindow
confirmationdialog alchemywindow referenceinterface spellwindow mainmenu quickkeysmenu confirmationdialog alchemywindow referenceinterface spellwindow mainmenu quickkeysmenu
itemselection spellbuyingwindow loadingscreen levelupdialog waitdialog spellcreationdialog itemselection spellbuyingwindow loadingscreen levelupdialog waitdialog spellcreationdialog
enchantingdialog trainingwindow travelwindow enchantingdialog trainingwindow travelwindow imagebutton
) )
add_openmw_dir (mwdialogue add_openmw_dir (mwdialogue

@ -88,7 +88,7 @@ void BookWindow::setTakeButtonShow(bool show)
mTakeButton->setVisible(show); mTakeButton->setVisible(show);
} }
void BookWindow::onCloseButtonClicked (MyGUI::Widget* _sender) void BookWindow::onCloseButtonClicked (MyGUI::Widget* sender)
{ {
// no 3d sounds because the object could be in a container. // no 3d sounds because the object could be in a container.
MWBase::Environment::get().getSoundManager()->playSound ("book close", 1.0, 1.0); MWBase::Environment::get().getSoundManager()->playSound ("book close", 1.0, 1.0);
@ -96,7 +96,7 @@ void BookWindow::onCloseButtonClicked (MyGUI::Widget* _sender)
mWindowManager.removeGuiMode(GM_Book); mWindowManager.removeGuiMode(GM_Book);
} }
void BookWindow::onTakeButtonClicked (MyGUI::Widget* _sender) void BookWindow::onTakeButtonClicked (MyGUI::Widget* sender)
{ {
MWBase::Environment::get().getSoundManager()->playSound ("Item Book Up", 1.0, 1.0, MWBase::SoundManager::Play_NoTrack); MWBase::Environment::get().getSoundManager()->playSound ("Item Book Up", 1.0, 1.0, MWBase::SoundManager::Play_NoTrack);
@ -106,7 +106,7 @@ void BookWindow::onTakeButtonClicked (MyGUI::Widget* _sender)
mWindowManager.removeGuiMode(GM_Book); mWindowManager.removeGuiMode(GM_Book);
} }
void BookWindow::onNextPageButtonClicked (MyGUI::Widget* _sender) void BookWindow::onNextPageButtonClicked (MyGUI::Widget* sender)
{ {
if ((mCurrentPage+1)*2 < mPages.size()) if ((mCurrentPage+1)*2 < mPages.size())
{ {
@ -118,7 +118,7 @@ void BookWindow::onNextPageButtonClicked (MyGUI::Widget* _sender)
} }
} }
void BookWindow::onPrevPageButtonClicked (MyGUI::Widget* _sender) void BookWindow::onPrevPageButtonClicked (MyGUI::Widget* sender)
{ {
if (mCurrentPage > 0) if (mCurrentPage > 0)
{ {

@ -5,6 +5,8 @@
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "imagebutton.hpp"
namespace MWGui namespace MWGui
{ {
class BookWindow : public WindowBase class BookWindow : public WindowBase
@ -16,19 +18,19 @@ namespace MWGui
void setTakeButtonShow(bool show); void setTakeButtonShow(bool show);
protected: protected:
void onNextPageButtonClicked (MyGUI::Widget* _sender); void onNextPageButtonClicked (MyGUI::Widget* sender);
void onPrevPageButtonClicked (MyGUI::Widget* _sender); void onPrevPageButtonClicked (MyGUI::Widget* sender);
void onCloseButtonClicked (MyGUI::Widget* _sender); void onCloseButtonClicked (MyGUI::Widget* sender);
void onTakeButtonClicked (MyGUI::Widget* _sender); void onTakeButtonClicked (MyGUI::Widget* sender);
void updatePages(); void updatePages();
void clearPages(); void clearPages();
private: private:
MyGUI::Button* mCloseButton; MWGui::ImageButton* mCloseButton;
MyGUI::Button* mTakeButton; MWGui::ImageButton* mTakeButton;
MyGUI::Button* mNextPageButton; MWGui::ImageButton* mNextPageButton;
MyGUI::Button* mPrevPageButton; MWGui::ImageButton* mPrevPageButton;
MyGUI::TextBox* mLeftPageNumber; MyGUI::TextBox* mLeftPageNumber;
MyGUI::TextBox* mRightPageNumber; MyGUI::TextBox* mRightPageNumber;
MyGUI::Widget* mLeftPage; MyGUI::Widget* mLeftPage;

@ -2,7 +2,6 @@
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include <openengine/ogre/imagerotate.hpp> #include <openengine/ogre/imagerotate.hpp>
#include <openengine/ogre/atlas.hpp>
#include <OgreResourceGroupManager.h> #include <OgreResourceGroupManager.h>
#include <OgreRoot.h> #include <OgreRoot.h>
@ -14,7 +13,4 @@ CursorReplace::CursorReplace()
OEngine::Render::ImageRotate::rotate("textures\\tx_cursormove.dds", "mwpointer_vresize.png", 90); OEngine::Render::ImageRotate::rotate("textures\\tx_cursormove.dds", "mwpointer_vresize.png", 90);
OEngine::Render::ImageRotate::rotate("textures\\tx_cursormove.dds", "mwpointer_dresize1.png", -45); OEngine::Render::ImageRotate::rotate("textures\\tx_cursormove.dds", "mwpointer_dresize1.png", -45);
OEngine::Render::ImageRotate::rotate("textures\\tx_cursormove.dds", "mwpointer_dresize2.png", 45); OEngine::Render::ImageRotate::rotate("textures\\tx_cursormove.dds", "mwpointer_dresize2.png", 45);
OEngine::Render::Atlas::createFromFile("atlas1.cfg", "mwgui1", "textures\\");
OEngine::Render::Atlas::createFromFile("mainmenu.cfg", "mwgui2", "textures\\");
} }

@ -0,0 +1,63 @@
#include "imagebutton.hpp"
#include <OgreTextureManager.h>
namespace MWGui
{
void ImageButton::setPropertyOverride(const std::string &_key, const std::string &_value)
{
if (_key == "ImageHighlighted")
mImageHighlighted = _value;
else if (_key == "ImagePushed")
mImagePushed = _value;
else if (_key == "ImageNormal")
{
if (mImageNormal == "")
{
setImageTexture(_value);
}
mImageNormal = _value;
}
else
ImageBox::setPropertyOverride(_key, _value);
}
void ImageButton::onMouseSetFocus(Widget* _old)
{
setImageTexture(mImageHighlighted);
ImageBox::onMouseSetFocus(_old);
}
void ImageButton::onMouseLostFocus(Widget* _new)
{
setImageTexture(mImageNormal);
ImageBox::onMouseLostFocus(_new);
}
void ImageButton::onMouseButtonPressed(int _left, int _top, MyGUI::MouseButton _id)
{
if (_id == MyGUI::MouseButton::Left)
setImageTexture(mImagePushed);
ImageBox::onMouseButtonPressed(_left, _top, _id);
}
MyGUI::IntSize ImageButton::getRequestedSize()
{
Ogre::TexturePtr texture = Ogre::TextureManager::getSingleton().getByName(mImageNormal);
if (texture.isNull())
{
std::cerr << "ImageButton: can't find " << mImageNormal << std::endl;
return MyGUI::IntSize(0,0);
}
return MyGUI::IntSize (texture->getWidth(), texture->getHeight());
}
void ImageButton::onMouseButtonReleased(int _left, int _top, MyGUI::MouseButton _id)
{
if (_id == MyGUI::MouseButton::Left)
setImageTexture(mImageHighlighted);
ImageBox::onMouseButtonReleased(_left, _top, _id);
}
}

@ -0,0 +1,33 @@
#ifndef MWGUI_IMAGEBUTTON_H
#define MWGUI_IMAGEBUTTON_H
#include "MyGUI_ImageBox.h"
namespace MWGui
{
/**
* @brief allows using different image textures depending on the button state
*/
class ImageButton : public MyGUI::ImageBox
{
MYGUI_RTTI_DERIVED(ImageButton)
public:
MyGUI::IntSize getRequestedSize();
protected:
virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
virtual void onMouseLostFocus(MyGUI::Widget* _new);
virtual void onMouseSetFocus(MyGUI::Widget* _old);
virtual void onMouseButtonPressed(int _left, int _top, MyGUI::MouseButton _id);
virtual void onMouseButtonReleased(int _left, int _top, MyGUI::MouseButton _id);
std::string mImageHighlighted;
std::string mImageNormal;
std::string mImagePushed;
};
}
#endif

@ -83,7 +83,6 @@ book formatText(std::string text,book mBook,int maxLine, int lineSize)
MWGui::JournalWindow::JournalWindow (MWBase::WindowManager& parWindowManager) MWGui::JournalWindow::JournalWindow (MWBase::WindowManager& parWindowManager)
: WindowBase("openmw_journal.layout", parWindowManager) : WindowBase("openmw_journal.layout", parWindowManager)
, mLastPos(0)
, mPageNumber(0) , mPageNumber(0)
{ {
mMainWidget->setVisible(false); mMainWidget->setVisible(false);
@ -177,7 +176,7 @@ void MWGui::JournalWindow::displayRightText(std::string text)
} }
void MWGui::JournalWindow::notifyNextPage(MyGUI::WidgetPtr _sender) void MWGui::JournalWindow::notifyNextPage(MyGUI::Widget* _sender)
{ {
if(mPageNumber < int(mLeftPages.size())-1) if(mPageNumber < int(mLeftPages.size())-1)
{ {
@ -189,7 +188,7 @@ void MWGui::JournalWindow::notifyNextPage(MyGUI::WidgetPtr _sender)
} }
} }
void MWGui::JournalWindow::notifyPrevPage(MyGUI::WidgetPtr _sender) void MWGui::JournalWindow::notifyPrevPage(MyGUI::Widget* _sender)
{ {
if(mPageNumber > 0) if(mPageNumber > 0)
{ {

@ -7,6 +7,7 @@
#include <utility> #include <utility>
#include "window_base.hpp" #include "window_base.hpp"
#include "imagebutton.hpp"
namespace MWGui namespace MWGui
{ {
@ -25,18 +26,13 @@ namespace MWGui
/** /**
*Called when next/prev button is used. *Called when next/prev button is used.
*/ */
void notifyNextPage(MyGUI::WidgetPtr _sender); void notifyNextPage(MyGUI::Widget* _sender);
void notifyPrevPage(MyGUI::WidgetPtr _sender); void notifyPrevPage(MyGUI::Widget* _sender);
static const int sLineHeight;
MyGUI::WidgetPtr mSkillAreaWidget, mSkillClientWidget;
MyGUI::ScrollBar* mSkillScrollerWidget;
int mLastPos, mClientHeight;
MyGUI::EditPtr mLeftTextWidget; MyGUI::EditPtr mLeftTextWidget;
MyGUI::EditPtr mRightTextWidget; MyGUI::EditPtr mRightTextWidget;
MyGUI::ButtonPtr mPrevBtn; MWGui::ImageButton* mPrevBtn;
MyGUI::ButtonPtr mNextBtn; MWGui::ImageButton* mNextBtn;
std::vector<std::string> mLeftPages; std::vector<std::string> mLeftPages;
std::vector<std::string> mRightPages; std::vector<std::string> mRightPages;
int mPageNumber; //store the number of the current left page int mPageNumber; //store the number of the current left page

@ -20,65 +20,57 @@ namespace MWGui
{ {
setCoord(0,0,w,h); setCoord(0,0,w,h);
int height = 64 * 3;
if (mButtonBox) if (mButtonBox)
MyGUI::Gui::getInstance ().destroyWidget(mButtonBox); MyGUI::Gui::getInstance ().destroyWidget(mButtonBox);
mButtonBox = mMainWidget->createWidget<MyGUI::Widget>("", MyGUI::IntCoord(w/2 - 64, h/2 - height/2, 128, height), MyGUI::Align::Default); mButtonBox = mMainWidget->createWidget<MyGUI::Widget>("", MyGUI::IntCoord(0, 0, 0, 0), MyGUI::Align::Default);
int curH = 0; int curH = 0;
mReturn = mButtonBox->createWidget<MyGUI::Button> ("ButtonImage", MyGUI::IntCoord(0, curH, 128, 64), MyGUI::Align::Default); std::vector<std::string> buttons;
mReturn->setImageResource ("Menu_Return"); buttons.push_back("return");
mReturn->eventMouseButtonClick += MyGUI::newDelegate(this, &MainMenu::returnToGame); //buttons.push_back("newgame");
curH += 64; //buttons.push_back("loadgame");
//buttons.push_back("savegame");
buttons.push_back("options");
/* //buttons.push_back("credits");
mNewGame = mButtonBox->createWidget<MyGUI::Button> ("ButtonImage", MyGUI::IntCoord(0, curH, 128, 64), MyGUI::Align::Default); buttons.push_back("exitgame");
mNewGame->setImageResource ("Menu_NewGame");
curH += 64; int maxwidth = 0;
mLoadGame = mButtonBox->createWidget<MyGUI::Button> ("ButtonImage", MyGUI::IntCoord(0, curH, 128, 64), MyGUI::Align::Default); mButtons.clear();
mLoadGame->setImageResource ("Menu_LoadGame"); for (std::vector<std::string>::iterator it = buttons.begin(); it != buttons.end(); ++it)
curH += 64; {
MWGui::ImageButton* button = mButtonBox->createWidget<MWGui::ImageButton>
("ImageBox", MyGUI::IntCoord(0, curH, 0, 0), MyGUI::Align::Default);
mSaveGame = mButtonBox->createWidget<MyGUI::Button> ("ButtonImage", MyGUI::IntCoord(0, curH, 128, 64), MyGUI::Align::Default); button->setProperty("ImageHighlighted", "textures\\menu_" + *it + "_over.dds");
mSaveGame->setImageResource ("Menu_SaveGame"); button->setProperty("ImageNormal", "textures\\menu_" + *it + ".dds");
curH += 64; button->setProperty("ImagePushed", "textures\\menu_" + *it + "_pressed.dds");
*/ MyGUI::IntSize requested = button->getRequestedSize();
button->eventMouseButtonClick += MyGUI::newDelegate(this, &MainMenu::onButtonClicked);
mOptions = mButtonBox->createWidget<MyGUI::Button> ("ButtonImage", MyGUI::IntCoord(0, curH, 128, 64), MyGUI::Align::Default); mButtons[*it] = button;
mOptions->setImageResource ("Menu_Options"); curH += requested.height;
mOptions->eventMouseButtonClick += MyGUI::newDelegate(this, &MainMenu::showOptions);
curH += 64; if (requested.width > maxwidth)
maxwidth = requested.width;
/* }
mCredits = mButtonBox->createWidget<MyGUI::Button> ("ButtonImage", MyGUI::IntCoord(0, curH, 128, 64), MyGUI::Align::Default); for (std::map<std::string, MWGui::ImageButton*>::iterator it = mButtons.begin(); it != mButtons.end(); ++it)
mCredits->setImageResource ("Menu_Credits"); {
curH += 64; MyGUI::IntSize requested = it->second->getRequestedSize();
*/ it->second->setCoord((maxwidth-requested.width) / 2, it->second->getTop(), requested.width, requested.height);
}
mExitGame = mButtonBox->createWidget<MyGUI::Button> ("ButtonImage", MyGUI::IntCoord(0, curH, 128, 64), MyGUI::Align::Default);
mExitGame->setImageResource ("Menu_ExitGame"); mButtonBox->setCoord (w/2 - maxwidth/2, h/2 - curH/2, maxwidth, curH);
mExitGame->eventMouseButtonClick += MyGUI::newDelegate(this, &MainMenu::exitGame);
curH += 64;
}
void MainMenu::returnToGame(MyGUI::Widget* sender)
{
MWBase::Environment::get().getWindowManager ()->removeGuiMode (GM_MainMenu);
}
void MainMenu::showOptions(MyGUI::Widget* sender)
{
MWBase::Environment::get().getWindowManager ()->pushGuiMode (GM_Settings);
} }
void MainMenu::exitGame(MyGUI::Widget* sender) void MainMenu::onButtonClicked(MyGUI::Widget *sender)
{ {
Ogre::Root::getSingleton ().queueEndRendering (); if (sender == mButtons["return"])
MWBase::Environment::get().getWindowManager ()->removeGuiMode (GM_MainMenu);
else if (sender == mButtons["options"])
MWBase::Environment::get().getWindowManager ()->pushGuiMode (GM_Settings);
else if (sender == mButtons["exitgame"])
Ogre::Root::getSingleton ().queueEndRendering ();
} }
} }

@ -1,5 +1,7 @@
#include <openengine/gui/layout.hpp> #include <openengine/gui/layout.hpp>
#include "imagebutton.hpp"
namespace MWGui namespace MWGui
{ {
@ -11,19 +13,11 @@ namespace MWGui
void onResChange(int w, int h); void onResChange(int w, int h);
private: private:
MyGUI::Button* mReturn;
MyGUI::Button* mNewGame;
MyGUI::Button* mLoadGame;
MyGUI::Button* mSaveGame;
MyGUI::Button* mOptions;
MyGUI::Button* mCredits;
MyGUI::Button* mExitGame;
MyGUI::Widget* mButtonBox; MyGUI::Widget* mButtonBox;
void returnToGame(MyGUI::Widget* sender); std::map<std::string, MWGui::ImageButton*> mButtons;
void showOptions(MyGUI::Widget* sender);
void exitGame(MyGUI::Widget* sender); void onButtonClicked (MyGUI::Widget* sender);
}; };
} }

@ -2,6 +2,7 @@
#define MWGUI_SCROLLWINDOW_H #define MWGUI_SCROLLWINDOW_H
#include "window_base.hpp" #include "window_base.hpp"
#include "imagebutton.hpp"
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
@ -20,8 +21,8 @@ namespace MWGui
void onTakeButtonClicked (MyGUI::Widget* _sender); void onTakeButtonClicked (MyGUI::Widget* _sender);
private: private:
MyGUI::Button* mCloseButton; MWGui::ImageButton* mCloseButton;
MyGUI::Button* mTakeButton; MWGui::ImageButton* mTakeButton;
MyGUI::ScrollView* mTextView; MyGUI::ScrollView* mTextView;
MWWorld::Ptr mScroll; MWWorld::Ptr mScroll;

@ -51,6 +51,7 @@
#include "spellcreationdialog.hpp" #include "spellcreationdialog.hpp"
#include "enchantingdialog.hpp" #include "enchantingdialog.hpp"
#include "trainingwindow.hpp" #include "trainingwindow.hpp"
#include "imagebutton.hpp"
using namespace MWGui; using namespace MWGui;
@ -126,6 +127,7 @@ WindowManager::WindowManager(
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::VBox>("Widget"); MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::VBox>("Widget");
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::AutoSizedTextBox>("Widget"); MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::AutoSizedTextBox>("Widget");
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::AutoSizedButton>("Widget"); MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::AutoSizedButton>("Widget");
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::ImageButton>("Widget");
MyGUI::LanguageManager::getInstance().eventRequestTag = MyGUI::newDelegate(this, &WindowManager::onRetrieveTag); MyGUI::LanguageManager::getInstance().eventRequestTag = MyGUI::newDelegate(this, &WindowManager::onRetrieveTag);

@ -4,8 +4,6 @@ set(SDIR ${CMAKE_CURRENT_SOURCE_DIR})
set(DDIR ${OpenMW_BINARY_DIR}/resources/mygui) set(DDIR ${OpenMW_BINARY_DIR}/resources/mygui)
set(MYGUI_FILES set(MYGUI_FILES
atlas1.cfg
mainmenu.cfg
bigbars.png bigbars.png
black.png black.png
core.skin core.skin

@ -1,51 +0,0 @@
[settings]
size_x = 512
size_y = 512
[tx_menubook_close_idle.dds]
x = 0
y = 0
[tx_menubook_close_over.dds]
x = 128
y = 0
[tx_menubook_close_pressed.dds]
x = 256
y = 0
[tx_menubook_take_idle.dds]
x = 384
y = 0
[tx_menubook_take_over.dds]
x = 0
y = 32
[tx_menubook_take_pressed.dds]
x = 128
y = 32
[tx_menubook_next_idle.dds]
x = 256
y = 32
[tx_menubook_next_over.dds]
x = 384
y = 32
[tx_menubook_next_pressed.dds]
x = 0
y = 64
[tx_menubook_prev_idle.dds]
x = 128
y = 64
[tx_menubook_prev_over.dds]
x = 256
y = 64
[tx_menubook_prev_pressed.dds]
x = 384
y = 64

@ -1,95 +0,0 @@
[settings]
size_x = 512
size_y = 512
[menu_newgame.dds]
x = 0
y = 0
[menu_newgame_pressed.dds]
x = 128
y = 0
[menu_newgame_over.dds]
x = 256
y = 0
[menu_loadgame.dds]
x = 384
y = 0
[menu_loadgame_pressed.dds]
x = 0
y = 64
[menu_loadgame_over.dds]
x = 128
y = 64
[menu_options.dds]
x = 256
y = 64
[menu_options_pressed.dds]
x = 384
y = 64
[menu_options_over.dds]
x = 0
y = 128
[menu_credits.dds]
x = 128
y = 128
[menu_credits_pressed.dds]
x = 256
y = 128
[menu_credits_over.dds]
x = 384
y = 128
[menu_exitgame.dds]
x = 0
y = 192
[menu_exitgame_pressed.dds]
x = 128
y = 192
[menu_exitgame_over.dds]
x = 256
y = 192
[menu_savegame.dds]
x = 384
y = 192
[menu_savegame_pressed.dds]
x = 0
y = 256
[menu_savegame_over.dds]
x = 128
y = 256
[menu_return.dds]
x = 256
y = 256
[menu_return_pressed.dds]
x = 384
y = 256
[menu_return_over.dds]
x = 0
y = 320

@ -7,17 +7,25 @@
<Widget type="ImageBox" skin="ImageBox" position_real="0 0 1 1" align="Top|Right" name="BookImage"> <Widget type="ImageBox" skin="ImageBox" position_real="0 0 1 1" align="Top|Right" name="BookImage">
<Property key="ImageTexture" value="textures\tx_menubook.dds"/> <Property key="ImageTexture" value="textures\tx_menubook.dds"/>
<Widget type="Button" skin="ButtonImage" position="251 220 57 24" name="NextPageBTN"> <Widget type="ImageButton" skin="ImageBox" position="251 220 128 32" name="NextPageBTN">
<Property key="ImageResource" value="MenuBook_Next"/> <Property key="ImageHighlighted" value="textures\tx_menubook_next_over.dds"/>
<Property key="ImageNormal" value="textures\tx_menubook_next_idle.dds"/>
<Property key="ImagePushed" value="textures\tx_menubook_next_pressed.dds"/>
</Widget> </Widget>
<Widget type="Button" skin="ButtonImage" position="165 220 96 24" name="PrevPageBTN"> <Widget type="ImageButton" skin="ImageBox" position="165 220 128 32" name="PrevPageBTN">
<Property key="ImageResource" value="MenuBook_Prev"/> <Property key="ImageHighlighted" value="textures\tx_menubook_prev_over.dds"/>
<Property key="ImageNormal" value="textures\tx_menubook_prev_idle.dds"/>
<Property key="ImagePushed" value="textures\tx_menubook_prev_pressed.dds"/>
</Widget> </Widget>
<Widget type="Button" skin="ButtonImage" position="75 220 96 24" name="TakeButton"> <Widget type="ImageButton" skin="ImageBox" position="75 220 128 32" name="TakeButton">
<Property key="ImageResource" value="MenuBook_Take"/> <Property key="ImageHighlighted" value="textures\tx_menubook_take_over.dds"/>
<Property key="ImageNormal" value="textures\tx_menubook_take_idle.dds"/>
<Property key="ImagePushed" value="textures\tx_menubook_take_pressed.dds"/>
</Widget> </Widget>
<Widget type="Button" skin="ButtonImage" position="360 220 96 24" name="CloseButton"> <Widget type="ImageButton" skin="ImageBox" position="360 220 128 32" name="CloseButton">
<Property key="ImageResource" value="MenuBook_Close"/> <Property key="ImageHighlighted" value="textures\tx_menubook_close_over.dds"/>
<Property key="ImageNormal" value="textures\tx_menubook_close_idle.dds"/>
<Property key="ImagePushed" value="textures\tx_menubook_close_pressed.dds"/>
</Widget> </Widget>
<Widget type="TextBox" skin="NormalText" position="155 215 24 24" name="LeftPageNumber"> <Widget type="TextBox" skin="NormalText" position="155 215 24 24" name="LeftPageNumber">

@ -7,11 +7,15 @@
<Widget type="ImageBox" skin="ImageBox" position_real="0 0 1 1" align="Top|Right" name="JImage"> <Widget type="ImageBox" skin="ImageBox" position_real="0 0 1 1" align="Top|Right" name="JImage">
<Property key="ImageTexture" value="textures\tx_menubook.dds"/> <Property key="ImageTexture" value="textures\tx_menubook.dds"/>
<Widget type="Button" skin="ButtonImage" position="370 220 57 24" name="NextPageBTN"> <Widget type="ImageButton" skin="ImageBox" position="370 220 128 32" name="NextPageBTN">
<Property key="ImageResource" value="MenuBook_Next"/> <Property key="ImageHighlighted" value="textures\tx_menubook_next_over.dds"/>
<Property key="ImageNormal" value="textures\tx_menubook_next_idle.dds"/>
<Property key="ImagePushed" value="textures\tx_menubook_next_pressed.dds"/>
</Widget> </Widget>
<Widget type="Button" skin="ButtonImage" position="80 220 96 24" name="PrevPageBTN"> <Widget type="ImageButton" skin="ImageBox" position="80 220 128 32" name="PrevPageBTN">
<Property key="ImageResource" value="MenuBook_Prev"/> <Property key="ImageHighlighted" value="textures\tx_menubook_prev_over.dds"/>
<Property key="ImageNormal" value="textures\tx_menubook_prev_idle.dds"/>
<Property key="ImagePushed" value="textures\tx_menubook_prev_pressed.dds"/>
</Widget> </Widget>
<Widget type="EditBox" skin="MW_BookPage" position_real="0.15 0.1 0.3 0.75" name = "LeftText"/> <Widget type="EditBox" skin="MW_BookPage" position_real="0.15 0.1 0.3 0.75" name = "LeftText"/>
<Widget type="EditBox" skin="MW_BookPage" position_real="0.55 0.1 0.3 0.75" name = "RightText"/> <Widget type="EditBox" skin="MW_BookPage" position_real="0.55 0.1 0.3 0.75" name = "RightText"/>

@ -1,34 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Skin"> <MyGUI type="Skin">
<Skin name="ReturnButton" size="128 64" texture="textures\menu_return.dds">
<BasisSkin type="MainSkin" offset = "0 0 128 64">
<State name="normal" offset = "0 0 128 64"/>
</BasisSkin>
</Skin>
<Skin name="NewButton" size="128 64" texture="textures\menu_newgame.dds">
<BasisSkin type="MainSkin" offset = "0 0 128 64">
<State name="normal" offset = "0 0 128 64"/>
</BasisSkin>
</Skin>
<Skin name="SaveButton" size="128 64" texture="textures\menu_savegame.dds">
<BasisSkin type="MainSkin" offset = "0 0 128 64">
<State name="normal" offset = "0 0 128 64"/>
</BasisSkin>
</Skin>
<Skin name="LoadButton" size="128 64" texture="textures\menu_loadgame.dds">
<BasisSkin type="MainSkin" offset = "0 0 128 64">
<State name="normal" offset = "0 0 128 64"/>
</BasisSkin>
</Skin>
<Skin name="OptionsButton" size="128 64" texture="textures\menu_options.dds">
<BasisSkin type="MainSkin" offset = "0 0 128 64">
<State name="normal" offset = "0 0 128 64"/>
</BasisSkin>
</Skin>
<Skin name="ExitButton" size="128 64" texture="textures\menu_exitgame.dds">
<BasisSkin type="MainSkin" offset = "0 0 128 64">
<State name="normal" offset = "0 0 128 64"/>
</BasisSkin>
</Skin>
</MyGUI> </MyGUI>

@ -7,12 +7,16 @@
<Widget type="ImageBox" skin="ImageBox" position_real="0 0 1 1" name="ScrollImage"> <Widget type="ImageBox" skin="ImageBox" position_real="0 0 1 1" name="ScrollImage">
<Property key="ImageTexture" value="textures\scroll.dds"/> <Property key="ImageTexture" value="textures\scroll.dds"/>
<Widget type="Button" skin="ButtonImage" position="12 18 96 24" name="TakeButton"> <Widget type="ImageButton" skin="ImageBox" position="12 18 128 32" name="TakeButton">
<Property key="ImageResource" value="MenuBook_Take"/> <Property key="ImageHighlighted" value="textures\tx_menubook_take_over.dds"/>
<Property key="ImageNormal" value="textures\tx_menubook_take_idle.dds"/>
<Property key="ImagePushed" value="textures\tx_menubook_take_pressed.dds"/>
</Widget> </Widget>
<Widget type="Button" skin="ButtonImage" position="418 24 96 24" name="CloseButton"> <Widget type="ImageButton" skin="ImageBox" position="418 24 128 32" name="CloseButton">
<Property key="ImageResource" value="MenuBook_Close"/> <Property key="ImageHighlighted" value="textures\tx_menubook_close_over.dds"/>
<Property key="ImageNormal" value="textures\tx_menubook_close_idle.dds"/>
<Property key="ImagePushed" value="textures\tx_menubook_close_pressed.dds"/>
</Widget> </Widget>
<Widget type="ScrollView" skin="MW_ScrollView" position="60 130 410 300" name="TextView"> <Widget type="ScrollView" skin="MW_ScrollView" position="60 130 410 300" name="TextView">

@ -1,113 +0,0 @@
#include "atlas.hpp"
#include <OgreRoot.h>
#include <OgreSceneManager.h>
#include <OgreImage.h>
#include <OgreTexture.h>
#include <OgreRenderTarget.h>
#include <OgreCamera.h>
#include <OgreTextureUnitState.h>
#include <OgreHardwarePixelBuffer.h>
#include <OgreConfigFile.h>
#include <OgreStringConverter.h>
using namespace Ogre;
using namespace OEngine::Render;
void Atlas::createFromFile (const std::string& filename, const std::string& textureName, const std::string& texturePrefix)
{
ConfigFile file;
file.load(filename, ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME, "\t:=", true);
Root* root = Ogre::Root::getSingletonPtr();
SceneManager* sceneMgr = root->createSceneManager(ST_GENERIC);
Camera* camera = sceneMgr->createCamera("AtlasCamera");
int width = StringConverter::parseInt(file.getSetting("size_x", "settings"));
int height = StringConverter::parseInt(file.getSetting("size_y", "settings"));
std::vector<Rectangle2D*> rectangles;
int i = 0;
ConfigFile::SectionIterator seci = file.getSectionIterator();
while (seci.hasMoreElements())
{
Ogre::String sectionName = seci.peekNextKey();
seci.getNext();
if (sectionName == "settings" || sectionName == "")
continue;
MaterialPtr material = MaterialManager::getSingleton().create("AtlasMaterial" + StringConverter::toString(i), ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
material->getTechnique(0)->getPass(0)->setLightingEnabled(false);
material->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false);
TextureUnitState* tus = material->getTechnique(0)->getPass(0)->createTextureUnitState(texturePrefix + sectionName);
tus->setTextureBorderColour(ColourValue(0, 0, 0, 0));
Rectangle2D* rect = new Rectangle2D(true);
rect->setMaterial("AtlasMaterial" + StringConverter::toString(i));
rect->setRenderQueueGroup(RENDER_QUEUE_BACKGROUND);
int x = StringConverter::parseInt(file.getSetting("x", sectionName));
int y = StringConverter::parseInt(file.getSetting("y", sectionName));
TexturePtr texture = TextureManager::getSingleton().getByName(texturePrefix + sectionName);
if (texture.isNull())
{
std::cerr << "OEngine::Render::Atlas: Can't find texture " << texturePrefix + sectionName << ", skipping..." << std::endl;
continue;
}
int textureWidth = texture->getWidth();
int textureHeight = texture->getHeight();
float left = x/float(width) * 2 - 1;
float top = (1-(y/float(height))) * 2 - 1;
float right = ((x+textureWidth))/float(width) * 2 - 1;
float bottom = (1-((y+textureHeight)/float(height))) * 2 - 1;
rect->setCorners(left, top, right, bottom);
// Use infinite AAB to always stay visible
AxisAlignedBox aabInf;
aabInf.setInfinite();
rect->setBoundingBox(aabInf);
// Attach background to the scene
SceneNode* node = sceneMgr->getRootSceneNode()->createChildSceneNode();
node->attachObject(rect);
rectangles.push_back(rect);
++i;
}
TexturePtr destTexture = TextureManager::getSingleton().createManual(
textureName,
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
TEX_TYPE_2D,
width, height,
0,
PF_FLOAT16_RGBA,
TU_RENDERTARGET);
RenderTarget* rtt = destTexture->getBuffer()->getRenderTarget();
rtt->setAutoUpdated(false);
Viewport* vp = rtt->addViewport(camera);
vp->setOverlaysEnabled(false);
vp->setShadowsEnabled(false);
vp->setBackgroundColour(ColourValue(0,0,0,0));
rtt->update();
// remove all the junk we've created
for (std::vector<Rectangle2D*>::iterator it=rectangles.begin();
it!=rectangles.end(); ++it)
{
delete (*it);
}
while (i > 0)
{
MaterialManager::getSingleton().remove("AtlasMaterial" + StringConverter::toString(i-1));
--i;
}
root->destroySceneManager(sceneMgr);
}

@ -1,27 +0,0 @@
#ifndef OENGINE_OGRE_ATLAS_HPP
#define OENGINE_OGRE_ATLAS_HPP
#include <string>
namespace OEngine
{
namespace Render
{
/// \brief Creates a texture atlas at runtime
class Atlas
{
public:
/**
* @param absolute path to file that specifies layout of the texture (positions of the textures it contains)
* @param name of the destination texture to save to (in memory)
* @param texture directory prefix
*/
static void createFromFile (const std::string& filename, const std::string& textureName, const std::string& texturePrefix="textures\\");
};
}
}
#endif
Loading…
Cancel
Save