You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/ImGui/Code/Include/LYImGuiUtils/HistogramContainer.h

124 lines
5.5 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#ifdef IMGUI_ENABLED
#include <AzCore/std/containers/deque.h>
#include "imgui/imgui.h"
#include <ISystem.h>
namespace ImGui
{
namespace LYImGuiUtils
{
/**
* A small class to help manage values for an ImGui Histogram (ImGui is not managing values itself).
*/
class HistogramContainer
{
public:
HistogramContainer() = default;
~HistogramContainer() = default;
// An Enumeration of different ViewTypes for this histogram
enum class ViewType : AZ::u8
{
FIRST = 0,
Histogram = FIRST,
Lines,
COUNT
};
// Static Type to String function
static const char* ViewTypeToString(ViewType viewType);
//! Horizontal move direction of the histogram when pushing new values.
enum MoveDirection : AZ::u8
{
PushLeftMoveRight = 0, //! Push new values to the front of the buffer, which corresponds to the left side, and make the histogram move to the right.
PushRightMoveLeft = 1, //! Push new values to the back of the buffer, which corresponds to the right side, and make the histogram move to the left.
};
//! Mode determining the min and max values for the visible range of the vertical axis for the histogram.
enum ScaleMode : AZ::u8
{
NoAutoScale = 0, //! Use the min and max values given by Init() as visible range.
AutoExpand = 1, //! Expand scale in case a sample is out of the current bounds. Does only expand the scale but not decrease it back again.
AutoScale = 2, //! Use a running average to expand and shrink the visible range.
};
// Do all of the set up via Init
void Init(const char* histogramName, int maxValueCountSize, ViewType viewType, bool displayOverlays, float minScale, float maxScale,
ScaleMode scaleMode = AutoScale, bool startCollapsed = false, bool drawMostRecentValue = true);
// How many values are in the container currently
int GetSize() { return static_cast<int>(m_values.size()); }
// What is the max size of the container
int GetMaxSize() { return m_maxSize; }
// Push a value to this histogram container
void PushValue(float val);
// Get the last value pushed
float GetLastValue() { return GetValue(static_cast<int>(m_values.size() - 1)); }
// Get a Values at a particular index
float GetValue(int index) { return index < m_values.size() ? m_values.at(index) : 0.0f; }
// Draw this histogram with ImGui
void Draw(float histogramWidth, float histogramHeight);
//! Adjust the scale mode to determine the min and max values for the visible range of the vertical axis for the histogram.
void SetScaleMode(ScaleMode scaleMode) { m_scaleMode = scaleMode; }
//! Adjust the horizontal move direction of the histogram when pushing new values.
void SetMoveDirection(MoveDirection moveDirection) { m_moveDirection = moveDirection; }
//! Calculate the min and maximum values for the present samples.
void CalcMinMaxValues(float& outMin, float& outMax);
//! Set/get color used by either the lines in case ViewType is Lines or bars in case or Histogram.
void SetBarLineColor(const ImColor& color) { m_barLineColor = color; }
ImColor GetBarLineColor() const { return m_barLineColor; }
private:
// Set the Max Size and clear the container
void SetMaxSize(int size);
AZStd::string m_histogramName;
AZStd::deque<float> m_values;
int m_maxSize = 60;
ViewType m_viewType = ViewType::Histogram;
float m_minScale;
float m_maxScale;
MoveDirection m_moveDirection = PushLeftMoveRight; //! Specify if values will be added on the left and the histogram moves right or the other way around.
bool m_dispalyOverlays;
ScaleMode m_scaleMode; //! Determines if the vertical range of the histogram will be manually specified, auto-expanded or automatically scaled based on the samples.
float m_autoScaleSpeed = 0.05f; //! Indicates how fast the min max values and the visible vertical range are adapting to new samples.
ImColor m_barLineColor = ImColor(66, 166, 178); //! Color used by either the lines in case ViewType is Lines or bars in case or Histogram.
bool m_collapsed;
bool m_drawMostRecentValueText;
};
// Getter function lambda. Can be used directly with ImGui if the user would like to skip our cool Draw function and just use the class as a cache
static auto s_histogramContainerGetter = [](void* histContainerPtr, int idx)
{
ImGui::LYImGuiUtils::HistogramContainer* histContainer = static_cast<ImGui::LYImGuiUtils::HistogramContainer*>(histContainerPtr);
if (histContainer != nullptr)
{
return histContainer->GetValue(idx);
}
return 0.0f;
};
}
}
#endif // #ifdef IMGUI_ENABLED