/* Minetest Copyright (C) 2010-2013 celeron55, Perttu Ahola Copyright (C) 2017 numzero, Lobachevskiy Vitaliy This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "plain.h" #include "settings.h" inline u32 scaledown(u32 coef, u32 size) { return (size + coef - 1) / coef; } RenderingCorePlain::RenderingCorePlain( IrrlichtDevice *_device, Client *_client, Hud *_hud) : RenderingCore(_device, _client, _hud) { scale = g_settings->getU16("undersampling"); } void RenderingCorePlain::initTextures() { if (scale <= 1) return; v2u32 size{scaledown(scale, screensize.X), scaledown(scale, screensize.Y)}; lowres = driver->addRenderTargetTexture( size, "render_lowres", video::ECF_A8R8G8B8); } void RenderingCorePlain::clearTextures() { if (scale <= 1) return; driver->removeTexture(lowres); } void RenderingCorePlain::beforeDraw() { if (scale <= 1) return; driver->setRenderTarget(lowres, true, true, skycolor); } void RenderingCorePlain::upscale() { if (scale <= 1) return; driver->setRenderTarget(0, true, true); v2u32 size{scaledown(scale, screensize.X), scaledown(scale, screensize.Y)}; v2u32 dest_size{scale * size.X, scale * size.Y}; driver->draw2DImage(lowres, core::rect(0, 0, dest_size.X, dest_size.Y), core::rect(0, 0, size.X, size.Y)); } void RenderingCorePlain::drawAll() { draw3D(); drawPostFx(); upscale(); drawHUD(); }