mirror of
https://github.com/minetest/minetest.git
synced 2025-01-03 11:57:30 +01:00
Avoid cloud jump when switching between mainmenu and loading screen (#15163)
... by using the same Clouds object for both. The mainmenu clouds already used shaders before. I had to choose between both or neither, so now both the mainmenu clouds and the loading screen clouds use shaders if available.
This commit is contained in:
parent
4aec4fbe6f
commit
47f199e6cb
@ -140,8 +140,10 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args)
|
|||||||
// Create the menu clouds
|
// Create the menu clouds
|
||||||
// This is only global so it can be used by RenderingEngine::draw_load_screen().
|
// This is only global so it can be used by RenderingEngine::draw_load_screen().
|
||||||
assert(!g_menucloudsmgr && !g_menuclouds);
|
assert(!g_menucloudsmgr && !g_menuclouds);
|
||||||
|
std::unique_ptr<IWritableShaderSource> ssrc(createShaderSource());
|
||||||
|
ssrc->addShaderConstantSetterFactory(new FogShaderConstantSetterFactory());
|
||||||
g_menucloudsmgr = m_rendering_engine->get_scene_manager()->createNewSceneManager();
|
g_menucloudsmgr = m_rendering_engine->get_scene_manager()->createNewSceneManager();
|
||||||
g_menuclouds = new Clouds(g_menucloudsmgr, nullptr, -1, rand());
|
g_menuclouds = new Clouds(g_menucloudsmgr, ssrc.get(), -1, rand());
|
||||||
g_menuclouds->setHeight(100.0f);
|
g_menuclouds->setHeight(100.0f);
|
||||||
g_menuclouds->update(v3f(0, 0, 0), video::SColor(255, 240, 240, 255));
|
g_menuclouds->update(v3f(0, 0, 0), video::SColor(255, 240, 240, 255));
|
||||||
scene::ICameraSceneNode* camera;
|
scene::ICameraSceneNode* camera;
|
||||||
|
@ -28,11 +28,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
|
|
||||||
// Menu clouds are created later
|
|
||||||
class Clouds;
|
class Clouds;
|
||||||
Clouds *g_menuclouds = NULL;
|
scene::ISceneManager *g_menucloudsmgr = nullptr;
|
||||||
scene::ISceneManager *g_menucloudsmgr = NULL;
|
Clouds *g_menuclouds = nullptr;
|
||||||
|
|
||||||
// Constant for now
|
// Constant for now
|
||||||
static constexpr const float cloud_size = BS * 64.0f;
|
static constexpr const float cloud_size = BS * 64.0f;
|
||||||
@ -49,9 +47,8 @@ Clouds::Clouds(scene::ISceneManager* mgr, IShaderSource *ssrc,
|
|||||||
scene::ISceneNode(mgr->getRootSceneNode(), mgr, id),
|
scene::ISceneNode(mgr->getRootSceneNode(), mgr, id),
|
||||||
m_seed(seed)
|
m_seed(seed)
|
||||||
{
|
{
|
||||||
|
assert(ssrc);
|
||||||
m_enable_shaders = g_settings->getBool("enable_shaders");
|
m_enable_shaders = g_settings->getBool("enable_shaders");
|
||||||
// menu clouds use shader-less clouds for simplicity (ssrc == NULL)
|
|
||||||
m_enable_shaders = m_enable_shaders && ssrc;
|
|
||||||
|
|
||||||
m_material.Lighting = false;
|
m_material.Lighting = false;
|
||||||
m_material.BackfaceCulling = true;
|
m_material.BackfaceCulling = true;
|
||||||
|
@ -36,11 +36,11 @@ namespace irr::scene
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Menu clouds
|
// Menu clouds
|
||||||
|
// The mainmenu and the loading screen use the same Clouds object so that the
|
||||||
|
// clouds don't jump when switching between the two.
|
||||||
class Clouds;
|
class Clouds;
|
||||||
extern Clouds *g_menuclouds;
|
|
||||||
|
|
||||||
// Scene manager used for menu clouds
|
|
||||||
extern scene::ISceneManager *g_menucloudsmgr;
|
extern scene::ISceneManager *g_menucloudsmgr;
|
||||||
|
extern Clouds *g_menuclouds;
|
||||||
|
|
||||||
class Clouds : public scene::ISceneNode
|
class Clouds : public scene::ISceneNode
|
||||||
{
|
{
|
||||||
|
@ -142,10 +142,6 @@ GUIEngine::GUIEngine(JoystickController *joystick,
|
|||||||
// create texture source
|
// create texture source
|
||||||
m_texture_source = std::make_unique<MenuTextureSource>(rendering_engine->get_video_driver());
|
m_texture_source = std::make_unique<MenuTextureSource>(rendering_engine->get_video_driver());
|
||||||
|
|
||||||
// create shader source
|
|
||||||
// (currently only used by clouds)
|
|
||||||
m_shader_source.reset(createShaderSource());
|
|
||||||
|
|
||||||
// create soundmanager
|
// create soundmanager
|
||||||
#if USE_SOUND
|
#if USE_SOUND
|
||||||
if (g_settings->getBool("enable_sound") && g_sound_manager_singleton.get()) {
|
if (g_settings->getBool("enable_sound") && g_sound_manager_singleton.get()) {
|
||||||
@ -296,10 +292,6 @@ void GUIEngine::run()
|
|||||||
IrrlichtDevice *device = m_rendering_engine->get_raw_device();
|
IrrlichtDevice *device = m_rendering_engine->get_raw_device();
|
||||||
video::IVideoDriver *driver = device->getVideoDriver();
|
video::IVideoDriver *driver = device->getVideoDriver();
|
||||||
|
|
||||||
// Always create clouds because they may or may not be
|
|
||||||
// needed based on the game selected
|
|
||||||
cloudInit();
|
|
||||||
|
|
||||||
unsigned int text_height = g_fontengine->getTextHeight();
|
unsigned int text_height = g_fontengine->getTextHeight();
|
||||||
|
|
||||||
// Reset fog color
|
// Reset fog color
|
||||||
@ -395,8 +387,6 @@ GUIEngine::~GUIEngine()
|
|||||||
|
|
||||||
m_irr_toplefttext->remove();
|
m_irr_toplefttext->remove();
|
||||||
|
|
||||||
m_cloud.clouds.reset();
|
|
||||||
|
|
||||||
// delete textures
|
// delete textures
|
||||||
for (image_definition &texture : m_textures) {
|
for (image_definition &texture : m_textures) {
|
||||||
if (texture.texture)
|
if (texture.texture)
|
||||||
@ -404,26 +394,11 @@ GUIEngine::~GUIEngine()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
void GUIEngine::cloudInit()
|
|
||||||
{
|
|
||||||
m_shader_source->addShaderConstantSetterFactory(
|
|
||||||
new FogShaderConstantSetterFactory());
|
|
||||||
|
|
||||||
m_cloud.clouds = make_irr<Clouds>(m_smgr, m_shader_source.get(), -1, rand());
|
|
||||||
m_cloud.clouds->setHeight(100.0f);
|
|
||||||
m_cloud.clouds->update(v3f(0, 0, 0), video::SColor(255,240,240,255));
|
|
||||||
|
|
||||||
m_cloud.camera = m_smgr->addCameraSceneNode(0,
|
|
||||||
v3f(0,0,0), v3f(0, 60, 100));
|
|
||||||
m_cloud.camera->setFarValue(10000);
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
void GUIEngine::drawClouds(float dtime)
|
void GUIEngine::drawClouds(float dtime)
|
||||||
{
|
{
|
||||||
m_cloud.clouds->step(dtime*3);
|
g_menuclouds->step(dtime * 3);
|
||||||
m_smgr->drawAll();
|
g_menucloudsmgr->drawAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
@ -203,8 +203,6 @@ private:
|
|||||||
MainMenuData *m_data = nullptr;
|
MainMenuData *m_data = nullptr;
|
||||||
/** texture source */
|
/** texture source */
|
||||||
std::unique_ptr<ISimpleTextureSource> m_texture_source;
|
std::unique_ptr<ISimpleTextureSource> m_texture_source;
|
||||||
/** shader source */
|
|
||||||
std::unique_ptr<IWritableShaderSource> m_shader_source;
|
|
||||||
/** sound manager */
|
/** sound manager */
|
||||||
std::unique_ptr<ISoundManager> m_sound_manager;
|
std::unique_ptr<ISoundManager> m_sound_manager;
|
||||||
|
|
||||||
@ -279,23 +277,11 @@ private:
|
|||||||
/** and text that is in it */
|
/** and text that is in it */
|
||||||
EnrichedString m_toplefttext;
|
EnrichedString m_toplefttext;
|
||||||
|
|
||||||
/** initialize cloud subsystem */
|
|
||||||
void cloudInit();
|
|
||||||
/** do preprocessing for cloud subsystem */
|
/** do preprocessing for cloud subsystem */
|
||||||
void drawClouds(float dtime);
|
void drawClouds(float dtime);
|
||||||
|
|
||||||
/** internam data required for drawing clouds */
|
|
||||||
struct clouddata {
|
|
||||||
/** pointer to cloud class */
|
|
||||||
irr_ptr<Clouds> clouds;
|
|
||||||
/** camera required for drawing clouds */
|
|
||||||
scene::ICameraSceneNode *camera = nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** is drawing of clouds enabled atm */
|
/** is drawing of clouds enabled atm */
|
||||||
bool m_clouds_enabled = true;
|
bool m_clouds_enabled = true;
|
||||||
/** data used to draw clouds */
|
|
||||||
clouddata m_cloud;
|
|
||||||
|
|
||||||
static void fullscreenChangedCallback(const std::string &name, void *data);
|
static void fullscreenChangedCallback(const std::string &name, void *data);
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user