Compare commits

..

1101 Commits

Author SHA1 Message Date
e5bea65582 Version number 1.42 2015-07-08 12:59:26 -06:00
bbaaab7537 Allegro 5 example: fixed uv coordinate of non-default texture. 2015-07-08 12:41:09 -06:00
4d2d0ce5cd Allegro 5 example: handling of hardware and software mouse cursor rendering. 2015-07-08 12:16:50 -06:00
8db229b96f Allegro 5 example: fixed key modifiers, keyboard input, clipping, added pagedown/pageup. 2015-07-08 12:04:13 -06:00
c58d61dfd1 Allegro 5 example: formatting, match other example structure, fixed mouse buttons. 2015-07-08 11:53:30 -06:00
489e28ec11 Allegro 5 example: main.cpp matches other examples. added window title. 2015-07-08 11:46:18 -06:00
1845ff4690 SDL example: tweaks (#233 #226) 2015-07-08 11:42:43 -06:00
19e3c1506f Allegro5 example: added example from https://github.com/bggd/a5imgui_example 2015-07-08 11:34:36 -06:00
e49977a913 SDL example: hasty readme. 2015-07-08 11:08:58 -06:00
a14f6696a3 SDL example: more cleanup to match other examples (#233 #226) 2015-07-08 10:27:25 -06:00
22e099366f SDL example: further cleanup to match other examples (#233 #226) 2015-07-08 10:20:08 -06:00
4167528001 SDL example: moved event loop to main.cpp , adding page up/page down. (#226) 2015-07-08 10:10:54 -06:00
b7a2a6b23f SDL example: renamed folder, added in README 2015-07-08 09:49:32 -06:00
44c23e0eed Allowing DeltaTime==0.0f to not assert 2015-07-08 09:48:10 -06:00
b3ae2976c5 SDL example: tweaks and fixes. 2015-07-08 09:46:55 -06:00
046dbf502c Merge branch 'SampleSDL2' of https://github.com/CedricGuillemet/imgui into CedricGuillemet-SampleSDL2 2015-07-08 09:01:04 -06:00
5f039e7098 Merge branch 'ios_example_merge' 2015-07-07 21:39:05 -06:00
7d144eb899 iOS Example: Optimise PNG files size 2015-07-07 21:37:50 -06:00
fb27360ea8 iOS example: shallow tweaks and fixes (untested) 2015-07-07 21:35:09 -06:00
eee6dab226 iOS example working based on modified OpenGL3 example + Synergy 2015-07-07 21:17:48 -06:00
f4fc008a2a Fixed ListBoxHeader() not honoring negative sizes the same way as BeginChild() or BeginChildFrame() (#263) 2015-07-07 16:53:09 -06:00
3869e10574 ImVector<> access to Size/Capacity/Data (#262) 2015-07-07 12:39:08 -06:00
502e360ee5 Removed the majority of size_t from the code. ImVector<> now uses int. (#262)
May trigger new compilation warnings?
2015-07-07 12:09:25 -06:00
aeae03f4ac Fixed minor zealous Clang warning (demo code intentionally uses strdup() to be copiable) 2015-07-07 12:05:15 -06:00
02dbcf5405 ImVector<> cannot be re-defined (#262) 2015-07-07 11:27:22 -06:00
b92396b46a Optimisation, removed the duplicate ClipRectStack in ImGuiWindow, storing single value 2015-07-06 21:46:12 -06:00
d6987d1586 ImDrawList store pointer to their owner name for easier auditing/debugging. Metrics windows render clip rectangle when hovering. 2015-07-06 10:52:49 -06:00
562aecdaa5 Removed obsolete GetDefaultFontData() function that would assert anyway (obsoleted 2015/01/11) 2015-07-05 20:56:01 -06:00
3fa4451936 PlotLines(), PlotHistogram(): fixed incorrect hovering test (would trigger tooltip when menu is open) 2015-07-05 20:47:25 -06:00
1c160adbba Comments 2015-07-05 20:38:18 -06:00
c9676554b9 MenuItem() can be activated on release (#245) 2015-07-05 20:27:06 -06:00
18fa8e1c7e Fixed IsMouseDragging() (fix #260) 2015-07-04 16:46:30 -06:00
d76bc3434e Added DragFloatRange2() DragIntRange2() helpers (#76) 2015-07-04 12:17:11 -06:00
a33810d652 Update README.md 2015-07-03 16:08:00 -06:00
e9b81dd5ab Comments 2015-07-03 15:32:10 -06:00
fd3c6067bf Add conditional #ifdef prior to imconfig.h to facilitate inclusion in build systems (#255) 2015-07-03 15:31:54 -06:00
7437b43b2d Fixed warnings for more pedantic settings (#258) 2015-07-03 08:15:56 -06:00
2f03511062 Added ImGuiKey_PageUp, ImGuiKey_PageDown for user. 2015-07-02 21:43:07 -06:00
6826ab3ffd Added GetKeyIndex() helper. 2015-07-02 21:32:29 -06:00
0f9e2f8173 Tweaked scrolling example code (#150) 2015-07-02 21:22:16 -06:00
42efc29def SetScrollFromCursorPos() -> SetScrollHere() (#150) final call ! 2015-07-02 21:03:15 -06:00
4eba6cd470 Added SetScrollY(), SetScrollFromPosY(). Renamed SetScrollPosHere() to SetScrollFromCursorPos(). (#150) 2015-07-02 20:53:45 -06:00
b54cb1c24c Merge branch 'master' of https://github.com/ocornut/imgui 2015-07-02 20:49:36 -06:00
b37a326163 Renamed GetScrollPosY() to GetScrollY(). (#150)
Necessary to reduce confusion along with other scrolling functions,
because positions (e.g. cursor position) are not equivalent to scrolling
amount.
2015-07-02 20:47:04 -06:00
5d59e965f6 Update README.md 2015-07-02 15:42:19 -06:00
7bd28d17ca Update README.md 2015-07-02 15:35:55 -06:00
531d0ce7ce Moving tooltips and popup chunks of imgui.h below widgets (#219) 2015-07-02 14:55:30 -06:00
0201fe6ed1 Comments 2015-07-02 14:49:38 -06:00
9bedcb5304 Added GetCursorStartPos() necessary for using scroll target relative to beginning of window content (#150) 2015-07-02 14:46:49 -06:00
1b01137c90 Fixed text baseline alignment of small button (no padding) after regular buttons
Currently being a coward and only doing it via the SmallButton() entry
point.
2015-07-02 12:44:48 -06:00
bbc22ac8ca Comments + remove trailing comma 2015-07-02 11:26:35 -06:00
e0da1e0658 Split into CaptureKeyboardFromApp() / CaptureMouseFromApp() 2015-07-02 09:20:15 -06:00
77fad80e9f Added CaptureInputsFromApp() to manually enforce e.g. keyboard capturing 2015-07-02 09:10:31 -06:00
eaaab0120a Moved Inputs utilities to their own section in imgui.h + additional comments 2015-07-02 08:57:17 -06:00
fc7b562635 Added font links courtesy of twitter + instructions for fonts compressed in C array 2015-07-02 08:16:23 -06:00
57f70a29b2 Fixed a bug with TextUnformatted() clipping of long text (#257) 2015-07-02 07:42:29 -06:00
0e5b64ecd2 SetScrollPosHere() Minor hack for effective "scroll to top" to appear like user expect it (#150)
Compensate the difference between WindowPadding and ItemSpacing
2015-07-01 19:01:27 -06:00
824cf5ae85 Fixed window padding being reported incorrectly for child windows with borders when parent have no borders 2015-07-01 18:55:42 -06:00
3d7b596a40 SetScrollToPosHere() fixed imprecision + handling lower gap better for bottom alignment (#150) 2015-07-01 18:23:11 -06:00
49b7a8e61f Added scroll tracking example with SetScrollPosHere() (relate #150) 2015-07-01 18:01:43 -06:00
b74d8e4c87 SetScrollPosHere() takes a y centering ratio and can be used to aim the top or bottom of the window (relate #150) 2015-07-01 17:51:44 -06:00
c39372e7d5 Title bar uses TitleBgActive color even when window has popups/menus over (#253) 2015-06-30 13:52:00 -06:00
47826830af Adding TitleBgActive color - still issues with popups/menus (#253) 2015-06-30 13:40:13 -06:00
0e3198edc2 Tidying up - renamed FindBestWindowPos() to FindBesttPopupWindowPos() 2015-06-29 15:18:26 -06:00
af0de5f357 Tidying up - ImRect doesn't use ImVec2 operators (so we can expose it later) 2015-06-29 13:30:37 -06:00
882c7a8cef Tidying up - ShowUserGuide, ShowStyleEditor only uses public calls 2015-06-29 13:20:28 -06:00
039ebb79f4 Tidying up - renamed a few internal functions 2015-06-29 13:18:44 -06:00
8b392feba1 Tidying up - moved ImFontAtlas glyph ranges helpers outside of ImFont block 2015-06-29 12:36:24 -06:00
0783697f87 Minor tidying up 2015-06-29 10:39:17 -06:00
4ac21aaa12 Version number 1.42 wip + todo list entries 2015-06-26 20:48:53 -06:00
14f189b2f6 Merge pull request #250 from benvanik/patch-1
Fixing 64-bit compilation warning caused by implicit size_t->int cast
2015-06-26 20:23:32 -06:00
5cd1a01514 Fixing 64-bit compilation warning caused by implicit size_t->int cast 2015-06-26 18:49:45 -07:00
f66be0e7b2 Demo: satisfying buffer size 2015-06-25 21:52:16 -06:00
ea2c824192 Version 1.41 2015-06-25 21:38:24 -06:00
8224ca16b6 Carriage return in demo tooltip 2015-06-24 20:45:06 -06:00
4976bf97a6 Fix for correctness and allow non-auto resized modals to have window minimum size applied - hopefully no-side effects (#249) 2015-06-24 20:35:40 -06:00
af5890b276 AutoFit can be triggered on each axis separately via SetNextWindowSize() (mentioned in #249) 2015-06-24 20:08:08 -06:00
975ef00682 Minor construction fix (-1.0 is correct "disabled" value for TextWrapPos, didn't have any incidence anyway) 2015-06-24 19:53:41 -06:00
d171e48b20 Fixed SetNextWindowPosCenter() being processed too early for windows that are still measuring their size (for #249) 2015-06-23 15:45:34 -06:00
5436266963 Added SetNextWindowPosCenter() (#249) 2015-06-23 15:34:44 -06:00
bcbf53857c BeginPopupModal() default to NoCollapse for modal windows (#249) 2015-06-23 15:17:27 -06:00
06ed9257ef Modal windows centered when appearing (#249) 2015-06-23 14:28:11 -06:00
2a041cfbe1 Added GetGlyphRangesCyrillic() helper (#237) 2015-06-23 14:13:22 -06:00
0f38a53d28 Added stacked modal windows example (#249) 2015-06-23 13:58:47 -06:00
f0311b643a Added modal dialog example (#249) 2015-06-23 13:22:37 -06:00
a4cd585f54 Reorganized demo window 2015-06-23 12:47:38 -06:00
fe17f6e735 Added modal window darkening of previous windows (#249) 2015-06-23 12:34:15 -06:00
8c790a3234 BeginPopupModal() can have an optional close-window button (#249) 2015-06-23 11:08:19 -06:00
bce495c581 Added BeginPopupModal() with actual modal behaviour (WIP api) (#249) 2015-06-23 10:02:56 -06:00
f10bbbb851 Minor comment fix (#248) 2015-06-22 07:57:45 -06:00
0884cb51cd Added IsKeyReleased() (#248), added keyboard & mouse state panel in the demo window 2015-06-21 19:04:43 -06:00
68534c2319 Added IsMouseReleased() helper (#248) 2015-06-21 18:15:31 -06:00
eec047c9f7 Fixed leak on Shutdown (#200) 2015-06-19 18:14:50 -06:00
9e8da4dba0 Comments 2015-06-19 18:09:58 -06:00
747999bbaf Fixed mouse wheel scroll issues, introduced a few weeks ago (#200) 2015-06-19 18:01:13 -06:00
e7b43b014b Can't scroll with mouse wheel when window is collapsed. 2015-06-19 17:43:51 -06:00
1b28f11acb InputTextMultiline() filtering out \r for now (#200) 2015-06-19 17:34:19 -06:00
73db855c77 InputTextMultiline() painfully merged most computation passes into one, better clipping, much faster for large text (#200) 2015-06-18 23:23:20 -06:00
84987ac3e0 ImFont::RenderText() better vertical clipping for large amount of text (for #200) 2015-06-18 23:08:42 -06:00
324b1c2a28 InputTextMultiline(): made ctrl+up/down closer to windows behavior (#200) 2015-06-18 22:35:08 -06:00
c4720ec90f InputTextMultiline() fixed a frame of lag in handling vertical scrolling (#200) 2015-06-18 21:20:15 -06:00
cd27f8a8e6 InputText(): adjusting selection block height differently for single and multi-line (#200) 2015-06-18 21:01:56 -06:00
b524c59c70 InputText(): removed a call to strlen() in the active edit path (#200) 2015-06-18 20:49:20 -06:00
2b68a5c0cf InputTextMultine() optimised height calculation for inactive multi-line edit box (#200) 2015-06-18 19:09:04 -06:00
86666489df ImFont: CalcTextSizeA() fixed font scaling with fallback character. 2015-06-18 18:31:49 -06:00
c6d77f3bf5 InputText: fixed handling of scaled font. re-organized bits of code toward merging all sizes calculations (#200) 2015-06-18 18:31:13 -06:00
10b4fa44c1 Fixed framerate counter averaging buffer size (shouldn't have been included in previous commit) 2015-06-18 17:45:11 -06:00
26d2b361d1 InputText(): removed extraneous CalcTextSizeW call for tracking cursor/scrolling, remove spike (#200) 2015-06-18 17:40:51 -06:00
5f362cabe9 InputText(): char width calculation calls font->GetCharAdvance() directly (#200) 2015-06-18 17:11:20 -06:00
60079988bd ImFont::RenderText() faster handling of rendering above clipping rect (useful for #200) 2015-06-18 12:41:48 -06:00
846cfc74a2 InputText() clear selection when using undo/redo (#200) 2015-06-18 12:32:55 -06:00
d30e8f38b7 InputText() tidying up (#200) 2015-06-18 12:29:43 -06:00
8fbb4a566a InputTextMultiline() preserve activeid/cursor/selection when using scrollbar + tidying up (#200) 2015-06-18 11:57:43 -06:00
9180126db6 Speeding up some wchar<>UTF8 functions and some specialization for Ascii. (testing 500 KB text for #200) 2015-06-18 11:30:10 -06:00
c06373de93 Cleanup 2015-06-18 10:40:11 -06:00
d0ea5942a9 InputTextMultiline() can clip + BeginChildFrame() returns bool. (#200) 2015-06-18 08:49:57 -06:00
9c399ee3be Demo for InputTextMultiline() (#200) 2015-06-17 18:36:06 -06:00
b0e8643523 Demo for InputTextMultiline() (#200) 2015-06-17 18:31:15 -06:00
490e9e42ff InputText(): shallow tweaks (#200) 2015-06-17 18:14:25 -06:00
5e323561be InputTextMultiline() fixes, vertical scrolling, optimizations (#200)
Using a child window for multi-line text.
2015-06-17 17:07:49 -06:00
3df91b52ea Increased key repeat rate for non-character input key repeat.
Dodgy - we should have a match here for character input and
non-character input (e.g. holding 'a' vs holding 'backspace' should be
same rate), but for the earlier we don't have the info?
2015-06-17 16:02:50 -06:00
7dc5228235 InputText: doesn't reset scrolling when active text input becomes bigger than its content. (#200)
Mostly because it's expensive.
2015-06-17 15:49:18 -06:00
f75b8c72cf InputTextMultiline(): vertical scrolling wip, selection rendering fix (#200) 2015-06-16 21:53:04 -06:00
417a7bc29b InputTextMultiline(): multi-line selection draw fix (#200) 2015-06-16 21:19:47 -06:00
f1dfc4d7c4 InputTextMultiline(): multi-line selection draw fix (#200) 2015-06-16 21:17:02 -06:00
917a1fdbf7 InputText() fixing cancel (#200) 2015-06-16 21:08:54 -06:00
73491e5adc InputText() lifted 1024 characters limit (#200)
Bit messy & not happy with using ImVector<char>
2015-06-16 21:04:27 -06:00
0795a60c6b InputText() fixed multi-line selection clipping. (#200) 2015-06-16 20:35:46 -06:00
ec7c1834b3 InputTextMultiline() tabbing to a multi-line edit doesn't select all (unless ImGuiInputTextFlags_AutoSelectAll is set), somehow arbitrary (#
Seems reasonable
2015-06-16 20:25:08 -06:00
6d31c498c0 InputText: multi-line selection, better scrolling, cleaning up (#200)
Not horizontally scrolling on char boundaries anymore
2015-06-16 20:14:54 -06:00
d06ad43dca ImFont::RenderText() additional early out (typically performed at TextUnformatted() level for large chunks but this is also useful) (#200) 2015-06-16 17:50:55 -06:00
748837acfd Merge remote-tracking branch 'origin' into 2015-06-multiline_textedit
Conflicts:
	imgui.h
2015-06-16 17:23:28 -06:00
a248575dea Text rendering can be finely clipped cpu-side on top and left axises (for #200) 2015-06-16 17:21:07 -06:00
9765559a28 Merge remote-tracking branch 'origin' into 2015-06-multiline_textedit
Conflicts:
	imgui.cpp
2015-06-16 15:59:28 -06:00
34986771b4 Moved InputFloat() InputInt() below InputText() and not in the middle of internal bits 2015-06-16 15:57:04 -06:00
0df7b472c2 InputTextMultiline() WIP - still gazillion problems with selection visualisation & scrolling 2015-06-16 15:46:45 -06:00
6eb1fec7a9 ImFont: added GetCharAdvance() helper. Exposed font Ascent and font Descent. 2015-06-14 17:30:06 -06:00
b503e5ee5b ImageButton() changed default bg_col parameter from (0,0,0,1) black to (0,0,0,0) tranparent + drawing frame even when no padding (#243) 2015-06-14 16:18:22 -06:00
4f0fa58ff2 Selectable() changed prototype moved flags before size. size override should rarely have been used! sorry. #125 2015-06-14 15:19:47 -06:00
c82e72eecb Selectable() parameter comment 2015-06-14 15:14:33 -06:00
cf481e1a7b Selectable() added flags ImGuiSelectableFlags_DontClosePopups , ImGuiSelectableFlags_SpanAllColumns (#125) 2015-06-14 12:41:40 -06:00
2bcafc861e SelectableEx - replaced unnecessary extra size_draw parameter by a flag. 2015-06-13 14:20:02 -06:00
96496ced5f Metrics windows display storage size 2015-06-11 16:04:06 -06:00
039418f393 ColorButton(), ColorEdit4(): colored square stays square, used vertical padding on both axis. 2015-06-09 14:39:27 -06:00
6bb06fdb81 Selectable, MenuItem: don't use frame rounding for hovering/selection. 2015-06-09 14:32:37 -06:00
3fd4441f70 SetScrollPosHere() fixed imprecisions 2015-06-09 13:14:22 -06:00
3ca54ad369 SetScrollPosHere() takes account of item height + more accurate centering 2015-06-09 12:57:27 -06:00
e8422f7aa0 SetScrollPosHere() rewrote to that window size is not required at the time of calling, can be used on frame 0 of an auto-resizing window 2015-06-09 12:49:13 -06:00
8c86322068 Combo() now using the popup facility. More consistent + when combo open hovering other widgets is disabled. (#241) 2015-06-09 12:35:55 -06:00
6f1dd7a688 Allow Set*WindowSize() calls to be used with popups (fix for using e.g. scroll function on the first frame) 2015-06-09 12:32:19 -06:00
6807546caf Allow Set*WindowSize() calls to be used with popups. 2015-06-09 11:35:29 -06:00
4536668482 Fixed issue with activating a Combo() not taking active id (#241) 2015-06-09 10:09:12 -06:00
20088303e9 ImFont: ignoring \r 2015-06-04 12:26:23 +01:00
d31cf1af5d Merge branch 'master' of https://github.com/ocornut/imgui 2015-06-03 15:31:13 +01:00
eb75ffdc5d DragFloat(), SliderFloat() Fixed rounding of negative which sometimes made the negative lower range unreachable. 2015-06-03 15:31:08 +01:00
e57d460e31 Update README.md 2015-06-03 12:48:55 +01:00
0e04dfbad7 Added IsWindowHovered() helper. 2015-06-02 20:57:29 +01:00
9928d19af1 Version 1.41 WIP 2015-06-02 14:41:14 +01:00
82d4180f39 Bits of TODO list 2015-05-31 21:15:35 +01:00
931b8dcdaf Version 1.40 2015-05-31 19:31:02 +01:00
c603534d38 Version 1.40 2015-05-31 19:24:32 +01:00
8738147aee Windows: pragma link with user32.lib if we are using native clipboard function (unless IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS) #238 2015-05-31 15:55:32 +01:00
b148f70f83 Update README.md - new demo binaries 2015-05-31 14:51:35 +01:00
1c2dac2a90 Version increased to 1.40 WIP makes more sense than 1.39 (changelog is huge) 2015-05-31 14:46:28 +01:00
b5b165b989 Web: Added screenshots 2015-05-31 14:44:47 +01:00
04e91500c5 Comments 2015-05-31 14:03:07 +01:00
374d160234 BeginPopupContextWindow() in_empty_space_only -> !also_over_items (#126)+ comments
Sorry if you used this parameter already.
2015-05-31 12:55:12 +01:00
bda0269133 ListBox() uses ImGuiListClipper helper, faster for large lists, assume evenly sized items. 2015-05-31 12:35:21 +01:00
eb4ffd5dbd Added ImGuiListClipper helper to avoid using CalcListClipping() directly. 2015-05-31 12:33:24 +01:00
446d8abfb0 ListBoxHeader() can return false. Also made ListBox() only use public API. 2015-05-31 11:54:00 +01:00
df37df821e RetWindowCollapsed() to IsWindowCollapsed() for consistency. Kept inline indirection. 2015-05-31 11:52:57 +01:00
0539be7067 Added IMGUI_DISABLE_OBSOLETE_FUNCTIONS 2015-05-31 11:17:58 +01:00
475498f2eb Comments, moved Sliders below Drag & Input in imgui.h 2015-05-31 11:12:29 +01:00
03ff2faacb Comments 2015-05-31 11:01:22 +01:00
c4cb768432 Comments 2015-05-31 10:53:42 +01:00
01f74781b0 Merge branch 'master' of https://github.com/ocornut/imgui 2015-05-31 09:12:24 +01:00
9417df2a26 Renamed IsRectClipped to IsRectVisible for consistency. Note that return value is opposite! Kept inline redirection function (will obsolete) 2015-05-31 09:12:07 +01:00
abd0e85fc6 Update README.md - supporters 2015-05-29 15:42:15 +01:00
5ea23977f7 Fixed uninitialized fields in constructor - wouldn't have caused a problem (thanks Coverity!) 2015-05-29 14:54:33 +01:00
f1f3424cdd Popups WantCaptureMouse active when popups/menus are active + using tracked mouse button ownership when mouse down (#126) 2015-05-29 11:42:35 +01:00
73d1126bf4 Examples: OCD tweaks, a sign that we are near the release! 2015-05-29 11:15:24 +01:00
448b262b37 Examples: Comments. 2015-05-29 11:11:50 +01:00
83770e5e40 Examples: Tweaks. Usnig sprintf() in user-copiable code. 2015-05-29 11:05:17 +01:00
0db6bac590 Examples: Tweaks, demo code creating graph data actually creates data at the correct rate. 2015-05-29 11:01:53 +01:00
9ace617e7e Examples: Tiding up. Moved Dragging example higher up. 2015-05-29 10:52:45 +01:00
616a7e6c61 Examples: Using a helper function for ? markers 2015-05-29 10:44:30 +01:00
d86785ac98 Examples: Fixed Simple Layout example always showing. Using BeginPopupContextItem(). 2015-05-29 10:36:33 +01:00
4144c59ce4 Added Simple Layout example applet 2015-05-29 10:29:26 +01:00
15a26a479b Fixed auto-filling child window using WindowMinSize at their minimum size, irrelevant. Using an arbitrary small number instead. 2015-05-29 10:24:03 +01:00
f0781d3a24 Added GetItemsLineHeightWithSpacing() helper. 2015-05-29 09:00:34 +01:00
aaefe462bb Popups: calling OpenPopup() on already open popup doesn't close it's child (#126)
Fixed previous commit.
2015-05-28 23:47:01 +01:00
78dc54ab3d Popups: calling OpenPopup() on already open popup doesn't close it's child (#126)
It think it makes more sense? Maybe?
Note that calling OpenPopup() every frame probably doesn't make sense.
2015-05-28 23:37:11 +01:00
7847100ad8 Tweak BeginMenu() code 2015-05-28 23:14:25 +01:00
733e079081 Moved CloseInactivePopups() and tweaked. 2015-05-28 23:04:29 +01:00
95e2afcad6 Updated to stb_truetype 1.05 2015-05-28 09:38:00 +01:00
46a27cdb6b Merge pull request #236 from bkaradzic/master
Define STBTT_DEF extern when STBTT not compiled with ImGui.
2015-05-28 08:19:14 +01:00
123fd73c8c Merge remote-tracking branch 'upstream/master' 2015-05-27 22:01:37 -07:00
cd9244ab15 Define STBTT_DEF extern when STBTT not compiled with ImGui. 2015-05-27 16:12:52 -07:00
dcc7df2b21 Added BeginPopupContextVoid() helper for completeness (#126) 2015-05-27 23:28:53 +01:00
235cca4f97 Fix to allow opening popup from a left-click on void or another window (because left-click would normally override focus immediately) (#126)
Neither appears to be really useful frankly.
2015-05-27 23:24:39 +01:00
1cb6a294b0 BeginPopupContextWindow() rearranged and clarified parameters (#126) 2015-05-27 23:07:24 +01:00
b0a9bbf6f6 Popup taking focus deactivate focused widget of other window (#126)
e.g. focus InputText(), open contextual popup, input text used to stay
focused
2015-05-27 22:58:49 +01:00
f8b7d5c76d Tracking ActiveIdWindow along with ActiveId 2015-05-27 22:53:43 +01:00
938528e5ee Added BeginPopupContextItem() / BeginPopupContextWindow() (#126) 2015-05-27 22:36:23 +01:00
5b0861768e Fixed GetId()/BeginPopup() accessing current window in "append" mode 2015-05-27 22:26:03 +01:00
8c4c421f74 Added IsAnyItemHovered() public helper. 2015-05-27 22:02:12 +01:00
70f2ff0e5a No minimum size for popups 2015-05-27 21:59:02 +01:00
99ff45ad2e Tweak context menu example 2015-05-27 21:42:16 +01:00
90db64d4e3 Added context menu example on a DragFloat widget 2015-05-27 21:39:41 +01:00
487500d291 Tweaks 2015-05-27 16:03:44 +01:00
7d28fe5915 WIP Menus: Reverted f26de46350 for now (#126) 2015-05-27 15:51:50 +01:00
d05c1d58c3 Oops 2015-05-27 15:44:07 +01:00
405785ea62 ItemWidthStack can be empty, to remove one allocation per window 2015-05-27 15:42:29 +01:00
0a7024c198 Store common stacked settings contiguously in memory to reduce cache misses & unnecessary heap allocations 2015-05-27 15:35:49 +01:00
3d36c81241 Added PushButtonRepeat() / PopButtonRepeat(). REMOVED third 'repeat_if_held' parameter of Button() ! 2015-05-27 15:22:09 +01:00
d69f2f57ee Added configurable io.KeyRepeatDelay, io.KeyRepeatRate 2015-05-27 15:17:44 +01:00
904e187f70 Simplified some widget code, moving alignment to RenderTextClipped() 2015-05-27 14:39:41 +01:00
3c264827fd Reordering parameters of internal RenderTextClipped() 2015-05-27 14:24:52 +01:00
f841097e99 Button centering left to RenderTextClipped function. 2015-05-27 14:20:50 +01:00
f26de46350 Button() closes active popup (#126) unsure about that 2015-05-27 09:28:44 +01:00
e6ac9e88aa Refactor Button() and SmallButton() into a shared function ButtonEx() 2015-05-27 09:22:30 +01:00
b8ee48a74b OpenPopup() Comments 2015-05-27 09:18:04 +01:00
843219daec Spacing + untabify 2015-05-26 22:14:07 +01:00
7b8b5754bc EndGroup() carries on the text base offset from the last line of the group (sort of incorrect but better than nothing) 2015-05-26 22:13:07 +01:00
6f32684f15 Examples: various usage comments. 2015-05-26 21:36:44 +01:00
15113f682e Added TextDisabled(), TextDisabledV() helpers. 2015-05-26 21:10:16 +01:00
3a6e6645e6 WIP Menus: Fixed remaining inconsistency with stacks of popups. Activating/closing a menu close the parent popup. Added test case. (#126) 2015-05-26 20:33:48 +01:00
90cf77b191 Merge remote-tracking branch 'origin' into 2015-05-menus 2015-05-26 18:03:46 +01:00
6b3ccd3edf WIP Menus: Added support for disabled sub-menu (#126) 2015-05-26 18:02:42 +01:00
0db122bc3b Comments. Examples: added empty if (MenuItem()) {} statements in more places to better document the typical use cases (#126) 2015-05-26 17:48:28 +01:00
fdce095101 Comments 2015-05-26 17:27:35 +01:00
d009a85de4 WIP Menus: Implement amazon's dropdown-like triangle test for navigating sub-menus (#126) 2015-05-26 17:09:21 +01:00
63a39dd08e WIP Menus: Recursive menu demo (#126). Actually useful to test sub-menu positioning. 2015-05-26 16:14:51 +01:00
cdb5e16f70 SelectableEx: use flags internally (similar to ButtonBehavior) 2015-05-26 16:12:40 +01:00
4eeba016f6 WIP Menus: Closing sub-menu when hovering something else in the same parent window (#126)
Immediate open/close is error-prone
2015-05-26 15:01:04 +01:00
83b10f77a9 Comments 2015-05-25 23:47:59 +01:00
fd0108dbef Comments 2015-05-25 23:37:08 +01:00
98540370a0 WIP Menus: Layout in menu-bar tweaks to lay better when mixed widgets (#126) 2015-05-25 23:15:00 +01:00
bb8cdcb916 WIP Menus: Layout in menu-bar more standard, allows mixing different widgets in menubar. (#126)
Still some minor spacing bugs.
2015-05-25 23:08:22 +01:00
83cb040d20 Selectable: text baseline alignment for line that aren't of text height. 2015-05-25 23:03:16 +01:00
2acdafe4f2 imgui_impl_sdl and main sample 2015-05-25 09:40:58 +02:00
44ed5640d3 WIP Menus: Sub-menu overlapping amount not hardcoded (#126) 2015-05-24 23:58:40 +01:00
0836f69d9b WIP Menus: Fixed style.WindowPadding == 0 leading to zero-sized initial clipping rectangle leading to self-collapsing childs (#126) 2015-05-24 23:56:29 +01:00
6c749934ec Combo: empty label doesn't add ItemInnerSpacing alignment, matching other widgets 2015-05-24 23:45:44 +01:00
9abcbf73cb WIP Menus: Sub-menus appears over the parent-menu scrollbar if there is one (unsure about that) (#126) 2015-05-24 23:37:47 +01:00
63aa035f59 WIP Menus: Fixed estimation of scrollbar width (broke in 292f08b11e) (#126) 2015-05-24 23:25:57 +01:00
8c1d7daef8 WIP Menus: Fixed repositioning of menus when there's no room in the 4 quadrants., we still keep them within the visible display area (#126)
vs popup which prefer to stay away from the mouse cursor
2015-05-24 23:17:06 +01:00
1ab1712849 WIP Menus: Clicking the label of an already open sub-menu doesn't close it unless from a menu-bar (match Windows behavior) (#126)
Argh,
2015-05-24 22:33:04 +01:00
48ede93a58 WIP Menus: Fixed closing popup on menu item activation when a child menu is open from the popup (#126) 2015-05-24 22:30:48 +01:00
3498617a3c Comments. 2015-05-24 22:16:34 +01:00
53892ab893 WIP Menus: Fixed manually closing submenu affecting position of the following window (#126) 2015-05-24 21:20:10 +01:00
292f08b11e WIP Menus: Fixed some alignment issues with non standard styles. Tweaked menu-bar color (#126) 2015-05-24 21:11:11 +01:00
14bcfef041 Merge remote-tracking branch 'origin' into 2015-05-menus
Conflicts:
	imgui.cpp
2015-05-24 17:32:10 +01:00
8cfae35042 Added Dummy() helper 2015-05-24 17:30:59 +01:00
89d1340225 WIP Menus: Added Enabled/Disabled option for MenuItem() (#126) 2015-05-23 13:54:57 +01:00
485832fe06 WIP Menus: Added BeginMainMenuBar()/EndMainMenuBar() helpers. Added to examples. 2015-05-23 13:43:45 +01:00
e6b1e39847 WIP Menus: don't clamp windows within display when a position has been explicitly set by user. Menu item spacing uses ItemSpacing. (#126) 2015-05-23 13:43:13 +01:00
e7097d6176 WIP Menus: menus now affected by WindowMinSize (#126) 2015-05-23 13:03:09 +01:00
882b4a5eb4 Merge remote-tracking branch 'origin' into 2015-05-menus
Conflicts:
	imgui.cpp
2015-05-21 22:51:21 +01:00
7fbe6574c6 Removed unnecessary PushTextureId/PushClipRect/PopClipRect/PopTextureId on multiple Begin/End pairs 2015-05-21 22:45:32 +01:00
8a6d543bc9 ImDrawList: merge draw command better, cases of multiple Begin/End gets merged properly 2015-05-21 22:43:28 +01:00
6a1eba2d0a Fixed appending multiple times to an existing child via multiple calls to same BeginChild/EndChild 2015-05-21 22:21:00 +01:00
14ab9708be Removed a few empty lines 2015-05-20 10:31:05 +01:00
df276b82da Updated FAQ for usage of ## to display empty label 2015-05-19 23:33:55 +01:00
30a0193d73 Merge pull request #229 from gordonmcshane/osx-example-fix
Examples: OpenGL3: Fix for OSX requiring forward compatibility flag (see #229)
2015-05-19 10:36:23 +01:00
e43c5cd3d3 InputText: Fixed cursor generating a zero-width wireframe rectangle turning into a division by zero. 2015-05-18 23:42:12 +01:00
92ded00fd9 Merge remote-tracking branch 'origin' into 2015-05-menus
Conflicts:
	imgui.h
2015-05-18 23:32:32 +01:00
6ee65fc5af Add conditional compilation of forward compat. glfw window hint to fix crash on later versions of OSX 2015-05-18 18:26:16 -04:00
da53caf310 Moved ImVector<> after the main block (#219) 2015-05-18 22:33:43 +01:00
b6f3c97e3b Examples: DirectX11: explicitly set rasterizer state. 2015-05-18 21:38:17 +01:00
0cdd050cd7 WIP Menus: fixed recycling menu level during the same frame (#126)
We could also enforce "clearing" the window and recycle immediate which
sort of work, but it would be a less tested code path.
2015-05-18 21:26:46 +01:00
6da8a77fa3 WIP Menus: tidying up, fixed hovering in parent popup menu item from child popup (individual popups acts as hovering barrier) (#126) 2015-05-18 19:41:02 +01:00
9bdacaf08d WIP Menus: click again to toggle + allow hovering in same menuset even outside of a menubar (#126) 2015-05-18 19:12:36 +01:00
75ec4841df WIP Menus: menu opens on press (not release), uses popup style hovering, allow switch between menus at parent site (#126) 2015-05-18 18:44:15 +01:00
e674df8101 Merge remote-tracking branch 'origin' into 2015-05-menus 2015-05-18 16:45:55 +01:00
097fe51f97 Hovering require to hover same child window. Reverted 860cf578f5 (December 3), replaced by a flag resize grip.
Might break something if you have childs overlapping non-childs.
2015-05-18 16:42:55 +01:00
060f879816 Tweak internal ButtonBehavior() to ease passing extra options 2015-05-18 16:39:37 +01:00
7184de24b8 WIP Menus: scrolling section of the window is clipped by the menu bar (#126) 2015-05-18 15:54:56 +01:00
0e8c2f9d41 Comments 2015-05-18 14:10:59 +01:00
a17c930d1f WIP Menus: Added example menu, move app examples to a sub-menu (#126)
NB: menus do not react on click yet, with popup-style blocking of other
inputs yet
2015-05-17 23:19:05 +01:00
09abf11e56 WIP Menus: BeginMenuBar() return false on window without a menu bar (#126) 2015-05-17 23:13:53 +01:00
4bd43bdb35 Renamed ImGuiWindowFlags_Menu to ImGuiWindowFlags_ChildMenu 2015-05-17 22:28:57 +01:00
7f3f3891c0 WIP Menus: fixed case where zero-sized display (e.g. minimised window) clips popups/menus and asserted (#126) 2015-05-17 22:15:40 +01:00
88d7b3de23 WIP Menus: fixed hovering handling of menus from menu bars (#126) 2015-05-17 17:21:49 +01:00
f2b738648f WIP Menus: menu bars. Still inconsistency with hovering scheme. Will probably follow what Windows does. (#126). 2015-05-17 17:13:45 +01:00
e0594340ff Moved internal window flags to higher bit-count 2015-05-17 16:29:00 +01:00
6251d37987 WIP Menus: further fixes for resizing (#126) 2015-05-17 15:48:56 +01:00
f44526cc45 Selectable(): horizontal filling not declared to ItemSize() so Selectable(),SameLine() works and we can best auto-fit the window 2015-05-17 13:09:46 +01:00
e912bcb36d Comments 2015-05-17 12:10:57 +01:00
ecda785cbc Popups: fix to allow child popups to be opened from a normal window without an intermediate popup window. 2015-05-15 23:57:43 +01:00
4250357ed2 Selectable: using window->WindowPadding() to work within non-padded child windows 2015-05-15 22:39:52 +01:00
79a95256e8 Window: fixed auto-fit calculation mismatch of whether a scrollbar will be added by maximum height clamping.
Also honor NoScrollBar in the case of height clamping, not adding extra
horizontal space.
2015-05-15 22:36:31 +01:00
3115e546aa Style editor: fixed slider for indent spacing. 2015-05-15 21:55:54 +01:00
c1b55991c0 Window: fixed child window sizing lag + minimum size clamping lag 2015-05-15 21:40:45 +01:00
70f83a3a65 Popups: child popups (menus) hidden on their first frame the same way as regular popup 2015-05-15 20:35:28 +01:00
81937d34a8 Popups: made OpenPopup()/close loops reclaim focus and update popup position. It is generally a mistake but it's now more easy to understand 2015-05-15 17:29:42 +01:00
fa0f0f4507 ImVector: tweak growth strategy 2015-05-15 13:14:46 +01:00
1fe2906923 Metrics: do not count free(NULL) calls. Settings: contiguous allocations for ImGuiIniData. 2015-05-15 12:45:35 +01:00
900394a612 Metrics: metrics window shows popups list 2015-05-15 12:24:05 +01:00
222a9231bb Examples: Console: example uses standard malloc/free, makes more sense as a copy & pastable example 2015-05-15 12:09:34 +01:00
d9ca8f3145 Added IO.MetricsAllocs counter (number of memory allocations 2015-05-15 12:05:05 +01:00
d9b2a90773 Popups: fixed child windows within popups vs handling of sub menus. Added examples. 2015-05-15 11:30:51 +01:00
748072c045 Popups: identifying popups by their id to avoid conflict when recycling popup durnig same same (CloseCurrentPopup followed by Open+Begin) 2015-05-14 15:15:17 +01:00
e57ee2852a Comments 2015-05-14 11:32:12 +01:00
1e4c22c206 Added io.MetricsActiveWindows counter (#213) 2015-05-12 16:08:34 +01:00
5df542c3c0 ImFontAtlas: doesn't clear input data, left to the application. (#224) 2015-05-12 15:16:12 +01:00
4b088ec7e8 ImFontAtlas: Fix toward allowing to add extra font without clearing existing one (need to comment out ClearInputData) (#224) 2015-05-12 15:10:36 +01:00
9d9cf31972 ImFontAtlas: added ClearFonts(), making the different clear funcs more explicit (#224) 2015-05-12 14:53:29 +01:00
ad79db32c7 Window title text centering tweaks, RenderTextClipped() now has different args for pos_max and clip_max #222 2015-05-12 14:02:45 +01:00
30552ecfd6 Fixed comment (fix #223) 2015-05-12 11:51:22 +01:00
356a37edcf Added window title text horizontal alignment option (#222),, ImGuiAlign_ type for future use. 2015-05-12 11:49:24 +01:00
03720acaff Merge remote-tracking branch 'origin' into 2015-05-menus 2015-05-12 10:11:14 +01:00
9be3319653 Tweaks, comments around ImFontAtlas
Removed unsigned int from API
2015-05-12 09:08:47 +01:00
9e307d60e3 Merge remote-tracking branch 'origin' into 2015-05-menus 2015-05-11 21:45:13 +01:00
515e0c6122 Cleanup, merged duplicate code into a function 2015-05-11 21:44:50 +01:00
317744489f WIP Menus: sub-menu arrow alignment take account of extension by other widgets (#126) 2015-05-11 20:58:07 +01:00
5082182790 Merge remote-tracking branch 'origin' into 2015-05-menus
Conflicts:
	imgui.h
2015-05-11 20:39:19 +01:00
ba7a4fc034 WIP Menus: minor cleanup using a ImGuiSimpleColumns helper type (#126) 2015-05-11 20:34:52 +01:00
7fb704d308 WIP intermediary branch commit for menus, submenus (some large inconsistencies remaining in API + need cleanup) (#126)
May remove the ImGuiWindowFlags_Menu alltogether
2015-05-11 19:52:02 +01:00
79198fd6a5 Default item width for AlwaysAutoResize windows expressed as a factor of font height 2015-05-11 19:47:01 +01:00
34aad73fd8 Added ImGuiCol_TextDisabled 2015-05-11 19:36:32 +01:00
141ac8beab Tweaks 2015-05-11 18:28:30 +01:00
33a2fd368a Merge pull request #218 from paperManu/inputNFlags
InputFloat2/3/4, InputInt2/3/4: Added extra_flags parameter.
2015-05-11 16:54:12 +01:00
b3faed610d Renamed flags to extra_flags in last commit 2015-05-11 11:40:08 -04:00
fcd08ed8d4 BeginPopup() API had to be changed! :( Proper support for stacked popups, leading into menus (wip #126) 2015-05-11 15:57:02 +01:00
94b7c9e307 Input text flags added to InputFloatN and InputIntN 2015-05-11 10:15:22 -04:00
cd2ec7868c Merge pull request #217 from Pagghiu/bugfix
Example fix PopStyleVar on Vertical Slider to avoid assertion
2015-05-11 14:12:23 +01:00
99a1a85f1f Example fix PopStyleVar on Vertical Slider to avoid assertion
Adding an explicit ImGui::PopStyleVar to avoid assertion in
CheckStacksSize
2015-05-11 14:45:49 +02:00
4a41ce9414 InputText: make sure Ctrl+V has ONLY the control key pressed (follow up to #214) + tidying 2015-05-11 09:29:10 +01:00
c2c43928a9 Untabifiy 2015-05-11 09:26:53 +01:00
8ac9036db3 Merge pull request #214 from ghassanpl/upstream
InputText(): make sure letter-key shortcuts have ONLY the control key pressed
2015-05-11 09:26:00 +01:00
4913668ea4 Fixed implicit conversion of NULL constant to bool (fix #216) 2015-05-11 09:23:29 +01:00
bb2d3a8b41 * make sure letter-key shortcuts have ONLY the control key pressed (fixes bug for AltGr->Ctrl+Alt on windows) 2015-05-10 22:41:28 +02:00
6c1084eaa1 Shutdown() test for g.IO.Fonts not being NULL to allow workarounds in case of using multiple contexts #207 2015-05-09 10:27:03 +01:00
f293bec97c Added style.ScrollbarRounding #212 2015-05-09 10:13:56 +01:00
d23709ce35 Merge remote-tracking branch 'origin' into 2015-05-menus 2015-05-09 10:02:48 +01:00
9fe654c6e4 Assert on modifiers stack size mismatch between Begni()/End() pairs #204
Experimenting with this. It's helpful but not happy with the idea of
ImGui asserting on that sort of user error.
2015-05-09 09:59:46 +01:00
debe6522bb Examples: test for tooltip over popup. 2015-05-07 19:00:17 +01:00
33e8fb85cf Allow stacking popups, not really useful yet (wip #126) 2015-05-07 18:43:08 +01:00
dd2a578012 Added ImGuiSetCond_Appearing to test the hidden->visible transition. 2015-05-07 18:39:23 +01:00
f46557d2d6 MenuItem() draft for popups, with Selected option (wip #126) 2015-05-07 17:21:48 +01:00
c36172ebef Tweak RenderCheckMark() 2015-05-07 17:11:32 +01:00
85b8967291 Added RenderCheckMark() helper following the font size
Pretty ugly, not sure what's the right way to solve that automatically,
better shown as an "icon" so it doesn't have to necessarily look like
the font.
2015-05-07 17:06:07 +01:00
13c3f11c66 Comments (#209) 2015-05-07 11:36:16 +01:00
fbbe7fee53 Fix "Debug" window stealing focus/popup #208 #209 @thevaber 2015-05-07 11:24:51 +01:00
25d8c1af91 Removed inline marker #210 2015-05-07 10:48:05 +01:00
e7ffcea33d Removed style.AutoFitPadding, using style.WindowPadding makes more sense (the default values were already the same). 2015-05-03 14:26:47 +01:00
b1b23d6ca9 Autofit cancel out one worth of vertical spacing for correct symmetry (group and tooltip already do that) 2015-05-03 13:52:53 +01:00
0ca7926b94 Popup auto-border doesn't spread to its childs #197 2015-05-03 13:04:43 +01:00
a3a10d4a3c Popup have borders by default #197 attenuated border alpha in default theme 2015-05-03 12:17:53 +01:00
47e875314b Plot: overlay label clipped within frame when bigger than frame 2015-05-03 11:32:39 +01:00
d84b5737a6 Popups, Tooltips: fit within display. Hidden during size calculation. Fixed popups flicker when changing size.
Big change, needed reorder of Begin(). May trigger new bugs.
2015-05-02 18:22:46 +01:00
99e315d2b2 Fix for width of child windows with scrollbar (broken 376a6a5af0) 2015-05-02 18:14:24 +01:00
221f36e116 Comments, tweaks, metrics window tweak 2015-05-02 17:54:25 +01:00
a3560b274e Tidying up Begin(): using local copy of 'flags' for brevity 2015-05-02 17:45:54 +01:00
6ca4b31bf8 Fixed popup resizing (broken 376a6a5af0) 2015-05-02 15:54:35 +01:00
a906738ba7 Renamed Visible->Active internally 2015-05-02 13:20:50 +01:00
1b5795c96d InputText: fixed incorrect edit state after text buffer is modified by user through callback #206 2015-05-02 12:45:53 +01:00
81bf614821 Fix window size after collapsing (broken 376a6a5af0) 2015-05-02 12:35:34 +01:00
7fac4013a4 Build fix 2015-05-02 12:22:52 +01:00
4e292bf67d Tidying up Begin(): separated blocks needed for auto-resize so it can be moved above position calculation later 2015-05-02 12:20:06 +01:00
376a6a5af0 Tidying up Begin() separated blocks needed for auto-resize so it can be moved above position calculation later
Being cautious again. Hopefully didn't break anything.
2015-05-02 12:08:24 +01:00
46f55fe6f6 Tidying up Begin() 2015-05-02 10:46:24 +01:00
3f7f256752 Tidying up. Re-arranged the (first_begin_of_the_frame) blocks in Begin() for further changes.
Being cautious.
2015-05-02 10:32:32 +01:00
19f7bf90f8 Examples: AutoResize demo doesn't use TextWrapped() 2015-05-01 21:01:54 +01:00
07ebb14ce2 Tooltip: fit within display. Added style.DisplayWindowPadding, style.DisplaySafeAreaPadding now strictly for popups/menus. 2015-05-01 20:35:44 +01:00
ad7f600e0d Examples: DirectX9/11: hide os curosr if ImGui is drawing it (#155) 2015-05-01 11:25:15 +02:00
68ccdc4fb8 Comments 2015-05-01 11:07:30 +02:00
8fbb42cc6f Added IsKeyDown() IsMouseDown() as convenience instead of reading into IO structures
Also their existence serves as implicit documentation of what
IsKeyPressed(), IsMouseClicked() does
2015-04-28 18:12:24 +02:00
2440a30444 Columns() distinguish columns-set ID from other widgets as a convenience, added asserts, added more sailors 2015-04-28 18:09:38 +02:00
bd23c11a93 Separator() within group start on group horizontal offset #205 2015-04-27 22:19:14 +02:00
1d90f099bd Tidying up
We still have an issue with ImVec4 vs ImRect
2015-04-26 13:17:56 +02:00
6844952d56 Fixed build with Visual Studio 2008 or earlier (via PR #203) 2015-04-24 09:22:29 +02:00
18a00c7060 Examples: DirectX9/11: Fixed key mapping for down arrow. 2015-04-24 09:18:56 +02:00
c93a562b06 Added ImGuiStorage::GetVoidPtrRef() 2015-04-21 10:12:17 +01:00
9119f58ce5 Version number 1.39 WIP 2015-04-21 10:09:20 +01:00
0123fc8c0f Removed comment 2015-04-19 23:56:35 +01:00
37d8d78fc2 Selectable() render into AutoFitPadding only when full-fitting (fix aac99819d6) 2015-04-19 23:37:50 +01:00
064b94721e Added DragFloat2, DragFloat3, DragFloat4, DragInt2, DragInt3, DragInt4. 2015-04-19 23:28:57 +01:00
05ee36baab Version number 1.38 2015-04-19 22:59:27 +01:00
85e18c72d2 ShowTestWindow(): drag example + tooltip. 2015-04-19 22:57:39 +01:00
731b003c9d Slider internals: removed unnecessary slider_bb parameter 2015-04-18 19:34:05 +01:00
acbd58627f ShowTestWindow(): added a custom label in the format for one of the slider example. 2015-04-18 17:35:40 +01:00
c46d5634d4 Columns: mouse dragging uses absolute mouse coords. Fixed dragging left-most column of an auto-resizable window. #125 2015-04-18 13:46:28 +01:00
c82f909be1 Active column (when dragged) not clipped so it can release its active state (extends 16ddd796f3) 2015-04-18 12:11:59 +01:00
26e469af22 Documentation 2015-04-18 09:19:41 +01:00
04a4433706 Update imconfig.h documentation 2015-04-18 09:16:32 +01:00
02de9bd859 DragFloat, DragInt: if step/speed is zero defaults to 1% of range #180 2015-04-17 10:01:39 +01:00
6408ac482c Merge pull request #199 from bkaradzic/master
Fixed C4267 size_t to unsigned int conversion warning.
2015-04-17 08:09:07 +01:00
6920e70e2e Fixed C4267. 2015-04-16 15:52:35 -07:00
7fde17e15a ShowMetricsWindow(): renaming locals (not sure about the "shadows a local variable" warning?) 2015-04-16 23:30:48 +01:00
0d4f29a317 Merge branch 'bkaradzic-master' 2015-04-16 23:28:58 +01:00
508d05414a Fixed warning: missing initializer for member. 2015-04-16 14:45:42 -07:00
b7b3df3c81 Fixed: warning: declaration shadows a local variable 2015-04-16 14:42:17 -07:00
d24474ea82 Fixed: warning: missing field 'w' initializer [-Wmissing-field-initializers] 2015-04-16 14:39:04 -07:00
64db50ba46 TODO list 2015-04-16 10:58:30 +01:00
aca85dbea4 Fixed hovering over a popup's child (popups disable hovering on other windows but not their childs) #197 2015-04-16 10:54:56 +01:00
f400ea4ec8 Examples: OpenGL3: backup/restore current program and texture #195 2015-04-15 10:14:51 +01:00
17b63d846f Merge pull request #194 from Roflraging/master
Examples: GLFW Set modifier key state by inspecting imgui's io.KeysDown array (see #183)
2015-04-14 20:33:12 +01:00
ac518a1d3e Set modifier key state by inspecting imgui's io.KeysDown array. 2015-04-14 14:09:26 -05:00
de3a154f38 Tweak date/credits 2015-04-14 12:00:12 +01:00
71429d306e Examples: Simplified GLFW keyboard callbacks 2015-04-14 09:45:27 +01:00
c735d3066b Merge branch 'master' of https://github.com/Roflraging/imgui into Roflraging-master 2015-04-14 09:37:10 +01:00
fe15756129 Simplified glfw keyboard callbacks. 2015-04-13 20:04:53 -05:00
88bc8efab0 Merge pull request #193 from Extrawurst/patch-3
Fix outdated documentation
2015-04-14 00:22:32 +01:00
b28ec1f3b1 fix outdated documentation 2015-04-14 00:40:46 +02:00
dd36e8bf2b Renamed IsClipped() to IsRectClipped(). Kept inline redirection function (will obsolete). 2015-04-13 22:04:28 +01:00
d11b4160aa Added IsItemVisible(). Made IsClipped() also return false when log is enabled. 2015-04-13 21:52:38 +01:00
16ddd796f3 Active widgets is not clipped, so it can always release its active state (mentioned in #143)
Otherwise a change in layout moving active widget to a clipped region
may lock the active id.
2015-04-13 20:59:44 +01:00
9918ec31d6 Added ResetMouseDragDelta() for iterative dragging operations 2015-04-13 19:54:40 +01:00
a143e2e772 Added PushId() GetId() variants that takes string range to avoid user making unnecessary copies 2015-04-13 14:45:27 +01:00
750b6c9224 DragFloat() fixed clamping #180 2015-04-13 00:07:41 +01:00
6ed06a8dc8 DragFloat() added power parameter for logarithmic drag on both side of zero #180 2015-04-13 00:03:57 +01:00
f5ad362912 DragFloat() latch value internally, allows finer control, honor precision settings, slow step with integer works #180 2015-04-12 19:15:55 +01:00
0dc3d07e7f DragInt() step given as float to allow finer control of speed #180 2015-04-12 19:08:56 +01:00
62abde5b37 DragFloat() latch value internally, allows finer control, honor precision settings, slow step with integer works #180 2015-04-12 19:07:48 +01:00
b308d2728b Remove stray tabs 2015-04-12 10:45:00 +01:00
adae98664e Comment on the newly added binary_to_compressed_c.cpp helper program 2015-04-12 10:31:10 +01:00
7ca21a1bc2 Fixed prototypes 2015-04-11 18:12:11 +01:00
ac740170b9 Added ImFontAtlas::AddFontFromCompressedTTF() helper + binary_to_compressed_c.cpp tool 2015-04-11 18:00:09 +01:00
d809abbe1c Examples: DirectX11: tidying up. 2015-04-09 23:32:36 +01:00
a48130b682 ImDrawList: Minor optimisation. 2015-04-09 22:49:18 +01:00
dd893ac4f5 Warning fix. 2015-04-09 21:43:42 +01:00
4f51b77937 Examples: OpenGL3: Tweaks (argh, github ui) 2015-04-09 21:19:21 +01:00
90766141b3 Examples: OpenGL3: Tweaks. 2015-04-09 21:18:43 +01:00
37f1715bfa Examples: DirectX11: Removed unnecessary vertices conversion and CUSTOMVERTEX types. 2015-04-09 21:14:52 +01:00
500a8a0e02 ImDrawList: bits of renaming. 2015-04-09 21:00:45 +01:00
4fa3eee84e Renamed io.MetricsVertices to io.MetricsRenderVertices 2015-04-09 19:47:41 +01:00
aa1a96f907 ImDrawList: inline AddVtx() calls for profit in highly debug builds 2015-04-09 18:34:31 +01:00
334fba2f56 Spacing 2015-04-09 17:33:17 +01:00
707df6c7b7 ImDrawList: internal refactoring toward a following commit for indexed rendering. 2015-04-09 17:32:03 +01:00
742808d835 Tweaks. 2015-04-09 17:24:09 +01:00
15f82e0deb Fix rounded frames to follow previous change 2015-04-09 17:20:57 +01:00
aa2935968e Renamed AddArcFast() parameter 'tris' to 'filled' 2015-04-09 16:47:20 +01:00
f38cca09cf Merge branch 'master' of https://github.com/ocornut/imgui 2015-04-09 16:45:21 +01:00
0fc1f5b17f Revert AddArcFast()->AddArc(), removed modulo from function 200d3482dc 2015-04-09 16:45:14 +01:00
ae1166a783 Merge pull request #191 from Extrawurst/patch-2
Fixed unused variable warning.
2015-04-09 15:59:43 +01:00
2bb6e31520 fix unused variable warning by clang 2015-04-09 16:50:54 +02:00
200d3482dc Renamed ImDrawList::AddArc() to ImDrawList::AddArcFast() for compatibility with future API, and changed 2*PI range from 0..12 to 0..16 2015-04-09 00:49:21 +01:00
71cfa264d7 Merge pull request #188 from Extrawurst/patch-1
Fix initialising ints with float literals
2015-04-08 22:58:34 +01:00
5ba77928ba fix initialising ints with float literals 2015-04-08 22:56:25 +02:00
b9dd7c65ab Update README.md 2015-04-07 20:09:59 +01:00
241ccb46d5 Update README.txt + screenshot 2015-04-07 19:55:32 +01:00
3c6257b8b9 Fixed IsRootWindowOrAnyChildFocused() crashing if no window has focus (introduced yesterday in c38c54af52) 2015-04-07 14:04:43 +01:00
6e99688fa7 Fixed user-facing version of IsItemHovered() ignoring overlapping windows 2015-04-07 14:03:17 +01:00
d692286862 Added ShowMetricsWindow() 2015-04-07 13:42:35 +01:00
8211081c54 Added (not exposed) DisableHideTextAfterDoubleHash to disable ## processing. 2015-04-07 13:37:30 +01:00
33ef3992f7 Added IO.MetricsVertices counter 2015-04-07 13:36:11 +01:00
d9ff617ff8 Examples: Formatting #187 2015-04-07 12:56:52 +01:00
7c9739c67f Merge pull request #187 from heroboy/patch-1
Examples: DirectX9: Set shaders to NULL to enforce using fixed pipeline.
2015-04-07 12:55:12 +01:00
e09e2cbd28 set pixel shader and vertex shader to NULL
Previous graphic render may use shaders,so set pixel shader and vertex shader to NULL to force use fixed pipeline.
2015-04-07 19:36:58 +08:00
6e4d3dac1a Examples: Fixed ShowExampleAppManipulatingWindowTitle() not doing the right thing, broken in ff35d24bcc 2015-04-07 11:54:53 +01:00
a8a5ba9d1e Update README.txt 2015-04-07 11:15:18 +01:00
46769406dc Update README.txt 2015-04-07 10:59:49 +01:00
c38c54af52 Clicking on void loses keyboard-focus so application can use TAB back 2015-04-06 11:25:07 +01:00
fe64da6197 Allow SetWindowFocus(NULL) to remove focus 2015-04-06 11:19:31 +01:00
73e2d56acc Examples: OpenGL fixed-pipeline: added glBindTexture(0), via Anton M 2015-04-06 10:45:10 +01:00
f5310a2f2d Comments 2015-04-04 19:03:39 +01:00
28a45877aa DragFloat() comment examples, not ready for prime-time #180 2015-04-03 16:21:24 +01:00
c93f34238e DragFloat() examples #180 2015-04-03 15:18:12 +01:00
962aa4c396 DragFloat() double-clicking turns into an input box (along with Ctrl+clicking) #180 2015-04-03 15:15:12 +01:00
916a8955ec DragFloat(): passing min>=max (e.g. 0.0f) for range makes the drag unbound #180, removed extra APIs 2015-04-03 15:13:59 +01:00
61d886e14b SliderFloat() removed support for unbound/infinite slider, inconsistent. Use InputFloat()/DragFloat() 2015-04-03 15:10:07 +01:00
4b7be31197 Fixed modifier key state setting in GLFW callbacks. 2015-04-03 09:01:48 -05:00
aac99819d6 Selectable() render into AutoFitPadding but do not extend it, fixing small visual gap
Followup 2e26196aba /  #1
2015-04-03 14:40:15 +01:00
f3967f1183 Combo() adding frame padding inside the combo box. 2015-04-03 14:32:46 +01:00
dc52938627 InputInt2(), InputInt3(), InputInt4(): fixed label vertical alignment 2015-04-03 14:22:00 +01:00
f7e35ce120 ShowTestWindow() renamed sliders examples to say "slider" 2015-04-03 14:20:04 +01:00
1247ce251f Added DragFloat(), DragInt() work in progress #180 2015-04-03 14:07:52 +01:00
d25578efd8 Examples: initializing float + missing comment. 2015-04-03 12:11:41 +01:00
6aed651f77 ColorEdit4(): tweak code to be a little less ugly (still not a beauty contest winner..) 2015-04-03 11:49:02 +01:00
2d157d3af0 ColorEdit4(): hide components prefix if there's no space for them. 2015-04-03 11:25:44 +01:00
e6792f84d4 Comments and organization of imgui.h 2015-04-03 10:22:18 +01:00
153db91917 Slider: don't call RenderText() on empty label. 2015-04-02 22:39:37 +01:00
74f2e53b3b Slider: fix in the unlikely case that style.GrabMinSize is larger than a slider. 2015-04-02 22:38:37 +01:00
31fd72bde1 Internal renaming 2015-04-02 21:21:35 +01:00
503b8c20de Delete font clear pointer in ImGui state to get a clear crasah instead of a dangling pointer. #181 2015-04-02 17:48:22 +01:00
b61b311772 Fixed Begin() returning true on collapsed windows that loaded settings #176 2015-04-02 10:56:59 +01:00
e03d2b2900 ImVec2/ImVec4 no-parameters constructs init to 0.0f. Saner. Couldn't measure perf differences in a simple stress test compiled in Debug mode 2015-04-01 15:57:09 +01:00
fc1b0b090c Update README.md
Coverity badge
2015-04-01 15:26:36 +01:00
a4cf50affe Fix uninitialized fields - MouseCursor set by first call to NewFrame() 2015-04-01 15:08:42 +01:00
c0699958ce Fix for Coverity static analysis 2015-04-01 15:05:06 +01:00
eb3e640fa6 Fixed style.DisplaySafeAreaPadding handling from being applied on window that never were auto-fit 2015-03-31 00:41:15 +01:00
468fcd7b30 Fixed mouse wheel scrolling (broken 2 commits ago 9d16b85ed2) 2015-03-31 00:15:23 +01:00
0a31531f44 Warning fix in demo code 2015-03-30 21:16:24 +01:00
9d16b85ed2 Caching current Font, FontSize into state for quicker/simpler access. 2015-03-29 19:45:03 +01:00
e16f2e898a Version number 1.38 WIP 2015-03-29 10:09:14 +01:00
3abfb85613 Comments on font loading, fixed commented out paths and added DroidSans in the list 2015-03-28 11:48:42 +00:00
ff35d24bcc Comments 2015-03-27 19:34:01 +00:00
4ee5a792ff Fixed new collapsed auto-resizing window with saved .ini settings not calculating their initial width #176 2015-03-27 15:18:45 +00:00
2e26196aba Selectable() fixed misuage of GetContentRegionMax().x 2015-03-26 21:13:03 +00:00
a1582874d3 Changed new ImDrawList::AddLine() half_thickness to hickness, just in time for release 2015-03-26 20:24:55 +00:00
729e524955 Version number 1.37 2015-03-26 20:16:53 +00:00
bcd85e7cd6 Auto contents size aware of enforced vertical scrollbar if window is large than display height. 2015-03-26 20:14:15 +00:00
e1de4908f6 Removed bool return value from BegniPopup() at the moment, it is meaningless. Tidying up. 2015-03-26 19:18:06 +00:00
4b7818dfc2 Bounding box tests exclude higher bound, so touching items (zero spacing) don't report double hover when cursor is on edge 2015-03-26 19:05:47 +00:00
c6112550eb Added Haddock in the (popup) Aquarium 2015-03-26 19:02:54 +00:00
f5ba64d8cd Sorting of windows for render doesn't do 3 pass stupidly. Made code a little closer to what it should become with a layering system 2015-03-26 18:51:45 +00:00
93c9777165 Fix for using tooltips within popup #126 - will need to rewrite the sorting/layering system shortly. 2015-03-26 18:17:55 +00:00
a3086f40fe Renamed internal RenderSortedWindows -> WindowsSortBuffer + cleanup popup closing code 2015-03-26 18:01:40 +00:00
fc25d71f84 Refactored duplicated code into an inline function & made more readable 2015-03-26 17:45:11 +00:00
a4dc775339 Fixed hovering bug introduced in ac2da570 when popup is inactive #126 2015-03-26 17:35:52 +00:00
5fe4ae62cb Popup: clicking on empty space also close popup #126 2015-03-26 17:24:05 +00:00
ac2da570f5 When a popup window is open it inhibit hovering on other windows #126 2015-03-26 17:17:42 +00:00
de7552047b Simplified example 2015-03-26 17:11:14 +00:00
91f8eb7b92 Added early version of BeginPopup/EndPopup() #126 2015-03-26 17:09:17 +00:00
d3e8e15e41 Added popup demo code (commented out because I expect to make popup menu proper citizens by next version) 2015-03-26 16:45:44 +00:00
7e334013a0 Selectable(const char*, bool) version has bool defaulting to false 2015-03-26 16:42:46 +00:00
325e292427 Selectable(): not specifying a width default to using max of label width and remaining width 2015-03-26 16:41:52 +00:00
3268646180 Fixed clipping rectangle's own clipping #177 2015-03-26 16:28:41 +00:00
743c815821 Renamed IsItemHoveredRectOnly -> IsItemHoveredRect (introduced after previous release) 2015-03-26 16:18:01 +00:00
8b7668d24f Avoid negative clipping rectangle when collapsing windows, ImDrawList could still submit data #177 2015-03-26 16:03:30 +00:00
b04ee7e040 Added a more convenient three parameters version of Begin() which Flags more accessible. 2015-03-23 22:50:17 +00:00
9d4ba2e27d Using SetNextWindowSize() in examples to encourage its use 2015-03-23 22:45:05 +00:00
c9430bb807 Fixed new windows auto-fitting bigger than their .ini saved size 2015-03-22 17:22:39 +00:00
e176a8b93f OCD normalising function comments not ending with a comma 2015-03-22 16:26:48 +00:00
b578e86971 Fixed SetWindowPos/SetNextWindowPos affectiving size computation (#175) 2015-03-22 16:08:42 +00:00
5737a79c8d Fixed new window from having an incorrect content size on their first frame (#175) 2015-03-22 15:58:44 +00:00
7e8f1f1062 Collapsed windows run initial auto-fit to resize the title bar #175
Maybe have side-effects on window contents? Unsure at this point.
2015-03-22 15:34:41 +00:00
ed94edfd8e Examples: Terser code + added commented out glUseProgram(0( suggestion in OpenGL2 sample. 2015-03-22 14:14:23 +00:00
136dbdfd95 Merge pull request #174 from adamdmoss/glfwcursor
Examples: OpenGL/GLFW: hide system cursor if imgui is soft-rendering cursor
2015-03-22 14:10:27 +00:00
c1766c95ed OpenGL/GLFW: hide system cursor if imgui is soft-rendering cursor 2015-03-22 13:49:36 +00:00
efd927e300 ShowTestWindow: missing TreePop() call in Mouse Cursor section. 2015-03-22 00:00:49 +00:00
fde991fbbb Update README.md 2015-03-21 23:56:23 +00:00
dec73a8a8a Update README.md - demo binaries 2015-03-21 23:51:57 +00:00
99314dad73 Updated FAQ 2015-03-21 23:14:21 +00:00
072c57b0ca Setting io.LogFilename to NULL disable default LogToFile() (part of #175) 2015-03-21 19:30:46 +00:00
85f432dc8d Commented standard library include with the functions we use. Using ImFormatString in place of sprintf (part of #172) 2015-03-21 19:27:29 +00:00
7c8946b9b7 Hovering a column set the resize <> mouse cursor #155 2015-03-21 17:48:03 +00:00
b024ff85f7 Fixed comment 2015-03-21 15:15:16 +00:00
dee2790133 Mouse cursor offset tweak #155 2015-03-21 15:12:47 +00:00
9363e6c154 Prepacking mouse cursors to save on source code size, generally simpler #155 2015-03-21 15:09:01 +00:00
810fcd8bcb Added mouse cursor types handling + embed mouse cursor data #155 2015-03-21 13:59:19 +00:00
7f49ac0407 Disabled -Wmissing-noreturn warning for Clang a bit reluctantly - will put back when removing GetDefaultFontData() #173 2015-03-21 10:14:10 +00:00
bae32567c3 Fixed unused parameter warning with empty IME handler #173 2015-03-21 10:04:10 +00:00
8f90238e53 Fixed IMGUI_DISABLE_TEST_WINDOWS #169
Fixed warning
2015-03-21 10:03:03 +00:00
92a22ab35f Shutdown() freeing a few extra vectors so they don't have to freed by destruction #169 2015-03-21 00:41:34 +00:00
c0eab2a164 Moved draw list for io.MouseDrawCursor to state (#169) 2015-03-21 00:22:36 +00:00
c18a409a97 Auto-filling child window feed their content size to parent - hopefully fix more problem than it causes? #170 2015-03-20 23:34:03 +00:00
f32d92f842 Merge branch 'mmozeiko-allow-to-disable-test-window' 2015-03-20 22:53:06 +00:00
6699ccfd1f Tweaked IMGUI_DISABLE_TEST_WINDOWS so it doesn't show in ImGui.h 2015-03-20 22:52:32 +00:00
5600ef9701 Merge branch 'allow-to-disable-test-window' of https://github.com/mmozeiko/imgui into mmozeiko-allow-to-disable-test-window 2015-03-20 22:50:07 +00:00
5f914c9cbe Comment 2015-03-20 21:06:45 +00:00
60f3cfbe98 Fixed MouseDrawCursor feature submitting an empty trailing command in the draw list
+ Merged 4 draw calls into one, should be merged at lower level.
2015-03-20 20:50:55 +00:00
2142181c51 Allow to disable help and test window functionality 2015-03-20 12:08:00 -07:00
efeeba99ca Tweak stb_textedit integration to be lenient if another user are leaking their STB_TEXTEDIT definitions/symbols 2015-03-20 14:03:23 +00:00
876a755bac Removed unnecessary assert (will crash well enough without) + comment 2015-03-20 11:22:26 +00:00
4cd438f663 Added IsMouseDragging(), GetMouseDragDelta() given button and lock threshold. added io.MouseDragThreshold setting. (#167)
Removed GetItemActiveDragDelta()
2015-03-20 11:13:18 +00:00
c070314621 Reverted 11025b3160, 129339adb0 it breaks collapsing implicit debug window 2015-03-20 10:54:21 +00:00
2d81a73f85 Double-clicking on resize grip doesn't keep grip active if mouse button is kept held. 2015-03-20 10:51:33 +00:00
2d29907611 Added GetMouseDragDelta() helper. No unlock threshold yet (#167) 2015-03-20 10:49:17 +00:00
a71fc8e6a5 Fixed MouseClickedPos not updated on double-click update (fix #167) 2015-03-20 10:46:07 +00:00
3b3a32cbd6 Merge pull request #168 from mmozeiko/fixassert
Replace assert() with IM_ASSERT in some functions copied from stb.h
2015-03-20 08:37:13 +00:00
8a553cdcbe Replace assert with IM_ASSERT in few places. 2015-03-19 19:36:17 -07:00
ff5378bd66 InputText() last active preserve scrolling position. Reset scroll if widget size becomes bigger than contents. 2015-03-19 16:45:37 +00:00
d1aca79f4e InputText() update its width in case of resize initiated programmatically 2015-03-19 16:40:59 +00:00
693bd56db2 InputText() removed the odd ~ characters when clipping. Tweaks and fixes of clipping. 2015-03-19 16:04:22 +00:00
6e5130ddf4 ShowTestWindow: Added Wdigets Alignment demo under Layout section 2015-03-19 15:10:43 +00:00
129339adb0 Removed 'Accessed' flag from ImGuiWindow so GetCurrentWindow() compiles to a simpler accessor 2015-03-19 15:03:10 +00:00
11025b3160 Implicit "Debug" window hide itself based on cursor extend instead of the 'Accessed' flag. 2015-03-19 15:01:07 +00:00
d953f8d99a ShowTestWindow: Graph checkbox under the label, also demo using BeginGroup/EndGroup() 2015-03-19 14:49:58 +00:00
2f0fb2bc34 IsItemhovered() include label and behave consistently (#145) 2015-03-19 14:48:36 +00:00
314b87dfaf InputFloat(): fixed label alignment if total widget width forcefully bigger than space available 2015-03-19 14:15:51 +00:00
c151f35751 Merge pull request #166 from jsimmons/master
Remove spurious assert
2015-03-19 11:46:31 +00:00
6425b8c1cf Remove spurious assert
Remove nop assert that causes warnings on Clang.
2015-03-19 22:42:17 +11:00
13caf21018 Use fabs() instead of abs() to ensure we use floating point. #164 2015-03-19 09:06:34 +00:00
7a2da7cd02 Added style.DisplaySafeAreaPadding which was previously hard-coded (for use if you can't see the edges of your display, e.g. TV screens) 2015-03-18 22:35:51 +00:00
62e8661a37 Fixed assignment order in Begin() making auto-fit size effectively lag by one frame
Also disabling "clamp into view" while windows are auto-fitting
2015-03-18 22:35:50 +00:00
9a6aebeb96 Merge pull request #163 from biller23/patch-1
Examples: typo in ImGui_ImplGlFwGL3_KeyCallback() forward-declaration.
2015-03-18 20:26:03 +00:00
2f4271a2b3 typo ImGui_ImplGlfwGL3_KeyCallback() 2015-03-18 21:02:29 +01:00
d45d1d1bca Documentation tweaks and fixes 2015-03-18 19:00:03 +00:00
ed0f0dbe87 ImDrawList::AddText() takes a const ImFont* 2015-03-18 14:58:17 +00:00
4e245f0bfb Update README.md
Link to Synergy sources
2015-03-18 14:06:39 +00:00
bc88ed0cb9 Fixed bounding measurement of empty groups (fix #162) 2015-03-18 13:21:32 +00:00
e14c7e5510 ShowTestWindow(): Added simple dragging widget example. 2015-03-18 13:15:11 +00:00
dcaafffe0e Added CalcItemRectClosestPoint() helper. 2015-03-18 13:07:37 +00:00
9f1b407def ImDrawList: added thickness param to AddLine(). Added PushClipRectFullScreen() helper. 2015-03-18 12:54:44 +00:00
7d26e85b05 IsItemHovered() return false if another widget is active. Added IsItemHoveredRectOnly(). 2015-03-18 12:10:26 +00:00
6f150d8800 Merge pull request #161 from adamdmoss/boxmax
GetItemBoxMax: fix obsolete function copy-n-paste bug
2015-03-18 11:30:32 +00:00
1de735ba7c GetItemBoxMax: fix obsolete function copy-n-paste bug 2015-03-18 11:27:37 +00:00
e10d648a28 Added ImGui::GetItemActiveDragDelta() helpers for drag operations 2015-03-18 10:41:46 +00:00
215b0065e3 Version number 1.37 WIP 2015-03-18 10:24:56 +00:00
7665b8e5e7 Version number 2015-03-18 09:39:38 +00:00
d8026e4d84 Added VSliderInt() 2015-03-18 09:39:09 +00:00
2a9a2918f8 ShowTestWindow(): more examples of SameLine() usage 2015-03-18 00:07:21 +00:00
9c489a081c ShowTestWindow(): added vertical sliders examples, tweaks. 2015-03-17 23:58:22 +00:00
be83c07957 Changed mentions of 'box' to be 'rect' 2015-03-17 23:41:20 +00:00
7e6112bf26 Changed remaining mentions of 'aabb' to be 'rect' 2015-03-17 23:37:17 +00:00
302316c6cf Renamed internal type ImGuiAabb to ImRect 2015-03-17 23:35:12 +00:00
7e297945c3 Added BeginGroup() / EndGroup() layout tools (#160) 2015-03-17 23:28:57 +00:00
da4bfe3289 Added GetItemRectSize(). Renamed GetItemRectMin()/GetItemRectMax()/IsMouseHoveringBox() to GetItemRectMin()/GetItemRectMax()/IsMouseHovering 2015-03-17 22:36:54 +00:00
2e63bf1d16 Button() doesn't add frame padding an explicit size 2015-03-17 22:27:00 +00:00
30bc952ac3 Maintaining DC.CursorMaxPos instead of SizeContentsCurrent, simpler, faster and easier to understand. 2015-03-17 22:03:02 +00:00
fd7f50d269 Various fixes related to vertical alignment of text after widget of various sizes. Added demos. Toward #160
Also fixed LabelText() height.
2015-03-17 20:17:53 +00:00
3bd5597cee Moved text vertical centering out of ItemSize() for the moment, in TextUnformatted() it's only user 2015-03-17 17:17:00 +00:00
bbaf7e2eee Internal tweaks 2015-03-17 16:40:47 +00:00
fe2809fecc Changed default Border and Column border colors to be most subtle, less MS-DOS 2015-03-17 16:16:15 +00:00
7e00a41f1b Speculative warning fix 2015-03-16 18:04:51 +00:00
cb285c4d35 Examples: uses SetNextWindowPos/SetNextWindowSize when applicable 2015-03-16 11:53:36 +00:00
04358c301e Removed extraneous spaces 2015-03-16 11:49:18 +00:00
d4c0ecea0e Merge pull request #159 from adamdmoss/master
Examples: OpenGL: if content window doesn't have focus, tell ImGui we don't have a mouse position.
2015-03-16 11:46:29 +00:00
f2ff88b03a opengl3+opengl example: if content window doesn't have focus, tell ImGui we don't have a mouse position. e.g. avoids tooltips popping up in imgui app when you're interacting with a different app window that overlaps it. 2015-03-16 10:47:14 +00:00
d3e444dfd9 Examples: DirectX9: fixed duplicate creation of vertex buffer. Size of static vertex buffer at top of the code. 2015-03-16 10:02:10 +00:00
f4970d0e00 Moved static buffers into state
No recursion in any of those functions. Tho keeping a lock api may be
preferable?
2015-03-16 09:54:28 +00:00
733eedc477 Moved static buffer into state 2015-03-16 09:45:32 +00:00
d08ce58876 TreeNodeV() early out if SkipItems is set (avoid formatting string only to be discarded later) 2015-03-16 00:46:03 +00:00
0fc9168439 Added InputInt2(), InputInt3(), InputInt4() 2015-03-15 11:30:00 +00:00
9c6c8a1ab9 ShowTestWindow() using Unindent() / Indent() instead of an explicit TreePop 2015-03-15 11:21:59 +00:00
44826972c0 Added Indent(), Unindent() 2015-03-15 11:19:10 +00:00
edde703f8f Renamed style.TreeNodeSpacing to style.IndentSpacing, ImGuiStyleVar_TreeNodeSpacing to ImGuiStyleVar_IndentSpacing 2015-03-15 11:10:48 +00:00
304d19a0d8 ShowTestWindow() added multi-components sliders in a sub-node
+ right align all widgets
2015-03-15 11:03:55 +00:00
b443c7ebe9 Tweak VSliderFloat()
Not really happy about them
2015-03-15 10:38:19 +00:00
1ac4f33736 Added VSliderFloat() 2015-03-15 01:58:14 +00:00
7019cb10f7 "behaviour" -> "behavior" to behave like the greatest number 2015-03-15 01:48:59 +00:00
c1547dd79e Internal SliderBehaviour() function now supports vertical sliders 2015-03-15 01:47:12 +00:00
ce8150ce69 Slider fix hovering bounding test excluding padding between outer frame and grab 2015-03-15 01:36:29 +00:00
6da83cd5b7 Plot: size provided to PlotHistogram(), PlotLines() include the padding (sorry users). 2015-03-15 01:27:37 +00:00
98eeeab025 Added ImGuiStyleVar_GrabMinSize enum value for PushStyleVar() 2015-03-15 01:23:56 +00:00
1ef789bb68 Slider code tweaks, split into a SliderBehaviour() function 2015-03-14 23:55:07 +00:00
ce87c69c38 Passing ImGuiID by copy (32-bits) 2015-03-14 23:44:32 +00:00
93befadc0b Slider code tweaks 2015-03-14 23:33:12 +00:00
06fbeed41a Examples: Fixed Makefile 2015-03-14 11:29:09 +00:00
55edd522c2 Examples: Fixed Makefile 2015-03-14 11:24:53 +00:00
e97d02a294 Examples: Fixed Clang warnings in DirectX examples 2015-03-14 10:49:26 +00:00
7c9bd71512 Examples: MSVC: increase warning level from /W3 to /W4 for OpenGL examples 2015-03-14 10:41:42 +00:00
2b0acc128c Examples: MSVC: increase warning level from /W3 to /W4 for DirectX examples 2015-03-14 10:32:29 +00:00
60591dd7c6 Fixed warning and split bit of SliderFloat() into a private ParseFormat() function 2015-03-14 10:30:07 +00:00
8e0f04638d Examples: Fix includes order to avoid conflicts between DXSDK_DIR and Windows SDK 2015-03-14 10:24:35 +00:00
e2c4ba21bc Examples: Added 64-bit projects for MSVC 2015-03-14 10:09:53 +00:00
ef957b7878 Examples: Moved GLFW/GL3W to a common libs/ folder 2015-03-14 10:04:30 +00:00
834085c90c Examples: Updated to GLFW 3.1 2015-03-14 10:00:11 +00:00
72855becab Slider code syntax tweaks 2015-03-14 09:36:15 +00:00
eff466d77d Fixed parsing of decimal precision back from format string when using %% 2015-03-13 13:38:58 +00:00
110d96034b SliderFloat() fast-path when power=1.0f (no powf() calls) also makes code easier to read 2015-03-13 13:28:30 +00:00
aaca73de15 Refactor SliderFloat() internals into a helper SliderFloatAsInputText() + some comments 2015-03-13 13:23:03 +00:00
4d78c5c9ab Comments and reduced ImGuiTextEditState.InitialText[] to 3 KB (assuming average use case of UTF-8 uses 3 bytes charracters) 2015-03-13 13:15:01 +00:00
ceb4da2038 Comments 2015-03-13 13:04:10 +00:00
55093ea8fe Separator() logs itself as text 2015-03-13 12:44:04 +00:00
153454a0fb Example console keeps focus on input box at all times 2015-03-13 12:28:23 +00:00
1c1a55f6b1 Added IsRootWindowFocused(), IsRootWindowOrAnyChildFocused(). Renamed GetWindowIsFocused() to IsWindowFocused() 2015-03-13 12:25:43 +00:00
e2734d23ef Child window don't take focus when they first appear (focus left to parent) 2015-03-13 11:16:11 +00:00
0911526424 Added io.KeyAlt + support in examples apps
Currently unused but supported by sample so that more people will have
it set up when menus needs them
2015-03-13 09:49:38 +00:00
58dc3f97c5 WIP marker in uppercase.. (#127) 2015-03-11 16:45:58 +00:00
5d1c381509 Update version number, added IMGUI_VERSION, ImGui::GetVersion() (#127) 2015-03-11 16:44:54 +00:00
4b1a18c2c9 Fixed more warnings from @bkaradzic 2015-03-09 18:36:03 +00:00
dac9266f6f Fixed warnings 2015-03-09 18:26:48 +00:00
d440a13b7e Version number 2015-03-09 17:30:22 +00:00
d5b7b8398f Examples: reference implementations honors drawlist user callbacks. 2015-03-09 15:26:58 +00:00
db5fc8a265 Examples: README direct the user to the opengl_example 2015-03-09 15:09:24 +00:00
5879f3f5ac Examples: OpenGL 2/3 examples cleanup to match DirectX9/11 structure. 2015-03-09 15:02:22 +00:00
f9c833b4a5 Examples: DirectX9 example cleanup to match DirectX11 structure. 2015-03-09 14:55:46 +00:00
66a5837ba8 Examples: DirectX11 example application handles window resizing. 2015-03-09 14:51:10 +00:00
866fa95aaa Examples: DirectX9 example application handle window resizing. 2015-03-09 14:13:29 +00:00
25765e4bfc Examples: Fixed readme file. 2015-03-09 13:49:52 +00:00
b4165c43ff Examples: Refactored directx11_example to be easier to copy & paste into user application. 2015-03-09 13:45:23 +00:00
567184dc9f Examples: Clang warning fix. 2015-03-09 13:38:23 +00:00
3f86554457 Examples: Makefile fixes. 2015-03-09 13:22:32 +00:00
2dd92e3eed Examples: Clang/Linux warning fixes. 2015-03-09 13:08:27 +00:00
a3f3793cb6 Examples: Tweaks. 2015-03-09 13:05:18 +00:00
7397425097 Examples: Refactored directx9_example to be eaasier to copy & paste into user application. 2015-03-09 13:03:46 +00:00
b87ec205a9 Examples: shallow tweaks to match upcoming other examples. 2015-03-09 13:02:32 +00:00
b227b0f8cd Examples: Rename globals again 2015-03-09 12:16:29 +00:00
4f27bd6ed3 Examples: Moved gl3w to opengl3_example directory + fixed msvc project paths 2015-03-09 12:11:24 +00:00
4da432bd7b Examples: Makefile 2015-03-09 12:03:09 +00:00
99ed567577 Examples: Rename global to be more consistent 2015-03-09 12:02:34 +00:00
d829852391 Examples: Refactored opengl3_exapmle into a glfw specific file that can be copied and pasted 2015-03-09 11:59:23 +00:00
545a57d253 Examples: Refactored opengl_example into a glfw specific file that can be copied and pasted.
Other examples will follow.
2015-03-09 11:25:15 +00:00
91b4b8a0fc InputText() handles buffer limit correctly for multi-byte UTF-8 characters (fix #158)
We now maintain the buffer len for both UTF-8 and wchar
2015-03-08 20:21:19 +00:00
6cd3ed58ce Fixed UTF-8 decoding errors leading into infnite loops (#158) 2015-03-08 17:55:56 +00:00
0eeb6228b9 Default clipboard handlers for Windows handle UTF-8 (the glfw ones already did that) 2015-03-08 17:23:24 +00:00
6e12d31417 Scrollbar: moved from Begin() into its own Scrollbar() function + tidying up 2015-03-08 16:37:03 +00:00
f021080851 Scrollbar: Clicking inside the grab box doesn't modify scroll. Subsequent movement always relative. (#150).
Big change, rather thoroughly tested but hope I didn't break something.
2015-03-08 16:24:11 +00:00
32312e538e Renamed style.ScrollBarWidth to style.ScrollbarWidth to be consistent with other casing. 2015-03-08 15:03:55 +00:00
afc23a5617 Tidying up & Chinese glyph range includes missing punctuation. 2015-03-08 13:28:44 +00:00
79ddddd910 Merge branch 'master' of https://github.com/ocornut/imgui 2015-03-08 13:26:14 +00:00
830d9f4183 Merge pull request #157 from usagi/master
Fix the Japanese glyph range; include Punctuations
2015-03-08 13:26:02 +00:00
c9bfd71e1a Fix the Japanese glyph range; include Punctuations
ref. #156 https://github.com/ocornut/imgui/issues/156
2015-03-08 22:23:52 +09:00
a579d6f521 Scrollbar tidying up variable names 2015-03-08 12:39:50 +00:00
d251204564 ShowTestWindow: fixed "undo" button of custom rendering applet + default size 2015-03-08 12:09:57 +00:00
2af8e0238c Added GetScrollPosY(), GetScrollMaxY() (mentioned in #150) 2015-03-08 12:04:38 +00:00
a5daea9408 Added style.GrabSizeMin 2015-03-08 11:43:57 +00:00
849c72c5c3 Forward declare struct in imgui.cpp. Removed two forward declarations leaking in imgui.h 2015-03-08 11:32:39 +00:00
ede45389f4 Scrollbar grab have a minimum size (mentioned in #150) 2015-03-08 11:24:02 +00:00
e843539aab ShowTestWindow: example apps showing even if main window is collaposed. 2015-03-08 10:38:13 +00:00
92c35e2772 Rename ImCrc32() -> ImHash() 2015-03-07 23:53:03 +00:00
a691a245b7 GetID() doesn't need to account for empty IDStack 2015-03-07 23:52:26 +00:00
62c900606d Fixed .ini saving for windows using ### marker. FindWindowSettings() uses ID compares (#107) 2015-03-07 23:35:36 +00:00
f9473b807b Fixed comments 2015-03-07 22:49:16 +00:00
3c225bbf88 Fixed typo in comments 2015-03-07 22:24:45 +00:00
45a35c24c8 ShowTestWindow(): Added "Manipulating Window Title" example. 2015-03-07 22:20:34 +00:00
a8c58c7a35 Minor tweaks. 2015-03-07 22:01:06 +00:00
fbbde3a7c0 Updated documentation, better FAQ on ids and usage of "##" and "###" (#107) 2015-03-07 21:54:46 +00:00
81a742bf54 Added "###" syntax to specify label that isn't part of the hashed ID (#107) 2015-03-07 21:53:33 +00:00
3cac434737 Minor FindTextDisplayEnd() optimisation 2015-03-07 19:36:18 +00:00
e01500f046 Added comments on columns function; Added GetColumnIndex(), GetColumnsCount(), #154 2015-03-07 12:18:01 +00:00
6db6c0c8c0 Collapse triangle uses text color (not border color) 2015-03-07 00:35:47 +00:00
1f272785f1 ShowTestWindow() minor tweak 2015-03-06 22:43:42 +00:00
4ab2db73e5 Fixed ListBox() label not included in declared size (fix #151), fixed ListBoxHeader() incorrect handling of SkipItems, Added Exemple 2015-03-06 22:40:21 +00:00
eaab61f08b Fixed using IsItemHovered() after EndChild() (#151) 2015-03-06 22:05:01 +00:00
9c486ce4f4 Minor tidying up (more consistently using 'label_size' as a variable name) 2015-03-06 21:58:12 +00:00
bf88d6a329 Minor tweak 2015-03-06 21:52:48 +00:00
be9fe9489c Examples: DirectX examples uses WM_KEYDOWN/WM_KEYUP
Fixes pressing Enter in IME being caught by application right after
validating an IME input.
2015-03-06 21:39:55 +00:00
315e9941f0 Update README.md 2015-03-06 21:14:40 +00:00
e269125c3a Windows: setup a default handler for ImeSetInputScreenPosFn so IME (Japanese/Chinese) inputs are positioned correctly.
User need to set io.ImeWindowHandle
2015-03-06 21:11:14 +00:00
0ffd99d319 Font: fix for fallback character width. 2015-03-06 19:17:20 +00:00
386cfada83 Examples: Windows examples don't link with imm32.lib by default. 2015-03-06 18:19:21 +00:00
b361c44ef4 Handle double-width space (0x3000) in various places, for Japanese users. 2015-03-06 17:51:25 +00:00
8691c5ca42 Version number + commented failing test case 2015-03-03 15:52:56 +00:00
cfe6dac5a3 Fixed Combo() label not included in declared size (fix #149, relate to #145) 2015-03-02 16:04:36 +00:00
f4458f7571 Version number 2015-03-02 10:10:46 +00:00
0faf0e6948 FindWindowByName() comparing hashes. 2015-03-02 10:04:35 +00:00
4cdcbbff8c Merge pull request #148 from Roflraging/master
Added missing implementation for ImGui::GetWindowCollapsed().
2015-03-01 20:05:20 +00:00
85c71170af Defined bool ImGui::GetWindowCollapsed(). 2015-02-28 14:47:59 -06:00
f18febca11 window->RootWindow persist across frames. Fix calling SetWindowFocus(const char* name) on a child window (last fix for #147) 2015-02-28 10:29:00 +00:00
4535644fcb Clicking on empty space in a child window set keyboard focus on the child window and move parent to front (#147) 2015-02-28 10:25:04 +00:00
9b6fa29022 Clicking on a widget in a child window focus the parent window (#147)
However SetWindowFocus() called on a child window prior to calling
Begin() on said child won;'t work yet.
2015-02-28 09:54:14 +00:00
b911f96a56 Examples: Speculative Makefile fix. I should get a Linux box instead on relying on Jenkins, this is pretty embarrassing. 2015-02-27 11:19:50 +00:00
dc7cdb3025 Examples: Fix Makefile 2015-02-27 11:07:23 +00:00
6fecf90e32 Unused variables fixes. 2015-02-27 11:01:34 +00:00
5aaf0cd2dc Examples: Fix OpenGL3 example Makefile 2015-02-27 11:00:31 +00:00
3ed38f3313 Replaced dependency on glew (inc. prebuilt one for Windows) by gl3w in source form
Expecting something to break now.
2015-02-27 10:53:17 +00:00
00270b837f Examples: Desperate attempts removing link warnings under Windows. Screw standard librairies. 2015-02-27 10:14:20 +00:00
37d8d5c5be Examples: OpenGL2 example doesn't need Glew 2015-02-27 10:05:06 +00:00
40b04a3701 Renamed ImGuiSetCondition_*** to ImGuiSetCond_*** and ImGuiCondition_FirstUseThisSession to ImGuiCond_Once 2015-02-27 09:51:11 +00:00
2177b11682 Added SetNextTreeNodeOpened() with optional condition flag in replacement of OpenNextNode() 2015-02-27 09:38:22 +00:00
ea17240b96 Spacing 2015-02-27 09:16:12 +00:00
d369e6b333 Fix 2015-02-27 09:13:23 +00:00
ebe363c951 Added SetWindowPos(), SetWindowSize(), SetWindowCollaposed() given a wnidow name. 2015-02-27 09:07:25 +00:00
6927d5872e Merge branch 'master' of https://github.com/ocornut/imgui 2015-02-27 09:01:20 +00:00
6d89285f59 Added SetWindowFocus(), SetWindowFocus(const char*), SetNextWindowFocus() (#146) 2015-02-27 09:01:12 +00:00
0ece471a71 Update README.md 2015-02-26 19:15:04 +00:00
1d7b0084cb Update README.md 2015-02-26 19:14:37 +00:00
819c114c34 Update README.md 2015-02-26 19:13:32 +00:00
7591252607 Web: Japanese shot 2015-02-26 19:10:53 +00:00
037ec09ffe Fixed unpackaging of Japanese glyphs ranges 2015-02-26 19:06:54 +00:00
168a811d11 Added codepoint U+3000 (Ideographic space) and Katakana Phonetic Extensions to GetGlyphRangesChinese/GetGlyphRangesJapanese 2015-02-26 19:00:39 +00:00
441679d9d4 Fixed GetGlyphRangesJapanese() actually missing Katakanas glyphs. 2015-02-26 18:51:51 +00:00
fe48562171 Comments for IMGUI_API 2015-02-25 23:10:17 +00:00
8bcf2f25f2 Fixed IsItemHovered() behaving differently on Combo() (pointed out by #145) 2015-02-25 12:28:28 +00:00
3220471237 ColumnOffsets honor SetStateStorage() modifications 2015-02-24 23:29:15 +00:00
9c4972ee9d Examples: msvc: output .exe in project directory (not in solution directory). 2015-02-24 10:06:13 +00:00
fc322fde0f Examples: added README file 2015-02-24 09:59:56 +00:00
546460cd26 Examples: Removed unused file 2015-02-24 09:49:26 +00:00
c2a68bb413 Made some internal parameters names more consistent 2015-02-23 21:02:04 +00:00
c51be42f28 Added Bullet() + usage examples 2015-02-23 20:59:22 +00:00
0df8ff6931 Version number 2015-02-23 20:52:33 +00:00
fd6d6692cf Merge pull request #142 from Roflraging/master
Fix SetColumnOffset() subtracting a bool value instead of scrollbar width
2015-02-23 20:46:19 +00:00
72d10d3baa Fix SetColumnOffset() subtracting a bool value instead of scrollbar width. 2015-02-23 13:36:40 -06:00
3f4924ee2b Merge branch 'master' of https://github.com/ocornut/imgui 2015-02-22 18:16:29 +00:00
e022e5cff6 Version number 1.33 2015-02-22 18:16:25 +00:00
99ceadbf31 Update README.md 2015-02-22 17:55:45 +00:00
cb3c1da77a GetColumnOffset() / SetColumnOffset() fixes. (cf #125)
Actually ignore window padding, and don't subtract
window->DC.ColumnsStartX like older version did.
2015-02-22 17:02:17 +00:00
18a9c799aa Tweaking Columns() examples. 2015-02-22 16:45:55 +00:00
358d41ba8e GetColumnOffset() / SetColumnOffset() takes account of window padding properly (cf. #125) 2015-02-22 16:27:34 +00:00
b9457a2c02 Reworked Columns() examples. 2015-02-22 16:26:37 +00:00
5b59f228ed Separator() within column correctly vertical offset all columns content (pointed out in #125) 2015-02-22 14:43:52 +00:00
2e9dea0619 Removed extraneous (1,1) padding on child window (pointed out in #125) 2015-02-22 14:34:34 +00:00
19079a58d9 Merge branch 'master' of https://github.com/ocornut/imgui 2015-02-22 13:45:15 +00:00
0d63e0ce60 Examples: DirectX examples applications all have a Console for debugging. 2015-02-22 13:45:07 +00:00
c060463981 Update README.me (fix #139) 2015-02-22 13:14:43 +00:00
bab81318a9 Comments and changed ImVec2 parameters to const ImVec2& 2015-02-22 12:38:46 +00:00
4229b7e60b Fix hovering of child window extending past their parent not taking account of parent clipping rectangle (Fix #137) 2015-02-22 12:05:38 +00:00
835a46effb Comments 2015-02-21 16:50:34 +00:00
00e281bef1 Version number 2015-02-21 16:39:21 +00:00
0a1e67a787 InputText: cursor/selection/undo stack persist when using other widgets and getting back to same (#134)
Using SetKeyboardFocusHere() in particular on last used text edit revive
the cursor/selection.
2015-02-21 16:30:40 +00:00
242a52abba InputText: minor tidying up. 2015-02-21 16:05:59 +00:00
2f9ef13be3 Comments 2015-02-21 13:36:24 +00:00
185744e697 Having a InputText() active doesn't steal mouse inputs (relate to #134) 2015-02-21 12:49:51 +00:00
87a3522eb2 Clearing ImGuiState, may switch back to memset(0) but that would put a requirement on user defined ImVector<> to be zero-fill compat 2015-02-21 11:49:12 +00:00
4deeaea93c BeginChild() return a bool analoguous to Begin(). if true you can skip submitting content. 2015-02-21 10:30:05 +00:00
8f75cffc09 Columns: doesn't incorrectly bail out when SkipItems is set (fix #136) 2015-02-21 10:27:13 +00:00
0e159aa22e BeginChild() variant goes after the main one 2015-02-21 10:10:21 +00:00
2ae0e667d0 Child window explicitly inherit collapse state from parent. 2015-02-21 10:02:32 +00:00
364d4a1ae6 Merge branch 'master' of https://github.com/ocornut/imgui 2015-02-18 17:17:14 +00:00
f2752584e2 Added IsAnyItemActive() 2015-02-18 17:17:06 +00:00
a0e93f410e Update README.md 2015-02-18 11:47:50 +00:00
c1f20f03c5 ImGuiTextFilter() can take a default filter string 2015-02-15 13:50:04 +00:00
d58ded3acb Sliders: value is clipped inside the frame when resizing sliders to be small. 2015-02-13 10:37:03 +00:00
9542f52182 InputText: size for allowed input size smaller than necessary by 1 byte. 2015-02-13 09:39:50 +00:00
1eef869669 Fix ImFont::BuildLookupTable() potential dangling pointer dereference (fix #131) 2015-02-13 08:56:06 +00:00
941ef993d9 ImGuITextFilter::Draw() use regular width call. 2015-02-12 19:34:14 +00:00
dbdbaec3eb Version number + comment 2015-02-11 18:34:55 +00:00
cb0a4db048 Calculate frame-rate for the user, as a purely luxurious feature
..and to reduce sample code size a little.
2015-02-11 18:28:17 +00:00
d65e051a07 Minor formatting tweaks, comments 2015-02-11 18:14:39 +00:00
a597664672 Added ImGuiInputTextFlags_CharsNoBlank stock filter. Tweak examples. 2015-02-11 18:01:32 +00:00
2df4735904 ImGuiInputTextFlags_CallbackCharFilter can return 1 to filter character 2015-02-11 17:55:26 +00:00
b73484a66b Added ImGuiInputTextFlags_CharsUppercase stock filter 2015-02-11 17:46:16 +00:00
9473cd491e InputText(): added ImGuiInputTextFlags_CallbackCharFilter system for filtering/replacement. Callback now passed an "EventFlag" parameter. 2015-02-11 17:39:13 +00:00
183a27fd70 CalcTextSize*() more optimisation, fast-path for ascii. 2015-02-11 12:31:04 +00:00
ea94835834 CalcTextSize*() tweaks. ImTextCharFromUtf8() return 1 for a zero character now. 2015-02-11 12:23:38 +00:00
1da8a52ce7 CalcTextSize*() functions which are often speed bottleneck for large contents are about 25% faster.
Caching character advance contiguously, pulled inline, no int->float
conversion.
2015-02-11 12:10:45 +00:00
ca2de0b89b Merge branch 'master' of https://github.com/ocornut/imgui 2015-02-11 11:50:34 +00:00
c73d9cfebb Columns offsets cached to avoid repeated binary search. 2015-02-11 11:50:24 +00:00
5bd7c43a1f Update README.md
Rewording
2015-02-11 00:38:26 +00:00
6347179bb0 Added ListBox() (#129)
Along with ListBoxHeader(), ListBoxFooter() helpers.
2015-02-11 00:21:27 +00:00
16925525c6 Selectable: fixed text clipping. 2015-02-10 22:56:28 +00:00
c26af284db Tweaks. Combo default height_in_items is -1 at compilation time to match incoming ListSelect() behavior 2015-02-10 22:48:46 +00:00
801ed2c472 Allow passing -0.01f to PushItemWidth() for a perfect right-side alignment + fix CalcItemWidth() 2015-02-10 21:42:21 +00:00
e7f51172c1 BeginChildFrame() / EndChildFrame() helpers. 2015-02-10 21:21:23 +00:00
1e9f6cce7f PushItemWidth() can take negative value to right-align items. Renamed GetItemWidth() to CalcItemWidth() 2015-02-10 21:07:26 +00:00
5d31430785 Combo() uses Selectable() 2015-02-10 19:51:52 +00:00
e5752f54b0 Selectable() variant: fixed missed return value 2015-02-10 19:47:35 +00:00
8532da3f52 Added BeginChild() variant that takes an ImGuiID 2015-02-10 19:12:48 +00:00
c6d42b1a54 Added Selectable() building block for various list boxes, combo boxes 2015-02-10 19:09:37 +00:00
220d920581 Internal ButtonBehaviour() supports a pressed_on_click mode (unused yet) + Renamed internal Combo*getters to Items*getters 2015-02-10 17:45:45 +00:00
46dfbb5fa8 Tweak default ImGuiCol_HeaderActive to be less bright 2015-02-10 17:43:58 +00:00
da2f5d9c48 Added ImGuiCol_ChildWindowBg, ImGuiStyleVar_ChildWindowRounding for completeness and flexibility
Upcoming features using it.
2015-02-10 13:00:22 +00:00
3ea90b1cd9 Update README.md 2015-02-10 12:38:34 +00:00
4cb236fe46 ShowTestWindow() demonstrate tree nodes within columns. 2015-02-10 12:37:52 +00:00
8e8cb7de3f Fixed title bar text clipping issue (fix #128)
+ Update version number
2015-02-09 20:32:00 +00:00
734cf47e71 Version number 2015-02-08 17:26:24 +00:00
f387c3f22f Combo box always appear above other child windows of a same parent 2015-02-08 17:21:51 +00:00
c907108c23 SetNextWindowPos api before SetWindowPos api in .h + comments 2015-02-08 16:43:20 +00:00
b5e7648e24 Title bar text uses cpu-clipping + comments 2015-02-08 16:39:34 +00:00
f84166dda9 Use cpu-side clipping instead of a new draw call for isolated label-clipped-by-frame cases. 2015-02-08 16:32:51 +00:00
cc340e0b81 Split RenderText into RenderTextWrapped for internal uses
Different text functions with different features (usually orthogonal set
of features)
2015-02-08 15:57:06 +00:00
b8cd080cdb LabelText: value is properly clipped (fixes #23) 2015-02-08 15:46:23 +00:00
93917e76a6 Combo: value label is properly clipped inside the closed combo frame 2015-02-08 15:39:40 +00:00
9596a2b4f1 ShowExampleAppLongText() demonstrate manual clipping. 2015-02-08 14:32:58 +00:00
d5d8dedadd Calling SetCursorPos() automatically extends the contents size 2015-02-08 14:20:00 +00:00
9e3f8adfac Added CalcListClipping() helper. 2015-02-08 13:44:09 +00:00
29e0aad739 Renamed GetTextLineSpacing to GetTextLineHeightWithSpacing. Added GetCursorPosX/GetCursorPosY 2015-02-08 13:37:20 +00:00
c116dad304 Fixed holdng scrollbar creating a small feedback loop with calculation of contents size 2015-02-08 13:29:55 +00:00
2bce6bf085 Merge pull request #121 from thevaber/master
Added tint_col parameter to ImageButton
2015-02-04 23:18:57 +01:00
d135d91e27 Added tint_col parameter to ImageButton 2015-02-04 19:19:43 +01:00
209ab823d6 Cleanup of previous merge. Moved rarely used Get/Set InternalState functions to the bottom of the list to avoid being misleadnig. 2015-02-04 09:43:11 +01:00
bab66cc490 Merge branch 'jtilander-master' 2015-02-04 09:30:53 +01:00
e36fad65dd Merge branch 'master' of https://github.com/jtilander/imgui into jtilander-master
Conflicts:
	imgui.cpp
2015-02-04 09:30:03 +01:00
4e33787c2f Comments 2015-02-04 09:01:00 +01:00
311c0ca9e5 If mouse was first clicked outside of ImGui bounds we also cancel out hovering. 2015-02-03 10:35:43 +00:00
c6de9502f8 Avoid requesting IO.WantCaptureMouse if earlier click/hold was outside of ImGui window 2015-02-03 09:56:19 +00:00
94c7eddb17 Comments 2015-02-02 19:50:28 +00:00
5df28b101d Added ImGuiWindowFlags_NoCollapse flag 2015-02-02 09:49:12 +00:00
4169d2c8db Fixed more pedantic warnings 2015-02-02 09:06:51 +00:00
0a6577a6df Fixed warnings 2015-02-02 08:51:45 +00:00
087ded0c71 If you install with brew, it also installs links into /usr/local -- and if the version changes having the extra link line here will cause warnings. 2015-02-01 11:02:33 -08:00
e6318abcee Merged changes from original master 2015-02-01 09:09:03 -08:00
cc3d41dbab Version number 1.31 wip 2015-02-01 14:47:21 +00:00
85763150e8 Fixed / removed unncessary allocation in Render() 2015-02-01 14:42:09 +00:00
bde3f6b90d Removed the dependency on realloc functionality #117 + fixed one alloc in NewFrame() 2015-02-01 14:39:13 +00:00
56bf9ea067 Added comment on MemFreeFn as suggested by #119 2015-02-01 14:27:22 +00:00
6777145853 InputText: Filtering private Unicode range 0xE000-0xF8FF seems like glfw on OSX uses those? 2015-02-01 14:08:37 +00:00
1120f5d720 Merge branch 'master' of https://github.com/ocornut/imgui 2015-02-01 13:07:01 +00:00
2dcbe83951 Added DroidSans.ttf font in repository 2015-02-01 13:06:56 +00:00
59d564b322 Update README.md 2015-02-01 10:18:39 +00:00
b623f97d9f Examples: DirectX11: fixed build setting of Release mode. 2015-02-01 09:33:51 +00:00
e636e0d2aa Warning fixes (fix #118) 2015-02-01 09:33:51 +00:00
3478e3a708 Enabled us to create the internal state on client side allocated memory, e.g. a heap 2015-01-31 21:55:19 -08:00
1be4604027 Fixed pointer dereferencing error from merge 2015-01-31 20:35:42 -08:00
e9ff2f3d24 Merge branch 'master' of https://github.com/ocornut/imgui 2015-01-31 20:31:41 -08:00
8149bace7b Added a way to replace the internal state pointer so that we can optionally share it between modules (e.g. multiple DLLs) 2015-01-31 20:28:24 -08:00
c300a6e6c4 Update README.md 2015-02-01 00:46:40 +00:00
8fb15e3d4b Web: update picture. 2015-02-01 00:32:56 +00:00
98e71afa72 Removed the dependency on realloc functionality 2015-01-31 16:17:39 -08:00
c343e95a0a Update README.md 2015-02-01 00:15:18 +00:00
bcb3753774 Web: Redone one screenshot so it fits in github website without resizing 2015-02-01 00:14:29 +00:00
b69f82ee34 New set of pictures! 2015-02-01 00:01:01 +00:00
49569a903c Shortened text 2015-01-31 23:55:47 +00:00
2f5c754ef1 InputText: process character input before Return because they may come together (IME batch) 2015-01-31 23:51:00 +00:00
35c0842bcf Examples: DirectX11: fixed handling of unicode character inputs. 2015-01-31 23:26:53 +00:00
bebd2da1f1 Wrapping g.ActiveId assignment into a function for easy breakpoint. 2015-01-31 22:57:59 +00:00
3f6091b26b Pedantic grammar fix 2015-01-31 21:27:26 +00:00
5834297928 Examples: DirectX11: increasing vertex buffer size (would really need a dynamic buffer size)
+ Delete unused code
2015-01-31 21:12:59 +00:00
381c7428c1 Examples: changed default background color. 2015-01-31 20:08:43 +00:00
a548c9b0d5 Version change 2015-01-31 19:10:04 +00:00
ca10c49e27 Embedded a mouse cursor that can be drawn for you by setting io.MouseDrawCursor 2015-01-31 18:55:05 +00:00
68bad703ee ImColor::HSV() helper + color buttons demo 2015-01-31 17:15:07 +00:00
8d1583d611 Added ImColor() inline helper. Image/ImageButton() now takes ImVec4 for consistency and honor window alpha. 2015-01-31 16:44:55 +00:00
cb3b69c879 Exposed ColorConvertHSVtoRGB, ColorConvertRGBtoHSV, ColorConvertFloat4ToU32 2015-01-31 16:36:12 +00:00
3cf47988b0 Added ImageButton() using regular framing + override framing size (#73) 2015-01-31 16:21:12 +00:00
2ecc285919 ImDrawList::AddCallback() allows for custom rendering (e.g. 3D scene inside a imgui widget)) 2015-01-31 15:24:55 +00:00
82666cdc57 ShowTestWindow() early out if window is collapsed. Drawing the 2 columns example differently. 2015-01-31 10:20:37 +00:00
4437293b79 Added ImDrawList::SplitDrawCmd() to force multiple draw calls for depending rendering/blending + Comments 2015-01-31 09:51:25 +00:00
64679a0b03 ImFontAtlas::Build() does a sanity memset on glyph rectangles. 2015-01-29 17:44:46 +01:00
4c4bbcb451 Examples: fixed custom rendering example canvas size. 2015-01-29 15:04:56 +01:00
229ba6ea18 Update README.md 2015-01-29 15:01:44 +01:00
27161d2a98 Added io.DisplayVisibleMin / io.DisplayVisibleMax to allow for virtual / scrolling display.
+ remove duplicated "Setup outer clipping rectangle" block in Begin))
2015-01-29 14:20:25 +01:00
962ef3924a Added extra asserts and tweaked code in Begin() 2015-01-29 14:07:20 +01:00
07f69966f8 ImDrawList::AddImage() color parameter defaults to white 2015-01-29 13:46:34 +01:00
79042a3a3c GetVoidPtr() functions like GetInt, GetFloat. Renamed GetIntPtr/GetFloatPtr to GetIntRef/GetFloatRef 2015-01-29 10:22:32 +01:00
5b180afc4e Merge pull request #116 from emoon/master
Added Set/GetVoidPtr in ImGuiStorage
2015-01-29 10:10:48 +01:00
c9c41c3874 Added Set/GetVoidPtr in ImGuiStorage 2015-01-28 21:31:22 +01:00
00842d18e4 Speculative GCC warning fix (again) 2015-01-24 11:30:40 +01:00
4535f5f899 Fixed some warnings with Clang/GCC 2015-01-24 11:18:31 +01:00
638babb0dd Examples: added simple drawing app example for using ImDrawList and custom drawing 2015-01-23 01:38:04 +01:00
32b8ad7381 Fixed mouse aiming within InputText() - broken during 01/18 merge 2015-01-23 00:02:44 +01:00
7530f3c985 Added IsItemActive() - replace IsItemFocused()
ClipAdvance() --> ItemAdd() - nb: return value is inverted
2015-01-22 23:54:05 +01:00
70188c5623 Added comments 2015-01-22 11:03:24 +01:00
f1ccd32cb1 stb_truetype: implementation is now static + submitted PR to origin. 2015-01-21 23:45:21 +01:00
26174cba85 Added InvisibleButton() 2015-01-21 23:03:25 +01:00
dbffbacaf6 Added IMGUI_DISABLE_STB_***_IMPLEMENTATION 2015-01-21 11:59:11 +01:00
26f93e6660 IMGUI_STB_NAMESPACE define Stb stuff in a namespace (trying stuff to reduce problems with multiple implementations) 2015-01-21 11:54:23 +01:00
9524d76fe8 Documentation 2015-01-20 22:37:18 +01:00
942e1ca811 Notes, todo items 2015-01-20 10:37:30 +01:00
b24d4d0538 Ignore lists 2015-01-20 01:04:34 +01:00
b0eac255ca Warning fixes for 64-bit architectures 2015-01-20 01:01:25 +01:00
53f4fd38e4 Merge branch 'master' of https://github.com/ocornut/imgui 2015-01-18 15:12:47 +00:00
56ac857cac Added stub for obsolete GetDefaultFontData() to help the user upgrading 2015-01-18 15:12:41 +00:00
7ea9253c31 Update README.md 2015-01-18 12:56:59 +00:00
a1c0c0e298 stb_truetype.h mod comment 2015-01-18 12:54:35 +00:00
b87f9a19c8 Merge pull request #113 from ocornut/2015-01-truetype
Merge - TTF font loading, mulitple fonts, Image support
2015-01-18 12:27:32 +00:00
7e2305eb36 Comments 2015-01-18 12:22:17 +00:00
46fbff50cf Documentation 2015-01-18 12:19:49 +00:00
bfe894406d ImFontAtlas: some more optimisations / cleanup. 2015-01-18 12:12:16 +00:00
e685e49781 ImFontAtlas: reduced number of temporary allocation when building lots of input ranges 2015-01-18 11:55:58 +00:00
edcf2d3bf6 Examples: more comments on loading fonts. 2015-01-18 11:38:14 +00:00
8386e4fb7e Fix handling of NULL GlyphRanges. Asserting on AddFontFromFileTTF() failure. 2015-01-18 11:36:23 +00:00
ed23598e49 Font documentation 2015-01-18 11:24:06 +00:00
ca81fd3a34 Removing the binary_to_c() comment, link to license for ProggyClean 2015-01-18 11:19:11 +00:00
1916a0c78c Renamed FontAtlas to Fonts. Further cleanup/comments. 2015-01-18 10:46:49 +00:00
1f8d209202 Fixed more clang warnings + AddFontFromMemoryTTF() not honoring font_no parameter 2015-01-17 23:21:06 +00:00
37dcf58e2f Fixed clang warnings 2015-01-17 23:13:54 +00:00
0dad59b032 Merge remote-tracking branch 'origin/master' into 2015-01-truetype 2015-01-17 22:57:35 +00:00
e666920784 ImFont: small optimization to our (incorrect) handling of TAB
TAB is still handled as 4-spaces width (which is incorrect)
But CalcTextSize is simplified.
2015-01-17 22:53:54 +00:00
5ad9a2f119 Comments on new API 2015-01-17 22:38:10 +00:00
2c31599bcc ImFontAtlas allows loading multiple fonts into same texture. Revamped new init API for 1.30 2015-01-17 22:15:29 +00:00
a3e368a477 Fixed alignment of ColorEdit4() label 2015-01-17 17:19:07 +00:00
cb9a3235be Removed PixelCenterOffset, uncesssary 2015-01-17 17:17:18 +00:00
ad92018bc0 Fixed lower-right rounded triangle rendering precision.
PixelCenterOffset is handled very inconsistently, needs to be fixed.
2015-01-17 17:03:22 +00:00
43c8b5e0d2 Examples: DirectX11: use linear sampler to be in sync with other examples. 2015-01-17 16:52:21 +00:00
014f88b1fc Font fixes for horizontal centering within frames 2015-01-17 15:44:25 +00:00
edee014ab8 ImDrawList merging commands with same texture 2015-01-17 14:13:08 +00:00
3e30ad3802 PushFont/PopFont changes texture at high-level in current draw list - faster 2015-01-17 14:00:43 +00:00
7ebd7ef9ac Added PushFont/PopFont API 2015-01-17 13:40:56 +00:00
79d1a9d941 Commenting asserts. 2015-01-17 12:27:27 +00:00
97fcee0d0d Fix usage of multiple Begin/End pair for the same window, handling of move in End() was stealing Active ID 2015-01-16 10:55:49 +00:00
ab8d2782c6 Merge remote-tracking branch 'upstream/master' into 2015-01-truetype
Conflicts:
	imgui.cpp
	imgui.h
2015-01-15 18:07:44 +00:00
f61e8e6e26 Tooltip always auto-resize. May look into max-over-xx-seconds policy later. 2015-01-15 18:00:10 +00:00
2082487366 Allow SetNextWindowPos() to affect tooltips. 2015-01-15 17:47:53 +00:00
584c7ffac8 Added SetCursorScreenPos() helper (WindowPos+CursorPos = SrceenPos) 2015-01-15 14:41:22 +00:00
2d7a2310fd Collapsing header also honor FrameRounding 2015-01-15 10:29:51 +00:00
62ecdd21a5 Examples: Added a color slider for the background color + tweak first example use of button.s 2015-01-15 09:59:18 +00:00
02f0dbca37 ColorEdit3: clicking on color square change edit-mode, removing color-edit mode button by default. 2015-01-15 09:49:12 +00:00
8ba93d947c Added FrameRounding setting (default to 0 for now). 2015-01-15 09:14:44 +00:00
3c8f010c29 Fixed TooltipBg color not being honored by tooltip + no minimum tooltip size. 2015-01-14 22:10:48 +00:00
4f6643cc0c Fix missing glyph handling in modified stb_truetype.h (ttf branch) 2015-01-14 22:05:13 +00:00
188165a063 Fix stupid crash on fallback glyph handling (ttf branch) 2015-01-14 21:59:39 +00:00
08b50cce12 TODO list update 2015-01-14 21:58:30 +00:00
04eca0c375 TODO list update 2015-01-14 13:43:41 +00:00
a372d67f47 Improve memory reserve policy for Clipboard/ImGuiBuffer 2015-01-14 13:04:33 +00:00
3a20671802 Fixed logging to clipboard on architectures where va_list are modified by vsnprintf (fixed #112) 2015-01-14 13:01:53 +00:00
5322224881 Warning fixes for llvm windows 64-bits 2015-01-13 23:19:11 +00:00
e2d8c03e1a Fixed ImGuiTextBuffer::empty() to ignore the enforced zero-terminator
+ removed unnecessary destructor
2015-01-13 23:06:55 +00:00
f0b493c217 Fixed style.WindowMinSize not honored properly. 2015-01-13 23:05:20 +00:00
6c6d1746d4 Fix missing glyph handling in modified stb_truetype.h 2015-01-13 08:56:02 +00:00
f061884dea Typos and comments 2015-01-11 22:22:46 +00:00
0f89e06152 Fixed temporary glyph rectangle allocation using size much too big. 2015-01-11 22:03:03 +00:00
e5d0d8334f Tweak default texture width for large amount of characters. 2015-01-11 21:55:21 +00:00
d27b295f4c Documentation on new font / texture get api 2015-01-11 21:24:12 +00:00
0f4d74d614 ImFont::GetTextureData API allow to retrieve 8/32 bits data + lazily load defaults font
Examples: OpenGL3 and DirectX11 back to using 32-bits texture solely for
ease of integration.
2015-01-11 21:06:57 +00:00
241e8086fa Mde it optional to new() io.Font - however it stills needs to be loaded. 2015-01-11 18:27:05 +00:00
51df5874a6 Examples' Says "OpenGL2" vs "OpenGL3" in title bar. 2015-01-11 18:03:40 +00:00
a09f426b89 TAB to spaces 2015-01-11 17:56:43 +00:00
5ca563b5a5 Speculative fix for warnings for GCC/Clang 2015-01-11 17:22:04 +00:00
20bb6270bc Examples: all supports TextureID in renderer, added LoadFontTexture() function. 2015-01-11 17:17:43 +00:00
40f7b67ef1 ImDrawList::AddText() allows changing font 2015-01-11 16:46:39 +00:00
cc79b85c28 Added first-pass of Image() based on #73 + demo 2015-01-11 16:30:39 +00:00
1a6e7f25e0 ImVector: less hoops in back() / front(), more friendly for debugger and unoptimized builds
+ fixed typos
2015-01-11 16:25:57 +00:00
c1fe6fe14d Fixed GetStyleColName() not matching the enum strings for 3 values (#111) 2015-01-09 17:19:24 +00:00
5dff478dc0 Build fix for GCC/Clang, cannot foward declare a static array? 2015-01-09 09:00:53 +00:00
2757e3573a Comments 2015-01-08 23:53:07 +00:00
f77490cb2d Cleanup extra_fonts/ folder 2015-01-08 23:49:17 +00:00
b3a208901a Loading TTF file with stb_truetype. Broke setup API slightly. Font baked, packed with space for custom data. Embeds compressed ProggyClean. 2015-01-08 23:35:01 +00:00
dd8a7655f5 Fixed DirectX11 example. 2015-01-08 18:56:47 +00:00
b0ea57e518 Version number 2015-01-07 19:07:43 +00:00
4260195159 Revert "Reexported proggy_clean_13 in a 256x64 texture (instead of 256x128) and documented exact export parameters"
Correct but cause problems because many people don't have 1 BPP PNG loaders

This reverts commit 98a38e24ab.
2015-01-07 18:59:44 +00:00
26fdf1655c Fixed leak on shutdown (fixes #110) + possible uninitialized member. 2015-01-07 14:55:35 +00:00
c1251d2994 Examples: Fixed warnings for Clang 2015-01-06 17:43:23 +00:00
1c657564ac Examples: Added STB_IMAGE_STATIC in examples to avoid conflicting implementation. Relate to #109 2015-01-06 17:35:36 +00:00
98a38e24ab Reexported proggy_clean_13 in a 256x64 texture (instead of 256x128) and documented exact export parameters 2015-01-05 11:13:02 +00:00
0505995193 Very minor code/comments tweaks. 2015-01-04 22:29:53 +00:00
4905ec46f1 Fixed hovering of child windows / combo boxes that extend beyond the root window limits. 2015-01-04 22:07:37 +00:00
3fe669f547 Failure in LogToFile() treated at an error (assert) in the absence of another type of error handling. 2015-01-04 21:37:49 +00:00
22c1d7eded Renamed some color enums 2015-01-04 19:37:24 +00:00
39373b563b Checkbox and Radio buttons activate on click-release to be consistent with other widgets and most UI 2015-01-04 19:23:36 +00:00
97d34271f8 Fix clipboard pasting into an InputText box not filtering the characters according to input box semantic (number, etc.) 2015-01-04 18:47:08 +00:00
a5f4108781 Activating widget bring parent window to front 2015-01-04 18:36:33 +00:00
3674d30e90 Fixed clicking on Combo box label. 2015-01-04 18:32:15 +00:00
2268b098e0 Avoid marking settings as dirty when window is marked unsaved + minor FocusWindow() optimisation 2015-01-04 18:23:30 +00:00
4bccc06933 Dragging outside area of a widget while it is active doesn't trigger hover on other widgets. 2015-01-04 18:12:30 +00:00
ee49c2288d Todo items. 2015-01-03 17:38:10 +00:00
34664dc28c InputText() consume input characters immediately (fixes #105) 2015-01-03 17:37:39 +00:00
e4f96147de Update README.md 2014-12-31 15:55:34 +00:00
12225abfe2 Version number (fix) 2014-12-31 10:38:36 +00:00
505bd1a66d Fixed text input filtering for character in the 128-255 range. 2014-12-31 09:49:53 +00:00
c9002620c6 Update README.md 2014-12-30 17:13:04 +00:00
f8c58fe328 Fix for Clang 2014-12-30 16:55:32 +00:00
74ab555558 Examples: Console:: added support for History callbacks + cleanup to be self contained. 2014-12-30 16:49:39 +00:00
da5227fa28 Added comment about defining IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT in imconfig.h 2014-12-30 15:44:19 +00:00
3b028c7ebf Fixed InputInt() InputFloat() label not declaring their width, breaking SameLine (bug #100)
+ shallow cleanups
2014-12-30 15:38:28 +00:00
2d111ccb55 crc32 on strings is performed in one pass - removed the strlen() call. 2014-12-30 15:18:21 +00:00
691ca46978 Version number 2014-12-30 15:10:55 +00:00
209be54e49 Version number 2014-12-30 12:21:57 +00:00
aa750d538d Style editor: added an Output button to output colors to clipboard/tty 2014-12-30 12:08:33 +00:00
929f127d06 Added SliderInt2(), SliderInt3(), SliderInt4() for consistency 2014-12-30 11:54:04 +00:00
60b4389ac1 Empty label consistently remove the inner-padding normally preceeding the label. 2014-12-30 11:41:46 +00:00
a950df6655 Tightening default style (saving -2 pixels on each axis per widget) 2014-12-30 10:00:00 +00:00
409b1ac6b5 Log output \r\n under Windows so files are readable with Notepad 2014-12-29 20:41:27 +00:00
036a153cf4 Log depth padding relative to start depth. Tree node and headers looking better when logged to text. Added LogText(). 2014-12-29 20:18:52 +00:00
886d954e3d GetStyleColorName -> GetStyleColName for consistency with type name. Removed ImGuiStyleVar_ColumnsMinSpacing 2014-12-29 19:56:01 +00:00
39952d2362 Renamed GetTreeStateStorage() to GetStateStorage(). Columns storing floats instead of fixed point integers 2014-12-29 18:17:54 +00:00
1b25fa8169 Added LogFinish() to stop logging at an arbitrary point. 2014-12-29 18:13:41 +00:00
0796dc0dc1 Minor fix for cases of malformed .ini file (zero-terminating text file like it was before previous commit). 2014-12-29 18:05:22 +00:00
8994f2f1e4 Cleanup. Removed unnecessary calls to sqrtf(). Factoring bits into ImLoadFileToMemory(). Added index of static helpers. 2014-12-29 11:23:03 +00:00
e2fbbe0274 Factoring bits out of Begin() into a private CreateNewWindow() funciton
(Hopefully to ease a bit the merging work for ProDBG)
2014-12-28 17:54:02 +00:00
5b7ed5432e CalcTextSize() default third parameter to false because it almost never makes sense to use it from the outside (may obsolete it) 2014-12-28 16:17:08 +00:00
bf3212c681 Taking notes of issues/todo 2014-12-28 16:09:19 +00:00
34728394ec Fixed clipped ImGui::Combo not registering its size properly (was flickering when scrolling with combo on the edge of clipping region) 2014-12-26 12:38:13 +00:00
90351298d1 Renamed second parameter to Begin() to 'bool* p_opened' to be more self-explanatory. Added more comments on the use of Begin(). 2014-12-22 13:29:39 +00:00
69f3d67d18 Preserve windows position on zero-sized display (minimized). 2014-12-22 02:14:31 +00:00
d6c13128b9 Update README.md - tweaks 2014-12-22 02:07:02 +00:00
b3febabc30 OpenGL3 example: fix growing of VBO 2014-12-22 01:47:34 +00:00
ac29859f70 Support zero-sized display, now sets default as -1,-1 and assert if display size is negative. 2014-12-22 01:45:13 +00:00
a3af51fd4e Added ImGuiStyleVar_WindowRounding enum for PushStyleVar() API 2014-12-19 12:56:00 +00:00
b09c49180f Update README.md minor fixes 2014-12-14 10:44:43 +00:00
7e868e2842 Cleanup todo list, removed 3 done items + added 1 new 2014-12-11 10:12:52 +00:00
0056ccce26 Version number 2014-12-10 23:40:25 +00:00
486506e37f Update README.md 2014-12-10 23:39:48 +00:00
e9e0e36f98 New and better Set[Next]Window(Pos|Size|Collapsed) API.
Removed rarely useful SetNewWindowDefaultPos() in favor of new API.
2014-12-10 19:22:30 +00:00
3399890a84 Added ImGuiWindowFlags_NoSavedSettings flag + Fixed overlay example app. 2014-12-10 17:13:45 +00:00
2a3bff9a82 Comments 2014-12-10 16:56:11 +00:00
09bacfbe18 OpenGL example: allow resizing window. 2014-12-10 15:27:40 +00:00
cca5f473ca Clarified comment 2014-12-08 17:18:20 +00:00
6523fb263d OpenGL3 example: fixed mouse handling. 2014-12-08 17:15:08 +00:00
bdb2344db0 ImGuiStorage helper can store float + added functions to get pointer to data. Exposed ImGui::GetId() - may be misleading? 2014-12-08 17:14:54 +00:00
0a0769227d Added Travis CI build banner. 2014-12-07 10:17:39 +00:00
6252b26af2 Update README.md 2014-12-07 10:15:34 +00:00
987188d437 Fix Clang warning with offsetof() macro? Added -Wall in OpenGL 3 example. 2014-12-07 09:58:45 +00:00
71e20680db Setup Travis CI integration with Clang + -Wall in Makefiles 2014-12-07 09:48:01 +00:00
bb20065be0 Setup Travis CI integration
Getting there!
2014-12-06 23:30:38 +00:00
fec067d033 Setup Travis CI integration
More libs needed
2014-12-06 23:27:40 +00:00
2eb837ea86 Setup Travis CI integration
Different PPA source
2014-12-06 23:23:57 +00:00
857a4e364c Setup Travis CI integration
Yes please
2014-12-06 23:21:05 +00:00
2599849e9c Setup Travis CI integration
Trying again with a PPA for glfw3-dev
2014-12-06 23:17:30 +00:00
da1b8f7e46 Setup Travis CI integration
Argh.
2014-12-06 23:06:04 +00:00
0687af2ce5 Setup Travis CI integration
Failing to get glfw3 for ubuntu, trying osx/gcc
2014-12-06 23:01:41 +00:00
1d45478637 Setup Travis CI integration
Argh.
2014-12-06 21:06:00 +00:00
1bfb59174a Setup Travis CI integration
Apt-get update needed..
2014-12-06 21:04:25 +00:00
83575a464f Setup Travis CI integration
Forgot sudo. Removing apt-get update, probably works without.
2014-12-06 21:01:00 +00:00
3e83de58b5 Setup Travis CI integration 2014-12-06 20:59:14 +00:00
2b0d8447e3 Setup Travis CI integration
Testing
2014-12-06 20:56:34 +00:00
d553cd96b0 Setup Travis CI integration
Testing.
2014-12-06 20:50:27 +00:00
30ee2fed2b Merge branch 'master' of https://github.com/ocornut/imgui 2014-12-06 20:43:13 +00:00
036ed3ea93 OpenGL3 example: unregistered mouse callback for mouse click-release faster than frame interval. 2014-12-06 20:43:08 +00:00
123691023b Merge pull request #94 from emoon/master
Clang warning fixes
2014-12-06 12:59:22 +00:00
317dab5269 Clang warning fixes 2014-12-06 13:49:46 +01:00
e43cd6e97f Added IMGUI_INCLUDE_IMGUI_USER_H 2014-12-05 23:09:43 +00:00
a5cc2e4161 Fixed InputInt() writing to output when it doesn't need to, which break with large int due to int<>float conversions. Added todo note. 2014-12-05 12:34:14 +00:00
6b16424faf Comments. 2014-12-04 11:54:49 +00:00
d133831909 In-code FAQ: added comment about reading WantCaptureMouse / WantCaptureKeyboard 2014-12-04 11:42:13 +00:00
2e5b81627f Examples: DirectX11: moved shader to be close to its usage location, 2014-12-03 18:46:13 +00:00
52b5376d9b Examples: OpenGL3: cleaned up to match features of OpenGL2 example 2014-12-03 18:40:28 +00:00
b02eed3e49 Examples: adding title to the top of each examples. Cleaning up file headers. 2014-12-03 18:29:46 +00:00
90b4ff13fb Ignore list. 2014-12-03 18:19:48 +00:00
6c9edb6db0 Examples: removed LICENSE file from MSVC project. 2014-12-03 18:19:05 +00:00
860cf578f5 Added ImGuiWindowFlags_NoScrollWithMouse flag.
ButtonBehaviour test hovering of CurrentRootWindow (vs CurrentWindow, different for child-windows). This is intentionally meant to fix grabbing the lower-right resize grip when lower-right corner has a child-window, but may be the overall right-er test. Testing out.
2014-12-03 18:17:10 +00:00
e0dc8ac910 Merge pull request #93 from olivierchatry/master
Added OpenGL programmable-pipeline example.
2014-12-03 18:15:42 +00:00
2f176033c6 fixed indentation mix, removed some unused code, updated different callback using the example_opengl code. 2014-12-03 19:11:23 +01:00
a8d2bc69ed added opengl3 sample, mix from @ocornut and @thelinked 2014-12-03 18:37:07 +01:00
63ff0ad0ff Examples: OpenGL: fix accessing libraries via ProjectDir instead of SolutionDir 2014-12-03 12:00:03 +00:00
d31623061f ImVector: private -> protected 2014-12-03 11:56:40 +00:00
bd762b559c DirectX11 example: fixed projection matrix offset. 2014-12-01 09:34:17 +00:00
e6b9950645 Update README.md
Credits+link for stb_textedit.h
2014-11-30 18:06:52 +00:00
b4fd216bd2 DirectX9/DirectX11 example: fixed window initially showing an hourglass cursor. 2014-11-30 18:02:08 +00:00
0730ec7577 Example apps: accumulate mouse wheel to accodomate for slow framerate. 2014-11-30 17:41:08 +00:00
0e6f288a2f DirectX11 example: further tweaks/massaging (-15 lines). Syncing example. 2014-11-30 17:26:44 +00:00
7f804d3d64 Tab->Spaces :( visual studio can't even be trusted for that, oh thanks. 2014-11-30 16:56:35 +00:00
de44af5227 DirectX11 example: closing all handler/resources in Cleanup. 2014-11-30 16:53:33 +00:00
0f29cd7a14 Removed Microsoft IME handler in examples, too confusing. Moved to imgui.cpp instruction block. 2014-11-30 15:54:58 +00:00
a5a84a9b69 Tab->Spaces :( 2014-11-30 15:53:47 +00:00
197b2763fc Fixed DirectX11 example Release build include 2014-11-30 15:51:42 +00:00
df00fa8113 Fixed DirectX11 example to compile with whatever Visual Studio version user has 2014-11-30 15:33:57 +00:00
e835ef1d90 Fix from incorrect change left-over in a31e44b99a 2014-11-30 15:19:39 +00:00
ae75553ba1 Ignore list for new examples structure 2014-11-30 15:01:08 +00:00
2e576de9ca Fix comments 2014-11-30 15:00:07 +00:00
9e16317382 Added DirectX11 example application (code is too long!) 2014-11-30 14:59:21 +00:00
b5acb16378 Examples: created single .sln solution for all example projects. 2014-11-30 12:54:27 +00:00
38164a410d ImStrnicmp tweak 2014-11-30 12:31:43 +00:00
214c967df8 Example code: warning fix + comments. 2014-11-30 12:28:21 +00:00
31654958f9 Merge pull request #92 from memononen/master
Smoother mouse wheel scrolling
2014-11-30 12:25:21 +00:00
a31e44b99a Fixed Clang -Weverything warnings + TODO list entries 2014-11-30 12:21:50 +00:00
54ea495207 Updated example code. 2014-11-30 12:24:27 +02:00
eb789c0288 Smoother scrolling
- changed IO.MouseWheel to float, allows smoother scrolling
2014-11-30 12:20:25 +02:00
e9aead09cb Remove unneeded extra parameter from ImFont::FindGlyph() 2014-11-29 00:04:05 +00:00
e4a79e9fc8 Moved IO.Font*** options to inside the IO.Font-> structure.. Added IO.FontGlobalScale setting (vs Font->Scale) 2014-11-29 00:02:46 +00:00
e27eddfbd2 Grammar fix + ocd alignment 2014-11-28 23:10:43 +00:00
311a2f8328 New version of IMGUI_ONCE_UPON_A_FRAME helper macro 2014-11-28 23:08:45 +00:00
df2ad5e899 Renamed ImBitmapFont -> ImFont, removed abstraction-pretend typedef 2014-11-28 22:38:41 +00:00
07a6ba8aaf Merge branch 'master' of https://github.com/ocornut/imgui 2014-11-28 22:29:07 +00:00
16d6561aba Increased visibility of check box and radio button with smaller size. + comments 2014-11-28 21:53:31 +00:00
abe45e9976 Moved API Breaking Changes section of the documentation above the programmer's FAQ. 2014-11-26 22:27:48 +00:00
c0999495e7 Fixed move-by-word in InputText() - broken 2 days ago, sorry. stb_ expect a define. 2014-11-26 22:19:46 +00:00
b9118750ae Removed IMGUI_ONCE_UPON_A_FRAME in favor of ImGuiOnceUponAFrame which is supported by all compilers 2014-11-26 22:16:38 +00:00
7f6453ca70 Update README.md
Grammar fix
2014-11-25 15:19:05 +00:00
24a9d32531 Update README.md 2014-11-25 15:17:15 +00:00
ec4b510775 Minor tidying & comments 2014-11-24 10:02:39 +00:00
1484799b18 Console example: fixing losing text selection when using TAB completion with no match 2014-11-23 23:50:23 +00:00
895f93f694 Remove unused variables 2014-11-23 23:36:54 +00:00
49defcf083 InputText support for completion/history/custom callback + added fancy completion example in the console demo app
Unfortunately quite messy because of the UTF-8 <> wchar confusion going
around. Not well tested for UTF-8 compliance with non-Ascii characters.
2014-11-23 23:35:26 +00:00
e78c47961e Not word-wrapping on apostrophes 2014-11-21 16:35:35 +00:00
8c4fcf1359 Added ImGuiWindowFlags_AlwaysAutoResize + example app. Calling SetWindowSize(0,0) force an autofit without zero-sizing first. 2014-11-21 16:29:56 +00:00
124 changed files with 28991 additions and 30909 deletions

13
.gitignore vendored
View File

@ -1,14 +1 @@
## Visual Studio files
examples/directx9_example/Debug/*
examples/directx9_example/Release/*
examples/directx9_example/ipch/*
examples/opengl_example/Debug/*
examples/opengl_example/Release/*
examples/opengl_example/ipch/*
*.opensdf
*.sdf
*.suo
*.vcxproj.user
## Ini files
imgui.ini

17
.travis.yml Normal file
View File

@ -0,0 +1,17 @@
language: cpp
os:
- linux
compiler:
- gcc
- clang
before_install:
- if [ $TRAVIS_OS_NAME == linux ]; then sudo add-apt-repository -y ppa:pyglfw/pyglfw && sudo apt-get update -qq && sudo apt-get install -y --no-install-recommends libglfw3-dev libxrandr-dev libxi-dev libxxf86vm-dev; fi
- if [ $TRAVIS_OS_NAME == osx ]; then brew update && brew install glfw3; fi
script:
- make -C examples/opengl_example
- make -C examples/opengl3_example

View File

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2014 Omar Cornut
Copyright (c) 2014-2015 Omar Cornut and ImGui contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

106
README.md
View File

@ -1,13 +1,26 @@
ImGui
=====
[![Build Status](https://travis-ci.org/ocornut/imgui.svg?branch=master)](https://travis-ci.org/ocornut/imgui)
[![Coverity Status](https://scan.coverity.com/projects/4720/badge.svg)](https://scan.coverity.com/projects/4720)
ImGui is a bloat-free graphical user interface library for C++. It outputs vertex buffers that you can render in your 3D-pipeline enabled application. It is portable, renderer agnostic and carries minimal amount of dependencies (only 3 files are needed). It is based on an "immediate" graphical user interface paradigm which allows you to build user interfaces with ease.
[![Patreon](https://cloud.githubusercontent.com/assets/8225057/5990484/70413560-a9ab-11e4-8942-1a63607c0b00.png)](http://www.patreon.com/imgui) [![PayPal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5Q73FPZ9C526U)
ImGui is a bloat-free graphical user interface library for C++. It outputs vertex buffers that you can render in your 3D-pipeline enabled application. It is portable, renderer agnostic and carries minimal amount of dependencies. It is based on an "immediate" graphical user interface paradigm which enables you to build user interfaces with ease.
ImGui is designed to enable fast iteration and allow programmers to create "content creation" or "debug" tools (as opposed to UI for the average end-user). It favors simplicity and productivity toward this goal, and thus lacks certain features normally found in more high-level libraries.
ImGui is particularly suited to integration in 3D applications, fullscreen applications, embedded applications, games, or any applications on consoles platforms where operating system features are non-standard.
ImGui is particularly suited to integration in realtime 3D applications, fullscreen applications, embedded applications, games, or any applications on consoles platforms where operating system features are non-standard. pa
After ImGui is setup in your engine, you can use it like in this example:
ImGui is self-contained within 6 files that you can easily copy and compile into your application/engine:
- imgui.cpp
- imgui.h
- imconfig.h (empty by default, user-editable)
- stb_rect_pack.h
- stb_textedit.h
- stb_truetype.h
Your code passes mouse/keyboard inputs and settings to ImGui (see example applications for more details). After ImGui is setup, you can use it like in this example:
![screenshot of sample code alongside its output with ImGui](/web/code_sample_01.png?raw=true)
@ -15,6 +28,13 @@ ImGui outputs vertex buffers and simple command-lists that you can render in you
ImGui allows you create elaborate tools as well as very short-lived ones. On the extreme side of short-liveness: using the Edit&Continue feature of compilers you can add a few widgets to tweaks variables while your application is running, and remove the code a minute later! ImGui is not just for tweaking values. You can use it to trace a running algorithm by just emitting text commands. You can use it along with your own reflection data to browse your dataset live. You can use it to expose the internals of a subsystem in your engine, to create a logger, an inspection tool, a profiler, a debugger, etc.
Demo
----
You should be able to build the examples from sources (tested on Windows/Mac/Linux). If you don't, let me know! If you want to have a quick look at the features of ImGui, you can download binaries of the demo app here.
- [imgui-demo-binaries-20150531.zip](http://www.miracleworld.net/imgui/binaries/imgui-demo-binaries-20150531.zip) (Windows binaries, ImGui 1.40 WIP 2015/05/31, 4 executables, 432 KB)
Gallery
-------
@ -22,10 +42,23 @@ Gallery
![screenshot 2](/web/test_window_02.png?raw=true)
![screenshot 3](/web/test_window_03.png?raw=true)
![screenshot 4](/web/test_window_04.png?raw=true)
![screenshot 5](/web/test_window_05_menus.png?raw=true)
![screenshot 6](/web/examples_03.png?raw=true)
UTF-8 is supported for text display and input. Here using M+ font to display Japanese:
![screenshot 7](https://cloud.githubusercontent.com/assets/8225057/7903336/96f0fb7c-07d0-11e5-95d6-41c6a1595e5a.png)
![utf-8 screenshot](/web/utf8_sample_01.png?raw=true)
![screenshot 8](/web/examples_02.png?raw=true)
ImGui can load TTF fonts. UTF-8 is supported for text display and input. Here using Arial Unicode font to display Japanese. Initialize custom font with:
```
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("ArialUni.ttf", 18.0f, io.Fonts->GetGlyphRangesJapanese());
```
For Microsoft IME, pass your HWND to enable IME positioning:
```
io.ImeWindowHandle = my_hwnd;
```
![Japanese screenshot](/web/code_sample_01_jp.png?raw=true)
References
----------
@ -39,56 +72,77 @@ The Immediate Mode GUI paradigm may at first appear unusual to some users. This
Frequently Asked Question
-------------------------
<b>How do you use ImGui on a platform that may not have a mouse and keyboard?</b>
<b>Where is the documentation?</b>
I recommend using [Synergy](http://synergy-project.org). With the uSynergy.c micro client running you can seamlessly use your PC input devices from a video game console or a tablet. ImGui was also designed to function with touch inputs if you increase the padding of widgets to compensate for the lack of precision of touch devices, but it is recommended you use a mouse to allow optimising for screen real-estate.
- The documentation is at the top of imgui.cpp + effectively imgui.h.
- Example code is in the ImGui::ShowTestWindow() function. It covers most features of ImGui so you can read the code and call the function itself to see its output.
- Standalone example applications using OpenGL/DirectX are provided in the examples/ folder.
<b>How do you use ImGui on a platform that may not have a mouse or keyboard?</b>
I recommend using [Synergy](http://synergy-project.org) ([sources](https://github.com/synergy/synergy)). In particular, the _src/micro/uSynergy.c_ file contains a small client that you can use on any platform to connect to your host PC. You can seamlessly use your PC input devices from a video game console or a tablet. ImGui allows to increase the hit box of widgets (via the _TouchPadding_ setting) to accomodate a little for the lack of precision of touch inputs, but it is recommended you use a mouse to allow optimising for screen real-estate.
<b>I integrated ImGui in my engine and the text or lines are blurry..</b>
- Try adjusting ImGui::GetIO().PixelCenterOffset to 0.0f or 0.5f.
- In your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f).
In your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f).
<b>Can you create elaborate/serious tools with ImGui?</b>
Yes. I have written data browsers, debuggers, profilers and all sort of non-trivial tools with the library. There's no reason you cannot, and in my experience the simplicity of the API is very empowering. However note that ImGui is programmer centric and the immediate-mode GUI paradigm might requires a bit of adaptation before you can realize its full potential.
Yes. I have written data browsers, debuggers, profilers and all sort of non-trivial tools with the library. In my experience the simplicity of the API is very empowering. Your UI runs close to your live data. Make the tools always-on and everybody in the team will be inclined to create new tools (as opposed to more "offline" UI toolkits where only a fraction of your team effectively creates tools).
However note that ImGui is programmer centric and the immediate-mode GUI paradigm might requires a bit of adaptation before you can realize its full potential. Many programmers have unfortunately been taught by their environment to make complicated unproductive things. Strip yourself out of all those heavy layers and start making lots of useful tools!
<b>Is ImGui fast?</b>
Down the fundation of its visual design, ImGui is engineered to be fairly performant both in term of CPU and GPU usage. Running elaborate code and creating elaborate UI will of course have a cost but ImGui aims to minimize it.
Down to the fundation of its visual design, ImGui is engineered to be fairly performant both in term of CPU and GPU usage. Running elaborate code and creating elaborate UI will of course have a cost but ImGui aims to minimize it.
Mileage may vary but the following screenshot should give you an idea of the cost of running and rendering UI code (In the case of a trivial demo application like this one, your driver/os setup may be a bottleneck and cause higher variation or throttled framerate. Testing performance as part of a real application is recommended).
Mileage may vary but the following screenshot can give you a rough idea of the cost of running and rendering UI code (In the case of a trivial demo application like this one, your driver/os setup are likely to be the bottleneck. Testing performance as part of a real application is recommended).
![performance screenshot](/web/performance_01_close_up.png?raw=true)
![performance screenshot](/web/performance_01.png?raw=true)
This is showing framerate on my 2011 iMac running Windows 7, OpenGL, AMD Radeon HD 6700M. ([click here for the full-size picture](/web/performance_01.png)).
In contrast, librairies featuring higher-quality rendering and layouting techniques may have a higher resources footprint.
This is showing framerate for the full application loop on my 2011 iMac running Windows 7, OpenGL, AMD Radeon HD 6700M with an optimized executable. In contrast, librairies featuring higher-quality rendering and layouting techniques may have a higher resources footprint.
If you intend to display large lists of items (say, 1000+) it can be beneficial for your code to perform clipping manually - using helpers such as ImGuiListClipper - in order to avoid submitting them to ImGui in the first place. Even though ImGui will discard your clipped items it still needs to calculate their size and that overhead will add up if you have thousands of items. If you can handle clipping and height positionning yourself then browsing a list with millions of items isn't a problem.
<b>Can you reskin the look of ImGui?</b>
Yes, you can alter the look of the interface to some degree: changing colors, sizes and padding, font. However, as ImGui is designed and optimised to create debug tools, the amount of skinning you can apply is limited. There is only so much you can stray away from the default look and feel of the interface. The example below uses modified settings to create a very compact UI with different colors:
You can alter the look of the interface to some degree: changing colors, sizes, padding, rounding, fonts. However, as ImGui is designed and optimised to create debug tools, the amount of skinning you can apply is limited. There is only so much you can stray away from the default look and feel of the interface.
![skinning screenshot 1](/web/skinning_sample_01.png?raw=true)
<b>Why using C++ (as opposed to C)?</b>
Support
-------
ImGui takes advantage of a few C++ features for convenience but nothing anywhere Boost-insanity/quagmire. In particular, function overloading and default parameters are used to make the API easier to use and code more terse. Doing so I believe the API is sitting on a sweet spot and giving up on those features would make the API more cumbersome. Other features such as namespace, constructors and templates (in the case of the ImVector<> class) are also relied on as a convenience but could be removed.
<b>Can you develop features xxxx for ImGui?</b>
Shall someone really need to use ImGui from another language, there is an unofficial but reasonably maintained [c-api for ImGui](https://github.com/Extrawurst/cimgui) by Stephan Dilly. I would suggest using your target language functionality to try replicating the function overloading and default parameters used in C++ else the API may be harder to use. It was really designed with C++ in mind and may not make the same amount of sense with another language.
Please use GitHub 'Issues' facilities to suggest and discuss improvements. Your question are often helpul to the community of users. If you represent an organization and would like specific non-trivial features to be implemented, I am available for hire to work on or with ImGui.
Donate
------
<b>Can I donate to support the development of ImGui?</b>
If you have the mean to help, I have setup a [**Patreon page**](http://www.patreon.com/imgui) to enable me to spend more time on the development of the library. One-off donations are also greatly appreciated. Thanks!
[![Patreon](https://cloud.githubusercontent.com/assets/8225057/5990484/70413560-a9ab-11e4-8942-1a63607c0b00.png)](http://www.patreon.com/imgui) [![PayPal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5Q73FPZ9C526U)
I'm currently an independant developer and your contributions are very meaningful to me. I have setup an [**ImGui Patreon page**](http://www.patreon.com/imgui) if you want to donate and enable me to spend more time improving the library. If your company uses ImGui please consider making a contribution. One-off donations are also greatly appreciated (PayPal link above). I am also available for hire to work on or with ImGui. Thanks!
Credits
-------
Developed by [Omar Cornut](http://www.miracleworld.net). The library was developed with the support of [Media Molecule](http://www.mediamolecule.com) and first used internally on the game [Tearaway](http://tearaway.mediamolecule.com).
Developed by [Omar Cornut](http://www.miracleworld.net) and every direct or indirect contributors to the GitHub. The early version of this library was developed with the support of [Media Molecule](http://www.mediamolecule.com) and first used internally on the game [Tearaway](http://tearaway.mediamolecule.com).
Embeds [proggy_clean](http://upperbounds.net) font by Tristan Grimmer (MIT license).
Embeds [M+ fonts](http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/index-en.html) font by Coji Morishita (free software license).
Embeds [ProggyClean.ttf](http://upperbounds.net) font by Tristan Grimmer (MIT license).
Inspiration, feedback, and testing: Casey Muratori, Atman Binstock, Mikko Mononen, Emmanuel Briney, Stefan Kamoda, Anton Mikhailov, Matt Willis. Thanks!
Embeds [stb_textedit.h, stb_truetype.h, stb_rectpack.h](https://github.com/nothings/stb/) by Sean Barrett (public domain).
Inspiration, feedback, and testing for early versions: Casey Muratori, Atman Binstock, Mikko Mononen, Emmanuel Briney, Stefan Kamoda, Anton Mikhailov, Matt Willis. And everybody posting feedback, questions and patches on the GitHub.
ImGui development is financially supported on [**Patreon**](http://www.patreon.com/imgui).
Special supporters:
- Jetha Chan, Wild Sheep Studio, Pastagames, Mārtiņš Možeiko, Daniel Collin, Stefano Cristiano.
And:
- Michel Courtine, César Leblic, Dale Kim, Alex Evans, Rui Figueira, Paul Patrashcu, Jerome Lanquetot, Ctrl Alt Ninja, Paul Fleming, Neil Henning, Stephan Dilly.
And other supporters; thanks!
License
-------

28
examples/.gitignore vendored Normal file
View File

@ -0,0 +1,28 @@
## Visual Studio files
Debug/*
Release/*
ipch/*
x64/*
directx9_example/Debug/*
directx9_example/Release/*
directx9_example/ipch/*
directx9_example/x64/*
directx11_example/Debug/*
directx11_example/Release/*
directx11_example/ipch/*
directx11_example/x64/*
opengl_example/Debug/*
opengl_example/Release/*
opengl_example/ipch/*
opengl_example/x64/*
opengl3_example/Debug/*
opengl3_example/Release/*
opengl3_example/ipch/*
opengl3_example/x64/*
*.opensdf
*.sdf
*.suo
*.vcxproj.user
## Ini files
imgui.ini

32
examples/README.txt Normal file
View File

@ -0,0 +1,32 @@
Those are standalone ready-to-build applications to demonstrate ImGui.
Unfortunately in 2015 it is still a massive pain to create and maintain portable build files.
I choose to provide Visual Studio 10 .sln files and Makefile for Linux/OSX.
Please let me know if they don't work with your setup!
You can probably just import the .cpp files into your own system and figure out the linkage from there.
opengl_example/
OpenGL example, using GLFW + fixed pipeline.
This is simple and should work for all OpenGL enabled applications.
Prefer following this example to learn how ImGui works, because it is the simplest shortest one!
opengl3_example/
OpenGL example, using GLFW/GL3W + programmable pipeline.
This uses more modern calls and custom shaders.
I don't think there is an advantage using this over the simpler example, but it is provided for reference.
directx9_example/
DirectX9 example, Windows only.
directx11_example/
DirectX11 example, Windows only.
This is quite long and tedious, because: DirectX11.
ios_example/
iOS example.
Using Synergy to access keyboard/mouse data from server computer. Synergy keyboard integration is rather hacky.
sdl_opengl_example/
SDL2 + OpenGL example.
allegro5_example/
Allegro 5 example.

View File

@ -0,0 +1,18 @@
# How to Build
- On Ubuntu 14.04+
```bash
g++ -I ../imgui main.cpp imgui_impl_a5.cpp ../imgui/imgui.cpp -lallegro -lallegro_primitives
```
- On Windows with Visual Studio's CLI
\<a5path\> is your allegro5 folder.
```
cl /MD /I <a5path\include> /I ..\imgui main.cpp imgui_impl_a5.cpp ..\imgui\imgui.cpp /link /LIBPATH:<a5path\lib> allegro-5.0.10-monolith-md.lib user32.lib
```
public domain

View File

@ -0,0 +1,284 @@
// ImGui Allegro 5 bindings
// https://github.com/ocornut/imgui
// by @birthggd, public domain
#include <stdint.h> // uint64_t
#include <cstring> // memcpy
#include <imgui.h>
#include "imgui_impl_a5.h"
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
#ifdef _WIN32
#include <allegro5/allegro_windows.h>
#endif
// Data
static ALLEGRO_DISPLAY* g_Display = NULL;
static ALLEGRO_BITMAP* g_Texture = NULL;
static double g_Time = 0.0;
static ALLEGRO_MOUSE_CURSOR* g_MouseCursorInvisible = NULL;
static ALLEGRO_VERTEX_DECL* g_VertexDecl = NULL;
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
struct ImDrawVertAllegro
{
ImVec2 pos;
ImVec2 uv;
ALLEGRO_COLOR col;
};
static void ImGui_ImplA5_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count)
{
int op, src, dst;
al_get_blender(&op, &src, &dst);
al_set_blender(ALLEGRO_ADD, ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA);
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
// FIXME-OPT: Unfortunately Allegro doesn't support 32-bits packed colors so we have to convert them to 4 floats
static ImVector<ImDrawVertAllegro> vertices;
vertices.resize(cmd_list->vtx_buffer.size());
for (int i = 0; i < cmd_list->vtx_buffer.size(); ++i)
{
const ImDrawVert &dv = cmd_list->vtx_buffer[i];
ImDrawVertAllegro v;
v.pos = dv.pos;
v.uv = dv.uv;
unsigned char *c = (unsigned char*)&dv.col;
v.col = al_map_rgba(c[0], c[1], c[2], c[3]);
vertices[i] = v;
}
int vtx_offset = 0;
for (int cmd_i = 0; cmd_i < cmd_list->commands.size(); cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->commands[cmd_i];
if (pcmd->user_callback)
{
pcmd->user_callback(cmd_list, pcmd);
}
else
{
ALLEGRO_BITMAP* texture = (ALLEGRO_BITMAP*)pcmd->texture_id;
al_set_clipping_rectangle(pcmd->clip_rect.x, pcmd->clip_rect.y, pcmd->clip_rect.z-pcmd->clip_rect.x, pcmd->clip_rect.w-pcmd->clip_rect.y);
al_draw_prim(&vertices[0], g_VertexDecl, texture, vtx_offset, vtx_offset+pcmd->vtx_count, ALLEGRO_PRIM_TRIANGLE_LIST);
}
vtx_offset += pcmd->vtx_count;
}
}
// Restore modified state
al_set_blender(op, src, dst);
al_set_clipping_rectangle(0, 0, al_get_display_width(g_Display), al_get_display_height(g_Display));
}
bool Imgui_ImplA5_CreateDeviceObjects()
{
ImGuiIO &io = ImGui::GetIO();
// Build texture
unsigned char *pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
// Create texture
int flags = al_get_new_bitmap_flags();
int fmt = al_get_new_bitmap_format();
al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP|ALLEGRO_MIN_LINEAR|ALLEGRO_MAG_LINEAR);
al_set_new_bitmap_format(ALLEGRO_PIXEL_FORMAT_ABGR_8888_LE);
ALLEGRO_BITMAP* img = al_create_bitmap(width, height);
al_set_new_bitmap_flags(flags);
al_set_new_bitmap_format(fmt);
if (!img)
return false;
ALLEGRO_LOCKED_REGION *locked_img = al_lock_bitmap(img, al_get_bitmap_format(img), ALLEGRO_LOCK_WRITEONLY);
if (!locked_img)
{
al_destroy_bitmap(img);
return false;
}
memcpy(locked_img->data, pixels, sizeof(int)*width*height);
al_unlock_bitmap(img);
// Convert software texture to hardware texture.
ALLEGRO_BITMAP* cloned_img = al_clone_bitmap(img);
al_destroy_bitmap(img);
if (!cloned_img)
return false;
// Store our identifier
io.Fonts->TexID = (void*)cloned_img;
g_Texture = cloned_img;
// Cleanup (don't clear the input data if you want to append new fonts later)
io.Fonts->ClearInputData();
io.Fonts->ClearTexData();
// Create an invisible mouse cursor
// Because al_hide_mouse_cursor() seems to mess up with the actual inputs..
ALLEGRO_BITMAP* mouse_cursor = al_create_bitmap(8,8);
g_MouseCursorInvisible = al_create_mouse_cursor(mouse_cursor, 0, 0);
al_destroy_bitmap(mouse_cursor);
return true;
}
void ImGui_ImplA5_InvalidateDeviceObjects()
{
if (g_Texture)
{
al_destroy_bitmap(g_Texture);
ImGui::GetIO().Fonts->TexID = NULL;
g_Texture = NULL;
}
if (g_MouseCursorInvisible)
{
al_destroy_mouse_cursor(g_MouseCursorInvisible);
g_MouseCursorInvisible = NULL;
}
}
bool ImGui_ImplA5_Init(ALLEGRO_DISPLAY* display)
{
g_Display = display;
// Create custom vertex declaration.
// Unfortunately Allegro doesn't support 32-bits packed colors so we have to convert them to 4 floats.
// We still use a custom declaration to use 'ALLEGRO_PRIM_TEX_COORD' instead of 'ALLEGRO_PRIM_TEX_COORD_PIXEL' else we can't do a reliable conversion.
ALLEGRO_VERTEX_ELEMENT elems[] =
{
{ ALLEGRO_PRIM_POSITION, ALLEGRO_PRIM_FLOAT_2, OFFSETOF(ImDrawVertAllegro, pos) },
{ ALLEGRO_PRIM_TEX_COORD, ALLEGRO_PRIM_FLOAT_2, OFFSETOF(ImDrawVertAllegro, uv) },
{ ALLEGRO_PRIM_COLOR_ATTR, 0, OFFSETOF(ImDrawVertAllegro, col) },
{ 0, 0, 0 }
};
g_VertexDecl = al_create_vertex_decl(elems, sizeof(ImDrawVertAllegro));
ImGuiIO& io = ImGui::GetIO();
io.KeyMap[ImGuiKey_Tab] = ALLEGRO_KEY_TAB;
io.KeyMap[ImGuiKey_LeftArrow] = ALLEGRO_KEY_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = ALLEGRO_KEY_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = ALLEGRO_KEY_UP;
io.KeyMap[ImGuiKey_DownArrow] = ALLEGRO_KEY_DOWN;
io.KeyMap[ImGuiKey_PageUp] = ALLEGRO_KEY_PGUP;
io.KeyMap[ImGuiKey_PageDown] = ALLEGRO_KEY_PGDN;
io.KeyMap[ImGuiKey_Home] = ALLEGRO_KEY_HOME;
io.KeyMap[ImGuiKey_End] = ALLEGRO_KEY_END;
io.KeyMap[ImGuiKey_Delete] = ALLEGRO_KEY_DELETE;
io.KeyMap[ImGuiKey_Backspace] = ALLEGRO_KEY_BACKSPACE;
io.KeyMap[ImGuiKey_Enter] = ALLEGRO_KEY_ENTER;
io.KeyMap[ImGuiKey_Escape] = ALLEGRO_KEY_ESCAPE;
io.KeyMap[ImGuiKey_A] = ALLEGRO_KEY_A;
io.KeyMap[ImGuiKey_C] = ALLEGRO_KEY_C;
io.KeyMap[ImGuiKey_V] = ALLEGRO_KEY_V;
io.KeyMap[ImGuiKey_X] = ALLEGRO_KEY_X;
io.KeyMap[ImGuiKey_Y] = ALLEGRO_KEY_Y;
io.KeyMap[ImGuiKey_Z] = ALLEGRO_KEY_Z;
io.RenderDrawListsFn = ImGui_ImplA5_RenderDrawLists;
#ifdef _WIN32
io.ImeWindowHandle = al_get_win_window_handle(g_Display);
#endif
return true;
}
void ImGui_ImplA5_Shutdown()
{
ImGui_ImplA5_InvalidateDeviceObjects();
ImGui::Shutdown();
}
bool ImGui_ImplA5_ProcessEvent(ALLEGRO_EVENT *ev)
{
ImGuiIO &io = ImGui::GetIO();
switch (ev->type)
{
case ALLEGRO_EVENT_MOUSE_AXES:
io.MouseWheel += ev->mouse.dz;
return true;
case ALLEGRO_EVENT_KEY_CHAR:
if (ev->keyboard.display == g_Display)
if (ev->keyboard.unichar > 0 && ev->keyboard.unichar < 0x10000)
io.AddInputCharacter((unsigned short)ev->keyboard.unichar);
return true;
case ALLEGRO_EVENT_KEY_DOWN:
case ALLEGRO_EVENT_KEY_UP:
if (ev->keyboard.display == g_Display)
io.KeysDown[ev->keyboard.keycode] = (ev->type == ALLEGRO_EVENT_KEY_DOWN);
return true;
}
return false;
}
void ImGui_ImplA5_NewFrame()
{
if (!g_Texture)
Imgui_ImplA5_CreateDeviceObjects();
ImGuiIO &io = ImGui::GetIO();
// Setup display size (every frame to accommodate for window resizing)
int w, h;
w = al_get_display_width(g_Display);
h = al_get_display_height(g_Display);
io.DisplaySize = ImVec2((float)w, (float)h);
// Setup time step
double current_time = al_get_time();
io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);
g_Time = current_time;
// Setup inputs
ALLEGRO_KEYBOARD_STATE keys;
al_get_keyboard_state(&keys);
io.KeyCtrl = al_key_down(&keys, ALLEGRO_KEY_LCTRL) || al_key_down(&keys, ALLEGRO_KEY_RCTRL);
io.KeyShift = al_key_down(&keys, ALLEGRO_KEY_LSHIFT) || al_key_down(&keys, ALLEGRO_KEY_RSHIFT);
io.KeyAlt = al_key_down(&keys, ALLEGRO_KEY_ALT) || al_key_down(&keys, ALLEGRO_KEY_ALTGR);
ALLEGRO_MOUSE_STATE mouse;
if (keys.display == g_Display)
{
al_get_mouse_state(&mouse);
io.MousePos = ImVec2((float)mouse.x, (float)mouse.y);
}
else
{
io.MousePos = ImVec2(-1, -1);
}
al_get_mouse_state(&mouse);
io.MouseDown[0] = mouse.buttons & (1 << 0);
io.MouseDown[1] = mouse.buttons & (1 << 1);
io.MouseDown[2] = mouse.buttons & (1 << 2);
// Hide OS mouse cursor if ImGui is drawing it
if (io.MouseDrawCursor)
{
al_set_mouse_cursor(g_Display, g_MouseCursorInvisible);
}
else
{
ALLEGRO_SYSTEM_MOUSE_CURSOR cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_DEFAULT;
switch (ImGui::GetMouseCursor())
{
case ImGuiMouseCursor_TextInput: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_EDIT; break;
case ImGuiMouseCursor_Move: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_MOVE; break;
case ImGuiMouseCursor_ResizeNS: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_N; break;
case ImGuiMouseCursor_ResizeEW: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_E; break;
case ImGuiMouseCursor_ResizeNESW: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NE; break;
case ImGuiMouseCursor_ResizeNWSE: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NW; break;
}
al_set_system_mouse_cursor(g_Display, cursor_id);
}
// Start the frame
ImGui::NewFrame();
}

View File

@ -0,0 +1,18 @@
// ImGui Allegro 5 bindings
// https://github.com/ocornut/imgui
// by @birthggd, public domain
#pragma once
struct ALLEGRO_DISPLAY;
union ALLEGRO_EVENT;
bool ImGui_ImplA5_Init(ALLEGRO_DISPLAY* display);
void ImGui_ImplA5_Shutdown();
void ImGui_ImplA5_NewFrame();
bool ImGui_ImplA5_ProcessEvent(ALLEGRO_EVENT* event);
// Use if you want to reset your rendering device without losing ImGui state.
bool Imgui_ImplA5_CreateDeviceObjects();
void ImGui_ImplA5_InvalidateDeviceObjects();

View File

@ -0,0 +1,97 @@
// ImGui - standalone example application for Allegro 5
// public domain
#include <stdint.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
#include <imgui.h>
#include "imgui_impl_a5.h"
int main(int, char**)
{
// Setup Allegro
al_init();
al_install_keyboard();
al_install_mouse();
al_init_primitives_addon();
al_set_new_display_flags(ALLEGRO_RESIZABLE);
ALLEGRO_DISPLAY* display = al_create_display(1280, 720);
al_set_window_title(display, "ImGui Allegro 5 example");
ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
al_register_event_source(queue, al_get_display_event_source(display));
al_register_event_source(queue, al_get_keyboard_event_source());
al_register_event_source(queue, al_get_mouse_event_source());
// Setup ImGui binding
ImGui_ImplA5_Init(display);
//ImGuiIO& io = ImGui::GetIO();
//ImFont* my_font0 = io.Fonts->AddFontDefault();
//ImFont* my_font1 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 16.0f);
//ImFont* my_font2 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/Karla-Regular.ttf", 16.0f);
//ImFont* my_font3 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyClean.ttf", 13.0f); my_font3->DisplayOffset.y += 1;
//ImFont* my_font4 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyTiny.ttf", 10.0f); my_font4->DisplayOffset.y += 1;
//ImFont* my_font5 = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, io.Fonts->GetGlyphRangesJapanese());
bool show_test_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImColor(114, 144, 154);
// Main loop
bool running = true;
while (running)
{
ALLEGRO_EVENT ev;
while (al_get_next_event(queue, &ev))
{
ImGui_ImplA5_ProcessEvent(&ev);
if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) running = false;
if (ev.type == ALLEGRO_EVENT_DISPLAY_RESIZE)
{
ImGui_ImplA5_InvalidateDeviceObjects();
al_acknowledge_resize(display);
Imgui_ImplA5_CreateDeviceObjects();
}
}
ImGui_ImplA5_NewFrame();
// 1. Show a simple window
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
{
static float f;
ImGui::Text("Hello, world!");
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
ImGui::ColorEdit3("clear color", (float*)&clear_color);
if (ImGui::Button("Test Window")) show_test_window ^= 1;
if (ImGui::Button("Another Window")) show_another_window ^= 1;
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f/ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
}
// 2. Show another simple window, this time using an explicit Begin/End pair
if (show_another_window)
{
ImGui::SetNextWindowSize(ImVec2(200, 100), ImGuiSetCond_FirstUseEver);
ImGui::Begin("Another Window", &show_another_window);
ImGui::Text("Hello");
ImGui::End();
}
// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow()
if (show_test_window)
{
ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiSetCond_FirstUseEver);
ImGui::ShowTestWindow(&show_test_window);
}
// Rendering
al_clear_to_color(al_map_rgba_f(clear_color.x, clear_color.y, clear_color.z, clear_color.w));
ImGui::Render();
al_flip_display();
}
// Cleanup
ImGui_ImplA5_Shutdown();
al_destroy_event_queue(queue);
al_destroy_display(display);
return 0;
}

View File

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{9F316E83-5AE5-4939-A723-305A94F48005}</ProjectGuid>
<RootNamespace>directx11_example</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>..\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>d3d11.lib;d3dcompiler.lib;dxgi.lib;imm32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>..\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>d3d11.lib;d3dcompiler.lib;dxgi.lib;imm32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="..\..\imconfig.h" />
<ClInclude Include="..\..\imgui.h" />
<ClInclude Include="imgui_impl_dx11.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\imgui.cpp" />
<ClCompile Include="imgui_impl_dx11.cpp" />
<ClCompile Include="main.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="imgui">
<UniqueIdentifier>{0587d7a3-f2ce-4d56-b84f-a0005d3bfce6}</UniqueIdentifier>
</Filter>
<Filter Include="sources">
<UniqueIdentifier>{08e36723-ce4f-4cff-9662-c40801cf1acf}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\imconfig.h">
<Filter>imgui</Filter>
</ClInclude>
<ClInclude Include="..\..\imgui.h">
<Filter>imgui</Filter>
</ClInclude>
<ClInclude Include="imgui_impl_dx11.h">
<Filter>sources</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\imgui.cpp">
<Filter>imgui</Filter>
</ClCompile>
<ClCompile Include="main.cpp">
<Filter>sources</Filter>
</ClCompile>
<ClCompile Include="imgui_impl_dx11.cpp">
<Filter>sources</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -0,0 +1,474 @@
// ImGui Win32 + DirectX11 binding
// https://github.com/ocornut/imgui
#include <imgui.h>
#include "imgui_impl_dx11.h"
// DirectX
#include <d3d11.h>
#include <d3dcompiler.h>
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
// Data
static INT64 g_Time = 0;
static INT64 g_TicksPerSecond = 0;
static HWND g_hWnd = 0;
static ID3D11Device* g_pd3dDevice = NULL;
static ID3D11DeviceContext* g_pd3dDeviceContext = NULL;
static ID3D11Buffer* g_pVB = NULL;
static ID3D10Blob * g_pVertexShaderBlob = NULL;
static ID3D11VertexShader* g_pVertexShader = NULL;
static ID3D11InputLayout* g_pInputLayout = NULL;
static ID3D11Buffer* g_pVertexConstantBuffer = NULL;
static ID3D10Blob * g_pPixelShaderBlob = NULL;
static ID3D11PixelShader* g_pPixelShader = NULL;
static ID3D11SamplerState* g_pFontSampler = NULL;
static ID3D11ShaderResourceView*g_pFontTextureView = NULL;
static ID3D11RasterizerState* g_pRasterizerState = NULL;
static ID3D11BlendState* g_pBlendState = NULL;
static int VERTEX_BUFFER_SIZE = 30000; // TODO: Make vertex buffer smaller and grow dynamically as needed.
struct VERTEX_CONSTANT_BUFFER
{
float mvp[4][4];
};
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)
// If text or lines are blurry when integrating ImGui in your engine:
// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)
static void ImGui_ImplDX11_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count)
{
// Copy and convert all vertices into a single contiguous buffer
D3D11_MAPPED_SUBRESOURCE mappedResource;
if (g_pd3dDeviceContext->Map(g_pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource) != S_OK)
return;
ImDrawVert* vtx_dst = (ImDrawVert*)mappedResource.pData;
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
memcpy(vtx_dst, &cmd_list->vtx_buffer[0], cmd_list->vtx_buffer.size() * sizeof(ImDrawVert));
vtx_dst += cmd_list->vtx_buffer.size();
}
g_pd3dDeviceContext->Unmap(g_pVB, 0);
// Setup orthographic projection matrix into our constant buffer
{
D3D11_MAPPED_SUBRESOURCE mappedResource;
if (g_pd3dDeviceContext->Map(g_pVertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource) != S_OK)
return;
VERTEX_CONSTANT_BUFFER* pConstantBuffer = (VERTEX_CONSTANT_BUFFER*)mappedResource.pData;
const float L = 0.0f;
const float R = ImGui::GetIO().DisplaySize.x;
const float B = ImGui::GetIO().DisplaySize.y;
const float T = 0.0f;
const float mvp[4][4] =
{
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f},
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f,},
{ 0.0f, 0.0f, 0.5f, 0.0f },
{ (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
};
memcpy(&pConstantBuffer->mvp, mvp, sizeof(mvp));
g_pd3dDeviceContext->Unmap(g_pVertexConstantBuffer, 0);
}
// Setup viewport
{
D3D11_VIEWPORT vp;
memset(&vp, 0, sizeof(D3D11_VIEWPORT));
vp.Width = ImGui::GetIO().DisplaySize.x;
vp.Height = ImGui::GetIO().DisplaySize.y;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
g_pd3dDeviceContext->RSSetViewports(1, &vp);
}
// Bind shader and vertex buffers
unsigned int stride = sizeof(ImDrawVert);
unsigned int offset = 0;
g_pd3dDeviceContext->IASetInputLayout(g_pInputLayout);
g_pd3dDeviceContext->IASetVertexBuffers(0, 1, &g_pVB, &stride, &offset);
g_pd3dDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
g_pd3dDeviceContext->VSSetShader(g_pVertexShader, NULL, 0);
g_pd3dDeviceContext->VSSetConstantBuffers(0, 1, &g_pVertexConstantBuffer);
g_pd3dDeviceContext->PSSetShader(g_pPixelShader, NULL, 0);
g_pd3dDeviceContext->PSSetSamplers(0, 1, &g_pFontSampler);
// Setup render state
const float blendFactor[4] = { 0.f, 0.f, 0.f, 0.f };
g_pd3dDeviceContext->OMSetBlendState(g_pBlendState, blendFactor, 0xffffffff);
g_pd3dDeviceContext->RSSetState(g_pRasterizerState);
// Render command lists
int vtx_offset = 0;
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
for (int cmd_i = 0; cmd_i < cmd_list->commands.size(); cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->commands[cmd_i];
if (pcmd->user_callback)
{
pcmd->user_callback(cmd_list, pcmd);
}
else
{
const D3D11_RECT r = { (LONG)pcmd->clip_rect.x, (LONG)pcmd->clip_rect.y, (LONG)pcmd->clip_rect.z, (LONG)pcmd->clip_rect.w };
g_pd3dDeviceContext->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView**)&pcmd->texture_id);
g_pd3dDeviceContext->RSSetScissorRects(1, &r);
g_pd3dDeviceContext->Draw(pcmd->vtx_count, vtx_offset);
}
vtx_offset += pcmd->vtx_count;
}
}
// Restore modified state
g_pd3dDeviceContext->IASetInputLayout(NULL);
g_pd3dDeviceContext->PSSetShader(NULL, NULL, 0);
g_pd3dDeviceContext->VSSetShader(NULL, NULL, 0);
}
LRESULT ImGui_ImplDX11_WndProcHandler(HWND, UINT msg, WPARAM wParam, LPARAM lParam)
{
ImGuiIO& io = ImGui::GetIO();
switch (msg)
{
case WM_LBUTTONDOWN:
io.MouseDown[0] = true;
return true;
case WM_LBUTTONUP:
io.MouseDown[0] = false;
return true;
case WM_RBUTTONDOWN:
io.MouseDown[1] = true;
return true;
case WM_RBUTTONUP:
io.MouseDown[1] = false;
return true;
case WM_MOUSEWHEEL:
io.MouseWheel += GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? +1.0f : -1.0f;
return true;
case WM_MOUSEMOVE:
io.MousePos.x = (signed short)(lParam);
io.MousePos.y = (signed short)(lParam >> 16);
return true;
case WM_KEYDOWN:
if (wParam < 256)
io.KeysDown[wParam] = 1;
return true;
case WM_KEYUP:
if (wParam < 256)
io.KeysDown[wParam] = 0;
return true;
case WM_CHAR:
// You can also use ToAscii()+GetKeyboardState() to retrieve characters.
if (wParam > 0 && wParam < 0x10000)
io.AddInputCharacter((unsigned short)wParam);
return true;
}
return 0;
}
static void ImGui_ImplDX11_CreateFontsTexture()
{
ImGuiIO& io = ImGui::GetIO();
// Build
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
// Create DX11 texture
{
D3D11_TEXTURE2D_DESC texDesc;
ZeroMemory(&texDesc, sizeof(texDesc));
texDesc.Width = width;
texDesc.Height = height;
texDesc.MipLevels = 1;
texDesc.ArraySize = 1;
texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
texDesc.SampleDesc.Count = 1;
texDesc.Usage = D3D11_USAGE_DEFAULT;
texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
texDesc.CPUAccessFlags = 0;
ID3D11Texture2D *pTexture = NULL;
D3D11_SUBRESOURCE_DATA subResource;
subResource.pSysMem = pixels;
subResource.SysMemPitch = texDesc.Width * 4;
subResource.SysMemSlicePitch = 0;
g_pd3dDevice->CreateTexture2D(&texDesc, &subResource, &pTexture);
// Create texture view
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
ZeroMemory(&srvDesc, sizeof(srvDesc));
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = texDesc.MipLevels;
srvDesc.Texture2D.MostDetailedMip = 0;
g_pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &g_pFontTextureView);
pTexture->Release();
}
// Store our identifier
io.Fonts->TexID = (void *)g_pFontTextureView;
// Create texture sampler
{
D3D11_SAMPLER_DESC samplerDesc;
ZeroMemory(&samplerDesc, sizeof(samplerDesc));
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.MipLODBias = 0.f;
samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
samplerDesc.MinLOD = 0.f;
samplerDesc.MaxLOD = 0.f;
g_pd3dDevice->CreateSamplerState(&samplerDesc, &g_pFontSampler);
}
// Cleanup (don't clear the input data if you want to append new fonts later)
io.Fonts->ClearInputData();
io.Fonts->ClearTexData();
}
bool ImGui_ImplDX11_CreateDeviceObjects()
{
if (!g_pd3dDevice)
return false;
if (g_pVB)
ImGui_ImplDX11_InvalidateDeviceObjects();
// Create the vertex shader
{
static const char* vertexShader =
"cbuffer vertexBuffer : register(c0) \
{\
float4x4 ProjectionMatrix; \
};\
struct VS_INPUT\
{\
float2 pos : POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
\
struct PS_INPUT\
{\
float4 pos : SV_POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
\
PS_INPUT main(VS_INPUT input)\
{\
PS_INPUT output;\
output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\
output.col = input.col;\
output.uv = input.uv;\
return output;\
}";
D3DCompile(vertexShader, strlen(vertexShader), NULL, NULL, NULL, "main", "vs_5_0", 0, 0, &g_pVertexShaderBlob, NULL);
if (g_pVertexShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
return false;
if (g_pd3dDevice->CreateVertexShader((DWORD*)g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), NULL, &g_pVertexShader) != S_OK)
return false;
// Create the input layout
D3D11_INPUT_ELEMENT_DESC localLayout[] = {
{ "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, (size_t)(&((ImDrawVert*)0)->pos), D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (size_t)(&((ImDrawVert*)0)->uv), D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (size_t)(&((ImDrawVert*)0)->col), D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
if (g_pd3dDevice->CreateInputLayout(localLayout, 3, g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), &g_pInputLayout) != S_OK)
return false;
// Create the constant buffer
{
D3D11_BUFFER_DESC cbDesc;
cbDesc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER);
cbDesc.Usage = D3D11_USAGE_DYNAMIC;
cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
cbDesc.MiscFlags = 0;
g_pd3dDevice->CreateBuffer(&cbDesc, NULL, &g_pVertexConstantBuffer);
}
}
// Create the pixel shader
{
static const char* pixelShader =
"struct PS_INPUT\
{\
float4 pos : SV_POSITION;\
float4 col : COLOR0;\
float2 uv : TEXCOORD0;\
};\
sampler sampler0;\
Texture2D texture0;\
\
float4 main(PS_INPUT input) : SV_Target\
{\
float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \
return out_col; \
}";
D3DCompile(pixelShader, strlen(pixelShader), NULL, NULL, NULL, "main", "ps_5_0", 0, 0, &g_pPixelShaderBlob, NULL);
if (g_pPixelShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
return false;
if (g_pd3dDevice->CreatePixelShader((DWORD*)g_pPixelShaderBlob->GetBufferPointer(), g_pPixelShaderBlob->GetBufferSize(), NULL, &g_pPixelShader) != S_OK)
return false;
}
// Create the blending setup
{
D3D11_BLEND_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.AlphaToCoverageEnable = false;
desc.RenderTarget[0].BlendEnable = true;
desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
g_pd3dDevice->CreateBlendState(&desc, &g_pBlendState);
}
// Create the rasterizer state
{
D3D11_RASTERIZER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.FillMode = D3D11_FILL_SOLID;
desc.CullMode = D3D11_CULL_NONE;
desc.ScissorEnable = true;
desc.DepthClipEnable = true;
g_pd3dDevice->CreateRasterizerState(&desc, &g_pRasterizerState);
}
// Create the vertex buffer
{
D3D11_BUFFER_DESC desc;
memset(&desc, 0, sizeof(D3D11_BUFFER_DESC));
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.ByteWidth = VERTEX_BUFFER_SIZE * sizeof(ImDrawVert);
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
if (g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pVB) < 0)
return false;
}
ImGui_ImplDX11_CreateFontsTexture();
return true;
}
void ImGui_ImplDX11_InvalidateDeviceObjects()
{
if (!g_pd3dDevice)
return;
if (g_pFontSampler) { g_pFontSampler->Release(); g_pFontSampler = NULL; }
if (g_pFontTextureView) { g_pFontTextureView->Release(); ImGui::GetIO().Fonts->TexID = 0; }
if (g_pVB) { g_pVB->Release(); g_pVB = NULL; }
if (g_pBlendState) { g_pBlendState->Release(); g_pBlendState = NULL; }
if (g_pRasterizerState) { g_pRasterizerState->Release(); g_pRasterizerState = NULL; }
if (g_pPixelShader) { g_pPixelShader->Release(); g_pPixelShader = NULL; }
if (g_pPixelShaderBlob) { g_pPixelShaderBlob->Release(); g_pPixelShaderBlob = NULL; }
if (g_pVertexConstantBuffer) { g_pVertexConstantBuffer->Release(); g_pVertexConstantBuffer = NULL; }
if (g_pInputLayout) { g_pInputLayout->Release(); g_pInputLayout = NULL; }
if (g_pVertexShader) { g_pVertexShader->Release(); g_pVertexShader = NULL; }
if (g_pVertexShaderBlob) { g_pVertexShaderBlob->Release(); g_pVertexShaderBlob = NULL; }
}
bool ImGui_ImplDX11_Init(void* hwnd, ID3D11Device* device, ID3D11DeviceContext* device_context)
{
g_hWnd = (HWND)hwnd;
g_pd3dDevice = device;
g_pd3dDeviceContext = device_context;
if (!QueryPerformanceFrequency((LARGE_INTEGER *)&g_TicksPerSecond))
return false;
if (!QueryPerformanceCounter((LARGE_INTEGER *)&g_Time))
return false;
ImGuiIO& io = ImGui::GetIO();
io.KeyMap[ImGuiKey_Tab] = VK_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array that we will update during the application lifetime.
io.KeyMap[ImGuiKey_LeftArrow] = VK_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = VK_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = VK_UP;
io.KeyMap[ImGuiKey_DownArrow] = VK_DOWN;
io.KeyMap[ImGuiKey_PageUp] = VK_PRIOR;
io.KeyMap[ImGuiKey_PageDown] = VK_NEXT;
io.KeyMap[ImGuiKey_Home] = VK_HOME;
io.KeyMap[ImGuiKey_End] = VK_END;
io.KeyMap[ImGuiKey_Delete] = VK_DELETE;
io.KeyMap[ImGuiKey_Backspace] = VK_BACK;
io.KeyMap[ImGuiKey_Enter] = VK_RETURN;
io.KeyMap[ImGuiKey_Escape] = VK_ESCAPE;
io.KeyMap[ImGuiKey_A] = 'A';
io.KeyMap[ImGuiKey_C] = 'C';
io.KeyMap[ImGuiKey_V] = 'V';
io.KeyMap[ImGuiKey_X] = 'X';
io.KeyMap[ImGuiKey_Y] = 'Y';
io.KeyMap[ImGuiKey_Z] = 'Z';
io.RenderDrawListsFn = ImGui_ImplDX11_RenderDrawLists;
io.ImeWindowHandle = g_hWnd;
return true;
}
void ImGui_ImplDX11_Shutdown()
{
ImGui_ImplDX11_InvalidateDeviceObjects();
ImGui::Shutdown();
g_pd3dDevice = NULL;
g_pd3dDeviceContext = NULL;
g_hWnd = (HWND)0;
}
void ImGui_ImplDX11_NewFrame()
{
if (!g_pVB)
ImGui_ImplDX11_CreateDeviceObjects();
ImGuiIO& io = ImGui::GetIO();
// Setup display size (every frame to accommodate for window resizing)
RECT rect;
GetClientRect(g_hWnd, &rect);
io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top));
// Setup time step
INT64 current_time;
QueryPerformanceCounter((LARGE_INTEGER *)&current_time);
io.DeltaTime = (float)(current_time - g_Time) / g_TicksPerSecond;
g_Time = current_time;
// Read keyboard modifiers inputs
io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;
// io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events
// io.MousePos : filled by WM_MOUSEMOVE events
// io.MouseDown : filled by WM_*BUTTON* events
// io.MouseWheel : filled by WM_MOUSEWHEEL events
// Hide OS mouse cursor if ImGui is drawing it
SetCursor(io.MouseDrawCursor ? NULL : LoadCursor(NULL, IDC_ARROW));
// Start the frame
ImGui::NewFrame();
}

View File

@ -0,0 +1,20 @@
// ImGui Win32 + DirectX11 binding
// https://github.com/ocornut/imgui
struct ID3D11Device;
struct ID3D11DeviceContext;
bool ImGui_ImplDX11_Init(void* hwnd, ID3D11Device* device, ID3D11DeviceContext* device_context);
void ImGui_ImplDX11_Shutdown();
void ImGui_ImplDX11_NewFrame();
// Use if you want to reset your rendering device without losing ImGui state.
void ImGui_ImplDX11_InvalidateDeviceObjects();
bool ImGui_ImplDX11_CreateDeviceObjects();
// Handler for Win32 messages, update mouse/keyboard data.
// You may or not need this for your implementation, but it can serve as reference for handling inputs.
// Commented out to avoid dragging dependencies on <windows.h> types. You can copy the extern declaration in your code.
/*
extern LRESULT ImGui_ImplDX11_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
*/

View File

@ -0,0 +1,216 @@
// ImGui - standalone example application for DirectX 11
#include <imgui.h>
#include "imgui_impl_dx11.h"
#include <d3d11.h>
#include <d3dcompiler.h>
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
// Data
static ID3D11Device* g_pd3dDevice = NULL;
static ID3D11DeviceContext* g_pd3dDeviceContext = NULL;
static IDXGISwapChain* g_pSwapChain = NULL;
static ID3D11RenderTargetView* g_mainRenderTargetView = NULL;
void CreateRenderTarget()
{
DXGI_SWAP_CHAIN_DESC sd;
g_pSwapChain->GetDesc(&sd);
// Create the render target
ID3D11Texture2D* pBackBuffer;
D3D11_RENDER_TARGET_VIEW_DESC render_target_view_desc;
ZeroMemory(&render_target_view_desc, sizeof(render_target_view_desc));
render_target_view_desc.Format = sd.BufferDesc.Format;
render_target_view_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
g_pd3dDevice->CreateRenderTargetView(pBackBuffer, &render_target_view_desc, &g_mainRenderTargetView);
g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, NULL);
pBackBuffer->Release();
}
void CleanupRenderTarget()
{
if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; }
}
HRESULT CreateDeviceD3D(HWND hWnd)
{
// Setup swap chain
DXGI_SWAP_CHAIN_DESC sd;
{
ZeroMemory(&sd, sizeof(sd));
sd.BufferCount = 2;
sd.BufferDesc.Width = 0;
sd.BufferDesc.Height = 0;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = hWnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = TRUE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
}
UINT createDeviceFlags = 0;
#ifdef _DEBUG
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
D3D_FEATURE_LEVEL featureLevel;
const D3D_FEATURE_LEVEL featureLevelArray[1] = { D3D_FEATURE_LEVEL_11_0, };
if (D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, featureLevelArray, 1, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext) != S_OK)
return E_FAIL;
// Setup rasterizer
{
D3D11_RASTERIZER_DESC RSDesc;
memset(&RSDesc, 0, sizeof(D3D11_RASTERIZER_DESC));
RSDesc.FillMode = D3D11_FILL_SOLID;
RSDesc.CullMode = D3D11_CULL_NONE;
RSDesc.FrontCounterClockwise = FALSE;
RSDesc.DepthBias = 0;
RSDesc.SlopeScaledDepthBias = 0.0f;
RSDesc.DepthBiasClamp = 0;
RSDesc.DepthClipEnable = TRUE;
RSDesc.ScissorEnable = TRUE;
RSDesc.AntialiasedLineEnable = FALSE;
RSDesc.MultisampleEnable = (sd.SampleDesc.Count > 1) ? TRUE : FALSE;
ID3D11RasterizerState* pRState = NULL;
g_pd3dDevice->CreateRasterizerState(&RSDesc, &pRState);
g_pd3dDeviceContext->RSSetState(pRState);
pRState->Release();
}
CreateRenderTarget();
return S_OK;
}
void CleanupDeviceD3D()
{
CleanupRenderTarget();
if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; }
if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = NULL; }
if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; }
}
extern LRESULT ImGui_ImplDX11_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (ImGui_ImplDX11_WndProcHandler(hWnd, msg, wParam, lParam))
return true;
switch (msg)
{
case WM_SIZE:
if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
{
ImGui_ImplDX11_InvalidateDeviceObjects();
CleanupRenderTarget();
g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0);
CreateRenderTarget();
ImGui_ImplDX11_CreateDeviceObjects();
}
return 0;
case WM_SYSCOMMAND:
if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
return 0;
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
int main(int, char**)
{
// Create application window
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, LoadCursor(NULL, IDC_ARROW), NULL, NULL, L"ImGui Example", NULL };
RegisterClassEx(&wc);
HWND hwnd = CreateWindow(L"ImGui Example", L"ImGui DirectX11 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
// Initialize Direct3D
if (CreateDeviceD3D(hwnd) < 0)
{
CleanupDeviceD3D();
UnregisterClass(L"ImGui Example", wc.hInstance);
return 1;
}
// Show the window
ShowWindow(hwnd, SW_SHOWDEFAULT);
UpdateWindow(hwnd);
// Setup ImGui binding
ImGui_ImplDX11_Init(hwnd, g_pd3dDevice, g_pd3dDeviceContext);
//ImGuiIO& io = ImGui::GetIO();
//ImFont* my_font0 = io.Fonts->AddFontDefault();
//ImFont* my_font1 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 16.0f);
//ImFont* my_font2 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/Karla-Regular.ttf", 16.0f);
//ImFont* my_font3 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyClean.ttf", 13.0f); my_font3->DisplayOffset.y += 1;
//ImFont* my_font4 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyTiny.ttf", 10.0f); my_font4->DisplayOffset.y += 1;
//ImFont* my_font5 = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, io.Fonts->GetGlyphRangesJapanese());
bool show_test_window = true;
bool show_another_window = false;
ImVec4 clear_col = ImColor(114, 144, 154);
// Main loop
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
continue;
}
ImGui_ImplDX11_NewFrame();
// 1. Show a simple window
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
{
static float f = 0.0f;
ImGui::Text("Hello, world!");
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
ImGui::ColorEdit3("clear color", (float*)&clear_col);
if (ImGui::Button("Test Window")) show_test_window ^= 1;
if (ImGui::Button("Another Window")) show_another_window ^= 1;
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
}
// 2. Show another simple window, this time using an explicit Begin/End pair
if (show_another_window)
{
ImGui::SetNextWindowSize(ImVec2(200,100), ImGuiSetCond_FirstUseEver);
ImGui::Begin("Another Window", &show_another_window);
ImGui::Text("Hello");
ImGui::End();
}
// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow()
if (show_test_window)
{
ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiSetCond_FirstUseEver); // Normally user code doesn't need/want to call it because positions are saved in .ini file anyway. Here we just want to make the demo initial state a bit more friendly!
ImGui::ShowTestWindow(&show_test_window);
}
// Rendering
g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, (float*)&clear_col);
ImGui::Render();
g_pSwapChain->Present(0, 0);
}
ImGui_ImplDX11_Shutdown();
CleanupDeviceD3D();
UnregisterClass(L"ImGui Example", wc.hInstance);
return 0;
}

View File

@ -1,20 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "directx9_example", "directx9_example.vcxproj", "{4165A294-21F2-44CA-9B38-E3F935ABADF5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|Win32.ActiveCfg = Debug|Win32
{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|Win32.Build.0 = Debug|Win32
{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|Win32.ActiveCfg = Release|Win32
{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -5,10 +5,18 @@
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{4165A294-21F2-44CA-9B38-E3F935ABADF5}</ProjectGuid>
@ -20,66 +28,124 @@
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>$(DXSDK_DIR)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(DXSDK_DIR)Lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>d3d9.lib;d3dx9d.lib;dxerr.lib;dxguid.lib;winmm.lib;comctl32.lib;gdi32.lib;imm32.lib;user32.lib</AdditionalDependencies>
<SubSystem>
</SubSystem>
<AdditionalDependencies>d3d9.lib;d3dx9d.lib;dxerr.lib;dxguid.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(DXSDK_DIR)Lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>d3d9.lib;d3dx9d.lib;dxerr.lib;dxguid.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<WarningLevel>Level4</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>$(DXSDK_DIR)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(DXSDK_DIR)Lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>d3d9.lib;d3dx9d.lib;dxerr.lib;dxguid.lib;winmm.lib;comctl32.lib;gdi32.lib;imm32.lib;user32.lib</AdditionalDependencies>
<SubSystem>
</SubSystem>
<AdditionalDependencies>d3d9.lib;d3dx9d.lib;dxerr.lib;dxguid.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>..\..;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(DXSDK_DIR)Lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>d3d9.lib;d3dx9d.lib;dxerr.lib;dxguid.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\imgui.cpp" />
<ClCompile Include="imgui_impl_dx9.cpp" />
<ClCompile Include="main.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\imconfig.h" />
<ClInclude Include="..\..\imgui.h" />
<ClInclude Include="..\..\stb_textedit.h" />
</ItemGroup>
<ItemGroup>
<None Include="..\..\LICENSE" />
<ClInclude Include="imgui_impl_dx9.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

View File

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="imgui">
<UniqueIdentifier>{ac86c4ce-1d96-47a9-9ace-f8970c3bd485}</UniqueIdentifier>
</Filter>
<Filter Include="sources">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="imgui">
<UniqueIdentifier>{a82cba23-9de0-45c2-b1e3-2eb1666702de}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
@ -16,6 +16,9 @@
<ClCompile Include="..\..\imgui.cpp">
<Filter>imgui</Filter>
</ClCompile>
<ClCompile Include="imgui_impl_dx9.cpp">
<Filter>sources</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\imconfig.h">
@ -24,13 +27,8 @@
<ClInclude Include="..\..\imgui.h">
<Filter>imgui</Filter>
</ClInclude>
<ClInclude Include="..\..\stb_textedit.h">
<Filter>imgui</Filter>
<ClInclude Include="imgui_impl_dx9.h">
<Filter>sources</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\..\LICENSE">
<Filter>imgui</Filter>
</None>
</ItemGroup>
</Project>

View File

@ -0,0 +1,295 @@
// ImGui Win32 + DirectX9 binding
// https://github.com/ocornut/imgui
#include <imgui.h>
#include "imgui_impl_dx9.h"
// DirectX
#include <d3dx9.h>
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
// Data
static HWND g_hWnd = 0;
static INT64 g_Time = 0;
static INT64 g_TicksPerSecond = 0;
static LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
static LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
static int VERTEX_BUFFER_SIZE = 30000; // TODO: Make vertex buffer smaller and grow dynamically as needed.
struct CUSTOMVERTEX
{
D3DXVECTOR3 pos;
D3DCOLOR col;
D3DXVECTOR2 uv;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)
// If text or lines are blurry when integrating ImGui in your engine:
// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)
static void ImGui_ImplDX9_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count)
{
int total_vtx_count = 0;
for (int n = 0; n < cmd_lists_count; n++)
total_vtx_count += cmd_lists[n]->vtx_buffer.size();
if (total_vtx_count == 0)
return;
// Copy and convert all vertices into a single contiguous buffer
CUSTOMVERTEX* vtx_dst;
if (g_pVB->Lock(0, (UINT)total_vtx_count, (void**)&vtx_dst, D3DLOCK_DISCARD) < 0)
return;
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
const ImDrawVert* vtx_src = &cmd_list->vtx_buffer[0];
for (int i = 0; i < cmd_list->vtx_buffer.size(); i++)
{
vtx_dst->pos.x = vtx_src->pos.x;
vtx_dst->pos.y = vtx_src->pos.y;
vtx_dst->pos.z = 0.0f;
vtx_dst->col = (vtx_src->col & 0xFF00FF00) | ((vtx_src->col & 0xFF0000)>>16) | ((vtx_src->col & 0xFF) << 16); // RGBA --> ARGB for DirectX9
vtx_dst->uv.x = vtx_src->uv.x;
vtx_dst->uv.y = vtx_src->uv.y;
vtx_dst++;
vtx_src++;
}
}
g_pVB->Unlock();
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
// Setup render state: fixed-pipeline, alpha-blending, no face culling, no depth testing
g_pd3dDevice->SetPixelShader( NULL );
g_pd3dDevice->SetVertexShader( NULL );
g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, false );
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, false );
g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
g_pd3dDevice->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD );
g_pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, false );
g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
g_pd3dDevice->SetRenderState( D3DRS_SCISSORTESTENABLE, true );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
// Setup orthographic projection matrix
D3DXMATRIXA16 mat;
D3DXMatrixIdentity(&mat);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &mat);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &mat);
D3DXMatrixOrthoOffCenterLH(&mat, 0.5f, ImGui::GetIO().DisplaySize.x+0.5f, ImGui::GetIO().DisplaySize.y+0.5f, 0.5f, -1.0f, +1.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &mat);
// Render command lists
int vtx_offset = 0;
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
for (int cmd_i = 0; cmd_i < cmd_list->commands.size(); cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->commands[cmd_i];
if (pcmd->user_callback)
{
pcmd->user_callback(cmd_list, pcmd);
}
else
{
const RECT r = { (LONG)pcmd->clip_rect.x, (LONG)pcmd->clip_rect.y, (LONG)pcmd->clip_rect.z, (LONG)pcmd->clip_rect.w };
g_pd3dDevice->SetTexture( 0, (LPDIRECT3DTEXTURE9)pcmd->texture_id );
g_pd3dDevice->SetScissorRect(&r);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, vtx_offset, pcmd->vtx_count/3);
}
vtx_offset += pcmd->vtx_count;
}
}
}
LRESULT ImGui_ImplDX9_WndProcHandler(HWND, UINT msg, WPARAM wParam, LPARAM lParam)
{
ImGuiIO& io = ImGui::GetIO();
switch (msg)
{
case WM_LBUTTONDOWN:
io.MouseDown[0] = true;
return true;
case WM_LBUTTONUP:
io.MouseDown[0] = false;
return true;
case WM_RBUTTONDOWN:
io.MouseDown[1] = true;
return true;
case WM_RBUTTONUP:
io.MouseDown[1] = false;
return true;
case WM_MOUSEWHEEL:
io.MouseWheel += GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? +1.0f : -1.0f;
return true;
case WM_MOUSEMOVE:
io.MousePos.x = (signed short)(lParam);
io.MousePos.y = (signed short)(lParam >> 16);
return true;
case WM_KEYDOWN:
if (wParam < 256)
io.KeysDown[wParam] = 1;
return true;
case WM_KEYUP:
if (wParam < 256)
io.KeysDown[wParam] = 0;
return true;
case WM_CHAR:
// You can also use ToAscii()+GetKeyboardState() to retrieve characters.
if (wParam > 0 && wParam < 0x10000)
io.AddInputCharacter((unsigned short)wParam);
return true;
}
return 0;
}
bool ImGui_ImplDX9_Init(void* hwnd, IDirect3DDevice9* device)
{
g_hWnd = (HWND)hwnd;
g_pd3dDevice = device;
if (!QueryPerformanceFrequency((LARGE_INTEGER *)&g_TicksPerSecond))
return false;
if (!QueryPerformanceCounter((LARGE_INTEGER *)&g_Time))
return false;
ImGuiIO& io = ImGui::GetIO();
io.KeyMap[ImGuiKey_Tab] = VK_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array that we will update during the application lifetime.
io.KeyMap[ImGuiKey_LeftArrow] = VK_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = VK_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = VK_UP;
io.KeyMap[ImGuiKey_DownArrow] = VK_DOWN;
io.KeyMap[ImGuiKey_PageUp] = VK_PRIOR;
io.KeyMap[ImGuiKey_PageDown] = VK_NEXT;
io.KeyMap[ImGuiKey_Home] = VK_HOME;
io.KeyMap[ImGuiKey_End] = VK_END;
io.KeyMap[ImGuiKey_Delete] = VK_DELETE;
io.KeyMap[ImGuiKey_Backspace] = VK_BACK;
io.KeyMap[ImGuiKey_Enter] = VK_RETURN;
io.KeyMap[ImGuiKey_Escape] = VK_ESCAPE;
io.KeyMap[ImGuiKey_A] = 'A';
io.KeyMap[ImGuiKey_C] = 'C';
io.KeyMap[ImGuiKey_V] = 'V';
io.KeyMap[ImGuiKey_X] = 'X';
io.KeyMap[ImGuiKey_Y] = 'Y';
io.KeyMap[ImGuiKey_Z] = 'Z';
io.RenderDrawListsFn = ImGui_ImplDX9_RenderDrawLists;
io.ImeWindowHandle = g_hWnd;
return true;
}
void ImGui_ImplDX9_Shutdown()
{
ImGui_ImplDX9_InvalidateDeviceObjects();
ImGui::Shutdown();
g_pd3dDevice = NULL;
g_hWnd = 0;
}
static void ImGui_ImplDX9_CreateFontsTexture()
{
ImGuiIO& io = ImGui::GetIO();
// Build
unsigned char* pixels;
int width, height, bytes_per_pixel;
io.Fonts->GetTexDataAsAlpha8(&pixels, &width, &height, &bytes_per_pixel);
// Create DX9 texture
LPDIRECT3DTEXTURE9 pTexture = NULL;
if (D3DXCreateTexture(g_pd3dDevice, width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8, D3DPOOL_DEFAULT, &pTexture) < 0)
{
IM_ASSERT(0);
return;
}
D3DLOCKED_RECT tex_locked_rect;
if (pTexture->LockRect(0, &tex_locked_rect, NULL, 0) != D3D_OK)
{
IM_ASSERT(0);
return;
}
for (int y = 0; y < height; y++)
memcpy((unsigned char *)tex_locked_rect.pBits + tex_locked_rect.Pitch * y, pixels + (width * bytes_per_pixel) * y, (width * bytes_per_pixel));
pTexture->UnlockRect(0);
// Store our identifier
io.Fonts->TexID = (void *)pTexture;
// Cleanup (don't clear the input data if you want to append new fonts later)
io.Fonts->ClearInputData();
io.Fonts->ClearTexData();
}
bool ImGui_ImplDX9_CreateDeviceObjects()
{
if (!g_pd3dDevice)
return false;
if (g_pd3dDevice->CreateVertexBuffer(VERTEX_BUFFER_SIZE * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL) < 0)
return false;
ImGui_ImplDX9_CreateFontsTexture();
return true;
}
void ImGui_ImplDX9_InvalidateDeviceObjects()
{
if (!g_pd3dDevice)
return;
if (g_pVB)
{
g_pVB->Release();
g_pVB = NULL;
}
if (LPDIRECT3DTEXTURE9 tex = (LPDIRECT3DTEXTURE9)ImGui::GetIO().Fonts->TexID)
{
tex->Release();
ImGui::GetIO().Fonts->TexID = 0;
}
}
void ImGui_ImplDX9_NewFrame()
{
if (!g_pVB)
ImGui_ImplDX9_CreateDeviceObjects();
ImGuiIO& io = ImGui::GetIO();
// Setup display size (every frame to accommodate for window resizing)
RECT rect;
GetClientRect(g_hWnd, &rect);
io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top));
// Setup time step
INT64 current_time;
QueryPerformanceCounter((LARGE_INTEGER *)&current_time);
io.DeltaTime = (float)(current_time - g_Time) / g_TicksPerSecond;
g_Time = current_time;
// Read keyboard modifiers inputs
io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;
// io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events
// io.MousePos : filled by WM_MOUSEMOVE events
// io.MouseDown : filled by WM_*BUTTON* events
// io.MouseWheel : filled by WM_MOUSEWHEEL events
// Hide OS mouse cursor if ImGui is drawing it
SetCursor(io.MouseDrawCursor ? NULL : LoadCursor(NULL, IDC_ARROW));
// Start the frame
ImGui::NewFrame();
}

View File

@ -0,0 +1,19 @@
// ImGui Win32 + DirectX9 binding
// https://github.com/ocornut/imgui
struct IDirect3DDevice9;
bool ImGui_ImplDX9_Init(void* hwnd, IDirect3DDevice9* device);
void ImGui_ImplDX9_Shutdown();
void ImGui_ImplDX9_NewFrame();
// Use if you want to reset your rendering device without losing ImGui state.
void ImGui_ImplDX9_InvalidateDeviceObjects();
bool ImGui_ImplDX9_CreateDeviceObjects();
// Handler for Win32 messages, update mouse/keyboard data.
// You may or not need this for your implementation, but it can serve as reference for handling inputs.
// Commented out to avoid dragging dependencies on <windows.h> types. You can copy the extern declaration in your code.
/*
extern LRESULT ImGui_ImplDX9_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
*/

View File

@ -1,300 +1,94 @@
#include <windows.h>
#include <imm.h>
#include <mmsystem.h>
// ImGui - standalone example application for DirectX 9
#include <imgui.h>
#include "imgui_impl_dx9.h"
#include <d3dx9.h>
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
#include "../../imgui.h"
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strdup
// Data
static LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
static D3DPRESENT_PARAMETERS g_d3dpp;
static HWND hWnd;
static LPDIRECT3D9 g_pD3D = NULL; // Used to create the D3DDevice
static LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Our rendering device
static LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // Buffer to hold vertices
static LPDIRECT3DTEXTURE9 g_pTexture = NULL; // Our texture
struct CUSTOMVERTEX
extern LRESULT ImGui_ImplDX9_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
D3DXVECTOR3 position;
D3DCOLOR color;
float tu, tv;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
if (ImGui_ImplDX9_WndProcHandler(hWnd, msg, wParam, lParam))
return true;
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)
// If text or lines are blurry when integrating ImGui in your engine:
// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)
// - try adjusting ImGui::GetIO().PixelCenterOffset to 0.5f or 0.375f
static void ImImpl_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count)
{
size_t total_vtx_count = 0;
for (int n = 0; n < cmd_lists_count; n++)
total_vtx_count += cmd_lists[n]->vtx_buffer.size();
if (total_vtx_count == 0)
return;
// Copy and convert all vertices into a single contiguous buffer
CUSTOMVERTEX* vtx_dst;
if (g_pVB->Lock(0, total_vtx_count, (void**)&vtx_dst, D3DLOCK_DISCARD) < 0)
return;
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
const ImDrawVert* vtx_src = &cmd_list->vtx_buffer[0];
for (size_t i = 0; i < cmd_list->vtx_buffer.size(); i++)
{
vtx_dst->position.x = vtx_src->pos.x;
vtx_dst->position.y = vtx_src->pos.y;
vtx_dst->position.z = 0.0f;
vtx_dst->color = (vtx_src->col & 0xFF00FF00) | ((vtx_src->col & 0xFF0000)>>16) | ((vtx_src->col & 0xFF) << 16); // RGBA --> ARGB for DirectX9
vtx_dst->tu = vtx_src->uv.x;
vtx_dst->tv = vtx_src->uv.y;
vtx_dst++;
vtx_src++;
}
}
g_pVB->Unlock();
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
// Setup render state: alpha-blending, no face culling, no depth testing
g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, false );
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, false );
g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
g_pd3dDevice->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD );
g_pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, false );
g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
g_pd3dDevice->SetRenderState( D3DRS_SCISSORTESTENABLE, true );
// Setup texture
g_pd3dDevice->SetTexture( 0, g_pTexture );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
// Setup orthographic projection matrix
D3DXMATRIXA16 mat;
D3DXMatrixIdentity(&mat);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &mat);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &mat);
D3DXMatrixOrthoOffCenterLH(&mat, 0.5f, ImGui::GetIO().DisplaySize.x+0.5f, ImGui::GetIO().DisplaySize.y+0.5f, 0.5f, -1.0f, +1.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &mat);
// Render command lists
int vtx_offset = 0;
for (int n = 0; n < cmd_lists_count; n++)
{
// Render command list
const ImDrawList* cmd_list = cmd_lists[n];
for (size_t cmd_i = 0; cmd_i < cmd_list->commands.size(); cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->commands[cmd_i];
const RECT r = { (LONG)pcmd->clip_rect.x, (LONG)pcmd->clip_rect.y, (LONG)pcmd->clip_rect.z, (LONG)pcmd->clip_rect.w };
g_pd3dDevice->SetScissorRect(&r);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, vtx_offset, pcmd->vtx_count/3);
vtx_offset += pcmd->vtx_count;
}
}
}
HRESULT InitD3D(HWND hWnd)
{
if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
// Create the D3DDevice
if (g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice) < 0)
return E_FAIL;
return S_OK;
}
void Cleanup()
{
if (g_pTexture != NULL)
g_pTexture->Release();
if (g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if (g_pD3D != NULL)
g_pD3D->Release();
}
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
ImGuiIO& io = ImGui::GetIO();
switch (msg)
{
case WM_LBUTTONDOWN:
io.MouseDown[0] = true;
return true;
case WM_LBUTTONUP:
io.MouseDown[0] = false;
return true;
case WM_RBUTTONDOWN:
io.MouseDown[1] = true;
return true;
case WM_RBUTTONUP:
io.MouseDown[1] = false;
return true;
case WM_MOUSEWHEEL:
// Mouse wheel: -1,0,+1
io.MouseWheel = GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? +1 : -1;
return true;
case WM_MOUSEMOVE:
// Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
io.MousePos.x = (signed short)(lParam);
io.MousePos.y = (signed short)(lParam >> 16);
return true;
case WM_CHAR:
// You can also use ToAscii()+GetKeyboardState() to retrieve characters.
if (wParam > 0 && wParam < 0x10000)
io.AddInputCharacter((unsigned short)wParam);
return true;
case WM_SIZE:
if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED)
{
ImGui_ImplDX9_InvalidateDeviceObjects();
g_d3dpp.BackBufferWidth = LOWORD(lParam);
g_d3dpp.BackBufferHeight = HIWORD(lParam);
HRESULT hr = g_pd3dDevice->Reset(&g_d3dpp);
if (hr == D3DERR_INVALIDCALL)
IM_ASSERT(0);
ImGui_ImplDX9_CreateDeviceObjects();
}
return 0;
case WM_SYSCOMMAND:
if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
return 0;
break;
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
// Notify OS Input Method Editor of text input position (e.g. when using Japanese/Chinese inputs, otherwise this isn't needed)
static void ImImpl_ImeSetInputScreenPosFn(int x, int y)
int main(int, char**)
{
if (HIMC himc = ImmGetContext(hWnd))
{
COMPOSITIONFORM cf;
cf.ptCurrentPos.x = x;
cf.ptCurrentPos.y = y;
cf.dwStyle = CFS_FORCE_POSITION;
ImmSetCompositionWindow(himc, &cf);
}
}
void InitImGui()
{
RECT rect;
GetClientRect(hWnd, &rect);
ImGuiIO& io = ImGui::GetIO();
io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top)); // Display size, in pixels. For clamping windows positions.
io.DeltaTime = 1.0f/60.0f; // Time elapsed since last frame, in seconds (in this sample app we'll override this every frame because our timestep is variable)
io.PixelCenterOffset = 0.0f; // Align Direct3D Texels
io.KeyMap[ImGuiKey_Tab] = VK_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array that we will update during the application lifetime.
io.KeyMap[ImGuiKey_LeftArrow] = VK_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = VK_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = VK_UP;
io.KeyMap[ImGuiKey_DownArrow] = VK_UP;
io.KeyMap[ImGuiKey_Home] = VK_HOME;
io.KeyMap[ImGuiKey_End] = VK_END;
io.KeyMap[ImGuiKey_Delete] = VK_DELETE;
io.KeyMap[ImGuiKey_Backspace] = VK_BACK;
io.KeyMap[ImGuiKey_Enter] = VK_RETURN;
io.KeyMap[ImGuiKey_Escape] = VK_ESCAPE;
io.KeyMap[ImGuiKey_A] = 'A';
io.KeyMap[ImGuiKey_C] = 'C';
io.KeyMap[ImGuiKey_V] = 'V';
io.KeyMap[ImGuiKey_X] = 'X';
io.KeyMap[ImGuiKey_Y] = 'Y';
io.KeyMap[ImGuiKey_Z] = 'Z';
io.RenderDrawListsFn = ImImpl_RenderDrawLists;
io.ImeSetInputScreenPosFn = ImImpl_ImeSetInputScreenPosFn;
// Create the vertex buffer
if (g_pd3dDevice->CreateVertexBuffer(10000 * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL) < 0)
{
IM_ASSERT(0);
return;
}
// Load font texture
const void* png_data;
unsigned int png_size;
ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size);
if (D3DXCreateTextureFromFileInMemory(g_pd3dDevice, png_data, png_size, &g_pTexture) < 0)
{
IM_ASSERT(0);
return;
}
}
INT64 ticks_per_second = 0;
INT64 time = 0;
void UpdateImGui()
{
ImGuiIO& io = ImGui::GetIO();
// Setup timestep
INT64 current_time;
QueryPerformanceCounter((LARGE_INTEGER *)&current_time);
io.DeltaTime = (float)(current_time - time) / ticks_per_second;
time = current_time;
// Setup inputs
// (we already got mouse position, buttons, wheel from the window message callback)
BYTE keystate[256];
GetKeyboardState(keystate);
for (int i = 0; i < 256; i++)
io.KeysDown[i] = (keystate[i] & 0x80) != 0;
io.KeyCtrl = (keystate[VK_CONTROL] & 0x80) != 0;
io.KeyShift = (keystate[VK_SHIFT] & 0x80) != 0;
// io.MousePos : filled by WM_MOUSEMOVE event
// io.MouseDown : filled by WM_*BUTTON* events
// io.MouseWheel : filled by WM_MOUSEWHEEL events
// Start the frame
ImGui::NewFrame();
}
int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int)
{
// Register the window class
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"ImGui Example", NULL };
// Create application window
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, LoadCursor(NULL, IDC_ARROW), NULL, NULL, L"ImGui Example", NULL };
RegisterClassEx(&wc);
// Create the application's window
hWnd = CreateWindow(L"ImGui Example", L"ImGui DirectX9 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
if (!QueryPerformanceFrequency((LARGE_INTEGER *)&ticks_per_second))
return 1;
if (!QueryPerformanceCounter((LARGE_INTEGER *)&time))
return 1;
HWND hwnd = CreateWindow(L"ImGui Example", L"ImGui DirectX9 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
// Initialize Direct3D
if (InitD3D(hWnd) < 0)
LPDIRECT3D9 pD3D;
if ((pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
{
if (g_pVB)
g_pVB->Release();
UnregisterClass(L"ImGui Example", wc.hInstance);
return 1;
return 0;
}
ZeroMemory(&g_d3dpp, sizeof(g_d3dpp));
g_d3dpp.Windowed = TRUE;
g_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
g_d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
g_d3dpp.EnableAutoDepthStencil = TRUE;
g_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
// Create the D3DDevice
if (pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &g_d3dpp, &g_pd3dDevice) < 0)
{
pD3D->Release();
UnregisterClass(L"ImGui Example", wc.hInstance);
return 0;
}
// Show the window
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
// Setup ImGui binding
ImGui_ImplDX9_Init(hwnd, g_pd3dDevice);
//ImGuiIO& io = ImGui::GetIO();
//ImFont* my_font0 = io.Fonts->AddFontDefault();
//ImFont* my_font1 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 16.0f);
//ImFont* my_font2 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/Karla-Regular.ttf", 16.0f);
//ImFont* my_font3 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyClean.ttf", 13.0f); my_font3->DisplayOffset.y += 1;
//ImFont* my_font4 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyTiny.ttf", 10.0f); my_font4->DisplayOffset.y += 1;
//ImFont* my_font5 = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, io.Fonts->GetGlyphRangesJapanese());
InitImGui();
ShowWindow(hwnd, SW_SHOWDEFAULT);
UpdateWindow(hwnd);
// Enter the message loop
bool show_test_window = true;
bool show_another_window = false;
ImVec4 clear_col = ImColor(114, 144, 154);
// Main loop
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while (msg.message != WM_QUIT)
@ -305,37 +99,25 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int)
DispatchMessage(&msg);
continue;
}
UpdateImGui();
static bool show_test_window = true;
static bool show_another_window = false;
ImGui_ImplDX9_NewFrame();
// 1. Show a simple window
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
{
static float f;
static float f = 0.0f;
ImGui::Text("Hello, world!");
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
show_test_window ^= ImGui::Button("Test Window");
show_another_window ^= ImGui::Button("Another Window");
// Calculate and show framerate
static float ms_per_frame[120] = { 0 };
static int ms_per_frame_idx = 0;
static float ms_per_frame_accum = 0.0f;
ms_per_frame_accum -= ms_per_frame[ms_per_frame_idx];
ms_per_frame[ms_per_frame_idx] = ImGui::GetIO().DeltaTime * 1000.0f;
ms_per_frame_accum += ms_per_frame[ms_per_frame_idx];
ms_per_frame_idx = (ms_per_frame_idx + 1) % 120;
const float ms_per_frame_avg = ms_per_frame_accum / 120;
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", ms_per_frame_avg, 1000.0f / ms_per_frame_avg);
ImGui::ColorEdit3("clear color", (float*)&clear_col);
if (ImGui::Button("Test Window")) show_test_window ^= 1;
if (ImGui::Button("Another Window")) show_another_window ^= 1;
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
}
// 2. Show another simple window, this time using an explicit Begin/End pair
if (show_another_window)
{
ImGui::Begin("Another Window", &show_another_window, ImVec2(200,100));
ImGui::SetNextWindowSize(ImVec2(200,100), ImGuiSetCond_FirstUseEver);
ImGui::Begin("Another Window", &show_another_window);
ImGui::Text("Hello");
ImGui::End();
}
@ -343,7 +125,7 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int)
// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow()
if (show_test_window)
{
ImGui::SetNewWindowDefaultPos(ImVec2(650, 20)); // Normally user code doesn't need/want to call it because positions are saved in .ini file anyway. Here we just want to make the demo initial state a bit more friendly!
ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiSetCond_FirstUseEver);
ImGui::ShowTestWindow(&show_test_window);
}
@ -351,7 +133,8 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int)
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false);
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, false);
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(204, 153, 153), 1.0f, 0);
D3DCOLOR clear_col_dx = D3DCOLOR_RGBA((int)(clear_col.x*255.0f), (int)(clear_col.y*255.0f), (int)(clear_col.z*255.0f), (int)(clear_col.w*255.0f));
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, clear_col_dx, 1.0f, 0);
if (g_pd3dDevice->BeginScene() >= 0)
{
ImGui::Render();
@ -360,11 +143,10 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int)
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
ImGui::Shutdown();
if (g_pVB)
g_pVB->Release();
ImGui_ImplDX9_Shutdown();
if (g_pd3dDevice) g_pd3dDevice->Release();
if (pD3D) pD3D->Release();
UnregisterClass(L"ImGui Example", wc.hInstance);
return 0;
}

View File

@ -0,0 +1,56 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opengl_example", "opengl_example\opengl_example.vcxproj", "{9CDA7840-B7A5-496D-A527-E95571496D18}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "directx9_example", "directx9_example\directx9_example.vcxproj", "{4165A294-21F2-44CA-9B38-E3F935ABADF5}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "directx11_example", "directx11_example\directx11_example.vcxproj", "{9F316E83-5AE5-4939-A723-305A94F48005}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opengl3_example", "opengl3_example\opengl3_example.vcxproj", "{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64
Release|Win32 = Release|Win32
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|Win32.ActiveCfg = Debug|Win32
{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|Win32.Build.0 = Debug|Win32
{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|x64.ActiveCfg = Debug|x64
{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|x64.Build.0 = Debug|x64
{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|Win32.ActiveCfg = Release|Win32
{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|Win32.Build.0 = Release|Win32
{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|x64.ActiveCfg = Release|x64
{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|x64.Build.0 = Release|x64
{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|Win32.ActiveCfg = Debug|Win32
{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|Win32.Build.0 = Debug|Win32
{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|x64.ActiveCfg = Debug|x64
{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|x64.Build.0 = Debug|x64
{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|Win32.ActiveCfg = Release|Win32
{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|Win32.Build.0 = Release|Win32
{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|x64.ActiveCfg = Release|x64
{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|x64.Build.0 = Release|x64
{9F316E83-5AE5-4939-A723-305A94F48005}.Debug|Win32.ActiveCfg = Debug|Win32
{9F316E83-5AE5-4939-A723-305A94F48005}.Debug|Win32.Build.0 = Debug|Win32
{9F316E83-5AE5-4939-A723-305A94F48005}.Debug|x64.ActiveCfg = Debug|x64
{9F316E83-5AE5-4939-A723-305A94F48005}.Debug|x64.Build.0 = Debug|x64
{9F316E83-5AE5-4939-A723-305A94F48005}.Release|Win32.ActiveCfg = Release|Win32
{9F316E83-5AE5-4939-A723-305A94F48005}.Release|Win32.Build.0 = Release|Win32
{9F316E83-5AE5-4939-A723-305A94F48005}.Release|x64.ActiveCfg = Release|x64
{9F316E83-5AE5-4939-A723-305A94F48005}.Release|x64.Build.0 = Release|x64
{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|Win32.ActiveCfg = Debug|Win32
{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|Win32.Build.0 = Debug|Win32
{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|x64.ActiveCfg = Debug|x64
{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|x64.Build.0 = Debug|x64
{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|Win32.ActiveCfg = Release|Win32
{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|Win32.Build.0 = Release|Win32
{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|x64.ActiveCfg = Release|x64
{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

3
examples/ios_example/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
.DS_Store
imguiex.xcodeproj/project.xcworkspace/
imguiex.xcodeproj/xcuserdata/

View File

@ -0,0 +1,35 @@
# iOS example
----
## Introduction
This example is the default XCode "OpenGL" example code, modified to support ImGui and [Synergy](http://synergy-project.org/).
Synergy (remote keyboard/mouse) is not required, but it's pretty hard to use ImGui without it. Synergy includes a "uSynergy" library that allows embedding a synergy client, this is what is used here. ImGui supports "TouchPadding", and this is enabled when Synergy is not active.
## How to Use
----
0. In Synergy, go to Preferences, and uncheck "Use SSL encryption"
0. Run the example app.
0. Tap the "servername" button in the corner
0. Enter the name or the IP of your synergy host
0. If you had previously connected to a server, you may need to kill and re-start the app.
----
## Notes and TODOs
Things that would be nice but I didn't get around to doing:
* iOS software keyboard not supported for text inputs
* iOS hardware (bluetooth) keyboards not supported
* Graceful disconnect/reconnect from uSynergy.
* Copy/Paste not well-supported
----
## C++ on iOS
ImGui is a c++ library. If you want to include it directly, rename your Obj-C file to have the ".mm" extension.
Alternatively, you can wrap your debug code in a C interface, this is what I am demonstrating here with the "debug_hud.h" interface. Either approach works, use whatever you prefer.
In my case, most of my game code is already in C++ so it's not really an issue and I can use ImGui directly.

View File

@ -0,0 +1,365 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
6D1E39171B35EEF10017B40F /* uSynergy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6D1E39151B35EEF10017B40F /* uSynergy.c */; };
6D2FC55A1B2E632000C130BA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5591B2E632000C130BA /* main.m */; };
6D2FC55D1B2E632000C130BA /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC55C1B2E632000C130BA /* AppDelegate.m */; };
6D2FC55F1B2E632000C130BA /* Shader.fsh in Resources */ = {isa = PBXBuildFile; fileRef = 6D2FC55E1B2E632000C130BA /* Shader.fsh */; };
6D2FC5611B2E632000C130BA /* Shader.vsh in Resources */ = {isa = PBXBuildFile; fileRef = 6D2FC5601B2E632000C130BA /* Shader.vsh */; };
6D2FC5641B2E632000C130BA /* GameViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5631B2E632000C130BA /* GameViewController.m */; };
6D2FC5671B2E632000C130BA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6D2FC5651B2E632000C130BA /* Main.storyboard */; };
6D2FC5691B2E632000C130BA /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D2FC5681B2E632000C130BA /* Images.xcassets */; };
6D2FC56C1B2E632000C130BA /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D2FC56A1B2E632000C130BA /* LaunchScreen.xib */; };
6D2FC5831B2E63A100C130BA /* imgui_impl_ios.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5811B2E63A100C130BA /* imgui_impl_ios.mm */; };
6D2FC5881B2E64AB00C130BA /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5861B2E64AB00C130BA /* imgui.cpp */; };
6D2FC58B1B2E6A5500C130BA /* debug_hud.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5891B2E6A5500C130BA /* debug_hud.cpp */; };
6D2FC5911B30773F00C130BA /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D2FC5901B30773F00C130BA /* CFNetwork.framework */; };
6D2FC5931B30774900C130BA /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D2FC5921B30774900C130BA /* SystemConfiguration.framework */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
6D1E39151B35EEF10017B40F /* uSynergy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = uSynergy.c; sourceTree = "<group>"; };
6D1E39161B35EEF10017B40F /* uSynergy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = uSynergy.h; sourceTree = "<group>"; };
6D2FC5541B2E632000C130BA /* imguiex.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = imguiex.app; sourceTree = BUILT_PRODUCTS_DIR; };
6D2FC5581B2E632000C130BA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
6D2FC5591B2E632000C130BA /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
6D2FC55B1B2E632000C130BA /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
6D2FC55C1B2E632000C130BA /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
6D2FC55E1B2E632000C130BA /* Shader.fsh */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; name = Shader.fsh; path = Shaders/Shader.fsh; sourceTree = "<group>"; };
6D2FC5601B2E632000C130BA /* Shader.vsh */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.glsl; name = Shader.vsh; path = Shaders/Shader.vsh; sourceTree = "<group>"; };
6D2FC5621B2E632000C130BA /* GameViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GameViewController.h; sourceTree = "<group>"; };
6D2FC5631B2E632000C130BA /* GameViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GameViewController.m; sourceTree = "<group>"; };
6D2FC5661B2E632000C130BA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
6D2FC5681B2E632000C130BA /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
6D2FC56B1B2E632000C130BA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
6D2FC5811B2E63A100C130BA /* imgui_impl_ios.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = imgui_impl_ios.mm; sourceTree = "<group>"; };
6D2FC5821B2E63A100C130BA /* imgui_impl_ios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = imgui_impl_ios.h; sourceTree = "<group>"; };
6D2FC5851B2E64AB00C130BA /* imconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imconfig.h; path = ../../imconfig.h; sourceTree = "<group>"; };
6D2FC5861B2E64AB00C130BA /* imgui.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui.cpp; path = ../../imgui.cpp; sourceTree = "<group>"; };
6D2FC5871B2E64AB00C130BA /* imgui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui.h; path = ../../imgui.h; sourceTree = "<group>"; };
6D2FC5891B2E6A5500C130BA /* debug_hud.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debug_hud.cpp; sourceTree = "<group>"; };
6D2FC58A1B2E6A5500C130BA /* debug_hud.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug_hud.h; sourceTree = "<group>"; };
6D2FC5901B30773F00C130BA /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; };
6D2FC5921B30774900C130BA /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
6D2FC5511B2E632000C130BA /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
6D2FC5931B30774900C130BA /* SystemConfiguration.framework in Frameworks */,
6D2FC5911B30773F00C130BA /* CFNetwork.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
6D1E39141B35EEF10017B40F /* usynergy */ = {
isa = PBXGroup;
children = (
6D1E39151B35EEF10017B40F /* uSynergy.c */,
6D1E39161B35EEF10017B40F /* uSynergy.h */,
);
name = usynergy;
path = ../libs/usynergy;
sourceTree = "<group>";
};
6D2FC54B1B2E632000C130BA = {
isa = PBXGroup;
children = (
6D1E39141B35EEF10017B40F /* usynergy */,
6D2FC5841B2E648D00C130BA /* imgui */,
6D2FC5561B2E632000C130BA /* imguiex */,
6D2FC5551B2E632000C130BA /* Products */,
);
sourceTree = "<group>";
};
6D2FC5551B2E632000C130BA /* Products */ = {
isa = PBXGroup;
children = (
6D2FC5541B2E632000C130BA /* imguiex.app */,
);
name = Products;
sourceTree = "<group>";
};
6D2FC5561B2E632000C130BA /* imguiex */ = {
isa = PBXGroup;
children = (
6D2FC5811B2E63A100C130BA /* imgui_impl_ios.mm */,
6D2FC5821B2E63A100C130BA /* imgui_impl_ios.h */,
6D2FC5891B2E6A5500C130BA /* debug_hud.cpp */,
6D2FC58A1B2E6A5500C130BA /* debug_hud.h */,
6D2FC55B1B2E632000C130BA /* AppDelegate.h */,
6D2FC55C1B2E632000C130BA /* AppDelegate.m */,
6D2FC55E1B2E632000C130BA /* Shader.fsh */,
6D2FC5601B2E632000C130BA /* Shader.vsh */,
6D2FC5621B2E632000C130BA /* GameViewController.h */,
6D2FC5631B2E632000C130BA /* GameViewController.m */,
6D2FC5651B2E632000C130BA /* Main.storyboard */,
6D2FC5681B2E632000C130BA /* Images.xcassets */,
6D2FC56A1B2E632000C130BA /* LaunchScreen.xib */,
6D2FC5571B2E632000C130BA /* Supporting Files */,
);
path = imguiex;
sourceTree = "<group>";
};
6D2FC5571B2E632000C130BA /* Supporting Files */ = {
isa = PBXGroup;
children = (
6D2FC5921B30774900C130BA /* SystemConfiguration.framework */,
6D2FC5901B30773F00C130BA /* CFNetwork.framework */,
6D2FC5581B2E632000C130BA /* Info.plist */,
6D2FC5591B2E632000C130BA /* main.m */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
6D2FC5841B2E648D00C130BA /* imgui */ = {
isa = PBXGroup;
children = (
6D2FC5851B2E64AB00C130BA /* imconfig.h */,
6D2FC5861B2E64AB00C130BA /* imgui.cpp */,
6D2FC5871B2E64AB00C130BA /* imgui.h */,
);
name = imgui;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
6D2FC5531B2E632000C130BA /* imguiex */ = {
isa = PBXNativeTarget;
buildConfigurationList = 6D2FC57B1B2E632000C130BA /* Build configuration list for PBXNativeTarget "imguiex" */;
buildPhases = (
6D2FC5501B2E632000C130BA /* Sources */,
6D2FC5511B2E632000C130BA /* Frameworks */,
6D2FC5521B2E632000C130BA /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = imguiex;
productName = imguiex;
productReference = 6D2FC5541B2E632000C130BA /* imguiex.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
6D2FC54C1B2E632000C130BA /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0630;
ORGANIZATIONNAME = "Joel Davis";
TargetAttributes = {
6D2FC5531B2E632000C130BA = {
CreatedOnToolsVersion = 6.3.2;
};
};
};
buildConfigurationList = 6D2FC54F1B2E632000C130BA /* Build configuration list for PBXProject "imguiex" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 6D2FC54B1B2E632000C130BA;
productRefGroup = 6D2FC5551B2E632000C130BA /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
6D2FC5531B2E632000C130BA /* imguiex */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
6D2FC5521B2E632000C130BA /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
6D2FC56C1B2E632000C130BA /* LaunchScreen.xib in Resources */,
6D2FC5671B2E632000C130BA /* Main.storyboard in Resources */,
6D2FC5691B2E632000C130BA /* Images.xcassets in Resources */,
6D2FC5611B2E632000C130BA /* Shader.vsh in Resources */,
6D2FC55F1B2E632000C130BA /* Shader.fsh in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
6D2FC5501B2E632000C130BA /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
6D2FC55D1B2E632000C130BA /* AppDelegate.m in Sources */,
6D2FC5831B2E63A100C130BA /* imgui_impl_ios.mm in Sources */,
6D1E39171B35EEF10017B40F /* uSynergy.c in Sources */,
6D2FC5641B2E632000C130BA /* GameViewController.m in Sources */,
6D2FC55A1B2E632000C130BA /* main.m in Sources */,
6D2FC5881B2E64AB00C130BA /* imgui.cpp in Sources */,
6D2FC58B1B2E6A5500C130BA /* debug_hud.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
6D2FC5651B2E632000C130BA /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
6D2FC5661B2E632000C130BA /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
6D2FC56A1B2E632000C130BA /* LaunchScreen.xib */ = {
isa = PBXVariantGroup;
children = (
6D2FC56B1B2E632000C130BA /* Base */,
);
name = LaunchScreen.xib;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
6D2FC5791B2E632000C130BA /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
6D2FC57A1B2E632000C130BA /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
6D2FC57C1B2E632000C130BA /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = imguiex/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
6D2FC57D1B2E632000C130BA /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = imguiex/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
6D2FC54F1B2E632000C130BA /* Build configuration list for PBXProject "imguiex" */ = {
isa = XCConfigurationList;
buildConfigurations = (
6D2FC5791B2E632000C130BA /* Debug */,
6D2FC57A1B2E632000C130BA /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
6D2FC57B1B2E632000C130BA /* Build configuration list for PBXNativeTarget "imguiex" */ = {
isa = XCConfigurationList;
buildConfigurations = (
6D2FC57C1B2E632000C130BA /* Debug */,
6D2FC57D1B2E632000C130BA /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 6D2FC54C1B2E632000C130BA /* Project object */;
}

View File

@ -0,0 +1,13 @@
//
// AppDelegate.h
// imguiex
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

View File

@ -0,0 +1,41 @@
//
// AppDelegate.m
// imguiex
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
- (void)applicationWillTerminate:(UIApplication *)application {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
@end

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7706" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="imguiex" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
<rect key="frame" x="20" y="140" width="441" height="43"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
<constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
<constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="548" y="455"/>
</view>
</objects>
</document>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BV1-FR-VrT">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
</dependencies>
<scenes>
<!--Game View Controller-->
<scene sceneID="tXr-a1-R10">
<objects>
<viewController id="BV1-FR-VrT" customClass="GameViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="8aa-yV-Osq"/>
<viewControllerLayoutGuide type="bottom" id="qHh-Mt-9TT"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="3se-qz-xqx" customClass="GLKView">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="piS-r7-VWh">
<rect key="frame" x="16" y="550" width="136" height="30"/>
<state key="normal" title="servername">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="onServernameTapped:" destination="BV1-FR-VrT" eventType="touchUpInside" id="9sO-yv-0be"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="qHh-Mt-9TT" firstAttribute="top" secondItem="piS-r7-VWh" secondAttribute="bottom" constant="20" id="JxW-fj-qni"/>
<constraint firstItem="piS-r7-VWh" firstAttribute="leading" secondItem="3se-qz-xqx" secondAttribute="leadingMargin" constant="20" id="w5q-gx-tJj"/>
</constraints>
</view>
<connections>
<outlet property="btnServername" destination="piS-r7-VWh" id="9iV-ef-l6M"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="SZV-WD-TEh" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>

View File

@ -0,0 +1,12 @@
//
// GameViewController.h
// imguiex
// This is the OpenGL Example template from XCode, modified to support ImGui
#import <UIKit/UIKit.h>
#import <GLKit/GLKit.h>
@interface GameViewController : GLKViewController
@end

View File

@ -0,0 +1,481 @@
//
// GameViewController.m
// imguiex
//
#import "GameViewController.h"
#import <OpenGLES/ES2/glext.h>
#import "imgui_impl_ios.h"
#import "debug_hud.h"
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
#define SERVERNAME_KEY @"ServerName"
#define SERVERNAME_ALERT_TAG (10)
// Uniform index.
enum
{
UNIFORM_MODELVIEWPROJECTION_MATRIX,
UNIFORM_NORMAL_MATRIX,
UNIFORM_DIFFUSE_COLOR,
NUM_UNIFORMS
};
GLint uniforms[NUM_UNIFORMS];
// Attribute index.
enum
{
ATTRIB_VERTEX,
ATTRIB_NORMAL,
NUM_ATTRIBUTES
};
GLfloat gCubeVertexData[216] =
{
// Data layout for each line below is:
// positionX, positionY, positionZ, normalX, normalY, normalZ,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f
};
@interface GameViewController () <UIAlertViewDelegate>
{
GLuint _program;
GLKMatrix4 _modelViewProjectionMatrix;
GLKMatrix3 _normalMatrix;
float _rotation;
GLuint _vertexArray;
GLuint _vertexBuffer;
DebugHUD _hud;
}
@property (strong, nonatomic) EAGLContext *context;
@property (strong, nonatomic) GLKBaseEffect *effect;
@property (strong, nonatomic) ImGuiHelper *imgui;
@property (weak, nonatomic) IBOutlet UIButton *btnServername;
@property (strong, nonatomic) NSString *serverName;
- (IBAction)onServernameTapped:(id)sender;
- (void)setupGL;
- (void)tearDownGL;
- (BOOL)loadShaders;
- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file;
- (BOOL)linkProgram:(GLuint)prog;
- (BOOL)validateProgram:(GLuint)prog;
@end
@implementation GameViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
if (!self.context) {
NSLog(@"Failed to create ES context");
}
GLKView *view = (GLKView *)self.view;
view.context = self.context;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
[self.btnServername setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[self setupGL];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
self.serverName = [userDefaults objectForKey: SERVERNAME_KEY ];
self.imgui = [[ImGuiHelper alloc] initWithView:self.view ];
if (self.serverName)
{
[self.btnServername setTitle:self.serverName forState:UIControlStateNormal];
[self.imgui connectServer: self.serverName ];
}
DebugHUD_InitDefaults( &_hud );
}
- (void)dealloc
{
[self tearDownGL];
if ([EAGLContext currentContext] == self.context) {
[EAGLContext setCurrentContext:nil];
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
if ([self isViewLoaded] && ([[self view] window] == nil)) {
self.view = nil;
[self tearDownGL];
if ([EAGLContext currentContext] == self.context) {
[EAGLContext setCurrentContext:nil];
}
self.context = nil;
}
// Dispose of any resources that can be recreated.
}
- (BOOL)prefersStatusBarHidden {
return YES;
}
- (IBAction)onServernameTapped:(id)sender
{
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Set Server" message:@"Enter server name or IP for uSynergy" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Cancel", nil ];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
alert.tag = SERVERNAME_ALERT_TAG; // cheezy way to tell which alert view we're responding to
[alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if ((buttonIndex==0)&&(alertView.tag==SERVERNAME_ALERT_TAG))
{
// This is really janky. I usually just hardcode the servername since I'm building it anyway.
// If you want to properly handle updating the server, you'll want to tear down and recreate
// the usynergy stuff in connectServer
BOOL serverNameWasSet = self.serverName.length > 0;
NSString *serverName = [[alertView textFieldAtIndex:0] text];
if ([serverName length] > 0) {
self.serverName = serverName;
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:serverName forKey:SERVERNAME_KEY ];
[userDefaults synchronize];
[self.btnServername setTitle:self.serverName forState:UIControlStateNormal];
// If we hadn't previously connected, try now
if (!serverNameWasSet) {
[self.imgui connectServer:self.serverName];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Servername Updated"
message:@"Restart the app to connect the server"
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
}
}
}
}
- (void)setupGL
{
[EAGLContext setCurrentContext:self.context];
[self loadShaders];
self.effect = [[GLKBaseEffect alloc] init];
self.effect.light0.enabled = GL_TRUE;
self.effect.light0.diffuseColor = GLKVector4Make(1.0f, 0.4f, 0.4f, 1.0f);
glEnable(GL_DEPTH_TEST);
glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));
glBindVertexArrayOES(0);
}
- (void)tearDownGL
{
[EAGLContext setCurrentContext:self.context];
glDeleteBuffers(1, &_vertexBuffer);
glDeleteVertexArraysOES(1, &_vertexArray);
self.effect = nil;
if (_program) {
glDeleteProgram(_program);
_program = 0;
}
}
#pragma mark - GLKView and GLKViewController delegate methods
- (void)update
{
float aspect = fabs(self.view.bounds.size.width / self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f);
self.effect.transform.projectionMatrix = projectionMatrix;
GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f);
baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f);
// Compute the model view matrix for the object rendered with GLKit
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -1.5f);
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f);
modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);
self.effect.transform.modelviewMatrix = modelViewMatrix;
// Compute the model view matrix for the object rendered with ES2
modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 1.5f);
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f);
modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);
_normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL);
_modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix);
_rotation += self.timeSinceLastUpdate * (_hud.rotation_speed * (M_PI / 180.0));
}
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArrayOES(_vertexArray);
// Render the object with GLKit
[self.effect prepareToDraw];
glDrawArrays(GL_TRIANGLES, 0, 36);
// Render the object again with ES2
glUseProgram(_program);
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);
glUniform3f(uniforms[UNIFORM_DIFFUSE_COLOR], _hud.cubeColor1[0], _hud.cubeColor1[1], _hud.cubeColor1[2] );
glDrawArrays(GL_TRIANGLES, 0, 36);
[self.imgui newFrame];
// Now do our ImGUI UI
DebugHUD_DoInterface( &_hud );
self.effect.light0.diffuseColor = GLKVector4Make( _hud.cubeColor2[0], _hud.cubeColor2[1], _hud.cubeColor2[2], 1.0f);
// Now render Imgui
[self.imgui render];
}
#pragma mark - OpenGL ES 2 shader compilation
- (BOOL)loadShaders
{
GLuint vertShader, fragShader;
NSString *vertShaderPathname, *fragShaderPathname;
// Create shader program.
_program = glCreateProgram();
// Create and compile vertex shader.
vertShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"vsh"];
if (![self compileShader:&vertShader type:GL_VERTEX_SHADER file:vertShaderPathname]) {
NSLog(@"Failed to compile vertex shader");
return NO;
}
// Create and compile fragment shader.
fragShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"fsh"];
if (![self compileShader:&fragShader type:GL_FRAGMENT_SHADER file:fragShaderPathname]) {
NSLog(@"Failed to compile fragment shader");
return NO;
}
// Attach vertex shader to program.
glAttachShader(_program, vertShader);
// Attach fragment shader to program.
glAttachShader(_program, fragShader);
// Bind attribute locations.
// This needs to be done prior to linking.
glBindAttribLocation(_program, GLKVertexAttribPosition, "position");
glBindAttribLocation(_program, GLKVertexAttribNormal, "normal");
// Link program.
if (![self linkProgram:_program]) {
NSLog(@"Failed to link program: %d", _program);
if (vertShader) {
glDeleteShader(vertShader);
vertShader = 0;
}
if (fragShader) {
glDeleteShader(fragShader);
fragShader = 0;
}
if (_program) {
glDeleteProgram(_program);
_program = 0;
}
return NO;
}
// Get uniform locations.
uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX] = glGetUniformLocation(_program, "modelViewProjectionMatrix");
uniforms[UNIFORM_NORMAL_MATRIX] = glGetUniformLocation(_program, "normalMatrix");
uniforms[UNIFORM_DIFFUSE_COLOR] = glGetUniformLocation(_program, "diffuseColor");
// Release vertex and fragment shaders.
if (vertShader) {
glDetachShader(_program, vertShader);
glDeleteShader(vertShader);
}
if (fragShader) {
glDetachShader(_program, fragShader);
glDeleteShader(fragShader);
}
return YES;
}
- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file
{
GLint status;
const GLchar *source;
source = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil] UTF8String];
if (!source) {
NSLog(@"Failed to load vertex shader");
return NO;
}
*shader = glCreateShader(type);
glShaderSource(*shader, 1, &source, NULL);
glCompileShader(*shader);
#if defined(DEBUG)
GLint logLength;
glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);
if (logLength > 0) {
GLchar *log = (GLchar *)malloc(logLength);
glGetShaderInfoLog(*shader, logLength, &logLength, log);
NSLog(@"Shader compile log:\n%s", log);
free(log);
}
#endif
glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);
if (status == 0) {
glDeleteShader(*shader);
return NO;
}
return YES;
}
- (BOOL)linkProgram:(GLuint)prog
{
GLint status;
glLinkProgram(prog);
#if defined(DEBUG)
GLint logLength;
glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
if (logLength > 0) {
GLchar *log = (GLchar *)malloc(logLength);
glGetProgramInfoLog(prog, logLength, &logLength, log);
NSLog(@"Program link log:\n%s", log);
free(log);
}
#endif
glGetProgramiv(prog, GL_LINK_STATUS, &status);
if (status == 0) {
return NO;
}
return YES;
}
- (BOOL)validateProgram:(GLuint)prog
{
GLint logLength, status;
glValidateProgram(prog);
glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
if (logLength > 0) {
GLchar *log = (GLchar *)malloc(logLength);
glGetProgramInfoLog(prog, logLength, &logLength, log);
NSLog(@"Program validate log:\n%s", log);
free(log);
}
glGetProgramiv(prog, GL_VALIDATE_STATUS, &status);
if (status == 0) {
return NO;
}
return YES;
}
@end

View File

@ -0,0 +1,72 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "icon_imgui_60@2x~iphone.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "icon_imgui_60@3x~iphone.png",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "icon_imgui_76~ipad.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "icon_imgui_76@2x~ipad.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>org.imgui.example.$(PRODUCT_NAME:rfc1034identifier)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UIStatusBarHidden</key>
<true/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,10 @@
//
// Shader.fsh
// imguiex
varying lowp vec4 colorVarying;
void main()
{
gl_FragColor = colorVarying;
}

View File

@ -0,0 +1,25 @@
//
// Shader.vsh
// imguiex
attribute vec4 position;
attribute vec3 normal;
varying lowp vec4 colorVarying;
uniform vec3 diffuseColor;
uniform mat4 modelViewProjectionMatrix;
uniform mat3 normalMatrix;
void main()
{
vec3 eyeNormal = normalize(normalMatrix * normal);
vec3 lightPosition = vec3(0.0, 0.0, 1.0);
float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition)));
vec3 colorLit = diffuseColor * nDotVP;
colorVarying = vec4( colorLit.x, colorLit.y, colorLit.z, 1.0 );
gl_Position = modelViewProjectionMatrix * position;
}

View File

@ -0,0 +1,45 @@
//
// debug_hud.cpp
// imguiex
#include <stdio.h>
#include "debug_hud.h"
#include "imgui.h"
void DebugHUD_InitDefaults( DebugHUD *hud )
{
hud->show_test_window = true;
hud->show_example_window = true;
hud->rotation_speed = 15.0f;
hud->cubeColor1[0] = 0.4f;
hud->cubeColor1[1] = 0.4f;
hud->cubeColor1[2] = 1.0f;
hud->cubeColor1[3] = 1.0f;
hud->cubeColor2[0] = 1.0f;
hud->cubeColor2[1] = 0.4f;
hud->cubeColor2[2] = 0.4f;
hud->cubeColor2[3] = 1.0f;
}
void DebugHUD_DoInterface( DebugHUD *hud )
{
if (hud->show_test_window)
{
ImGui::SetNextWindowPos( ImVec2( 400, 20 ), ImGuiSetCond_FirstUseEver );
ImGui::ShowTestWindow( &hud->show_test_window );
}
if (hud->show_example_window)
{
ImGui::SetNextWindowPos( ImVec2( 20, 20 ), ImGuiSetCond_FirstUseEver );
ImGui::SetNextWindowSize( ImVec2( 350, 200 ), ImGuiSetCond_FirstUseEver );
ImGui::Begin("Another Window", &hud->show_example_window);
ImGui::ColorEdit3("Cube 1 Color", hud->cubeColor1);
ImGui::ColorEdit3("Cube 2 Color", hud->cubeColor2);
ImGui::SliderFloat("Rotation Speed", &hud->rotation_speed, 0.0f, 200.0f);
ImGui::End();
}
}

View File

@ -0,0 +1,25 @@
//
// debug_hud.h
// imguiex
#pragma once
typedef struct DebugHUD
{
bool show_test_window;
bool show_example_window;
float rotation_speed;
float cubeColor1[4];
float cubeColor2[4];
} DebugHUD;
#if __cplusplus
extern "C" {
#endif
void DebugHUD_InitDefaults( DebugHUD *hud );
void DebugHUD_DoInterface( DebugHUD *hud );
#if __cplusplus
}
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,22 @@
//
// imgui_impl_ios.h
// imguiex
//
// Joel Davis (joeld42@gmail.com)
//
#pragma once
#include <Foundation/Foundation.h>
#include <UIKit/UIKit.h>
@interface ImGuiHelper : NSObject
- (id) initWithView: (UIView *)view;
- (void)connectServer: (NSString*)serverName;
- (void)render;
- (void)newFrame;
@end

View File

@ -0,0 +1,815 @@
//
// imgui_impl_ios.cpp
// imguiex
#import <OpenGLES/ES3/gl.h>
#import <OpenGLES/ES3/glext.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include "imgui_impl_ios.h"
#include "imgui.h"
#include "uSynergy.h"
// From Carbon HIToolbox/Events.h
// FIXME: Keyboard mapping is hacked in because Synergy doesn't give us character but only keycode which aren't really portable if you consider keyboard locale. See https://github.com/ocornut/imgui/pull/247
enum {
kVK_ANSI_A = 0x00,
kVK_ANSI_S = 0x01,
kVK_ANSI_D = 0x02,
kVK_ANSI_F = 0x03,
kVK_ANSI_H = 0x04,
kVK_ANSI_G = 0x05,
kVK_ANSI_Z = 0x06,
kVK_ANSI_X = 0x07,
kVK_ANSI_C = 0x08,
kVK_ANSI_V = 0x09,
kVK_ANSI_B = 0x0B,
kVK_ANSI_Q = 0x0C,
kVK_ANSI_W = 0x0D,
kVK_ANSI_E = 0x0E,
kVK_ANSI_R = 0x0F,
kVK_ANSI_Y = 0x10,
kVK_ANSI_T = 0x11,
kVK_ANSI_1 = 0x12,
kVK_ANSI_2 = 0x13,
kVK_ANSI_3 = 0x14,
kVK_ANSI_4 = 0x15,
kVK_ANSI_6 = 0x16,
kVK_ANSI_5 = 0x17,
kVK_ANSI_Equal = 0x18,
kVK_ANSI_9 = 0x19,
kVK_ANSI_7 = 0x1A,
kVK_ANSI_Minus = 0x1B,
kVK_ANSI_8 = 0x1C,
kVK_ANSI_0 = 0x1D,
kVK_ANSI_RightBracket = 0x1E,
kVK_ANSI_O = 0x1F,
kVK_ANSI_U = 0x20,
kVK_ANSI_LeftBracket = 0x21,
kVK_ANSI_I = 0x22,
kVK_ANSI_P = 0x23,
kVK_ANSI_L = 0x25,
kVK_ANSI_J = 0x26,
kVK_ANSI_Quote = 0x27,
kVK_ANSI_K = 0x28,
kVK_ANSI_Semicolon = 0x29,
kVK_ANSI_Backslash = 0x2A,
kVK_ANSI_Comma = 0x2B,
kVK_ANSI_Slash = 0x2C,
kVK_ANSI_N = 0x2D,
kVK_ANSI_M = 0x2E,
kVK_ANSI_Period = 0x2F,
kVK_ANSI_Grave = 0x32,
kVK_ANSI_KeypadDecimal = 0x41,
kVK_ANSI_KeypadMultiply = 0x43,
kVK_ANSI_KeypadPlus = 0x45,
kVK_ANSI_KeypadClear = 0x47,
kVK_ANSI_KeypadDivide = 0x4B,
kVK_ANSI_KeypadEnter = 0x4C,
kVK_ANSI_KeypadMinus = 0x4E,
kVK_ANSI_KeypadEquals = 0x51,
kVK_ANSI_Keypad0 = 0x52,
kVK_ANSI_Keypad1 = 0x53,
kVK_ANSI_Keypad2 = 0x54,
kVK_ANSI_Keypad3 = 0x55,
kVK_ANSI_Keypad4 = 0x56,
kVK_ANSI_Keypad5 = 0x57,
kVK_ANSI_Keypad6 = 0x58,
kVK_ANSI_Keypad7 = 0x59,
kVK_ANSI_Keypad8 = 0x5B,
kVK_ANSI_Keypad9 = 0x5C
};
/* keycodes for keys that are independent of keyboard layout*/
enum {
kVK_Return = 0x24,
kVK_Tab = 0x30,
kVK_Space = 0x31,
kVK_Delete = 0x33,
kVK_Escape = 0x35,
kVK_Command = 0x37,
kVK_Shift = 0x38,
kVK_CapsLock = 0x39,
kVK_Option = 0x3A,
kVK_Control = 0x3B,
kVK_RightShift = 0x3C,
kVK_RightOption = 0x3D,
kVK_RightControl = 0x3E,
kVK_Function = 0x3F,
kVK_F17 = 0x40,
kVK_VolumeUp = 0x48,
kVK_VolumeDown = 0x49,
kVK_Mute = 0x4A,
kVK_F18 = 0x4F,
kVK_F19 = 0x50,
kVK_F20 = 0x5A,
kVK_F5 = 0x60,
kVK_F6 = 0x61,
kVK_F7 = 0x62,
kVK_F3 = 0x63,
kVK_F8 = 0x64,
kVK_F9 = 0x65,
kVK_F11 = 0x67,
kVK_F13 = 0x69,
kVK_F16 = 0x6A,
kVK_F14 = 0x6B,
kVK_F10 = 0x6D,
kVK_F12 = 0x6F,
kVK_F15 = 0x71,
kVK_Help = 0x72,
kVK_Home = 0x73,
kVK_PageUp = 0x74,
kVK_ForwardDelete = 0x75,
kVK_F4 = 0x76,
kVK_End = 0x77,
kVK_F2 = 0x78,
kVK_PageDown = 0x79,
kVK_F1 = 0x7A,
kVK_LeftArrow = 0x7B,
kVK_RightArrow = 0x7C,
kVK_DownArrow = 0x7D,
kVK_UpArrow = 0x7E
};
static char g_keycodeCharUnshifted[256] = {};
static char g_keycodeCharShifted[256] = {};
//static double g_Time = 0.0f;
static bool g_MousePressed[3] = { false, false, false };
static float g_mouseWheelX = 0.0f;
static float g_mouseWheelY = 0.0f;
static GLuint g_FontTexture = 0;
static int g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0;
static int g_AttribLocationTex = 0, g_AttribLocationProjMtx = 0;
static int g_AttribLocationPosition = 0, g_AttribLocationUV = 0, g_AttribLocationColor = 0;
static size_t g_VboSize = 0;
static unsigned int g_VboHandle = 0, g_VaoHandle = 0;
static float g_displayScale;
static int usynergy_sockfd;
static bool g_synergyPtrActive = false;
static uint16_t g_mousePosX = 0;
static uint16_t g_mousePosY = 0;
static void ImGui_ImplIOS_RenderDrawLists (ImDrawList** const cmd_lists, int cmd_lists_count);
bool ImGui_ImplIOS_CreateDeviceObjects();
static NSString *g_serverName;
uSynergyBool ImGui_ConnectFunc(uSynergyCookie cookie)
{
// NOTE: You need to turn off "Use SSL Encryption" in Synergy preferences, since
// uSynergy does not support SSL.
NSLog( @"Connect Func!");
struct addrinfo hints, *res;
// first, load up address structs with getaddrinfo():
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever
hints.ai_socktype = SOCK_STREAM;
// get server address
getaddrinfo([g_serverName UTF8String], "24800", &hints, &res);
if (!res)
{
NSLog( @"Could not find server: %@", g_serverName );
return USYNERGY_FALSE;
}
// make a socket:
usynergy_sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
// connect it to the address and port we passed in to getaddrinfo():
int ret = connect(usynergy_sockfd, res->ai_addr, res->ai_addrlen);
if (!ret) {
NSLog( @"Connect suceeded...");
} else {
NSLog( @"Connect failed, %d", ret );
}
return USYNERGY_TRUE;
}
uSynergyBool ImGui_SendFunc(uSynergyCookie cookie, const uint8_t *buffer, int length)
{
// NSLog( @"Send Func" );
send( usynergy_sockfd, buffer, length, 0 );
return USYNERGY_TRUE;
}
uSynergyBool ImGui_RecvFunc(uSynergyCookie cookie, uint8_t *buffer, int maxLength, int* outLength)
{
*outLength = (int)recv( usynergy_sockfd, buffer, maxLength, 0 );
return USYNERGY_TRUE;
}
void ImGui_SleepFunc(uSynergyCookie cookie, int timeMs)
{
usleep( timeMs * 1000 );
}
uint32_t ImGui_GetTimeFunc()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (int32_t)((tv.tv_sec) * 1000 + (tv.tv_usec) / 1000);
}
void ImGui_TraceFunc(uSynergyCookie cookie, const char *text)
{
puts(text);
}
void ImGui_ScreenActiveCallback(uSynergyCookie cookie, uSynergyBool active)
{
g_synergyPtrActive = active;
// printf( "Synergy: screen activate %s\n", active?"YES":"NO" );
}
void ImGui_MouseCallback(uSynergyCookie cookie, uint16_t x, uint16_t y, int16_t wheelX, int16_t wheelY,
uSynergyBool buttonLeft, uSynergyBool buttonRight, uSynergyBool buttonMiddle)
{
// printf("Synergy: mouse callback %d %d -- wheel %d %d\n", x, y, wheelX, wheelY );
uSynergyContext *ctx = (uSynergyContext*)cookie;
g_mousePosX = x;
g_mousePosY = y;
g_mouseWheelX = wheelX;
g_mouseWheelY = wheelY;
g_MousePressed[0] = buttonLeft;
g_MousePressed[1] = buttonMiddle;
g_MousePressed[2] = buttonRight;
ctx->m_mouseWheelX = 0;
ctx->m_mouseWheelY = 0;
}
void ImGui_KeyboardCallback(uSynergyCookie cookie, uint16_t key,
uint16_t modifiers, uSynergyBool down, uSynergyBool repeat)
{
int scanCode = key-1;
// printf("Synergy: keyboard callback: 0x%02X (%s)", scanCode, down?"true":"false");
ImGuiIO& io = ImGui::GetIO();
io.KeysDown[key] = down;
io.KeyShift = modifiers & USYNERGY_MODIFIER_SHIFT;
io.KeyCtrl = modifiers & USYNERGY_MODIFIER_CTRL;
io.KeyAlt = modifiers & USYNERGY_MODIFIER_ALT;
// Add this as keyboard input
if ((down) && (key) && (scanCode<256) && !(modifiers & USYNERGY_MODIFIER_CTRL))
{
// If this key maps to a character input, apply it
int charForKeycode = (modifiers & USYNERGY_MODIFIER_SHIFT) ? g_keycodeCharShifted[scanCode] : g_keycodeCharUnshifted[scanCode];
io.AddInputCharacter((unsigned short)charForKeycode);
}
}
void ImGui_JoystickCallback(uSynergyCookie cookie, uint8_t joyNum, uint16_t buttons, int8_t leftStickX, int8_t leftStickY, int8_t rightStickX, int8_t rightStickY)
{
printf("Synergy: joystick callback TODO\n");
}
void ImGui_ClipboardCallback(uSynergyCookie cookie, enum uSynergyClipboardFormat format, const uint8_t *data, uint32_t size)
{
printf("Synergy: clipboard callback TODO\n" );
}
@interface ImGuiHelper ()
{
BOOL _mouseDown;
BOOL _mouseTapped;
CGPoint _touchPos;
uSynergyContext _synergyCtx;
dispatch_queue_t _synergyQueue;
}
@property (nonatomic, weak) UIView *view;
@property (nonatomic, strong) NSString *serverName;
@end
@implementation ImGuiHelper
- (id) initWithView: (UIView *)view
{
self = [super init];
if (self)
{
self.view = view;
[self setupImGuiHooks];
}
return self;
}
- (void)setupKeymaps
{
// The keyboard mapping is a big headache. I tried for a while to find a better way to do this,
// but this was the best I could come up with. There are some device independent API's available
// to convert scan codes to unicode characters, but these are only available on mac and not
// on iOS as far as I can tell (it's part of Carbon). I didn't see any better way to do
// this or any way to get the character codes out of usynergy.
g_keycodeCharUnshifted[ kVK_ANSI_A ]='a';
g_keycodeCharUnshifted[ kVK_ANSI_S ]='s';
g_keycodeCharUnshifted[ kVK_ANSI_D ]='d';
g_keycodeCharUnshifted[ kVK_ANSI_F ]='f';
g_keycodeCharUnshifted[ kVK_ANSI_H ]='h';
g_keycodeCharUnshifted[ kVK_ANSI_G ]='g';
g_keycodeCharUnshifted[ kVK_ANSI_Z ]='z';
g_keycodeCharUnshifted[ kVK_ANSI_X ]='x';
g_keycodeCharUnshifted[ kVK_ANSI_C ]='c';
g_keycodeCharUnshifted[ kVK_ANSI_V ]='v';
g_keycodeCharUnshifted[ kVK_ANSI_B ]='b';
g_keycodeCharUnshifted[ kVK_ANSI_Q ]='q';
g_keycodeCharUnshifted[ kVK_ANSI_W ]='w';
g_keycodeCharUnshifted[ kVK_ANSI_E ]='e';
g_keycodeCharUnshifted[ kVK_ANSI_R ]='r';
g_keycodeCharUnshifted[ kVK_ANSI_Y ]='y';
g_keycodeCharUnshifted[ kVK_ANSI_T ]='t';
g_keycodeCharUnshifted[ kVK_ANSI_1 ]='1';
g_keycodeCharUnshifted[ kVK_ANSI_2 ]='2';
g_keycodeCharUnshifted[ kVK_ANSI_3 ]='3';
g_keycodeCharUnshifted[ kVK_ANSI_4 ]='4';
g_keycodeCharUnshifted[ kVK_ANSI_6 ]='6';
g_keycodeCharUnshifted[ kVK_ANSI_5 ]='5';
g_keycodeCharUnshifted[ kVK_ANSI_Equal ]='=';
g_keycodeCharUnshifted[ kVK_ANSI_9 ]='9';
g_keycodeCharUnshifted[ kVK_ANSI_7 ]='7';
g_keycodeCharUnshifted[ kVK_ANSI_Minus ]='-';
g_keycodeCharUnshifted[ kVK_ANSI_8 ]='8';
g_keycodeCharUnshifted[ kVK_ANSI_0 ]='0';
g_keycodeCharUnshifted[ kVK_ANSI_RightBracket ]=']';
g_keycodeCharUnshifted[ kVK_ANSI_O ]='o';
g_keycodeCharUnshifted[ kVK_ANSI_U ]='u';
g_keycodeCharUnshifted[ kVK_ANSI_LeftBracket ]='[';
g_keycodeCharUnshifted[ kVK_ANSI_I ]='i';
g_keycodeCharUnshifted[ kVK_ANSI_P ]='p';
g_keycodeCharUnshifted[ kVK_ANSI_L ]='l';
g_keycodeCharUnshifted[ kVK_ANSI_J ]='j';
g_keycodeCharUnshifted[ kVK_ANSI_Quote ]='\'';
g_keycodeCharUnshifted[ kVK_ANSI_K ]='k';
g_keycodeCharUnshifted[ kVK_ANSI_Semicolon ]=';';
g_keycodeCharUnshifted[ kVK_ANSI_Backslash ]='\\';
g_keycodeCharUnshifted[ kVK_ANSI_Comma ]=',';
g_keycodeCharUnshifted[ kVK_ANSI_Slash ]='/';
g_keycodeCharUnshifted[ kVK_ANSI_N ]='n';
g_keycodeCharUnshifted[ kVK_ANSI_M ]='m';
g_keycodeCharUnshifted[ kVK_ANSI_Period ]='.';
g_keycodeCharUnshifted[ kVK_ANSI_Grave ]='`';
g_keycodeCharUnshifted[ kVK_ANSI_KeypadDecimal ]='.';
g_keycodeCharUnshifted[ kVK_ANSI_KeypadMultiply ]='*';
g_keycodeCharUnshifted[ kVK_ANSI_KeypadPlus ]='+';
g_keycodeCharUnshifted[ kVK_ANSI_KeypadDivide ]='/';
g_keycodeCharUnshifted[ kVK_ANSI_KeypadEnter ]='\n';
g_keycodeCharUnshifted[ kVK_ANSI_KeypadMinus ]='-';
g_keycodeCharUnshifted[ kVK_ANSI_KeypadEquals ]='=';
g_keycodeCharUnshifted[ kVK_ANSI_Keypad0 ]='0';
g_keycodeCharUnshifted[ kVK_ANSI_Keypad1 ]='1';
g_keycodeCharUnshifted[ kVK_ANSI_Keypad2 ]='2';
g_keycodeCharUnshifted[ kVK_ANSI_Keypad3 ]='3';
g_keycodeCharUnshifted[ kVK_ANSI_Keypad4 ]='4';
g_keycodeCharUnshifted[ kVK_ANSI_Keypad5 ]='5';
g_keycodeCharUnshifted[ kVK_ANSI_Keypad6 ]='6';
g_keycodeCharUnshifted[ kVK_ANSI_Keypad7 ]='7';
g_keycodeCharUnshifted[ kVK_ANSI_Keypad8 ]='8';
g_keycodeCharUnshifted[ kVK_ANSI_Keypad9 ]='9';
g_keycodeCharUnshifted[ kVK_Space ]=' ';
g_keycodeCharShifted[ kVK_ANSI_A ]='A';
g_keycodeCharShifted[ kVK_ANSI_S ]='S';
g_keycodeCharShifted[ kVK_ANSI_D ]='D';
g_keycodeCharShifted[ kVK_ANSI_F ]='F';
g_keycodeCharShifted[ kVK_ANSI_H ]='H';
g_keycodeCharShifted[ kVK_ANSI_G ]='G';
g_keycodeCharShifted[ kVK_ANSI_Z ]='Z';
g_keycodeCharShifted[ kVK_ANSI_X ]='X';
g_keycodeCharShifted[ kVK_ANSI_C ]='C';
g_keycodeCharShifted[ kVK_ANSI_V ]='V';
g_keycodeCharShifted[ kVK_ANSI_B ]='B';
g_keycodeCharShifted[ kVK_ANSI_Q ]='Q';
g_keycodeCharShifted[ kVK_ANSI_W ]='W';
g_keycodeCharShifted[ kVK_ANSI_E ]='E';
g_keycodeCharShifted[ kVK_ANSI_R ]='R';
g_keycodeCharShifted[ kVK_ANSI_Y ]='Y';
g_keycodeCharShifted[ kVK_ANSI_T ]='T';
g_keycodeCharShifted[ kVK_ANSI_1 ]='!';
g_keycodeCharShifted[ kVK_ANSI_2 ]='@';
g_keycodeCharShifted[ kVK_ANSI_3 ]='#';
g_keycodeCharShifted[ kVK_ANSI_4 ]='$';
g_keycodeCharShifted[ kVK_ANSI_6 ]='^';
g_keycodeCharShifted[ kVK_ANSI_5 ]='%';
g_keycodeCharShifted[ kVK_ANSI_Equal ]='+';
g_keycodeCharShifted[ kVK_ANSI_9 ]='(';
g_keycodeCharShifted[ kVK_ANSI_7 ]='&';
g_keycodeCharShifted[ kVK_ANSI_Minus ]='_';
g_keycodeCharShifted[ kVK_ANSI_8 ]='*';
g_keycodeCharShifted[ kVK_ANSI_0 ]=')';
g_keycodeCharShifted[ kVK_ANSI_RightBracket ]='}';
g_keycodeCharShifted[ kVK_ANSI_O ]='O';
g_keycodeCharShifted[ kVK_ANSI_U ]='U';
g_keycodeCharShifted[ kVK_ANSI_LeftBracket ]='{';
g_keycodeCharShifted[ kVK_ANSI_I ]='I';
g_keycodeCharShifted[ kVK_ANSI_P ]='P';
g_keycodeCharShifted[ kVK_ANSI_L ]='L';
g_keycodeCharShifted[ kVK_ANSI_J ]='J';
g_keycodeCharShifted[ kVK_ANSI_Quote ]='\"';
g_keycodeCharShifted[ kVK_ANSI_K ]='K';
g_keycodeCharShifted[ kVK_ANSI_Semicolon ]=':';
g_keycodeCharShifted[ kVK_ANSI_Backslash ]='|';
g_keycodeCharShifted[ kVK_ANSI_Comma ]='<';
g_keycodeCharShifted[ kVK_ANSI_Slash ]='?';
g_keycodeCharShifted[ kVK_ANSI_N ]='N';
g_keycodeCharShifted[ kVK_ANSI_M ]='M';
g_keycodeCharShifted[ kVK_ANSI_Period ]='>';
g_keycodeCharShifted[ kVK_ANSI_Grave ]='~';
g_keycodeCharShifted[ kVK_ANSI_KeypadDecimal ]='.';
g_keycodeCharShifted[ kVK_ANSI_KeypadMultiply ]='*';
g_keycodeCharShifted[ kVK_ANSI_KeypadPlus ]='+';
g_keycodeCharShifted[ kVK_ANSI_KeypadDivide ]='/';
g_keycodeCharShifted[ kVK_ANSI_KeypadEnter ]='\n';
g_keycodeCharShifted[ kVK_ANSI_KeypadMinus ]='-';
g_keycodeCharShifted[ kVK_ANSI_KeypadEquals ]='=';
g_keycodeCharShifted[ kVK_ANSI_Keypad0 ]='0';
g_keycodeCharShifted[ kVK_ANSI_Keypad1 ]='1';
g_keycodeCharShifted[ kVK_ANSI_Keypad2 ]='2';
g_keycodeCharShifted[ kVK_ANSI_Keypad3 ]='3';
g_keycodeCharShifted[ kVK_ANSI_Keypad4 ]='4';
g_keycodeCharShifted[ kVK_ANSI_Keypad5 ]='5';
g_keycodeCharShifted[ kVK_ANSI_Keypad6 ]='6';
g_keycodeCharShifted[ kVK_ANSI_Keypad7 ]='7';
g_keycodeCharShifted[ kVK_ANSI_Keypad8 ]='8';
g_keycodeCharShifted[ kVK_ANSI_Keypad9 ]='9';
g_keycodeCharShifted[ kVK_Space ]=' ';
}
- (void)setupImGuiHooks
{
ImGuiIO &io = ImGui::GetIO();
[self setupKeymaps];
// Account for retina display for glScissor
g_displayScale = [[UIScreen mainScreen] scale];
ImGuiStyle &style = ImGui::GetStyle();
style.TouchExtraPadding = ImVec2( 4.0, 4.0 );
io.RenderDrawListsFn = ImGui_ImplIOS_RenderDrawLists;
UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(viewDidPan:) ];
[self.view addGestureRecognizer:panRecognizer];
UITapGestureRecognizer *tapRecoginzer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector( viewDidTap:)];
[self.view addGestureRecognizer:tapRecoginzer];
// Fill out the Synergy key map
// (for some reason synergy scan codes are off by 1)
io.KeyMap[ImGuiKey_Tab] = kVK_Tab+1;
io.KeyMap[ImGuiKey_LeftArrow] = kVK_LeftArrow+1;
io.KeyMap[ImGuiKey_RightArrow] = kVK_RightArrow+1;
io.KeyMap[ImGuiKey_UpArrow] = kVK_UpArrow+1;
io.KeyMap[ImGuiKey_DownArrow] = kVK_DownArrow+1;
io.KeyMap[ImGuiKey_Home] = kVK_Home+1;
io.KeyMap[ImGuiKey_End] = kVK_End+1;
io.KeyMap[ImGuiKey_Delete] = kVK_ForwardDelete+1;
io.KeyMap[ImGuiKey_Backspace] = kVK_Delete+1;
io.KeyMap[ImGuiKey_Enter] = kVK_Return+1;
io.KeyMap[ImGuiKey_Escape] = kVK_Escape+1;
io.KeyMap[ImGuiKey_A] = kVK_ANSI_A+1;
io.KeyMap[ImGuiKey_C] = kVK_ANSI_C+1;
io.KeyMap[ImGuiKey_V] = kVK_ANSI_V+1;
io.KeyMap[ImGuiKey_X] = kVK_ANSI_X+1;
io.KeyMap[ImGuiKey_Y] = kVK_ANSI_Y+1;
io.KeyMap[ImGuiKey_Z] = kVK_ANSI_Z+1;
}
- (void)connectServer: (NSString*)serverName
{
self.serverName = serverName;
g_serverName = serverName;
// Init synergy
NSString *bundleName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
uSynergyInit( &_synergyCtx );
_synergyCtx.m_clientName = strdup( [bundleName UTF8String] );
_synergyCtx.m_clientWidth = self.view.bounds.size.width;
_synergyCtx.m_clientHeight = self.view.bounds.size.height;
_synergyCtx.m_connectFunc = ImGui_ConnectFunc;
_synergyCtx.m_sendFunc = ImGui_SendFunc;
_synergyCtx.m_receiveFunc = ImGui_RecvFunc;
_synergyCtx.m_sleepFunc = ImGui_SleepFunc;
_synergyCtx.m_traceFunc = ImGui_TraceFunc;
_synergyCtx.m_getTimeFunc = ImGui_GetTimeFunc;
_synergyCtx.m_traceFunc = ImGui_TraceFunc;
_synergyCtx.m_screenActiveCallback = ImGui_ScreenActiveCallback;
_synergyCtx.m_mouseCallback = ImGui_MouseCallback;
_synergyCtx.m_keyboardCallback = ImGui_KeyboardCallback;
_synergyCtx.m_cookie = (uSynergyCookie)&_synergyCtx;
// Create a background thread for synergy
_synergyQueue = dispatch_queue_create( "imgui-usynergy", NULL );
dispatch_async( _synergyQueue, ^{
while (1) {
uSynergyUpdate( &_synergyCtx );
}
});
}
- (void)viewDidPan: (UIPanGestureRecognizer *)recognizer
{
if ((recognizer.state == UIGestureRecognizerStateBegan) ||
(recognizer.state == UIGestureRecognizerStateChanged))
{
_mouseDown = YES;
_touchPos = [recognizer locationInView:self.view];
}
else
{
_mouseDown = NO;
_touchPos = CGPointMake( -1, -1 );
}
}
- (void)viewDidTap: (UITapGestureRecognizer*)recognizer
{
_touchPos = [recognizer locationInView:self.view];
_mouseTapped = YES;
}
- (void)render
{
ImGui::Render();
}
- (void)newFrame
{
ImGuiIO& io = ImGui::GetIO();
ImGuiStyle &style = ImGui::GetStyle();
if (!g_FontTexture)
{
ImGui_ImplIOS_CreateDeviceObjects();
}
io.DisplaySize = ImVec2( _view.bounds.size.width, _view.bounds.size.height );
io.MouseDrawCursor = g_synergyPtrActive;
if (g_synergyPtrActive)
{
style.TouchExtraPadding = ImVec2( 0.0, 0.0 );
io.MousePos = ImVec2( g_mousePosX, g_mousePosY );
for (int i=0; i < 3; i++)
{
io.MouseDown[i] = g_MousePressed[i];
}
// This is an arbitrary scaling factor that works for me. Not sure what units these
// mousewheel values from synergy are supposed to be in
io.MouseWheel = g_mouseWheelY / 500.0;
}
else
{
// Synergy not active, use touch events
style.TouchExtraPadding = ImVec2( 4.0, 4.0 );
io.MousePos = ImVec2(_touchPos.x, _touchPos.y );
if ((_mouseDown) || (_mouseTapped))
{
io.MouseDown[0] = true;
_mouseTapped = NO;
}
else
{
io.MouseDown[0] = false;
}
}
ImGui::NewFrame();
}
@end
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)
// If text or lines are blurry when integrating ImGui in your engine:
// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)
// NOTE: this is copied pretty much entirely from the opengl3_example, with only minor changes for ES
static void ImGui_ImplIOS_RenderDrawLists (ImDrawList** const cmd_lists, int cmd_lists_count)
{
if (cmd_lists_count == 0)
return;
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled
GLint last_program, last_texture;
glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glEnable(GL_SCISSOR_TEST);
glActiveTexture(GL_TEXTURE0);
// Setup orthographic projection matrix
const float width = ImGui::GetIO().DisplaySize.x;
const float height = ImGui::GetIO().DisplaySize.y;
const float ortho_projection[4][4] =
{
{ 2.0f/width, 0.0f, 0.0f, 0.0f },
{ 0.0f, 2.0f/-height, 0.0f, 0.0f },
{ 0.0f, 0.0f, -1.0f, 0.0f },
{ -1.0f, 1.0f, 0.0f, 1.0f },
};
glUseProgram(g_ShaderHandle);
glUniform1i(g_AttribLocationTex, 0);
glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);
// Grow our buffer according to what we need
size_t total_vtx_count = 0;
for (int n = 0; n < cmd_lists_count; n++)
total_vtx_count += cmd_lists[n]->vtx_buffer.size();
glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
size_t needed_vtx_size = total_vtx_count * sizeof(ImDrawVert);
if (g_VboSize < needed_vtx_size)
{
g_VboSize = needed_vtx_size + 5000 * sizeof(ImDrawVert); // Grow buffer
glBufferData(GL_ARRAY_BUFFER, g_VboSize, NULL, GL_STREAM_DRAW);
}
// Copy and convert all vertices into a single contiguous buffer
unsigned char* buffer_data = (unsigned char*)glMapBufferRange(GL_ARRAY_BUFFER, 0, g_VboSize, GL_MAP_WRITE_BIT);
if (!buffer_data)
return;
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
memcpy(buffer_data, &cmd_list->vtx_buffer[0], cmd_list->vtx_buffer.size() * sizeof(ImDrawVert));
buffer_data += cmd_list->vtx_buffer.size() * sizeof(ImDrawVert);
}
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(g_VaoHandle);
int cmd_offset = 0;
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
int vtx_offset = cmd_offset;
const ImDrawCmd* pcmd_end = cmd_list->commands.end();
for (const ImDrawCmd* pcmd = cmd_list->commands.begin(); pcmd != pcmd_end; pcmd++)
{
if (pcmd->user_callback)
{
pcmd->user_callback(cmd_list, pcmd);
}
else
{
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->texture_id);
glScissor((int)(pcmd->clip_rect.x * g_displayScale),
(int)((height - pcmd->clip_rect.w) * g_displayScale),
(int)((pcmd->clip_rect.z - pcmd->clip_rect.x) * g_displayScale),
(int)((pcmd->clip_rect.w - pcmd->clip_rect.y) * g_displayScale));
glDrawArrays(GL_TRIANGLES, vtx_offset, pcmd->vtx_count);
}
vtx_offset += pcmd->vtx_count;
}
cmd_offset = vtx_offset;
}
// Restore modified state
glBindVertexArray(0);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glUseProgram(last_program);
glDisable(GL_SCISSOR_TEST);
glBindTexture(GL_TEXTURE_2D, last_texture);
}
void ImGui_ImplIOS_CreateFontsTexture()
{
ImGuiIO& io = ImGui::GetIO();
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bits for OpenGL3 demo because it is more likely to be compatible with user's existing shader.
glGenTextures(1, &g_FontTexture);
glBindTexture(GL_TEXTURE_2D, g_FontTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
// Store our identifier
io.Fonts->TexID = (void *)(intptr_t)g_FontTexture;
// Cleanup (don't clear the input data if you want to append new fonts later)
io.Fonts->ClearInputData();
io.Fonts->ClearTexData();
}
bool ImGui_ImplIOS_CreateDeviceObjects()
{
const GLchar *vertex_shader =
"uniform mat4 ProjMtx;\n"
"attribute highp vec2 Position;\n"
"attribute highp vec2 UV;\n"
"attribute highp vec4 Color;\n"
"varying vec2 Frag_UV;\n"
"varying vec4 Frag_Color;\n"
"void main()\n"
"{\n"
" Frag_UV = UV;\n"
" Frag_Color = Color;\n"
" gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
"}\n";
const GLchar* fragment_shader =
"uniform sampler2D Texture;\n"
"varying highp vec2 Frag_UV;\n"
"varying highp vec4 Frag_Color;\n"
"void main()\n"
"{\n"
" gl_FragColor = Frag_Color * texture2D( Texture, Frag_UV.st);\n"
"}\n";
g_ShaderHandle = glCreateProgram();
g_VertHandle = glCreateShader(GL_VERTEX_SHADER);
g_FragHandle = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(g_VertHandle, 1, &vertex_shader, 0);
glShaderSource(g_FragHandle, 1, &fragment_shader, 0);
glCompileShader(g_VertHandle);
#if defined(DEBUG)
GLint logLength;
glGetShaderiv( g_VertHandle, GL_INFO_LOG_LENGTH, &logLength);
if (logLength > 0) {
GLchar *log = (GLchar *)malloc(logLength);
glGetShaderInfoLog(g_VertHandle, logLength, &logLength, log);
NSLog(@"VERTEX Shader compile log:\n%s", log);
free(log);
}
#endif
glCompileShader(g_FragHandle);
#if defined(DEBUG)
glGetShaderiv( g_FragHandle, GL_INFO_LOG_LENGTH, &logLength);
if (logLength > 0) {
GLchar *log = (GLchar *)malloc(logLength);
glGetShaderInfoLog(g_FragHandle, logLength, &logLength, log);
NSLog(@"FRAGMENT Shader compile log:\n%s", log);
free(log);
}
#endif
glAttachShader(g_ShaderHandle, g_VertHandle);
glAttachShader(g_ShaderHandle, g_FragHandle);
glLinkProgram(g_ShaderHandle);
g_AttribLocationTex = glGetUniformLocation(g_ShaderHandle, "Texture");
g_AttribLocationProjMtx = glGetUniformLocation(g_ShaderHandle, "ProjMtx");
g_AttribLocationPosition = glGetAttribLocation(g_ShaderHandle, "Position");
g_AttribLocationUV = glGetAttribLocation(g_ShaderHandle, "UV");
g_AttribLocationColor = glGetAttribLocation(g_ShaderHandle, "Color");
glGenBuffers(1, &g_VboHandle);
glGenVertexArrays(1, &g_VaoHandle);
glBindVertexArray(g_VaoHandle);
glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
glEnableVertexAttribArray(g_AttribLocationPosition);
glEnableVertexAttribArray(g_AttribLocationUV);
glEnableVertexAttribArray(g_AttribLocationColor);
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
glVertexAttribPointer(g_AttribLocationPosition, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, pos));
glVertexAttribPointer(g_AttribLocationUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, uv));
glVertexAttribPointer(g_AttribLocationColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, col));
#undef OFFSETOF
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
ImGui_ImplIOS_CreateFontsTexture();
return true;
}

View File

@ -0,0 +1,13 @@
//
// main.m
// imguiex
//
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

1344
examples/libs/gl3w/GL/gl3w.c Normal file

File diff suppressed because it is too large Load Diff

1234
examples/libs/gl3w/GL/gl3w.h Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,356 @@
/*************************************************************************
* GLFW 3.1 - www.glfw.org
* A library for OpenGL, window and input
*------------------------------------------------------------------------
* Copyright (c) 2002-2006 Marcus Geelnard
* Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would
* be appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not
* be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*
*************************************************************************/
#ifndef _glfw3_native_h_
#define _glfw3_native_h_
#ifdef __cplusplus
extern "C" {
#endif
/*************************************************************************
* Doxygen documentation
*************************************************************************/
/*! @defgroup native Native access
*
* **By using the native access functions you assert that you know what you're
* doing and how to fix problems caused by using them. If you don't, you
* shouldn't be using them.**
*
* Before the inclusion of @ref glfw3native.h, you must define exactly one
* window system API macro and exactly one context creation API macro. Failure
* to do this will cause a compile-time error.
*
* The available window API macros are:
* * `GLFW_EXPOSE_NATIVE_WIN32`
* * `GLFW_EXPOSE_NATIVE_COCOA`
* * `GLFW_EXPOSE_NATIVE_X11`
*
* The available context API macros are:
* * `GLFW_EXPOSE_NATIVE_WGL`
* * `GLFW_EXPOSE_NATIVE_NSGL`
* * `GLFW_EXPOSE_NATIVE_GLX`
* * `GLFW_EXPOSE_NATIVE_EGL`
*
* These macros select which of the native access functions that are declared
* and which platform-specific headers to include. It is then up your (by
* definition platform-specific) code to handle which of these should be
* defined.
*/
/*************************************************************************
* System headers and types
*************************************************************************/
#if defined(GLFW_EXPOSE_NATIVE_WIN32)
// This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
// example to allow applications to correctly declare a GL_ARB_debug_output
// callback) but windows.h assumes no one will define APIENTRY before it does
#undef APIENTRY
#include <windows.h>
#elif defined(GLFW_EXPOSE_NATIVE_COCOA)
#include <ApplicationServices/ApplicationServices.h>
#if defined(__OBJC__)
#import <Cocoa/Cocoa.h>
#else
typedef void* id;
#endif
#elif defined(GLFW_EXPOSE_NATIVE_X11)
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
#else
#error "No window API selected"
#endif
#if defined(GLFW_EXPOSE_NATIVE_WGL)
/* WGL is declared by windows.h */
#elif defined(GLFW_EXPOSE_NATIVE_NSGL)
/* NSGL is declared by Cocoa.h */
#elif defined(GLFW_EXPOSE_NATIVE_GLX)
#include <GL/glx.h>
#elif defined(GLFW_EXPOSE_NATIVE_EGL)
#include <EGL/egl.h>
#else
#error "No context API selected"
#endif
/*************************************************************************
* Functions
*************************************************************************/
#if defined(GLFW_EXPOSE_NATIVE_WIN32)
/*! @brief Returns the adapter device name of the specified monitor.
*
* @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`)
* of the specified monitor, or `NULL` if an [error](@ref error_handling)
* occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.1.
*
* @ingroup native
*/
GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor);
/*! @brief Returns the display device name of the specified monitor.
*
* @return The UTF-8 encoded display device name (for example
* `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an
* [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.1.
*
* @ingroup native
*/
GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor);
/*! @brief Returns the `HWND` of the specified window.
*
* @return The `HWND` of the specified window, or `NULL` if an
* [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.0.
*
* @ingroup native
*/
GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_WGL)
/*! @brief Returns the `HGLRC` of the specified window.
*
* @return The `HGLRC` of the specified window, or `NULL` if an
* [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.0.
*
* @ingroup native
*/
GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_COCOA)
/*! @brief Returns the `CGDirectDisplayID` of the specified monitor.
*
* @return The `CGDirectDisplayID` of the specified monitor, or
* `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.1.
*
* @ingroup native
*/
GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor);
/*! @brief Returns the `NSWindow` of the specified window.
*
* @return The `NSWindow` of the specified window, or `nil` if an
* [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.0.
*
* @ingroup native
*/
GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_NSGL)
/*! @brief Returns the `NSOpenGLContext` of the specified window.
*
* @return The `NSOpenGLContext` of the specified window, or `nil` if an
* [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.0.
*
* @ingroup native
*/
GLFWAPI id glfwGetNSGLContext(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_X11)
/*! @brief Returns the `Display` used by GLFW.
*
* @return The `Display` used by GLFW, or `NULL` if an
* [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.0.
*
* @ingroup native
*/
GLFWAPI Display* glfwGetX11Display(void);
/*! @brief Returns the `RRCrtc` of the specified monitor.
*
* @return The `RRCrtc` of the specified monitor, or `None` if an
* [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.1.
*
* @ingroup native
*/
GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor);
/*! @brief Returns the `RROutput` of the specified monitor.
*
* @return The `RROutput` of the specified monitor, or `None` if an
* [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.1.
*
* @ingroup native
*/
GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor);
/*! @brief Returns the `Window` of the specified window.
*
* @return The `Window` of the specified window, or `None` if an
* [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.0.
*
* @ingroup native
*/
GLFWAPI Window glfwGetX11Window(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_GLX)
/*! @brief Returns the `GLXContext` of the specified window.
*
* @return The `GLXContext` of the specified window, or `NULL` if an
* [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.0.
*
* @ingroup native
*/
GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_EGL)
/*! @brief Returns the `EGLDisplay` used by GLFW.
*
* @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an
* [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.0.
*
* @ingroup native
*/
GLFWAPI EGLDisplay glfwGetEGLDisplay(void);
/*! @brief Returns the `EGLContext` of the specified window.
*
* @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an
* [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.0.
*
* @ingroup native
*/
GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window);
/*! @brief Returns the `EGLSurface` of the specified window.
*
* @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an
* [error](@ref error_handling) occurred.
*
* @par Thread Safety
* This function may be called from any thread. Access is not synchronized.
*
* @par History
* Added in GLFW 3.0.
*
* @ingroup native
*/
GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);
#endif
#ifdef __cplusplus
}
#endif
#endif /* _glfw3_native_h_ */

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,636 @@
/*
uSynergy client -- Implementation for the embedded Synergy client library
version 1.0.0, July 7th, 2012
Copyright (c) 2012 Alex Evans
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
*/
#include "uSynergy.h"
#include <stdio.h>
#include <string.h>
//---------------------------------------------------------------------------------------------------------------------
// Internal helpers
//---------------------------------------------------------------------------------------------------------------------
/**
@brief Read 16 bit integer in network byte order and convert to native byte order
**/
static int16_t sNetToNative16(const unsigned char *value)
{
#ifdef USYNERGY_LITTLE_ENDIAN
return value[1] | (value[0] << 8);
#else
return value[0] | (value[1] << 8);
#endif
}
/**
@brief Read 32 bit integer in network byte order and convert to native byte order
**/
static int32_t sNetToNative32(const unsigned char *value)
{
#ifdef USYNERGY_LITTLE_ENDIAN
return value[3] | (value[2] << 8) | (value[1] << 16) | (value[0] << 24);
#else
return value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24);
#endif
}
/**
@brief Trace text to client
**/
static void sTrace(uSynergyContext *context, const char* text)
{
// Don't trace if we don't have a trace function
if (context->m_traceFunc != 0L)
context->m_traceFunc(context->m_cookie, text);
}
/**
@brief Add string to reply packet
**/
static void sAddString(uSynergyContext *context, const char *string)
{
size_t len = strlen(string);
memcpy(context->m_replyCur, string, len);
context->m_replyCur += len;
}
/**
@brief Add uint8 to reply packet
**/
static void sAddUInt8(uSynergyContext *context, uint8_t value)
{
*context->m_replyCur++ = value;
}
/**
@brief Add uint16 to reply packet
**/
static void sAddUInt16(uSynergyContext *context, uint16_t value)
{
uint8_t *reply = context->m_replyCur;
*reply++ = (uint8_t)(value >> 8);
*reply++ = (uint8_t)value;
context->m_replyCur = reply;
}
/**
@brief Add uint32 to reply packet
**/
static void sAddUInt32(uSynergyContext *context, uint32_t value)
{
uint8_t *reply = context->m_replyCur;
*reply++ = (uint8_t)(value >> 24);
*reply++ = (uint8_t)(value >> 16);
*reply++ = (uint8_t)(value >> 8);
*reply++ = (uint8_t)value;
context->m_replyCur = reply;
}
/**
@brief Send reply packet
**/
static uSynergyBool sSendReply(uSynergyContext *context)
{
// Set header size
uint8_t *reply_buf = context->m_replyBuffer;
uint32_t reply_len = (uint32_t)(context->m_replyCur - reply_buf); /* Total size of reply */
uint32_t body_len = reply_len - 4; /* Size of body */
uSynergyBool ret;
reply_buf[0] = (uint8_t)(body_len >> 24);
reply_buf[1] = (uint8_t)(body_len >> 16);
reply_buf[2] = (uint8_t)(body_len >> 8);
reply_buf[3] = (uint8_t)body_len;
// Send reply
ret = context->m_sendFunc(context->m_cookie, context->m_replyBuffer, reply_len);
// Reset reply buffer write pointer
context->m_replyCur = context->m_replyBuffer+4;
return ret;
}
/**
@brief Call mouse callback after a mouse event
**/
static void sSendMouseCallback(uSynergyContext *context)
{
// Skip if no callback is installed
if (context->m_mouseCallback == 0L)
return;
// Send callback
context->m_mouseCallback(context->m_cookie, context->m_mouseX, context->m_mouseY, context->m_mouseWheelX,
context->m_mouseWheelY, context->m_mouseButtonLeft, context->m_mouseButtonRight, context->m_mouseButtonMiddle);
}
/**
@brief Send keyboard callback when a key has been pressed or released
**/
static void sSendKeyboardCallback(uSynergyContext *context, uint16_t key, uint16_t modifiers, uSynergyBool down, uSynergyBool repeat)
{
// Skip if no callback is installed
if (context->m_keyboardCallback == 0L)
return;
// Send callback
context->m_keyboardCallback(context->m_cookie, key, modifiers, down, repeat);
}
/**
@brief Send joystick callback
**/
static void sSendJoystickCallback(uSynergyContext *context, uint8_t joyNum)
{
int8_t *sticks;
// Skip if no callback is installed
if (context->m_joystickCallback == 0L)
return;
// Send callback
sticks = context->m_joystickSticks[joyNum];
context->m_joystickCallback(context->m_cookie, joyNum, context->m_joystickButtons[joyNum], sticks[0], sticks[1], sticks[2], sticks[3]);
}
/**
@brief Parse a single client message, update state, send callbacks and send replies
**/
#define USYNERGY_IS_PACKET(pkt_id) memcmp(message+4, pkt_id, 4)==0
static void sProcessMessage(uSynergyContext *context, const uint8_t *message)
{
// We have a packet!
if (memcmp(message+4, "Synergy", 7)==0)
{
// Welcome message
// kMsgHello = "Synergy%2i%2i"
// kMsgHelloBack = "Synergy%2i%2i%s"
sAddString(context, "Synergy");
sAddUInt16(context, USYNERGY_PROTOCOL_MAJOR);
sAddUInt16(context, USYNERGY_PROTOCOL_MINOR);
sAddUInt32(context, (uint32_t)strlen(context->m_clientName));
sAddString(context, context->m_clientName);
if (!sSendReply(context))
{
// Send reply failed, let's try to reconnect
sTrace(context, "SendReply failed, trying to reconnect in a second");
context->m_connected = USYNERGY_FALSE;
context->m_sleepFunc(context->m_cookie, 1000);
}
else
{
// Let's assume we're connected
char buffer[256+1];
sprintf(buffer, "Connected as client \"%s\"", context->m_clientName);
sTrace(context, buffer);
context->m_hasReceivedHello = USYNERGY_TRUE;
}
return;
}
else if (USYNERGY_IS_PACKET("QINF"))
{
// Screen info. Reply with DINF
// kMsgQInfo = "QINF"
// kMsgDInfo = "DINF%2i%2i%2i%2i%2i%2i%2i"
uint16_t x = 0, y = 0, warp = 0;
sAddString(context, "DINF");
sAddUInt16(context, x);
sAddUInt16(context, y);
sAddUInt16(context, context->m_clientWidth);
sAddUInt16(context, context->m_clientHeight);
sAddUInt16(context, warp);
sAddUInt16(context, 0); // mx?
sAddUInt16(context, 0); // my?
sSendReply(context);
return;
}
else if (USYNERGY_IS_PACKET("CIAK"))
{
// Do nothing?
// kMsgCInfoAck = "CIAK"
return;
}
else if (USYNERGY_IS_PACKET("CROP"))
{
// Do nothing?
// kMsgCResetOptions = "CROP"
return;
}
else if (USYNERGY_IS_PACKET("CINN"))
{
// Screen enter. Reply with CNOP
// kMsgCEnter = "CINN%2i%2i%4i%2i"
// Obtain the Synergy sequence number
context->m_sequenceNumber = sNetToNative32(message + 12);
context->m_isCaptured = USYNERGY_TRUE;
// Call callback
if (context->m_screenActiveCallback != 0L)
context->m_screenActiveCallback(context->m_cookie, USYNERGY_TRUE);
}
else if (USYNERGY_IS_PACKET("COUT"))
{
// Screen leave
// kMsgCLeave = "COUT"
context->m_isCaptured = USYNERGY_FALSE;
// Call callback
if (context->m_screenActiveCallback != 0L)
context->m_screenActiveCallback(context->m_cookie, USYNERGY_FALSE);
}
else if (USYNERGY_IS_PACKET("DMDN"))
{
// Mouse down
// kMsgDMouseDown = "DMDN%1i"
char btn = message[8]-1;
if (btn==2)
context->m_mouseButtonRight = USYNERGY_TRUE;
else if (btn==1)
context->m_mouseButtonMiddle = USYNERGY_TRUE;
else
context->m_mouseButtonLeft = USYNERGY_TRUE;
sSendMouseCallback(context);
}
else if (USYNERGY_IS_PACKET("DMUP"))
{
// Mouse up
// kMsgDMouseUp = "DMUP%1i"
char btn = message[8]-1;
if (btn==2)
context->m_mouseButtonRight = USYNERGY_FALSE;
else if (btn==1)
context->m_mouseButtonMiddle = USYNERGY_FALSE;
else
context->m_mouseButtonLeft = USYNERGY_FALSE;
sSendMouseCallback(context);
}
else if (USYNERGY_IS_PACKET("DMMV"))
{
// Mouse move. Reply with CNOP
// kMsgDMouseMove = "DMMV%2i%2i"
context->m_mouseX = sNetToNative16(message+8);
context->m_mouseY = sNetToNative16(message+10);
sSendMouseCallback(context);
}
else if (USYNERGY_IS_PACKET("DMWM"))
{
// Mouse wheel
// kMsgDMouseWheel = "DMWM%2i%2i"
// kMsgDMouseWheel1_0 = "DMWM%2i"
context->m_mouseWheelX += sNetToNative16(message+8);
context->m_mouseWheelY += sNetToNative16(message+10);
sSendMouseCallback(context);
}
else if (USYNERGY_IS_PACKET("DKDN"))
{
// Key down
// kMsgDKeyDown = "DKDN%2i%2i%2i"
// kMsgDKeyDown1_0 = "DKDN%2i%2i"
//uint16_t id = sNetToNative16(message+8);
uint16_t mod = sNetToNative16(message+10);
uint16_t key = sNetToNative16(message+12);
sSendKeyboardCallback(context, key, mod, USYNERGY_TRUE, USYNERGY_FALSE);
}
else if (USYNERGY_IS_PACKET("DKRP"))
{
// Key repeat
// kMsgDKeyRepeat = "DKRP%2i%2i%2i%2i"
// kMsgDKeyRepeat1_0 = "DKRP%2i%2i%2i"
uint16_t mod = sNetToNative16(message+10);
// uint16_t count = sNetToNative16(message+12);
uint16_t key = sNetToNative16(message+14);
sSendKeyboardCallback(context, key, mod, USYNERGY_TRUE, USYNERGY_TRUE);
}
else if (USYNERGY_IS_PACKET("DKUP"))
{
// Key up
// kMsgDKeyUp = "DKUP%2i%2i%2i"
// kMsgDKeyUp1_0 = "DKUP%2i%2i"
//uint16 id=Endian::sNetToNative(sbuf[4]);
uint16_t mod = sNetToNative16(message+10);
uint16_t key = sNetToNative16(message+12);
sSendKeyboardCallback(context, key, mod, USYNERGY_FALSE, USYNERGY_FALSE);
}
else if (USYNERGY_IS_PACKET("DGBT"))
{
// Joystick buttons
// kMsgDGameButtons = "DGBT%1i%2i";
uint8_t joy_num = message[8];
if (joy_num<USYNERGY_NUM_JOYSTICKS)
{
// Copy button state, then send callback
context->m_joystickButtons[joy_num] = (message[9] << 8) | message[10];
sSendJoystickCallback(context, joy_num);
}
}
else if (USYNERGY_IS_PACKET("DGST"))
{
// Joystick sticks
// kMsgDGameSticks = "DGST%1i%1i%1i%1i%1i";
uint8_t joy_num = message[8];
if (joy_num<USYNERGY_NUM_JOYSTICKS)
{
// Copy stick state, then send callback
memcpy(context->m_joystickSticks[joy_num], message+9, 4);
sSendJoystickCallback(context, joy_num);
}
}
else if (USYNERGY_IS_PACKET("DSOP"))
{
// Set options
// kMsgDSetOptions = "DSOP%4I"
}
else if (USYNERGY_IS_PACKET("CALV"))
{
// Keepalive, reply with CALV and then CNOP
// kMsgCKeepAlive = "CALV"
sAddString(context, "CALV");
sSendReply(context);
// now reply with CNOP
}
else if (USYNERGY_IS_PACKET("DCLP"))
{
// Clipboard message
// kMsgDClipboard = "DCLP%1i%4i%s"
//
// The clipboard message contains:
// 1 uint32: The size of the message
// 4 chars: The identifier ("DCLP")
// 1 uint8: The clipboard index
// 1 uint32: The sequence number. It's zero, because this message is always coming from the server?
// 1 uint32: The total size of the remaining 'string' (as per the Synergy %s string format (which is 1 uint32 for size followed by a char buffer (not necessarily null terminated)).
// 1 uint32: The number of formats present in the message
// And then 'number of formats' times the following:
// 1 uint32: The format of the clipboard data
// 1 uint32: The size n of the clipboard data
// n uint8: The clipboard data
const uint8_t * parse_msg = message+17;
uint32_t num_formats = sNetToNative32(parse_msg);
parse_msg += 4;
for (; num_formats; num_formats--)
{
// Parse clipboard format header
uint32_t format = sNetToNative32(parse_msg);
uint32_t size = sNetToNative32(parse_msg+4);
parse_msg += 8;
// Call callback
if (context->m_clipboardCallback)
context->m_clipboardCallback(context->m_cookie, format, parse_msg, size);
parse_msg += size;
}
}
else
{
// Unknown packet, could be any of these
// kMsgCNoop = "CNOP"
// kMsgCClose = "CBYE"
// kMsgCClipboard = "CCLP%1i%4i"
// kMsgCScreenSaver = "CSEC%1i"
// kMsgDKeyRepeat = "DKRP%2i%2i%2i%2i"
// kMsgDKeyRepeat1_0 = "DKRP%2i%2i%2i"
// kMsgDMouseRelMove = "DMRM%2i%2i"
// kMsgEIncompatible = "EICV%2i%2i"
// kMsgEBusy = "EBSY"
// kMsgEUnknown = "EUNK"
// kMsgEBad = "EBAD"
char buffer[64];
sprintf(buffer, "Unknown packet '%c%c%c%c'", message[4], message[5], message[6], message[7]);
sTrace(context, buffer);
return;
}
// Reply with CNOP maybe?
sAddString(context, "CNOP");
sSendReply(context);
}
#undef USYNERGY_IS_PACKET
/**
@brief Mark context as being disconnected
**/
static void sSetDisconnected(uSynergyContext *context)
{
context->m_connected = USYNERGY_FALSE;
context->m_hasReceivedHello = USYNERGY_FALSE;
context->m_isCaptured = USYNERGY_FALSE;
context->m_replyCur = context->m_replyBuffer + 4;
context->m_sequenceNumber = 0;
}
/**
@brief Update a connected context
**/
static void sUpdateContext(uSynergyContext *context)
{
/* Receive data (blocking) */
int receive_size = USYNERGY_RECEIVE_BUFFER_SIZE - context->m_receiveOfs;
int num_received = 0;
int packlen = 0;
if (context->m_receiveFunc(context->m_cookie, context->m_receiveBuffer + context->m_receiveOfs, receive_size, &num_received) == USYNERGY_FALSE)
{
/* Receive failed, let's try to reconnect */
char buffer[128];
sprintf(buffer, "Receive failed (%d bytes asked, %d bytes received), trying to reconnect in a second", receive_size, num_received);
sTrace(context, buffer);
sSetDisconnected(context);
context->m_sleepFunc(context->m_cookie, 1000);
return;
}
context->m_receiveOfs += num_received;
/* If we didn't receive any data then we're probably still polling to get connected and
therefore not getting any data back. To avoid overloading the system with a Synergy
thread that would hammer on polling, we let it rest for a bit if there's no data. */
if (num_received == 0)
context->m_sleepFunc(context->m_cookie, 500);
/* Check for timeouts */
if (context->m_hasReceivedHello)
{
uint32_t cur_time = context->m_getTimeFunc();
if (num_received == 0)
{
/* Timeout after 2 secs of inactivity (we received no CALV) */
if ((cur_time - context->m_lastMessageTime) > USYNERGY_IDLE_TIMEOUT)
sSetDisconnected(context);
}
else
context->m_lastMessageTime = cur_time;
}
/* Eat packets */
for (;;)
{
/* Grab packet length and bail out if the packet goes beyond the end of the buffer */
packlen = sNetToNative32(context->m_receiveBuffer);
if (packlen+4 > context->m_receiveOfs)
break;
/* Process message */
sProcessMessage(context, context->m_receiveBuffer);
/* Move packet to front of buffer */
memmove(context->m_receiveBuffer, context->m_receiveBuffer+packlen+4, context->m_receiveOfs-packlen-4);
context->m_receiveOfs -= packlen+4;
}
/* Throw away over-sized packets */
if (packlen > USYNERGY_RECEIVE_BUFFER_SIZE)
{
/* Oversized packet, ditch tail end */
char buffer[128];
sprintf(buffer, "Oversized packet: '%c%c%c%c' (length %d)", context->m_receiveBuffer[4], context->m_receiveBuffer[5], context->m_receiveBuffer[6], context->m_receiveBuffer[7], packlen);
sTrace(context, buffer);
num_received = context->m_receiveOfs-4; // 4 bytes for the size field
while (num_received != packlen)
{
int buffer_left = packlen - num_received;
int to_receive = buffer_left < USYNERGY_RECEIVE_BUFFER_SIZE ? buffer_left : USYNERGY_RECEIVE_BUFFER_SIZE;
int ditch_received = 0;
if (context->m_receiveFunc(context->m_cookie, context->m_receiveBuffer, to_receive, &ditch_received) == USYNERGY_FALSE)
{
/* Receive failed, let's try to reconnect */
sTrace(context, "Receive failed, trying to reconnect in a second");
sSetDisconnected(context);
context->m_sleepFunc(context->m_cookie, 1000);
break;
}
else
{
num_received += ditch_received;
}
}
context->m_receiveOfs = 0;
}
}
//---------------------------------------------------------------------------------------------------------------------
// Public interface
//---------------------------------------------------------------------------------------------------------------------
/**
@brief Initialize uSynergy context
**/
void uSynergyInit(uSynergyContext *context)
{
/* Zero memory */
memset(context, 0, sizeof(uSynergyContext));
/* Initialize to default state */
sSetDisconnected(context);
}
/**
@brief Update uSynergy
**/
void uSynergyUpdate(uSynergyContext *context)
{
if (context->m_connected)
{
/* Update context, receive data, call callbacks */
sUpdateContext(context);
}
else
{
/* Try to connect */
if (context->m_connectFunc(context->m_cookie))
context->m_connected = USYNERGY_TRUE;
}
}
/**
@brief Send clipboard data
**/
void uSynergySendClipboard(uSynergyContext *context, const char *text)
{
// Calculate maximum size that will fit in a reply packet
uint32_t overhead_size = 4 + /* Message size */
4 + /* Message ID */
1 + /* Clipboard index */
4 + /* Sequence number */
4 + /* Rest of message size (because it's a Synergy string from here on) */
4 + /* Number of clipboard formats */
4 + /* Clipboard format */
4; /* Clipboard data length */
uint32_t max_length = USYNERGY_REPLY_BUFFER_SIZE - overhead_size;
// Clip text to max length
uint32_t text_length = (uint32_t)strlen(text);
if (text_length > max_length)
{
char buffer[128];
sprintf(buffer, "Clipboard buffer too small, clipboard truncated at %d characters", max_length);
sTrace(context, buffer);
text_length = max_length;
}
// Assemble packet
sAddString(context, "DCLP");
sAddUInt8(context, 0); /* Clipboard index */
sAddUInt32(context, context->m_sequenceNumber);
sAddUInt32(context, 4+4+4+text_length); /* Rest of message size: numFormats, format, length, data */
sAddUInt32(context, 1); /* Number of formats (only text for now) */
sAddUInt32(context, USYNERGY_CLIPBOARD_FORMAT_TEXT);
sAddUInt32(context, text_length);
sAddString(context, text);
sSendReply(context);
}

View File

@ -0,0 +1,420 @@
/*
uSynergy client -- Interface for the embedded Synergy client library
version 1.0.0, July 7th, 2012
Copyright (C) 2012 Synergy Si Ltd.
Copyright (c) 2012 Alex Evans
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
*/
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
//---------------------------------------------------------------------------------------------------------------------
// Configuration
//---------------------------------------------------------------------------------------------------------------------
/**
@brief Determine endianness
**/
#if defined(USYNERGY_LITTLE_ENDIAN) && defined(USYNERGY_BIG_ENDIAN)
/* Ambiguous: both endians specified */
#error "Can't define both USYNERGY_LITTLE_ENDIAN and USYNERGY_BIG_ENDIAN"
#elif !defined(USYNERGY_LITTLE_ENDIAN) && !defined(USYNERGY_BIG_ENDIAN)
/* Attempt to auto detect */
#if defined(__LITTLE_ENDIAN__) || defined(LITTLE_ENDIAN) || (_BYTE_ORDER == _LITTLE_ENDIAN)
#define USYNERGY_LITTLE_ENDIAN
#elif defined(__BIG_ENDIAN__) || defined(BIG_ENDIAN) || (_BYTE_ORDER == _BIG_ENDIAN)
#define USYNERGY_BIG_ENDIAN
#else
#error "Can't detect endian-nes, please defined either USYNERGY_LITTLE_ENDIAN or USYNERGY_BIG_ENDIAN";
#endif
#else
/* User-specified endian-nes, nothing to do for us */
#endif
//---------------------------------------------------------------------------------------------------------------------
// Types and Constants
//---------------------------------------------------------------------------------------------------------------------
/**
@brief Boolean type
**/
typedef int uSynergyBool;
#define USYNERGY_FALSE 0 /* False value */
#define USYNERGY_TRUE 1 /* True value */
/**
@brief User context type
The uSynergyCookie type is an opaque type that is used by uSynergy to communicate to the client. It is passed along to
callback functions as context.
**/
typedef struct { int ignored; } * uSynergyCookie;
/**
@brief Clipboard types
**/
enum uSynergyClipboardFormat
{
USYNERGY_CLIPBOARD_FORMAT_TEXT = 0, /* Text format, UTF-8, newline is LF */
USYNERGY_CLIPBOARD_FORMAT_BITMAP = 1, /* Bitmap format, BMP 24/32bpp, BI_RGB */
USYNERGY_CLIPBOARD_FORMAT_HTML = 2, /* HTML format, HTML fragment, UTF-8, newline is LF */
};
/**
@brief Constants and limits
**/
#define USYNERGY_NUM_JOYSTICKS 4 /* Maximum number of supported joysticks */
#define USYNERGY_PROTOCOL_MAJOR 1 /* Major protocol version */
#define USYNERGY_PROTOCOL_MINOR 4 /* Minor protocol version */
#define USYNERGY_IDLE_TIMEOUT 2000 /* Timeout in milliseconds before reconnecting */
#define USYNERGY_TRACE_BUFFER_SIZE 1024 /* Maximum length of traced message */
#define USYNERGY_REPLY_BUFFER_SIZE 1024 /* Maximum size of a reply packet */
#define USYNERGY_RECEIVE_BUFFER_SIZE 4096 /* Maximum size of an incoming packet */
/**
@brief Keyboard constants
**/
#define USYNERGY_MODIFIER_SHIFT 0x0001 /* Shift key modifier */
#define USYNERGY_MODIFIER_CTRL 0x0002 /* Ctrl key modifier */
#define USYNERGY_MODIFIER_ALT 0x0004 /* Alt key modifier */
#define USYNERGY_MODIFIER_META 0x0008 /* Meta key modifier */
#define USYNERGY_MODIFIER_WIN 0x0010 /* Windows key modifier */
#define USYNERGY_MODIFIER_ALT_GR 0x0020 /* AltGr key modifier */
#define USYNERGY_MODIFIER_LEVEL5LOCK 0x0040 /* Level5Lock key modifier */
#define USYNERGY_MODIFIER_CAPSLOCK 0x1000 /* CapsLock key modifier */
#define USYNERGY_MODIFIER_NUMLOCK 0x2000 /* NumLock key modifier */
#define USYNERGY_MODIFIER_SCROLLOCK 0x4000 /* ScrollLock key modifier */
//---------------------------------------------------------------------------------------------------------------------
// Functions and Callbacks
//---------------------------------------------------------------------------------------------------------------------
/**
@brief Connect function
This function is called when uSynergy needs to connect to the host. It doesn't imply a network implementation or
destination address, that must all be handled on the user side. The function should return USYNERGY_TRUE if a
connection was established or USYNERGY_FALSE if it could not connect.
When network errors occur (e.g. uSynergySend or uSynergyReceive fail) then the connect call will be called again
so the implementation of the function must close any old connections and clean up resources before retrying.
@param cookie Cookie supplied in the Synergy context
**/
typedef uSynergyBool (*uSynergyConnectFunc)(uSynergyCookie cookie);
/**
@brief Send function
This function is called when uSynergy needs to send something over the default connection. It should return
USYNERGY_TRUE if sending succeeded and USYNERGY_FALSE otherwise. This function should block until the send
operation is completed.
@param cookie Cookie supplied in the Synergy context
@param buffer Address of buffer to send
@param length Length of buffer to send
**/
typedef uSynergyBool (*uSynergySendFunc)(uSynergyCookie cookie, const uint8_t *buffer, int length);
/**
@brief Receive function
This function is called when uSynergy needs to receive data from the default connection. It should return
USYNERGY_TRUE if receiving data succeeded and USYNERGY_FALSE otherwise. This function should block until data
has been received and wait for data to become available. If @a outLength is set to 0 upon completion it is
assumed that the connection is alive, but still in a connecting state and needs time to settle.
@param cookie Cookie supplied in the Synergy context
@param buffer Address of buffer to receive data into
@param maxLength Maximum amount of bytes to write into the receive buffer
@param outLength Address of integer that receives the actual amount of bytes written into @a buffer
**/
typedef uSynergyBool (*uSynergyReceiveFunc)(uSynergyCookie cookie, uint8_t *buffer, int maxLength, int* outLength);
/**
@brief Thread sleep function
This function is called when uSynergy wants to suspend operation for a while before retrying an operation. It
is mostly used when a socket times out or disconnect occurs to prevent uSynergy from continuously hammering a
network connection in case the network is down.
@param cookie Cookie supplied in the Synergy context
@param timeMs Time to sleep the current thread (in milliseconds)
**/
typedef void (*uSynergySleepFunc)(uSynergyCookie cookie, int timeMs);
/**
@brief Get time function
This function is called when uSynergy needs to know the current time. This is used to determine when timeouts
have occured. The time base should be a cyclic millisecond time value.
@returns Time value in milliseconds
**/
typedef uint32_t (*uSynergyGetTimeFunc)();
/**
@brief Trace function
This function is called when uSynergy wants to trace something. It is optional to show these messages, but they
are often useful when debugging. uSynergy only traces major events like connecting and disconnecting. Usually
only a single trace is shown when the connection is established and no more trace are called.
@param cookie Cookie supplied in the Synergy context
@param text Text to be traced
**/
typedef void (*uSynergyTraceFunc)(uSynergyCookie cookie, const char *text);
/**
@brief Screen active callback
This callback is called when Synergy makes the screen active or inactive. This
callback is usually sent when the mouse enters or leaves the screen.
@param cookie Cookie supplied in the Synergy context
@param active Activation flag, 1 if the screen has become active, 0 if the screen has become inactive
**/
typedef void (*uSynergyScreenActiveCallback)(uSynergyCookie cookie, uSynergyBool active);
/**
@brief Mouse callback
This callback is called when a mouse events happens. The mouse X and Y position,
wheel and button state is communicated in the message. It's up to the user to
interpret if this is a mouse up, down, double-click or other message.
@param cookie Cookie supplied in the Synergy context
@param x Mouse X position
@param y Mouse Y position
@param wheelX Mouse wheel X position
@param wheelY Mouse wheel Y position
@param buttonLeft Left button pressed status, 0 for released, 1 for pressed
@param buttonMiddle Middle button pressed status, 0 for released, 1 for pressed
@param buttonRight Right button pressed status, 0 for released, 1 for pressed
**/
typedef void (*uSynergyMouseCallback)(uSynergyCookie cookie, uint16_t x, uint16_t y, int16_t wheelX, int16_t wheelY, uSynergyBool buttonLeft, uSynergyBool buttonRight, uSynergyBool buttonMiddle);
/**
@brief Key event callback
This callback is called when a key is pressed or released.
@param cookie Cookie supplied in the Synergy context
@param key Key code of key that was pressed or released
@param modifiers Status of modifier keys (alt, shift, etc.)
@param down Down or up status, 1 is key is pressed down, 0 if key is released (up)
@param repeat Repeat flag, 1 if the key is down because the key is repeating, 0 if the key is initially pressed by the user
**/
typedef void (*uSynergyKeyboardCallback)(uSynergyCookie cookie, uint16_t key, uint16_t modifiers, uSynergyBool down, uSynergyBool repeat);
/**
@brief Joystick event callback
This callback is called when a joystick stick or button changes. It is possible that multiple callbacks are
fired when different sticks or buttons change as these are individual messages in the packet stream. Each
callback will contain all the valid state for the different axes and buttons. The last callback received will
represent the most current joystick state.
@param cookie Cookie supplied in the Synergy context
@param joyNum Joystick number, always in the range [0 ... USYNERGY_NUM_JOYSTICKS>
@param buttons Button pressed mask
@param leftStickX Left stick X position, in range [-127 ... 127]
@param leftStickY Left stick Y position, in range [-127 ... 127]
@param rightStickX Right stick X position, in range [-127 ... 127]
@param rightStickY Right stick Y position, in range [-127 ... 127]
**/
typedef void (*uSynergyJoystickCallback)(uSynergyCookie cookie, uint8_t joyNum, uint16_t buttons, int8_t leftStickX, int8_t leftStickY, int8_t rightStickX, int8_t rightStickY);
/**
@brief Clipboard event callback
This callback is called when something is placed on the clipboard. Multiple callbacks may be fired for
multiple clipboard formats if they are supported. The data provided is read-only and may not be modified
by the application.
@param cookie Cookie supplied in the Synergy context
@param format Clipboard format
@param data Memory area containing the clipboard raw data
@param size Size of clipboard data
**/
typedef void (*uSynergyClipboardCallback)(uSynergyCookie cookie, enum uSynergyClipboardFormat format, const uint8_t *data, uint32_t size);
//---------------------------------------------------------------------------------------------------------------------
// Context
//---------------------------------------------------------------------------------------------------------------------
/**
@brief uSynergy context
**/
typedef struct
{
/* Mandatory configuration data, filled in by client */
uSynergyConnectFunc m_connectFunc; /* Connect function */
uSynergySendFunc m_sendFunc; /* Send data function */
uSynergyReceiveFunc m_receiveFunc; /* Receive data function */
uSynergySleepFunc m_sleepFunc; /* Thread sleep function */
uSynergyGetTimeFunc m_getTimeFunc; /* Get current time function */
const char* m_clientName; /* Name of Synergy Screen / Client */
uint16_t m_clientWidth; /* Width of screen */
uint16_t m_clientHeight; /* Height of screen */
/* Optional configuration data, filled in by client */
uSynergyCookie m_cookie; /* Cookie pointer passed to callback functions (can be NULL) */
uSynergyTraceFunc m_traceFunc; /* Function for tracing status (can be NULL) */
uSynergyScreenActiveCallback m_screenActiveCallback; /* Callback for entering and leaving screen */
uSynergyMouseCallback m_mouseCallback; /* Callback for mouse events */
uSynergyKeyboardCallback m_keyboardCallback; /* Callback for keyboard events */
uSynergyJoystickCallback m_joystickCallback; /* Callback for joystick events */
uSynergyClipboardCallback m_clipboardCallback; /* Callback for clipboard events */
/* State data, used internall by client, initialized by uSynergyInit() */
uSynergyBool m_connected; /* Is our socket connected? */
uSynergyBool m_hasReceivedHello; /* Have we received a 'Hello' from the server? */
uSynergyBool m_isCaptured; /* Is Synergy active (i.e. this client is receiving input messages?) */
uint32_t m_lastMessageTime; /* Time at which last message was received */
uint32_t m_sequenceNumber; /* Packet sequence number */
uint8_t m_receiveBuffer[USYNERGY_RECEIVE_BUFFER_SIZE]; /* Receive buffer */
int m_receiveOfs; /* Receive buffer offset */
uint8_t m_replyBuffer[USYNERGY_REPLY_BUFFER_SIZE]; /* Reply buffer */
uint8_t* m_replyCur; /* Write offset into reply buffer */
uint16_t m_mouseX; /* Mouse X position */
uint16_t m_mouseY; /* Mouse Y position */
int16_t m_mouseWheelX; /* Mouse wheel X position */
int16_t m_mouseWheelY; /* Mouse wheel Y position */
uSynergyBool m_mouseButtonLeft; /* Mouse left button */
uSynergyBool m_mouseButtonRight; /* Mouse right button */
uSynergyBool m_mouseButtonMiddle; /* Mouse middle button */
int8_t m_joystickSticks[USYNERGY_NUM_JOYSTICKS][4]; /* Joystick stick position in 2 axes for 2 sticks */
uint16_t m_joystickButtons[USYNERGY_NUM_JOYSTICKS]; /* Joystick button state */
} uSynergyContext;
//---------------------------------------------------------------------------------------------------------------------
// Interface
//---------------------------------------------------------------------------------------------------------------------
/**
@brief Initialize uSynergy context
This function initializes @a context for use. Call this function directly after
creating the context, before filling in any configuration data in it. Not calling
this function will cause undefined behavior.
@param context Context to be initialized
**/
extern void uSynergyInit(uSynergyContext *context);
/**
@brief Update uSynergy
This function updates uSynergy and does the bulk of the work. It does connection management,
receiving data, reconnecting after errors or timeouts and so on. It assumes that networking
operations are blocking and it can suspend the current thread if it needs to wait. It is
best practice to call uSynergyUpdate from a background thread so it is responsive.
Because uSynergy relies mostly on blocking calls it will mostly stay in thread sleep state
waiting for system mutexes and won't eat much memory.
uSynergyUpdate doesn't do any memory allocations or have any side effects beyond those of
the callbacks it calls.
@param context Context to be updated
**/
extern void uSynergyUpdate(uSynergyContext *context);
/**
@brief Send clipboard data
This function sets new clipboard data and sends it to the server. Use this function if
your client cuts or copies data onto the clipboard that it needs to share with the
server.
Currently there is only support for plaintext, but HTML and image data could be
supported with some effort.
@param context Context to send clipboard data to
@param text Text to set to the clipboard
**/
extern void uSynergySendClipboard(uSynergyContext *context, const char *text);
#ifdef __cplusplus
};
#endif

View File

@ -0,0 +1,52 @@
#
# Cross Platform Makefile
# Compatible with Ubuntu 14.04.1 and Mac OS X
#
#
# if you using Mac OS X:
# You'll need glfw
# http://www.glfw.org
#
#CXX = g++
OBJS = main.o imgui_impl_glfw_gl3.o
OBJS += ../../imgui.o
OBJS += ../libs/gl3w/GL/gl3w.o
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S), Linux) #LINUX
ECHO_MESSAGE = "Linux"
LIBS = `pkg-config --static --libs glfw3`
CXXFLAGS = -I../../ -I../libs/gl3w `pkg-config --cflags glfw3`
CXXFLAGS += -Wall
CFLAGS = $(CXXFLAGS)
endif
ifeq ($(UNAME_S), Darwin) #APPLE
ECHO_MESSAGE = "Mac OS X"
LIBS = -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo
LIBS += -L/usr/local/lib
LIBS += -lglfw3
CXXFLAGS = -I../../ -I../libs/gl3w -I/usr/local/Cellar/glew/1.10.0/include -I/usr/local/include
CXXFLAGS += -Wall
# CXXFLAGS += -D__APPLE__
CFLAGS = $(CXXFLAGS)
endif
.cpp.o:
$(CXX) $(CXXFLAGS) -c -o $@ $<
all:imgui_example
@echo Build complete for $(ECHO_MESSAGE)
imgui_example:$(OBJS)
$(CXX) -o imgui_example $(OBJS) $(CXXFLAGS) $(LIBS)
clean:
rm $(OBJS)

View File

@ -0,0 +1,365 @@
// ImGui GLFW binding with OpenGL3 + shaders
// https://github.com/ocornut/imgui
#include <imgui.h>
#include "imgui_impl_glfw_gl3.h"
// GL3W/GLFW
#include <GL/gl3w.h>
#include <GLFW/glfw3.h>
#ifdef _MSC_VER
#undef APIENTRY
#define GLFW_EXPOSE_NATIVE_WIN32
#define GLFW_EXPOSE_NATIVE_WGL
#include <GLFW/glfw3native.h>
#endif
// Data
static GLFWwindow* g_Window = NULL;
static double g_Time = 0.0f;
static bool g_MousePressed[3] = { false, false, false };
static float g_MouseWheel = 0.0f;
static GLuint g_FontTexture = 0;
static int g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0;
static int g_AttribLocationTex = 0, g_AttribLocationProjMtx = 0;
static int g_AttribLocationPosition = 0, g_AttribLocationUV = 0, g_AttribLocationColor = 0;
static int g_VboSize = 0;
static unsigned int g_VboHandle = 0, g_VaoHandle = 0;
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)
// If text or lines are blurry when integrating ImGui in your engine:
// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)
static void ImGui_ImplGlfwGL3_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count)
{
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled
GLint last_program, last_texture;
glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glEnable(GL_SCISSOR_TEST);
glActiveTexture(GL_TEXTURE0);
// Setup orthographic projection matrix
const float width = ImGui::GetIO().DisplaySize.x;
const float height = ImGui::GetIO().DisplaySize.y;
const float ortho_projection[4][4] =
{
{ 2.0f/width, 0.0f, 0.0f, 0.0f },
{ 0.0f, 2.0f/-height, 0.0f, 0.0f },
{ 0.0f, 0.0f, -1.0f, 0.0f },
{ -1.0f, 1.0f, 0.0f, 1.0f },
};
glUseProgram(g_ShaderHandle);
glUniform1i(g_AttribLocationTex, 0);
glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);
// Grow our buffer according to what we need
int total_vtx_count = 0;
for (int n = 0; n < cmd_lists_count; n++)
total_vtx_count += cmd_lists[n]->vtx_buffer.size();
glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
int needed_vtx_size = total_vtx_count * sizeof(ImDrawVert);
if (g_VboSize < needed_vtx_size)
{
g_VboSize = needed_vtx_size + 5000 * sizeof(ImDrawVert); // Grow buffer
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)g_VboSize, NULL, GL_STREAM_DRAW);
}
// Copy and convert all vertices into a single contiguous buffer
unsigned char* buffer_data = (unsigned char*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
if (!buffer_data)
return;
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
memcpy(buffer_data, &cmd_list->vtx_buffer[0], cmd_list->vtx_buffer.size() * sizeof(ImDrawVert));
buffer_data += cmd_list->vtx_buffer.size() * sizeof(ImDrawVert);
}
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(g_VaoHandle);
int cmd_offset = 0;
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
int vtx_offset = cmd_offset;
const ImDrawCmd* pcmd_end = cmd_list->commands.end();
for (const ImDrawCmd* pcmd = cmd_list->commands.begin(); pcmd != pcmd_end; pcmd++)
{
if (pcmd->user_callback)
{
pcmd->user_callback(cmd_list, pcmd);
}
else
{
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->texture_id);
glScissor((int)pcmd->clip_rect.x, (int)(height - pcmd->clip_rect.w), (int)(pcmd->clip_rect.z - pcmd->clip_rect.x), (int)(pcmd->clip_rect.w - pcmd->clip_rect.y));
glDrawArrays(GL_TRIANGLES, vtx_offset, pcmd->vtx_count);
}
vtx_offset += pcmd->vtx_count;
}
cmd_offset = vtx_offset;
}
// Restore modified state
glBindVertexArray(0);
glUseProgram(last_program);
glDisable(GL_SCISSOR_TEST);
glBindTexture(GL_TEXTURE_2D, last_texture);
}
static const char* ImGui_ImplGlfwGL3_GetClipboardText()
{
return glfwGetClipboardString(g_Window);
}
static void ImGui_ImplGlfwGL3_SetClipboardText(const char* text)
{
glfwSetClipboardString(g_Window, text);
}
void ImGui_ImplGlfwGL3_MouseButtonCallback(GLFWwindow*, int button, int action, int /*mods*/)
{
if (action == GLFW_PRESS && button >= 0 && button < 3)
g_MousePressed[button] = true;
}
void ImGui_ImplGlfwGL3_ScrollCallback(GLFWwindow*, double /*xoffset*/, double yoffset)
{
g_MouseWheel += (float)yoffset; // Use fractional mouse wheel, 1.0 unit 5 lines.
}
void ImGui_ImplGlfwGL3_KeyCallback(GLFWwindow*, int key, int, int action, int mods)
{
ImGuiIO& io = ImGui::GetIO();
if (action == GLFW_PRESS)
io.KeysDown[key] = true;
if (action == GLFW_RELEASE)
io.KeysDown[key] = false;
(void)mods; // Modifiers are not reliable across systems
io.KeyCtrl = io.KeysDown[GLFW_KEY_LEFT_CONTROL] || io.KeysDown[GLFW_KEY_RIGHT_CONTROL];
io.KeyShift = io.KeysDown[GLFW_KEY_LEFT_SHIFT] || io.KeysDown[GLFW_KEY_RIGHT_SHIFT];
io.KeyAlt = io.KeysDown[GLFW_KEY_LEFT_ALT] || io.KeysDown[GLFW_KEY_RIGHT_ALT];
}
void ImGui_ImplGlfwGL3_CharCallback(GLFWwindow*, unsigned int c)
{
ImGuiIO& io = ImGui::GetIO();
if (c > 0 && c < 0x10000)
io.AddInputCharacter((unsigned short)c);
}
void ImGui_ImplGlfwGL3_CreateFontsTexture()
{
ImGuiIO& io = ImGui::GetIO();
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bits for OpenGL3 demo because it is more likely to be compatible with user's existing shader.
glGenTextures(1, &g_FontTexture);
glBindTexture(GL_TEXTURE_2D, g_FontTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
// Store our identifier
io.Fonts->TexID = (void *)(intptr_t)g_FontTexture;
// Cleanup (don't clear the input data if you want to append new fonts later)
io.Fonts->ClearInputData();
io.Fonts->ClearTexData();
}
bool ImGui_ImplGlfwGL3_CreateDeviceObjects()
{
const GLchar *vertex_shader =
"#version 330\n"
"uniform mat4 ProjMtx;\n"
"in vec2 Position;\n"
"in vec2 UV;\n"
"in vec4 Color;\n"
"out vec2 Frag_UV;\n"
"out vec4 Frag_Color;\n"
"void main()\n"
"{\n"
" Frag_UV = UV;\n"
" Frag_Color = Color;\n"
" gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
"}\n";
const GLchar* fragment_shader =
"#version 330\n"
"uniform sampler2D Texture;\n"
"in vec2 Frag_UV;\n"
"in vec4 Frag_Color;\n"
"out vec4 Out_Color;\n"
"void main()\n"
"{\n"
" Out_Color = Frag_Color * texture( Texture, Frag_UV.st);\n"
"}\n";
g_ShaderHandle = glCreateProgram();
g_VertHandle = glCreateShader(GL_VERTEX_SHADER);
g_FragHandle = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(g_VertHandle, 1, &vertex_shader, 0);
glShaderSource(g_FragHandle, 1, &fragment_shader, 0);
glCompileShader(g_VertHandle);
glCompileShader(g_FragHandle);
glAttachShader(g_ShaderHandle, g_VertHandle);
glAttachShader(g_ShaderHandle, g_FragHandle);
glLinkProgram(g_ShaderHandle);
g_AttribLocationTex = glGetUniformLocation(g_ShaderHandle, "Texture");
g_AttribLocationProjMtx = glGetUniformLocation(g_ShaderHandle, "ProjMtx");
g_AttribLocationPosition = glGetAttribLocation(g_ShaderHandle, "Position");
g_AttribLocationUV = glGetAttribLocation(g_ShaderHandle, "UV");
g_AttribLocationColor = glGetAttribLocation(g_ShaderHandle, "Color");
glGenBuffers(1, &g_VboHandle);
glGenVertexArrays(1, &g_VaoHandle);
glBindVertexArray(g_VaoHandle);
glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
glEnableVertexAttribArray(g_AttribLocationPosition);
glEnableVertexAttribArray(g_AttribLocationUV);
glEnableVertexAttribArray(g_AttribLocationColor);
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
glVertexAttribPointer(g_AttribLocationPosition, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, pos));
glVertexAttribPointer(g_AttribLocationUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, uv));
glVertexAttribPointer(g_AttribLocationColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, col));
#undef OFFSETOF
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
ImGui_ImplGlfwGL3_CreateFontsTexture();
return true;
}
bool ImGui_ImplGlfwGL3_Init(GLFWwindow* window, bool install_callbacks)
{
g_Window = window;
ImGuiIO& io = ImGui::GetIO();
io.KeyMap[ImGuiKey_Tab] = GLFW_KEY_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.
io.KeyMap[ImGuiKey_LeftArrow] = GLFW_KEY_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = GLFW_KEY_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = GLFW_KEY_UP;
io.KeyMap[ImGuiKey_DownArrow] = GLFW_KEY_DOWN;
io.KeyMap[ImGuiKey_PageUp] = GLFW_KEY_PAGE_UP;
io.KeyMap[ImGuiKey_PageDown] = GLFW_KEY_PAGE_DOWN;
io.KeyMap[ImGuiKey_Home] = GLFW_KEY_HOME;
io.KeyMap[ImGuiKey_End] = GLFW_KEY_END;
io.KeyMap[ImGuiKey_Delete] = GLFW_KEY_DELETE;
io.KeyMap[ImGuiKey_Backspace] = GLFW_KEY_BACKSPACE;
io.KeyMap[ImGuiKey_Enter] = GLFW_KEY_ENTER;
io.KeyMap[ImGuiKey_Escape] = GLFW_KEY_ESCAPE;
io.KeyMap[ImGuiKey_A] = GLFW_KEY_A;
io.KeyMap[ImGuiKey_C] = GLFW_KEY_C;
io.KeyMap[ImGuiKey_V] = GLFW_KEY_V;
io.KeyMap[ImGuiKey_X] = GLFW_KEY_X;
io.KeyMap[ImGuiKey_Y] = GLFW_KEY_Y;
io.KeyMap[ImGuiKey_Z] = GLFW_KEY_Z;
io.RenderDrawListsFn = ImGui_ImplGlfwGL3_RenderDrawLists;
io.SetClipboardTextFn = ImGui_ImplGlfwGL3_SetClipboardText;
io.GetClipboardTextFn = ImGui_ImplGlfwGL3_GetClipboardText;
#ifdef _MSC_VER
io.ImeWindowHandle = glfwGetWin32Window(g_Window);
#endif
if (install_callbacks)
{
glfwSetMouseButtonCallback(window, ImGui_ImplGlfwGL3_MouseButtonCallback);
glfwSetScrollCallback(window, ImGui_ImplGlfwGL3_ScrollCallback);
glfwSetKeyCallback(window, ImGui_ImplGlfwGL3_KeyCallback);
glfwSetCharCallback(window, ImGui_ImplGlfwGL3_CharCallback);
}
return true;
}
void ImGui_ImplGlfwGL3_Shutdown()
{
if (g_VaoHandle) glDeleteVertexArrays(1, &g_VaoHandle);
if (g_VboHandle) glDeleteBuffers(1, &g_VboHandle);
g_VaoHandle = 0;
g_VboHandle = 0;
glDetachShader(g_ShaderHandle, g_VertHandle);
glDeleteShader(g_VertHandle);
g_VertHandle = 0;
glDetachShader(g_ShaderHandle, g_FragHandle);
glDeleteShader(g_FragHandle);
g_FragHandle = 0;
glDeleteProgram(g_ShaderHandle);
g_ShaderHandle = 0;
if (g_FontTexture)
{
glDeleteTextures(1, &g_FontTexture);
ImGui::GetIO().Fonts->TexID = 0;
g_FontTexture = 0;
}
ImGui::Shutdown();
}
void ImGui_ImplGlfwGL3_NewFrame()
{
if (!g_FontTexture)
ImGui_ImplGlfwGL3_CreateDeviceObjects();
ImGuiIO& io = ImGui::GetIO();
// Setup display size (every frame to accommodate for window resizing)
int w, h;
int display_w, display_h;
glfwGetWindowSize(g_Window, &w, &h);
glfwGetFramebufferSize(g_Window, &display_w, &display_h);
io.DisplaySize = ImVec2((float)display_w, (float)display_h);
// Setup time step
double current_time = glfwGetTime();
io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);
g_Time = current_time;
// Setup inputs
// (we already got mouse wheel, keyboard keys & characters from glfw callbacks polled in glfwPollEvents())
if (glfwGetWindowAttrib(g_Window, GLFW_FOCUSED))
{
double mouse_x, mouse_y;
glfwGetCursorPos(g_Window, &mouse_x, &mouse_y);
mouse_x *= (float)display_w / w; // Convert mouse coordinates to pixels
mouse_y *= (float)display_h / h;
io.MousePos = ImVec2((float)mouse_x, (float)mouse_y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
}
else
{
io.MousePos = ImVec2(-1,-1);
}
for (int i = 0; i < 3; i++)
{
io.MouseDown[i] = g_MousePressed[i] || glfwGetMouseButton(g_Window, i) != 0; // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame.
g_MousePressed[i] = false;
}
io.MouseWheel = g_MouseWheel;
g_MouseWheel = 0.0f;
// Hide OS mouse cursor if ImGui is drawing it
glfwSetInputMode(g_Window, GLFW_CURSOR, io.MouseDrawCursor ? GLFW_CURSOR_HIDDEN : GLFW_CURSOR_NORMAL);
// Start the frame
ImGui::NewFrame();
}

View File

@ -0,0 +1,20 @@
// ImGui GLFW binding with OpenGL3 + shaders
// https://github.com/ocornut/imgui
struct GLFWwindow;
bool ImGui_ImplGlfwGL3_Init(GLFWwindow* window, bool install_callbacks);
void ImGui_ImplGlfwGL3_Shutdown();
void ImGui_ImplGlfwGL3_NewFrame();
// Use if you want to reset your rendering device without losing ImGui state.
void ImGui_ImplGlfwGL3_InvalidateDeviceObjects();
bool ImGui_ImplGlfwGL3_CreateDeviceObjects();
// GLFW callbacks (installed by default if you enable 'install_callbacks' during initialization)
// Provided here if you want to chain callbacks.
// You can also handle inputs yourself and use those as a reference.
void ImGui_ImplGlfwGL3_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods);
void ImGui_ImplGlfwGL3_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset);
void ImGui_ImplGlfwGL3_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);
void ImGui_ImplGlfwGL3_CharCallback(GLFWwindow* window, unsigned int c);

View File

@ -0,0 +1,92 @@
// ImGui - standalone example application for Glfw + OpenGL 3, using programmable pipeline
#include <imgui.h>
#include "imgui_impl_glfw_gl3.h"
#include <stdio.h>
#include <GL/gl3w.h>
#include <GLFW/glfw3.h>
static void error_callback(int error, const char* description)
{
fprintf(stderr, "Error %d: %s\n", error, description);
}
int main(int, char**)
{
// Setup window
glfwSetErrorCallback(error_callback);
if (!glfwInit())
exit(1);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#if __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
GLFWwindow* window = glfwCreateWindow(1280, 720, "ImGui OpenGL3 example", NULL, NULL);
glfwMakeContextCurrent(window);
gl3wInit();
// Setup ImGui binding
ImGui_ImplGlfwGL3_Init(window, true);
//ImGuiIO& io = ImGui::GetIO();
//ImFont* my_font0 = io.Fonts->AddFontDefault();
//ImFont* my_font1 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 16.0f);
//ImFont* my_font2 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/Karla-Regular.ttf", 16.0f);
//ImFont* my_font3 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyClean.ttf", 13.0f); my_font3->DisplayOffset.y += 1;
//ImFont* my_font4 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyTiny.ttf", 10.0f); my_font4->DisplayOffset.y += 1;
//ImFont* my_font5 = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, io.Fonts->GetGlyphRangesJapanese());
bool show_test_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImColor(114, 144, 154);
// Main loop
while (!glfwWindowShouldClose(window))
{
ImGuiIO& io = ImGui::GetIO();
glfwPollEvents();
ImGui_ImplGlfwGL3_NewFrame();
// 1. Show a simple window
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
{
static float f = 0.0f;
ImGui::Text("Hello, world!");
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
ImGui::ColorEdit3("clear color", (float*)&clear_color);
if (ImGui::Button("Test Window")) show_test_window ^= 1;
if (ImGui::Button("Another Window")) show_another_window ^= 1;
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
}
// 2. Show another simple window, this time using an explicit Begin/End pair
if (show_another_window)
{
ImGui::SetNextWindowSize(ImVec2(200,100), ImGuiSetCond_FirstUseEver);
ImGui::Begin("Another Window", &show_another_window);
ImGui::Text("Hello");
ImGui::End();
}
// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow()
if (show_test_window)
{
ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiSetCond_FirstUseEver);
ImGui::ShowTestWindow(&show_test_window);
}
// Rendering
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
glClear(GL_COLOR_BUFFER_BIT);
ImGui::Render();
glfwSwapBuffers(window);
}
// Cleanup
ImGui_ImplGlfwGL3_Shutdown();
glfwTerminate();
return 0;
}

View File

@ -0,0 +1,166 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{4a1fb5ea-22f5-42a8-ab92-1d2df5d47fb9}</ProjectGuid>
<RootNamespace>opengl3_example</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>$(SolutionDir)\libs\glfw\include;$(SolutionDir)\libs\gl3w;..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(SolutionDir)\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>$(SolutionDir)\libs\glfw\include;$(SolutionDir)\libs\gl3w;..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(SolutionDir)\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>$(SolutionDir)\libs\glfw\include;$(SolutionDir)\libs\gl3w;..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(SolutionDir)\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<IgnoreSpecificDefaultLibraries>
</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>$(SolutionDir)\libs\glfw\include;$(SolutionDir)\libs\gl3w;..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(SolutionDir)\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<IgnoreSpecificDefaultLibraries>
</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\imgui.cpp" />
<ClCompile Include="..\libs\gl3w\GL\gl3w.c" />
<ClCompile Include="imgui_impl_glfw_gl3.cpp" />
<ClCompile Include="main.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\imconfig.h" />
<ClInclude Include="..\..\imgui.h" />
<ClInclude Include="..\libs\gl3w\GL\gl3w.h" />
<ClInclude Include="..\libs\gl3w\GL\glcorearb.h" />
<ClInclude Include="imgui_impl_glfw_gl3.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="imgui">
<UniqueIdentifier>{20b90ce4-7fcb-4731-b9a0-075f875de82d}</UniqueIdentifier>
</Filter>
<Filter Include="sources">
<UniqueIdentifier>{f18ab499-84e1-499f-8eff-9754361e0e52}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="gl3w">
<UniqueIdentifier>{42f99867-3108-43b8-99d0-fabefaf1f2e3}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>sources</Filter>
</ClCompile>
<ClCompile Include="..\..\imgui.cpp">
<Filter>imgui</Filter>
</ClCompile>
<ClCompile Include="imgui_impl_glfw_gl3.cpp">
<Filter>sources</Filter>
</ClCompile>
<ClCompile Include="..\libs\gl3w\GL\gl3w.c">
<Filter>gl3w</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\imconfig.h">
<Filter>imgui</Filter>
</ClInclude>
<ClInclude Include="..\..\imgui.h">
<Filter>imgui</Filter>
</ClInclude>
<ClInclude Include="imgui_impl_glfw_gl3.h">
<Filter>sources</Filter>
</ClInclude>
<ClInclude Include="..\libs\gl3w\GL\gl3w.h">
<Filter>gl3w</Filter>
</ClInclude>
<ClInclude Include="..\libs\gl3w\GL\glcorearb.h">
<Filter>gl3w</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -1,19 +1,16 @@
#
# Cross Platform Make file
#
# Cross Platform Makefile
# Compatible with Ubuntu 14.04.1 and Mac OS X
#
#
# if you using Mac OS X:
# You should install glew via homebrew
# brew install glew
# Also you'll need glfw
# You'll need glfw
# http://www.glfw.org
#
CXX = g++
#CXX = g++
OBJS = main.o
OBJS = main.o imgui_impl_glfw.o
OBJS += ../../imgui.o
UNAME_S := $(shell uname -s)
@ -21,22 +18,23 @@ UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S), Linux) #LINUX
ECHO_MESSAGE = "Linux"
LIBS = `pkg-config --static --libs glfw3`
CXXFLAGS = -I../../ `pkg-config --cflags glfw3`
LIBS = `pkg-config --static --libs glfw3` -lGLEW
CXXFLAGS += -Wall
CFLAGS = $(CXXFLAGS)
endif
ifeq ($(UNAME_S), Darwin) #APPLE
ECHO_MESSAGE = "Mac OS X"
LIBS = -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo
LIBS += -L/usr/local/Cellar/glew/1.10.0/lib -L/usr/local/lib
LIBS += -lglew -lglfw3
CXXFLAGS = -I/usr/local/Cellar/glew/1.10.0/include -I/usr/local/include
CXXFLAGS += -I../../
LIBS += -L/usr/local/lib
LIBS += -lglfw3
CXXFLAGS = -I../../ -I/usr/local/include
CXXFLAGS += -Wall
# CXXFLAGS += -D__APPLE__
CFLAGS = $(CXXFLAGS)
endif
.cpp.o:

View File

@ -1,73 +0,0 @@
The OpenGL Extension Wrangler Library
Copyright (C) 2002-2007, Milan Ikits <milan ikits[]ieee org>
Copyright (C) 2002-2007, Marcelo E. Magallon <mmagallo[]debian org>
Copyright (C) 2002, Lev Povalahev
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* The name of the author may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.
Mesa 3-D graphics library
Version: 7.0
Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
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
BRIAN PAUL 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.
Copyright (c) 2007 The Khronos Group Inc.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and/or associated documentation files (the
"Materials"), to deal in the Materials without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Materials, and to
permit persons to whom the Materials are 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 Materials.
THE MATERIALS ARE 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
MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.

View File

@ -1,18 +0,0 @@
See doc/index.html for more information.
If you downloaded the tarball from the GLEW website, you just need to:
Unix:
make
Windows:
use the project file in build/vc6/
If you wish to build GLEW from scratch (update the extension data from
the net or add your own extension information), you need a Unix
environment (including wget, perl, and GNU make). The extension data
is regenerated from the top level source directory with:
make extensions

View File

@ -1,12 +0,0 @@
Major:
- add support for windows mini-client drivers
- add windows installer (msi)
- separate build of static and shared object files (for mingw and
cygwin)
- start designing GLEW 2.0
Minor:
- make auto scripts work with text mode cygwin mounts
- add support for all SUN, MTX, and OML extensions
- make auto/Makefile more robust against auto/core/*~ mistakes
- web poll on separating glew, glxew and wglew

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,180 +0,0 @@
/*************************************************************************
* GLFW 3.0 - www.glfw.org
* A library for OpenGL, window and input
*------------------------------------------------------------------------
* Copyright (c) 2002-2006 Marcus Geelnard
* Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would
* be appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not
* be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*
*************************************************************************/
#ifndef _glfw3_native_h_
#define _glfw3_native_h_
#ifdef __cplusplus
extern "C" {
#endif
/*************************************************************************
* Doxygen documentation
*************************************************************************/
/*! @defgroup native Native access
*
* **By using the native API, you assert that you know what you're doing and
* how to fix problems caused by using it. If you don't, you shouldn't be
* using it.**
*
* Before the inclusion of @ref glfw3native.h, you must define exactly one
* window API macro and exactly one context API macro. Failure to do this
* will cause a compile-time error.
*
* The available window API macros are:
* * `GLFW_EXPOSE_NATIVE_WIN32`
* * `GLFW_EXPOSE_NATIVE_COCOA`
* * `GLFW_EXPOSE_NATIVE_X11`
*
* The available context API macros are:
* * `GLFW_EXPOSE_NATIVE_WGL`
* * `GLFW_EXPOSE_NATIVE_NSGL`
* * `GLFW_EXPOSE_NATIVE_GLX`
* * `GLFW_EXPOSE_NATIVE_EGL`
*
* These macros select which of the native access functions that are declared
* and which platform-specific headers to include. It is then up your (by
* definition platform-specific) code to handle which of these should be
* defined.
*/
/*************************************************************************
* System headers and types
*************************************************************************/
#if defined(GLFW_EXPOSE_NATIVE_WIN32)
#include <windows.h>
#elif defined(GLFW_EXPOSE_NATIVE_COCOA)
#if defined(__OBJC__)
#import <Cocoa/Cocoa.h>
#else
typedef void* id;
#endif
#elif defined(GLFW_EXPOSE_NATIVE_X11)
#include <X11/Xlib.h>
#else
#error "No window API specified"
#endif
#if defined(GLFW_EXPOSE_NATIVE_WGL)
/* WGL is declared by windows.h */
#elif defined(GLFW_EXPOSE_NATIVE_NSGL)
/* NSGL is declared by Cocoa.h */
#elif defined(GLFW_EXPOSE_NATIVE_GLX)
#include <GL/glx.h>
#elif defined(GLFW_EXPOSE_NATIVE_EGL)
#include <EGL/egl.h>
#else
#error "No context API specified"
#endif
/*************************************************************************
* Functions
*************************************************************************/
#if defined(GLFW_EXPOSE_NATIVE_WIN32)
/*! @brief Returns the `HWND` of the specified window.
* @return The `HWND` of the specified window.
* @ingroup native
*/
GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_WGL)
/*! @brief Returns the `HGLRC` of the specified window.
* @return The `HGLRC` of the specified window.
* @ingroup native
*/
GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_COCOA)
/*! @brief Returns the `NSWindow` of the specified window.
* @return The `NSWindow` of the specified window.
* @ingroup native
*/
GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_NSGL)
/*! @brief Returns the `NSOpenGLContext` of the specified window.
* @return The `NSOpenGLContext` of the specified window.
* @ingroup native
*/
GLFWAPI id glfwGetNSGLContext(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_X11)
/*! @brief Returns the `Display` used by GLFW.
* @return The `Display` used by GLFW.
* @ingroup native
*/
GLFWAPI Display* glfwGetX11Display(void);
/*! @brief Returns the `Window` of the specified window.
* @return The `Window` of the specified window.
* @ingroup native
*/
GLFWAPI Window glfwGetX11Window(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_GLX)
/*! @brief Returns the `GLXContext` of the specified window.
* @return The `GLXContext` of the specified window.
* @ingroup native
*/
GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_EGL)
/*! @brief Returns the `EGLDisplay` used by GLFW.
* @return The `EGLDisplay` used by GLFW.
* @ingroup native
*/
GLFWAPI EGLDisplay glfwGetEGLDisplay(void);
/*! @brief Returns the `EGLContext` of the specified window.
* @return The `EGLContext` of the specified window.
* @ingroup native
*/
GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window);
/*! @brief Returns the `EGLSurface` of the specified window.
* @return The `EGLSurface` of the specified window.
* @ingroup native
*/
GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);
#endif
#ifdef __cplusplus
}
#endif
#endif /* _glfw3_native_h_ */

View File

@ -0,0 +1,270 @@
// ImGui GLFW binding with OpenGL
// https://github.com/ocornut/imgui
#include <imgui.h>
#include "imgui_impl_glfw.h"
// GLFW
#include <GLFW/glfw3.h>
#ifdef _MSC_VER
#undef APIENTRY
#define GLFW_EXPOSE_NATIVE_WIN32
#define GLFW_EXPOSE_NATIVE_WGL
#include <GLFW/glfw3native.h>
#endif
// Data
static GLFWwindow* g_Window = NULL;
static double g_Time = 0.0f;
static bool g_MousePressed[3] = { false, false, false };
static float g_MouseWheel = 0.0f;
static GLuint g_FontTexture = 0;
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)
// If text or lines are blurry when integrating ImGui in your engine:
// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)
static void ImGui_ImplGlfw_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count)
{
// We are using the OpenGL fixed pipeline to make the example code simpler to read!
// A probable faster way to render would be to collate all vertices from all cmd_lists into a single vertex buffer.
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers.
glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glEnable(GL_SCISSOR_TEST);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnable(GL_TEXTURE_2D);
//glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context
// Setup orthographic projection matrix
const float width = ImGui::GetIO().DisplaySize.x;
const float height = ImGui::GetIO().DisplaySize.y;
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0f, width, height, 0.0f, -1.0f, +1.0f);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// Render command lists
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
const unsigned char* vtx_buffer = (const unsigned char*)&cmd_list->vtx_buffer.front();
glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (void*)(vtx_buffer + OFFSETOF(ImDrawVert, pos)));
glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (void*)(vtx_buffer + OFFSETOF(ImDrawVert, uv)));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (void*)(vtx_buffer + OFFSETOF(ImDrawVert, col)));
int vtx_offset = 0;
for (int cmd_i = 0; cmd_i < cmd_list->commands.size(); cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->commands[cmd_i];
if (pcmd->user_callback)
{
pcmd->user_callback(cmd_list, pcmd);
}
else
{
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->texture_id);
glScissor((int)pcmd->clip_rect.x, (int)(height - pcmd->clip_rect.w), (int)(pcmd->clip_rect.z - pcmd->clip_rect.x), (int)(pcmd->clip_rect.w - pcmd->clip_rect.y));
glDrawArrays(GL_TRIANGLES, vtx_offset, (GLsizei)pcmd->vtx_count);
}
vtx_offset += pcmd->vtx_count;
}
}
#undef OFFSETOF
// Restore modified state
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glBindTexture(GL_TEXTURE_2D, 0);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glPopAttrib();
}
static const char* ImGui_ImplGlfw_GetClipboardText()
{
return glfwGetClipboardString(g_Window);
}
static void ImGui_ImplGlfw_SetClipboardText(const char* text)
{
glfwSetClipboardString(g_Window, text);
}
void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow*, int button, int action, int /*mods*/)
{
if (action == GLFW_PRESS && button >= 0 && button < 3)
g_MousePressed[button] = true;
}
void ImGui_ImplGlfw_ScrollCallback(GLFWwindow*, double /*xoffset*/, double yoffset)
{
g_MouseWheel += (float)yoffset; // Use fractional mouse wheel, 1.0 unit 5 lines.
}
void ImGui_ImplGlFw_KeyCallback(GLFWwindow*, int key, int, int action, int mods)
{
ImGuiIO& io = ImGui::GetIO();
if (action == GLFW_PRESS)
io.KeysDown[key] = true;
if (action == GLFW_RELEASE)
io.KeysDown[key] = false;
(void)mods; // Modifiers are not reliable across systems
io.KeyCtrl = io.KeysDown[GLFW_KEY_LEFT_CONTROL] || io.KeysDown[GLFW_KEY_RIGHT_CONTROL];
io.KeyShift = io.KeysDown[GLFW_KEY_LEFT_SHIFT] || io.KeysDown[GLFW_KEY_RIGHT_SHIFT];
io.KeyAlt = io.KeysDown[GLFW_KEY_LEFT_ALT] || io.KeysDown[GLFW_KEY_RIGHT_ALT];
}
void ImGui_ImplGlfw_CharCallback(GLFWwindow*, unsigned int c)
{
ImGuiIO& io = ImGui::GetIO();
if (c > 0 && c < 0x10000)
io.AddInputCharacter((unsigned short)c);
}
bool ImGui_ImplGlfw_CreateDeviceObjects()
{
ImGuiIO& io = ImGui::GetIO();
// Build texture
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsAlpha8(&pixels, &width, &height);
// Create texture
glGenTextures(1, &g_FontTexture);
glBindTexture(GL_TEXTURE_2D, g_FontTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, pixels);
// Store our identifier
io.Fonts->TexID = (void *)(intptr_t)g_FontTexture;
// Cleanup (don't clear the input data if you want to append new fonts later)
io.Fonts->ClearInputData();
io.Fonts->ClearTexData();
return true;
}
void ImGui_ImplGlfw_InvalidateDeviceObjects()
{
if (g_FontTexture)
{
glDeleteTextures(1, &g_FontTexture);
ImGui::GetIO().Fonts->TexID = 0;
g_FontTexture = 0;
}
}
bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks)
{
g_Window = window;
ImGuiIO& io = ImGui::GetIO();
io.KeyMap[ImGuiKey_Tab] = GLFW_KEY_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.
io.KeyMap[ImGuiKey_LeftArrow] = GLFW_KEY_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = GLFW_KEY_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = GLFW_KEY_UP;
io.KeyMap[ImGuiKey_DownArrow] = GLFW_KEY_DOWN;
io.KeyMap[ImGuiKey_PageUp] = GLFW_KEY_PAGE_UP;
io.KeyMap[ImGuiKey_PageDown] = GLFW_KEY_PAGE_DOWN;
io.KeyMap[ImGuiKey_Home] = GLFW_KEY_HOME;
io.KeyMap[ImGuiKey_End] = GLFW_KEY_END;
io.KeyMap[ImGuiKey_Delete] = GLFW_KEY_DELETE;
io.KeyMap[ImGuiKey_Backspace] = GLFW_KEY_BACKSPACE;
io.KeyMap[ImGuiKey_Enter] = GLFW_KEY_ENTER;
io.KeyMap[ImGuiKey_Escape] = GLFW_KEY_ESCAPE;
io.KeyMap[ImGuiKey_A] = GLFW_KEY_A;
io.KeyMap[ImGuiKey_C] = GLFW_KEY_C;
io.KeyMap[ImGuiKey_V] = GLFW_KEY_V;
io.KeyMap[ImGuiKey_X] = GLFW_KEY_X;
io.KeyMap[ImGuiKey_Y] = GLFW_KEY_Y;
io.KeyMap[ImGuiKey_Z] = GLFW_KEY_Z;
io.RenderDrawListsFn = ImGui_ImplGlfw_RenderDrawLists;
io.SetClipboardTextFn = ImGui_ImplGlfw_SetClipboardText;
io.GetClipboardTextFn = ImGui_ImplGlfw_GetClipboardText;
#ifdef _MSC_VER
io.ImeWindowHandle = glfwGetWin32Window(g_Window);
#endif
if (install_callbacks)
{
glfwSetMouseButtonCallback(window, ImGui_ImplGlfw_MouseButtonCallback);
glfwSetScrollCallback(window, ImGui_ImplGlfw_ScrollCallback);
glfwSetKeyCallback(window, ImGui_ImplGlFw_KeyCallback);
glfwSetCharCallback(window, ImGui_ImplGlfw_CharCallback);
}
return true;
}
void ImGui_ImplGlfw_Shutdown()
{
ImGui_ImplGlfw_InvalidateDeviceObjects();
ImGui::Shutdown();
}
void ImGui_ImplGlfw_NewFrame()
{
if (!g_FontTexture)
ImGui_ImplGlfw_CreateDeviceObjects();
ImGuiIO& io = ImGui::GetIO();
// Setup display size (every frame to accommodate for window resizing)
int w, h;
int display_w, display_h;
glfwGetWindowSize(g_Window, &w, &h);
glfwGetFramebufferSize(g_Window, &display_w, &display_h);
io.DisplaySize = ImVec2((float)display_w, (float)display_h);
// Setup time step
double current_time = glfwGetTime();
io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);
g_Time = current_time;
// Setup inputs
// (we already got mouse wheel, keyboard keys & characters from glfw callbacks polled in glfwPollEvents())
if (glfwGetWindowAttrib(g_Window, GLFW_FOCUSED))
{
double mouse_x, mouse_y;
glfwGetCursorPos(g_Window, &mouse_x, &mouse_y);
mouse_x *= (float)display_w / w; // Convert mouse coordinates to pixels
mouse_y *= (float)display_h / h;
io.MousePos = ImVec2((float)mouse_x, (float)mouse_y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
}
else
{
io.MousePos = ImVec2(-1,-1);
}
for (int i = 0; i < 3; i++)
{
io.MouseDown[i] = g_MousePressed[i] || glfwGetMouseButton(g_Window, i) != 0; // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame.
g_MousePressed[i] = false;
}
io.MouseWheel = g_MouseWheel;
g_MouseWheel = 0.0f;
// Hide OS mouse cursor if ImGui is drawing it
glfwSetInputMode(g_Window, GLFW_CURSOR, io.MouseDrawCursor ? GLFW_CURSOR_HIDDEN : GLFW_CURSOR_NORMAL);
// Start the frame
ImGui::NewFrame();
}

View File

@ -0,0 +1,20 @@
// ImGui GLFW binding with OpenGL
// https://github.com/ocornut/imgui
struct GLFWwindow;
bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks);
void ImGui_ImplGlfw_Shutdown();
void ImGui_ImplGlfw_NewFrame();
// Use if you want to reset your rendering device without losing ImGui state.
void ImGui_ImplGlfw_InvalidateDeviceObjects();
bool ImGui_ImplGlfw_CreateDeviceObjects();
// GLFW callbacks (installed by default if you enable 'install_callbacks' during initialization)
// Provided here if you want to chain callbacks.
// You can also handle inputs yourself and use those as a reference.
void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods);
void ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset);
void ImGui_ImplGlFw_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);
void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c);

View File

@ -1,315 +1,61 @@
#ifdef _MSC_VER
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
#include <Windows.h>
#include <Imm.h>
#endif
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h" // for .png loading
#include "../../imgui.h"
// ImGui - standalone example application for Glfw + OpenGL 2, using fixed pipeline
// glew & glfw
#define GLEW_STATIC
#include <GL/glew.h>
#include <imgui.h>
#include "imgui_impl_glfw.h"
#include <stdio.h>
#include <GLFW/glfw3.h>
#ifdef _MSC_VER
#define GLFW_EXPOSE_NATIVE_WIN32
#define GLFW_EXPOSE_NATIVE_WGL
#include <GLFW/glfw3native.h>
#endif
static GLFWwindow* window;
static GLuint fontTex;
static bool mousePressed[2] = { false, false };
static ImVec2 mousePosScale(1.0f, 1.0f);
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)
// If text or lines are blurry when integrating ImGui in your engine:
// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)
// - try adjusting ImGui::GetIO().PixelCenterOffset to 0.5f or 0.375f
static void ImImpl_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count)
static void error_callback(int error, const char* description)
{
if (cmd_lists_count == 0)
return;
// We are using the OpenGL fixed pipeline to make the example code simpler to read!
// A probable faster way to render would be to collate all vertices from all cmd_lists into a single vertex buffer.
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers.
glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glEnable(GL_SCISSOR_TEST);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
// Setup texture
glBindTexture(GL_TEXTURE_2D, fontTex);
glEnable(GL_TEXTURE_2D);
// Setup orthographic projection matrix
const float width = ImGui::GetIO().DisplaySize.x;
const float height = ImGui::GetIO().DisplaySize.y;
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0f, width, height, 0.0f, -1.0f, +1.0f);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// Render command lists
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
const unsigned char* vtx_buffer = (const unsigned char*)&cmd_list->vtx_buffer.front();
glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (void*)(vtx_buffer + offsetof(ImDrawVert, pos)));
glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (void*)(vtx_buffer + offsetof(ImDrawVert, uv)));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (void*)(vtx_buffer + offsetof(ImDrawVert, col)));
int vtx_offset = 0;
for (size_t cmd_i = 0; cmd_i < cmd_list->commands.size(); cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->commands[cmd_i];
glScissor((int)pcmd->clip_rect.x, (int)(height - pcmd->clip_rect.w), (int)(pcmd->clip_rect.z - pcmd->clip_rect.x), (int)(pcmd->clip_rect.w - pcmd->clip_rect.y));
glDrawArrays(GL_TRIANGLES, vtx_offset, pcmd->vtx_count);
vtx_offset += pcmd->vtx_count;
}
}
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
// Restore modified state
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glPopAttrib();
fprintf(stderr, "Error %d: %s\n", error, description);
}
// NB: ImGui already provide OS clipboard support for Windows so this isn't needed if you are using Windows only.
static const char* ImImpl_GetClipboardTextFn()
int main(int, char**)
{
return glfwGetClipboardString(window);
}
static void ImImpl_SetClipboardTextFn(const char* text)
{
glfwSetClipboardString(window, text);
}
#ifdef _MSC_VER
// Notify OS Input Method Editor of text input position (e.g. when using Japanese/Chinese inputs, otherwise this isn't needed)
static void ImImpl_ImeSetInputScreenPosFn(int x, int y)
{
HWND hwnd = glfwGetWin32Window(window);
if (HIMC himc = ImmGetContext(hwnd))
{
COMPOSITIONFORM cf;
cf.ptCurrentPos.x = x;
cf.ptCurrentPos.y = y;
cf.dwStyle = CFS_FORCE_POSITION;
ImmSetCompositionWindow(himc, &cf);
}
}
#endif
// GLFW callbacks to get events
static void glfw_error_callback(int error, const char* description)
{
fputs(description, stderr);
}
static void glfw_mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
{
if (action == GLFW_PRESS && button >= 0 && button < 2)
mousePressed[button] = true;
}
static void glfw_scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
{
ImGuiIO& io = ImGui::GetIO();
io.MouseWheel = (yoffset != 0.0f) ? yoffset > 0.0f ? 1 : - 1 : 0; // Mouse wheel: -1,0,+1
}
static void glfw_key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
ImGuiIO& io = ImGui::GetIO();
if (action == GLFW_PRESS)
io.KeysDown[key] = true;
if (action == GLFW_RELEASE)
io.KeysDown[key] = false;
io.KeyCtrl = (mods & GLFW_MOD_CONTROL) != 0;
io.KeyShift = (mods & GLFW_MOD_SHIFT) != 0;
}
static void glfw_char_callback(GLFWwindow* window, unsigned int c)
{
if (c > 0 && c < 0x10000)
ImGui::GetIO().AddInputCharacter((unsigned short)c);
}
// OpenGL code based on http://open.gl tutorials
void InitGL()
{
glfwSetErrorCallback(glfw_error_callback);
// Setup window
glfwSetErrorCallback(error_callback);
if (!glfwInit())
exit(1);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
window = glfwCreateWindow(1280, 720, "ImGui OpenGL example", NULL, NULL);
GLFWwindow* window = glfwCreateWindow(1280, 720, "ImGui OpenGL2 example", NULL, NULL);
glfwMakeContextCurrent(window);
glfwSetKeyCallback(window, glfw_key_callback);
glfwSetMouseButtonCallback(window, glfw_mouse_button_callback);
glfwSetScrollCallback(window, glfw_scroll_callback);
glfwSetCharCallback(window, glfw_char_callback);
glewInit();
}
// Setup ImGui binding
ImGui_ImplGlfw_Init(window, true);
//ImGuiIO& io = ImGui::GetIO();
//ImFont* my_font0 = io.Fonts->AddFontDefault();
//ImFont* my_font1 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 16.0f);
//ImFont* my_font2 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/Karla-Regular.ttf", 16.0f);
//ImFont* my_font3 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyClean.ttf", 13.0f); my_font3->DisplayOffset.y += 1;
//ImFont* my_font4 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyTiny.ttf", 10.0f); my_font4->DisplayOffset.y += 1;
//ImFont* my_font5 = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, io.Fonts->GetGlyphRangesJapanese());
void InitImGui()
{
int w, h;
int fb_w, fb_h;
glfwGetWindowSize(window, &w, &h);
glfwGetFramebufferSize(window, &fb_w, &fb_h);
mousePosScale.x = (float)fb_w / w; // Some screens e.g. Retina display have framebuffer size != from window size, and mouse inputs are given in window/screen coordinates.
mousePosScale.y = (float)fb_h / h;
ImGuiIO& io = ImGui::GetIO();
io.DisplaySize = ImVec2((float)fb_w, (float)fb_h); // Display size, in pixels. For clamping windows positions.
io.DeltaTime = 1.0f/60.0f; // Time elapsed since last frame, in seconds (in this sample app we'll override this every frame because our timestep is variable)
io.PixelCenterOffset = 0.0f; // Align OpenGL texels
io.KeyMap[ImGuiKey_Tab] = GLFW_KEY_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.
io.KeyMap[ImGuiKey_LeftArrow] = GLFW_KEY_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = GLFW_KEY_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = GLFW_KEY_UP;
io.KeyMap[ImGuiKey_DownArrow] = GLFW_KEY_DOWN;
io.KeyMap[ImGuiKey_Home] = GLFW_KEY_HOME;
io.KeyMap[ImGuiKey_End] = GLFW_KEY_END;
io.KeyMap[ImGuiKey_Delete] = GLFW_KEY_DELETE;
io.KeyMap[ImGuiKey_Backspace] = GLFW_KEY_BACKSPACE;
io.KeyMap[ImGuiKey_Enter] = GLFW_KEY_ENTER;
io.KeyMap[ImGuiKey_Escape] = GLFW_KEY_ESCAPE;
io.KeyMap[ImGuiKey_A] = GLFW_KEY_A;
io.KeyMap[ImGuiKey_C] = GLFW_KEY_C;
io.KeyMap[ImGuiKey_V] = GLFW_KEY_V;
io.KeyMap[ImGuiKey_X] = GLFW_KEY_X;
io.KeyMap[ImGuiKey_Y] = GLFW_KEY_Y;
io.KeyMap[ImGuiKey_Z] = GLFW_KEY_Z;
io.RenderDrawListsFn = ImImpl_RenderDrawLists;
io.SetClipboardTextFn = ImImpl_SetClipboardTextFn;
io.GetClipboardTextFn = ImImpl_GetClipboardTextFn;
#ifdef _MSC_VER
io.ImeSetInputScreenPosFn = ImImpl_ImeSetInputScreenPosFn;
#endif
// Load font texture
glGenTextures(1, &fontTex);
glBindTexture(GL_TEXTURE_2D, fontTex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
#if 1
// Default font (embedded in code)
const void* png_data;
unsigned int png_size;
ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size);
int tex_x, tex_y, tex_comp;
void* tex_data = stbi_load_from_memory((const unsigned char*)png_data, (int)png_size, &tex_x, &tex_y, &tex_comp, 0);
IM_ASSERT(tex_data != NULL);
#else
// Custom font from filesystem
io.Font = new ImBitmapFont();
io.Font->LoadFromFile("../../extra_fonts/mplus-2m-medium_18.fnt");
IM_ASSERT(io.Font->IsLoaded());
int tex_x, tex_y, tex_comp;
void* tex_data = stbi_load("../../extra_fonts/mplus-2m-medium_18.png", &tex_x, &tex_y, &tex_comp, 0);
IM_ASSERT(tex_data != NULL);
// Automatically find white pixel from the texture we just loaded
// (io.FontTexUvForWhite needs to contains UV coordinates pointing to a white pixel in order to render solid objects)
for (int tex_data_off = 0; tex_data_off < tex_x*tex_y; tex_data_off++)
if (((unsigned int*)tex_data)[tex_data_off] == 0xffffffff)
{
io.FontTexUvForWhite = ImVec2((float)(tex_data_off % tex_x)/(tex_x), (float)(tex_data_off / tex_x)/(tex_y));
break;
}
#endif
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_x, tex_y, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex_data);
stbi_image_free(tex_data);
}
void UpdateImGui()
{
ImGuiIO& io = ImGui::GetIO();
// Setup timestep
static double time = 0.0f;
const double current_time = glfwGetTime();
io.DeltaTime = (float)(current_time - time);
time = current_time;
// Setup inputs
// (we already got mouse wheel, keyboard keys & characters from glfw callbacks polled in glfwPollEvents())
double mouse_x, mouse_y;
glfwGetCursorPos(window, &mouse_x, &mouse_y);
io.MousePos = ImVec2((float)mouse_x * mousePosScale.x, (float)mouse_y * mousePosScale.y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
io.MouseDown[0] = mousePressed[0] || glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) != 0; // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame.
io.MouseDown[1] = mousePressed[1] || glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) != 0;
// Start the frame
ImGui::NewFrame();
}
// Application code
int main(int argc, char** argv)
{
InitGL();
InitImGui();
bool show_test_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImColor(114, 144, 154);
// Main loop
while (!glfwWindowShouldClose(window))
{
ImGuiIO& io = ImGui::GetIO();
mousePressed[0] = mousePressed[1] = false;
io.MouseWheel = 0;
glfwPollEvents();
UpdateImGui();
static bool show_test_window = true;
static bool show_another_window = false;
ImGui_ImplGlfw_NewFrame();
// 1. Show a simple window
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
{
static float f;
static float f = 0.0f;
ImGui::Text("Hello, world!");
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
show_test_window ^= ImGui::Button("Test Window");
show_another_window ^= ImGui::Button("Another Window");
// Calculate and show framerate
static float ms_per_frame[120] = { 0 };
static int ms_per_frame_idx = 0;
static float ms_per_frame_accum = 0.0f;
ms_per_frame_accum -= ms_per_frame[ms_per_frame_idx];
ms_per_frame[ms_per_frame_idx] = ImGui::GetIO().DeltaTime * 1000.0f;
ms_per_frame_accum += ms_per_frame[ms_per_frame_idx];
ms_per_frame_idx = (ms_per_frame_idx + 1) % 120;
const float ms_per_frame_avg = ms_per_frame_accum / 120;
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", ms_per_frame_avg, 1000.0f / ms_per_frame_avg);
ImGui::ColorEdit3("clear color", (float*)&clear_color);
if (ImGui::Button("Test Window")) show_test_window ^= 1;
if (ImGui::Button("Another Window")) show_another_window ^= 1;
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
}
// 2. Show another simple window, this time using an explicit Begin/End pair
if (show_another_window)
{
ImGui::Begin("Another Window", &show_another_window, ImVec2(200,100));
ImGui::SetNextWindowSize(ImVec2(200,100), ImGuiSetCond_FirstUseEver);
ImGui::Begin("Another Window", &show_another_window);
ImGui::Text("Hello");
ImGui::End();
}
@ -317,19 +63,21 @@ int main(int argc, char** argv)
// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow()
if (show_test_window)
{
ImGui::SetNewWindowDefaultPos(ImVec2(650, 20)); // Normally user code doesn't need/want to call this, because positions are saved in .ini file. Here we just want to make the demo initial state a bit more friendly!
ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiSetCond_FirstUseEver);
ImGui::ShowTestWindow(&show_test_window);
}
// Rendering
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
glClearColor(0.8f, 0.6f, 0.6f, 1.0f);
glViewport(0, 0, (int)ImGui::GetIO().DisplaySize.x, (int)ImGui::GetIO().DisplaySize.y);
glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
glClear(GL_COLOR_BUFFER_BIT);
ImGui::Render();
glfwSwapBuffers(window);
}
ImGui::Shutdown();
// Cleanup
ImGui_ImplGlfw_Shutdown();
glfwTerminate();
return 0;
}

View File

@ -1,20 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opengl_example", "opengl_example.vcxproj", "{9CDA7840-B7A5-496D-A527-E95571496D18}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|Win32.ActiveCfg = Debug|Win32
{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|Win32.Build.0 = Debug|Win32
{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|Win32.ActiveCfg = Release|Win32
{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -5,10 +5,18 @@
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{9CDA7840-B7A5-496D-A527-E95571496D18}</ProjectGuid>
@ -20,65 +28,134 @@
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(ProjectDir)$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Configuration)\</IntDir>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>$(SolutionDir)\glfw\include;$(SolutionDir)\glew\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(SolutionDir)\libs\glfw\include;..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(SolutionDir)\glfw\lib-msvc100;$(SolutionDir)\glew\lib\Release\Win32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;imm32.lib;glfw3.lib;glew32s.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>NotSet</SubSystem>
<AdditionalLibraryDirectories>$(SolutionDir)\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>$(SolutionDir)\libs\glfw\include;..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(SolutionDir)\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<WarningLevel>Level4</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>$(SolutionDir)\glfw\include;$(SolutionDir)\glew\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(SolutionDir)\libs\glfw\include;..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(SolutionDir)\glfw\lib-msvc100;$(SolutionDir)\glew\lib\Release\Win32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;imm32.lib;glfw3.lib;glew32s.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>NotSet</SubSystem>
<AdditionalLibraryDirectories>$(SolutionDir)\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<IgnoreSpecificDefaultLibraries>
</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level4</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>$(SolutionDir)\libs\glfw\include;..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(SolutionDir)\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
<IgnoreSpecificDefaultLibraries>
</IgnoreSpecificDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\imgui.cpp" />
<ClCompile Include="imgui_impl_glfw.cpp" />
<ClCompile Include="main.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\imconfig.h" />
<ClInclude Include="..\..\imgui.h" />
<ClInclude Include="..\..\stb_textedit.h" />
<ClInclude Include="stb_image.h" />
</ItemGroup>
<ItemGroup>
<None Include="..\..\LICENSE" />
<ClInclude Include="imgui_impl_glfw.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

View File

@ -16,24 +16,19 @@
<ClCompile Include="..\..\imgui.cpp">
<Filter>imgui</Filter>
</ClCompile>
<ClCompile Include="imgui_impl_glfw.cpp">
<Filter>sources</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stb_image.h">
<Filter>sources</Filter>
</ClInclude>
<ClInclude Include="..\..\imconfig.h">
<Filter>imgui</Filter>
</ClInclude>
<ClInclude Include="..\..\imgui.h">
<Filter>imgui</Filter>
</ClInclude>
<ClInclude Include="..\..\stb_textedit.h">
<Filter>imgui</Filter>
<ClInclude Include="imgui_impl_glfw.h">
<Filter>sources</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\..\LICENSE">
<Filter>imgui</Filter>
</None>
</ItemGroup>
</Project>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
# How to Build
- On Windows with Visual Studio's CLI
\<sdl2path\> is your SDL2 folder.
```
cl /MD /I <sdl2path\include> /I ..\.. main.cpp imgui_impl_sdl.cpp ..\..\imgui.cpp /link /LIBPATH:<sdl2path\lib> SDL2.lib SDL2main.lib
```

View File

@ -0,0 +1,259 @@
// ImGui SDL2 binding with OpenGL
// https://github.com/ocornut/imgui
#include <SDL.h>
#include <SDL_syswm.h>
#include <SDL_OpenGL.h>
#include <imgui.h>
#include "imgui_impl_sdl.h"
// Data
static double g_Time = 0.0f;
static bool g_MousePressed[3] = { false, false, false };
static float g_MouseWheel = 0.0f;
static GLuint g_FontTexture = 0;
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)
// If text or lines are blurry when integrating ImGui in your engine:
// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)
static void ImGui_ImplSdl_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count)
{
// We are using the OpenGL fixed pipeline to make the example code simpler to read!
// A probable faster way to render would be to collate all vertices from all cmd_lists into a single vertex buffer.
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers.
glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glEnable(GL_SCISSOR_TEST);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnable(GL_TEXTURE_2D);
//glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context
// Setup orthographic projection matrix
const float width = ImGui::GetIO().DisplaySize.x;
const float height = ImGui::GetIO().DisplaySize.y;
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0f, width, height, 0.0f, -1.0f, +1.0f);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// Render command lists
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
for (int n = 0; n < cmd_lists_count; n++)
{
const ImDrawList* cmd_list = cmd_lists[n];
const unsigned char* vtx_buffer = (const unsigned char*)&cmd_list->vtx_buffer.front();
glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (void*)(vtx_buffer + OFFSETOF(ImDrawVert, pos)));
glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (void*)(vtx_buffer + OFFSETOF(ImDrawVert, uv)));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (void*)(vtx_buffer + OFFSETOF(ImDrawVert, col)));
int vtx_offset = 0;
for (int cmd_i = 0; cmd_i < cmd_list->commands.size(); cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->commands[cmd_i];
if (pcmd->user_callback)
{
pcmd->user_callback(cmd_list, pcmd);
}
else
{
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->texture_id);
glScissor((int)pcmd->clip_rect.x, (int)(height - pcmd->clip_rect.w), (int)(pcmd->clip_rect.z - pcmd->clip_rect.x), (int)(pcmd->clip_rect.w - pcmd->clip_rect.y));
glDrawArrays(GL_TRIANGLES, vtx_offset, (GLsizei)pcmd->vtx_count);
}
vtx_offset += pcmd->vtx_count;
}
}
#undef OFFSETOF
// Restore modified state
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glBindTexture(GL_TEXTURE_2D, 0);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glPopAttrib();
}
static const char* ImGui_ImplSdl_GetClipboardText()
{
return SDL_GetClipboardText();
}
static void ImGui_ImplSdl_SetClipboardText(const char* text)
{
SDL_SetClipboardText(text);
}
bool ImGui_ImplSdl_ProcessEvent(SDL_Event* event)
{
ImGuiIO& io = ImGui::GetIO();
switch (event->type)
{
case SDL_MOUSEWHEEL:
{
if (event->wheel.y > 0)
g_MouseWheel = 1;
if (event->wheel.y < 0)
g_MouseWheel = -1;
return true;
}
case SDL_MOUSEBUTTONDOWN:
{
if (event->button.button == SDL_BUTTON_LEFT) g_MousePressed[0] = true;
if (event->button.button == SDL_BUTTON_RIGHT) g_MousePressed[1] = true;
if (event->button.button == SDL_BUTTON_MIDDLE) g_MousePressed[2] = true;
return true;
}
case SDL_TEXTINPUT:
{
ImGuiIO& io = ImGui::GetIO();
unsigned int c = event->text.text[0];
if (c > 0 && c < 0x10000)
io.AddInputCharacter((unsigned short)c);
return true;
}
case SDL_KEYDOWN:
case SDL_KEYUP:
{
int key = event->key.keysym.sym & ~SDLK_SCANCODE_MASK;
io.KeysDown[key] = (event->type == SDL_KEYDOWN);
io.KeyShift = ((SDL_GetModState() & KMOD_SHIFT) != 0);
io.KeyCtrl = ((SDL_GetModState() & KMOD_CTRL) != 0);
io.KeyAlt = ((SDL_GetModState() & KMOD_ALT) != 0);
return true;
}
}
return false;
}
bool ImGui_ImplSdl_CreateDeviceObjects()
{
ImGuiIO& io = ImGui::GetIO();
// Build texture
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsAlpha8(&pixels, &width, &height);
// Create texture
glGenTextures(1, &g_FontTexture);
glBindTexture(GL_TEXTURE_2D, g_FontTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, pixels);
// Store our identifier
io.Fonts->TexID = (void *)(intptr_t)g_FontTexture;
// Cleanup (don't clear the input data if you want to append new fonts later)
io.Fonts->ClearInputData();
io.Fonts->ClearTexData();
return true;
}
void ImGui_ImplSdl_InvalidateDeviceObjects()
{
if (g_FontTexture)
{
glDeleteTextures(1, &g_FontTexture);
ImGui::GetIO().Fonts->TexID = 0;
g_FontTexture = 0;
}
}
bool ImGui_ImplSdl_Init(SDL_Window *window)
{
ImGuiIO& io = ImGui::GetIO();
io.KeyMap[ImGuiKey_Tab] = SDLK_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.
io.KeyMap[ImGuiKey_LeftArrow] = SDL_SCANCODE_LEFT;
io.KeyMap[ImGuiKey_RightArrow] = SDL_SCANCODE_RIGHT;
io.KeyMap[ImGuiKey_UpArrow] = SDL_SCANCODE_UP;
io.KeyMap[ImGuiKey_DownArrow] = SDL_SCANCODE_DOWN;
io.KeyMap[ImGuiKey_PageUp] = SDL_SCANCODE_PAGEUP;
io.KeyMap[ImGuiKey_PageDown] = SDL_SCANCODE_PAGEDOWN;
io.KeyMap[ImGuiKey_Home] = SDL_SCANCODE_HOME;
io.KeyMap[ImGuiKey_End] = SDL_SCANCODE_END;
io.KeyMap[ImGuiKey_Delete] = SDLK_DELETE;
io.KeyMap[ImGuiKey_Backspace] = SDLK_BACKSPACE;
io.KeyMap[ImGuiKey_Enter] = SDLK_RETURN;
io.KeyMap[ImGuiKey_Escape] = SDLK_ESCAPE;
io.KeyMap[ImGuiKey_A] = SDLK_a;
io.KeyMap[ImGuiKey_C] = SDLK_c;
io.KeyMap[ImGuiKey_V] = SDLK_v;
io.KeyMap[ImGuiKey_X] = SDLK_x;
io.KeyMap[ImGuiKey_Y] = SDLK_y;
io.KeyMap[ImGuiKey_Z] = SDLK_z;
io.RenderDrawListsFn = ImGui_ImplSdl_RenderDrawLists;
io.SetClipboardTextFn = ImGui_ImplSdl_SetClipboardText;
io.GetClipboardTextFn = ImGui_ImplSdl_GetClipboardText;
#ifdef _MSC_VER
SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version);
SDL_GetWindowWMInfo(window, &wmInfo);
io.ImeWindowHandle = wmInfo.info.win.window;
#endif
return true;
}
void ImGui_ImplSdl_Shutdown()
{
ImGui_ImplSdl_InvalidateDeviceObjects();
ImGui::Shutdown();
}
void ImGui_ImplSdl_NewFrame(SDL_Window *window)
{
if (!g_FontTexture)
ImGui_ImplSdl_CreateDeviceObjects();
ImGuiIO& io = ImGui::GetIO();
// Setup display size (every frame to accommodate for window resizing)
int w, h;
SDL_GetWindowSize(window, &w, &h);
io.DisplaySize = ImVec2((float)w, (float)h);
// Setup time step
Uint32 time = SDL_GetTicks();
double current_time = time / 1000.0;
io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);
g_Time = current_time;
// Setup inputs
// (we already got mouse wheel, keyboard keys & characters from glfw callbacks polled in glfwPollEvents())
int mx, my;
Uint32 mouseMask = SDL_GetMouseState(&mx, &my);
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MOUSE_FOCUS)
io.MousePos = ImVec2((float)mx, (float)my); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
else
io.MousePos = ImVec2(-1,-1);
io.MouseDown[0] = g_MousePressed[0] || (mouseMask & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0; // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame.
io.MouseDown[1] = g_MousePressed[1] || (mouseMask & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0;
io.MouseDown[2] = g_MousePressed[2] || (mouseMask & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0;
g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false;
io.MouseWheel = g_MouseWheel;
g_MouseWheel = 0.0f;
// Hide OS mouse cursor if ImGui is drawing it
SDL_ShowCursor(io.MouseDrawCursor ? 0 : 1);
// Start the frame
ImGui::NewFrame();
}

View File

@ -0,0 +1,14 @@
// ImGui SDL2 binding with OpenGL
// https://github.com/ocornut/imgui
struct SDL_Window;
typedef union SDL_Event SDL_Event;
bool ImGui_ImplSdl_Init(SDL_Window *window);
void ImGui_ImplSdl_Shutdown();
void ImGui_ImplSdl_NewFrame(SDL_Window *window);
bool ImGui_ImplSdl_ProcessEvent(SDL_Event* event);
// Use if you want to reset your rendering device without losing ImGui state.
void ImGui_ImplSdl_InvalidateDeviceObjects();
bool ImGui_ImplSdl_CreateDeviceObjects();

View File

@ -0,0 +1,96 @@
// ImGui - standalone example application for SDL2 + OpenGL
#include <imgui.h>
#include "imgui_impl_sdl.h"
#include <stdio.h>
#include <SDL.h>
#include <SDL_OpenGL.h>
int SDL_main(int, char**)
{
// Setup SDL
if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
return -1;
// Setup window
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_DisplayMode current;
SDL_GetCurrentDisplayMode(0, &current);
SDL_Window *window = SDL_CreateWindow("ImGui SDL2+OpenGL example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
SDL_GLContext glcontext = SDL_GL_CreateContext(window);
// Setup ImGui binding
ImGui_ImplSdl_Init(window);
//ImGuiIO& io = ImGui::GetIO();
//ImFont* my_font0 = io.Fonts->AddFontDefault();
//ImFont* my_font1 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 16.0f);
//ImFont* my_font2 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/Karla-Regular.ttf", 16.0f);
//ImFont* my_font3 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyClean.ttf", 13.0f); my_font3->DisplayOffset.y += 1;
//ImFont* my_font4 = io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyTiny.ttf", 10.0f); my_font4->DisplayOffset.y += 1;
//ImFont* my_font5 = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, io.Fonts->GetGlyphRangesJapanese());
bool show_test_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImColor(114, 144, 154);
// Main loop
bool done = false;
while (!done)
{
SDL_Event event;
while (SDL_PollEvent(&event))
{
ImGui_ImplSdl_ProcessEvent(&event);
if (event.type == SDL_QUIT)
done = true;
}
ImGui_ImplSdl_NewFrame(window);
// 1. Show a simple window
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
{
static float f = 0.0f;
ImGui::Text("Hello, world!");
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
ImGui::ColorEdit3("clear color", (float*)&clear_color);
if (ImGui::Button("Test Window")) show_test_window ^= 1;
if (ImGui::Button("Another Window")) show_another_window ^= 1;
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
}
// 2. Show another simple window, this time using an explicit Begin/End pair
if (show_another_window)
{
ImGui::SetNextWindowSize(ImVec2(200,100), ImGuiSetCond_FirstUseEver);
ImGui::Begin("Another Window", &show_another_window);
ImGui::Text("Hello");
ImGui::End();
}
// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow()
if (show_test_window)
{
ImGui::SetNextWindowPos(ImVec2(650, 20), ImGuiSetCond_FirstUseEver);
ImGui::ShowTestWindow(&show_test_window);
}
// Rendering
glViewport(0, 0, (int)ImGui::GetIO().DisplaySize.x, (int)ImGui::GetIO().DisplaySize.y);
glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
glClear(GL_COLOR_BUFFER_BIT);
ImGui::Render();
SDL_GL_SwapWindow(window);
}
// Cleanup
ImGui_ImplSdl_Shutdown();
SDL_GL_DeleteContext(glcontext);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}

BIN
extra_fonts/DroidSans.ttf Normal file

Binary file not shown.

Binary file not shown.

BIN
extra_fonts/ProggyClean.ttf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
extra_fonts/ProggyTiny.ttf Normal file

Binary file not shown.

View File

@ -1,100 +1,76 @@
Extra fonts for ImGui.
THOSE FONTS ARE OPTIONAL.
The code in imgui.cpp embeds a copy of 'ProggyClean.ttf' that you can use without any external files.
Those are only provided as a convenience, you can load your own .TTF files.
ImGui embeds a copy of 'proggy_clean' that you can use without any external files.
Export your own font with bmfont (www.angelcode.com/products/bmfont).
---------------------------------
LINKS
---------------------------------
bmfont reads fonts (.ttf, .fon, etc.) and output a .fnt file and a texture file, e.g:
Typefaces for source code beautification
https://github.com/chrissimpkins/codeface
proggy_clean.fon --> [bmfont] ---> proggy_clean_13.fnt
proggy_clean_13.png
Proggy Programming Fonts
http://upperbounds.net
If you need a free font that supports chinese/japanese characters, you can use the M+ fonts.
TTF and sources are availables at http://mplus-fonts.sourceforge.jp/mplus-outline-fonts.
This directory include some of the M+ fonts converted by bmfont.
Inconsolata
http://www.levien.com/type/myfonts/inconsolata.html
//-----------------------------------------------------------------------------
Adobe Source Code Pro: Monospaced font family for user interface and coding environments
https://github.com/adobe-fonts/source-code-pro
Configure bmfont:
Monospace/Fixed Width Programmer's Fonts
http://www.lowing.org/fonts/
- Export .fnt as Binary
- Output .png, 32-bits (or whatever is suitable for your loader/renderer)
- Tip: uncheck "Render from TrueType outline" and "Font Smoothing" for best result with non-anti-aliased type fonts.
But you can experiment with other settings if you want anti-aliased fonts.
- Tip: use pngout.exe (http://advsys.net/ken/utils.htm) to further reduce the file size of .png files
All files in this folder have been optimised with pngout.exe
(Japanese) M+ fonts by Coji Morishita are free and include most useful Kanjis you would need.
http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/index-en.html
-----------------------------------------------------------------------------
Or use Arial Unicode or other Unicode fonts provided with Windows for full characters coverage (not sure of their licensing).
(A) Use font data embedded in ImGui
---------------------------------
INCLUDED FONTS
---------------------------------
// Access embedded font data
const void* fnt_data; // pointer to FNT data
unsigned fnt_size; // size of FNT data
const void* png_data; // pointer to PNG data
unsigned int png_size; // size of PNG data
ImGui::GetDefaultFontData(&fnt_data, &fnt_size, &png_data, &png_size);
DroidSans.ttf
Copyright (c) Steve Matteson
Apache License, version 2.0
http://www.google.com/fonts/specimen/Droid+Sans
1. Load the .FNT data from 'fnt_data' (NB: this is done for you by default if you don't do anything)
ProggyClean.ttf
Copyright (c) 2004, 2005 Tristan Grimmer
MIT License
recommended loading setting in ImGui: Size = 13.0, DisplayOffset.Y = +1
ProggyTiny.ttf
Copyright (c) 2004, 2005 Tristan Grimmer
MIT License
recommended loading setting in ImGui: Size = 10.0, DisplayOffset.Y = +1
Karla-Regular
Copyright (c) 2012, Jonathan Pinhorn
SIL OPEN FONT LICENSE Version 1.1
---------------------------------
LOADING INSTRUCTIONS
---------------------------------
Load .TTF file with:
ImGuiIO& io = ImGui::GetIO();
io.Font = new ImBitmapFont();
io.Font->LoadFromMemory(fnt_data, fnt_size);
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_pixels);
2. Load the .PNG data from 'png_data' into a texture
Add a third parameter to bake specific font ranges:
//-----------------------------------------------------------------------------
io.Fonts->LoadFromFileTTF("myfontfile.ttf", size_pixels, io.Fonts->GetGlyphRangesDefault()); // Basic Latin, Extended Latin
io.Fonts->LoadFromFileTTF("myfontfile.ttf", size_pixels, io.Fonts->GetGlyphRangesJapanese()); // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs
io.Fonts->LoadFromFileTTF("myfontfile.ttf", size_pixels, io.Fonts->GetGlyphRangesChinese()); // Include full set of about 21000 CJK Unified Ideographs
(B) Use fonts from external files
Offset font vertically by altering the io.Font->DisplayOffset value:
You need to set io.FontTexUvForWhite to UV coordinates pointing to a white pixel in the texture.
You can either locate a white pixel manually or use code at runtime to find or write one.
The OpenGL example include sample code to find a white pixel given an uncompressed 32-bits texture:
ImFont* font = io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_pixels);
font->DisplayOffset.y += 1; // Render 1 pixel down
// Automatically find white pixel from the texture we just loaded
// (io.FontTexUvForWhite needs to contains UV coordinates pointing to a white pixel in order to render solid objects)
for (int tex_data_off = 0; tex_data_off < tex_x*tex_y; tex_data_off++)
if (((unsigned int*)tex_data)[tex_data_off] == 0xffffffff)
{
io.FontTexUvForWhite = ImVec2((float)(tex_data_off % tex_x)/(tex_x), (float)(tex_data_off / tex_x)/(tex_y));
break;
}
If you want to embed the font in source code (e.g. in your engine, so it doesn't have file-system dependencies);
Compile and use 'binary_to_compressed_c.cpp' to create a compressed C style array. Then load the font with:
1. Load the .FNT data, e.g.
ImFont* font = io.Fonts->AddFontFromMemoryCompressedTTF(compressed_data, compressed_data_size, size_pixels, ...);
ImGuiIO& io = ImGui::GetIO();
// proggy_clean_13 [default]
io.Font = new ImBitmapFont();
io.Font->LoadFromFile("proggy_clean_13.fnt");
IM_ASSERT(io.Font->IsLoaded());
io.FontTexUvForWhite = ImVec2(0.0f/256.0f,0.0f/128);
io.FontYOffset = +1;
// proggy_small_12
io.Font = new ImBitmapFont();
io.Font->LoadFromFile("proggy_small_12.fnt");
IM_ASSERT(io.Font->IsLoaded());
io.FontTexUvForWhite = ImVec2(84.0f/256.0f,20.0f/64);
io.FontYOffset = +2;
// proggy_small_14
io.Font = new ImBitmapFont();
io.Font->LoadFromFile("proggy_small_14.fnt");
IM_ASSERT(io.Font->IsLoaded());
io.FontTexUvForWhite = ImVec2(84.0f/256.0f,20.0f/64);
io.FontYOffset = +3;
// courier_new_16
io.Font->LoadFromFile("courier_new_16.fnt");
io.FontTexUvForWhite = ImVec2(1.0f/256.0f,4.0f/128);
// courier_new_18
io.Font->LoadFromFile("courier_new_18.fnt");
io.FontTexUvForWhite = ImVec2(4.0f/256.0f,5.0f/256);
2. Load the matching .PNG data into a texture
//-----------------------------------------------------------------------------

View File

@ -0,0 +1,330 @@
// ImGui - binary_to_compressed_c.cpp
// Helper tool to turn a file into a C array.
// The data is first compressed with stb_compress() to reduce source code size a little.
// Useful if you want to embed fonts into your code.
// Note that the output array is likely to be bigger than the binary file..
// Load compressed TTF fonts with ImGui::GetIO().Fonts->AddFontFromMemoryCompressedTTF()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
const int COLUMNS = 12;
// stb_compress* from stb.h - declaration
typedef unsigned int stb_uint;
typedef unsigned char stb_uchar;
stb_uint stb_compress(stb_uchar *out,stb_uchar *in,stb_uint len);
static bool binary_to_compressed_c(const char* filename, const char* symbol);
int main(int argc, char** argv)
{
if (argc < 3)
{
printf("Syntax: %s <inputfile> <symbolname>\n", argv[0]);
return 0;
}
binary_to_compressed_c(argv[1], argv[2]);
return 1;
}
bool binary_to_compressed_c(const char* filename, const char* symbol)
{
// Read file
FILE* f = fopen(filename, "rb");
if (!f) return false;
int data_sz;
if (fseek(f, 0, SEEK_END) || (data_sz = (int)ftell(f)) == -1 || fseek(f, 0, SEEK_SET)) { fclose(f); return false; }
char* data = new char[data_sz+4];
if (fread(data, 1, data_sz, f) != (size_t)data_sz) { fclose(f); delete[] data; return false; }
memset((void *)(((char*)data) + data_sz), 0, 4);
fclose(f);
// Compress
int maxlen = data_sz + 512 + (data_sz >> 2) + sizeof(int); // total guess
char* compressed = new char[maxlen];
int compressed_sz = stb_compress((stb_uchar*)compressed, (stb_uchar*)data, data_sz);
memset(compressed + compressed_sz, 0, maxlen - compressed_sz);
// Output
FILE* out = stdout;
fprintf(out, "// File: '%s' (%d bytes)\n", filename, (int)data_sz);
fprintf(out, "// Exported using binary_to_compressed_c\n");
fprintf(out, "static const unsigned int %s_compressed_size = %d;\n", symbol, (int)compressed_sz);
fprintf(out, "static const unsigned int %s_compressed_data[%d/4] =\n{", symbol, (int)((compressed_sz+3)/4)*4);
int column = 0;
for (int i = 0; i < compressed_sz; i += 4)
{
unsigned int d = *(unsigned int*)(compressed + i);
if ((column++ % COLUMNS) == 0)
fprintf(out, "\n 0x%08x, ", d);
else
fprintf(out, "0x%08x, ", d);
}
fprintf(out, "\n};\n\n");
// Cleanup
delete[] data;
delete[] compressed;
return true;
}
// stb_compress* from stb.h - definition
//////////////////// compressor ///////////////////////
static stb_uint stb_adler32(stb_uint adler32, stb_uchar *buffer, stb_uint buflen)
{
const unsigned long ADLER_MOD = 65521;
unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16;
unsigned long blocklen, i;
blocklen = buflen % 5552;
while (buflen) {
for (i=0; i + 7 < blocklen; i += 8) {
s1 += buffer[0], s2 += s1;
s1 += buffer[1], s2 += s1;
s1 += buffer[2], s2 += s1;
s1 += buffer[3], s2 += s1;
s1 += buffer[4], s2 += s1;
s1 += buffer[5], s2 += s1;
s1 += buffer[6], s2 += s1;
s1 += buffer[7], s2 += s1;
buffer += 8;
}
for (; i < blocklen; ++i)
s1 += *buffer++, s2 += s1;
s1 %= ADLER_MOD, s2 %= ADLER_MOD;
buflen -= blocklen;
blocklen = 5552;
}
return (s2 << 16) + s1;
}
static unsigned int stb_matchlen(stb_uchar *m1, stb_uchar *m2, stb_uint maxlen)
{
stb_uint i;
for (i=0; i < maxlen; ++i)
if (m1[i] != m2[i]) return i;
return i;
}
// simple implementation that just takes the source data in a big block
static stb_uchar *stb__out;
static FILE *stb__outfile;
static stb_uint stb__outbytes;
static void stb__write(unsigned char v)
{
fputc(v, stb__outfile);
++stb__outbytes;
}
#define stb_out(v) (stb__out ? *stb__out++ = (stb_uchar) (v) : stb__write((stb_uchar) (v)))
static void stb_out2(stb_uint v)
{
stb_out(v >> 8);
stb_out(v);
}
static void stb_out3(stb_uint v) { stb_out(v >> 16); stb_out(v >> 8); stb_out(v); }
static void stb_out4(stb_uint v) { stb_out(v >> 24); stb_out(v >> 16);
stb_out(v >> 8 ); stb_out(v); }
static void outliterals(stb_uchar *in, int numlit)
{
while (numlit > 65536) {
outliterals(in,65536);
in += 65536;
numlit -= 65536;
}
if (numlit == 0) ;
else if (numlit <= 32) stb_out (0x000020 + numlit-1);
else if (numlit <= 2048) stb_out2(0x000800 + numlit-1);
else /* numlit <= 65536) */ stb_out3(0x070000 + numlit-1);
if (stb__out) {
memcpy(stb__out,in,numlit);
stb__out += numlit;
} else
fwrite(in, 1, numlit, stb__outfile);
}
static int stb__window = 0x40000; // 256K
static int stb_not_crap(int best, int dist)
{
return ((best > 2 && dist <= 0x00100)
|| (best > 5 && dist <= 0x04000)
|| (best > 7 && dist <= 0x80000));
}
static stb_uint stb__hashsize = 32768;
// note that you can play with the hashing functions all you
// want without needing to change the decompressor
#define stb__hc(q,h,c) (((h) << 7) + ((h) >> 25) + q[c])
#define stb__hc2(q,h,c,d) (((h) << 14) + ((h) >> 18) + (q[c] << 7) + q[d])
#define stb__hc3(q,c,d,e) ((q[c] << 14) + (q[d] << 7) + q[e])
static unsigned int stb__running_adler;
static int stb_compress_chunk(stb_uchar *history,
stb_uchar *start,
stb_uchar *end,
int length,
int *pending_literals,
stb_uchar **chash,
stb_uint mask)
{
(void)history;
int window = stb__window;
stb_uint match_max;
stb_uchar *lit_start = start - *pending_literals;
stb_uchar *q = start;
#define STB__SCRAMBLE(h) (((h) + ((h) >> 16)) & mask)
// stop short of the end so we don't scan off the end doing
// the hashing; this means we won't compress the last few bytes
// unless they were part of something longer
while (q < start+length && q+12 < end) {
int m;
stb_uint h1,h2,h3,h4, h;
stb_uchar *t;
int best = 2, dist=0;
if (q+65536 > end)
match_max = end-q;
else
match_max = 65536;
#define stb__nc(b,d) ((d) <= window && ((b) > 9 || stb_not_crap(b,d)))
#define STB__TRY(t,p) /* avoid retrying a match we already tried */ \
if (p ? dist != q-t : 1) \
if ((m = stb_matchlen(t, q, match_max)) > best) \
if (stb__nc(m,q-(t))) \
best = m, dist = q - (t)
// rather than search for all matches, only try 4 candidate locations,
// chosen based on 4 different hash functions of different lengths.
// this strategy is inspired by LZO; hashing is unrolled here using the
// 'hc' macro
h = stb__hc3(q,0, 1, 2); h1 = STB__SCRAMBLE(h);
t = chash[h1]; if (t) STB__TRY(t,0);
h = stb__hc2(q,h, 3, 4); h2 = STB__SCRAMBLE(h);
h = stb__hc2(q,h, 5, 6); t = chash[h2]; if (t) STB__TRY(t,1);
h = stb__hc2(q,h, 7, 8); h3 = STB__SCRAMBLE(h);
h = stb__hc2(q,h, 9,10); t = chash[h3]; if (t) STB__TRY(t,1);
h = stb__hc2(q,h,11,12); h4 = STB__SCRAMBLE(h);
t = chash[h4]; if (t) STB__TRY(t,1);
// because we use a shared hash table, can only update it
// _after_ we've probed all of them
chash[h1] = chash[h2] = chash[h3] = chash[h4] = q;
if (best > 2)
assert(dist > 0);
// see if our best match qualifies
if (best < 3) { // fast path literals
++q;
} else if (best > 2 && best <= 0x80 && dist <= 0x100) {
outliterals(lit_start, q-lit_start); lit_start = (q += best);
stb_out(0x80 + best-1);
stb_out(dist-1);
} else if (best > 5 && best <= 0x100 && dist <= 0x4000) {
outliterals(lit_start, q-lit_start); lit_start = (q += best);
stb_out2(0x4000 + dist-1);
stb_out(best-1);
} else if (best > 7 && best <= 0x100 && dist <= 0x80000) {
outliterals(lit_start, q-lit_start); lit_start = (q += best);
stb_out3(0x180000 + dist-1);
stb_out(best-1);
} else if (best > 8 && best <= 0x10000 && dist <= 0x80000) {
outliterals(lit_start, q-lit_start); lit_start = (q += best);
stb_out3(0x100000 + dist-1);
stb_out2(best-1);
} else if (best > 9 && dist <= 0x1000000) {
if (best > 65536) best = 65536;
outliterals(lit_start, q-lit_start); lit_start = (q += best);
if (best <= 0x100) {
stb_out(0x06);
stb_out3(dist-1);
stb_out(best-1);
} else {
stb_out(0x04);
stb_out3(dist-1);
stb_out2(best-1);
}
} else { // fallback literals if no match was a balanced tradeoff
++q;
}
}
// if we didn't get all the way, add the rest to literals
if (q-start < length)
q = start+length;
// the literals are everything from lit_start to q
*pending_literals = (q - lit_start);
stb__running_adler = stb_adler32(stb__running_adler, start, q - start);
return q - start;
}
static int stb_compress_inner(stb_uchar *input, stb_uint length)
{
int literals = 0;
stb_uint len,i;
stb_uchar **chash;
chash = (stb_uchar**) malloc(stb__hashsize * sizeof(stb_uchar*));
if (chash == NULL) return 0; // failure
for (i=0; i < stb__hashsize; ++i)
chash[i] = NULL;
// stream signature
stb_out(0x57); stb_out(0xbc);
stb_out2(0);
stb_out4(0); // 64-bit length requires 32-bit leading 0
stb_out4(length);
stb_out4(stb__window);
stb__running_adler = 1;
len = stb_compress_chunk(input, input, input+length, length, &literals, chash, stb__hashsize-1);
assert(len == length);
outliterals(input+length - literals, literals);
free(chash);
stb_out2(0x05fa); // end opcode
stb_out4(stb__running_adler);
return 1; // success
}
stb_uint stb_compress(stb_uchar *out, stb_uchar *input, stb_uint length)
{
stb__out = out;
stb__outfile = NULL;
stb_compress_inner(input, length);
return stb__out - out;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Some files were not shown because too many files have changed in this diff Show More