Merge branch 'master' of https://github.com/OpenMW/openmw into lighting

Conflicts:
	apps/opencs/view/render/instancemode.cpp
coverity_scan
scrawl 9 years ago
commit 41c571d4f4

@ -394,10 +394,6 @@ void CSMDoc::WriteLandCollectionStage::perform (int stage, Messages& messages)
CSMWorld::Land record = land.get(); CSMWorld::Land record = land.get();
writer.startRecord (record.sRecordId); writer.startRecord (record.sRecordId);
record.save (writer, land.mState == CSMWorld::RecordBase::State_Deleted); record.save (writer, land.mState == CSMWorld::RecordBase::State_Deleted);
if (const ESM::Land::LandData *data = record.getLandData (record.mDataTypes))
data->save (mState.getWriter());
writer.endRecord (record.sRecordId); writer.endRecord (record.sRecordId);
} }
} }

@ -190,6 +190,24 @@ void CSMPrefs::State::declare()
declareBool ("scene-hide-basic", "Hide basic 3D scenes tooltips", false); declareBool ("scene-hide-basic", "Hide basic 3D scenes tooltips", false);
declareInt ("scene-delay", "Tooltip delay in milliseconds", 500). declareInt ("scene-delay", "Tooltip delay in milliseconds", 500).
setMin (1); setMin (1);
EnumValue createAndInsert ("Create cell and insert");
EnumValue showAndInsert ("Show cell and insert");
EnumValue dontInsert ("Discard");
EnumValue insertAnyway ("Insert anyway");
EnumValues insertOutsideCell;
insertOutsideCell.add (createAndInsert).add (dontInsert).add (insertAnyway);
EnumValues insertOutsideVisibleCell;
insertOutsideVisibleCell.add (showAndInsert).add (dontInsert).add (insertAnyway);
declareCategory ("Scene Drops");
declareInt ("distance", "Drop Distance", 50).
setTooltip ("If an instance drop can not be placed against another object at the "
"insert point, it will be placed by this distance from the insert point instead");
declareEnum ("outside-drop", "Handling drops outside of cells", createAndInsert).
addValues (insertOutsideCell);
declareEnum ("outside-visible-drop", "Handling drops outside of visible cells", showAndInsert).
addValues (insertOutsideVisibleCell);
} }
void CSMPrefs::State::declareCategory (const std::string& key) void CSMPrefs::State::declareCategory (const std::string& key)

@ -1,11 +1,18 @@
#include "instancemode.hpp" #include "instancemode.hpp"
#include <QDragEnterEvent>
#include "../../model/prefs/state.hpp" #include "../../model/prefs/state.hpp"
#include "../../model/world/idtable.hpp"
#include "../../model/world/idtree.hpp"
#include "../../model/world/commands.hpp"
#include "mask.hpp" #include "mask.hpp"
#include "object.hpp" #include "object.hpp"
#include "worldspacewidget.hpp" #include "worldspacewidget.hpp"
#include "pagedworldspacewidget.hpp"
CSVRender::InstanceMode::InstanceMode (WorldspaceWidget *worldspaceWidget, QWidget *parent) CSVRender::InstanceMode::InstanceMode (WorldspaceWidget *worldspaceWidget, QWidget *parent)
: EditMode (worldspaceWidget, QIcon (":placeholder"), Mask_Reference, "Instance editing", : EditMode (worldspaceWidget, QIcon (":placeholder"), Mask_Reference, "Instance editing",
@ -55,3 +62,140 @@ void CSVRender::InstanceMode::secondarySelectPressed (osg::ref_ptr<TagBase> tag)
} }
} }
} }
void CSVRender::InstanceMode::dragEnterEvent (QDragEnterEvent *event)
{
if (const CSMWorld::TableMimeData* mime = dynamic_cast<const CSMWorld::TableMimeData*> (event->mimeData()))
{
if (!mime->fromDocument (getWorldspaceWidget().getDocument()))
return;
if (mime->holdsType (CSMWorld::UniversalId::Type_Referenceable))
event->accept();
}
}
void CSVRender::InstanceMode::dropEvent (QDropEvent* event)
{
if (const CSMWorld::TableMimeData* mime = dynamic_cast<const CSMWorld::TableMimeData*> (event->mimeData()))
{
CSMDoc::Document& document = getWorldspaceWidget().getDocument();
if (!mime->fromDocument (document))
return;
osg::Vec3f insertPoint = getWorldspaceWidget().getIntersectionPoint (event->pos());
std::string cellId = getWorldspaceWidget().getCellId (insertPoint);
CSMWorld::IdTree& cellTable = dynamic_cast<CSMWorld::IdTree&> (
*document.getData().getTableModel (CSMWorld::UniversalId::Type_Cells));
bool noCell = document.getData().getCells().searchId (cellId)==-1;
if (noCell)
{
std::string mode = CSMPrefs::get()["Scene Drops"]["outside-drop"].toString();
// target cell does not exist
if (mode=="Discard")
return;
if (mode=="Create cell and insert")
{
std::auto_ptr<CSMWorld::CreateCommand> createCommand (
new CSMWorld::CreateCommand (cellTable, cellId));
int parentIndex = cellTable.findColumnIndex (CSMWorld::Columns::ColumnId_Cell);
int index = cellTable.findNestedColumnIndex (parentIndex, CSMWorld::Columns::ColumnId_Interior);
createCommand->addNestedValue (parentIndex, index, false);
document.getUndoStack().push (createCommand.release());
if (CSVRender::PagedWorldspaceWidget *paged =
dynamic_cast<CSVRender::PagedWorldspaceWidget *> (&getWorldspaceWidget()))
{
CSMWorld::CellSelection selection = paged->getCellSelection();
selection.add (CSMWorld::CellCoordinates::fromId (cellId).first);
paged->setCellSelection (selection);
}
noCell = false;
}
}
else if (CSVRender::PagedWorldspaceWidget *paged =
dynamic_cast<CSVRender::PagedWorldspaceWidget *> (&getWorldspaceWidget()))
{
CSMWorld::CellSelection selection = paged->getCellSelection();
if (!selection.has (CSMWorld::CellCoordinates::fromId (cellId).first))
{
// target cell exists, but is not shown
std::string mode =
CSMPrefs::get()["Scene Drops"]["outside-visible-drop"].toString();
if (mode=="Discard")
return;
if (mode=="Show cell and insert")
{
selection.add (CSMWorld::CellCoordinates::fromId (cellId).first);
paged->setCellSelection (selection);
}
}
}
CSMWorld::IdTable& referencesTable = dynamic_cast<CSMWorld::IdTable&> (
*document.getData().getTableModel (CSMWorld::UniversalId::Type_References));
bool dropped = false;
std::vector<CSMWorld::UniversalId> ids = mime->getData();
for (std::vector<CSMWorld::UniversalId>::const_iterator iter (ids.begin());
iter!=ids.end(); ++iter)
if (mime->isReferencable (iter->getType()))
{
// create reference
std::auto_ptr<CSMWorld::CreateCommand> createCommand (
new CSMWorld::CreateCommand (
referencesTable, document.getData().getReferences().getNewId()));
createCommand->addValue (referencesTable.findColumnIndex (
CSMWorld::Columns::ColumnId_Cell), QString::fromUtf8 (cellId.c_str()));
createCommand->addValue (referencesTable.findColumnIndex (
CSMWorld::Columns::ColumnId_PositionXPos), insertPoint.x());
createCommand->addValue (referencesTable.findColumnIndex (
CSMWorld::Columns::ColumnId_PositionYPos), insertPoint.y());
createCommand->addValue (referencesTable.findColumnIndex (
CSMWorld::Columns::ColumnId_PositionZPos), insertPoint.z());
createCommand->addValue (referencesTable.findColumnIndex (
CSMWorld::Columns::ColumnId_ReferenceableId),
QString::fromUtf8 (iter->getId().c_str()));
std::auto_ptr<CSMWorld::ModifyCommand> incrementCommand;
if (!noCell)
{
// increase reference count in cell
QModelIndex countIndex = cellTable.getModelIndex (cellId,
cellTable.findColumnIndex (CSMWorld::Columns::ColumnId_RefNumCounter));
int count = cellTable.data (countIndex).toInt();
incrementCommand.reset (
new CSMWorld::ModifyCommand (cellTable, countIndex, count+1));
}
document.getUndoStack().beginMacro (createCommand->text());
document.getUndoStack().push (createCommand.release());
if (incrementCommand.get())
document.getUndoStack().push (incrementCommand.release());
document.getUndoStack().endMacro();
dropped = true;
}
if (dropped)
event->accept();
}
}

@ -20,6 +20,10 @@ namespace CSVRender
virtual void primarySelectPressed (osg::ref_ptr<TagBase> tag); virtual void primarySelectPressed (osg::ref_ptr<TagBase> tag);
virtual void secondarySelectPressed (osg::ref_ptr<TagBase> tag); virtual void secondarySelectPressed (osg::ref_ptr<TagBase> tag);
virtual void dragEnterEvent (QDragEnterEvent *event);
virtual void dropEvent (QDropEvent* event);
}; };
} }

@ -432,6 +432,11 @@ void CSVRender::PagedWorldspaceWidget::setCellSelection (const CSMWorld::CellSel
emit cellSelectionChanged (mSelection); emit cellSelectionChanged (mSelection);
} }
const CSMWorld::CellSelection& CSVRender::PagedWorldspaceWidget::getCellSelection() const
{
return mSelection;
}
std::pair< int, int > CSVRender::PagedWorldspaceWidget::getCoordinatesFromId (const std::string& record) const std::pair< int, int > CSVRender::PagedWorldspaceWidget::getCoordinatesFromId (const std::string& record) const
{ {
std::istringstream stream (record.c_str()); std::istringstream stream (record.c_str());
@ -504,6 +509,17 @@ void CSVRender::PagedWorldspaceWidget::clearSelection (int elementMask)
flagAsModified(); flagAsModified();
} }
std::string CSVRender::PagedWorldspaceWidget::getCellId (const osg::Vec3f& point) const
{
const int cellSize = 8192;
CSMWorld::CellCoordinates cellCoordinates (
static_cast<int> (std::floor (point.x()/cellSize)),
static_cast<int> (std::floor (point.y()/cellSize)));
return cellCoordinates.getId (mWorldspace);
}
CSVWidget::SceneToolToggle *CSVRender::PagedWorldspaceWidget::makeControlVisibilitySelector ( CSVWidget::SceneToolToggle *CSVRender::PagedWorldspaceWidget::makeControlVisibilitySelector (
CSVWidget::SceneToolbar *parent) CSVWidget::SceneToolbar *parent)
{ {

@ -80,6 +80,8 @@ namespace CSVRender
void setCellSelection(const CSMWorld::CellSelection& selection); void setCellSelection(const CSMWorld::CellSelection& selection);
const CSMWorld::CellSelection& getCellSelection() const;
/// \return Drop handled? /// \return Drop handled?
virtual bool handleDrop (const std::vector<CSMWorld::UniversalId>& data, virtual bool handleDrop (const std::vector<CSMWorld::UniversalId>& data,
DropType type); DropType type);
@ -96,6 +98,8 @@ namespace CSVRender
/// \param elementMask Elements to be affected by the clear operation /// \param elementMask Elements to be affected by the clear operation
virtual void clearSelection (int elementMask); virtual void clearSelection (int elementMask);
virtual std::string getCellId (const osg::Vec3f& point) const;
protected: protected:
virtual void addVisibilitySelectorButtons (CSVWidget::SceneToolToggle2 *tool); virtual void addVisibilitySelectorButtons (CSVWidget::SceneToolToggle2 *tool);

@ -108,6 +108,11 @@ void CSVRender::UnpagedWorldspaceWidget::clearSelection (int elementMask)
flagAsModified(); flagAsModified();
} }
std::string CSVRender::UnpagedWorldspaceWidget::getCellId (const osg::Vec3f& point) const
{
return mCellId;
}
void CSVRender::UnpagedWorldspaceWidget::referenceableDataChanged (const QModelIndex& topLeft, void CSVRender::UnpagedWorldspaceWidget::referenceableDataChanged (const QModelIndex& topLeft,
const QModelIndex& bottomRight) const QModelIndex& bottomRight)
{ {

@ -46,6 +46,8 @@ namespace CSVRender
/// \param elementMask Elements to be affected by the clear operation /// \param elementMask Elements to be affected by the clear operation
virtual void clearSelection (int elementMask); virtual void clearSelection (int elementMask);
virtual std::string getCellId (const osg::Vec3f& point) const;
private: private:
virtual void referenceableDataChanged (const QModelIndex& topLeft, virtual void referenceableDataChanged (const QModelIndex& topLeft,

@ -315,6 +315,54 @@ CSMDoc::Document& CSVRender::WorldspaceWidget::getDocument()
return mDocument; return mDocument;
} }
osg::Vec3f CSVRender::WorldspaceWidget::getIntersectionPoint (const QPoint& localPos,
unsigned int interactionMask, bool ignoreHidden) const
{
// (0,0) is considered the lower left corner of an OpenGL window
int x = localPos.x();
int y = height() - localPos.y();
osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector (
new osgUtil::LineSegmentIntersector (osgUtil::Intersector::WINDOW, x, y));
intersector->setIntersectionLimit (osgUtil::LineSegmentIntersector::NO_LIMIT);
osgUtil::IntersectionVisitor visitor (intersector);
unsigned int mask = interactionMask;
if (ignoreHidden)
mask &= getVisibilityMask();
visitor.setTraversalMask (mask);
mView->getCamera()->accept (visitor);
for (osgUtil::LineSegmentIntersector::Intersections::iterator iter = intersector->getIntersections().begin();
iter!=intersector->getIntersections().end(); ++iter)
{
// reject back-facing polygons
osg::Vec3f normal = osg::Matrix::transform3x3 (
iter->getWorldIntersectNormal(), mView->getCamera()->getViewMatrix());
if (normal.z()>=0)
return iter->getWorldIntersectPoint();
}
osg::Matrixd matrix;
matrix.preMult (mView->getCamera()->getViewport()->computeWindowMatrix());
matrix.preMult (mView->getCamera()->getProjectionMatrix());
matrix.preMult (mView->getCamera()->getViewMatrix());
matrix = osg::Matrixd::inverse (matrix);
osg::Vec3d start = matrix.preMult (intersector->getStart());
osg::Vec3d end = matrix.preMult (intersector->getEnd());
osg::Vec3d direction = end-start;
direction.normalize();
return start + direction * CSMPrefs::get()["Scene Drops"]["distance"].toInt();
}
void CSVRender::WorldspaceWidget::dragEnterEvent (QDragEnterEvent* event) void CSVRender::WorldspaceWidget::dragEnterEvent (QDragEnterEvent* event)
{ {
const CSMWorld::TableMimeData* mime = dynamic_cast<const CSMWorld::TableMimeData*> (event->mimeData()); const CSMWorld::TableMimeData* mime = dynamic_cast<const CSMWorld::TableMimeData*> (event->mimeData());

@ -127,6 +127,19 @@ namespace CSVRender
/// \param elementMask Elements to be affected by the clear operation /// \param elementMask Elements to be affected by the clear operation
virtual void clearSelection (int elementMask) = 0; virtual void clearSelection (int elementMask) = 0;
/// Return the next intersection point with scene elements matched by
/// \a interactionMask based on \a localPos and the camera vector.
/// If there is no such point, instead a point "in front" of \a localPos will be
/// returned.
///
/// \param ignoreHidden ignore elements specified in interactionMask that are
/// flagged as not visible.
osg::Vec3f getIntersectionPoint (const QPoint& localPos,
unsigned int interactionMask = Mask_Reference | Mask_Terrain,
bool ignoreHidden = false) const;
virtual std::string getCellId (const osg::Vec3f& point) const = 0;
protected: protected:
virtual void addVisibilitySelectorButtons (CSVWidget::SceneToolToggle2 *tool); virtual void addVisibilitySelectorButtons (CSVWidget::SceneToolToggle2 *tool);

@ -50,8 +50,9 @@ namespace MWBase
virtual ~Journal() {} virtual ~Journal() {}
virtual void addEntry (const std::string& id, int index) = 0; virtual void addEntry (const std::string& id, int index, const MWWorld::Ptr& actor) = 0;
///< Add a journal entry. ///< Add a journal entry.
/// @param actor Used as context for replacing of escape sequences (%name, etc).
virtual void setJournalIndex (const std::string& id, int index) = 0; virtual void setJournalIndex (const std::string& id, int index) = 0;
///< Set the journal index without adding an entry. ///< Set the journal index without adding an entry.

@ -525,8 +525,8 @@ namespace MWBase
virtual void spawnEffect (const std::string& model, const std::string& textureOverride, const osg::Vec3f& worldPos) = 0; virtual void spawnEffect (const std::string& model, const std::string& textureOverride, const osg::Vec3f& worldPos) = 0;
virtual void explodeSpell (const osg::Vec3f& origin, const ESM::EffectList& effects, virtual void explodeSpell (const osg::Vec3f& origin, const ESM::EffectList& effects, const MWWorld::Ptr& caster,
const MWWorld::Ptr& caster, ESM::RangeType rangeType, const std::string& id, const std::string& sourceName) = 0; const MWWorld::Ptr& ignore, ESM::RangeType rangeType, const std::string& id, const std::string& sourceName) = 0;
virtual void activate (const MWWorld::Ptr& object, const MWWorld::Ptr& actor) = 0; virtual void activate (const MWWorld::Ptr& object, const MWWorld::Ptr& actor) = 0;
@ -549,6 +549,8 @@ namespace MWBase
virtual float getHitDistance(const MWWorld::ConstPtr& actor, const MWWorld::ConstPtr& target) = 0; virtual float getHitDistance(const MWWorld::ConstPtr& actor, const MWWorld::ConstPtr& target) = 0;
virtual void removeContainerScripts(const MWWorld::Ptr& reference) = 0; virtual void removeContainerScripts(const MWWorld::Ptr& reference) = 0;
virtual bool isPlayerInJail() const = 0;
}; };
} }

@ -102,8 +102,8 @@ namespace MWDialogue
{} {}
StampedJournalEntry::StampedJournalEntry (const std::string& topic, const std::string& infoId, StampedJournalEntry::StampedJournalEntry (const std::string& topic, const std::string& infoId,
int day, int month, int dayOfMonth) int day, int month, int dayOfMonth, const MWWorld::Ptr& actor)
: JournalEntry (topic, infoId, MWWorld::Ptr()), mDay (day), mMonth (month), mDayOfMonth (dayOfMonth) : JournalEntry (topic, infoId, actor), mDay (day), mMonth (month), mDayOfMonth (dayOfMonth)
{} {}
StampedJournalEntry::StampedJournalEntry (const ESM::JournalEntry& record) StampedJournalEntry::StampedJournalEntry (const ESM::JournalEntry& record)
@ -119,12 +119,12 @@ namespace MWDialogue
entry.mDayOfMonth = mDayOfMonth; entry.mDayOfMonth = mDayOfMonth;
} }
StampedJournalEntry StampedJournalEntry::makeFromQuest (const std::string& topic, int index) StampedJournalEntry StampedJournalEntry::makeFromQuest (const std::string& topic, int index, const MWWorld::Ptr& actor)
{ {
int day = MWBase::Environment::get().getWorld()->getGlobalInt ("dayspassed"); int day = MWBase::Environment::get().getWorld()->getGlobalInt ("dayspassed");
int month = MWBase::Environment::get().getWorld()->getGlobalInt ("month"); int month = MWBase::Environment::get().getWorld()->getGlobalInt ("month");
int dayOfMonth = MWBase::Environment::get().getWorld()->getGlobalInt ("day"); int dayOfMonth = MWBase::Environment::get().getWorld()->getGlobalInt ("day");
return StampedJournalEntry (topic, idFromIndex (topic, index), day, month, dayOfMonth); return StampedJournalEntry (topic, idFromIndex (topic, index), day, month, dayOfMonth, actor);
} }
} }

@ -64,13 +64,13 @@ namespace MWDialogue
StampedJournalEntry(); StampedJournalEntry();
StampedJournalEntry (const std::string& topic, const std::string& infoId, StampedJournalEntry (const std::string& topic, const std::string& infoId,
int day, int month, int dayOfMonth); int day, int month, int dayOfMonth, const MWWorld::Ptr& actor);
StampedJournalEntry (const ESM::JournalEntry& record); StampedJournalEntry (const ESM::JournalEntry& record);
void write (ESM::JournalEntry& entry) const; void write (ESM::JournalEntry& entry) const;
static StampedJournalEntry makeFromQuest (const std::string& topic, int index); static StampedJournalEntry makeFromQuest (const std::string& topic, int index, const MWWorld::Ptr& actor);
}; };
} }

@ -75,7 +75,7 @@ namespace MWDialogue
mTopics.clear(); mTopics.clear();
} }
void Journal::addEntry (const std::string& id, int index) void Journal::addEntry (const std::string& id, int index, const MWWorld::Ptr& actor)
{ {
// bail out of we already have heard this... // bail out of we already have heard this...
std::string infoId = JournalEntry::idFromIndex (id, index); std::string infoId = JournalEntry::idFromIndex (id, index);
@ -83,7 +83,7 @@ namespace MWDialogue
if (i->mTopic == id && i->mInfoId == infoId) if (i->mTopic == id && i->mInfoId == infoId)
return; return;
StampedJournalEntry entry = StampedJournalEntry::makeFromQuest (id, index); StampedJournalEntry entry = StampedJournalEntry::makeFromQuest (id, index, actor);
mJournal.push_back (entry); mJournal.push_back (entry);

@ -29,8 +29,9 @@ namespace MWDialogue
virtual void clear(); virtual void clear();
virtual void addEntry (const std::string& id, int index); virtual void addEntry (const std::string& id, int index, const MWWorld::Ptr& actor);
///< Add a journal entry. ///< Add a journal entry.
/// @param actor Used as context for replacing of escape sequences (%name, etc).
virtual void setJournalIndex (const std::string& id, int index); virtual void setJournalIndex (const std::string& id, int index);
///< Set the journal index without adding an entry. ///< Set the journal index without adding an entry.

@ -69,7 +69,7 @@ namespace MWGui
HUD::HUD(CustomMarkerCollection &customMarkers, DragAndDrop* dragAndDrop, MWRender::LocalMap* localMapRender) HUD::HUD(CustomMarkerCollection &customMarkers, DragAndDrop* dragAndDrop, MWRender::LocalMap* localMapRender)
: Layout("openmw_hud.layout") : Layout("openmw_hud.layout")
, LocalMapBase(customMarkers, localMapRender) , LocalMapBase(customMarkers, localMapRender, Settings::Manager::getBool("local map hud fog of war", "Map"))
, mHealth(NULL) , mHealth(NULL)
, mMagicka(NULL) , mMagicka(NULL)
, mStamina(NULL) , mStamina(NULL)

@ -156,7 +156,7 @@ namespace MWGui
// ------------------------------------------------------ // ------------------------------------------------------
LocalMapBase::LocalMapBase(CustomMarkerCollection &markers, MWRender::LocalMap* localMapRender) LocalMapBase::LocalMapBase(CustomMarkerCollection &markers, MWRender::LocalMap* localMapRender, bool fogOfWarEnabled)
: mLocalMapRender(localMapRender) : mLocalMapRender(localMapRender)
, mCurX(0) , mCurX(0)
, mCurY(0) , mCurY(0)
@ -165,7 +165,8 @@ namespace MWGui
, mCompass(NULL) , mCompass(NULL)
, mPrefix() , mPrefix()
, mChanged(true) , mChanged(true)
, mFogOfWar(true) , mFogOfWarToggled(true)
, mFogOfWarEnabled(fogOfWarEnabled)
, mMapWidgetSize(0) , mMapWidgetSize(0)
, mCustomMarkers(markers) , mCustomMarkers(markers)
, mMarkerUpdateTimer(0.0f) , mMarkerUpdateTimer(0.0f)
@ -222,9 +223,9 @@ namespace MWGui
bool LocalMapBase::toggleFogOfWar() bool LocalMapBase::toggleFogOfWar()
{ {
mFogOfWar = !mFogOfWar; mFogOfWarToggled = !mFogOfWarToggled;
applyFogOfWar(); applyFogOfWar();
return mFogOfWar; return mFogOfWarToggled;
} }
void LocalMapBase::applyFogOfWar() void LocalMapBase::applyFogOfWar()
@ -238,7 +239,7 @@ namespace MWGui
int y = mCurY + (-1*(my-1)); int y = mCurY + (-1*(my-1));
MyGUI::ImageBox* fog = mFogWidgets[my + 3*mx]; MyGUI::ImageBox* fog = mFogWidgets[my + 3*mx];
if (!mFogOfWar) if (!mFogOfWarToggled || !mFogOfWarEnabled)
{ {
fog->setImageTexture(""); fog->setImageTexture("");
continue; continue;
@ -269,8 +270,6 @@ namespace MWGui
// normalized cell coordinates // normalized cell coordinates
float nX,nY; float nX,nY;
markerPos.interior = mInterior;
if (!mInterior) if (!mInterior)
{ {
int cellX, cellY; int cellX, cellY;
@ -1078,7 +1077,7 @@ namespace MWGui
{ {
if (!mLocalMapRender) if (!mLocalMapRender)
return true; return true;
return mLocalMapRender->isPositionExplored(nX, nY, cellX, cellY, interior); return mLocalMapRender->isPositionExplored(nX, nY, cellX, cellY);
} }
} }

@ -61,7 +61,7 @@ namespace MWGui
class LocalMapBase class LocalMapBase
{ {
public: public:
LocalMapBase(CustomMarkerCollection& markers, MWRender::LocalMap* localMapRender); LocalMapBase(CustomMarkerCollection& markers, MWRender::LocalMap* localMapRender, bool fogOfWarEnabled = true);
virtual ~LocalMapBase(); virtual ~LocalMapBase();
void init(MyGUI::ScrollView* widget, MyGUI::ImageBox* compass, int mapWidgetSize); void init(MyGUI::ScrollView* widget, MyGUI::ImageBox* compass, int mapWidgetSize);
@ -78,7 +78,6 @@ namespace MWGui
{ {
MarkerUserData(MWRender::LocalMap* map) MarkerUserData(MWRender::LocalMap* map)
: mLocalMapRender(map) : mLocalMapRender(map)
, interior(false)
, cellX(0) , cellX(0)
, cellY(0) , cellY(0)
, nX(0.f) , nX(0.f)
@ -89,7 +88,6 @@ namespace MWGui
bool isPositionExplored() const; bool isPositionExplored() const;
MWRender::LocalMap* mLocalMapRender; MWRender::LocalMap* mLocalMapRender;
bool interior;
int cellX; int cellX;
int cellY; int cellY;
float nX; float nX;
@ -107,7 +105,8 @@ namespace MWGui
MyGUI::ImageBox* mCompass; MyGUI::ImageBox* mCompass;
std::string mPrefix; std::string mPrefix;
bool mChanged; bool mChanged;
bool mFogOfWar; bool mFogOfWarToggled;
bool mFogOfWarEnabled;
int mMapWidgetSize; int mMapWidgetSize;

@ -130,12 +130,14 @@ namespace MWGui
if (type == sliderType) if (type == sliderType)
{ {
MyGUI::ScrollBar* scroll = current->castType<MyGUI::ScrollBar>(); MyGUI::ScrollBar* scroll = current->castType<MyGUI::ScrollBar>();
std::string valueStr;
if (getSettingValueType(current) == "Float") if (getSettingValueType(current) == "Float")
{ {
// TODO: ScrollBar isn't meant for this. should probably use a dedicated FloatSlider widget // TODO: ScrollBar isn't meant for this. should probably use a dedicated FloatSlider widget
float min,max; float min,max;
getSettingMinMax(scroll, min, max); getSettingMinMax(scroll, min, max);
float value = Settings::Manager::getFloat(getSettingName(current), getSettingCategory(current)); float value = Settings::Manager::getFloat(getSettingName(current), getSettingCategory(current));
valueStr = MyGUI::utility::toString((int)value);
value = std::max(min, std::min(value, max)); value = std::max(min, std::min(value, max));
value = (value-min)/(max-min); value = (value-min)/(max-min);
@ -144,15 +146,30 @@ namespace MWGui
else else
{ {
int value = Settings::Manager::getInt(getSettingName(current), getSettingCategory(current)); int value = Settings::Manager::getInt(getSettingName(current), getSettingCategory(current));
valueStr = MyGUI::utility::toString(value);
scroll->setScrollPosition(value); scroll->setScrollPosition(value);
} }
scroll->eventScrollChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onSliderChangePosition); scroll->eventScrollChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onSliderChangePosition);
updateSliderLabel(scroll, valueStr);
} }
configureWidgets(current); configureWidgets(current);
} }
} }
void SettingsWindow::updateSliderLabel(MyGUI::ScrollBar *scroller, const std::string& value)
{
std::string labelWidgetName = scroller->getUserString("SettingLabelWidget");
if (!labelWidgetName.empty())
{
MyGUI::TextBox* textBox;
getWidget(textBox, labelWidgetName);
std::string labelCaption = scroller->getUserString("SettingLabelCaption");
boost::algorithm::replace_all(labelCaption, "%s", value);
textBox->setCaptionWithReplacing(labelCaption);
}
}
SettingsWindow::SettingsWindow() : SettingsWindow::SettingsWindow() :
WindowBase("openmw_settings_window.layout"), WindowBase("openmw_settings_window.layout"),
mKeyboardMode(true) mKeyboardMode(true)
@ -167,17 +184,13 @@ namespace MWGui
getWidget(mFullscreenButton, "FullscreenButton"); getWidget(mFullscreenButton, "FullscreenButton");
getWidget(mVSyncButton, "VSyncButton"); getWidget(mVSyncButton, "VSyncButton");
getWidget(mWindowBorderButton, "WindowBorderButton"); getWidget(mWindowBorderButton, "WindowBorderButton");
getWidget(mFOVSlider, "FOVSlider");
getWidget(mAnisotropySlider, "AnisotropySlider");
getWidget(mTextureFilteringButton, "TextureFilteringButton"); getWidget(mTextureFilteringButton, "TextureFilteringButton");
getWidget(mAnisotropyLabel, "AnisotropyLabel");
getWidget(mAnisotropyBox, "AnisotropyBox"); getWidget(mAnisotropyBox, "AnisotropyBox");
getWidget(mShadersButton, "ShadersButton"); getWidget(mShadersButton, "ShadersButton");
getWidget(mShadowsEnabledButton, "ShadowsEnabledButton"); getWidget(mShadowsEnabledButton, "ShadowsEnabledButton");
getWidget(mShadowsTextureSize, "ShadowsTextureSize"); getWidget(mShadowsTextureSize, "ShadowsTextureSize");
getWidget(mControlsBox, "ControlsBox"); getWidget(mControlsBox, "ControlsBox");
getWidget(mResetControlsButton, "ResetControlsButton"); getWidget(mResetControlsButton, "ResetControlsButton");
getWidget(mDifficultySlider, "DifficultySlider");
getWidget(mKeyboardSwitch, "KeyboardButton"); getWidget(mKeyboardSwitch, "KeyboardButton");
getWidget(mControllerSwitch, "ControllerButton"); getWidget(mControllerSwitch, "ControllerButton");
getWidget(mWaterTextureSize, "WaterTextureSize"); getWidget(mWaterTextureSize, "WaterTextureSize");
@ -238,7 +251,6 @@ namespace MWGui
std::string tmip = Settings::Manager::getString("texture mipmap", "General"); std::string tmip = Settings::Manager::getString("texture mipmap", "General");
mTextureFilteringButton->setCaption(textureMipmappingToStr(tmip)); mTextureFilteringButton->setCaption(textureMipmappingToStr(tmip));
mAnisotropyLabel->setCaption("Anisotropy (" + MyGUI::utility::toString(Settings::Manager::getInt("anisotropy", "General")) + ")");
int waterTextureSize = Settings::Manager::getInt ("rtt size", "Water"); int waterTextureSize = Settings::Manager::getInt ("rtt size", "Water");
if (waterTextureSize >= 512) if (waterTextureSize >= 512)
@ -255,15 +267,6 @@ namespace MWGui
mShadowsEnabledButton->setEnabled(false); mShadowsEnabledButton->setEnabled(false);
} }
MyGUI::TextBox* fovText;
getWidget(fovText, "FovText");
fovText->setCaption("Field of View (" + MyGUI::utility::toString(int(Settings::Manager::getInt("field of view", "Camera"))) + ")");
MyGUI::TextBox* diffText;
getWidget(diffText, "DifficultyText");
diffText->setCaptionWithReplacing("#{sDifficulty} (" + MyGUI::utility::toString(int(Settings::Manager::getInt("difficulty", "Game"))) + ")");
mWindowBorderButton->setEnabled(!Settings::Manager::getBool("fullscreen", "Video")); mWindowBorderButton->setEnabled(!Settings::Manager::getBool("fullscreen", "Video"));
mKeyboardSwitch->setStateSelected(true); mKeyboardSwitch->setStateSelected(true);
@ -439,6 +442,7 @@ namespace MWGui
{ {
if (getSettingType(scroller) == "Slider") if (getSettingType(scroller) == "Slider")
{ {
std::string valueStr;
if (getSettingValueType(scroller) == "Float") if (getSettingValueType(scroller) == "Float")
{ {
float value = pos / float(scroller->getScrollRange()-1); float value = pos / float(scroller->getScrollRange()-1);
@ -447,28 +451,15 @@ namespace MWGui
getSettingMinMax(scroller, min, max); getSettingMinMax(scroller, min, max);
value = min + (max-min) * value; value = min + (max-min) * value;
Settings::Manager::setFloat(getSettingName(scroller), getSettingCategory(scroller), value); Settings::Manager::setFloat(getSettingName(scroller), getSettingCategory(scroller), value);
valueStr = MyGUI::utility::toString(int(value));
if (scroller == mFOVSlider)
{
MyGUI::TextBox* fovText;
getWidget(fovText, "FovText");
fovText->setCaption("Field of View (" + MyGUI::utility::toString(int(value)) + ")");
}
if (scroller == mDifficultySlider)
{
MyGUI::TextBox* diffText;
getWidget(diffText, "DifficultyText");
diffText->setCaptionWithReplacing("#{sDifficulty} (" + MyGUI::utility::toString(int(value)) + ")");
}
} }
else else
{ {
Settings::Manager::setInt(getSettingName(scroller), getSettingCategory(scroller), pos); Settings::Manager::setInt(getSettingName(scroller), getSettingCategory(scroller), pos);
if (scroller == mAnisotropySlider) valueStr = MyGUI::utility::toString(pos);
{
mAnisotropyLabel->setCaption("Anisotropy (" + MyGUI::utility::toString(pos) + ")");
}
} }
updateSliderLabel(scroller, valueStr);
apply(); apply();
} }
} }

@ -30,11 +30,7 @@ namespace MWGui
MyGUI::Button* mFullscreenButton; MyGUI::Button* mFullscreenButton;
MyGUI::Button* mVSyncButton; MyGUI::Button* mVSyncButton;
MyGUI::Button* mWindowBorderButton; MyGUI::Button* mWindowBorderButton;
MyGUI::ScrollBar* mFOVSlider;
MyGUI::ScrollBar* mDifficultySlider;
MyGUI::ScrollBar* mAnisotropySlider;
MyGUI::ComboBox* mTextureFilteringButton; MyGUI::ComboBox* mTextureFilteringButton;
MyGUI::TextBox* mAnisotropyLabel;
MyGUI::Widget* mAnisotropyBox; MyGUI::Widget* mAnisotropyBox;
MyGUI::Button* mShadersButton; MyGUI::Button* mShadersButton;
@ -76,6 +72,7 @@ namespace MWGui
void apply(); void apply();
void configureWidgets(MyGUI::Widget* widget); void configureWidgets(MyGUI::Widget* widget);
void updateSliderLabel(MyGUI::ScrollBar* scroller, const std::string& value);
private: private:
void resetScrollbars(); void resetScrollbars();

@ -552,7 +552,7 @@ namespace MWMechanics
} }
if (!exploded) if (!exploded)
MWBase::Environment::get().getWorld()->explodeSpell(mHitPosition, effects, caster, range, mId, mSourceName); MWBase::Environment::get().getWorld()->explodeSpell(mHitPosition, effects, caster, target, range, mId, mSourceName);
if (!reflectedEffects.mList.empty()) if (!reflectedEffects.mList.empty())
inflict(caster, target, reflectedEffects, range, true, exploded); inflict(caster, target, reflectedEffects, range, true, exploded);

@ -478,7 +478,7 @@ osg::Vec2f LocalMap::interiorMapToWorldPosition (float nX, float nY, int x, int
return pos; return pos;
} }
bool LocalMap::isPositionExplored (float nX, float nY, int x, int y, bool interior) bool LocalMap::isPositionExplored (float nX, float nY, int x, int y)
{ {
const MapSegment& segment = mSegments[std::make_pair(x, y)]; const MapSegment& segment = mSegments[std::make_pair(x, y)];
if (!segment.mFogOfWarImage) if (!segment.mFogOfWarImage)
@ -526,7 +526,7 @@ void LocalMap::updatePlayer (const osg::Vec3f& position, const osg::Quat& orient
} }
// explore radius (squared) // explore radius (squared)
const float exploreRadius = (mInterior ? 0.1f : 0.3f) * (sFogOfWarResolution-1); // explore radius from 0 to sFogOfWarResolution-1 const float exploreRadius = 0.17f * (sFogOfWarResolution-1); // explore radius from 0 to sFogOfWarResolution-1
const float sqrExploreRadius = square(exploreRadius); const float sqrExploreRadius = square(exploreRadius);
const float exploreRadiusUV = exploreRadius / sFogOfWarResolution; // explore radius from 0 to 1 (UV space) const float exploreRadiusUV = exploreRadius / sFogOfWarResolution; // explore radius from 0 to 1 (UV space)

@ -99,7 +99,7 @@ namespace MWRender
/** /**
* Check if a given position is explored by the player (i.e. not obscured by fog of war) * Check if a given position is explored by the player (i.e. not obscured by fog of war)
*/ */
bool isPositionExplored (float nX, float nY, int x, int y, bool interior); bool isPositionExplored (float nX, float nY, int x, int y);
osg::Group* getRoot(); osg::Group* getRoot();

@ -22,12 +22,17 @@ namespace MWScript
{ {
namespace Dialogue namespace Dialogue
{ {
template <class R>
class OpJournal : public Interpreter::Opcode0 class OpJournal : public Interpreter::Opcode0
{ {
public: public:
virtual void execute (Interpreter::Runtime& runtime) virtual void execute (Interpreter::Runtime& runtime)
{ {
MWWorld::Ptr ptr = R()(runtime, false); // required=false
if (ptr.isEmpty())
ptr = MWBase::Environment::get().getWorld()->getPlayerPtr();
std::string quest = runtime.getStringLiteral (runtime[0].mInteger); std::string quest = runtime.getStringLiteral (runtime[0].mInteger);
runtime.pop(); runtime.pop();
@ -37,7 +42,7 @@ namespace MWScript
// Invoking Journal with a non-existing index is allowed, and triggers no errors. Seriously? :( // Invoking Journal with a non-existing index is allowed, and triggers no errors. Seriously? :(
try try
{ {
MWBase::Environment::get().getJournal()->addEntry (quest, index); MWBase::Environment::get().getJournal()->addEntry (quest, index, ptr);
} }
catch (...) catch (...)
{ {
@ -270,7 +275,7 @@ namespace MWScript
void installOpcodes (Interpreter::Interpreter& interpreter) void installOpcodes (Interpreter::Interpreter& interpreter)
{ {
interpreter.installSegment5 (Compiler::Dialogue::opcodeJournal, new OpJournal); interpreter.installSegment5 (Compiler::Dialogue::opcodeJournal, new OpJournal<ImplicitRef>);
interpreter.installSegment5 (Compiler::Dialogue::opcodeSetJournalIndex, new OpSetJournalIndex); interpreter.installSegment5 (Compiler::Dialogue::opcodeSetJournalIndex, new OpSetJournalIndex);
interpreter.installSegment5 (Compiler::Dialogue::opcodeGetJournalIndex, new OpGetJournalIndex); interpreter.installSegment5 (Compiler::Dialogue::opcodeGetJournalIndex, new OpGetJournalIndex);
interpreter.installSegment5 (Compiler::Dialogue::opcodeAddTopic, new OpAddTopic); interpreter.installSegment5 (Compiler::Dialogue::opcodeAddTopic, new OpAddTopic);

@ -1014,7 +1014,7 @@ namespace MWScript
virtual void execute (Interpreter::Runtime &runtime) virtual void execute (Interpreter::Runtime &runtime)
{ {
runtime.push (MWBase::Environment::get().getWindowManager()->containsMode(MWGui::GM_Jail)); runtime.push (MWBase::Environment::get().getWorld()->isPlayerInJail());
} }
}; };

@ -529,10 +529,10 @@ void MWWorld::ContainerStore::restock (const ESM::InventoryList& items, const MW
{ {
std::map<std::string, int>::iterator listInMap = allowedForReplace.find(itemOrList); std::map<std::string, int>::iterator listInMap = allowedForReplace.find(itemOrList);
int restockNum = it->mCount; int restockNum = std::abs(it->mCount);
//If we know we must restock less, take it into account //If we know we must restock less, take it into account
if(listInMap != allowedForReplace.end()) if(listInMap != allowedForReplace.end())
restockNum += listInMap->second;//We add, because list items have negative count restockNum -= std::min(restockNum, listInMap->second);
//restock //restock
addInitialItem(itemOrList, owner, restockNum, true); addInitialItem(itemOrList, owner, restockNum, true);
} }
@ -627,7 +627,7 @@ int MWWorld::ContainerStore::getType (const ConstPtr& ptr)
return Type_Weapon; return Type_Weapon;
throw std::runtime_error ( throw std::runtime_error (
"Object of type " + ptr.getTypeName() + " can not be placed into a container"); "Object '" + ptr.getCellRef().getRefId() + "' of type " + ptr.getTypeName() + " can not be placed into a container");
} }
MWWorld::Ptr MWWorld::ContainerStore::search (const std::string& id) MWWorld::Ptr MWWorld::ContainerStore::search (const std::string& id)

@ -237,7 +237,8 @@ namespace MWWorld
if (hit) if (hit)
{ {
MWBase::Environment::get().getWorld()->explodeSpell(pos, it->mEffects, caster, ESM::RT_Target, it->mSpellId, it->mSourceName); MWBase::Environment::get().getWorld()->explodeSpell(pos, it->mEffects, caster, result.mHitObject,
ESM::RT_Target, it->mSpellId, it->mSourceName);
MWBase::Environment::get().getSoundManager()->stopSound(it->mSound); MWBase::Environment::get().getSoundManager()->stopSound(it->mSound);
mParent->removeChild(it->mNode); mParent->removeChild(it->mNode);

@ -321,10 +321,14 @@ void RegionWeather::chooseNewWeather()
{ {
sum += mChances[i]; sum += mChances[i];
if(chance <= sum) if(chance <= sum)
break; {
mWeather = i;
return;
}
} }
mWeather = i; // if we hit this path then the chances don't add to 100, choose a default weather instead
mWeather = 0;
} }
MoonModel::MoonModel(const std::string& name, const Fallback::Map& fallback) MoonModel::MoonModel(const std::string& name, const Fallback::Map& fallback)

@ -2996,6 +2996,14 @@ namespace MWWorld
} }
} }
bool World::isPlayerInJail() const
{
if (mGoToJail)
return true;
return MWBase::Environment::get().getWindowManager()->containsMode(MWGui::GM_Jail);
}
void World::spawnRandomCreature(const std::string &creatureList) void World::spawnRandomCreature(const std::string &creatureList)
{ {
const ESM::CreatureLevList* list = getStore().get<ESM::CreatureLevList>().find(creatureList); const ESM::CreatureLevList* list = getStore().get<ESM::CreatureLevList>().find(creatureList);
@ -3064,8 +3072,8 @@ namespace MWWorld
mRendering->spawnEffect(model, textureOverride, worldPos); mRendering->spawnEffect(model, textureOverride, worldPos);
} }
void World::explodeSpell(const osg::Vec3f &origin, const ESM::EffectList &effects, const Ptr &caster, ESM::RangeType rangeType, void World::explodeSpell(const osg::Vec3f &origin, const ESM::EffectList &effects, const Ptr &caster, const Ptr& ignore,
const std::string& id, const std::string& sourceName) ESM::RangeType rangeType, const std::string& id, const std::string& sourceName)
{ {
std::map<MWWorld::Ptr, std::vector<ESM::ENAMstruct> > toApply; std::map<MWWorld::Ptr, std::vector<ESM::ENAMstruct> > toApply;
for (std::vector<ESM::ENAMstruct>::const_iterator effectIt = effects.mList.begin(); for (std::vector<ESM::ENAMstruct>::const_iterator effectIt = effects.mList.begin();
@ -3113,6 +3121,9 @@ namespace MWWorld
if (apply->first == caster) if (apply->first == caster)
continue; continue;
if (apply->first == ignore)
continue;
if (source.isEmpty()) if (source.isEmpty())
source = apply->first; source = apply->first;

@ -622,8 +622,8 @@ namespace MWWorld
virtual void spawnEffect (const std::string& model, const std::string& textureOverride, const osg::Vec3f& worldPos); virtual void spawnEffect (const std::string& model, const std::string& textureOverride, const osg::Vec3f& worldPos);
virtual void explodeSpell (const osg::Vec3f& origin, const ESM::EffectList& effects, virtual void explodeSpell (const osg::Vec3f& origin, const ESM::EffectList& effects, const MWWorld::Ptr& caster,
const MWWorld::Ptr& caster, ESM::RangeType rangeType, const std::string& id, const std::string& sourceName); const MWWorld::Ptr& ignore, ESM::RangeType rangeType, const std::string& id, const std::string& sourceName);
virtual void activate (const MWWorld::Ptr& object, const MWWorld::Ptr& actor); virtual void activate (const MWWorld::Ptr& object, const MWWorld::Ptr& actor);
@ -644,6 +644,8 @@ namespace MWWorld
/// Return the distance between actor's weapon and target's collision box. /// Return the distance between actor's weapon and target's collision box.
virtual float getHitDistance(const MWWorld::ConstPtr& actor, const MWWorld::ConstPtr& target); virtual float getHitDistance(const MWWorld::ConstPtr& actor, const MWWorld::ConstPtr& target);
virtual bool isPlayerInJail() const;
}; };
} }

@ -14,6 +14,8 @@
namespace ESMTerrain namespace ESMTerrain
{ {
const float defaultHeight = -2048;
Storage::Storage(const VFS::Manager *vfs) Storage::Storage(const VFS::Manager *vfs)
: mVFS(vfs) : mVFS(vfs)
{ {
@ -62,7 +64,9 @@ namespace ESMTerrain
return true; return true;
} }
return false; min = defaultHeight;
max = defaultHeight;
return true;
} }
void Storage::fixNormal (osg::Vec3f& normal, int cellX, int cellY, int col, int row) void Storage::fixNormal (osg::Vec3f& normal, int cellX, int cellY, int col, int row)
@ -203,7 +207,7 @@ namespace ESMTerrain
assert (vertX < numVerts); assert (vertX < numVerts);
assert (vertY < numVerts); assert (vertY < numVerts);
float height = -2048; float height = defaultHeight;
if (heightData) if (heightData)
height = heightData->mHeights[col*ESM::Land::LAND_SIZE + row]; height = heightData->mHeights[col*ESM::Land::LAND_SIZE + row];
@ -412,7 +416,7 @@ namespace ESMTerrain
const ESM::Land* land = getLand(cellX, cellY); const ESM::Land* land = getLand(cellX, cellY);
if (!land || !(land->mDataTypes&ESM::Land::DATA_VHGT)) if (!land || !(land->mDataTypes&ESM::Land::DATA_VHGT))
return -2048; return defaultHeight;
// Mostly lifted from Ogre::Terrain::getHeightAtTerrainPosition // Mostly lifted from Ogre::Terrain::getHeightAtTerrainPosition

@ -61,6 +61,8 @@
<UserString key="SettingValueType" value="Float"/> <UserString key="SettingValueType" value="Float"/>
<UserString key="SettingMin" value="-100"/> <UserString key="SettingMin" value="-100"/>
<UserString key="SettingMax" value="100"/> <UserString key="SettingMax" value="100"/>
<UserString key="SettingLabelWidget" value="DifficultyText"/>
<UserString key="SettingLabelCaption" value="#{sDifficulty} (%s)"/>
</Widget> </Widget>
<Widget type="TextBox" skin="SandText" position="0 38 352 16" align="Left Top"> <Widget type="TextBox" skin="SandText" position="0 38 352 16" align="Left Top">
<Property key="Caption" value="#{sEasy}"/> <Property key="Caption" value="#{sEasy}"/>
@ -274,7 +276,6 @@
</Widget> </Widget>
<Widget type="TextBox" skin="NormalText" position="0 198 329 18" align="Left Top" name="FovText"> <Widget type="TextBox" skin="NormalText" position="0 198 329 18" align="Left Top" name="FovText">
<Property key="Caption" value="Field of View"/>
</Widget> </Widget>
<Widget type="MWScrollBar" skin="MW_HScroll" position="0 222 329 18" align="HStretch Top" name="FOVSlider"> <Widget type="MWScrollBar" skin="MW_HScroll" position="0 222 329 18" align="HStretch Top" name="FOVSlider">
<Property key="Range" value="10000"/> <Property key="Range" value="10000"/>
@ -285,6 +286,8 @@
<UserString key="SettingValueType" value="Float"/> <UserString key="SettingValueType" value="Float"/>
<UserString key="SettingMin" value="30"/> <UserString key="SettingMin" value="30"/>
<UserString key="SettingMax" value="110"/> <UserString key="SettingMax" value="110"/>
<UserString key="SettingLabelWidget" value="FovText"/>
<UserString key="SettingLabelCaption" value="Field of View (%s)"/>
</Widget> </Widget>
<Widget type="TextBox" skin="SandText" position="0 246 329 18" align="Left Top"> <Widget type="TextBox" skin="SandText" position="0 246 329 18" align="Left Top">
<Property key="Caption" value="#{sLow}"/> <Property key="Caption" value="#{sLow}"/>
@ -334,6 +337,8 @@
<UserString key="SettingType" value="Slider"/> <UserString key="SettingType" value="Slider"/>
<UserString key="SettingCategory" value="General"/> <UserString key="SettingCategory" value="General"/>
<UserString key="SettingName" value="anisotropy"/> <UserString key="SettingName" value="anisotropy"/>
<UserString key="SettingLabelWidget" value="AnisotropyLabel"/>
<UserString key="SettingLabelCaption" value="Anisotropy (%s)"/>
</Widget> </Widget>
</Widget> </Widget>
<Widget type="TextBox" skin="NormalText" position="4 130 322 18" align="Left Top"> <Widget type="TextBox" skin="NormalText" position="4 130 322 18" align="Left Top">

@ -11,41 +11,49 @@
<!-- Define the borders for pin button (up) --> <!-- Define the borders for pin button (up) -->
<Resource type="ResourceSkin" name="PU_B" size="12 2" texture="textures\menu_rightbuttonup_bottom.dds"> <Resource type="ResourceSkin" name="PU_B" size="12 2" texture="textures\menu_rightbuttonup_bottom.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 12 2"> <BasisSkin type="MainSkin" offset="0 0 12 2">
<State name="normal" offset="0 0 12 2"/> <State name="normal" offset="0 0 12 2"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PU_BR" size="2 2" texture="textures\menu_rightbuttonup_bottom_right.dds"> <Resource type="ResourceSkin" name="PU_BR" size="2 2" texture="textures\menu_rightbuttonup_bottom_right.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 2 2"> <BasisSkin type="MainSkin" offset="0 0 2 2">
<State name="normal" offset="0 0 2 2"/> <State name="normal" offset="0 0 2 2"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PU_R" size="2 12" texture="textures\menu_rightbuttonup_right.dds"> <Resource type="ResourceSkin" name="PU_R" size="2 12" texture="textures\menu_rightbuttonup_right.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 2 12"> <BasisSkin type="MainSkin" offset="0 0 2 12">
<State name="normal" offset="0 0 2 12"/> <State name="normal" offset="0 0 2 12"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PU_TR" size="2 2" texture="textures\menu_rightbuttonup_top_right.dds"> <Resource type="ResourceSkin" name="PU_TR" size="2 2" texture="textures\menu_rightbuttonup_top_right.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 2 2"> <BasisSkin type="MainSkin" offset="0 0 2 2">
<State name="normal" offset="0 0 2 2"/> <State name="normal" offset="0 0 2 2"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PU_T" size="12 2" texture="textures\menu_rightbuttonup_top.dds"> <Resource type="ResourceSkin" name="PU_T" size="12 2" texture="textures\menu_rightbuttonup_top.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 12 2"> <BasisSkin type="MainSkin" offset="0 0 12 2">
<State name="normal" offset="0 0 12 2"/> <State name="normal" offset="0 0 12 2"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PU_TL" size="2 2" texture="textures\menu_rightbuttonup_top_left.dds"> <Resource type="ResourceSkin" name="PU_TL" size="2 2" texture="textures\menu_rightbuttonup_top_left.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 2 2"> <BasisSkin type="MainSkin" offset="0 0 2 2">
<State name="normal" offset="0 0 2 2"/> <State name="normal" offset="0 0 2 2"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PU_L" size="2 12" texture="textures\menu_rightbuttonup_left.dds"> <Resource type="ResourceSkin" name="PU_L" size="2 12" texture="textures\menu_rightbuttonup_left.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 2 12"> <BasisSkin type="MainSkin" offset="0 0 2 12">
<State name="normal" offset="0 0 2 12"/> <State name="normal" offset="0 0 2 12"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PU_BL" size="2 2" texture="textures\menu_rightbuttonup_bottom_left.dds"> <Resource type="ResourceSkin" name="PU_BL" size="2 2" texture="textures\menu_rightbuttonup_bottom_left.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 2 2"> <BasisSkin type="MainSkin" offset="0 0 2 2">
<State name="normal" offset="0 0 2 2"/> <State name="normal" offset="0 0 2 2"/>
</BasisSkin> </BasisSkin>
@ -53,41 +61,49 @@
<!-- Define the borders for pin button (down) --> <!-- Define the borders for pin button (down) -->
<Resource type="ResourceSkin" name="PD_B" size="12 2" texture="textures\menu_rightbuttondown_bottom.dds"> <Resource type="ResourceSkin" name="PD_B" size="12 2" texture="textures\menu_rightbuttondown_bottom.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 12 2"> <BasisSkin type="MainSkin" offset="0 0 12 2">
<State name="normal" offset="0 0 12 2"/> <State name="normal" offset="0 0 12 2"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PD_BR" size="2 2" texture="textures\menu_rightbuttondown_bottom_right.dds"> <Resource type="ResourceSkin" name="PD_BR" size="2 2" texture="textures\menu_rightbuttondown_bottom_right.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 2 2"> <BasisSkin type="MainSkin" offset="0 0 2 2">
<State name="normal" offset="0 0 2 2"/> <State name="normal" offset="0 0 2 2"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PD_R" size="2 12" texture="textures\menu_rightbuttondown_right.dds"> <Resource type="ResourceSkin" name="PD_R" size="2 12" texture="textures\menu_rightbuttondown_right.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 2 12"> <BasisSkin type="MainSkin" offset="0 0 2 12">
<State name="normal" offset="0 0 2 12"/> <State name="normal" offset="0 0 2 12"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PD_TR" size="2 2" texture="textures\menu_rightbuttondown_top_right.dds"> <Resource type="ResourceSkin" name="PD_TR" size="2 2" texture="textures\menu_rightbuttondown_top_right.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 2 2"> <BasisSkin type="MainSkin" offset="0 0 2 2">
<State name="normal" offset="0 0 2 2"/> <State name="normal" offset="0 0 2 2"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PD_T" size="12 2" texture="textures\menu_rightbuttondown_top.dds"> <Resource type="ResourceSkin" name="PD_T" size="12 2" texture="textures\menu_rightbuttondown_top.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 12 2"> <BasisSkin type="MainSkin" offset="0 0 12 2">
<State name="normal" offset="0 0 12 2"/> <State name="normal" offset="0 0 12 2"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PD_TL" size="2 2" texture="textures\menu_rightbuttondown_top_left.dds"> <Resource type="ResourceSkin" name="PD_TL" size="2 2" texture="textures\menu_rightbuttondown_top_left.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 2 2"> <BasisSkin type="MainSkin" offset="0 0 2 2">
<State name="normal" offset="0 0 2 2"/> <State name="normal" offset="0 0 2 2"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PD_L" size="2 12" texture="textures\menu_rightbuttondown_left.dds"> <Resource type="ResourceSkin" name="PD_L" size="2 12" texture="textures\menu_rightbuttondown_left.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 2 12"> <BasisSkin type="MainSkin" offset="0 0 2 12">
<State name="normal" offset="0 0 2 12"/> <State name="normal" offset="0 0 2 12"/>
</BasisSkin> </BasisSkin>
</Resource> </Resource>
<Resource type="ResourceSkin" name="PD_BL" size="2 2" texture="textures\menu_rightbuttondown_bottom_left.dds"> <Resource type="ResourceSkin" name="PD_BL" size="2 2" texture="textures\menu_rightbuttondown_bottom_left.dds">
<Property key="NeedMouse" value="false"/>
<BasisSkin type="MainSkin" offset="0 0 2 2"> <BasisSkin type="MainSkin" offset="0 0 2 2">
<State name="normal" offset="0 0 2 2"/> <State name="normal" offset="0 0 2 2"/>
</BasisSkin> </BasisSkin>

@ -47,6 +47,10 @@ global map cell size = 18
# cell, 256 is 1/8 cell. See documentation for details. (e.g. 64 to 256). # cell, 256 is 1/8 cell. See documentation for details. (e.g. 64 to 256).
local map hud widget size = 256 local map hud widget size = 256
# Enables Fog of War rendering on the HUD map. Default is Off since with default settings
# the map is so small that the fog would not obscure anything, just darken the edges slightly.
local map hud fog of war = false
# Resolution of local map in GUI window in pixels. See documentation # Resolution of local map in GUI window in pixels. See documentation
# for details which may affect cell load performance. (e.g. 128 to 1024). # for details which may affect cell load performance. (e.g. 128 to 1024).
local map resolution = 256 local map resolution = 256

Loading…
Cancel
Save