void DemoScene::RenderPanel_ControlsTab()

in agdk/game_controller/common/demo_scene.cpp [480:578]


void DemoScene::RenderPanel_ControlsTab(const int32_t controllerIndex,
                                        const Paddleboat_Controller_Data &controllerData,
                                        const Paddleboat_Controller_Info &controllerInfo) {
    const uint32_t layout = controllerInfo.controllerFlags & PADDLEBOAT_CONTROLLER_LAYOUT_MASK;
    if (layout == PADDLEBOAT_CONTROLLER_LAYOUT_ARCADE_STICK) {
        RenderPanel_ControlsTab_ArcadeStick(controllerIndex, controllerData,
                                            controllerInfo);
        return;
    }

    if ((controllerInfo.controllerFlags & PADDLEBOAT_CONTROLLER_FLAG_VIRTUAL_MOUSE) != 0) {
        ImGui::Text(" Ptr X: %.0f Y: %.0f ", controllerData.virtualPointer.pointerX,
                    controllerData.virtualPointer.pointerY);
        if ((controllerInfo.controllerFlags & PADDLEBOAT_CONTROLLER_FLAG_TOUCHPAD) != 0) {
            bool touchpadDown = ((controllerData.buttonsDown & PADDLEBOAT_BUTTON_TOUCHPAD) !=
                                 0);
            ImVec4 touchpadColor = touchpadDown ? TEXTCOLOR_GREEN : TEXTCOLOR_GREY;
            ImGui::SameLine();
            ImGui::TextColored(touchpadColor, "Touchpad down");
        }
    }
    ConfigureButtonLayout(layout);
    mControllerPanelBaseY = ImGui::GetCursorPosY();

    ControllerUIPanelParams panelParams{mControllerPanelBaseX, mControllerPanelBaseY,
                                        mControllerPanelScale};

    // Buttons
    for (uint32_t index = UIBUTTON_A; index < UIBUTTON_COUNT; ++index) {
        const ControllerUIButtons buttonId = static_cast<const ControllerUIButtons>(index);
        ControllerButtonInfo buttonInfo = ControllerUIData::getControllerButtonInfo(buttonId);
        buttonInfo.buttonState = (controllerData.buttonsDown & buttonInfo.buttonMask)
                                 ? UIBUTTON_STATE_ACTIVE
                                 : UIBUTTON_STATE_IDLE;
        if (buttonInfo.enabled) {
            ControllerUIUtil::Button(panelParams, buttonId, buttonInfo);
        }
    }

    // Thumbsticks
    const float stickFlatLX = fmax(FLT_MIN, controllerInfo.leftStickPrecision.stickFlatX);
    const float stickFlatLY = fmax(FLT_MIN, controllerInfo.leftStickPrecision.stickFlatY);
    const float stickFlatRX = fmax(FLT_MIN, controllerInfo.rightStickPrecision.stickFlatX);
    const float stickFlatRY = fmax(FLT_MIN, controllerInfo.rightStickPrecision.stickFlatY);
    ControllerUIStickStates leftStickState = UISTICK_STATE_IDLE;
    ControllerUIStickStates rightStickState = UISTICK_STATE_IDLE;

    if (controllerData.buttonsDown & PADDLEBOAT_BUTTON_L3) {
        leftStickState = UISTICK_STATE_DEPRESSED;
    } else if (fabsf(controllerData.leftStick.stickX) > stickFlatLX ||
               fabsf(controllerData.leftStick.stickY) > stickFlatLY) {
        leftStickState = UISTICK_STATE_ACTIVE;
    }

    if (controllerData.buttonsDown & PADDLEBOAT_BUTTON_R3) {
        rightStickState = UISTICK_STATE_DEPRESSED;
    } else if (fabsf(controllerData.rightStick.stickX) > stickFlatRX ||
               fabsf(controllerData.rightStick.stickY) > stickFlatRY) {
        rightStickState = UISTICK_STATE_ACTIVE;
    }

    float leftX = controllerData.leftStick.stickX;
    float leftY = controllerData.leftStick.stickY;
    float rightX = controllerData.rightStick.stickX;
    float rightY = controllerData.rightStick.stickY;
    // Unless overridden, set the stick X/Y to 0.0 if it's in the
    // center deadzone
    if (mDontTrimDeadzone == false && leftStickState == UISTICK_STATE_IDLE) {
        leftX = 0.0f;
        leftY = 0.0f;
    }
    if (mDontTrimDeadzone == false && rightStickState == UISTICK_STATE_IDLE) {
        rightX = 0.0f;
        rightY = 0.0f;
    }

    const float stickScale = ControllerUIData::getStickScale();
    ImVec2 leftStickValues(leftX * stickScale,
                           leftY * stickScale);
    ImVec2 rightStickValues(rightX * stickScale,
                            rightY * stickScale);

    ControllerUIUtil::Thumbstick(panelParams, ControllerUIData::getStickPosition(true),
                                 leftStickValues, leftStickState);
    ControllerUIUtil::Thumbstick(panelParams, ControllerUIData::getStickPosition(false),
                                 rightStickValues, rightStickState);

    // Trigger fill bars
    const float windowStartY = NativeEngine::GetInstance()->GetSystemBarOffset();
    ImDrawList *draw_list = ImGui::GetWindowDrawList();
    ControllerUIUtil::TriggerBar(panelParams, draw_list, UIBUTTON_L1, controllerData.triggerL1,
                                 windowStartY);
    ControllerUIUtil::TriggerBar(panelParams, draw_list, UIBUTTON_L2, controllerData.triggerL2,
                                 windowStartY);
    ControllerUIUtil::TriggerBar(panelParams, draw_list, UIBUTTON_R1, controllerData.triggerR1,
                                 windowStartY);
    ControllerUIUtil::TriggerBar(panelParams, draw_list, UIBUTTON_R2, controllerData.triggerR2,
                                 windowStartY);
}