mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-16 18:59:57 +00:00
item selection working on the preview
This commit is contained in:
parent
eef750e6b0
commit
6ac2a12296
22 changed files with 367 additions and 34 deletions
|
@ -103,6 +103,7 @@ set(OENGINE_OGRE
|
||||||
${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/atlas.cpp
|
||||||
|
${LIBDIR}/openengine/ogre/selectionbuffer.cpp
|
||||||
)
|
)
|
||||||
set(OENGINE_GUI
|
set(OENGINE_GUI
|
||||||
${LIBDIR}/openengine/gui/manager.cpp
|
${LIBDIR}/openengine/gui/manager.cpp
|
||||||
|
|
|
@ -274,6 +274,7 @@ namespace MWBase
|
||||||
|
|
||||||
virtual void updateCharacterPreview(int sizeX, int sizeY) = 0;
|
virtual void updateCharacterPreview(int sizeX, int sizeY) = 0;
|
||||||
virtual void updateRaceSelectionPreview(float angle) = 0;
|
virtual void updateRaceSelectionPreview(float angle) = 0;
|
||||||
|
virtual MWWorld::Ptr getCharacterPreviewItemSelected(int posX, int posY) = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,8 @@ namespace MWGui
|
||||||
: ContainerBase(dragAndDrop)
|
: ContainerBase(dragAndDrop)
|
||||||
, WindowPinnableBase("openmw_inventory_window.layout", parWindowManager)
|
, WindowPinnableBase("openmw_inventory_window.layout", parWindowManager)
|
||||||
, mTrading(false)
|
, mTrading(false)
|
||||||
|
, mAvatarClickedPosX(0)
|
||||||
|
, mAvatarClickedPosY(0)
|
||||||
{
|
{
|
||||||
static_cast<MyGUI::Window*>(mMainWidget)->eventWindowChangeCoord += MyGUI::newDelegate(this, &InventoryWindow::onWindowResize);
|
static_cast<MyGUI::Window*>(mMainWidget)->eventWindowChangeCoord += MyGUI::newDelegate(this, &InventoryWindow::onWindowResize);
|
||||||
|
|
||||||
|
@ -107,6 +109,7 @@ namespace MWGui
|
||||||
MWBase::Environment::get().getWorld()->updateCharacterPreview (size.width, size.height);
|
MWBase::Environment::get().getWorld()->updateCharacterPreview (size.width, size.height);
|
||||||
mAvatarImage->setSize(MyGUI::IntSize(std::max(mAvatar->getSize().width, 512), std::max(mAvatar->getSize().height, 1024)));
|
mAvatarImage->setSize(MyGUI::IntSize(std::max(mAvatar->getSize().width, 512), std::max(mAvatar->getSize().height, 1024)));
|
||||||
mAvatarImage->setImageTexture("CharacterPreview");
|
mAvatarImage->setImageTexture("CharacterPreview");
|
||||||
|
mAvatarImage->setImageTexture("SelectionBuffer");
|
||||||
}
|
}
|
||||||
|
|
||||||
void InventoryWindow::onFilterChanged(MyGUI::Widget* _sender)
|
void InventoryWindow::onFilterChanged(MyGUI::Widget* _sender)
|
||||||
|
@ -180,6 +183,28 @@ namespace MWGui
|
||||||
|
|
||||||
notifyContentChanged();
|
notifyContentChanged();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MyGUI::IntPoint mousePos = MyGUI::InputManager::getInstance ().getLastPressedPosition (MyGUI::MouseButton::Left);
|
||||||
|
MyGUI::IntPoint relPos = mousePos - mAvatar->getAbsolutePosition ();
|
||||||
|
int realX = int(float(relPos.left) / float(mAvatar->getSize().width) * 512.f );
|
||||||
|
int realY = int(float(relPos.top) / float(mAvatar->getSize().height) * 1024.f );
|
||||||
|
MWWorld::Ptr itemSelected = MWBase::Environment::get().getWorld ()->getCharacterPreviewItemSelected (realX, realY);
|
||||||
|
if (itemSelected.isEmpty ())
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
for (unsigned int i=0; i < mContainerWidget->getChildCount (); ++i)
|
||||||
|
{
|
||||||
|
MyGUI::Widget* w = mContainerWidget->getChildAt (i);
|
||||||
|
|
||||||
|
if (*w->getUserData<MWWorld::Ptr>() == itemSelected)
|
||||||
|
{
|
||||||
|
onSelectedItem(w);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<MWWorld::Ptr> InventoryWindow::getEquippedItems()
|
std::vector<MWWorld::Ptr> InventoryWindow::getEquippedItems()
|
||||||
|
@ -336,4 +361,9 @@ namespace MWGui
|
||||||
text->setCaption(getCountString(count));
|
text->setCaption(getCountString(count));
|
||||||
mDragAndDrop->mDraggedFrom = this;
|
mDragAndDrop->mDraggedFrom = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MyGUI::IntCoord InventoryWindow::getAvatarScreenCoord ()
|
||||||
|
{
|
||||||
|
return mAvatar->getAbsoluteCoord ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,8 @@ namespace MWGui
|
||||||
|
|
||||||
int getPlayerGold();
|
int getPlayerGold();
|
||||||
|
|
||||||
|
MyGUI::IntCoord getAvatarScreenCoord();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MyGUI::Widget* mAvatar;
|
MyGUI::Widget* mAvatar;
|
||||||
MyGUI::ImageBox* mAvatarImage;
|
MyGUI::ImageBox* mAvatarImage;
|
||||||
|
@ -38,6 +40,10 @@ namespace MWGui
|
||||||
MyGUI::Button* mFilterMagic;
|
MyGUI::Button* mFilterMagic;
|
||||||
MyGUI::Button* mFilterMisc;
|
MyGUI::Button* mFilterMisc;
|
||||||
|
|
||||||
|
int mAvatarClickedPosX;
|
||||||
|
int mAvatarClickedPosY;
|
||||||
|
|
||||||
|
|
||||||
bool mTrading;
|
bool mTrading;
|
||||||
|
|
||||||
void onWindowResize(MyGUI::Window* _sender);
|
void onWindowResize(MyGUI::Window* _sender);
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "map_window.hpp"
|
#include "map_window.hpp"
|
||||||
#include "widgets.hpp"
|
#include "widgets.hpp"
|
||||||
|
#include "inventorywindow.hpp"
|
||||||
|
|
||||||
using namespace MWGui;
|
using namespace MWGui;
|
||||||
using namespace MyGUI;
|
using namespace MyGUI;
|
||||||
|
@ -162,12 +163,22 @@ void ToolTips::onFrame(float frameDuration)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (type == "ItemPtr")
|
if (type == "ItemPtr")
|
||||||
{
|
{
|
||||||
mFocusObject = *focus->getUserData<MWWorld::Ptr>();
|
mFocusObject = *focus->getUserData<MWWorld::Ptr>();
|
||||||
tooltipSize = getToolTipViaPtr(false);
|
tooltipSize = getToolTipViaPtr(false);
|
||||||
}
|
}
|
||||||
|
else if (type == "AvatarItemSelection")
|
||||||
|
{
|
||||||
|
MyGUI::IntCoord avatarPos = mWindowManager->getInventoryWindow ()->getAvatarScreenCoord ();
|
||||||
|
MyGUI::IntPoint relMousePos = MyGUI::InputManager::getInstance ().getMousePosition () - MyGUI::IntPoint(avatarPos.left, avatarPos.top);
|
||||||
|
int realX = int(float(relMousePos.left) / float(avatarPos.width) * 512.f );
|
||||||
|
int realY = int(float(relMousePos.top) / float(avatarPos.height) * 1024.f );
|
||||||
|
MWWorld::Ptr item = MWBase::Environment::get().getWorld ()->getCharacterPreviewItemSelected (realX, realY);
|
||||||
|
|
||||||
|
mFocusObject = item;
|
||||||
|
tooltipSize = getToolTipViaPtr(false);
|
||||||
|
}
|
||||||
else if (type == "Spell")
|
else if (type == "Spell")
|
||||||
{
|
{
|
||||||
ToolTipInfo info;
|
ToolTipInfo info;
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
#include <OgreSceneManager.h>
|
#include <OgreSceneManager.h>
|
||||||
#include <OgreHardwarePixelBuffer.h>
|
#include <OgreHardwarePixelBuffer.h>
|
||||||
|
|
||||||
|
#include <libs/openengine/ogre/selectionbuffer.hpp>
|
||||||
|
|
||||||
|
|
||||||
#include "renderconst.hpp"
|
#include "renderconst.hpp"
|
||||||
#include "npcanimation.hpp"
|
#include "npcanimation.hpp"
|
||||||
|
@ -50,7 +52,12 @@ namespace MWRender
|
||||||
: CharacterPreview(sceneMgr, node, 512, 1024, "CharacterPreview", Ogre::Vector3(0, 65, -180), Ogre::Vector3(0,65,0))
|
: CharacterPreview(sceneMgr, node, 512, 1024, "CharacterPreview", Ogre::Vector3(0, 65, -180), Ogre::Vector3(0,65,0))
|
||||||
, mAnimation(NULL)
|
, mAnimation(NULL)
|
||||||
{
|
{
|
||||||
|
mSelectionBuffer = new OEngine::Render::SelectionBuffer(mCamera, 512, 1024, RV_PlayerPreview);
|
||||||
|
}
|
||||||
|
|
||||||
|
InventoryPreview::~InventoryPreview()
|
||||||
|
{
|
||||||
|
delete mSelectionBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InventoryPreview::update(int sizeX, int sizeY)
|
void InventoryPreview::update(int sizeX, int sizeY)
|
||||||
|
@ -63,7 +70,10 @@ namespace MWRender
|
||||||
mNode->setOrientation (Ogre::Quaternion::IDENTITY);
|
mNode->setOrientation (Ogre::Quaternion::IDENTITY);
|
||||||
|
|
||||||
mNode->setVisible (true);
|
mNode->setVisible (true);
|
||||||
|
|
||||||
mRenderTarget->update();
|
mRenderTarget->update();
|
||||||
|
mSelectionBuffer->update();
|
||||||
|
|
||||||
mNode->setVisible (false);
|
mNode->setVisible (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,6 +82,12 @@ namespace MWRender
|
||||||
mAnimation = anim;
|
mAnimation = anim;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InventoryPreview::getSlotSelected (int posX, int posY)
|
||||||
|
{
|
||||||
|
std::cout << posX << " " << posY << std::endl;
|
||||||
|
return mSelectionBuffer->getSelected (posX, posY);
|
||||||
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
RaceSelectionPreview::RaceSelectionPreview(Ogre::SceneManager *sceneMgr, Ogre::SceneNode *node)
|
RaceSelectionPreview::RaceSelectionPreview(Ogre::SceneManager *sceneMgr, Ogre::SceneNode *node)
|
||||||
|
|
|
@ -2,6 +2,16 @@
|
||||||
#define MWRENDER_CHARACTERPREVIEW_H
|
#define MWRENDER_CHARACTERPREVIEW_H
|
||||||
|
|
||||||
#include <OgreRenderTarget.h>
|
#include <OgreRenderTarget.h>
|
||||||
|
#include <OgreMaterialManager.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace OEngine
|
||||||
|
{
|
||||||
|
namespace Render
|
||||||
|
{
|
||||||
|
class SelectionBuffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace MWRender
|
namespace MWRender
|
||||||
{
|
{
|
||||||
|
@ -32,13 +42,18 @@ namespace MWRender
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
InventoryPreview(Ogre::SceneManager* sceneMgr, Ogre::SceneNode* node);
|
InventoryPreview(Ogre::SceneManager* sceneMgr, Ogre::SceneNode* node);
|
||||||
|
virtual ~InventoryPreview();
|
||||||
|
|
||||||
void update(int sizeX, int sizeY);
|
void update(int sizeX, int sizeY);
|
||||||
|
|
||||||
|
int getSlotSelected(int posX, int posY);
|
||||||
|
|
||||||
void setNpcAnimation (NpcAnimation* anim);
|
void setNpcAnimation (NpcAnimation* anim);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NpcAnimation* mAnimation;
|
NpcAnimation* mAnimation;
|
||||||
|
|
||||||
|
OEngine::Render::SelectionBuffer* mSelectionBuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
class RaceSelectionPreview : public CharacterPreview
|
class RaceSelectionPreview : public CharacterPreview
|
||||||
|
|
|
@ -94,6 +94,8 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, Ogre::SceneNode* node, OEngi
|
||||||
{
|
{
|
||||||
Ogre::Entity *base = mEntityList.mEntities[i];
|
Ogre::Entity *base = mEntityList.mEntities[i];
|
||||||
|
|
||||||
|
base->getUserObjectBindings ().setUserAny (Ogre::Any(-1));
|
||||||
|
|
||||||
base->setVisibilityFlags(mVisibilityFlags);
|
base->setVisibilityFlags(mVisibilityFlags);
|
||||||
bool transparent = false;
|
bool transparent = false;
|
||||||
for(unsigned int j=0;j < base->getNumSubEntities();++j)
|
for(unsigned int j=0;j < base->getNumSubEntities();++j)
|
||||||
|
@ -351,13 +353,16 @@ void NpcAnimation::updateParts()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NifOgre::EntityList NpcAnimation::insertBoundedPart(const std::string &mesh, const std::string &bonename)
|
NifOgre::EntityList NpcAnimation::insertBoundedPart(const std::string &mesh, int group, const std::string &bonename)
|
||||||
{
|
{
|
||||||
NifOgre::EntityList entities = NIFLoader::createEntities(mEntityList.mSkelBase, bonename,
|
NifOgre::EntityList entities = NIFLoader::createEntities(mEntityList.mSkelBase, bonename,
|
||||||
mInsert, mesh);
|
mInsert, mesh);
|
||||||
std::vector<Ogre::Entity*> &parts = entities.mEntities;
|
std::vector<Ogre::Entity*> &parts = entities.mEntities;
|
||||||
for(size_t i = 0;i < parts.size();i++)
|
for(size_t i = 0;i < parts.size();i++)
|
||||||
|
{
|
||||||
parts[i]->setVisibilityFlags(mVisibilityFlags);
|
parts[i]->setVisibilityFlags(mVisibilityFlags);
|
||||||
|
parts[i]->getUserObjectBindings ().setUserAny (Ogre::Any(group));
|
||||||
|
}
|
||||||
return entities;
|
return entities;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -480,83 +485,83 @@ bool NpcAnimation::addOrReplaceIndividualPart(int type, int group, int priority,
|
||||||
switch(type)
|
switch(type)
|
||||||
{
|
{
|
||||||
case ESM::PRT_Head: //0
|
case ESM::PRT_Head: //0
|
||||||
head = insertBoundedPart(mesh, "Head");
|
head = insertBoundedPart(mesh, group, "Head");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Hair: //1
|
case ESM::PRT_Hair: //1
|
||||||
hair = insertBoundedPart(mesh, "Head");
|
hair = insertBoundedPart(mesh, group, "Head");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Neck: //2
|
case ESM::PRT_Neck: //2
|
||||||
neck = insertBoundedPart(mesh, "Neck");
|
neck = insertBoundedPart(mesh, group, "Neck");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Cuirass: //3
|
case ESM::PRT_Cuirass: //3
|
||||||
chest = insertBoundedPart(mesh, "Chest");
|
chest = insertBoundedPart(mesh, group, "Chest");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Groin: //4
|
case ESM::PRT_Groin: //4
|
||||||
groin = insertBoundedPart(mesh, "Groin");
|
groin = insertBoundedPart(mesh, group, "Groin");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Skirt: //5
|
case ESM::PRT_Skirt: //5
|
||||||
skirt = insertBoundedPart(mesh, "Groin");
|
skirt = insertBoundedPart(mesh, group, "Groin");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RHand: //6
|
case ESM::PRT_RHand: //6
|
||||||
rHand = insertBoundedPart(mesh, "Right Hand");
|
rHand = insertBoundedPart(mesh, group, "Right Hand");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LHand: //7
|
case ESM::PRT_LHand: //7
|
||||||
lHand = insertBoundedPart(mesh, "Left Hand");
|
lHand = insertBoundedPart(mesh, group, "Left Hand");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RWrist: //8
|
case ESM::PRT_RWrist: //8
|
||||||
rWrist = insertBoundedPart(mesh, "Right Wrist");
|
rWrist = insertBoundedPart(mesh, group, "Right Wrist");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LWrist: //9
|
case ESM::PRT_LWrist: //9
|
||||||
lWrist = insertBoundedPart(mesh, "Left Wrist");
|
lWrist = insertBoundedPart(mesh, group, "Left Wrist");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Shield: //10
|
case ESM::PRT_Shield: //10
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RForearm: //11
|
case ESM::PRT_RForearm: //11
|
||||||
rForearm = insertBoundedPart(mesh, "Right Forearm");
|
rForearm = insertBoundedPart(mesh, group, "Right Forearm");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LForearm: //12
|
case ESM::PRT_LForearm: //12
|
||||||
lForearm = insertBoundedPart(mesh, "Left Forearm");
|
lForearm = insertBoundedPart(mesh, group, "Left Forearm");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RUpperarm: //13
|
case ESM::PRT_RUpperarm: //13
|
||||||
rupperArm = insertBoundedPart(mesh, "Right Upper Arm");
|
rupperArm = insertBoundedPart(mesh, group, "Right Upper Arm");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LUpperarm: //14
|
case ESM::PRT_LUpperarm: //14
|
||||||
lupperArm = insertBoundedPart(mesh, "Left Upper Arm");
|
lupperArm = insertBoundedPart(mesh, group, "Left Upper Arm");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RFoot: //15
|
case ESM::PRT_RFoot: //15
|
||||||
rfoot = insertBoundedPart(mesh, "Right Foot");
|
rfoot = insertBoundedPart(mesh, group, "Right Foot");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LFoot: //16
|
case ESM::PRT_LFoot: //16
|
||||||
lfoot = insertBoundedPart(mesh, "Left Foot");
|
lfoot = insertBoundedPart(mesh, group, "Left Foot");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RAnkle: //17
|
case ESM::PRT_RAnkle: //17
|
||||||
rAnkle = insertBoundedPart(mesh, "Right Ankle");
|
rAnkle = insertBoundedPart(mesh, group, "Right Ankle");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LAnkle: //18
|
case ESM::PRT_LAnkle: //18
|
||||||
lAnkle = insertBoundedPart(mesh, "Left Ankle");
|
lAnkle = insertBoundedPart(mesh, group, "Left Ankle");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RKnee: //19
|
case ESM::PRT_RKnee: //19
|
||||||
rKnee = insertBoundedPart(mesh, "Right Knee");
|
rKnee = insertBoundedPart(mesh, group, "Right Knee");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LKnee: //20
|
case ESM::PRT_LKnee: //20
|
||||||
lKnee = insertBoundedPart(mesh, "Left Knee");
|
lKnee = insertBoundedPart(mesh, group, "Left Knee");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RLeg: //21
|
case ESM::PRT_RLeg: //21
|
||||||
rUpperLeg = insertBoundedPart(mesh, "Right Upper Leg");
|
rUpperLeg = insertBoundedPart(mesh, group, "Right Upper Leg");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LLeg: //22
|
case ESM::PRT_LLeg: //22
|
||||||
lUpperLeg = insertBoundedPart(mesh, "Left Upper Leg");
|
lUpperLeg = insertBoundedPart(mesh, group, "Left Upper Leg");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RPauldron: //23
|
case ESM::PRT_RPauldron: //23
|
||||||
rclavicle = insertBoundedPart(mesh , "Right Clavicle");
|
rclavicle = insertBoundedPart(mesh , group, "Right Clavicle");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LPauldron: //24
|
case ESM::PRT_LPauldron: //24
|
||||||
lclavicle = insertBoundedPart(mesh, "Left Clavicle");
|
lclavicle = insertBoundedPart(mesh, group, "Left Clavicle");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Weapon: //25
|
case ESM::PRT_Weapon: //25
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Tail: //26
|
case ESM::PRT_Tail: //26
|
||||||
tail = insertBoundedPart(mesh, "Tail");
|
tail = insertBoundedPart(mesh, group, "Tail");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -575,7 +580,7 @@ void NpcAnimation::addPartGroup(int group, int priority, std::vector<ESM::PartRe
|
||||||
bodypart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search(part.male);
|
bodypart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search(part.male);
|
||||||
|
|
||||||
if(bodypart)
|
if(bodypart)
|
||||||
addOrReplaceIndividualPart(part.part, group,priority,"meshes\\" + bodypart->model);
|
addOrReplaceIndividualPart(part.part, group, priority,"meshes\\" + bodypart->model);
|
||||||
else
|
else
|
||||||
reserveIndividualPart(part.part, group, priority);
|
reserveIndividualPart(part.part, group, priority);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,6 @@ private:
|
||||||
int mPartslots[27]; //Each part slot is taken by clothing, armor, or is empty
|
int mPartslots[27]; //Each part slot is taken by clothing, armor, or is empty
|
||||||
int mPartPriorities[27];
|
int mPartPriorities[27];
|
||||||
|
|
||||||
bool mIsPlayer;
|
|
||||||
|
|
||||||
//Bounded Parts
|
//Bounded Parts
|
||||||
NifOgre::EntityList lclavicle;
|
NifOgre::EntityList lclavicle;
|
||||||
NifOgre::EntityList rclavicle;
|
NifOgre::EntityList rclavicle;
|
||||||
|
@ -73,7 +71,7 @@ public:
|
||||||
NpcAnimation(const MWWorld::Ptr& ptr, Ogre::SceneNode* node, OEngine::Render::OgreRenderer& _rend,
|
NpcAnimation(const MWWorld::Ptr& ptr, Ogre::SceneNode* node, OEngine::Render::OgreRenderer& _rend,
|
||||||
MWWorld::InventoryStore& _inv, int visibilityFlags);
|
MWWorld::InventoryStore& _inv, int visibilityFlags);
|
||||||
virtual ~NpcAnimation();
|
virtual ~NpcAnimation();
|
||||||
NifOgre::EntityList insertBoundedPart(const std::string &mesh, const std::string &bonename);
|
NifOgre::EntityList insertBoundedPart(const std::string &mesh, int group, const std::string &bonename);
|
||||||
virtual void runAnimation(float timepassed);
|
virtual void runAnimation(float timepassed);
|
||||||
void updateParts();
|
void updateParts();
|
||||||
void removeEntities(NifOgre::EntityList &entities);
|
void removeEntities(NifOgre::EntityList &entities);
|
||||||
|
|
|
@ -905,4 +905,10 @@ void RenderingManager::updateRaceSelectionPreview (float angle)
|
||||||
mRaceSelectionPreview->update(angle);
|
mRaceSelectionPreview->update(angle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int RenderingManager::getCharacterPreviewSlotSelected(int posX, int posY)
|
||||||
|
{
|
||||||
|
std::cout << "SLOT IS " << mInventoryPreview->getSlotSelected(posX, posY) << std::endl;
|
||||||
|
return mInventoryPreview->getSlotSelected(posX, posY);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -195,6 +195,7 @@ class RenderingManager: private RenderingInterface, public Ogre::WindowEventList
|
||||||
|
|
||||||
void updateCharacterPreview(int sizeX, int sizeY);
|
void updateCharacterPreview(int sizeX, int sizeY);
|
||||||
void updateRaceSelectionPreview(float angle);
|
void updateRaceSelectionPreview(float angle);
|
||||||
|
int getCharacterPreviewSlotSelected(int posX, int posY);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void windowResized(Ogre::RenderWindow* rw);
|
virtual void windowResized(Ogre::RenderWindow* rw);
|
||||||
|
|
|
@ -1232,4 +1232,19 @@ namespace MWWorld
|
||||||
{
|
{
|
||||||
mRendering->updateRaceSelectionPreview(angle);
|
mRendering->updateRaceSelectionPreview(angle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MWWorld::Ptr World::getCharacterPreviewItemSelected(int posX, int posY)
|
||||||
|
{
|
||||||
|
int slot = mRendering->getCharacterPreviewSlotSelected(posX, posY);
|
||||||
|
|
||||||
|
if (slot == -1)
|
||||||
|
return MWWorld::Ptr();
|
||||||
|
|
||||||
|
MWWorld::Ptr player = getPlayer().getPlayer ();
|
||||||
|
MWWorld::InventoryStore& invStore = MWWorld::Class::get(player).getInventoryStore(player);
|
||||||
|
if (invStore.getSlot(slot) != invStore.end())
|
||||||
|
return *invStore.getSlot (slot);
|
||||||
|
else
|
||||||
|
return MWWorld::Ptr();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -310,6 +310,7 @@ namespace MWWorld
|
||||||
|
|
||||||
virtual void updateCharacterPreview(int sizeX, int sizeY);
|
virtual void updateCharacterPreview(int sizeX, int sizeY);
|
||||||
virtual void updateRaceSelectionPreview(float angle);
|
virtual void updateRaceSelectionPreview(float angle);
|
||||||
|
virtual MWWorld::Ptr getCharacterPreviewItemSelected(int posX, int posY);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
extern/shiny
vendored
2
extern/shiny
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit 7168415233905de2864eec71ed4312cb8f83059b
|
Subproject commit 4750676ac46a7aaa86bca53dc68c5a1ba11f3bc1
|
|
@ -40,7 +40,9 @@ set(MATERIAL_FILES
|
||||||
water.mat
|
water.mat
|
||||||
water.shader
|
water.shader
|
||||||
water.shaderset
|
water.shaderset
|
||||||
|
selection.mat
|
||||||
|
selection.shader
|
||||||
|
selection.shaderset
|
||||||
)
|
)
|
||||||
|
|
||||||
copy_all_files(${CMAKE_CURRENT_SOURCE_DIR}/water "${OpenMW_BINARY_DIR}/resources/water/" "${WATER_FILES}")
|
copy_all_files(${CMAKE_CURRENT_SOURCE_DIR}/water "${OpenMW_BINARY_DIR}/resources/water/" "${WATER_FILES}")
|
||||||
|
|
8
files/materials/selection.mat
Normal file
8
files/materials/selection.mat
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
material SelectionColour
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
vertex_program selection_vertex
|
||||||
|
fragment_program selection_fragment
|
||||||
|
}
|
||||||
|
}
|
24
files/materials/selection.shader
Normal file
24
files/materials/selection.shader
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#include "core.h"
|
||||||
|
|
||||||
|
#ifdef SH_VERTEX_SHADER
|
||||||
|
|
||||||
|
SH_BEGIN_PROGRAM
|
||||||
|
shUniform(float4x4, wvp) @shAutoConstant(wvp, worldviewproj_matrix)
|
||||||
|
|
||||||
|
SH_START_PROGRAM
|
||||||
|
{
|
||||||
|
shOutputPosition = shMatrixMult(wvp, shInputPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
SH_BEGIN_PROGRAM
|
||||||
|
shUniform(float4, colour) @shAutoConstant(colour, custom, 1)
|
||||||
|
|
||||||
|
SH_START_PROGRAM
|
||||||
|
{
|
||||||
|
shOutputColour(0) = colour;
|
||||||
|
//shOutputColour(0) = float4(1,0,0,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
15
files/materials/selection.shaderset
Normal file
15
files/materials/selection.shaderset
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
shader_set selection_vertex
|
||||||
|
{
|
||||||
|
source selection.shader
|
||||||
|
type vertex
|
||||||
|
profiles_cg vs_2_0 arbvp1
|
||||||
|
profiles_hlsl vs_2_0
|
||||||
|
}
|
||||||
|
|
||||||
|
shader_set selection_fragment
|
||||||
|
{
|
||||||
|
source selection.shader
|
||||||
|
type fragment
|
||||||
|
profiles_cg ps_2_x ps_2_0 ps arbfp1
|
||||||
|
profiles_hlsl ps_2_0
|
||||||
|
}
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
<!-- Sliders -->
|
<!-- Sliders -->
|
||||||
<!-- Rotation of head -->
|
<!-- Rotation of head -->
|
||||||
<Widget type="HScroll" skin="MW_HScroll" position="8 276 241 14" name="HeadRotate"/>
|
<Widget type="ScrollBar" skin="MW_HScroll" position="8 276 241 14" name="HeadRotate"/>
|
||||||
|
|
||||||
<!-- Gender choice -->
|
<!-- Gender choice -->
|
||||||
<Widget type="Button" skin="MW_ScrollLeft" position="8 298 14 14" name="PrevGenderButton"/>
|
<Widget type="Button" skin="MW_ScrollLeft" position="8 298 14 14" name="PrevGenderButton"/>
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
<!-- Avatar -->
|
<!-- Avatar -->
|
||||||
<Widget type="Widget" skin="MW_Box" position="8 38 212 185" name="Avatar" align="Left Top Stretch">
|
<Widget type="Widget" skin="MW_Box" position="8 38 212 185" name="Avatar" align="Left Top Stretch">
|
||||||
|
<UserString key="ToolTipType" value="AvatarItemSelection"/>
|
||||||
<Widget type="ImageBox" skin="ImageBox" position="0 0 212 185" align="Stretch" name="AvatarImage">
|
<Widget type="ImageBox" skin="ImageBox" position="0 0 212 185" align="Stretch" name="AvatarImage">
|
||||||
<Property key="NeedMouse" value="false"/>
|
<Property key="NeedMouse" value="false"/>
|
||||||
</Widget>
|
</Widget>
|
||||||
|
|
123
libs/openengine/ogre/selectionbuffer.cpp
Normal file
123
libs/openengine/ogre/selectionbuffer.cpp
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
#include "selectionbuffer.hpp"
|
||||||
|
|
||||||
|
#include <OgreHardwarePixelBuffer.h>
|
||||||
|
#include <OgreRenderTexture.h>
|
||||||
|
#include <OgreSubEntity.h>
|
||||||
|
#include <OgreEntity.h>
|
||||||
|
|
||||||
|
#include <extern/shiny/Main/Factory.hpp>
|
||||||
|
|
||||||
|
namespace OEngine
|
||||||
|
{
|
||||||
|
namespace Render
|
||||||
|
{
|
||||||
|
|
||||||
|
SelectionBuffer::SelectionBuffer(Ogre::Camera *camera, int sizeX, int sizeY, int visibilityFlags)
|
||||||
|
{
|
||||||
|
mTexture = Ogre::TextureManager::getSingleton().createManual("SelectionBuffer",
|
||||||
|
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, sizeX, sizeY, 0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET);
|
||||||
|
|
||||||
|
mRenderTarget = mTexture->getBuffer()->getRenderTarget();
|
||||||
|
Ogre::Viewport* vp = mRenderTarget->addViewport(camera);
|
||||||
|
vp->setOverlaysEnabled(false);
|
||||||
|
vp->setBackgroundColour(Ogre::ColourValue(0, 0, 0, 0));
|
||||||
|
vp->setShadowsEnabled(false);
|
||||||
|
vp->setMaterialScheme("selectionbuffer");
|
||||||
|
vp->setVisibilityMask (visibilityFlags);
|
||||||
|
mRenderTarget->setActive(true);
|
||||||
|
mRenderTarget->setAutoUpdated (false);
|
||||||
|
|
||||||
|
mCurrentColour = Ogre::ColourValue(0.3, 0.3, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
SelectionBuffer::~SelectionBuffer()
|
||||||
|
{
|
||||||
|
Ogre::TextureManager::getSingleton ().remove("SelectionBuffer");
|
||||||
|
}
|
||||||
|
|
||||||
|
void SelectionBuffer::update ()
|
||||||
|
{
|
||||||
|
Ogre::MaterialManager::getSingleton ().addListener (this);
|
||||||
|
|
||||||
|
mRenderTarget->update();
|
||||||
|
|
||||||
|
Ogre::MaterialManager::getSingleton ().removeListener (this);
|
||||||
|
|
||||||
|
mTexture->convertToImage(mBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
int SelectionBuffer::getSelected(int xPos, int yPos)
|
||||||
|
{
|
||||||
|
Ogre::ColourValue clr = mBuffer.getColourAt (xPos, yPos, 0);
|
||||||
|
clr.a = 1;
|
||||||
|
if (mColourMap.find(clr) != mColourMap.end())
|
||||||
|
return mColourMap[clr];
|
||||||
|
else
|
||||||
|
return -1; // nothing selected
|
||||||
|
}
|
||||||
|
|
||||||
|
Ogre::Technique* SelectionBuffer::handleSchemeNotFound (
|
||||||
|
unsigned short schemeIndex, const Ogre::String &schemeName, Ogre::Material *originalMaterial,
|
||||||
|
unsigned short lodIndex, const Ogre::Renderable *rend)
|
||||||
|
{
|
||||||
|
if (schemeName == "selectionbuffer")
|
||||||
|
{
|
||||||
|
sh::Factory::getInstance ()._ensureMaterial ("SelectionColour", "Default");
|
||||||
|
|
||||||
|
Ogre::MaterialPtr m = Ogre::MaterialManager::getSingleton ().getByName("SelectionColour");
|
||||||
|
|
||||||
|
|
||||||
|
if(typeid(*rend) == typeid(Ogre::SubEntity))
|
||||||
|
{
|
||||||
|
const Ogre::SubEntity *subEntity = static_cast<const Ogre::SubEntity *>(rend);
|
||||||
|
int id = subEntity->getParent ()->getUserObjectBindings().getUserAny().get<int>();
|
||||||
|
std::cout << "found ID:" << id << " entity name is " << subEntity->getParent()->getName() << std::endl;
|
||||||
|
bool found = false;
|
||||||
|
Ogre::ColourValue colour;
|
||||||
|
for (std::map<Ogre::ColourValue, int>::iterator it = mColourMap.begin(); it != mColourMap.end(); ++it)
|
||||||
|
{
|
||||||
|
if (it->second == id)
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
colour = it->first;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
getNextColour();
|
||||||
|
const_cast<Ogre::SubEntity *>(subEntity)->setCustomParameter(1, Ogre::Vector4(mCurrentColour.r, mCurrentColour.g, mCurrentColour.b, 1.0));
|
||||||
|
mColourMap[mCurrentColour] = id;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const_cast<Ogre::SubEntity *>(subEntity)->setCustomParameter(1, Ogre::Vector4(colour.r, colour.g, colour.b, 1.0));
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(m->getTechnique(1));
|
||||||
|
return m->getTechnique(1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw std::runtime_error("selectionbuffer only works with entities");
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SelectionBuffer::getNextColour ()
|
||||||
|
{
|
||||||
|
Ogre::ARGB color = (float(rand()) / float(RAND_MAX)) * std::numeric_limits<Ogre::uint32>::max();
|
||||||
|
|
||||||
|
if (mCurrentColour.getAsARGB () == color)
|
||||||
|
{
|
||||||
|
getNextColour();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mCurrentColour.setAsARGB(color);
|
||||||
|
mCurrentColour.a = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
54
libs/openengine/ogre/selectionbuffer.hpp
Normal file
54
libs/openengine/ogre/selectionbuffer.hpp
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
#ifndef OENGINE_SELECTIONBUFFER_H
|
||||||
|
#define OENGINE_SELECTIONBUFFER_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <OgreTexture.h>
|
||||||
|
#include <OgreRenderTarget.h>
|
||||||
|
#include <OgreMaterialManager.h>
|
||||||
|
|
||||||
|
namespace OEngine
|
||||||
|
{
|
||||||
|
namespace Render
|
||||||
|
{
|
||||||
|
|
||||||
|
struct cmp_ColourValue
|
||||||
|
{
|
||||||
|
bool operator()(const Ogre::ColourValue &a, const Ogre::ColourValue &b) const
|
||||||
|
{
|
||||||
|
return a.getAsBGRA() < b.getAsBGRA();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class SelectionBuffer : public Ogre::MaterialManager::Listener
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SelectionBuffer(Ogre::Camera* camera, int sizeX, int sizeY, int visibilityFlags);
|
||||||
|
virtual ~SelectionBuffer();
|
||||||
|
|
||||||
|
int getSelected(int xPos, int yPos);
|
||||||
|
///< @return ID of the selected object
|
||||||
|
|
||||||
|
void update();
|
||||||
|
|
||||||
|
virtual Ogre::Technique* handleSchemeNotFound (
|
||||||
|
unsigned short schemeIndex, const Ogre::String &schemeName, Ogre::Material *originalMaterial,
|
||||||
|
unsigned short lodIndex, const Ogre::Renderable *rend);
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ogre::TexturePtr mTexture;
|
||||||
|
Ogre::RenderTexture* mRenderTarget;
|
||||||
|
|
||||||
|
Ogre::Image mBuffer;
|
||||||
|
|
||||||
|
std::map<Ogre::ColourValue, int, cmp_ColourValue> mColourMap;
|
||||||
|
|
||||||
|
Ogre::ColourValue mCurrentColour;
|
||||||
|
|
||||||
|
void getNextColour();
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue