1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-04-10 15:45:37 +00:00

Lua Bindings: Add view distance bindings to camera

This commit is contained in:
Cody Glassman 2022-05-09 19:40:48 +00:00 committed by Petr Mikheev
parent 8bf5de69ad
commit 882245b935
4 changed files with 37 additions and 9 deletions

View File

@ -92,6 +92,13 @@ namespace MWLua
api["getFieldOfView"] = [renderingManager]() { return osg::DegreesToRadians(renderingManager->getFieldOfView()); }; api["getFieldOfView"] = [renderingManager]() { return osg::DegreesToRadians(renderingManager->getFieldOfView()); };
api["setFieldOfView"] = [renderingManager](float v) { renderingManager->setFieldOfView(osg::RadiansToDegrees(v)); }; api["setFieldOfView"] = [renderingManager](float v) { renderingManager->setFieldOfView(osg::RadiansToDegrees(v)); };
api["getBaseViewDistance"] = []()
{
return std::max(0.f, Settings::Manager::getFloat("viewing distance", "Camera"));
};
api["getViewDistance"] = [renderingManager]() { return renderingManager->getViewDistance(); };
api["setViewDistance"] = [renderingManager](float d) { renderingManager->setViewDistance(d, true); };
api["getViewTransform"] = [camera]() { return LuaUtil::TransformM{camera->getViewMatrix()}; }; api["getViewTransform"] = [camera]() { return LuaUtil::TransformM{camera->getViewMatrix()}; };
api["viewportToWorldVector"] = [camera, renderingManager](osg::Vec2f pos) -> osg::Vec3f api["viewportToWorldVector"] = [camera, renderingManager](osg::Vec2f pos) -> osg::Vec3f

View File

@ -363,7 +363,7 @@ namespace MWRender
|| reverseZ || reverseZ
|| Stereo::getMultiview(); || Stereo::getMultiview();
resourceSystem->getSceneManager()->setForceShaders(forceShaders); resourceSystem->getSceneManager()->setForceShaders(forceShaders);
// FIXME: calling dummy method because terrain needs to know whether lighting is clamped // FIXME: calling dummy method because terrain needs to know whether lighting is clamped
resourceSystem->getSceneManager()->setClampLighting(Settings::Manager::getBool("clamp lighting", "Shaders")); resourceSystem->getSceneManager()->setClampLighting(Settings::Manager::getBool("clamp lighting", "Shaders"));
resourceSystem->getSceneManager()->setAutoUseNormalMaps(Settings::Manager::getBool("auto use object normal maps", "Shaders")); resourceSystem->getSceneManager()->setAutoUseNormalMaps(Settings::Manager::getBool("auto use object normal maps", "Shaders"));
@ -511,7 +511,7 @@ namespace MWRender
// water goes after terrain for correct waterculling order // water goes after terrain for correct waterculling order
mWater.reset(new Water(sceneRoot->getParent(0), sceneRoot, mResourceSystem, mViewer->getIncrementalCompileOperation(), resourcePath)); mWater.reset(new Water(sceneRoot->getParent(0), sceneRoot, mResourceSystem, mViewer->getIncrementalCompileOperation(), resourcePath));
mCamera.reset(new Camera(mViewer->getCamera())); mCamera.reset(new Camera(mViewer->getCamera()));
mScreenshotManager.reset(new ScreenshotManager(viewer, mRootNode, sceneRoot, mResourceSystem, mWater.get())); mScreenshotManager.reset(new ScreenshotManager(viewer, mRootNode, sceneRoot, mResourceSystem, mWater.get()));
@ -1293,10 +1293,7 @@ namespace MWRender
} }
else if (it->first == "Camera" && it->second == "viewing distance") else if (it->first == "Camera" && it->second == "viewing distance")
{ {
mViewDistance = Settings::Manager::getFloat("viewing distance", "Camera"); setViewDistance(Settings::Manager::getFloat("viewing distance", "Camera"));
if(!Settings::Manager::getBool("use distant fog", "Fog"))
mStateUpdater->setFogEnd(mViewDistance);
updateProjection = true;
} }
else if (it->first == "General" && (it->second == "texture filter" || else if (it->first == "General" && (it->second == "texture filter" ||
it->second == "texture mipmap" || it->second == "texture mipmap" ||
@ -1346,9 +1343,17 @@ namespace MWRender
} }
} }
float RenderingManager::getNearClipDistance() const void RenderingManager::setViewDistance(float distance, bool delay)
{ {
return mNearClip; mViewDistance = distance;
if (delay)
{
mUpdateProjectionMatrix = true;
return;
}
updateProjectionMatrix();
} }
float RenderingManager::getTerrainHeightAt(const osg::Vec3f &pos) float RenderingManager::getTerrainHeightAt(const osg::Vec3f &pos)

View File

@ -206,7 +206,10 @@ namespace MWRender
void processChangedSettings(const Settings::CategorySettingVector& settings); void processChangedSettings(const Settings::CategorySettingVector& settings);
float getNearClipDistance() const; float getNearClipDistance() const { return mNearClip; }
float getViewDistance() const { return mViewDistance; }
void setViewDistance(float distance, bool delay = false);
float getTerrainHeightAt(const osg::Vec3f& pos); float getTerrainHeightAt(const osg::Vec3f& pos);

View File

@ -186,6 +186,19 @@
-- @function [parent=#camera] setFieldOfView -- @function [parent=#camera] setFieldOfView
-- @param #number fov Field of view vertical angle in radians -- @param #number fov Field of view vertical angle in radians
--- Return base view distance.
-- @function [parent=#camera] getBaseViewDistance
-- @return #number
--- Return current view distance.
-- @function [parent=#camera] getViewDistance
-- @return #number
--- Set view distance.
--- Takes effect on the next frame.
-- @function [parent=#camera] setViewDistance
-- @param #number distance View distance in game units
--- Get world to local transform for the camera. --- Get world to local transform for the camera.
-- @function [parent=#camera] getViewTransform -- @function [parent=#camera] getViewTransform
-- @return openmw.util#Transform -- @return openmw.util#Transform