bool SliderSize(const std::string& label, size_t* v, size_t v_min, size_t v_max, float power) { CHECK_NOTNULL_F(v); float v_float = *v; bool changed = ImGui::SliderFloat(label.c_str(), &v_float, static_cast<float>(v_min), static_cast<float>(v_max), "%.0f", power); if (changed) { *v = static_cast<size_t>(std::round(v_float)); *v = std::max(*v, v_min); *v = std::min(*v, v_max); } return changed; }
bool Combo(const std::string& label, std::string* current_item, const std::vector<std::string>& items, int height_in_items) { CHECK_NOTNULL_F(current_item); std::vector<const char*> items_c_str; items_c_str.reserve(items.size()); int current_item_index = -1; for (int i = 0; i < items.size(); ++i) { items_c_str.push_back(items[i].c_str()); if (items[i] == *current_item) { current_item_index = i; } } if (ImGui::Combo(label.c_str(), ¤t_item_index, items_c_str.data(), (int)items.size(), height_in_items)) { CHECK_F(0 <= current_item_index && current_item_index < items.size()); *current_item = items[current_item_index]; return true; } else { return false; } }
void init_glew() { #if !GLLIB_GLES #ifndef GLEW_OK # error "No GLEW!" #endif static bool s_initialized = false; if (s_initialized) { return; } s_initialized = true; LOG_SCOPE_FUNCTION(INFO); CHECK_FOR_GL_ERROR; glewExperimental = true; GLenum glewErr = glewInit(); CHECK_F(glewErr == GLEW_OK, "Failed to initialize GLEW: %s", glewGetErrorString(glewErr)); glGetError(); // glew sometimes produces faux GL_INVALID_ENUM CHECK_FOR_GL_ERROR; CHECK_NOTNULL_F(glCreateProgram); char gl_version_string[64]; snprintf(gl_version_string, sizeof(gl_version_string) - 1, "GL_VERSION_%d_%d", GLLIB_OPENGL_VERSION / 100, (GLLIB_OPENGL_VERSION / 10) % 10); CHECK_F(glewIsSupported(gl_version_string), "Not supported: %s", gl_version_string); // CHECK_F(glewIsSupported("GL_VERSION_3_2")); if (glDebugMessageCallbackARB) { LOG_F(INFO, "ARB_debug_output supported"); glDebugMessageCallbackARB( on_gl_error, nullptr ); glEnable( GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB ); } else { LOG_F(INFO, "ARB_debug_output not supported"); } #endif // !GLLIB_GLES CHECK_FOR_GL_ERROR; }
int main(int argc, char* argv[]) { if (argc > 1 && argv[1] == std::string("test")) { return main_test(argc, argv); } loguru::init(argc, argv); // auto verbose_type_name = loguru::demangle(typeid(std::ofstream).name()); // loguru::add_stack_cleanup(verbose_type_name.c_str(), "std::ofstream"); // std::ofstream os; // die(os); if (argc == 1) { loguru::add_file("latest_readable.log", loguru::Truncate, loguru::Verbosity_INFO); loguru::add_file("everything.log", loguru::Append, loguru::Verbosity_MAX); LOG_F(INFO, "Loguru test"); test_thread_names(); test_scopes(); test_levels(); test_stream(); } else { std::string test = argv[1]; if (test == "ABORT_F") { ABORT_F("ABORT_F format message"); } else if (test == "ABORT_S") { ABORT_S() << "ABORT_S stream message"; } else if (test == "assert") { const char* ptr = 0; assert(ptr && "Error that was unexpected"); } else if (test == "LOG_F(FATAL)") { LOG_F(FATAL, "Fatal format message"); } else if (test == "LOG_S(FATAL)") { LOG_S(FATAL) << "Fatal stream message"; } else if (test == "CHECK_NOTNULL_F") { const char* ptr = 0; CHECK_NOTNULL_F(ptr); } else if (test == "CHECK_F") { CHECK_F(1 > 2); } else if (test == "CHECK_EQ_F") { CHECK_EQ_F(always_increasing(), 0); CHECK_EQ_F(always_increasing(), 1); CHECK_EQ_F(always_increasing(), 42); } else if (test == "CHECK_EQ_F_int") { int x = 42; CHECK_EQ_F(x, x + 1); } else if (test == "CHECK_EQ_F_unsigned") { unsigned x = 42; CHECK_EQ_F(x, x + 1); } else if (test == "CHECK_EQ_F_size_t") { size_t x = 42; CHECK_EQ_F(x, x + 1); } else if (test == "CHECK_EQ_F_message") { CHECK_EQ_F(always_increasing(), 0, "Should pass"); CHECK_EQ_F(always_increasing(), 1, "Should pass"); CHECK_EQ_F(always_increasing(), 42, "Should fail"); } else if (test == "CHECK_EQ_S") { std::string str = "right"; CHECK_EQ_S(str, "wrong") << "Expected to fail, since `str` isn't \"wrong\" but \"" << str << "\""; } else if (test == "CHECK_LT_S") { CHECK_EQ_S(always_increasing(), 0); CHECK_EQ_S(always_increasing(), 1); CHECK_EQ_S(always_increasing(), 42); } else if (test == "CHECK_LT_S_message") { CHECK_EQ_S(always_increasing(), 0) << "Should pass"; CHECK_EQ_S(always_increasing(), 1) << "Should pass"; CHECK_EQ_S(always_increasing(), 42) << "Should fail!"; } else if (test == "deep_abort") { deep_abort_10({"deep_abort"}); } else if (test == "SIGSEGV") { test_SIGSEGV_2(); } else if (test == "hang") { test_hang_2(); } else { LOG_F(ERROR, "Unknown test: '%s'", test.c_str()); } } }