Ряд слайдеров OpenGL imgui - PullRequest
       46

Ряд слайдеров OpenGL imgui

1 голос
/ 13 октября 2019

У меня есть окно 960x540, которое я создаю с использованием OpenGL. Рендеринг одной текстуры здесь и использование imgui для реализации ползунка, который позволяет мне переводить позиции x, y и z во время выполнения.

int window_width = 960;
int window_height = 540;

window = glfwCreateWindow(window_width, window_height, "Object Oriented OpenGL", NULL, NULL);

Сначала я установил значения ползунка по умолчанию.

glm::vec3 model_matrix_translation(200, 200, 0);

Позже в моем цикле, который отображает положение объектов кадр за кадром, пока окно открыто, я установил параметры ImGui::SliderFloat3 v_min и v_max в качестве размеров моего окна. Похоже, что все 3 ползунка x, y и z используют эти значения, но есть ли способ установить диапазон для каждого ползунка отдельных лиц ? Как вы можете видеть, мой ползунок для оси Y может выйти за пределы 540.

while (!glfwWindowShouldClose(window))
{
    // renderer and other code before this point
    {
        ImGui::SliderFloat3("Model Matrix Translation", &model_matrix_translation.x, 0.0f, 960.0f); 
    }
    ImGui::Render();
    ImGui_ImplGlfwGL3_RenderDrawData(ImGui::GetDrawData());

    glfwSwapBuffers(window); 
    glfwPollEvents();
}

enter image description here

1 Ответ

2 голосов
/ 14 октября 2019

Реализация из SliderFloat3 делегатов SliderScalarN, что реализовано как таковое:

bool ImGui::SliderScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* v_min, const void* v_max, const char* format, float power)
{
    ImGuiWindow* window = GetCurrentWindow();
    if (window->SkipItems)
        return false;

    ImGuiContext& g = *GImGui;
    bool value_changed = false;
    BeginGroup();
    PushID(label);
    PushMultiItemsWidths(components, CalcItemWidth());
    size_t type_size = GDataTypeInfo[data_type].Size;
    for (int i = 0; i < components; i++)
    {
        PushID(i);
        if (i > 0)
            SameLine(0, g.Style.ItemInnerSpacing.x);
        value_changed |= SliderScalar("", data_type, v, v_min, v_max, format, power);
        PopID();
        PopItemWidth();
        v = (void*)((char*)v + type_size);
    }
    PopID();

    const char* label_end = FindRenderedTextEnd(label);
    if (label != label_end)
    {
        SameLine(0, g.Style.ItemInnerSpacing.x);
        TextEx(label, label_end);
    }

    EndGroup();
    return value_changed;
}

Для ваших целей вам потребуетсяиспользуйте модифицированную версию этой функции, которая перемещает v_min и v_max вместе с v, поэтому в вашей измененной функции измените последнюю строку цикла for на:

v = (void*)((char*)v + type_size);
v_min = (void*)((char*)v_min + type_size);
v_max = (void*)((char*)v_max + type_size);

Или просто специализируйтевсю функцию, чтобы взять float* вместо этого, и тогда вы можете просто сделать v++, v_min++, v_max++; вместо.

Наконец, вы можете вызвать вашу модифицированную функцию следующим образом:

float mins[] = {0.0f, 0.0f, 0.0f};
float maxs[] = {960.0f, 540.0f, 0.0f};
MyModifiedSliderFloat3("Model Matrix Translation", &model_matrix_translation.x, mins, maxs);
...