@@ -196,7 +196,18 @@ void GroundPlane::draw(bool isRedraw) {
196196 double bboxBottom = sign == 1.0 ? std::get<0 >(state::boundingBox)[iP] : std::get<1 >(state::boundingBox)[iP];
197197 double bboxHeight = std::get<1 >(state::boundingBox)[iP] - std::get<0 >(state::boundingBox)[iP];
198198 double heightEPS = state::lengthScale * 1e-4 ;
199- double groundHeight = bboxBottom - sign * (options::groundPlaneHeightFactor.asAbsolute () + heightEPS);
199+
200+ double groundHeight = -777 ;
201+ switch (options::groundPlaneHeightMode) {
202+ case GroundPlaneHeightMode::Relative: {
203+ groundHeight = bboxBottom - sign * (options::groundPlaneHeightFactor.asAbsolute () + heightEPS);
204+ break ;
205+ }
206+ case GroundPlaneHeightMode::Absolute: {
207+ groundHeight = options::groundPlaneHeight;
208+ break ;
209+ }
210+ }
200211
201212 // Viewport
202213 glm::vec4 viewport = render::engine->getCurrentViewport ();
@@ -387,6 +398,16 @@ void GroundPlane::buildGui() {
387398 return " " ;
388399 };
389400
401+ auto heightModeName = [](const GroundPlaneHeightMode& m) -> std::string {
402+ switch (m) {
403+ case GroundPlaneHeightMode::Relative:
404+ return " Relative" ;
405+ case GroundPlaneHeightMode::Absolute:
406+ return " Absolute" ;
407+ }
408+ return " " ;
409+ };
410+
390411 ImGui::SetNextItemOpen (false , ImGuiCond_FirstUseEver);
391412 if (ImGui::TreeNode (" Ground Plane" )) {
392413
@@ -404,7 +425,39 @@ void GroundPlane::buildGui() {
404425 }
405426 ImGui::PopItemWidth ();
406427
407- if (ImGui::SliderFloat (" Height" , options::groundPlaneHeightFactor.getValuePtr (), -1.0 , 1.0 )) requestRedraw ();
428+ // Height
429+ ImGui::PushItemWidth (80 );
430+ switch (options::groundPlaneHeightMode) {
431+ case GroundPlaneHeightMode::Relative:
432+ if (ImGui::SliderFloat (" ##HeightValue" , options::groundPlaneHeightFactor.getValuePtr (), -1.0 , 1.0 ))
433+ requestRedraw ();
434+ break ;
435+ case GroundPlaneHeightMode::Absolute:
436+ int iP;
437+ float sign;
438+ std::tie (iP, sign) = getGroundPlaneAxisAndSign ();
439+ double bboxBottom = sign == 1.0 ? std::get<0 >(state::boundingBox)[iP] : std::get<1 >(state::boundingBox)[iP];
440+ double bboxHeight = std::get<1 >(state::boundingBox)[iP] - std::get<0 >(state::boundingBox)[iP];
441+ if (ImGui::SliderFloat (" ##HeightValue" , &options::groundPlaneHeight, bboxBottom - 0.5 * bboxHeight,
442+ bboxBottom + bboxHeight)) {
443+ requestRedraw ();
444+ }
445+ break ;
446+ }
447+ ImGui::PopItemWidth ();
448+ ImGui::SameLine ();
449+ ImGui::PushItemWidth (100 );
450+ if (ImGui::BeginCombo (" Height##Mode" , heightModeName (options::groundPlaneHeightMode).c_str ())) {
451+ for (GroundPlaneHeightMode m : {GroundPlaneHeightMode::Relative, GroundPlaneHeightMode::Absolute}) {
452+ std::string mName = heightModeName (m);
453+ if (ImGui::Selectable (mName .c_str (), options::groundPlaneHeightMode == m)) {
454+ options::groundPlaneHeightMode = m;
455+ requestRedraw ();
456+ }
457+ }
458+ ImGui::EndCombo ();
459+ }
460+ ImGui::PopItemWidth ();
408461
409462 switch (options::groundPlaneMode) {
410463 case GroundPlaneMode::None:
0 commit comments