mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Isolate irrlicht references and use a singleton (#6041)
* 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
This commit is contained in:
parent
a8650e785d
commit
b3a36f7378
50 changed files with 1568 additions and 1567 deletions
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -55,7 +55,6 @@ extern gui::IGUIEnvironment* guienv;
|
|||
*/
|
||||
|
||||
Client::Client(
|
||||
IrrlichtDevice *device,
|
||||
const char *playername,
|
||||
const std::string &password,
|
||||
const std::string &address_name,
|
||||
|
@ -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),
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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(
|
||||
|
@ -1628,7 +1622,6 @@ float Client::mediaReceiveProgress()
|
|||
}
|
||||
|
||||
typedef struct TextureUpdateArgs {
|
||||
IrrlichtDevice *device;
|
||||
gui::IGUIEnvironment *guienv;
|
||||
u64 last_time_ms;
|
||||
u16 last_percent;
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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(): "
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue