mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-02-28 23:39:41 +00:00
Merge remote-tracking branch 'scrawl/master'
This commit is contained in:
commit
f64964d5dd
52 changed files with 405 additions and 289 deletions
|
@ -177,7 +177,7 @@ namespace MWBase
|
|||
virtual void changeCell(MWWorld::CellStore* cell) = 0;
|
||||
///< change the active cell
|
||||
|
||||
virtual void setPlayerPos(const float x, const float y) = 0;
|
||||
virtual void setPlayerPos(int cellX, int cellY, const float x, const float y) = 0;
|
||||
///< set player position in map space
|
||||
|
||||
virtual void setPlayerDir(const float x, const float y) = 0;
|
||||
|
|
|
@ -119,6 +119,7 @@ namespace MWBase
|
|||
virtual void setWaterHeight(const float height) = 0;
|
||||
|
||||
virtual bool toggleWater() = 0;
|
||||
virtual bool toggleWorld() = 0;
|
||||
|
||||
virtual void adjustSky() = 0;
|
||||
|
||||
|
@ -136,7 +137,7 @@ namespace MWBase
|
|||
virtual MWWorld::LocalScripts& getLocalScripts() = 0;
|
||||
|
||||
virtual bool hasCellChanged() const = 0;
|
||||
///< Has the player moved to a different cell, since the last frame?
|
||||
///< Has the set of active cells changed, since the last frame?
|
||||
|
||||
virtual bool isCellExterior() const = 0;
|
||||
|
||||
|
|
|
@ -490,7 +490,7 @@ namespace
|
|||
unsigned int & page = mStates.top ().mPage;
|
||||
Book book = mStates.top ().mBook;
|
||||
|
||||
if (page < book->pageCount () - 2)
|
||||
if (page+2 < book->pageCount())
|
||||
{
|
||||
page += 2;
|
||||
updateShowingPages ();
|
||||
|
|
|
@ -159,8 +159,6 @@ namespace MWGui
|
|||
, mLocalMap(NULL)
|
||||
, mPrefix()
|
||||
, mChanged(true)
|
||||
, mLastPositionX(0.0f)
|
||||
, mLastPositionY(0.0f)
|
||||
, mLastDirectionX(0.0f)
|
||||
, mLastDirectionY(0.0f)
|
||||
, mCompass(NULL)
|
||||
|
@ -425,24 +423,24 @@ namespace MWGui
|
|||
mLocalMap->getParent()->_updateChilds();
|
||||
}
|
||||
|
||||
void LocalMapBase::setPlayerPos(const float x, const float y)
|
||||
void LocalMapBase::setPlayerPos(int cellX, int cellY, const float nx, const float ny)
|
||||
{
|
||||
updateMagicMarkers();
|
||||
|
||||
if (x == mLastPositionX && y == mLastPositionY)
|
||||
return;
|
||||
|
||||
notifyPlayerUpdate ();
|
||||
|
||||
MyGUI::IntSize size = mLocalMap->getCanvasSize();
|
||||
MyGUI::IntPoint middle = MyGUI::IntPoint((1/3.f + x/3.f)*size.width,(1/3.f + y/3.f)*size.height);
|
||||
MyGUI::IntCoord viewsize = mLocalMap->getCoord();
|
||||
MyGUI::IntPoint pos(0.5*viewsize.width - middle.left, 0.5*viewsize.height - middle.top);
|
||||
mLocalMap->setViewOffset(pos);
|
||||
MyGUI::IntPoint pos(widgetSize+nx*widgetSize-16, widgetSize+ny*widgetSize-16);
|
||||
pos.left += (cellX - mCurX) * widgetSize;
|
||||
pos.top -= (cellY - mCurY) * widgetSize;
|
||||
|
||||
mCompass->setPosition(MyGUI::IntPoint(widgetSize+x*widgetSize-16, widgetSize+y*widgetSize-16));
|
||||
mLastPositionX = x;
|
||||
mLastPositionY = y;
|
||||
if (pos != mCompass->getPosition())
|
||||
{
|
||||
mCompass->setPosition(pos);
|
||||
MyGUI::IntPoint middle (pos.left+16, pos.top+16);
|
||||
MyGUI::IntCoord viewsize = mLocalMap->getCoord();
|
||||
MyGUI::IntPoint viewOffset(0.5*viewsize.width - middle.left, 0.5*viewsize.height - middle.top);
|
||||
mLocalMap->setViewOffset(viewOffset);
|
||||
}
|
||||
}
|
||||
|
||||
void LocalMapBase::setPlayerDir(const float x, const float y)
|
||||
|
|
|
@ -75,7 +75,7 @@ namespace MWGui
|
|||
void setCellPrefix(const std::string& prefix);
|
||||
void setActiveCell(const int x, const int y, bool interior=false);
|
||||
void setPlayerDir(const float x, const float y);
|
||||
void setPlayerPos(const float x, const float y);
|
||||
void setPlayerPos(int cellX, int cellY, const float nx, const float ny);
|
||||
|
||||
void onFrame(float dt);
|
||||
|
||||
|
@ -129,8 +129,6 @@ namespace MWGui
|
|||
|
||||
float mMarkerUpdateTimer;
|
||||
|
||||
float mLastPositionX;
|
||||
float mLastPositionY;
|
||||
float mLastDirectionX;
|
||||
float mLastDirectionY;
|
||||
};
|
||||
|
|
|
@ -157,12 +157,11 @@ namespace MWGui
|
|||
, mMaxTime(0)
|
||||
{
|
||||
// defines
|
||||
mBottomPadding = 20;
|
||||
mNextBoxPadding = 20;
|
||||
mBottomPadding = 48;
|
||||
mNextBoxPadding = 4;
|
||||
|
||||
getWidget(mMessageWidget, "message");
|
||||
|
||||
mMessageWidget->setOverflowToTheLeft(true);
|
||||
mMessageWidget->setCaptionWithReplacing(mMessage);
|
||||
}
|
||||
|
||||
|
@ -178,7 +177,7 @@ namespace MWGui
|
|||
|
||||
int MessageBox::getHeight ()
|
||||
{
|
||||
return mMainWidget->getHeight()+mNextBoxPadding; // 20 is the padding between this and the next MessageBox
|
||||
return mMainWidget->getHeight()+mNextBoxPadding;
|
||||
}
|
||||
|
||||
|
||||
|
@ -204,7 +203,6 @@ namespace MWGui
|
|||
getWidget(mMessageWidget, "message");
|
||||
getWidget(mButtonsWidget, "buttons");
|
||||
|
||||
mMessageWidget->setOverflowToTheLeft(true);
|
||||
mMessageWidget->setSize(400, mMessageWidget->getHeight());
|
||||
mMessageWidget->setCaptionWithReplacing(message);
|
||||
|
||||
|
|
|
@ -41,12 +41,11 @@ namespace MWGui
|
|||
|
||||
getWidget(mHeadRotate, "HeadRotate");
|
||||
|
||||
// Mouse wheel step is hardcoded to 50 in MyGUI 3.2 ("FIXME").
|
||||
// Give other steps the same value to accomodate.
|
||||
mHeadRotate->setScrollRange(1000);
|
||||
mHeadRotate->setScrollPosition(500);
|
||||
mHeadRotate->setScrollViewPage(50);
|
||||
mHeadRotate->setScrollPage(50);
|
||||
mHeadRotate->setScrollWheelPage(50);
|
||||
mHeadRotate->eventScrollChangePosition += MyGUI::newDelegate(this, &RaceDialog::onHeadRotate);
|
||||
|
||||
// Set up next/previous buttons
|
||||
|
|
|
@ -100,6 +100,15 @@ namespace MWGui
|
|||
if (spell->mData.mType!=ESM::Spell::ST_Spell)
|
||||
continue; // don't try to sell diseases, curses or powers
|
||||
|
||||
if (actor.getClass().isNpc())
|
||||
{
|
||||
const ESM::Race* race =
|
||||
MWBase::Environment::get().getWorld()->getStore().get<ESM::Race>().find(
|
||||
actor.get<ESM::NPC>()->mBase->mRace);
|
||||
if (race->mPowers.exists(spell->mId))
|
||||
continue;
|
||||
}
|
||||
|
||||
if (playerHasSpell(iter->first))
|
||||
continue;
|
||||
|
||||
|
|
|
@ -422,12 +422,12 @@ namespace MWGui
|
|||
y *= 1.5;
|
||||
}
|
||||
|
||||
mSpell.mData.mCost = int(y);
|
||||
|
||||
ESM::EffectList effectList;
|
||||
effectList.mList = mEffects;
|
||||
mSpell.mEffects = effectList;
|
||||
mSpell.mData.mCost = int(y);
|
||||
mSpell.mData.mType = ESM::Spell::ST_Spell;
|
||||
mSpell.mData.mFlags = 0;
|
||||
|
||||
mMagickaCost->setCaption(boost::lexical_cast<std::string>(int(y)));
|
||||
|
||||
|
|
|
@ -880,9 +880,6 @@ namespace MWGui
|
|||
mMap->addVisitedLocation ("#{sCell=" + name + "}", cell->getCell()->getGridX (), cell->getCell()->getGridY ());
|
||||
|
||||
mMap->cellExplored (cell->getCell()->getGridX(), cell->getCell()->getGridY());
|
||||
|
||||
mMap->setCellPrefix("Cell");
|
||||
mHud->setCellPrefix("Cell");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -900,14 +897,20 @@ namespace MWGui
|
|||
|
||||
void WindowManager::setActiveMap(int x, int y, bool interior)
|
||||
{
|
||||
if (!interior)
|
||||
{
|
||||
mMap->setCellPrefix("Cell");
|
||||
mHud->setCellPrefix("Cell");
|
||||
}
|
||||
|
||||
mMap->setActiveCell(x,y, interior);
|
||||
mHud->setActiveCell(x,y, interior);
|
||||
}
|
||||
|
||||
void WindowManager::setPlayerPos(const float x, const float y)
|
||||
void WindowManager::setPlayerPos(int cellX, int cellY, const float x, const float y)
|
||||
{
|
||||
mMap->setPlayerPos(x,y);
|
||||
mHud->setPlayerPos(x,y);
|
||||
mMap->setPlayerPos(cellX, cellY, x, y);
|
||||
mHud->setPlayerPos(cellX, cellY, x, y);
|
||||
}
|
||||
|
||||
void WindowManager::setPlayerDir(const float x, const float y)
|
||||
|
|
|
@ -183,7 +183,7 @@ namespace MWGui
|
|||
virtual void updateSkillArea(); ///< update display of skills, factions, birth sign, reputation and bounty
|
||||
|
||||
virtual void changeCell(MWWorld::CellStore* cell); ///< change the active cell
|
||||
virtual void setPlayerPos(const float x, const float y); ///< set player position in map space
|
||||
virtual void setPlayerPos(int cellX, int cellY, const float x, const float y); ///< set player position in map space
|
||||
virtual void setPlayerDir(const float x, const float y); ///< set player view direction in map space
|
||||
|
||||
virtual void setFocusObject(const MWWorld::Ptr& focus);
|
||||
|
|
|
@ -936,9 +936,11 @@ namespace MWInput
|
|||
{
|
||||
clearAllBindings (control);
|
||||
|
||||
if (defaultKeyBindings.find(i) != defaultKeyBindings.end())
|
||||
if (defaultKeyBindings.find(i) != defaultKeyBindings.end()
|
||||
&& !mInputBinder->isKeyBound(defaultKeyBindings[i]))
|
||||
mInputBinder->addKeyBinding(control, defaultKeyBindings[i], ICS::Control::INCREASE);
|
||||
else if (defaultMouseButtonBindings.find(i) != defaultMouseButtonBindings.end())
|
||||
else if (defaultMouseButtonBindings.find(i) != defaultMouseButtonBindings.end()
|
||||
&& !mInputBinder->isMouseButtonBound(defaultMouseButtonBindings[i]))
|
||||
mInputBinder->addMouseButtonBinding (control, defaultMouseButtonBindings[i], ICS::Control::INCREASE);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1122,20 +1122,21 @@ namespace MWMechanics
|
|||
|
||||
int hostilesCount = 0; // need to know this to play Battle music
|
||||
|
||||
// AI processing is only done within distance of 7168 units to the player. Note the "AI distance" slider doesn't affect this
|
||||
// (it only does some throttling for targets beyond the "AI distance", so doesn't give any guarantees as to whether AI will be enabled or not)
|
||||
// This distance could be made configurable later, but the setting must be marked with a big warning:
|
||||
// using higher values will make a quest in Bloodmoon harder or impossible to complete (bug #1876)
|
||||
const float sqrProcessingDistance = 7168*7168;
|
||||
|
||||
// AI and magic effects update
|
||||
for(PtrControllerMap::iterator iter(mActors.begin()); iter != mActors.end(); ++iter)
|
||||
{
|
||||
if (!iter->first.getClass().getCreatureStats(iter->first).isDead())
|
||||
{
|
||||
updateActor(iter->first, duration);
|
||||
|
||||
// AI processing is only done within distance of 7168 units to the player. Note the "AI distance" slider doesn't affect this
|
||||
// (it only does some throttling for targets beyond the "AI distance", so doesn't give any guarantees as to whether AI will be enabled or not)
|
||||
// This distance could be made configurable later, but the setting must be marked with a big warning:
|
||||
// using higher values will make a quest in Bloodmoon harder or impossible to complete (bug #1876)
|
||||
if (MWBase::Environment::get().getMechanicsManager()->isAIActive() &&
|
||||
Ogre::Vector3(player.getRefData().getPosition().pos).squaredDistance(Ogre::Vector3(iter->first.getRefData().getPosition().pos))
|
||||
<= 7168*7168)
|
||||
<= sqrProcessingDistance)
|
||||
{
|
||||
if (timerUpdateAITargets == 0)
|
||||
{
|
||||
|
@ -1182,6 +1183,11 @@ namespace MWMechanics
|
|||
CharacterController* playerCharacter = NULL;
|
||||
for(PtrControllerMap::iterator iter(mActors.begin()); iter != mActors.end(); ++iter)
|
||||
{
|
||||
if (iter->first != player &&
|
||||
Ogre::Vector3(player.getRefData().getPosition().pos).squaredDistance(Ogre::Vector3(iter->first.getRefData().getPosition().pos))
|
||||
> sqrProcessingDistance)
|
||||
continue;
|
||||
|
||||
if (iter->first.getClass().getCreatureStats(iter->first).getMagicEffects().get(
|
||||
ESM::MagicEffect::Paralyze).getMagnitude() > 0)
|
||||
iter->second->skipAnim();
|
||||
|
|
|
@ -260,15 +260,14 @@ void AiSequence::stack (const AiPackage& package, const MWWorld::Ptr& actor)
|
|||
|
||||
for(std::list<AiPackage *>::iterator it = mPackages.begin(); it != mPackages.end(); ++it)
|
||||
{
|
||||
if(mPackages.front()->getPriority() <= package.getPriority())
|
||||
if((*it)->getPriority() <= package.getPriority())
|
||||
{
|
||||
mPackages.insert(it,package.clone());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(mPackages.empty())
|
||||
mPackages.push_front (package.clone());
|
||||
mPackages.push_front (package.clone());
|
||||
}
|
||||
|
||||
AiPackage* MWMechanics::AiSequence::getActivePackage()
|
||||
|
|
|
@ -133,7 +133,7 @@ void MWMechanics::Alchemy::updateEffects()
|
|||
std::set<EffectKey> effects (listEffects());
|
||||
|
||||
// general alchemy factor
|
||||
float x = getChance();
|
||||
float x = getAlchemyFactor();
|
||||
|
||||
x *= mTools[ESM::Apparatus::MortarPestle].get<ESM::Apparatus>()->mBase->mData.mQuality;
|
||||
x *= MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find ("fPotionStrengthMult")->getFloat();
|
||||
|
@ -306,18 +306,15 @@ void MWMechanics::Alchemy::increaseSkill()
|
|||
mAlchemist.getClass().skillUsageSucceeded (mAlchemist, ESM::Skill::Alchemy, 0);
|
||||
}
|
||||
|
||||
float MWMechanics::Alchemy::getChance() const
|
||||
float MWMechanics::Alchemy::getAlchemyFactor() const
|
||||
{
|
||||
const CreatureStats& creatureStats = mAlchemist.getClass().getCreatureStats (mAlchemist);
|
||||
const NpcStats& npcStats = mAlchemist.getClass().getNpcStats (mAlchemist);
|
||||
|
||||
if (beginEffects() == endEffects())
|
||||
return 0.f;
|
||||
|
||||
return
|
||||
(npcStats.getSkill (ESM::Skill::Alchemy).getModified() +
|
||||
0.1 * creatureStats.getAttribute (1).getModified()
|
||||
+ 0.1 * creatureStats.getAttribute (7).getModified());
|
||||
0.1 * creatureStats.getAttribute (ESM::Attribute::Intelligence).getModified()
|
||||
+ 0.1 * creatureStats.getAttribute (ESM::Attribute::Luck).getModified());
|
||||
}
|
||||
|
||||
int MWMechanics::Alchemy::countIngredients() const
|
||||
|
@ -461,7 +458,14 @@ MWMechanics::Alchemy::Result MWMechanics::Alchemy::create (const std::string& na
|
|||
if (listEffects().empty())
|
||||
return Result_NoEffects;
|
||||
|
||||
if (getChance()<std::rand()/static_cast<double> (RAND_MAX)*100)
|
||||
if (beginEffects() == endEffects())
|
||||
{
|
||||
// all effects were nullified due to insufficient skill
|
||||
removeIngredients();
|
||||
return Result_RandomFailure;
|
||||
}
|
||||
|
||||
if (getAlchemyFactor()<std::rand()/static_cast<double> (RAND_MAX)*100)
|
||||
{
|
||||
removeIngredients();
|
||||
return Result_RandomFailure;
|
||||
|
|
|
@ -69,8 +69,7 @@ namespace MWMechanics
|
|||
void increaseSkill();
|
||||
///< Increase alchemist's skill.
|
||||
|
||||
float getChance() const;
|
||||
///< Return chance of success.
|
||||
float getAlchemyFactor() const;
|
||||
|
||||
int countIngredients() const;
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ namespace MWMechanics
|
|||
if (baseMagicka < iAutoSpellTimesCanCast * spell->mData.mCost)
|
||||
continue;
|
||||
|
||||
if (race && std::find(race->mPowers.mList.begin(), race->mPowers.mList.end(), spell->mId) != race->mPowers.mList.end())
|
||||
if (race && race->mPowers.exists(spell->mId))
|
||||
continue;
|
||||
|
||||
if (!attrSkillCheck(spell, actorSkills, actorAttributes))
|
||||
|
|
|
@ -53,6 +53,9 @@ namespace MWMechanics
|
|||
MWWorld::ContainerStore& store = player.getClass().getContainerStore(player);
|
||||
ESM::Enchantment enchantment;
|
||||
enchantment.mData.mCharge = getGemCharge();
|
||||
enchantment.mData.mAutocalc = 0;
|
||||
enchantment.mData.mType = mCastStyle;
|
||||
enchantment.mData.mCost = getEnchantPoints();
|
||||
|
||||
store.remove(mSoulGemPtr, 1, player);
|
||||
|
||||
|
@ -72,8 +75,6 @@ namespace MWMechanics
|
|||
{
|
||||
enchantment.mData.mCharge=0;
|
||||
}
|
||||
enchantment.mData.mType = mCastStyle;
|
||||
enchantment.mData.mCost = getEnchantPoints();
|
||||
enchantment.mEffects = mEffectList;
|
||||
|
||||
// Apply the enchantment
|
||||
|
|
|
@ -19,6 +19,7 @@ namespace MWRender
|
|||
Camera::Camera (Ogre::Camera *camera)
|
||||
: mCamera(camera),
|
||||
mCameraNode(NULL),
|
||||
mCameraPosNode(NULL),
|
||||
mAnimation(NULL),
|
||||
mFirstPersonView(true),
|
||||
mPreviewMode(false),
|
||||
|
@ -26,8 +27,8 @@ namespace MWRender
|
|||
mNearest(30.f),
|
||||
mFurthest(800.f),
|
||||
mIsNearest(false),
|
||||
mHeight(128.f),
|
||||
mCameraDistance(300.f),
|
||||
mHeight(124.f),
|
||||
mCameraDistance(192.f),
|
||||
mDistanceAdjusted(false),
|
||||
mVanityToggleQueued(false),
|
||||
mViewModeToggleQueued(false)
|
||||
|
@ -66,12 +67,16 @@ namespace MWRender
|
|||
}
|
||||
|
||||
Ogre::Quaternion xr(Ogre::Radian(getPitch() + Ogre::Math::HALF_PI), Ogre::Vector3::UNIT_X);
|
||||
if (!mVanity.enabled && !mPreviewMode) {
|
||||
mCamera->getParentNode()->setOrientation(xr);
|
||||
} else {
|
||||
Ogre::Quaternion orient = xr;
|
||||
if (mVanity.enabled || mPreviewMode) {
|
||||
Ogre::Quaternion zr(Ogre::Radian(getYaw()), Ogre::Vector3::UNIT_Z);
|
||||
mCamera->getParentNode()->setOrientation(zr * xr);
|
||||
orient = zr * xr;
|
||||
}
|
||||
|
||||
if (isFirstPerson())
|
||||
mCamera->getParentNode()->setOrientation(orient);
|
||||
else
|
||||
mCameraNode->setOrientation(orient);
|
||||
}
|
||||
|
||||
const std::string &Camera::getHandle() const
|
||||
|
@ -79,20 +84,40 @@ namespace MWRender
|
|||
return mTrackingPtr.getRefData().getHandle();
|
||||
}
|
||||
|
||||
void Camera::attachTo(const MWWorld::Ptr &ptr)
|
||||
Ogre::SceneNode* Camera::attachTo(const MWWorld::Ptr &ptr)
|
||||
{
|
||||
mTrackingPtr = ptr;
|
||||
Ogre::SceneNode *node = mTrackingPtr.getRefData().getBaseNode()->createChildSceneNode(Ogre::Vector3(0.0f, 0.0f, mHeight));
|
||||
node->setInheritScale(false);
|
||||
Ogre::SceneNode *posNode = node->createChildSceneNode();
|
||||
posNode->setInheritScale(false);
|
||||
if(mCameraNode)
|
||||
{
|
||||
node->setOrientation(mCameraNode->getOrientation());
|
||||
node->setPosition(mCameraNode->getPosition());
|
||||
node->setScale(mCameraNode->getScale());
|
||||
posNode->setPosition(mCameraPosNode->getPosition());
|
||||
mCameraNode->getCreator()->destroySceneNode(mCameraNode);
|
||||
mCameraNode->getCreator()->destroySceneNode(mCameraPosNode);
|
||||
}
|
||||
mCameraNode = node;
|
||||
if(!mCamera->isAttached())
|
||||
mCameraNode->attachObject(mCamera);
|
||||
mCameraPosNode = posNode;
|
||||
|
||||
if (!isFirstPerson())
|
||||
{
|
||||
mCamera->detachFromParent();
|
||||
mCameraPosNode->attachObject(mCamera);
|
||||
}
|
||||
|
||||
return mCameraPosNode;
|
||||
}
|
||||
|
||||
void Camera::setPosition(const Ogre::Vector3& position)
|
||||
{
|
||||
mCameraPosNode->setPosition(position);
|
||||
}
|
||||
|
||||
void Camera::setPosition(float x, float y, float z)
|
||||
{
|
||||
setPosition(Ogre::Vector3(x,y,z));
|
||||
}
|
||||
|
||||
void Camera::updateListener()
|
||||
|
@ -155,9 +180,9 @@ namespace MWRender
|
|||
processViewChange();
|
||||
|
||||
if (mFirstPersonView) {
|
||||
mCamera->setPosition(0.f, 0.f, 0.f);
|
||||
setPosition(0.f, 0.f, 0.f);
|
||||
} else {
|
||||
mCamera->setPosition(0.f, 0.f, mCameraDistance);
|
||||
setPosition(0.f, 0.f, mCameraDistance);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -172,7 +197,7 @@ namespace MWRender
|
|||
{
|
||||
// Changing the view will stop all playing animations, so if we are playing
|
||||
// anything important, queue the view change for later
|
||||
if (!mPreviewMode)
|
||||
if (isFirstPerson() && !mAnimation->upperBodyReady())
|
||||
{
|
||||
mVanityToggleQueued = true;
|
||||
return false;
|
||||
|
@ -191,14 +216,14 @@ namespace MWRender
|
|||
Ogre::Vector3 rot(0.f, 0.f, 0.f);
|
||||
if (mVanity.enabled) {
|
||||
rot.x = Ogre::Degree(-30.f).valueRadians();
|
||||
mMainCam.offset = mCamera->getPosition().z;
|
||||
mMainCam.offset = mCameraPosNode->getPosition().z;
|
||||
} else {
|
||||
rot.x = getPitch();
|
||||
offset = mMainCam.offset;
|
||||
}
|
||||
rot.z = getYaw();
|
||||
|
||||
mCamera->setPosition(0.f, 0.f, offset);
|
||||
setPosition(0.f, 0.f, offset);
|
||||
rotateCamera(rot, false);
|
||||
|
||||
return true;
|
||||
|
@ -215,7 +240,7 @@ namespace MWRender
|
|||
mPreviewMode = enable;
|
||||
processViewChange();
|
||||
|
||||
float offset = mCamera->getPosition().z;
|
||||
float offset = mCameraPosNode->getPosition().z;
|
||||
if (mPreviewMode) {
|
||||
mMainCam.offset = offset;
|
||||
offset = mPreviewCam.offset;
|
||||
|
@ -224,7 +249,7 @@ namespace MWRender
|
|||
offset = mMainCam.offset;
|
||||
}
|
||||
|
||||
mCamera->setPosition(0.f, 0.f, offset);
|
||||
setPosition(0.f, 0.f, offset);
|
||||
}
|
||||
|
||||
void Camera::setSneakOffset(float offset)
|
||||
|
@ -283,7 +308,7 @@ namespace MWRender
|
|||
|
||||
float Camera::getCameraDistance() const
|
||||
{
|
||||
return mCamera->getPosition().z;
|
||||
return mCameraPosNode->getPosition().z;
|
||||
}
|
||||
|
||||
void Camera::setCameraDistance(float dist, bool adjust, bool override)
|
||||
|
@ -295,7 +320,7 @@ namespace MWRender
|
|||
|
||||
Ogre::Vector3 v(0.f, 0.f, dist);
|
||||
if (adjust) {
|
||||
v += mCamera->getPosition();
|
||||
v += mCameraPosNode->getPosition();
|
||||
}
|
||||
if (v.z >= mFurthest) {
|
||||
v.z = mFurthest;
|
||||
|
@ -305,7 +330,7 @@ namespace MWRender
|
|||
v.z = mNearest;
|
||||
mIsNearest = true;
|
||||
}
|
||||
mCamera->setPosition(v);
|
||||
setPosition(v);
|
||||
|
||||
if (override) {
|
||||
if (mVanity.enabled || mPreviewMode) {
|
||||
|
@ -322,9 +347,9 @@ namespace MWRender
|
|||
{
|
||||
if (mDistanceAdjusted) {
|
||||
if (mVanity.enabled || mPreviewMode) {
|
||||
mCamera->setPosition(0, 0, mPreviewCam.offset);
|
||||
setPosition(0, 0, mPreviewCam.offset);
|
||||
} else if (!mFirstPersonView) {
|
||||
mCamera->setPosition(0, 0, mCameraDistance);
|
||||
setPosition(0, 0, mCameraDistance);
|
||||
}
|
||||
}
|
||||
mDistanceAdjusted = false;
|
||||
|
@ -355,10 +380,10 @@ namespace MWRender
|
|||
Ogre::TagPoint *tag = mAnimation->attachObjectToBone("Head", mCamera);
|
||||
tag->setInheritOrientation(false);
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
mAnimation->setViewMode(NpcAnimation::VM_Normal);
|
||||
mCameraNode->attachObject(mCamera);
|
||||
mCameraPosNode->attachObject(mCamera);
|
||||
}
|
||||
rotateCamera(Ogre::Vector3(getPitch(), 0.f, getYaw()), false);
|
||||
}
|
||||
|
@ -368,8 +393,7 @@ namespace MWRender
|
|||
mCamera->getParentSceneNode()->needUpdate(true);
|
||||
|
||||
camera = mCamera->getRealPosition();
|
||||
focal = Ogre::Vector3((mCamera->getParentNode()->_getFullTransform() *
|
||||
Ogre::Vector4(0.0f, 0.0f, 0.0f, 1.0f)).ptr());
|
||||
focal = mCameraNode->_getDerivedPosition();
|
||||
}
|
||||
|
||||
void Camera::togglePlayerLooking(bool enable)
|
||||
|
|
|
@ -27,6 +27,7 @@ namespace MWRender
|
|||
|
||||
Ogre::Camera *mCamera;
|
||||
Ogre::SceneNode *mCameraNode;
|
||||
Ogre::SceneNode *mCameraPosNode;
|
||||
|
||||
NpcAnimation *mAnimation;
|
||||
|
||||
|
@ -52,6 +53,9 @@ namespace MWRender
|
|||
/// Updates sound manager listener data
|
||||
void updateListener();
|
||||
|
||||
void setPosition(const Ogre::Vector3& position);
|
||||
void setPosition(float x, float y, float z);
|
||||
|
||||
public:
|
||||
Camera(Ogre::Camera *camera);
|
||||
~Camera();
|
||||
|
@ -72,7 +76,7 @@ namespace MWRender
|
|||
const std::string &getHandle() const;
|
||||
|
||||
/// Attach camera to object
|
||||
void attachTo(const MWWorld::Ptr &);
|
||||
Ogre::SceneNode* attachTo(const MWWorld::Ptr &);
|
||||
|
||||
/// @param Force view mode switch, even if currently not allowed by the animation.
|
||||
void toggleViewMode(bool force=false);
|
||||
|
|
|
@ -25,7 +25,7 @@ using namespace MWRender;
|
|||
using namespace Ogre;
|
||||
|
||||
LocalMap::LocalMap(OEngine::Render::OgreRenderer* rend, MWRender::RenderingManager* rendering) :
|
||||
mInterior(false), mCellX(0), mCellY(0)
|
||||
mInterior(false)
|
||||
{
|
||||
mRendering = rend;
|
||||
mRenderingManager = rendering;
|
||||
|
@ -522,10 +522,9 @@ void LocalMap::updatePlayer (const Ogre::Vector3& position, const Ogre::Quaterni
|
|||
{
|
||||
x = std::ceil(pos.x / sSize)-1;
|
||||
y = std::ceil(pos.y / sSize)-1;
|
||||
mCellX = x;
|
||||
mCellY = y;
|
||||
}
|
||||
MWBase::Environment::get().getWindowManager()->setActiveMap(x,y,mInterior);
|
||||
else
|
||||
MWBase::Environment::get().getWindowManager()->setActiveMap(x,y,mInterior);
|
||||
|
||||
// convert from world coordinates to texture UV coordinates
|
||||
std::string texBaseName;
|
||||
|
@ -540,7 +539,7 @@ void LocalMap::updatePlayer (const Ogre::Vector3& position, const Ogre::Quaterni
|
|||
texBaseName = mInteriorName + "_";
|
||||
}
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->setPlayerPos(u, v);
|
||||
MWBase::Environment::get().getWindowManager()->setPlayerPos(x, y, u, v);
|
||||
MWBase::Environment::get().getWindowManager()->setPlayerDir(playerdirection.x, playerdirection.y);
|
||||
|
||||
// explore radius (squared)
|
||||
|
|
|
@ -134,7 +134,6 @@ namespace MWRender
|
|||
Ogre::RenderTarget* mRenderTarget;
|
||||
|
||||
bool mInterior;
|
||||
int mCellX, mCellY;
|
||||
Ogre::AxisAlignedBox mBounds;
|
||||
std::string mInteriorName;
|
||||
};
|
||||
|
|
|
@ -63,6 +63,7 @@ RenderingManager::RenderingManager(OEngine::Render::OgreRenderer& _rend, const b
|
|||
, mPhysicsEngine(engine)
|
||||
, mTerrain(NULL)
|
||||
, mEffectManager(NULL)
|
||||
, mRenderWorld(true)
|
||||
{
|
||||
mActors = new MWRender::Actors(mRendering, this);
|
||||
mObjects = new MWRender::Objects(mRendering);
|
||||
|
@ -232,6 +233,15 @@ bool RenderingManager::toggleWater()
|
|||
return mWater->toggle();
|
||||
}
|
||||
|
||||
bool RenderingManager::toggleWorld()
|
||||
{
|
||||
mRenderWorld = !mRenderWorld;
|
||||
|
||||
int visibilityMask = mRenderWorld ? ~int(0) : 0;
|
||||
mRendering.getViewport()->setVisibilityMask(visibilityMask);
|
||||
return mRenderWorld;
|
||||
}
|
||||
|
||||
void RenderingManager::cellAdded (MWWorld::CellStore *store)
|
||||
{
|
||||
if (store->isExterior())
|
||||
|
@ -302,7 +312,7 @@ void RenderingManager::updatePlayerPtr(const MWWorld::Ptr &ptr)
|
|||
if(mPlayerAnimation)
|
||||
mPlayerAnimation->updatePtr(ptr);
|
||||
if(mCamera->getHandle() == ptr.getRefData().getHandle())
|
||||
mCamera->attachTo(ptr);
|
||||
attachCameraTo(ptr);
|
||||
}
|
||||
|
||||
void RenderingManager::rebuildPtr(const MWWorld::Ptr &ptr)
|
||||
|
@ -317,7 +327,7 @@ void RenderingManager::rebuildPtr(const MWWorld::Ptr &ptr)
|
|||
anim->rebuild();
|
||||
if(mCamera->getHandle() == ptr.getRefData().getHandle())
|
||||
{
|
||||
mCamera->attachTo(ptr);
|
||||
attachCameraTo(ptr);
|
||||
mCamera->setAnimation(anim);
|
||||
}
|
||||
}
|
||||
|
@ -489,7 +499,7 @@ bool RenderingManager::toggleRenderMode(int mode)
|
|||
}
|
||||
}
|
||||
|
||||
void RenderingManager::configureFog(MWWorld::CellStore &mCell)
|
||||
void RenderingManager::configureFog(const MWWorld::CellStore &mCell)
|
||||
{
|
||||
Ogre::ColourValue color;
|
||||
color.setAsABGR (mCell.getCell()->mAmbi.mFog);
|
||||
|
@ -500,7 +510,7 @@ void RenderingManager::configureFog(MWWorld::CellStore &mCell)
|
|||
void RenderingManager::configureFog(const float density, const Ogre::ColourValue& colour)
|
||||
{
|
||||
mFogColour = colour;
|
||||
float max = Settings::Manager::getFloat("max viewing distance", "Viewing distance");
|
||||
float max = Settings::Manager::getFloat("viewing distance", "Viewing distance");
|
||||
|
||||
if (density == 0)
|
||||
{
|
||||
|
@ -732,7 +742,7 @@ void RenderingManager::processChangedSettings(const Settings::CategorySettingVec
|
|||
{
|
||||
setMenuTransparency(Settings::Manager::getFloat("menu transparency", "GUI"));
|
||||
}
|
||||
else if (it->second == "max viewing distance" && it->first == "Viewing distance")
|
||||
else if (it->second == "viewing distance" && it->first == "Viewing distance")
|
||||
{
|
||||
if (!MWBase::Environment::get().getWorld()->isCellExterior() && !MWBase::Environment::get().getWorld()->isCellQuasiExterior()
|
||||
&& MWBase::Environment::get().getWorld()->getPlayerPtr().mCell)
|
||||
|
@ -859,7 +869,13 @@ void RenderingManager::getTriangleBatchCount(unsigned int &triangles, unsigned i
|
|||
void RenderingManager::setupPlayer(const MWWorld::Ptr &ptr)
|
||||
{
|
||||
ptr.getRefData().setBaseNode(mRendering.getScene()->getSceneNode("player"));
|
||||
mCamera->attachTo(ptr);
|
||||
attachCameraTo(ptr);
|
||||
}
|
||||
|
||||
void RenderingManager::attachCameraTo(const MWWorld::Ptr &ptr)
|
||||
{
|
||||
Ogre::SceneNode* cameraNode = mCamera->attachTo(ptr);
|
||||
mSkyManager->attachToNode(cameraNode);
|
||||
}
|
||||
|
||||
void RenderingManager::renderPlayer(const MWWorld::Ptr &ptr)
|
||||
|
|
|
@ -123,6 +123,7 @@ public:
|
|||
|
||||
void setWaterHeight(const float height);
|
||||
bool toggleWater();
|
||||
bool toggleWorld();
|
||||
|
||||
/// Updates object rendering after cell change
|
||||
/// \param old Object reference in previous cell
|
||||
|
@ -182,7 +183,7 @@ public:
|
|||
///< request the local map for a cell
|
||||
|
||||
/// configure fog according to cell
|
||||
void configureFog(MWWorld::CellStore &mCell);
|
||||
void configureFog(const MWWorld::CellStore &mCell);
|
||||
|
||||
/// configure fog manually
|
||||
void configureFog(const float density, const Ogre::ColourValue& colour);
|
||||
|
@ -220,6 +221,8 @@ private:
|
|||
void setAmbientMode();
|
||||
void applyFog(bool underwater);
|
||||
|
||||
void attachCameraTo(const MWWorld::Ptr& ptr);
|
||||
|
||||
void setMenuTransparency(float val);
|
||||
|
||||
bool mSunEnabled;
|
||||
|
@ -266,6 +269,8 @@ private:
|
|||
MWRender::LocalMap* mLocalMap;
|
||||
|
||||
MWRender::Shadows* mShadows;
|
||||
|
||||
bool mRenderWorld;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -382,9 +382,7 @@ void SkyManager::clearRain()
|
|||
for (std::map<Ogre::SceneNode*, NifOgre::ObjectScenePtr>::iterator it = mRainModels.begin(); it != mRainModels.end();)
|
||||
{
|
||||
it->second.setNull();
|
||||
Ogre::SceneNode* parent = it->first->getParentSceneNode();
|
||||
mSceneMgr->destroySceneNode(it->first);
|
||||
mSceneMgr->destroySceneNode(parent);
|
||||
mRainModels.erase(it++);
|
||||
}
|
||||
}
|
||||
|
@ -402,9 +400,7 @@ void SkyManager::updateRain(float dt)
|
|||
if (pos.z < -minHeight)
|
||||
{
|
||||
it->second.setNull();
|
||||
Ogre::SceneNode* parent = it->first->getParentSceneNode();
|
||||
mSceneMgr->destroySceneNode(it->first);
|
||||
mSceneMgr->destroySceneNode(parent);
|
||||
mRainModels.erase(it++);
|
||||
}
|
||||
else
|
||||
|
@ -420,17 +416,20 @@ void SkyManager::updateRain(float dt)
|
|||
{
|
||||
mRainTimer = 0;
|
||||
|
||||
// TODO: handle rain settings from Morrowind.ini
|
||||
const float rangeRandom = 100;
|
||||
float xOffs = (std::rand()/(RAND_MAX+1.0)) * rangeRandom - (rangeRandom/2);
|
||||
float yOffs = (std::rand()/(RAND_MAX+1.0)) * rangeRandom - (rangeRandom/2);
|
||||
Ogre::SceneNode* sceneNode = mCamera->getParentSceneNode()->createChildSceneNode();
|
||||
sceneNode->setInheritOrientation(false);
|
||||
|
||||
// Create a separate node to control the offset, since a node with setInheritOrientation(false) will still
|
||||
// consider the orientation of the parent node for its position, just not for its orientation
|
||||
float startHeight = 700;
|
||||
Ogre::SceneNode* offsetNode = sceneNode->createChildSceneNode(Ogre::Vector3(xOffs,yOffs,startHeight));
|
||||
Ogre::SceneNode* offsetNode = mParticleNode->createChildSceneNode(Ogre::Vector3(xOffs,yOffs,startHeight));
|
||||
|
||||
// Spawn a new rain object for each instance.
|
||||
// TODO: this is inefficient. We could try to use an Ogre::ParticleSystem instead, but then we would need to make assumptions
|
||||
// about the rain meshes being Quads and their dimensions.
|
||||
// Or we could clone meshes into one vertex buffer manually.
|
||||
NifOgre::ObjectScenePtr objects = NifOgre::Loader::createObjects(offsetNode, mRainEffect);
|
||||
for (unsigned int i=0; i<objects->mEntities.size(); ++i)
|
||||
{
|
||||
|
@ -562,12 +561,6 @@ void SkyManager::setWeather(const MWWorld::WeatherResult& weather)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (!mParticleNode)
|
||||
{
|
||||
mParticleNode = mCamera->getParentSceneNode()->createChildSceneNode();
|
||||
mParticleNode->setInheritOrientation(false);
|
||||
}
|
||||
|
||||
mParticle = NifOgre::Loader::createObjects(mParticleNode, mCurrentParticleEffect);
|
||||
for(size_t i = 0; i < mParticle->mParticles.size(); ++i)
|
||||
{
|
||||
|
@ -783,3 +776,16 @@ void SkyManager::setGlareEnabled (bool enabled)
|
|||
return;
|
||||
mSunGlare->setVisible (mSunEnabled && enabled);
|
||||
}
|
||||
|
||||
void SkyManager::attachToNode(SceneNode *sceneNode)
|
||||
{
|
||||
if (!mParticleNode)
|
||||
{
|
||||
mParticleNode = sceneNode->createChildSceneNode();
|
||||
mParticleNode->setInheritOrientation(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
sceneNode->addChild(mParticleNode);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -116,6 +116,9 @@ namespace MWRender
|
|||
SkyManager(Ogre::SceneNode* root, Ogre::Camera* pCamera);
|
||||
~SkyManager();
|
||||
|
||||
/// Attach weather particle effects to this scene node (should be the Camera's parent node)
|
||||
void attachToNode(Ogre::SceneNode* sceneNode);
|
||||
|
||||
void update(float duration);
|
||||
|
||||
void enable();
|
||||
|
|
|
@ -432,5 +432,6 @@ op 0x20002ac-0x20002c3: SetMagicEffect, explicit
|
|||
op 0x20002c4-0x20002db: ModMagicEffect
|
||||
op 0x20002dc-0x20002f3: ModMagicEffect, explicit
|
||||
op 0x20002f4: ResetActors
|
||||
op 0x20002f5: ToggleWorld
|
||||
|
||||
opcodes 0x20002f5-0x3ffffff unused
|
||||
opcodes 0x20002f6-0x3ffffff unused
|
||||
|
|
|
@ -290,6 +290,17 @@ namespace MWScript
|
|||
}
|
||||
};
|
||||
|
||||
class OpToggleWorld : public Interpreter::Opcode0
|
||||
{
|
||||
public:
|
||||
|
||||
virtual void execute (Interpreter::Runtime& runtime)
|
||||
{
|
||||
runtime.getContext().report(MWBase::Environment::get().getWorld()->toggleWorld() ? "World -> On"
|
||||
: "World -> Off");
|
||||
}
|
||||
};
|
||||
|
||||
class OpDontSaveObject : public Interpreter::Opcode0
|
||||
{
|
||||
public:
|
||||
|
@ -979,6 +990,7 @@ namespace MWScript
|
|||
interpreter.installSegment5 (Compiler::Misc::opcodeFadeTo, new OpFadeTo);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeTogglePathgrid, new OpTogglePathgrid);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeToggleWater, new OpToggleWater);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeToggleWorld, new OpToggleWorld);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeDontSaveObject, new OpDontSaveObject);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeToggleVanityMode, new OpToggleVanityMode);
|
||||
interpreter.installSegment5 (Compiler::Misc::opcodeGetPcSleep, new OpGetPcSleep);
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
#include <components/nif/niffile.hpp>
|
||||
|
||||
#include "../mwbase/environment.hpp"
|
||||
#include "../mwbase/world.hpp" /// FIXME
|
||||
#include "../mwbase/world.hpp"
|
||||
#include "../mwbase/soundmanager.hpp"
|
||||
#include "../mwbase/mechanicsmanager.hpp"
|
||||
#include "../mwbase/windowmanager.hpp"
|
||||
|
@ -117,6 +117,28 @@ namespace MWWorld
|
|||
}
|
||||
}
|
||||
|
||||
void Scene::getGridCenter(int &cellX, int &cellY)
|
||||
{
|
||||
int maxX = std::numeric_limits<int>().min();
|
||||
int maxY = std::numeric_limits<int>().min();
|
||||
int minX = std::numeric_limits<int>().max();
|
||||
int minY = std::numeric_limits<int>().max();
|
||||
CellStoreCollection::iterator iter = mActiveCells.begin();
|
||||
while (iter!=mActiveCells.end())
|
||||
{
|
||||
assert ((*iter)->getCell()->isExterior());
|
||||
int x = (*iter)->getCell()->getGridX();
|
||||
int y = (*iter)->getCell()->getGridY();
|
||||
maxX = std::max(x, maxX);
|
||||
maxY = std::max(y, maxY);
|
||||
minX = std::min(x, minX);
|
||||
minY = std::min(y, minY);
|
||||
++iter;
|
||||
}
|
||||
cellX = (minX + maxX) / 2;
|
||||
cellY = (minY + maxY) / 2;
|
||||
}
|
||||
|
||||
void Scene::update (float duration, bool paused)
|
||||
{
|
||||
if (mNeedMapUpdate)
|
||||
|
@ -126,6 +148,13 @@ namespace MWWorld
|
|||
for (CellStoreCollection::iterator active = mActiveCells.begin(); active!=mActiveCells.end(); ++active)
|
||||
mRendering.requestMap(*active);
|
||||
mNeedMapUpdate = false;
|
||||
|
||||
if (mCurrentCell->isExterior())
|
||||
{
|
||||
int cellX, cellY;
|
||||
getGridCenter(cellX, cellY);
|
||||
MWBase::Environment::get().getWindowManager()->setActiveMap(cellX,cellY,false);
|
||||
}
|
||||
}
|
||||
|
||||
mRendering.update (duration, paused);
|
||||
|
@ -213,41 +242,6 @@ namespace MWWorld
|
|||
MWBase::Environment::get().getWorld()->getLocalScripts().addCell (cell);
|
||||
}
|
||||
|
||||
void Scene::playerCellChange(CellStore *cell, const ESM::Position& pos, bool adjustPlayerPos)
|
||||
{
|
||||
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||
MWWorld::Ptr old = world->getPlayerPtr();
|
||||
world->getPlayer().setCell(cell);
|
||||
|
||||
MWWorld::Ptr player = world->getPlayerPtr();
|
||||
mRendering.updatePlayerPtr(player);
|
||||
|
||||
if (adjustPlayerPos) {
|
||||
world->moveObject(player, pos.pos[0], pos.pos[1], pos.pos[2]);
|
||||
|
||||
float x = Ogre::Radian(pos.rot[0]).valueDegrees();
|
||||
float y = Ogre::Radian(pos.rot[1]).valueDegrees();
|
||||
float z = Ogre::Radian(pos.rot[2]).valueDegrees();
|
||||
world->rotateObject(player, x, y, z);
|
||||
|
||||
player.getClass().adjustPosition(player, true);
|
||||
}
|
||||
|
||||
MWBase::MechanicsManager *mechMgr =
|
||||
MWBase::Environment::get().getMechanicsManager();
|
||||
|
||||
mechMgr->updateCell(old, player);
|
||||
mechMgr->watchActor(player);
|
||||
|
||||
mRendering.updateTerrain();
|
||||
|
||||
// Delay the map update until scripts have been given a chance to run.
|
||||
// If we don't do this, objects that should be disabled will still appear on the map.
|
||||
mNeedMapUpdate = true;
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->changeCell(mCurrentCell);
|
||||
}
|
||||
|
||||
void Scene::changeToVoid()
|
||||
{
|
||||
CellStoreCollection::iterator active = mActiveCells.begin();
|
||||
|
@ -257,7 +251,28 @@ namespace MWWorld
|
|||
mCurrentCell = NULL;
|
||||
}
|
||||
|
||||
void Scene::changeCell (int X, int Y, const ESM::Position& position, bool adjustPlayerPos)
|
||||
void Scene::playerMoved(const Ogre::Vector3 &pos)
|
||||
{
|
||||
if (!mCurrentCell || !mCurrentCell->isExterior())
|
||||
return;
|
||||
|
||||
// figure out the center of the current cell grid (*not* necessarily mCurrentCell, which is the cell the player is in)
|
||||
int cellX, cellY;
|
||||
getGridCenter(cellX, cellY);
|
||||
float centerX, centerY;
|
||||
MWBase::Environment::get().getWorld()->indexToPosition(cellX, cellY, centerX, centerY, true);
|
||||
const float maxDistance = 8192/2 + 1024; // 1/2 cell size + threshold
|
||||
float distance = std::max(std::abs(centerX-pos.x), std::abs(centerY-pos.y));
|
||||
if (distance > maxDistance)
|
||||
{
|
||||
int newX, newY;
|
||||
MWBase::Environment::get().getWorld()->positionToIndex(pos.x, pos.y, newX, newY);
|
||||
changeCellGrid(newX, newY);
|
||||
mRendering.updateTerrain();
|
||||
}
|
||||
}
|
||||
|
||||
void Scene::changeCellGrid (int X, int Y)
|
||||
{
|
||||
Loading::Listener* loadingListener = MWBase::Environment::get().getWindowManager()->getLoadingScreen();
|
||||
Loading::ScopedLoad load(loadingListener);
|
||||
|
@ -286,6 +301,7 @@ namespace MWWorld
|
|||
int refsToLoad = 0;
|
||||
// get the number of refs to load
|
||||
for (int x=X-1; x<=X+1; ++x)
|
||||
{
|
||||
for (int y=Y-1; y<=Y+1; ++y)
|
||||
{
|
||||
CellStoreCollection::iterator iter = mActiveCells.begin();
|
||||
|
@ -304,11 +320,13 @@ namespace MWWorld
|
|||
if (iter==mActiveCells.end())
|
||||
refsToLoad += MWBase::Environment::get().getWorld()->getExterior(x, y)->count();
|
||||
}
|
||||
}
|
||||
|
||||
loadingListener->setProgressRange(refsToLoad);
|
||||
|
||||
// Load cells
|
||||
for (int x=X-1; x<=X+1; ++x)
|
||||
{
|
||||
for (int y=Y-1; y<=Y+1; ++y)
|
||||
{
|
||||
CellStoreCollection::iterator iter = mActiveCells.begin();
|
||||
|
@ -331,32 +349,47 @@ namespace MWWorld
|
|||
loadCell (cell, loadingListener);
|
||||
}
|
||||
}
|
||||
|
||||
// find current cell
|
||||
CellStoreCollection::iterator iter = mActiveCells.begin();
|
||||
|
||||
while (iter!=mActiveCells.end())
|
||||
{
|
||||
assert ((*iter)->getCell()->isExterior());
|
||||
|
||||
if (X==(*iter)->getCell()->getGridX() &&
|
||||
Y==(*iter)->getCell()->getGridY())
|
||||
break;
|
||||
|
||||
++iter;
|
||||
}
|
||||
|
||||
assert (iter!=mActiveCells.end());
|
||||
|
||||
mCurrentCell = *iter;
|
||||
|
||||
// adjust player
|
||||
playerCellChange (mCurrentCell, position, adjustPlayerPos);
|
||||
|
||||
// Sky system
|
||||
MWBase::Environment::get().getWorld()->adjustSky();
|
||||
CellStore* current = MWBase::Environment::get().getWorld()->getExterior(X,Y);
|
||||
MWBase::Environment::get().getWindowManager()->changeCell(current);
|
||||
|
||||
mCellChanged = true;
|
||||
|
||||
// Delay the map update until scripts have been given a chance to run.
|
||||
// If we don't do this, objects that should be disabled will still appear on the map.
|
||||
mNeedMapUpdate = true;
|
||||
}
|
||||
|
||||
void Scene::changePlayerCell(CellStore *cell, const ESM::Position &pos, bool adjustPlayerPos)
|
||||
{
|
||||
mCurrentCell = cell;
|
||||
|
||||
MWBase::World *world = MWBase::Environment::get().getWorld();
|
||||
MWWorld::Ptr old = world->getPlayerPtr();
|
||||
world->getPlayer().setCell(cell);
|
||||
|
||||
MWWorld::Ptr player = world->getPlayerPtr();
|
||||
mRendering.updatePlayerPtr(player);
|
||||
|
||||
if (adjustPlayerPos) {
|
||||
world->moveObject(player, pos.pos[0], pos.pos[1], pos.pos[2]);
|
||||
|
||||
float x = Ogre::Radian(pos.rot[0]).valueDegrees();
|
||||
float y = Ogre::Radian(pos.rot[1]).valueDegrees();
|
||||
float z = Ogre::Radian(pos.rot[2]).valueDegrees();
|
||||
world->rotateObject(player, x, y, z);
|
||||
|
||||
player.getClass().adjustPosition(player, true);
|
||||
}
|
||||
|
||||
MWBase::MechanicsManager *mechMgr =
|
||||
MWBase::Environment::get().getMechanicsManager();
|
||||
|
||||
mechMgr->updateCell(old, player);
|
||||
mechMgr->watchActor(player);
|
||||
|
||||
MWBase::Environment::get().getWorld()->adjustSky();
|
||||
}
|
||||
|
||||
//We need the ogre renderer and a scene node.
|
||||
|
@ -427,33 +460,39 @@ namespace MWWorld
|
|||
// Load cell.
|
||||
std::cout << "cellName: " << cell->getCell()->mName << std::endl;
|
||||
|
||||
//Loading Interior loading text
|
||||
|
||||
loadCell (cell, loadingListener);
|
||||
|
||||
mCurrentCell = cell;
|
||||
changePlayerCell(cell, position, true);
|
||||
|
||||
// adjust fog
|
||||
mRendering.configureFog(*mCurrentCell);
|
||||
|
||||
// adjust player
|
||||
playerCellChange (mCurrentCell, position);
|
||||
|
||||
// Sky system
|
||||
MWBase::Environment::get().getWorld()->adjustSky();
|
||||
|
||||
mCellChanged = true;
|
||||
MWBase::Environment::get().getWindowManager()->fadeScreenIn(0.5);
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->changeCell(mCurrentCell);
|
||||
|
||||
// Delay the map update until scripts have been given a chance to run.
|
||||
// If we don't do this, objects that should be disabled will still appear on the map.
|
||||
mNeedMapUpdate = true;
|
||||
}
|
||||
|
||||
void Scene::changeToExteriorCell (const ESM::Position& position)
|
||||
void Scene::changeToExteriorCell (const ESM::Position& position, bool adjustPlayerPos)
|
||||
{
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
|
||||
MWBase::Environment::get().getWorld()->positionToIndex (position.pos[0], position.pos[1], x, y);
|
||||
|
||||
changeCell (x, y, position, true);
|
||||
changeCellGrid(x, y);
|
||||
|
||||
CellStore* current = MWBase::Environment::get().getWorld()->getExterior(x, y);
|
||||
changePlayerCell(current, position, adjustPlayerPos);
|
||||
|
||||
mRendering.updateTerrain();
|
||||
}
|
||||
|
||||
CellStore* Scene::getCurrentCell ()
|
||||
|
|
|
@ -60,11 +60,13 @@ namespace MWWorld
|
|||
|
||||
bool mNeedMapUpdate;
|
||||
|
||||
void playerCellChange (CellStore *cell, const ESM::Position& position,
|
||||
bool adjustPlayerPos = true);
|
||||
|
||||
void insertCell (CellStore &cell, bool rescale, Loading::Listener* loadingListener);
|
||||
|
||||
// Load and unload cells as necessary to create a cell grid with "X" and "Y" in the center
|
||||
void changeCellGrid (int X, int Y);
|
||||
|
||||
void getGridCenter(int& cellX, int& cellY);
|
||||
|
||||
public:
|
||||
|
||||
Scene (MWRender::RenderingManager& rendering, PhysicsSystem *physics);
|
||||
|
@ -75,19 +77,21 @@ namespace MWWorld
|
|||
|
||||
void loadCell (CellStore *cell, Loading::Listener* loadingListener);
|
||||
|
||||
void changeCell (int X, int Y, const ESM::Position& position, bool adjustPlayerPos);
|
||||
void playerMoved (const Ogre::Vector3& pos);
|
||||
|
||||
CellStore* getCurrentCell ();
|
||||
void changePlayerCell (CellStore* newCell, const ESM::Position& position, bool adjustPlayerPos);
|
||||
|
||||
CellStore *getCurrentCell();
|
||||
|
||||
const CellStoreCollection& getActiveCells () const;
|
||||
|
||||
bool hasCellChanged() const;
|
||||
///< Has the player moved to a different cell, since the last frame?
|
||||
///< Has the set of active cells changed, since the last frame?
|
||||
|
||||
void changeToInteriorCell (const std::string& cellName, const ESM::Position& position);
|
||||
///< Move to interior cell.
|
||||
|
||||
void changeToExteriorCell (const ESM::Position& position);
|
||||
void changeToExteriorCell (const ESM::Position& position, bool adjustPlayerPos);
|
||||
///< Move to exterior cell.
|
||||
|
||||
void changeToVoid();
|
||||
|
|
|
@ -241,7 +241,7 @@ namespace MWWorld
|
|||
pos.rot[0] = 0;
|
||||
pos.rot[1] = 0;
|
||||
pos.rot[2] = 0;
|
||||
mWorldScene->changeToExteriorCell(pos);
|
||||
mWorldScene->changeToExteriorCell(pos, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -920,7 +920,7 @@ namespace MWWorld
|
|||
mRendering->notifyWorldSpaceChanged();
|
||||
}
|
||||
removeContainerScripts(getPlayerPtr());
|
||||
mWorldScene->changeToExteriorCell(position);
|
||||
mWorldScene->changeToExteriorCell(position, true);
|
||||
addContainerScripts(getPlayerPtr(), getPlayerPtr().getCell());
|
||||
}
|
||||
|
||||
|
@ -1057,9 +1057,10 @@ namespace MWWorld
|
|||
changeToInteriorCell(Misc::StringUtils::lowerCase(newCell->getCell()->mName), pos);
|
||||
else
|
||||
{
|
||||
int cellX = newCell->getCell()->getGridX();
|
||||
int cellY = newCell->getCell()->getGridY();
|
||||
mWorldScene->changeCell(cellX, cellY, pos, false);
|
||||
if (mWorldScene->isCellActive(*newCell))
|
||||
mWorldScene->changePlayerCell(newCell, pos, false);
|
||||
else
|
||||
mWorldScene->changeToExteriorCell(pos, false);
|
||||
}
|
||||
addContainerScripts (getPlayerPtr(), newCell);
|
||||
}
|
||||
|
@ -1120,6 +1121,10 @@ namespace MWWorld
|
|||
mRendering->moveObject(ptr, vec);
|
||||
mPhysics->moveObject (ptr);
|
||||
}
|
||||
if (isPlayer)
|
||||
{
|
||||
mWorldScene->playerMoved (vec);
|
||||
}
|
||||
}
|
||||
|
||||
bool World::moveObjectImp(const Ptr& ptr, float x, float y, float z)
|
||||
|
@ -1565,7 +1570,7 @@ namespace MWWorld
|
|||
|
||||
bool World::isCellExterior() const
|
||||
{
|
||||
CellStore *currentCell = mWorldScene->getCurrentCell();
|
||||
const CellStore *currentCell = mWorldScene->getCurrentCell();
|
||||
if (currentCell)
|
||||
{
|
||||
return currentCell->getCell()->isExterior();
|
||||
|
@ -1575,7 +1580,7 @@ namespace MWWorld
|
|||
|
||||
bool World::isCellQuasiExterior() const
|
||||
{
|
||||
CellStore *currentCell = mWorldScene->getCurrentCell();
|
||||
const CellStore *currentCell = mWorldScene->getCurrentCell();
|
||||
if (currentCell)
|
||||
{
|
||||
if (!(currentCell->getCell()->mData.mFlags & ESM::Cell::QuasiEx))
|
||||
|
@ -1663,6 +1668,11 @@ namespace MWWorld
|
|||
return mRendering->toggleWater();
|
||||
}
|
||||
|
||||
bool World::toggleWorld()
|
||||
{
|
||||
return mRendering->toggleWorld();
|
||||
}
|
||||
|
||||
void World::PCDropped (const Ptr& item)
|
||||
{
|
||||
std::string script = item.getClass().getScript(item);
|
||||
|
|
|
@ -180,6 +180,7 @@ namespace MWWorld
|
|||
virtual void setWaterHeight(const float height);
|
||||
|
||||
virtual bool toggleWater();
|
||||
virtual bool toggleWorld();
|
||||
|
||||
virtual void adjustSky();
|
||||
|
||||
|
@ -197,7 +198,7 @@ namespace MWWorld
|
|||
virtual LocalScripts& getLocalScripts();
|
||||
|
||||
virtual bool hasCellChanged() const;
|
||||
///< Has the player moved to a different cell, since the last frame?
|
||||
///< Has the set of active cells changed, since the last frame?
|
||||
|
||||
virtual bool isCellExterior() const;
|
||||
|
||||
|
|
|
@ -256,6 +256,8 @@ namespace Compiler
|
|||
extensions.registerInstruction ("fadeto", "ff", opcodeFadeTo);
|
||||
extensions.registerInstruction ("togglewater", "", opcodeToggleWater);
|
||||
extensions.registerInstruction ("twa", "", opcodeToggleWater);
|
||||
extensions.registerInstruction ("toggleworld", "", opcodeToggleWorld);
|
||||
extensions.registerInstruction ("tw", "", opcodeToggleWorld);
|
||||
extensions.registerInstruction ("togglepathgrid", "", opcodeTogglePathgrid);
|
||||
extensions.registerInstruction ("tpg", "", opcodeTogglePathgrid);
|
||||
extensions.registerInstruction ("dontsaveobject", "", opcodeDontSaveObject);
|
||||
|
|
|
@ -212,6 +212,7 @@ namespace Compiler
|
|||
const int opcodeFadeOut = 0x200013d;
|
||||
const int opcodeFadeTo = 0x200013e;
|
||||
const int opcodeToggleWater = 0x2000144;
|
||||
const int opcodeToggleWorld = 0x20002f5;
|
||||
const int opcodeTogglePathgrid = 0x2000146;
|
||||
const int opcodeDontSaveObject = 0x2000153;
|
||||
const int opcodeToggleVanityMode = 0x2000174;
|
||||
|
|
|
@ -20,4 +20,12 @@ void SpellList::save(ESMWriter &esm) const
|
|||
}
|
||||
}
|
||||
|
||||
bool SpellList::exists(const std::string &spell) const
|
||||
{
|
||||
for (std::vector<std::string>::const_iterator it = mList.begin(); it != mList.end(); ++it)
|
||||
if (Misc::StringUtils::ciEqual(*it, spell))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -16,6 +16,9 @@ namespace ESM
|
|||
{
|
||||
std::vector<std::string> mList;
|
||||
|
||||
/// Is this spell ID in mList?
|
||||
bool exists(const std::string& spell) const;
|
||||
|
||||
void load(ESMReader &esm);
|
||||
void save(ESMWriter &esm) const;
|
||||
};
|
||||
|
|
|
@ -73,38 +73,6 @@ namespace
|
|||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
// Ogre::AxisAlignedBox::distance is broken in 1.8.
|
||||
Ogre::Real distance(const Ogre::AxisAlignedBox& box, const Ogre::Vector3& v)
|
||||
{
|
||||
|
||||
if (box.contains(v))
|
||||
return 0;
|
||||
else
|
||||
{
|
||||
Ogre::Vector3 maxDist(0,0,0);
|
||||
const Ogre::Vector3& minimum = box.getMinimum();
|
||||
const Ogre::Vector3& maximum = box.getMaximum();
|
||||
|
||||
if (v.x < minimum.x)
|
||||
maxDist.x = minimum.x - v.x;
|
||||
else if (v.x > maximum.x)
|
||||
maxDist.x = v.x - maximum.x;
|
||||
|
||||
if (v.y < minimum.y)
|
||||
maxDist.y = minimum.y - v.y;
|
||||
else if (v.y > maximum.y)
|
||||
maxDist.y = v.y - maximum.y;
|
||||
|
||||
if (v.z < minimum.z)
|
||||
maxDist.z = minimum.z - v.z;
|
||||
else if (v.z > maximum.z)
|
||||
maxDist.z = v.z - maximum.z;
|
||||
|
||||
return maxDist.length();
|
||||
}
|
||||
}
|
||||
|
||||
// Create a 2D quad
|
||||
void makeQuad(Ogre::SceneManager* sceneMgr, float left, float top, float right, float bottom, Ogre::MaterialPtr material)
|
||||
{
|
||||
|
@ -270,7 +238,7 @@ bool QuadTreeNode::update(const Ogre::Vector3 &cameraPos)
|
|||
if (mBounds.isNull())
|
||||
return true;
|
||||
|
||||
float dist = distance(mWorldBounds, cameraPos);
|
||||
float dist = mWorldBounds.distance(cameraPos);
|
||||
|
||||
// Make sure our scene node is attached
|
||||
if (!mSceneNode->isInSceneGraph())
|
||||
|
|
4
extern/oics/ICSInputControlSystem.h
vendored
4
extern/oics/ICSInputControlSystem.h
vendored
|
@ -119,9 +119,11 @@ namespace ICS
|
|||
//bool sliderMoved(const OIS::JoyStickEvent &evt, int index);
|
||||
|
||||
void addKeyBinding(Control* control, SDL_Scancode key, Control::ControlChangingDirection direction);
|
||||
bool isKeyBound(SDL_Scancode key) const;
|
||||
void addMouseAxisBinding(Control* control, NamedAxis axis, Control::ControlChangingDirection direction);
|
||||
void addMouseButtonBinding(Control* control, unsigned int button, Control::ControlChangingDirection direction);
|
||||
void addJoystickAxisBinding(Control* control, int deviceId, int axis, Control::ControlChangingDirection direction);
|
||||
bool isMouseButtonBound(unsigned int button) const;
|
||||
void addJoystickAxisBinding(Control* control, int deviceId, int axis, Control::ControlChangingDirection direction);
|
||||
void addJoystickButtonBinding(Control* control, int deviceId, unsigned int button, Control::ControlChangingDirection direction);
|
||||
void addJoystickPOVBinding(Control* control, int deviceId, int index, POVAxis axis, Control::ControlChangingDirection direction);
|
||||
void addJoystickSliderBinding(Control* control, int deviceId, int index, Control::ControlChangingDirection direction);
|
||||
|
|
|
@ -61,6 +61,11 @@ namespace ICS
|
|||
mControlsKeyBinderMap[ key ] = controlKeyBinderItem;
|
||||
}
|
||||
|
||||
bool InputControlSystem::isKeyBound(SDL_Scancode key) const
|
||||
{
|
||||
return mControlsKeyBinderMap.find(key) != mControlsKeyBinderMap.end();
|
||||
}
|
||||
|
||||
void InputControlSystem::removeKeyBinding(SDL_Scancode key)
|
||||
{
|
||||
ControlsKeyBinderMapType::iterator it = mControlsKeyBinderMap.find(key);
|
||||
|
|
5
extern/oics/ICSInputControlSystem_mouse.cpp
vendored
5
extern/oics/ICSInputControlSystem_mouse.cpp
vendored
|
@ -139,6 +139,11 @@ namespace ICS
|
|||
mControlsMouseButtonBinderMap[ button ] = controlMouseButtonBinderItem;
|
||||
}
|
||||
|
||||
bool InputControlSystem::isMouseButtonBound(unsigned int button) const
|
||||
{
|
||||
return mControlsMouseButtonBinderMap.find(button) != mControlsMouseButtonBinderMap.end();
|
||||
}
|
||||
|
||||
// get bindings
|
||||
InputControlSystem::NamedAxis InputControlSystem::getMouseAxisBinding(Control* control, ICS::Control::ControlChangingDirection direction)
|
||||
{
|
||||
|
|
|
@ -12,13 +12,13 @@
|
|||
{
|
||||
float4x4 viewFixed = view;
|
||||
#if !SH_GLSL
|
||||
viewFixed[0][3] = 0;
|
||||
viewFixed[1][3] = 0;
|
||||
viewFixed[2][3] = 0;
|
||||
viewFixed[0][3] = 0.0;
|
||||
viewFixed[1][3] = 0.0;
|
||||
viewFixed[2][3] = 0.0;
|
||||
#else
|
||||
viewFixed[3][0] = 0;
|
||||
viewFixed[3][1] = 0;
|
||||
viewFixed[3][2] = 0;
|
||||
viewFixed[3][0] = 0.0;
|
||||
viewFixed[3][1] = 0.0;
|
||||
viewFixed[3][2] = 0.0;
|
||||
#endif
|
||||
shOutputPosition = shMatrixMult(projection, shMatrixMult(viewFixed, shInputPosition));
|
||||
alphaFade = shInputPosition.z < 150.0 ? 0.0 : 1.0;
|
||||
|
|
|
@ -14,13 +14,13 @@
|
|||
float4x4 worldviewFixed = worldview;
|
||||
|
||||
#if !SH_GLSL
|
||||
worldviewFixed[0][3] = 0;
|
||||
worldviewFixed[1][3] = 0;
|
||||
worldviewFixed[2][3] = 0;
|
||||
worldviewFixed[0][3] = 0.0;
|
||||
worldviewFixed[1][3] = 0.0;
|
||||
worldviewFixed[2][3] = 0.0;
|
||||
#else
|
||||
worldviewFixed[3][0] = 0;
|
||||
worldviewFixed[3][1] = 0;
|
||||
worldviewFixed[3][2] = 0;
|
||||
worldviewFixed[3][0] = 0.0;
|
||||
worldviewFixed[3][1] = 0.0;
|
||||
worldviewFixed[3][2] = 0.0;
|
||||
#endif
|
||||
|
||||
shOutputPosition = shMatrixMult(proj, shMatrixMult(worldviewFixed, shInputPosition));
|
||||
|
|
|
@ -13,13 +13,13 @@ shUniform(float4x4, projection) @shAutoConstant(projection, projection_matrix)
|
|||
{
|
||||
float4x4 viewFixed = view;
|
||||
#if !SH_GLSL
|
||||
viewFixed[0][3] = 0;
|
||||
viewFixed[1][3] = 0;
|
||||
viewFixed[2][3] = 0;
|
||||
viewFixed[0][3] = 0.0;
|
||||
viewFixed[1][3] = 0.0;
|
||||
viewFixed[2][3] = 0.0;
|
||||
#else
|
||||
viewFixed[3][0] = 0;
|
||||
viewFixed[3][1] = 0;
|
||||
viewFixed[3][2] = 0;
|
||||
viewFixed[3][0] = 0.0;
|
||||
viewFixed[3][1] = 0.0;
|
||||
viewFixed[3][2] = 0.0;
|
||||
#endif
|
||||
shOutputPosition = shMatrixMult(projection, shMatrixMult(viewFixed, shMatrixMult(world, shInputPosition)));
|
||||
UV = uv0;
|
||||
|
|
|
@ -13,13 +13,13 @@ shUniform(float4x4, projection) @shAutoConstant(projection, projection_matrix)
|
|||
{
|
||||
float4x4 viewFixed = view;
|
||||
#if !SH_GLSL
|
||||
viewFixed[0][3] = 0;
|
||||
viewFixed[1][3] = 0;
|
||||
viewFixed[2][3] = 0;
|
||||
viewFixed[0][3] = 0.0;
|
||||
viewFixed[1][3] = 0.0;
|
||||
viewFixed[2][3] = 0.0;
|
||||
#else
|
||||
viewFixed[3][0] = 0;
|
||||
viewFixed[3][1] = 0;
|
||||
viewFixed[3][2] = 0;
|
||||
viewFixed[3][0] = 0.0;
|
||||
viewFixed[3][1] = 0.0;
|
||||
viewFixed[3][2] = 0.0;
|
||||
#endif
|
||||
shOutputPosition = shMatrixMult(projection, shMatrixMult(viewFixed, shMatrixMult(world, shInputPosition)));
|
||||
UV = uv0;
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
SH_START_PROGRAM
|
||||
{
|
||||
shOutputColour(0).xyz = shSample(animatedTexture, UV * 15).xyz * float3(1.0, 1.0, 1.0);
|
||||
shOutputColour(0).xyz = shSample(animatedTexture, UV * float2(15.0, 15.0)).xyz * float3(1.0, 1.0, 1.0);
|
||||
shOutputColour(0).w = 0.7;
|
||||
|
||||
#if FOG
|
||||
|
|
|
@ -2,8 +2,7 @@
|
|||
<MyGUI type="Layout">
|
||||
<Widget type="Window" skin="MW_Window" position="0 0 400 400" layer="Console" name="_Main">
|
||||
<Property key="Caption" value="#{sConsoleTitle}"/>
|
||||
<Property key="MinSize" value="400 245"/>
|
||||
<Property key="MaxSize" value="2000 2000"/>
|
||||
<Property key="MinSize" value="40 40"/>
|
||||
<Property key="Visible" value="false"/>
|
||||
|
||||
<!-- Log window -->
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<!-- The entire screen -->
|
||||
<Widget type="Widget" layer="LoadingScreen" position="0 0 300 300" name="_Main" align="Stretch">
|
||||
|
||||
<Widget type="Widget" skin="HUD_Box" position="0 245 300 48" align="Bottom HCenter">
|
||||
<Widget type="Widget" skin="MW_Dialog" position="0 245 300 48" align="Bottom HCenter">
|
||||
|
||||
<Widget type="TextBox" skin="SandText" position="20 8 260 18" name="LoadingText">
|
||||
<Property key="TextAlign" value="Center"/>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<MyGUI type="Layout">
|
||||
<Widget type="VBox" skin="MW_Dialog" layer="Notification" position="0 0 0 0" name="_Main">
|
||||
<Widget type="VBox" skin="HUD_Box" layer="Notification" position="0 0 0 0" name="_Main">
|
||||
<Property key="Padding" value="10"/>
|
||||
<Property key="AutoResize" value="true"/>
|
||||
|
||||
|
|
|
@ -346,10 +346,10 @@
|
|||
<Property key="Page" value="300"/>
|
||||
<UserString key="SettingType" value="Slider"/>
|
||||
<UserString key="SettingCategory" value="Viewing distance"/>
|
||||
<UserString key="SettingName" value="max viewing distance"/>
|
||||
<UserString key="SettingName" value="viewing distance"/>
|
||||
<UserString key="SettingValueType" value="Float"/>
|
||||
<UserString key="SettingMin" value="2000"/>
|
||||
<UserString key="SettingMax" value="5600"/>
|
||||
<UserString key="SettingMax" value="4600"/>
|
||||
</Widget>
|
||||
<Widget type="TextBox" skin="SandText" position="4 178 332 18" align="Left Top">
|
||||
<Property key="Caption" value="#{sNear}"/>
|
||||
|
|
|
@ -122,8 +122,12 @@ small object size = 250
|
|||
# Rendering distance for small objects
|
||||
small object distance = 3500
|
||||
|
||||
# Max viewing distance at clear weather conditions
|
||||
max viewing distance = 5600
|
||||
# Viewing distance at normal weather conditions
|
||||
# The maximum distance with no pop-in will be: (see RenderingManager::configureFog)
|
||||
# viewing distance / minimum weather fog depth (.69) * view frustum factor <= cell size (8192) - loading threshold (1024)
|
||||
# view frustum factor takes into account that the view frustum end is a plane, so at the edges of the screen you can see further than you should be able to.
|
||||
# exact factor would depend on FOV
|
||||
viewing distance = 4600
|
||||
|
||||
# Distance at which fog starts (proportional to viewing distance)
|
||||
fog start factor = 0.5
|
||||
|
|
|
@ -387,7 +387,7 @@ namespace Physic
|
|||
mHeightFieldMap [name] = hf;
|
||||
|
||||
mDynamicsWorld->addRigidBody(body,CollisionType_HeightMap,
|
||||
CollisionType_World|CollisionType_Actor|CollisionType_Raycasting);
|
||||
CollisionType_Actor|CollisionType_Raycasting);
|
||||
}
|
||||
|
||||
void PhysicEngine::removeHeightField(int x, int y)
|
||||
|
@ -494,7 +494,7 @@ namespace Physic
|
|||
{
|
||||
assert (mCollisionObjectMap.find(name) == mCollisionObjectMap.end());
|
||||
mCollisionObjectMap[name] = body;
|
||||
mDynamicsWorld->addRigidBody(body,CollisionType_World,CollisionType_World|CollisionType_Actor|CollisionType_HeightMap);
|
||||
mDynamicsWorld->addRigidBody(body,CollisionType_World,CollisionType_Actor|CollisionType_HeightMap);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -42,6 +42,7 @@ namespace GUI
|
|||
MYGUI_ASSERT( ! _throw, "widget name '" << _name << "' in layout '" << mLayoutName << "' not found.");
|
||||
}
|
||||
|
||||
private:
|
||||
void initialise(const std::string & _layout,
|
||||
MyGUI::Widget* _parent = nullptr)
|
||||
{
|
||||
|
@ -74,6 +75,7 @@ namespace GUI
|
|||
mListWindowRoot.clear();
|
||||
}
|
||||
|
||||
public:
|
||||
void setCoord(int x, int y, int w, int h)
|
||||
{
|
||||
mMainWidget->setCoord(x,y,w,h);
|
||||
|
@ -121,29 +123,6 @@ namespace GUI
|
|||
adjustWindowCaption();
|
||||
}
|
||||
|
||||
void setState(const std::string& widget, const std::string& state)
|
||||
{
|
||||
MyGUI::Widget* pt;
|
||||
getWidget(pt, widget);
|
||||
pt->_setWidgetState(state);
|
||||
}
|
||||
|
||||
void setTextColor(const std::string& name, float r, float g, float b)
|
||||
{
|
||||
MyGUI::Widget* pt;
|
||||
getWidget(pt, name);
|
||||
MyGUI::TextBox *st = dynamic_cast<MyGUI::TextBox*>(pt);
|
||||
if(st != NULL)
|
||||
st->setTextColour(MyGUI::Colour(b,g,r));
|
||||
}
|
||||
|
||||
void setImage(const std::string& name, const std::string& imgName)
|
||||
{
|
||||
MyGUI::ImageBox* pt;
|
||||
getWidget(pt, name);
|
||||
pt->setImageTexture(imgName);
|
||||
}
|
||||
|
||||
void adjustButtonSize(MyGUI::Button* button)
|
||||
{
|
||||
// adjust size of button to fit its text
|
||||
|
|
Loading…
Reference in a new issue