gpt4 book ai didi

c++ - OpenGL imgui slider 范围

转载 作者:行者123 更新时间:2023-11-30 03:13:52 24 4
gpt4 key购买 nike

我有一个使用 OpenGL 创建的 960x540 窗口。在这里渲染一个纹理并使用 imgui实现一个 slider ,让我在运行时转换 x、y 和 z 位置。

int window_width = 960;
int window_height = 540;

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

首先,我设置了 slider 默认值。

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

稍后在只要窗口打开时逐帧渲染对象位置的循环中,我设置了 ImGui::SliderFloat3 v_minv_max 参数是我窗口的尺寸。似乎所有 3 个 slider x、y 和 z 都使用这些值,但是有没有办法为每个单独的 slider 设置一个范围?如您所见,我的 y 轴 slider 可以超过 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

最佳答案

implementation SliderFloat3 委托(delegate)给 SliderScalarN,即 implemented因此:

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_minv_maxv 一起移动,因此在您修改后的函数,将 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);

关于c++ - OpenGL imgui slider 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58366588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com