mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-30 01:45:33 +00:00
Got rid of the texture rotation hack by rendering the cursor manually.
This commit is contained in:
parent
6238c8d758
commit
d8f2d0195a
11 changed files with 219 additions and 68 deletions
|
@ -26,11 +26,11 @@ add_openmw_dir (mwinput
|
|||
add_openmw_dir (mwgui
|
||||
text_input widgets race class birth review windowmanagerimp console dialogue
|
||||
dialogue_history window_base stats_window messagebox journalwindow charactercreation
|
||||
map_window window_pinnable_base cursorreplace tooltips scrollwindow bookwindow list
|
||||
map_window window_pinnable_base tooltips scrollwindow bookwindow list
|
||||
formatting inventorywindow container hud countdialog tradewindow settingswindow
|
||||
confirmationdialog alchemywindow referenceinterface spellwindow mainmenu quickkeysmenu
|
||||
itemselection spellbuyingwindow loadingscreen levelupdialog waitdialog spellcreationdialog
|
||||
enchantingdialog trainingwindow travelwindow imagebutton exposedwindow
|
||||
enchantingdialog trainingwindow travelwindow imagebutton exposedwindow cursor
|
||||
)
|
||||
|
||||
add_openmw_dir (mwdialogue
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
#include "mwinput/inputmanagerimp.hpp"
|
||||
|
||||
#include "mwgui/windowmanagerimp.hpp"
|
||||
#include "mwgui/cursorreplace.hpp"
|
||||
|
||||
#include "mwscript/scriptmanagerimp.hpp"
|
||||
#include "mwscript/extensions.hpp"
|
||||
|
@ -333,9 +332,6 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
|
|||
|
||||
loadBSA();
|
||||
|
||||
// cursor replacer (converts the cursor from the bsa so they can be used by mygui)
|
||||
MWGui::CursorReplace replacer;
|
||||
|
||||
// Create the world
|
||||
mEnvironment.setWorld( new MWWorld::World (*mOgre, mFileCollections, mMaster, mPlugins,
|
||||
mResDir, mCfgMgr.getCachePath(), mNewGame, mEncoder, mFallbackMap,
|
||||
|
|
130
apps/openmw/mwgui/cursor.cpp
Normal file
130
apps/openmw/mwgui/cursor.cpp
Normal file
|
@ -0,0 +1,130 @@
|
|||
#include "cursor.hpp"
|
||||
|
||||
#include <MyGUI_PointerManager.h>
|
||||
#include <MyGUI_InputManager.h>
|
||||
#include <MyGUI_RenderManager.h>
|
||||
#include <MyGUI_RotatingSkin.h>
|
||||
#include <MyGUI_Gui.h>
|
||||
|
||||
#include <OgreMath.h>
|
||||
|
||||
|
||||
namespace MWGui
|
||||
{
|
||||
|
||||
|
||||
ResourceImageSetPointerFix::ResourceImageSetPointerFix() :
|
||||
mImageSet(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
ResourceImageSetPointerFix::~ResourceImageSetPointerFix()
|
||||
{
|
||||
}
|
||||
|
||||
void ResourceImageSetPointerFix::deserialization(MyGUI::xml::ElementPtr _node, MyGUI::Version _version)
|
||||
{
|
||||
Base::deserialization(_node, _version);
|
||||
|
||||
MyGUI::xml::ElementEnumerator info = _node->getElementEnumerator();
|
||||
while (info.next("Property"))
|
||||
{
|
||||
const std::string& key = info->findAttribute("key");
|
||||
const std::string& value = info->findAttribute("value");
|
||||
|
||||
if (key == "Point")
|
||||
mPoint = MyGUI::IntPoint::parse(value);
|
||||
else if (key == "Size")
|
||||
mSize = MyGUI::IntSize::parse(value);
|
||||
else if (key == "Rotation")
|
||||
mRotation = MyGUI::utility::parseInt(value);
|
||||
else if (key == "Resource")
|
||||
mImageSet = MyGUI::ResourceManager::getInstance().getByName(value)->castType<MyGUI::ResourceImageSet>();
|
||||
}
|
||||
}
|
||||
|
||||
int ResourceImageSetPointerFix::getRotation()
|
||||
{
|
||||
return mRotation;
|
||||
}
|
||||
|
||||
void ResourceImageSetPointerFix::setImage(MyGUI::ImageBox* _image)
|
||||
{
|
||||
if (mImageSet != nullptr)
|
||||
_image->setItemResourceInfo(mImageSet->getIndexInfo(0, 0));
|
||||
}
|
||||
|
||||
void ResourceImageSetPointerFix::setPosition(MyGUI::ImageBox* _image, const MyGUI::IntPoint& _point)
|
||||
{
|
||||
_image->setCoord(_point.left - mPoint.left, _point.top - mPoint.top, mSize.width, mSize.height);
|
||||
}
|
||||
|
||||
MyGUI::ResourceImageSetPtr ResourceImageSetPointerFix:: getImageSet()
|
||||
{
|
||||
return mImageSet;
|
||||
}
|
||||
|
||||
MyGUI::IntPoint ResourceImageSetPointerFix::getHotSpot()
|
||||
{
|
||||
return mPoint;
|
||||
}
|
||||
|
||||
MyGUI::IntSize ResourceImageSetPointerFix::getSize()
|
||||
{
|
||||
return mSize;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
Cursor::Cursor()
|
||||
{
|
||||
// hide mygui's pointer since we're rendering it ourselves (because mygui's pointer doesn't support rotation)
|
||||
MyGUI::PointerManager::getInstance().setVisible(false);
|
||||
|
||||
MyGUI::PointerManager::getInstance().eventChangeMousePointer += MyGUI::newDelegate(this, &Cursor::onCursorChange);
|
||||
|
||||
mWidget = MyGUI::Gui::getInstance().createWidget<MyGUI::ImageBox>("RotatingSkin",0,0,0,0,MyGUI::Align::Default,"Pointer","");
|
||||
|
||||
onCursorChange(MyGUI::PointerManager::getInstance().getDefaultPointer());
|
||||
}
|
||||
|
||||
Cursor::~Cursor()
|
||||
{
|
||||
}
|
||||
|
||||
void Cursor::onCursorChange(const std::string &name)
|
||||
{
|
||||
ResourceImageSetPointerFix* imgSetPtr = dynamic_cast<ResourceImageSetPointerFix*>(
|
||||
MyGUI::PointerManager::getInstance().getByName(name));
|
||||
assert(imgSetPtr != NULL);
|
||||
|
||||
MyGUI::ResourceImageSet* imgSet = imgSetPtr->getImageSet();
|
||||
|
||||
std::string texture = imgSet->getIndexInfo(0,0).texture;
|
||||
|
||||
mSize = imgSetPtr->getSize();
|
||||
mHotSpot = imgSetPtr->getHotSpot();
|
||||
|
||||
int rotation = imgSetPtr->getRotation();
|
||||
|
||||
mWidget->setImageTexture(texture);
|
||||
MyGUI::ISubWidget* main = mWidget->getSubWidgetMain();
|
||||
MyGUI::RotatingSkin* rotatingSubskin = main->castType<MyGUI::RotatingSkin>();
|
||||
rotatingSubskin->setCenter(MyGUI::IntPoint(16,16));
|
||||
rotatingSubskin->setAngle(Ogre::Degree(rotation).valueRadians());
|
||||
}
|
||||
|
||||
void Cursor::update()
|
||||
{
|
||||
MyGUI::IntPoint position = MyGUI::InputManager::getInstance().getMousePosition();
|
||||
|
||||
mWidget->setPosition(position - mHotSpot);
|
||||
mWidget->setSize(mSize);
|
||||
}
|
||||
|
||||
void Cursor::setVisible(bool visible)
|
||||
{
|
||||
mWidget->setVisible(visible);
|
||||
}
|
||||
|
||||
}
|
62
apps/openmw/mwgui/cursor.hpp
Normal file
62
apps/openmw/mwgui/cursor.hpp
Normal file
|
@ -0,0 +1,62 @@
|
|||
#ifndef MWGUI_CURSOR_H
|
||||
#define MWGUI_CURSOR_H
|
||||
|
||||
#include <MyGUI_IPointer.h>
|
||||
#include <MyGUI_ResourceImageSet.h>
|
||||
#include <MyGUI_RTTI.h>
|
||||
|
||||
namespace MWGui
|
||||
{
|
||||
|
||||
/// \brief Allows us to get the members of
|
||||
/// ResourceImageSetPointer that we need.
|
||||
/// \example MyGUI::FactoryManager::getInstance().registerFactory<ResourceImageSetPointerFix>("Resource", "ResourceImageSetPointer");
|
||||
/// MyGUI::ResourceManager::getInstance().load("core.xml");
|
||||
class ResourceImageSetPointerFix :
|
||||
public MyGUI::IPointer
|
||||
{
|
||||
MYGUI_RTTI_DERIVED( ResourceImageSetPointerFix )
|
||||
|
||||
public:
|
||||
ResourceImageSetPointerFix();
|
||||
virtual ~ResourceImageSetPointerFix();
|
||||
|
||||
virtual void deserialization(MyGUI::xml::ElementPtr _node, MyGUI::Version _version);
|
||||
|
||||
virtual void setImage(MyGUI::ImageBox* _image);
|
||||
virtual void setPosition(MyGUI::ImageBox* _image, const MyGUI::IntPoint& _point);
|
||||
|
||||
//and now for the whole point of this class, allow us to get
|
||||
//the hot spot, the image and the size of the cursor.
|
||||
virtual MyGUI::ResourceImageSetPtr getImageSet();
|
||||
virtual MyGUI::IntPoint getHotSpot();
|
||||
virtual MyGUI::IntSize getSize();
|
||||
virtual int getRotation();
|
||||
|
||||
private:
|
||||
MyGUI::IntPoint mPoint;
|
||||
MyGUI::IntSize mSize;
|
||||
MyGUI::ResourceImageSetPtr mImageSet;
|
||||
int mRotation; // rotation in degrees
|
||||
};
|
||||
|
||||
class Cursor
|
||||
{
|
||||
public:
|
||||
Cursor();
|
||||
~Cursor();
|
||||
void update ();
|
||||
|
||||
void setVisible (bool visible);
|
||||
|
||||
void onCursorChange (const std::string& name);
|
||||
|
||||
private:
|
||||
MyGUI::ImageBox* mWidget;
|
||||
|
||||
MyGUI::IntSize mSize;
|
||||
MyGUI::IntPoint mHotSpot;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,16 +0,0 @@
|
|||
#include "cursorreplace.hpp"
|
||||
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <openengine/ogre/imagerotate.hpp>
|
||||
|
||||
#include <OgreResourceGroupManager.h>
|
||||
#include <OgreRoot.h>
|
||||
|
||||
using namespace MWGui;
|
||||
|
||||
CursorReplace::CursorReplace()
|
||||
{
|
||||
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_dresize2.png", 45);
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
#ifndef GAME_CURSORREPLACE_H
|
||||
#define GAME_CURSORREPLACE_H
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace MWGui
|
||||
{
|
||||
/// \brief MyGUI does not support rotating cursors, so we have to do it manually
|
||||
class CursorReplace
|
||||
{
|
||||
public:
|
||||
CursorReplace();
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
|
@ -53,6 +53,7 @@
|
|||
#include "trainingwindow.hpp"
|
||||
#include "imagebutton.hpp"
|
||||
#include "exposedwindow.hpp"
|
||||
#include "cursor.hpp"
|
||||
|
||||
using namespace MWGui;
|
||||
|
||||
|
@ -130,6 +131,9 @@ WindowManager::WindowManager(
|
|||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::ImageButton>("Widget");
|
||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::ExposedWindow>("Widget");
|
||||
|
||||
MyGUI::FactoryManager::getInstance().registerFactory<ResourceImageSetPointerFix>("Resource", "ResourceImageSetPointer");
|
||||
MyGUI::ResourceManager::getInstance().load("core.xml");
|
||||
|
||||
MyGUI::LanguageManager::getInstance().eventRequestTag = MyGUI::newDelegate(this, &WindowManager::onRetrieveTag);
|
||||
|
||||
// Get size info from the Gui object
|
||||
|
@ -178,6 +182,8 @@ WindowManager::WindowManager(
|
|||
|
||||
mInputBlocker = mGui->createWidget<MyGUI::Widget>("",0,0,w,h,MyGUI::Align::Default,"Windows","");
|
||||
|
||||
mCursor = new Cursor();
|
||||
|
||||
// The HUD is always on
|
||||
mHud->setVisible(true);
|
||||
|
||||
|
@ -236,6 +242,7 @@ WindowManager::~WindowManager()
|
|||
delete mTrainingWindow;
|
||||
delete mCountDialog;
|
||||
delete mQuickKeysMenu;
|
||||
delete mCursor;
|
||||
|
||||
cleanupGarbage();
|
||||
|
||||
|
@ -262,6 +269,8 @@ void WindowManager::update()
|
|||
mHud->setFPS(mFPS);
|
||||
mHud->setTriangleCount(mTriangleCount);
|
||||
mHud->setBatchCount(mBatchCount);
|
||||
|
||||
mCursor->update();
|
||||
}
|
||||
|
||||
void WindowManager::updateVisible()
|
||||
|
@ -293,7 +302,7 @@ void WindowManager::updateVisible()
|
|||
mHud->setVisible(true);
|
||||
|
||||
// Mouse is visible whenever we're not in game mode
|
||||
MyGUI::PointerManager::getInstance().setVisible(isGuiMode());
|
||||
mCursor->setVisible(isGuiMode());
|
||||
|
||||
bool gameMode = !isGuiMode();
|
||||
|
||||
|
@ -421,7 +430,7 @@ void WindowManager::updateVisible()
|
|||
break;
|
||||
case GM_LoadingWallpaper:
|
||||
mHud->setVisible(false);
|
||||
MyGUI::PointerManager::getInstance().setVisible(false);
|
||||
mCursor->setVisible(false);
|
||||
break;
|
||||
case GM_Loading:
|
||||
// Show the pinned windows
|
||||
|
@ -430,10 +439,10 @@ void WindowManager::updateVisible()
|
|||
mInventoryWindow->setVisible(mInventoryWindow->pinned());
|
||||
mSpellWindow->setVisible(mSpellWindow->pinned());
|
||||
|
||||
MyGUI::PointerManager::getInstance().setVisible(false);
|
||||
mCursor->setVisible(false);
|
||||
break;
|
||||
case GM_Video:
|
||||
MyGUI::PointerManager::getInstance().setVisible(false);
|
||||
mCursor->setVisible(false);
|
||||
mHud->setVisible(false);
|
||||
break;
|
||||
default:
|
||||
|
@ -755,7 +764,7 @@ void WindowManager::setSpellVisibility(bool visible)
|
|||
|
||||
void WindowManager::setMouseVisible(bool visible)
|
||||
{
|
||||
MyGUI::PointerManager::getInstance().setVisible(visible);
|
||||
mCursor->setVisible(visible);
|
||||
}
|
||||
|
||||
void WindowManager::setDragDrop(bool dragDrop)
|
||||
|
|
|
@ -72,6 +72,7 @@ namespace MWGui
|
|||
class SpellCreationDialog;
|
||||
class EnchantingDialog;
|
||||
class TrainingWindow;
|
||||
class Cursor;
|
||||
|
||||
class WindowManager : public MWBase::WindowManager
|
||||
{
|
||||
|
@ -260,6 +261,7 @@ namespace MWGui
|
|||
EnchantingDialog* mEnchantingDialog;
|
||||
TrainingWindow* mTrainingWindow;
|
||||
Translation::Storage& mTranslationDataStorage;
|
||||
Cursor* mCursor;
|
||||
|
||||
CharacterCreation* mCharGen;
|
||||
|
||||
|
|
|
@ -5,26 +5,31 @@
|
|||
<Property key="Point" value="7 0"/>
|
||||
<Property key="Size" value="32 32"/>
|
||||
<Property key="Resource" value="ArrowPointerImage"/>
|
||||
<Property key="Rotation" value="0"/>
|
||||
</Resource>
|
||||
<Resource type="ResourceImageSetPointer" name="hresize">
|
||||
<Property key="Point" value="16 14"/>
|
||||
<Property key="Size" value="32 32"/>
|
||||
<Property key="Resource" value="HResizePointerImage"/>
|
||||
<Property key="Rotation" value="0"/>
|
||||
</Resource>
|
||||
<Resource type="ResourceImageSetPointer" name="vresize">
|
||||
<Property key="Point" value="17 16"/>
|
||||
<Property key="Size" value="32 32"/>
|
||||
<Property key="Resource" value="VResizePointerImage"/>
|
||||
<Property key="Resource" value="HResizePointerImage"/>
|
||||
<Property key="Rotation" value="90"/>
|
||||
</Resource>
|
||||
<Resource type="ResourceImageSetPointer" name="dresize">
|
||||
<Property key="Point" value="17 15"/>
|
||||
<Property key="Size" value="32 32"/>
|
||||
<Property key="Resource" value="DResizePointerImage"/>
|
||||
<Property key="Resource" value="HResizePointerImage"/>
|
||||
<Property key="Rotation" value="45"/>
|
||||
</Resource>
|
||||
<Resource type="ResourceImageSetPointer" name="dresize2">
|
||||
<Property key="Point" value="15 15"/>
|
||||
<Property key="Size" value="32 32"/>
|
||||
<Property key="Resource" value="DResize2PointerImage"/>
|
||||
<Property key="Resource" value="HResizePointerImage"/>
|
||||
<Property key="Rotation" value="-45"/>
|
||||
</Resource>
|
||||
<Resource type="ResourceImageSetPointer" name="drop_ground">
|
||||
<Property key="Point" value="0 24"/>
|
||||
|
|
|
@ -17,27 +17,6 @@
|
|||
</Index>
|
||||
</Group>
|
||||
</Resource>
|
||||
<Resource type="ResourceImageSet" name="VResizePointerImage">
|
||||
<Group name="Pointer" texture="mwpointer_vresize.png" size="32 32">
|
||||
<Index name="Pointer" >
|
||||
<Frame point="0 0"/>
|
||||
</Index>
|
||||
</Group>
|
||||
</Resource>
|
||||
<Resource type="ResourceImageSet" name="DResizePointerImage">
|
||||
<Group name="Pointer" texture="mwpointer_dresize1.png" size="32 32">
|
||||
<Index name="Pointer" >
|
||||
<Frame point="o o"/>
|
||||
</Index>
|
||||
</Group>
|
||||
</Resource>
|
||||
<Resource type="ResourceImageSet" name="DResize2PointerImage">
|
||||
<Group name="Pointer" texture="mwpointer_dresize2.png" size="32 32">
|
||||
<Index name="Pointer" >
|
||||
<Frame point="0 0"/>
|
||||
</Index>
|
||||
</Group>
|
||||
</Resource>
|
||||
<Resource type="ResourceImageSet" name="DropGroundPointerImage">
|
||||
<Group name="Pointer" texture="textures\cursor_drop_ground.dds" size="32 32">
|
||||
<Index name="Pointer" >
|
||||
|
|
|
@ -53,7 +53,7 @@ void MyGUIManager::setup(Ogre::RenderWindow *wnd, Ogre::SceneManager *mgr, bool
|
|||
|
||||
// Create GUI
|
||||
mGui = new Gui();
|
||||
mGui->initialise("core.xml");
|
||||
mGui->initialise("");
|
||||
}
|
||||
|
||||
void MyGUIManager::shutdown()
|
||||
|
|
Loading…
Reference in a new issue