// // Copyright 2013 Pixar // // Licensed under the Apache License, Version 2.0 (the "Apache License") // with the following modification; you may not use this file except in // compliance with the Apache License and the following modification to it: // Section 6. Trademarks. is deleted and replaced with: // // 6. Trademarks. This License does not grant permission to use the trade // names, trademarks, service marks, or product names of the Licensor // and its affiliates, except as required to comply with Section 4(c) of // the License and to reproduce the content of the NOTICE file. // // You may obtain a copy of the Apache License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the Apache License with the above modification is // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the Apache License for the specific // language governing permissions and limitations under the Apache License. // #ifndef HUD_H #define HUD_H #include #include #include #include #include #define OSD_HUD_USE_FUNCTION_POINTERS (__cplusplus <= 199711L) #if !OSD_HUD_USE_FUNCTION_POINTERS #include #endif #include "hud.h" class Hud { public: #if OSD_HUD_USE_FUNCTION_POINTERS typedef void (*RadioButtonCallback)(int c); typedef void (*CheckBoxCallback)(bool checked, int data); typedef void (*SliderCallback)(float value, int data); typedef void (*PullDownCallback)(int value); #else typedef std::function RadioButtonCallback; typedef std::function CheckBoxCallback; typedef std::function SliderCallback; typedef std::function PullDownCallback; #endif Hud(); virtual ~Hud(); virtual void Init(int width, int height, int framebufferWidth, int framebufferHeight); virtual void Rebuild(int width, int height, int framebufferWidth, int framebufferHeight); virtual bool Flush(); bool IsVisible() const; void SetVisible(bool visible); void DrawString(int x, int y, const char *fmt, ...); void DrawString(int x, int y, float r, float g, float b, const char *fmt, ...); void Clear(); void AddLabel(const char *label, int x, int y); void AddRadioButton(int group, const char *label, bool checked, int x, int y, RadioButtonCallback callback=0, int data=0, int shortcut=0); void AddCheckBox(const char *label, bool checked, int x, int y, CheckBoxCallback callback=0, int data=0, int shortcut=0); void AddSlider(const char *label, float min, float max, float value, int x, int y, int width, bool intStep, SliderCallback callback=0, int data=0); int AddPullDown(const char *label, int x, int y, int width, PullDownCallback callback=0, int shortcut=0); void AddPullDownButton(int handle, const char *label, int value, bool checked=false); bool KeyDown(int key); bool MouseClick(int x, int y); bool MouseCapture() const; void MouseRelease(); void MouseMotion(int x, int y); int GetWidth() const; int GetHeight() const; protected: struct Item { int x, y, w, h; std::string label; }; struct RadioButton : public Item { int group; int localIndex; bool checked; int shortcut; bool sharedShortcut; RadioButtonCallback callback; int callbackData; }; struct CheckBox : public Item { bool checked; CheckBoxCallback callback; int callbackData; int shortcut; }; struct Slider : public Item { float min, max; float value; SliderCallback callback; int callbackData; bool intStep; void SetValue(float v) { v = std::max(std::min(v, max), min); if (intStep) { // MSVC 2010 does not have std::round() or roundf() v = v>0.0f ? floor(v+0.5f) : ceil(v-0.5f); } value = v; } }; struct PullDown : public Item { bool open; int selected; std::vector labels; std::vector values; int shortcut; PullDownCallback callback; void SetSelected(int idx) { if (idx>=0 && idx<(int)labels.size()) { selected=idx; } } }; static int drawString(std::vector &vboSource, int x, int y, float r, float g, float b, const char *c); static int drawChar(std::vector &vboSource, int x, int y, float r, float g, float b, char ch); bool hitTest(Item const &item, int x, int y) const { int ix = item.x > 0 ? item.x : _windowWidth + item.x; int iy = item.y > 0 ? item.y : _windowHeight + item.y; return (x >= ix && y >= iy && x <= (ix + item.w) && y <= (iy + item.h)); } void getWindowPos(Item const &item, int *x, int *y) const { *x = item.x > 0 ? item.x : _windowWidth + item.x; *y = item.y > 0 ? item.y : _windowHeight + item.y; } std::vector & getVboSource(); std::vector & getStaticVboSource(); private: bool _visible; std::vector _vboSource, _staticVboSource; int _windowWidth, _windowHeight; int _framebufferWidth, _framebufferHeight; bool _requiresRebuildStatic; std::vector _labels; std::vector _radioButtons; std::vector _checkBoxes; std::vector _sliders; std::vector _pulldowns; int _capturedSlider; }; #endif // HUD_H