AnimTestbed/3rdparty/ozz-animation/samples/framework/imgui.h

187 lines
8.9 KiB
C++

//----------------------------------------------------------------------------//
// //
// ozz-animation is hosted at http://github.com/guillaumeblanc/ozz-animation //
// and distributed under the MIT License (MIT). //
// //
// Copyright (c) Guillaume Blanc //
// //
// Permission is hereby granted, free of charge, to any person obtaining a //
// copy of this software and associated documentation files (the "Software"), //
// to deal in the Software without restriction, including without limitation //
// the rights to use, copy, modify, merge, publish, distribute, sublicense, //
// and/or sell copies of the Software, and to permit persons to whom the //
// Software is furnished to do so, subject to the following conditions: //
// //
// The above copyright notice and this permission notice shall be included in //
// all copies or substantial portions of the Software. //
// //
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR //
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, //
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL //
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER //
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING //
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER //
// DEALINGS IN THE SOFTWARE. //
// //
//----------------------------------------------------------------------------//
#ifndef OZZ_SAMPLES_FRAMEWORK_IMGUI_H_
#define OZZ_SAMPLES_FRAMEWORK_IMGUI_H_
#include <cstdio>
namespace ozz {
namespace math {
struct RectFloat;
}
namespace sample {
// Interface for immediate mode graphical user interface rendering.
class ImGui {
public:
// Declares a virtual destructor to allow proper destruction.
virtual ~ImGui() {}
// Text justification types.
enum Justification {
kLeft,
kCenter,
kRight,
};
// Begins a new form of size _rect.
// This object uses the RAII mechanism to ensure begin/end symmetry.
// A form is a root in the frame's container stack.
// The _rect argument is relative to the parent's rect and is automatically
// shrunk to fit inside parent's rect and to the size of its widgets.
// Providing a non nullptr _title argument displays a title on top of the form.
// Providing a non nullptr _open argument enables the open/close mechanism.
class Form {
public:
Form(ImGui* _im_gui, const char* _title, const math::RectFloat& _rect,
bool* _open, bool _constrain)
: im_gui_(_im_gui) {
im_gui_->BeginContainer(_title, &_rect, _open, _constrain);
}
~Form() { im_gui_->EndContainer(); }
private:
Form(const Form&); // Forbids copy.
void operator=(const Form&); // Forbids assignment.
ImGui* im_gui_;
};
// Begins a new open-close widget in the parent's rect, ie: a form or an other
// open-close.
// This object uses the RAII mechanism to ensure open/close symmetry.
// Providing a non nullptr _title argument displays a title on top of the
// open-close.
// Providing a non nullptr _open argument enables the open/close mechanism.
class OpenClose {
public:
OpenClose(ImGui* _im_gui, const char* _title, bool* _open)
: im_gui_(_im_gui) {
im_gui_->BeginContainer(_title, nullptr, _open, true);
}
~OpenClose() { im_gui_->EndContainer(); }
private:
OpenClose(const OpenClose&); // Forbids copy.
void operator=(const OpenClose&); // Forbids assignment.
ImGui* im_gui_;
};
// Adds a button to the current context and returns true if it was clicked.
// If _enabled is false then interactions with the button are disabled, and
// rendering is grayed out.
// If _state is not nullptr, then it is used as an in-out parameter to set and
// store button's state. The button can then behave like a check box, with
// a button rendering style.
// It allows for example to
// Returns true is button was clicked.
virtual bool DoButton(const char* _label, bool _enabled = true,
bool* _state = nullptr) = 0;
// Adds a float slider to the current context and returns true if _value was
// modified.
// _value is the in-out parameter that stores slider value. It's clamped
// between _min and _max bounds.
// _pow is used to modify slider's scale. It can be used to give a higher
// precision to low or high values according to _pow.
// If _enabled is false then interactions with the slider are disabled, and
// rendering is grayed out.
// Returns true if _value _value has changed.
virtual bool DoSlider(const char* _label, float _min, float _max,
float* _value, float _pow = 1.f,
bool _enabled = true) = 0;
// Adds an integer slider to the current context and returns true if _value
// was modified.
// _value is the in-out parameter that stores slider value. It's clamped
// between _min and _max bounds.
// _pow is used to modify slider's scale. It can be used to give a higher
// precision to low or high values according to _pow.
// If _enabled is false then interactions with the slider are disabled, and
// rendering is grayed out.
// Returns true if _value _value has changed.
virtual bool DoSlider(const char* _label, int _min, int _max, int* _value,
float _pow = 1.f, bool _enabled = true) = 0;
// Adds a check box to the current context and returns true if it has been
// modified. Used to represent boolean value.
// _state is the in-out parameter that stores check box state.
// If _enabled is false then interactions with the slider are disabled, and
// rendering is grayed out.
// Returns true if _value _state has changed.
virtual bool DoCheckBox(const char* _label, bool* _state,
bool _enabled = true) = 0;
// Adds a radio button to the current context and returns true if it has been
// modified. Used to represent a possible reference _ref value taken by the
// current value _value.
// Displays a "checked" radio button if _ref si equal to th selected _value.
// Returns true if _value _value has changed.
virtual bool DoRadioButton(int _ref, const char* _label, int* _value,
bool _enabled = true) = 0;
// Adds a text label to the current context. Its height depends on the number
// of lines.
// _justification selects the text alignment in the current container.
// if _single_line is true then _label text is cut at the end of the first
// line.
virtual void DoLabel(const char* _label, Justification _justification = kLeft,
bool _single_line = true) = 0;
// Adds a graph widget to the current context.
// Displays values from the right (newest value) to the left (latest).
// The range of value is described by _value_begin, _value_end. _value_cursor
// allows using a linear or circular buffer of values. Set _value_cursor to
// _value_begin to use a linear buffer of range [_value_begin,_value_end[. Or
// set _value_cursor of a circular buffer such that range [_value_cursor,
// _value_end[ and [_value_begin,_value_cursor[ are used.
// All values outside of _min and _max range are clamped.
// If _label is not nullptr then a text is displayed on top of the graph.
virtual void DoGraph(const char* _label, float _min, float _max, float _mean,
const float* _value_cursor, const float* _value_begin,
const float* _value_end) = 0;
private:
// Begins a new container of size _rect.
// Widgets (buttons, sliders...) can only be displayed in a container.
// The rectangles height is the maximum height that the container can use. The
// container automatically shrinks to fit the size of the widgets it contains.
// Providing a non nullptr _title argument displays a title on top of the
// container.
// Providing a nullptr _rect argument means that the container will use all its
// parent size.
// Providing a non nullptr _open argument enables the open/close mechanism.
virtual void BeginContainer(const char* _title, const math::RectFloat* _rect,
bool* _open, bool _constrain) = 0;
// Ends the current container.
virtual void EndContainer() = 0;
};
} // namespace sample
} // namespace ozz
#endif // OZZ_SAMPLES_FRAMEWORK_IMGUI_H_