Nuget Update — Lua 5.4.2
The Nuget Package for Lua did get it’s update to version 5.4.2 (https://www.nuget.org/packages/lua/).
The Nuget Package for Lua did get it’s update to version 5.4.2 (https://www.nuget.org/packages/lua/).
One of the best Xkcd evergreens:
Once again, I had fun.
After my apparently successful presentation at the VisGap 2020 workshop, collocated to the EuroVis/Eurographics 2020, in May, I was now invited to give a short Application Spotlight presentation and the IEEE VIS 2020. I am honored. And, I am looking forward to this opportunity.
Somehow, I never liked GetOpt. I am not convinced by all details of GFlags as well. But, it is the better option than whipping up some CmdLine parser myself.
For the nuget package I focused only on the thread-safe static library. If you need another variant, feel free to reuse my AppVeyor artifacts. Those include basically everything.
As usual, the package code is free: https://bitbucket.org/sgrottel_nuget/gflags_nuget
The community for native library nugets seems not very active. I assume most people use cmake, and have to use some extra scripting for some platform dependent package management, or something. I don’t know. I still like nuget a lot. And so, without further ado: my new Nuget package for LibYAML.
As usual, package code is free: https://bitbucket.org/sgrottel_nuget/libyaml-nuget
I updated the Nuget package for Lua (https://www.nuget.org/packages/lua/).
And I used this opportunity to modernize the package. I no longer use Coapp, but simply write the nuspec and targets file manually.
Let me know if you have any problems with the new package.
I had a nice opportunity to visit academia again. Colleagues from the old times at the university were organizing a workshop at this years EGEV 2020, the VisGap 2020 — The Gap between Visualization Research and Visualization Software — and they invited me to give a cap stone presentation. I was honored by the invite, and luckily, my company agreed to my participation as well.
Now, with our current COVID-19 situation, the conference and the workshop did not take place in Norrköping in Sweden as planned. Instead the whole conference and all workshops were converted to virtual events. As a result attendance was free. And, all sessions are freely available on YouTube. So, if you like to see my talk, be my guest:
Yes, I am still using AntTweakBar. As you might know, the development of AntTweakBar is discontinued. At some point in the future, I will switch. Currently, I consider imgui the best successor. But I haven’t had time to look into imgui. So, when I resurrected an old small tool of mine, it still used ATB, and I did not want to recode all of this. But out of “because-I-can,” I decided to update all dependencies to their newest versions. As a result the ATB integration with GLFW 3 did not work any longer. A couple of callback functions where changed between GLFW 2 and GLFW 3. I ended up rewriting my glue code between those two libraries.
Here it is, if any of you ever come across the same issue. First the callbacks:
static void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) { #ifdef HAS_ANTTWEAK_BAR if (action == GLFW_PRESS || action == GLFW_REPEAT) { int twMod = 0; bool ctrl; if (mods & GLFW_MOD_SHIFT) twMod |= TW_KMOD_SHIFT; if (ctrl = (mods & GLFW_MOD_CONTROL)) twMod |= TW_KMOD_CTRL; if (mods & GLFW_MOD_ALT) twMod |= TW_KMOD_ALT; int twKey = 0; switch (key) { case GLFW_KEY_BACKSPACE: twKey = TW_KEY_BACKSPACE; break; case GLFW_KEY_TAB: twKey = TW_KEY_TAB; break; //case GLFW_KEY_???: twKey = TW_KEY_CLEAR; break; case GLFW_KEY_ENTER: twKey = TW_KEY_RETURN; break; case GLFW_KEY_PAUSE: twKey = TW_KEY_PAUSE; break; case GLFW_KEY_ESCAPE: twKey = TW_KEY_ESCAPE; break; case GLFW_KEY_SPACE: twKey = TW_KEY_SPACE; break; case GLFW_KEY_DELETE: twKey = TW_KEY_DELETE; break; case GLFW_KEY_UP: twKey = TW_KEY_UP; break; case GLFW_KEY_DOWN: twKey = TW_KEY_DOWN; break; case GLFW_KEY_RIGHT: twKey = TW_KEY_RIGHT; break; case GLFW_KEY_LEFT: twKey = TW_KEY_LEFT; break; case GLFW_KEY_INSERT: twKey = TW_KEY_INSERT; break; case GLFW_KEY_HOME: twKey = TW_KEY_HOME; break; case GLFW_KEY_END: twKey = TW_KEY_END; break; case GLFW_KEY_PAGE_UP: twKey = TW_KEY_PAGE_UP; break; case GLFW_KEY_PAGE_DOWN: twKey = TW_KEY_PAGE_DOWN; break; case GLFW_KEY_F1: twKey = TW_KEY_F1; break; case GLFW_KEY_F2: twKey = TW_KEY_F2; break; case GLFW_KEY_F3: twKey = TW_KEY_F3; break; case GLFW_KEY_F4: twKey = TW_KEY_F4; break; case GLFW_KEY_F5: twKey = TW_KEY_F5; break; case GLFW_KEY_F6: twKey = TW_KEY_F6; break; case GLFW_KEY_F7: twKey = TW_KEY_F7; break; case GLFW_KEY_F8: twKey = TW_KEY_F8; break; case GLFW_KEY_F9: twKey = TW_KEY_F9; break; case GLFW_KEY_F10: twKey = TW_KEY_F10; break; case GLFW_KEY_F11: twKey = TW_KEY_F11; break; case GLFW_KEY_F12: twKey = TW_KEY_F12; break; case GLFW_KEY_F13: twKey = TW_KEY_F13; break; case GLFW_KEY_F14: twKey = TW_KEY_F14; break; case GLFW_KEY_F15: twKey = TW_KEY_F15; break; } if (twKey == 0 && ctrl && key < 128) { twKey = key; } if (twKey != 0) { if (::TwKeyPressed(twKey, twMod)) return; } } #endif } static void charCallback(GLFWwindow* window, unsigned int key) { #ifdef HAS_ANTTWEAK_BAR if (::TwKeyPressed(key, 0)) return; #endif } static void mousebuttonCallback(GLFWwindow* window, int button, int action, int mods) { #ifdef HAS_ANTTWEAK_BAR if (::TwEventMouseButtonGLFW(button, action)) return; #endif } static void mousePosCallback(GLFWwindow* window, double xpos, double ypos) { #ifdef HAS_ANTTWEAK_BAR if (::TwEventMousePosGLFW((int)xpos, (int)ypos)) return; #endif } static void mouseScrollCallback(GLFWwindow* window, double xoffset, double yoffset) { #ifdef HAS_ANTTWEAK_BAR static double pos = 0; pos += yoffset; if (::TwEventMouseWheelGLFW((int)pos)) return; #endif } static void resizeCallback(GLFWwindow* window, int width, int height) { #ifdef HAS_ANTTWEAK_BAR ::TwWindowSize(width, height); #endif }
Of course, you can omit the #ifdefs if you don’t care. Add your own codes to the functions after ATB has been handled.
Then, it’s just your typical initialization of GLFW callbacks:
::glfwSetKeyCallback(window, keyCallback); ::glfwSetCharCallback(window, charCallback); ::glfwSetMouseButtonCallback(window, mousebuttonCallback); ::glfwSetCursorPosCallback(window, mousePosCallback); ::glfwSetScrollCallback(window, mouseScrollCallback); ::glfwSetWindowSizeCallback(window, resizeCallback);
Yes, goofy. But, I had a good laugh. In fact, re-reading it while posting here … I was giggling the whole time. Silly. And, at the same time, it might be the vicious satire in a long time.