vengi-voxel / vengi

free and open source voxel art tools - editor, thumbnailer and format converter
http://vengi-voxel.github.io/vengi/
Other
1.05k stars 87 forks source link

VOXEDIT: assert triggeres on undo palette change #398

Closed mgerhardy closed 4 months ago

mgerhardy commented 4 months ago

How to reproduce:

ERROR: (0) Stack trace (most recent call last):
ERROR: (0) #31   Source "/home/mgerhardy/dev/engine/src/modules/app/App.cpp", line 153, in startMainLoop
ERROR: (0)         150:     emscripten_set_main_loop(runFrameEmscripten, 0, 1);
ERROR: (0)         151: #else
ERROR: (0)         152:     while (AppState::InvalidAppState != _curState) {
ERROR: (0)       > 153:         onFrame();
ERROR: (0)         154:     }
ERROR: (0)         155: #endif
ERROR: (0)         156:     return _exitCode;
ERROR: (0) #30   Source "/home/mgerhardy/dev/engine/src/modules/app/App.cpp", line 223, in onFrame
ERROR: (0)         220:                 core_trace_scoped(AppOnBeforeRunning);
ERROR: (0)         221:                 onBeforeRunning();
ERROR: (0)         222:             }
ERROR: (0)       > 223:             const AppState state = onRunning();
ERROR: (0)         224:             if (_nextState != AppState::Cleanup && _nextState != AppState::Destroy) {
ERROR: (0)         225:                 _nextState = state;
ERROR: (0)         226:             }
ERROR: (0) #29   Source "/home/mgerhardy/dev/engine/src/tools/voxedit/VoxEdit.cpp", line 513, in onRunning
ERROR: (0)         510: }
ERROR: (0)         511: 
ERROR: (0)         512: app::AppState VoxEdit::onRunning() {
ERROR: (0)       > 513:     app::AppState state = Super::onRunning();
ERROR: (0)         514:     if (state != app::AppState::Running) {
ERROR: (0)         515:         return state;
ERROR: (0)         516:     }
ERROR: (0) #28   Source "/home/mgerhardy/dev/engine/src/modules/ui/IMGUIApp.cpp", line 362, in onRunning
ERROR: (0)         360: app::AppState IMGUIApp::onRunning() {
ERROR: (0)         361:     core_trace_scoped(IMGUIAppOnRunning);
ERROR: (0)       > 362:     app::AppState state = Super::onRunning();
ERROR: (0)         363: 
ERROR: (0)         364:     if (state != app::AppState::Running) {
ERROR: (0)         365:         return state;
ERROR: (0) #27   Source "/home/mgerhardy/dev/engine/src/modules/video/WindowedApp.cpp", line 137, in onRunning
ERROR: (0)         134:         }
ERROR: (0)         135:     }
ERROR: (0)         136:     while (SDL_PollEvent(&event)) {
ERROR: (0)       > 137:         quit |= handleSDLEvent(event);
ERROR: (0)         138:     }
ERROR: (0)         139: 
ERROR: (0)         140:     if (quit) {
ERROR: (0) #26   Source "/home/mgerhardy/dev/engine/src/modules/ui/IMGUIApp.cpp", line 137, in handleSDLEvent
ERROR: (0)         134: }
ERROR: (0)         135: 
ERROR: (0)         136: bool IMGUIApp::handleSDLEvent(SDL_Event &event) {
ERROR: (0)       > 137:     const bool state = Super::handleSDLEvent(event);
ERROR: (0)         138:     if (event.type == SDL_WINDOWEVENT) {
ERROR: (0)         139:         ImGui_ImplSDL2_ProcessEvent(&event);
ERROR: (0)         140:     }
ERROR: (0) #25   Source "/home/mgerhardy/dev/engine/src/modules/video/WindowedApp.cpp", line 93, in handleSDLEvent
ERROR: (0)          90:         // fallthrough
ERROR: (0)          91:     default: {
ERROR: (0)          92:         core_trace_scoped(WindowedAppEventHandler);
ERROR: (0)       >  93:         const bool running = core::Singleton<io::EventHandler>::getInstance().handleEvent(event);
ERROR: (0)          94:         if (!running) {
ERROR: (0)          95:             return true;
ERROR: (0)          96:         }
ERROR: (0) #24   Source "/home/mgerhardy/dev/engine/src/modules/video/EventHandler.cpp", line 60, in handleEvent
ERROR: (0)          57:         keyRelease((int32_t) event.key.keysym.sym, (int16_t) event.key.keysym.mod);
ERROR: (0)          58:         break;
ERROR: (0)          59:     case SDL_KEYDOWN:
ERROR: (0)       >  60:         keyPress((int32_t) event.key.keysym.sym, (int16_t) event.key.keysym.mod);
ERROR: (0)          61:         break;
ERROR: (0)          62:     case SDL_MOUSEMOTION: {
ERROR: (0)          63:         if (event.motion.which == SDL_TOUCH_MOUSEID) {
ERROR: (0) #23   Source "/home/mgerhardy/dev/engine/src/modules/video/EventHandler.cpp", line 340, in keyPress
ERROR: (0)         338: void EventHandler::keyPress(int32_t key, int16_t modifier) {
ERROR: (0)         339:     for (IEventObserver* observer : _observers) {
ERROR: (0)       > 340:         observer->onKeyPress(key, modifier);
ERROR: (0)         341:     }
ERROR: (0)         342: }
ERROR: (0) #22   Source "/home/mgerhardy/dev/engine/src/modules/ui/IMGUIApp.cpp", line 110, in onKeyPress
ERROR: (0)         107: }
ERROR: (0)         108: 
ERROR: (0)         109: bool IMGUIApp::onKeyPress(int32_t key, int16_t modifier) {
ERROR: (0)       > 110:     if (!Super::onKeyPress(key, modifier) ||
ERROR: (0)         111:         (core::bindingContext() == core::BindingContext::UI && key == SDLK_ESCAPE)) {
ERROR: (0)         112:         SDL_Event ev{};
ERROR: (0)         113:         ev.type = SDL_KEYDOWN;
ERROR: (0) #21   Source "/home/mgerhardy/dev/engine/src/modules/video/WindowedApp.cpp", line 241, in onKeyPress
ERROR: (0)         238: }
ERROR: (0)         239: 
ERROR: (0)         240: bool WindowedApp::onKeyPress(int32_t key, int16_t modifier) {
ERROR: (0)       > 241:     return handleKeyPress(key, modifier);
ERROR: (0)         242: }
ERROR: (0)         243: 
ERROR: (0)         244: core::String WindowedApp::getKeyBindingsString(const char *cmd) const {
ERROR: (0) #20   Source "/home/mgerhardy/dev/engine/src/modules/video/WindowedApp.cpp", line 210, in handleKeyPress
ERROR: (0)         207: }
ERROR: (0)         208: 
ERROR: (0)         209: bool WindowedApp::handleKeyPress(int32_t key, int16_t modifier, uint16_t count) {
ERROR: (0)       > 210:     return _keybindingHandler.execute(key, modifier, true, nowSeconds(), count);
ERROR: (0)         211: }
ERROR: (0)         212: 
ERROR: (0)         213: bool WindowedApp::onMouseWheel(int32_t x, int32_t y) {
ERROR: (0) #19   Source "/home/mgerhardy/dev/engine/src/modules/util/KeybindingHandler.cpp", line 468, in execute
ERROR: (0)         465:                 }
ERROR: (0)         466:             }
ERROR: (0)         467:         }
ERROR: (0)       > 468:         const bool retVal = executeCommands(key, modifier, nowSeconds, count);
ERROR: (0)         469:         if (retVal) {
ERROR: (0)         470:             _pressedModifierMask |= (uint32_t)code;
ERROR: (0)         471:         }
ERROR: (0) #18   Source "/home/mgerhardy/dev/engine/src/modules/util/KeybindingHandler.cpp", line 110, in executeCommands
ERROR: (0)         108: bool KeyBindingHandler::executeCommands(int32_t key, int16_t modifier, double nowSeconds, uint16_t count) {
ERROR: (0)         109:     // first try to find an exact match of key and current held modifiers
ERROR: (0)       > 110:     if (executeCommandsForBinding(_bindings, key, modifier, nowSeconds, count)) {
ERROR: (0)         111:         return true;
ERROR: (0)         112:     }
ERROR: (0)         113:     // if no such exact match was found, try to remove those modifiers that should be ignored because they e.g. have their own bound command
ERROR: (0) #17   Source "/home/mgerhardy/dev/engine/src/modules/util/KeybindingHandler.cpp", line 98, in executeCommandsForBinding
ERROR: (0)          95:             Log::trace("Failed to execute the tracking command %s", command.c_str());
ERROR: (0)          96:             continue;
ERROR: (0)          97:         }
ERROR: (0)       >  98:         if (command::Command::execute(command)) {
ERROR: (0)          99:             Log::trace("The command was executed");
ERROR: (0)         100:             handled = true;
ERROR: (0)         101:         } else {
ERROR: (0) #16   Source "/home/mgerhardy/dev/engine/src/modules/command/Command.cpp", line 154, in execute
ERROR: (0)         151:             args.push_back(commandTokenizer.next());
ERROR: (0)         152:             Log::trace("arg: '%s'", args.back().c_str());
ERROR: (0)         153:         }
ERROR: (0)       > 154:         if (execute(c, args)) {
ERROR: (0)         155:             ++executed;
ERROR: (0)         156:         }
ERROR: (0)         157:     }
ERROR: (0) #15   Source "/home/mgerhardy/dev/engine/src/modules/command/Command.cpp", line 195, in execute
ERROR: (0)         192:         cmd = i->second;
ERROR: (0)         193:     }
ERROR: (0)         194:     Log::trace("execute %s with %i arguments", command.c_str(), (int)args.size());
ERROR: (0)       > 195:     cmd._func(args);
ERROR: (0)         196:     return true;
ERROR: (0)         197: }
ERROR: (0) #14   Source "/usr/include/c++/13/bits/std_function.h", line 591, in operator()
ERROR: (0)         588:       {
ERROR: (0)         589:     if (_M_empty())
ERROR: (0)         590:       __throw_bad_function_call();
ERROR: (0)       > 591:     return _M_invoker(_M_functor, std::forward<_ArgTypes>(__args)...);
ERROR: (0)         592:       }
ERROR: (0)         593: 
ERROR: (0)         594: #if __cpp_rtti
ERROR: (0) #13   Source "/usr/include/c++/13/bits/std_function.h", line 290, in _M_invoke
ERROR: (0)         287:       static _Res
ERROR: (0)         288:       _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
ERROR: (0)         289:       {
ERROR: (0)       > 290:     return std::__invoke_r<_Res>(*_Base::_M_get_pointer(__functor),
ERROR: (0)         291:                      std::forward<_ArgTypes>(__args)...);
ERROR: (0)         292:       }
ERROR: (0) #12   Source "/usr/include/c++/13/bits/invoke.h", line 111, in __invoke_r<void, voxedit::SceneManager::construct()::<lambda(const command::CmdArgs&)>&, const core::DynamicArray<core::String, 32>&>
ERROR: (0)         108:       using __type = typename __result::type;
ERROR: (0)         109:       using __tag = typename __result::__invoke_type;
ERROR: (0)         110:       if constexpr (is_void_v<_Res>)
ERROR: (0)       > 111:     std::__invoke_impl<__type>(__tag{}, std::forward<_Callable>(__fn),
ERROR: (0)         112:                     std::forward<_Args>(__args)...);
ERROR: (0)         113:       else
ERROR: (0)         114:     return std::__invoke_impl<__type>(__tag{},
ERROR: (0) #11   Source "/usr/include/c++/13/bits/invoke.h", line 61, in __invoke_impl<void, voxedit::SceneManager::construct()::<lambda(const command::CmdArgs&)>&, const core::DynamicArray<core::String, 32>&>
ERROR: (0)          58:   template<typename _Res, typename _Fn, typename... _Args>
ERROR: (0)          59:     constexpr _Res
ERROR: (0)          60:     __invoke_impl(__invoke_other, _Fn&& __f, _Args&&... __args)
ERROR: (0)       >  61:     { return std::forward<_Fn>(__f)(std::forward<_Args>(__args)...); }
ERROR: (0)          62: 
ERROR: (0)          63:   template<typename _Res, typename _MemFun, typename _Tp, typename... _Args>
ERROR: (0)          64:     constexpr _Res
ERROR: (0) #10   Source "/home/mgerhardy/dev/engine/src/tools/voxedit/modules/voxedit-util/SceneManager.cpp", line 1951, in operator()
ERROR: (0)        1948:     }).setHelp("Cut selection");
ERROR: (0)        1949: 
ERROR: (0)        1950:     command::Command::registerCommand("undo", [&] (const command::CmdArgs& args) {
ERROR: (0)       >1951:         undo();
ERROR: (0)        1952:     }).setHelp("Undo your last step");
ERROR: (0)        1953: 
ERROR: (0)        1954:     command::Command::registerCommand("redo", [&] (const command::CmdArgs& args) {
ERROR: (0) #9    Source "/home/mgerhardy/dev/engine/src/tools/voxedit/modules/voxedit-util/SceneManager.cpp", line 985, in undo
ERROR: (0)         982: bool SceneManager::undo(int n) {
ERROR: (0)         983:     Log::debug("undo %i steps", n);
ERROR: (0)         984:     for (int i = 0; i < n; ++i) {
ERROR: (0)       > 985:         if (!doUndo()) {
ERROR: (0)         986:             return false;
ERROR: (0)         987:         }
ERROR: (0)         988:     }
ERROR: (0) #8    Source "/home/mgerhardy/dev/engine/src/tools/voxedit/modules/voxedit-util/SceneManager.cpp", line 1008, in doUndo
ERROR: (0)        1005:         return false;
ERROR: (0)        1006:     }
ERROR: (0)        1007: 
ERROR: (0)       >1008:     const MementoState& s = _mementoHandler.undo();
ERROR: (0)        1009:     return mementoStateExecute(s, false);
ERROR: (0)        1010: }
ERROR: (0) #7    Source "/home/mgerhardy/dev/engine/src/tools/voxedit/modules/voxedit-util/MementoHandler.cpp", line 323, in undo
ERROR: (0)         320:     const MementoState& s = state();
ERROR: (0)         321:     --_statePosition;
ERROR: (0)         322:     if (s.type == MementoType::Modification) {
ERROR: (0)       > 323:         return undoModification(s);
ERROR: (0)         324:     } else if (s.type == MementoType::SceneNodeTransform) {
ERROR: (0)         325:         return undoTransform(s);
ERROR: (0)         326:     } else if (s.type == MementoType::SceneNodePaletteChanged) {
ERROR: (0) #6    Source "/home/mgerhardy/dev/engine/src/tools/voxedit/modules/voxedit-util/MementoHandler.cpp", line 254, in undoModification
ERROR: (0)         251:                             s.nodeType, s.region,   s.pivot,    s.worldMatrix, s.keyFrameIdx};
ERROR: (0)         252:         }
ERROR: (0)         253:     }
ERROR: (0)       > 254:     core_assert(_states[0].type == MementoType::Modification);
ERROR: (0)         255:     return _states[0];
ERROR: (0)         256: }
ERROR: (0) #5    Source "/home/mgerhardy/dev/engine/src/modules/core/Assert.cpp", line 34, in core_report_assert
ERROR: (0)          31: }
ERROR: (0)          32: 
ERROR: (0)          33: bool core_report_assert(AssertData &data, const char *file, int line, const char *function) {
ERROR: (0)       >  34:     const SDL_AssertState state = SDL_ReportAssertion((SDL_AssertData *)&data, function, file, line);
ERROR: (0)          35:     if (state == SDL_ASSERTION_RETRY) {
ERROR: (0)          36:         return true;
ERROR: (0)          37:     }
ERROR: (0) #4    Object "/usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.2800.5", at 0x7fb8e00f1c4b, in 
ERROR: (0) #3    Source "/home/mgerhardy/dev/engine/src/modules/core/Assert.cpp", line 20, in coreAssertionHandler
ERROR: (0)          18: static SDL_assert_state coreAssertionHandler(const SDL_assert_data *data, void *userdata) {
ERROR: (0)          19:     if (data->trigger_count <= 1 && data->always_ignore == 0) {
ERROR: (0)       >  20:         core_stacktrace();
ERROR: (0)          21:     }
ERROR: (0)          22:     const SDL_AssertState state = SDL_GetDefaultAssertionHandler()(data, userdata);
ERROR: (0)          23:     if (state == SDL_ASSERTION_RETRY) {
ERROR: (0) #2    Source "/home/mgerhardy/dev/engine/src/modules/core/Assert.cpp", line 80, in core_stacktrace
ERROR: (0)          77: #else
ERROR: (0)          78:     std::ostringstream os;
ERROR: (0)          79:     backward::StackTrace st;
ERROR: (0)       >  80:     st.load_here(32);
ERROR: (0)          81:     backward::Printer printer;
ERROR: (0)          82:     printer.print(st, os);
ERROR: (0)          83:     std::string str = os.str();
ERROR: (0) #1    Source "/home/mgerhardy/dev/engine/contrib/libs/backward/backward.h", line 879, in load_here
ERROR: (0)         876:       return 0;
ERROR: (0)         877:     }
ERROR: (0)         878:     _stacktrace.resize(depth);
ERROR: (0)       > 879:     size_t trace_cnt = details::unwind(callback(*this), depth);
ERROR: (0)         880:     _stacktrace.resize(trace_cnt);
ERROR: (0)         881:     skip_n_firsts(0);
ERROR: (0)         882:     return size();
ERROR: (0) #0    Source "/home/mgerhardy/dev/engine/contrib/libs/backward/backward.h", line 861, in unwind<backward::StackTraceImpl<backward::system_tag::linux_tag>::callback>
ERROR: (0)         859: template <typename F> size_t unwind(F f, size_t depth) {
ERROR: (0)         860:   Unwinder<F> unwinder;
ERROR: (0)       > 861:   return unwinder(f, depth);
ERROR: (0)         862: }
ERROR: (0)         863: 
ERROR: (0)         864: } // namespace details
WARN: 

Assertion failure at undoModification (/home/mgerhardy/dev/engine/src/tools/voxedit/modules/voxedit-util/MementoHandler.cpp:254), triggered 1 time:
  '_states[0].type == MementoType::Modification'
mgerhardy commented 4 months ago

b6aa82b437ccb336124525a740edcd3dcf57317f and d08fd6a77fe930f5695be259ac4759260086471b might have fixed the problem