Skip to content

Commit

Permalink
Isolate irrlicht references and use a singleton (#6041)
Browse files Browse the repository at this point in the history
* Add Device3D class which will contain IrrlichtDevice interface

move getSupportedVideoDrivers to Device3D

Add Device3D singleton & use it in various places

Rename Device3D to Rendering engine & add helper functions to various device pointers

More singleton work

RenderingEngine owns draw_load_screen

move draw functions to RenderingEngine

Reduce IrrlichtDevice exposure and guienvironment

RenderingEngine: Expose get_timer_time() to remove device from guiEngine

Make irrlichtdevice & scene manager less exposed

* Code style fixes

* Move porting::getVideoDriverName, getVideoDriverFriendlyName, getDisplayDensity, getDisplaySize to RenderingEngine

Fix XORG_USED macro -> RenderingEngine + create_engine_device from RenderingEngine constructor directly

* enum paralax => enum parallax
  • Loading branch information
nerzhul committed Jun 26, 2017
1 parent a8650e7 commit b3a36f7
Show file tree
Hide file tree
Showing 50 changed files with 1,568 additions and 1,567 deletions.
2 changes: 1 addition & 1 deletion build/android/jni/Android.mk
Expand Up @@ -138,7 +138,6 @@ LOCAL_SRC_FILES := \
jni/src/database.cpp \
jni/src/debug.cpp \
jni/src/defaultsettings.cpp \
jni/src/drawscene.cpp \
jni/src/dungeongen.cpp \
jni/src/emerge.cpp \
jni/src/environment.cpp \
Expand Down Expand Up @@ -270,6 +269,7 @@ LOCAL_SRC_FILES := \
jni/src/wieldmesh.cpp \
jni/src/client/clientlauncher.cpp \
jni/src/client/inputhandler.cpp \
jni/src/client/renderingengine.cpp \
jni/src/client/tile.cpp \
jni/src/client/joystick_controller.cpp \
jni/src/irrlicht_changes/static_text.cpp
Expand Down
1 change: 0 additions & 1 deletion src/CMakeLists.txt
Expand Up @@ -500,7 +500,6 @@ set(client_SRCS
content_cso.cpp
content_mapblock.cpp
convert_json.cpp
drawscene.cpp
filecache.cpp
fontengine.cpp
game.cpp
Expand Down
6 changes: 4 additions & 2 deletions src/camera.cpp
Expand Up @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "clientmap.h" // MapDrawControl
#include "player.h"
#include <cmath>
#include "client/renderingengine.h"
#include "settings.h"
#include "wieldmesh.h"
#include "noise.h" // easeCurve
Expand Down Expand Up @@ -99,7 +100,7 @@ bool Camera::successfullyCreated(std::string &error_message)
} else {
error_message.clear();
}

if (g_settings->getBool("enable_client_modding")) {
m_client->getScript()->on_camera_ready(this);
}
Expand Down Expand Up @@ -449,7 +450,8 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
fov_degrees = rangelim(fov_degrees, 7.0, 160.0);

// FOV and aspect ratio
m_aspect = (f32) porting::getWindowSize().X / (f32) porting::getWindowSize().Y;
const v2u32 &window_size = RenderingEngine::get_instance()->getWindowSize();
m_aspect = (f32) window_size.X / (f32) window_size.Y;
m_fov_y = fov_degrees * M_PI / 180.0;
// Increase vertical FOV on lower aspect ratios (<16:10)
m_fov_y *= MYMAX(1.0, MYMIN(1.4, sqrt(16./10. / m_aspect)));
Expand Down
53 changes: 20 additions & 33 deletions src/client.cpp
Expand Up @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <cmath>
#include <IFileSystem.h>
#include "threading/mutex_auto_lock.h"
#include "client/renderingengine.h"
#include "util/auth.h"
#include "util/directiontables.h"
#include "util/pointedthing.h"
Expand All @@ -41,7 +42,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "clientmap.h"
#include "clientmedia.h"
#include "version.h"
#include "drawscene.h"
#include "database-sqlite3.h"
#include "serialization.h"
#include "guiscalingfilter.h"
Expand All @@ -55,7 +55,6 @@ extern gui::IGUIEnvironment* guienv;
*/

Client::Client(
IrrlichtDevice *device,
const char *playername,
const std::string &password,
const std::string &address_name,
Expand All @@ -77,16 +76,12 @@ Client::Client(
m_event(event),
m_mesh_update_thread(this),
m_env(
new ClientMap(this, control,
device->getSceneManager()->getRootSceneNode(),
device->getSceneManager(), 666),
device->getSceneManager(),
new ClientMap(this, control, 666),
tsrc, this
),
m_particle_manager(&m_env),
m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, ipv6, this),
m_address_name(address_name),
m_device(device),
m_server_ser_ver(SER_FMT_VER_INVALID),
m_last_chat_message_sent(time(NULL)),
m_password(password),
Expand All @@ -99,7 +94,7 @@ Client::Client(
m_env.setLocalPlayer(new LocalPlayer(this, playername));

if (g_settings->getBool("enable_minimap")) {
m_minimap = new Minimap(device, this);
m_minimap = new Minimap(this);
}
m_cache_save_interval = g_settings->getU16("server_map_save_interval");

Expand Down Expand Up @@ -217,12 +212,11 @@ Client::~Client()
}

// cleanup 3d model meshes on client shutdown
while (m_device->getSceneManager()->getMeshCache()->getMeshCount() != 0) {
scene::IAnimatedMesh *mesh =
m_device->getSceneManager()->getMeshCache()->getMeshByIndex(0);
while (RenderingEngine::get_mesh_cache()->getMeshCount() != 0) {
scene::IAnimatedMesh *mesh = RenderingEngine::get_mesh_cache()->getMeshByIndex(0);

if (mesh)
m_device->getSceneManager()->getMeshCache()->removeMesh(mesh);
RenderingEngine::get_mesh_cache()->removeMesh(mesh);
}

delete m_minimap;
Expand Down Expand Up @@ -614,8 +608,8 @@ bool Client::loadMedia(const std::string &data, const std::string &filename)
verbosestream<<"Client: Attempting to load image "
<<"file \""<<filename<<"\""<<std::endl;

io::IFileSystem *irrfs = m_device->getFileSystem();
video::IVideoDriver *vdrv = m_device->getVideoDriver();
io::IFileSystem *irrfs = RenderingEngine::get_filesystem();
video::IVideoDriver *vdrv = RenderingEngine::get_video_driver();

// Create an irrlicht memory file
io::IReadFile *rfile = irrfs->createMemoryReadFile(
Expand Down Expand Up @@ -1628,7 +1622,6 @@ float Client::mediaReceiveProgress()
}

typedef struct TextureUpdateArgs {
IrrlichtDevice *device;
gui::IGUIEnvironment *guienv;
u64 last_time_ms;
u16 last_percent;
Expand All @@ -1655,12 +1648,12 @@ void texture_update_progress(void *args, u32 progress, u32 max_progress)
targs->last_time_ms = time_ms;
std::basic_stringstream<wchar_t> strm;
strm << targs->text_base << " " << targs->last_percent << "%...";
draw_load_screen(strm.str(), targs->device, targs->guienv, targs->tsrc, 0,
RenderingEngine::draw_load_screen(strm.str(), targs->guienv, targs->tsrc, 0,
72 + (u16) ((18. / 100.) * (double) targs->last_percent), true);
}
}

void Client::afterContentReceived(IrrlichtDevice *device)
void Client::afterContentReceived()
{
infostream<<"Client::afterContentReceived() started"<<std::endl;
assert(m_itemdef_received); // pre-condition
Expand All @@ -1672,25 +1665,25 @@ void Client::afterContentReceived(IrrlichtDevice *device)
// Clear cached pre-scaled 2D GUI images, as this cache
// might have images with the same name but different
// content from previous sessions.
guiScalingCacheClear(device->getVideoDriver());
guiScalingCacheClear();

// Rebuild inherited images and recreate textures
infostream<<"- Rebuilding images and textures"<<std::endl;
draw_load_screen(text,device, guienv, m_tsrc, 0, 70);
RenderingEngine::draw_load_screen(text, guienv, m_tsrc, 0, 70);
m_tsrc->rebuildImagesAndTextures();
delete[] text;

// Rebuild shaders
infostream<<"- Rebuilding shaders"<<std::endl;
text = wgettext("Rebuilding shaders...");
draw_load_screen(text, device, guienv, m_tsrc, 0, 71);
RenderingEngine::draw_load_screen(text, guienv, m_tsrc, 0, 71);
m_shsrc->rebuildShaders();
delete[] text;

// Update node aliases
infostream<<"- Updating node aliases"<<std::endl;
text = wgettext("Initializing nodes...");
draw_load_screen(text, device, guienv, m_tsrc, 0, 72);
RenderingEngine::draw_load_screen(text, guienv, m_tsrc, 0, 72);
m_nodedef->updateAliases(m_itemdef);
std::string texture_path = g_settings->get("texture_path");
if (texture_path != "" && fs::IsDir(texture_path))
Expand All @@ -1702,7 +1695,6 @@ void Client::afterContentReceived(IrrlichtDevice *device)
// Update node textures and assign shaders to each tile
infostream<<"- Updating node textures"<<std::endl;
TextureUpdateArgs tu_args;
tu_args.device = device;
tu_args.guienv = guienv;
tu_args.last_time_ms = porting::getTimeMs();
tu_args.last_percent = 0;
Expand All @@ -1724,7 +1716,7 @@ void Client::afterContentReceived(IrrlichtDevice *device)
}

text = wgettext("Done!");
draw_load_screen(text, device, guienv, m_tsrc, 0, 100);
RenderingEngine::draw_load_screen(text, guienv, m_tsrc, 0, 100);
infostream<<"Client::afterContentReceived() done"<<std::endl;
delete[] text;
}
Expand All @@ -1742,7 +1734,7 @@ float Client::getCurRate()

void Client::makeScreenshot()
{
irr::video::IVideoDriver *driver = m_device->getVideoDriver();
irr::video::IVideoDriver *driver = RenderingEngine::get_video_driver();
irr::video::IImage* const raw_image = driver->createScreenShot();

if (!raw_image)
Expand Down Expand Up @@ -1857,10 +1849,7 @@ IShaderSource* Client::getShaderSource()
{
return m_shsrc;
}
scene::ISceneManager* Client::getSceneManager()
{
return m_device->getSceneManager();
}

u16 Client::allocateUnknownNodeId(const std::string &name)
{
errorstream << "Client::allocateUnknownNodeId(): "
Expand Down Expand Up @@ -1892,22 +1881,20 @@ scene::IAnimatedMesh* Client::getMesh(const std::string &filename)
return NULL;
}
const std::string &data = it->second;
scene::ISceneManager *smgr = m_device->getSceneManager();

// Create the mesh, remove it from cache and return it
// This allows unique vertex colors and other properties for each instance
Buffer<char> data_rw(data.c_str(), data.size()); // Const-incorrect Irrlicht
io::IFileSystem *irrfs = m_device->getFileSystem();
io::IReadFile *rfile = irrfs->createMemoryReadFile(
io::IReadFile *rfile = RenderingEngine::get_filesystem()->createMemoryReadFile(
*data_rw, data_rw.getSize(), filename.c_str());
FATAL_ERROR_IF(!rfile, "Could not create/open RAM file");

scene::IAnimatedMesh *mesh = smgr->getMesh(rfile);
scene::IAnimatedMesh *mesh = RenderingEngine::get_scene_manager()->getMesh(rfile);
rfile->drop();
// NOTE: By playing with Irrlicht refcounts, maybe we could cache a bunch
// of uniquely named instances and re-use them
mesh->grab();
smgr->getMeshCache()->removeMesh(mesh);
RenderingEngine::get_mesh_cache()->removeMesh(mesh);
return mesh;
}

Expand Down
5 changes: 1 addition & 4 deletions src/client.h
Expand Up @@ -256,7 +256,6 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
*/

Client(
IrrlichtDevice *device,
const char *playername,
const std::string &password,
const std::string &address_name,
Expand Down Expand Up @@ -467,7 +466,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef

float mediaReceiveProgress();

void afterContentReceived(IrrlichtDevice *device);
void afterContentReceived();

float getRTT();
float getCurRate();
Expand All @@ -486,7 +485,6 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
ITextureSource* getTextureSource();
virtual IShaderSource* getShaderSource();
IShaderSource *shsrc() { return getShaderSource(); }
scene::ISceneManager* getSceneManager();
virtual u16 allocateUnknownNodeId(const std::string &name);
virtual ISoundManager* getSoundManager();
virtual MtEventManager* getEventManager();
Expand Down Expand Up @@ -593,7 +591,6 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
ParticleManager m_particle_manager;
con::Connection m_con;
std::string m_address_name;
IrrlichtDevice *m_device;
Camera *m_camera = nullptr;
Minimap *m_minimap = nullptr;
bool m_minimap_disabled_by_server = false;
Expand Down
1 change: 1 addition & 0 deletions src/client/CMakeLists.txt
@@ -1,4 +1,5 @@
set(client_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/renderingengine.cpp
${CMAKE_CURRENT_SOURCE_DIR}/clientlauncher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/inputhandler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tile.cpp
Expand Down

0 comments on commit b3a36f7

Please sign in to comment.