summaryrefslogtreecommitdiff
path: root/src/drawscene.cpp
diff options
context:
space:
mode:
authornumber Zero <silverunicorn2011@yandex.ru>2017-01-12 12:19:36 +0300
committerAuke Kok <sofar@foo-projects.org>2017-04-09 17:30:19 -0700
commit0a8834608d21998bd05b899bd91ddc2196762926 (patch)
treef5b1740d32ce9c70cf04e17a7c62744408a84f83 /src/drawscene.cpp
parent8ad3dad137df740ce63101bf224e977e66b9df2c (diff)
downloadminetest-0a8834608d21998bd05b899bd91ddc2196762926.tar.gz
minetest-0a8834608d21998bd05b899bd91ddc2196762926.tar.bz2
minetest-0a8834608d21998bd05b899bd91ddc2196762926.zip
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.
Diffstat (limited to 'src/drawscene.cpp')
-rw-r--r--src/drawscene.cpp47
1 files changed, 40 insertions, 7 deletions
diff --git a/src/drawscene.cpp b/src/drawscene.cpp
index 663c8828c..421b96f12 100644
--- a/src/drawscene.cpp
+++ b/src/drawscene.cpp
@@ -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);
}
/*