1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Hard-coded undersampling.

Adds uniform undersampling for the 3D rendered scene. GUI elements
are not undersampled, resulting in better playability for users
with low-performance platforms with readable fonts and formspecs.

The undersampling setting can be set to 0 (disabled), 2, 3, 4 pixels
which translates into a resolution reduction of x4, x9 or x16, and
is significant.
This commit is contained in:
number Zero 2017-01-12 12:19:36 +03:00 committed by Auke Kok
parent 8ad3dad137
commit 0a8834608d
5 changed files with 54 additions and 7 deletions

View file

@ -459,10 +459,37 @@ void draw_pageflip_3d_mode(Camera& camera, bool show_hud,
#endif
}
void draw_plain(Camera &camera, bool show_hud, Hud &hud,
video::IVideoDriver *driver, bool draw_wield_tool,
Client &client, gui::IGUIEnvironment *guienv)
// returns (size / coef), rounded upwards
inline int scaledown(int coef, int size)
{
return (size + coef - 1) / coef;
}
void draw_plain(Camera &camera, bool show_hud,
Hud &hud, video::IVideoDriver *driver,
scene::ISceneManager *smgr, const v2u32 &screensize,
bool draw_wield_tool, Client &client, gui::IGUIEnvironment *guienv,
video::SColor skycolor)
{
// Undersampling-specific stuff
static video::ITexture *image = NULL;
static v2u32 last_pixelated_size = v2u32(0, 0);
int undersampling = g_settings->getU16("undersampling");
v2u32 pixelated_size;
v2u32 dest_size;
if (undersampling > 0) {
pixelated_size = v2u32(scaledown(undersampling, screensize.X),
scaledown(undersampling, screensize.Y));
dest_size = v2u32(undersampling * pixelated_size.X, undersampling * pixelated_size.Y);
if (pixelated_size != last_pixelated_size) {
init_texture(driver, pixelated_size, &image, "mt_drawimage_img1");
last_pixelated_size = pixelated_size;
}
driver->setRenderTarget(image, true, true, skycolor);
}
// Render
smgr->drawAll();
driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);
if (show_hud) {
hud.drawSelectionMesh();
@ -470,10 +497,18 @@ void draw_plain(Camera &camera, bool show_hud, Hud &hud,
camera.drawWieldedTool();
}
}
// Upscale lowres render
if (undersampling > 0) {
driver->setRenderTarget(0, true, true);
driver->draw2DImage(image,
irr::core::rect<s32>(0, 0, dest_size.X, dest_size.Y),
irr::core::rect<s32>(0, 0, pixelated_size.X, pixelated_size.Y));
}
}
void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr,
Camera &camera, Client& client, LocalPlayer *player, Hud &hud,
Camera &camera, Client &client, LocalPlayer *player, Hud &hud,
Minimap &mapper, gui::IGUIEnvironment *guienv,
const v2u32 &screensize, const video::SColor &skycolor,
bool show_hud, bool show_minimap)
@ -496,8 +531,6 @@ void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr,
const std::string &draw_mode = g_settings->get("3d_mode");
smgr->drawAll();
if (draw_mode == "anaglyph")
{
draw_anaglyph_3d_mode(camera, show_hud, hud, driver,
@ -531,7 +564,7 @@ void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr,
}
else {
draw_plain(camera, show_hud, hud, driver,
draw_wield_tool, client, guienv);
smgr, screensize, draw_wield_tool, client, guienv, skycolor);
}
/*