mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-24 09:39:51 +00:00
Merge remote-tracking branch 'upstream/master' into osgshadow-test-vdsm
This commit is contained in:
commit
f56a117bde
@ -338,6 +338,7 @@ if (NOT WIN32 AND NOT APPLE)
|
||||
endif()
|
||||
|
||||
# CXX Compiler settings
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wundef -Wno-unused-parameter -std=c++11 -pedantic -Wno-long-long")
|
||||
add_definitions( -DBOOST_NO_CXX11_SCOPED_ENUMS=ON )
|
||||
|
@ -169,18 +169,25 @@ void CSMPrefs::State::declare()
|
||||
"list go to the first/last item");
|
||||
|
||||
declareCategory ("3D Scene Input");
|
||||
|
||||
declareDouble ("navi-wheel-factor", "Camera Zoom Sensitivity", 8).setRange(-100.0, 100.0);
|
||||
declareDouble ("s-navi-sensitivity", "Secondary Camera Movement Sensitivity", 50.0).setRange(-1000.0, 1000.0);
|
||||
declareSeparator();
|
||||
|
||||
declareDouble ("p-navi-free-sensitivity", "Free Camera Sensitivity", 1/650.).setPrecision(5).setRange(0.0, 1.0);
|
||||
declareBool ("p-navi-free-invert", "Invert Free Camera Mouse Input", false);
|
||||
declareDouble ("navi-free-lin-speed", "Free Camera Linear Speed", 1000.0).setRange(1.0, 10000.0);
|
||||
declareDouble ("navi-free-rot-speed", "Free Camera Rotational Speed", 3.14 / 2).setRange(0.001, 6.28);
|
||||
declareDouble ("navi-free-speed-mult", "Free Camera Speed Multiplier (from Modifier)", 8).setRange(0.001, 1000.0);
|
||||
declareSeparator();
|
||||
|
||||
declareDouble ("p-navi-orbit-sensitivity", "Orbit Camera Sensitivity", 1/650.).setPrecision(5).setRange(0.0, 1.0);
|
||||
declareBool ("p-navi-orbit-invert", "Invert Orbit Camera Mouse Input", false);
|
||||
declareDouble ("s-navi-sensitivity", "Secondary Camera Movement Sensitivity", 50.0).setRange(-1000.0, 1000.0);
|
||||
declareDouble ("navi-wheel-factor", "Camera Zoom Sensitivity", 8).setRange(-100.0, 100.0);
|
||||
declareDouble ("navi-free-lin-speed", "Free Camera Linear Speed", 1000.0).setRange(1.0, 10000.0);
|
||||
declareDouble ("navi-free-rot-speed", "Free Camera Rotational Speed", 3.14 / 2).setRange(0.001, 6.28);
|
||||
declareDouble ("navi-free-speed-mult", "Free Camera Speed Multiplier (from Modifier)", 8).setRange(0.001, 1000.0);
|
||||
declareDouble ("navi-orbit-rot-speed", "Orbital Camera Rotational Speed", 3.14 / 4).setRange(0.001, 6.28);
|
||||
declareDouble ("navi-orbit-speed-mult", "Orbital Camera Speed Multiplier (from Modifier)", 4).setRange(0.001, 1000.0);
|
||||
declareBool ("navi-orbit-const-roll", "Keep camera roll constant for orbital camera", true);
|
||||
declareSeparator();
|
||||
|
||||
declareBool ("context-select", "Context Sensitive Selection", false);
|
||||
declareDouble ("drag-factor", "Mouse sensitivity during drag operations", 1.0).
|
||||
setRange (0.001, 100.0);
|
||||
@ -191,6 +198,13 @@ void CSMPrefs::State::declare()
|
||||
setTooltip ("Acceleration factor during drag operations while holding down shift").
|
||||
setRange (0.001, 100.0);
|
||||
declareDouble ("rotate-factor", "Free rotation factor", 0.007).setPrecision(4).setRange(0.0001, 0.1);
|
||||
|
||||
declareCategory ("Rendering");
|
||||
declareInt ("camera-fov", "Camera FOV", 90).setRange(10, 170);
|
||||
declareBool ("camera-ortho", "Orthographic projection for camera", false);
|
||||
declareInt ("camera-ortho-size", "Orthographic projection size parameter", 100).
|
||||
setTooltip("Size of the orthographic frustum, greater value will allow the camera to see more of the world.").
|
||||
setRange(10, 10000);
|
||||
declareDouble ("object-marker-alpha", "Object Marker Transparency", 0.5).setPrecision(2).setRange(0,1);
|
||||
|
||||
declareCategory ("Tooltips");
|
||||
|
@ -84,7 +84,6 @@ CSVPrefs::Dialogue::~Dialogue()
|
||||
void CSVPrefs::Dialogue::closeEvent (QCloseEvent *event)
|
||||
{
|
||||
QMainWindow::closeEvent (event);
|
||||
|
||||
CSMPrefs::State::get().save();
|
||||
}
|
||||
|
||||
|
@ -668,16 +668,25 @@ namespace CSVRender
|
||||
|
||||
mInitialized = true;
|
||||
}
|
||||
|
||||
void OrbitCameraController::setConstRoll(bool enabled)
|
||||
{
|
||||
mConstRoll = enabled;
|
||||
}
|
||||
|
||||
void OrbitCameraController::rotateHorizontal(double value)
|
||||
{
|
||||
osg::Vec3d eye, center, up;
|
||||
getCamera()->getViewMatrixAsLookAt(eye, center, up);
|
||||
osg::Vec3d absoluteUp = osg::Vec3(0,0,1);
|
||||
|
||||
osg::Quat rotation = osg::Quat(value, up);
|
||||
osg::Quat rotation = osg::Quat(value, mConstRoll ? absoluteUp : up);
|
||||
osg::Vec3d oldOffset = eye - mCenter;
|
||||
osg::Vec3d newOffset = rotation * oldOffset;
|
||||
|
||||
if (mConstRoll)
|
||||
up = rotation * up;
|
||||
|
||||
getCamera()->setViewMatrixAsLookAt(mCenter + newOffset, mCenter, up);
|
||||
}
|
||||
|
||||
@ -687,9 +696,14 @@ namespace CSVRender
|
||||
getCamera()->getViewMatrixAsLookAt(eye, center, up);
|
||||
|
||||
osg::Vec3d forward = center - eye;
|
||||
osg::Quat rotation = osg::Quat(value, up ^ forward);
|
||||
osg::Vec3d axis = up ^ forward;
|
||||
|
||||
osg::Quat rotation = osg::Quat(value,axis);
|
||||
osg::Vec3d oldOffset = eye - mCenter;
|
||||
osg::Vec3d newOffset = rotation * oldOffset;
|
||||
|
||||
if (mConstRoll)
|
||||
up = rotation * up;
|
||||
|
||||
getCamera()->setViewMatrixAsLookAt(mCenter + newOffset, mCenter, up);
|
||||
}
|
||||
|
@ -160,6 +160,8 @@ namespace CSVRender
|
||||
/// \brief Flag controller to be re-initialized.
|
||||
void reset();
|
||||
|
||||
void setConstRoll(bool enable);
|
||||
|
||||
private:
|
||||
|
||||
void initialize();
|
||||
@ -181,6 +183,8 @@ namespace CSVRender
|
||||
double mOrbitSpeed;
|
||||
double mOrbitSpeedMult;
|
||||
|
||||
bool mConstRoll;
|
||||
|
||||
private slots:
|
||||
|
||||
void naviPrimary(bool active);
|
||||
|
@ -471,7 +471,7 @@ void CSVRender::Object::setSelected(bool selected)
|
||||
else
|
||||
mRootNode->addChild(mBaseNode);
|
||||
|
||||
mMarkerTransparency = CSMPrefs::get()["3D Scene Input"]["object-marker-alpha"].toDouble();
|
||||
mMarkerTransparency = CSMPrefs::get()["Rendering"]["object-marker-alpha"].toDouble();
|
||||
updateMarker();
|
||||
}
|
||||
|
||||
|
@ -56,6 +56,7 @@ RenderWidget::RenderWidget(QWidget *parent, Qt::WindowFlags f)
|
||||
traits->vsync = false;
|
||||
|
||||
mView = new osgViewer::View;
|
||||
updateCameraParameters( traits->width / static_cast<double>(traits->height) );
|
||||
|
||||
osg::ref_ptr<osgQt::GraphicsWindowQt> window = new osgQt::GraphicsWindowQt(traits.get());
|
||||
QLayout* layout = new QHBoxLayout(this);
|
||||
@ -66,7 +67,6 @@ RenderWidget::RenderWidget(QWidget *parent, Qt::WindowFlags f)
|
||||
mView->getCamera()->setGraphicsContext(window);
|
||||
mView->getCamera()->setClearColor( osg::Vec4(0.2, 0.2, 0.6, 1.0) );
|
||||
mView->getCamera()->setViewport( new osg::Viewport(0, 0, traits->width, traits->height) );
|
||||
mView->getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 1.0f, 10000.0f );
|
||||
|
||||
SceneUtil::LightManager* lightMgr = new SceneUtil::LightManager;
|
||||
lightMgr->setStartLight(1);
|
||||
@ -188,6 +188,8 @@ SceneWidget::SceneWidget(std::shared_ptr<Resource::ResourceSystem> resourceSyste
|
||||
|
||||
mOrbitCamControl->setPickingMask(Mask_Reference | Mask_Terrain);
|
||||
|
||||
mOrbitCamControl->setConstRoll( CSMPrefs::get()["3D Scene Input"]["navi-orbit-const-roll"].isTrue() );
|
||||
|
||||
// we handle lighting manually
|
||||
mView->setLightingMode(osgViewer::View::NO_LIGHT);
|
||||
|
||||
@ -370,6 +372,40 @@ void SceneWidget::settingChanged (const CSMPrefs::Setting *setting)
|
||||
{
|
||||
mOrbitCamControl->setOrbitSpeedMultiplier(setting->toDouble());
|
||||
}
|
||||
else if (*setting=="3D Scene Input/navi-orbit-const-roll")
|
||||
{
|
||||
mOrbitCamControl->setConstRoll(setting->isTrue());
|
||||
}
|
||||
else if (*setting=="Rendering/camera-fov" ||
|
||||
*setting=="Rendering/camera-ortho" ||
|
||||
*setting=="Rendering/camera-ortho-size")
|
||||
{
|
||||
updateCameraParameters();
|
||||
}
|
||||
}
|
||||
|
||||
void RenderWidget::updateCameraParameters(double overrideAspect)
|
||||
{
|
||||
const float nearDist = 1.0;
|
||||
const float farDist = 1000.0;
|
||||
|
||||
if (CSMPrefs::get()["Rendering"]["camera-ortho"].isTrue())
|
||||
{
|
||||
const float size = CSMPrefs::get()["Rendering"]["camera-ortho-size"].toInt();
|
||||
const float aspect = overrideAspect >= 0.0 ? overrideAspect : (width() / static_cast<double>(height()));
|
||||
const float halfH = size * 10.0;
|
||||
const float halfW = halfH * aspect;
|
||||
|
||||
mView->getCamera()->setProjectionMatrixAsOrtho(
|
||||
-halfW, halfW, -halfH, halfH, nearDist, farDist);
|
||||
}
|
||||
else
|
||||
{
|
||||
mView->getCamera()->setProjectionMatrixAsPerspective(
|
||||
CSMPrefs::get()["Rendering"]["camera-fov"].toInt(),
|
||||
static_cast<double>(width())/static_cast<double>(height()),
|
||||
nearDist, farDist);
|
||||
}
|
||||
}
|
||||
|
||||
void SceneWidget::selectNavigationMode (const std::string& mode)
|
||||
|
@ -64,6 +64,8 @@ namespace CSVRender
|
||||
osg::ref_ptr<osgViewer::View> mView;
|
||||
osg::ref_ptr<osg::Group> mRootNode;
|
||||
|
||||
void updateCameraParameters(double overrideAspect = -1.0);
|
||||
|
||||
QTimer mTimer;
|
||||
|
||||
protected slots:
|
||||
|
@ -131,7 +131,7 @@ void CSVRender::WorldspaceWidget::settingChanged (const CSMPrefs::Setting *setti
|
||||
mDragWheelFactor = setting->toDouble();
|
||||
else if (*setting=="3D Scene Input/drag-shift-factor")
|
||||
mDragShiftFactor = setting->toDouble();
|
||||
else if (*setting=="3D Scene Input/object-marker-alpha" && !mInConstructor)
|
||||
else if (*setting=="Rendering/object-marker-alpha" && !mInConstructor)
|
||||
{
|
||||
float alpha = setting->toDouble();
|
||||
// getSelection is virtual, thus this can not be called from the constructor
|
||||
|
@ -625,7 +625,7 @@ namespace MWRender
|
||||
|
||||
float Animation::getStartTime(const std::string &groupname) const
|
||||
{
|
||||
for(AnimSourceList::const_iterator iter(mAnimSources.begin()); iter != mAnimSources.end(); ++iter)
|
||||
for(AnimSourceList::const_reverse_iterator iter(mAnimSources.rbegin()); iter != mAnimSources.rend(); ++iter)
|
||||
{
|
||||
const NifOsg::TextKeyMap &keys = (*iter)->getTextKeys();
|
||||
|
||||
@ -638,7 +638,7 @@ namespace MWRender
|
||||
|
||||
float Animation::getTextKeyTime(const std::string &textKey) const
|
||||
{
|
||||
for(AnimSourceList::const_iterator iter(mAnimSources.begin()); iter != mAnimSources.end(); ++iter)
|
||||
for(AnimSourceList::const_reverse_iterator iter(mAnimSources.rbegin()); iter != mAnimSources.rend(); ++iter)
|
||||
{
|
||||
const NifOsg::TextKeyMap &keys = (*iter)->getTextKeys();
|
||||
|
||||
|
@ -2446,9 +2446,8 @@ namespace MWWorld
|
||||
if (ptr.getRefData().isDeleted())
|
||||
return true;
|
||||
|
||||
// we should not sell ingrediends from owned organic containers
|
||||
MWWorld::LiveCellRef<ESM::Container>* ref = ptr.get<ESM::Container>();
|
||||
if (ref && (ref->mBase->mFlags & ESM::Container::Organic))
|
||||
// vanilla Morrowind does not allow to sell items from containers with zero capacity
|
||||
if (ptr.getClass().getCapacity(ptr) <= 0.f)
|
||||
return true;
|
||||
|
||||
if (Misc::StringUtils::ciEqual(ptr.getCellRef().getOwner(), mOwner.getCellRef().getRefId()))
|
||||
|
Loading…
x
Reference in New Issue
Block a user