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:
parent
8ad3dad137
commit
0a8834608d
5 changed files with 54 additions and 7 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue