forked from teamnwah/openmw-tes3coop
CS: Add fixed roll setting, plus ortho fix
This commit is contained in:
parent
1b77e3ed62
commit
d85f8deaa3
5 changed files with 37 additions and 13 deletions
|
@ -180,6 +180,7 @@ void CSMPrefs::State::declare()
|
|||
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).
|
||||
|
|
|
@ -669,17 +669,24 @@ 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::Vec3 absoluteUp = osg::Vec3(0,0,1);
|
||||
osg::Vec3d absoluteUp = osg::Vec3(0,0,1);
|
||||
|
||||
osg::Quat rotation = osg::Quat(value, absoluteUp);
|
||||
osg::Quat rotation = osg::Quat(value, mConstRoll ? absoluteUp : up);
|
||||
osg::Vec3d oldOffset = eye - mCenter;
|
||||
osg::Vec3d newOffset = rotation * oldOffset;
|
||||
|
||||
up = rotation * up;
|
||||
if (mConstRoll)
|
||||
up = rotation * up;
|
||||
|
||||
getCamera()->setViewMatrixAsLookAt(mCenter + newOffset, mCenter, up);
|
||||
}
|
||||
|
||||
|
@ -687,16 +694,22 @@ namespace CSVRender
|
|||
{
|
||||
osg::Vec3d eye, center, up;
|
||||
getCamera()->getViewMatrixAsLookAt(eye, center, up);
|
||||
osg::Vec3 absoluteUp = osg::Vec3(0,0,1);
|
||||
osg::Vec3d absoluteUp = osg::Vec3(0,0,1);
|
||||
|
||||
osg::Vec3d forward = center - eye;
|
||||
|
||||
osg::Vec3d axis = absoluteUp ^ forward * (up.z() < 0.0 ? -1.0 : 1.0);
|
||||
osg::Vec3d axis = absoluteUp ^ forward;
|
||||
|
||||
if (mConstRoll && up.z() < 0.0)
|
||||
axis *= -1.0;
|
||||
|
||||
osg::Quat rotation = osg::Quat(value,axis);
|
||||
osg::Vec3d oldOffset = eye - mCenter;
|
||||
osg::Vec3d newOffset = rotation * oldOffset;
|
||||
|
||||
up = rotation * up;
|
||||
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);
|
||||
|
|
|
@ -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);
|
||||
|
@ -67,8 +68,6 @@ RenderWidget::RenderWidget(QWidget *parent, Qt::WindowFlags f)
|
|||
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) );
|
||||
|
||||
updateCameraParameters();
|
||||
|
||||
SceneUtil::LightManager* lightMgr = new SceneUtil::LightManager;
|
||||
lightMgr->setStartLight(1);
|
||||
lightMgr->setLightingMask(Mask_Lighting);
|
||||
|
@ -189,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);
|
||||
|
||||
|
@ -371,6 +372,10 @@ 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")
|
||||
|
@ -379,7 +384,7 @@ void SceneWidget::settingChanged (const CSMPrefs::Setting *setting)
|
|||
}
|
||||
}
|
||||
|
||||
void RenderWidget::updateCameraParameters()
|
||||
void RenderWidget::updateCameraParameters(double overrideAspect)
|
||||
{
|
||||
const float near = 1.0;
|
||||
const float far = 1000.0;
|
||||
|
@ -387,8 +392,9 @@ void RenderWidget::updateCameraParameters()
|
|||
if (CSMPrefs::get()["Rendering"]["camera-ortho"].isTrue())
|
||||
{
|
||||
const float size = CSMPrefs::get()["Rendering"]["camera-ortho-size"].toDouble();
|
||||
const float half_w = size / 100.0 * static_cast<double>(width());
|
||||
const float half_h = size / 100.0 * static_cast<double>(height());
|
||||
const float aspect = overrideAspect >= 0.0 ? overrideAspect : (width() / static_cast<double>(height()));
|
||||
const float half_h = size * 10.0;
|
||||
const float half_w = half_h * aspect;
|
||||
|
||||
mView->getCamera()->setProjectionMatrixAsOrtho(
|
||||
-half_w, half_w, -half_h, half_h, near, far);
|
||||
|
|
|
@ -64,7 +64,7 @@ namespace CSVRender
|
|||
osg::ref_ptr<osgViewer::View> mView;
|
||||
osg::ref_ptr<osg::Group> mRootNode;
|
||||
|
||||
void updateCameraParameters();
|
||||
void updateCameraParameters(double overrideAspect = -1.0);
|
||||
|
||||
QTimer mTimer;
|
||||
|
||||
|
|
Loading…
Reference in a new issue