mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-02-06 17:45:33 +00:00
Remove 'separate preview camera' and make the new behavior the default one.
Also minor refactoring in camera.cpp
This commit is contained in:
parent
4d206d2c67
commit
8ac7ffc32b
5 changed files with 32 additions and 162 deletions
|
@ -110,30 +110,18 @@ namespace MWInput
|
|||
|
||||
if (MWBase::Environment::get().getInputManager()->getControlSwitch("playerviewswitch"))
|
||||
{
|
||||
static const bool separatePreviewCamera = Settings::Manager::getBool("separate preview camera", "Camera");
|
||||
if (mBindingsManager->actionIsActive(A_TogglePOV))
|
||||
{
|
||||
if (separatePreviewCamera)
|
||||
{
|
||||
if (mPreviewPOVDelay <= 0.5 && (mPreviewPOVDelay += dt) > 0.5)
|
||||
{
|
||||
mPreviewPOVDelay = 1.f;
|
||||
MWBase::Environment::get().getWorld()->togglePreviewMode(true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mPreviewPOVDelay == 0)
|
||||
MWBase::Environment::get().getWorld()->togglePreviewMode(true);
|
||||
mPreviewPOVDelay += dt;
|
||||
}
|
||||
if (mPreviewPOVDelay == 0)
|
||||
MWBase::Environment::get().getWorld()->togglePreviewMode(true);
|
||||
mPreviewPOVDelay += dt;
|
||||
}
|
||||
else
|
||||
{
|
||||
//disable preview mode
|
||||
if (mPreviewPOVDelay > 0 || separatePreviewCamera)
|
||||
if (mPreviewPOVDelay > 0)
|
||||
MWBase::Environment::get().getWorld()->togglePreviewMode(false);
|
||||
if (mPreviewPOVDelay > 0.f && mPreviewPOVDelay <= (separatePreviewCamera ? 0.5 : 0.25))
|
||||
if (mPreviewPOVDelay > 0.f && mPreviewPOVDelay <= 0.25)
|
||||
MWBase::Environment::get().getWorld()->togglePOV();
|
||||
mPreviewPOVDelay = 0.f;
|
||||
}
|
||||
|
|
|
@ -58,7 +58,6 @@ namespace MWRender
|
|||
mIsNearest(false),
|
||||
mHeight(124.f),
|
||||
mBaseCameraDistance(Settings::Manager::getFloat("third person camera distance", "Camera")),
|
||||
mUseSeparatePreviewCam(Settings::Manager::getBool("separate preview camera", "Camera")),
|
||||
mVanityToggleQueued(false),
|
||||
mVanityToggleQueuedValue(false),
|
||||
mViewModeToggleQueued(false),
|
||||
|
@ -77,13 +76,6 @@ namespace MWRender
|
|||
mVanity.enabled = false;
|
||||
mVanity.allowed = true;
|
||||
|
||||
mPreviewCam.pitch = 0.f;
|
||||
mPreviewCam.yaw = 0.f;
|
||||
mPreviewCam.offset = 400.f;
|
||||
mMainCam.pitch = 0.f;
|
||||
mMainCam.yaw = 0.f;
|
||||
mMainCam.offset = 400.f;
|
||||
|
||||
mCameraDistance = mBaseCameraDistance;
|
||||
|
||||
mUpdateCallback = new UpdateRenderCameraCallback(this);
|
||||
|
@ -95,17 +87,11 @@ namespace MWRender
|
|||
mCamera->removeUpdateCallback(mUpdateCallback);
|
||||
}
|
||||
|
||||
MWWorld::Ptr Camera::getTrackingPtr() const
|
||||
{
|
||||
return mTrackingPtr;
|
||||
}
|
||||
|
||||
osg::Vec3d Camera::getFocalPoint() const
|
||||
{
|
||||
const osg::Node* trackNode = mTrackingNode;
|
||||
if (!trackNode)
|
||||
if (!mTrackingNode)
|
||||
return osg::Vec3d();
|
||||
osg::NodePathList nodepaths = trackNode->getParentalNodePaths();
|
||||
osg::NodePathList nodepaths = mTrackingNode->getParentalNodePaths();
|
||||
if (nodepaths.empty())
|
||||
return osg::Vec3d();
|
||||
osg::Matrix worldMat = osg::computeLocalToWorld(nodepaths[0]);
|
||||
|
@ -127,12 +113,9 @@ namespace MWRender
|
|||
osg::Vec3d Camera::getFocalPointOffset() const
|
||||
{
|
||||
osg::Vec3d offset(0, 0, 10.f);
|
||||
if (!mUseSeparatePreviewCam || (!mPreviewMode && !mVanity.enabled))
|
||||
{
|
||||
offset.x() += mFocalPointCurrentOffset.x() * cos(getYaw());
|
||||
offset.y() += mFocalPointCurrentOffset.x() * sin(getYaw());
|
||||
offset.z() += mFocalPointCurrentOffset.y();
|
||||
}
|
||||
offset.x() += mFocalPointCurrentOffset.x() * cos(getYaw());
|
||||
offset.y() += mFocalPointCurrentOffset.x() * sin(getYaw());
|
||||
offset.z() += mFocalPointCurrentOffset.y();
|
||||
return offset;
|
||||
}
|
||||
|
||||
|
@ -199,7 +182,6 @@ namespace MWRender
|
|||
}
|
||||
if (mViewModeToggleQueued)
|
||||
{
|
||||
|
||||
togglePreviewMode(false);
|
||||
toggleViewMode();
|
||||
mViewModeToggleQueued = false;
|
||||
|
@ -295,7 +277,7 @@ namespace MWRender
|
|||
mFirstPersonView = !mFirstPersonView;
|
||||
processViewChange();
|
||||
}
|
||||
|
||||
|
||||
void Camera::allowVanityMode(bool allow)
|
||||
{
|
||||
if (!allow && mVanity.enabled)
|
||||
|
@ -322,20 +304,6 @@ namespace MWRender
|
|||
mVanity.enabled = enable;
|
||||
|
||||
processViewChange();
|
||||
|
||||
if (mUseSeparatePreviewCam)
|
||||
{
|
||||
float offset = mPreviewCam.offset;
|
||||
if (mVanity.enabled)
|
||||
{
|
||||
setPitch(osg::DegreesToRadians(-30.f));
|
||||
mMainCam.offset = mCameraDistance;
|
||||
}
|
||||
else
|
||||
offset = mMainCam.offset;
|
||||
mCameraDistance = offset;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -349,19 +317,6 @@ namespace MWRender
|
|||
|
||||
mPreviewMode = enable;
|
||||
processViewChange();
|
||||
|
||||
if (mUseSeparatePreviewCam)
|
||||
{
|
||||
float offset = mCameraDistance;
|
||||
if (mPreviewMode) {
|
||||
mMainCam.offset = offset;
|
||||
offset = mPreviewCam.offset;
|
||||
} else {
|
||||
mPreviewCam.offset = offset;
|
||||
offset = mMainCam.offset;
|
||||
}
|
||||
mCameraDistance = offset;
|
||||
}
|
||||
}
|
||||
|
||||
void Camera::setSneakOffset(float offset)
|
||||
|
@ -369,13 +324,6 @@ namespace MWRender
|
|||
mAnimation->setFirstPersonOffset(osg::Vec3f(0,0,-offset));
|
||||
}
|
||||
|
||||
float Camera::getYaw() const
|
||||
{
|
||||
if (mUseSeparatePreviewCam && (mVanity.enabled || mPreviewMode))
|
||||
return mPreviewCam.yaw;
|
||||
return mMainCam.yaw;
|
||||
}
|
||||
|
||||
void Camera::setYaw(float angle)
|
||||
{
|
||||
if (angle > osg::PI) {
|
||||
|
@ -383,35 +331,14 @@ namespace MWRender
|
|||
} else if (angle < -osg::PI) {
|
||||
angle += osg::PI*2;
|
||||
}
|
||||
if (mUseSeparatePreviewCam && (mVanity.enabled || mPreviewMode))
|
||||
mPreviewCam.yaw = angle;
|
||||
else
|
||||
mMainCam.yaw = angle;
|
||||
}
|
||||
|
||||
float Camera::getPitch() const
|
||||
{
|
||||
if (mUseSeparatePreviewCam && (mVanity.enabled || mPreviewMode))
|
||||
return mPreviewCam.pitch;
|
||||
return mMainCam.pitch;
|
||||
mYaw = angle;
|
||||
}
|
||||
|
||||
void Camera::setPitch(float angle)
|
||||
{
|
||||
const float epsilon = 0.000001f;
|
||||
float limit = osg::PI_2 - epsilon;
|
||||
if(mUseSeparatePreviewCam && mPreviewMode)
|
||||
limit /= 2;
|
||||
|
||||
if(angle > limit)
|
||||
angle = limit;
|
||||
else if(angle < -limit)
|
||||
angle = -limit;
|
||||
|
||||
if (mUseSeparatePreviewCam && (mVanity.enabled || mPreviewMode))
|
||||
mPreviewCam.pitch = angle;
|
||||
else
|
||||
mMainCam.pitch = angle;
|
||||
mPitch = osg::clampBetween(angle, -limit, limit);
|
||||
}
|
||||
|
||||
float Camera::getCameraDistance() const
|
||||
|
@ -426,28 +353,13 @@ namespace MWRender
|
|||
if(mFirstPersonView && !mPreviewMode && !mVanity.enabled)
|
||||
return;
|
||||
|
||||
mIsNearest = false;
|
||||
|
||||
if (adjust)
|
||||
{
|
||||
if (mUseSeparatePreviewCam && (mVanity.enabled || mPreviewMode))
|
||||
dist += mCameraDistance;
|
||||
else
|
||||
dist += std::min(mCameraDistance - getCameraDistanceCorrection(), mBaseCameraDistance);
|
||||
}
|
||||
dist += std::min(mCameraDistance - getCameraDistanceCorrection(), mBaseCameraDistance);
|
||||
|
||||
mIsNearest = dist <= mNearest;
|
||||
dist = osg::clampBetween(dist, mNearest, mFurthest);
|
||||
|
||||
if (dist >= mFurthest)
|
||||
dist = mFurthest;
|
||||
else if (dist <= mNearest)
|
||||
{
|
||||
dist = mNearest;
|
||||
mIsNearest = true;
|
||||
}
|
||||
|
||||
if (mUseSeparatePreviewCam && (mVanity.enabled || mPreviewMode))
|
||||
mPreviewCam.offset = dist;
|
||||
else if (!mFirstPersonView)
|
||||
if (!mFirstPersonView)
|
||||
{
|
||||
mBaseCameraDistance = dist;
|
||||
Settings::Manager::setFloat("third person camera distance", "Camera", dist);
|
||||
|
@ -459,14 +371,9 @@ namespace MWRender
|
|||
{
|
||||
if(mFirstPersonView && !mPreviewMode && !mVanity.enabled)
|
||||
return;
|
||||
|
||||
if (adjust) dist += mCameraDistance;
|
||||
|
||||
if (dist >= mFurthest)
|
||||
dist = mFurthest;
|
||||
else if (dist < 10.f)
|
||||
dist = 10.f;
|
||||
mCameraDistance = dist;
|
||||
if (adjust)
|
||||
dist += mCameraDistance;
|
||||
mCameraDistance = osg::clampBetween(dist, 10.f, mFurthest);
|
||||
}
|
||||
|
||||
float Camera::getCameraDistanceCorrection() const
|
||||
|
@ -484,21 +391,17 @@ namespace MWRender
|
|||
|
||||
void Camera::setCameraDistance()
|
||||
{
|
||||
if (mUseSeparatePreviewCam && (mVanity.enabled || mPreviewMode))
|
||||
mCameraDistance = mPreviewCam.offset;
|
||||
else if (!mFirstPersonView)
|
||||
{
|
||||
mCameraDistance = mBaseCameraDistance + getCameraDistanceCorrection();
|
||||
if (mDynamicCameraDistanceEnabled)
|
||||
mCameraDistance = std::min(mCameraDistance, mMaxNextCameraDistance);
|
||||
}
|
||||
mFocalPointAdjustment = osg::Vec3d();
|
||||
if (mFirstPersonView)
|
||||
return;
|
||||
mCameraDistance = mBaseCameraDistance + getCameraDistanceCorrection();
|
||||
if (mDynamicCameraDistanceEnabled)
|
||||
mCameraDistance = std::min(mCameraDistance, mMaxNextCameraDistance);
|
||||
}
|
||||
|
||||
void Camera::setAnimation(NpcAnimation *anim)
|
||||
{
|
||||
mAnimation = anim;
|
||||
|
||||
processViewChange();
|
||||
}
|
||||
|
||||
|
@ -525,13 +428,4 @@ namespace MWRender
|
|||
rotateCamera(getPitch(), getYaw(), false);
|
||||
}
|
||||
|
||||
bool Camera::isVanityOrPreviewModeEnabled() const
|
||||
{
|
||||
return mPreviewMode || mVanity.enabled;
|
||||
}
|
||||
|
||||
bool Camera::isNearest() const
|
||||
{
|
||||
return mIsNearest;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,10 +24,6 @@ namespace MWRender
|
|||
class Camera
|
||||
{
|
||||
private:
|
||||
struct CamData {
|
||||
float pitch, yaw, offset;
|
||||
};
|
||||
|
||||
MWWorld::Ptr mTrackingPtr;
|
||||
osg::ref_ptr<const osg::Node> mTrackingNode;
|
||||
float mHeightScale;
|
||||
|
@ -47,8 +43,7 @@ namespace MWRender
|
|||
} mVanity;
|
||||
|
||||
float mHeight, mBaseCameraDistance;
|
||||
CamData mMainCam, mPreviewCam;
|
||||
bool mUseSeparatePreviewCam;
|
||||
float mPitch, mYaw;
|
||||
|
||||
bool mVanityToggleQueued;
|
||||
bool mVanityToggleQueuedValue;
|
||||
|
@ -83,7 +78,7 @@ namespace MWRender
|
|||
Camera(osg::Camera* camera);
|
||||
~Camera();
|
||||
|
||||
MWWorld::Ptr getTrackingPtr() const;
|
||||
MWWorld::Ptr getTrackingPtr() const { return mTrackingPtr; }
|
||||
|
||||
void setFocalPointTransitionSpeed(float v) { mFocalPointTransitionSpeedCoef = v; }
|
||||
void setFocalPointTargetOffset(osg::Vec2d v);
|
||||
|
@ -101,10 +96,10 @@ namespace MWRender
|
|||
/// \param rot Rotation angles in radians
|
||||
void rotateCamera(float pitch, float yaw, bool adjust);
|
||||
|
||||
float getYaw() const;
|
||||
float getYaw() const { return mYaw; }
|
||||
void setYaw(float angle);
|
||||
|
||||
float getPitch() const;
|
||||
float getPitch() const { return mPitch; }
|
||||
void setPitch(float angle);
|
||||
|
||||
/// Attach camera to object
|
||||
|
@ -116,9 +111,6 @@ namespace MWRender
|
|||
bool toggleVanityMode(bool enable);
|
||||
void allowVanityMode(bool allow);
|
||||
|
||||
void useSeparatePreviewCamera(bool v) { mUseSeparatePreviewCam = v; }
|
||||
bool isUsingSeparatePreviewCamera() const { return mUseSeparatePreviewCam; }
|
||||
|
||||
/// @note this may be ignored if an important animation is currently playing
|
||||
void togglePreviewMode(bool enable);
|
||||
|
||||
|
@ -155,10 +147,10 @@ namespace MWRender
|
|||
/// Stores focal and camera world positions in passed arguments
|
||||
void getPosition(osg::Vec3d &focal, osg::Vec3d &camera) const;
|
||||
|
||||
bool isVanityOrPreviewModeEnabled() const;
|
||||
bool isVanityOrPreviewModeEnabled() const { return mPreviewMode || mVanity.enabled; }
|
||||
bool isVanityModeEnabled() const { return mVanity.enabled; }
|
||||
|
||||
bool isNearest() const;
|
||||
bool isNearest() const { return mIsNearest; }
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -1349,7 +1349,7 @@ namespace MWRender
|
|||
void RenderingManager::calculateDeferredRotation()
|
||||
{
|
||||
MWWorld::Ptr ptr = mCamera->getTrackingPtr();
|
||||
if (mCamera->isVanityOrPreviewModeEnabled() || mCamera->isUsingSeparatePreviewCamera() || ptr.isEmpty())
|
||||
if (mCamera->isVanityOrPreviewModeEnabled() || ptr.isEmpty())
|
||||
return;
|
||||
if (mCamera->isFirstPerson() || mDeferredRotationDisabled)
|
||||
{
|
||||
|
|
|
@ -33,10 +33,6 @@ field of view = 60.0
|
|||
# Best to leave this at the default since vanilla assets are not complete enough to adapt to high FoV's. Too low FoV would clip the hands off screen.
|
||||
first person field of view = 60.0
|
||||
|
||||
# true - standard bahaviour of preview and vanity camera
|
||||
# false - smooth preview mode
|
||||
separate preview camera = true
|
||||
|
||||
# Distance from the camera to the character in third person mode.
|
||||
third person camera distance = 192
|
||||
|
||||
|
|
Loading…
Reference in a new issue