mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-02-01 02:45:32 +00:00
camera adjustment, fix view mode on start
This commit is contained in:
parent
34f796c38e
commit
a453a7f035
4 changed files with 80 additions and 28 deletions
|
@ -242,7 +242,8 @@ private:
|
||||||
player(_player),
|
player(_player),
|
||||||
windows(_windows),
|
windows(_windows),
|
||||||
mEngine (engine),
|
mEngine (engine),
|
||||||
mDragDrop(false)
|
mDragDrop(false),
|
||||||
|
mPreviewPOVDelay(0.f)
|
||||||
{
|
{
|
||||||
using namespace OEngine::Input;
|
using namespace OEngine::Input;
|
||||||
using namespace OEngine::Render;
|
using namespace OEngine::Render;
|
||||||
|
|
|
@ -22,7 +22,8 @@ namespace MWRender
|
||||||
mFirstPersonView(true),
|
mFirstPersonView(true),
|
||||||
mPreviewMode(false),
|
mPreviewMode(false),
|
||||||
mHeight(128.f),
|
mHeight(128.f),
|
||||||
mCameraDistance(400.f)
|
mCameraDistance(300.f),
|
||||||
|
mDistanceAdjusted(false)
|
||||||
{
|
{
|
||||||
mVanity.enabled = false;
|
mVanity.enabled = false;
|
||||||
mVanity.allowed = true;
|
mVanity.allowed = true;
|
||||||
|
@ -32,7 +33,7 @@ namespace MWRender
|
||||||
mCameraNode->setPosition(0.f, 0.f, mHeight);
|
mCameraNode->setPosition(0.f, 0.f, mHeight);
|
||||||
|
|
||||||
mPreviewCam.yaw = 0.f;
|
mPreviewCam.yaw = 0.f;
|
||||||
mPreviewCam.offset = 600.f;
|
mPreviewCam.offset = 400.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Player::rotate(const Ogre::Vector3 &rot, bool adjust)
|
bool Player::rotate(const Ogre::Vector3 &rot, bool adjust)
|
||||||
|
@ -167,7 +168,7 @@ namespace MWRender
|
||||||
mVanity.enabled = enable;
|
mVanity.enabled = enable;
|
||||||
mVanity.forced = force && enable;
|
mVanity.forced = force && enable;
|
||||||
|
|
||||||
float offset = 300.f;
|
float offset = mPreviewCam.offset;
|
||||||
Ogre::Vector3 rot(0.f, 0.f, 0.f);
|
Ogre::Vector3 rot(0.f, 0.f, 0.f);
|
||||||
if (mVanity.enabled) {
|
if (mVanity.enabled) {
|
||||||
mPlayerNode->setVisible(true, false);
|
mPlayerNode->setVisible(true, false);
|
||||||
|
@ -267,32 +268,45 @@ namespace MWRender
|
||||||
node->addChild(mCameraNode);
|
node->addChild(mCameraNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::setCameraDistance(float dist, bool adjust)
|
void Player::setCameraDistance(float dist, bool adjust, bool override)
|
||||||
{
|
{
|
||||||
/// \note non-Morrowind feature: allow to change camera distance
|
if (mFirstPersonView && !mPreviewMode && !mVanity.enabled) {
|
||||||
/// int 3d-person mode
|
return;
|
||||||
/// \todo review and simplify condition if possible
|
}
|
||||||
if (mPreviewMode ||
|
Ogre::Vector3 v(0.f, 0.f, dist);
|
||||||
mVanity.forced ||
|
if (adjust) {
|
||||||
(!mVanity.enabled && !mFirstPersonView))
|
v += mCamera->getPosition();
|
||||||
{
|
}
|
||||||
Ogre::Vector3 v(0.f, 0.f, dist);
|
if (v.z > 800.f) {
|
||||||
if (adjust) {
|
v.z = 800.f;
|
||||||
v += mCamera->getPosition();
|
} else if (v.z < 10.f) {
|
||||||
}
|
v.z = 10.f;
|
||||||
if (v.z > 800.f) {
|
}
|
||||||
v.z = 800.f;
|
mCamera->setPosition(v);
|
||||||
} else if (v.z < 100.f) {
|
|
||||||
v.z = 100.f;
|
|
||||||
}
|
|
||||||
mCamera->setPosition(v);
|
|
||||||
|
|
||||||
if (!mVanity.enabled && !mFirstPersonView) {
|
if (override) {
|
||||||
|
if (mVanity.enabled || mPreviewMode) {
|
||||||
|
mPreviewCam.offset = v.z;
|
||||||
|
} else if (!mFirstPersonView) {
|
||||||
mCameraDistance = v.z;
|
mCameraDistance = v.z;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
mDistanceAdjusted = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Player::setCameraDistance()
|
||||||
|
{
|
||||||
|
if (mDistanceAdjusted) {
|
||||||
|
if (mVanity.enabled || mPreviewMode) {
|
||||||
|
mCamera->setPosition(0, 0, mPreviewCam.offset);
|
||||||
|
} else if (!mFirstPersonView) {
|
||||||
|
mCamera->setPosition(0, 0, mCameraDistance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mDistanceAdjusted = false;
|
||||||
|
}
|
||||||
|
|
||||||
void Player::setAnimation(NpcAnimation *anim)
|
void Player::setAnimation(NpcAnimation *anim)
|
||||||
{
|
{
|
||||||
mAnimation = anim;
|
mAnimation = anim;
|
||||||
|
@ -307,6 +321,16 @@ namespace MWRender
|
||||||
|
|
||||||
float Player::getHeight()
|
float Player::getHeight()
|
||||||
{
|
{
|
||||||
return mHeight;
|
return mHeight * mPlayerNode->getScale().z;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Player::getPosition(Ogre::Vector3 &player, Ogre::Vector3 &camera)
|
||||||
|
{
|
||||||
|
float xch;
|
||||||
|
camera = mCamera->getRealPosition();
|
||||||
|
xch = camera.z, camera.z = camera.y, camera.y = -xch;
|
||||||
|
player = mPlayerNode->getPosition();
|
||||||
|
|
||||||
|
return mFirstPersonView && !mVanity.enabled && !mPreviewMode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,8 @@ namespace MWRender
|
||||||
float mHeight, mCameraDistance;
|
float mHeight, mCameraDistance;
|
||||||
CamData mMainCam, mPreviewCam;
|
CamData mMainCam, mPreviewCam;
|
||||||
|
|
||||||
|
bool mDistanceAdjusted;
|
||||||
|
|
||||||
float mTimeIdle;
|
float mTimeIdle;
|
||||||
int mUpdates;
|
int mUpdates;
|
||||||
|
|
||||||
|
@ -84,12 +86,23 @@ namespace MWRender
|
||||||
|
|
||||||
void update(float duration);
|
void update(float duration);
|
||||||
|
|
||||||
void setCameraDistance(float dist, bool adjust = false);
|
/// Set camera distance for current mode. Don't work on 1st person view.
|
||||||
|
/// \param adjust Indicates should distance be adjusted or set.
|
||||||
|
/// \param override If true new distance will be used as default.
|
||||||
|
/// If false, default distance can be restored with setCameraDistance().
|
||||||
|
void setCameraDistance(float dist, bool adjust = false, bool override = true);
|
||||||
|
|
||||||
|
/// Restore default camera distance for current mode.
|
||||||
|
void setCameraDistance();
|
||||||
|
|
||||||
void setAnimation(MWRender::NpcAnimation *anim);
|
void setAnimation(MWRender::NpcAnimation *anim);
|
||||||
|
|
||||||
void setHeight(float height);
|
void setHeight(float height);
|
||||||
float getHeight();
|
float getHeight();
|
||||||
|
|
||||||
|
/// Stores player and camera world positions in passed arguments
|
||||||
|
/// \return true if camera at the eye-place
|
||||||
|
bool getPosition(Ogre::Vector3 &player, Ogre::Vector3 &camera);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ using namespace Ogre;
|
||||||
namespace MWRender {
|
namespace MWRender {
|
||||||
|
|
||||||
RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine)
|
RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine)
|
||||||
:mRendering(_rend), mObjects(mRendering), mActors(mRendering), mAmbientMode(0), mSunEnabled(0)
|
:mRendering(_rend), mObjects(mRendering), mActors(mRendering), mAmbientMode(0), mSunEnabled(0), mPhysicsEngine(engine)
|
||||||
{
|
{
|
||||||
// select best shader mode
|
// select best shader mode
|
||||||
bool openGL = (Ogre::Root::getSingleton ().getRenderSystem ()->getName().find("OpenGL") != std::string::npos);
|
bool openGL = (Ogre::Root::getSingleton ().getRenderSystem ()->getName().find("OpenGL") != std::string::npos);
|
||||||
|
@ -296,7 +296,22 @@ RenderingManager::moveObjectToCell(
|
||||||
child->setPosition(pos);
|
child->setPosition(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderingManager::update (float duration){
|
void RenderingManager::update (float duration)
|
||||||
|
{
|
||||||
|
Ogre::Vector3 orig, dest;
|
||||||
|
mPlayer->setCameraDistance();
|
||||||
|
if (!mPlayer->getPosition(orig, dest)) {
|
||||||
|
orig.z += mPlayer->getHeight() * mMwRoot->getScale().z;
|
||||||
|
|
||||||
|
btVector3 btOrig(orig.x, orig.y, orig.z);
|
||||||
|
btVector3 btDest(dest.x, dest.y, dest.z);
|
||||||
|
std::pair<std::string, float> test =
|
||||||
|
mPhysicsEngine->rayTest(btOrig, btDest);
|
||||||
|
if (!test.first.empty()) {
|
||||||
|
mPlayer->setCameraDistance(test.second * orig.distance(dest), false, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mPlayer->update(duration);
|
||||||
|
|
||||||
mActors.update (duration);
|
mActors.update (duration);
|
||||||
mObjects.update (duration);
|
mObjects.update (duration);
|
||||||
|
@ -339,7 +354,6 @@ void RenderingManager::update (float duration){
|
||||||
);
|
);
|
||||||
mWater->update(duration);
|
mWater->update(duration);
|
||||||
}
|
}
|
||||||
mPlayer->update(duration);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderingManager::waterAdded (MWWorld::Ptr::CellStore *store){
|
void RenderingManager::waterAdded (MWWorld::Ptr::CellStore *store){
|
||||||
|
|
Loading…
Reference in a new issue