From d34c02dff949f5e13574d2ca597d91ff5ae07f44 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 09:11:40 +0200 Subject: [PATCH 01/52] added VSCode specific folders to .gitignore for my mental sanity --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 214dc6bbd..6dc0f3698 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,9 @@ src/tess_server *.srctrldb *.srctrlbm *.srctrlprj +# Ignore VSCode specific files .ionide +.vscode # Files auto-produced by CMake cmake-build-*/ # Documentation files in the docs folder. @@ -26,4 +28,4 @@ docs # Ignore Code Spell Checker plugin files. cspell.json # Ignore html folder produced by Doxygen/Doxywizard. -html/ \ No newline at end of file +html/ From 9722139e4c90f4f6d76db04c02ab12b3f62d6478 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 09:12:31 +0200 Subject: [PATCH 02/52] added VSCode specific folders to .gitignore for my mental sanity part 2 --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6dc0f3698..fbc13641f 100644 --- a/.gitignore +++ b/.gitignore @@ -17,8 +17,8 @@ src/tess_server *.srctrlbm *.srctrlprj # Ignore VSCode specific files -.ionide -.vscode +.ionide/ +.vscode/ # Files auto-produced by CMake cmake-build-*/ # Documentation files in the docs folder. From e3f8a1effbcfc7f9e314ba85b8f9be1a11036e0a Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 09:45:31 +0200 Subject: [PATCH 03/52] std::map (issue #257) and ENUMERATE removal part 1 --- src/engine/interface/console.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/engine/interface/console.cpp b/src/engine/interface/console.cpp index 2ad54cefb..606170192 100644 --- a/src/engine/interface/console.cpp +++ b/src/engine/interface/console.cpp @@ -290,7 +290,7 @@ namespace } } - hashtable keyms(128); + std::map keyms; void keymap(int *code, char *key) { @@ -308,7 +308,7 @@ namespace void searchbinds(char *action, int type) { std::vector names; - ENUMERATE(keyms, KeyM, km, + for(auto &[k, km] : keyms) { if(!std::strcmp(km.actions[type], action)) { @@ -321,20 +321,20 @@ namespace names.push_back(km.name[i]); } } - }); + }; names.push_back('\0'); result(names.data()); } KeyM *findbind(char *key) { - ENUMERATE(keyms, KeyM, km, + for(auto &[k, km] : keyms) { if(!strcasecmp(km.name, key)) { return &km; } - }); + }; return nullptr; } @@ -1060,7 +1060,7 @@ void processtextinput(const char *str, int len) void processkey(int code, bool isdown, int map) { - KeyM *haskey = keyms.access(code); + KeyM *haskey = &keyms[code]; if(haskey && haskey->pressed) { execbind(*haskey, isdown, map); // allow pressed keys to release @@ -1142,7 +1142,7 @@ void conoutf(int type, const char *fmt, ...) const char *getkeyname(int code) { - KeyM *km = keyms.access(code); + KeyM *km = &keyms[code]; return km ? km->name : nullptr; } @@ -1165,7 +1165,7 @@ void writebinds(stream *f) { static const char * const cmds[3] = { "bind", "specbind", "editbind" }; std::vector binds; - ENUMERATE(keyms, KeyM, km, binds.push_back(&km)); + for(auto &[k, km] : keyms) { binds.push_back(&km); } std::sort(binds.begin(), binds.end()); for(int j = 0; j < 3; ++j) { From d6b38a7626b300042cd085567439ed5d3edbcd8b Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 09:49:18 +0200 Subject: [PATCH 04/52] ENUMERATE removal part 2 --- src/engine/interface/console.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/engine/interface/console.cpp b/src/engine/interface/console.cpp index 606170192..6772742d0 100644 --- a/src/engine/interface/console.cpp +++ b/src/engine/interface/console.cpp @@ -1298,25 +1298,25 @@ void initconsolecmds() static auto clearbinds = [] () { - ENUMERATE(keyms, KeyM, km, km.clear(KeyM::Action_Default)); + for(auto &[k, km] : keyms) { km.clear(KeyM::Action_Default); } }; addcommand("clearbinds", reinterpret_cast(+clearbinds), "", Id_Command); static auto clearspecbinds = [] () { - ENUMERATE(keyms, KeyM, km, km.clear(KeyM::Action_Spectator)); + for(auto &[k, km] : keyms) { km.clear(KeyM::Action_Spectator); } }; addcommand("clearspecbinds", reinterpret_cast(+clearspecbinds), "", Id_Command); static auto cleareditbinds = [] () { - ENUMERATE(keyms, KeyM, km, km.clear(KeyM::Action_Editing)); + for(auto &[k, km] : keyms) { km.clear(KeyM::Action_Editing); } }; addcommand("cleareditbinds", reinterpret_cast(+cleareditbinds), "", Id_Command); static auto clearallbinds = [] () { - ENUMERATE(keyms, KeyM, km, km.clear()); + for(auto &[k, km] : keyms) { km.clear(); } }; addcommand("clearallbinds", reinterpret_cast(+clearallbinds), "", Id_Command); addcommand("inputcommand", reinterpret_cast(inputcommand), "ssss", Id_Command); From cbcca7cc79e5f3dfc009d30648fb274116dc568a Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 10:27:43 +0200 Subject: [PATCH 05/52] rebased => idents std::map in command.cpp (issue #257) --- src/engine/interface/command.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/engine/interface/command.cpp b/src/engine/interface/command.cpp index 06e4c3dda..2429ec589 100644 --- a/src/engine/interface/command.cpp +++ b/src/engine/interface/command.cpp @@ -23,7 +23,7 @@ #include "world/octaedit.h" -std::unordered_map idents; // contains ALL vars/commands/aliases +std::map idents; // contains ALL vars/commands/aliases static std::vector identmap; static ident *dummyident = nullptr; std::queue triggerqueue; //for the game to handle var change events @@ -468,7 +468,7 @@ tagval * commandret = &noret; void clear_command() { - for(auto& [k, i] : idents) + for(auto &[k, i] : idents) { if(i.type==Id_Alias) { @@ -4957,8 +4957,13 @@ static const uint *runcode(const uint *code, tagval &result) { \ continue; \ } \ +<<<<<<< HEAD auto itr = idents.find(arg.s); \ if(itr != idents.end()) \ +======= + ident *id = &idents[arg.s]; \ + if(id) \ +>>>>>>> 4388d847 (idents std::map in command.cpp (issue #257)) { \ ident* id = &(*(itr)).second; \ switch(id->type) \ From eb9ffc89d6f2b70d5cc60f3136f4198d38cf8549 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 10:29:25 +0200 Subject: [PATCH 06/52] rebase part 2 --- src/engine/interface/command.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/engine/interface/command.cpp b/src/engine/interface/command.cpp index 2429ec589..4a3203496 100644 --- a/src/engine/interface/command.cpp +++ b/src/engine/interface/command.cpp @@ -551,12 +551,16 @@ static ident *addident(const ident &id) identinits->push_back(id); return nullptr; } +<<<<<<< HEAD auto itr = idents.find(id.name); if(itr == idents.end()) { //we need to make a new entry idents[id.name] = id; } +======= + idents.insert_or_assign(id.name, id); +>>>>>>> 1058f3b6 (pray this works: insert_or_assign) ident &def = idents[id.name]; def.index = identmap.size(); identmap.push_back(&def); From f64ca0dc88e1f32140ec513dd6431a6fe6bd3e23 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 10:47:45 +0200 Subject: [PATCH 07/52] changed window, may have broken something. I'm not familiar of what happens by comparing *&& and * --- src/engine/interface/ui.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/engine/interface/ui.cpp b/src/engine/interface/ui.cpp index 5c85d8f26..361a49ed1 100644 --- a/src/engine/interface/ui.cpp +++ b/src/engine/interface/ui.cpp @@ -972,7 +972,7 @@ namespace UI } }; - static hashnameset windows; + static std::map windows; void ClipArea::scissor() { @@ -4352,14 +4352,15 @@ namespace UI //new ui command void newui(char *name, char *contents, char *onshow, char *onhide) { - Window *window = windows.find(name, nullptr); - if(window) + auto search = windows.find(name); + if(search != windows.end()) { + auto [key, window] = *search; // I may have broken this, remove this comment if engine compiles/works. Issue #257 if (window == UI::window) { return; } - world->hide(window); windows.remove(name); + world->hide(window); windows.erase(name); delete window; } windows[name] = new Window(name, contents, onshow, onhide); From 3cf04e035422152a8002b0c9ecdb41272a81e51f Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 10:48:26 +0200 Subject: [PATCH 08/52] more work towards Issue #257 --- src/engine/interface/command.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/engine/interface/command.cpp b/src/engine/interface/command.cpp index 4a3203496..8b05af28c 100644 --- a/src/engine/interface/command.cpp +++ b/src/engine/interface/command.cpp @@ -551,16 +551,12 @@ static ident *addident(const ident &id) identinits->push_back(id); return nullptr; } -<<<<<<< HEAD auto itr = idents.find(id.name); if(itr == idents.end()) { //we need to make a new entry idents[id.name] = id; } -======= - idents.insert_or_assign(id.name, id); ->>>>>>> 1058f3b6 (pray this works: insert_or_assign) ident &def = idents[id.name]; def.index = identmap.size(); identmap.push_back(&def); @@ -885,6 +881,7 @@ static void resetvar(char *name) } } } +} void setarg(ident &id, tagval &v) { @@ -1045,6 +1042,8 @@ ident* getvar(int vartype, const char *name) } return nullptr; } + return nullptr; +} /** * @brief Overwrite an ident's array with an array comming from storage. From 9a2c059a9b2f374620663a6efd6a166f036d37de Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 11:01:42 +0200 Subject: [PATCH 09/52] ui.cpp for #257 --- src/engine/interface/ui.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/engine/interface/ui.cpp b/src/engine/interface/ui.cpp index 361a49ed1..bb63e5d19 100644 --- a/src/engine/interface/ui.cpp +++ b/src/engine/interface/ui.cpp @@ -4394,8 +4394,8 @@ namespace UI bool showui(const char *name) { - Window *window = windows.find(name, nullptr); - return window && world->show(window); + auto search = windows.find(name); + return search != windows.end() && world->show(search->second); } bool hideui(const char *name) @@ -4404,8 +4404,8 @@ namespace UI { return world->hideall() > 0; } - Window *window = windows.find(name, nullptr); - return window && world->hide(window); + auto search = windows.find(name); + return search != windows.end() && world->hide(search->second); } bool toggleui(const char *name) @@ -4436,8 +4436,8 @@ namespace UI { return world->children.size() > 0; } - Window *window = windows.find(name, nullptr); - return window && std::find(world->children.begin(), world->children.end(), window) != world->children.end(); + auto search = windows.find(name); + return search != windows.end() && std::find(world->children.begin(), world->children.end(), search->second) != world->children.end(); } void ifstateval(bool state, tagval * t, tagval * f) @@ -4809,7 +4809,7 @@ namespace UI void cleanup() { world->children.resize(0); - ENUMERATE(windows, Window *, w, delete w); + for(auto &[k, w] : windows) { delete w; } windows.clear(); if(world) { From e861ba9fe58d5209be8bf1ea299301d2d703c55a Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 11:03:56 +0200 Subject: [PATCH 10/52] animmodel.h and .cpp for #257 --- src/engine/model/animmodel.cpp | 4 ++-- src/engine/model/animmodel.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/engine/model/animmodel.cpp b/src/engine/model/animmodel.cpp index 3618c7706..1d22125e2 100644 --- a/src/engine/model/animmodel.cpp +++ b/src/engine/model/animmodel.cpp @@ -72,7 +72,7 @@ Texture *animmodel::lasttex = nullptr, int animmodel::matrixpos = 0; matrix4 animmodel::matrixstack[64]; -hashtable animmodel::ShaderParamsKey::keys; +std::map animmodel::ShaderParamsKey::keys; int animmodel::ShaderParamsKey::firstversion = 0, animmodel::ShaderParamsKey::lastversion = 1; @@ -169,7 +169,7 @@ bool animmodel::ShaderParamsKey::checkversion() version = lastversion; if(++lastversion <= 0) { - ENUMERATE(keys, ShaderParamsKey, key, key.version = -1); + for(auto &[k, key] : keys) { key.version = -1; } firstversion = 0; lastversion = 1; version = 0; diff --git a/src/engine/model/animmodel.h b/src/engine/model/animmodel.h index 0de48328f..63ee058d9 100644 --- a/src/engine/model/animmodel.h +++ b/src/engine/model/animmodel.h @@ -52,7 +52,7 @@ class animmodel : public model struct ShaderParamsKey { - static hashtable keys; + static std::map keys; static int firstversion, lastversion; int version; From 2b2c91694f61dedd6b14fd076c0fcaa5715a67db Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 11:08:53 +0200 Subject: [PATCH 11/52] I may have broken this, because I don't understand hashset. Wish me luck, agent #257 --- src/engine/model/hitzone.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/engine/model/hitzone.cpp b/src/engine/model/hitzone.cpp index fbcd59517..3cc2a4fc8 100644 --- a/src/engine/model/hitzone.cpp +++ b/src/engine/model/hitzone.cpp @@ -807,7 +807,7 @@ void skelhitdata::build(skelmodel::skelmeshgroup *g, const uchar *ids) { return; } - hashset infomap(256); + std::map infomap; std::vector info; skelzonebounds *bounds = new skelzonebounds[g->skel->numbones]; numblends = g->blendcombos.size(); @@ -839,7 +839,8 @@ void skelhitdata::build(skelmodel::skelmeshgroup *g, const uchar *ids) } } skelzonekey key(m, t); - skelzoneinfo &zi = infomap.access(key, key); + infomap.insert_or_assign(key, key); + skelzoneinfo &zi = infomap[key]; if(key.blend >= numblends && zi.index < 0) { bounds[key.bones[0]].owner = zi.index = info.size(); @@ -859,18 +860,19 @@ void skelhitdata::build(skelmodel::skelmeshgroup *g, const uchar *ids) continue; } skelzonekey key(i); - skelzoneinfo &zi = infomap.access(key, key); + infomap.insert_or_assign(key, key); + skelzoneinfo &zi = infomap[key]; zi.index = info.size(); info.push_back(&zi); } int leafzones = info.size(); - ENUMERATE(infomap, skelzoneinfo, zi, + for(auto &[k, zi] : infomap) { if(zi.index < 0) { info.push_back(&zi); } - }); + }; for(uint i = leafzones; i < info.size(); i++) { skelzoneinfo &zi = *info[i]; @@ -928,7 +930,8 @@ void skelhitdata::build(skelmodel::skelmeshgroup *g, const uchar *ids) break; } skelzonekey dep(deps.bones[j]); - skelzoneinfo &zj = infomap.access(dep, dep); + infomap.insert_or_assign(dep, dep); + skelzoneinfo &zj = infomap[dep]; zj.parents++; zi.children.push_back(&zj); } From f171d64d573a7a9636fe5aff56660c8b847e6e73 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 11:18:43 +0200 Subject: [PATCH 12/52] rendermodel for issue #257 --- src/engine/render/rendermodel.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/engine/render/rendermodel.cpp b/src/engine/render/rendermodel.cpp index dcc59b373..de73845f5 100644 --- a/src/engine/render/rendermodel.cpp +++ b/src/engine/render/rendermodel.cpp @@ -414,13 +414,13 @@ void nummapmodels() // model registry -hashnameset models; +std::map models; std::vector preloadmodels; hashset failedmodels; void preloadmodel(const char *name) { - if(!name || !name[0] || models.access(name) || std::find(preloadmodels.begin(), preloadmodels.end(), name) != preloadmodels.end() ) + if(!name || !name[0] || models.find(name) == models.end() || std::find(preloadmodels.begin(), preloadmodels.end(), name) != preloadmodels.end() ) { return; } @@ -556,7 +556,7 @@ model *loadmodel(const char *name, int i, bool msg) } name = mmi.name; } - model **mm = models.access(name); + model **mm = &models[name]; model *m; if(mm) { @@ -597,7 +597,7 @@ model *loadmodel(const char *name, int i, bool msg) failedmodels.add(newstring(name)); return nullptr; } - models.access(m->name, m); + models.insert_or_assign(m->name, m); } if((mapmodels.size() > static_cast(i)) && !mapmodels[i].m) { @@ -608,22 +608,23 @@ model *loadmodel(const char *name, int i, bool msg) void clear_models() { - ENUMERATE(models, model *, m, delete m); + for(auto &[k, m] : models) { delete m; } } void cleanupmodels() { - ENUMERATE(models, model *, m, m->cleanup()); + for(auto &[k, m] : models) { m->cleanup(); } } static void clearmodel(char *name) { - model *m = models.find(name, nullptr); - if(!m) + auto search = models.find(name); + if(search == models.end()) { conoutf("model %s is not loaded", name); return; } + model *m = search->second; for(uint i = 0; i < mapmodels.size(); i++) { mapmodelinfo &mmi = mapmodels[i]; @@ -636,7 +637,7 @@ static void clearmodel(char *name) mmi.collide = nullptr; } } - models.remove(name); + models.erase(name); m->cleanup(); delete m; conoutf("cleared model %s", name); From 21deeeefa905bca51a62baa96e671801737da26f Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 11:20:34 +0200 Subject: [PATCH 13/52] rendertext for #257 --- src/engine/render/rendertext.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/engine/render/rendertext.cpp b/src/engine/render/rendertext.cpp index 293abc2a7..8bcd3723f 100644 --- a/src/engine/render/rendertext.cpp +++ b/src/engine/render/rendertext.cpp @@ -28,7 +28,7 @@ #include "interface/control.h" -static hashnameset fonts; +static std::map fonts; static font *fontdef = nullptr; static int fontdeftex = 0; @@ -704,7 +704,8 @@ void draw_text(const char *str, float left, float top, int r, int g, int b, int void reloadfonts() { - ENUMERATE(fonts, font, f, + for(auto &[k, f] : fonts) + { for(uint i = 0; i < f.texs.size(); i++) { if(!reloadtexture(*f.texs[i])) @@ -712,7 +713,7 @@ void reloadfonts() fatal("failed to reload font texture"); } } - ); + } } void initrendertextcmds() From dc390269dfc6048ed66ec8e8554ca9d95ce241dc Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 11:33:36 +0200 Subject: [PATCH 14/52] shader for #257 --- src/engine/render/shader.cpp | 45 ++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/engine/render/shader.cpp b/src/engine/render/shader.cpp index 0af206253..7afe82c1f 100644 --- a/src/engine/render/shader.cpp +++ b/src/engine/render/shader.cpp @@ -32,9 +32,9 @@ Shader *nullshader = nullptr, *ldrnotextureshader = nullptr, *stdworldshader = nullptr; -static hashnameset globalparams(256); -static hashtable localparams(256); -static hashnameset shaders(256); +static std::map globalparams; +static std::map localparams; +static std::unordered_map shaders; static Shader *slotshader = nullptr; static std::vector slotparams; static bool standardshaders = false, @@ -80,7 +80,7 @@ void loadshaders() Shader *lookupshaderbyname(const char *name) { - Shader *s = shaders.access(name); + Shader *s = &shaders[name]; return s && s->loaded() ? s : nullptr; } @@ -323,7 +323,8 @@ static void linkglslprogram(Shader &s, bool msg = true) int getlocalparam(const char *name) { - return localparams.access(name, static_cast(localparams.numelems)); + localparams.insert_or_assign(name, localparams.size()); + return localparams[name]; } static int addlocalparam(Shader &s, const char *name, int loc, int size, GLenum format) @@ -349,7 +350,7 @@ static int addlocalparam(Shader &s, const char *name, int loc, int size, GLenum GlobalShaderParamState *getglobalparam(const char *name) { - GlobalShaderParamState *param = globalparams.access(name); + GlobalShaderParamState *param = &globalparams[name]; if(!param) { param = &globalparams[name]; @@ -442,7 +443,7 @@ static void setglsluniformformat(Shader &s, const char *name, GLenum format, int } name = getshaderparamname(name); - GlobalShaderParamState *param = globalparams.access(name); + GlobalShaderParamState *param = &globalparams[name]; if(param) { addglobalparam(s, param, loc, size, format); @@ -488,7 +489,7 @@ int GlobalShaderParamState::nextversion = 0; void GlobalShaderParamState::resetversions() { - ENUMERATE(shaders, Shader, s, + for(auto &[k, s] : shaders) { for(uint i = 0; i < s.globalparams.size(); i++) { @@ -498,10 +499,10 @@ void GlobalShaderParamState::resetversions() u.version = -2; } } - }); + }; nextversion = 0; - ENUMERATE(globalparams, GlobalShaderParamState, g, { g.version = ++nextversion; }); - ENUMERATE(shaders, Shader, s, + for(auto &[k, g] : globalparams) { g.version = ++nextversion; } + for(auto &[k, s] : shaders) { for(uint i = 0; i < s.globalparams.size(); i++) { @@ -511,7 +512,7 @@ void GlobalShaderParamState::resetversions() u.version = u.param->version; } } - }); + } } static float *findslotparam(Slot &s, const char *name, float *noval = nullptr) @@ -1114,7 +1115,7 @@ Shader *newshader(int type, const char *name, const char *vs, const char *ps, Sh glUseProgram(0); Shader::lastshader = nullptr; } - Shader *exists = shaders.access(name); + Shader *exists = &shaders[name]; char *rname = exists ? exists->name : newstring(name); Shader &s = shaders[rname]; s.name = rname; @@ -1173,7 +1174,7 @@ Shader *newshader(int type, const char *name, const char *vs, const char *ps, Sh s.cleanup(true); if(variant) { - shaders.remove(rname); + shaders.erase(rname); } return nullptr; } @@ -1550,7 +1551,7 @@ VAR(defershaders, 0, 1, 1); void defershader(int *type, const char *name, const char *contents) { - Shader *exists = shaders.access(name); + Shader *exists = &shaders[name]; if(exists && !exists->invalid()) { return; @@ -1607,13 +1608,13 @@ int Shader::uniformlocversion() return version; } version = 0; - ENUMERATE(shaders, Shader, s, + for(auto &[k, s] : shaders) { for(uint j = 0; j < s.uniformlocs.size(); j++) { s.uniformlocs[j].version = -1; } - }); + } return version; } @@ -1628,7 +1629,7 @@ int Shader::uniformlocversion() */ Shader *useshaderbyname(const char *name) { - Shader *s = shaders.access(name); + Shader *s = &shaders[name]; if(!s) { return nullptr; @@ -1741,7 +1742,7 @@ void variantshader(int *type, char *name, int *row, char *vs, char *ps, int *max void setshader(char *name) { slotparams.size(); - Shader *s = shaders.access(name); + Shader *s = &shaders[name]; if(!s) { conoutf(Console_Error, "no such shader: %s", name); @@ -2148,7 +2149,7 @@ void cleanupshaders() loadedshaders = false; nullshader = hudshader = hudnotextureshader = nullptr; - ENUMERATE(shaders, Shader, s, s.cleanup()); + for(auto &[k, s] : shaders) s.cleanup(); Shader::lastshader = nullptr; glUseProgram(0); } @@ -2159,7 +2160,7 @@ void reloadshaders() loadshaders(); identflags |= Idf_Persist; linkslotshaders(); - ENUMERATE(shaders, Shader, s, + for(auto &[k, s] : shaders) { if(!s.standard && s.loaded() && !s.variantshader) { @@ -2184,7 +2185,7 @@ void reloadshaders() { s.force(); } - }); + } } void resetshaders() From 82b966b7f2bc627fdcb728b5ab0ef132908f94b9 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 5 Sep 2022 11:52:11 +0200 Subject: [PATCH 15/52] last commit, brain mushy --- src/engine/model/animmodel.cpp | 2 +- src/engine/model/animmodel.h | 2 +- src/engine/render/rendertext.cpp | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/engine/model/animmodel.cpp b/src/engine/model/animmodel.cpp index 1d22125e2..ea75ca28a 100644 --- a/src/engine/model/animmodel.cpp +++ b/src/engine/model/animmodel.cpp @@ -72,7 +72,7 @@ Texture *animmodel::lasttex = nullptr, int animmodel::matrixpos = 0; matrix4 animmodel::matrixstack[64]; -std::map animmodel::ShaderParamsKey::keys; +std::unordered_map animmodel::ShaderParamsKey::keys; int animmodel::ShaderParamsKey::firstversion = 0, animmodel::ShaderParamsKey::lastversion = 1; diff --git a/src/engine/model/animmodel.h b/src/engine/model/animmodel.h index 63ee058d9..3b47c6022 100644 --- a/src/engine/model/animmodel.h +++ b/src/engine/model/animmodel.h @@ -52,7 +52,7 @@ class animmodel : public model struct ShaderParamsKey { - static std::map keys; + static std::unordered_map keys; static int firstversion, lastversion; int version; diff --git a/src/engine/render/rendertext.cpp b/src/engine/render/rendertext.cpp index 8bcd3723f..f88d0d5f1 100644 --- a/src/engine/render/rendertext.cpp +++ b/src/engine/render/rendertext.cpp @@ -190,7 +190,7 @@ static void fontskip(int *n) */ static void fontalias(const char *dst, const char *src) { - font *s = fonts.access(src); + font *s = &fonts[src]; if(!s) { return; @@ -217,12 +217,12 @@ static void fontalias(const char *dst, const char *src) font *findfont(const char *name) { - return fonts.access(name); + return &fonts[name]; } bool setfont(const char *name) { - font *f = fonts.access(name); + font *f = &fonts[name]; if(!f) { return false; From a136eaa67a40f81db0a505c474f620eb29ac4b06 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Wed, 7 Sep 2022 14:37:46 +0200 Subject: [PATCH 16/52] .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index fbc13641f..a1c4d0a8c 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,7 @@ src/tess_server *.srctrlprj # Ignore VSCode specific files .ionide/ -.vscode/ +.vscode/* # Files auto-produced by CMake cmake-build-*/ # Documentation files in the docs folder. From 3208416e3dc552dcb6a6a1b2590d4640251206b2 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Wed, 7 Sep 2022 14:38:14 +0200 Subject: [PATCH 17/52] typo --- src/engine/interface/command.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/engine/interface/command.cpp b/src/engine/interface/command.cpp index 8b05af28c..af6a1e16a 100644 --- a/src/engine/interface/command.cpp +++ b/src/engine/interface/command.cpp @@ -216,7 +216,7 @@ int ident::getint() const } float getfloat(const identval &v, int type) -{ +{debugcode switch(type) { case Value_Float: @@ -626,9 +626,7 @@ static const char *debugline(const char *p, const char *fmt) } return fmt; } - -VAR(debugalias, 0, 4, 1000); //depth to which alias aliasing should be debugged (disabled if 0) - +debugcode static void dodebugalias() { if(!debugalias) @@ -643,7 +641,7 @@ static void dodebugalias() } for(IdentLink *l = aliasstack; l != &noalias; l = l->next) { - ident *id = l->id; + ident *id = l->debugcodeid; ++depth; if(depth < debugalias) { @@ -881,7 +879,6 @@ static void resetvar(char *name) } } } -} void setarg(ident &id, tagval &v) { From 7b6b3bae9672a2052daf8ac5184736ed6ea5ca7c Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Wed, 7 Sep 2022 14:45:41 +0200 Subject: [PATCH 18/52] man I'm so bad at this --- src/engine/interface/command.cpp | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/engine/interface/command.cpp b/src/engine/interface/command.cpp index af6a1e16a..8a7d10cc8 100644 --- a/src/engine/interface/command.cpp +++ b/src/engine/interface/command.cpp @@ -216,7 +216,7 @@ int ident::getint() const } float getfloat(const identval &v, int type) -{debugcode +{ switch(type) { case Value_Float: @@ -626,7 +626,7 @@ static const char *debugline(const char *p, const char *fmt) } return fmt; } -debugcode + static void dodebugalias() { if(!debugalias) @@ -1039,8 +1039,6 @@ ident* getvar(int vartype, const char *name) } return nullptr; } - return nullptr; -} /** * @brief Overwrite an ident's array with an array comming from storage. @@ -4957,13 +4955,8 @@ static const uint *runcode(const uint *code, tagval &result) { \ continue; \ } \ -<<<<<<< HEAD - auto itr = idents.find(arg.s); \ - if(itr != idents.end()) \ -======= ident *id = &idents[arg.s]; \ if(id) \ ->>>>>>> 4388d847 (idents std::map in command.cpp (issue #257)) { \ ident* id = &(*(itr)).second; \ switch(id->type) \ From b371b89d423c52c943e40760bb77e02b48983fd3 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Wed, 7 Sep 2022 14:56:09 +0200 Subject: [PATCH 19/52] fixed the cs.h --- src/engine/interface/cs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/interface/cs.h b/src/engine/interface/cs.h index 3e36236c6..82691806a 100644 --- a/src/engine/interface/cs.h +++ b/src/engine/interface/cs.h @@ -212,7 +212,7 @@ extern void redoarg(ident &id, const identstack &stack); extern const char *parseword(const char *p); extern bool validateblock(const char *s); -extern std::unordered_map idents; +extern std::map idents; extern void setvarchecked(ident *id, int val); extern void setfvarchecked(ident *id, float val); From 3672056a105dd25d3e0bb95a1b31f8d6e631560e Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Wed, 7 Sep 2022 15:00:57 +0200 Subject: [PATCH 20/52] fixed last things..? --- src/engine/interface/command.cpp | 12 +++++++----- src/engine/interface/cs.h | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/engine/interface/command.cpp b/src/engine/interface/command.cpp index 8a7d10cc8..06e4c3dda 100644 --- a/src/engine/interface/command.cpp +++ b/src/engine/interface/command.cpp @@ -23,7 +23,7 @@ #include "world/octaedit.h" -std::map idents; // contains ALL vars/commands/aliases +std::unordered_map idents; // contains ALL vars/commands/aliases static std::vector identmap; static ident *dummyident = nullptr; std::queue triggerqueue; //for the game to handle var change events @@ -468,7 +468,7 @@ tagval * commandret = &noret; void clear_command() { - for(auto &[k, i] : idents) + for(auto& [k, i] : idents) { if(i.type==Id_Alias) { @@ -627,6 +627,8 @@ static const char *debugline(const char *p, const char *fmt) return fmt; } +VAR(debugalias, 0, 4, 1000); //depth to which alias aliasing should be debugged (disabled if 0) + static void dodebugalias() { if(!debugalias) @@ -641,7 +643,7 @@ static void dodebugalias() } for(IdentLink *l = aliasstack; l != &noalias; l = l->next) { - ident *id = l->debugcodeid; + ident *id = l->id; ++depth; if(depth < debugalias) { @@ -4955,8 +4957,8 @@ static const uint *runcode(const uint *code, tagval &result) { \ continue; \ } \ - ident *id = &idents[arg.s]; \ - if(id) \ + auto itr = idents.find(arg.s); \ + if(itr != idents.end()) \ { \ ident* id = &(*(itr)).second; \ switch(id->type) \ diff --git a/src/engine/interface/cs.h b/src/engine/interface/cs.h index 82691806a..3e36236c6 100644 --- a/src/engine/interface/cs.h +++ b/src/engine/interface/cs.h @@ -212,7 +212,7 @@ extern void redoarg(ident &id, const identstack &stack); extern const char *parseword(const char *p); extern bool validateblock(const char *s); -extern std::map idents; +extern std::unordered_map idents; extern void setvarchecked(ident *id, int val); extern void setfvarchecked(ident *id, float val); From f288e1ad92ca4f9d1a857c78c5e6b1815b0c51a3 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Wed, 7 Sep 2022 15:20:29 +0200 Subject: [PATCH 21/52] this errors so badly, and I don't know what to do --- src/engine/model/animmodel.cpp | 4 ++-- src/engine/model/animmodel.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/engine/model/animmodel.cpp b/src/engine/model/animmodel.cpp index ea75ca28a..465142f96 100644 --- a/src/engine/model/animmodel.cpp +++ b/src/engine/model/animmodel.cpp @@ -72,7 +72,7 @@ Texture *animmodel::lasttex = nullptr, int animmodel::matrixpos = 0; matrix4 animmodel::matrixstack[64]; -std::unordered_map animmodel::ShaderParamsKey::keys; +std::map animmodel::ShaderParamsKey::keys; int animmodel::ShaderParamsKey::firstversion = 0, animmodel::ShaderParamsKey::lastversion = 1; @@ -169,7 +169,7 @@ bool animmodel::ShaderParamsKey::checkversion() version = lastversion; if(++lastversion <= 0) { - for(auto &[k, key] : keys) { key.version = -1; } + for(auto& [k, key] : keys) { key.version = -1; } firstversion = 0; lastversion = 1; version = 0; diff --git a/src/engine/model/animmodel.h b/src/engine/model/animmodel.h index 3b47c6022..63ee058d9 100644 --- a/src/engine/model/animmodel.h +++ b/src/engine/model/animmodel.h @@ -52,7 +52,7 @@ class animmodel : public model struct ShaderParamsKey { - static std::unordered_map keys; + static std::map keys; static int firstversion, lastversion; int version; From 101ed8fe56a3458ab66e0ac0925faf3450c242b2 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Thu, 8 Sep 2022 09:48:26 +0200 Subject: [PATCH 22/52] overloaded std::hash --- src/engine/model/animmodel.cpp | 2 +- src/engine/model/animmodel.h | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/engine/model/animmodel.cpp b/src/engine/model/animmodel.cpp index 465142f96..99bf7b957 100644 --- a/src/engine/model/animmodel.cpp +++ b/src/engine/model/animmodel.cpp @@ -72,7 +72,7 @@ Texture *animmodel::lasttex = nullptr, int animmodel::matrixpos = 0; matrix4 animmodel::matrixstack[64]; -std::map animmodel::ShaderParamsKey::keys; +std::unordered_map animmodel::ShaderParamsKey::keys; int animmodel::ShaderParamsKey::firstversion = 0, animmodel::ShaderParamsKey::lastversion = 1; diff --git a/src/engine/model/animmodel.h b/src/engine/model/animmodel.h index 63ee058d9..c97a37f09 100644 --- a/src/engine/model/animmodel.h +++ b/src/engine/model/animmodel.h @@ -50,9 +50,10 @@ class animmodel : public model shaderparams() : spec(1.0f), gloss(1), glow(3.0f), glowdelta(0), glowpulse(0), fullbright(0), scrollu(0), scrollv(0), alphatest(0.9f), color(1, 1, 1) {} }; + struct ShaderParamsKey { - static std::map keys; + static std::unordered_map keys; static int firstversion, lastversion; int version; @@ -576,6 +577,18 @@ class animmodel : public model extern uint hthash(const animmodel::shaderparams &k); extern bool htcmp(const animmodel::shaderparams &x, const animmodel::shaderparams &y); +/* template specialization for std::hash + * needed to have sharedparams as keys for std::unordered_map + * TODO: clean up and refactor so that hthash is actually here + */ +template<> +struct std::hash { + std::size_t operator()(animmodel::shaderparams const& s) const noexcept { + return hthash(s); + } +}; + + /* modelloader * * modelloader is a template for a wrapper to load a model into a model/animmodel From 0ecf3e64d2c957ea805bbf45abe01454fdb181ce Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Thu, 8 Sep 2022 09:50:37 +0200 Subject: [PATCH 23/52] typo in docstring --- src/engine/model/animmodel.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/model/animmodel.h b/src/engine/model/animmodel.h index c97a37f09..95600879e 100644 --- a/src/engine/model/animmodel.h +++ b/src/engine/model/animmodel.h @@ -577,8 +577,8 @@ class animmodel : public model extern uint hthash(const animmodel::shaderparams &k); extern bool htcmp(const animmodel::shaderparams &x, const animmodel::shaderparams &y); -/* template specialization for std::hash - * needed to have sharedparams as keys for std::unordered_map +/* template specialization for std::hash + * needed to have shaderparams as keys for std::unordered_map * TODO: clean up and refactor so that hthash is actually here */ template<> From 40fd71aac685861de2df84498a988dd04fee6b03 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Thu, 8 Sep 2022 09:58:13 +0200 Subject: [PATCH 24/52] added operator== overload for animmodel::shaderparams --- src/engine/model/animmodel.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/engine/model/animmodel.h b/src/engine/model/animmodel.h index 95600879e..69b75d102 100644 --- a/src/engine/model/animmodel.h +++ b/src/engine/model/animmodel.h @@ -582,12 +582,18 @@ extern bool htcmp(const animmodel::shaderparams &x, const animmodel::shaderparam * TODO: clean up and refactor so that hthash is actually here */ template<> -struct std::hash { +struct std::hash +{ std::size_t operator()(animmodel::shaderparams const& s) const noexcept { return hthash(s); } }; +bool operator==(const animmodel::shaderparams& lhs, const animmodel::shaderparams& rhs) +{ + return htcmp(lhs, rhs); +} + /* modelloader * From 3ded74cf1557f4b091c6e74653efd5acc45841f8 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Thu, 8 Sep 2022 10:20:27 +0200 Subject: [PATCH 25/52] moved operator overload definition in .cpp file --- src/engine/model/animmodel.cpp | 5 +++++ src/engine/model/animmodel.h | 6 ++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/engine/model/animmodel.cpp b/src/engine/model/animmodel.cpp index 99bf7b957..1437cd889 100644 --- a/src/engine/model/animmodel.cpp +++ b/src/engine/model/animmodel.cpp @@ -86,6 +86,11 @@ bool htcmp(const animmodel::shaderparams &x, const animmodel::shaderparams &y) return !std::memcmp(&x, &y, sizeof(animmodel::shaderparams)); } +bool operator==(const animmodel::shaderparams& lhs, const animmodel::shaderparams& rhs) +{ + return htcmp(lhs, rhs); +} + //animmodel animmodel::animmodel(const char *name) : model(name) diff --git a/src/engine/model/animmodel.h b/src/engine/model/animmodel.h index 69b75d102..af6240aad 100644 --- a/src/engine/model/animmodel.h +++ b/src/engine/model/animmodel.h @@ -589,10 +589,8 @@ struct std::hash } }; -bool operator==(const animmodel::shaderparams& lhs, const animmodel::shaderparams& rhs) -{ - return htcmp(lhs, rhs); -} +bool operator==(const animmodel::shaderparams& lhs, const animmodel::shaderparams& rhs); + /* modelloader From cd85b3304c3705c0a4edbf47bedd37e397c9f6af Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Thu, 8 Sep 2022 10:28:30 +0200 Subject: [PATCH 26/52] blank slate, reverted changes --- src/engine/model/hitzone.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/engine/model/hitzone.cpp b/src/engine/model/hitzone.cpp index 3cc2a4fc8..fbcd59517 100644 --- a/src/engine/model/hitzone.cpp +++ b/src/engine/model/hitzone.cpp @@ -807,7 +807,7 @@ void skelhitdata::build(skelmodel::skelmeshgroup *g, const uchar *ids) { return; } - std::map infomap; + hashset infomap(256); std::vector info; skelzonebounds *bounds = new skelzonebounds[g->skel->numbones]; numblends = g->blendcombos.size(); @@ -839,8 +839,7 @@ void skelhitdata::build(skelmodel::skelmeshgroup *g, const uchar *ids) } } skelzonekey key(m, t); - infomap.insert_or_assign(key, key); - skelzoneinfo &zi = infomap[key]; + skelzoneinfo &zi = infomap.access(key, key); if(key.blend >= numblends && zi.index < 0) { bounds[key.bones[0]].owner = zi.index = info.size(); @@ -860,19 +859,18 @@ void skelhitdata::build(skelmodel::skelmeshgroup *g, const uchar *ids) continue; } skelzonekey key(i); - infomap.insert_or_assign(key, key); - skelzoneinfo &zi = infomap[key]; + skelzoneinfo &zi = infomap.access(key, key); zi.index = info.size(); info.push_back(&zi); } int leafzones = info.size(); - for(auto &[k, zi] : infomap) + ENUMERATE(infomap, skelzoneinfo, zi, { if(zi.index < 0) { info.push_back(&zi); } - }; + }); for(uint i = leafzones; i < info.size(); i++) { skelzoneinfo &zi = *info[i]; @@ -930,8 +928,7 @@ void skelhitdata::build(skelmodel::skelmeshgroup *g, const uchar *ids) break; } skelzonekey dep(deps.bones[j]); - infomap.insert_or_assign(dep, dep); - skelzoneinfo &zj = infomap[dep]; + skelzoneinfo &zj = infomap.access(dep, dep); zj.parents++; zi.children.push_back(&zj); } From 614929f98273e4b201c4b91512d474484f0f18d7 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 13 Feb 2023 11:10:42 +0100 Subject: [PATCH 27/52] fixed for loop indentations to fit formatting style --- src/engine/interface/console.cpp | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/engine/interface/console.cpp b/src/engine/interface/console.cpp index eed36d784..8e7196449 100644 --- a/src/engine/interface/console.cpp +++ b/src/engine/interface/console.cpp @@ -1174,7 +1174,10 @@ void writebinds(std::fstream& f) { static const char * const cmds[3] = { "bind", "specbind", "editbind" }; std::vector binds; - for(auto &[k, km] : keyms) { binds.push_back(&km); } + for(auto &[k, km] : keyms) + { + binds.push_back(&km); + } std::sort(binds.begin(), binds.end()); for(int j = 0; j < 3; ++j) { @@ -1307,25 +1310,37 @@ void initconsolecmds() static auto clearbinds = [] () { - for(auto &[k, km] : keyms) { km.clear(KeyM::Action_Default); } + for(auto &[k, km] : keyms) + { + km.clear(KeyM::Action_Default); + } }; addcommand("clearbinds", reinterpret_cast(+clearbinds), "", Id_Command); static auto clearspecbinds = [] () { - for(auto &[k, km] : keyms) { km.clear(KeyM::Action_Spectator); } + for(auto &[k, km] : keyms) + { + km.clear(KeyM::Action_Spectator); + } }; addcommand("clearspecbinds", reinterpret_cast(+clearspecbinds), "", Id_Command); static auto cleareditbinds = [] () { - for(auto &[k, km] : keyms) { km.clear(KeyM::Action_Editing); } + for(auto &[k, km] : keyms) + { + km.clear(KeyM::Action_Editing); + } }; addcommand("cleareditbinds", reinterpret_cast(+cleareditbinds), "", Id_Command); static auto clearallbinds = [] () { - for(auto &[k, km] : keyms) { km.clear(); } + for(auto &[k, km] : keyms) + { + km.clear(); + } }; addcommand("clearallbinds", reinterpret_cast(+clearallbinds), "", Id_Command); addcommand("inputcommand", reinterpret_cast(inputcommand), "ssss", Id_Command); From dcab423b91b625856f5d531d85468d305491ce5a Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 13 Feb 2023 11:41:13 +0100 Subject: [PATCH 28/52] fixed code formatting --- src/engine/model/animmodel.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/engine/model/animmodel.cpp b/src/engine/model/animmodel.cpp index 5dad347e6..f892d0bab 100644 --- a/src/engine/model/animmodel.cpp +++ b/src/engine/model/animmodel.cpp @@ -175,7 +175,10 @@ bool animmodel::ShaderParamsKey::checkversion() version = lastversion; if(++lastversion <= 0) { - for(auto& [k, key] : keys) { key.version = -1; } + for(auto& [k, key] : keys) + { + key.version = -1; + } firstversion = 0; lastversion = 1; version = 0; From 47d2638f1ceb0ec980c6492e2cbf0ba26cacdf62 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Wed, 1 Mar 2023 15:24:18 +0100 Subject: [PATCH 29/52] partial commit --- src/engine/render/rendermodel.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/engine/render/rendermodel.cpp b/src/engine/render/rendermodel.cpp index 8c8aa965a..12116cca3 100644 --- a/src/engine/render/rendermodel.cpp +++ b/src/engine/render/rendermodel.cpp @@ -556,11 +556,11 @@ model *loadmodel(const char *name, int i, bool msg) } name = mmi.name; } - model **mm = &models[name]; + auto mm = models.find(name); model *m; - if(mm) + if(mm != models.end()) { - m = *mm; + m = mm->second; } else { @@ -608,12 +608,18 @@ model *loadmodel(const char *name, int i, bool msg) void clear_models() { - for(auto &[k, m] : models) { delete m; } + for(auto &[k, m] : models) + { + delete m; + } } void cleanupmodels() { - for(auto &[k, m] : models) { m->cleanup(); } + for(auto &[k, m] : models) + { + m->cleanup(); + } } static void clearmodel(const char *name) From 90277e35c1ffe330008686de1788504abcfd319f Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Wed, 1 Mar 2023 16:33:28 +0100 Subject: [PATCH 30/52] console.cpp cleanup --- src/engine/interface/console.cpp | 44 ++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/engine/interface/console.cpp b/src/engine/interface/console.cpp index 8e7196449..427e8c0eb 100644 --- a/src/engine/interface/console.cpp +++ b/src/engine/interface/console.cpp @@ -896,8 +896,9 @@ namespace return d; } - hashtable completefiles; - hashtable completions; + std::unordered_map completefiles; + std::unordered_map completions; + int completesize = 0; char *lastcomplete = nullptr; @@ -916,10 +917,10 @@ namespace } if(!dir[0]) { - FilesVal **hasfiles = completions.access(command); - if(hasfiles) + auto hasfilesiterator = completions.find(command); + if(hasfilesiterator == completions.end()) { - *hasfiles = nullptr; + hasfilesiterator->second = nullptr; } return; } @@ -943,25 +944,28 @@ namespace } } FilesKey key(type, dir, ext); - FilesVal **val = completefiles.access(key); - if(!val) + auto valiterator = completefiles.find(key); + FilesVal *val = nullptr; + if(valiterator != completefiles.end()) { + val = valiterator->second; FilesVal *f = new FilesVal(type, dir, ext); if(type==Files_List) { explodelist(dir, f->files); } - val = &completefiles[FilesKey(type, f->dir, f->ext)]; - *val = f; + val = completefiles[FilesKey(type, f->dir, f->ext)]; + val = f; } - FilesVal **hasfiles = completions.access(command); - if(hasfiles) + auto hasfilesiterator = completions.find(command); + FilesVal *hasfiles = nullptr; + if(hasfilesiterator == completions.end()) { - *hasfiles = *val; + hasfiles = val; } else { - completions[newstring(command)] = *val; + completions[command] = val; } } @@ -1002,7 +1006,9 @@ namespace char *end = std::strchr(&s[cmdlen], ' '); if(end) { - f = completions.find(stringslice(&s[cmdlen], end), nullptr); + const char *slice = stringslice(&s[cmdlen], end).str; + auto findf = completions.find(slice); + f = findf->second; } } const char *nextcomplete = nullptr; @@ -1202,18 +1208,18 @@ void writebinds(std::fstream& f) //print to a stream f the listcompletions in the completions filesval void writecompletions(std::fstream& f) { - std::vector cmds; - ENUMERATE_KT(completions, char *, k, FilesVal *, v, + std::vector cmds; + for (auto& [k,v]: completions) { if(v) { - cmds.push_back(k); + cmds.push_back(k.c_str()); } - }); + } std::sort(cmds.begin(), cmds.end()); for(uint i = 0; i < cmds.size(); i++) { - char *k = cmds[i]; + const char *k = cmds[i]; FilesVal *v = completions[k]; if(v->type==Files_List) { From b870a15a5d0829734e74964660fd34f696a42142 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Wed, 1 Mar 2023 16:58:50 +0100 Subject: [PATCH 31/52] added st::hash and operator== for FileVal --- src/engine/interface/console.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/engine/interface/console.cpp b/src/engine/interface/console.cpp index 427e8c0eb..d60fac3bb 100644 --- a/src/engine/interface/console.cpp +++ b/src/engine/interface/console.cpp @@ -25,17 +25,31 @@ struct FilesKey FilesKey() {} FilesKey(int type, const char *dir, const char *ext) : type(type), dir(dir), ext(ext) {} -}; +}; +/* static inline bool htcmp(const FilesKey &x, const FilesKey &y) { return x.type == y.type && !std::strcmp(x.dir, y.dir) && (x.ext == y.ext || (x.ext && y.ext && !std::strcmp(x.ext, y.ext))); } - +*/ +static inline bool operator==(const FilesKey &x, const FilesKey &y) { + return x.type == y.type && !std::strcmp(x.dir, y.dir) && (x.ext == y.ext || (x.ext && y.ext && !std::strcmp(x.ext, y.ext))); +} +/* static inline uint hthash(const FilesKey &k) { return hthash(k.dir); } +*/ +template<> +struct std::hash { + size_t operator()(const FilesKey &k) const noexcept { + return hthash(k.dir); + } +}; + + namespace { From 033064e3d3b3271ed90dea4e6b9ed0b8b93f9ed7 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Wed, 1 Mar 2023 17:31:43 +0100 Subject: [PATCH 32/52] cleaned up octarender.cpp --- src/engine/render/octarender.cpp | 48 ++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/engine/render/octarender.cpp b/src/engine/render/octarender.cpp index bf81a20ab..6936f835d 100644 --- a/src/engine/render/octarender.cpp +++ b/src/engine/render/octarender.cpp @@ -48,7 +48,7 @@ VARFP(filltjoints, 0, 1, 1, rootworld.allchanged()); //eliminate "sparklies" by /* internally relevant functionality */ /////////////////////////////////////// -namespace +namespace { struct vboinfo { @@ -56,7 +56,8 @@ namespace uchar *data; }; - hashtable vbos; + //hashtable vbos; + std::unordered_map vbos; VARFN(vbosize, maxvbosize, 0, 1<<14, 1<<16, rootworld.allchanged()); @@ -76,12 +77,13 @@ namespace void destroyvbo(GLuint vbo) { - vboinfo *exists = vbos.access(vbo); - if(!exists) + //vboinfo *exists = vbos.access(vbo); + auto vbofind = vbos.find(vbo); + if(vbofind == vbos.end()) { return; } - vboinfo &vbi = *exists; + vboinfo &vbi = vbofind->second; if(vbi.uses <= 0) { return; @@ -94,7 +96,7 @@ namespace { delete[] vbi.data; } - vbos.remove(vbo); + vbos.erase(vbo); } } @@ -445,7 +447,8 @@ namespace std::vector grasstris; int worldtris, skytris; std::vector skyindices; - hashtable indices; + //hashtable indices; + std::unordered_map indices; void clear() { @@ -674,20 +677,21 @@ namespace } private: - hashtable decalindices; + std::unordered_map decalindices; + //hashtable decalindices; std::vector texs; std::vector decaltexs; int decaltris; void optimize() { - ENUMERATE_KT(indices, sortkey, k, sortval, t, + for (auto& [k,t] : indices) { if(t.tris.size()) { texs.push_back(k); } - }); + } std::sort(texs.begin(), texs.end(), sortkey::sort); matsurfs.resize(optimizematsurfs(matsurfs.data(), matsurfs.size())); @@ -885,13 +889,13 @@ namespace } } } - ENUMERATE_KT(decalindices, decalkey, k, sortval, t, + for (auto& [k,t] : decalindices) { if(t.tris.size()) { decaltexs.push_back(k); } - }); + } std::sort(texs.begin(), texs.end(), sortkey::sort); } } vc; @@ -1377,13 +1381,20 @@ namespace { axis = 0; } + + struct edgegroup_hash { + size_t operator()(const edgegroup &g) const noexcept + { + return g.slope.x^g.slope.y^g.slope.z^g.origin.x^g.origin.y^g.origin.z; + } + }; inline uint hthash(const edgegroup &g) { return g.slope.x^g.slope.y^g.slope.z^g.origin.x^g.origin.y^g.origin.z; } - inline bool htcmp(const edgegroup &x, const edgegroup &y) + inline bool operator==(const edgegroup &x, const edgegroup &y) { return x.slope==y.slope && x.origin==y.origin; } @@ -1405,7 +1416,8 @@ namespace }; std::vector cubeedges; - hashtable edgegroups(1<<13); + //hashtable edgegroups(1<<13); + std::unordered_map edgegroups; void gencubeedges(cube &c, const ivec &co, int size) { @@ -1483,11 +1495,11 @@ namespace ce.flags = CubeEdge_Start | CubeEdge_End | (e1!=j ? CubeEdge_Flip : 0); ce.next = -1; bool insert = true; - int *exists = edgegroups.access(g); - if(exists) + auto findexists = edgegroups.find(g); + if(findexists != edgegroups.end()) { int prev = -1, - cur = *exists; + cur = findexists->second; while(cur >= 0) { cubeedge &p = cubeedges[cur]; @@ -1532,7 +1544,7 @@ namespace } else { - *exists = cubeedges.size(); + findexists->second = cubeedges.size(); } } } From c5a31b9a6e3cd25c255ca790bb00b5493c1c2b35 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Wed, 1 Mar 2023 17:42:32 +0100 Subject: [PATCH 33/52] octarenderer hash structs and stuff --- src/engine/render/octarender.cpp | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/engine/render/octarender.cpp b/src/engine/render/octarender.cpp index 6936f835d..119f9980e 100644 --- a/src/engine/render/octarender.cpp +++ b/src/engine/render/octarender.cpp @@ -356,10 +356,13 @@ namespace return x == y; } - inline uint hthash(const sortkey &k) - { - return k.tex; - } + struct sortkey_hash { + size_t operator()(const sortkey &k) const noexcept + { + return k.tex; + } + }; + struct decalkey { @@ -422,10 +425,11 @@ namespace return x == y; } - inline uint hthash(const decalkey &k) - { - return k.tex; - } + struct decalkey_hash { + size_t operator()(const decalkey &k) const noexcept{ + return k.tex; + } + }; struct sortval { @@ -448,7 +452,7 @@ namespace int worldtris, skytris; std::vector skyindices; //hashtable indices; - std::unordered_map indices; + std::unordered_map indices; void clear() { @@ -677,7 +681,7 @@ namespace } private: - std::unordered_map decalindices; + std::unordered_map decalindices; //hashtable decalindices; std::vector texs; std::vector decaltexs; @@ -1381,7 +1385,7 @@ namespace { axis = 0; } - + struct edgegroup_hash { size_t operator()(const edgegroup &g) const noexcept { @@ -2480,7 +2484,10 @@ void cubeworld::findtjoints() recalcprogress = 0; gencubeedges(worldroot); tjoints.clear(); - ENUMERATE_KT(edgegroups, edgegroup, g, int, e, ::findtjoints(e, g)); + //ENUMERATE_KT(edgegroups, edgegroup, g, int, e, ::findtjoints(e, g)); + for (auto& [g,e] : edgegroups) { + ::findtjoints(e, g); + } cubeedges.clear(); edgegroups.clear(); } From 8b632287ea74fa2cb573db63beb79b79c97f0c3a Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Wed, 1 Mar 2023 18:06:00 +0100 Subject: [PATCH 34/52] renderlights and renderva cleanup --- src/engine/render/renderlights.cpp | 44 +++++++++++++----------------- src/engine/render/renderva.cpp | 10 ++++--- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/engine/render/renderlights.cpp b/src/engine/render/renderlights.cpp index 1e38278cb..c02c43b1c 100644 --- a/src/engine/render/renderlights.cpp +++ b/src/engine/render/renderlights.cpp @@ -1101,12 +1101,14 @@ struct shadowcachekey shadowcachekey(const lightinfo &l) : o(l.o), radius(l.radius), dir(l.dir), spot(l.spot) {} }; -static inline uint hthash(const shadowcachekey &k) -{ - return hthash(k.o); -} +struct shadowcachekey_hash { + size_t operator()(const shadowcachekey &k) const noexcept + { + return hthash(k.o); + } +}; -static inline bool htcmp(const shadowcachekey &x, const shadowcachekey &y) +inline bool operator==(const shadowcachekey &x, const shadowcachekey &y) { return x.o == y.o && x.radius == y.radius && x.dir == y.dir && x.spot == y.spot; } @@ -1120,22 +1122,12 @@ struct shadowcacheval shadowcacheval(const shadowmapinfo &sm) : x(sm.x), y(sm.y), size(sm.size), sidemask(sm.sidemask) {} }; -struct shadowcache : hashtable -{ - shadowcache() : hashtable(256) {} - - void reset() - { - clear(); - } -}; - static constexpr int shadowcacheevict = 2; GLuint shadowatlastex = 0, shadowatlasfbo = 0; GLenum shadowatlastarget = GL_NONE; -shadowcache shadowcache; +std::unordered_map shadowcache; bool shadowcachefull = false; void cleanupshadowatlas() @@ -1884,7 +1876,7 @@ void calctilesize() void resetlights() { static int evictshadowcache = 0; - shadowcache.reset(); + shadowcache.clear(); if(smcache) { int evictx = ((evictshadowcache%shadowcacheevict)*shadowatlaspacker.w)/shadowcacheevict, @@ -3015,7 +3007,7 @@ void collectlights() smused = 0; - if(smcache && !smnoshadow && shadowcache.numelems) + if(smcache && !smnoshadow && shadowcache.size()) { for(int mismatched = 0; mismatched < 2; ++mismatched) { @@ -3027,11 +3019,13 @@ void collectlights() { continue; } - shadowcacheval *cached = shadowcache.access(l); - if(!cached) + //shadowcacheval *cached = shadowcache.access(l); + auto findcached = shadowcache.find(l); + if(findcached == shadowcache.end()) { continue; } + auto cached = findcached->second; float prec = smprec, lod; int w, h; @@ -3054,7 +3048,7 @@ void collectlights() h *= size; if(mismatched) { - if(cached->size == size) + if(cached.size == size) { continue; } @@ -3068,14 +3062,14 @@ void collectlights() } else { - if(cached->size != size) + if(cached.size != size) { continue; } - ushort x = cached->x, - y = cached->y; + ushort x = cached.x, + y = cached.y; shadowatlaspacker.reserve(x, y, w, h); - addshadowmap(x, y, size, l.shadowmap, idx, cached); + addshadowmap(x, y, size, l.shadowmap, idx, &cached); } smused += w*h; } diff --git a/src/engine/render/renderva.cpp b/src/engine/render/renderva.cpp index e0359fccb..5ee784373 100644 --- a/src/engine/render/renderva.cpp +++ b/src/engine/render/renderva.cpp @@ -1847,7 +1847,7 @@ namespace } shadowverts; std::vector shadowtris[6]; std::vector shadowvbos; - hashtable shadowmeshes; + std::unordered_map shadowmeshes; std::vector shadowdraws; struct shadowdrawinfo @@ -3151,7 +3151,7 @@ void clearshadowmeshes() glDeleteBuffers(shadowvbos.size(), shadowvbos.data()); shadowvbos.clear(); } - if(shadowmeshes.numelems) + if(shadowmeshes.size()) { std::vector &ents = entities::getents(); for(uint i = 0; i < ents.size(); i++) @@ -3191,8 +3191,10 @@ void genshadowmeshes() shadowmesh *findshadowmesh(int idx, const extentity &e) { - shadowmesh *m = shadowmeshes.access(idx); - if(!m || m->type != shadowmapping || m->origin != shadoworigin || m->radius < shadowradius) + //shadowmesh *m = shadowmeshes.access(idx); + auto mm = shadowmeshes.find(idx); + shadowmesh *m = (mm == shadowmeshes.end()) ? &mm->second : nullptr; + if(m == nullptr || m->type != shadowmapping || m->origin != shadoworigin || m->radius < shadowradius) { return nullptr; } From 86eee0be5226c309e4a0a3c720f3e35ac23579a6 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Wed, 1 Mar 2023 18:26:16 +0100 Subject: [PATCH 35/52] fixed the compilation error --- src/engine/render/shader.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/engine/render/shader.cpp b/src/engine/render/shader.cpp index 089e56b97..ecf602437 100644 --- a/src/engine/render/shader.cpp +++ b/src/engine/render/shader.cpp @@ -35,7 +35,6 @@ Shader *nullshader = nullptr, *ldrnotextureshader = nullptr, *stdworldshader = nullptr; -static std::map globalparams; static std::map localparams; static std::unordered_map shaders; static Shader *slotshader = nullptr; From 44f438fc1f195fe5727548ea48ce559d78fc3a90 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Thu, 2 Mar 2023 18:29:28 +0100 Subject: [PATCH 36/52] batch of fixes for console.cpp --- src/engine/interface/console.cpp | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/engine/interface/console.cpp b/src/engine/interface/console.cpp index d60fac3bb..82407e90d 100644 --- a/src/engine/interface/console.cpp +++ b/src/engine/interface/console.cpp @@ -27,21 +27,11 @@ struct FilesKey FilesKey(int type, const char *dir, const char *ext) : type(type), dir(dir), ext(ext) {} }; -/* -static inline bool htcmp(const FilesKey &x, const FilesKey &y) -{ - return x.type == y.type && !std::strcmp(x.dir, y.dir) && (x.ext == y.ext || (x.ext && y.ext && !std::strcmp(x.ext, y.ext))); -} -*/ + static inline bool operator==(const FilesKey &x, const FilesKey &y) { return x.type == y.type && !std::strcmp(x.dir, y.dir) && (x.ext == y.ext || (x.ext && y.ext && !std::strcmp(x.ext, y.ext))); } -/* -static inline uint hthash(const FilesKey &k) -{ - return hthash(k.dir); -} -*/ + template<> struct std::hash { size_t operator()(const FilesKey &k) const noexcept { @@ -308,7 +298,7 @@ namespace } } - std::map keyms; + static std::map keyms; void keymap(int *code, char *key) { @@ -932,7 +922,7 @@ namespace if(!dir[0]) { auto hasfilesiterator = completions.find(command); - if(hasfilesiterator == completions.end()) + if(hasfilesiterator != completions.end()) { hasfilesiterator->second = nullptr; } @@ -960,7 +950,7 @@ namespace FilesKey key(type, dir, ext); auto valiterator = completefiles.find(key); FilesVal *val = nullptr; - if(valiterator != completefiles.end()) + if(valiterator == completefiles.end()) { val = valiterator->second; FilesVal *f = new FilesVal(type, dir, ext); @@ -1087,7 +1077,10 @@ void processtextinput(const char *str, int len) void processkey(int code, bool isdown, int map) { - KeyM *haskey = &keyms[code]; + + auto haskeyiterator = keyms.find(code); + KeyM *haskey = haskeyiterator == keyms.end() ? nullptr : &haskeyiterator->second; + if(haskey && haskey->pressed) { execbind(*haskey, isdown, map); // allow pressed keys to release From 35f5ad347a451a6dbbfb8480f654567f00f58073 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Thu, 2 Mar 2023 18:46:09 +0100 Subject: [PATCH 37/52] batch of fixes or animmodel.cpp/.h --- src/engine/model/animmodel.cpp | 13 ++----------- src/engine/model/animmodel.h | 8 +++----- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/engine/model/animmodel.cpp b/src/engine/model/animmodel.cpp index f96cb5eaf..36d096a2f 100644 --- a/src/engine/model/animmodel.cpp +++ b/src/engine/model/animmodel.cpp @@ -77,19 +77,10 @@ std::unordered_map animmode int animmodel::ShaderParamsKey::firstversion = 0, animmodel::ShaderParamsKey::lastversion = 1; -uint hthash(const animmodel::shaderparams &k) -{ - return memhash(&k, sizeof(k)); -} - -bool htcmp(const animmodel::shaderparams &x, const animmodel::shaderparams &y) -{ - return !std::memcmp(&x, &y, sizeof(animmodel::shaderparams)); -} -bool operator==(const animmodel::shaderparams& lhs, const animmodel::shaderparams& rhs) +bool animmodel::shaderparams::operator==(const animmodel::shaderparams& other) const { - return htcmp(lhs, rhs); + return !std::memcmp(this, &other, sizeof(animmodel::shaderparams)); } //animmodel diff --git a/src/engine/model/animmodel.h b/src/engine/model/animmodel.h index 018d2f40f..e5478431c 100644 --- a/src/engine/model/animmodel.h +++ b/src/engine/model/animmodel.h @@ -48,6 +48,7 @@ class animmodel : public model vec color; shaderparams() : spec(1.0f), gloss(1), glow(3.0f), glowdelta(0), glowpulse(0), fullbright(0), scrollu(0), scrollv(0), alphatest(0.9f), color(1, 1, 1) {} + bool operator==(const shaderparams &other) const; }; @@ -452,6 +453,7 @@ class animmodel : public model static int intersectresult, intersectmode; static float intersectdist, intersectscale; + void render(int anim, int basetime, int basetime2, float pitch, const vec &axis, const vec &forward, dynent *d, modelattach *a); void render(int anim, int basetime, int basetime2, const vec &o, float yaw, float pitch, float roll, dynent *d, modelattach *a, float size, const vec4 &color); @@ -573,8 +575,6 @@ class animmodel : public model static Texture *lasttex, *lastdecal, *lastmasks, *lastnormalmap; }; -extern uint hthash(const animmodel::shaderparams &k); -extern bool htcmp(const animmodel::shaderparams &x, const animmodel::shaderparams &y); /* template specialization for std::hash * needed to have shaderparams as keys for std::unordered_map @@ -584,12 +584,10 @@ template<> struct std::hash { std::size_t operator()(animmodel::shaderparams const& s) const noexcept { - return hthash(s); + return memhash(&s, sizeof(s));; } }; -bool operator==(const animmodel::shaderparams& lhs, const animmodel::shaderparams& rhs); - /* modelloader From 22e2a26b0ce10c0042bb12992bf3ef82cb0a7343 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Thu, 2 Mar 2023 18:52:24 +0100 Subject: [PATCH 38/52] trailing whitespaces --- src/engine/model/animmodel.cpp | 2 +- src/engine/render/octarender.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/model/animmodel.cpp b/src/engine/model/animmodel.cpp index 36d096a2f..7c1c4a213 100644 --- a/src/engine/model/animmodel.cpp +++ b/src/engine/model/animmodel.cpp @@ -73,7 +73,7 @@ Texture *animmodel::lasttex = nullptr, int animmodel::matrixpos = 0; matrix4 animmodel::matrixstack[64]; -std::unordered_map animmodel::ShaderParamsKey::keys; +std::unordered_map animmodel::ShaderParamsKey::keys; int animmodel::ShaderParamsKey::firstversion = 0, animmodel::ShaderParamsKey::lastversion = 1; diff --git a/src/engine/render/octarender.cpp b/src/engine/render/octarender.cpp index 119f9980e..6410cc21f 100644 --- a/src/engine/render/octarender.cpp +++ b/src/engine/render/octarender.cpp @@ -48,7 +48,7 @@ VARFP(filltjoints, 0, 1, 1, rootworld.allchanged()); //eliminate "sparklies" by /* internally relevant functionality */ /////////////////////////////////////// -namespace +namespace { struct vboinfo { From 4d8e1b1b032cd61f4beb2d2072c9b267eb97e5a0 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Thu, 2 Mar 2023 18:59:33 +0100 Subject: [PATCH 39/52] first batch of fixes for octarender.cpp --- src/engine/render/octarender.cpp | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/engine/render/octarender.cpp b/src/engine/render/octarender.cpp index 6410cc21f..43f191ea6 100644 --- a/src/engine/render/octarender.cpp +++ b/src/engine/render/octarender.cpp @@ -56,7 +56,6 @@ namespace uchar *data; }; - //hashtable vbos; std::unordered_map vbos; VARFN(vbosize, maxvbosize, 0, 1<<14, 1<<16, rootworld.allchanged()); @@ -77,7 +76,6 @@ namespace void destroyvbo(GLuint vbo) { - //vboinfo *exists = vbos.access(vbo); auto vbofind = vbos.find(vbo); if(vbofind == vbos.end()) { @@ -1393,12 +1391,7 @@ namespace } }; - inline uint hthash(const edgegroup &g) - { - return g.slope.x^g.slope.y^g.slope.z^g.origin.x^g.origin.y^g.origin.z; - } - - inline bool operator==(const edgegroup &x, const edgegroup &y) + bool operator==(const edgegroup &x, const edgegroup &y) { return x.slope==y.slope && x.origin==y.origin; } @@ -1420,7 +1413,6 @@ namespace }; std::vector cubeedges; - //hashtable edgegroups(1<<13); std::unordered_map edgegroups; void gencubeedges(cube &c, const ivec &co, int size) @@ -2484,7 +2476,6 @@ void cubeworld::findtjoints() recalcprogress = 0; gencubeedges(worldroot); tjoints.clear(); - //ENUMERATE_KT(edgegroups, edgegroup, g, int, e, ::findtjoints(e, g)); for (auto& [g,e] : edgegroups) { ::findtjoints(e, g); } From 705d982637b7da923481ac4e9b9f3bba25c0aded Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Thu, 2 Mar 2023 19:06:21 +0100 Subject: [PATCH 40/52] second batch of fixes for console.cpp --- src/engine/interface/console.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/interface/console.cpp b/src/engine/interface/console.cpp index 82407e90d..acf462af9 100644 --- a/src/engine/interface/console.cpp +++ b/src/engine/interface/console.cpp @@ -963,7 +963,7 @@ namespace } auto hasfilesiterator = completions.find(command); FilesVal *hasfiles = nullptr; - if(hasfilesiterator == completions.end()) + if(hasfilesiterator != completions.end()) { hasfiles = val; } @@ -1012,7 +1012,7 @@ namespace { const char *slice = stringslice(&s[cmdlen], end).str; auto findf = completions.find(slice); - f = findf->second; + f = (findf == completions.end()) ? nullptr : findf->second; } } const char *nextcomplete = nullptr; From 92aca22b77b13c77081d7ed93f49358736780b62 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Thu, 2 Mar 2023 19:10:03 +0100 Subject: [PATCH 41/52] removed unnecessary auto in renderlights.cpp --- src/engine/render/renderlights.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/render/renderlights.cpp b/src/engine/render/renderlights.cpp index c02c43b1c..7abb1627d 100644 --- a/src/engine/render/renderlights.cpp +++ b/src/engine/render/renderlights.cpp @@ -3025,7 +3025,7 @@ void collectlights() { continue; } - auto cached = findcached->second; + shadowcacheval cached = findcached->second; float prec = smprec, lod; int w, h; From 5d4208542298d9f06053a14d7bc31b761f454d3a Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Thu, 2 Mar 2023 19:20:28 +0100 Subject: [PATCH 42/52] corrected insert_or_assign() with a find() and optional insert --- src/engine/render/rendermodel.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/engine/render/rendermodel.cpp b/src/engine/render/rendermodel.cpp index 12116cca3..ea497eeb4 100644 --- a/src/engine/render/rendermodel.cpp +++ b/src/engine/render/rendermodel.cpp @@ -597,7 +597,12 @@ model *loadmodel(const char *name, int i, bool msg) failedmodels.add(newstring(name)); return nullptr; } - models.insert_or_assign(m->name, m); + + auto mm = models.find(m->name); + if (mm == models.end()) + { + models[m->name] = m; + } } if((mapmodels.size() > static_cast(i)) && !mapmodels[i].m) { From fa55b02ed18c8c8278e8bbf66522dd1f6a358403 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Thu, 2 Mar 2023 19:35:56 +0100 Subject: [PATCH 43/52] fixed issues in shader.cpp --- src/engine/render/shader.cpp | 41 +++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/src/engine/render/shader.cpp b/src/engine/render/shader.cpp index ecf602437..ae115f8a1 100644 --- a/src/engine/render/shader.cpp +++ b/src/engine/render/shader.cpp @@ -83,8 +83,13 @@ void loadshaders() Shader *lookupshaderbyname(const char *name) { - Shader *s = &shaders[name]; - return s && s->loaded() ? s : nullptr; + auto ss = shaders.find(name); + if (ss == shaders.end()) + { + return nullptr; + } + Shader *s = &ss->second; + return s->loaded() ? s : nullptr; } Shader *generateshader(const char *name, const char *fmt, ...) @@ -326,7 +331,11 @@ static void linkglslprogram(Shader &s, bool msg = true) int getlocalparam(const char *name) { - localparams.insert_or_assign(name, localparams.size()); + auto findparam = localparams.find(name); + if (findparam == localparams.end()) + { + localparams[name] = localparams.size(); + } return localparams[name]; } @@ -492,7 +501,10 @@ void GlobalShaderParamState::resetversions() } }; nextversion = 0; - for(auto &[k, g] : globalparams) { g.version = ++nextversion; } + for(auto &[k, g] : globalparams) + { + g.version = ++nextversion; + } for(auto &[k, s] : shaders) { for(uint i = 0; i < s.globalparams.size(); i++) @@ -1108,7 +1120,8 @@ static Shader *newshader(int type, const char *name, const char *vs, const char glUseProgram(0); Shader::lastshader = nullptr; } - Shader *exists = &shaders[name]; + auto existsfind = shaders.find(name); + Shader *exists = (existsfind == shaders.end()) ? nullptr : &shaders[name]; char *rname = exists ? exists->name : newstring(name); Shader &s = shaders[rname]; s.name = rname; @@ -1622,11 +1635,12 @@ int Shader::uniformlocversion() */ Shader *useshaderbyname(const char *name) { - Shader *s = &shaders[name]; - if(!s) + auto shaderfind = shaders.find(name); + if(shaderfind == shaders.end()) { return nullptr; } + Shader *s = &shaderfind->second; if(s->deferred()) { s->force(); @@ -1732,17 +1746,17 @@ void variantshader(int *type, char *name, int *row, char *vs, char *ps, int *max //============================================================================== -void setshader(char *name) +void setshader(const char *name) { slotparams.size(); - Shader *s = &shaders[name]; - if(!s) + auto ss = shaders.find(name); + if(ss == shaders.end()) { conoutf(Console_Error, "no such shader: %s", name); } else { - slotshader = s; + slotshader = &ss->second; } } @@ -1906,7 +1920,10 @@ void cleanupshaders() loadedshaders = false; nullshader = hudshader = hudnotextureshader = nullptr; - for(auto &[k, s] : shaders) s.cleanup(); + for(auto &[k, s] : shaders) + { + s.cleanup(); + } Shader::lastshader = nullptr; glUseProgram(0); } From 0febcd74a14614ca670bdead6506a14319af1b6b Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Fri, 3 Mar 2023 16:11:02 +0100 Subject: [PATCH 44/52] fixed a bug - callng size() instead of clear() on a vector to clear it --- src/engine/render/shader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/render/shader.cpp b/src/engine/render/shader.cpp index ae115f8a1..9e88d5e9f 100644 --- a/src/engine/render/shader.cpp +++ b/src/engine/render/shader.cpp @@ -1748,7 +1748,7 @@ void variantshader(int *type, char *name, int *row, char *vs, char *ps, int *max void setshader(const char *name) { - slotparams.size(); + slotparams.clear(); auto ss = shaders.find(name); if(ss == shaders.end()) { @@ -1764,7 +1764,7 @@ void setshader(const char *name) void resetslotshader() { slotshader = nullptr; - slotparams.size(); + slotparams.clear(); } void setslotshader(Slot &s) From 409bd350bb6542ea9e282905ce3aaa1b43a20554 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Fri, 3 Mar 2023 16:12:47 +0100 Subject: [PATCH 45/52] one statement per line, please --- src/engine/interface/ui.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/engine/interface/ui.cpp b/src/engine/interface/ui.cpp index df9255edb..821b8d8d6 100644 --- a/src/engine/interface/ui.cpp +++ b/src/engine/interface/ui.cpp @@ -4387,7 +4387,8 @@ namespace UI { return; } - world->hide(window); windows.erase(name); + world->hide(window); + windows.erase(name); delete window; } windows[name] = new Window(name, contents, onshow, onhide); From 56fb2925d5d8fafc45a972906f7d127db373f560 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Fri, 3 Mar 2023 16:26:33 +0100 Subject: [PATCH 46/52] fixes for rendertext.cpp --- src/engine/render/rendertext.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/engine/render/rendertext.cpp b/src/engine/render/rendertext.cpp index a365b6dfb..092469f99 100644 --- a/src/engine/render/rendertext.cpp +++ b/src/engine/render/rendertext.cpp @@ -189,11 +189,12 @@ static void fontskip(int *n) */ static void fontalias(const char *dst, const char *src) { - font *s = &fonts[src]; - if(!s) + auto ss = fonts.find(src); + if(ss == fonts.end()) { return; } + font *s = &ss->second; font *d = &fonts[dst]; if(!d->name) { @@ -216,11 +217,12 @@ static void fontalias(const char *dst, const char *src) bool setfont(const char *name) { - font *f = &fonts[name]; - if(!f) + auto ff = fonts.find(name); + if(ff == fonts.end()) { return false; } + font *f = &ff->second; curfont = f; return true; } From 20ecbc75814781b4efd80ca3c4347bb67000eace Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Fri, 3 Mar 2023 16:27:47 +0100 Subject: [PATCH 47/52] removed superfluous commented out code --- src/engine/render/renderva.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/engine/render/renderva.cpp b/src/engine/render/renderva.cpp index ba7edc7e8..abdae25be 100644 --- a/src/engine/render/renderva.cpp +++ b/src/engine/render/renderva.cpp @@ -3191,7 +3191,6 @@ void genshadowmeshes() shadowmesh *findshadowmesh(int idx, const extentity &e) { - //shadowmesh *m = shadowmeshes.access(idx); auto mm = shadowmeshes.find(idx); shadowmesh *m = (mm == shadowmeshes.end()) ? &mm->second : nullptr; if(m == nullptr || m->type != shadowmapping || m->origin != shadoworigin || m->radius < shadowradius) From db5c3165ccd40324f1dc1849cccb95b3e26855a8 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Fri, 3 Mar 2023 16:37:14 +0100 Subject: [PATCH 48/52] removed superfluous comments part 2 --- src/engine/render/octarender.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/engine/render/octarender.cpp b/src/engine/render/octarender.cpp index 43f191ea6..adf3c7cfc 100644 --- a/src/engine/render/octarender.cpp +++ b/src/engine/render/octarender.cpp @@ -449,7 +449,6 @@ namespace std::vector grasstris; int worldtris, skytris; std::vector skyindices; - //hashtable indices; std::unordered_map indices; void clear() @@ -680,7 +679,6 @@ namespace private: std::unordered_map decalindices; - //hashtable decalindices; std::vector texs; std::vector decaltexs; int decaltris; From a2f70e14b304fc9514b9734c68d601282ae4ebac Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Fri, 3 Mar 2023 16:38:12 +0100 Subject: [PATCH 49/52] removed hashtables in skelmodel.h/.cpp --- src/engine/model/skelmodel.cpp | 3 ++- src/engine/model/skelmodel.h | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/engine/model/skelmodel.cpp b/src/engine/model/skelmodel.cpp index a242c90a9..e07420046 100644 --- a/src/engine/model/skelmodel.cpp +++ b/src/engine/model/skelmodel.cpp @@ -912,7 +912,8 @@ skelmodel::skelcacheentry &skelmodel::skeleton::checkskelcache(const part * cons int skelmodel::skeleton::getblendoffset(const UniformLoc &u) { - int &offset = blendoffsets.access(Shader::lastshader->program, -1); + auto findoffset = blendoffsets.find(Shader::lastshader->program); + int offset = (findoffset == blendoffsets.end()) ? -1 : findoffset->second; if(offset < 0) { DEF_FORMAT_STRING(offsetname, "%s[%d]", u.name, 2*numgpubones); diff --git a/src/engine/model/skelmodel.h b/src/engine/model/skelmodel.h index 59f63076c..c0c2f776c 100644 --- a/src/engine/model/skelmodel.h +++ b/src/engine/model/skelmodel.h @@ -324,9 +324,9 @@ struct skelmodel : animmodel bool usegpuskel; std::vector skelcache; - hashtable blendoffsets; + std::unordered_map blendoffsets; - skeleton() : name(nullptr), shared(0), bones(nullptr), numbones(0), numinterpbones(0), numgpubones(0), numframes(0), framebones(nullptr), ragdoll(nullptr), usegpuskel(false), blendoffsets(32) + skeleton() : name(nullptr), shared(0), bones(nullptr), numbones(0), numinterpbones(0), numgpubones(0), numframes(0), framebones(nullptr), ragdoll(nullptr), usegpuskel(false), blendoffsets() { } From 78092e7fedd59c993c976a6da0303f41b2200087 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Fri, 3 Mar 2023 17:10:38 +0100 Subject: [PATCH 50/52] removed unused s --- src/engine/interface/console.cpp | 3 +-- src/engine/interface/ui.cpp | 1 - src/engine/render/octarender.cpp | 1 - src/engine/render/rendergl.cpp | 1 - src/engine/render/rendertext.cpp | 1 - src/engine/render/renderva.cpp | 1 - src/engine/render/shader.cpp | 1 - src/engine/render/shaderparam.cpp | 1 - 8 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/engine/interface/console.cpp b/src/engine/interface/console.cpp index acf462af9..09de8a9ea 100644 --- a/src/engine/interface/console.cpp +++ b/src/engine/interface/console.cpp @@ -2,7 +2,6 @@ #include "../libprimis-headers/cube.h" #include "../../shared/stream.h" -#include "../../shared/hashtable.h" #include "console.h" #include "control.h" @@ -35,7 +34,7 @@ static inline bool operator==(const FilesKey &x, const FilesKey &y) { template<> struct std::hash { size_t operator()(const FilesKey &k) const noexcept { - return hthash(k.dir); + return std::hash{}(k.dir); } }; diff --git a/src/engine/interface/ui.cpp b/src/engine/interface/ui.cpp index 821b8d8d6..55293b5a0 100644 --- a/src/engine/interface/ui.cpp +++ b/src/engine/interface/ui.cpp @@ -13,7 +13,6 @@ #include "../../shared/geomexts.h" #include "../../shared/glemu.h" #include "../../shared/glexts.h" -#include "../../shared/hashtable.h" #include "console.h" #include "control.h" diff --git a/src/engine/render/octarender.cpp b/src/engine/render/octarender.cpp index adf3c7cfc..e79487f2a 100644 --- a/src/engine/render/octarender.cpp +++ b/src/engine/render/octarender.cpp @@ -3,7 +3,6 @@ #include "../../shared/geomexts.h" #include "../../shared/glemu.h" #include "../../shared/glexts.h" -#include "../../shared/hashtable.h" #include "grass.h" #include "octarender.h" diff --git a/src/engine/render/rendergl.cpp b/src/engine/render/rendergl.cpp index 227a52359..09cf6b2e5 100644 --- a/src/engine/render/rendergl.cpp +++ b/src/engine/render/rendergl.cpp @@ -11,7 +11,6 @@ #include "../../shared/geomexts.h" #include "../../shared/glemu.h" #include "../../shared/glexts.h" -#include "../../shared/hashtable.h" #include "aa.h" #include "grass.h" diff --git a/src/engine/render/rendertext.cpp b/src/engine/render/rendertext.cpp index 092469f99..ddbf1d55a 100644 --- a/src/engine/render/rendertext.cpp +++ b/src/engine/render/rendertext.cpp @@ -18,7 +18,6 @@ #include "../../shared/geomexts.h" #include "../../shared/glemu.h" #include "../../shared/glexts.h" -#include "../../shared/hashtable.h" #include "rendergl.h" #include "rendertext.h" diff --git a/src/engine/render/renderva.cpp b/src/engine/render/renderva.cpp index abdae25be..6bff02925 100644 --- a/src/engine/render/renderva.cpp +++ b/src/engine/render/renderva.cpp @@ -4,7 +4,6 @@ #include "../../shared/geomexts.h" #include "../../shared/glemu.h" #include "../../shared/glexts.h" -#include "../../shared/hashtable.h" #include "csm.h" #include "grass.h" diff --git a/src/engine/render/shader.cpp b/src/engine/render/shader.cpp index 9e88d5e9f..3fa8ee8b7 100644 --- a/src/engine/render/shader.cpp +++ b/src/engine/render/shader.cpp @@ -4,7 +4,6 @@ #include "../../shared/geomexts.h" #include "../../shared/glemu.h" #include "../../shared/glexts.h" -#include "../../shared/hashtable.h" #include "../../shared/stream.h" #include "octarender.h" diff --git a/src/engine/render/shaderparam.cpp b/src/engine/render/shaderparam.cpp index 451f698b5..b244b14d9 100644 --- a/src/engine/render/shaderparam.cpp +++ b/src/engine/render/shaderparam.cpp @@ -4,7 +4,6 @@ #include "../../shared/geomexts.h" #include "../../shared/glexts.h" #include "../../shared/stream.h" -#include "../../shared/hashtable.h" #include "imagedata.h" #include "octarender.h" From 104f5d2d79f3385f0a73e2e381dfae5e654d76fd Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 6 Mar 2023 10:18:16 +0100 Subject: [PATCH 51/52] hashtavle removed and changed --- src/engine/model/animmodel.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/engine/model/animmodel.h b/src/engine/model/animmodel.h index 9ea0ba49a..027a57186 100644 --- a/src/engine/model/animmodel.h +++ b/src/engine/model/animmodel.h @@ -141,11 +141,12 @@ class animmodel : public model return; } smoothdata *smooth = new smoothdata[numverts]; - hashtable share; + std::unordered_map share; for(int i = 0; i < numverts; ++i) { V &v = verts[i]; - int &idx = share.access(v.pos, i); + auto findidx = share.find(v.pos); + int idx = (findidx == share.end()) ? i : findidx->second; if(idx != i) { smooth[i].next = idx; From e54284ab45bf94c094b8a850fe85a0d1a5ab3960 Mon Sep 17 00:00:00 2001 From: Duskhorn Date: Mon, 6 Mar 2023 10:25:10 +0100 Subject: [PATCH 52/52] removed hashtable; index didn't really need to be a pointer anymore, adjusted accordingly --- src/engine/model/obj.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/engine/model/obj.cpp b/src/engine/model/obj.cpp index 17d37f8c4..77a973ddb 100644 --- a/src/engine/model/obj.cpp +++ b/src/engine/model/obj.cpp @@ -72,7 +72,7 @@ bool obj::objmeshgroup::load(const char *filename, float smooth) numframes = 1; std::vector attrib[3]; char buf[512]; - hashtable verthash(1<<11); + std::unordered_map verthash; std::vector verts; std::vector tcverts; std::vector tris; @@ -185,11 +185,11 @@ bool obj::objmeshgroup::load(const char *filename, float smooth) } c++; } - int *index = verthash.access(vkey); - if(!index) + auto findindex = verthash.find(vkey); + int index = -1; + if(findindex == verthash.end()) { - index = &verthash[vkey]; - *index = verts.size(); + index = verts.size(); verts.emplace_back(); vert &v = verts.back(); v.pos = vkey.x < 0 ? vec(0, 0, 0) : attrib[0][vkey.x]; @@ -199,23 +199,27 @@ bool obj::objmeshgroup::load(const char *filename, float smooth) tcverts.emplace_back(); tcvert &tcv = tcverts.back(); tcv.tc = vkey.y < 0 ? vec2(0, 0) : vec2(attrib[1][vkey.y].x, 1-attrib[1][vkey.y].y); + } else + { + index = findindex->second; } + if(v0 < 0) { - v0 = *index; + v0 = index; } else if(v1 < 0) { - v1 = *index; + v1 = index; } else { tris.emplace_back(); tri &t = tris.back(); - t.vert[0] = static_cast(*index); + t.vert[0] = static_cast(index); t.vert[1] = static_cast(v1); t.vert[2] = static_cast(v0); - v1 = *index; + v1 = index; } } break;