- /* save current info */
- irr::core::vector3df oldPosition = camera->getCameraNode()->getPosition();
- irr::core::vector3df oldTarget = camera->getCameraNode()->getTarget();
- irr::core::matrix4 startMatrix =
- camera->getCameraNode()->getAbsoluteTransformation();
- irr::core::vector3df focusPoint =
- (camera->getCameraNode()->getTarget() -
- camera->getCameraNode()->getAbsolutePosition())
- .setLength(1) +
- camera->getCameraNode()->getAbsolutePosition();
-
- /* create left view */
- video::ITexture *left_image = draw_image(screensize, LEFT, startMatrix,
- focusPoint, show_hud, camera, hud, draw_wield_tool, client,
- guienv, skycolor);
-
- /* create right view */
- video::ITexture *right_image = draw_image(screensize, RIGHT, startMatrix,
- focusPoint, show_hud, camera, hud, draw_wield_tool, client,
- guienv, skycolor);
-
- /* create hud overlay */
- video::ITexture *hudtexture = draw_hud(screensize, show_hud, hud, client, false,
- skycolor, guienv, camera);
- getVideoDriver()->makeColorKeyTexture(
- hudtexture, irr::video::SColor(255, 0, 0, 0));
- // makeColorKeyTexture mirrors texture so we do it twice to get it right again
- getVideoDriver()->makeColorKeyTexture(
- hudtexture, irr::video::SColor(255, 0, 0, 0));
-
- draw2DImageFilterScaled(getVideoDriver(), left_image,
- irr::core::rect<s32>(0, 0, screensize.X / 2, screensize.Y),
- irr::core::rect<s32>(0, 0, screensize.X, screensize.Y), 0, 0,
- false);
-
- draw2DImageFilterScaled(getVideoDriver(), hudtexture,
- irr::core::rect<s32>(0, 0, screensize.X / 2, screensize.Y),
- irr::core::rect<s32>(0, 0, screensize.X, screensize.Y), 0, 0,
- true);
-
- draw2DImageFilterScaled(getVideoDriver(), right_image,
- irr::core::rect<s32>(
- screensize.X / 2, 0, screensize.X, screensize.Y),
- irr::core::rect<s32>(0, 0, screensize.X, screensize.Y), 0, 0,
- false);
-
- draw2DImageFilterScaled(getVideoDriver(), hudtexture,
- irr::core::rect<s32>(
- screensize.X / 2, 0, screensize.X, screensize.Y),
- irr::core::rect<s32>(0, 0, screensize.X, screensize.Y), 0, 0,
- true);
-
- left_image = nullptr;
- right_image = nullptr;
-
- /* cleanup */
- camera->getCameraNode()->setPosition(oldPosition);
- camera->getCameraNode()->setTarget(oldTarget);
-}
-
-void RenderingEngine::draw_top_bottom_3d_mode(Camera *camera, bool show_hud, Hud *hud,
- const v2u32 &screensize, bool draw_wield_tool, Client *client,
- gui::IGUIEnvironment *guienv, const video::SColor &skycolor)
-{
- /* save current info */
- irr::core::vector3df oldPosition = camera->getCameraNode()->getPosition();
- irr::core::vector3df oldTarget = camera->getCameraNode()->getTarget();
- irr::core::matrix4 startMatrix =
- camera->getCameraNode()->getAbsoluteTransformation();
- irr::core::vector3df focusPoint =
- (camera->getCameraNode()->getTarget() -
- camera->getCameraNode()->getAbsolutePosition())
- .setLength(1) +
- camera->getCameraNode()->getAbsolutePosition();
-
- /* create left view */
- video::ITexture *left_image = draw_image(screensize, LEFT, startMatrix,
- focusPoint, show_hud, camera, hud, draw_wield_tool, client,
- guienv, skycolor);
-
- /* create right view */
- video::ITexture *right_image = draw_image(screensize, RIGHT, startMatrix,
- focusPoint, show_hud, camera, hud, draw_wield_tool, client,
- guienv, skycolor);
-
- /* create hud overlay */
- video::ITexture *hudtexture = draw_hud(screensize, show_hud, hud, client, false,
- skycolor, guienv, camera);
- getVideoDriver()->makeColorKeyTexture(
- hudtexture, irr::video::SColor(255, 0, 0, 0));
- // makeColorKeyTexture mirrors texture so we do it twice to get it right again
- getVideoDriver()->makeColorKeyTexture(
- hudtexture, irr::video::SColor(255, 0, 0, 0));
-
- draw2DImageFilterScaled(getVideoDriver(), left_image,
- irr::core::rect<s32>(0, 0, screensize.X, screensize.Y / 2),
- irr::core::rect<s32>(0, 0, screensize.X, screensize.Y), 0, 0,
- false);
-
- draw2DImageFilterScaled(getVideoDriver(), hudtexture,
- irr::core::rect<s32>(0, 0, screensize.X, screensize.Y / 2),
- irr::core::rect<s32>(0, 0, screensize.X, screensize.Y), 0, 0,
- true);
-
- draw2DImageFilterScaled(getVideoDriver(), right_image,
- irr::core::rect<s32>(
- 0, screensize.Y / 2, screensize.X, screensize.Y),
- irr::core::rect<s32>(0, 0, screensize.X, screensize.Y), 0, 0,
- false);
-
- draw2DImageFilterScaled(getVideoDriver(), hudtexture,
- irr::core::rect<s32>(
- 0, screensize.Y / 2, screensize.X, screensize.Y),
- irr::core::rect<s32>(0, 0, screensize.X, screensize.Y), 0, 0,
- true);
-
- left_image = NULL;
- right_image = NULL;
-
- /* cleanup */
- camera->getCameraNode()->setPosition(oldPosition);
- camera->getCameraNode()->setTarget(oldTarget);
-}
-
-void RenderingEngine::draw_pageflip_3d_mode(Camera *camera, bool show_hud, Hud *hud,
- const v2u32 &screensize, bool draw_wield_tool, Client *client,
- gui::IGUIEnvironment *guienv, const video::SColor &skycolor)
-{
-#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8
- errorstream << "Pageflip 3D mode is not supported"
- << " with your Irrlicht version!" << std::endl;
-#else
- /* preserve old setup*/
- irr::core::vector3df oldPosition = camera->getCameraNode()->getPosition();
- irr::core::vector3df oldTarget = camera->getCameraNode()->getTarget();
-
- irr::core::matrix4 startMatrix =
- camera->getCameraNode()->getAbsoluteTransformation();
- irr::core::vector3df focusPoint =
- (camera->getCameraNode()->getTarget() -
- camera->getCameraNode()->getAbsolutePosition())
- .setLength(1) +
- camera->getCameraNode()->getAbsolutePosition();
-
- // Left eye...
- getVideoDriver()->setRenderTarget(irr::video::ERT_STEREO_LEFT_BUFFER);
-
- irr::core::vector3df leftEye;
- irr::core::matrix4 leftMove;
- leftMove.setTranslation(irr::core::vector3df(
- -g_settings->getFloat("3d_paralax_strength"), 0.0f, 0.0f));
- leftEye = (startMatrix * leftMove).getTranslation();
-
- // clear the depth buffer, and color
- getVideoDriver()->beginScene(true, true, irr::video::SColor(200, 200, 200, 255));
- camera->getCameraNode()->setPosition(leftEye);
- camera->getCameraNode()->setTarget(focusPoint);
- get_scene_manager()->drawAll();
- getVideoDriver()->setTransform(video::ETS_WORLD, core::IdentityMatrix);
-
- if (show_hud) {
- hud->drawSelectionMesh();
- if (draw_wield_tool)
- camera->drawWieldedTool(&leftMove);
- hud->drawHotbar(client->getPlayerItem());
- hud->drawLuaElements(camera->getOffset());
- camera->drawNametags();
- }
-
- guienv->drawAll();
-
- // Right eye...
- getVideoDriver()->setRenderTarget(irr::video::ERT_STEREO_RIGHT_BUFFER);
-
- irr::core::vector3df rightEye;
- irr::core::matrix4 rightMove;
- rightMove.setTranslation(irr::core::vector3df(
- g_settings->getFloat("3d_paralax_strength"), 0.0f, 0.0f));
- rightEye = (startMatrix * rightMove).getTranslation();
-
- // clear the depth buffer, and color
- getVideoDriver()->beginScene(true, true, irr::video::SColor(200, 200, 200, 255));
- camera->getCameraNode()->setPosition(rightEye);
- camera->getCameraNode()->setTarget(focusPoint);
- get_scene_manager()->drawAll();
- getVideoDriver()->setTransform(video::ETS_WORLD, core::IdentityMatrix);
-
- if (show_hud) {
- hud->drawSelectionMesh();
- if (draw_wield_tool)
- camera->drawWieldedTool(&rightMove);
- hud->drawHotbar(client->getPlayerItem());
- hud->drawLuaElements(camera->getOffset());
- camera->drawNametags();
- }
-
- guienv->drawAll();
-
- camera->getCameraNode()->setPosition(oldPosition);
- camera->getCameraNode()->setTarget(oldTarget);
-#endif
-}
-
-// returns (size / coef), rounded upwards
-inline int scaledown(int coef, int size)
-{
- return (size + coef - 1) / coef;
-}
-
-void RenderingEngine::draw_plain(Camera *camera, bool show_hud, Hud *hud,
- const v2u32 &screensize, bool draw_wield_tool, Client *client,
- gui::IGUIEnvironment *guienv, const video::SColor &skycolor)
-{
- // Undersampling-specific stuff
- static video::ITexture *image = NULL;
- static v2u32 last_pixelated_size = v2u32(0, 0);
- static thread_local 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(pixelated_size, &image, "mt_drawimage_img1");
- last_pixelated_size = pixelated_size;
- }
- getVideoDriver()->setRenderTarget(image, true, true, skycolor);
- }
-
- // Render
- get_scene_manager()->drawAll();
- getVideoDriver()->setTransform(video::ETS_WORLD, core::IdentityMatrix);
- if (show_hud) {
- hud->drawSelectionMesh();
- if (draw_wield_tool) {
- camera->drawWieldedTool();
- }
- }
-
- // Upscale lowres render
- if (undersampling > 0) {
- getVideoDriver()->setRenderTarget(0, true, true);
- getVideoDriver()->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));
- }
-}
-
-const char *RenderingEngine::getVideoDriverName(irr::video::E_DRIVER_TYPE type)
-{
- static const char *driver_ids[] = {
- "null", "software", "burningsvideo", "direct3d8", "direct3d9",
- "opengl", "ogles1", "ogles2",