1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-02-06 17:15:35 +00:00

Add OpenMW commits up to 25 Apr 2020

# Conflicts:
#	.travis.yml
#	apps/openmw/mwclass/container.cpp
#	apps/openmw/mwclass/door.cpp
This commit is contained in:
David Cernat 2020-04-25 09:52:58 +03:00
commit a20f8e77dc
119 changed files with 1285 additions and 763 deletions

View file

@ -23,6 +23,7 @@ Debian:
artifacts: artifacts:
paths: paths:
- build/artifacts/ - build/artifacts/
MacOS: MacOS:
tags: tags:
- macos - macos
@ -42,18 +43,21 @@ MacOS:
Windows: Windows:
tags: tags:
- win10 - windows
- msvc2017
except:
- branches # because our CI VMs are not public, MRs can't use them and timeout
stage: build stage: build
allow_failure: true allow_failure: true
script: script:
# - env # turn on for debugging - Set-Variable -Name "time" -Value (date -Format "%H:%m")
- sh %CI_PROJECT_DIR%/CI/before_script.msvc.sh -c Release -p x64 -v 2017 -V - echo ${time}
- SET msBuildLocation="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe" - echo "started by ${GITLAB_USER_NAME}"
- call %msBuildLocation% MSVC2017_64\OpenMW.sln /t:Build /p:Configuration=Release /m:%NUMBER_OF_PROCESSORS% # TODO: to anyone wanting to do further work here, we need to figure out how to get the below working
- 7z a OpenMW_MSVC2017_64_%CI_BUILD_REF_NAME%_%CI_BUILD_ID%.zip %CI_PROJECT_DIR%\MSVC2017_64\Release\ # TODO: on gitlab's new shared windows runners. They currently don't have bash or anything else installed
# TODO: it is currently just a bare windows 10 with powershell.
# - env # turn on for debugging
# - sh %CI_PROJECT_DIR%/CI/before_script.msvc.sh -c Release -p x64 -v 2017 -V
# - SET msBuildLocation="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\msbuild.exe"
# - call %msBuildLocation% MSVC2017_64\OpenMW.sln /t:Build /p:Configuration=Release /m:%NUMBER_OF_PROCESSORS%
# - 7z a OpenMW_MSVC2017_64_%CI_BUILD_REF_NAME%_%CI_BUILD_ID%.zip %CI_PROJECT_DIR%\MSVC2017_64\Release\
cache: cache:
paths: paths:
- deps - deps

View file

@ -26,7 +26,7 @@ addons:
# Audio, Video and Misc. deps # Audio, Video and Misc. deps
libsdl2-dev, libqt5opengl5-dev, libopenal-dev, libunshield-dev, libtinyxml-dev, libsdl2-dev, libqt5opengl5-dev, libopenal-dev, libunshield-dev, libtinyxml-dev,
# The other ones from OpenMW ppa # The other ones from OpenMW ppa
libbullet-dev, libopenscenegraph-3.4-dev, libmygui-dev, libbullet-dev, libopenscenegraph-dev, libmygui-dev,
# tes3mp stuff # tes3mp stuff
libboost-dev, libqt5opengl5-dev, libluajit-5.1-dev libboost-dev, libqt5opengl5-dev, libluajit-5.1-dev
] ]

View file

@ -1,11 +1,14 @@
0.47.0 0.47.0
------ ------
Bug #1952: Incorrect particle lighting
Bug #3676: NiParticleColorModifier isn't applied properly
Bug #5358: ForceGreeting always resets the dialogue window completely Bug #5358: ForceGreeting always resets the dialogue window completely
Bug #5363: Enchantment autocalc not always 0/1 Bug #5363: Enchantment autocalc not always 0/1
Bug #5364: Script fails/stops if trying to startscript an unknown script Bug #5364: Script fails/stops if trying to startscript an unknown script
Bug #5367: Selecting a spell on an enchanted item per hotkey always plays the equip sound Bug #5367: Selecting a spell on an enchanted item per hotkey always plays the equip sound
Bug #5369: Spawnpoint in the Grazelands doesn't produce oversized creatures Bug #5369: Spawnpoint in the Grazelands doesn't produce oversized creatures
Bug #5370: Opening an unlocked but trapped door uses the key
Feature #5362: Show the soul gems' trapped soul in count dialog Feature #5362: Show the soul gems' trapped soul in count dialog
0.46.0 0.46.0
@ -163,7 +166,6 @@
Bug #5099: Non-swimming enemies will enter water if player is water walking Bug #5099: Non-swimming enemies will enter water if player is water walking
Bug #5103: Sneaking state behavior is still inconsistent Bug #5103: Sneaking state behavior is still inconsistent
Bug #5104: Black Dart's enchantment doesn't trigger at low Enchant levels Bug #5104: Black Dart's enchantment doesn't trigger at low Enchant levels
Bug #5105: NPCs start combat with werewolves from any distance
Bug #5106: Still can jump even when encumbered Bug #5106: Still can jump even when encumbered
Bug #5110: ModRegion with a redundant numerical argument breaks script execution Bug #5110: ModRegion with a redundant numerical argument breaks script execution
Bug #5112: Insufficient magicka for current spell not reflected on HUD icon Bug #5112: Insufficient magicka for current spell not reflected on HUD icon
@ -223,7 +225,7 @@
Bug #5345: Dopey Necromancy does not work due to a missing quote Bug #5345: Dopey Necromancy does not work due to a missing quote
Bug #5350: An attempt to launch magic bolt causes "AL error invalid value" error Bug #5350: An attempt to launch magic bolt causes "AL error invalid value" error
Bug #5352: Light source items' duration is decremented while they aren't visible Bug #5352: Light source items' duration is decremented while they aren't visible
Feature #1774: Handle AvoidNode Feature #1724: Handle AvoidNode
Feature #2229: Improve pathfinding AI Feature #2229: Improve pathfinding AI
Feature #3025: Analogue gamepad movement controls Feature #3025: Analogue gamepad movement controls
Feature #3442: Default values for fallbacks from ini file Feature #3442: Default values for fallbacks from ini file

View file

@ -66,6 +66,8 @@ set(OPENMW_VERSION_COMMITDATE "")
set(OPENMW_VERSION "${OPENMW_VERSION_MAJOR}.${OPENMW_VERSION_MINOR}.${OPENMW_VERSION_RELEASE}") set(OPENMW_VERSION "${OPENMW_VERSION_MAJOR}.${OPENMW_VERSION_MINOR}.${OPENMW_VERSION_RELEASE}")
set(OPENMW_DOC_BASEURL "https://openmw.readthedocs.io/en/master/")
set(GIT_CHECKOUT FALSE) set(GIT_CHECKOUT FALSE)
if(EXISTS ${PROJECT_SOURCE_DIR}/.git) if(EXISTS ${PROJECT_SOURCE_DIR}/.git)
find_package(Git) find_package(Git)
@ -649,6 +651,7 @@ ENDIF(BUILD_OPENMW OR BUILD_OPENCS)
# Components # Components
add_subdirectory (components) add_subdirectory (components)
target_compile_definitions(components PRIVATE OPENMW_DOC_BASEURL="${OPENMW_DOC_BASEURL}")
# Apps and tools # Apps and tools
if (BUILD_OPENMW_MP) if (BUILD_OPENMW_MP)

View file

@ -21,7 +21,7 @@ Pull Request Guidelines
To facilitate the review process, your pull request description should include the following, if applicable: To facilitate the review process, your pull request description should include the following, if applicable:
* A link back to the bug report or forum discussion that prompted the change. Note: when linking bugs, use the syntax ```[Bug #xyz](https://bugs.openmw.org/issues/#xyz)``` to create a clickable link. Writing only 'Bug #xyz' will unfortunately create a link to the Github pull request with that number instead. * A link back to the bug report or forum discussion that prompted the change. Note: when linking bugs, use the syntax ```[Bug #xyz](https://gitlab.com/OpenMW/openmw/issues/#xyz)``` to create a clickable link. Writing only 'Bug #xyz' will unfortunately create a link to the Github pull request with that number instead.
* Summary of the changes made * Summary of the changes made
* Reasoning / motivation behind the change * Reasoning / motivation behind the change
* What testing you have carried out to verify the change * What testing you have carried out to verify the change

View file

@ -258,18 +258,37 @@ void loadCell(ESM::Cell &cell, ESM::ESMReader &esm, Arguments& info)
if(quiet) continue; if(quiet) continue;
std::cout << " Refnum: " << ref.mRefNum.mIndex << std::endl; std::cout << " Refnum: " << ref.mRefNum.mIndex << std::endl;
std::cout << " ID: '" << ref.mRefID << "'\n"; std::cout << " ID: " << ref.mRefID << std::endl;
std::cout << " Owner: '" << ref.mOwner << "'\n"; std::cout << " Position: (" << ref.mPos.pos[0] << ", " << ref.mPos.pos[1] << ", " << ref.mPos.pos[2] << ")" << std::endl;
std::cout << " Global: '" << ref.mGlobalVariable << "'" << std::endl; if (ref.mScale != 1.f)
std::cout << " Faction: '" << ref.mFaction << "'" << std::endl; std::cout << " Scale: " << ref.mScale << std::endl;
std::cout << " Faction rank: '" << ref.mFactionRank << "'" << std::endl; if (!ref.mOwner.empty())
std::cout << " Enchantment charge: '" << ref.mEnchantmentCharge << "'\n"; std::cout << " Owner: " << ref.mOwner << std::endl;
std::cout << " Uses/health: '" << ref.mChargeInt << "'\n"; if (!ref.mGlobalVariable.empty())
std::cout << " Gold value: '" << ref.mGoldValue << "'\n"; std::cout << " Global: " << ref.mGlobalVariable << std::endl;
std::cout << " Blocked: '" << static_cast<int>(ref.mReferenceBlocked) << "'" << std::endl; if (!ref.mFaction.empty())
std::cout << " Faction: " << ref.mFaction << std::endl;
if (!ref.mFaction.empty() || ref.mFactionRank != -2)
std::cout << " Faction rank: " << ref.mFactionRank << std::endl;
std::cout << " Enchantment charge: " << ref.mEnchantmentCharge << std::endl;
std::cout << " Uses/health: " << ref.mChargeInt << std::endl;
std::cout << " Gold value: " << ref.mGoldValue << std::endl;
std::cout << " Blocked: " << static_cast<int>(ref.mReferenceBlocked) << std::endl;
std::cout << " Deleted: " << deleted << std::endl; std::cout << " Deleted: " << deleted << std::endl;
if (!ref.mKey.empty()) if (!ref.mKey.empty())
std::cout << " Key: '" << ref.mKey << "'" << std::endl; std::cout << " Key: " << ref.mKey << std::endl;
std::cout << " Lock level: " << ref.mLockLevel << std::endl;
if (!ref.mTrap.empty())
std::cout << " Trap: " << ref.mTrap << std::endl;
if (!ref.mSoul.empty())
std::cout << " Soul: " << ref.mSoul << std::endl;
if (ref.mTeleport)
{
std::cout << " Destination position: (" << ref.mDoorDest.pos[0] << ", "
<< ref.mDoorDest.pos[1] << ", " << ref.mDoorDest.pos[2] << ")" << std::endl;
if (!ref.mDestCell.empty())
std::cout << " Destination cell: " << ref.mDestCell << std::endl;
}
} }
} }

View file

@ -1,6 +1,7 @@
#include "maindialog.hpp" #include "maindialog.hpp"
#include <components/version/version.hpp> #include <components/version/version.hpp>
#include <components/misc/helpviewer.hpp>
#include <QDate> #include <QDate>
#include <QMessageBox> #include <QMessageBox>
@ -54,12 +55,15 @@ Launcher::MainDialog::MainDialog(QWidget *parent)
iconWidget->setCurrentRow(0); iconWidget->setCurrentRow(0);
iconWidget->setFlow(QListView::LeftToRight); iconWidget->setFlow(QListView::LeftToRight);
QPushButton *helpButton = new QPushButton(tr("Help"));
QPushButton *playButton = new QPushButton(tr("Play")); QPushButton *playButton = new QPushButton(tr("Play"));
buttonBox->button(QDialogButtonBox::Close)->setText(tr("Close")); buttonBox->button(QDialogButtonBox::Close)->setText(tr("Close"));
buttonBox->addButton(helpButton, QDialogButtonBox::HelpRole);
buttonBox->addButton(playButton, QDialogButtonBox::AcceptRole); buttonBox->addButton(playButton, QDialogButtonBox::AcceptRole);
connect(buttonBox, SIGNAL(rejected()), this, SLOT(close())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(close()));
connect(buttonBox, SIGNAL(accepted()), this, SLOT(play())); connect(buttonBox, SIGNAL(accepted()), this, SLOT(play()));
connect(buttonBox, SIGNAL(helpRequested()), this, SLOT(help()));
// Remove what's this? button // Remove what's this? button
setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
@ -614,3 +618,8 @@ void Launcher::MainDialog::play()
if (mGameInvoker->startProcess(QLatin1String("tes3mp-browser"), true)) if (mGameInvoker->startProcess(QLatin1String("tes3mp-browser"), true))
return qApp->quit(); return qApp->quit();
} }
void Launcher::MainDialog::help()
{
Misc::HelpViewer::openHelp("reference/index.html");
}

View file

@ -59,6 +59,7 @@ namespace Launcher
public slots: public slots:
void changePage(QListWidgetItem *current, QListWidgetItem *previous); void changePage(QListWidgetItem *current, QListWidgetItem *previous);
void play(); void play();
void help();
private slots: private slots:
void wizardStarted(); void wizardStarted();

View file

@ -97,6 +97,10 @@ opencs_units_noqt (view/render
cellarrow cellmarker cellborder pathgrid cellarrow cellmarker cellborder pathgrid
) )
opencs_hdrs_noqt (view/render
mask
)
opencs_units (view/tools opencs_units (view/tools
reportsubview reporttable searchsubview searchbox merge reportsubview reporttable searchsubview searchbox merge

View file

@ -271,6 +271,8 @@ void CSMPrefs::State::declare()
declareShortcut ("document-file-newaddon", "New Addon", QKeySequence()); declareShortcut ("document-file-newaddon", "New Addon", QKeySequence());
declareShortcut ("document-file-open", "Open", QKeySequence(Qt::ControlModifier | Qt::Key_O)); declareShortcut ("document-file-open", "Open", QKeySequence(Qt::ControlModifier | Qt::Key_O));
declareShortcut ("document-file-save", "Save", QKeySequence(Qt::ControlModifier | Qt::Key_S)); declareShortcut ("document-file-save", "Save", QKeySequence(Qt::ControlModifier | Qt::Key_S));
declareShortcut ("document-help-help", "Help", QKeySequence(Qt::Key_F1));
declareShortcut ("document-help-tutorial", "Tutorial", QKeySequence());
declareShortcut ("document-file-verify", "Verify", QKeySequence()); declareShortcut ("document-file-verify", "Verify", QKeySequence());
declareShortcut ("document-file-merge", "Merge", QKeySequence()); declareShortcut ("document-file-merge", "Merge", QKeySequence());
declareShortcut ("document-file-errorlog", "Open Load Error Log", QKeySequence()); declareShortcut ("document-file-errorlog", "Open Load Error Log", QKeySequence());

View file

@ -31,6 +31,7 @@
#include "../tools/subviews.hpp" #include "../tools/subviews.hpp"
#include <components/misc/helpviewer.hpp>
#include <components/version/version.hpp> #include <components/version/version.hpp>
#include "viewmanager.hpp" #include "viewmanager.hpp"
@ -315,6 +316,12 @@ void CSVDoc::View::setupHelpMenu()
{ {
QMenu *help = menuBar()->addMenu (tr ("Help")); QMenu *help = menuBar()->addMenu (tr ("Help"));
QAction* helpInfo = createMenuEntry("Help", ":/info.png", help, "document-help-help");
connect (helpInfo, SIGNAL (triggered()), this, SLOT (openHelp()));
QAction* tutorial = createMenuEntry("Tutorial", ":/info.png", help, "document-help-tutorial");
connect (tutorial, SIGNAL (triggered()), this, SLOT (tutorial()));
QAction* about = createMenuEntry("About OpenMW-CS", ":./info.png", help, "document-help-about"); QAction* about = createMenuEntry("About OpenMW-CS", ":./info.png", help, "document-help-about");
connect (about, SIGNAL (triggered()), this, SLOT (infoAbout())); connect (about, SIGNAL (triggered()), this, SLOT (infoAbout()));
@ -708,6 +715,16 @@ void CSVDoc::View::save()
mDocument->save(); mDocument->save();
} }
void CSVDoc::View::openHelp()
{
Misc::HelpViewer::openHelp("manuals/openmw-cs/index.html");
}
void CSVDoc::View::tutorial()
{
Misc::HelpViewer::openHelp("manuals/openmw-cs/tour.html");
}
void CSVDoc::View::infoAbout() void CSVDoc::View::infoAbout()
{ {
// Get current OpenMW version // Get current OpenMW version

View file

@ -169,6 +169,10 @@ namespace CSVDoc
void exit(); void exit();
static void openHelp();
static void tutorial();
void infoAbout(); void infoAbout();
void infoAboutQt(); void infoAboutQt();

View file

@ -1,12 +1,18 @@
#include "editwidget.hpp" #include "editwidget.hpp"
#include <QAbstractItemModel> #include <QAbstractItemModel>
#include <QAction>
#include <QContextMenuEvent>
#include <QMenu>
#include <QString> #include <QString>
#include <QApplication> #include <QApplication>
#include <components/misc/helpviewer.hpp>
#include "../../model/world/data.hpp" #include "../../model/world/data.hpp"
#include "../../model/world/idtablebase.hpp" #include "../../model/world/idtablebase.hpp"
#include "../../model/world/columns.hpp" #include "../../model/world/columns.hpp"
#include "../../model/prefs/shortcut.hpp"
CSVFilter::EditWidget::EditWidget (CSMWorld::Data& data, QWidget *parent) CSVFilter::EditWidget::EditWidget (CSMWorld::Data& data, QWidget *parent)
: QLineEdit (parent), mParser (data), mIsEmpty(true) : QLineEdit (parent), mParser (data), mIsEmpty(true)
@ -29,6 +35,13 @@ CSVFilter::EditWidget::EditWidget (CSMWorld::Data& data, QWidget *parent)
mStateColumnIndex = model->findColumnIndex(CSMWorld::Columns::ColumnId_Modification); mStateColumnIndex = model->findColumnIndex(CSMWorld::Columns::ColumnId_Modification);
mDescColumnIndex = model->findColumnIndex(CSMWorld::Columns::ColumnId_Description); mDescColumnIndex = model->findColumnIndex(CSMWorld::Columns::ColumnId_Description);
mHelpAction = new QAction (tr ("Help"), this);
connect (mHelpAction, SIGNAL (triggered()), this, SLOT (openHelp()));
mHelpAction->setIcon(QIcon(":/info.png"));
addAction (mHelpAction);
auto* openHelpShortcut = new CSMPrefs::Shortcut("help", this);
openHelpShortcut->associateAction(mHelpAction);
} }
void CSVFilter::EditWidget::textChanged (const QString& text) void CSVFilter::EditWidget::textChanged (const QString& text)
@ -211,3 +224,17 @@ std::string CSVFilter::EditWidget::generateFilter (std::pair< std::string, std::
return ss.str(); return ss.str();
} }
void CSVFilter::EditWidget::contextMenuEvent(QContextMenuEvent *event)
{
QMenu *menu = createStandardContextMenu();
menu->addAction(mHelpAction);
menu->exec(event->globalPos());
delete menu;
}
void CSVFilter::EditWidget::openHelp()
{
Misc::HelpViewer::openHelp("manuals/openmw-cs/record-filters.html");
}

View file

@ -26,6 +26,7 @@ namespace CSVFilter
bool mIsEmpty; bool mIsEmpty;
int mStateColumnIndex; int mStateColumnIndex;
int mDescColumnIndex; int mDescColumnIndex;
QAction *mHelpAction;
public: public:
@ -40,6 +41,7 @@ namespace CSVFilter
private: private:
std::string generateFilter(std::pair<std::string, std::vector<std::string> >& seekedString) const; std::string generateFilter(std::pair<std::string, std::vector<std::string> >& seekedString) const;
void contextMenuEvent (QContextMenuEvent *event) override;
private slots: private slots:
@ -51,6 +53,8 @@ namespace CSVFilter
void filterRowsInserted (const QModelIndex& parent, int start, int end); void filterRowsInserted (const QModelIndex& parent, int start, int end);
static void openHelp();
}; };
} }

View file

@ -8,10 +8,9 @@
#include <osgUtil/LineSegmentIntersector> #include <osgUtil/LineSegmentIntersector>
#include <components/sceneutil/vismask.hpp>
#include "../../model/world/cellcoordinates.hpp" #include "../../model/world/cellcoordinates.hpp"
#include "../widget/brushshapes.hpp" #include "../widget/brushshapes.hpp"
#include "mask.hpp"
CSVRender::BrushDraw::BrushDraw(osg::ref_ptr<osg::Group> parentNode, bool textureMode) : CSVRender::BrushDraw::BrushDraw(osg::ref_ptr<osg::Group> parentNode, bool textureMode) :
mParentNode(parentNode), mTextureMode(textureMode) mParentNode(parentNode), mTextureMode(textureMode)
@ -46,7 +45,7 @@ float CSVRender::BrushDraw::getIntersectionHeight (const osg::Vec3d& point)
intersector->setIntersectionLimit(osgUtil::LineSegmentIntersector::NO_LIMIT); intersector->setIntersectionLimit(osgUtil::LineSegmentIntersector::NO_LIMIT);
osgUtil::IntersectionVisitor visitor(intersector); osgUtil::IntersectionVisitor visitor(intersector);
visitor.setTraversalMask(SceneUtil::Mask_Terrain); visitor.setTraversalMask(Mask_Terrain);
mParentNode->accept(visitor); mParentNode->accept(visitor);
@ -258,7 +257,6 @@ void CSVRender::BrushDraw::update(osg::Vec3d point, int brushSize, CSVWidget::Br
{ {
if (mBrushDrawNode->containsNode(mGeometry)) if (mBrushDrawNode->containsNode(mGeometry))
mBrushDrawNode->removeChild(mGeometry); mBrushDrawNode->removeChild(mGeometry);
mBrushDrawNode->setNodeMask (SceneUtil::Mask_GUI);
float radius = (mLandSizeFactor * brushSize) / 2; float radius = (mLandSizeFactor * brushSize) / 2;
osg::Vec3d snapToGridPoint = point; osg::Vec3d snapToGridPoint = point;
if (mTextureMode) if (mTextureMode)

View file

@ -9,7 +9,6 @@
#include <components/esm/loadcell.hpp> #include <components/esm/loadcell.hpp>
#include <components/esm/loadland.hpp> #include <components/esm/loadland.hpp>
#include <components/sceneutil/pathgridutil.hpp> #include <components/sceneutil/pathgridutil.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/terrain/terraingrid.hpp> #include <components/terrain/terraingrid.hpp>
#include "../../model/world/idtable.hpp" #include "../../model/world/idtable.hpp"
@ -22,6 +21,7 @@
#include "cellborder.hpp" #include "cellborder.hpp"
#include "cellarrow.hpp" #include "cellarrow.hpp"
#include "cellmarker.hpp" #include "cellmarker.hpp"
#include "mask.hpp"
#include "pathgrid.hpp" #include "pathgrid.hpp"
#include "terrainstorage.hpp" #include "terrainstorage.hpp"
#include "object.hpp" #include "object.hpp"
@ -92,7 +92,7 @@ bool CSVRender::Cell::addObjects (int start, int end)
std::unique_ptr<Object> object (new Object (mData, mCellNode, id, false)); std::unique_ptr<Object> object (new Object (mData, mCellNode, id, false));
if (mSubModeElementMask & SceneUtil::Mask_EditorReference) if (mSubModeElementMask & Mask_Reference)
object->setSubMode (mSubMode); object->setSubMode (mSubMode);
mObjects.insert (std::make_pair (id, object.release())); mObjects.insert (std::make_pair (id, object.release()));
@ -134,7 +134,7 @@ void CSVRender::Cell::updateLand()
else else
{ {
mTerrain.reset(new Terrain::TerrainGrid(mCellNode, mCellNode, mTerrain.reset(new Terrain::TerrainGrid(mCellNode, mCellNode,
mData.getResourceSystem().get(), mTerrainStorage)); mData.getResourceSystem().get(), mTerrainStorage, Mask_Terrain));
} }
mTerrain->loadCell(esmLand.mX, esmLand.mY); mTerrain->loadCell(esmLand.mX, esmLand.mY);
@ -434,7 +434,7 @@ void CSVRender::Cell::reloadAssets()
void CSVRender::Cell::setSelection (int elementMask, Selection mode) void CSVRender::Cell::setSelection (int elementMask, Selection mode)
{ {
if (elementMask & SceneUtil::Mask_EditorReference) if (elementMask & Mask_Reference)
{ {
for (std::map<std::string, Object *>::const_iterator iter (mObjects.begin()); for (std::map<std::string, Object *>::const_iterator iter (mObjects.begin());
iter!=mObjects.end(); ++iter) iter!=mObjects.end(); ++iter)
@ -451,7 +451,7 @@ void CSVRender::Cell::setSelection (int elementMask, Selection mode)
iter->second->setSelected (selected); iter->second->setSelected (selected);
} }
} }
if (mPathgrid && elementMask & SceneUtil::Mask_Pathgrid) if (mPathgrid && elementMask & Mask_Pathgrid)
{ {
// Only one pathgrid may be selected, so some operations will only have an effect // Only one pathgrid may be selected, so some operations will only have an effect
// if the pathgrid is already focused // if the pathgrid is already focused
@ -546,12 +546,12 @@ std::vector<osg::ref_ptr<CSVRender::TagBase> > CSVRender::Cell::getSelection (un
{ {
std::vector<osg::ref_ptr<TagBase> > result; std::vector<osg::ref_ptr<TagBase> > result;
if (elementMask & SceneUtil::Mask_EditorReference) if (elementMask & Mask_Reference)
for (std::map<std::string, Object *>::const_iterator iter (mObjects.begin()); for (std::map<std::string, Object *>::const_iterator iter (mObjects.begin());
iter!=mObjects.end(); ++iter) iter!=mObjects.end(); ++iter)
if (iter->second->getSelected()) if (iter->second->getSelected())
result.push_back (iter->second->getTag()); result.push_back (iter->second->getTag());
if (mPathgrid && elementMask & SceneUtil::Mask_Pathgrid) if (mPathgrid && elementMask & Mask_Pathgrid)
if (mPathgrid->isSelected()) if (mPathgrid->isSelected())
result.push_back(mPathgrid->getTag()); result.push_back(mPathgrid->getTag());
@ -562,7 +562,7 @@ std::vector<osg::ref_ptr<CSVRender::TagBase> > CSVRender::Cell::getEdited (unsig
{ {
std::vector<osg::ref_ptr<TagBase> > result; std::vector<osg::ref_ptr<TagBase> > result;
if (elementMask & SceneUtil::Mask_EditorReference) if (elementMask & Mask_Reference)
for (std::map<std::string, Object *>::const_iterator iter (mObjects.begin()); for (std::map<std::string, Object *>::const_iterator iter (mObjects.begin());
iter!=mObjects.end(); ++iter) iter!=mObjects.end(); ++iter)
if (iter->second->isEdited()) if (iter->second->isEdited())
@ -576,7 +576,7 @@ void CSVRender::Cell::setSubMode (int subMode, unsigned int elementMask)
mSubMode = subMode; mSubMode = subMode;
mSubModeElementMask = elementMask; mSubModeElementMask = elementMask;
if (elementMask & SceneUtil::Mask_EditorReference) if (elementMask & Mask_Reference)
for (std::map<std::string, Object *>::const_iterator iter (mObjects.begin()); for (std::map<std::string, Object *>::const_iterator iter (mObjects.begin());
iter!=mObjects.end(); ++iter) iter!=mObjects.end(); ++iter)
iter->second->setSubMode (subMode); iter->second->setSubMode (subMode);
@ -584,10 +584,10 @@ void CSVRender::Cell::setSubMode (int subMode, unsigned int elementMask)
void CSVRender::Cell::reset (unsigned int elementMask) void CSVRender::Cell::reset (unsigned int elementMask)
{ {
if (elementMask & SceneUtil::Mask_EditorReference) if (elementMask & Mask_Reference)
for (std::map<std::string, Object *>::const_iterator iter (mObjects.begin()); for (std::map<std::string, Object *>::const_iterator iter (mObjects.begin());
iter!=mObjects.end(); ++iter) iter!=mObjects.end(); ++iter)
iter->second->reset(); iter->second->reset();
if (mPathgrid && elementMask & SceneUtil::Mask_Pathgrid) if (mPathgrid && elementMask & Mask_Pathgrid)
mPathgrid->resetIndicators(); mPathgrid->resetIndicators();
} }

View file

@ -11,10 +11,11 @@
#include "../../model/prefs/shortcutmanager.hpp" #include "../../model/prefs/shortcutmanager.hpp"
#include <components/misc/constants.hpp> #include <components/misc/constants.hpp>
#include <components/sceneutil/vismask.hpp>
#include "mask.hpp"
CSVRender::CellArrowTag::CellArrowTag (CellArrow *arrow) CSVRender::CellArrowTag::CellArrowTag (CellArrow *arrow)
: TagBase (SceneUtil::Mask_EditorCellArrow), mArrow (arrow) : TagBase (Mask_CellArrow), mArrow (arrow)
{} {}
CSVRender::CellArrow *CSVRender::CellArrowTag::getCellArrow() const CSVRender::CellArrow *CSVRender::CellArrowTag::getCellArrow() const
@ -174,7 +175,7 @@ CSVRender::CellArrow::CellArrow (osg::Group *cellNode, Direction direction,
mParentNode->addChild (mBaseNode); mParentNode->addChild (mBaseNode);
mBaseNode->setNodeMask (SceneUtil::Mask_EditorCellArrow); mBaseNode->setNodeMask (Mask_CellArrow);
adjustTransform(); adjustTransform();
buildShape(); buildShape();

View file

@ -7,7 +7,8 @@
#include <osg/PrimitiveSet> #include <osg/PrimitiveSet>
#include <components/esm/loadland.hpp> #include <components/esm/loadland.hpp>
#include <components/sceneutil/vismask.hpp>
#include "mask.hpp"
#include "../../model/world/cellcoordinates.hpp" #include "../../model/world/cellcoordinates.hpp"
@ -19,7 +20,7 @@ CSVRender::CellBorder::CellBorder(osg::Group* cellNode, const CSMWorld::CellCoor
: mParentNode(cellNode) : mParentNode(cellNode)
{ {
mBaseNode = new osg::PositionAttitudeTransform(); mBaseNode = new osg::PositionAttitudeTransform();
mBaseNode->setNodeMask(SceneUtil::Mask_EditorCellBorder); mBaseNode->setNodeMask(Mask_CellBorder);
mBaseNode->setPosition(osg::Vec3f(coords.getX() * CellSize, coords.getY() * CellSize, 10)); mBaseNode->setPosition(osg::Vec3f(coords.getX() * CellSize, coords.getY() * CellSize, 10));
mParentNode->addChild(mBaseNode); mParentNode->addChild(mBaseNode);

View file

@ -8,7 +8,7 @@
#include <components/misc/constants.hpp> #include <components/misc/constants.hpp>
CSVRender::CellMarkerTag::CellMarkerTag(CellMarker *marker) CSVRender::CellMarkerTag::CellMarkerTag(CellMarker *marker)
: TagBase(SceneUtil::Mask_EditorCellMarker), mMarker(marker) : TagBase(Mask_CellMarker), mMarker(marker)
{} {}
CSVRender::CellMarker *CSVRender::CellMarkerTag::getCellMarker() const CSVRender::CellMarker *CSVRender::CellMarkerTag::getCellMarker() const
@ -79,7 +79,7 @@ CSVRender::CellMarker::CellMarker(
mMarkerNode->getOrCreateStateSet()->setAttribute(mat); mMarkerNode->getOrCreateStateSet()->setAttribute(mat);
mMarkerNode->setUserData(new CellMarkerTag(this)); mMarkerNode->setUserData(new CellMarkerTag(this));
mMarkerNode->setNodeMask(SceneUtil::Mask_EditorCellMarker); mMarkerNode->setNodeMask(Mask_CellMarker);
mCellNode->addChild(mMarkerNode); mCellNode->addChild(mMarkerNode);

View file

@ -11,12 +11,12 @@
#include <components/resource/imagemanager.hpp> #include <components/resource/imagemanager.hpp>
#include <components/resource/resourcesystem.hpp> #include <components/resource/resourcesystem.hpp>
#include <components/sceneutil/waterutil.hpp> #include <components/sceneutil/waterutil.hpp>
#include <components/sceneutil/vismask.hpp>
#include "../../model/world/cell.hpp" #include "../../model/world/cell.hpp"
#include "../../model/world/cellcoordinates.hpp" #include "../../model/world/cellcoordinates.hpp"
#include "../../model/world/data.hpp" #include "../../model/world/data.hpp"
#include "mask.hpp"
namespace CSVRender namespace CSVRender
{ {
@ -38,7 +38,7 @@ namespace CSVRender
mWaterTransform->setPosition(osg::Vec3f(cellCoords.getX() * CellSize + CellSize / 2.f, mWaterTransform->setPosition(osg::Vec3f(cellCoords.getX() * CellSize + CellSize / 2.f,
cellCoords.getY() * CellSize + CellSize / 2.f, 0)); cellCoords.getY() * CellSize + CellSize / 2.f, 0));
mWaterTransform->setNodeMask(SceneUtil::Mask_Water); mWaterTransform->setNodeMask(Mask_Water);
mParentNode->addChild(mWaterTransform); mParentNode->addChild(mWaterTransform);
mWaterNode = new osg::Geode(); mWaterNode = new osg::Geode();

View file

@ -21,7 +21,7 @@
#include "../widget/scenetoolbar.hpp" #include "../widget/scenetoolbar.hpp"
#include "../widget/scenetoolmode.hpp" #include "../widget/scenetoolmode.hpp"
#include <components/sceneutil/vismask.hpp> #include "mask.hpp"
#include "object.hpp" #include "object.hpp"
#include "worldspacewidget.hpp" #include "worldspacewidget.hpp"
@ -97,7 +97,7 @@ osg::Vec3f CSVRender::InstanceMode::getScreenCoords(const osg::Vec3f& pos)
} }
CSVRender::InstanceMode::InstanceMode (WorldspaceWidget *worldspaceWidget, osg::ref_ptr<osg::Group> parentNode, QWidget *parent) CSVRender::InstanceMode::InstanceMode (WorldspaceWidget *worldspaceWidget, osg::ref_ptr<osg::Group> parentNode, QWidget *parent)
: EditMode (worldspaceWidget, QIcon (":scenetoolbar/editing-instance"), SceneUtil::Mask_EditorReference | SceneUtil::Mask_Terrain, "Instance editing", : EditMode (worldspaceWidget, QIcon (":scenetoolbar/editing-instance"), Mask_Reference | Mask_Terrain, "Instance editing",
parent), mSubMode (0), mSubModeId ("move"), mSelectionMode (0), mDragMode (DragMode_None), parent), mSubMode (0), mSubModeId ("move"), mSelectionMode (0), mDragMode (DragMode_None),
mDragAxis (-1), mLocked (false), mUnitScaleDist(1), mParentNode (parentNode) mDragAxis (-1), mLocked (false), mUnitScaleDist(1), mParentNode (parentNode)
{ {
@ -157,13 +157,13 @@ void CSVRender::InstanceMode::activate (CSVWidget::SceneToolbar *toolbar)
std::string subMode = mSubMode->getCurrentId(); std::string subMode = mSubMode->getCurrentId();
getWorldspaceWidget().setSubMode (getSubModeFromId (subMode), SceneUtil::Mask_EditorReference); getWorldspaceWidget().setSubMode (getSubModeFromId (subMode), Mask_Reference);
} }
void CSVRender::InstanceMode::deactivate (CSVWidget::SceneToolbar *toolbar) void CSVRender::InstanceMode::deactivate (CSVWidget::SceneToolbar *toolbar)
{ {
mDragMode = DragMode_None; mDragMode = DragMode_None;
getWorldspaceWidget().reset (SceneUtil::Mask_EditorReference); getWorldspaceWidget().reset (Mask_Reference);
if (mSelectionMode) if (mSelectionMode)
{ {
@ -216,7 +216,7 @@ void CSVRender::InstanceMode::secondaryEditPressed (const WorldspaceHitResult& h
void CSVRender::InstanceMode::primarySelectPressed (const WorldspaceHitResult& hit) void CSVRender::InstanceMode::primarySelectPressed (const WorldspaceHitResult& hit)
{ {
getWorldspaceWidget().clearSelection (SceneUtil::Mask_EditorReference); getWorldspaceWidget().clearSelection (Mask_Reference);
if (hit.tag) if (hit.tag)
{ {
@ -251,13 +251,13 @@ bool CSVRender::InstanceMode::primaryEditStartDrag (const QPoint& pos)
WorldspaceHitResult hit = getWorldspaceWidget().mousePick (pos, getWorldspaceWidget().getInteractionMask()); WorldspaceHitResult hit = getWorldspaceWidget().mousePick (pos, getWorldspaceWidget().getInteractionMask());
std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (SceneUtil::Mask_EditorReference); std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (Mask_Reference);
if (selection.empty()) if (selection.empty())
{ {
// Only change selection at the start of drag if no object is already selected // Only change selection at the start of drag if no object is already selected
if (hit.tag && CSMPrefs::get()["3D Scene Input"]["context-select"].isTrue()) if (hit.tag && CSMPrefs::get()["3D Scene Input"]["context-select"].isTrue())
{ {
getWorldspaceWidget().clearSelection (SceneUtil::Mask_EditorReference); getWorldspaceWidget().clearSelection (Mask_Reference);
if (CSVRender::ObjectTag *objectTag = dynamic_cast<CSVRender::ObjectTag *> (hit.tag.get())) if (CSVRender::ObjectTag *objectTag = dynamic_cast<CSVRender::ObjectTag *> (hit.tag.get()))
{ {
CSVRender::Object* object = objectTag->mObject; CSVRender::Object* object = objectTag->mObject;
@ -265,7 +265,7 @@ bool CSVRender::InstanceMode::primaryEditStartDrag (const QPoint& pos)
} }
} }
selection = getWorldspaceWidget().getSelection (SceneUtil::Mask_EditorReference); selection = getWorldspaceWidget().getSelection (Mask_Reference);
if (selection.empty()) if (selection.empty())
return false; return false;
} }
@ -291,7 +291,7 @@ bool CSVRender::InstanceMode::primaryEditStartDrag (const QPoint& pos)
mDragMode = DragMode_Scale; mDragMode = DragMode_Scale;
// Calculate scale factor // Calculate scale factor
std::vector<osg::ref_ptr<TagBase> > editedSelection = getWorldspaceWidget().getEdited (SceneUtil::Mask_EditorReference); std::vector<osg::ref_ptr<TagBase> > editedSelection = getWorldspaceWidget().getEdited (Mask_Reference);
osg::Vec3f center = getScreenCoords(getSelectionCenter(editedSelection)); osg::Vec3f center = getScreenCoords(getSelectionCenter(editedSelection));
int widgetHeight = getWorldspaceWidget().height(); int widgetHeight = getWorldspaceWidget().height();
@ -327,7 +327,7 @@ void CSVRender::InstanceMode::drag (const QPoint& pos, int diffX, int diffY, dou
osg::Vec3f offset; osg::Vec3f offset;
osg::Quat rotation; osg::Quat rotation;
std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getEdited (SceneUtil::Mask_EditorReference); std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getEdited (Mask_Reference);
if (mDragMode == DragMode_Move) if (mDragMode == DragMode_Move)
{ {
@ -484,7 +484,7 @@ void CSVRender::InstanceMode::drag (const QPoint& pos, int diffX, int diffY, dou
void CSVRender::InstanceMode::dragCompleted(const QPoint& pos) void CSVRender::InstanceMode::dragCompleted(const QPoint& pos)
{ {
std::vector<osg::ref_ptr<TagBase> > selection = std::vector<osg::ref_ptr<TagBase> > selection =
getWorldspaceWidget().getEdited (SceneUtil::Mask_EditorReference); getWorldspaceWidget().getEdited (Mask_Reference);
QUndoStack& undoStack = getWorldspaceWidget().getDocument().getUndoStack(); QUndoStack& undoStack = getWorldspaceWidget().getDocument().getUndoStack();
@ -516,7 +516,7 @@ void CSVRender::InstanceMode::dragCompleted(const QPoint& pos)
void CSVRender::InstanceMode::dragAborted() void CSVRender::InstanceMode::dragAborted()
{ {
getWorldspaceWidget().reset (SceneUtil::Mask_EditorReference); getWorldspaceWidget().reset (Mask_Reference);
mDragMode = DragMode_None; mDragMode = DragMode_None;
} }
@ -535,7 +535,7 @@ void CSVRender::InstanceMode::dragWheel (int diff, double speedFactor)
offset *= diff * speedFactor; offset *= diff * speedFactor;
std::vector<osg::ref_ptr<TagBase> > selection = std::vector<osg::ref_ptr<TagBase> > selection =
getWorldspaceWidget().getEdited (SceneUtil::Mask_EditorReference); getWorldspaceWidget().getEdited (Mask_Reference);
for (std::vector<osg::ref_ptr<TagBase> >::iterator iter (selection.begin()); for (std::vector<osg::ref_ptr<TagBase> >::iterator iter (selection.begin());
iter!=selection.end(); ++iter) iter!=selection.end(); ++iter)
@ -677,12 +677,12 @@ void CSVRender::InstanceMode::subModeChanged (const std::string& id)
{ {
mSubModeId = id; mSubModeId = id;
getWorldspaceWidget().abortDrag(); getWorldspaceWidget().abortDrag();
getWorldspaceWidget().setSubMode (getSubModeFromId (id), SceneUtil::Mask_EditorReference); getWorldspaceWidget().setSubMode (getSubModeFromId (id), Mask_Reference);
} }
void CSVRender::InstanceMode::deleteSelectedInstances(bool active) void CSVRender::InstanceMode::deleteSelectedInstances(bool active)
{ {
std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (SceneUtil::Mask_EditorReference); std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (Mask_Reference);
if (selection.empty()) return; if (selection.empty()) return;
CSMDoc::Document& document = getWorldspaceWidget().getDocument(); CSMDoc::Document& document = getWorldspaceWidget().getDocument();
@ -695,7 +695,7 @@ void CSVRender::InstanceMode::deleteSelectedInstances(bool active)
if (CSVRender::ObjectTag *objectTag = dynamic_cast<CSVRender::ObjectTag *> (tag.get())) if (CSVRender::ObjectTag *objectTag = dynamic_cast<CSVRender::ObjectTag *> (tag.get()))
macro.push(new CSMWorld::DeleteCommand(referencesTable, objectTag->mObject->getReferenceId())); macro.push(new CSMWorld::DeleteCommand(referencesTable, objectTag->mObject->getReferenceId()));
getWorldspaceWidget().clearSelection (SceneUtil::Mask_EditorReference); getWorldspaceWidget().clearSelection (Mask_Reference);
} }
void CSVRender::InstanceMode::dropInstance(DropMode dropMode, CSVRender::Object* object, float objectHeight) void CSVRender::InstanceMode::dropInstance(DropMode dropMode, CSVRender::Object* object, float objectHeight)
@ -713,9 +713,9 @@ void CSVRender::InstanceMode::dropInstance(DropMode dropMode, CSVRender::Object*
osgUtil::IntersectionVisitor visitor(intersector); osgUtil::IntersectionVisitor visitor(intersector);
if (dropMode == TerrainSep) if (dropMode == TerrainSep)
visitor.setTraversalMask(SceneUtil::Mask_Terrain); visitor.setTraversalMask(Mask_Terrain);
if (dropMode == CollisionSep) if (dropMode == CollisionSep)
visitor.setTraversalMask(SceneUtil::Mask_Terrain | SceneUtil::Mask_EditorReference); visitor.setTraversalMask(Mask_Terrain | Mask_Reference);
mParentNode->accept(visitor); mParentNode->accept(visitor);
@ -745,9 +745,9 @@ float CSVRender::InstanceMode::getDropHeight(DropMode dropMode, CSVRender::Objec
osgUtil::IntersectionVisitor visitor(intersector); osgUtil::IntersectionVisitor visitor(intersector);
if (dropMode == Terrain) if (dropMode == Terrain)
visitor.setTraversalMask(SceneUtil::Mask_Terrain); visitor.setTraversalMask(Mask_Terrain);
if (dropMode == Collision) if (dropMode == Collision)
visitor.setTraversalMask(SceneUtil::Mask_Terrain | SceneUtil::Mask_EditorReference); visitor.setTraversalMask(Mask_Terrain | Mask_Reference);
mParentNode->accept(visitor); mParentNode->accept(visitor);
@ -784,7 +784,7 @@ void CSVRender::InstanceMode::dropSelectedInstancesToTerrainSeparately()
void CSVRender::InstanceMode::handleDropMethod(DropMode dropMode, QString commandMsg) void CSVRender::InstanceMode::handleDropMethod(DropMode dropMode, QString commandMsg)
{ {
std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (SceneUtil::Mask_EditorReference); std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (Mask_Reference);
if (selection.empty()) if (selection.empty())
return; return;
@ -841,7 +841,7 @@ void CSVRender::InstanceMode::handleDropMethod(DropMode dropMode, QString comman
CSVRender::DropObjectDataHandler::DropObjectDataHandler(WorldspaceWidget* worldspacewidget) CSVRender::DropObjectDataHandler::DropObjectDataHandler(WorldspaceWidget* worldspacewidget)
: mWorldspaceWidget(worldspacewidget) : mWorldspaceWidget(worldspacewidget)
{ {
std::vector<osg::ref_ptr<TagBase> > selection = mWorldspaceWidget->getSelection (SceneUtil::Mask_EditorReference); std::vector<osg::ref_ptr<TagBase> > selection = mWorldspaceWidget->getSelection (Mask_Reference);
for(osg::ref_ptr<TagBase> tag: selection) for(osg::ref_ptr<TagBase> tag: selection)
{ {
if (CSVRender::ObjectTag *objectTag = dynamic_cast<CSVRender::ObjectTag *> (tag.get())) if (CSVRender::ObjectTag *objectTag = dynamic_cast<CSVRender::ObjectTag *> (tag.get()))
@ -850,7 +850,7 @@ CSVRender::DropObjectDataHandler::DropObjectDataHandler(WorldspaceWidget* worlds
osg::ref_ptr<osg::Group> objectNodeWithoutGUI = objectTag->mObject->getBaseNode(); osg::ref_ptr<osg::Group> objectNodeWithoutGUI = objectTag->mObject->getBaseNode();
osg::ComputeBoundsVisitor computeBounds; osg::ComputeBoundsVisitor computeBounds;
computeBounds.setTraversalMask(SceneUtil::Mask_EditorReference); computeBounds.setTraversalMask(Mask_Reference);
objectNodeWithoutGUI->accept(computeBounds); objectNodeWithoutGUI->accept(computeBounds);
osg::BoundingBox bounds = computeBounds.getBoundingBox(); osg::BoundingBox bounds = computeBounds.getBoundingBox();
float boundingBoxOffset = 0.0f; float boundingBoxOffset = 0.0f;
@ -860,14 +860,14 @@ CSVRender::DropObjectDataHandler::DropObjectDataHandler(WorldspaceWidget* worlds
mObjectHeights.emplace_back(boundingBoxOffset); mObjectHeights.emplace_back(boundingBoxOffset);
mOldMasks.emplace_back(objectNodeWithGUI->getNodeMask()); mOldMasks.emplace_back(objectNodeWithGUI->getNodeMask());
objectNodeWithGUI->setNodeMask(SceneUtil::Mask_Disabled); objectNodeWithGUI->setNodeMask(0);
} }
} }
} }
CSVRender::DropObjectDataHandler::~DropObjectDataHandler() CSVRender::DropObjectDataHandler::~DropObjectDataHandler()
{ {
std::vector<osg::ref_ptr<TagBase> > selection = mWorldspaceWidget->getSelection (SceneUtil::Mask_EditorReference); std::vector<osg::ref_ptr<TagBase> > selection = mWorldspaceWidget->getSelection (Mask_Reference);
int counter = 0; int counter = 0;
for(osg::ref_ptr<TagBase> tag: selection) for(osg::ref_ptr<TagBase> tag: selection)
{ {

View file

@ -6,15 +6,13 @@
#include "../../model/world/idtable.hpp" #include "../../model/world/idtable.hpp"
#include "../../model/world/commands.hpp" #include "../../model/world/commands.hpp"
#include <components/sceneutil/vismask.hpp>
#include "worldspacewidget.hpp" #include "worldspacewidget.hpp"
#include "object.hpp" #include "object.hpp"
namespace CSVRender namespace CSVRender
{ {
InstanceSelectionMode::InstanceSelectionMode(CSVWidget::SceneToolbar* parent, WorldspaceWidget& worldspaceWidget) InstanceSelectionMode::InstanceSelectionMode(CSVWidget::SceneToolbar* parent, WorldspaceWidget& worldspaceWidget)
: SelectionMode(parent, worldspaceWidget, SceneUtil::Mask_EditorReference) : SelectionMode(parent, worldspaceWidget, Mask_Reference)
{ {
mSelectSame = new QAction("Extend selection to instances with same object ID", this); mSelectSame = new QAction("Extend selection to instances with same object ID", this);
mDeleteSelection = new QAction("Delete selected instances", this); mDeleteSelection = new QAction("Delete selected instances", this);
@ -38,12 +36,12 @@ namespace CSVRender
void InstanceSelectionMode::selectSame() void InstanceSelectionMode::selectSame()
{ {
getWorldspaceWidget().selectAllWithSameParentId(SceneUtil::Mask_EditorReference); getWorldspaceWidget().selectAllWithSameParentId(Mask_Reference);
} }
void InstanceSelectionMode::deleteSelection() void InstanceSelectionMode::deleteSelection()
{ {
std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection(SceneUtil::Mask_EditorReference); std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection(Mask_Reference);
CSMWorld::IdTable& referencesTable = dynamic_cast<CSMWorld::IdTable&>( CSMWorld::IdTable& referencesTable = dynamic_cast<CSMWorld::IdTable&>(
*getWorldspaceWidget().getDocument().getData().getTableModel(CSMWorld::UniversalId::Type_References)); *getWorldspaceWidget().getDocument().getData().getTableModel(CSMWorld::UniversalId::Type_References));

View file

@ -0,0 +1,32 @@
#ifndef CSV_RENDER_ELEMENTS_H
#define CSV_RENDER_ELEMENTS_H
namespace CSVRender
{
/// Node masks used on the OSG scene graph in OpenMW-CS.
/// @note See the respective file in OpenMW (apps/openmw/mwrender/vismask.hpp)
/// for general usage hints about node masks.
/// @copydoc MWRender::VisMask
enum Mask
{
// elements that are part of the actual scene
Mask_Reference = 0x2,
Mask_Pathgrid = 0x4,
Mask_Water = 0x8,
Mask_Fog = 0x10,
Mask_Terrain = 0x20,
// used within models
Mask_ParticleSystem = 0x100,
Mask_Lighting = 0x200,
// control elements
Mask_CellMarker = 0x10000,
Mask_CellArrow = 0x20000,
Mask_CellBorder = 0x40000
};
}
#endif

View file

@ -29,9 +29,9 @@
#include <components/resource/scenemanager.hpp> #include <components/resource/scenemanager.hpp>
#include <components/sceneutil/lightutil.hpp> #include <components/sceneutil/lightutil.hpp>
#include <components/sceneutil/lightmanager.hpp> #include <components/sceneutil/lightmanager.hpp>
#include <components/sceneutil/vismask.hpp>
#include "actor.hpp" #include "actor.hpp"
#include "mask.hpp"
const float CSVRender::Object::MarkerShaftWidth = 30; const float CSVRender::Object::MarkerShaftWidth = 30;
@ -58,7 +58,7 @@ namespace
CSVRender::ObjectTag::ObjectTag (Object* object) CSVRender::ObjectTag::ObjectTag (Object* object)
: TagBase (SceneUtil::Mask_EditorReference), mObject (object) : TagBase (Mask_Reference), mObject (object)
{} {}
QString CSVRender::ObjectTag::getToolTip (bool hideBasics) const QString CSVRender::ObjectTag::getToolTip (bool hideBasics) const
@ -140,7 +140,7 @@ void CSVRender::Object::update()
if (light) if (light)
{ {
bool isExterior = false; // FIXME bool isExterior = false; // FIXME
SceneUtil::addLight(mBaseNode, light, isExterior); SceneUtil::addLight(mBaseNode, light, Mask_ParticleSystem, Mask_Lighting, isExterior);
} }
} }
@ -429,7 +429,7 @@ CSVRender::Object::Object (CSMWorld::Data& data, osg::Group* parentNode,
parentNode->addChild (mRootNode); parentNode->addChild (mRootNode);
mRootNode->setNodeMask(SceneUtil::Mask_EditorReference); mRootNode->setNodeMask(Mask_Reference);
if (referenceable) if (referenceable)
{ {

View file

@ -21,6 +21,7 @@
#include "../widget/scenetooltoggle2.hpp" #include "../widget/scenetooltoggle2.hpp"
#include "editmode.hpp" #include "editmode.hpp"
#include "mask.hpp"
#include "cameracontroller.hpp" #include "cameracontroller.hpp"
#include "cellarrow.hpp" #include "cellarrow.hpp"
#include "terraintexturemode.hpp" #include "terraintexturemode.hpp"
@ -126,8 +127,8 @@ void CSVRender::PagedWorldspaceWidget::addVisibilitySelectorButtons (
CSVWidget::SceneToolToggle2 *tool) CSVWidget::SceneToolToggle2 *tool)
{ {
WorldspaceWidget::addVisibilitySelectorButtons (tool); WorldspaceWidget::addVisibilitySelectorButtons (tool);
tool->addButton (Button_Terrain, SceneUtil::Mask_Terrain, "Terrain"); tool->addButton (Button_Terrain, Mask_Terrain, "Terrain");
//tool->addButton (Button_Fog, Mask_Fog, "Fog", "", true); tool->addButton (Button_Fog, Mask_Fog, "Fog", "", true);
} }
void CSVRender::PagedWorldspaceWidget::addEditModeSelectorButtons ( void CSVRender::PagedWorldspaceWidget::addEditModeSelectorButtons (
@ -141,16 +142,16 @@ void CSVRender::PagedWorldspaceWidget::addEditModeSelectorButtons (
tool->addButton ( tool->addButton (
new TerrainTextureMode (this, mRootNode, tool), "terrain-texture"); new TerrainTextureMode (this, mRootNode, tool), "terrain-texture");
tool->addButton ( tool->addButton (
new EditMode (this, QIcon (":placeholder"), SceneUtil::Mask_EditorReference, "Terrain vertex paint editing"), new EditMode (this, QIcon (":placeholder"), Mask_Reference, "Terrain vertex paint editing"),
"terrain-vertex"); "terrain-vertex");
tool->addButton ( tool->addButton (
new EditMode (this, QIcon (":placeholder"), SceneUtil::Mask_EditorReference, "Terrain movement"), new EditMode (this, QIcon (":placeholder"), Mask_Reference, "Terrain movement"),
"terrain-move"); "terrain-move");
} }
void CSVRender::PagedWorldspaceWidget::handleInteractionPress (const WorldspaceHitResult& hit, InteractionType type) void CSVRender::PagedWorldspaceWidget::handleInteractionPress (const WorldspaceHitResult& hit, InteractionType type)
{ {
if (hit.tag && hit.tag->getMask()==SceneUtil::Mask_EditorCellArrow) if (hit.tag && hit.tag->getMask()==Mask_CellArrow)
{ {
if (CellArrowTag *cellArrowTag = dynamic_cast<CSVRender::CellArrowTag *> (hit.tag.get())) if (CellArrowTag *cellArrowTag = dynamic_cast<CSVRender::CellArrowTag *> (hit.tag.get()))
{ {
@ -873,9 +874,9 @@ CSVWidget::SceneToolToggle2 *CSVRender::PagedWorldspaceWidget::makeControlVisibi
mControlElements = new CSVWidget::SceneToolToggle2 (parent, mControlElements = new CSVWidget::SceneToolToggle2 (parent,
"Controls & Guides Visibility", ":scenetoolbar/scene-view-marker-c", ":scenetoolbar/scene-view-marker-"); "Controls & Guides Visibility", ":scenetoolbar/scene-view-marker-c", ":scenetoolbar/scene-view-marker-");
mControlElements->addButton (1, SceneUtil::Mask_EditorCellMarker, "Cell Marker"); mControlElements->addButton (1, Mask_CellMarker, "Cell Marker");
mControlElements->addButton (2, SceneUtil::Mask_EditorCellArrow, "Cell Arrows"); mControlElements->addButton (2, Mask_CellArrow, "Cell Arrows");
mControlElements->addButton (4, SceneUtil::Mask_EditorCellBorder, "Cell Border"); mControlElements->addButton (4, Mask_CellBorder, "Cell Border");
mControlElements->setSelectionMask (0xffffffff); mControlElements->setSelectionMask (0xffffffff);

View file

@ -10,7 +10,6 @@
#include <osg/Vec3> #include <osg/Vec3>
#include <components/sceneutil/pathgridutil.hpp> #include <components/sceneutil/pathgridutil.hpp>
#include <components/sceneutil/vismask.hpp>
#include "../../model/world/cell.hpp" #include "../../model/world/cell.hpp"
#include "../../model/world/commands.hpp" #include "../../model/world/commands.hpp"
@ -32,7 +31,7 @@ namespace CSVRender
}; };
PathgridTag::PathgridTag(Pathgrid* pathgrid) PathgridTag::PathgridTag(Pathgrid* pathgrid)
: TagBase(SceneUtil::Mask_Pathgrid), mPathgrid(pathgrid) : TagBase(Mask_Pathgrid), mPathgrid(pathgrid)
{ {
} }
@ -71,7 +70,7 @@ namespace CSVRender
mBaseNode->setPosition(osg::Vec3f(mCoords.getX() * CoordScalar, mCoords.getY() * CoordScalar, 0.f)); mBaseNode->setPosition(osg::Vec3f(mCoords.getX() * CoordScalar, mCoords.getY() * CoordScalar, 0.f));
mBaseNode->setUserData(mTag); mBaseNode->setUserData(mTag);
mBaseNode->setUpdateCallback(new PathgridNodeCallback()); mBaseNode->setUpdateCallback(new PathgridNodeCallback());
mBaseNode->setNodeMask(SceneUtil::Mask_Pathgrid); mBaseNode->setNodeMask(Mask_Pathgrid);
mParent->addChild(mBaseNode); mParent->addChild(mBaseNode);
mPathgridGeode = new osg::Geode(); mPathgridGeode = new osg::Geode();

View file

@ -4,7 +4,6 @@
#include <QPoint> #include <QPoint>
#include <components/sceneutil/pathgridutil.hpp> #include <components/sceneutil/pathgridutil.hpp>
#include <components/sceneutil/vismask.hpp>
#include "../../model/prefs/state.hpp" #include "../../model/prefs/state.hpp"
@ -16,6 +15,7 @@
#include "../widget/scenetoolbar.hpp" #include "../widget/scenetoolbar.hpp"
#include "cell.hpp" #include "cell.hpp"
#include "mask.hpp"
#include "pathgrid.hpp" #include "pathgrid.hpp"
#include "pathgridselectionmode.hpp" #include "pathgridselectionmode.hpp"
#include "worldspacewidget.hpp" #include "worldspacewidget.hpp"
@ -23,7 +23,7 @@
namespace CSVRender namespace CSVRender
{ {
PathgridMode::PathgridMode(WorldspaceWidget* worldspaceWidget, QWidget* parent) PathgridMode::PathgridMode(WorldspaceWidget* worldspaceWidget, QWidget* parent)
: EditMode(worldspaceWidget, QIcon(":placeholder"), SceneUtil::Mask_Pathgrid | SceneUtil::Mask_Terrain | SceneUtil::Mask_EditorReference, : EditMode(worldspaceWidget, QIcon(":placeholder"), Mask_Pathgrid | Mask_Terrain | Mask_Reference,
getTooltip(), parent) getTooltip(), parent)
, mDragMode(DragMode_None) , mDragMode(DragMode_None)
, mFromNode(0) , mFromNode(0)
@ -110,7 +110,7 @@ namespace CSVRender
void PathgridMode::primarySelectPressed(const WorldspaceHitResult& hit) void PathgridMode::primarySelectPressed(const WorldspaceHitResult& hit)
{ {
getWorldspaceWidget().clearSelection(SceneUtil::Mask_Pathgrid); getWorldspaceWidget().clearSelection(Mask_Pathgrid);
if (hit.tag) if (hit.tag)
{ {
@ -131,7 +131,7 @@ namespace CSVRender
{ {
if (tag->getPathgrid()->getId() != mLastId) if (tag->getPathgrid()->getId() != mLastId)
{ {
getWorldspaceWidget().clearSelection(SceneUtil::Mask_Pathgrid); getWorldspaceWidget().clearSelection(Mask_Pathgrid);
mLastId = tag->getPathgrid()->getId(); mLastId = tag->getPathgrid()->getId();
} }
@ -142,12 +142,12 @@ namespace CSVRender
} }
} }
getWorldspaceWidget().clearSelection(SceneUtil::Mask_Pathgrid); getWorldspaceWidget().clearSelection(Mask_Pathgrid);
} }
bool PathgridMode::primaryEditStartDrag(const QPoint& pos) bool PathgridMode::primaryEditStartDrag(const QPoint& pos)
{ {
std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (SceneUtil::Mask_Pathgrid); std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (Mask_Pathgrid);
if (CSMPrefs::get()["3D Scene Input"]["context-select"].isTrue()) if (CSMPrefs::get()["3D Scene Input"]["context-select"].isTrue())
{ {
@ -156,7 +156,7 @@ namespace CSVRender
if (dynamic_cast<PathgridTag*>(hit.tag.get())) if (dynamic_cast<PathgridTag*>(hit.tag.get()))
{ {
primarySelectPressed(hit); primarySelectPressed(hit);
selection = getWorldspaceWidget().getSelection (SceneUtil::Mask_Pathgrid); selection = getWorldspaceWidget().getSelection (Mask_Pathgrid);
} }
} }
@ -192,7 +192,7 @@ namespace CSVRender
{ {
if (mDragMode == DragMode_Move) if (mDragMode == DragMode_Move)
{ {
std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection(SceneUtil::Mask_Pathgrid); std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection(Mask_Pathgrid);
for (std::vector<osg::ref_ptr<TagBase> >::iterator it = selection.begin(); it != selection.end(); ++it) for (std::vector<osg::ref_ptr<TagBase> >::iterator it = selection.begin(); it != selection.end(); ++it)
{ {
@ -233,7 +233,7 @@ namespace CSVRender
{ {
if (mDragMode == DragMode_Move) if (mDragMode == DragMode_Move)
{ {
std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (SceneUtil::Mask_Pathgrid); std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (Mask_Pathgrid);
for (std::vector<osg::ref_ptr<TagBase> >::iterator it = selection.begin(); it != selection.end(); ++it) for (std::vector<osg::ref_ptr<TagBase> >::iterator it = selection.begin(); it != selection.end(); ++it)
{ {
if (PathgridTag* tag = dynamic_cast<PathgridTag*>(it->get())) if (PathgridTag* tag = dynamic_cast<PathgridTag*>(it->get()))
@ -272,11 +272,11 @@ namespace CSVRender
} }
mDragMode = DragMode_None; mDragMode = DragMode_None;
getWorldspaceWidget().reset(SceneUtil::Mask_Pathgrid); getWorldspaceWidget().reset(Mask_Pathgrid);
} }
void PathgridMode::dragAborted() void PathgridMode::dragAborted()
{ {
getWorldspaceWidget().reset(SceneUtil::Mask_Pathgrid); getWorldspaceWidget().reset(Mask_Pathgrid);
} }
} }

View file

@ -13,7 +13,7 @@
namespace CSVRender namespace CSVRender
{ {
PathgridSelectionMode::PathgridSelectionMode(CSVWidget::SceneToolbar* parent, WorldspaceWidget& worldspaceWidget) PathgridSelectionMode::PathgridSelectionMode(CSVWidget::SceneToolbar* parent, WorldspaceWidget& worldspaceWidget)
: SelectionMode(parent, worldspaceWidget, SceneUtil::Mask_Pathgrid) : SelectionMode(parent, worldspaceWidget, Mask_Pathgrid)
{ {
mRemoveSelectedNodes = new QAction("Remove selected nodes", this); mRemoveSelectedNodes = new QAction("Remove selected nodes", this);
mRemoveSelectedEdges = new QAction("Remove edges between selected nodes", this); mRemoveSelectedEdges = new QAction("Remove edges between selected nodes", this);
@ -37,7 +37,7 @@ namespace CSVRender
void PathgridSelectionMode::removeSelectedNodes() void PathgridSelectionMode::removeSelectedNodes()
{ {
std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (SceneUtil::Mask_Pathgrid); std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (Mask_Pathgrid);
for (std::vector<osg::ref_ptr<TagBase> >::iterator it = selection.begin(); it != selection.end(); ++it) for (std::vector<osg::ref_ptr<TagBase> >::iterator it = selection.begin(); it != selection.end(); ++it)
{ {
@ -54,7 +54,7 @@ namespace CSVRender
void PathgridSelectionMode::removeSelectedEdges() void PathgridSelectionMode::removeSelectedEdges()
{ {
std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (SceneUtil::Mask_Pathgrid); std::vector<osg::ref_ptr<TagBase> > selection = getWorldspaceWidget().getSelection (Mask_Pathgrid);
for (std::vector<osg::ref_ptr<TagBase> >::iterator it = selection.begin(); it != selection.end(); ++it) for (std::vector<osg::ref_ptr<TagBase> >::iterator it = selection.begin(); it != selection.end(); ++it)
{ {

View file

@ -17,7 +17,6 @@
#include <components/resource/scenemanager.hpp> #include <components/resource/scenemanager.hpp>
#include <components/resource/resourcesystem.hpp> #include <components/resource/resourcesystem.hpp>
#include <components/sceneutil/lightmanager.hpp> #include <components/sceneutil/lightmanager.hpp>
#include <components/sceneutil/vismask.hpp>
#include "../widget/scenetoolmode.hpp" #include "../widget/scenetoolmode.hpp"
@ -26,6 +25,7 @@
#include "../../model/prefs/shortcuteventhandler.hpp" #include "../../model/prefs/shortcuteventhandler.hpp"
#include "lighting.hpp" #include "lighting.hpp"
#include "mask.hpp"
#include "cameracontroller.hpp" #include "cameracontroller.hpp"
namespace CSVRender namespace CSVRender
@ -71,7 +71,7 @@ RenderWidget::RenderWidget(QWidget *parent, Qt::WindowFlags f)
SceneUtil::LightManager* lightMgr = new SceneUtil::LightManager; SceneUtil::LightManager* lightMgr = new SceneUtil::LightManager;
lightMgr->setStartLight(1); lightMgr->setStartLight(1);
lightMgr->setLightingMask(SceneUtil::Mask_Lighting); lightMgr->setLightingMask(Mask_Lighting);
mRootNode = lightMgr; mRootNode = lightMgr;
mView->getCamera()->getOrCreateStateSet()->setMode(GL_NORMALIZE, osg::StateAttribute::ON); mView->getCamera()->getOrCreateStateSet()->setMode(GL_NORMALIZE, osg::StateAttribute::ON);
@ -88,8 +88,6 @@ RenderWidget::RenderWidget(QWidget *parent, Qt::WindowFlags f)
// Add ability to signal osg to show its statistics for debugging purposes // Add ability to signal osg to show its statistics for debugging purposes
mView->addEventHandler(new osgViewer::StatsHandler); mView->addEventHandler(new osgViewer::StatsHandler);
mView->getCamera()->setCullMask(~(SceneUtil::Mask_UpdateVisitor));
viewer.addView(mView); viewer.addView(mView);
viewer.setDone(false); viewer.setDone(false);
viewer.realize(); viewer.realize();
@ -122,7 +120,7 @@ void RenderWidget::flagAsModified()
void RenderWidget::setVisibilityMask(int mask) void RenderWidget::setVisibilityMask(int mask)
{ {
mView->getCamera()->setCullMask(mask | SceneUtil::Mask_ParticleSystem | SceneUtil::Mask_Lighting); mView->getCamera()->setCullMask(mask | Mask_ParticleSystem | Mask_Lighting);
} }
osg::Camera *RenderWidget::getCamera() osg::Camera *RenderWidget::getCamera()
@ -212,7 +210,7 @@ SceneWidget::SceneWidget(std::shared_ptr<Resource::ResourceSystem> resourceSyste
mOrbitCamControl = new OrbitCameraController(this); mOrbitCamControl = new OrbitCameraController(this);
mCurrentCamControl = mFreeCamControl; mCurrentCamControl = mFreeCamControl;
mOrbitCamControl->setPickingMask(SceneUtil::Mask_EditorReference | SceneUtil::Mask_Terrain); mOrbitCamControl->setPickingMask(Mask_Reference | Mask_Terrain);
mOrbitCamControl->setConstRoll( CSMPrefs::get()["3D Scene Input"]["navi-orbit-const-roll"].isTrue() ); mOrbitCamControl->setConstRoll( CSMPrefs::get()["3D Scene Input"]["navi-orbit-const-roll"].isTrue() );
@ -221,7 +219,7 @@ SceneWidget::SceneWidget(std::shared_ptr<Resource::ResourceSystem> resourceSyste
setLighting(&mLightingDay); setLighting(&mLightingDay);
mResourceSystem->getSceneManager()->setParticleSystemMask(SceneUtil::Mask_ParticleSystem); mResourceSystem->getSceneManager()->setParticleSystemMask(Mask_ParticleSystem);
// Recieve mouse move event even if mouse button is not pressed // Recieve mouse move event even if mouse button is not pressed
setMouseTracking(true); setMouseTracking(true);
@ -350,7 +348,7 @@ void SceneWidget::update(double dt)
} }
else else
{ {
mCurrentCamControl->setup(mRootNode, SceneUtil::Mask_EditorReference | SceneUtil::Mask_Terrain, CameraController::WorldUp); mCurrentCamControl->setup(mRootNode, Mask_Reference | Mask_Terrain, CameraController::WorldUp);
mCamPositionSet = true; mCamPositionSet = true;
} }
} }

View file

@ -3,6 +3,8 @@
#include "../widget/scenetoolmode.hpp" #include "../widget/scenetoolmode.hpp"
#include "mask.hpp"
class QAction; class QAction;
namespace CSVRender namespace CSVRender

View file

@ -1,9 +1,9 @@
#include "tagbase.hpp" #include "tagbase.hpp"
CSVRender::TagBase::TagBase (SceneUtil::VisMask mask) : mMask (mask) {} CSVRender::TagBase::TagBase (Mask mask) : mMask (mask) {}
SceneUtil::VisMask CSVRender::TagBase::getMask() const CSVRender::Mask CSVRender::TagBase::getMask() const
{ {
return mMask; return mMask;
} }

View file

@ -5,19 +5,19 @@
#include <QString> #include <QString>
#include <components/sceneutil/vismask.hpp> #include "mask.hpp"
namespace CSVRender namespace CSVRender
{ {
class TagBase : public osg::Referenced class TagBase : public osg::Referenced
{ {
SceneUtil::VisMask mMask; Mask mMask;
public: public:
TagBase (SceneUtil::VisMask mask); TagBase (Mask mask);
SceneUtil::VisMask getMask() const; Mask getMask() const;
virtual QString getToolTip (bool hideBasics) const; virtual QString getToolTip (bool hideBasics) const;

View file

@ -17,7 +17,6 @@
#include <components/esm/loadland.hpp> #include <components/esm/loadland.hpp>
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>
#include <components/sceneutil/vismask.hpp>
#include "../widget/brushshapes.hpp" #include "../widget/brushshapes.hpp"
#include "../widget/modebutton.hpp" #include "../widget/modebutton.hpp"
@ -40,12 +39,13 @@
#include "brushdraw.hpp" #include "brushdraw.hpp"
#include "editmode.hpp" #include "editmode.hpp"
#include "pagedworldspacewidget.hpp" #include "pagedworldspacewidget.hpp"
#include "mask.hpp"
#include "tagbase.hpp" #include "tagbase.hpp"
#include "terrainselection.hpp" #include "terrainselection.hpp"
#include "worldspacewidget.hpp" #include "worldspacewidget.hpp"
CSVRender::TerrainShapeMode::TerrainShapeMode (WorldspaceWidget *worldspaceWidget, osg::Group* parentNode, QWidget *parent) CSVRender::TerrainShapeMode::TerrainShapeMode (WorldspaceWidget *worldspaceWidget, osg::Group* parentNode, QWidget *parent)
: EditMode (worldspaceWidget, QIcon {":scenetoolbar/editing-terrain-shape"}, SceneUtil::Mask_Terrain | SceneUtil::Mask_EditorReference, "Terrain land editing", parent), : EditMode (worldspaceWidget, QIcon {":scenetoolbar/editing-terrain-shape"}, Mask_Terrain | Mask_Reference, "Terrain land editing", parent),
mParentNode(parentNode) mParentNode(parentNode)
{ {
} }

View file

@ -13,7 +13,6 @@
#include <osg/Group> #include <osg/Group>
#include <components/esm/loadland.hpp> #include <components/esm/loadland.hpp>
#include <components/sceneutil/vismask.hpp>
#include "../widget/modebutton.hpp" #include "../widget/modebutton.hpp"
#include "../widget/scenetoolbar.hpp" #include "../widget/scenetoolbar.hpp"
@ -37,11 +36,12 @@
#include "brushdraw.hpp" #include "brushdraw.hpp"
#include "editmode.hpp" #include "editmode.hpp"
#include "pagedworldspacewidget.hpp" #include "pagedworldspacewidget.hpp"
#include "mask.hpp"
#include "object.hpp" // Something small needed regarding pointers from here () #include "object.hpp" // Something small needed regarding pointers from here ()
#include "worldspacewidget.hpp" #include "worldspacewidget.hpp"
CSVRender::TerrainTextureMode::TerrainTextureMode (WorldspaceWidget *worldspaceWidget, osg::Group* parentNode, QWidget *parent) CSVRender::TerrainTextureMode::TerrainTextureMode (WorldspaceWidget *worldspaceWidget, osg::Group* parentNode, QWidget *parent)
: EditMode (worldspaceWidget, QIcon {":scenetoolbar/editing-terrain-texture"}, SceneUtil::Mask_Terrain | SceneUtil::Mask_EditorReference, "Terrain texture editing", parent), : EditMode (worldspaceWidget, QIcon {":scenetoolbar/editing-terrain-texture"}, Mask_Terrain | Mask_Reference, "Terrain texture editing", parent),
mBrushTexture("L0#0"), mBrushTexture("L0#0"),
mBrushSize(1), mBrushSize(1),
mBrushShape(CSVWidget::BrushShape_Point), mBrushShape(CSVWidget::BrushShape_Point),

View file

@ -16,6 +16,7 @@
#include "../widget/scenetooltoggle2.hpp" #include "../widget/scenetooltoggle2.hpp"
#include "cameracontroller.hpp" #include "cameracontroller.hpp"
#include "mask.hpp"
#include "tagbase.hpp" #include "tagbase.hpp"
void CSVRender::UnpagedWorldspaceWidget::update() void CSVRender::UnpagedWorldspaceWidget::update()
@ -303,8 +304,8 @@ void CSVRender::UnpagedWorldspaceWidget::addVisibilitySelectorButtons (
CSVWidget::SceneToolToggle2 *tool) CSVWidget::SceneToolToggle2 *tool)
{ {
WorldspaceWidget::addVisibilitySelectorButtons (tool); WorldspaceWidget::addVisibilitySelectorButtons (tool);
tool->addButton (Button_Terrain, SceneUtil::Mask_Terrain, "Terrain", "", true); tool->addButton (Button_Terrain, Mask_Terrain, "Terrain", "", true);
//tool->addButton (Button_Fog, Mask_Fog, "Fog"); tool->addButton (Button_Fog, Mask_Fog, "Fog");
} }
std::string CSVRender::UnpagedWorldspaceWidget::getStartupInstruction() std::string CSVRender::UnpagedWorldspaceWidget::getStartupInstruction()

View file

@ -26,9 +26,8 @@
#include "../widget/scenetooltoggle2.hpp" #include "../widget/scenetooltoggle2.hpp"
#include "../widget/scenetoolrun.hpp" #include "../widget/scenetoolrun.hpp"
#include <components/sceneutil/vismask.hpp>
#include "object.hpp" #include "object.hpp"
#include "mask.hpp"
#include "instancemode.hpp" #include "instancemode.hpp"
#include "pathgridmode.hpp" #include "pathgridmode.hpp"
#include "cameracontroller.hpp" #include "cameracontroller.hpp"
@ -139,7 +138,7 @@ void CSVRender::WorldspaceWidget::settingChanged (const CSMPrefs::Setting *setti
{ {
float alpha = setting->toDouble(); float alpha = setting->toDouble();
// getSelection is virtual, thus this can not be called from the constructor // getSelection is virtual, thus this can not be called from the constructor
auto selection = getSelection(SceneUtil::Mask_EditorReference); auto selection = getSelection(Mask_Reference);
for (osg::ref_ptr<TagBase> tag : selection) for (osg::ref_ptr<TagBase> tag : selection)
{ {
if (auto objTag = dynamic_cast<ObjectTag*>(tag.get())) if (auto objTag = dynamic_cast<ObjectTag*>(tag.get()))
@ -346,7 +345,7 @@ unsigned int CSVRender::WorldspaceWidget::getVisibilityMask() const
void CSVRender::WorldspaceWidget::setInteractionMask (unsigned int mask) void CSVRender::WorldspaceWidget::setInteractionMask (unsigned int mask)
{ {
mInteractionMask = mask | SceneUtil::Mask_EditorCellMarker | SceneUtil::Mask_EditorCellArrow; mInteractionMask = mask | Mask_CellMarker | Mask_CellArrow;
} }
unsigned int CSVRender::WorldspaceWidget::getInteractionMask() const unsigned int CSVRender::WorldspaceWidget::getInteractionMask() const
@ -362,9 +361,9 @@ void CSVRender::WorldspaceWidget::setEditLock (bool locked)
void CSVRender::WorldspaceWidget::addVisibilitySelectorButtons ( void CSVRender::WorldspaceWidget::addVisibilitySelectorButtons (
CSVWidget::SceneToolToggle2 *tool) CSVWidget::SceneToolToggle2 *tool)
{ {
tool->addButton (Button_Reference, SceneUtil::Mask_EditorReference, "Instances"); tool->addButton (Button_Reference, Mask_Reference, "Instances");
tool->addButton (Button_Water, SceneUtil::Mask_Water, "Water"); tool->addButton (Button_Water, Mask_Water, "Water");
tool->addButton (Button_Pathgrid, SceneUtil::Mask_Pathgrid, "Pathgrid"); tool->addButton (Button_Pathgrid, Mask_Pathgrid, "Pathgrid");
} }
void CSVRender::WorldspaceWidget::addEditModeSelectorButtons (CSVWidget::SceneToolMode *tool) void CSVRender::WorldspaceWidget::addEditModeSelectorButtons (CSVWidget::SceneToolMode *tool)

View file

@ -8,6 +8,7 @@
#include "../../model/world/tablemimedata.hpp" #include "../../model/world/tablemimedata.hpp"
#include "scenewidget.hpp" #include "scenewidget.hpp"
#include "mask.hpp"
namespace CSMPrefs namespace CSMPrefs
{ {

View file

@ -7,6 +7,7 @@
#include <QString> #include <QString>
#include <QtCore/qnamespace.h> #include <QtCore/qnamespace.h>
#include <components/misc/helpviewer.hpp>
#include <components/misc/stringops.hpp> #include <components/misc/stringops.hpp>
#include "../../model/doc/document.hpp" #include "../../model/doc/document.hpp"
@ -155,6 +156,9 @@ void CSVWorld::Table::contextMenuEvent (QContextMenuEvent *event)
} }
} }
if (mHelpAction)
menu.addAction (mHelpAction);
menu.exec (event->globalPos()); menu.exec (event->globalPos());
} }
@ -387,6 +391,13 @@ CSVWorld::Table::Table (const CSMWorld::UniversalId& id,
connect (mEditIdAction, SIGNAL (triggered()), this, SLOT (editCell())); connect (mEditIdAction, SIGNAL (triggered()), this, SLOT (editCell()));
addAction (mEditIdAction); addAction (mEditIdAction);
mHelpAction = new QAction (tr ("Help"), this);
connect (mHelpAction, SIGNAL (triggered()), this, SLOT (openHelp()));
mHelpAction->setIcon(QIcon(":/info.png"));
addAction (mHelpAction);
CSMPrefs::Shortcut* openHelpShortcut = new CSMPrefs::Shortcut("help", this);
openHelpShortcut->associateAction(mHelpAction);
connect (mProxyModel, SIGNAL (rowsRemoved (const QModelIndex&, int, int)), connect (mProxyModel, SIGNAL (rowsRemoved (const QModelIndex&, int, int)),
this, SLOT (tableSizeUpdate())); this, SLOT (tableSizeUpdate()));
@ -561,6 +572,11 @@ void CSVWorld::Table::editCell()
emit editRequest(mEditIdAction->getCurrentId(), ""); emit editRequest(mEditIdAction->getCurrentId(), "");
} }
void CSVWorld::Table::openHelp()
{
Misc::HelpViewer::openHelp("manuals/openmw-cs/tables.html");
}
void CSVWorld::Table::viewRecord() void CSVWorld::Table::viewRecord()
{ {
if (!(mModel->getFeatures() & CSMWorld::IdTableBase::Feature_View)) if (!(mModel->getFeatures() & CSMWorld::IdTableBase::Feature_View))

View file

@ -65,6 +65,7 @@ namespace CSVWorld
QAction *mPreviewAction; QAction *mPreviewAction;
QAction *mExtendedDeleteAction; QAction *mExtendedDeleteAction;
QAction *mExtendedRevertAction; QAction *mExtendedRevertAction;
QAction *mHelpAction;
TableEditIdAction *mEditIdAction; TableEditIdAction *mEditIdAction;
CSMWorld::IdTableProxyModel *mProxyModel; CSMWorld::IdTableProxyModel *mProxyModel;
CSMWorld::IdTableBase *mModel; CSMWorld::IdTableBase *mModel;
@ -128,6 +129,8 @@ namespace CSVWorld
void editCell(); void editCell();
static void openHelp();
void editRecord(); void editRecord();
void cloneRecord(); void cloneRecord();

View file

@ -18,7 +18,7 @@ set(GAME_HEADER
source_group(game FILES ${GAME} ${GAME_HEADER}) source_group(game FILES ${GAME} ${GAME_HEADER})
add_openmw_dir (mwrender add_openmw_dir (mwrender
actors objects renderingmanager animation rotatecontroller sky npcanimation actors objects renderingmanager animation rotatecontroller sky npcanimation vismask
creatureanimation effectmanager util renderinginterface pathgrid rendermode weaponanimation creatureanimation effectmanager util renderinginterface pathgrid rendermode weaponanimation
bulletdebugdraw globalmap characterpreview camera localmap water terrainstorage ripplesimulation bulletdebugdraw globalmap characterpreview camera localmap water terrainstorage ripplesimulation
renderbin actoranimation landmanager navmesh actorspaths recastmesh renderbin actoranimation landmanager navmesh actorspaths recastmesh

View file

@ -26,7 +26,6 @@
#include <components/compiler/extensions0.hpp> #include <components/compiler/extensions0.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/sceneutil/workqueue.hpp> #include <components/sceneutil/workqueue.hpp>
#include <components/files/configurationmanager.hpp> #include <components/files/configurationmanager.hpp>
@ -60,6 +59,8 @@
#include "mwworld/player.hpp" #include "mwworld/player.hpp"
#include "mwworld/worldimp.hpp" #include "mwworld/worldimp.hpp"
#include "mwrender/vismask.hpp"
#include "mwclass/classes.hpp" #include "mwclass/classes.hpp"
#include "mwdialogue/dialoguemanagerimp.hpp" #include "mwdialogue/dialoguemanagerimp.hpp"
@ -659,7 +660,7 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
std::string myguiResources = (mResDir / "mygui").string(); std::string myguiResources = (mResDir / "mygui").string();
osg::ref_ptr<osg::Group> guiRoot = new osg::Group; osg::ref_ptr<osg::Group> guiRoot = new osg::Group;
guiRoot->setName("GUI Root"); guiRoot->setName("GUI Root");
guiRoot->setNodeMask(SceneUtil::Mask_GUI); guiRoot->setNodeMask(MWRender::Mask_GUI);
rootNode->addChild(guiRoot); rootNode->addChild(guiRoot);
MWGui::WindowManager* window = new MWGui::WindowManager(mViewer, guiRoot, mResourceSystem.get(), mWorkQueue.get(), MWGui::WindowManager* window = new MWGui::WindowManager(mViewer, guiRoot, mResourceSystem.get(), mWorkQueue.get(),
mCfgMgr.getLogPath().string() + std::string("/"), myguiResources, mCfgMgr.getLogPath().string() + std::string("/"), myguiResources,

View file

@ -3,7 +3,6 @@
#include <components/esm/loadacti.hpp> #include <components/esm/loadacti.hpp>
#include <components/misc/rng.hpp> #include <components/misc/rng.hpp>
#include <components/sceneutil/positionattitudetransform.hpp> #include <components/sceneutil/positionattitudetransform.hpp>
#include <components/sceneutil/vismask.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
@ -20,6 +19,7 @@
#include "../mwrender/objects.hpp" #include "../mwrender/objects.hpp"
#include "../mwrender/renderinginterface.hpp" #include "../mwrender/renderinginterface.hpp"
#include "../mwrender/vismask.hpp"
#include "../mwgui/tooltips.hpp" #include "../mwgui/tooltips.hpp"
@ -34,7 +34,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
renderingInterface.getObjects().insertModel(ptr, model, true); renderingInterface.getObjects().insertModel(ptr, model, true);
ptr.getRefData().getBaseNode()->setNodeMask(SceneUtil::Mask_Static); ptr.getRefData().getBaseNode()->setNodeMask(MWRender::Mask_Static);
} }
} }

View file

@ -189,7 +189,7 @@ namespace MWClass
} }
} }
if ((isLocked || isTrapped) && hasKey) if (isLocked && hasKey)
{ {
MWBase::Environment::get().getWindowManager ()->messageBox (keyName + " #{sKeyUsed}"); MWBase::Environment::get().getWindowManager ()->messageBox (keyName + " #{sKeyUsed}");
@ -199,8 +199,7 @@ namespace MWClass
Disable unilateral unlocking on this client and expect the server's reply to our Disable unilateral unlocking on this client and expect the server's reply to our
packet to do it instead packet to do it instead
*/ */
//if(isLocked) //ptr.getCellRef().unlock();
// ptr.getCellRef().unlock();
/* /*
End of tes3mp change (major) End of tes3mp change (major)
*/ */

View file

@ -15,7 +15,6 @@
#include <components/esm/loaddoor.hpp> #include <components/esm/loaddoor.hpp>
#include <components/esm/doorstate.hpp> #include <components/esm/doorstate.hpp>
#include <components/sceneutil/positionattitudetransform.hpp> #include <components/sceneutil/positionattitudetransform.hpp>
#include <components/sceneutil/vismask.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
@ -38,6 +37,7 @@
#include "../mwrender/objects.hpp" #include "../mwrender/objects.hpp"
#include "../mwrender/renderinginterface.hpp" #include "../mwrender/renderinginterface.hpp"
#include "../mwrender/animation.hpp" #include "../mwrender/animation.hpp"
#include "../mwrender/vismask.hpp"
#include "../mwmechanics/actorutil.hpp" #include "../mwmechanics/actorutil.hpp"
@ -70,7 +70,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
renderingInterface.getObjects().insertModel(ptr, model, true); renderingInterface.getObjects().insertModel(ptr, model, true);
ptr.getRefData().getBaseNode()->setNodeMask(SceneUtil::Mask_Static); ptr.getRefData().getBaseNode()->setNodeMask(MWRender::Mask_Static);
} }
} }
@ -170,7 +170,7 @@ namespace MWClass
} }
} }
if ((isLocked || isTrapped) && hasKey) if (isLocked && hasKey)
{ {
if(actor == MWMechanics::getPlayer()) if(actor == MWMechanics::getPlayer())
MWBase::Environment::get().getWindowManager()->messageBox(keyName + " #{sKeyUsed}"); MWBase::Environment::get().getWindowManager()->messageBox(keyName + " #{sKeyUsed}");
@ -181,8 +181,7 @@ namespace MWClass
Disable unilateral unlocking on this client and expect the server's reply to our Disable unilateral unlocking on this client and expect the server's reply to our
packet to do it instead packet to do it instead
*/ */
//if(isLocked) //ptr.getCellRef().unlock(); //Call the function here. because that makes sense.
// ptr.getCellRef().unlock(); //Call the function here. because that makes sense.
/* /*
End of tes3mp change (major) End of tes3mp change (major)
*/ */

View file

@ -2,7 +2,6 @@
#include <components/esm/loadstat.hpp> #include <components/esm/loadstat.hpp>
#include <components/sceneutil/positionattitudetransform.hpp> #include <components/sceneutil/positionattitudetransform.hpp>
#include <components/sceneutil/vismask.hpp>
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwphysics/physicssystem.hpp" #include "../mwphysics/physicssystem.hpp"
@ -10,6 +9,7 @@
#include "../mwrender/objects.hpp" #include "../mwrender/objects.hpp"
#include "../mwrender/renderinginterface.hpp" #include "../mwrender/renderinginterface.hpp"
#include "../mwrender/vismask.hpp"
namespace MWClass namespace MWClass
{ {
@ -19,7 +19,7 @@ namespace MWClass
if (!model.empty()) if (!model.empty())
{ {
renderingInterface.getObjects().insertModel(ptr, model); renderingInterface.getObjects().insertModel(ptr, model);
ptr.getRefData().getBaseNode()->setNodeMask(SceneUtil::Mask_Static); ptr.getRefData().getBaseNode()->setNodeMask(MWRender::Mask_Static);
} }
} }

View file

@ -355,7 +355,6 @@ namespace MWGui
{ {
if (exit()) if (exit())
{ {
resetHistory();
MWBase::Environment::get().getWindowManager()->removeGuiMode(GM_Dialogue); MWBase::Environment::get().getWindowManager()->removeGuiMode(GM_Dialogue);
} }
} }
@ -476,8 +475,9 @@ namespace MWGui
mDeleteLater.clear(); mDeleteLater.clear();
} }
void DialogueWindow::resetHistory() void DialogueWindow::onClose()
{ {
// Reset history
for (DialogueText* text : mHistoryContents) for (DialogueText* text : mHistoryContents)
delete text; delete text;
mHistoryContents.clear(); mHistoryContents.clear();
@ -663,7 +663,6 @@ namespace MWGui
void DialogueWindow::onGoodbyeActivated() void DialogueWindow::onGoodbyeActivated()
{ {
resetHistory();
MWBase::Environment::get().getDialogueManager()->goodbyeSelected(); MWBase::Environment::get().getDialogueManager()->goodbyeSelected();
MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_Dialogue); MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_Dialogue);
resetReference(); resetReference();
@ -718,7 +717,6 @@ namespace MWGui
void DialogueWindow::onReferenceUnavailable() void DialogueWindow::onReferenceUnavailable()
{ {
resetHistory();
MWBase::Environment::get().getWindowManager()->removeGuiMode(GM_Dialogue); MWBase::Environment::get().getWindowManager()->removeGuiMode(GM_Dialogue);
} }

View file

@ -133,6 +133,8 @@ namespace MWGui
void updateTopics(); void updateTopics();
void onClose();
protected: protected:
void updateTopicsPane(); void updateTopicsPane();
bool isCompanion(const MWWorld::Ptr& actor); bool isCompanion(const MWWorld::Ptr& actor);
@ -156,7 +158,6 @@ namespace MWGui
void updateDisposition(); void updateDisposition();
void restock(); void restock();
void deleteLater(); void deleteLater();
void resetHistory();
bool mIsCompanion; bool mIsCompanion;
std::list<std::string> mKeywords; std::list<std::string> mKeywords;

View file

@ -756,7 +756,8 @@ namespace MWGui
&& (type != typeid(ESM::Potion).name())) && (type != typeid(ESM::Potion).name()))
return; return;
if (object.getClass().getName(object) == "") // objects without name presented to user can never be picked up // An object that can be picked up must have a tooltip.
if (!object.getClass().hasToolTip(object))
return; return;
int count = object.getRefData().getCount(); int count = object.getRefData().getCount();

View file

@ -116,6 +116,12 @@ void KeyboardNavigation::onFrame()
if (!mEnabled) if (!mEnabled)
return; return;
if (!MWBase::Environment::get().getWindowManager()->isGuiMode())
{
MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(nullptr);
return;
}
MyGUI::Widget* focus = MyGUI::InputManager::getInstance().getKeyFocusWidget(); MyGUI::Widget* focus = MyGUI::InputManager::getInstance().getKeyFocusWidget();
if (focus == mCurrentFocus) if (focus == mCurrentFocus)
@ -215,6 +221,9 @@ bool KeyboardNavigation::injectKeyPress(MyGUI::KeyCode key, unsigned int text, b
bool KeyboardNavigation::switchFocus(int direction, bool wrap) bool KeyboardNavigation::switchFocus(int direction, bool wrap)
{ {
if (!MWBase::Environment::get().getWindowManager()->isGuiMode())
return false;
MyGUI::Widget* focus = MyGUI::InputManager::getInstance().getKeyFocusWidget(); MyGUI::Widget* focus = MyGUI::InputManager::getInstance().getKeyFocusWidget();
bool isCycle = (direction == D_Prev || direction == D_Next); bool isCycle = (direction == D_Prev || direction == D_Next);

View file

@ -1,5 +1,7 @@
#include "loadingscreen.hpp" #include "loadingscreen.hpp"
#include <array>
#include <osgViewer/Viewer> #include <osgViewer/Viewer>
#include <osg/Texture2D> #include <osg/Texture2D>
@ -14,13 +16,14 @@
#include <components/myguiplatform/myguitexture.hpp> #include <components/myguiplatform/myguitexture.hpp>
#include <components/settings/settings.hpp> #include <components/settings/settings.hpp>
#include <components/vfs/manager.hpp> #include <components/vfs/manager.hpp>
#include <components/sceneutil/vismask.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/statemanager.hpp" #include "../mwbase/statemanager.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
#include "../mwbase/inputmanager.hpp" #include "../mwbase/inputmanager.hpp"
#include "../mwrender/vismask.hpp"
#include "backgroundimage.hpp" #include "backgroundimage.hpp"
namespace MWGui namespace MWGui
@ -66,7 +69,7 @@ namespace MWGui
mVFS->normalizeFilename(pattern); mVFS->normalizeFilename(pattern);
/* priority given to the left */ /* priority given to the left */
std::list<std::string> supported_extensions = {".tga", ".dds", ".ktx", ".png", ".bmp", ".jpeg", ".jpg"}; const std::array<std::string, 7> supported_extensions {{".tga", ".dds", ".ktx", ".png", ".bmp", ".jpeg", ".jpg"}};
auto found = index.lower_bound(pattern); auto found = index.lower_bound(pattern);
while (found != index.end()) while (found != index.end())
@ -77,7 +80,7 @@ namespace MWGui
size_t pos = name.find_last_of('.'); size_t pos = name.find_last_of('.');
if (pos != std::string::npos) if (pos != std::string::npos)
{ {
for(auto const extension: supported_extensions) for(auto const& extension: supported_extensions)
{ {
if (name.compare(pos, name.size() - pos, extension) == 0) if (name.compare(pos, name.size() - pos, extension) == 0)
{ {
@ -334,8 +337,8 @@ namespace MWGui
// Turn off rendering except the GUI // Turn off rendering except the GUI
int oldUpdateMask = mViewer->getUpdateVisitor()->getTraversalMask(); int oldUpdateMask = mViewer->getUpdateVisitor()->getTraversalMask();
int oldCullMask = mViewer->getCamera()->getCullMask(); int oldCullMask = mViewer->getCamera()->getCullMask();
mViewer->getUpdateVisitor()->setTraversalMask(SceneUtil::Mask_GUI|SceneUtil::Mask_PreCompile); mViewer->getUpdateVisitor()->setTraversalMask(MWRender::Mask_GUI|MWRender::Mask_PreCompile);
mViewer->getCamera()->setCullMask(SceneUtil::Mask_GUI|SceneUtil::Mask_PreCompile); mViewer->getCamera()->setCullMask(MWRender::Mask_GUI|MWRender::Mask_PreCompile);
MWBase::Environment::get().getInputManager()->update(0, true, true); MWBase::Environment::get().getInputManager()->update(0, true, true);

View file

@ -42,7 +42,6 @@
#include <components/resource/resourcesystem.hpp> #include <components/resource/resourcesystem.hpp>
#include <components/resource/imagemanager.hpp> #include <components/resource/imagemanager.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/sceneutil/workqueue.hpp> #include <components/sceneutil/workqueue.hpp>
#include <components/translation/translation.hpp> #include <components/translation/translation.hpp>
@ -63,6 +62,8 @@
#include "../mwbase/soundmanager.hpp" #include "../mwbase/soundmanager.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwrender/vismask.hpp"
#include "../mwworld/class.hpp" #include "../mwworld/class.hpp"
#include "../mwworld/player.hpp" #include "../mwworld/player.hpp"
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"
@ -2007,8 +2008,8 @@ namespace MWGui
// Turn off all rendering except for the GUI // Turn off all rendering except for the GUI
int oldUpdateMask = mViewer->getUpdateVisitor()->getTraversalMask(); int oldUpdateMask = mViewer->getUpdateVisitor()->getTraversalMask();
int oldCullMask = mViewer->getCamera()->getCullMask(); int oldCullMask = mViewer->getCamera()->getCullMask();
mViewer->getUpdateVisitor()->setTraversalMask(SceneUtil::Mask_GUI); mViewer->getUpdateVisitor()->setTraversalMask(MWRender::Mask_GUI);
mViewer->getCamera()->setCullMask(SceneUtil::Mask_GUI); mViewer->getCamera()->setCullMask(MWRender::Mask_GUI);
MyGUI::IntSize screenSize = MyGUI::RenderManager::getInstance().getViewSize(); MyGUI::IntSize screenSize = MyGUI::RenderManager::getInstance().getViewSize();
sizeVideo(screenSize.width, screenSize.height); sizeVideo(screenSize.width, screenSize.height);

View file

@ -4,7 +4,6 @@
#include <components/esm/esmwriter.hpp> #include <components/esm/esmwriter.hpp>
#include <components/sceneutil/positionattitudetransform.hpp> #include <components/sceneutil/positionattitudetransform.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>
#include <components/misc/rng.hpp> #include <components/misc/rng.hpp>
#include <components/settings/settings.hpp> #include <components/settings/settings.hpp>
@ -44,6 +43,8 @@
#include "../mwmechanics/aibreathe.hpp" #include "../mwmechanics/aibreathe.hpp"
#include "../mwrender/vismask.hpp"
#include "spellcasting.hpp" #include "spellcasting.hpp"
#include "steering.hpp" #include "steering.hpp"
#include "npcstats.hpp" #include "npcstats.hpp"
@ -1543,11 +1544,11 @@ namespace MWMechanics
const float dist = (player.getRefData().getPosition().asVec3() - ptr.getRefData().getPosition().asVec3()).length(); const float dist = (player.getRefData().getPosition().asVec3() - ptr.getRefData().getPosition().asVec3()).length();
if (dist > mActorsProcessingRange) if (dist > mActorsProcessingRange)
{ {
ptr.getRefData().getBaseNode()->setNodeMask(SceneUtil::Mask_Disabled); ptr.getRefData().getBaseNode()->setNodeMask(0);
return; return;
} }
else else
ptr.getRefData().getBaseNode()->setNodeMask(SceneUtil::Mask_Actor); ptr.getRefData().getBaseNode()->setNodeMask(MWRender::Mask_Actor);
// Fade away actors on large distance (>90% of actor's processing distance) // Fade away actors on large distance (>90% of actor's processing distance)
float visibilityRatio = 1.0; float visibilityRatio = 1.0;
@ -1925,12 +1926,12 @@ namespace MWMechanics
if (!inRange) if (!inRange)
{ {
iter->first.getRefData().getBaseNode()->setNodeMask(SceneUtil::Mask_Disabled); iter->first.getRefData().getBaseNode()->setNodeMask(0);
world->setActorCollisionMode(iter->first, false, false); world->setActorCollisionMode(iter->first, false, false);
continue; continue;
} }
else if (!isPlayer) else if (!isPlayer)
iter->first.getRefData().getBaseNode()->setNodeMask(SceneUtil::Mask_Actor); iter->first.getRefData().getBaseNode()->setNodeMask(MWRender::Mask_Actor);
const bool isDead = iter->first.getClass().getCreatureStats(iter->first).isDead(); const bool isDead = iter->first.getClass().getCreatureStats(iter->first).isDead();
if (!isDead && iter->first.getClass().getCreatureStats(iter->first).isParalyzed()) if (!isDead && iter->first.getClass().getCreatureStats(iter->first).isParalyzed())

View file

@ -632,7 +632,9 @@ void CharacterController::refreshMovementAnims(const std::string& weapShortGroup
// The first person anims don't have any velocity to calculate a speed multiplier from. // The first person anims don't have any velocity to calculate a speed multiplier from.
// We use the third person velocities instead. // We use the third person velocities instead.
// FIXME: should be pulled from the actual animation, but it is not presently loaded. // FIXME: should be pulled from the actual animation, but it is not presently loaded.
mMovementAnimSpeed = (isSneaking() ? 33.5452f : (isRunning() ? 222.857f : 154.064f)); bool sneaking = mMovementState == CharState_SneakForward || mMovementState == CharState_SneakBack
|| mMovementState == CharState_SneakLeft || mMovementState == CharState_SneakRight;
mMovementAnimSpeed = (sneaking ? 33.5452f : (isRunning() ? 222.857f : 154.064f));
mMovementAnimationControlled = false; mMovementAnimationControlled = false;
} }
} }

View file

@ -574,7 +574,7 @@ namespace MWMechanics
osg::Vec3f pos1 (actor1.getRefData().getPosition().asVec3()); osg::Vec3f pos1 (actor1.getRefData().getPosition().asVec3());
osg::Vec3f pos2 (actor2.getRefData().getPosition().asVec3()); osg::Vec3f pos2 (actor2.getRefData().getPosition().asVec3());
float d = getAggroDistance(actor2, pos1, pos2); float d = getAggroDistance(actor1, pos1, pos2);
static const int iFightDistanceBase = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find( static const int iFightDistanceBase = MWBase::Environment::get().getWorld()->getStore().get<ESM::GameSetting>().find(
"iFightDistanceBase")->mValue.getInteger(); "iFightDistanceBase")->mValue.getInteger();

View file

@ -15,7 +15,6 @@
#include <components/sceneutil/lightmanager.hpp> #include <components/sceneutil/lightmanager.hpp>
#include <components/sceneutil/lightutil.hpp> #include <components/sceneutil/lightutil.hpp>
#include <components/sceneutil/visitor.hpp> #include <components/sceneutil/visitor.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/misc/stringops.hpp> #include <components/misc/stringops.hpp>
@ -32,6 +31,8 @@
#include "../mwmechanics/actorutil.hpp" #include "../mwmechanics/actorutil.hpp"
#include "../mwmechanics/weapontype.hpp" #include "../mwmechanics/weapontype.hpp"
#include "vismask.hpp"
namespace MWRender namespace MWRender
{ {
@ -366,7 +367,7 @@ void ActorAnimation::updateHolsteredWeapon(bool showHolsteredWeapons)
// Otherwise add the enchanted glow to it. // Otherwise add the enchanted glow to it.
if (!showHolsteredWeapons) if (!showHolsteredWeapons)
{ {
weaponNode->setNodeMask(SceneUtil::Mask_Disabled); weaponNode->setNodeMask(0);
} }
else else
{ {
@ -540,7 +541,7 @@ void ActorAnimation::addHiddenItemLight(const MWWorld::ConstPtr& item, const ESM
bool exterior = mPtr.isInCell() && mPtr.getCell()->getCell()->isExterior(); bool exterior = mPtr.isInCell() && mPtr.getCell()->getCell()->isExterior();
osg::Vec4f ambient(1,1,1,1); osg::Vec4f ambient(1,1,1,1);
osg::ref_ptr<SceneUtil::LightSource> lightSource = SceneUtil::createLightSource(esmLight, exterior, ambient); osg::ref_ptr<SceneUtil::LightSource> lightSource = SceneUtil::createLightSource(esmLight, Mask_Lighting, exterior, ambient);
mInsert->addChild(lightSource); mInsert->addChild(lightSource);

View file

@ -1,7 +1,7 @@
#include "actorspaths.hpp" #include "actorspaths.hpp"
#include "vismask.hpp"
#include <components/sceneutil/agentpath.hpp> #include <components/sceneutil/agentpath.hpp>
#include <components/sceneutil/vismask.hpp>
#include <osg/PositionAttitudeTransform> #include <osg/PositionAttitudeTransform>
@ -43,7 +43,7 @@ namespace MWRender
const auto newGroup = SceneUtil::createAgentPathGroup(path, halfExtents, start, end, settings); const auto newGroup = SceneUtil::createAgentPathGroup(path, halfExtents, start, end, settings);
if (newGroup) if (newGroup)
{ {
newGroup->setNodeMask(SceneUtil::Mask_Debug); newGroup->setNodeMask(Mask_Debug);
mRootNode->addChild(newGroup); mRootNode->addChild(newGroup);
mGroups[actor] = newGroup; mGroups[actor] = newGroup;
} }

View file

@ -28,7 +28,6 @@
#include <components/sceneutil/actorutil.hpp> #include <components/sceneutil/actorutil.hpp>
#include <components/sceneutil/statesetupdater.hpp> #include <components/sceneutil/statesetupdater.hpp>
#include <components/sceneutil/visitor.hpp> #include <components/sceneutil/visitor.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/sceneutil/lightmanager.hpp> #include <components/sceneutil/lightmanager.hpp>
#include <components/sceneutil/lightutil.hpp> #include <components/sceneutil/lightutil.hpp>
#include <components/sceneutil/skeleton.hpp> #include <components/sceneutil/skeleton.hpp>
@ -45,6 +44,7 @@
#include "../mwmechanics/character.hpp" // FIXME: for MWMechanics::Priority #include "../mwmechanics/character.hpp" // FIXME: for MWMechanics::Priority
#include "vismask.hpp"
#include "util.hpp" #include "util.hpp"
#include "rotatecontroller.hpp" #include "rotatecontroller.hpp"
@ -578,7 +578,7 @@ namespace MWRender
else else
{ {
// Hide effect immediately // Hide effect immediately
node->setNodeMask(SceneUtil::Mask_Disabled); node->setNodeMask(0);
mFinished = true; mFinished = true;
} }
} }
@ -1595,7 +1595,7 @@ namespace MWRender
{ {
bool exterior = mPtr.isInCell() && mPtr.getCell()->getCell()->isExterior(); bool exterior = mPtr.isInCell() && mPtr.getCell()->getCell()->isExterior();
SceneUtil::addLight(parent, esmLight, exterior); SceneUtil::addLight(parent, esmLight, Mask_ParticleSystem, Mask_Lighting, exterior);
} }
void Animation::addEffect (const std::string& model, int effectId, bool loop, const std::string& bonename, const std::string& texture) void Animation::addEffect (const std::string& model, int effectId, bool loop, const std::string& bonename, const std::string& texture)
@ -1647,7 +1647,7 @@ namespace MWRender
// FreezeOnCull doesn't work so well with effect particles, that tend to have moving emitters // FreezeOnCull doesn't work so well with effect particles, that tend to have moving emitters
SceneUtil::DisableFreezeOnCullVisitor disableFreezeOnCullVisitor; SceneUtil::DisableFreezeOnCullVisitor disableFreezeOnCullVisitor;
node->accept(disableFreezeOnCullVisitor); node->accept(disableFreezeOnCullVisitor);
node->setNodeMask(SceneUtil::Mask_Effect); node->setNodeMask(Mask_Effect);
params.mMaxControllerLength = findMaxLengthVisitor.getMaxLength(); params.mMaxControllerLength = findMaxLengthVisitor.getMaxLength();
params.mLoop = loop; params.mLoop = loop;
@ -1806,7 +1806,7 @@ namespace MWRender
SceneUtil::configureLight(light, radius, isExterior); SceneUtil::configureLight(light, radius, isExterior);
mGlowLight = new SceneUtil::LightSource; mGlowLight = new SceneUtil::LightSource;
mGlowLight->setNodeMask(SceneUtil::Mask_Lighting); mGlowLight->setNodeMask(Mask_Lighting);
mInsert->addChild(mGlowLight); mInsert->addChild(mGlowLight);
mGlowLight->setLight(light); mGlowLight->setLight(light);
} }

View file

@ -7,7 +7,7 @@
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>
#include <components/sceneutil/vismask.hpp> #include "vismask.hpp"
namespace namespace
{ {
@ -34,7 +34,7 @@ void DebugDrawer::createGeometry()
if (!mGeometry) if (!mGeometry)
{ {
mGeometry = new osg::Geometry; mGeometry = new osg::Geometry;
mGeometry->setNodeMask(SceneUtil::Mask_Debug); mGeometry->setNodeMask(Mask_Debug);
mVertices = new osg::Vec3Array; mVertices = new osg::Vec3Array;

View file

@ -17,7 +17,6 @@
#include <components/fallback/fallback.hpp> #include <components/fallback/fallback.hpp>
#include <components/sceneutil/lightmanager.hpp> #include <components/sceneutil/lightmanager.hpp>
#include <components/sceneutil/shadow.hpp> #include <components/sceneutil/shadow.hpp>
#include <components/sceneutil/vismask.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
@ -28,6 +27,7 @@
#include "../mwmechanics/weapontype.hpp" #include "../mwmechanics/weapontype.hpp"
#include "npcanimation.hpp" #include "npcanimation.hpp"
#include "vismask.hpp"
namespace MWRender namespace MWRender
{ {
@ -61,7 +61,7 @@ namespace MWRender
} }
else else
{ {
node->setNodeMask(SceneUtil::Mask_Disabled); node->setNodeMask(0);
} }
} }
@ -138,9 +138,9 @@ namespace MWRender
mCamera->attach(osg::Camera::COLOR_BUFFER, mTexture); mCamera->attach(osg::Camera::COLOR_BUFFER, mTexture);
mCamera->setName("CharacterPreview"); mCamera->setName("CharacterPreview");
mCamera->setComputeNearFarMode(osg::Camera::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES); mCamera->setComputeNearFarMode(osg::Camera::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES);
mCamera->setCullMask(~(SceneUtil::Mask_UpdateVisitor)); mCamera->setCullMask(~(Mask_UpdateVisitor));
mCamera->setNodeMask(SceneUtil::Mask_RenderToTexture); mCamera->setNodeMask(Mask_RenderToTexture);
osg::ref_ptr<SceneUtil::LightManager> lightManager = new SceneUtil::LightManager; osg::ref_ptr<SceneUtil::LightManager> lightManager = new SceneUtil::LightManager;
lightManager->setStartLight(1); lightManager->setStartLight(1);
@ -255,7 +255,7 @@ namespace MWRender
void CharacterPreview::redraw() void CharacterPreview::redraw()
{ {
mCamera->setNodeMask(SceneUtil::Mask_RenderToTexture); mCamera->setNodeMask(Mask_RenderToTexture);
mDrawOnceCallback->redrawNextFrame(); mDrawOnceCallback->redrawNextFrame();
} }
@ -364,7 +364,7 @@ namespace MWRender
visitor.setTraversalNumber(mDrawOnceCallback->getLastRenderedFrame()); visitor.setTraversalNumber(mDrawOnceCallback->getLastRenderedFrame());
osg::Node::NodeMask nodeMask = mCamera->getNodeMask(); osg::Node::NodeMask nodeMask = mCamera->getNodeMask();
mCamera->setNodeMask(SceneUtil::Mask_Default); mCamera->setNodeMask(~0);
mCamera->accept(visitor); mCamera->accept(visitor);
mCamera->setNodeMask(nodeMask); mCamera->setNodeMask(nodeMask);

View file

@ -6,9 +6,9 @@
#include <components/resource/scenemanager.hpp> #include <components/resource/scenemanager.hpp>
#include <components/sceneutil/controller.hpp> #include <components/sceneutil/controller.hpp>
#include <components/sceneutil/vismask.hpp>
#include "animation.hpp" #include "animation.hpp"
#include "vismask.hpp"
#include "util.hpp" #include "util.hpp"
namespace MWRender namespace MWRender
@ -29,7 +29,7 @@ void EffectManager::addEffect(const std::string &model, const std::string& textu
{ {
osg::ref_ptr<osg::Node> node = mResourceSystem->getSceneManager()->getInstance(model); osg::ref_ptr<osg::Node> node = mResourceSystem->getSceneManager()->getInstance(model);
node->setNodeMask(SceneUtil::Mask_Effect); node->setNodeMask(Mask_Effect);
Effect effect; Effect effect;
effect.mAnimTime.reset(new EffectAnimationTime); effect.mAnimTime.reset(new EffectAnimationTime);

View file

@ -16,7 +16,6 @@
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>
#include <components/sceneutil/workqueue.hpp> #include <components/sceneutil/workqueue.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/esm/globalmap.hpp> #include <components/esm/globalmap.hpp>
@ -38,6 +37,8 @@
#include "../mwworld/esmstore.hpp" #include "../mwworld/esmstore.hpp"
#include "vismask.hpp"
namespace namespace
{ {
@ -88,7 +89,7 @@ namespace
{ {
if (mParent->copyResult(static_cast<osg::Camera*>(node), nv->getTraversalNumber())) if (mParent->copyResult(static_cast<osg::Camera*>(node), nv->getTraversalNumber()))
{ {
node->setNodeMask(SceneUtil::Mask_Disabled); node->setNodeMask(0);
mParent->markForRemoval(static_cast<osg::Camera*>(node)); mParent->markForRemoval(static_cast<osg::Camera*>(node));
} }
return; return;
@ -323,7 +324,7 @@ namespace MWRender
float srcLeft, float srcTop, float srcRight, float srcBottom) float srcLeft, float srcTop, float srcRight, float srcBottom)
{ {
osg::ref_ptr<osg::Camera> camera (new osg::Camera); osg::ref_ptr<osg::Camera> camera (new osg::Camera);
camera->setNodeMask(SceneUtil::Mask_RenderToTexture); camera->setNodeMask(Mask_RenderToTexture);
camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF); camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
camera->setViewMatrix(osg::Matrix::identity()); camera->setViewMatrix(osg::Matrix::identity());
camera->setProjectionMatrix(osg::Matrix::identity()); camera->setProjectionMatrix(osg::Matrix::identity());

View file

@ -18,7 +18,6 @@
#include <components/settings/settings.hpp> #include <components/settings/settings.hpp>
#include <components/sceneutil/visitor.hpp> #include <components/sceneutil/visitor.hpp>
#include <components/sceneutil/shadow.hpp> #include <components/sceneutil/shadow.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/files/memorystream.hpp> #include <components/files/memorystream.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
@ -26,6 +25,8 @@
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"
#include "vismask.hpp"
namespace namespace
{ {
@ -41,7 +42,7 @@ namespace
virtual void operator()(osg::Node* node, osg::NodeVisitor*) virtual void operator()(osg::Node* node, osg::NodeVisitor*)
{ {
if (mRendered) if (mRendered)
node->setNodeMask(SceneUtil::Mask_Disabled); node->setNodeMask(0);
if (!mRendered) if (!mRendered)
{ {
@ -177,8 +178,8 @@ osg::ref_ptr<osg::Camera> LocalMap::createOrthographicCamera(float x, float y, f
camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
camera->setRenderOrder(osg::Camera::PRE_RENDER); camera->setRenderOrder(osg::Camera::PRE_RENDER);
camera->setCullMask(SceneUtil::Mask_Scene | SceneUtil::Mask_SimpleWater | SceneUtil::Mask_Terrain | SceneUtil::Mask_Object | SceneUtil::Mask_Static); camera->setCullMask(Mask_Scene | Mask_SimpleWater | Mask_Terrain | Mask_Object | Mask_Static);
camera->setNodeMask(SceneUtil::Mask_RenderToTexture); camera->setNodeMask(Mask_RenderToTexture);
osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet; osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet;
stateset->setAttribute(new osg::PolygonMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::FILL), osg::StateAttribute::OVERRIDE); stateset->setAttribute(new osg::PolygonMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::FILL), osg::StateAttribute::OVERRIDE);
@ -375,7 +376,7 @@ void LocalMap::requestExteriorMap(const MWWorld::CellStore* cell)
void LocalMap::requestInteriorMap(const MWWorld::CellStore* cell) void LocalMap::requestInteriorMap(const MWWorld::CellStore* cell)
{ {
osg::ComputeBoundsVisitor computeBoundsVisitor; osg::ComputeBoundsVisitor computeBoundsVisitor;
computeBoundsVisitor.setTraversalMask(SceneUtil::Mask_Scene | SceneUtil::Mask_Terrain | SceneUtil::Mask_Object | SceneUtil::Mask_Static); computeBoundsVisitor.setTraversalMask(Mask_Scene | Mask_Terrain | Mask_Object | Mask_Static);
mSceneRoot->accept(computeBoundsVisitor); mSceneRoot->accept(computeBoundsVisitor);
osg::BoundingBox bounds = computeBoundsVisitor.getBoundingBox(); osg::BoundingBox bounds = computeBoundsVisitor.getBoundingBox();

View file

@ -1,7 +1,7 @@
#include "navmesh.hpp" #include "navmesh.hpp"
#include "vismask.hpp"
#include <components/sceneutil/navmesh.hpp> #include <components/sceneutil/navmesh.hpp>
#include <components/sceneutil/vismask.hpp>
#include <osg/PositionAttitudeTransform> #include <osg/PositionAttitudeTransform>
@ -45,7 +45,7 @@ namespace MWRender
mGroup = SceneUtil::createNavMeshGroup(navMesh, settings); mGroup = SceneUtil::createNavMeshGroup(navMesh, settings);
if (mGroup) if (mGroup)
{ {
mGroup->setNodeMask(SceneUtil::Mask_Debug); mGroup->setNodeMask(Mask_Debug);
mRootNode->addChild(mGroup); mRootNode->addChild(mGroup);
} }
} }

View file

@ -18,7 +18,6 @@
#include <components/sceneutil/actorutil.hpp> #include <components/sceneutil/actorutil.hpp>
#include <components/sceneutil/attach.hpp> #include <components/sceneutil/attach.hpp>
#include <components/sceneutil/visitor.hpp> #include <components/sceneutil/visitor.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/sceneutil/skeleton.hpp> #include <components/sceneutil/skeleton.hpp>
#include <components/settings/settings.hpp> #include <components/settings/settings.hpp>
@ -44,6 +43,7 @@
#include "camera.hpp" #include "camera.hpp"
#include "rotatecontroller.hpp" #include "rotatecontroller.hpp"
#include "renderbin.hpp" #include "renderbin.hpp"
#include "vismask.hpp"
namespace namespace
{ {
@ -538,7 +538,7 @@ void NpcAnimation::updateNpcBase()
addAnimSource(smodel, smodel); addAnimSource(smodel, smodel);
mObjectRoot->setNodeMask(SceneUtil::Mask_FirstPerson); mObjectRoot->setNodeMask(Mask_FirstPerson);
mObjectRoot->addCullCallback(new OverrideFieldOfViewCallback(mFirstPersonFieldOfView)); mObjectRoot->addCullCallback(new OverrideFieldOfViewCallback(mFirstPersonFieldOfView));
} }

View file

@ -5,7 +5,6 @@
#include <components/sceneutil/positionattitudetransform.hpp> #include <components/sceneutil/positionattitudetransform.hpp>
#include <components/sceneutil/unrefqueue.hpp> #include <components/sceneutil/unrefqueue.hpp>
#include <components/sceneutil/vismask.hpp>
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/class.hpp" #include "../mwworld/class.hpp"
@ -13,6 +12,8 @@
#include "animation.hpp" #include "animation.hpp"
#include "npcanimation.hpp" #include "npcanimation.hpp"
#include "creatureanimation.hpp" #include "creatureanimation.hpp"
#include "vismask.hpp"
namespace MWRender namespace MWRender
{ {
@ -70,7 +71,7 @@ void Objects::insertBegin(const MWWorld::Ptr& ptr)
void Objects::insertModel(const MWWorld::Ptr &ptr, const std::string &mesh, bool animated, bool allowLight) void Objects::insertModel(const MWWorld::Ptr &ptr, const std::string &mesh, bool animated, bool allowLight)
{ {
insertBegin(ptr); insertBegin(ptr);
ptr.getRefData().getBaseNode()->setNodeMask(SceneUtil::Mask_Object); ptr.getRefData().getBaseNode()->setNodeMask(Mask_Object);
osg::ref_ptr<ObjectAnimation> anim (new ObjectAnimation(ptr, mesh, mResourceSystem, animated, allowLight)); osg::ref_ptr<ObjectAnimation> anim (new ObjectAnimation(ptr, mesh, mResourceSystem, animated, allowLight));
@ -80,7 +81,7 @@ void Objects::insertModel(const MWWorld::Ptr &ptr, const std::string &mesh, bool
void Objects::insertCreature(const MWWorld::Ptr &ptr, const std::string &mesh, bool weaponsShields) void Objects::insertCreature(const MWWorld::Ptr &ptr, const std::string &mesh, bool weaponsShields)
{ {
insertBegin(ptr); insertBegin(ptr);
ptr.getRefData().getBaseNode()->setNodeMask(SceneUtil::Mask_Actor); ptr.getRefData().getBaseNode()->setNodeMask(Mask_Actor);
// CreatureAnimation // CreatureAnimation
osg::ref_ptr<Animation> anim; osg::ref_ptr<Animation> anim;
@ -97,7 +98,7 @@ void Objects::insertCreature(const MWWorld::Ptr &ptr, const std::string &mesh, b
void Objects::insertNPC(const MWWorld::Ptr &ptr) void Objects::insertNPC(const MWWorld::Ptr &ptr)
{ {
insertBegin(ptr); insertBegin(ptr);
ptr.getRefData().getBaseNode()->setNodeMask(SceneUtil::Mask_Actor); ptr.getRefData().getBaseNode()->setNodeMask(Mask_Actor);
osg::ref_ptr<NpcAnimation> anim (new NpcAnimation(ptr, osg::ref_ptr<osg::Group>(ptr.getRefData().getBaseNode()), mResourceSystem)); osg::ref_ptr<NpcAnimation> anim (new NpcAnimation(ptr, osg::ref_ptr<osg::Group>(ptr.getRefData().getBaseNode()), mResourceSystem));

View file

@ -8,7 +8,6 @@
#include <components/esm/loadpgrd.hpp> #include <components/esm/loadpgrd.hpp>
#include <components/sceneutil/pathgridutil.hpp> #include <components/sceneutil/pathgridutil.hpp>
#include <components/sceneutil/vismask.hpp>
#include "../mwbase/world.hpp" // these includes can be removed once the static-hack is gone #include "../mwbase/world.hpp" // these includes can be removed once the static-hack is gone
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
@ -18,6 +17,8 @@
#include "../mwmechanics/pathfinding.hpp" #include "../mwmechanics/pathfinding.hpp"
#include "../mwmechanics/coordinateconverter.hpp" #include "../mwmechanics/coordinateconverter.hpp"
#include "vismask.hpp"
namespace MWRender namespace MWRender
{ {
@ -72,7 +73,7 @@ void Pathgrid::togglePathgrid()
{ {
// add path grid meshes to already loaded cells // add path grid meshes to already loaded cells
mPathGridRoot = new osg::Group; mPathGridRoot = new osg::Group;
mPathGridRoot->setNodeMask(SceneUtil::Mask_Pathgrid); mPathGridRoot->setNodeMask(Mask_Debug);
mRootNode->addChild(mPathGridRoot); mRootNode->addChild(mPathGridRoot);
for(const MWWorld::CellStore* cell : mActiveCells) for(const MWWorld::CellStore* cell : mActiveCells)

View file

@ -1,11 +1,12 @@
#include "recastmesh.hpp" #include "recastmesh.hpp"
#include <components/sceneutil/vismask.hpp>
#include <components/sceneutil/recastmesh.hpp> #include <components/sceneutil/recastmesh.hpp>
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>
#include <osg/PositionAttitudeTransform> #include <osg/PositionAttitudeTransform>
#include "vismask.hpp"
namespace MWRender namespace MWRender
{ {
RecastMesh::RecastMesh(const osg::ref_ptr<osg::Group>& root, bool enabled) RecastMesh::RecastMesh(const osg::ref_ptr<osg::Group>& root, bool enabled)
@ -49,7 +50,7 @@ namespace MWRender
|| it->second.mRevision != tile->second->getRevision()) || it->second.mRevision != tile->second->getRevision())
{ {
const auto group = SceneUtil::createRecastMeshGroup(*tile->second, settings); const auto group = SceneUtil::createRecastMeshGroup(*tile->second, settings);
group->setNodeMask(SceneUtil::Mask_Debug); group->setNodeMask(Mask_Debug);
mRootNode->removeChild(it->second.mValue); mRootNode->removeChild(it->second.mValue);
mRootNode->addChild(group); mRootNode->addChild(group);
it->second.mValue = group; it->second.mValue = group;
@ -66,7 +67,7 @@ namespace MWRender
if (mGroups.count(tile.first)) if (mGroups.count(tile.first))
continue; continue;
const auto group = SceneUtil::createRecastMeshGroup(*tile.second, settings); const auto group = SceneUtil::createRecastMeshGroup(*tile.second, settings);
group->setNodeMask(SceneUtil::Mask_Debug); group->setNodeMask(Mask_Debug);
mGroups.emplace(tile.first, Group {tile.second->getGeneration(), tile.second->getRevision(), group}); mGroups.emplace(tile.first, Group {tile.second->getGeneration(), tile.second->getRevision(), group});
mRootNode->addChild(group); mRootNode->addChild(group);
} }

View file

@ -20,6 +20,8 @@
#include <osgViewer/Viewer> #include <osgViewer/Viewer>
#include <components/nifosg/nifloader.hpp>
#include <components/debug/debuglog.hpp> #include <components/debug/debuglog.hpp>
#include <components/misc/stringops.hpp> #include <components/misc/stringops.hpp>
@ -40,7 +42,6 @@
#include <components/sceneutil/unrefqueue.hpp> #include <components/sceneutil/unrefqueue.hpp>
#include <components/sceneutil/writescene.hpp> #include <components/sceneutil/writescene.hpp>
#include <components/sceneutil/shadow.hpp> #include <components/sceneutil/shadow.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/terrain/terraingrid.hpp> #include <components/terrain/terraingrid.hpp>
#include <components/terrain/quadtreeworld.hpp> #include <components/terrain/quadtreeworld.hpp>
@ -59,6 +60,7 @@
#include "sky.hpp" #include "sky.hpp"
#include "effectmanager.hpp" #include "effectmanager.hpp"
#include "npcanimation.hpp" #include "npcanimation.hpp"
#include "vismask.hpp"
#include "pathgrid.hpp" #include "pathgrid.hpp"
#include "camera.hpp" #include "camera.hpp"
#include "water.hpp" #include "water.hpp"
@ -216,7 +218,7 @@ namespace MWRender
, mFieldOfViewOverride(0.f) , mFieldOfViewOverride(0.f)
, mBorders(false) , mBorders(false)
{ {
resourceSystem->getSceneManager()->setParticleSystemMask(SceneUtil::Mask_ParticleSystem); resourceSystem->getSceneManager()->setParticleSystemMask(MWRender::Mask_ParticleSystem);
resourceSystem->getSceneManager()->setShaderPath(resourcePath + "/shaders"); resourceSystem->getSceneManager()->setShaderPath(resourcePath + "/shaders");
// Shadows and radial fog have problems with fixed-function mode // Shadows and radial fog have problems with fixed-function mode
bool forceShaders = Settings::Manager::getBool("radial fog", "Shaders") || Settings::Manager::getBool("force shaders", "Shaders") || Settings::Manager::getBool("enable shadows", "Shadows"); bool forceShaders = Settings::Manager::getBool("radial fog", "Shaders") || Settings::Manager::getBool("force shaders", "Shaders") || Settings::Manager::getBool("enable shadows", "Shadows");
@ -230,21 +232,21 @@ namespace MWRender
resourceSystem->getSceneManager()->setSpecularMapPattern(Settings::Manager::getString("specular map pattern", "Shaders")); resourceSystem->getSceneManager()->setSpecularMapPattern(Settings::Manager::getString("specular map pattern", "Shaders"));
osg::ref_ptr<SceneUtil::LightManager> sceneRoot = new SceneUtil::LightManager; osg::ref_ptr<SceneUtil::LightManager> sceneRoot = new SceneUtil::LightManager;
sceneRoot->setLightingMask(SceneUtil::Mask_Lighting); sceneRoot->setLightingMask(Mask_Lighting);
mSceneRoot = sceneRoot; mSceneRoot = sceneRoot;
sceneRoot->setStartLight(1); sceneRoot->setStartLight(1);
int shadowCastingTraversalMask = SceneUtil::Mask_Scene; int shadowCastingTraversalMask = Mask_Scene;
if (Settings::Manager::getBool("actor shadows", "Shadows")) if (Settings::Manager::getBool("actor shadows", "Shadows"))
shadowCastingTraversalMask |= SceneUtil::Mask_Actor; shadowCastingTraversalMask |= Mask_Actor;
if (Settings::Manager::getBool("player shadows", "Shadows")) if (Settings::Manager::getBool("player shadows", "Shadows"))
shadowCastingTraversalMask |= SceneUtil::Mask_Player; shadowCastingTraversalMask |= Mask_Player;
if (Settings::Manager::getBool("terrain shadows", "Shadows")) if (Settings::Manager::getBool("terrain shadows", "Shadows"))
shadowCastingTraversalMask |= SceneUtil::Mask_Terrain; shadowCastingTraversalMask |= Mask_Terrain;
int indoorShadowCastingTraversalMask = shadowCastingTraversalMask; int indoorShadowCastingTraversalMask = shadowCastingTraversalMask;
if (Settings::Manager::getBool("object shadows", "Shadows")) if (Settings::Manager::getBool("object shadows", "Shadows"))
shadowCastingTraversalMask |= (SceneUtil::Mask_Object|SceneUtil::Mask_Static); shadowCastingTraversalMask |= (Mask_Object|Mask_Static);
mShadowManager.reset(new SceneUtil::ShadowManager(sceneRoot, mRootNode, shadowCastingTraversalMask, indoorShadowCastingTraversalMask, mResourceSystem->getSceneManager()->getShaderManager())); mShadowManager.reset(new SceneUtil::ShadowManager(sceneRoot, mRootNode, shadowCastingTraversalMask, indoorShadowCastingTraversalMask, mResourceSystem->getSceneManager()->getShaderManager()));
@ -280,8 +282,6 @@ namespace MWRender
mEffectManager.reset(new EffectManager(sceneRoot, mResourceSystem)); mEffectManager.reset(new EffectManager(sceneRoot, mResourceSystem));
mWater.reset(new Water(mRootNode, sceneRoot, mResourceSystem, mViewer->getIncrementalCompileOperation(), resourcePath));
DLLandFogStart = Settings::Manager::getFloat("distant land fog start", "Fog"); DLLandFogStart = Settings::Manager::getFloat("distant land fog start", "Fog");
DLLandFogEnd = Settings::Manager::getFloat("distant land fog end", "Fog"); DLLandFogEnd = Settings::Manager::getFloat("distant land fog end", "Fog");
DLUnderwaterFogStart = Settings::Manager::getFloat("distant underwater fog start", "Fog"); DLUnderwaterFogStart = Settings::Manager::getFloat("distant underwater fog start", "Fog");
@ -311,20 +311,24 @@ namespace MWRender
float maxCompGeometrySize = Settings::Manager::getFloat("max composite geometry size", "Terrain"); float maxCompGeometrySize = Settings::Manager::getFloat("max composite geometry size", "Terrain");
maxCompGeometrySize = std::max(maxCompGeometrySize, 1.f); maxCompGeometrySize = std::max(maxCompGeometrySize, 1.f);
mTerrain.reset(new Terrain::QuadTreeWorld( mTerrain.reset(new Terrain::QuadTreeWorld(
sceneRoot, mRootNode, mResourceSystem, mTerrainStorage, compMapResolution, compMapLevel, lodFactor, vertexLodMod, maxCompGeometrySize)); sceneRoot, mRootNode, mResourceSystem, mTerrainStorage, Mask_Terrain, Mask_PreCompile, Mask_Debug,
compMapResolution, compMapLevel, lodFactor, vertexLodMod, maxCompGeometrySize));
} }
else else
mTerrain.reset(new Terrain::TerrainGrid(sceneRoot, mRootNode, mResourceSystem, mTerrainStorage)); mTerrain.reset(new Terrain::TerrainGrid(sceneRoot, mRootNode, mResourceSystem, mTerrainStorage, Mask_Terrain, Mask_PreCompile, Mask_Debug));
mTerrain->setTargetFrameRate(Settings::Manager::getFloat("target framerate", "Cells")); mTerrain->setTargetFrameRate(Settings::Manager::getFloat("target framerate", "Cells"));
mTerrain->setWorkQueue(mWorkQueue.get()); mTerrain->setWorkQueue(mWorkQueue.get());
// water goes after terrain for correct waterculling order
mWater.reset(new Water(mRootNode, sceneRoot, mResourceSystem, mViewer->getIncrementalCompileOperation(), resourcePath));
mCamera.reset(new Camera(mViewer->getCamera())); mCamera.reset(new Camera(mViewer->getCamera()));
mViewer->setLightingMode(osgViewer::View::NO_LIGHT); mViewer->setLightingMode(osgViewer::View::NO_LIGHT);
osg::ref_ptr<osg::LightSource> source = new osg::LightSource; osg::ref_ptr<osg::LightSource> source = new osg::LightSource;
source->setNodeMask(SceneUtil::Mask_Lighting); source->setNodeMask(Mask_Lighting);
mSunLight = new osg::Light; mSunLight = new osg::Light;
source->setLight(mSunLight); source->setLight(mSunLight);
mSunLight->setDiffuse(osg::Vec4f(0,0,0,1)); mSunLight->setDiffuse(osg::Vec4f(0,0,0,1));
@ -343,7 +347,7 @@ namespace MWRender
defaultMat->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4f(0.f, 0.f, 0.f, 0.f)); defaultMat->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4f(0.f, 0.f, 0.f, 0.f));
sceneRoot->getOrCreateStateSet()->setAttribute(defaultMat); sceneRoot->getOrCreateStateSet()->setAttribute(defaultMat);
sceneRoot->setNodeMask(SceneUtil::Mask_Scene); sceneRoot->setNodeMask(Mask_Scene);
sceneRoot->setName("Scene Root"); sceneRoot->setName("Scene Root");
mSky.reset(new SkyManager(sceneRoot, resourceSystem->getSceneManager())); mSky.reset(new SkyManager(sceneRoot, resourceSystem->getSceneManager()));
@ -371,7 +375,8 @@ namespace MWRender
mViewer->getCamera()->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR); mViewer->getCamera()->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR);
mViewer->getCamera()->setCullingMode(cullingMode); mViewer->getCamera()->setCullingMode(cullingMode);
mViewer->getCamera()->setCullMask(~(SceneUtil::Mask_UpdateVisitor|SceneUtil::Mask_SimpleWater)); mViewer->getCamera()->setCullMask(~(Mask_UpdateVisitor|Mask_SimpleWater));
NifOsg::Loader::setHiddenNodeMask(Mask_UpdateVisitor);
mNearClip = Settings::Manager::getFloat("near clip", "Camera"); mNearClip = Settings::Manager::getFloat("near clip", "Camera");
mViewDistance = Settings::Manager::getFloat("viewing distance", "Camera"); mViewDistance = Settings::Manager::getFloat("viewing distance", "Camera");
@ -537,6 +542,8 @@ namespace MWRender
void RenderingManager::enableTerrain(bool enable) void RenderingManager::enableTerrain(bool enable)
{ {
if (!enable)
mWater->setCullCallback(nullptr);
mTerrain->enable(enable); mTerrain->enable(enable);
} }
@ -573,12 +580,12 @@ namespace MWRender
else if (mode == Render_Scene) else if (mode == Render_Scene)
{ {
int mask = mViewer->getCamera()->getCullMask(); int mask = mViewer->getCamera()->getCullMask();
bool enabled = mask & SceneUtil::Mask_Scene; bool enabled = mask&Mask_Scene;
enabled = !enabled; enabled = !enabled;
if (enabled) if (enabled)
mask |= SceneUtil::Mask_Scene; mask |= Mask_Scene;
else else
mask &= ~SceneUtil::Mask_Scene; mask &= ~Mask_Scene;
mViewer->getCamera()->setCullMask(mask); mViewer->getCamera()->setCullMask(mask);
return enabled; return enabled;
} }
@ -736,6 +743,7 @@ namespace MWRender
void RenderingManager::setWaterHeight(float height) void RenderingManager::setWaterHeight(float height)
{ {
mWater->setCullCallback(mTerrain->getHeightCullCallback(height, Mask_Water));
mWater->setHeight(height); mWater->setHeight(height);
mSky->setWaterHeight(height); mSky->setWaterHeight(height);
} }
@ -743,17 +751,19 @@ namespace MWRender
class NotifyDrawCompletedCallback : public osg::Camera::DrawCallback class NotifyDrawCompletedCallback : public osg::Camera::DrawCallback
{ {
public: public:
NotifyDrawCompletedCallback() NotifyDrawCompletedCallback(unsigned int frame)
: mDone(false) : mDone(false), mFrame(frame)
{ {
} }
virtual void operator () (osg::RenderInfo& renderInfo) const virtual void operator () (osg::RenderInfo& renderInfo) const
{ {
mMutex.lock(); OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mMutex);
mDone = true; if (renderInfo.getState()->getFrameStamp()->getFrameNumber() >= mFrame)
mMutex.unlock(); {
mCondition.signal(); mDone = true;
mCondition.signal();
}
} }
void waitTillDone() void waitTillDone()
@ -768,6 +778,7 @@ namespace MWRender
mutable OpenThreads::Condition mCondition; mutable OpenThreads::Condition mCondition;
mutable OpenThreads::Mutex mMutex; mutable OpenThreads::Mutex mMutex;
mutable bool mDone; mutable bool mDone;
unsigned int mFrame;
}; };
bool RenderingManager::screenshot360(osg::Image* image, std::string settingStr) bool RenderingManager::screenshot360(osg::Image* image, std::string settingStr)
@ -851,7 +862,7 @@ namespace MWRender
int maskBackup = mPlayerAnimation->getObjectRoot()->getNodeMask(); int maskBackup = mPlayerAnimation->getObjectRoot()->getNodeMask();
if (mCamera->isFirstPerson()) if (mCamera->isFirstPerson())
mPlayerAnimation->getObjectRoot()->setNodeMask(SceneUtil::Mask_Disabled); mPlayerAnimation->getObjectRoot()->setNodeMask(0);
for (int i = 0; i < 6; ++i) // for each cubemap side for (int i = 0; i < 6; ++i) // for each cubemap side
{ {
@ -925,7 +936,7 @@ namespace MWRender
void RenderingManager::renderCameraToImage(osg::Camera *camera, osg::Image *image, int w, int h) void RenderingManager::renderCameraToImage(osg::Camera *camera, osg::Image *image, int w, int h)
{ {
camera->setNodeMask(SceneUtil::Mask_RenderToTexture); camera->setNodeMask(Mask_RenderToTexture);
camera->attach(osg::Camera::COLOR_BUFFER, image); camera->attach(osg::Camera::COLOR_BUFFER, image);
camera->setRenderOrder(osg::Camera::PRE_RENDER); camera->setRenderOrder(osg::Camera::PRE_RENDER);
camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF); camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
@ -947,7 +958,7 @@ namespace MWRender
mRootNode->addChild(camera); mRootNode->addChild(camera);
// The draw needs to complete before we can copy back our image. // The draw needs to complete before we can copy back our image.
osg::ref_ptr<NotifyDrawCompletedCallback> callback (new NotifyDrawCompletedCallback); osg::ref_ptr<NotifyDrawCompletedCallback> callback (new NotifyDrawCompletedCallback(0));
camera->setFinalDrawCallback(callback); camera->setFinalDrawCallback(callback);
MWBase::Environment::get().getWindowManager()->getLoadingScreen()->loadingOn(false); MWBase::Environment::get().getWindowManager()->getLoadingScreen()->loadingOn(false);
@ -966,6 +977,51 @@ namespace MWRender
mRootNode->removeChild(camera); mRootNode->removeChild(camera);
} }
class ReadImageFromFramebufferCallback : public osg::Drawable::DrawCallback
{
public:
ReadImageFromFramebufferCallback(osg::Image* image, int width, int height)
: mWidth(width), mHeight(height), mImage(image)
{
}
virtual void drawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* /*drawable*/) const
{
int screenW = renderInfo.getCurrentCamera()->getViewport()->width();
int screenH = renderInfo.getCurrentCamera()->getViewport()->height();
double imageaspect = (double)mWidth/(double)mHeight;
int leftPadding = std::max(0, static_cast<int>(screenW - screenH * imageaspect) / 2);
int topPadding = std::max(0, static_cast<int>(screenH - screenW / imageaspect) / 2);
int width = screenW - leftPadding*2;
int height = screenH - topPadding*2;
mImage->readPixels(leftPadding, topPadding, width, height, GL_RGB, GL_UNSIGNED_BYTE);
mImage->scaleImage(mWidth, mHeight, 1);
}
private:
int mWidth;
int mHeight;
osg::ref_ptr<osg::Image> mImage;
};
void RenderingManager::screenshotFramebuffer(osg::Image* image, int w, int h)
{
osg::Camera* camera = mViewer->getCamera();
osg::ref_ptr<osg::Drawable> tempDrw = new osg::Drawable;
tempDrw->setDrawCallback(new ReadImageFromFramebufferCallback(image, w, h));
tempDrw->setCullingActive(false);
tempDrw->getOrCreateStateSet()->setRenderBinDetails(100, "RenderBin", osg::StateSet::USE_RENDERBIN_DETAILS); // so its after all scene bins but before POST_RENDER gui camera
camera->addChild(tempDrw);
osg::ref_ptr<NotifyDrawCompletedCallback> callback (new NotifyDrawCompletedCallback(mViewer->getFrameStamp()->getFrameNumber()));
camera->setFinalDrawCallback(callback);
mViewer->eventTraversal();
mViewer->updateTraversal();
mViewer->renderingTraversals();
callback->waitTillDone();
// now that we've "used up" the current frame, get a fresh frame number for the next frame() following after the screenshot is completed
mViewer->advance(mViewer->getFrameStamp()->getSimulationTime());
camera->removeChild(tempDrw);
camera->setFinalDrawCallback(nullptr);
}
void RenderingManager::screenshot(osg::Image *image, int w, int h, osg::Matrixd cameraTransform) void RenderingManager::screenshot(osg::Image *image, int w, int h, osg::Matrixd cameraTransform)
{ {
osg::ref_ptr<osg::Camera> rttCamera (new osg::Camera); osg::ref_ptr<osg::Camera> rttCamera (new osg::Camera);
@ -978,7 +1034,7 @@ namespace MWRender
rttCamera->addChild(mWater->getReflectionCamera()); rttCamera->addChild(mWater->getReflectionCamera());
rttCamera->addChild(mWater->getRefractionCamera()); rttCamera->addChild(mWater->getRefractionCamera());
rttCamera->setCullMask(mViewer->getCamera()->getCullMask() & (~SceneUtil::Mask_GUI)); rttCamera->setCullMask(mViewer->getCamera()->getCullMask() & (~Mask_GUI));
rttCamera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); rttCamera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@ -991,7 +1047,7 @@ namespace MWRender
return osg::Vec4f(); return osg::Vec4f();
osg::ComputeBoundsVisitor computeBoundsVisitor; osg::ComputeBoundsVisitor computeBoundsVisitor;
computeBoundsVisitor.setTraversalMask(~(SceneUtil::Mask_ParticleSystem|SceneUtil::Mask_Effect)); computeBoundsVisitor.setTraversalMask(~(Mask_ParticleSystem|Mask_Effect));
ptr.getRefData().getBaseNode()->accept(computeBoundsVisitor); ptr.getRefData().getBaseNode()->accept(computeBoundsVisitor);
osg::Matrix viewProj = mViewer->getCamera()->getViewMatrix() * mViewer->getCamera()->getProjectionMatrix(); osg::Matrix viewProj = mViewer->getCamera()->getViewMatrix() * mViewer->getCamera()->getProjectionMatrix();
@ -1063,11 +1119,12 @@ namespace MWRender
mIntersectionVisitor->setTraversalNumber(mViewer->getFrameStamp()->getFrameNumber()); mIntersectionVisitor->setTraversalNumber(mViewer->getFrameStamp()->getFrameNumber());
mIntersectionVisitor->setIntersector(intersector); mIntersectionVisitor->setIntersector(intersector);
int mask = ~(SceneUtil::Mask_RenderToTexture|SceneUtil::Mask_Sky|SceneUtil::Mask_Pathgrid|SceneUtil::Mask_Debug|SceneUtil::Mask_Effect|SceneUtil::Mask_Water|SceneUtil::Mask_SimpleWater); int mask = ~0;
mask &= ~(Mask_RenderToTexture|Mask_Sky|Mask_Debug|Mask_Effect|Mask_Water|Mask_SimpleWater);
if (ignorePlayer) if (ignorePlayer)
mask &= ~(SceneUtil::Mask_Player); mask &= ~(Mask_Player);
if (ignoreActors) if (ignoreActors)
mask &= ~(SceneUtil::Mask_Actor|SceneUtil::Mask_Player); mask &= ~(Mask_Actor|Mask_Player);
mIntersectionVisitor->setTraversalMask(mask); mIntersectionVisitor->setTraversalMask(mask);
return mIntersectionVisitor; return mIntersectionVisitor;
@ -1148,7 +1205,7 @@ namespace MWRender
if (!mPlayerNode) if (!mPlayerNode)
{ {
mPlayerNode = new SceneUtil::PositionAttitudeTransform; mPlayerNode = new SceneUtil::PositionAttitudeTransform;
mPlayerNode->setNodeMask(SceneUtil::Mask_Player); mPlayerNode->setNodeMask(Mask_Player);
mPlayerNode->setName("Player Root"); mPlayerNode->setName("Player Root");
mSceneRoot->addChild(mPlayerNode); mSceneRoot->addChild(mPlayerNode);
} }
@ -1392,7 +1449,7 @@ namespace MWRender
osg::ref_ptr<const osg::Node> node = mResourceSystem->getSceneManager()->getTemplate(modelName); osg::ref_ptr<const osg::Node> node = mResourceSystem->getSceneManager()->getTemplate(modelName);
osg::ComputeBoundsVisitor computeBoundsVisitor; osg::ComputeBoundsVisitor computeBoundsVisitor;
computeBoundsVisitor.setTraversalMask(~(SceneUtil::Mask_ParticleSystem|SceneUtil::Mask_Effect)); computeBoundsVisitor.setTraversalMask(~(MWRender::Mask_ParticleSystem|MWRender::Mask_Effect));
const_cast<osg::Node*>(node.get())->accept(computeBoundsVisitor); const_cast<osg::Node*>(node.get())->accept(computeBoundsVisitor);
osg::BoundingBox bounds = computeBoundsVisitor.getBoundingBox(); osg::BoundingBox bounds = computeBoundsVisitor.getBoundingBox();

View file

@ -144,7 +144,8 @@ namespace MWRender
void setWaterHeight(float level); void setWaterHeight(float level);
/// Take a screenshot of w*h onto the given image, not including the GUI. /// Take a screenshot of w*h onto the given image, not including the GUI.
void screenshot(osg::Image* image, int w, int h, osg::Matrixd cameraTransform=osg::Matrixd()); void screenshot(osg::Image* image, int w, int h, osg::Matrixd cameraTransform=osg::Matrixd()); // make a new render at given size
void screenshotFramebuffer(osg::Image* image, int w, int h); // copy directly from framebuffer and scale to given size
bool screenshot360(osg::Image* image, std::string settingStr); bool screenshot360(osg::Image* image, std::string settingStr);
struct RayResult struct RayResult

View file

@ -16,7 +16,8 @@
#include <components/resource/resourcesystem.hpp> #include <components/resource/resourcesystem.hpp>
#include <components/resource/scenemanager.hpp> #include <components/resource/scenemanager.hpp>
#include <components/fallback/fallback.hpp> #include <components/fallback/fallback.hpp>
#include <components/sceneutil/vismask.hpp>
#include "vismask.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
@ -103,7 +104,7 @@ RippleSimulation::RippleSimulation(osg::Group *parent, Resource::ResourceSystem*
mParticleNode->setName("Ripple Root"); mParticleNode->setName("Ripple Root");
mParticleNode->addChild(updater); mParticleNode->addChild(updater);
mParticleNode->addChild(mParticleSystem); mParticleNode->addChild(mParticleSystem);
mParticleNode->setNodeMask(SceneUtil::Mask_Water); mParticleNode->setNodeMask(Mask_Water);
createWaterRippleStateSet(resourceSystem, mParticleNode); createWaterRippleStateSet(resourceSystem, mParticleNode);

View file

@ -43,12 +43,12 @@
#include <components/sceneutil/statesetupdater.hpp> #include <components/sceneutil/statesetupdater.hpp>
#include <components/sceneutil/controller.hpp> #include <components/sceneutil/controller.hpp>
#include <components/sceneutil/visitor.hpp> #include <components/sceneutil/visitor.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/sceneutil/shadow.hpp> #include <components/sceneutil/shadow.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "vismask.hpp"
#include "renderbin.hpp" #include "renderbin.hpp"
namespace namespace
@ -454,7 +454,7 @@ public:
void setVisible(bool visible) void setVisible(bool visible)
{ {
mTransform->setNodeMask(visible ? mVisibleMask : SceneUtil::Mask_Disabled); mTransform->setNodeMask(visible ? mVisibleMask : 0);
} }
protected: protected:
@ -470,7 +470,7 @@ class Sun : public CelestialBody
{ {
public: public:
Sun(osg::Group* parentNode, Resource::ImageManager& imageManager) Sun(osg::Group* parentNode, Resource::ImageManager& imageManager)
: CelestialBody(parentNode, 1.0f, 1, SceneUtil::Mask_Sun) : CelestialBody(parentNode, 1.0f, 1, Mask_Sun)
, mUpdater(new Updater) , mUpdater(new Updater)
{ {
mTransform->addUpdateCallback(mUpdater); mTransform->addUpdateCallback(mUpdater);
@ -655,7 +655,7 @@ private:
camera->setProjectionMatrix(osg::Matrix::identity()); camera->setProjectionMatrix(osg::Matrix::identity());
camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); // add to skyRoot instead? camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); // add to skyRoot instead?
camera->setViewMatrix(osg::Matrix::identity()); camera->setViewMatrix(osg::Matrix::identity());
camera->setClearMask(SceneUtil::Mask_Disabled); camera->setClearMask(0);
camera->setRenderOrder(osg::Camera::NESTED_RENDER); camera->setRenderOrder(osg::Camera::NESTED_RENDER);
camera->setAllowEventFocus(false); camera->setAllowEventFocus(false);
@ -1145,7 +1145,7 @@ SkyManager::SkyManager(osg::Group* parentNode, Resource::SceneManager* sceneMana
skyroot->getOrCreateStateSet()->setAttributeAndModes(new osg::Program(), osg::StateAttribute::OVERRIDE|osg::StateAttribute::PROTECTED|osg::StateAttribute::ON); skyroot->getOrCreateStateSet()->setAttributeAndModes(new osg::Program(), osg::StateAttribute::OVERRIDE|osg::StateAttribute::PROTECTED|osg::StateAttribute::ON);
SceneUtil::ShadowManager::disableShadowsForStateSet(skyroot->getOrCreateStateSet()); SceneUtil::ShadowManager::disableShadowsForStateSet(skyroot->getOrCreateStateSet());
skyroot->setNodeMask(SceneUtil::Mask_Sky); skyroot->setNodeMask(Mask_Sky);
parentNode->addChild(skyroot); parentNode->addChild(skyroot);
mRootNode = skyroot; mRootNode = skyroot;
@ -1177,7 +1177,7 @@ void SkyManager::create()
mAtmosphereDay->addUpdateCallback(mAtmosphereUpdater); mAtmosphereDay->addUpdateCallback(mAtmosphereUpdater);
mAtmosphereNightNode = new osg::PositionAttitudeTransform; mAtmosphereNightNode = new osg::PositionAttitudeTransform;
mAtmosphereNightNode->setNodeMask(SceneUtil::Mask_Disabled); mAtmosphereNightNode->setNodeMask(0);
mEarlyRenderBinRoot->addChild(mAtmosphereNightNode); mEarlyRenderBinRoot->addChild(mAtmosphereNightNode);
osg::ref_ptr<osg::Node> atmosphereNight; osg::ref_ptr<osg::Node> atmosphereNight;
@ -1210,7 +1210,7 @@ void SkyManager::create()
mCloudUpdater2 = new CloudUpdater; mCloudUpdater2 = new CloudUpdater;
mCloudUpdater2->setOpacity(0.f); mCloudUpdater2->setOpacity(0.f);
mCloudMesh2->addUpdateCallback(mCloudUpdater2); mCloudMesh2->addUpdateCallback(mCloudUpdater2);
mCloudMesh2->setNodeMask(SceneUtil::Mask_Disabled); mCloudMesh2->setNodeMask(0);
osg::ref_ptr<osg::Depth> depth = new osg::Depth; osg::ref_ptr<osg::Depth> depth = new osg::Depth;
depth->setWriteMask(false); depth->setWriteMask(false);
@ -1533,7 +1533,7 @@ void SkyManager::createRain()
mRainFader = new RainFader(&mWeatherAlpha); mRainFader = new RainFader(&mWeatherAlpha);
mRainNode->addUpdateCallback(mRainFader); mRainNode->addUpdateCallback(mRainFader);
mRainNode->addCullCallback(mUnderwaterSwitch); mRainNode->addCullCallback(mUnderwaterSwitch);
mRainNode->setNodeMask(SceneUtil::Mask_WeatherParticles); mRainNode->setNodeMask(Mask_WeatherParticles);
mRootNode->addChild(mRainNode); mRootNode->addChild(mRainNode);
} }
@ -1636,7 +1636,7 @@ void SkyManager::setEnabled(bool enabled)
if (enabled && !mCreated) if (enabled && !mCreated)
create(); create();
mRootNode->setNodeMask(enabled ? SceneUtil::Mask_Sky : SceneUtil::Mask_Disabled); mRootNode->setNodeMask(enabled ? Mask_Sky : 0);
mEnabled = enabled; mEnabled = enabled;
} }
@ -1729,7 +1729,7 @@ void SkyManager::setWeather(const WeatherResult& weather)
{ {
mParticleNode = new osg::PositionAttitudeTransform; mParticleNode = new osg::PositionAttitudeTransform;
mParticleNode->addCullCallback(mUnderwaterSwitch); mParticleNode->addCullCallback(mUnderwaterSwitch);
mParticleNode->setNodeMask(SceneUtil::Mask_WeatherParticles); mParticleNode->setNodeMask(Mask_WeatherParticles);
mRootNode->addChild(mParticleNode); mRootNode->addChild(mParticleNode);
} }
@ -1799,7 +1799,7 @@ void SkyManager::setWeather(const WeatherResult& weather)
mCloudUpdater->setOpacity((1.f-mCloudBlendFactor)); mCloudUpdater->setOpacity((1.f-mCloudBlendFactor));
mCloudUpdater2->setOpacity(mCloudBlendFactor); mCloudUpdater2->setOpacity(mCloudBlendFactor);
mCloudMesh2->setNodeMask(mCloudBlendFactor > 0.f ? SceneUtil::Mask_Default : SceneUtil::Mask_Disabled); mCloudMesh2->setNodeMask(mCloudBlendFactor > 0.f ? ~0 : 0);
} }
if (mCloudColour != weather.mFogColor) if (mCloudColour != weather.mFogColor)
@ -1844,7 +1844,7 @@ void SkyManager::setWeather(const WeatherResult& weather)
mAtmosphereNightUpdater->setFade(mStarsOpacity); mAtmosphereNightUpdater->setFade(mStarsOpacity);
} }
mAtmosphereNightNode->setNodeMask(weather.mNight ? SceneUtil::Mask_Default : SceneUtil::Mask_Disabled); mAtmosphereNightNode->setNodeMask(weather.mNight ? ~0 : 0);
if (mRainFader) if (mRainFader)
mRainFader->setAlpha(weather.mEffectFade * 0.6); // * Rain_Threshold? mRainFader->setAlpha(weather.mEffectFade * 0.6); // * Rain_Threshold?

View file

@ -1,7 +1,7 @@
#ifndef OPENMW_COMPONENTS_SCENEUTIL_VISMASK_H #ifndef OPENMW_MWRENDER_VISMASK_H
#define OPENMW_COMPONENTS_SCENEUTIL_VISMASK_H #define OPENMW_MWRENDER_VISMASK_H
namespace SceneUtil namespace MWRender
{ {
/// Node masks used for controlling visibility of game objects. /// Node masks used for controlling visibility of game objects.
@ -21,8 +21,6 @@ namespace SceneUtil
/// compatibility if the enumeration values were to be changed. Feel free to change them when it makes sense. /// compatibility if the enumeration values were to be changed. Feel free to change them when it makes sense.
enum VisMask enum VisMask
{ {
Mask_Disabled = 0, // For hidden nodes
Mask_UpdateVisitor = 0x1, // reserved for separating UpdateVisitors from CullVisitors Mask_UpdateVisitor = 0x1, // reserved for separating UpdateVisitors from CullVisitors
// child of Scene // child of Scene
@ -55,19 +53,7 @@ namespace SceneUtil
Mask_PreCompile = (1<<18), Mask_PreCompile = (1<<18),
// Set on a camera's cull mask to enable the LightManager // Set on a camera's cull mask to enable the LightManager
Mask_Lighting = (1<<19), Mask_Lighting = (1<<19)
// For pathgrid nodes debugging
Mask_Pathgrid = (1<<20),
// Editor control elements
Mask_EditorCellMarker = (1<<21),
Mask_EditorCellArrow = (1<<22),
Mask_EditorCellBorder = (1<<23),
Mask_EditorReference = (1<<24),
// Default mask for OSG nodes
Mask_Default = 0xffffffff
}; };
} }

View file

@ -27,7 +27,6 @@
#include <components/sceneutil/shadow.hpp> #include <components/sceneutil/shadow.hpp>
#include <components/sceneutil/waterutil.hpp> #include <components/sceneutil/waterutil.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/misc/constants.hpp> #include <components/misc/constants.hpp>
@ -41,6 +40,7 @@
#include "../mwworld/cellstore.hpp" #include "../mwworld/cellstore.hpp"
#include "vismask.hpp"
#include "ripplesimulation.hpp" #include "ripplesimulation.hpp"
#include "renderbin.hpp" #include "renderbin.hpp"
#include "util.hpp" #include "util.hpp"
@ -243,8 +243,8 @@ public:
setName("RefractionCamera"); setName("RefractionCamera");
setCullCallback(new InheritViewPointCallback); setCullCallback(new InheritViewPointCallback);
setCullMask(SceneUtil::Mask_Effect|SceneUtil::Mask_Scene|SceneUtil::Mask_Object|SceneUtil::Mask_Static|SceneUtil::Mask_Terrain|SceneUtil::Mask_Actor|SceneUtil::Mask_ParticleSystem|SceneUtil::Mask_Sky|SceneUtil::Mask_Sun|SceneUtil::Mask_Player|SceneUtil::Mask_Lighting); setCullMask(Mask_Effect|Mask_Scene|Mask_Object|Mask_Static|Mask_Terrain|Mask_Actor|Mask_ParticleSystem|Mask_Sky|Mask_Sun|Mask_Player|Mask_Lighting);
setNodeMask(SceneUtil::Mask_RenderToTexture); setNodeMask(Mask_RenderToTexture);
setViewport(0, 0, rttSize, rttSize); setViewport(0, 0, rttSize, rttSize);
// No need for Update traversal since the scene is already updated as part of the main scene graph // No need for Update traversal since the scene is already updated as part of the main scene graph
@ -337,7 +337,7 @@ public:
setCullCallback(new InheritViewPointCallback); setCullCallback(new InheritViewPointCallback);
setInterior(isInterior); setInterior(isInterior);
setNodeMask(SceneUtil::Mask_RenderToTexture); setNodeMask(Mask_RenderToTexture);
unsigned int rttSize = Settings::Manager::getInt("rtt size", "Water"); unsigned int rttSize = Settings::Manager::getInt("rtt size", "Water");
setViewport(0, 0, rttSize, rttSize); setViewport(0, 0, rttSize, rttSize);
@ -372,11 +372,11 @@ public:
int reflectionDetail = Settings::Manager::getInt("reflection detail", "Water"); int reflectionDetail = Settings::Manager::getInt("reflection detail", "Water");
reflectionDetail = std::min(4, std::max(isInterior ? 2 : 0, reflectionDetail)); reflectionDetail = std::min(4, std::max(isInterior ? 2 : 0, reflectionDetail));
unsigned int extraMask = 0; unsigned int extraMask = 0;
if(reflectionDetail >= 1) extraMask |= SceneUtil::Mask_Terrain; if(reflectionDetail >= 1) extraMask |= Mask_Terrain;
if(reflectionDetail >= 2) extraMask |= SceneUtil::Mask_Static; if(reflectionDetail >= 2) extraMask |= Mask_Static;
if(reflectionDetail >= 3) extraMask |= SceneUtil::Mask_Effect|SceneUtil::Mask_ParticleSystem|SceneUtil::Mask_Object; if(reflectionDetail >= 3) extraMask |= Mask_Effect|Mask_ParticleSystem|Mask_Object;
if(reflectionDetail >= 4) extraMask |= SceneUtil::Mask_Player|SceneUtil::Mask_Actor; if(reflectionDetail >= 4) extraMask |= Mask_Player|Mask_Actor;
setCullMask(SceneUtil::Mask_Scene|SceneUtil::Mask_Sky|SceneUtil::Mask_Lighting|extraMask); setCullMask(Mask_Scene|Mask_Sky|Mask_Lighting|extraMask);
} }
void setWaterLevel(float waterLevel) void setWaterLevel(float waterLevel)
@ -436,12 +436,13 @@ Water::Water(osg::Group *parent, osg::Group* sceneRoot, Resource::ResourceSystem
, mToggled(true) , mToggled(true)
, mTop(0) , mTop(0)
, mInterior(false) , mInterior(false)
, mCullCallback(nullptr)
{ {
mSimulation.reset(new RippleSimulation(mSceneRoot, resourceSystem)); mSimulation.reset(new RippleSimulation(mSceneRoot, resourceSystem));
mWaterGeom = SceneUtil::createWaterGeometry(Constants::CellSizeInUnits*150, 40, 900); mWaterGeom = SceneUtil::createWaterGeometry(Constants::CellSizeInUnits*150, 40, 900);
mWaterGeom->setDrawCallback(new DepthClampCallback); mWaterGeom->setDrawCallback(new DepthClampCallback);
mWaterGeom->setNodeMask(SceneUtil::Mask_Water); mWaterGeom->setNodeMask(Mask_Water);
mWaterNode = new osg::PositionAttitudeTransform; mWaterNode = new osg::PositionAttitudeTransform;
mWaterNode->setName("Water Root"); mWaterNode->setName("Water Root");
@ -451,7 +452,7 @@ Water::Water(osg::Group *parent, osg::Group* sceneRoot, Resource::ResourceSystem
// simple water fallback for the local map // simple water fallback for the local map
osg::ref_ptr<osg::Geometry> geom2 (osg::clone(mWaterGeom.get(), osg::CopyOp::DEEP_COPY_NODES)); osg::ref_ptr<osg::Geometry> geom2 (osg::clone(mWaterGeom.get(), osg::CopyOp::DEEP_COPY_NODES));
createSimpleWaterStateSet(geom2, Fallback::Map::getFloat("Water_Map_Alpha")); createSimpleWaterStateSet(geom2, Fallback::Map::getFloat("Water_Map_Alpha"));
geom2->setNodeMask(SceneUtil::Mask_SimpleWater); geom2->setNodeMask(Mask_SimpleWater);
mWaterNode->addChild(geom2); mWaterNode->addChild(geom2);
mSceneRoot->addChild(mWaterNode); mSceneRoot->addChild(mWaterNode);
@ -466,6 +467,29 @@ Water::Water(osg::Group *parent, osg::Group* sceneRoot, Resource::ResourceSystem
ico->add(mWaterNode); ico->add(mWaterNode);
} }
void Water::setCullCallback(osg::Callback* callback)
{
if (mCullCallback)
{
mWaterNode->removeCullCallback(mCullCallback);
if (mReflection)
mReflection->removeCullCallback(mCullCallback);
if (mRefraction)
mRefraction->removeCullCallback(mCullCallback);
}
mCullCallback = callback;
if (callback)
{
mWaterNode->addCullCallback(callback);
if (mReflection)
mReflection->addCullCallback(callback);
if (mRefraction)
mRefraction->addCullCallback(callback);
}
}
osg::Uniform *Water::getRainIntensityUniform() osg::Uniform *Water::getRainIntensityUniform()
{ {
return mRainIntensityUniform.get(); return mRainIntensityUniform.get();
@ -491,6 +515,8 @@ void Water::updateWaterMaterial()
mReflection = new Reflection(mInterior); mReflection = new Reflection(mInterior);
mReflection->setWaterLevel(mTop); mReflection->setWaterLevel(mTop);
mReflection->setScene(mSceneRoot); mReflection->setScene(mSceneRoot);
if (mCullCallback)
mReflection->addCullCallback(mCullCallback);
mParent->addChild(mReflection); mParent->addChild(mReflection);
if (Settings::Manager::getBool("refraction", "Water")) if (Settings::Manager::getBool("refraction", "Water"))
@ -498,6 +524,8 @@ void Water::updateWaterMaterial()
mRefraction = new Refraction; mRefraction = new Refraction;
mRefraction->setWaterLevel(mTop); mRefraction->setWaterLevel(mTop);
mRefraction->setScene(mSceneRoot); mRefraction->setScene(mSceneRoot);
if (mCullCallback)
mRefraction->addCullCallback(mCullCallback);
mParent->addChild(mRefraction); mParent->addChild(mRefraction);
} }
@ -706,11 +734,11 @@ void Water::update(float dt)
void Water::updateVisible() void Water::updateVisible()
{ {
bool visible = mEnabled && mToggled; bool visible = mEnabled && mToggled;
mWaterNode->setNodeMask(visible ? SceneUtil::Mask_Default : SceneUtil::Mask_Disabled); mWaterNode->setNodeMask(visible ? ~0 : 0);
if (mRefraction) if (mRefraction)
mRefraction->setNodeMask(visible ? SceneUtil::Mask_RenderToTexture : SceneUtil::Mask_Disabled); mRefraction->setNodeMask(visible ? Mask_RenderToTexture : 0);
if (mReflection) if (mReflection)
mReflection->setNodeMask(visible ? SceneUtil::Mask_RenderToTexture : SceneUtil::Mask_Disabled); mReflection->setNodeMask(visible ? Mask_RenderToTexture : 0);
} }
bool Water::toggle() bool Water::toggle()

View file

@ -71,6 +71,8 @@ namespace MWRender
float mTop; float mTop;
bool mInterior; bool mInterior;
osg::Callback* mCullCallback;
osg::Vec3f getSceneNodeCoordinates(int gridX, int gridY); osg::Vec3f getSceneNodeCoordinates(int gridX, int gridY);
void updateVisible(); void updateVisible();
@ -88,6 +90,8 @@ namespace MWRender
const std::string& resourcePath); const std::string& resourcePath);
~Water(); ~Water();
void setCullCallback(osg::Callback* callback);
void listAssetsToPreload(std::vector<std::string>& textures); void listAssetsToPreload(std::vector<std::string>& textures);
void setEnabled(bool enabled); void setEnabled(bool enabled);

View file

@ -45,7 +45,7 @@ void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener)
const std::vector<ESM::Header::MasterData> &masters = esm.getGameFiles(); const std::vector<ESM::Header::MasterData> &masters = esm.getGameFiles();
std::vector<ESM::ESMReader> *allPlugins = esm.getGlobalReaderList(); std::vector<ESM::ESMReader> *allPlugins = esm.getGlobalReaderList();
for (size_t j = 0; j < masters.size(); j++) { for (size_t j = 0; j < masters.size(); j++) {
ESM::Header::MasterData &mast = const_cast<ESM::Header::MasterData&>(masters[j]); const ESM::Header::MasterData &mast = masters[j];
std::string fname = mast.name; std::string fname = mast.name;
int index = ~0; int index = ~0;
for (int i = 0; i < esm.getIndex(); i++) { for (int i = 0; i < esm.getIndex(); i++) {
@ -63,7 +63,7 @@ void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener)
+ ", but it has not been loaded yet. Please check your load order."; + ", but it has not been loaded yet. Please check your load order.";
esm.fail(fstring); esm.fail(fstring);
} }
mast.index = index; esm.addParentFileIndex(index);
} }
// Loop through all records // Loop through all records

View file

@ -16,7 +16,6 @@
#include <components/sceneutil/controller.hpp> #include <components/sceneutil/controller.hpp>
#include <components/sceneutil/visitor.hpp> #include <components/sceneutil/visitor.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/sceneutil/lightmanager.hpp> #include <components/sceneutil/lightmanager.hpp>
#include "../mwworld/manualref.hpp" #include "../mwworld/manualref.hpp"
@ -36,6 +35,7 @@
#include "../mwmechanics/weapontype.hpp" #include "../mwmechanics/weapontype.hpp"
#include "../mwrender/animation.hpp" #include "../mwrender/animation.hpp"
#include "../mwrender/vismask.hpp"
#include "../mwrender/renderingmanager.hpp" #include "../mwrender/renderingmanager.hpp"
#include "../mwrender/util.hpp" #include "../mwrender/util.hpp"
@ -188,7 +188,7 @@ namespace MWWorld
bool rotate, bool createLight, osg::Vec4 lightDiffuseColor, std::string texture) bool rotate, bool createLight, osg::Vec4 lightDiffuseColor, std::string texture)
{ {
state.mNode = new osg::PositionAttitudeTransform; state.mNode = new osg::PositionAttitudeTransform;
state.mNode->setNodeMask(SceneUtil::Mask_Effect); state.mNode->setNodeMask(MWRender::Mask_Effect);
state.mNode->setPosition(pos); state.mNode->setPosition(pos);
state.mNode->setAttitude(orient); state.mNode->setAttitude(orient);
@ -228,7 +228,7 @@ namespace MWWorld
projectileLight->setPosition(osg::Vec4(pos, 1.0)); projectileLight->setPosition(osg::Vec4(pos, 1.0));
SceneUtil::LightSource* projectileLightSource = new SceneUtil::LightSource; SceneUtil::LightSource* projectileLightSource = new SceneUtil::LightSource;
projectileLightSource->setNodeMask(SceneUtil::Mask_Lighting); projectileLightSource->setNodeMask(MWRender::Mask_Lighting);
projectileLightSource->setRadius(66.f); projectileLightSource->setRadius(66.f);
state.mNode->addChild(projectileLightSource); state.mNode->addChild(projectileLightSource);

View file

@ -45,7 +45,6 @@
#include <components/resource/resourcesystem.hpp> #include <components/resource/resourcesystem.hpp>
#include <components/sceneutil/positionattitudetransform.hpp> #include <components/sceneutil/positionattitudetransform.hpp>
#include <components/sceneutil/vismask.hpp>
#include <components/detournavigator/debug.hpp> #include <components/detournavigator/debug.hpp>
#include <components/detournavigator/navigatorimpl.hpp> #include <components/detournavigator/navigatorimpl.hpp>
@ -69,6 +68,7 @@
#include "../mwrender/npcanimation.hpp" #include "../mwrender/npcanimation.hpp"
#include "../mwrender/renderingmanager.hpp" #include "../mwrender/renderingmanager.hpp"
#include "../mwrender/camera.hpp" #include "../mwrender/camera.hpp"
#include "../mwrender/vismask.hpp"
#include "../mwscript/globalscripts.hpp" #include "../mwscript/globalscripts.hpp"
@ -2566,7 +2566,7 @@ namespace MWWorld
{ {
// Adjust position so the location we wanted ends up in the middle of the object bounding box // Adjust position so the location we wanted ends up in the middle of the object bounding box
osg::ComputeBoundsVisitor computeBounds; osg::ComputeBoundsVisitor computeBounds;
computeBounds.setTraversalMask(~SceneUtil::Mask_ParticleSystem); computeBounds.setTraversalMask(~MWRender::Mask_ParticleSystem);
dropped.getRefData().getBaseNode()->accept(computeBounds); dropped.getRefData().getBaseNode()->accept(computeBounds);
osg::BoundingBox bounds = computeBounds.getBoundingBox(); osg::BoundingBox bounds = computeBounds.getBoundingBox();
if (bounds.valid()) if (bounds.valid())
@ -2847,7 +2847,7 @@ namespace MWWorld
void World::screenshot(osg::Image* image, int w, int h) void World::screenshot(osg::Image* image, int w, int h)
{ {
mRendering->screenshot(image, w, h); mRendering->screenshotFramebuffer(image, w, h);
} }
bool World::screenshot360(osg::Image* image, std::string settingStr) bool World::screenshot360(osg::Image* image, std::string settingStr)

View file

@ -11,10 +11,16 @@
#include <boost/optional/optional_io.hpp> #include <boost/optional/optional_io.hpp>
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <iterator> #include <iterator>
#include <deque> #include <deque>
MATCHER_P3(Vec3fEq, x, y, z, "")
{
return std::abs(arg.x() - x) < 1e-4 && std::abs(arg.y() - y) < 1e-4 && std::abs(arg.z() - z) < 1e-4;
}
namespace namespace
{ {
using namespace testing; using namespace testing;
@ -113,31 +119,31 @@ namespace
EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success); EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success);
EXPECT_EQ(mPath, std::deque<osg::Vec3f>({ EXPECT_THAT(mPath, ElementsAre(
osg::Vec3f(-215, 215, 1.85963428020477294921875), Vec3fEq(-215, 215, 1.85963428020477294921875),
osg::Vec3f(-194.9653167724609375, 194.9653167724609375, -6.57602214813232421875), Vec3fEq(-194.9653167724609375, 194.9653167724609375, -6.57602214813232421875),
osg::Vec3f(-174.930633544921875, 174.930633544921875, -15.01167774200439453125), Vec3fEq(-174.930633544921875, 174.930633544921875, -15.01167774200439453125),
osg::Vec3f(-154.8959503173828125, 154.8959503173828125, -23.4473361968994140625), Vec3fEq(-154.8959503173828125, 154.8959503173828125, -23.4473361968994140625),
osg::Vec3f(-134.86126708984375, 134.86126708984375, -31.8829936981201171875), Vec3fEq(-134.86126708984375, 134.86126708984375, -31.8829936981201171875),
osg::Vec3f(-114.82657623291015625, 114.82657623291015625, -40.3186492919921875), Vec3fEq(-114.82657623291015625, 114.82657623291015625, -40.3186492919921875),
osg::Vec3f(-94.7918853759765625, 94.7918853759765625, -47.3990631103515625), Vec3fEq(-94.7918853759765625, 94.7918853759765625, -47.3990631103515625),
osg::Vec3f(-74.75719451904296875, 74.75719451904296875, -53.7258148193359375), Vec3fEq(-74.75719451904296875, 74.75719451904296875, -53.7258148193359375),
osg::Vec3f(-54.722499847412109375, 54.722499847412109375, -60.052555084228515625), Vec3fEq(-54.722499847412109375, 54.722499847412109375, -60.052555084228515625),
osg::Vec3f(-34.68780517578125, 34.68780517578125, -66.37931060791015625), Vec3fEq(-34.68780517578125, 34.68780517578125, -66.37931060791015625),
osg::Vec3f(-14.6531162261962890625, 14.6531162261962890625, -72.70604705810546875), Vec3fEq(-14.6531162261962890625, 14.6531162261962890625, -72.70604705810546875),
osg::Vec3f(5.3815765380859375, -5.3815765380859375, -75.35065460205078125), Vec3fEq(5.3815765380859375, -5.3815765380859375, -75.35065460205078125),
osg::Vec3f(25.41626739501953125, -25.41626739501953125, -67.9694671630859375), Vec3fEq(25.41626739501953125, -25.41626739501953125, -67.9694671630859375),
osg::Vec3f(45.450958251953125, -45.450958251953125, -60.5882568359375), Vec3fEq(45.450958251953125, -45.450958251953125, -60.5882568359375),
osg::Vec3f(65.48564910888671875, -65.48564910888671875, -53.20705413818359375), Vec3fEq(65.48564910888671875, -65.48564910888671875, -53.20705413818359375),
osg::Vec3f(85.5203399658203125, -85.5203399658203125, -45.8258514404296875), Vec3fEq(85.5203399658203125, -85.5203399658203125, -45.8258514404296875),
osg::Vec3f(105.55503082275390625, -105.55503082275390625, -38.44464874267578125), Vec3fEq(105.55503082275390625, -105.55503082275390625, -38.44464874267578125),
osg::Vec3f(125.5897216796875, -125.5897216796875, -31.063449859619140625), Vec3fEq(125.5897216796875, -125.5897216796875, -31.063449859619140625),
osg::Vec3f(145.6244049072265625, -145.6244049072265625, -23.6822509765625), Vec3fEq(145.6244049072265625, -145.6244049072265625, -23.6822509765625),
osg::Vec3f(165.659088134765625, -165.659088134765625, -16.3010501861572265625), Vec3fEq(165.659088134765625, -165.659088134765625, -16.3010501861572265625),
osg::Vec3f(185.6937713623046875, -185.6937713623046875, -8.91985416412353515625), Vec3fEq(185.6937713623046875, -185.6937713623046875, -8.91985416412353515625),
osg::Vec3f(205.7284698486328125, -205.7284698486328125, -1.5386505126953125), Vec3fEq(205.7284698486328125, -205.7284698486328125, -1.5386505126953125),
osg::Vec3f(215, -215, 1.87718021869659423828125), Vec3fEq(215, -215, 1.87718021869659423828125)
})) << mPath; ));
} }
TEST_F(DetourNavigatorNavigatorTest, add_object_should_change_navmesh) TEST_F(DetourNavigatorNavigatorTest, add_object_should_change_navmesh)
@ -163,31 +169,31 @@ namespace
EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success); EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success);
EXPECT_EQ(mPath, std::deque<osg::Vec3f>({ EXPECT_THAT(mPath, ElementsAre(
osg::Vec3f(-215, 215, 1.85963428020477294921875), Vec3fEq(-215, 215, 1.85963428020477294921875),
osg::Vec3f(-194.9653167724609375, 194.9653167724609375, -6.57602214813232421875), Vec3fEq(-194.9653167724609375, 194.9653167724609375, -6.57602214813232421875),
osg::Vec3f(-174.930633544921875, 174.930633544921875, -15.01167774200439453125), Vec3fEq(-174.930633544921875, 174.930633544921875, -15.01167774200439453125),
osg::Vec3f(-154.8959503173828125, 154.8959503173828125, -23.4473361968994140625), Vec3fEq(-154.8959503173828125, 154.8959503173828125, -23.4473361968994140625),
osg::Vec3f(-134.86126708984375, 134.86126708984375, -31.8829936981201171875), Vec3fEq(-134.86126708984375, 134.86126708984375, -31.8829936981201171875),
osg::Vec3f(-114.82657623291015625, 114.82657623291015625, -40.3186492919921875), Vec3fEq(-114.82657623291015625, 114.82657623291015625, -40.3186492919921875),
osg::Vec3f(-94.7918853759765625, 94.7918853759765625, -47.3990631103515625), Vec3fEq(-94.7918853759765625, 94.7918853759765625, -47.3990631103515625),
osg::Vec3f(-74.75719451904296875, 74.75719451904296875, -53.7258148193359375), Vec3fEq(-74.75719451904296875, 74.75719451904296875, -53.7258148193359375),
osg::Vec3f(-54.722499847412109375, 54.722499847412109375, -60.052555084228515625), Vec3fEq(-54.722499847412109375, 54.722499847412109375, -60.052555084228515625),
osg::Vec3f(-34.68780517578125, 34.68780517578125, -66.37931060791015625), Vec3fEq(-34.68780517578125, 34.68780517578125, -66.37931060791015625),
osg::Vec3f(-14.6531162261962890625, 14.6531162261962890625, -72.70604705810546875), Vec3fEq(-14.6531162261962890625, 14.6531162261962890625, -72.70604705810546875),
osg::Vec3f(5.3815765380859375, -5.3815765380859375, -75.35065460205078125), Vec3fEq(5.3815765380859375, -5.3815765380859375, -75.35065460205078125),
osg::Vec3f(25.41626739501953125, -25.41626739501953125, -67.9694671630859375), Vec3fEq(25.41626739501953125, -25.41626739501953125, -67.9694671630859375),
osg::Vec3f(45.450958251953125, -45.450958251953125, -60.5882568359375), Vec3fEq(45.450958251953125, -45.450958251953125, -60.5882568359375),
osg::Vec3f(65.48564910888671875, -65.48564910888671875, -53.20705413818359375), Vec3fEq(65.48564910888671875, -65.48564910888671875, -53.20705413818359375),
osg::Vec3f(85.5203399658203125, -85.5203399658203125, -45.8258514404296875), Vec3fEq(85.5203399658203125, -85.5203399658203125, -45.8258514404296875),
osg::Vec3f(105.55503082275390625, -105.55503082275390625, -38.44464874267578125), Vec3fEq(105.55503082275390625, -105.55503082275390625, -38.44464874267578125),
osg::Vec3f(125.5897216796875, -125.5897216796875, -31.063449859619140625), Vec3fEq(125.5897216796875, -125.5897216796875, -31.063449859619140625),
osg::Vec3f(145.6244049072265625, -145.6244049072265625, -23.6822509765625), Vec3fEq(145.6244049072265625, -145.6244049072265625, -23.6822509765625),
osg::Vec3f(165.659088134765625, -165.659088134765625, -16.3010501861572265625), Vec3fEq(165.659088134765625, -165.659088134765625, -16.3010501861572265625),
osg::Vec3f(185.6937713623046875, -185.6937713623046875, -8.91985416412353515625), Vec3fEq(185.6937713623046875, -185.6937713623046875, -8.91985416412353515625),
osg::Vec3f(205.7284698486328125, -205.7284698486328125, -1.5386505126953125), Vec3fEq(205.7284698486328125, -205.7284698486328125, -1.5386505126953125),
osg::Vec3f(215, -215, 1.87718021869659423828125), Vec3fEq(215, -215, 1.87718021869659423828125)
})) << mPath; ));
mNavigator->addObject(ObjectId(&compoundShape), compoundShape, btTransform::getIdentity()); mNavigator->addObject(ObjectId(&compoundShape), compoundShape, btTransform::getIdentity());
mNavigator->update(mPlayerPosition); mNavigator->update(mPlayerPosition);
@ -197,31 +203,31 @@ namespace
mOut = std::back_inserter(mPath); mOut = std::back_inserter(mPath);
EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success); EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success);
EXPECT_EQ(mPath, std::deque<osg::Vec3f>({ EXPECT_THAT(mPath, ElementsAre(
osg::Vec3f(-215, 215, 1.87826788425445556640625), Vec3fEq(-215, 215, 1.87826788425445556640625),
osg::Vec3f(-199.7968292236328125, 191.09100341796875, -3.54876613616943359375), Vec3fEq(-199.7968292236328125, 191.09100341796875, -3.54876613616943359375),
osg::Vec3f(-184.5936431884765625, 167.1819915771484375, -8.97847843170166015625), Vec3fEq(-184.5936431884765625, 167.1819915771484375, -8.97847843170166015625),
osg::Vec3f(-169.3904571533203125, 143.2729949951171875, -14.408184051513671875), Vec3fEq(-169.3904571533203125, 143.2729949951171875, -14.408184051513671875),
osg::Vec3f(-154.1872711181640625, 119.36397552490234375, -19.837890625), Vec3fEq(-154.1872711181640625, 119.36397552490234375, -19.837890625),
osg::Vec3f(-138.9840850830078125, 95.45496368408203125, -25.2675991058349609375), Vec3fEq(-138.9840850830078125, 95.45496368408203125, -25.2675991058349609375),
osg::Vec3f(-123.78090667724609375, 71.54595184326171875, -30.6973056793212890625), Vec3fEq(-123.78090667724609375, 71.54595184326171875, -30.6973056793212890625),
osg::Vec3f(-108.57772064208984375, 47.636936187744140625, -36.12701416015625), Vec3fEq(-108.57772064208984375, 47.636936187744140625, -36.12701416015625),
osg::Vec3f(-93.3745269775390625, 23.7279262542724609375, -40.754688262939453125), Vec3fEq(-93.3745269775390625, 23.7279262542724609375, -40.754688262939453125),
osg::Vec3f(-78.17134857177734375, -0.18108306825160980224609375, -37.128787994384765625), Vec3fEq(-78.17134857177734375, -0.18108306825160980224609375, -37.128787994384765625),
osg::Vec3f(-62.968158721923828125, -24.0900936126708984375, -33.50289154052734375), Vec3fEq(-62.968158721923828125, -24.0900936126708984375, -33.50289154052734375),
osg::Vec3f(-47.764972686767578125, -47.999103546142578125, -30.797946929931640625), Vec3fEq(-47.764972686767578125, -47.999103546142578125, -30.797946929931640625),
osg::Vec3f(-23.852447509765625, -63.196765899658203125, -33.97112274169921875), Vec3fEq(-23.852447509765625, -63.196765899658203125, -33.97112274169921875),
osg::Vec3f(0.0600789971649646759033203125, -78.39443206787109375, -37.14543914794921875), Vec3fEq(0.0600789971649646759033203125, -78.39443206787109375, -37.14543914794921875),
osg::Vec3f(23.97260284423828125, -93.5920867919921875, -40.774089813232421875), Vec3fEq(23.97260284423828125, -93.5920867919921875, -40.774089813232421875),
osg::Vec3f(47.885128021240234375, -108.78974151611328125, -36.05129241943359375), Vec3fEq(47.885128021240234375, -108.78974151611328125, -36.05129241943359375),
osg::Vec3f(71.7976531982421875, -123.98740386962890625, -30.6235561370849609375), Vec3fEq(71.7976531982421875, -123.98740386962890625, -30.6235561370849609375),
osg::Vec3f(95.71018218994140625, -139.18505859375, -25.1958255767822265625), Vec3fEq(95.71018218994140625, -139.18505859375, -25.1958255767822265625),
osg::Vec3f(119.6226959228515625, -154.382720947265625, -19.7680912017822265625), Vec3fEq(119.6226959228515625, -154.382720947265625, -19.7680912017822265625),
osg::Vec3f(143.53521728515625, -169.58038330078125, -14.34035205841064453125), Vec3fEq(143.53521728515625, -169.58038330078125, -14.34035205841064453125),
osg::Vec3f(167.4477386474609375, -184.778045654296875, -8.9126186370849609375), Vec3fEq(167.4477386474609375, -184.778045654296875, -8.9126186370849609375),
osg::Vec3f(191.360260009765625, -199.9757080078125, -3.4848802089691162109375), Vec3fEq(191.360260009765625, -199.9757080078125, -3.4848802089691162109375),
osg::Vec3f(215, -215, 1.87826788425445556640625), Vec3fEq(215, -215, 1.87826788425445556640625)
})) << mPath; ));
} }
TEST_F(DetourNavigatorNavigatorTest, update_changed_object_should_change_navmesh) TEST_F(DetourNavigatorNavigatorTest, update_changed_object_should_change_navmesh)
@ -248,31 +254,31 @@ namespace
EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success); EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success);
EXPECT_EQ(mPath, std::deque<osg::Vec3f>({ EXPECT_THAT(mPath, ElementsAre(
osg::Vec3f(-215, 215, 1.87826788425445556640625), Vec3fEq(-215, 215, 1.87826788425445556640625),
osg::Vec3f(-199.7968292236328125, 191.09100341796875, -3.54876613616943359375), Vec3fEq(-199.7968292236328125, 191.09100341796875, -3.54876613616943359375),
osg::Vec3f(-184.5936431884765625, 167.1819915771484375, -8.97847843170166015625), Vec3fEq(-184.5936431884765625, 167.1819915771484375, -8.97847843170166015625),
osg::Vec3f(-169.3904571533203125, 143.2729949951171875, -14.408184051513671875), Vec3fEq(-169.3904571533203125, 143.2729949951171875, -14.408184051513671875),
osg::Vec3f(-154.1872711181640625, 119.36397552490234375, -19.837890625), Vec3fEq(-154.1872711181640625, 119.36397552490234375, -19.837890625),
osg::Vec3f(-138.9840850830078125, 95.45496368408203125, -25.2675991058349609375), Vec3fEq(-138.9840850830078125, 95.45496368408203125, -25.2675991058349609375),
osg::Vec3f(-123.78090667724609375, 71.54595184326171875, -30.6973056793212890625), Vec3fEq(-123.78090667724609375, 71.54595184326171875, -30.6973056793212890625),
osg::Vec3f(-108.57772064208984375, 47.636936187744140625, -36.12701416015625), Vec3fEq(-108.57772064208984375, 47.636936187744140625, -36.12701416015625),
osg::Vec3f(-93.3745269775390625, 23.7279262542724609375, -40.754688262939453125), Vec3fEq(-93.3745269775390625, 23.7279262542724609375, -40.754688262939453125),
osg::Vec3f(-78.17134857177734375, -0.18108306825160980224609375, -37.128787994384765625), Vec3fEq(-78.17134857177734375, -0.18108306825160980224609375, -37.128787994384765625),
osg::Vec3f(-62.968158721923828125, -24.0900936126708984375, -33.50289154052734375), Vec3fEq(-62.968158721923828125, -24.0900936126708984375, -33.50289154052734375),
osg::Vec3f(-47.764972686767578125, -47.999103546142578125, -30.797946929931640625), Vec3fEq(-47.764972686767578125, -47.999103546142578125, -30.797946929931640625),
osg::Vec3f(-23.852447509765625, -63.196765899658203125, -33.97112274169921875), Vec3fEq(-23.852447509765625, -63.196765899658203125, -33.97112274169921875),
osg::Vec3f(0.0600789971649646759033203125, -78.39443206787109375, -37.14543914794921875), Vec3fEq(0.0600789971649646759033203125, -78.39443206787109375, -37.14543914794921875),
osg::Vec3f(23.97260284423828125, -93.5920867919921875, -40.774089813232421875), Vec3fEq(23.97260284423828125, -93.5920867919921875, -40.774089813232421875),
osg::Vec3f(47.885128021240234375, -108.78974151611328125, -36.05129241943359375), Vec3fEq(47.885128021240234375, -108.78974151611328125, -36.05129241943359375),
osg::Vec3f(71.7976531982421875, -123.98740386962890625, -30.6235561370849609375), Vec3fEq(71.7976531982421875, -123.98740386962890625, -30.6235561370849609375),
osg::Vec3f(95.71018218994140625, -139.18505859375, -25.1958255767822265625), Vec3fEq(95.71018218994140625, -139.18505859375, -25.1958255767822265625),
osg::Vec3f(119.6226959228515625, -154.382720947265625, -19.7680912017822265625), Vec3fEq(119.6226959228515625, -154.382720947265625, -19.7680912017822265625),
osg::Vec3f(143.53521728515625, -169.58038330078125, -14.34035205841064453125), Vec3fEq(143.53521728515625, -169.58038330078125, -14.34035205841064453125),
osg::Vec3f(167.4477386474609375, -184.778045654296875, -8.9126186370849609375), Vec3fEq(167.4477386474609375, -184.778045654296875, -8.9126186370849609375),
osg::Vec3f(191.360260009765625, -199.9757080078125, -3.4848802089691162109375), Vec3fEq(191.360260009765625, -199.9757080078125, -3.4848802089691162109375),
osg::Vec3f(215, -215, 1.87826788425445556640625), Vec3fEq(215, -215, 1.87826788425445556640625)
})) << mPath; ));
compoundShape.updateChildTransform(0, btTransform(btMatrix3x3::getIdentity(), btVector3(1000, 0, 0))); compoundShape.updateChildTransform(0, btTransform(btMatrix3x3::getIdentity(), btVector3(1000, 0, 0)));
@ -284,31 +290,31 @@ namespace
mOut = std::back_inserter(mPath); mOut = std::back_inserter(mPath);
EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success); EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success);
EXPECT_EQ(mPath, std::deque<osg::Vec3f>({ EXPECT_THAT(mPath, ElementsAre(
osg::Vec3f(-215, 215, 1.85963428020477294921875), Vec3fEq(-215, 215, 1.85963428020477294921875),
osg::Vec3f(-194.9653167724609375, 194.9653167724609375, -6.57602214813232421875), Vec3fEq(-194.9653167724609375, 194.9653167724609375, -6.57602214813232421875),
osg::Vec3f(-174.930633544921875, 174.930633544921875, -15.01167774200439453125), Vec3fEq(-174.930633544921875, 174.930633544921875, -15.01167774200439453125),
osg::Vec3f(-154.8959503173828125, 154.8959503173828125, -23.4473361968994140625), Vec3fEq(-154.8959503173828125, 154.8959503173828125, -23.4473361968994140625),
osg::Vec3f(-134.86126708984375, 134.86126708984375, -31.8829936981201171875), Vec3fEq(-134.86126708984375, 134.86126708984375, -31.8829936981201171875),
osg::Vec3f(-114.82657623291015625, 114.82657623291015625, -40.3186492919921875), Vec3fEq(-114.82657623291015625, 114.82657623291015625, -40.3186492919921875),
osg::Vec3f(-94.7918853759765625, 94.7918853759765625, -47.3990631103515625), Vec3fEq(-94.7918853759765625, 94.7918853759765625, -47.3990631103515625),
osg::Vec3f(-74.75719451904296875, 74.75719451904296875, -53.7258148193359375), Vec3fEq(-74.75719451904296875, 74.75719451904296875, -53.7258148193359375),
osg::Vec3f(-54.722499847412109375, 54.722499847412109375, -60.052555084228515625), Vec3fEq(-54.722499847412109375, 54.722499847412109375, -60.052555084228515625),
osg::Vec3f(-34.68780517578125, 34.68780517578125, -66.37931060791015625), Vec3fEq(-34.68780517578125, 34.68780517578125, -66.37931060791015625),
osg::Vec3f(-14.6531162261962890625, 14.6531162261962890625, -72.70604705810546875), Vec3fEq(-14.6531162261962890625, 14.6531162261962890625, -72.70604705810546875),
osg::Vec3f(5.3815765380859375, -5.3815765380859375, -75.35065460205078125), Vec3fEq(5.3815765380859375, -5.3815765380859375, -75.35065460205078125),
osg::Vec3f(25.41626739501953125, -25.41626739501953125, -67.9694671630859375), Vec3fEq(25.41626739501953125, -25.41626739501953125, -67.9694671630859375),
osg::Vec3f(45.450958251953125, -45.450958251953125, -60.5882568359375), Vec3fEq(45.450958251953125, -45.450958251953125, -60.5882568359375),
osg::Vec3f(65.48564910888671875, -65.48564910888671875, -53.20705413818359375), Vec3fEq(65.48564910888671875, -65.48564910888671875, -53.20705413818359375),
osg::Vec3f(85.5203399658203125, -85.5203399658203125, -45.8258514404296875), Vec3fEq(85.5203399658203125, -85.5203399658203125, -45.8258514404296875),
osg::Vec3f(105.55503082275390625, -105.55503082275390625, -38.44464874267578125), Vec3fEq(105.55503082275390625, -105.55503082275390625, -38.44464874267578125),
osg::Vec3f(125.5897216796875, -125.5897216796875, -31.063449859619140625), Vec3fEq(125.5897216796875, -125.5897216796875, -31.063449859619140625),
osg::Vec3f(145.6244049072265625, -145.6244049072265625, -23.6822509765625), Vec3fEq(145.6244049072265625, -145.6244049072265625, -23.6822509765625),
osg::Vec3f(165.659088134765625, -165.659088134765625, -16.3010501861572265625), Vec3fEq(165.659088134765625, -165.659088134765625, -16.3010501861572265625),
osg::Vec3f(185.6937713623046875, -185.6937713623046875, -8.91985416412353515625), Vec3fEq(185.6937713623046875, -185.6937713623046875, -8.91985416412353515625),
osg::Vec3f(205.7284698486328125, -205.7284698486328125, -1.5386505126953125), Vec3fEq(205.7284698486328125, -205.7284698486328125, -1.5386505126953125),
osg::Vec3f(215, -215, 1.87718021869659423828125), Vec3fEq(215, -215, 1.87718021869659423828125)
})) << mPath; ));
} }
TEST_F(DetourNavigatorNavigatorTest, for_overlapping_heightfields_should_use_higher) TEST_F(DetourNavigatorNavigatorTest, for_overlapping_heightfields_should_use_higher)
@ -341,31 +347,31 @@ namespace
EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success); EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success);
EXPECT_EQ(mPath, std::deque<osg::Vec3f>({ EXPECT_THAT(mPath, ElementsAre(
osg::Vec3f(-215, 215, 1.96328866481781005859375), Vec3fEq(-215, 215, 1.96328866481781005859375),
osg::Vec3f(-194.9653167724609375, 194.9653167724609375, -0.242215454578399658203125), Vec3fEq(-194.9653167724609375, 194.9653167724609375, -0.242215454578399658203125),
osg::Vec3f(-174.930633544921875, 174.930633544921875, -2.447719097137451171875), Vec3fEq(-174.930633544921875, 174.930633544921875, -2.447719097137451171875),
osg::Vec3f(-154.8959503173828125, 154.8959503173828125, -4.65322399139404296875), Vec3fEq(-154.8959503173828125, 154.8959503173828125, -4.65322399139404296875),
osg::Vec3f(-134.86126708984375, 134.86126708984375, -6.858726978302001953125), Vec3fEq(-134.86126708984375, 134.86126708984375, -6.858726978302001953125),
osg::Vec3f(-114.82657623291015625, 114.82657623291015625, -9.06423282623291015625), Vec3fEq(-114.82657623291015625, 114.82657623291015625, -9.06423282623291015625),
osg::Vec3f(-94.7918853759765625, 94.7918853759765625, -11.26973628997802734375), Vec3fEq(-94.7918853759765625, 94.7918853759765625, -11.26973628997802734375),
osg::Vec3f(-74.75719451904296875, 74.75719451904296875, -13.26497173309326171875), Vec3fEq(-74.75719451904296875, 74.75719451904296875, -13.26497173309326171875),
osg::Vec3f(-54.722499847412109375, 54.722499847412109375, -15.24860477447509765625), Vec3fEq(-54.722499847412109375, 54.722499847412109375, -15.24860477447509765625),
osg::Vec3f(-34.68780517578125, 34.68780517578125, -17.23223876953125), Vec3fEq(-34.68780517578125, 34.68780517578125, -17.23223876953125),
osg::Vec3f(-14.6531162261962890625, 14.6531162261962890625, -19.215869903564453125), Vec3fEq(-14.6531162261962890625, 14.6531162261962890625, -19.215869903564453125),
osg::Vec3f(5.3815765380859375, -5.3815765380859375, -20.1338443756103515625), Vec3fEq(5.3815765380859375, -5.3815765380859375, -20.1338443756103515625),
osg::Vec3f(25.41626739501953125, -25.41626739501953125, -18.1502132415771484375), Vec3fEq(25.41626739501953125, -25.41626739501953125, -18.1502132415771484375),
osg::Vec3f(45.450958251953125, -45.450958251953125, -16.1665802001953125), Vec3fEq(45.450958251953125, -45.450958251953125, -16.1665802001953125),
osg::Vec3f(65.48564910888671875, -65.48564910888671875, -14.18294620513916015625), Vec3fEq(65.48564910888671875, -65.48564910888671875, -14.18294620513916015625),
osg::Vec3f(85.5203399658203125, -85.5203399658203125, -12.199314117431640625), Vec3fEq(85.5203399658203125, -85.5203399658203125, -12.199314117431640625),
osg::Vec3f(105.55503082275390625, -105.55503082275390625, -10.08488368988037109375), Vec3fEq(105.55503082275390625, -105.55503082275390625, -10.08488368988037109375),
osg::Vec3f(125.5897216796875, -125.5897216796875, -7.87938022613525390625), Vec3fEq(125.5897216796875, -125.5897216796875, -7.87938022613525390625),
osg::Vec3f(145.6244049072265625, -145.6244049072265625, -5.673875331878662109375), Vec3fEq(145.6244049072265625, -145.6244049072265625, -5.673875331878662109375),
osg::Vec3f(165.659088134765625, -165.659088134765625, -3.468370914459228515625), Vec3fEq(165.659088134765625, -165.659088134765625, -3.468370914459228515625),
osg::Vec3f(185.6937713623046875, -185.6937713623046875, -1.26286637783050537109375), Vec3fEq(185.6937713623046875, -185.6937713623046875, -1.26286637783050537109375),
osg::Vec3f(205.7284698486328125, -205.7284698486328125, 0.942641556262969970703125), Vec3fEq(205.7284698486328125, -205.7284698486328125, 0.942641556262969970703125),
osg::Vec3f(215, -215, 1.96328866481781005859375), Vec3fEq(215, -215, 1.96328866481781005859375)
})) << mPath; ));
} }
TEST_F(DetourNavigatorNavigatorTest, path_should_be_around_avoid_shape) TEST_F(DetourNavigatorNavigatorTest, path_should_be_around_avoid_shape)
@ -397,32 +403,32 @@ namespace
EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success); EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success);
EXPECT_EQ(mPath, std::deque<osg::Vec3f>({ EXPECT_THAT(mPath, ElementsAre(
osg::Vec3f(-215, 215, 1.9393787384033203125), Vec3fEq(-215, 215, 1.9393787384033203125),
osg::Vec3f(-200.8159637451171875, 190.47265625, -0.639537751674652099609375), Vec3fEq(-200.8159637451171875, 190.47265625, -0.639537751674652099609375),
osg::Vec3f(-186.6319427490234375, 165.9453125, -3.2184507846832275390625), Vec3fEq(-186.6319427490234375, 165.9453125, -3.2184507846832275390625),
osg::Vec3f(-172.447906494140625, 141.41796875, -5.797363758087158203125), Vec3fEq(-172.447906494140625, 141.41796875, -5.797363758087158203125),
osg::Vec3f(-158.263885498046875, 116.8906097412109375, -8.37627696990966796875), Vec3fEq(-158.263885498046875, 116.8906097412109375, -8.37627696990966796875),
osg::Vec3f(-144.079864501953125, 92.3632659912109375, -10.9551906585693359375), Vec3fEq(-144.079864501953125, 92.3632659912109375, -10.9551906585693359375),
osg::Vec3f(-129.89581298828125, 67.83591461181640625, -13.53410625457763671875), Vec3fEq(-129.89581298828125, 67.83591461181640625, -13.53410625457763671875),
osg::Vec3f(-115.7117919921875, 43.308563232421875, -16.1130199432373046875), Vec3fEq(-115.7117919921875, 43.308563232421875, -16.1130199432373046875),
osg::Vec3f(-101.5277557373046875, 18.7812137603759765625, -18.6919345855712890625), Vec3fEq(-101.5277557373046875, 18.7812137603759765625, -18.6919345855712890625),
osg::Vec3f(-87.34372711181640625, -5.7461376190185546875, -20.4680538177490234375), Vec3fEq(-87.34372711181640625, -5.7461376190185546875, -20.4680538177490234375),
osg::Vec3f(-67.02922821044921875, -25.4970550537109375, -20.514247894287109375), Vec3fEq(-67.02922821044921875, -25.4970550537109375, -20.514247894287109375),
osg::Vec3f(-46.714717864990234375, -45.2479705810546875, -20.560443878173828125), Vec3fEq(-46.714717864990234375, -45.2479705810546875, -20.560443878173828125),
osg::Vec3f(-26.40021514892578125, -64.99889373779296875, -20.6066417694091796875), Vec3fEq(-26.40021514892578125, -64.99889373779296875, -20.6066417694091796875),
osg::Vec3f(-6.085712432861328125, -84.74980926513671875, -20.652835845947265625), Vec3fEq(-6.085712432861328125, -84.74980926513671875, -20.652835845947265625),
osg::Vec3f(14.22879505157470703125, -104.50072479248046875, -18.151397705078125), Vec3fEq(14.22879505157470703125, -104.50072479248046875, -18.151397705078125),
osg::Vec3f(39.05098724365234375, -118.16222381591796875, -15.66748714447021484375), Vec3fEq(39.05098724365234375, -118.16222381591796875, -15.66748714447021484375),
osg::Vec3f(63.87317657470703125, -131.82373046875, -13.18358135223388671875), Vec3fEq(63.87317657470703125, -131.82373046875, -13.18358135223388671875),
osg::Vec3f(88.69537353515625, -145.4852142333984375, -10.699672698974609375), Vec3fEq(88.69537353515625, -145.4852142333984375, -10.699672698974609375),
osg::Vec3f(113.51757049560546875, -159.146697998046875, -8.21576786041259765625), Vec3fEq(113.51757049560546875, -159.146697998046875, -8.21576786041259765625),
osg::Vec3f(138.3397674560546875, -172.808197021484375, -5.731859683990478515625), Vec3fEq(138.3397674560546875, -172.808197021484375, -5.731859683990478515625),
osg::Vec3f(163.1619720458984375, -186.469696044921875, -3.2479507923126220703125), Vec3fEq(163.1619720458984375, -186.469696044921875, -3.2479507923126220703125),
osg::Vec3f(187.984161376953125, -200.1311798095703125, -0.764044821262359619140625), Vec3fEq(187.984161376953125, -200.1311798095703125, -0.764044821262359619140625),
osg::Vec3f(212.8063507080078125, -213.7926788330078125, 1.719865322113037109375), Vec3fEq(212.8063507080078125, -213.7926788330078125, 1.719865322113037109375),
osg::Vec3f(215, -215, 1.9393787384033203125), Vec3fEq(215, -215, 1.9393787384033203125)
})) << mPath; ));
} }
TEST_F(DetourNavigatorNavigatorTest, path_should_be_over_water_ground_lower_than_water_with_only_swim_flag) TEST_F(DetourNavigatorNavigatorTest, path_should_be_over_water_ground_lower_than_water_with_only_swim_flag)
@ -590,26 +596,26 @@ namespace
EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success); EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success);
EXPECT_EQ(mPath, std::deque<osg::Vec3f>({ EXPECT_THAT(mPath, ElementsAre(
osg::Vec3f(0, 215, -94.75363922119140625), Vec3fEq(0, 215, -94.75363922119140625),
osg::Vec3f(9.8083515167236328125, 188.4185333251953125, -105.199951171875), Vec3fEq(9.8083515167236328125, 188.4185333251953125, -105.199951171875),
osg::Vec3f(19.6167049407958984375, 161.837066650390625, -114.25495147705078125), Vec3fEq(19.6167049407958984375, 161.837066650390625, -114.25495147705078125),
osg::Vec3f(29.42505645751953125, 135.255615234375, -123.309967041015625), Vec3fEq(29.42505645751953125, 135.255615234375, -123.309967041015625),
osg::Vec3f(39.23340606689453125, 108.674163818359375, -132.3649749755859375), Vec3fEq(39.23340606689453125, 108.674163818359375, -132.3649749755859375),
osg::Vec3f(49.04175567626953125, 82.09270477294921875, -137.2874755859375), Vec3fEq(49.04175567626953125, 82.09270477294921875, -137.2874755859375),
osg::Vec3f(58.8501129150390625, 55.5112457275390625, -139.2451171875), Vec3fEq(58.8501129150390625, 55.5112457275390625, -139.2451171875),
osg::Vec3f(68.6584625244140625, 28.9297885894775390625, -141.2027740478515625), Vec3fEq(68.6584625244140625, 28.9297885894775390625, -141.2027740478515625),
osg::Vec3f(78.4668121337890625, 2.3483295440673828125, -143.1604156494140625), Vec3fEq(78.4668121337890625, 2.3483295440673828125, -143.1604156494140625),
osg::Vec3f(88.27516937255859375, -24.233127593994140625, -141.3894805908203125), Vec3fEq(88.27516937255859375, -24.233127593994140625, -141.3894805908203125),
osg::Vec3f(83.73651885986328125, -52.2005767822265625, -142.3761444091796875), Vec3fEq(83.73651885986328125, -52.2005767822265625, -142.3761444091796875),
osg::Vec3f(79.19786834716796875, -80.16802978515625, -143.114837646484375), Vec3fEq(79.19786834716796875, -80.16802978515625, -143.114837646484375),
osg::Vec3f(64.8477935791015625, -104.598602294921875, -137.840911865234375), Vec3fEq(64.8477935791015625, -104.598602294921875, -137.840911865234375),
osg::Vec3f(50.497714996337890625, -129.0291748046875, -131.45831298828125), Vec3fEq(50.497714996337890625, -129.0291748046875, -131.45831298828125),
osg::Vec3f(36.147632598876953125, -153.459747314453125, -121.42321014404296875), Vec3fEq(36.147632598876953125, -153.459747314453125, -121.42321014404296875),
osg::Vec3f(21.7975559234619140625, -177.8903350830078125, -111.38811492919921875), Vec3fEq(21.7975559234619140625, -177.8903350830078125, -111.38811492919921875),
osg::Vec3f(7.44747829437255859375, -202.3209075927734375, -101.19382476806640625), Vec3fEq(7.44747829437255859375, -202.3209075927734375, -101.19382476806640625),
osg::Vec3f(0, -215, -94.75363922119140625), Vec3fEq(0, -215, -94.75363922119140625)
})) << mPath; ));
} }
TEST_F(DetourNavigatorNavigatorTest, update_remove_and_update_then_find_path_should_return_path) TEST_F(DetourNavigatorNavigatorTest, update_remove_and_update_then_find_path_should_return_path)
@ -639,31 +645,31 @@ namespace
EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success); EXPECT_EQ(mNavigator->findPath(mAgentHalfExtents, mStepSize, mStart, mEnd, Flag_walk, mOut), Status::Success);
EXPECT_EQ(mPath, std::deque<osg::Vec3f>({ EXPECT_THAT(mPath, ElementsAre(
osg::Vec3f(-215, 215, 1.85963428020477294921875), Vec3fEq(-215, 215, 1.85963428020477294921875),
osg::Vec3f(-194.9653167724609375, 194.9653167724609375, -6.57602214813232421875), Vec3fEq(-194.9653167724609375, 194.9653167724609375, -6.57602214813232421875),
osg::Vec3f(-174.930633544921875, 174.930633544921875, -15.01167774200439453125), Vec3fEq(-174.930633544921875, 174.930633544921875, -15.01167774200439453125),
osg::Vec3f(-154.8959503173828125, 154.8959503173828125, -23.4473361968994140625), Vec3fEq(-154.8959503173828125, 154.8959503173828125, -23.4473361968994140625),
osg::Vec3f(-134.86126708984375, 134.86126708984375, -31.8829936981201171875), Vec3fEq(-134.86126708984375, 134.86126708984375, -31.8829936981201171875),
osg::Vec3f(-114.82657623291015625, 114.82657623291015625, -40.3186492919921875), Vec3fEq(-114.82657623291015625, 114.82657623291015625, -40.3186492919921875),
osg::Vec3f(-94.7918853759765625, 94.7918853759765625, -47.3990631103515625), Vec3fEq(-94.7918853759765625, 94.7918853759765625, -47.3990631103515625),
osg::Vec3f(-74.75719451904296875, 74.75719451904296875, -53.7258148193359375), Vec3fEq(-74.75719451904296875, 74.75719451904296875, -53.7258148193359375),
osg::Vec3f(-54.722499847412109375, 54.722499847412109375, -60.052555084228515625), Vec3fEq(-54.722499847412109375, 54.722499847412109375, -60.052555084228515625),
osg::Vec3f(-34.68780517578125, 34.68780517578125, -66.37931060791015625), Vec3fEq(-34.68780517578125, 34.68780517578125, -66.37931060791015625),
osg::Vec3f(-14.6531162261962890625, 14.6531162261962890625, -72.70604705810546875), Vec3fEq(-14.6531162261962890625, 14.6531162261962890625, -72.70604705810546875),
osg::Vec3f(5.3815765380859375, -5.3815765380859375, -75.35065460205078125), Vec3fEq(5.3815765380859375, -5.3815765380859375, -75.35065460205078125),
osg::Vec3f(25.41626739501953125, -25.41626739501953125, -67.9694671630859375), Vec3fEq(25.41626739501953125, -25.41626739501953125, -67.9694671630859375),
osg::Vec3f(45.450958251953125, -45.450958251953125, -60.5882568359375), Vec3fEq(45.450958251953125, -45.450958251953125, -60.5882568359375),
osg::Vec3f(65.48564910888671875, -65.48564910888671875, -53.20705413818359375), Vec3fEq(65.48564910888671875, -65.48564910888671875, -53.20705413818359375),
osg::Vec3f(85.5203399658203125, -85.5203399658203125, -45.8258514404296875), Vec3fEq(85.5203399658203125, -85.5203399658203125, -45.8258514404296875),
osg::Vec3f(105.55503082275390625, -105.55503082275390625, -38.44464874267578125), Vec3fEq(105.55503082275390625, -105.55503082275390625, -38.44464874267578125),
osg::Vec3f(125.5897216796875, -125.5897216796875, -31.063449859619140625), Vec3fEq(125.5897216796875, -125.5897216796875, -31.063449859619140625),
osg::Vec3f(145.6244049072265625, -145.6244049072265625, -23.6822509765625), Vec3fEq(145.6244049072265625, -145.6244049072265625, -23.6822509765625),
osg::Vec3f(165.659088134765625, -165.659088134765625, -16.3010501861572265625), Vec3fEq(165.659088134765625, -165.659088134765625, -16.3010501861572265625),
osg::Vec3f(185.6937713623046875, -185.6937713623046875, -8.91985416412353515625), Vec3fEq(185.6937713623046875, -185.6937713623046875, -8.91985416412353515625),
osg::Vec3f(205.7284698486328125, -205.7284698486328125, -1.5386505126953125), Vec3fEq(205.7284698486328125, -205.7284698486328125, -1.5386505126953125),
osg::Vec3f(215, -215, 1.87718021869659423828125), Vec3fEq(215, -215, 1.87718021869659423828125)
})) << mPath; ));
} }
TEST_F(DetourNavigatorNavigatorTest, update_then_find_random_point_around_circle_should_return_position) TEST_F(DetourNavigatorNavigatorTest, update_then_find_random_point_around_circle_should_return_position)
@ -687,10 +693,10 @@ namespace
const auto result = mNavigator->findRandomPointAroundCircle(mAgentHalfExtents, mStart, 100.0, Flag_walk); const auto result = mNavigator->findRandomPointAroundCircle(mAgentHalfExtents, mStart, 100.0, Flag_walk);
ASSERT_EQ(result, boost::optional<osg::Vec3f>(osg::Vec3f(-209.95985412597656, 129.89768981933594, -0.26253718137741089))); ASSERT_THAT(result, Optional(Vec3fEq(-209.95985412597656, 129.89768981933594, -0.26253718137741089)));
const auto distance = (*result - mStart).length(); const auto distance = (*result - mStart).length();
EXPECT_EQ(distance, 85.260780334472656) << distance; EXPECT_FLOAT_EQ(distance, 85.260780334472656);
} }
} }

View file

@ -12,6 +12,7 @@
#include <BulletCollision/CollisionShapes/btCompoundShape.h> #include <BulletCollision/CollisionShapes/btCompoundShape.h>
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <gmock/gmock.h>
namespace DetourNavigator namespace DetourNavigator
{ {
@ -312,11 +313,11 @@ namespace
AreaType_ground AreaType_ground
); );
const auto recastMesh = builder.create(mGeneration, mRevision); const auto recastMesh = builder.create(mGeneration, mRevision);
EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ EXPECT_THAT(recastMesh->getVertices(), Pointwise(FloatNear(1e-5), std::vector<float>({
0, -0.70710659027099609375, -3.535533905029296875, 0, -0.70710659027099609375, -3.535533905029296875,
0, 0.707107067108154296875, -3.535533905029296875, 0, 0.707107067108154296875, -3.535533905029296875,
0, 2.384185791015625e-07, -4.24264049530029296875, 0, 2.384185791015625e-07, -4.24264049530029296875,
})); })));
EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2})); EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2}));
EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground})); EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground}));
} }
@ -337,11 +338,11 @@ namespace
AreaType_ground AreaType_ground
); );
const auto recastMesh = builder.create(mGeneration, mRevision); const auto recastMesh = builder.create(mGeneration, mRevision);
EXPECT_EQ(recastMesh->getVertices(), std::vector<float>({ EXPECT_THAT(recastMesh->getVertices(), Pointwise(FloatNear(1e-5), std::vector<float>({
-3.535533905029296875, -0.70710659027099609375, 0, -3.535533905029296875, -0.70710659027099609375, 0,
-3.535533905029296875, 0.707107067108154296875, 0, -3.535533905029296875, 0.707107067108154296875, 0,
-4.24264049530029296875, 2.384185791015625e-07, 0, -4.24264049530029296875, 2.384185791015625e-07, 0,
})); })));
EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2})); EXPECT_EQ(recastMesh->getIndices(), std::vector<int>({0, 1, 2}));
EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground})); EXPECT_EQ(recastMesh->getAreaTypes(), std::vector<AreaType>({AreaType_ground}));
} }

View file

@ -61,15 +61,15 @@ namespace
{ {
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
EXPECT_TRUE(manager.addObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground)); EXPECT_TRUE(manager.addObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground));
} }
TEST_F(DetourNavigatorTileCachedRecastMeshManagerTest, add_object_for_existing_object_should_return_false) TEST_F(DetourNavigatorTileCachedRecastMeshManagerTest, add_object_for_existing_object_should_return_false)
{ {
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
manager.addObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
EXPECT_FALSE(manager.addObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground)); EXPECT_FALSE(manager.addObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground));
} }
TEST_F(DetourNavigatorTileCachedRecastMeshManagerTest, update_object_for_changed_object_should_return_changed_tiles) TEST_F(DetourNavigatorTileCachedRecastMeshManagerTest, update_object_for_changed_object_should_return_changed_tiles)
@ -77,9 +77,9 @@ namespace
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
const btTransform transform(btMatrix3x3::getIdentity(), btVector3(getTileSize(mSettings) / mSettings.mRecastScaleFactor, 0, 0)); const btTransform transform(btMatrix3x3::getIdentity(), btVector3(getTileSize(mSettings) / mSettings.mRecastScaleFactor, 0, 0));
manager.addObject(ObjectId(1ul), boxShape, transform, AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, transform, AreaType::AreaType_ground);
EXPECT_THAT( EXPECT_THAT(
manager.updateObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground), manager.updateObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground),
ElementsAre(TilePosition(-1, -1), TilePosition(-1, 0), TilePosition(0, -1), TilePosition(0, 0), ElementsAre(TilePosition(-1, -1), TilePosition(-1, 0), TilePosition(0, -1), TilePosition(0, 0),
TilePosition(1, -1), TilePosition(1, 0)) TilePosition(1, -1), TilePosition(1, 0))
); );
@ -89,9 +89,9 @@ namespace
{ {
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
manager.addObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
EXPECT_EQ( EXPECT_EQ(
manager.updateObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground), manager.updateObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground),
std::vector<TilePosition>() std::vector<TilePosition>()
); );
} }
@ -100,7 +100,7 @@ namespace
{ {
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
manager.addObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
EXPECT_NE(manager.getMesh(TilePosition(-1, -1)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(-1, -1)), nullptr);
EXPECT_NE(manager.getMesh(TilePosition(-1, 0)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(-1, 0)), nullptr);
EXPECT_NE(manager.getMesh(TilePosition(0, -1)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(0, -1)), nullptr);
@ -111,7 +111,7 @@ namespace
{ {
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
manager.addObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
EXPECT_EQ(manager.getMesh(TilePosition(1, 0)), nullptr); EXPECT_EQ(manager.getMesh(TilePosition(1, 0)), nullptr);
} }
@ -121,13 +121,13 @@ namespace
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
const btTransform transform(btMatrix3x3::getIdentity(), btVector3(getTileSize(mSettings) / mSettings.mRecastScaleFactor, 0, 0)); const btTransform transform(btMatrix3x3::getIdentity(), btVector3(getTileSize(mSettings) / mSettings.mRecastScaleFactor, 0, 0));
manager.addObject(ObjectId(1ul), boxShape, transform, AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, transform, AreaType::AreaType_ground);
EXPECT_NE(manager.getMesh(TilePosition(0, -1)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(0, -1)), nullptr);
EXPECT_NE(manager.getMesh(TilePosition(0, 0)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(0, 0)), nullptr);
EXPECT_NE(manager.getMesh(TilePosition(1, 0)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(1, 0)), nullptr);
EXPECT_NE(manager.getMesh(TilePosition(1, -1)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(1, -1)), nullptr);
manager.updateObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.updateObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
EXPECT_NE(manager.getMesh(TilePosition(-1, -1)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(-1, -1)), nullptr);
EXPECT_NE(manager.getMesh(TilePosition(-1, 0)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(-1, 0)), nullptr);
EXPECT_NE(manager.getMesh(TilePosition(0, -1)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(0, -1)), nullptr);
@ -140,11 +140,11 @@ namespace
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
const btTransform transform(btMatrix3x3::getIdentity(), btVector3(getTileSize(mSettings) / mSettings.mRecastScaleFactor, 0, 0)); const btTransform transform(btMatrix3x3::getIdentity(), btVector3(getTileSize(mSettings) / mSettings.mRecastScaleFactor, 0, 0));
manager.addObject(ObjectId(1ul), boxShape, transform, AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, transform, AreaType::AreaType_ground);
EXPECT_EQ(manager.getMesh(TilePosition(-1, -1)), nullptr); EXPECT_EQ(manager.getMesh(TilePosition(-1, -1)), nullptr);
EXPECT_EQ(manager.getMesh(TilePosition(-1, 0)), nullptr); EXPECT_EQ(manager.getMesh(TilePosition(-1, 0)), nullptr);
manager.updateObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.updateObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
EXPECT_EQ(manager.getMesh(TilePosition(1, 0)), nullptr); EXPECT_EQ(manager.getMesh(TilePosition(1, 0)), nullptr);
EXPECT_EQ(manager.getMesh(TilePosition(1, -1)), nullptr); EXPECT_EQ(manager.getMesh(TilePosition(1, -1)), nullptr);
} }
@ -153,8 +153,8 @@ namespace
{ {
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
manager.addObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
manager.removeObject(ObjectId(1ul)); manager.removeObject(ObjectId(&boxShape));
EXPECT_EQ(manager.getMesh(TilePosition(-1, -1)), nullptr); EXPECT_EQ(manager.getMesh(TilePosition(-1, -1)), nullptr);
EXPECT_EQ(manager.getMesh(TilePosition(-1, 0)), nullptr); EXPECT_EQ(manager.getMesh(TilePosition(-1, 0)), nullptr);
EXPECT_EQ(manager.getMesh(TilePosition(0, -1)), nullptr); EXPECT_EQ(manager.getMesh(TilePosition(0, -1)), nullptr);
@ -166,13 +166,13 @@ namespace
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
manager.addObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
EXPECT_NE(manager.getMesh(TilePosition(-1, -1)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(-1, -1)), nullptr);
EXPECT_NE(manager.getMesh(TilePosition(-1, 0)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(-1, 0)), nullptr);
EXPECT_NE(manager.getMesh(TilePosition(0, -1)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(0, -1)), nullptr);
EXPECT_NE(manager.getMesh(TilePosition(0, 0)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(0, 0)), nullptr);
manager.updateObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.updateObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
EXPECT_NE(manager.getMesh(TilePosition(-1, -1)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(-1, -1)), nullptr);
EXPECT_NE(manager.getMesh(TilePosition(-1, 0)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(-1, 0)), nullptr);
EXPECT_NE(manager.getMesh(TilePosition(0, -1)), nullptr); EXPECT_NE(manager.getMesh(TilePosition(0, -1)), nullptr);
@ -184,7 +184,7 @@ namespace
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const auto initialRevision = manager.getRevision(); const auto initialRevision = manager.getRevision();
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
manager.addObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
EXPECT_EQ(manager.getRevision(), initialRevision + 1); EXPECT_EQ(manager.getRevision(), initialRevision + 1);
} }
@ -192,9 +192,9 @@ namespace
{ {
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
manager.addObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
const auto beforeAddRevision = manager.getRevision(); const auto beforeAddRevision = manager.getRevision();
manager.addObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
EXPECT_EQ(manager.getRevision(), beforeAddRevision); EXPECT_EQ(manager.getRevision(), beforeAddRevision);
} }
@ -203,9 +203,9 @@ namespace
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
const btTransform transform(btMatrix3x3::getIdentity(), btVector3(getTileSize(mSettings) / mSettings.mRecastScaleFactor, 0, 0)); const btTransform transform(btMatrix3x3::getIdentity(), btVector3(getTileSize(mSettings) / mSettings.mRecastScaleFactor, 0, 0));
manager.addObject(ObjectId(1ul), boxShape, transform, AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, transform, AreaType::AreaType_ground);
const auto beforeUpdateRevision = manager.getRevision(); const auto beforeUpdateRevision = manager.getRevision();
manager.updateObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.updateObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
EXPECT_EQ(manager.getRevision(), beforeUpdateRevision + 1); EXPECT_EQ(manager.getRevision(), beforeUpdateRevision + 1);
} }
@ -213,9 +213,9 @@ namespace
{ {
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
manager.addObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
const auto beforeUpdateRevision = manager.getRevision(); const auto beforeUpdateRevision = manager.getRevision();
manager.updateObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.updateObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
EXPECT_EQ(manager.getRevision(), beforeUpdateRevision); EXPECT_EQ(manager.getRevision(), beforeUpdateRevision);
} }
@ -223,9 +223,9 @@ namespace
{ {
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const btBoxShape boxShape(btVector3(20, 20, 100)); const btBoxShape boxShape(btVector3(20, 20, 100));
manager.addObject(ObjectId(1ul), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground); manager.addObject(ObjectId(&boxShape), boxShape, btTransform::getIdentity(), AreaType::AreaType_ground);
const auto beforeRemoveRevision = manager.getRevision(); const auto beforeRemoveRevision = manager.getRevision();
manager.removeObject(ObjectId(1ul)); manager.removeObject(ObjectId(&boxShape));
EXPECT_EQ(manager.getRevision(), beforeRemoveRevision + 1); EXPECT_EQ(manager.getRevision(), beforeRemoveRevision + 1);
} }
@ -233,7 +233,7 @@ namespace
{ {
TileCachedRecastMeshManager manager(mSettings); TileCachedRecastMeshManager manager(mSettings);
const auto beforeRemoveRevision = manager.getRevision(); const auto beforeRemoveRevision = manager.getRevision();
manager.removeObject(ObjectId(1ul)); manager.removeObject(ObjectId(&manager));
EXPECT_EQ(manager.getRevision(), beforeRemoveRevision); EXPECT_EQ(manager.getRevision(), beforeRemoveRevision);
} }
} }

View file

@ -44,7 +44,7 @@ void Wizard::ConclusionPage::initializePage()
} else { } else {
textLabel->setText(tr("<html><head/><body><p>The OpenMW Wizard failed to install Morrowind on your computer.</p> \ textLabel->setText(tr("<html><head/><body><p>The OpenMW Wizard failed to install Morrowind on your computer.</p> \
<p>Please report any bugs you might have encountered to our \ <p>Please report any bugs you might have encountered to our \
<a href=\"https://bugs.openmw.org\">bug tracker</a>.<br/>Make sure to include the installation log.</p><br/></body></html>")); <a href=\"https://gitlab.com/OpenMW/openmw/issues\">bug tracker</a>.<br/>Make sure to include the installation log.</p><br/></body></html>"));
} }
} }

View file

@ -52,7 +52,7 @@ add_component_dir (shader
add_component_dir (sceneutil add_component_dir (sceneutil
clone attach visitor util statesetupdater controller skeleton riggeometry morphgeometry lightcontroller clone attach visitor util statesetupdater controller skeleton riggeometry morphgeometry lightcontroller
lightmanager lightutil positionattitudetransform workqueue unrefqueue pathgridutil waterutil writescene serialize optimizer lightmanager lightutil positionattitudetransform workqueue unrefqueue pathgridutil waterutil writescene serialize optimizer
actorutil detourdebugdraw navmesh agentpath shadow mwshadowtechnique vismask recastmesh actorutil detourdebugdraw navmesh agentpath shadow mwshadowtechnique recastmesh
) )
add_component_dir (nif add_component_dir (nif
@ -274,6 +274,10 @@ if (USE_QT)
processinvoker processinvoker
) )
add_component_dir (misc
helpviewer
)
if (DESIRED_QT_VERSION MATCHES 4) if (DESIRED_QT_VERSION MATCHES 4)
include(${QT_USE_FILE}) include(${QT_USE_FILE})
QT4_WRAP_UI(ESM_UI_HDR ${ESM_UI}) QT4_WRAP_UI(ESM_UI_HDR ${ESM_UI})

View file

@ -412,7 +412,7 @@ static void crash_handler(const char *logfile)
if(logfile) if(logfile)
{ {
std::string message = "OpenMW has encountered a fatal error.\nCrash log saved to '" + std::string(logfile) + "'.\n Please report this to https://bugs.openmw.org !"; std::string message = "OpenMW has encountered a fatal error.\nCrash log saved to '" + std::string(logfile) + "'.\n Please report this to https://gitlab.com/OpenMW/openmw/issues !";
SDL_ShowSimpleMessageBox(0, "Fatal Error", message.c_str(), nullptr); SDL_ShowSimpleMessageBox(0, "Fatal Error", message.c_str(), nullptr);
} }

View file

@ -10,7 +10,7 @@ namespace DetourNavigator
{ {
public: public:
template <class T> template <class T>
explicit ObjectId(const T value) throw() explicit ObjectId(T* value) throw()
: mValue(reinterpret_cast<std::size_t>(value)) : mValue(reinterpret_cast<std::size_t>(value))
{ {
} }

View file

@ -130,7 +130,10 @@ void ESM::CellRef::loadData(ESMReader &esm, bool &isDeleted)
} }
if (mLockLevel == 0 && !mKey.empty()) if (mLockLevel == 0 && !mKey.empty())
{
mLockLevel = UnbreakableLock; mLockLevel = UnbreakableLock;
mTrap.clear();
}
} }
void ESM::CellRef::save (ESMWriter &esm, bool wideRefNum, bool inInventory, bool isDeleted) const void ESM::CellRef::save (ESMWriter &esm, bool wideRefNum, bool inInventory, bool isDeleted) const

View file

@ -3,6 +3,7 @@
#include <string> #include <string>
#include <cstring> #include <cstring>
#include <vector>
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
@ -126,6 +127,7 @@ struct ESM_Context
// actually contribute to a specific cell. Therefore, we need to store the index // actually contribute to a specific cell. Therefore, we need to store the index
// of the file belonging to this contest. See CellStore::(list/load)refs for details. // of the file belonging to this contest. See CellStore::(list/load)refs for details.
int index; int index;
std::vector<int> parentFileIndices;
// True if subName has been read but not used. // True if subName has been read but not used.
bool subCached; bool subCached;

View file

@ -20,8 +20,7 @@ ESM_Context ESMReader::getContext()
} }
ESMReader::ESMReader() ESMReader::ESMReader()
: mIdx(0) : mRecordFlags(0)
, mRecordFlags(0)
, mBuffer(50*1024) , mBuffer(50*1024)
, mGlobalReaderList(nullptr) , mGlobalReaderList(nullptr)
, mEncoder(nullptr) , mEncoder(nullptr)

View file

@ -79,13 +79,15 @@ public:
// terrain palette, but ESMReader does not pass a reference to the correct plugin // terrain palette, but ESMReader does not pass a reference to the correct plugin
// to the individual load() methods. This hack allows to pass this reference // to the individual load() methods. This hack allows to pass this reference
// indirectly to the load() method. // indirectly to the load() method.
int mIdx; void setIndex(const int index) { mCtx.index = index;}
void setIndex(const int index) {mIdx = index; mCtx.index = index;} int getIndex() {return mCtx.index;}
int getIndex() {return mIdx;}
void setGlobalReaderList(std::vector<ESMReader> *list) {mGlobalReaderList = list;} void setGlobalReaderList(std::vector<ESMReader> *list) {mGlobalReaderList = list;}
std::vector<ESMReader> *getGlobalReaderList() {return mGlobalReaderList;} std::vector<ESMReader> *getGlobalReaderList() {return mGlobalReaderList;}
void addParentFileIndex(int index) { mCtx.parentFileIndices.push_back(index); }
const std::vector<int>& getParentFileIndices() const { return mCtx.parentFileIndices; }
/************************************************************************* /*************************************************************************
* *
* Medium-level reading shortcuts * Medium-level reading shortcuts

View file

@ -21,12 +21,12 @@ namespace
// If we have an index value that does not make sense, assume that it was an addition // If we have an index value that does not make sense, assume that it was an addition
// by the present plugin (but a faulty one) // by the present plugin (but a faulty one)
if (local && local <= reader.getGameFiles().size()) if (local && local <= reader.getParentFileIndices().size())
{ {
// If the most significant 8 bits are used, then this reference already exists. // If the most significant 8 bits are used, then this reference already exists.
// In this case, do not spawn a new reference, but overwrite the old one. // In this case, do not spawn a new reference, but overwrite the old one.
refNum.mIndex &= 0x00ffffff; // delete old plugin ID refNum.mIndex &= 0x00ffffff; // delete old plugin ID
refNum.mContentFile = reader.getGameFiles()[local-1].index; refNum.mContentFile = reader.getParentFileIndices()[local-1];
} }
else else
{ {

View file

@ -0,0 +1,12 @@
#include "helpviewer.hpp"
#include <QString>
#include <QDesktopServices>
#include <QUrl>
void Misc::HelpViewer::openHelp(const char* url)
{
QString link {OPENMW_DOC_BASEURL};
link.append(url);
QDesktopServices::openUrl(QUrl(link));
}

View file

@ -0,0 +1,7 @@
#pragma once
namespace Misc {
namespace HelpViewer {
void openHelp(const char* url);
}
}

View file

@ -10,7 +10,6 @@
#include <components/nif/data.hpp> #include <components/nif/data.hpp>
#include <components/sceneutil/morphgeometry.hpp> #include <components/sceneutil/morphgeometry.hpp>
#include <components/sceneutil/vismask.hpp>
#include "userdata.hpp" #include "userdata.hpp"
@ -270,12 +269,14 @@ void UVController::apply(osg::StateSet* stateset, osg::NodeVisitor* nv)
} }
} }
VisController::VisController(const Nif::NiVisData *data) VisController::VisController(const Nif::NiVisData *data, unsigned int mask)
: mData(data->mVis) : mData(data->mVis)
, mMask(mask)
{ {
} }
VisController::VisController() VisController::VisController()
: mMask(0)
{ {
} }
@ -283,6 +284,7 @@ VisController::VisController(const VisController &copy, const osg::CopyOp &copyo
: osg::NodeCallback(copy, copyop) : osg::NodeCallback(copy, copyop)
, Controller(copy) , Controller(copy)
, mData(copy.mData) , mData(copy.mData)
, mMask(copy.mMask)
{ {
} }
@ -304,8 +306,7 @@ void VisController::operator() (osg::Node* node, osg::NodeVisitor* nv)
if (hasInput()) if (hasInput())
{ {
bool vis = calculate(getInputValue(nv)); bool vis = calculate(getInputValue(nv));
// Leave 0x1 enabled for UpdateVisitor, so we can make ourselves visible again in the future from this update callback node->setNodeMask(vis ? ~0 : mMask);
node->setNodeMask(vis ? SceneUtil::Mask_Default : SceneUtil::Mask_UpdateVisitor);
} }
traverse(node, nv); traverse(node, nv);
} }

View file

@ -234,11 +234,12 @@ namespace NifOsg
{ {
private: private:
std::vector<Nif::NiVisData::VisData> mData; std::vector<Nif::NiVisData::VisData> mData;
unsigned int mMask;
bool calculate(float time) const; bool calculate(float time) const;
public: public:
VisController(const Nif::NiVisData *data); VisController(const Nif::NiVisData *data, unsigned int mask);
VisController(); VisController();
VisController(const VisController& copy, const osg::CopyOp& copyop); VisController(const VisController& copy, const osg::CopyOp& copyop);

View file

@ -16,7 +16,6 @@
#include <components/misc/resourcehelpers.hpp> #include <components/misc/resourcehelpers.hpp>
#include <components/resource/imagemanager.hpp> #include <components/resource/imagemanager.hpp>
#include <components/sceneutil/util.hpp> #include <components/sceneutil/util.hpp>
#include <components/sceneutil/vismask.hpp>
// particle // particle
#include <osgParticle/ParticleSystem> #include <osgParticle/ParticleSystem>
@ -178,7 +177,7 @@ namespace NifOsg
void setEnabled(bool enabled) void setEnabled(bool enabled)
{ {
setNodeMask(enabled ? SceneUtil::Mask_Default : SceneUtil::Mask_Effect); setNodeMask(enabled ? ~0 : 0);
} }
}; };
@ -194,6 +193,17 @@ namespace NifOsg
return sShowMarkers; return sShowMarkers;
} }
unsigned int Loader::sHiddenNodeMask = 0;
void Loader::setHiddenNodeMask(unsigned int mask)
{
sHiddenNodeMask = mask;
}
unsigned int Loader::getHiddenNodeMask()
{
return sHiddenNodeMask;
}
class LoaderImpl class LoaderImpl
{ {
public: public:
@ -572,8 +582,7 @@ namespace NifOsg
if (nifNode->recType == Nif::RC_RootCollisionNode) if (nifNode->recType == Nif::RC_RootCollisionNode)
{ {
skipMeshes = true; skipMeshes = true;
// Leave mask for UpdateVisitor enabled node->setNodeMask(Loader::getHiddenNodeMask());
node->setNodeMask(SceneUtil::Mask_UpdateVisitor);
} }
// We can skip creating meshes for hidden nodes if they don't have a VisController that // We can skip creating meshes for hidden nodes if they don't have a VisController that
@ -587,8 +596,7 @@ namespace NifOsg
if (!hasVisController) if (!hasVisController)
skipMeshes = true; // skip child meshes, but still create the child node hierarchy for animating collision shapes skipMeshes = true; // skip child meshes, but still create the child node hierarchy for animating collision shapes
// now hide this node, but leave the mask for UpdateVisitor enabled so that KeyframeController works node->setNodeMask(Loader::getHiddenNodeMask());
node->setNodeMask(SceneUtil::Mask_UpdateVisitor);
} }
if ((skipMeshes || hasMarkers) && isAnimated) // make sure the empty node is not optimized away so the physicssystem can find it. if ((skipMeshes || hasMarkers) && isAnimated) // make sure the empty node is not optimized away so the physicssystem can find it.
@ -754,7 +762,7 @@ namespace NifOsg
{ {
if (visctrl->data.empty()) if (visctrl->data.empty())
return; return;
osg::ref_ptr<VisController> callback(new VisController(visctrl->data.getPtr())); osg::ref_ptr<VisController> callback(new VisController(visctrl->data.getPtr(), Loader::getHiddenNodeMask()));
setupController(visctrl, callback, animflags); setupController(visctrl, callback, animflags);
node->addUpdateCallback(callback); node->addUpdateCallback(callback);
} }
@ -1078,6 +1086,8 @@ namespace NifOsg
trans->addChild(toAttach); trans->addChild(toAttach);
parentNode->addChild(trans); parentNode->addChild(trans);
} }
// create partsys stateset in order to pass in ShaderVisitor like all other Drawables
partsys->getOrCreateStateSet();
} }
void triCommonToGeometry(osg::Geometry *geometry, const std::vector<osg::Vec3f>& vertices, const std::vector<osg::Vec3f>& normals, const std::vector<std::vector<osg::Vec2f>>& uvlist, const std::vector<osg::Vec4f>& colors, const std::vector<unsigned int>& boundTextures, const std::string& name) void triCommonToGeometry(osg::Geometry *geometry, const std::vector<osg::Vec3f>& vertices, const std::vector<osg::Vec3f>& normals, const std::vector<std::vector<osg::Vec2f>>& uvlist, const std::vector<osg::Vec4f>& colors, const std::vector<unsigned int>& boundTextures, const std::string& name)
@ -1705,7 +1715,8 @@ namespace NifOsg
{ {
osg::StateSet* stateset = node->getOrCreateStateSet(); osg::StateSet* stateset = node->getOrCreateStateSet();
int specFlags = 0; // Specular is disabled by default, even if there's a specular color in the NiMaterialProperty // Specular lighting is enabled by default, but there's a quirk...
int specFlags = 1;
osg::ref_ptr<osg::Material> mat (new osg::Material); osg::ref_ptr<osg::Material> mat (new osg::Material);
mat->setColorMode(hasVertexColors ? osg::Material::AMBIENT_AND_DIFFUSE : osg::Material::OFF); mat->setColorMode(hasVertexColors ? osg::Material::AMBIENT_AND_DIFFUSE : osg::Material::OFF);
@ -1723,6 +1734,7 @@ namespace NifOsg
{ {
case Nif::RC_NiSpecularProperty: case Nif::RC_NiSpecularProperty:
{ {
// Specular property can turn specular lighting off.
specFlags = property->flags; specFlags = property->flags;
break; break;
} }
@ -1806,17 +1818,10 @@ namespace NifOsg
} }
} }
if (specFlags == 0) // While NetImmerse and Gamebryo support specular lighting, Morrowind has its support disabled.
if (mVersion <= Nif::NIFFile::NIFVersion::VER_MW || specFlags == 0)
mat->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4f(0.f,0.f,0.f,0.f)); mat->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4f(0.f,0.f,0.f,0.f));
// Particles don't have normals, so can't be diffuse lit.
if (particleMaterial)
{
// NB ignoring diffuse.a()
mat->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4f(0,0,0,1));
mat->setColorMode(osg::Material::AMBIENT);
}
if (lightmode == 0) if (lightmode == 0)
{ {
osg::Vec4f diffuse = mat->getDiffuse(osg::Material::FRONT_AND_BACK); osg::Vec4f diffuse = mat->getDiffuse(osg::Material::FRONT_AND_BACK);

View file

@ -74,8 +74,13 @@ namespace NifOsg
static bool getShowMarkers(); static bool getShowMarkers();
private: /// Set the mask to use for hidden nodes. The default is 0, i.e. updates to those nodes can no longer happen.
/// If you need to run animations or physics for hidden nodes, you may want to set this to a non-zero mask and remove exactly that mask from the camera's cull mask.
static void setHiddenNodeMask(unsigned int mask);
static unsigned int getHiddenNodeMask();
private:
static unsigned int sHiddenNodeMask;
static bool sShowMarkers; static bool sShowMarkers;
}; };

View file

@ -2,6 +2,7 @@
#include <limits> #include <limits>
#include <osg/Version>
#include <osg/MatrixTransform> #include <osg/MatrixTransform>
#include <osg/Geometry> #include <osg/Geometry>
@ -19,12 +20,19 @@ ParticleSystem::ParticleSystem()
: osgParticle::ParticleSystem() : osgParticle::ParticleSystem()
, mQuota(std::numeric_limits<int>::max()) , mQuota(std::numeric_limits<int>::max())
{ {
mNormalArray = new osg::Vec3Array(1);
mNormalArray->setBinding(osg::Array::BIND_OVERALL);
(*mNormalArray.get())[0] = osg::Vec3(0.3, 0.3, 0.3);
} }
ParticleSystem::ParticleSystem(const ParticleSystem &copy, const osg::CopyOp &copyop) ParticleSystem::ParticleSystem(const ParticleSystem &copy, const osg::CopyOp &copyop)
: osgParticle::ParticleSystem(copy, copyop) : osgParticle::ParticleSystem(copy, copyop)
, mQuota(copy.mQuota) , mQuota(copy.mQuota)
{ {
mNormalArray = new osg::Vec3Array(1);
mNormalArray->setBinding(osg::Array::BIND_OVERALL);
(*mNormalArray.get())[0] = osg::Vec3(0.3, 0.3, 0.3);
// For some reason the osgParticle constructor doesn't copy the particles // For some reason the osgParticle constructor doesn't copy the particles
for (int i=0;i<copy.numParticles()-copy.numDeadParticles();++i) for (int i=0;i<copy.numParticles()-copy.numDeadParticles();++i)
ParticleSystem::createParticle(copy.getParticle(i)); ParticleSystem::createParticle(copy.getParticle(i));
@ -42,6 +50,25 @@ osgParticle::Particle* ParticleSystem::createParticle(const osgParticle::Particl
return nullptr; return nullptr;
} }
void ParticleSystem::drawImplementation(osg::RenderInfo& renderInfo) const
{
osg::State & state = *renderInfo.getState();
#if OSG_MIN_VERSION_REQUIRED(3, 5, 6)
if(state.useVertexArrayObject(getUseVertexArrayObject()))
{
state.getCurrentVertexArrayState()->assignNormalArrayDispatcher();
state.getCurrentVertexArrayState()->setNormalArray(state, mNormalArray);
}
else
{
state.getAttributeDispatchers().activateNormalArray(mNormalArray);
}
#else
state.Normal(0.3, 0.3, 0.3);
#endif
osgParticle::ParticleSystem::drawImplementation(renderInfo);
}
void InverseWorldMatrix::operator()(osg::Node *node, osg::NodeVisitor *nv) void InverseWorldMatrix::operator()(osg::Node *node, osg::NodeVisitor *nv)
{ {
if (nv && nv->getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR) if (nv && nv->getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR)
@ -159,8 +186,11 @@ void ParticleColorAffector::operate(osgParticle::Particle* particle, double /* d
{ {
float time = static_cast<float>(particle->getAge()/particle->getLifeTime()); float time = static_cast<float>(particle->getAge()/particle->getLifeTime());
osg::Vec4f color = mData.interpKey(time); osg::Vec4f color = mData.interpKey(time);
float alpha = color.a();
color.a() = 1.0f;
particle->setColorRange(osgParticle::rangev4(color, color)); particle->setColorRange(osgParticle::rangev4(color, color));
particle->setAlphaRange(osgParticle::rangef(alpha, alpha));
} }
GravityAffector::GravityAffector(const Nif::NiGravity *gravity) GravityAffector::GravityAffector(const Nif::NiGravity *gravity)

View file

@ -36,8 +36,11 @@ namespace NifOsg
void setQuota(int quota); void setQuota(int quota);
virtual void drawImplementation(osg::RenderInfo& renderInfo) const;
private: private:
int mQuota; int mQuota;
osg::ref_ptr<osg::Vec3Array> mNormalArray;
}; };
// HACK: Particle doesn't allow setting the initial age, but we need this for loading the particle system state // HACK: Particle doesn't allow setting the initial age, but we need this for loading the particle system state

View file

@ -12,7 +12,6 @@
#include <osgViewer/Renderer> #include <osgViewer/Renderer>
#include <components/myguiplatform/myguidatamanager.hpp> #include <components/myguiplatform/myguidatamanager.hpp>
#include <components/sceneutil/vismask.hpp>
namespace Resource namespace Resource
{ {
@ -104,14 +103,14 @@ void StatsHandler::toggle(osgViewer::ViewerBase *viewer)
if (!_statsType) if (!_statsType)
{ {
_camera->setNodeMask(SceneUtil::Mask_Disabled); _camera->setNodeMask(0);
_switch->setAllChildrenOff(); _switch->setAllChildrenOff();
viewer->getViewerStats()->collectStats("resource", false); viewer->getViewerStats()->collectStats("resource", false);
} }
else else
{ {
_camera->setNodeMask(SceneUtil::Mask_Default); _camera->setNodeMask(0xffffffff);
_switch->setSingleChildOn(_resourceStatsChildNum); _switch->setSingleChildOn(_resourceStatsChildNum);
viewer->getViewerStats()->collectStats("resource", true); viewer->getViewerStats()->collectStats("resource", true);

View file

@ -11,7 +11,6 @@
#include "lightcontroller.hpp" #include "lightcontroller.hpp"
#include "util.hpp" #include "util.hpp"
#include "visitor.hpp" #include "visitor.hpp"
#include "vismask.hpp"
#include "positionattitudetransform.hpp" #include "positionattitudetransform.hpp"
namespace SceneUtil namespace SceneUtil
@ -59,7 +58,7 @@ namespace SceneUtil
light->setQuadraticAttenuation(quadraticAttenuation); light->setQuadraticAttenuation(quadraticAttenuation);
} }
void addLight (osg::Group* node, const ESM::Light* esmLight, bool isExterior) void addLight (osg::Group* node, const ESM::Light* esmLight, unsigned int partsysMask, unsigned int lightMask, bool isExterior)
{ {
SceneUtil::FindByNameVisitor visitor("AttachLight"); SceneUtil::FindByNameVisitor visitor("AttachLight");
node->accept(visitor); node->accept(visitor);
@ -72,7 +71,7 @@ namespace SceneUtil
else else
{ {
osg::ComputeBoundsVisitor computeBound; osg::ComputeBoundsVisitor computeBound;
computeBound.setTraversalMask(~SceneUtil::Mask_ParticleSystem); computeBound.setTraversalMask(~partsysMask);
// We want the bounds of all children of the node, ignoring the node's local transformation // We want the bounds of all children of the node, ignoring the node's local transformation
// So do a traverse(), not accept() // So do a traverse(), not accept()
computeBound.traverse(*node); computeBound.traverse(*node);
@ -86,15 +85,15 @@ namespace SceneUtil
attachTo = trans; attachTo = trans;
} }
osg::ref_ptr<LightSource> lightSource = createLightSource(esmLight, isExterior); osg::ref_ptr<LightSource> lightSource = createLightSource(esmLight, lightMask, isExterior);
attachTo->addChild(lightSource); attachTo->addChild(lightSource);
} }
osg::ref_ptr<LightSource> createLightSource(const ESM::Light* esmLight, bool isExterior, const osg::Vec4f& ambient) osg::ref_ptr<LightSource> createLightSource(const ESM::Light* esmLight, unsigned int lightMask, bool isExterior, const osg::Vec4f& ambient)
{ {
osg::ref_ptr<SceneUtil::LightSource> lightSource (new SceneUtil::LightSource); osg::ref_ptr<SceneUtil::LightSource> lightSource (new SceneUtil::LightSource);
osg::ref_ptr<osg::Light> light (new osg::Light); osg::ref_ptr<osg::Light> light (new osg::Light);
lightSource->setNodeMask(SceneUtil::Mask_Lighting); lightSource->setNodeMask(lightMask);
float radius = esmLight->mData.mRadius; float radius = esmLight->mData.mRadius;
lightSource->setRadius(radius); lightSource->setRadius(radius);

View file

@ -32,14 +32,14 @@ namespace SceneUtil
/// @param partsysMask Node mask to ignore when computing the sub graph's bounding box. /// @param partsysMask Node mask to ignore when computing the sub graph's bounding box.
/// @param lightMask Mask to assign to the newly created LightSource. /// @param lightMask Mask to assign to the newly created LightSource.
/// @param isExterior Is the light outside? May be used for deciding which attenuation settings to use. /// @param isExterior Is the light outside? May be used for deciding which attenuation settings to use.
void addLight (osg::Group* node, const ESM::Light* esmLight, bool isExterior); void addLight (osg::Group* node, const ESM::Light* esmLight, unsigned int partsysMask, unsigned int lightMask, bool isExterior);
/// @brief Convert an ESM::Light to a SceneUtil::LightSource, and return it. /// @brief Convert an ESM::Light to a SceneUtil::LightSource, and return it.
/// @param esmLight The light definition coming from the game files containing radius, color, flicker, etc. /// @param esmLight The light definition coming from the game files containing radius, color, flicker, etc.
/// @param lightMask Mask to assign to the newly created LightSource. /// @param lightMask Mask to assign to the newly created LightSource.
/// @param isExterior Is the light outside? May be used for deciding which attenuation settings to use. /// @param isExterior Is the light outside? May be used for deciding which attenuation settings to use.
/// @param ambient Ambient component of the light. /// @param ambient Ambient component of the light.
osg::ref_ptr<LightSource> createLightSource (const ESM::Light* esmLight, bool isExterior, const osg::Vec4f& ambient=osg::Vec4f(0,0,0,1)); osg::ref_ptr<LightSource> createLightSource (const ESM::Light* esmLight, unsigned int lightMask, bool isExterior, const osg::Vec4f& ambient=osg::Vec4f(0,0,0,1));
} }

Some files were not shown because too many files have changed in this diff Show more