Compare commits
153 Commits
Author | SHA1 | Date | |
---|---|---|---|
95cbcdca3f | |||
4c25de950c | |||
31852e1d05 | |||
319e288eef | |||
71b981d05f | |||
b359ed7b3e | |||
67b604412b | |||
2ee76bbff6 | |||
e808b7cfca | |||
947171dcef | |||
07df3cfb3e | |||
8e353af1d3 | |||
26be1511e9 | |||
c1427de5b6 | |||
0e7b9b8284 | |||
9c513d4443 | |||
f45fd1cef6 | |||
552246feed | |||
518f32ccfe | |||
90493f8add | |||
726b91a2cd | |||
2942240072 | |||
d4d51a7802 | |||
650515ce49 | |||
d53c308852 | |||
1eacfd120b | |||
c61e08e8c4 | |||
aeaf5ccebb | |||
9945eecaf4 | |||
c3376cd45c | |||
e7b95646b9 | |||
f48fc51777 | |||
aa7a29cdbf | |||
587fc60f25 | |||
a6399f120f | |||
171b0e5ca9 | |||
ae0c33c983 | |||
41c5d4651b | |||
c4876078b4 | |||
cfbf06e394 | |||
39c9bb73e8 | |||
7661b1e778 | |||
2b7eeba143 | |||
d6750c87c2 | |||
7c9fa59329 | |||
c71aae08f3 | |||
fdc4299c6c | |||
e6c2c1fcfd | |||
8a61c0afea | |||
a9b0abe493 | |||
aecf5d12e6 | |||
adb4d4d48b | |||
5b8aa0dc84 | |||
04396ed7a9 | |||
367c53967f | |||
5bed7144fe | |||
9260d46c2c | |||
b495a52fc0 | |||
37d50dccf9 | |||
a274a09955 | |||
928832a5bc | |||
9cbc6e196b | |||
86fb3a6a3c | |||
8e8e59a942 | |||
1bd3942b8e | |||
feba83cfcd | |||
a9e303e006 | |||
b8fcb4e7e4 | |||
3f46d9b933 | |||
5bffc85ba6 | |||
37716184b3 | |||
5abb39cb1f | |||
1394616d9c | |||
4ea4fa3e73 | |||
0ceddc29ff | |||
4cbd316f01 | |||
4b7edffe8a | |||
9ea093ddd0 | |||
1dcb9c877d | |||
6346690962 | |||
3db40903ba | |||
2065cbec4d | |||
76ce08c338 | |||
b816d05e33 | |||
6846873f23 | |||
d45044fe54 | |||
cf12bc7dea | |||
17d3c202ac | |||
ba80a457b9 | |||
1881cbe860 | |||
4afe67cdc8 | |||
ab97b42935 | |||
d1061c8799 | |||
991d9e2884 | |||
874df53403 | |||
339b67c01a | |||
2813a44dcc | |||
9e86d0e225 | |||
87a6110994 | |||
20ba769644 | |||
5b7a0b1b40 | |||
07e379a950 | |||
dafedc3246 | |||
2c6bc95dd5 | |||
b329a36d27 | |||
a908c109c0 | |||
62fe0b59bf | |||
2efaa9a86f | |||
a3b00b79f2 | |||
b671840d15 | |||
b1ec90d565 | |||
7afd62ec57 | |||
595684e08c | |||
3ee50af57e | |||
005b897d7d | |||
9f6b1ace8f | |||
94dc3df956 | |||
b6fe5eb4b4 | |||
d5fd87e806 | |||
570a9dadc4 | |||
8f0f71c7ba | |||
2a505ebb9a | |||
56927cbb54 | |||
13b1e0ec9b | |||
b8f86ec4bd | |||
d6be992bef | |||
a81a5e5235 | |||
9e8795f4e2 | |||
f144646c83 | |||
e585204d82 | |||
39510d05ea | |||
3922988dea | |||
739e73b07b | |||
fc66365805 | |||
31fe006c85 | |||
6277ffe00f | |||
85725ff9c6 | |||
76ca7c42ca | |||
bf6f6ba858 | |||
49fb7364b5 | |||
35085a4480 | |||
749e8fa345 | |||
81c86dd5e7 | |||
8061a6ceea | |||
4e3c6f64c0 | |||
3aa4a108ed | |||
40ed6a51b0 | |||
68bde7b862 | |||
d212401624 | |||
6dbdc69131 | |||
668a247af0 | |||
dc4a07c49a | |||
e41568f87f |
@ -2,6 +2,7 @@ language: cpp
|
|||||||
|
|
||||||
os:
|
os:
|
||||||
- linux
|
- linux
|
||||||
|
- osx
|
||||||
|
|
||||||
compiler:
|
compiler:
|
||||||
- gcc
|
- gcc
|
||||||
|
27
README.md
@ -39,13 +39,19 @@ 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 Windows binaries of the demo app here.
|
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 Windows binaries of the demo app here.
|
||||||
- [imgui-demo-binaries-20150909.zip](http://www.miracleworld.net/imgui/binaries/imgui-demo-binaries-20150909.zip) (Windows binaries, ImGui 1.46 WIP 2015/09/09, 4 executables, 505 KB)
|
- [imgui-demo-binaries-20151226.zip](http://www.miracleworld.net/imgui/binaries/imgui-demo-binaries-20151226.zip) (Windows binaries, ImGui 1.47 2015/12/26, 4 executables, 515 KB)
|
||||||
|
|
||||||
|
|
||||||
Gallery
|
Gallery
|
||||||
-------
|
-------
|
||||||
|
|
||||||

|
See the [Screenshots Thread](https://github.com/ocornut/imgui/issues/123) for some user creations.
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
[](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v148/profiler.png)
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
@ -124,6 +130,10 @@ If you intend to display large lists of items (say, 1000+) it can be beneficial
|
|||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
This is [LumixEngine](https://github.com/nem0/LumixEngine) with a minor skinning hack + a docking/tabs extension (both of which you can find in the Issues section and will eventually be merged).
|
||||||
|
|
||||||
|
[](https://cloud.githubusercontent.com/assets/8225057/13044612/59f07aec-d3cf-11e5-8ccb-39adf2e13e69.png)
|
||||||
|
|
||||||
<b>Why using C++ (as opposed to C)?</b>
|
<b>Why using C++ (as opposed to C)?</b>
|
||||||
|
|
||||||
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.
|
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.
|
||||||
@ -152,13 +162,16 @@ Embeds [stb_textedit.h, stb_truetype.h, stb_rectpack.h](https://github.com/nothi
|
|||||||
|
|
||||||
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.
|
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).
|
Ongoing ImGui development is financially supported on [**Patreon**](http://www.patreon.com/imgui).
|
||||||
|
|
||||||
Special supporters:
|
Double-chocolate sponsors:
|
||||||
- Jetha Chan, Wild Sheep Studio, Pastagames, Mārtiņš Možeiko, Daniel Collin, Stefano Cristiano.
|
- Media Molecule, Mobigame
|
||||||
|
|
||||||
And:
|
Salty caramel supporters:
|
||||||
- Michel Courtine, César Leblic, Dale Kim, Alex Evans, Rui Figueira, Paul Patrashcu, Jerome Lanquetot, Ctrl Alt Ninja, Paul Fleming, Neil Henning, Stephan Dilly, Neil Blakey-Milner, Aleksei, NeiloGD, Justin Paver, FiniteSol, Vincent Pancaldi, James Billot, Robin Hübner, furrtek, Eric, Simon Barratt, Game Atelier, Julian Bosch, Simon Lundmark, Vincent Hamm.
|
- Jetha Chan, Wild Sheep Studio, Pastagames, Mārtiņš Možeiko, Daniel Collin, Stefano Cristiano, Chris Genova, ikrima
|
||||||
|
|
||||||
|
Caramel supporters:
|
||||||
|
- Michel Courtine, César Leblic, Dale Kim, Alex Evans, Rui Figueira, Paul Patrashcu, Jerome Lanquetot, Ctrl Alt Ninja, Paul Fleming, Neil Henning, Stephan Dilly, Neil Blakey-Milner, Aleksei, NeiloGD, Justin Paver, FiniteSol, Vincent Pancaldi, James Billot, Robin Hübner, furrtek, Eric, Simon Barratt, Game Atelier, Julian Bosch, Simon Lundmark, Vincent Hamm, Farhan Wali, Jeff Roberts, Matt Reyer, Colin Riley.
|
||||||
|
|
||||||
And other supporters; thanks!
|
And other supporters; thanks!
|
||||||
|
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
Those are standalone ready-to-build applications to demonstrate ImGui.
|
Those are standalone ready-to-build applications to demonstrate ImGui.
|
||||||
Binaries of some of those demos are available at http://www.miracleworld.net/imgui/binaries
|
Binaries of some of those demos: http://www.miracleworld.net/imgui/binaries
|
||||||
|
|
||||||
|
Third party languages and frameworks bindings: https://github.com/ocornut/imgui/wiki/Links
|
||||||
|
(languages: C, .net, rust, D, Python, Lua..)
|
||||||
|
(frameworks: DX12, Vulkan, Cinder, OpenGLES, openFrameworks, Cocos2d-x, SFML, Flexium, NanoRT, Irrlicht..)
|
||||||
|
(extras: RemoteImGui, ImWindow, imgui_wm..)
|
||||||
|
|
||||||
TL;DR;
|
TL;DR;
|
||||||
- Newcomers, read 'PROGRAMMER GUIDE' in imgui.cpp for notes on how to setup ImGui in your codebase.
|
- Newcomers, read 'PROGRAMMER GUIDE' in imgui.cpp for notes on how to setup ImGui in your codebase.
|
||||||
@ -17,7 +22,7 @@ ImGui is highly portable and only requires a few things to run:
|
|||||||
- Optional: clipboard support, mouse cursor supports, Windows IME support, etc.
|
- Optional: clipboard support, mouse cursor supports, Windows IME support, etc.
|
||||||
So this is essentially what those examples are doing + the obligatory cruft for portability.
|
So this is essentially what those examples are doing + the obligatory cruft for portability.
|
||||||
|
|
||||||
Unfortunately in 2015 it is still tedious to create and maintain portable build files using external
|
Unfortunately in 2016 it is still tedious to create and maintain portable build files using external
|
||||||
libraries (the kind we're using here to create a window and render 3D triangles) without relying on
|
libraries (the kind we're using here to create a window and render 3D triangles) without relying on
|
||||||
third party software. For most examples here I choose to provide:
|
third party software. For most examples here I choose to provide:
|
||||||
- Makefiles for Linux/OSX
|
- Makefiles for Linux/OSX
|
||||||
@ -27,6 +32,15 @@ Please let me know if they don't work with your setup!
|
|||||||
You can probably just import the imgui_impl_xxx.cpp/.h files into your own codebase or compile those
|
You can probably just import the imgui_impl_xxx.cpp/.h files into your own codebase or compile those
|
||||||
directly with a command-line compiler.
|
directly with a command-line compiler.
|
||||||
|
|
||||||
|
ImGui has zero frame of lag for most behaviors and one frame of lag for some behaviors.
|
||||||
|
At 60 FPS your experience should be pleasant. Consider that OS mouse cursors are typically drawn through
|
||||||
|
a specific hardware accelerated route and may feel smoother than other GPU rendered contents. You may
|
||||||
|
experiment with the io.MouseDrawCursor flag to request ImGui to draw a mouse cursor itself, to visualize
|
||||||
|
the lag between an hardware cursor and a software cursor. It might be beneficial to the user experience
|
||||||
|
to switch to a software rendered cursor when an interactive drag is in progress.
|
||||||
|
Also note that some setup or GPU drivers may be causing extra lag (possibly by enforcing triple buffering),
|
||||||
|
leaving you with no option but sadness/anger (Intel GPU drivers were reported as such).
|
||||||
|
|
||||||
opengl_example/
|
opengl_example/
|
||||||
OpenGL example, using GLFW + fixed pipeline.
|
OpenGL example, using GLFW + fixed pipeline.
|
||||||
This is simple and should work for all OpenGL enabled applications.
|
This is simple and should work for all OpenGL enabled applications.
|
||||||
@ -49,9 +63,9 @@ directx11_example/
|
|||||||
DirectX11 example, Windows only.
|
DirectX11 example, Windows only.
|
||||||
This is quite long and tedious, because: DirectX11.
|
This is quite long and tedious, because: DirectX11.
|
||||||
|
|
||||||
ios_example/
|
apple_example/
|
||||||
iOS example.
|
OSX & iOS example.
|
||||||
Using Synergy to access keyboard/mouse data from server computer.
|
On iOS, Using Synergy to access keyboard/mouse data from server computer.
|
||||||
Synergy keyboard integration is rather hacky.
|
Synergy keyboard integration is rather hacky.
|
||||||
|
|
||||||
sdl_opengl_example/
|
sdl_opengl_example/
|
||||||
@ -66,3 +80,7 @@ allegro5_example/
|
|||||||
marmalade_example/
|
marmalade_example/
|
||||||
Marmalade example using IwGx
|
Marmalade example using IwGx
|
||||||
|
|
||||||
|
vulkan_example/
|
||||||
|
Vulkan example.
|
||||||
|
This is quite long and tedious, because: Vulkan.
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui Allegro 5 bindings
|
// ImGui Allegro 5 bindings
|
||||||
|
// In this binding, ImTextureID is used to store a 'ALLEGRO_BITMAP*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
@ -247,6 +249,7 @@ void ImGui_ImplA5_NewFrame()
|
|||||||
io.KeyCtrl = al_key_down(&keys, ALLEGRO_KEY_LCTRL) || al_key_down(&keys, ALLEGRO_KEY_RCTRL);
|
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.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);
|
io.KeyAlt = al_key_down(&keys, ALLEGRO_KEY_ALT) || al_key_down(&keys, ALLEGRO_KEY_ALTGR);
|
||||||
|
io.KeySuper = al_key_down(&keys, ALLEGRO_KEY_LWIN) || al_key_down(&keys, ALLEGRO_KEY_RWIN);
|
||||||
|
|
||||||
ALLEGRO_MOUSE_STATE mouse;
|
ALLEGRO_MOUSE_STATE mouse;
|
||||||
if (keys.display == g_Display)
|
if (keys.display == g_Display)
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui Allegro 5 bindings
|
// ImGui Allegro 5 bindings
|
||||||
|
// In this binding, ImTextureID is used to store a 'ALLEGRO_BITMAP*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
|
@ -1,20 +1,27 @@
|
|||||||
# iOS example
|
# iOS / OSX example
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
This example is the default XCode "OpenGL" example code, modified to support ImGui and [Synergy](http://synergy-project.org/).
|
This example is the default XCode "OpenGL" example code, modified to support ImGui and [Synergy](http://synergy-project.org/) to share mouse/keyboard on an iOS device.
|
||||||
|
|
||||||
It is a rather complex example because of all of the faff required to get an XCode/iOS application running. Refer to the regular OpenGL examples if you want to learn about integrating ImGui.
|
It is a rather complex and messy example because of all of the faff required to get an XCode/iOS application running. Refer to the regular OpenGL examples if you want to learn about integrating ImGui. **The opengl3_example/ should also work on OS X and is much simpler.** This is an integration for iOS with Synergy.
|
||||||
|
|
||||||
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.
|
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
|
## How to Use on iOS
|
||||||
|
|
||||||
0. In Synergy, go to Preferences, and uncheck "Use SSL encryption"
|
* In Synergy, go to Preferences, and uncheck "Use SSL encryption"
|
||||||
0. Run the example app.
|
* Run the example app.
|
||||||
0. Tap the "servername" button in the corner
|
* Tap the "servername" button in the corner
|
||||||
0. Enter the name or the IP of your synergy host
|
* 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.
|
* If you had previously connected to a server, you may need to kill and re-start the app.
|
||||||
|
|
||||||
|
## How to Build on OSX
|
||||||
|
|
||||||
|
* Make sure you have install `brew`, if not, please refer to [Homebrew Website](http://brew.sh)
|
||||||
|
* Run the command: `brew install glfw3`
|
||||||
|
* Double click `imguiex.xcodeproj` and select `imguiex-osx` scheme
|
||||||
|
* Click `Run` button
|
||||||
|
|
||||||
## Notes and TODOs
|
## Notes and TODOs
|
||||||
|
|
||||||
@ -25,7 +32,8 @@ Things that would be nice but I didn't get around to doing:
|
|||||||
* Graceful disconnect/reconnect from uSynergy.
|
* Graceful disconnect/reconnect from uSynergy.
|
||||||
* Copy/Paste not well-supported
|
* Copy/Paste not well-supported
|
||||||
|
|
||||||
## C++ on iOS
|
## C++ on iOS / OSX
|
||||||
|
|
||||||
ImGui is a c++ library. If you want to include it directly, rename your Obj-C file to have the ".mm" extension.
|
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.
|
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.
|
@ -63,6 +63,11 @@
|
|||||||
"idiom" : "ipad",
|
"idiom" : "ipad",
|
||||||
"filename" : "icon_imgui_76@2x~ipad.png",
|
"filename" : "icon_imgui_76@2x~ipad.png",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"size" : "83.5x83.5",
|
||||||
|
"scale" : "2x"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info" : {
|
"info" : {
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
22
examples/apple_example/imguiex-ios/imgui_impl_ios.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// ImGui iOS+OpenGL+Synergy binding
|
||||||
|
// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
// Providing a standalone iOS application with Synergy integration makes this sample more verbose than others. It also hasn't been tested as much.
|
||||||
|
// Refer to other examples to get an easier understanding of how to integrate ImGui into your existing application.
|
||||||
|
|
||||||
|
// by 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
|
@ -1,6 +1,7 @@
|
|||||||
//
|
// ImGui iOS+OpenGL+Synergy binding
|
||||||
// imgui_impl_ios.cpp
|
// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
// imguiex
|
// Providing a standalone iOS application with Synergy integration makes this sample more verbose than others. It also hasn't been tested as much.
|
||||||
|
// Refer to other examples to get an easier understanding of how to integrate ImGui into your existing application.
|
||||||
|
|
||||||
#import <OpenGLES/ES3/gl.h>
|
#import <OpenGLES/ES3/gl.h>
|
||||||
#import <OpenGLES/ES3/glext.h>
|
#import <OpenGLES/ES3/glext.h>
|
||||||
@ -262,10 +263,10 @@ void ImGui_KeyboardCallback(uSynergyCookie cookie, uint16_t key,
|
|||||||
// printf("Synergy: keyboard callback: 0x%02X (%s)", scanCode, down?"true":"false");
|
// printf("Synergy: keyboard callback: 0x%02X (%s)", scanCode, down?"true":"false");
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
io.KeysDown[key] = down;
|
io.KeysDown[key] = down;
|
||||||
io.KeyShift = modifiers & USYNERGY_MODIFIER_SHIFT;
|
io.KeyShift = (modifiers & USYNERGY_MODIFIER_SHIFT);
|
||||||
io.KeyCtrl = modifiers & USYNERGY_MODIFIER_CTRL;
|
io.KeyCtrl = (modifiers & USYNERGY_MODIFIER_CTRL);
|
||||||
io.KeyAlt = modifiers & USYNERGY_MODIFIER_ALT;
|
io.KeyAlt = (modifiers & USYNERGY_MODIFIER_ALT);
|
||||||
|
io.KeySuper = (modifiers & USYNERGY_MODIFIER_WIN);
|
||||||
|
|
||||||
// Add this as keyboard input
|
// Add this as keyboard input
|
||||||
if ((down) && (key) && (scanCode<256) && !(modifiers & USYNERGY_MODIFIER_CTRL))
|
if ((down) && (key) && (scanCode<256) && !(modifiers & USYNERGY_MODIFIER_CTRL))
|
15
examples/apple_example/imguiex-osx/AppDelegate.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
//
|
||||||
|
// AppDelegate.h
|
||||||
|
// imguiex-osx
|
||||||
|
//
|
||||||
|
// Created by James Chen on 4/5/16.
|
||||||
|
// Copyright © 2016 Joel Davis. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
@interface AppDelegate : NSObject <NSApplicationDelegate>
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
26
examples/apple_example/imguiex-osx/AppDelegate.m
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
//
|
||||||
|
// AppDelegate.m
|
||||||
|
// imguiex-osx
|
||||||
|
//
|
||||||
|
// Created by James Chen on 4/5/16.
|
||||||
|
// Copyright © 2016 Joel Davis. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "AppDelegate.h"
|
||||||
|
|
||||||
|
@interface AppDelegate ()
|
||||||
|
|
||||||
|
@property (weak) IBOutlet NSWindow *window;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation AppDelegate
|
||||||
|
|
||||||
|
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
||||||
|
// Insert code here to initialize your application
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)applicationWillTerminate:(NSNotification *)aNotification {
|
||||||
|
// Insert code here to tear down your application
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "mac",
|
||||||
|
"size" : "16x16",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "mac",
|
||||||
|
"size" : "16x16",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "mac",
|
||||||
|
"size" : "32x32",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "mac",
|
||||||
|
"size" : "32x32",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "mac",
|
||||||
|
"size" : "128x128",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "mac",
|
||||||
|
"size" : "128x128",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "mac",
|
||||||
|
"size" : "256x256",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "mac",
|
||||||
|
"size" : "256x256",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "mac",
|
||||||
|
"size" : "512x512",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "512x512",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "icon_imgui_180x180.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "mac",
|
||||||
|
"size" : "512x512",
|
||||||
|
"scale" : "2x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"version" : 1,
|
||||||
|
"author" : "xcode"
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 5.8 KiB |
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"version" : 1,
|
||||||
|
"author" : "xcode"
|
||||||
|
}
|
||||||
|
}
|
34
examples/apple_example/imguiex-osx/Info.plist
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?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>CFBundleIconFile</key>
|
||||||
|
<string></string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</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>LSMinimumSystemVersion</key>
|
||||||
|
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string>Copyright © 2016 Joel Davis. All rights reserved.</string>
|
||||||
|
<key>NSMainNibFile</key>
|
||||||
|
<string>MainMenu</string>
|
||||||
|
<key>NSPrincipalClass</key>
|
||||||
|
<string>NSApplication</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
13
examples/apple_example/imguiex-osx/main.m
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
//
|
||||||
|
// main.m
|
||||||
|
// imguiex-osx
|
||||||
|
//
|
||||||
|
// Created by James Chen on 4/5/16.
|
||||||
|
// Copyright © 2016 Joel Davis. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
int main(int argc, const char * argv[]) {
|
||||||
|
return NSApplicationMain(argc, argv);
|
||||||
|
}
|
@ -9,6 +9,16 @@
|
|||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
197E1E871B8943FE00E3FE6A /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 197E1E861B8943FE00E3FE6A /* imgui_draw.cpp */; };
|
197E1E871B8943FE00E3FE6A /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 197E1E861B8943FE00E3FE6A /* imgui_draw.cpp */; };
|
||||||
197E1E891B89443600E3FE6A /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 197E1E881B89443600E3FE6A /* imgui_demo.cpp */; };
|
197E1E891B89443600E3FE6A /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 197E1E881B89443600E3FE6A /* imgui_demo.cpp */; };
|
||||||
|
1A1A0F231CB39FB50090F036 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A1A0F221CB39FB50090F036 /* AppDelegate.m */; };
|
||||||
|
1A1A0F281CB39FB50090F036 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1A1A0F271CB39FB50090F036 /* Assets.xcassets */; };
|
||||||
|
1A1A0F301CB3A0DA0090F036 /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 197E1E861B8943FE00E3FE6A /* imgui_draw.cpp */; };
|
||||||
|
1A1A0F311CB3A0DA0090F036 /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5861B2E64AB00C130BA /* imgui.cpp */; };
|
||||||
|
1A1A0F321CB3A0DE0090F036 /* uSynergy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6D1E39151B35EEF10017B40F /* uSynergy.c */; };
|
||||||
|
1A1A0F331CB3A0E10090F036 /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 197E1E881B89443600E3FE6A /* imgui_demo.cpp */; };
|
||||||
|
1A1A0F341CB3A0EC0090F036 /* debug_hud.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5891B2E6A5500C130BA /* debug_hud.cpp */; };
|
||||||
|
1A1A0F481CB3A2E50090F036 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A1A0F391CB3A1B20090F036 /* main.cpp */; };
|
||||||
|
1A1A0F4A1CB3A5070090F036 /* imgui_impl_glfw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A1A0F371CB3A1B20090F036 /* imgui_impl_glfw.cpp */; };
|
||||||
|
1A1A0F4E1CB3C54D0090F036 /* libglfw3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A1A0F4D1CB3C54D0090F036 /* libglfw3.dylib */; };
|
||||||
6D1E39171B35EEF10017B40F /* uSynergy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6D1E39151B35EEF10017B40F /* uSynergy.c */; };
|
6D1E39171B35EEF10017B40F /* uSynergy.c in Sources */ = {isa = PBXBuildFile; fileRef = 6D1E39151B35EEF10017B40F /* uSynergy.c */; };
|
||||||
6D2FC55A1B2E632000C130BA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5591B2E632000C130BA /* main.m */; };
|
6D2FC55A1B2E632000C130BA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC5591B2E632000C130BA /* main.m */; };
|
||||||
6D2FC55D1B2E632000C130BA /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC55C1B2E632000C130BA /* AppDelegate.m */; };
|
6D2FC55D1B2E632000C130BA /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D2FC55C1B2E632000C130BA /* AppDelegate.m */; };
|
||||||
@ -28,9 +38,18 @@
|
|||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
197E1E861B8943FE00E3FE6A /* imgui_draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_draw.cpp; path = ../../imgui_draw.cpp; sourceTree = "<group>"; };
|
197E1E861B8943FE00E3FE6A /* imgui_draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_draw.cpp; path = ../../imgui_draw.cpp; sourceTree = "<group>"; };
|
||||||
197E1E881B89443600E3FE6A /* imgui_demo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_demo.cpp; path = ../../../imgui_demo.cpp; sourceTree = "<group>"; };
|
197E1E881B89443600E3FE6A /* imgui_demo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_demo.cpp; path = ../../../imgui_demo.cpp; sourceTree = "<group>"; };
|
||||||
|
1A1A0F1F1CB39FB50090F036 /* imguiex-osx.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "imguiex-osx.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
1A1A0F211CB39FB50090F036 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
|
||||||
|
1A1A0F221CB39FB50090F036 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
|
||||||
|
1A1A0F271CB39FB50090F036 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
|
1A1A0F2C1CB39FB50090F036 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
1A1A0F371CB3A1B20090F036 /* imgui_impl_glfw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = imgui_impl_glfw.cpp; sourceTree = "<group>"; };
|
||||||
|
1A1A0F381CB3A1B20090F036 /* imgui_impl_glfw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = imgui_impl_glfw.h; sourceTree = "<group>"; };
|
||||||
|
1A1A0F391CB3A1B20090F036 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; };
|
||||||
|
1A1A0F4D1CB3C54D0090F036 /* libglfw3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libglfw3.dylib; path = /usr/local/lib/libglfw3.dylib; sourceTree = "<absolute>"; };
|
||||||
6D1E39151B35EEF10017B40F /* uSynergy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = uSynergy.c; sourceTree = "<group>"; };
|
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>"; };
|
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; };
|
6D2FC5541B2E632000C130BA /* imguiex-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "imguiex-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
6D2FC5581B2E632000C130BA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
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>"; };
|
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>"; };
|
6D2FC55B1B2E632000C130BA /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
|
||||||
@ -54,6 +73,14 @@
|
|||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
1A1A0F1C1CB39FB50090F036 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
1A1A0F4E1CB3C54D0090F036 /* libglfw3.dylib in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
6D2FC5511B2E632000C130BA /* Frameworks */ = {
|
6D2FC5511B2E632000C130BA /* Frameworks */ = {
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@ -66,6 +93,38 @@
|
|||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
|
1A1A0F201CB39FB50090F036 /* imguiex-osx */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
1A1A0F4D1CB3C54D0090F036 /* libglfw3.dylib */,
|
||||||
|
1A1A0F351CB3A1B20090F036 /* opengl_example */,
|
||||||
|
1A1A0F211CB39FB50090F036 /* AppDelegate.h */,
|
||||||
|
1A1A0F221CB39FB50090F036 /* AppDelegate.m */,
|
||||||
|
1A1A0F271CB39FB50090F036 /* Assets.xcassets */,
|
||||||
|
1A1A0F2C1CB39FB50090F036 /* Info.plist */,
|
||||||
|
1A1A0F241CB39FB50090F036 /* Supporting Files */,
|
||||||
|
);
|
||||||
|
path = "imguiex-osx";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
1A1A0F241CB39FB50090F036 /* Supporting Files */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
);
|
||||||
|
name = "Supporting Files";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
1A1A0F351CB3A1B20090F036 /* opengl_example */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
1A1A0F371CB3A1B20090F036 /* imgui_impl_glfw.cpp */,
|
||||||
|
1A1A0F381CB3A1B20090F036 /* imgui_impl_glfw.h */,
|
||||||
|
1A1A0F391CB3A1B20090F036 /* main.cpp */,
|
||||||
|
);
|
||||||
|
name = opengl_example;
|
||||||
|
path = ../../opengl_example;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
6D1E39141B35EEF10017B40F /* usynergy */ = {
|
6D1E39141B35EEF10017B40F /* usynergy */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@ -81,7 +140,8 @@
|
|||||||
children = (
|
children = (
|
||||||
6D1E39141B35EEF10017B40F /* usynergy */,
|
6D1E39141B35EEF10017B40F /* usynergy */,
|
||||||
6D2FC5841B2E648D00C130BA /* imgui */,
|
6D2FC5841B2E648D00C130BA /* imgui */,
|
||||||
6D2FC5561B2E632000C130BA /* imguiex */,
|
6D2FC5561B2E632000C130BA /* imguiex-ios */,
|
||||||
|
1A1A0F201CB39FB50090F036 /* imguiex-osx */,
|
||||||
6D2FC5551B2E632000C130BA /* Products */,
|
6D2FC5551B2E632000C130BA /* Products */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -89,12 +149,13 @@
|
|||||||
6D2FC5551B2E632000C130BA /* Products */ = {
|
6D2FC5551B2E632000C130BA /* Products */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
6D2FC5541B2E632000C130BA /* imguiex.app */,
|
6D2FC5541B2E632000C130BA /* imguiex-ios.app */,
|
||||||
|
1A1A0F1F1CB39FB50090F036 /* imguiex-osx.app */,
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
6D2FC5561B2E632000C130BA /* imguiex */ = {
|
6D2FC5561B2E632000C130BA /* imguiex-ios */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
6D2FC5811B2E63A100C130BA /* imgui_impl_ios.mm */,
|
6D2FC5811B2E63A100C130BA /* imgui_impl_ios.mm */,
|
||||||
@ -113,7 +174,7 @@
|
|||||||
6D2FC56A1B2E632000C130BA /* LaunchScreen.xib */,
|
6D2FC56A1B2E632000C130BA /* LaunchScreen.xib */,
|
||||||
6D2FC5571B2E632000C130BA /* Supporting Files */,
|
6D2FC5571B2E632000C130BA /* Supporting Files */,
|
||||||
);
|
);
|
||||||
path = imguiex;
|
path = "imguiex-ios";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
6D2FC5571B2E632000C130BA /* Supporting Files */ = {
|
6D2FC5571B2E632000C130BA /* Supporting Files */ = {
|
||||||
@ -141,9 +202,26 @@
|
|||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
6D2FC5531B2E632000C130BA /* imguiex */ = {
|
1A1A0F1E1CB39FB50090F036 /* imguiex-osx */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 6D2FC57B1B2E632000C130BA /* Build configuration list for PBXNativeTarget "imguiex" */;
|
buildConfigurationList = 1A1A0F2F1CB39FB50090F036 /* Build configuration list for PBXNativeTarget "imguiex-osx" */;
|
||||||
|
buildPhases = (
|
||||||
|
1A1A0F1B1CB39FB50090F036 /* Sources */,
|
||||||
|
1A1A0F1C1CB39FB50090F036 /* Frameworks */,
|
||||||
|
1A1A0F1D1CB39FB50090F036 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = "imguiex-osx";
|
||||||
|
productName = "imguiex-osx";
|
||||||
|
productReference = 1A1A0F1F1CB39FB50090F036 /* imguiex-osx.app */;
|
||||||
|
productType = "com.apple.product-type.application";
|
||||||
|
};
|
||||||
|
6D2FC5531B2E632000C130BA /* imguiex-ios */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 6D2FC57B1B2E632000C130BA /* Build configuration list for PBXNativeTarget "imguiex-ios" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
6D2FC5501B2E632000C130BA /* Sources */,
|
6D2FC5501B2E632000C130BA /* Sources */,
|
||||||
6D2FC5511B2E632000C130BA /* Frameworks */,
|
6D2FC5511B2E632000C130BA /* Frameworks */,
|
||||||
@ -153,9 +231,9 @@
|
|||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
);
|
);
|
||||||
name = imguiex;
|
name = "imguiex-ios";
|
||||||
productName = imguiex;
|
productName = imguiex;
|
||||||
productReference = 6D2FC5541B2E632000C130BA /* imguiex.app */;
|
productReference = 6D2FC5541B2E632000C130BA /* imguiex-ios.app */;
|
||||||
productType = "com.apple.product-type.application";
|
productType = "com.apple.product-type.application";
|
||||||
};
|
};
|
||||||
/* End PBXNativeTarget section */
|
/* End PBXNativeTarget section */
|
||||||
@ -167,6 +245,9 @@
|
|||||||
LastUpgradeCheck = 0630;
|
LastUpgradeCheck = 0630;
|
||||||
ORGANIZATIONNAME = "Joel Davis";
|
ORGANIZATIONNAME = "Joel Davis";
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
|
1A1A0F1E1CB39FB50090F036 = {
|
||||||
|
CreatedOnToolsVersion = 7.3;
|
||||||
|
};
|
||||||
6D2FC5531B2E632000C130BA = {
|
6D2FC5531B2E632000C130BA = {
|
||||||
CreatedOnToolsVersion = 6.3.2;
|
CreatedOnToolsVersion = 6.3.2;
|
||||||
};
|
};
|
||||||
@ -185,12 +266,21 @@
|
|||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
targets = (
|
targets = (
|
||||||
6D2FC5531B2E632000C130BA /* imguiex */,
|
6D2FC5531B2E632000C130BA /* imguiex-ios */,
|
||||||
|
1A1A0F1E1CB39FB50090F036 /* imguiex-osx */,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
1A1A0F1D1CB39FB50090F036 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
1A1A0F281CB39FB50090F036 /* Assets.xcassets in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
6D2FC5521B2E632000C130BA /* Resources */ = {
|
6D2FC5521B2E632000C130BA /* Resources */ = {
|
||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@ -206,6 +296,21 @@
|
|||||||
/* End PBXResourcesBuildPhase section */
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
1A1A0F1B1CB39FB50090F036 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
1A1A0F301CB3A0DA0090F036 /* imgui_draw.cpp in Sources */,
|
||||||
|
1A1A0F311CB3A0DA0090F036 /* imgui.cpp in Sources */,
|
||||||
|
1A1A0F331CB3A0E10090F036 /* imgui_demo.cpp in Sources */,
|
||||||
|
1A1A0F341CB3A0EC0090F036 /* debug_hud.cpp in Sources */,
|
||||||
|
1A1A0F481CB3A2E50090F036 /* main.cpp in Sources */,
|
||||||
|
1A1A0F321CB3A0DE0090F036 /* uSynergy.c in Sources */,
|
||||||
|
1A1A0F231CB39FB50090F036 /* AppDelegate.m in Sources */,
|
||||||
|
1A1A0F4A1CB3A5070090F036 /* imgui_impl_glfw.cpp in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
6D2FC5501B2E632000C130BA /* Sources */ = {
|
6D2FC5501B2E632000C130BA /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@ -244,6 +349,54 @@
|
|||||||
/* End PBXVariantGroup section */
|
/* End PBXVariantGroup section */
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
|
1A1A0F2D1CB39FB50090F036 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "-";
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
ENABLE_TESTABILITY = YES;
|
||||||
|
HEADER_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(SRCROOT)/../../",
|
||||||
|
/usr/local/include,
|
||||||
|
);
|
||||||
|
INFOPLIST_FILE = "imguiex-osx/Info.plist";
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
|
||||||
|
LIBRARY_SEARCH_PATHS = /usr/local/lib;
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.imguiex.imguiex-osx";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SDKROOT = macosx;
|
||||||
|
USER_HEADER_SEARCH_PATHS = "";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
1A1A0F2E1CB39FB50090F036 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "-";
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
HEADER_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(SRCROOT)/../../",
|
||||||
|
/usr/local/include,
|
||||||
|
);
|
||||||
|
INFOPLIST_FILE = "imguiex-osx/Info.plist";
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
|
||||||
|
LIBRARY_SEARCH_PATHS = /usr/local/lib;
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.imguiex.imguiex-osx";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SDKROOT = macosx;
|
||||||
|
USER_HEADER_SEARCH_PATHS = "";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
6D2FC5791B2E632000C130BA /* Debug */ = {
|
6D2FC5791B2E632000C130BA /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
@ -280,11 +433,13 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
USER_HEADER_SEARCH_PATHS = "";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
@ -318,10 +473,12 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
USER_HEADER_SEARCH_PATHS = "";
|
||||||
VALIDATE_PRODUCT = YES;
|
VALIDATE_PRODUCT = YES;
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
@ -330,7 +487,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
INFOPLIST_FILE = imguiex/Info.plist;
|
INFOPLIST_FILE = "imguiex-ios/Info.plist";
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
};
|
};
|
||||||
@ -340,7 +497,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
INFOPLIST_FILE = imguiex/Info.plist;
|
INFOPLIST_FILE = "imguiex-ios/Info.plist";
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
};
|
};
|
||||||
@ -349,6 +506,15 @@
|
|||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
|
1A1A0F2F1CB39FB50090F036 /* Build configuration list for PBXNativeTarget "imguiex-osx" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
1A1A0F2D1CB39FB50090F036 /* Debug */,
|
||||||
|
1A1A0F2E1CB39FB50090F036 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
6D2FC54F1B2E632000C130BA /* Build configuration list for PBXProject "imguiex" */ = {
|
6D2FC54F1B2E632000C130BA /* Build configuration list for PBXProject "imguiex" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
@ -358,7 +524,7 @@
|
|||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
6D2FC57B1B2E632000C130BA /* Build configuration list for PBXNativeTarget "imguiex" */ = {
|
6D2FC57B1B2E632000C130BA /* Build configuration list for PBXNativeTarget "imguiex-ios" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
6D2FC57C1B2E632000C130BA /* Debug */,
|
6D2FC57C1B2E632000C130BA /* Debug */,
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui Win32 + DirectX10 binding
|
// ImGui Win32 + DirectX10 binding
|
||||||
|
// In this binding, ImTextureID is used to store a 'ID3D10ShaderResourceView*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
@ -44,6 +46,8 @@ struct VERTEX_CONSTANT_BUFFER
|
|||||||
// - 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)
|
||||||
void ImGui_ImplDX10_RenderDrawLists(ImDrawData* draw_data)
|
void ImGui_ImplDX10_RenderDrawLists(ImDrawData* draw_data)
|
||||||
{
|
{
|
||||||
|
ID3D10Device* ctx = g_pd3dDevice;
|
||||||
|
|
||||||
// Create and grow vertex/index buffers if needed
|
// Create and grow vertex/index buffers if needed
|
||||||
if (!g_pVB || g_VertexBufferSize < draw_data->TotalVtxCount)
|
if (!g_pVB || g_VertexBufferSize < draw_data->TotalVtxCount)
|
||||||
{
|
{
|
||||||
@ -56,7 +60,7 @@ void ImGui_ImplDX10_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
desc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
|
desc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
|
||||||
desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
|
desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
|
||||||
desc.MiscFlags = 0;
|
desc.MiscFlags = 0;
|
||||||
if (g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pVB) < 0)
|
if (ctx->CreateBuffer(&desc, NULL, &g_pVB) < 0)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,13 +68,13 @@ void ImGui_ImplDX10_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
{
|
{
|
||||||
if (g_pIB) { g_pIB->Release(); g_pIB = NULL; }
|
if (g_pIB) { g_pIB->Release(); g_pIB = NULL; }
|
||||||
g_IndexBufferSize = draw_data->TotalIdxCount + 10000;
|
g_IndexBufferSize = draw_data->TotalIdxCount + 10000;
|
||||||
D3D10_BUFFER_DESC bufferDesc;
|
D3D10_BUFFER_DESC desc;
|
||||||
memset(&bufferDesc, 0, sizeof(D3D10_BUFFER_DESC));
|
memset(&desc, 0, sizeof(D3D10_BUFFER_DESC));
|
||||||
bufferDesc.Usage = D3D10_USAGE_DYNAMIC;
|
desc.Usage = D3D10_USAGE_DYNAMIC;
|
||||||
bufferDesc.ByteWidth = g_IndexBufferSize * sizeof(ImDrawIdx);
|
desc.ByteWidth = g_IndexBufferSize * sizeof(ImDrawIdx);
|
||||||
bufferDesc.BindFlags = D3D10_BIND_INDEX_BUFFER;
|
desc.BindFlags = D3D10_BIND_INDEX_BUFFER;
|
||||||
bufferDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
|
desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
|
||||||
if (g_pd3dDevice->CreateBuffer(&bufferDesc, NULL, &g_pIB) < 0)
|
if (ctx->CreateBuffer(&desc, NULL, &g_pIB) < 0)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,7 +83,6 @@ void ImGui_ImplDX10_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
ImDrawIdx* idx_dst = NULL;
|
ImDrawIdx* idx_dst = NULL;
|
||||||
g_pVB->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&vtx_dst);
|
g_pVB->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&vtx_dst);
|
||||||
g_pIB->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&idx_dst);
|
g_pIB->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&idx_dst);
|
||||||
|
|
||||||
for (int n = 0; n < draw_data->CmdListsCount; n++)
|
for (int n = 0; n < draw_data->CmdListsCount; n++)
|
||||||
{
|
{
|
||||||
const ImDrawList* cmd_list = draw_data->CmdLists[n];
|
const ImDrawList* cmd_list = draw_data->CmdLists[n];
|
||||||
@ -93,11 +96,10 @@ void ImGui_ImplDX10_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
|
|
||||||
// Setup orthographic projection matrix into our constant buffer
|
// Setup orthographic projection matrix into our constant buffer
|
||||||
{
|
{
|
||||||
void* mappedResource;
|
void* mapped_resource;
|
||||||
if (g_pVertexConstantBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, &mappedResource) != S_OK)
|
if (g_pVertexConstantBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, &mapped_resource) != S_OK)
|
||||||
return;
|
return;
|
||||||
|
VERTEX_CONSTANT_BUFFER* constant_buffer = (VERTEX_CONSTANT_BUFFER*)mapped_resource;
|
||||||
VERTEX_CONSTANT_BUFFER* pConstantBuffer = (VERTEX_CONSTANT_BUFFER*)mappedResource;
|
|
||||||
const float L = 0.0f;
|
const float L = 0.0f;
|
||||||
const float R = ImGui::GetIO().DisplaySize.x;
|
const float R = ImGui::GetIO().DisplaySize.x;
|
||||||
const float B = ImGui::GetIO().DisplaySize.y;
|
const float B = ImGui::GetIO().DisplaySize.y;
|
||||||
@ -109,39 +111,72 @@ void ImGui_ImplDX10_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
{ 0.0f, 0.0f, 0.5f, 0.0f },
|
{ 0.0f, 0.0f, 0.5f, 0.0f },
|
||||||
{ (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
|
{ (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
|
||||||
};
|
};
|
||||||
memcpy(&pConstantBuffer->mvp, mvp, sizeof(mvp));
|
memcpy(&constant_buffer->mvp, mvp, sizeof(mvp));
|
||||||
g_pVertexConstantBuffer->Unmap();
|
g_pVertexConstantBuffer->Unmap();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup viewport
|
// Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!)
|
||||||
|
struct BACKUP_DX10_STATE
|
||||||
{
|
{
|
||||||
D3D10_VIEWPORT vp;
|
UINT ScissorRectsCount, ViewportsCount;
|
||||||
memset(&vp, 0, sizeof(D3D10_VIEWPORT));
|
D3D10_RECT ScissorRects[D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
|
||||||
vp.Width = (UINT)ImGui::GetIO().DisplaySize.x;
|
D3D10_VIEWPORT Viewports[D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
|
||||||
vp.Height = (UINT)ImGui::GetIO().DisplaySize.y;
|
ID3D10RasterizerState* RS;
|
||||||
vp.MinDepth = 0.0f;
|
ID3D10BlendState* BlendState;
|
||||||
vp.MaxDepth = 1.0f;
|
FLOAT BlendFactor[4];
|
||||||
vp.TopLeftX = 0;
|
UINT SampleMask;
|
||||||
vp.TopLeftY = 0;
|
ID3D10ShaderResourceView* PSShaderResource;
|
||||||
g_pd3dDevice->RSSetViewports(1, &vp);
|
ID3D10SamplerState* PSSampler;
|
||||||
}
|
ID3D10PixelShader* PS;
|
||||||
|
ID3D10VertexShader* VS;
|
||||||
|
D3D10_PRIMITIVE_TOPOLOGY PrimitiveTopology;
|
||||||
|
ID3D10Buffer* IndexBuffer, *VertexBuffer, *VSConstantBuffer;
|
||||||
|
UINT IndexBufferOffset, VertexBufferStride, VertexBufferOffset;
|
||||||
|
DXGI_FORMAT IndexBufferFormat;
|
||||||
|
ID3D10InputLayout* InputLayout;
|
||||||
|
};
|
||||||
|
BACKUP_DX10_STATE old;
|
||||||
|
old.ScissorRectsCount = old.ViewportsCount = D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE;
|
||||||
|
ctx->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects);
|
||||||
|
ctx->RSGetViewports(&old.ViewportsCount, old.Viewports);
|
||||||
|
ctx->RSGetState(&old.RS);
|
||||||
|
ctx->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask);
|
||||||
|
ctx->PSGetShaderResources(0, 1, &old.PSShaderResource);
|
||||||
|
ctx->PSGetSamplers(0, 1, &old.PSSampler);
|
||||||
|
ctx->PSGetShader(&old.PS);
|
||||||
|
ctx->VSGetShader(&old.VS);
|
||||||
|
ctx->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer);
|
||||||
|
ctx->IAGetPrimitiveTopology(&old.PrimitiveTopology);
|
||||||
|
ctx->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset);
|
||||||
|
ctx->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset);
|
||||||
|
ctx->IAGetInputLayout(&old.InputLayout);
|
||||||
|
|
||||||
|
// Setup viewport
|
||||||
|
D3D10_VIEWPORT vp;
|
||||||
|
memset(&vp, 0, sizeof(D3D10_VIEWPORT));
|
||||||
|
vp.Width = (UINT)ImGui::GetIO().DisplaySize.x;
|
||||||
|
vp.Height = (UINT)ImGui::GetIO().DisplaySize.y;
|
||||||
|
vp.MinDepth = 0.0f;
|
||||||
|
vp.MaxDepth = 1.0f;
|
||||||
|
vp.TopLeftX = vp.TopLeftY = 0;
|
||||||
|
ctx->RSSetViewports(1, &vp);
|
||||||
|
|
||||||
// Bind shader and vertex buffers
|
// Bind shader and vertex buffers
|
||||||
unsigned int stride = sizeof(ImDrawVert);
|
unsigned int stride = sizeof(ImDrawVert);
|
||||||
unsigned int offset = 0;
|
unsigned int offset = 0;
|
||||||
g_pd3dDevice->IASetInputLayout(g_pInputLayout);
|
ctx->IASetInputLayout(g_pInputLayout);
|
||||||
g_pd3dDevice->IASetVertexBuffers(0, 1, &g_pVB, &stride, &offset);
|
ctx->IASetVertexBuffers(0, 1, &g_pVB, &stride, &offset);
|
||||||
g_pd3dDevice->IASetIndexBuffer(g_pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0);
|
ctx->IASetIndexBuffer(g_pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0);
|
||||||
g_pd3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
ctx->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
||||||
g_pd3dDevice->VSSetShader(g_pVertexShader);
|
ctx->VSSetShader(g_pVertexShader);
|
||||||
g_pd3dDevice->VSSetConstantBuffers(0, 1, &g_pVertexConstantBuffer);
|
ctx->VSSetConstantBuffers(0, 1, &g_pVertexConstantBuffer);
|
||||||
g_pd3dDevice->PSSetShader(g_pPixelShader);
|
ctx->PSSetShader(g_pPixelShader);
|
||||||
g_pd3dDevice->PSSetSamplers(0, 1, &g_pFontSampler);
|
ctx->PSSetSamplers(0, 1, &g_pFontSampler);
|
||||||
|
|
||||||
// Setup render state
|
// Setup render state
|
||||||
const float blendFactor[4] = { 0.f, 0.f, 0.f, 0.f };
|
const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f };
|
||||||
g_pd3dDevice->OMSetBlendState(g_pBlendState, blendFactor, 0xffffffff);
|
ctx->OMSetBlendState(g_pBlendState, blend_factor, 0xffffffff);
|
||||||
g_pd3dDevice->RSSetState(g_pRasterizerState);
|
ctx->RSSetState(g_pRasterizerState);
|
||||||
|
|
||||||
// Render command lists
|
// Render command lists
|
||||||
int vtx_offset = 0;
|
int vtx_offset = 0;
|
||||||
@ -159,19 +194,29 @@ void ImGui_ImplDX10_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
const D3D10_RECT r = { (LONG)pcmd->ClipRect.x, (LONG)pcmd->ClipRect.y, (LONG)pcmd->ClipRect.z, (LONG)pcmd->ClipRect.w };
|
const D3D10_RECT r = { (LONG)pcmd->ClipRect.x, (LONG)pcmd->ClipRect.y, (LONG)pcmd->ClipRect.z, (LONG)pcmd->ClipRect.w };
|
||||||
g_pd3dDevice->PSSetShaderResources(0, 1, (ID3D10ShaderResourceView**)&pcmd->TextureId);
|
ctx->PSSetShaderResources(0, 1, (ID3D10ShaderResourceView**)&pcmd->TextureId);
|
||||||
g_pd3dDevice->RSSetScissorRects(1, &r);
|
ctx->RSSetScissorRects(1, &r);
|
||||||
g_pd3dDevice->DrawIndexed(pcmd->ElemCount, idx_offset, vtx_offset);
|
ctx->DrawIndexed(pcmd->ElemCount, idx_offset, vtx_offset);
|
||||||
}
|
}
|
||||||
idx_offset += pcmd->ElemCount;
|
idx_offset += pcmd->ElemCount;
|
||||||
}
|
}
|
||||||
vtx_offset += cmd_list->VtxBuffer.size();
|
vtx_offset += cmd_list->VtxBuffer.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore modified state
|
// Restore modified DX state
|
||||||
g_pd3dDevice->IASetInputLayout(NULL);
|
ctx->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects);
|
||||||
g_pd3dDevice->PSSetShader(NULL);
|
ctx->RSSetViewports(old.ViewportsCount, old.Viewports);
|
||||||
g_pd3dDevice->VSSetShader(NULL);
|
ctx->RSSetState(old.RS); if (old.RS) old.RS->Release();
|
||||||
|
ctx->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release();
|
||||||
|
ctx->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release();
|
||||||
|
ctx->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release();
|
||||||
|
ctx->PSSetShader(old.PS); if (old.PS) old.PS->Release();
|
||||||
|
ctx->VSSetShader(old.VS); if (old.VS) old.VS->Release();
|
||||||
|
ctx->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release();
|
||||||
|
ctx->IASetPrimitiveTopology(old.PrimitiveTopology);
|
||||||
|
ctx->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release();
|
||||||
|
ctx->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release();
|
||||||
|
ctx->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
IMGUI_API LRESULT ImGui_ImplDX10_WndProcHandler(HWND, UINT msg, WPARAM wParam, LPARAM lParam)
|
IMGUI_API LRESULT ImGui_ImplDX10_WndProcHandler(HWND, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
@ -232,33 +277,33 @@ static void ImGui_ImplDX10_CreateFontsTexture()
|
|||||||
|
|
||||||
// Create DX10 texture
|
// Create DX10 texture
|
||||||
{
|
{
|
||||||
D3D10_TEXTURE2D_DESC texDesc;
|
D3D10_TEXTURE2D_DESC desc;
|
||||||
ZeroMemory(&texDesc, sizeof(texDesc));
|
ZeroMemory(&desc, sizeof(desc));
|
||||||
texDesc.Width = width;
|
desc.Width = width;
|
||||||
texDesc.Height = height;
|
desc.Height = height;
|
||||||
texDesc.MipLevels = 1;
|
desc.MipLevels = 1;
|
||||||
texDesc.ArraySize = 1;
|
desc.ArraySize = 1;
|
||||||
texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
texDesc.SampleDesc.Count = 1;
|
desc.SampleDesc.Count = 1;
|
||||||
texDesc.Usage = D3D10_USAGE_DEFAULT;
|
desc.Usage = D3D10_USAGE_DEFAULT;
|
||||||
texDesc.BindFlags = D3D10_BIND_SHADER_RESOURCE;
|
desc.BindFlags = D3D10_BIND_SHADER_RESOURCE;
|
||||||
texDesc.CPUAccessFlags = 0;
|
desc.CPUAccessFlags = 0;
|
||||||
|
|
||||||
ID3D10Texture2D *pTexture = NULL;
|
ID3D10Texture2D *pTexture = NULL;
|
||||||
D3D10_SUBRESOURCE_DATA subResource;
|
D3D10_SUBRESOURCE_DATA subResource;
|
||||||
subResource.pSysMem = pixels;
|
subResource.pSysMem = pixels;
|
||||||
subResource.SysMemPitch = texDesc.Width * 4;
|
subResource.SysMemPitch = desc.Width * 4;
|
||||||
subResource.SysMemSlicePitch = 0;
|
subResource.SysMemSlicePitch = 0;
|
||||||
g_pd3dDevice->CreateTexture2D(&texDesc, &subResource, &pTexture);
|
g_pd3dDevice->CreateTexture2D(&desc, &subResource, &pTexture);
|
||||||
|
|
||||||
// Create texture view
|
// Create texture view
|
||||||
D3D10_SHADER_RESOURCE_VIEW_DESC srvDesc;
|
D3D10_SHADER_RESOURCE_VIEW_DESC srv_desc;
|
||||||
ZeroMemory(&srvDesc, sizeof(srvDesc));
|
ZeroMemory(&srv_desc, sizeof(srv_desc));
|
||||||
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
srv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
srvDesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D;
|
srv_desc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D;
|
||||||
srvDesc.Texture2D.MipLevels = texDesc.MipLevels;
|
srv_desc.Texture2D.MipLevels = desc.MipLevels;
|
||||||
srvDesc.Texture2D.MostDetailedMip = 0;
|
srv_desc.Texture2D.MostDetailedMip = 0;
|
||||||
g_pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &g_pFontTextureView);
|
g_pd3dDevice->CreateShaderResourceView(pTexture, &srv_desc, &g_pFontTextureView);
|
||||||
pTexture->Release();
|
pTexture->Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -267,17 +312,17 @@ static void ImGui_ImplDX10_CreateFontsTexture()
|
|||||||
|
|
||||||
// Create texture sampler
|
// Create texture sampler
|
||||||
{
|
{
|
||||||
D3D10_SAMPLER_DESC samplerDesc;
|
D3D10_SAMPLER_DESC desc;
|
||||||
ZeroMemory(&samplerDesc, sizeof(samplerDesc));
|
ZeroMemory(&desc, sizeof(desc));
|
||||||
samplerDesc.Filter = D3D10_FILTER_MIN_MAG_MIP_LINEAR;
|
desc.Filter = D3D10_FILTER_MIN_MAG_MIP_LINEAR;
|
||||||
samplerDesc.AddressU = D3D10_TEXTURE_ADDRESS_WRAP;
|
desc.AddressU = D3D10_TEXTURE_ADDRESS_WRAP;
|
||||||
samplerDesc.AddressV = D3D10_TEXTURE_ADDRESS_WRAP;
|
desc.AddressV = D3D10_TEXTURE_ADDRESS_WRAP;
|
||||||
samplerDesc.AddressW = D3D10_TEXTURE_ADDRESS_WRAP;
|
desc.AddressW = D3D10_TEXTURE_ADDRESS_WRAP;
|
||||||
samplerDesc.MipLODBias = 0.f;
|
desc.MipLODBias = 0.f;
|
||||||
samplerDesc.ComparisonFunc = D3D10_COMPARISON_ALWAYS;
|
desc.ComparisonFunc = D3D10_COMPARISON_ALWAYS;
|
||||||
samplerDesc.MinLOD = 0.f;
|
desc.MinLOD = 0.f;
|
||||||
samplerDesc.MaxLOD = 0.f;
|
desc.MaxLOD = 0.f;
|
||||||
g_pd3dDevice->CreateSamplerState(&samplerDesc, &g_pFontSampler);
|
g_pd3dDevice->CreateSamplerState(&desc, &g_pFontSampler);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup (don't clear the input data if you want to append new fonts later)
|
// Cleanup (don't clear the input data if you want to append new fonts later)
|
||||||
@ -329,24 +374,24 @@ bool ImGui_ImplDX10_CreateDeviceObjects()
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Create the input layout
|
// Create the input layout
|
||||||
D3D10_INPUT_ELEMENT_DESC localLayout[] = {
|
D3D10_INPUT_ELEMENT_DESC local_layout[] =
|
||||||
|
{
|
||||||
{ "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (size_t)(&((ImDrawVert*)0)->pos), D3D10_INPUT_PER_VERTEX_DATA, 0 },
|
{ "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (size_t)(&((ImDrawVert*)0)->pos), D3D10_INPUT_PER_VERTEX_DATA, 0 },
|
||||||
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (size_t)(&((ImDrawVert*)0)->uv), D3D10_INPUT_PER_VERTEX_DATA, 0 },
|
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (size_t)(&((ImDrawVert*)0)->uv), D3D10_INPUT_PER_VERTEX_DATA, 0 },
|
||||||
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (size_t)(&((ImDrawVert*)0)->col), D3D10_INPUT_PER_VERTEX_DATA, 0 },
|
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (size_t)(&((ImDrawVert*)0)->col), D3D10_INPUT_PER_VERTEX_DATA, 0 },
|
||||||
};
|
};
|
||||||
|
if (g_pd3dDevice->CreateInputLayout(local_layout, 3, g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), &g_pInputLayout) != S_OK)
|
||||||
if (g_pd3dDevice->CreateInputLayout(localLayout, 3, g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), &g_pInputLayout) != S_OK)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Create the constant buffer
|
// Create the constant buffer
|
||||||
{
|
{
|
||||||
D3D10_BUFFER_DESC cbDesc;
|
D3D10_BUFFER_DESC desc;
|
||||||
cbDesc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER);
|
desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER);
|
||||||
cbDesc.Usage = D3D10_USAGE_DYNAMIC;
|
desc.Usage = D3D10_USAGE_DYNAMIC;
|
||||||
cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
|
desc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
|
||||||
cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
|
desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
|
||||||
cbDesc.MiscFlags = 0;
|
desc.MiscFlags = 0;
|
||||||
g_pd3dDevice->CreateBuffer(&cbDesc, NULL, &g_pVertexConstantBuffer);
|
g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pVertexConstantBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -474,7 +519,7 @@ void ImGui_ImplDX10_Shutdown()
|
|||||||
|
|
||||||
void ImGui_ImplDX10_NewFrame()
|
void ImGui_ImplDX10_NewFrame()
|
||||||
{
|
{
|
||||||
if (!g_pVB)
|
if (!g_pFontSampler)
|
||||||
ImGui_ImplDX10_CreateDeviceObjects();
|
ImGui_ImplDX10_CreateDeviceObjects();
|
||||||
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
@ -494,6 +539,7 @@ void ImGui_ImplDX10_NewFrame()
|
|||||||
io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
|
io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
|
||||||
io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
|
io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
|
||||||
io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;
|
io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;
|
||||||
|
io.KeySuper = false;
|
||||||
// io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events
|
// io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events
|
||||||
// io.MousePos : filled by WM_MOUSEMOVE events
|
// io.MousePos : filled by WM_MOUSEMOVE events
|
||||||
// io.MouseDown : filled by WM_*BUTTON* events
|
// io.MouseDown : filled by WM_*BUTTON* events
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui Win32 + DirectX10 binding
|
// ImGui Win32 + DirectX10 binding
|
||||||
|
// In this binding, ImTextureID is used to store a 'ID3D10ShaderResourceView*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui Win32 + DirectX11 binding
|
// ImGui Win32 + DirectX11 binding
|
||||||
|
// In this binding, ImTextureID is used to store a 'ID3D11ShaderResourceView*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
@ -44,6 +46,8 @@ struct VERTEX_CONSTANT_BUFFER
|
|||||||
// - 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)
|
||||||
void ImGui_ImplDX11_RenderDrawLists(ImDrawData* draw_data)
|
void ImGui_ImplDX11_RenderDrawLists(ImDrawData* draw_data)
|
||||||
{
|
{
|
||||||
|
ID3D11DeviceContext* ctx = g_pd3dDeviceContext;
|
||||||
|
|
||||||
// Create and grow vertex/index buffers if needed
|
// Create and grow vertex/index buffers if needed
|
||||||
if (!g_pVB || g_VertexBufferSize < draw_data->TotalVtxCount)
|
if (!g_pVB || g_VertexBufferSize < draw_data->TotalVtxCount)
|
||||||
{
|
{
|
||||||
@ -63,21 +67,21 @@ void ImGui_ImplDX11_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
{
|
{
|
||||||
if (g_pIB) { g_pIB->Release(); g_pIB = NULL; }
|
if (g_pIB) { g_pIB->Release(); g_pIB = NULL; }
|
||||||
g_IndexBufferSize = draw_data->TotalIdxCount + 10000;
|
g_IndexBufferSize = draw_data->TotalIdxCount + 10000;
|
||||||
D3D11_BUFFER_DESC bufferDesc;
|
D3D11_BUFFER_DESC desc;
|
||||||
memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC));
|
memset(&desc, 0, sizeof(D3D11_BUFFER_DESC));
|
||||||
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
|
desc.Usage = D3D11_USAGE_DYNAMIC;
|
||||||
bufferDesc.ByteWidth = g_IndexBufferSize * sizeof(ImDrawIdx);
|
desc.ByteWidth = g_IndexBufferSize * sizeof(ImDrawIdx);
|
||||||
bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
|
desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
|
||||||
bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
||||||
if (g_pd3dDevice->CreateBuffer(&bufferDesc, NULL, &g_pIB) < 0)
|
if (g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pIB) < 0)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy and convert all vertices into a single contiguous buffer
|
// Copy and convert all vertices into a single contiguous buffer
|
||||||
D3D11_MAPPED_SUBRESOURCE vtx_resource, idx_resource;
|
D3D11_MAPPED_SUBRESOURCE vtx_resource, idx_resource;
|
||||||
if (g_pd3dDeviceContext->Map(g_pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vtx_resource) != S_OK)
|
if (ctx->Map(g_pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vtx_resource) != S_OK)
|
||||||
return;
|
return;
|
||||||
if (g_pd3dDeviceContext->Map(g_pIB, 0, D3D11_MAP_WRITE_DISCARD, 0, &idx_resource) != S_OK)
|
if (ctx->Map(g_pIB, 0, D3D11_MAP_WRITE_DISCARD, 0, &idx_resource) != S_OK)
|
||||||
return;
|
return;
|
||||||
ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource.pData;
|
ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource.pData;
|
||||||
ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource.pData;
|
ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource.pData;
|
||||||
@ -89,60 +93,95 @@ void ImGui_ImplDX11_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
vtx_dst += cmd_list->VtxBuffer.size();
|
vtx_dst += cmd_list->VtxBuffer.size();
|
||||||
idx_dst += cmd_list->IdxBuffer.size();
|
idx_dst += cmd_list->IdxBuffer.size();
|
||||||
}
|
}
|
||||||
g_pd3dDeviceContext->Unmap(g_pVB, 0);
|
ctx->Unmap(g_pVB, 0);
|
||||||
g_pd3dDeviceContext->Unmap(g_pIB, 0);
|
ctx->Unmap(g_pIB, 0);
|
||||||
|
|
||||||
// Setup orthographic projection matrix into our constant buffer
|
// Setup orthographic projection matrix into our constant buffer
|
||||||
{
|
{
|
||||||
D3D11_MAPPED_SUBRESOURCE mappedResource;
|
D3D11_MAPPED_SUBRESOURCE mapped_resource;
|
||||||
if (g_pd3dDeviceContext->Map(g_pVertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource) != S_OK)
|
if (ctx->Map(g_pVertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_resource) != S_OK)
|
||||||
return;
|
return;
|
||||||
|
VERTEX_CONSTANT_BUFFER* constant_buffer = (VERTEX_CONSTANT_BUFFER*)mapped_resource.pData;
|
||||||
VERTEX_CONSTANT_BUFFER* pConstantBuffer = (VERTEX_CONSTANT_BUFFER*)mappedResource.pData;
|
float L = 0.0f;
|
||||||
const float L = 0.0f;
|
float R = ImGui::GetIO().DisplaySize.x;
|
||||||
const float R = ImGui::GetIO().DisplaySize.x;
|
float B = ImGui::GetIO().DisplaySize.y;
|
||||||
const float B = ImGui::GetIO().DisplaySize.y;
|
float T = 0.0f;
|
||||||
const float T = 0.0f;
|
float mvp[4][4] =
|
||||||
const float mvp[4][4] =
|
|
||||||
{
|
{
|
||||||
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
|
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
|
||||||
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
|
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
|
||||||
{ 0.0f, 0.0f, 0.5f, 0.0f },
|
{ 0.0f, 0.0f, 0.5f, 0.0f },
|
||||||
{ (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
|
{ (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
|
||||||
};
|
};
|
||||||
memcpy(&pConstantBuffer->mvp, mvp, sizeof(mvp));
|
memcpy(&constant_buffer->mvp, mvp, sizeof(mvp));
|
||||||
g_pd3dDeviceContext->Unmap(g_pVertexConstantBuffer, 0);
|
ctx->Unmap(g_pVertexConstantBuffer, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup viewport
|
// Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!)
|
||||||
|
struct BACKUP_DX11_STATE
|
||||||
{
|
{
|
||||||
D3D11_VIEWPORT vp;
|
UINT ScissorRectsCount, ViewportsCount;
|
||||||
memset(&vp, 0, sizeof(D3D11_VIEWPORT));
|
D3D11_RECT ScissorRects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
|
||||||
vp.Width = ImGui::GetIO().DisplaySize.x;
|
D3D11_VIEWPORT Viewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
|
||||||
vp.Height = ImGui::GetIO().DisplaySize.y;
|
ID3D11RasterizerState* RS;
|
||||||
vp.MinDepth = 0.0f;
|
ID3D11BlendState* BlendState;
|
||||||
vp.MaxDepth = 1.0f;
|
FLOAT BlendFactor[4];
|
||||||
vp.TopLeftX = 0;
|
UINT SampleMask;
|
||||||
vp.TopLeftY = 0;
|
ID3D11ShaderResourceView* PSShaderResource;
|
||||||
g_pd3dDeviceContext->RSSetViewports(1, &vp);
|
ID3D11SamplerState* PSSampler;
|
||||||
}
|
ID3D11PixelShader* PS;
|
||||||
|
ID3D11VertexShader* VS;
|
||||||
|
UINT PSInstancesCount, VSInstancesCount;
|
||||||
|
ID3D11ClassInstance* PSInstances[256], *VSInstances[256]; // 256 is max according to PSSetShader documentation
|
||||||
|
D3D11_PRIMITIVE_TOPOLOGY PrimitiveTopology;
|
||||||
|
ID3D11Buffer* IndexBuffer, *VertexBuffer, *VSConstantBuffer;
|
||||||
|
UINT IndexBufferOffset, VertexBufferStride, VertexBufferOffset;
|
||||||
|
DXGI_FORMAT IndexBufferFormat;
|
||||||
|
ID3D11InputLayout* InputLayout;
|
||||||
|
};
|
||||||
|
BACKUP_DX11_STATE old;
|
||||||
|
old.ScissorRectsCount = old.ViewportsCount = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE;
|
||||||
|
ctx->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects);
|
||||||
|
ctx->RSGetViewports(&old.ViewportsCount, old.Viewports);
|
||||||
|
ctx->RSGetState(&old.RS);
|
||||||
|
ctx->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask);
|
||||||
|
ctx->PSGetShaderResources(0, 1, &old.PSShaderResource);
|
||||||
|
ctx->PSGetSamplers(0, 1, &old.PSSampler);
|
||||||
|
old.PSInstancesCount = old.VSInstancesCount = 256;
|
||||||
|
ctx->PSGetShader(&old.PS, old.PSInstances, &old.PSInstancesCount);
|
||||||
|
ctx->VSGetShader(&old.VS, old.VSInstances, &old.VSInstancesCount);
|
||||||
|
ctx->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer);
|
||||||
|
ctx->IAGetPrimitiveTopology(&old.PrimitiveTopology);
|
||||||
|
ctx->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset);
|
||||||
|
ctx->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset);
|
||||||
|
ctx->IAGetInputLayout(&old.InputLayout);
|
||||||
|
|
||||||
|
// 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 = vp.TopLeftY = 0.0f;
|
||||||
|
ctx->RSSetViewports(1, &vp);
|
||||||
|
|
||||||
// Bind shader and vertex buffers
|
// Bind shader and vertex buffers
|
||||||
unsigned int stride = sizeof(ImDrawVert);
|
unsigned int stride = sizeof(ImDrawVert);
|
||||||
unsigned int offset = 0;
|
unsigned int offset = 0;
|
||||||
g_pd3dDeviceContext->IASetInputLayout(g_pInputLayout);
|
ctx->IASetInputLayout(g_pInputLayout);
|
||||||
g_pd3dDeviceContext->IASetVertexBuffers(0, 1, &g_pVB, &stride, &offset);
|
ctx->IASetVertexBuffers(0, 1, &g_pVB, &stride, &offset);
|
||||||
g_pd3dDeviceContext->IASetIndexBuffer(g_pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0);
|
ctx->IASetIndexBuffer(g_pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0);
|
||||||
g_pd3dDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
||||||
g_pd3dDeviceContext->VSSetShader(g_pVertexShader, NULL, 0);
|
ctx->VSSetShader(g_pVertexShader, NULL, 0);
|
||||||
g_pd3dDeviceContext->VSSetConstantBuffers(0, 1, &g_pVertexConstantBuffer);
|
ctx->VSSetConstantBuffers(0, 1, &g_pVertexConstantBuffer);
|
||||||
g_pd3dDeviceContext->PSSetShader(g_pPixelShader, NULL, 0);
|
ctx->PSSetShader(g_pPixelShader, NULL, 0);
|
||||||
g_pd3dDeviceContext->PSSetSamplers(0, 1, &g_pFontSampler);
|
ctx->PSSetSamplers(0, 1, &g_pFontSampler);
|
||||||
|
|
||||||
// Setup render state
|
// Setup render state
|
||||||
const float blendFactor[4] = { 0.f, 0.f, 0.f, 0.f };
|
const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f };
|
||||||
g_pd3dDeviceContext->OMSetBlendState(g_pBlendState, blendFactor, 0xffffffff);
|
ctx->OMSetBlendState(g_pBlendState, blend_factor, 0xffffffff);
|
||||||
g_pd3dDeviceContext->RSSetState(g_pRasterizerState);
|
ctx->RSSetState(g_pRasterizerState);
|
||||||
|
|
||||||
// Render command lists
|
// Render command lists
|
||||||
int vtx_offset = 0;
|
int vtx_offset = 0;
|
||||||
@ -160,19 +199,31 @@ void ImGui_ImplDX11_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
const D3D11_RECT r = { (LONG)pcmd->ClipRect.x, (LONG)pcmd->ClipRect.y, (LONG)pcmd->ClipRect.z, (LONG)pcmd->ClipRect.w };
|
const D3D11_RECT r = { (LONG)pcmd->ClipRect.x, (LONG)pcmd->ClipRect.y, (LONG)pcmd->ClipRect.z, (LONG)pcmd->ClipRect.w };
|
||||||
g_pd3dDeviceContext->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView**)&pcmd->TextureId);
|
ctx->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView**)&pcmd->TextureId);
|
||||||
g_pd3dDeviceContext->RSSetScissorRects(1, &r);
|
ctx->RSSetScissorRects(1, &r);
|
||||||
g_pd3dDeviceContext->DrawIndexed(pcmd->ElemCount, idx_offset, vtx_offset);
|
ctx->DrawIndexed(pcmd->ElemCount, idx_offset, vtx_offset);
|
||||||
}
|
}
|
||||||
idx_offset += pcmd->ElemCount;
|
idx_offset += pcmd->ElemCount;
|
||||||
}
|
}
|
||||||
vtx_offset += cmd_list->VtxBuffer.size();
|
vtx_offset += cmd_list->VtxBuffer.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore modified state
|
// Restore modified DX state
|
||||||
g_pd3dDeviceContext->IASetInputLayout(NULL);
|
ctx->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects);
|
||||||
g_pd3dDeviceContext->PSSetShader(NULL, NULL, 0);
|
ctx->RSSetViewports(old.ViewportsCount, old.Viewports);
|
||||||
g_pd3dDeviceContext->VSSetShader(NULL, NULL, 0);
|
ctx->RSSetState(old.RS); if (old.RS) old.RS->Release();
|
||||||
|
ctx->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release();
|
||||||
|
ctx->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release();
|
||||||
|
ctx->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release();
|
||||||
|
ctx->PSSetShader(old.PS, old.PSInstances, old.PSInstancesCount); if (old.PS) old.PS->Release();
|
||||||
|
for (UINT i = 0; i < old.PSInstancesCount; i++) if (old.PSInstances[i]) old.PSInstances[i]->Release();
|
||||||
|
ctx->VSSetShader(old.VS, old.VSInstances, old.VSInstancesCount); if (old.VS) old.VS->Release();
|
||||||
|
ctx->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release();
|
||||||
|
for (UINT i = 0; i < old.VSInstancesCount; i++) if (old.VSInstances[i]) old.VSInstances[i]->Release();
|
||||||
|
ctx->IASetPrimitiveTopology(old.PrimitiveTopology);
|
||||||
|
ctx->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release();
|
||||||
|
ctx->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release();
|
||||||
|
ctx->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
IMGUI_API LRESULT ImGui_ImplDX11_WndProcHandler(HWND, UINT msg, WPARAM wParam, LPARAM lParam)
|
IMGUI_API LRESULT ImGui_ImplDX11_WndProcHandler(HWND, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
@ -232,31 +283,31 @@ static void ImGui_ImplDX11_CreateFontsTexture()
|
|||||||
|
|
||||||
// Upload texture to graphics system
|
// Upload texture to graphics system
|
||||||
{
|
{
|
||||||
D3D11_TEXTURE2D_DESC texDesc;
|
D3D11_TEXTURE2D_DESC desc;
|
||||||
ZeroMemory(&texDesc, sizeof(texDesc));
|
ZeroMemory(&desc, sizeof(desc));
|
||||||
texDesc.Width = width;
|
desc.Width = width;
|
||||||
texDesc.Height = height;
|
desc.Height = height;
|
||||||
texDesc.MipLevels = 1;
|
desc.MipLevels = 1;
|
||||||
texDesc.ArraySize = 1;
|
desc.ArraySize = 1;
|
||||||
texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
texDesc.SampleDesc.Count = 1;
|
desc.SampleDesc.Count = 1;
|
||||||
texDesc.Usage = D3D11_USAGE_DEFAULT;
|
desc.Usage = D3D11_USAGE_DEFAULT;
|
||||||
texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||||
texDesc.CPUAccessFlags = 0;
|
desc.CPUAccessFlags = 0;
|
||||||
|
|
||||||
ID3D11Texture2D *pTexture = NULL;
|
ID3D11Texture2D *pTexture = NULL;
|
||||||
D3D11_SUBRESOURCE_DATA subResource;
|
D3D11_SUBRESOURCE_DATA subResource;
|
||||||
subResource.pSysMem = pixels;
|
subResource.pSysMem = pixels;
|
||||||
subResource.SysMemPitch = texDesc.Width * 4;
|
subResource.SysMemPitch = desc.Width * 4;
|
||||||
subResource.SysMemSlicePitch = 0;
|
subResource.SysMemSlicePitch = 0;
|
||||||
g_pd3dDevice->CreateTexture2D(&texDesc, &subResource, &pTexture);
|
g_pd3dDevice->CreateTexture2D(&desc, &subResource, &pTexture);
|
||||||
|
|
||||||
// Create texture view
|
// Create texture view
|
||||||
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
|
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
|
||||||
ZeroMemory(&srvDesc, sizeof(srvDesc));
|
ZeroMemory(&srvDesc, sizeof(srvDesc));
|
||||||
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
|
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
|
||||||
srvDesc.Texture2D.MipLevels = texDesc.MipLevels;
|
srvDesc.Texture2D.MipLevels = desc.MipLevels;
|
||||||
srvDesc.Texture2D.MostDetailedMip = 0;
|
srvDesc.Texture2D.MostDetailedMip = 0;
|
||||||
g_pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &g_pFontTextureView);
|
g_pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &g_pFontTextureView);
|
||||||
pTexture->Release();
|
pTexture->Release();
|
||||||
@ -267,17 +318,17 @@ static void ImGui_ImplDX11_CreateFontsTexture()
|
|||||||
|
|
||||||
// Create texture sampler
|
// Create texture sampler
|
||||||
{
|
{
|
||||||
D3D11_SAMPLER_DESC samplerDesc;
|
D3D11_SAMPLER_DESC desc;
|
||||||
ZeroMemory(&samplerDesc, sizeof(samplerDesc));
|
ZeroMemory(&desc, sizeof(desc));
|
||||||
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
|
desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
|
||||||
samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
|
desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
|
||||||
samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
|
desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
|
||||||
samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
|
desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
|
||||||
samplerDesc.MipLODBias = 0.f;
|
desc.MipLODBias = 0.f;
|
||||||
samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
|
desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
|
||||||
samplerDesc.MinLOD = 0.f;
|
desc.MinLOD = 0.f;
|
||||||
samplerDesc.MaxLOD = 0.f;
|
desc.MaxLOD = 0.f;
|
||||||
g_pd3dDevice->CreateSamplerState(&samplerDesc, &g_pFontSampler);
|
g_pd3dDevice->CreateSamplerState(&desc, &g_pFontSampler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,24 +376,23 @@ bool ImGui_ImplDX11_CreateDeviceObjects()
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Create the input layout
|
// Create the input layout
|
||||||
D3D11_INPUT_ELEMENT_DESC localLayout[] = {
|
D3D11_INPUT_ELEMENT_DESC local_layout[] = {
|
||||||
{ "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (size_t)(&((ImDrawVert*)0)->pos), D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
{ "POSITION", 0, DXGI_FORMAT_R32G32_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 },
|
{ "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 },
|
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (size_t)(&((ImDrawVert*)0)->col), D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
||||||
};
|
};
|
||||||
|
if (g_pd3dDevice->CreateInputLayout(local_layout, 3, g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), &g_pInputLayout) != S_OK)
|
||||||
if (g_pd3dDevice->CreateInputLayout(localLayout, 3, g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), &g_pInputLayout) != S_OK)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Create the constant buffer
|
// Create the constant buffer
|
||||||
{
|
{
|
||||||
D3D11_BUFFER_DESC cbDesc;
|
D3D11_BUFFER_DESC desc;
|
||||||
cbDesc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER);
|
desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER);
|
||||||
cbDesc.Usage = D3D11_USAGE_DYNAMIC;
|
desc.Usage = D3D11_USAGE_DYNAMIC;
|
||||||
cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
|
desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
|
||||||
cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
||||||
cbDesc.MiscFlags = 0;
|
desc.MiscFlags = 0;
|
||||||
g_pd3dDevice->CreateBuffer(&cbDesc, NULL, &g_pVertexConstantBuffer);
|
g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pVertexConstantBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -472,7 +522,7 @@ void ImGui_ImplDX11_Shutdown()
|
|||||||
|
|
||||||
void ImGui_ImplDX11_NewFrame()
|
void ImGui_ImplDX11_NewFrame()
|
||||||
{
|
{
|
||||||
if (!g_pVB)
|
if (!g_pFontSampler)
|
||||||
ImGui_ImplDX11_CreateDeviceObjects();
|
ImGui_ImplDX11_CreateDeviceObjects();
|
||||||
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
@ -492,6 +542,7 @@ void ImGui_ImplDX11_NewFrame()
|
|||||||
io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
|
io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
|
||||||
io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
|
io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
|
||||||
io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;
|
io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;
|
||||||
|
io.KeySuper = false;
|
||||||
// io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events
|
// io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events
|
||||||
// io.MousePos : filled by WM_MOUSEMOVE events
|
// io.MousePos : filled by WM_MOUSEMOVE events
|
||||||
// io.MouseDown : filled by WM_*BUTTON* events
|
// io.MouseDown : filled by WM_*BUTTON* events
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui Win32 + DirectX11 binding
|
// ImGui Win32 + DirectX11 binding
|
||||||
|
// In this binding, ImTextureID is used to store a 'ID3D11ShaderResourceView*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui Win32 + DirectX9 binding
|
// ImGui Win32 + DirectX9 binding
|
||||||
|
// In this binding, ImTextureID is used to store a 'LPDIRECT3DTEXTURE9' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
@ -94,8 +96,9 @@ void ImGui_ImplDX9_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
|
g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
|
||||||
g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
|
g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
|
||||||
g_pd3dDevice->SetRenderState( D3DRS_SCISSORTESTENABLE, true );
|
g_pd3dDevice->SetRenderState( D3DRS_SCISSORTESTENABLE, true );
|
||||||
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
|
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
|
||||||
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
|
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_ALPHAOP, D3DTOP_MODULATE );
|
||||||
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
|
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
|
||||||
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
|
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
|
||||||
@ -234,11 +237,11 @@ static bool ImGui_ImplDX9_CreateFontsTexture()
|
|||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
unsigned char* pixels;
|
unsigned char* pixels;
|
||||||
int width, height, bytes_per_pixel;
|
int width, height, bytes_per_pixel;
|
||||||
io.Fonts->GetTexDataAsAlpha8(&pixels, &width, &height, &bytes_per_pixel);
|
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height, &bytes_per_pixel);
|
||||||
|
|
||||||
// Upload texture to graphics system
|
// Upload texture to graphics system
|
||||||
g_FontTexture = NULL;
|
g_FontTexture = NULL;
|
||||||
if (D3DXCreateTexture(g_pd3dDevice, width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8, D3DPOOL_DEFAULT, &g_FontTexture) < 0)
|
if (D3DXCreateTexture(g_pd3dDevice, width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8B8G8R8, D3DPOOL_DEFAULT, &g_FontTexture) < 0)
|
||||||
return false;
|
return false;
|
||||||
D3DLOCKED_RECT tex_locked_rect;
|
D3DLOCKED_RECT tex_locked_rect;
|
||||||
if (g_FontTexture->LockRect(0, &tex_locked_rect, NULL, 0) != D3D_OK)
|
if (g_FontTexture->LockRect(0, &tex_locked_rect, NULL, 0) != D3D_OK)
|
||||||
@ -306,6 +309,7 @@ void ImGui_ImplDX9_NewFrame()
|
|||||||
io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
|
io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
|
||||||
io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
|
io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
|
||||||
io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;
|
io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0;
|
||||||
|
io.KeySuper = false;
|
||||||
// io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events
|
// io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events
|
||||||
// io.MousePos : filled by WM_MOUSEMOVE events
|
// io.MousePos : filled by WM_MOUSEMOVE events
|
||||||
// io.MouseDown : filled by WM_*BUTTON* events
|
// io.MouseDown : filled by WM_*BUTTON* events
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui Win32 + DirectX9 binding
|
// ImGui Win32 + DirectX9 binding
|
||||||
|
// In this binding, ImTextureID is used to store a 'LPDIRECT3DTEXTURE9' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
//
|
|
||||||
// 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
|
|
@ -1,5 +1,5 @@
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* GLFW 3.1 - www.glfw.org
|
* GLFW 3.2 - www.glfw.org
|
||||||
* A library for OpenGL, window and input
|
* A library for OpenGL, window and input
|
||||||
*------------------------------------------------------------------------
|
*------------------------------------------------------------------------
|
||||||
* Copyright (c) 2002-2006 Marcus Geelnard
|
* Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
@ -38,20 +38,30 @@ extern "C" {
|
|||||||
* Doxygen documentation
|
* Doxygen documentation
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
|
/*! @file glfw3native.h
|
||||||
|
* @brief The header of the native access functions.
|
||||||
|
*
|
||||||
|
* This is the header file of the native access functions. See @ref native for
|
||||||
|
* more information.
|
||||||
|
*/
|
||||||
/*! @defgroup native Native access
|
/*! @defgroup native Native access
|
||||||
*
|
*
|
||||||
* **By using the native access functions you assert that you know what you're
|
* **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
|
* doing and how to fix problems caused by using them. If you don't, you
|
||||||
* shouldn't be using them.**
|
* shouldn't be using them.**
|
||||||
*
|
*
|
||||||
* Before the inclusion of @ref glfw3native.h, you must define exactly one
|
* Before the inclusion of @ref glfw3native.h, you may define exactly one
|
||||||
* window system API macro and exactly one context creation API macro. Failure
|
* window system API macro and zero or more context creation API macros.
|
||||||
* to do this will cause a compile-time error.
|
*
|
||||||
|
* The chosen backends must match those the library was compiled for. Failure
|
||||||
|
* to do this will cause a link-time error.
|
||||||
*
|
*
|
||||||
* The available window API macros are:
|
* The available window API macros are:
|
||||||
* * `GLFW_EXPOSE_NATIVE_WIN32`
|
* * `GLFW_EXPOSE_NATIVE_WIN32`
|
||||||
* * `GLFW_EXPOSE_NATIVE_COCOA`
|
* * `GLFW_EXPOSE_NATIVE_COCOA`
|
||||||
* * `GLFW_EXPOSE_NATIVE_X11`
|
* * `GLFW_EXPOSE_NATIVE_X11`
|
||||||
|
* * `GLFW_EXPOSE_NATIVE_WAYLAND`
|
||||||
|
* * `GLFW_EXPOSE_NATIVE_MIR`
|
||||||
*
|
*
|
||||||
* The available context API macros are:
|
* The available context API macros are:
|
||||||
* * `GLFW_EXPOSE_NATIVE_WGL`
|
* * `GLFW_EXPOSE_NATIVE_WGL`
|
||||||
@ -86,20 +96,23 @@ extern "C" {
|
|||||||
#elif defined(GLFW_EXPOSE_NATIVE_X11)
|
#elif defined(GLFW_EXPOSE_NATIVE_X11)
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <X11/extensions/Xrandr.h>
|
#include <X11/extensions/Xrandr.h>
|
||||||
#else
|
#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND)
|
||||||
#error "No window API selected"
|
#include <wayland-client.h>
|
||||||
|
#elif defined(GLFW_EXPOSE_NATIVE_MIR)
|
||||||
|
#include <mir_toolkit/mir_client_library.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_WGL)
|
#if defined(GLFW_EXPOSE_NATIVE_WGL)
|
||||||
/* WGL is declared by windows.h */
|
/* WGL is declared by windows.h */
|
||||||
#elif defined(GLFW_EXPOSE_NATIVE_NSGL)
|
#endif
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_NSGL)
|
||||||
/* NSGL is declared by Cocoa.h */
|
/* NSGL is declared by Cocoa.h */
|
||||||
#elif defined(GLFW_EXPOSE_NATIVE_GLX)
|
#endif
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_GLX)
|
||||||
#include <GL/glx.h>
|
#include <GL/glx.h>
|
||||||
#elif defined(GLFW_EXPOSE_NATIVE_EGL)
|
#endif
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
||||||
#include <EGL/egl.h>
|
#include <EGL/egl.h>
|
||||||
#else
|
|
||||||
#error "No context API selected"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -114,11 +127,10 @@ extern "C" {
|
|||||||
* of the specified monitor, or `NULL` if an [error](@ref error_handling)
|
* of the specified monitor, or `NULL` if an [error](@ref error_handling)
|
||||||
* occurred.
|
* occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.1.
|
||||||
* Added in GLFW 3.1.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
@ -130,11 +142,10 @@ GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor);
|
|||||||
* `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an
|
* `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.1.
|
||||||
* Added in GLFW 3.1.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
@ -145,11 +156,10 @@ GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor);
|
|||||||
* @return The `HWND` of the specified window, or `NULL` if an
|
* @return The `HWND` of the specified window, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.0.
|
||||||
* Added in GLFW 3.0.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
@ -162,11 +172,10 @@ GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window);
|
|||||||
* @return The `HGLRC` of the specified window, or `NULL` if an
|
* @return The `HGLRC` of the specified window, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.0.
|
||||||
* Added in GLFW 3.0.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
@ -179,11 +188,10 @@ GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window);
|
|||||||
* @return The `CGDirectDisplayID` of the specified monitor, or
|
* @return The `CGDirectDisplayID` of the specified monitor, or
|
||||||
* `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred.
|
* `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.1.
|
||||||
* Added in GLFW 3.1.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
@ -194,11 +202,10 @@ GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor);
|
|||||||
* @return The `NSWindow` of the specified window, or `nil` if an
|
* @return The `NSWindow` of the specified window, or `nil` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.0.
|
||||||
* Added in GLFW 3.0.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
@ -211,11 +218,10 @@ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);
|
|||||||
* @return The `NSOpenGLContext` of the specified window, or `nil` if an
|
* @return The `NSOpenGLContext` of the specified window, or `nil` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.0.
|
||||||
* Added in GLFW 3.0.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
@ -228,11 +234,10 @@ GLFWAPI id glfwGetNSGLContext(GLFWwindow* window);
|
|||||||
* @return The `Display` used by GLFW, or `NULL` if an
|
* @return The `Display` used by GLFW, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.0.
|
||||||
* Added in GLFW 3.0.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
@ -243,11 +248,10 @@ GLFWAPI Display* glfwGetX11Display(void);
|
|||||||
* @return The `RRCrtc` of the specified monitor, or `None` if an
|
* @return The `RRCrtc` of the specified monitor, or `None` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.1.
|
||||||
* Added in GLFW 3.1.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
@ -258,11 +262,10 @@ GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor);
|
|||||||
* @return The `RROutput` of the specified monitor, or `None` if an
|
* @return The `RROutput` of the specified monitor, or `None` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.1.
|
||||||
* Added in GLFW 3.1.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
@ -273,11 +276,10 @@ GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor);
|
|||||||
* @return The `Window` of the specified window, or `None` if an
|
* @return The `Window` of the specified window, or `None` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.0.
|
||||||
* Added in GLFW 3.0.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
@ -290,15 +292,116 @@ GLFWAPI Window glfwGetX11Window(GLFWwindow* window);
|
|||||||
* @return The `GLXContext` of the specified window, or `NULL` if an
|
* @return The `GLXContext` of the specified window, or `NULL` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.0.
|
||||||
* Added in GLFW 3.0.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);
|
GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);
|
||||||
|
|
||||||
|
/*! @brief Returns the `GLXWindow` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `GLXWindow` of the specified window, or `None` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_WAYLAND)
|
||||||
|
/*! @brief Returns the `struct wl_display*` used by GLFW.
|
||||||
|
*
|
||||||
|
* @return The `struct wl_display*` used by GLFW, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI struct wl_display* glfwGetWaylandDisplay(void);
|
||||||
|
|
||||||
|
/*! @brief Returns the `struct wl_output*` of the specified monitor.
|
||||||
|
*
|
||||||
|
* @return The `struct wl_output*` of the specified monitor, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor);
|
||||||
|
|
||||||
|
/*! @brief Returns the main `struct wl_surface*` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The main `struct wl_surface*` of the specified window, or `NULL` if
|
||||||
|
* an [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GLFW_EXPOSE_NATIVE_MIR)
|
||||||
|
/*! @brief Returns the `MirConnection*` used by GLFW.
|
||||||
|
*
|
||||||
|
* @return The `MirConnection*` used by GLFW, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI MirConnection* glfwGetMirDisplay(void);
|
||||||
|
|
||||||
|
/*! @brief Returns the Mir output ID of the specified monitor.
|
||||||
|
*
|
||||||
|
* @return The Mir output ID of the specified monitor, or zero if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI int glfwGetMirMonitor(GLFWmonitor* monitor);
|
||||||
|
|
||||||
|
/*! @brief Returns the `MirSurface*` of the specified window.
|
||||||
|
*
|
||||||
|
* @return The `MirSurface*` of the specified window, or `NULL` if an
|
||||||
|
* [error](@ref error_handling) occurred.
|
||||||
|
*
|
||||||
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
|
* synchronized.
|
||||||
|
*
|
||||||
|
* @since Added in version 3.2.
|
||||||
|
*
|
||||||
|
* @ingroup native
|
||||||
|
*/
|
||||||
|
GLFWAPI MirSurface* glfwGetMirWindow(GLFWwindow* window);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
#if defined(GLFW_EXPOSE_NATIVE_EGL)
|
||||||
@ -307,11 +410,10 @@ GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);
|
|||||||
* @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an
|
* @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.0.
|
||||||
* Added in GLFW 3.0.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
@ -322,11 +424,10 @@ GLFWAPI EGLDisplay glfwGetEGLDisplay(void);
|
|||||||
* @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an
|
* @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.0.
|
||||||
* Added in GLFW 3.0.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
@ -337,11 +438,10 @@ GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window);
|
|||||||
* @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an
|
* @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @thread_safety This function may be called from any thread. Access is not
|
||||||
* This function may be called from any thread. Access is not synchronized.
|
* synchronized.
|
||||||
*
|
*
|
||||||
* @par History
|
* @since Added in version 3.0.
|
||||||
* Added in GLFW 3.0.
|
|
||||||
*
|
*
|
||||||
* @ingroup native
|
* @ingroup native
|
||||||
*/
|
*/
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui Marmalade binding with IwGx
|
// ImGui Marmalade binding with IwGx
|
||||||
|
// In this binding, ImTextureID is used to store a 'CIwTexture*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
@ -151,6 +153,7 @@ int32 ImGui_Marmalade_KeyCallback(void* SystemData, void* userData)
|
|||||||
io.KeyCtrl = s3eKeyboardGetState(s3eKeyLeftControl) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightControl) == S3E_KEY_STATE_DOWN;
|
io.KeyCtrl = s3eKeyboardGetState(s3eKeyLeftControl) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightControl) == S3E_KEY_STATE_DOWN;
|
||||||
io.KeyShift = s3eKeyboardGetState(s3eKeyLeftShift) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightShift) == S3E_KEY_STATE_DOWN;
|
io.KeyShift = s3eKeyboardGetState(s3eKeyLeftShift) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightShift) == S3E_KEY_STATE_DOWN;
|
||||||
io.KeyAlt = s3eKeyboardGetState(s3eKeyLeftAlt) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightAlt) == S3E_KEY_STATE_DOWN;
|
io.KeyAlt = s3eKeyboardGetState(s3eKeyLeftAlt) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightAlt) == S3E_KEY_STATE_DOWN;
|
||||||
|
io.KeySuper = s3eKeyboardGetState(s3eKeyLeftWindows) == S3E_KEY_STATE_DOWN || s3eKeyboardGetState(s3eKeyRightWindows) == S3E_KEY_STATE_DOWN;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui Marmalade binding with IwGx
|
// ImGui Marmalade binding with IwGx
|
||||||
|
// In this binding, ImTextureID is used to store a 'CIwTexture*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
|
@ -20,7 +20,7 @@ UNAME_S := $(shell uname -s)
|
|||||||
|
|
||||||
ifeq ($(UNAME_S), Linux) #LINUX
|
ifeq ($(UNAME_S), Linux) #LINUX
|
||||||
ECHO_MESSAGE = "Linux"
|
ECHO_MESSAGE = "Linux"
|
||||||
LIBS = `pkg-config --static --libs glfw3`
|
LIBS = -lGL `pkg-config --static --libs glfw3`
|
||||||
|
|
||||||
CXXFLAGS = -I../../ -I../libs/gl3w `pkg-config --cflags glfw3`
|
CXXFLAGS = -I../../ -I../libs/gl3w `pkg-config --cflags glfw3`
|
||||||
CXXFLAGS += -Wall -Wformat
|
CXXFLAGS += -Wall -Wformat
|
||||||
@ -30,8 +30,7 @@ endif
|
|||||||
ifeq ($(UNAME_S), Darwin) #APPLE
|
ifeq ($(UNAME_S), Darwin) #APPLE
|
||||||
ECHO_MESSAGE = "Mac OS X"
|
ECHO_MESSAGE = "Mac OS X"
|
||||||
LIBS = -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo
|
LIBS = -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo
|
||||||
LIBS += -L/usr/local/lib
|
LIBS += -L/usr/local/lib -lglfw3
|
||||||
LIBS += -lglfw3
|
|
||||||
|
|
||||||
CXXFLAGS = -I../../ -I../libs/gl3w -I/usr/local/Cellar/glew/1.10.0/include -I/usr/local/include
|
CXXFLAGS = -I../../ -I../libs/gl3w -I/usr/local/Cellar/glew/1.10.0/include -I/usr/local/include
|
||||||
CXXFLAGS += -Wall -Wformat
|
CXXFLAGS += -Wall -Wformat
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui GLFW binding with OpenGL3 + shaders
|
// ImGui GLFW binding with OpenGL3 + shaders
|
||||||
|
// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
@ -33,6 +35,14 @@ static unsigned int g_VboHandle = 0, g_VaoHandle = 0, g_ElementsHandle = 0;
|
|||||||
// - 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)
|
||||||
void ImGui_ImplGlfwGL3_RenderDrawLists(ImDrawData* draw_data)
|
void ImGui_ImplGlfwGL3_RenderDrawLists(ImDrawData* draw_data)
|
||||||
{
|
{
|
||||||
|
// Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);
|
||||||
|
int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);
|
||||||
|
if (fb_width == 0 || fb_height == 0)
|
||||||
|
return;
|
||||||
|
draw_data->ScaleClipRects(io.DisplayFramebufferScale);
|
||||||
|
|
||||||
// Backup GL state
|
// Backup GL state
|
||||||
GLint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
|
GLint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
|
||||||
GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
||||||
@ -58,12 +68,6 @@ void ImGui_ImplGlfwGL3_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
glEnable(GL_SCISSOR_TEST);
|
glEnable(GL_SCISSOR_TEST);
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
|
||||||
// Handle cases of screen coordinates != from framebuffer coordinates (e.g. retina displays)
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);
|
|
||||||
int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);
|
|
||||||
draw_data->ScaleClipRects(io.DisplayFramebufferScale);
|
|
||||||
|
|
||||||
// Setup viewport, orthographic projection matrix
|
// Setup viewport, orthographic projection matrix
|
||||||
glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
|
glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
|
||||||
const float ortho_projection[4][4] =
|
const float ortho_projection[4][4] =
|
||||||
@ -108,9 +112,9 @@ void ImGui_ImplGlfwGL3_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
// Restore modified GL state
|
// Restore modified GL state
|
||||||
glUseProgram(last_program);
|
glUseProgram(last_program);
|
||||||
glBindTexture(GL_TEXTURE_2D, last_texture);
|
glBindTexture(GL_TEXTURE_2D, last_texture);
|
||||||
|
glBindVertexArray(last_vertex_array);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer);
|
||||||
glBindVertexArray(last_vertex_array);
|
|
||||||
glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
|
glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
|
||||||
glBlendFunc(last_blend_src, last_blend_dst);
|
glBlendFunc(last_blend_src, last_blend_dst);
|
||||||
if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND);
|
if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND);
|
||||||
@ -153,6 +157,7 @@ void ImGui_ImplGlfwGL3_KeyCallback(GLFWwindow*, int key, int, int action, int mo
|
|||||||
io.KeyCtrl = io.KeysDown[GLFW_KEY_LEFT_CONTROL] || io.KeysDown[GLFW_KEY_RIGHT_CONTROL];
|
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.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];
|
io.KeyAlt = io.KeysDown[GLFW_KEY_LEFT_ALT] || io.KeysDown[GLFW_KEY_RIGHT_ALT];
|
||||||
|
io.KeySuper = io.KeysDown[GLFW_KEY_LEFT_SUPER] || io.KeysDown[GLFW_KEY_RIGHT_SUPER];
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui_ImplGlfwGL3_CharCallback(GLFWwindow*, unsigned int c)
|
void ImGui_ImplGlfwGL3_CharCallback(GLFWwindow*, unsigned int c)
|
||||||
@ -353,7 +358,7 @@ void ImGui_ImplGlfwGL3_NewFrame()
|
|||||||
glfwGetWindowSize(g_Window, &w, &h);
|
glfwGetWindowSize(g_Window, &w, &h);
|
||||||
glfwGetFramebufferSize(g_Window, &display_w, &display_h);
|
glfwGetFramebufferSize(g_Window, &display_w, &display_h);
|
||||||
io.DisplaySize = ImVec2((float)w, (float)h);
|
io.DisplaySize = ImVec2((float)w, (float)h);
|
||||||
io.DisplayFramebufferScale = ImVec2((float)display_w / w, (float)display_h / h);
|
io.DisplayFramebufferScale = ImVec2(w > 0 ? ((float)display_w / w) : 0, h > 0 ? ((float)display_h / h) : 0);
|
||||||
|
|
||||||
// Setup time step
|
// Setup time step
|
||||||
double current_time = glfwGetTime();
|
double current_time = glfwGetTime();
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui GLFW binding with OpenGL3 + shaders
|
// ImGui GLFW binding with OpenGL3 + shaders
|
||||||
|
// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
|
@ -19,7 +19,7 @@ UNAME_S := $(shell uname -s)
|
|||||||
|
|
||||||
ifeq ($(UNAME_S), Linux) #LINUX
|
ifeq ($(UNAME_S), Linux) #LINUX
|
||||||
ECHO_MESSAGE = "Linux"
|
ECHO_MESSAGE = "Linux"
|
||||||
LIBS = `pkg-config --static --libs glfw3`
|
LIBS = -lGL `pkg-config --static --libs glfw3`
|
||||||
|
|
||||||
CXXFLAGS = -I../../ `pkg-config --cflags glfw3`
|
CXXFLAGS = -I../../ `pkg-config --cflags glfw3`
|
||||||
CXXFLAGS += -Wall -Wformat
|
CXXFLAGS += -Wall -Wformat
|
||||||
@ -29,8 +29,7 @@ endif
|
|||||||
ifeq ($(UNAME_S), Darwin) #APPLE
|
ifeq ($(UNAME_S), Darwin) #APPLE
|
||||||
ECHO_MESSAGE = "Mac OS X"
|
ECHO_MESSAGE = "Mac OS X"
|
||||||
LIBS = -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo
|
LIBS = -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo
|
||||||
LIBS += -L/usr/local/lib
|
LIBS += -L/usr/local/lib -lglfw3
|
||||||
LIBS += -lglfw3
|
|
||||||
|
|
||||||
CXXFLAGS = -I../../ -I/usr/local/include
|
CXXFLAGS = -I../../ -I/usr/local/include
|
||||||
CXXFLAGS += -Wall -Wformat
|
CXXFLAGS += -Wall -Wformat
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui GLFW binding with OpenGL
|
// ImGui GLFW binding with OpenGL
|
||||||
|
// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
@ -28,6 +30,14 @@ static GLuint g_FontTexture = 0;
|
|||||||
// - 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)
|
||||||
void ImGui_ImplGlfw_RenderDrawLists(ImDrawData* draw_data)
|
void ImGui_ImplGlfw_RenderDrawLists(ImDrawData* draw_data)
|
||||||
{
|
{
|
||||||
|
// Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);
|
||||||
|
int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);
|
||||||
|
if (fb_width == 0 || fb_height == 0)
|
||||||
|
return;
|
||||||
|
draw_data->ScaleClipRects(io.DisplayFramebufferScale);
|
||||||
|
|
||||||
// We are using the OpenGL fixed pipeline to make the example code simpler to read!
|
// We are using the OpenGL fixed pipeline to make the example code simpler to read!
|
||||||
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers.
|
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers.
|
||||||
GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
||||||
@ -44,12 +54,6 @@ void ImGui_ImplGlfw_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
//glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context
|
//glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context
|
||||||
|
|
||||||
// Handle cases of screen coordinates != from framebuffer coordinates (e.g. retina displays)
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);
|
|
||||||
int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);
|
|
||||||
draw_data->ScaleClipRects(io.DisplayFramebufferScale);
|
|
||||||
|
|
||||||
// Setup viewport, orthographic projection matrix
|
// Setup viewport, orthographic projection matrix
|
||||||
glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
|
glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
@ -135,6 +139,7 @@ void ImGui_ImplGlFw_KeyCallback(GLFWwindow*, int key, int, int action, int mods)
|
|||||||
io.KeyCtrl = io.KeysDown[GLFW_KEY_LEFT_CONTROL] || io.KeysDown[GLFW_KEY_RIGHT_CONTROL];
|
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.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];
|
io.KeyAlt = io.KeysDown[GLFW_KEY_LEFT_ALT] || io.KeysDown[GLFW_KEY_RIGHT_ALT];
|
||||||
|
io.KeySuper = io.KeysDown[GLFW_KEY_LEFT_SUPER] || io.KeysDown[GLFW_KEY_RIGHT_SUPER];
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui_ImplGlfw_CharCallback(GLFWwindow*, unsigned int c)
|
void ImGui_ImplGlfw_CharCallback(GLFWwindow*, unsigned int c)
|
||||||
@ -242,7 +247,7 @@ void ImGui_ImplGlfw_NewFrame()
|
|||||||
glfwGetWindowSize(g_Window, &w, &h);
|
glfwGetWindowSize(g_Window, &w, &h);
|
||||||
glfwGetFramebufferSize(g_Window, &display_w, &display_h);
|
glfwGetFramebufferSize(g_Window, &display_w, &display_h);
|
||||||
io.DisplaySize = ImVec2((float)w, (float)h);
|
io.DisplaySize = ImVec2((float)w, (float)h);
|
||||||
io.DisplayFramebufferScale = ImVec2((float)display_w / w, (float)display_h / h);
|
io.DisplayFramebufferScale = ImVec2(w > 0 ? ((float)display_w / w) : 0, h > 0 ? ((float)display_h / h) : 0);
|
||||||
|
|
||||||
// Setup time step
|
// Setup time step
|
||||||
double current_time = glfwGetTime();
|
double current_time = glfwGetTime();
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui GLFW binding with OpenGL
|
// ImGui GLFW binding with OpenGL
|
||||||
|
// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
|
@ -18,5 +18,5 @@ c++ `sdl2-config --cflags` -I ../.. -I ../libs/gl3w main.cpp imgui_impl_sdl_gl3.
|
|||||||
|
|
||||||
```
|
```
|
||||||
brew install sdl2
|
brew install sdl2
|
||||||
c++ `sdl2-config --cflags` -I ../.. -I ../libs/gl3w main.cpp imgui_impl_sdl_gl3.cpp ../../imgui*.cpp ../libs/gl3w/GL/gl3w.c `sdl2-config --libs` -framework OpenGl -o sdl2example
|
c++ `sdl2-config --cflags` -I ../.. -I ../libs/gl3w main.cpp imgui_impl_sdl_gl3.cpp ../../imgui*.cpp ../libs/gl3w/GL/gl3w.c `sdl2-config --libs` -framework OpenGl -framework CoreFoundation -o sdl2example
|
||||||
```
|
```
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui SDL2 binding with OpenGL3
|
// ImGui SDL2 binding with OpenGL3
|
||||||
|
// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
@ -13,7 +15,6 @@
|
|||||||
#include <GL/gl3w.h>
|
#include <GL/gl3w.h>
|
||||||
|
|
||||||
// Data
|
// Data
|
||||||
static SDL_Window* g_Window = NULL;
|
|
||||||
static double g_Time = 0.0f;
|
static double g_Time = 0.0f;
|
||||||
static bool g_MousePressed[3] = { false, false, false };
|
static bool g_MousePressed[3] = { false, false, false };
|
||||||
static float g_MouseWheel = 0.0f;
|
static float g_MouseWheel = 0.0f;
|
||||||
@ -28,162 +29,165 @@ static unsigned int g_VboHandle = 0, g_VaoHandle = 0, g_ElementsHandle = 0;
|
|||||||
// - 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)
|
||||||
void ImGui_ImplSdlGL3_RenderDrawLists(ImDrawData* draw_data)
|
void ImGui_ImplSdlGL3_RenderDrawLists(ImDrawData* draw_data)
|
||||||
{
|
{
|
||||||
// Backup GL state
|
// Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
|
||||||
GLint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
|
||||||
GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
|
|
||||||
GLint last_element_array_buffer; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_element_array_buffer);
|
|
||||||
GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
|
|
||||||
GLint last_blend_src; glGetIntegerv(GL_BLEND_SRC, &last_blend_src);
|
|
||||||
GLint last_blend_dst; glGetIntegerv(GL_BLEND_DST, &last_blend_dst);
|
|
||||||
GLint last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, &last_blend_equation_rgb);
|
|
||||||
GLint last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &last_blend_equation_alpha);
|
|
||||||
GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
|
|
||||||
GLboolean last_enable_blend = glIsEnabled(GL_BLEND);
|
|
||||||
GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE);
|
|
||||||
GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST);
|
|
||||||
GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST);
|
|
||||||
|
|
||||||
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled
|
|
||||||
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);
|
|
||||||
|
|
||||||
// Handle cases of screen coordinates != from framebuffer coordinates (e.g. retina displays)
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);
|
int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);
|
||||||
int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);
|
int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);
|
||||||
draw_data->ScaleClipRects(io.DisplayFramebufferScale);
|
if (fb_width == 0 || fb_height == 0)
|
||||||
|
return;
|
||||||
|
draw_data->ScaleClipRects(io.DisplayFramebufferScale);
|
||||||
|
|
||||||
// Setup orthographic projection matrix
|
// Backup GL state
|
||||||
|
GLint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
|
||||||
|
GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
||||||
|
GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
|
||||||
|
GLint last_element_array_buffer; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_element_array_buffer);
|
||||||
|
GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
|
||||||
|
GLint last_blend_src; glGetIntegerv(GL_BLEND_SRC, &last_blend_src);
|
||||||
|
GLint last_blend_dst; glGetIntegerv(GL_BLEND_DST, &last_blend_dst);
|
||||||
|
GLint last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, &last_blend_equation_rgb);
|
||||||
|
GLint last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &last_blend_equation_alpha);
|
||||||
|
GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
|
||||||
|
GLboolean last_enable_blend = glIsEnabled(GL_BLEND);
|
||||||
|
GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE);
|
||||||
|
GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST);
|
||||||
|
GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST);
|
||||||
|
|
||||||
|
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled
|
||||||
|
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
|
||||||
glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
|
glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
|
||||||
const float ortho_projection[4][4] =
|
const float ortho_projection[4][4] =
|
||||||
{
|
{
|
||||||
{ 2.0f/io.DisplaySize.x, 0.0f, 0.0f, 0.0f },
|
{ 2.0f/io.DisplaySize.x, 0.0f, 0.0f, 0.0f },
|
||||||
{ 0.0f, 2.0f/-io.DisplaySize.y, 0.0f, 0.0f },
|
{ 0.0f, 2.0f/-io.DisplaySize.y, 0.0f, 0.0f },
|
||||||
{ 0.0f, 0.0f, -1.0f, 0.0f },
|
{ 0.0f, 0.0f, -1.0f, 0.0f },
|
||||||
{-1.0f, 1.0f, 0.0f, 1.0f },
|
{-1.0f, 1.0f, 0.0f, 1.0f },
|
||||||
};
|
};
|
||||||
glUseProgram(g_ShaderHandle);
|
glUseProgram(g_ShaderHandle);
|
||||||
glUniform1i(g_AttribLocationTex, 0);
|
glUniform1i(g_AttribLocationTex, 0);
|
||||||
glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);
|
glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);
|
||||||
glBindVertexArray(g_VaoHandle);
|
glBindVertexArray(g_VaoHandle);
|
||||||
|
|
||||||
for (int n = 0; n < draw_data->CmdListsCount; n++)
|
for (int n = 0; n < draw_data->CmdListsCount; n++)
|
||||||
{
|
{
|
||||||
const ImDrawList* cmd_list = draw_data->CmdLists[n];
|
const ImDrawList* cmd_list = draw_data->CmdLists[n];
|
||||||
const ImDrawIdx* idx_buffer_offset = 0;
|
const ImDrawIdx* idx_buffer_offset = 0;
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
|
glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
|
||||||
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)cmd_list->VtxBuffer.size() * sizeof(ImDrawVert), (GLvoid*)&cmd_list->VtxBuffer.front(), GL_STREAM_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)cmd_list->VtxBuffer.size() * sizeof(ImDrawVert), (GLvoid*)&cmd_list->VtxBuffer.front(), GL_STREAM_DRAW);
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ElementsHandle);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ElementsHandle);
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)cmd_list->IdxBuffer.size() * sizeof(ImDrawIdx), (GLvoid*)&cmd_list->IdxBuffer.front(), GL_STREAM_DRAW);
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)cmd_list->IdxBuffer.size() * sizeof(ImDrawIdx), (GLvoid*)&cmd_list->IdxBuffer.front(), GL_STREAM_DRAW);
|
||||||
|
|
||||||
for (const ImDrawCmd* pcmd = cmd_list->CmdBuffer.begin(); pcmd != cmd_list->CmdBuffer.end(); pcmd++)
|
for (const ImDrawCmd* pcmd = cmd_list->CmdBuffer.begin(); pcmd != cmd_list->CmdBuffer.end(); pcmd++)
|
||||||
{
|
{
|
||||||
if (pcmd->UserCallback)
|
if (pcmd->UserCallback)
|
||||||
{
|
{
|
||||||
pcmd->UserCallback(cmd_list, pcmd);
|
pcmd->UserCallback(cmd_list, pcmd);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId);
|
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId);
|
||||||
glScissor((int)pcmd->ClipRect.x, (int)(fb_height - pcmd->ClipRect.w), (int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (int)(pcmd->ClipRect.w - pcmd->ClipRect.y));
|
glScissor((int)pcmd->ClipRect.x, (int)(fb_height - pcmd->ClipRect.w), (int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (int)(pcmd->ClipRect.w - pcmd->ClipRect.y));
|
||||||
glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset);
|
glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset);
|
||||||
}
|
}
|
||||||
idx_buffer_offset += pcmd->ElemCount;
|
idx_buffer_offset += pcmd->ElemCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore modified GL state
|
// Restore modified GL state
|
||||||
glUseProgram(last_program);
|
glUseProgram(last_program);
|
||||||
glBindTexture(GL_TEXTURE_2D, last_texture);
|
glBindTexture(GL_TEXTURE_2D, last_texture);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
glBindVertexArray(last_vertex_array);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer);
|
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
||||||
glBindVertexArray(last_vertex_array);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer);
|
||||||
glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
|
glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
|
||||||
glBlendFunc(last_blend_src, last_blend_dst);
|
glBlendFunc(last_blend_src, last_blend_dst);
|
||||||
if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND);
|
if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND);
|
||||||
if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE);
|
if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE);
|
||||||
if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);
|
if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);
|
||||||
if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST);
|
if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST);
|
||||||
glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
|
glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* ImGui_ImplSdlGL3_GetClipboardText()
|
static const char* ImGui_ImplSdlGL3_GetClipboardText()
|
||||||
{
|
{
|
||||||
return SDL_GetClipboardText();
|
return SDL_GetClipboardText();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ImGui_ImplSdlGL3_SetClipboardText(const char* text)
|
static void ImGui_ImplSdlGL3_SetClipboardText(const char* text)
|
||||||
{
|
{
|
||||||
SDL_SetClipboardText(text);
|
SDL_SetClipboardText(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ImGui_ImplSdlGL3_ProcessEvent(SDL_Event* event)
|
bool ImGui_ImplSdlGL3_ProcessEvent(SDL_Event* event)
|
||||||
{
|
{
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
switch (event->type)
|
switch (event->type)
|
||||||
{
|
{
|
||||||
case SDL_MOUSEWHEEL:
|
case SDL_MOUSEWHEEL:
|
||||||
{
|
{
|
||||||
if (event->wheel.y > 0)
|
if (event->wheel.y > 0)
|
||||||
g_MouseWheel = 1;
|
g_MouseWheel = 1;
|
||||||
if (event->wheel.y < 0)
|
if (event->wheel.y < 0)
|
||||||
g_MouseWheel = -1;
|
g_MouseWheel = -1;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
{
|
{
|
||||||
if (event->button.button == SDL_BUTTON_LEFT) g_MousePressed[0] = true;
|
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_RIGHT) g_MousePressed[1] = true;
|
||||||
if (event->button.button == SDL_BUTTON_MIDDLE) g_MousePressed[2] = true;
|
if (event->button.button == SDL_BUTTON_MIDDLE) g_MousePressed[2] = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case SDL_TEXTINPUT:
|
case SDL_TEXTINPUT:
|
||||||
{
|
{
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
io.AddInputCharactersUTF8(event->text.text);
|
io.AddInputCharactersUTF8(event->text.text);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case SDL_KEYDOWN:
|
case SDL_KEYDOWN:
|
||||||
case SDL_KEYUP:
|
case SDL_KEYUP:
|
||||||
{
|
{
|
||||||
int key = event->key.keysym.sym & ~SDLK_SCANCODE_MASK;
|
int key = event->key.keysym.sym & ~SDLK_SCANCODE_MASK;
|
||||||
io.KeysDown[key] = (event->type == SDL_KEYDOWN);
|
io.KeysDown[key] = (event->type == SDL_KEYDOWN);
|
||||||
io.KeyShift = ((SDL_GetModState() & KMOD_SHIFT) != 0);
|
io.KeyShift = ((SDL_GetModState() & KMOD_SHIFT) != 0);
|
||||||
io.KeyCtrl = ((SDL_GetModState() & KMOD_CTRL) != 0);
|
io.KeyCtrl = ((SDL_GetModState() & KMOD_CTRL) != 0);
|
||||||
io.KeyAlt = ((SDL_GetModState() & KMOD_ALT) != 0);
|
io.KeyAlt = ((SDL_GetModState() & KMOD_ALT) != 0);
|
||||||
return true;
|
io.KeySuper = ((SDL_GetModState() & KMOD_GUI) != 0);
|
||||||
}
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui_ImplSdlGL3_CreateFontsTexture()
|
void ImGui_ImplSdlGL3_CreateFontsTexture()
|
||||||
{
|
{
|
||||||
// Build texture atlas
|
// Build texture atlas
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
unsigned char* pixels;
|
unsigned char* pixels;
|
||||||
int width, height;
|
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.
|
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.
|
||||||
|
|
||||||
// Upload texture to graphics system
|
// Upload texture to graphics system
|
||||||
GLint last_texture;
|
GLint last_texture;
|
||||||
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
||||||
glGenTextures(1, &g_FontTexture);
|
glGenTextures(1, &g_FontTexture);
|
||||||
glBindTexture(GL_TEXTURE_2D, g_FontTexture);
|
glBindTexture(GL_TEXTURE_2D, g_FontTexture);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_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);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
|
||||||
|
|
||||||
// Store our identifier
|
// Store our identifier
|
||||||
io.Fonts->TexID = (void *)(intptr_t)g_FontTexture;
|
io.Fonts->TexID = (void *)(intptr_t)g_FontTexture;
|
||||||
|
|
||||||
// Restore state
|
// Restore state
|
||||||
glBindTexture(GL_TEXTURE_2D, last_texture);
|
glBindTexture(GL_TEXTURE_2D, last_texture);
|
||||||
@ -191,79 +195,79 @@ void ImGui_ImplSdlGL3_CreateFontsTexture()
|
|||||||
|
|
||||||
bool ImGui_ImplSdlGL3_CreateDeviceObjects()
|
bool ImGui_ImplSdlGL3_CreateDeviceObjects()
|
||||||
{
|
{
|
||||||
// Backup GL state
|
// Backup GL state
|
||||||
GLint last_texture, last_array_buffer, last_vertex_array;
|
GLint last_texture, last_array_buffer, last_vertex_array;
|
||||||
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
||||||
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
|
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
|
||||||
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
|
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
|
||||||
|
|
||||||
const GLchar *vertex_shader =
|
const GLchar *vertex_shader =
|
||||||
"#version 330\n"
|
"#version 330\n"
|
||||||
"uniform mat4 ProjMtx;\n"
|
"uniform mat4 ProjMtx;\n"
|
||||||
"in vec2 Position;\n"
|
"in vec2 Position;\n"
|
||||||
"in vec2 UV;\n"
|
"in vec2 UV;\n"
|
||||||
"in vec4 Color;\n"
|
"in vec4 Color;\n"
|
||||||
"out vec2 Frag_UV;\n"
|
"out vec2 Frag_UV;\n"
|
||||||
"out vec4 Frag_Color;\n"
|
"out vec4 Frag_Color;\n"
|
||||||
"void main()\n"
|
"void main()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" Frag_UV = UV;\n"
|
" Frag_UV = UV;\n"
|
||||||
" Frag_Color = Color;\n"
|
" Frag_Color = Color;\n"
|
||||||
" gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
|
" gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
const GLchar* fragment_shader =
|
const GLchar* fragment_shader =
|
||||||
"#version 330\n"
|
"#version 330\n"
|
||||||
"uniform sampler2D Texture;\n"
|
"uniform sampler2D Texture;\n"
|
||||||
"in vec2 Frag_UV;\n"
|
"in vec2 Frag_UV;\n"
|
||||||
"in vec4 Frag_Color;\n"
|
"in vec4 Frag_Color;\n"
|
||||||
"out vec4 Out_Color;\n"
|
"out vec4 Out_Color;\n"
|
||||||
"void main()\n"
|
"void main()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" Out_Color = Frag_Color * texture( Texture, Frag_UV.st);\n"
|
" Out_Color = Frag_Color * texture( Texture, Frag_UV.st);\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
g_ShaderHandle = glCreateProgram();
|
g_ShaderHandle = glCreateProgram();
|
||||||
g_VertHandle = glCreateShader(GL_VERTEX_SHADER);
|
g_VertHandle = glCreateShader(GL_VERTEX_SHADER);
|
||||||
g_FragHandle = glCreateShader(GL_FRAGMENT_SHADER);
|
g_FragHandle = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
glShaderSource(g_VertHandle, 1, &vertex_shader, 0);
|
glShaderSource(g_VertHandle, 1, &vertex_shader, 0);
|
||||||
glShaderSource(g_FragHandle, 1, &fragment_shader, 0);
|
glShaderSource(g_FragHandle, 1, &fragment_shader, 0);
|
||||||
glCompileShader(g_VertHandle);
|
glCompileShader(g_VertHandle);
|
||||||
glCompileShader(g_FragHandle);
|
glCompileShader(g_FragHandle);
|
||||||
glAttachShader(g_ShaderHandle, g_VertHandle);
|
glAttachShader(g_ShaderHandle, g_VertHandle);
|
||||||
glAttachShader(g_ShaderHandle, g_FragHandle);
|
glAttachShader(g_ShaderHandle, g_FragHandle);
|
||||||
glLinkProgram(g_ShaderHandle);
|
glLinkProgram(g_ShaderHandle);
|
||||||
|
|
||||||
g_AttribLocationTex = glGetUniformLocation(g_ShaderHandle, "Texture");
|
g_AttribLocationTex = glGetUniformLocation(g_ShaderHandle, "Texture");
|
||||||
g_AttribLocationProjMtx = glGetUniformLocation(g_ShaderHandle, "ProjMtx");
|
g_AttribLocationProjMtx = glGetUniformLocation(g_ShaderHandle, "ProjMtx");
|
||||||
g_AttribLocationPosition = glGetAttribLocation(g_ShaderHandle, "Position");
|
g_AttribLocationPosition = glGetAttribLocation(g_ShaderHandle, "Position");
|
||||||
g_AttribLocationUV = glGetAttribLocation(g_ShaderHandle, "UV");
|
g_AttribLocationUV = glGetAttribLocation(g_ShaderHandle, "UV");
|
||||||
g_AttribLocationColor = glGetAttribLocation(g_ShaderHandle, "Color");
|
g_AttribLocationColor = glGetAttribLocation(g_ShaderHandle, "Color");
|
||||||
|
|
||||||
glGenBuffers(1, &g_VboHandle);
|
glGenBuffers(1, &g_VboHandle);
|
||||||
glGenBuffers(1, &g_ElementsHandle);
|
glGenBuffers(1, &g_ElementsHandle);
|
||||||
|
|
||||||
glGenVertexArrays(1, &g_VaoHandle);
|
glGenVertexArrays(1, &g_VaoHandle);
|
||||||
glBindVertexArray(g_VaoHandle);
|
glBindVertexArray(g_VaoHandle);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
|
glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle);
|
||||||
glEnableVertexAttribArray(g_AttribLocationPosition);
|
glEnableVertexAttribArray(g_AttribLocationPosition);
|
||||||
glEnableVertexAttribArray(g_AttribLocationUV);
|
glEnableVertexAttribArray(g_AttribLocationUV);
|
||||||
glEnableVertexAttribArray(g_AttribLocationColor);
|
glEnableVertexAttribArray(g_AttribLocationColor);
|
||||||
|
|
||||||
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
|
#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_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_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));
|
glVertexAttribPointer(g_AttribLocationColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)OFFSETOF(ImDrawVert, col));
|
||||||
#undef OFFSETOF
|
#undef OFFSETOF
|
||||||
|
|
||||||
ImGui_ImplSdlGL3_CreateFontsTexture();
|
ImGui_ImplSdlGL3_CreateFontsTexture();
|
||||||
|
|
||||||
// Restore modified GL state
|
// Restore modified GL state
|
||||||
glBindTexture(GL_TEXTURE_2D, last_texture);
|
glBindTexture(GL_TEXTURE_2D, last_texture);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
|
||||||
glBindVertexArray(last_vertex_array);
|
glBindVertexArray(last_vertex_array);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui_ImplSdlGL3_InvalidateDeviceObjects()
|
void ImGui_ImplSdlGL3_InvalidateDeviceObjects()
|
||||||
@ -292,90 +296,90 @@ void ImGui_ImplSdlGL3_InvalidateDeviceObjects()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ImGui_ImplSdlGL3_Init(SDL_Window *window)
|
bool ImGui_ImplSdlGL3_Init(SDL_Window* window)
|
||||||
{
|
{
|
||||||
g_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;
|
||||||
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
io.RenderDrawListsFn = ImGui_ImplSdlGL3_RenderDrawLists; // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.
|
||||||
io.KeyMap[ImGuiKey_Tab] = SDLK_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.
|
io.SetClipboardTextFn = ImGui_ImplSdlGL3_SetClipboardText;
|
||||||
io.KeyMap[ImGuiKey_LeftArrow] = SDL_SCANCODE_LEFT;
|
io.GetClipboardTextFn = ImGui_ImplSdlGL3_GetClipboardText;
|
||||||
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_ImplSdlGL3_RenderDrawLists; // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.
|
|
||||||
io.SetClipboardTextFn = ImGui_ImplSdlGL3_SetClipboardText;
|
|
||||||
io.GetClipboardTextFn = ImGui_ImplSdlGL3_GetClipboardText;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
SDL_SysWMinfo wmInfo;
|
SDL_SysWMinfo wmInfo;
|
||||||
SDL_VERSION(&wmInfo.version);
|
SDL_VERSION(&wmInfo.version);
|
||||||
SDL_GetWindowWMInfo(window, &wmInfo);
|
SDL_GetWindowWMInfo(window, &wmInfo);
|
||||||
io.ImeWindowHandle = wmInfo.info.win.window;
|
io.ImeWindowHandle = wmInfo.info.win.window;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui_ImplSdlGL3_Shutdown()
|
void ImGui_ImplSdlGL3_Shutdown()
|
||||||
{
|
{
|
||||||
ImGui_ImplSdlGL3_InvalidateDeviceObjects();
|
ImGui_ImplSdlGL3_InvalidateDeviceObjects();
|
||||||
ImGui::Shutdown();
|
ImGui::Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui_ImplSdlGL3_NewFrame()
|
void ImGui_ImplSdlGL3_NewFrame(SDL_Window* window)
|
||||||
{
|
{
|
||||||
if (!g_FontTexture)
|
if (!g_FontTexture)
|
||||||
ImGui_ImplSdlGL3_CreateDeviceObjects();
|
ImGui_ImplSdlGL3_CreateDeviceObjects();
|
||||||
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
|
||||||
// Setup display size (every frame to accommodate for window resizing)
|
// Setup display size (every frame to accommodate for window resizing)
|
||||||
int w, h;
|
int w, h;
|
||||||
SDL_GetWindowSize(g_Window, &w, &h);
|
int display_w, display_h;
|
||||||
io.DisplaySize = ImVec2((float)w, (float)h);
|
SDL_GetWindowSize(window, &w, &h);
|
||||||
io.DisplayFramebufferScale = ImVec2(1.0f, 1.0f);
|
SDL_GL_GetDrawableSize(window, &display_w, &display_h);
|
||||||
|
io.DisplaySize = ImVec2((float)w, (float)h);
|
||||||
|
io.DisplayFramebufferScale = ImVec2(w > 0 ? ((float)display_w / w) : 0, h > 0 ? ((float)display_h / h) : 0);
|
||||||
|
|
||||||
// Setup time step
|
// Setup time step
|
||||||
Uint32 time = SDL_GetTicks();
|
Uint32 time = SDL_GetTicks();
|
||||||
double current_time = time / 1000.0;
|
double current_time = time / 1000.0;
|
||||||
io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f / 60.0f);
|
io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f / 60.0f);
|
||||||
g_Time = current_time;
|
g_Time = current_time;
|
||||||
|
|
||||||
// Setup inputs
|
// Setup inputs
|
||||||
// (we already got mouse wheel, keyboard keys & characters from SDL_PollEvent())
|
// (we already got mouse wheel, keyboard keys & characters from SDL_PollEvent())
|
||||||
int mx, my;
|
int mx, my;
|
||||||
Uint32 mouseMask = SDL_GetMouseState(&mx, &my);
|
Uint32 mouseMask = SDL_GetMouseState(&mx, &my);
|
||||||
if (SDL_GetWindowFlags(g_Window) & SDL_WINDOW_MOUSE_FOCUS)
|
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.)
|
io.MousePos = ImVec2((float)mx, (float)my); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
|
||||||
else
|
else
|
||||||
io.MousePos = ImVec2(-1, -1);
|
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[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[1] = g_MousePressed[1] || (mouseMask & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0;
|
||||||
io.MouseDown[2] = g_MousePressed[2] || (mouseMask & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0;
|
io.MouseDown[2] = g_MousePressed[2] || (mouseMask & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0;
|
||||||
g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false;
|
g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false;
|
||||||
|
|
||||||
io.MouseWheel = g_MouseWheel;
|
io.MouseWheel = g_MouseWheel;
|
||||||
g_MouseWheel = 0.0f;
|
g_MouseWheel = 0.0f;
|
||||||
|
|
||||||
// Hide OS mouse cursor if ImGui is drawing it
|
// Hide OS mouse cursor if ImGui is drawing it
|
||||||
SDL_ShowCursor(io.MouseDrawCursor ? 0 : 1);
|
SDL_ShowCursor(io.MouseDrawCursor ? 0 : 1);
|
||||||
|
|
||||||
// Start the frame
|
// Start the frame
|
||||||
ImGui::NewFrame();
|
ImGui::NewFrame();
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui SDL2 binding with OpenGL3
|
// ImGui SDL2 binding with OpenGL3
|
||||||
|
// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
@ -7,9 +9,9 @@
|
|||||||
struct SDL_Window;
|
struct SDL_Window;
|
||||||
typedef union SDL_Event SDL_Event;
|
typedef union SDL_Event SDL_Event;
|
||||||
|
|
||||||
IMGUI_API bool ImGui_ImplSdlGL3_Init(SDL_Window *window);
|
IMGUI_API bool ImGui_ImplSdlGL3_Init(SDL_Window* window);
|
||||||
IMGUI_API void ImGui_ImplSdlGL3_Shutdown();
|
IMGUI_API void ImGui_ImplSdlGL3_Shutdown();
|
||||||
IMGUI_API void ImGui_ImplSdlGL3_NewFrame();
|
IMGUI_API void ImGui_ImplSdlGL3_NewFrame(SDL_Window* window);
|
||||||
IMGUI_API bool ImGui_ImplSdlGL3_ProcessEvent(SDL_Event* event);
|
IMGUI_API bool ImGui_ImplSdlGL3_ProcessEvent(SDL_Event* event);
|
||||||
|
|
||||||
// Use if you want to reset your rendering device without losing ImGui state.
|
// Use if you want to reset your rendering device without losing ImGui state.
|
||||||
|
@ -10,22 +10,24 @@
|
|||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
// Setup SDL
|
// Setup SDL
|
||||||
if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
|
if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
|
||||||
{
|
{
|
||||||
printf("Error: %s\n", SDL_GetError());
|
printf("Error: %s\n", SDL_GetError());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup window
|
// Setup window
|
||||||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG);
|
||||||
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
|
||||||
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
|
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
|
||||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
|
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
|
||||||
SDL_DisplayMode current;
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
|
||||||
SDL_GetCurrentDisplayMode(0, ¤t);
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
|
||||||
SDL_Window *window = SDL_CreateWindow("ImGui SDL2+OpenGL3 example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
|
SDL_DisplayMode current;
|
||||||
SDL_GLContext glcontext = SDL_GL_CreateContext(window);
|
SDL_GetCurrentDisplayMode(0, ¤t);
|
||||||
|
SDL_Window *window = SDL_CreateWindow("ImGui SDL2+OpenGL3 example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
|
||||||
|
SDL_GLContext glcontext = SDL_GL_CreateContext(window);
|
||||||
gl3wInit();
|
gl3wInit();
|
||||||
|
|
||||||
// Setup ImGui binding
|
// Setup ImGui binding
|
||||||
@ -46,7 +48,7 @@ int main(int, char**)
|
|||||||
ImVec4 clear_color = ImColor(114, 144, 154);
|
ImVec4 clear_color = ImColor(114, 144, 154);
|
||||||
|
|
||||||
// Main loop
|
// Main loop
|
||||||
bool done = false;
|
bool done = false;
|
||||||
while (!done)
|
while (!done)
|
||||||
{
|
{
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
@ -56,7 +58,7 @@ int main(int, char**)
|
|||||||
if (event.type == SDL_QUIT)
|
if (event.type == SDL_QUIT)
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
ImGui_ImplSdlGL3_NewFrame();
|
ImGui_ImplSdlGL3_NewFrame(window);
|
||||||
|
|
||||||
// 1. Show a simple 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"
|
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
|
||||||
@ -97,8 +99,8 @@ int main(int, char**)
|
|||||||
// Cleanup
|
// Cleanup
|
||||||
ImGui_ImplSdlGL3_Shutdown();
|
ImGui_ImplSdlGL3_Shutdown();
|
||||||
SDL_GL_DeleteContext(glcontext);
|
SDL_GL_DeleteContext(glcontext);
|
||||||
SDL_DestroyWindow(window);
|
SDL_DestroyWindow(window);
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui SDL2 binding with OpenGL
|
// ImGui SDL2 binding with OpenGL
|
||||||
|
// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
@ -21,6 +23,14 @@ static GLuint g_FontTexture = 0;
|
|||||||
// - 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)
|
||||||
void ImGui_ImplSdl_RenderDrawLists(ImDrawData* draw_data)
|
void ImGui_ImplSdl_RenderDrawLists(ImDrawData* draw_data)
|
||||||
{
|
{
|
||||||
|
// Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);
|
||||||
|
int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);
|
||||||
|
if (fb_width == 0 || fb_height == 0)
|
||||||
|
return;
|
||||||
|
draw_data->ScaleClipRects(io.DisplayFramebufferScale);
|
||||||
|
|
||||||
// We are using the OpenGL fixed pipeline to make the example code simpler to read!
|
// We are using the OpenGL fixed pipeline to make the example code simpler to read!
|
||||||
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers.
|
// Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers.
|
||||||
GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
|
||||||
@ -37,12 +47,6 @@ void ImGui_ImplSdl_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
//glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context
|
//glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context
|
||||||
|
|
||||||
// Handle cases of screen coordinates != from framebuffer coordinates (e.g. retina displays)
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
int fb_width = (int)(io.DisplaySize.x * io.DisplayFramebufferScale.x);
|
|
||||||
int fb_height = (int)(io.DisplaySize.y * io.DisplayFramebufferScale.y);
|
|
||||||
draw_data->ScaleClipRects(io.DisplayFramebufferScale);
|
|
||||||
|
|
||||||
// Setup viewport, orthographic projection matrix
|
// Setup viewport, orthographic projection matrix
|
||||||
glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
|
glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
@ -97,7 +101,7 @@ void ImGui_ImplSdl_RenderDrawLists(ImDrawData* draw_data)
|
|||||||
|
|
||||||
static const char* ImGui_ImplSdl_GetClipboardText()
|
static const char* ImGui_ImplSdl_GetClipboardText()
|
||||||
{
|
{
|
||||||
return SDL_GetClipboardText();
|
return SDL_GetClipboardText();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ImGui_ImplSdl_SetClipboardText(const char* text)
|
static void ImGui_ImplSdl_SetClipboardText(const char* text)
|
||||||
@ -139,6 +143,7 @@ bool ImGui_ImplSdl_ProcessEvent(SDL_Event* event)
|
|||||||
io.KeyShift = ((SDL_GetModState() & KMOD_SHIFT) != 0);
|
io.KeyShift = ((SDL_GetModState() & KMOD_SHIFT) != 0);
|
||||||
io.KeyCtrl = ((SDL_GetModState() & KMOD_CTRL) != 0);
|
io.KeyCtrl = ((SDL_GetModState() & KMOD_CTRL) != 0);
|
||||||
io.KeyAlt = ((SDL_GetModState() & KMOD_ALT) != 0);
|
io.KeyAlt = ((SDL_GetModState() & KMOD_ALT) != 0);
|
||||||
|
io.KeySuper = ((SDL_GetModState() & KMOD_GUI) != 0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -181,7 +186,7 @@ void ImGui_ImplSdl_InvalidateDeviceObjects()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ImGui_ImplSdl_Init(SDL_Window *window)
|
bool ImGui_ImplSdl_Init(SDL_Window* window)
|
||||||
{
|
{
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
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_Tab] = SDLK_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.
|
||||||
@ -209,9 +214,9 @@ bool ImGui_ImplSdl_Init(SDL_Window *window)
|
|||||||
io.GetClipboardTextFn = ImGui_ImplSdl_GetClipboardText;
|
io.GetClipboardTextFn = ImGui_ImplSdl_GetClipboardText;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
SDL_SysWMinfo wmInfo;
|
SDL_SysWMinfo wmInfo;
|
||||||
SDL_VERSION(&wmInfo.version);
|
SDL_VERSION(&wmInfo.version);
|
||||||
SDL_GetWindowWMInfo(window, &wmInfo);
|
SDL_GetWindowWMInfo(window, &wmInfo);
|
||||||
io.ImeWindowHandle = wmInfo.info.win.window;
|
io.ImeWindowHandle = wmInfo.info.win.window;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -233,12 +238,15 @@ void ImGui_ImplSdl_NewFrame(SDL_Window *window)
|
|||||||
|
|
||||||
// Setup display size (every frame to accommodate for window resizing)
|
// Setup display size (every frame to accommodate for window resizing)
|
||||||
int w, h;
|
int w, h;
|
||||||
SDL_GetWindowSize(window, &w, &h);
|
int display_w, display_h;
|
||||||
|
SDL_GetWindowSize(window, &w, &h);
|
||||||
|
SDL_GL_GetDrawableSize(window, &display_w, &display_h);
|
||||||
io.DisplaySize = ImVec2((float)w, (float)h);
|
io.DisplaySize = ImVec2((float)w, (float)h);
|
||||||
|
io.DisplayFramebufferScale = ImVec2(w > 0 ? ((float)display_w / w) : 0, h > 0 ? ((float)display_h / h) : 0);
|
||||||
|
|
||||||
// Setup time step
|
// Setup time step
|
||||||
Uint32 time = SDL_GetTicks();
|
Uint32 time = SDL_GetTicks();
|
||||||
double current_time = time / 1000.0;
|
double current_time = time / 1000.0;
|
||||||
io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);
|
io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f/60.0f);
|
||||||
g_Time = current_time;
|
g_Time = current_time;
|
||||||
|
|
||||||
@ -247,13 +255,13 @@ void ImGui_ImplSdl_NewFrame(SDL_Window *window)
|
|||||||
int mx, my;
|
int mx, my;
|
||||||
Uint32 mouseMask = SDL_GetMouseState(&mx, &my);
|
Uint32 mouseMask = SDL_GetMouseState(&mx, &my);
|
||||||
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MOUSE_FOCUS)
|
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.)
|
io.MousePos = ImVec2((float)mx, (float)my); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
|
||||||
else
|
else
|
||||||
io.MousePos = ImVec2(-1,-1);
|
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[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[1] = g_MousePressed[1] || (mouseMask & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0;
|
||||||
io.MouseDown[2] = g_MousePressed[2] || (mouseMask & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0;
|
io.MouseDown[2] = g_MousePressed[2] || (mouseMask & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0;
|
||||||
g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false;
|
g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false;
|
||||||
|
|
||||||
io.MouseWheel = g_MouseWheel;
|
io.MouseWheel = g_MouseWheel;
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// ImGui SDL2 binding with OpenGL
|
// ImGui SDL2 binding with OpenGL
|
||||||
|
// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
|
||||||
|
|
||||||
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
@ -7,9 +9,9 @@
|
|||||||
struct SDL_Window;
|
struct SDL_Window;
|
||||||
typedef union SDL_Event SDL_Event;
|
typedef union SDL_Event SDL_Event;
|
||||||
|
|
||||||
IMGUI_API bool ImGui_ImplSdl_Init(SDL_Window *window);
|
IMGUI_API bool ImGui_ImplSdl_Init(SDL_Window* window);
|
||||||
IMGUI_API void ImGui_ImplSdl_Shutdown();
|
IMGUI_API void ImGui_ImplSdl_Shutdown();
|
||||||
IMGUI_API void ImGui_ImplSdl_NewFrame(SDL_Window *window);
|
IMGUI_API void ImGui_ImplSdl_NewFrame(SDL_Window* window);
|
||||||
IMGUI_API bool ImGui_ImplSdl_ProcessEvent(SDL_Event* event);
|
IMGUI_API bool ImGui_ImplSdl_ProcessEvent(SDL_Event* event);
|
||||||
|
|
||||||
// Use if you want to reset your rendering device without losing ImGui state.
|
// Use if you want to reset your rendering device without losing ImGui state.
|
||||||
|
@ -10,22 +10,22 @@
|
|||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
// Setup SDL
|
// Setup SDL
|
||||||
if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
|
if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
|
||||||
{
|
{
|
||||||
printf("Error: %s\n", SDL_GetError());
|
printf("Error: %s\n", SDL_GetError());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup window
|
// Setup window
|
||||||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||||
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
|
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
|
||||||
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
|
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
|
||||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
|
||||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
|
||||||
SDL_DisplayMode current;
|
SDL_DisplayMode current;
|
||||||
SDL_GetCurrentDisplayMode(0, ¤t);
|
SDL_GetCurrentDisplayMode(0, ¤t);
|
||||||
SDL_Window *window = SDL_CreateWindow("ImGui SDL2+OpenGL example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
|
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);
|
SDL_GLContext glcontext = SDL_GL_CreateContext(window);
|
||||||
|
|
||||||
// Setup ImGui binding
|
// Setup ImGui binding
|
||||||
ImGui_ImplSdl_Init(window);
|
ImGui_ImplSdl_Init(window);
|
||||||
@ -45,7 +45,7 @@ int main(int, char**)
|
|||||||
ImVec4 clear_color = ImColor(114, 144, 154);
|
ImVec4 clear_color = ImColor(114, 144, 154);
|
||||||
|
|
||||||
// Main loop
|
// Main loop
|
||||||
bool done = false;
|
bool done = false;
|
||||||
while (!done)
|
while (!done)
|
||||||
{
|
{
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
@ -96,8 +96,8 @@ int main(int, char**)
|
|||||||
// Cleanup
|
// Cleanup
|
||||||
ImGui_ImplSdl_Shutdown();
|
ImGui_ImplSdl_Shutdown();
|
||||||
SDL_GL_DeleteContext(glcontext);
|
SDL_GL_DeleteContext(glcontext);
|
||||||
SDL_DestroyWindow(window);
|
SDL_DestroyWindow(window);
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
36
examples/vulkan_example/CMakeLists.txt
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
cmake_minimum_required(VERSION 2.8)
|
||||||
|
project(ImGuiGLFWVulkanExample C CXX)
|
||||||
|
|
||||||
|
if(NOT CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVK_PROTOTYPES")
|
||||||
|
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVK_PROTOTYPES")
|
||||||
|
|
||||||
|
# GLFW
|
||||||
|
set(GLFW_DIR ../../../glfw) # Set this to point to a up-to-date GLFW repo
|
||||||
|
option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" OFF)
|
||||||
|
option(GLFW_BUILD_TESTS "Build the GLFW test programs" OFF)
|
||||||
|
option(GLFW_BUILD_DOCS "Build the GLFW documentation" OFF)
|
||||||
|
option(GLFW_INSTALL "Generate installation target" OFF)
|
||||||
|
option(GLFW_DOCUMENT_INTERNALS "Include internals in documentation" OFF)
|
||||||
|
add_subdirectory(${GLFW_DIR} binary_dir EXCLUDE_FROM_ALL)
|
||||||
|
include_directories(${GLFW_DIR}/include)
|
||||||
|
|
||||||
|
# ImGui
|
||||||
|
set(IMGUI_DIR ../../)
|
||||||
|
include_directories(${IMGUI_DIR})
|
||||||
|
|
||||||
|
# Libraries
|
||||||
|
find_library(VULKAN_LIBRARY
|
||||||
|
NAMES vulkan vulkan-1)
|
||||||
|
set(LIBRARIES "glfw;${VULKAN_LIBRARY}")
|
||||||
|
|
||||||
|
# Use vulkan headers from glfw:
|
||||||
|
include_directories(${GLFW_DIR}/deps)
|
||||||
|
|
||||||
|
file(GLOB sources *.cpp)
|
||||||
|
|
||||||
|
add_executable(vulkan_example ${sources} ${IMGUI_DIR}/imgui.cpp ${IMGUI_DIR}/imgui_draw.cpp ${IMGUI_DIR}/imgui_demo.cpp)
|
||||||
|
target_link_libraries(vulkan_example ${LIBRARIES})
|
4
examples/vulkan_example/build_win32.bat
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler.
|
||||||
|
mkdir Debug
|
||||||
|
cl /nologo /Zi /MD /I ..\.. /I ..\libs\glfw\include /I %VULKAN_SDK%\include *.cpp ..\..\*.cpp /FeDebug/vulkan_example.exe /FoDebug/ /link /LIBPATH:..\libs\glfw\lib-vc2010-32 /libpath:%VULKAN_SDK%\bin32 glfw3.lib opengl32.lib gdi32.lib shell32.lib vulkan-1.lib
|
||||||
|
|
4
examples/vulkan_example/gen_spv.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
glslangValidator -V -o glsl_shader.frag.spv glsl_shader.frag
|
||||||
|
glslangValidator -V -o glsl_shader.vert.spv glsl_shader.vert
|
||||||
|
spirv-remap --map all --dce all --strip-all --input glsl_shader.frag.spv glsl_shader.vert.spv --output ./
|
14
examples/vulkan_example/glsl_shader.frag
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#version 450 core
|
||||||
|
layout(location = 0, index = 0) out vec4 fColor;
|
||||||
|
|
||||||
|
layout(set=0, binding=0) uniform sampler2D sTexture;
|
||||||
|
|
||||||
|
in block{
|
||||||
|
vec4 Color;
|
||||||
|
vec2 UV;
|
||||||
|
} In;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
fColor = In.Color * texture(sTexture, In.UV.st);
|
||||||
|
}
|
21
examples/vulkan_example/glsl_shader.vert
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#version 450 core
|
||||||
|
layout(location = 0) in vec2 aPos;
|
||||||
|
layout(location = 1) in vec2 aUV;
|
||||||
|
layout(location = 2) in vec4 aColor;
|
||||||
|
|
||||||
|
layout(push_constant) uniform uPushConstant{
|
||||||
|
vec2 uScale;
|
||||||
|
vec2 uTranslate;
|
||||||
|
} pc;
|
||||||
|
|
||||||
|
out block{
|
||||||
|
vec4 Color;
|
||||||
|
vec2 UV;
|
||||||
|
} Out;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
Out.Color = aColor;
|
||||||
|
Out.UV = aUV;
|
||||||
|
gl_Position = vec4(aPos*pc.uScale+pc.uTranslate, 0, 1);
|
||||||
|
}
|
935
examples/vulkan_example/imgui_impl_glfw_vulkan.cpp
Normal file
@ -0,0 +1,935 @@
|
|||||||
|
// ImGui GLFW binding with Vulkan + shaders
|
||||||
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
|
// If you use this binding you'll need to call 5 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXX_CreateFontsTexture(), ImGui_ImplXXXX_NewFrame(), ImGui_ImplXXXX_Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
|
// https://github.com/ocornut/imgui
|
||||||
|
|
||||||
|
#include <imgui.h>
|
||||||
|
|
||||||
|
// GLFW
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
|
#define GLFW_INCLUDE_VULKAN
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
#ifdef _WIN32
|
||||||
|
#undef APIENTRY
|
||||||
|
#define GLFW_EXPOSE_NATIVE_WIN32
|
||||||
|
#define GLFW_EXPOSE_NATIVE_WGL
|
||||||
|
#include <GLFW/glfw3native.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "imgui_impl_glfw_vulkan.h"
|
||||||
|
|
||||||
|
// GLFW 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;
|
||||||
|
|
||||||
|
// Vulkan Data
|
||||||
|
static VkAllocationCallbacks* g_Allocator = NULL;
|
||||||
|
static VkPhysicalDevice g_Gpu = VK_NULL_HANDLE;
|
||||||
|
static VkDevice g_Device = VK_NULL_HANDLE;
|
||||||
|
static VkRenderPass g_RenderPass = VK_NULL_HANDLE;
|
||||||
|
static VkPipelineCache g_PipelineCache = VK_NULL_HANDLE;
|
||||||
|
static VkDescriptorPool g_DescriptorPool = VK_NULL_HANDLE;
|
||||||
|
static void (*g_CheckVkResult)(VkResult err) = NULL;
|
||||||
|
|
||||||
|
static VkCommandBuffer g_CommandBuffer = VK_NULL_HANDLE;
|
||||||
|
static size_t g_BufferMemoryAlignment = 256;
|
||||||
|
static VkPipelineCreateFlags g_PipelineCreateFlags = 0;
|
||||||
|
static int g_FrameIndex = 0;
|
||||||
|
|
||||||
|
static VkDescriptorSetLayout g_DescriptorSetLayout = VK_NULL_HANDLE;
|
||||||
|
static VkPipelineLayout g_PipelineLayout = VK_NULL_HANDLE;
|
||||||
|
static VkDescriptorSet g_DescriptorSet = VK_NULL_HANDLE;
|
||||||
|
static VkPipeline g_Pipeline = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
static VkSampler g_FontSampler = VK_NULL_HANDLE;
|
||||||
|
static VkDeviceMemory g_FontMemory = VK_NULL_HANDLE;
|
||||||
|
static VkImage g_FontImage = VK_NULL_HANDLE;
|
||||||
|
static VkImageView g_FontView = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
static VkDeviceMemory g_VertexBufferMemory[IMGUI_VK_QUEUED_FRAMES] = {};
|
||||||
|
static VkDeviceMemory g_IndexBufferMemory[IMGUI_VK_QUEUED_FRAMES] = {};
|
||||||
|
static size_t g_VertexBufferSize[IMGUI_VK_QUEUED_FRAMES] = {};
|
||||||
|
static size_t g_IndexBufferSize[IMGUI_VK_QUEUED_FRAMES] = {};
|
||||||
|
static VkBuffer g_VertexBuffer[IMGUI_VK_QUEUED_FRAMES] = {};
|
||||||
|
static VkBuffer g_IndexBuffer[IMGUI_VK_QUEUED_FRAMES] = {};
|
||||||
|
|
||||||
|
static VkDeviceMemory g_UploadBufferMemory = VK_NULL_HANDLE;
|
||||||
|
static VkBuffer g_UploadBuffer = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
static unsigned char __glsl_shader_vert_spv[] =
|
||||||
|
{
|
||||||
|
0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00,
|
||||||
|
0x6c, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00,
|
||||||
|
0x11, 0x00, 0x02, 0x00, 0x21, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64,
|
||||||
|
0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0a, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x1f, 0x16, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x47, 0x11, 0x00, 0x00, 0x41, 0x14, 0x00, 0x00,
|
||||||
|
0x6a, 0x16, 0x00, 0x00, 0x42, 0x13, 0x00, 0x00, 0x80, 0x14, 0x00, 0x00,
|
||||||
|
0x47, 0x00, 0x03, 0x00, 0x1a, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||||
|
0x47, 0x00, 0x04, 0x00, 0x41, 0x14, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
|
||||||
|
0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x6a, 0x16, 0x00, 0x00,
|
||||||
|
0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
|
||||||
|
0xb1, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0xb1, 0x02, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x48, 0x00, 0x05, 0x00, 0xb1, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||||
|
0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
|
||||||
|
0xb1, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
|
||||||
|
0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0xb1, 0x02, 0x00, 0x00,
|
||||||
|
0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x80, 0x14, 0x00, 0x00,
|
||||||
|
0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
|
||||||
|
0x06, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x06, 0x04, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||||
|
0x47, 0x00, 0x03, 0x00, 0x06, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||||
|
0x47, 0x00, 0x04, 0x00, 0xfa, 0x16, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||||
|
0x21, 0x00, 0x03, 0x00, 0x02, 0x05, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||||
|
0x16, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
|
||||||
|
0x17, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
|
||||||
|
0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
|
||||||
|
0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 0x00,
|
||||||
|
0x1a, 0x04, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
|
||||||
|
0x20, 0x00, 0x04, 0x00, 0x97, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
|
||||||
|
0x1a, 0x04, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x97, 0x06, 0x00, 0x00,
|
||||||
|
0x47, 0x11, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00,
|
||||||
|
0x0c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x2b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0b, 0x0a, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x9a, 0x02, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
|
||||||
|
0x9a, 0x02, 0x00, 0x00, 0x41, 0x14, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x20, 0x00, 0x04, 0x00, 0x9b, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
|
||||||
|
0x1d, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00,
|
||||||
|
0x0e, 0x0a, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
|
||||||
|
0x90, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
|
||||||
|
0x3b, 0x00, 0x04, 0x00, 0x90, 0x02, 0x00, 0x00, 0x6a, 0x16, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x91, 0x02, 0x00, 0x00,
|
||||||
|
0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00,
|
||||||
|
0x0b, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x2b, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0d, 0x0a, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x00, 0x7f, 0x02, 0x00, 0x00,
|
||||||
|
0x0d, 0x00, 0x00, 0x00, 0x0d, 0x0a, 0x00, 0x00, 0x1e, 0x00, 0x06, 0x00,
|
||||||
|
0xb1, 0x02, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
|
||||||
|
0x7f, 0x02, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
|
||||||
|
0x2e, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xb1, 0x02, 0x00, 0x00,
|
||||||
|
0x3b, 0x00, 0x04, 0x00, 0x2e, 0x05, 0x00, 0x00, 0x42, 0x13, 0x00, 0x00,
|
||||||
|
0x03, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x90, 0x02, 0x00, 0x00,
|
||||||
|
0x80, 0x14, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 0x00,
|
||||||
|
0x06, 0x04, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
|
||||||
|
0x20, 0x00, 0x04, 0x00, 0x83, 0x06, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
|
||||||
|
0x06, 0x04, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x83, 0x06, 0x00, 0x00,
|
||||||
|
0xfa, 0x16, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
|
||||||
|
0x92, 0x02, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
|
||||||
|
0x2b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00,
|
||||||
|
0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x36, 0x00, 0x05, 0x00,
|
||||||
|
0x08, 0x00, 0x00, 0x00, 0x1f, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x02, 0x05, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x6b, 0x60, 0x00, 0x00,
|
||||||
|
0x3d, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x71, 0x4e, 0x00, 0x00,
|
||||||
|
0x41, 0x14, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x9b, 0x02, 0x00, 0x00,
|
||||||
|
0xaa, 0x26, 0x00, 0x00, 0x47, 0x11, 0x00, 0x00, 0x0b, 0x0a, 0x00, 0x00,
|
||||||
|
0x3e, 0x00, 0x03, 0x00, 0xaa, 0x26, 0x00, 0x00, 0x71, 0x4e, 0x00, 0x00,
|
||||||
|
0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0xda, 0x35, 0x00, 0x00,
|
||||||
|
0x6a, 0x16, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x91, 0x02, 0x00, 0x00,
|
||||||
|
0xea, 0x50, 0x00, 0x00, 0x47, 0x11, 0x00, 0x00, 0x0e, 0x0a, 0x00, 0x00,
|
||||||
|
0x3e, 0x00, 0x03, 0x00, 0xea, 0x50, 0x00, 0x00, 0xda, 0x35, 0x00, 0x00,
|
||||||
|
0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0xc7, 0x35, 0x00, 0x00,
|
||||||
|
0x80, 0x14, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x92, 0x02, 0x00, 0x00,
|
||||||
|
0xef, 0x56, 0x00, 0x00, 0xfa, 0x16, 0x00, 0x00, 0x0b, 0x0a, 0x00, 0x00,
|
||||||
|
0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0xe0, 0x29, 0x00, 0x00,
|
||||||
|
0xef, 0x56, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00,
|
||||||
|
0xa0, 0x22, 0x00, 0x00, 0xc7, 0x35, 0x00, 0x00, 0xe0, 0x29, 0x00, 0x00,
|
||||||
|
0x41, 0x00, 0x05, 0x00, 0x92, 0x02, 0x00, 0x00, 0x42, 0x2c, 0x00, 0x00,
|
||||||
|
0xfa, 0x16, 0x00, 0x00, 0x0e, 0x0a, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
|
||||||
|
0x13, 0x00, 0x00, 0x00, 0x09, 0x60, 0x00, 0x00, 0x42, 0x2c, 0x00, 0x00,
|
||||||
|
0x81, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00, 0xd1, 0x4e, 0x00, 0x00,
|
||||||
|
0xa0, 0x22, 0x00, 0x00, 0x09, 0x60, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00,
|
||||||
|
0x0d, 0x00, 0x00, 0x00, 0xa1, 0x41, 0x00, 0x00, 0xd1, 0x4e, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00,
|
||||||
|
0x84, 0x36, 0x00, 0x00, 0xd1, 0x4e, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x50, 0x00, 0x07, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x54, 0x47, 0x00, 0x00,
|
||||||
|
0xa1, 0x41, 0x00, 0x00, 0x84, 0x36, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00,
|
||||||
|
0x8a, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x9b, 0x02, 0x00, 0x00,
|
||||||
|
0x17, 0x2f, 0x00, 0x00, 0x42, 0x13, 0x00, 0x00, 0x0b, 0x0a, 0x00, 0x00,
|
||||||
|
0x3e, 0x00, 0x03, 0x00, 0x17, 0x2f, 0x00, 0x00, 0x54, 0x47, 0x00, 0x00,
|
||||||
|
0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
|
||||||
|
};
|
||||||
|
static unsigned int __glsl_shader_vert_spv_len = 1172;
|
||||||
|
|
||||||
|
static unsigned char __glsl_shader_frag_spv[] =
|
||||||
|
{
|
||||||
|
0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00,
|
||||||
|
0x6c, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00,
|
||||||
|
0x1f, 0x16, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x7a, 0x0c, 0x00, 0x00, 0x35, 0x16, 0x00, 0x00, 0x10, 0x00, 0x03, 0x00,
|
||||||
|
0x1f, 0x16, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
|
||||||
|
0x7a, 0x0c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x47, 0x00, 0x04, 0x00, 0x7a, 0x0c, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x1a, 0x04, 0x00, 0x00,
|
||||||
|
0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xec, 0x14, 0x00, 0x00,
|
||||||
|
0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
|
||||||
|
0xec, 0x14, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x13, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00,
|
||||||
|
0x02, 0x05, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00,
|
||||||
|
0x0d, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
|
||||||
|
0x1d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
|
||||||
|
0x20, 0x00, 0x04, 0x00, 0x9a, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
|
||||||
|
0x1d, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x9a, 0x02, 0x00, 0x00,
|
||||||
|
0x7a, 0x0c, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
|
||||||
|
0x13, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||||
|
0x1e, 0x00, 0x04, 0x00, 0x1a, 0x04, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
|
||||||
|
0x13, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x97, 0x06, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x1a, 0x04, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
|
||||||
|
0x97, 0x06, 0x00, 0x00, 0x35, 0x16, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x15, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00,
|
||||||
|
0x0b, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
|
||||||
|
0x9b, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
|
||||||
|
0x19, 0x00, 0x09, 0x00, 0x96, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
|
||||||
|
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x1b, 0x00, 0x03, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00,
|
||||||
|
0x20, 0x00, 0x04, 0x00, 0x7b, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xfe, 0x01, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x7b, 0x04, 0x00, 0x00,
|
||||||
|
0xec, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
|
||||||
|
0x0c, 0x00, 0x00, 0x00, 0x0e, 0x0a, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x20, 0x00, 0x04, 0x00, 0x90, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||||
|
0x13, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00, 0x08, 0x00, 0x00, 0x00,
|
||||||
|
0x1f, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00,
|
||||||
|
0xf8, 0x00, 0x02, 0x00, 0x6b, 0x5d, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00,
|
||||||
|
0x9b, 0x02, 0x00, 0x00, 0x8d, 0x1b, 0x00, 0x00, 0x35, 0x16, 0x00, 0x00,
|
||||||
|
0x0b, 0x0a, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x00, 0x00,
|
||||||
|
0x0b, 0x40, 0x00, 0x00, 0x8d, 0x1b, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
|
||||||
|
0xfe, 0x01, 0x00, 0x00, 0xc0, 0x36, 0x00, 0x00, 0xec, 0x14, 0x00, 0x00,
|
||||||
|
0x41, 0x00, 0x05, 0x00, 0x90, 0x02, 0x00, 0x00, 0xc2, 0x43, 0x00, 0x00,
|
||||||
|
0x35, 0x16, 0x00, 0x00, 0x0e, 0x0a, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
|
||||||
|
0x13, 0x00, 0x00, 0x00, 0x02, 0x4e, 0x00, 0x00, 0xc2, 0x43, 0x00, 0x00,
|
||||||
|
0x57, 0x00, 0x05, 0x00, 0x1d, 0x00, 0x00, 0x00, 0xb9, 0x46, 0x00, 0x00,
|
||||||
|
0xc0, 0x36, 0x00, 0x00, 0x02, 0x4e, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00,
|
||||||
|
0x1d, 0x00, 0x00, 0x00, 0xe4, 0x23, 0x00, 0x00, 0x0b, 0x40, 0x00, 0x00,
|
||||||
|
0xb9, 0x46, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x7a, 0x0c, 0x00, 0x00,
|
||||||
|
0xe4, 0x23, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
|
||||||
|
};
|
||||||
|
static unsigned int __glsl_shader_frag_spv_len = 660;
|
||||||
|
|
||||||
|
static uint32_t ImGui_ImplGlfwVulkan_MemoryType(VkMemoryPropertyFlags properties, uint32_t type_bits)
|
||||||
|
{
|
||||||
|
VkPhysicalDeviceMemoryProperties prop;
|
||||||
|
vkGetPhysicalDeviceMemoryProperties(g_Gpu, &prop);
|
||||||
|
for (uint32_t i = 0; i < prop.memoryTypeCount; i++)
|
||||||
|
if ((prop.memoryTypes[i].propertyFlags & properties) == properties && type_bits & (1<<i))
|
||||||
|
return i;
|
||||||
|
return 0xffffffff; // Unable to find memoryType
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplGlfwVulkan_VkResult(VkResult err)
|
||||||
|
{
|
||||||
|
if (g_CheckVkResult)
|
||||||
|
g_CheckVkResult(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)
|
||||||
|
void ImGui_ImplGlfwVulkan_RenderDrawLists(ImDrawData* draw_data)
|
||||||
|
{
|
||||||
|
VkResult err;
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
|
||||||
|
// Create the Vertex Buffer:
|
||||||
|
size_t vertex_size = draw_data->TotalVtxCount * sizeof(ImDrawVert);
|
||||||
|
if (!g_VertexBuffer[g_FrameIndex] || g_VertexBufferSize[g_FrameIndex] < vertex_size)
|
||||||
|
{
|
||||||
|
if (g_VertexBuffer[g_FrameIndex])
|
||||||
|
vkDestroyBuffer(g_Device, g_VertexBuffer[g_FrameIndex], g_Allocator);
|
||||||
|
if (g_VertexBufferMemory[g_FrameIndex])
|
||||||
|
vkFreeMemory(g_Device, g_VertexBufferMemory[g_FrameIndex], g_Allocator);
|
||||||
|
size_t vertex_buffer_size = ((vertex_size-1) / g_BufferMemoryAlignment+1) * g_BufferMemoryAlignment;
|
||||||
|
VkBufferCreateInfo buffer_info = {};
|
||||||
|
buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
||||||
|
buffer_info.size = vertex_buffer_size;
|
||||||
|
buffer_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
|
||||||
|
buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
|
err = vkCreateBuffer(g_Device, &buffer_info, g_Allocator, &g_VertexBuffer[g_FrameIndex]);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
VkMemoryRequirements req;
|
||||||
|
vkGetBufferMemoryRequirements(g_Device, g_VertexBuffer[g_FrameIndex], &req);
|
||||||
|
g_BufferMemoryAlignment = (g_BufferMemoryAlignment > req.alignment) ? g_BufferMemoryAlignment : req.alignment;
|
||||||
|
VkMemoryAllocateInfo alloc_info = {};
|
||||||
|
alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
||||||
|
alloc_info.allocationSize = req.size;
|
||||||
|
alloc_info.memoryTypeIndex = ImGui_ImplGlfwVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits);
|
||||||
|
err = vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &g_VertexBufferMemory[g_FrameIndex]);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
err = vkBindBufferMemory(g_Device, g_VertexBuffer[g_FrameIndex], g_VertexBufferMemory[g_FrameIndex], 0);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
g_VertexBufferSize[g_FrameIndex] = vertex_buffer_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the Index Buffer:
|
||||||
|
size_t index_size = draw_data->TotalIdxCount * sizeof(ImDrawIdx);
|
||||||
|
if (!g_IndexBuffer[g_FrameIndex] || g_IndexBufferSize[g_FrameIndex] < index_size)
|
||||||
|
{
|
||||||
|
if (g_IndexBuffer[g_FrameIndex])
|
||||||
|
vkDestroyBuffer(g_Device, g_IndexBuffer[g_FrameIndex], g_Allocator);
|
||||||
|
if (g_IndexBufferMemory[g_FrameIndex])
|
||||||
|
vkFreeMemory(g_Device, g_IndexBufferMemory[g_FrameIndex], g_Allocator);
|
||||||
|
size_t index_buffer_size = ((index_size-1) / g_BufferMemoryAlignment+1) * g_BufferMemoryAlignment;
|
||||||
|
VkBufferCreateInfo buffer_info = {};
|
||||||
|
buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
||||||
|
buffer_info.size = index_buffer_size;
|
||||||
|
buffer_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
|
||||||
|
buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
|
err = vkCreateBuffer(g_Device, &buffer_info, g_Allocator, &g_IndexBuffer[g_FrameIndex]);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
VkMemoryRequirements req;
|
||||||
|
vkGetBufferMemoryRequirements(g_Device, g_IndexBuffer[g_FrameIndex], &req);
|
||||||
|
g_BufferMemoryAlignment = (g_BufferMemoryAlignment > req.alignment) ? g_BufferMemoryAlignment : req.alignment;
|
||||||
|
VkMemoryAllocateInfo alloc_info = {};
|
||||||
|
alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
||||||
|
alloc_info.allocationSize = req.size;
|
||||||
|
alloc_info.memoryTypeIndex = ImGui_ImplGlfwVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits);
|
||||||
|
err = vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &g_IndexBufferMemory[g_FrameIndex]);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
err = vkBindBufferMemory(g_Device, g_IndexBuffer[g_FrameIndex], g_IndexBufferMemory[g_FrameIndex], 0);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
g_IndexBufferSize[g_FrameIndex] = index_buffer_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Upload Vertex and index Data:
|
||||||
|
{
|
||||||
|
ImDrawVert* vtx_dst;
|
||||||
|
ImDrawIdx* idx_dst;
|
||||||
|
err = vkMapMemory(g_Device, g_VertexBufferMemory[g_FrameIndex], 0, vertex_size, 0, (void**)(&vtx_dst));
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
err = vkMapMemory(g_Device, g_IndexBufferMemory[g_FrameIndex], 0, index_size, 0, (void**)(&idx_dst));
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
for (int n = 0; n < draw_data->CmdListsCount; n++)
|
||||||
|
{
|
||||||
|
const ImDrawList* cmd_list = draw_data->CmdLists[n];
|
||||||
|
memcpy(vtx_dst, &cmd_list->VtxBuffer[0], cmd_list->VtxBuffer.size() * sizeof(ImDrawVert));
|
||||||
|
memcpy(idx_dst, &cmd_list->IdxBuffer[0], cmd_list->IdxBuffer.size() * sizeof(ImDrawIdx));
|
||||||
|
vtx_dst += cmd_list->VtxBuffer.size();
|
||||||
|
idx_dst += cmd_list->IdxBuffer.size();
|
||||||
|
}
|
||||||
|
VkMappedMemoryRange range[2] = {};
|
||||||
|
range[0].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
|
||||||
|
range[0].memory = g_VertexBufferMemory[g_FrameIndex];
|
||||||
|
range[0].size = vertex_size;
|
||||||
|
range[1].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
|
||||||
|
range[1].memory = g_IndexBufferMemory[g_FrameIndex];
|
||||||
|
range[1].size = index_size;
|
||||||
|
err = vkFlushMappedMemoryRanges(g_Device, 2, range);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
vkUnmapMemory(g_Device, g_VertexBufferMemory[g_FrameIndex]);
|
||||||
|
vkUnmapMemory(g_Device, g_IndexBufferMemory[g_FrameIndex]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bind pipeline and descriptor sets:
|
||||||
|
{
|
||||||
|
vkCmdBindPipeline(g_CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, g_Pipeline);
|
||||||
|
VkDescriptorSet desc_set[1] = {g_DescriptorSet};
|
||||||
|
vkCmdBindDescriptorSets(g_CommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, g_PipelineLayout, 0, 1, desc_set, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bind Vertex And Index Buffer:
|
||||||
|
{
|
||||||
|
VkBuffer vertex_buffers[1] = {g_VertexBuffer[g_FrameIndex]};
|
||||||
|
VkDeviceSize vertex_offset[1] = {0};
|
||||||
|
vkCmdBindVertexBuffers(g_CommandBuffer, 0, 1, vertex_buffers, vertex_offset);
|
||||||
|
vkCmdBindIndexBuffer(g_CommandBuffer, g_IndexBuffer[g_FrameIndex], 0, VK_INDEX_TYPE_UINT16);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup viewport:
|
||||||
|
{
|
||||||
|
VkViewport viewport;
|
||||||
|
viewport.x = 0;
|
||||||
|
viewport.y = 0;
|
||||||
|
viewport.width = ImGui::GetIO().DisplaySize.x;
|
||||||
|
viewport.height = ImGui::GetIO().DisplaySize.y;
|
||||||
|
viewport.minDepth = 0.0f;
|
||||||
|
viewport.maxDepth = 1.0f;
|
||||||
|
vkCmdSetViewport(g_CommandBuffer, 0, 1, &viewport);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup scale and translation:
|
||||||
|
{
|
||||||
|
float scale[2];
|
||||||
|
scale[0] = 2.0f/io.DisplaySize.x;
|
||||||
|
scale[1] = 2.0f/io.DisplaySize.y;
|
||||||
|
float translate[2];
|
||||||
|
translate[0] = -1.0f;
|
||||||
|
translate[1] = -1.0f;
|
||||||
|
vkCmdPushConstants(g_CommandBuffer, g_PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 0, sizeof(float) * 2, scale);
|
||||||
|
vkCmdPushConstants(g_CommandBuffer, g_PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 2, sizeof(float) * 2, translate);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Render the command lists:
|
||||||
|
int vtx_offset = 0;
|
||||||
|
int idx_offset = 0;
|
||||||
|
for (int n = 0; n < draw_data->CmdListsCount; n++)
|
||||||
|
{
|
||||||
|
const ImDrawList* cmd_list = draw_data->CmdLists[n];
|
||||||
|
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.size(); cmd_i++)
|
||||||
|
{
|
||||||
|
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
|
||||||
|
if (pcmd->UserCallback)
|
||||||
|
{
|
||||||
|
pcmd->UserCallback(cmd_list, pcmd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
VkRect2D scissor;
|
||||||
|
scissor.offset.x = static_cast<int32_t>(pcmd->ClipRect.x);
|
||||||
|
scissor.offset.y = static_cast<int32_t>(pcmd->ClipRect.y);
|
||||||
|
scissor.extent.width = static_cast<uint32_t>(pcmd->ClipRect.z - pcmd->ClipRect.x);
|
||||||
|
scissor.extent.height = static_cast<uint32_t>(pcmd->ClipRect.w - pcmd->ClipRect.y + 1); // TODO: + 1??????
|
||||||
|
vkCmdSetScissor(g_CommandBuffer, 0, 1, &scissor);
|
||||||
|
vkCmdDrawIndexed(g_CommandBuffer, pcmd->ElemCount, 1, idx_offset, vtx_offset, 0);
|
||||||
|
}
|
||||||
|
idx_offset += pcmd->ElemCount;
|
||||||
|
}
|
||||||
|
vtx_offset += cmd_list->VtxBuffer.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* ImGui_ImplGlfwVulkan_GetClipboardText()
|
||||||
|
{
|
||||||
|
return glfwGetClipboardString(g_Window);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplGlfwVulkan_SetClipboardText(const char* text)
|
||||||
|
{
|
||||||
|
glfwSetClipboardString(g_Window, text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui_ImplGlfwVulkan_MouseButtonCallback(GLFWwindow*, int button, int action, int /*mods*/)
|
||||||
|
{
|
||||||
|
if (action == GLFW_PRESS && button >= 0 && button < 3)
|
||||||
|
g_MousePressed[button] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui_ImplGlfwVulkan_ScrollCallback(GLFWwindow*, double /*xoffset*/, double yoffset)
|
||||||
|
{
|
||||||
|
g_MouseWheel += (float)yoffset; // Use fractional mouse wheel, 1.0 unit 5 lines.
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui_ImplGlfwVulkan_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];
|
||||||
|
io.KeySuper = io.KeysDown[GLFW_KEY_LEFT_SUPER] || io.KeysDown[GLFW_KEY_RIGHT_SUPER];
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui_ImplGlfwVulkan_CharCallback(GLFWwindow*, unsigned int c)
|
||||||
|
{
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
if (c > 0 && c < 0x10000)
|
||||||
|
io.AddInputCharacter((unsigned short)c);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ImGui_ImplGlfwVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)
|
||||||
|
{
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
|
||||||
|
unsigned char* pixels;
|
||||||
|
int width, height;
|
||||||
|
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
|
||||||
|
size_t upload_size = width*height*4*sizeof(char);
|
||||||
|
|
||||||
|
VkResult err;
|
||||||
|
|
||||||
|
// Create the Image:
|
||||||
|
{
|
||||||
|
VkImageCreateInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
|
||||||
|
info.imageType = VK_IMAGE_TYPE_2D;
|
||||||
|
info.format = VK_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
info.extent.width = width;
|
||||||
|
info.extent.height = height;
|
||||||
|
info.extent.depth = 1;
|
||||||
|
info.mipLevels = 1;
|
||||||
|
info.arrayLayers = 1;
|
||||||
|
info.samples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
info.tiling = VK_IMAGE_TILING_OPTIMAL;
|
||||||
|
info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
|
||||||
|
info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
|
info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||||
|
err = vkCreateImage(g_Device, &info, g_Allocator, &g_FontImage);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
VkMemoryRequirements req;
|
||||||
|
vkGetImageMemoryRequirements(g_Device, g_FontImage, &req);
|
||||||
|
VkMemoryAllocateInfo alloc_info = {};
|
||||||
|
alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
||||||
|
alloc_info.allocationSize = req.size;
|
||||||
|
alloc_info.memoryTypeIndex = ImGui_ImplGlfwVulkan_MemoryType(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, req.memoryTypeBits);
|
||||||
|
err = vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &g_FontMemory);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
err = vkBindImageMemory(g_Device, g_FontImage, g_FontMemory, 0);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the Image View:
|
||||||
|
{
|
||||||
|
VkResult err;
|
||||||
|
VkImageViewCreateInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
||||||
|
info.image = g_FontImage;
|
||||||
|
info.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||||
|
info.format = VK_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
|
info.subresourceRange.levelCount = 1;
|
||||||
|
info.subresourceRange.layerCount = 1;
|
||||||
|
err = vkCreateImageView(g_Device, &info, g_Allocator, &g_FontView);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the Descriptor Set:
|
||||||
|
{
|
||||||
|
VkDescriptorImageInfo desc_image[1] = {};
|
||||||
|
desc_image[0].sampler = g_FontSampler;
|
||||||
|
desc_image[0].imageView = g_FontView;
|
||||||
|
desc_image[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||||
|
VkWriteDescriptorSet write_desc[1] = {};
|
||||||
|
write_desc[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||||
|
write_desc[0].dstSet = g_DescriptorSet;
|
||||||
|
write_desc[0].descriptorCount = 1;
|
||||||
|
write_desc[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||||
|
write_desc[0].pImageInfo = desc_image;
|
||||||
|
vkUpdateDescriptorSets(g_Device, 1, write_desc, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the Upload Buffer:
|
||||||
|
{
|
||||||
|
VkBufferCreateInfo buffer_info = {};
|
||||||
|
buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
||||||
|
buffer_info.size = upload_size;
|
||||||
|
buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
|
||||||
|
buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
|
err = vkCreateBuffer(g_Device, &buffer_info, g_Allocator, &g_UploadBuffer);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
VkMemoryRequirements req;
|
||||||
|
vkGetBufferMemoryRequirements(g_Device, g_UploadBuffer, &req);
|
||||||
|
g_BufferMemoryAlignment = (g_BufferMemoryAlignment > req.alignment) ? g_BufferMemoryAlignment : req.alignment;
|
||||||
|
VkMemoryAllocateInfo alloc_info = {};
|
||||||
|
alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
||||||
|
alloc_info.allocationSize = req.size;
|
||||||
|
alloc_info.memoryTypeIndex = ImGui_ImplGlfwVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits);
|
||||||
|
err = vkAllocateMemory(g_Device, &alloc_info, g_Allocator, &g_UploadBufferMemory);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
err = vkBindBufferMemory(g_Device, g_UploadBuffer, g_UploadBufferMemory, 0);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Upload to Buffer:
|
||||||
|
{
|
||||||
|
char* map = NULL;
|
||||||
|
err = vkMapMemory(g_Device, g_UploadBufferMemory, 0, upload_size, 0, (void**)(&map));
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
memcpy(map, pixels, upload_size);
|
||||||
|
VkMappedMemoryRange range[1] = {};
|
||||||
|
range[0].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
|
||||||
|
range[0].memory = g_UploadBufferMemory;
|
||||||
|
range[0].size = upload_size;
|
||||||
|
err = vkFlushMappedMemoryRanges(g_Device, 1, range);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
vkUnmapMemory(g_Device, g_UploadBufferMemory);
|
||||||
|
}
|
||||||
|
// Copy to Image:
|
||||||
|
{
|
||||||
|
VkImageMemoryBarrier copy_barrier[1] = {};
|
||||||
|
copy_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
||||||
|
copy_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||||
|
copy_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||||
|
copy_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
|
||||||
|
copy_barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
copy_barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
copy_barrier[0].image = g_FontImage;
|
||||||
|
copy_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
|
copy_barrier[0].subresourceRange.levelCount = 1;
|
||||||
|
copy_barrier[0].subresourceRange.layerCount = 1;
|
||||||
|
vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 0, NULL, 1, copy_barrier);
|
||||||
|
|
||||||
|
VkBufferImageCopy region = {};
|
||||||
|
region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
|
region.imageSubresource.layerCount = 1;
|
||||||
|
region.imageExtent.width = width;
|
||||||
|
region.imageExtent.height = height;
|
||||||
|
vkCmdCopyBufferToImage(command_buffer, g_UploadBuffer, g_FontImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion);
|
||||||
|
|
||||||
|
VkImageMemoryBarrier use_barrier[1] = {};
|
||||||
|
use_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
||||||
|
use_barrier[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||||
|
use_barrier[0].dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
|
||||||
|
use_barrier[0].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
|
||||||
|
use_barrier[0].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||||
|
use_barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
use_barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
use_barrier[0].image = g_FontImage;
|
||||||
|
use_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
|
use_barrier[0].subresourceRange.levelCount = 1;
|
||||||
|
use_barrier[0].subresourceRange.layerCount = 1;
|
||||||
|
vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, NULL, 0, NULL, 1, use_barrier);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store our identifier
|
||||||
|
io.Fonts->TexID = (void *)(intptr_t)g_FontImage;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ImGui_ImplGlfwVulkan_CreateDeviceObjects()
|
||||||
|
{
|
||||||
|
VkResult err;
|
||||||
|
VkShaderModule vert_module;
|
||||||
|
VkShaderModule frag_module;
|
||||||
|
|
||||||
|
// Create The Shader Modules:
|
||||||
|
{
|
||||||
|
VkShaderModuleCreateInfo vert_info = {};
|
||||||
|
vert_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||||
|
vert_info.codeSize = __glsl_shader_vert_spv_len;
|
||||||
|
vert_info.pCode = (uint32_t*)__glsl_shader_vert_spv;
|
||||||
|
err = vkCreateShaderModule(g_Device, &vert_info, g_Allocator, &vert_module);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
VkShaderModuleCreateInfo frag_info = {};
|
||||||
|
frag_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||||
|
frag_info.codeSize = __glsl_shader_frag_spv_len;
|
||||||
|
frag_info.pCode = (uint32_t*)__glsl_shader_frag_spv;
|
||||||
|
err = vkCreateShaderModule(g_Device, &frag_info, g_Allocator, &frag_module);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_FontSampler)
|
||||||
|
{
|
||||||
|
VkSamplerCreateInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
|
||||||
|
info.magFilter = VK_FILTER_LINEAR;
|
||||||
|
info.minFilter = VK_FILTER_LINEAR;
|
||||||
|
info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
|
||||||
|
info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
|
||||||
|
info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
|
||||||
|
info.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
|
||||||
|
info.minLod = -1000;
|
||||||
|
info.maxLod = 1000;
|
||||||
|
err = vkCreateSampler(g_Device, &info, g_Allocator, &g_FontSampler);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_DescriptorSetLayout)
|
||||||
|
{
|
||||||
|
VkSampler sampler[1] = {g_FontSampler};
|
||||||
|
VkDescriptorSetLayoutBinding binding[1] = {};
|
||||||
|
binding[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||||
|
binding[0].descriptorCount = 1;
|
||||||
|
binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
|
||||||
|
binding[0].pImmutableSamplers = sampler;
|
||||||
|
VkDescriptorSetLayoutCreateInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
||||||
|
info.bindingCount = 1;
|
||||||
|
info.pBindings = binding;
|
||||||
|
err = vkCreateDescriptorSetLayout(g_Device, &info, g_Allocator, &g_DescriptorSetLayout);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create Descriptor Set:
|
||||||
|
{
|
||||||
|
VkDescriptorSetAllocateInfo alloc_info = {};
|
||||||
|
alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||||
|
alloc_info.descriptorPool = g_DescriptorPool;
|
||||||
|
alloc_info.descriptorSetCount = 1;
|
||||||
|
alloc_info.pSetLayouts = &g_DescriptorSetLayout;
|
||||||
|
err = vkAllocateDescriptorSets(g_Device, &alloc_info, &g_DescriptorSet);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_PipelineLayout)
|
||||||
|
{
|
||||||
|
VkPushConstantRange push_constants[2] = {};
|
||||||
|
push_constants[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
|
||||||
|
push_constants[0].offset = sizeof(float) * 0;
|
||||||
|
push_constants[0].size = sizeof(float) * 2;
|
||||||
|
push_constants[1].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
|
||||||
|
push_constants[1].offset = sizeof(float) * 2;
|
||||||
|
push_constants[1].size = sizeof(float) * 2;
|
||||||
|
VkDescriptorSetLayout set_layout[1] = {g_DescriptorSetLayout};
|
||||||
|
VkPipelineLayoutCreateInfo layout_info = {};
|
||||||
|
layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
||||||
|
layout_info.setLayoutCount = 1;
|
||||||
|
layout_info.pSetLayouts = set_layout;
|
||||||
|
layout_info.pushConstantRangeCount = 2;
|
||||||
|
layout_info.pPushConstantRanges = push_constants;
|
||||||
|
err = vkCreatePipelineLayout(g_Device, &layout_info, g_Allocator, &g_PipelineLayout);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
VkPipelineShaderStageCreateInfo stage[2] = {};
|
||||||
|
stage[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||||
|
stage[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
|
||||||
|
stage[0].module = vert_module;
|
||||||
|
stage[0].pName = "main";
|
||||||
|
stage[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||||
|
stage[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
|
||||||
|
stage[1].module = frag_module;
|
||||||
|
stage[1].pName = "main";
|
||||||
|
|
||||||
|
VkVertexInputBindingDescription binding_desc[1] = {};
|
||||||
|
binding_desc[0].stride = sizeof(ImDrawVert);
|
||||||
|
binding_desc[0].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
|
||||||
|
|
||||||
|
VkVertexInputAttributeDescription attribute_desc[3] = {};
|
||||||
|
attribute_desc[0].location = 0;
|
||||||
|
attribute_desc[0].binding = binding_desc[0].binding;
|
||||||
|
attribute_desc[0].format = VK_FORMAT_R32G32_SFLOAT;
|
||||||
|
attribute_desc[0].offset = (size_t)(&((ImDrawVert*)0)->pos);
|
||||||
|
attribute_desc[1].location = 1;
|
||||||
|
attribute_desc[1].binding = binding_desc[0].binding;
|
||||||
|
attribute_desc[1].format = VK_FORMAT_R32G32_SFLOAT;
|
||||||
|
attribute_desc[1].offset = (size_t)(&((ImDrawVert*)0)->uv);
|
||||||
|
attribute_desc[2].location = 2;
|
||||||
|
attribute_desc[2].binding = binding_desc[0].binding;
|
||||||
|
attribute_desc[2].format = VK_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
attribute_desc[2].offset = (size_t)(&((ImDrawVert*)0)->col);
|
||||||
|
|
||||||
|
VkPipelineVertexInputStateCreateInfo vertex_info = {};
|
||||||
|
vertex_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
|
||||||
|
vertex_info.vertexBindingDescriptionCount = 1;
|
||||||
|
vertex_info.pVertexBindingDescriptions = binding_desc;
|
||||||
|
vertex_info.vertexAttributeDescriptionCount = 3;
|
||||||
|
vertex_info.pVertexAttributeDescriptions = attribute_desc;
|
||||||
|
|
||||||
|
VkPipelineInputAssemblyStateCreateInfo ia_info = {};
|
||||||
|
ia_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
|
||||||
|
ia_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
||||||
|
|
||||||
|
VkPipelineViewportStateCreateInfo viewport_info = {};
|
||||||
|
viewport_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
|
||||||
|
viewport_info.viewportCount = 1;
|
||||||
|
viewport_info.scissorCount = 1;
|
||||||
|
|
||||||
|
VkPipelineRasterizationStateCreateInfo raster_info = {};
|
||||||
|
raster_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
|
||||||
|
raster_info.polygonMode = VK_POLYGON_MODE_FILL;
|
||||||
|
raster_info.cullMode = VK_CULL_MODE_NONE;
|
||||||
|
raster_info.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
|
||||||
|
|
||||||
|
VkPipelineMultisampleStateCreateInfo ms_info = {};
|
||||||
|
ms_info.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
|
||||||
|
ms_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
|
||||||
|
VkPipelineColorBlendAttachmentState color_attachment[1] = {};
|
||||||
|
color_attachment[0].blendEnable = VK_TRUE;
|
||||||
|
color_attachment[0].srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
|
||||||
|
color_attachment[0].dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
|
||||||
|
color_attachment[0].colorBlendOp = VK_BLEND_OP_ADD;
|
||||||
|
color_attachment[0].srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
|
||||||
|
color_attachment[0].dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
|
||||||
|
color_attachment[0].alphaBlendOp = VK_BLEND_OP_ADD;
|
||||||
|
color_attachment[0].colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
|
||||||
|
|
||||||
|
VkPipelineColorBlendStateCreateInfo blend_info = {};
|
||||||
|
blend_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
|
||||||
|
blend_info.attachmentCount = 1;
|
||||||
|
blend_info.pAttachments = color_attachment;
|
||||||
|
|
||||||
|
VkDynamicState dynamic_states[2] = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR };
|
||||||
|
VkPipelineDynamicStateCreateInfo dynamic_state = {};
|
||||||
|
dynamic_state.dynamicStateCount = 2;
|
||||||
|
dynamic_state.pDynamicStates = dynamic_states;
|
||||||
|
|
||||||
|
VkGraphicsPipelineCreateInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
||||||
|
info.flags = g_PipelineCreateFlags;
|
||||||
|
info.stageCount = 2;
|
||||||
|
info.pStages = stage;
|
||||||
|
info.pVertexInputState = &vertex_info;
|
||||||
|
info.pInputAssemblyState = &ia_info;
|
||||||
|
info.pViewportState = &viewport_info;
|
||||||
|
info.pRasterizationState = &raster_info;
|
||||||
|
info.pMultisampleState = &ms_info;
|
||||||
|
info.pColorBlendState = &blend_info;
|
||||||
|
info.pDynamicState = &dynamic_state;
|
||||||
|
info.layout = g_PipelineLayout;
|
||||||
|
info.renderPass = g_RenderPass;
|
||||||
|
err = vkCreateGraphicsPipelines(g_Device, g_PipelineCache, 1, &info, g_Allocator, &g_Pipeline);
|
||||||
|
ImGui_ImplGlfwVulkan_VkResult(err);
|
||||||
|
|
||||||
|
vkDestroyShaderModule(g_Device, vert_module, g_Allocator);
|
||||||
|
vkDestroyShaderModule(g_Device, frag_module, g_Allocator);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui_ImplGlfwVulkan_InvalidateFontUploadObjects()
|
||||||
|
{
|
||||||
|
if (g_UploadBuffer)
|
||||||
|
{
|
||||||
|
vkDestroyBuffer(g_Device, g_UploadBuffer, g_Allocator);
|
||||||
|
g_UploadBuffer = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
if (g_UploadBufferMemory)
|
||||||
|
{
|
||||||
|
vkFreeMemory(g_Device, g_UploadBufferMemory, g_Allocator);
|
||||||
|
g_UploadBufferMemory = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui_ImplGlfwVulkan_InvalidateDeviceObjects()
|
||||||
|
{
|
||||||
|
ImGui_ImplGlfwVulkan_InvalidateFontUploadObjects();
|
||||||
|
for (int i=0; i<IMGUI_VK_QUEUED_FRAMES; i++)
|
||||||
|
{
|
||||||
|
if (g_VertexBuffer[i])
|
||||||
|
vkDestroyBuffer(g_Device, g_VertexBuffer[i], g_Allocator);
|
||||||
|
if (g_VertexBufferMemory[i])
|
||||||
|
vkFreeMemory(g_Device, g_VertexBufferMemory[i], g_Allocator);
|
||||||
|
if (g_IndexBuffer[i])
|
||||||
|
vkDestroyBuffer(g_Device, g_IndexBuffer[i], g_Allocator);
|
||||||
|
if (g_IndexBufferMemory[i])
|
||||||
|
vkFreeMemory(g_Device, g_IndexBufferMemory[i], g_Allocator);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_FontView)
|
||||||
|
vkDestroyImageView(g_Device, g_FontView, g_Allocator);
|
||||||
|
if (g_FontImage)
|
||||||
|
vkDestroyImage(g_Device, g_FontImage, g_Allocator);
|
||||||
|
if (g_FontMemory)
|
||||||
|
vkFreeMemory(g_Device, g_FontMemory, g_Allocator);
|
||||||
|
if (g_FontSampler)
|
||||||
|
vkDestroySampler(g_Device, g_FontSampler, g_Allocator);
|
||||||
|
|
||||||
|
if (g_DescriptorSetLayout)
|
||||||
|
vkDestroyDescriptorSetLayout(g_Device, g_DescriptorSetLayout, g_Allocator);
|
||||||
|
if (g_PipelineLayout)
|
||||||
|
vkDestroyPipelineLayout(g_Device, g_PipelineLayout, g_Allocator);
|
||||||
|
if (g_Pipeline)
|
||||||
|
vkDestroyPipeline(g_Device, g_Pipeline, g_Allocator);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ImGui_ImplGlfwVulkan_Init(GLFWwindow* window, bool install_callbacks, ImGui_ImplGlfwVulkan_Init_Data *init_data)
|
||||||
|
{
|
||||||
|
g_Allocator = init_data->allocator;
|
||||||
|
g_Gpu = init_data->gpu;
|
||||||
|
g_Device = init_data->device;
|
||||||
|
g_RenderPass = init_data->render_pass;
|
||||||
|
g_PipelineCache = init_data->pipeline_cache;
|
||||||
|
g_DescriptorPool = init_data->descriptor_pool;
|
||||||
|
g_CheckVkResult = init_data->check_vk_result;
|
||||||
|
|
||||||
|
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_ImplGlfwVulkan_RenderDrawLists; // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.
|
||||||
|
io.SetClipboardTextFn = ImGui_ImplGlfwVulkan_SetClipboardText;
|
||||||
|
io.GetClipboardTextFn = ImGui_ImplGlfwVulkan_GetClipboardText;
|
||||||
|
#ifdef _WIN32
|
||||||
|
io.ImeWindowHandle = glfwGetWin32Window(g_Window);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (install_callbacks)
|
||||||
|
{
|
||||||
|
glfwSetMouseButtonCallback(window, ImGui_ImplGlfwVulkan_MouseButtonCallback);
|
||||||
|
glfwSetScrollCallback(window, ImGui_ImplGlfwVulkan_ScrollCallback);
|
||||||
|
glfwSetKeyCallback(window, ImGui_ImplGlfwVulkan_KeyCallback);
|
||||||
|
glfwSetCharCallback(window, ImGui_ImplGlfwVulkan_CharCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui_ImplGlfwVulkan_CreateDeviceObjects();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui_ImplGlfwVulkan_Shutdown()
|
||||||
|
{
|
||||||
|
ImGui_ImplGlfwVulkan_InvalidateDeviceObjects();
|
||||||
|
ImGui::Shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGui_ImplGlfwVulkan_NewFrame()
|
||||||
|
{
|
||||||
|
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)w, (float)h);
|
||||||
|
io.DisplayFramebufferScale = ImVec2(w > 0 ? ((float)display_w / w) : 0, h > 0 ? ((float)display_h / h) : 0);
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
io.MousePos = ImVec2((float)mouse_x, (float)mouse_y); // Mouse position in screen coordinates (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();
|
||||||
|
}
|
||||||
|
void ImGui_ImplGlfwVulkan_Render(VkCommandBuffer command_buffer)
|
||||||
|
{
|
||||||
|
g_CommandBuffer = command_buffer;
|
||||||
|
ImGui::Render();
|
||||||
|
g_CommandBuffer = VK_NULL_HANDLE;
|
||||||
|
g_FrameIndex = (g_FrameIndex + 1) % IMGUI_VK_QUEUED_FRAMES;
|
||||||
|
}
|
40
examples/vulkan_example/imgui_impl_glfw_vulkan.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// ImGui GLFW binding with Vulkan + shaders
|
||||||
|
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
|
||||||
|
// If you use this binding you'll need to call 5 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXX_CreateFontsTexture(), ImGui_ImplXXXX_NewFrame(), ImGui_ImplXXXX_Render() and ImGui_ImplXXXX_Shutdown().
|
||||||
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
|
// https://github.com/ocornut/imgui
|
||||||
|
|
||||||
|
struct GLFWwindow;
|
||||||
|
|
||||||
|
#define IMGUI_VK_QUEUED_FRAMES 2
|
||||||
|
|
||||||
|
struct ImGui_ImplGlfwVulkan_Init_Data
|
||||||
|
{
|
||||||
|
VkAllocationCallbacks* allocator;
|
||||||
|
VkPhysicalDevice gpu;
|
||||||
|
VkDevice device;
|
||||||
|
VkRenderPass render_pass;
|
||||||
|
VkPipelineCache pipeline_cache;
|
||||||
|
VkDescriptorPool descriptor_pool;
|
||||||
|
void (*check_vk_result)(VkResult err);
|
||||||
|
};
|
||||||
|
|
||||||
|
IMGUI_API bool ImGui_ImplGlfwVulkan_Init(GLFWwindow* window, bool install_callbacks, ImGui_ImplGlfwVulkan_Init_Data *init_data);
|
||||||
|
IMGUI_API void ImGui_ImplGlfwVulkan_Shutdown();
|
||||||
|
IMGUI_API void ImGui_ImplGlfwVulkan_NewFrame();
|
||||||
|
IMGUI_API void ImGui_ImplGlfwVulkan_Render(VkCommandBuffer command_buffer);
|
||||||
|
|
||||||
|
// Use if you want to reset your rendering device without losing ImGui state.
|
||||||
|
IMGUI_API void ImGui_ImplGlfwVulkan_InvalidateFontUploadObjects();
|
||||||
|
IMGUI_API void ImGui_ImplGlfwVulkan_InvalidateDeviceObjects();
|
||||||
|
IMGUI_API bool ImGui_ImplGlfwVulkan_CreateFontsTexture(VkCommandBuffer command_buffer);
|
||||||
|
IMGUI_API bool ImGui_ImplGlfwVulkan_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.
|
||||||
|
IMGUI_API void ImGui_ImplGlfwVulkan_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods);
|
||||||
|
IMGUI_API void ImGui_ImplGlfwVulkan_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset);
|
||||||
|
IMGUI_API void ImGui_ImplGlfwVulkan_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);
|
||||||
|
IMGUI_API void ImGui_ImplGlfwVulkan_CharCallback(GLFWwindow* window, unsigned int c);
|
||||||
|
|
539
examples/vulkan_example/main.cpp
Normal file
@ -0,0 +1,539 @@
|
|||||||
|
// ImGui - standalone example application for Glfw + Vulkan, using programmable pipeline
|
||||||
|
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
|
||||||
|
|
||||||
|
#include <imgui.h>
|
||||||
|
|
||||||
|
#include <stdio.h> // printf, fprintf
|
||||||
|
#include <stdlib.h> // abort
|
||||||
|
#define GLFW_INCLUDE_NONE
|
||||||
|
#define GLFW_INCLUDE_VULKAN
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
#include "imgui_impl_glfw_vulkan.h"
|
||||||
|
|
||||||
|
#define IMGUI_MAX_POSSIBLE_BACK_BUFFERS 16
|
||||||
|
|
||||||
|
static VkAllocationCallbacks* g_Allocator = NULL;
|
||||||
|
static VkInstance g_Instance = VK_NULL_HANDLE;
|
||||||
|
static VkSurfaceKHR g_Surface = VK_NULL_HANDLE;
|
||||||
|
static VkPhysicalDevice g_Gpu = VK_NULL_HANDLE;
|
||||||
|
static VkDevice g_Device = VK_NULL_HANDLE;
|
||||||
|
static VkSwapchainKHR g_Swapchain = VK_NULL_HANDLE;
|
||||||
|
static VkRenderPass g_RenderPass = VK_NULL_HANDLE;
|
||||||
|
static uint32_t g_QueueFamily = 0;
|
||||||
|
static VkQueue g_Queue = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
static VkFormat g_Format = VK_FORMAT_B8G8R8A8_UNORM;
|
||||||
|
static VkColorSpaceKHR g_ColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR;
|
||||||
|
static VkImageSubresourceRange g_ImageRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
|
||||||
|
|
||||||
|
static VkPipelineCache g_PipelineCache = VK_NULL_HANDLE;
|
||||||
|
static VkDescriptorPool g_DescriptorPool = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
static int fb_width, fb_height;
|
||||||
|
static uint32_t g_BackBufferIndex = 0;
|
||||||
|
static uint32_t g_BackBufferCount = 0;
|
||||||
|
static VkImage g_BackBuffer[IMGUI_MAX_POSSIBLE_BACK_BUFFERS] = {};
|
||||||
|
static VkImageView g_BackBufferView[IMGUI_MAX_POSSIBLE_BACK_BUFFERS] = {};
|
||||||
|
static VkFramebuffer g_Framebuffer[IMGUI_MAX_POSSIBLE_BACK_BUFFERS] = {};
|
||||||
|
|
||||||
|
static uint32_t g_FrameIndex = 0;
|
||||||
|
static VkCommandPool g_CommandPool[IMGUI_VK_QUEUED_FRAMES];
|
||||||
|
static VkCommandBuffer g_CommandBuffer[IMGUI_VK_QUEUED_FRAMES];
|
||||||
|
static VkFence g_Fence[IMGUI_VK_QUEUED_FRAMES];
|
||||||
|
static VkSemaphore g_Semaphore[IMGUI_VK_QUEUED_FRAMES];
|
||||||
|
|
||||||
|
static VkClearValue g_ClearValue = {};
|
||||||
|
|
||||||
|
static void check_vk_result(VkResult err)
|
||||||
|
{
|
||||||
|
if (err == 0) return;
|
||||||
|
printf("VkResult %d\n", err);
|
||||||
|
if (err < 0)
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void resize_vulkan(GLFWwindow* /*window*/, int w, int h)
|
||||||
|
{
|
||||||
|
VkResult err;
|
||||||
|
VkSwapchainKHR old_swapchain = g_Swapchain;
|
||||||
|
err = vkDeviceWaitIdle(g_Device);
|
||||||
|
check_vk_result(err);
|
||||||
|
|
||||||
|
// Destroy old Framebuffer:
|
||||||
|
for (uint32_t i=0; i<g_BackBufferCount; i++)
|
||||||
|
if (g_BackBufferView[i])
|
||||||
|
vkDestroyImageView(g_Device, g_BackBufferView[i], g_Allocator);
|
||||||
|
for(uint32_t i=0; i<g_BackBufferCount; i++)
|
||||||
|
if (g_Framebuffer[i])
|
||||||
|
vkDestroyFramebuffer(g_Device, g_Framebuffer[i], g_Allocator);
|
||||||
|
if (g_RenderPass)
|
||||||
|
vkDestroyRenderPass(g_Device, g_RenderPass, g_Allocator);
|
||||||
|
|
||||||
|
// Create Swapchain:
|
||||||
|
{
|
||||||
|
VkSwapchainCreateInfoKHR info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
|
||||||
|
info.surface = g_Surface;
|
||||||
|
info.imageFormat = g_Format;
|
||||||
|
info.imageColorSpace = g_ColorSpace;
|
||||||
|
info.imageArrayLayers = 1;
|
||||||
|
info.imageUsage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
||||||
|
info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
||||||
|
info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
|
||||||
|
info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
|
||||||
|
info.presentMode = VK_PRESENT_MODE_FIFO_KHR;
|
||||||
|
info.clipped = VK_TRUE;
|
||||||
|
info.oldSwapchain = old_swapchain;
|
||||||
|
VkSurfaceCapabilitiesKHR cap;
|
||||||
|
err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(g_Gpu, g_Surface, &cap);
|
||||||
|
check_vk_result(err);
|
||||||
|
info.minImageCount = (cap.minImageCount + 2 < cap.maxImageCount) ? (cap.minImageCount + 2) : cap.maxImageCount;
|
||||||
|
if (cap.currentExtent.width == 0xffffffff)
|
||||||
|
{
|
||||||
|
fb_width = w;
|
||||||
|
fb_height = h;
|
||||||
|
info.imageExtent.width = fb_width;
|
||||||
|
info.imageExtent.height = fb_height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fb_width = cap.currentExtent.width;
|
||||||
|
fb_height = cap.currentExtent.height;
|
||||||
|
info.imageExtent.width = fb_width;
|
||||||
|
info.imageExtent.height = fb_height;
|
||||||
|
}
|
||||||
|
err = vkCreateSwapchainKHR(g_Device, &info, g_Allocator, &g_Swapchain);
|
||||||
|
check_vk_result(err);
|
||||||
|
err = vkGetSwapchainImagesKHR(g_Device, g_Swapchain, &g_BackBufferCount, NULL);
|
||||||
|
check_vk_result(err);
|
||||||
|
err = vkGetSwapchainImagesKHR(g_Device, g_Swapchain, &g_BackBufferCount, g_BackBuffer);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
if (old_swapchain)
|
||||||
|
vkDestroySwapchainKHR(g_Device, old_swapchain, g_Allocator);
|
||||||
|
|
||||||
|
// Create the Render Pass:
|
||||||
|
{
|
||||||
|
VkAttachmentDescription attachment = {};
|
||||||
|
attachment.format = g_Format;
|
||||||
|
attachment.samples = VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||||
|
attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||||
|
attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
|
attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||||
|
attachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
VkAttachmentReference color_attachment = {};
|
||||||
|
color_attachment.attachment = 0;
|
||||||
|
color_attachment.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
VkSubpassDescription subpass = {};
|
||||||
|
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||||
|
subpass.colorAttachmentCount = 1;
|
||||||
|
subpass.pColorAttachments = &color_attachment;
|
||||||
|
VkRenderPassCreateInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
||||||
|
info.attachmentCount = 1;
|
||||||
|
info.pAttachments = &attachment;
|
||||||
|
info.subpassCount = 1;
|
||||||
|
info.pSubpasses = &subpass;
|
||||||
|
err = vkCreateRenderPass(g_Device, &info, g_Allocator, &g_RenderPass);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create The Image Views
|
||||||
|
{
|
||||||
|
VkImageViewCreateInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
||||||
|
info.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||||
|
info.format = g_Format;
|
||||||
|
info.components.r = VK_COMPONENT_SWIZZLE_R;
|
||||||
|
info.components.g = VK_COMPONENT_SWIZZLE_G;
|
||||||
|
info.components.b = VK_COMPONENT_SWIZZLE_B;
|
||||||
|
info.components.a = VK_COMPONENT_SWIZZLE_A;
|
||||||
|
info.subresourceRange = g_ImageRange;
|
||||||
|
for (uint32_t i = 0; i<g_BackBufferCount; i++)
|
||||||
|
{
|
||||||
|
info.image = g_BackBuffer[i];
|
||||||
|
err = vkCreateImageView(g_Device, &info, g_Allocator, &g_BackBufferView[i]);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create Framebuffer:
|
||||||
|
{
|
||||||
|
VkImageView attachment[1];
|
||||||
|
VkFramebufferCreateInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
||||||
|
info.renderPass = g_RenderPass;
|
||||||
|
info.attachmentCount = 1;
|
||||||
|
info.pAttachments = attachment;
|
||||||
|
info.width = fb_width;
|
||||||
|
info.height = fb_height;
|
||||||
|
info.layers = 1;
|
||||||
|
for (uint32_t i = 0; i<g_BackBufferCount; i++)
|
||||||
|
{
|
||||||
|
attachment[0] = g_BackBufferView[i];
|
||||||
|
err = vkCreateFramebuffer(g_Device, &info, g_Allocator, &g_Framebuffer[i]);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setup_vulkan(GLFWwindow* window)
|
||||||
|
{
|
||||||
|
VkResult err;
|
||||||
|
|
||||||
|
// Create Vulkan Instance
|
||||||
|
{
|
||||||
|
uint32_t glfw_extensions_count;
|
||||||
|
const char** glfw_extensions = glfwGetRequiredInstanceExtensions(&glfw_extensions_count);
|
||||||
|
VkInstanceCreateInfo create_info = {};
|
||||||
|
create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
||||||
|
create_info.enabledExtensionCount = glfw_extensions_count;
|
||||||
|
create_info.ppEnabledExtensionNames = glfw_extensions;
|
||||||
|
err = vkCreateInstance(&create_info, g_Allocator, &g_Instance);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create Window Surface
|
||||||
|
{
|
||||||
|
err = glfwCreateWindowSurface(g_Instance, window, g_Allocator, &g_Surface);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get GPU
|
||||||
|
{
|
||||||
|
uint32_t count = 1;
|
||||||
|
err = vkEnumeratePhysicalDevices(g_Instance, &count, &g_Gpu);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create Logical Device
|
||||||
|
{
|
||||||
|
int device_extension_count = 1;
|
||||||
|
const char* device_extensions[] = {"VK_KHR_swapchain"};
|
||||||
|
const uint32_t queue_index = 0;
|
||||||
|
const uint32_t queue_count = 1;
|
||||||
|
const float queue_priority[] = {1.0f};
|
||||||
|
VkDeviceQueueCreateInfo queue_info[1] = {};
|
||||||
|
queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
||||||
|
queue_info[0].queueFamilyIndex = g_QueueFamily;
|
||||||
|
queue_info[0].queueCount = queue_count;
|
||||||
|
queue_info[0].pQueuePriorities = queue_priority;
|
||||||
|
VkDeviceCreateInfo create_info = {};
|
||||||
|
create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
|
||||||
|
create_info.queueCreateInfoCount = sizeof(queue_info)/sizeof(queue_info[0]);
|
||||||
|
create_info.pQueueCreateInfos = queue_info;
|
||||||
|
create_info.enabledExtensionCount = device_extension_count;
|
||||||
|
create_info.ppEnabledExtensionNames = device_extensions;
|
||||||
|
err = vkCreateDevice(g_Gpu, &create_info, g_Allocator, &g_Device);
|
||||||
|
check_vk_result(err);
|
||||||
|
vkGetDeviceQueue(g_Device, g_QueueFamily, queue_index, &g_Queue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create Framebuffers
|
||||||
|
{
|
||||||
|
int w, h;
|
||||||
|
glfwGetFramebufferSize(window, &w, &h);
|
||||||
|
resize_vulkan(window, w, h);
|
||||||
|
glfwSetFramebufferSizeCallback(window, resize_vulkan);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create Command Buffers
|
||||||
|
for (int i=0; i<IMGUI_VK_QUEUED_FRAMES; i++)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
VkCommandPoolCreateInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
||||||
|
info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
|
||||||
|
info.queueFamilyIndex = g_QueueFamily;
|
||||||
|
err = vkCreateCommandPool(g_Device, &info, g_Allocator, &g_CommandPool[i]);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
VkCommandBufferAllocateInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
|
||||||
|
info.commandPool = g_CommandPool[i];
|
||||||
|
info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
|
||||||
|
info.commandBufferCount = 1;
|
||||||
|
err = vkAllocateCommandBuffers(g_Device, &info, &g_CommandBuffer[i]);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
VkFenceCreateInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
||||||
|
info.flags = VK_FENCE_CREATE_SIGNALED_BIT;
|
||||||
|
err = vkCreateFence(g_Device, &info, g_Allocator, &g_Fence[i]);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
VkSemaphoreCreateInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
|
||||||
|
err = vkCreateSemaphore(g_Device, &info, g_Allocator, &g_Semaphore[i]);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create Descriptor Pool
|
||||||
|
{
|
||||||
|
VkDescriptorPoolSize pool_size[11] =
|
||||||
|
{
|
||||||
|
{ VK_DESCRIPTOR_TYPE_SAMPLER, 1000 },
|
||||||
|
{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1000 },
|
||||||
|
{ VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1000 },
|
||||||
|
{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1000 },
|
||||||
|
{ VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1000 },
|
||||||
|
{ VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1000 },
|
||||||
|
{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1000 },
|
||||||
|
{ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1000 },
|
||||||
|
{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1000 },
|
||||||
|
{ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 1000 },
|
||||||
|
{ VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1000 }
|
||||||
|
};
|
||||||
|
VkDescriptorPoolCreateInfo pool_info = {};
|
||||||
|
pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
||||||
|
pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
|
||||||
|
pool_info.maxSets = 1000 * 11;
|
||||||
|
pool_info.poolSizeCount = 11;
|
||||||
|
pool_info.pPoolSizes = pool_size;
|
||||||
|
err = vkCreateDescriptorPool(g_Device, &pool_info, g_Allocator, &g_DescriptorPool);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cleanup_vulkan()
|
||||||
|
{
|
||||||
|
vkDestroyDescriptorPool(g_Device, g_DescriptorPool, g_Allocator);
|
||||||
|
for (int i = 0; i < IMGUI_VK_QUEUED_FRAMES; i++)
|
||||||
|
{
|
||||||
|
vkDestroyFence(g_Device, g_Fence[i], g_Allocator);
|
||||||
|
vkFreeCommandBuffers(g_Device, g_CommandPool[i], 1, &g_CommandBuffer[i]);
|
||||||
|
vkDestroyCommandPool(g_Device, g_CommandPool[i], g_Allocator);
|
||||||
|
vkDestroySemaphore(g_Device, g_Semaphore[i], g_Allocator);
|
||||||
|
}
|
||||||
|
for (uint32_t i = 0; i < g_BackBufferCount; i++)
|
||||||
|
{
|
||||||
|
vkDestroyImageView(g_Device, g_BackBufferView[i], g_Allocator);
|
||||||
|
vkDestroyFramebuffer(g_Device, g_Framebuffer[i], g_Allocator);
|
||||||
|
}
|
||||||
|
vkDestroyRenderPass(g_Device, g_RenderPass, g_Allocator);
|
||||||
|
vkDestroySwapchainKHR(g_Device, g_Swapchain, g_Allocator);
|
||||||
|
vkDestroySurfaceKHR(g_Instance, g_Surface, g_Allocator);
|
||||||
|
vkDestroyDevice(g_Device, g_Allocator);
|
||||||
|
vkDestroyInstance(g_Instance, g_Allocator);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void frame_begin()
|
||||||
|
{
|
||||||
|
VkResult err;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
err = vkWaitForFences(g_Device, 1, &g_Fence[g_FrameIndex], VK_TRUE, 100);
|
||||||
|
if (err == VK_SUCCESS) break;
|
||||||
|
if (err == VK_TIMEOUT) continue;
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
err = vkAcquireNextImageKHR(g_Device, g_Swapchain, UINT64_MAX, g_Semaphore[g_FrameIndex], VK_NULL_HANDLE, &g_BackBufferIndex);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
err = vkResetCommandPool(g_Device, g_CommandPool[g_FrameIndex], 0);
|
||||||
|
check_vk_result(err);
|
||||||
|
VkCommandBufferBeginInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
||||||
|
info.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
|
||||||
|
err = vkBeginCommandBuffer(g_CommandBuffer[g_FrameIndex], &info);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
VkRenderPassBeginInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
||||||
|
info.renderPass = g_RenderPass;
|
||||||
|
info.framebuffer = g_Framebuffer[g_BackBufferIndex];
|
||||||
|
info.renderArea.extent.width = fb_width;
|
||||||
|
info.renderArea.extent.height = fb_height;
|
||||||
|
info.clearValueCount = 1;
|
||||||
|
info.pClearValues = &g_ClearValue;
|
||||||
|
vkCmdBeginRenderPass(g_CommandBuffer[g_FrameIndex], &info, VK_SUBPASS_CONTENTS_INLINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void frame_end()
|
||||||
|
{
|
||||||
|
VkResult err;
|
||||||
|
vkCmdEndRenderPass(g_CommandBuffer[g_FrameIndex]);
|
||||||
|
{
|
||||||
|
VkImageMemoryBarrier barrier = {};
|
||||||
|
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
||||||
|
barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||||
|
barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
||||||
|
barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
||||||
|
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
barrier.image = g_BackBuffer[g_BackBufferIndex];
|
||||||
|
barrier.subresourceRange = g_ImageRange;
|
||||||
|
vkCmdPipelineBarrier(g_CommandBuffer[g_FrameIndex], VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, NULL, 0, NULL, 1, &barrier);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
VkSubmitInfo info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
||||||
|
info.waitSemaphoreCount = 1;
|
||||||
|
info.pWaitSemaphores = &g_Semaphore[g_FrameIndex];
|
||||||
|
info.commandBufferCount = 1;
|
||||||
|
info.pCommandBuffers = &g_CommandBuffer[g_FrameIndex];
|
||||||
|
|
||||||
|
err = vkEndCommandBuffer(g_CommandBuffer[g_FrameIndex]);
|
||||||
|
check_vk_result(err);
|
||||||
|
err = vkResetFences(g_Device, 1, &g_Fence[g_FrameIndex]);
|
||||||
|
check_vk_result(err);
|
||||||
|
err = vkQueueSubmit(g_Queue, 1, &info, g_Fence[g_FrameIndex]);
|
||||||
|
check_vk_result(err);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
VkResult res;
|
||||||
|
VkSwapchainKHR swapchains[1] = {g_Swapchain};
|
||||||
|
uint32_t indices[1] = {g_BackBufferIndex};
|
||||||
|
VkPresentInfoKHR info = {};
|
||||||
|
info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
||||||
|
info.swapchainCount = 1;
|
||||||
|
info.pSwapchains = swapchains;
|
||||||
|
info.pImageIndices = indices;
|
||||||
|
info.pResults = &res;
|
||||||
|
err = vkQueuePresentKHR(g_Queue, &info);
|
||||||
|
check_vk_result(err);
|
||||||
|
check_vk_result(res);
|
||||||
|
}
|
||||||
|
g_FrameIndex = (g_FrameIndex) % IMGUI_VK_QUEUED_FRAMES;
|
||||||
|
}
|
||||||
|
|
||||||
|
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())
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
|
||||||
|
GLFWwindow* window = glfwCreateWindow(1280, 720, "ImGui Vulkan example", NULL, NULL);
|
||||||
|
|
||||||
|
// Setup Vulkan
|
||||||
|
if (!glfwVulkanSupported())
|
||||||
|
{
|
||||||
|
printf("GLFW: Vulkan Not Supported\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
setup_vulkan(window);
|
||||||
|
|
||||||
|
// Setup ImGui binding
|
||||||
|
ImGui_ImplGlfwVulkan_Init_Data init_data = {};
|
||||||
|
init_data.allocator = g_Allocator;
|
||||||
|
init_data.gpu = g_Gpu;
|
||||||
|
init_data.device = g_Device;
|
||||||
|
init_data.render_pass = g_RenderPass;
|
||||||
|
init_data.pipeline_cache = g_PipelineCache;
|
||||||
|
init_data.descriptor_pool = g_DescriptorPool;
|
||||||
|
init_data.check_vk_result = check_vk_result;
|
||||||
|
ImGui_ImplGlfwVulkan_Init(window, true, &init_data);
|
||||||
|
|
||||||
|
// Load Fonts
|
||||||
|
// (there is a default font, this is only if you want to change it. see extra_fonts/README.txt for more details)
|
||||||
|
//ImGuiIO& io = ImGui::GetIO();
|
||||||
|
//io.Fonts->AddFontDefault();
|
||||||
|
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/Cousine-Regular.ttf", 15.0f);
|
||||||
|
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/DroidSans.ttf", 16.0f);
|
||||||
|
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyClean.ttf", 13.0f);
|
||||||
|
//io.Fonts->AddFontFromFileTTF("../../extra_fonts/ProggyTiny.ttf", 10.0f);
|
||||||
|
//io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
|
||||||
|
|
||||||
|
// Upload Fonts
|
||||||
|
{
|
||||||
|
VkResult err;
|
||||||
|
err = vkResetCommandPool(g_Device, g_CommandPool[g_FrameIndex], 0);
|
||||||
|
check_vk_result(err);
|
||||||
|
VkCommandBufferBeginInfo begin_info = {};
|
||||||
|
begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
||||||
|
begin_info.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
|
||||||
|
err = vkBeginCommandBuffer(g_CommandBuffer[g_FrameIndex], &begin_info);
|
||||||
|
check_vk_result(err);
|
||||||
|
|
||||||
|
ImGui_ImplGlfwVulkan_CreateFontsTexture(g_CommandBuffer[g_FrameIndex]);
|
||||||
|
|
||||||
|
VkSubmitInfo end_info = {};
|
||||||
|
end_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
||||||
|
end_info.commandBufferCount = 1;
|
||||||
|
end_info.pCommandBuffers = &g_CommandBuffer[g_FrameIndex];
|
||||||
|
err = vkEndCommandBuffer(g_CommandBuffer[g_FrameIndex]);
|
||||||
|
check_vk_result(err);
|
||||||
|
err = vkQueueSubmit(g_Queue, 1, &end_info, VK_NULL_HANDLE);
|
||||||
|
check_vk_result(err);
|
||||||
|
|
||||||
|
err = vkDeviceWaitIdle(g_Device);
|
||||||
|
check_vk_result(err);
|
||||||
|
ImGui_ImplGlfwVulkan_InvalidateFontUploadObjects();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool show_test_window = true;
|
||||||
|
bool show_another_window = false;
|
||||||
|
ImVec4 clear_color = ImColor(114, 144, 154);
|
||||||
|
|
||||||
|
// Main loop
|
||||||
|
while (!glfwWindowShouldClose(window))
|
||||||
|
{
|
||||||
|
glfwPollEvents();
|
||||||
|
ImGui_ImplGlfwVulkan_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);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_ClearValue.color.float32[0] = clear_color.x;
|
||||||
|
g_ClearValue.color.float32[1] = clear_color.y;
|
||||||
|
g_ClearValue.color.float32[2] = clear_color.z;
|
||||||
|
g_ClearValue.color.float32[3] = clear_color.w;
|
||||||
|
|
||||||
|
frame_begin();
|
||||||
|
ImGui_ImplGlfwVulkan_Render(g_CommandBuffer[g_FrameIndex]);
|
||||||
|
frame_end();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
VkResult err = vkDeviceWaitIdle(g_Device);
|
||||||
|
check_vk_result(err);
|
||||||
|
ImGui_ImplGlfwVulkan_Shutdown();
|
||||||
|
cleanup_vulkan();
|
||||||
|
glfwTerminate();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -2,6 +2,8 @@
|
|||||||
The code in imgui.cpp embeds a copy of 'ProggyClean.ttf' that you can use without any external files.
|
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.
|
Those are only provided as a convenience, you can load your own .TTF files.
|
||||||
|
|
||||||
|
Fonts are rasterized in a single texture at the time of calling either of io.Fonts.GetTexDataAsAlpha8()/GetTexDataAsRGBA32()/Build().
|
||||||
|
|
||||||
---------------------------------
|
---------------------------------
|
||||||
LOADING INSTRUCTIONS
|
LOADING INSTRUCTIONS
|
||||||
---------------------------------
|
---------------------------------
|
||||||
@ -20,10 +22,17 @@
|
|||||||
|
|
||||||
ImFontConfig config;
|
ImFontConfig config;
|
||||||
config.OversampleH = 3;
|
config.OversampleH = 3;
|
||||||
config.OversampleV = 3;
|
config.OversampleV = 1;
|
||||||
config.GlyphExtraSpacing.x = 1.0f;
|
config.GlyphExtraSpacing.x = 1.0f;
|
||||||
io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, &config);
|
io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, &config);
|
||||||
|
|
||||||
|
If you have very large number of glyphs or multiple fonts:
|
||||||
|
|
||||||
|
- Mind the fact that some graphics drivers have texture size limitation.
|
||||||
|
- Set io.Fonts.TexDesiredWidth to specify a texture width to minimize texture height (see comment in ImFontAtlas::Build function).
|
||||||
|
- You may reduce oversampling, e.g. config.OversampleH = 2 or 1.
|
||||||
|
- Reduce glyphs ranges, consider calculating them based on your source data if this is possible.
|
||||||
|
|
||||||
Combine two fonts into one:
|
Combine two fonts into one:
|
||||||
|
|
||||||
// Load main font
|
// Load main font
|
||||||
|
@ -79,7 +79,6 @@ bool binary_to_compressed_c(const char* filename, const char* symbol, bool use_b
|
|||||||
if (use_base85_encoding)
|
if (use_base85_encoding)
|
||||||
{
|
{
|
||||||
fprintf(out, "static const char %s_%sdata_base85[%d+1] =\n \"", symbol, compressed_str, (int)((compressed_sz+3)/4)*5);
|
fprintf(out, "static const char %s_%sdata_base85[%d+1] =\n \"", symbol, compressed_str, (int)((compressed_sz+3)/4)*5);
|
||||||
int column = 0;
|
|
||||||
for (int i = 0; i < compressed_sz; i += 4)
|
for (int i = 0; i < compressed_sz; i += 4)
|
||||||
{
|
{
|
||||||
unsigned int d = *(unsigned int*)(compressed + i);
|
unsigned int d = *(unsigned int*)(compressed + i);
|
||||||
|
269
imgui.h
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.47
|
// dear imgui, v1.48
|
||||||
// (headers)
|
// (headers)
|
||||||
|
|
||||||
// See imgui.cpp file for documentation.
|
// See imgui.cpp file for documentation.
|
||||||
@ -16,7 +16,12 @@
|
|||||||
#include <stddef.h> // ptrdiff_t, NULL
|
#include <stddef.h> // ptrdiff_t, NULL
|
||||||
#include <string.h> // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp
|
#include <string.h> // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp
|
||||||
|
|
||||||
#define IMGUI_VERSION "1.47"
|
#define IMGUI_VERSION "1.48"
|
||||||
|
|
||||||
|
// Define attributes of all API symbols declarations, e.g. for DLL under Windows.
|
||||||
|
#ifndef IMGUI_API
|
||||||
|
#define IMGUI_API
|
||||||
|
#endif
|
||||||
|
|
||||||
// Define assertion handler.
|
// Define assertion handler.
|
||||||
#ifndef IM_ASSERT
|
#ifndef IM_ASSERT
|
||||||
@ -24,11 +29,7 @@
|
|||||||
#define IM_ASSERT(_EXPR) assert(_EXPR)
|
#define IM_ASSERT(_EXPR) assert(_EXPR)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Define attributes of all API symbols declarations, e.g. for DLL under Windows.
|
// Some compilers support applying printf-style warnings to user functions.
|
||||||
#ifndef IMGUI_API
|
|
||||||
#define IMGUI_API
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__clang__) || defined(__GNUC__)
|
#if defined(__clang__) || defined(__GNUC__)
|
||||||
#define IM_PRINTFARGS(FMT) __attribute__((format(printf, FMT, (FMT+1))))
|
#define IM_PRINTFARGS(FMT) __attribute__((format(printf, FMT, (FMT+1))))
|
||||||
#else
|
#else
|
||||||
@ -36,39 +37,50 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Forward declarations
|
// Forward declarations
|
||||||
struct ImDrawCmd;
|
struct ImDrawChannel; // Temporary storage for outputting drawing commands out of order, used by ImDrawList::ChannelsSplit()
|
||||||
struct ImDrawList;
|
struct ImDrawCmd; // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call)
|
||||||
struct ImDrawData;
|
struct ImDrawData; // All draw command lists required to render the frame
|
||||||
struct ImFont;
|
struct ImDrawList; // A single draw command list (generally one per window)
|
||||||
struct ImFontAtlas;
|
struct ImDrawVert; // A single vertex (20 bytes by default, override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT)
|
||||||
struct ImColor;
|
struct ImFont; // Runtime data for a single font within a parent ImFontAtlas
|
||||||
struct ImGuiIO;
|
struct ImFontAtlas; // Runtime data for multiple fonts, bake multiple fonts into a single texture, TTF font loader
|
||||||
struct ImGuiStorage;
|
struct ImFontConfig; // Configuration data when adding a font or merging fonts
|
||||||
struct ImGuiStyle;
|
struct ImColor; // Helper functions to create a color that can be converted to either u32 or float4
|
||||||
|
struct ImGuiIO; // Main configuration and I/O between your application and ImGui
|
||||||
|
struct ImGuiOnceUponAFrame; // Simple helper for running a block of code not more than once a frame, used by IMGUI_ONCE_UPON_A_FRAME macro
|
||||||
|
struct ImGuiStorage; // Simple custom key value storage
|
||||||
|
struct ImGuiStyle; // Runtime data for styling/colors
|
||||||
|
struct ImGuiTextFilter; // Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]"
|
||||||
|
struct ImGuiTextBuffer; // Text buffer for logging/accumulating text
|
||||||
|
struct ImGuiTextEditCallbackData; // Shared state of ImGui::InputText() when using custom callbacks (advanced)
|
||||||
|
struct ImGuiListClipper; // Helper to manually clip large list of items
|
||||||
|
|
||||||
|
// Enumerations (declared as int for compatibility and to not pollute the top of this file)
|
||||||
typedef unsigned int ImU32;
|
typedef unsigned int ImU32;
|
||||||
typedef unsigned short ImWchar; // character for keyboard input/display
|
typedef unsigned short ImWchar; // character for keyboard input/display
|
||||||
typedef void* ImTextureID; // user data to refer to a texture (e.g. store your texture handle/id)
|
typedef void* ImTextureID; // user data to identify a texture (this is whatever to you want it to be! read the FAQ about ImTextureID in imgui.cpp)
|
||||||
typedef ImU32 ImGuiID; // unique ID used by widgets (typically hashed from a stack of string)
|
typedef ImU32 ImGuiID; // unique ID used by widgets (typically hashed from a stack of string)
|
||||||
typedef int ImGuiCol; // enum ImGuiCol_
|
typedef int ImGuiCol; // a color identifier for styling // enum ImGuiCol_
|
||||||
typedef int ImGuiStyleVar; // enum ImGuiStyleVar_
|
typedef int ImGuiStyleVar; // a variable identifier for styling // enum ImGuiStyleVar_
|
||||||
typedef int ImGuiKey; // enum ImGuiKey_
|
typedef int ImGuiKey; // a key identifier (ImGui-side enum) // enum ImGuiKey_
|
||||||
typedef int ImGuiAlign; // enum ImGuiAlign_
|
typedef int ImGuiAlign; // alignment // enum ImGuiAlign_
|
||||||
typedef int ImGuiColorEditMode; // enum ImGuiColorEditMode_
|
typedef int ImGuiColorEditMode; // color edit mode for ColorEdit*() // enum ImGuiColorEditMode_
|
||||||
typedef int ImGuiMouseCursor; // enum ImGuiMouseCursor_
|
typedef int ImGuiMouseCursor; // a mouse cursor identifier // enum ImGuiMouseCursor_
|
||||||
typedef int ImGuiWindowFlags; // enum ImGuiWindowFlags_
|
typedef int ImGuiWindowFlags; // window flags for Begin*() // enum ImGuiWindowFlags_
|
||||||
typedef int ImGuiSetCond; // enum ImGuiSetCond_
|
typedef int ImGuiSetCond; // condition flags for Set*() // enum ImGuiSetCond_
|
||||||
typedef int ImGuiInputTextFlags; // enum ImGuiInputTextFlags_
|
typedef int ImGuiInputTextFlags; // flags for InputText*() // enum ImGuiInputTextFlags_
|
||||||
typedef int ImGuiSelectableFlags; // enum ImGuiSelectableFlags_
|
typedef int ImGuiSelectableFlags; // flags for Selectable() // enum ImGuiSelectableFlags_
|
||||||
struct ImGuiTextEditCallbackData; // for advanced uses of InputText()
|
|
||||||
typedef int (*ImGuiTextEditCallback)(ImGuiTextEditCallbackData *data);
|
typedef int (*ImGuiTextEditCallback)(ImGuiTextEditCallbackData *data);
|
||||||
|
|
||||||
|
// Others helpers at bottom of the file:
|
||||||
|
// class ImVector<> // Lightweight std::vector like class.
|
||||||
|
// IMGUI_ONCE_UPON_A_FRAME // Execute a block of code once per frame only (convenient for creating UI within deep-nested code that runs multiple times)
|
||||||
|
|
||||||
struct ImVec2
|
struct ImVec2
|
||||||
{
|
{
|
||||||
float x, y;
|
float x, y;
|
||||||
ImVec2() { x = y = 0.0f; }
|
ImVec2() { x = y = 0.0f; }
|
||||||
ImVec2(float _x, float _y) { x = _x; y = _y; }
|
ImVec2(float _x, float _y) { x = _x; y = _y; }
|
||||||
|
|
||||||
#ifdef IM_VEC2_CLASS_EXTRA // Define constructor and implicit cast operators in imconfig.h to convert back<>forth from your math types and ImVec2.
|
#ifdef IM_VEC2_CLASS_EXTRA // Define constructor and implicit cast operators in imconfig.h to convert back<>forth from your math types and ImVec2.
|
||||||
IM_VEC2_CLASS_EXTRA
|
IM_VEC2_CLASS_EXTRA
|
||||||
#endif
|
#endif
|
||||||
@ -79,25 +91,11 @@ struct ImVec4
|
|||||||
float x, y, z, w;
|
float x, y, z, w;
|
||||||
ImVec4() { x = y = z = w = 0.0f; }
|
ImVec4() { x = y = z = w = 0.0f; }
|
||||||
ImVec4(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; }
|
ImVec4(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; }
|
||||||
|
|
||||||
#ifdef IM_VEC4_CLASS_EXTRA // Define constructor and implicit cast operators in imconfig.h to convert back<>forth from your math types and ImVec4.
|
#ifdef IM_VEC4_CLASS_EXTRA // Define constructor and implicit cast operators in imconfig.h to convert back<>forth from your math types and ImVec4.
|
||||||
IM_VEC4_CLASS_EXTRA
|
IM_VEC4_CLASS_EXTRA
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
// Helpers at bottom of the file:
|
|
||||||
// - class ImVector<> // Lightweight std::vector like class.
|
|
||||||
// - IMGUI_ONCE_UPON_A_FRAME // Execute a block of code once per frame only (convenient for creating UI within deep-nested code that runs multiple times)
|
|
||||||
// - struct ImGuiTextFilter // Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]"
|
|
||||||
// - struct ImGuiTextBuffer // Text buffer for logging/accumulating text
|
|
||||||
// - struct ImGuiStorage // Custom key value storage (if you need to alter open/close states manually)
|
|
||||||
// - struct ImGuiTextEditCallbackData // Shared state of ImGui::InputText() when using custom callbacks
|
|
||||||
// - struct ImGuiListClipper // Helper to manually clip large list of items.
|
|
||||||
// - struct ImColor // Helper functions to created packed 32-bit RGBA color values
|
|
||||||
// - struct ImDrawList // Draw command list
|
|
||||||
// - struct ImFontAtlas // Bake multiple fonts into a single texture, TTF font loader, bake glyphs into bitmap
|
|
||||||
// - struct ImFont // Single font
|
|
||||||
|
|
||||||
// ImGui end-user API
|
// ImGui end-user API
|
||||||
// In a namespace so that user can add extra functions in a separate file (e.g. Value() helpers for your vector or common types)
|
// In a namespace so that user can add extra functions in a separate file (e.g. Value() helpers for your vector or common types)
|
||||||
namespace ImGui
|
namespace ImGui
|
||||||
@ -105,21 +103,21 @@ namespace ImGui
|
|||||||
// Main
|
// Main
|
||||||
IMGUI_API ImGuiIO& GetIO();
|
IMGUI_API ImGuiIO& GetIO();
|
||||||
IMGUI_API ImGuiStyle& GetStyle();
|
IMGUI_API ImGuiStyle& GetStyle();
|
||||||
IMGUI_API ImDrawData* GetDrawData(); // same value as passed to your RenderDrawListsFn() function. valid after Render() and until the next call to NewFrame()
|
IMGUI_API ImDrawData* GetDrawData(); // same value as passed to your io.RenderDrawListsFn() function. valid after Render() and until the next call to NewFrame()
|
||||||
IMGUI_API void NewFrame();
|
IMGUI_API void NewFrame(); // start a new ImGui frame, you can submit any command from this point until NewFrame()/Render().
|
||||||
IMGUI_API void Render();
|
IMGUI_API void Render(); // ends the ImGui frame, finalize rendering data, then call your io.RenderDrawListsFn() function if set.
|
||||||
IMGUI_API void Shutdown();
|
IMGUI_API void Shutdown();
|
||||||
IMGUI_API void ShowUserGuide(); // help block
|
IMGUI_API void ShowUserGuide(); // help block
|
||||||
IMGUI_API void ShowStyleEditor(ImGuiStyle* ref = NULL); // style editor block
|
IMGUI_API void ShowStyleEditor(ImGuiStyle* ref = NULL); // style editor block
|
||||||
IMGUI_API void ShowTestWindow(bool* opened = NULL); // test window, demonstrate ImGui features
|
IMGUI_API void ShowTestWindow(bool* opened = NULL); // test window demonstrating ImGui features
|
||||||
IMGUI_API void ShowMetricsWindow(bool* opened = NULL); // metrics window for debugging imgui
|
IMGUI_API void ShowMetricsWindow(bool* opened = NULL); // metrics window for debugging ImGui
|
||||||
|
|
||||||
// Window
|
// Window
|
||||||
IMGUI_API bool Begin(const char* name, bool* p_opened = NULL, ImGuiWindowFlags flags = 0); // see .cpp for details. return false when window is collapsed, so you can early out in your code. 'bool* p_opened' creates a widget on the upper-right to close the window (which sets your bool to false).
|
IMGUI_API bool Begin(const char* name, bool* p_opened = NULL, ImGuiWindowFlags flags = 0); // push window to the stack and start appending to it. see .cpp for details. return false when window is collapsed, so you can early out in your code. 'bool* p_opened' creates a widget on the upper-right to close the window (which sets your bool to false).
|
||||||
IMGUI_API bool Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_use, float bg_alpha = -1.0f, ImGuiWindowFlags flags = 0); // this is the older/longer API. the extra parameters aren't very relevant. call SetNextWindowSize() instead if you want to set a window size. For regular windows, 'size_on_first_use' only applies to the first time EVER the window is created and probably not what you want! maybe obsolete this API eventually.
|
IMGUI_API bool Begin(const char* name, bool* p_opened, const ImVec2& size_on_first_use, float bg_alpha = -1.0f, ImGuiWindowFlags flags = 0); // OBSOLETE. this is the older/longer API. the extra parameters aren't very relevant. call SetNextWindowSize() instead if you want to set a window size. For regular windows, 'size_on_first_use' only applies to the first time EVER the window is created and probably not what you want! might obsolete this API eventually.
|
||||||
IMGUI_API void End();
|
IMGUI_API void End(); // finish appending to current window, pop it off the window stack.
|
||||||
IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags extra_flags = 0); // begin a scrolling region. size==0.0f: use remaining window size, size<0.0f: use remaining window size minus abs(size). size>0.0f: fixed size. each axis can use a different mode, e.g. ImVec2(0,400).
|
IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags extra_flags = 0); // begin a scrolling region. size==0.0f: use remaining window size, size<0.0f: use remaining window size minus abs(size). size>0.0f: fixed size. each axis can use a different mode, e.g. ImVec2(0,400).
|
||||||
IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags extra_flags = 0); // "
|
IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags extra_flags = 0); // "
|
||||||
IMGUI_API void EndChild();
|
IMGUI_API void EndChild();
|
||||||
IMGUI_API ImVec2 GetContentRegionMax(); // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates
|
IMGUI_API ImVec2 GetContentRegionMax(); // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates
|
||||||
IMGUI_API ImVec2 GetContentRegionAvail(); // == GetContentRegionMax() - GetCursorPos()
|
IMGUI_API ImVec2 GetContentRegionAvail(); // == GetContentRegionMax() - GetCursorPos()
|
||||||
@ -128,14 +126,12 @@ namespace ImGui
|
|||||||
IMGUI_API ImVec2 GetWindowContentRegionMax(); // content boundaries max (roughly (0,0)+Size-Scroll) where Size can be override with SetNextWindowContentSize(), in window coordinates
|
IMGUI_API ImVec2 GetWindowContentRegionMax(); // content boundaries max (roughly (0,0)+Size-Scroll) where Size can be override with SetNextWindowContentSize(), in window coordinates
|
||||||
IMGUI_API float GetWindowContentRegionWidth(); //
|
IMGUI_API float GetWindowContentRegionWidth(); //
|
||||||
IMGUI_API ImDrawList* GetWindowDrawList(); // get rendering command-list if you want to append your own draw primitives
|
IMGUI_API ImDrawList* GetWindowDrawList(); // get rendering command-list if you want to append your own draw primitives
|
||||||
IMGUI_API ImFont* GetWindowFont();
|
|
||||||
IMGUI_API float GetWindowFontSize(); // size (also height in pixels) of current font with current scale applied
|
|
||||||
IMGUI_API void SetWindowFontScale(float scale); // per-window font scale. Adjust IO.FontGlobalScale if you want to scale all windows
|
|
||||||
IMGUI_API ImVec2 GetWindowPos(); // get current window position in screen space (useful if you want to do your own drawing via the DrawList api)
|
IMGUI_API ImVec2 GetWindowPos(); // get current window position in screen space (useful if you want to do your own drawing via the DrawList api)
|
||||||
IMGUI_API ImVec2 GetWindowSize(); // get current window size
|
IMGUI_API ImVec2 GetWindowSize(); // get current window size
|
||||||
IMGUI_API float GetWindowWidth();
|
IMGUI_API float GetWindowWidth();
|
||||||
IMGUI_API float GetWindowHeight();
|
IMGUI_API float GetWindowHeight();
|
||||||
IMGUI_API bool IsWindowCollapsed();
|
IMGUI_API bool IsWindowCollapsed();
|
||||||
|
IMGUI_API void SetWindowFontScale(float scale); // per-window font scale. Adjust IO.FontGlobalScale if you want to scale all windows
|
||||||
|
|
||||||
IMGUI_API void SetNextWindowPos(const ImVec2& pos, ImGuiSetCond cond = 0); // set next window position. call before Begin()
|
IMGUI_API void SetNextWindowPos(const ImVec2& pos, ImGuiSetCond cond = 0); // set next window position. call before Begin()
|
||||||
IMGUI_API void SetNextWindowPosCenter(ImGuiSetCond cond = 0); // set next window position to be centered on screen. call before Begin()
|
IMGUI_API void SetNextWindowPosCenter(ImGuiSetCond cond = 0); // set next window position to be centered on screen. call before Begin()
|
||||||
@ -148,8 +144,8 @@ namespace ImGui
|
|||||||
IMGUI_API void SetWindowSize(const ImVec2& size, ImGuiSetCond cond = 0); // set current window size. set to ImVec2(0,0) to force an auto-fit. may incur tearing
|
IMGUI_API void SetWindowSize(const ImVec2& size, ImGuiSetCond cond = 0); // set current window size. set to ImVec2(0,0) to force an auto-fit. may incur tearing
|
||||||
IMGUI_API void SetWindowCollapsed(bool collapsed, ImGuiSetCond cond = 0); // set current window collapsed state
|
IMGUI_API void SetWindowCollapsed(bool collapsed, ImGuiSetCond cond = 0); // set current window collapsed state
|
||||||
IMGUI_API void SetWindowFocus(); // set current window to be focused / front-most
|
IMGUI_API void SetWindowFocus(); // set current window to be focused / front-most
|
||||||
IMGUI_API void SetWindowPos(const char* name, const ImVec2& pos, ImGuiSetCond cond = 0); // set named window position - call within Begin()/End(). may incur tearing
|
IMGUI_API void SetWindowPos(const char* name, const ImVec2& pos, ImGuiSetCond cond = 0); // set named window position.
|
||||||
IMGUI_API void SetWindowSize(const char* name, const ImVec2& size, ImGuiSetCond cond = 0); // set named window size. set axis to 0.0f to force an auto-fit on this axis. may incur tearing
|
IMGUI_API void SetWindowSize(const char* name, const ImVec2& size, ImGuiSetCond cond = 0); // set named window size. set axis to 0.0f to force an auto-fit on this axis.
|
||||||
IMGUI_API void SetWindowCollapsed(const char* name, bool collapsed, ImGuiSetCond cond = 0); // set named window collapsed state
|
IMGUI_API void SetWindowCollapsed(const char* name, bool collapsed, ImGuiSetCond cond = 0); // set named window collapsed state
|
||||||
IMGUI_API void SetWindowFocus(const char* name); // set named window to be focused / front-most. use NULL to remove focus.
|
IMGUI_API void SetWindowFocus(const char* name); // set named window to be focused / front-most. use NULL to remove focus.
|
||||||
|
|
||||||
@ -173,6 +169,9 @@ namespace ImGui
|
|||||||
IMGUI_API void PushStyleVar(ImGuiStyleVar idx, float val);
|
IMGUI_API void PushStyleVar(ImGuiStyleVar idx, float val);
|
||||||
IMGUI_API void PushStyleVar(ImGuiStyleVar idx, const ImVec2& val);
|
IMGUI_API void PushStyleVar(ImGuiStyleVar idx, const ImVec2& val);
|
||||||
IMGUI_API void PopStyleVar(int count = 1);
|
IMGUI_API void PopStyleVar(int count = 1);
|
||||||
|
IMGUI_API ImFont* GetFont(); // get current font
|
||||||
|
IMGUI_API float GetFontSize(); // get current font size (= height in pixels) of current font with current scale applied
|
||||||
|
IMGUI_API ImVec2 GetFontTexUvWhitePixel(); // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API
|
||||||
IMGUI_API ImU32 GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f); // retrieve given style color with style alpha applied and optional extra alpha multiplier
|
IMGUI_API ImU32 GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f); // retrieve given style color with style alpha applied and optional extra alpha multiplier
|
||||||
IMGUI_API ImU32 GetColorU32(const ImVec4& col); // retrieve given color with style alpha applied
|
IMGUI_API ImU32 GetColorU32(const ImVec4& col); // retrieve given color with style alpha applied
|
||||||
|
|
||||||
@ -191,18 +190,11 @@ namespace ImGui
|
|||||||
IMGUI_API void BeginGroup(); // lock horizontal starting position. once closing a group it is seen as a single item (so you can use IsItemHovered() on a group, SameLine() between groups, etc.
|
IMGUI_API void BeginGroup(); // lock horizontal starting position. once closing a group it is seen as a single item (so you can use IsItemHovered() on a group, SameLine() between groups, etc.
|
||||||
IMGUI_API void EndGroup();
|
IMGUI_API void EndGroup();
|
||||||
IMGUI_API void Separator(); // horizontal line
|
IMGUI_API void Separator(); // horizontal line
|
||||||
IMGUI_API void SameLine(float local_pos_x = 0.0f, float spacing_w = -1.0f); // call between widgets or groups to layout them horizontally
|
IMGUI_API void SameLine(float pos_x = 0.0f, float spacing_w = -1.0f); // call between widgets or groups to layout them horizontally
|
||||||
IMGUI_API void Spacing(); // add spacing
|
IMGUI_API void Spacing(); // add spacing
|
||||||
IMGUI_API void Dummy(const ImVec2& size); // add a dummy item of given size
|
IMGUI_API void Dummy(const ImVec2& size); // add a dummy item of given size
|
||||||
IMGUI_API void Indent(); // move content position toward the right by style.IndentSpacing pixels
|
IMGUI_API void Indent(); // move content position toward the right by style.IndentSpacing pixels
|
||||||
IMGUI_API void Unindent(); // move content position back to the left (cancel Indent)
|
IMGUI_API void Unindent(); // move content position back to the left (cancel Indent)
|
||||||
IMGUI_API void Columns(int count = 1, const char* id = NULL, bool border = true); // setup number of columns. use an identifier to distinguish multiple column sets. close with Columns(1).
|
|
||||||
IMGUI_API void NextColumn(); // next column
|
|
||||||
IMGUI_API int GetColumnIndex(); // get current column index
|
|
||||||
IMGUI_API float GetColumnOffset(int column_index = -1); // get position of column line (in pixels, from the left side of the contents region). pass -1 to use current column, otherwise 0..GetcolumnsCount() inclusive. column 0 is usually 0.0f and not resizable unless you call this
|
|
||||||
IMGUI_API void SetColumnOffset(int column_index, float offset_x); // set position of column line (in pixels, from the left side of the contents region). pass -1 to use current column
|
|
||||||
IMGUI_API float GetColumnWidth(int column_index = -1); // column width (== GetColumnOffset(GetColumnIndex()+1) - GetColumnOffset(GetColumnOffset())
|
|
||||||
IMGUI_API int GetColumnsCount(); // number of columns (what was passed to Columns())
|
|
||||||
IMGUI_API ImVec2 GetCursorPos(); // cursor position is relative to window position
|
IMGUI_API ImVec2 GetCursorPos(); // cursor position is relative to window position
|
||||||
IMGUI_API float GetCursorPosX(); // "
|
IMGUI_API float GetCursorPosX(); // "
|
||||||
IMGUI_API float GetCursorPosY(); // "
|
IMGUI_API float GetCursorPosY(); // "
|
||||||
@ -217,6 +209,16 @@ namespace ImGui
|
|||||||
IMGUI_API float GetTextLineHeightWithSpacing(); // distance (in pixels) between 2 consecutive lines of text == GetWindowFontSize() + GetStyle().ItemSpacing.y
|
IMGUI_API float GetTextLineHeightWithSpacing(); // distance (in pixels) between 2 consecutive lines of text == GetWindowFontSize() + GetStyle().ItemSpacing.y
|
||||||
IMGUI_API float GetItemsLineHeightWithSpacing(); // distance (in pixels) between 2 consecutive lines of standard height widgets == GetWindowFontSize() + GetStyle().FramePadding.y*2 + GetStyle().ItemSpacing.y
|
IMGUI_API float GetItemsLineHeightWithSpacing(); // distance (in pixels) between 2 consecutive lines of standard height widgets == GetWindowFontSize() + GetStyle().FramePadding.y*2 + GetStyle().ItemSpacing.y
|
||||||
|
|
||||||
|
// Columns
|
||||||
|
// You can also use SameLine(pos_x) for simplified columning. The columns API is still work-in-progress.
|
||||||
|
IMGUI_API void Columns(int count = 1, const char* id = NULL, bool border = true); // setup number of columns. use an identifier to distinguish multiple column sets. close with Columns(1).
|
||||||
|
IMGUI_API void NextColumn(); // next column
|
||||||
|
IMGUI_API int GetColumnIndex(); // get current column index
|
||||||
|
IMGUI_API float GetColumnOffset(int column_index = -1); // get position of column line (in pixels, from the left side of the contents region). pass -1 to use current column, otherwise 0..GetcolumnsCount() inclusive. column 0 is usually 0.0f and not resizable unless you call this
|
||||||
|
IMGUI_API void SetColumnOffset(int column_index, float offset_x); // set position of column line (in pixels, from the left side of the contents region). pass -1 to use current column
|
||||||
|
IMGUI_API float GetColumnWidth(int column_index = -1); // column width (== GetColumnOffset(GetColumnIndex()+1) - GetColumnOffset(GetColumnOffset())
|
||||||
|
IMGUI_API int GetColumnsCount(); // number of columns (what was passed to Columns())
|
||||||
|
|
||||||
// ID scopes
|
// ID scopes
|
||||||
// If you are creating widgets in a loop you most likely want to push a unique identifier so ImGui can differentiate them.
|
// If you are creating widgets in a loop you most likely want to push a unique identifier so ImGui can differentiate them.
|
||||||
// You can also use the "##foobar" syntax within widget label to distinguish them from each others. Read "A primer on the use of labels/IDs" in the FAQ for more details.
|
// You can also use the "##foobar" syntax within widget label to distinguish them from each others. Read "A primer on the use of labels/IDs" in the FAQ for more details.
|
||||||
@ -241,7 +243,7 @@ namespace ImGui
|
|||||||
IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // doesn't require null terminated string if 'text_end' is specified. no copy done to any bounded stack buffer, recommended for long chunks of text
|
IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // doesn't require null terminated string if 'text_end' is specified. no copy done to any bounded stack buffer, recommended for long chunks of text
|
||||||
IMGUI_API void LabelText(const char* label, const char* fmt, ...) IM_PRINTFARGS(2); // display text+label aligned the same way as value+label widgets
|
IMGUI_API void LabelText(const char* label, const char* fmt, ...) IM_PRINTFARGS(2); // display text+label aligned the same way as value+label widgets
|
||||||
IMGUI_API void LabelTextV(const char* label, const char* fmt, va_list args);
|
IMGUI_API void LabelTextV(const char* label, const char* fmt, va_list args);
|
||||||
IMGUI_API void Bullet();
|
IMGUI_API void Bullet(); // draw a small circle and keep the cursor on the same line. advance you by the same distance as an empty TreeNode() call.
|
||||||
IMGUI_API void BulletText(const char* fmt, ...) IM_PRINTFARGS(1);
|
IMGUI_API void BulletText(const char* fmt, ...) IM_PRINTFARGS(1);
|
||||||
IMGUI_API void BulletTextV(const char* fmt, va_list args);
|
IMGUI_API void BulletTextV(const char* fmt, va_list args);
|
||||||
IMGUI_API bool Button(const char* label, const ImVec2& size = ImVec2(0,0));
|
IMGUI_API bool Button(const char* label, const ImVec2& size = ImVec2(0,0));
|
||||||
@ -267,7 +269,7 @@ namespace ImGui
|
|||||||
IMGUI_API void PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0));
|
IMGUI_API void PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0,0));
|
||||||
IMGUI_API void ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-1,0), const char* overlay = NULL);
|
IMGUI_API void ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-1,0), const char* overlay = NULL);
|
||||||
|
|
||||||
// Widgets: Drags (tip: ctrl+click on a drag box to input text)
|
// Widgets: Drags (tip: ctrl+click on a drag box to input with keyboard. manually input values aren't clamped, can go off-bounds)
|
||||||
IMGUI_API bool DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f); // If v_min >= v_max we have no bound
|
IMGUI_API bool DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f); // If v_min >= v_max we have no bound
|
||||||
IMGUI_API bool DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f);
|
IMGUI_API bool DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f);
|
||||||
IMGUI_API bool DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f);
|
IMGUI_API bool DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* display_format = "%.3f", float power = 1.0f);
|
||||||
@ -279,7 +281,7 @@ namespace ImGui
|
|||||||
IMGUI_API bool DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f");
|
IMGUI_API bool DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f");
|
||||||
IMGUI_API bool DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f", const char* display_format_max = NULL);
|
IMGUI_API bool DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* display_format = "%.0f", const char* display_format_max = NULL);
|
||||||
|
|
||||||
// Widgets: Input
|
// Widgets: Input with Keyboard
|
||||||
IMGUI_API bool InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);
|
IMGUI_API bool InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);
|
||||||
IMGUI_API bool InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0,0), ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);
|
IMGUI_API bool InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0,0), ImGuiInputTextFlags flags = 0, ImGuiTextEditCallback callback = NULL, void* user_data = NULL);
|
||||||
IMGUI_API bool InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0);
|
IMGUI_API bool InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, int decimal_precision = -1, ImGuiInputTextFlags extra_flags = 0);
|
||||||
@ -291,7 +293,7 @@ namespace ImGui
|
|||||||
IMGUI_API bool InputInt3(const char* label, int v[3], ImGuiInputTextFlags extra_flags = 0);
|
IMGUI_API bool InputInt3(const char* label, int v[3], ImGuiInputTextFlags extra_flags = 0);
|
||||||
IMGUI_API bool InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_flags = 0);
|
IMGUI_API bool InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_flags = 0);
|
||||||
|
|
||||||
// Widgets: Sliders (tip: ctrl+click on a slider to input text)
|
// Widgets: Sliders (tip: ctrl+click on a slider to input with keyboard. manually input values aren't clamped, can go off-bounds)
|
||||||
IMGUI_API bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f); // adjust display_format to decorate the value with a prefix or a suffix. Use power!=1.0 for logarithmic sliders
|
IMGUI_API bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f); // adjust display_format to decorate the value with a prefix or a suffix. Use power!=1.0 for logarithmic sliders
|
||||||
IMGUI_API bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f);
|
IMGUI_API bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f);
|
||||||
IMGUI_API bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f);
|
IMGUI_API bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* display_format = "%.3f", float power = 1.0f);
|
||||||
@ -305,15 +307,15 @@ namespace ImGui
|
|||||||
IMGUI_API bool VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* display_format = "%.0f");
|
IMGUI_API bool VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* display_format = "%.0f");
|
||||||
|
|
||||||
// Widgets: Trees
|
// Widgets: Trees
|
||||||
IMGUI_API bool TreeNode(const char* str_label_id); // if returning 'true' the node is open and the user is responsible for calling TreePop()
|
IMGUI_API bool TreeNode(const char* str_label_id); // if returning 'true' the node is open and the user is responsible for calling TreePop().
|
||||||
IMGUI_API bool TreeNode(const char* str_id, const char* fmt, ...) IM_PRINTFARGS(2); // "
|
IMGUI_API bool TreeNode(const char* str_id, const char* fmt, ...) IM_PRINTFARGS(2); // read the FAQ about why and how to use ID. to align arbitrary text at the same level as a TreeNode() you can use Bullet().
|
||||||
IMGUI_API bool TreeNode(const void* ptr_id, const char* fmt, ...) IM_PRINTFARGS(2); // "
|
IMGUI_API bool TreeNode(const void* ptr_id, const char* fmt, ...) IM_PRINTFARGS(2); // "
|
||||||
IMGUI_API bool TreeNodeV(const char* str_id, const char* fmt, va_list args); // "
|
IMGUI_API bool TreeNodeV(const char* str_id, const char* fmt, va_list args); // "
|
||||||
IMGUI_API bool TreeNodeV(const void* ptr_id, const char* fmt, va_list args); // "
|
IMGUI_API bool TreeNodeV(const void* ptr_id, const char* fmt, va_list args); // "
|
||||||
IMGUI_API void TreePush(const char* str_id = NULL); // already called by TreeNode(), but you can call Push/Pop yourself for layouting purpose
|
IMGUI_API void TreePush(const char* str_id = NULL); // already called by TreeNode(), but you can call Push/Pop yourself for layouting purpose
|
||||||
IMGUI_API void TreePush(const void* ptr_id = NULL); // "
|
IMGUI_API void TreePush(const void* ptr_id = NULL); // "
|
||||||
IMGUI_API void TreePop();
|
IMGUI_API void TreePop();
|
||||||
IMGUI_API void SetNextTreeNodeOpened(bool opened, ImGuiSetCond cond = 0); // set next tree node to be opened.
|
IMGUI_API void SetNextTreeNodeOpened(bool opened, ImGuiSetCond cond = 0); // set next tree node/collapsing header to be opened.
|
||||||
|
|
||||||
// Widgets: Selectable / Lists
|
// Widgets: Selectable / Lists
|
||||||
IMGUI_API bool Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0)); // size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height
|
IMGUI_API bool Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0)); // size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height
|
||||||
@ -332,7 +334,7 @@ namespace ImGui
|
|||||||
IMGUI_API void ValueColor(const char* prefix, const ImVec4& v);
|
IMGUI_API void ValueColor(const char* prefix, const ImVec4& v);
|
||||||
IMGUI_API void ValueColor(const char* prefix, unsigned int v);
|
IMGUI_API void ValueColor(const char* prefix, unsigned int v);
|
||||||
|
|
||||||
// Tooltip
|
// Tooltips
|
||||||
IMGUI_API void SetTooltip(const char* fmt, ...) IM_PRINTFARGS(1); // set tooltip under mouse-cursor, typically use with ImGui::IsHovered(). last call wins
|
IMGUI_API void SetTooltip(const char* fmt, ...) IM_PRINTFARGS(1); // set tooltip under mouse-cursor, typically use with ImGui::IsHovered(). last call wins
|
||||||
IMGUI_API void SetTooltipV(const char* fmt, va_list args);
|
IMGUI_API void SetTooltipV(const char* fmt, va_list args);
|
||||||
IMGUI_API void BeginTooltip(); // use to create full-featured tooltip windows that aren't just text
|
IMGUI_API void BeginTooltip(); // use to create full-featured tooltip windows that aren't just text
|
||||||
@ -348,7 +350,7 @@ namespace ImGui
|
|||||||
IMGUI_API bool MenuItem(const char* label, const char* shortcut = NULL, bool selected = false, bool enabled = true); // return true when activated. shortcuts are displayed for convenience but not processed by ImGui at the moment
|
IMGUI_API bool MenuItem(const char* label, const char* shortcut = NULL, bool selected = false, bool enabled = true); // return true when activated. shortcuts are displayed for convenience but not processed by ImGui at the moment
|
||||||
IMGUI_API bool MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true); // return true when activated + toggle (*p_selected) if p_selected != NULL
|
IMGUI_API bool MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true); // return true when activated + toggle (*p_selected) if p_selected != NULL
|
||||||
|
|
||||||
// Popup
|
// Popups
|
||||||
IMGUI_API void OpenPopup(const char* str_id); // mark popup as open. popups are closed when user click outside, or activate a pressable item, or CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level).
|
IMGUI_API void OpenPopup(const char* str_id); // mark popup as open. popups are closed when user click outside, or activate a pressable item, or CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level).
|
||||||
IMGUI_API bool BeginPopup(const char* str_id); // return true if popup if opened and start outputting to it. only call EndPopup() if BeginPopup() returned true!
|
IMGUI_API bool BeginPopup(const char* str_id); // return true if popup if opened and start outputting to it. only call EndPopup() if BeginPopup() returned true!
|
||||||
IMGUI_API bool BeginPopupModal(const char* name, bool* p_opened = NULL, ImGuiWindowFlags extra_flags = 0); // modal dialog (can't close them by clicking outside)
|
IMGUI_API bool BeginPopupModal(const char* name, bool* p_opened = NULL, ImGuiWindowFlags extra_flags = 0); // modal dialog (can't close them by clicking outside)
|
||||||
@ -376,6 +378,7 @@ namespace ImGui
|
|||||||
IMGUI_API ImVec2 GetItemRectMin(); // get bounding rect of last item in screen space
|
IMGUI_API ImVec2 GetItemRectMin(); // get bounding rect of last item in screen space
|
||||||
IMGUI_API ImVec2 GetItemRectMax(); // "
|
IMGUI_API ImVec2 GetItemRectMax(); // "
|
||||||
IMGUI_API ImVec2 GetItemRectSize(); // "
|
IMGUI_API ImVec2 GetItemRectSize(); // "
|
||||||
|
IMGUI_API void SetItemAllowOverlap(); // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area.
|
||||||
IMGUI_API bool IsWindowHovered(); // is current window hovered and hoverable (not blocked by a popup) (differentiate child windows from each others)
|
IMGUI_API bool IsWindowHovered(); // is current window hovered and hoverable (not blocked by a popup) (differentiate child windows from each others)
|
||||||
IMGUI_API bool IsWindowFocused(); // is current window focused
|
IMGUI_API bool IsWindowFocused(); // is current window focused
|
||||||
IMGUI_API bool IsRootWindowFocused(); // is current root window focused (top parent window in case of child windows)
|
IMGUI_API bool IsRootWindowFocused(); // is current root window focused (top parent window in case of child windows)
|
||||||
@ -408,7 +411,7 @@ namespace ImGui
|
|||||||
IMGUI_API bool IsMouseReleased(int button); // did mouse button released (went from Down to !Down)
|
IMGUI_API bool IsMouseReleased(int button); // did mouse button released (went from Down to !Down)
|
||||||
IMGUI_API bool IsMouseHoveringWindow(); // is mouse hovering current window ("window" in API names always refer to current window). disregarding of any consideration of being blocked by a popup. (unlike IsWindowHovered() this will return true even if the window is blocked because of a popup)
|
IMGUI_API bool IsMouseHoveringWindow(); // is mouse hovering current window ("window" in API names always refer to current window). disregarding of any consideration of being blocked by a popup. (unlike IsWindowHovered() this will return true even if the window is blocked because of a popup)
|
||||||
IMGUI_API bool IsMouseHoveringAnyWindow(); // is mouse hovering any visible window
|
IMGUI_API bool IsMouseHoveringAnyWindow(); // is mouse hovering any visible window
|
||||||
IMGUI_API bool IsMouseHoveringRect(const ImVec2& pos_min, const ImVec2& pos_max, bool clip = true); // is mouse hovering given bounding rect (in screen space). clipped by current clipping settings. disregarding of consideration of focus/window ordering/blocked by a popup.
|
IMGUI_API bool IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true); // is mouse hovering given bounding rect (in screen space). clipped by current clipping settings. disregarding of consideration of focus/window ordering/blocked by a popup.
|
||||||
IMGUI_API bool IsMouseDragging(int button = 0, float lock_threshold = -1.0f); // is mouse dragging. if lock_threshold < -1.0f uses io.MouseDraggingThreshold
|
IMGUI_API bool IsMouseDragging(int button = 0, float lock_threshold = -1.0f); // is mouse dragging. if lock_threshold < -1.0f uses io.MouseDraggingThreshold
|
||||||
IMGUI_API ImVec2 GetMousePos(); // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls
|
IMGUI_API ImVec2 GetMousePos(); // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls
|
||||||
IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve backup of mouse positioning at the time of opening popup we have BeginPopup() into
|
IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve backup of mouse positioning at the time of opening popup we have BeginPopup() into
|
||||||
@ -416,8 +419,8 @@ namespace ImGui
|
|||||||
IMGUI_API void ResetMouseDragDelta(int button = 0); //
|
IMGUI_API void ResetMouseDragDelta(int button = 0); //
|
||||||
IMGUI_API ImGuiMouseCursor GetMouseCursor(); // get desired cursor type, reset in ImGui::NewFrame(), this updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you
|
IMGUI_API ImGuiMouseCursor GetMouseCursor(); // get desired cursor type, reset in ImGui::NewFrame(), this updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you
|
||||||
IMGUI_API void SetMouseCursor(ImGuiMouseCursor type); // set desired cursor type
|
IMGUI_API void SetMouseCursor(ImGuiMouseCursor type); // set desired cursor type
|
||||||
IMGUI_API void CaptureKeyboardFromApp(); // manually enforce imgui setting the io.WantCaptureKeyboard flag next frame (your application needs to handle it). e.g. capture keyboard when your widget is being hovered.
|
IMGUI_API void CaptureKeyboardFromApp(bool capture = true); // manually override io.WantCaptureKeyboard flag next frame (said flag is entirely left for your application handle). e.g. force capture keyboard when your widget is being hovered.
|
||||||
IMGUI_API void CaptureMouseFromApp(); // manually enforce imgui setting the io.WantCaptureMouse flag next frame (your application needs to handle it).
|
IMGUI_API void CaptureMouseFromApp(bool capture = true); // manually override io.WantCaptureMouse flag next frame (said flag is entirely left for your application handle).
|
||||||
|
|
||||||
// Helpers functions to access functions pointers in ImGui::GetIO()
|
// Helpers functions to access functions pointers in ImGui::GetIO()
|
||||||
IMGUI_API void* MemAlloc(size_t sz);
|
IMGUI_API void* MemAlloc(size_t sz);
|
||||||
@ -433,6 +436,8 @@ namespace ImGui
|
|||||||
|
|
||||||
// Obsolete (will be removed)
|
// Obsolete (will be removed)
|
||||||
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
||||||
|
static inline ImFont* GetWindowFont() { return GetFont(); } // OBSOLETE 1.48+
|
||||||
|
static inline float GetWindowFontSize() { return GetFontSize(); } // OBSOLETE 1.48+
|
||||||
static inline void OpenNextNode(bool open) { ImGui::SetNextTreeNodeOpened(open, 0); } // OBSOLETE 1.34+
|
static inline void OpenNextNode(bool open) { ImGui::SetNextTreeNodeOpened(open, 0); } // OBSOLETE 1.34+
|
||||||
static inline bool GetWindowIsFocused() { return ImGui::IsWindowFocused(); } // OBSOLETE 1.36+
|
static inline bool GetWindowIsFocused() { return ImGui::IsWindowFocused(); } // OBSOLETE 1.36+
|
||||||
static inline bool GetWindowCollapsed() { return ImGui::IsWindowCollapsed(); } // OBSOLETE 1.39+
|
static inline bool GetWindowCollapsed() { return ImGui::IsWindowCollapsed(); } // OBSOLETE 1.39+
|
||||||
@ -453,17 +458,20 @@ enum ImGuiWindowFlags_
|
|||||||
ImGuiWindowFlags_NoTitleBar = 1 << 0, // Disable title-bar
|
ImGuiWindowFlags_NoTitleBar = 1 << 0, // Disable title-bar
|
||||||
ImGuiWindowFlags_NoResize = 1 << 1, // Disable user resizing with the lower-right grip
|
ImGuiWindowFlags_NoResize = 1 << 1, // Disable user resizing with the lower-right grip
|
||||||
ImGuiWindowFlags_NoMove = 1 << 2, // Disable user moving the window
|
ImGuiWindowFlags_NoMove = 1 << 2, // Disable user moving the window
|
||||||
ImGuiWindowFlags_NoScrollbar = 1 << 3, // Disable scrollbar (window can still scroll with mouse or programatically)
|
ImGuiWindowFlags_NoScrollbar = 1 << 3, // Disable scrollbars (window can still scroll with mouse or programatically)
|
||||||
ImGuiWindowFlags_NoScrollWithMouse = 1 << 4, // Disable user scrolling with mouse wheel
|
ImGuiWindowFlags_NoScrollWithMouse = 1 << 4, // Disable user vertically scrolling with mouse wheel
|
||||||
ImGuiWindowFlags_NoCollapse = 1 << 5, // Disable user collapsing window by double-clicking on it
|
ImGuiWindowFlags_NoCollapse = 1 << 5, // Disable user collapsing window by double-clicking on it
|
||||||
ImGuiWindowFlags_AlwaysAutoResize = 1 << 6, // Resize every window to its content every frame
|
ImGuiWindowFlags_AlwaysAutoResize = 1 << 6, // Resize every window to its content every frame
|
||||||
ImGuiWindowFlags_ShowBorders = 1 << 7, // Show borders around windows and items
|
ImGuiWindowFlags_ShowBorders = 1 << 7, // Show borders around windows and items
|
||||||
ImGuiWindowFlags_NoSavedSettings = 1 << 8, // Never load/save settings in .ini file
|
ImGuiWindowFlags_NoSavedSettings = 1 << 8, // Never load/save settings in .ini file
|
||||||
ImGuiWindowFlags_NoInputs = 1 << 9, // Disable catching mouse or keyboard inputs
|
ImGuiWindowFlags_NoInputs = 1 << 9, // Disable catching mouse or keyboard inputs
|
||||||
ImGuiWindowFlags_MenuBar = 1 << 10, // Has a menu-bar
|
ImGuiWindowFlags_MenuBar = 1 << 10, // Has a menu-bar
|
||||||
ImGuiWindowFlags_HorizontalScrollbar = 1 << 11, // Enable horizontal scrollbar (off by default). You need to use SetNextWindowContentSize(ImVec2(width,0.0f)); prior to calling Begin() to specify width. Read code in imgui_demo in the "Horizontal Scrolling" section.
|
ImGuiWindowFlags_HorizontalScrollbar = 1 << 11, // Allow horizontal scrollbar to appear (off by default). You may use SetNextWindowContentSize(ImVec2(width,0.0f)); prior to calling Begin() to specify width. Read code in imgui_demo in the "Horizontal Scrolling" section.
|
||||||
ImGuiWindowFlags_NoFocusOnAppearing = 1 << 12, // Disable taking focus when transitioning from hidden to visible state
|
ImGuiWindowFlags_NoFocusOnAppearing = 1 << 12, // Disable taking focus when transitioning from hidden to visible state
|
||||||
ImGuiWindowFlags_NoBringToFrontOnFocus = 1 << 13, // Disable bringing window to front when taking focus (e.g. clicking on it or programatically giving it focus)
|
ImGuiWindowFlags_NoBringToFrontOnFocus = 1 << 13, // Disable bringing window to front when taking focus (e.g. clicking on it or programatically giving it focus)
|
||||||
|
ImGuiWindowFlags_AlwaysVerticalScrollbar= 1 << 14, // Always show vertical scrollbar (even if ContentSize.y < Size.y)
|
||||||
|
ImGuiWindowFlags_AlwaysHorizontalScrollbar=1<< 15, // Always show horizontal scrollbar (even if ContentSize.x < Size.x)
|
||||||
|
ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 16, // Ensure child windows without border uses style.WindowPadding (ignored by default for non-bordered child windows, because more convenient)
|
||||||
// [Internal]
|
// [Internal]
|
||||||
ImGuiWindowFlags_ChildWindow = 1 << 20, // Don't use! For internal use by BeginChild()
|
ImGuiWindowFlags_ChildWindow = 1 << 20, // Don't use! For internal use by BeginChild()
|
||||||
ImGuiWindowFlags_ChildWindowAutoFitX = 1 << 21, // Don't use! For internal use by BeginChild()
|
ImGuiWindowFlags_ChildWindowAutoFitX = 1 << 21, // Don't use! For internal use by BeginChild()
|
||||||
@ -487,7 +495,7 @@ enum ImGuiInputTextFlags_
|
|||||||
ImGuiInputTextFlags_EnterReturnsTrue = 1 << 5, // Return 'true' when Enter is pressed (as opposed to when the value was modified)
|
ImGuiInputTextFlags_EnterReturnsTrue = 1 << 5, // Return 'true' when Enter is pressed (as opposed to when the value was modified)
|
||||||
ImGuiInputTextFlags_CallbackCompletion = 1 << 6, // Call user function on pressing TAB (for completion handling)
|
ImGuiInputTextFlags_CallbackCompletion = 1 << 6, // Call user function on pressing TAB (for completion handling)
|
||||||
ImGuiInputTextFlags_CallbackHistory = 1 << 7, // Call user function on pressing Up/Down arrows (for history handling)
|
ImGuiInputTextFlags_CallbackHistory = 1 << 7, // Call user function on pressing Up/Down arrows (for history handling)
|
||||||
ImGuiInputTextFlags_CallbackAlways = 1 << 8, // Call user function every time
|
ImGuiInputTextFlags_CallbackAlways = 1 << 8, // Call user function every time. User code may query cursor position, modify text buffer.
|
||||||
ImGuiInputTextFlags_CallbackCharFilter = 1 << 9, // Call user function to filter character. Modify data->EventChar to replace/filter input, or return 1 to discard character.
|
ImGuiInputTextFlags_CallbackCharFilter = 1 << 9, // Call user function to filter character. Modify data->EventChar to replace/filter input, or return 1 to discard character.
|
||||||
ImGuiInputTextFlags_AllowTabInput = 1 << 10, // Pressing TAB input a '\t' character into the text field
|
ImGuiInputTextFlags_AllowTabInput = 1 << 10, // Pressing TAB input a '\t' character into the text field
|
||||||
ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11, // In multi-line mode, allow exiting edition by pressing Enter. Ctrl+Enter to add new line (by default adds new lines with Enter).
|
ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11, // In multi-line mode, allow exiting edition by pressing Enter. Ctrl+Enter to add new line (by default adds new lines with Enter).
|
||||||
@ -504,7 +512,8 @@ enum ImGuiSelectableFlags_
|
|||||||
{
|
{
|
||||||
// Default: 0
|
// Default: 0
|
||||||
ImGuiSelectableFlags_DontClosePopups = 1 << 0, // Clicking this don't close parent popup window
|
ImGuiSelectableFlags_DontClosePopups = 1 << 0, // Clicking this don't close parent popup window
|
||||||
ImGuiSelectableFlags_SpanAllColumns = 1 << 1 // Selectable frame can span all columns (text will still fit in current column)
|
ImGuiSelectableFlags_SpanAllColumns = 1 << 1, // Selectable frame can span all columns (text will still fit in current column)
|
||||||
|
ImGuiSelectableFlags_AllowDoubleClick = 1 << 2 // Generate press events on double clicks too
|
||||||
};
|
};
|
||||||
|
|
||||||
// User fill ImGuiIO.KeyMap[] array with indices into the ImGuiIO.KeysDown[512] array
|
// User fill ImGuiIO.KeyMap[] array with indices into the ImGuiIO.KeysDown[512] array
|
||||||
@ -537,8 +546,9 @@ enum ImGuiCol_
|
|||||||
{
|
{
|
||||||
ImGuiCol_Text,
|
ImGuiCol_Text,
|
||||||
ImGuiCol_TextDisabled,
|
ImGuiCol_TextDisabled,
|
||||||
ImGuiCol_WindowBg,
|
ImGuiCol_WindowBg, // Background of normal windows
|
||||||
ImGuiCol_ChildWindowBg,
|
ImGuiCol_ChildWindowBg, // Background of child windows
|
||||||
|
ImGuiCol_PopupBg, // Background of popups, menus, tooltips windows
|
||||||
ImGuiCol_Border,
|
ImGuiCol_Border,
|
||||||
ImGuiCol_BorderShadow,
|
ImGuiCol_BorderShadow,
|
||||||
ImGuiCol_FrameBg, // Background of checkbox, radio button, plot, slider, text input
|
ImGuiCol_FrameBg, // Background of checkbox, radio button, plot, slider, text input
|
||||||
@ -576,7 +586,6 @@ enum ImGuiCol_
|
|||||||
ImGuiCol_PlotHistogram,
|
ImGuiCol_PlotHistogram,
|
||||||
ImGuiCol_PlotHistogramHovered,
|
ImGuiCol_PlotHistogramHovered,
|
||||||
ImGuiCol_TextSelectedBg,
|
ImGuiCol_TextSelectedBg,
|
||||||
ImGuiCol_TooltipBg,
|
|
||||||
ImGuiCol_ModalWindowDarkening, // darken entire screen when a modal window is active
|
ImGuiCol_ModalWindowDarkening, // darken entire screen when a modal window is active
|
||||||
ImGuiCol_COUNT
|
ImGuiCol_COUNT
|
||||||
};
|
};
|
||||||
@ -654,7 +663,6 @@ struct ImGuiStyle
|
|||||||
ImVec2 ItemSpacing; // Horizontal and vertical spacing between widgets/lines
|
ImVec2 ItemSpacing; // Horizontal and vertical spacing between widgets/lines
|
||||||
ImVec2 ItemInnerSpacing; // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label)
|
ImVec2 ItemInnerSpacing; // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label)
|
||||||
ImVec2 TouchExtraPadding; // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
|
ImVec2 TouchExtraPadding; // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
|
||||||
float WindowFillAlphaDefault; // Default alpha of window background, if not specified in ImGui::Begin()
|
|
||||||
float IndentSpacing; // Horizontal indentation when e.g. entering a tree node
|
float IndentSpacing; // Horizontal indentation when e.g. entering a tree node
|
||||||
float ColumnsMinSpacing; // Minimum horizontal spacing between two columns
|
float ColumnsMinSpacing; // Minimum horizontal spacing between two columns
|
||||||
float ScrollbarSize; // Width of the vertical scrollbar, Height of the horizontal scrollbar
|
float ScrollbarSize; // Width of the vertical scrollbar, Height of the horizontal scrollbar
|
||||||
@ -699,6 +707,12 @@ struct ImGuiIO
|
|||||||
ImVec2 DisplayVisibleMin; // <unset> (0.0f,0.0f) // If you use DisplaySize as a virtual space larger than your screen, set DisplayVisibleMin/Max to the visible area.
|
ImVec2 DisplayVisibleMin; // <unset> (0.0f,0.0f) // If you use DisplaySize as a virtual space larger than your screen, set DisplayVisibleMin/Max to the visible area.
|
||||||
ImVec2 DisplayVisibleMax; // <unset> (0.0f,0.0f) // If the values are the same, we defaults to Min=(0.0f) and Max=DisplaySize
|
ImVec2 DisplayVisibleMax; // <unset> (0.0f,0.0f) // If the values are the same, we defaults to Min=(0.0f) and Max=DisplaySize
|
||||||
|
|
||||||
|
// Advanced/subtle behaviors
|
||||||
|
bool WordMovementUsesAltKey; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl
|
||||||
|
bool ShortcutsUseSuperKey; // = defined(__APPLE__) // OS X style: Shortcuts using Cmd/Super instead of Ctrl
|
||||||
|
bool DoubleClickSelectsWord; // = defined(__APPLE__) // OS X style: Double click selects by word instead of selecting whole text
|
||||||
|
bool MultiSelectUsesSuperKey; // = defined(__APPLE__) // OS X style: Multi-selection in lists uses Cmd/Super instead of Ctrl [unused yet]
|
||||||
|
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
// User Functions
|
// User Functions
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
@ -734,6 +748,7 @@ struct ImGuiIO
|
|||||||
bool KeyCtrl; // Keyboard modifier pressed: Control
|
bool KeyCtrl; // Keyboard modifier pressed: Control
|
||||||
bool KeyShift; // Keyboard modifier pressed: Shift
|
bool KeyShift; // Keyboard modifier pressed: Shift
|
||||||
bool KeyAlt; // Keyboard modifier pressed: Alt
|
bool KeyAlt; // Keyboard modifier pressed: Alt
|
||||||
|
bool KeySuper; // Keyboard modifier pressed: Cmd/Super/Windows
|
||||||
bool KeysDown[512]; // Keyboard keys that are pressed (in whatever storage order you naturally have access to keyboard data)
|
bool KeysDown[512]; // Keyboard keys that are pressed (in whatever storage order you naturally have access to keyboard data)
|
||||||
ImWchar InputCharacters[16+1]; // List of characters input (translated by user from keypress+keyboard state). Fill using AddInputCharacter() helper.
|
ImWchar InputCharacters[16+1]; // List of characters input (translated by user from keypress+keyboard state). Fill using AddInputCharacter() helper.
|
||||||
|
|
||||||
@ -831,11 +846,11 @@ public:
|
|||||||
inline void push_back(const value_type& v) { if (Size == Capacity) reserve(_grow_capacity(Size+1)); Data[Size++] = v; }
|
inline void push_back(const value_type& v) { if (Size == Capacity) reserve(_grow_capacity(Size+1)); Data[Size++] = v; }
|
||||||
inline void pop_back() { IM_ASSERT(Size > 0); Size--; }
|
inline void pop_back() { IM_ASSERT(Size > 0); Size--; }
|
||||||
|
|
||||||
inline iterator erase(const_iterator it) { IM_ASSERT(it >= begin() && it < end()); const ptrdiff_t off = it - begin(); memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(value_type)); Size--; return Data + off; }
|
inline iterator erase(const_iterator it) { IM_ASSERT(it >= Data && it < Data+Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(value_type)); Size--; return Data + off; }
|
||||||
inline iterator insert(const_iterator it, const value_type& v) { IM_ASSERT(it >= begin() && it <= end()); const ptrdiff_t off = it - begin(); if (Size == Capacity) reserve(Capacity ? Capacity * 2 : 4); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(value_type)); Data[off] = v; Size++; return Data + off; }
|
inline iterator insert(const_iterator it, const value_type& v) { IM_ASSERT(it >= Data && it <= Data+Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(Capacity ? Capacity * 2 : 4); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(value_type)); Data[off] = v; Size++; return Data + off; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// Helper: execute a block of code once a frame only
|
// Helper: execute a block of code at maximum once a frame
|
||||||
// Convenient if you want to quickly create an UI within deep-nested code that runs multiple times every frame.
|
// Convenient if you want to quickly create an UI within deep-nested code that runs multiple times every frame.
|
||||||
// Usage:
|
// Usage:
|
||||||
// IMGUI_ONCE_UPON_A_FRAME
|
// IMGUI_ONCE_UPON_A_FRAME
|
||||||
@ -875,6 +890,7 @@ struct ImGuiTextFilter
|
|||||||
int CountGrep;
|
int CountGrep;
|
||||||
|
|
||||||
ImGuiTextFilter(const char* default_filter = "");
|
ImGuiTextFilter(const char* default_filter = "");
|
||||||
|
~ImGuiTextFilter() {}
|
||||||
void Clear() { InputBuf[0] = 0; Build(); }
|
void Clear() { InputBuf[0] = 0; Build(); }
|
||||||
bool Draw(const char* label = "Filter (inc,-exc)", float width = 0.0f); // Helper calling InputText+Build
|
bool Draw(const char* label = "Filter (inc,-exc)", float width = 0.0f); // Helper calling InputText+Build
|
||||||
bool PassFilter(const char* text, const char* text_end = NULL) const;
|
bool PassFilter(const char* text, const char* text_end = NULL) const;
|
||||||
@ -892,7 +908,7 @@ struct ImGuiTextBuffer
|
|||||||
const char* begin() const { return &Buf.front(); }
|
const char* begin() const { return &Buf.front(); }
|
||||||
const char* end() const { return &Buf.back(); } // Buf is zero-terminated, so end() will point on the zero-terminator
|
const char* end() const { return &Buf.back(); } // Buf is zero-terminated, so end() will point on the zero-terminator
|
||||||
int size() const { return Buf.Size - 1; }
|
int size() const { return Buf.Size - 1; }
|
||||||
bool empty() { return Buf.Size >= 2; }
|
bool empty() { return Buf.Size <= 1; }
|
||||||
void clear() { Buf.clear(); Buf.push_back(0); }
|
void clear() { Buf.clear(); Buf.push_back(0); }
|
||||||
const char* c_str() const { return Buf.Data; }
|
const char* c_str() const { return Buf.Data; }
|
||||||
IMGUI_API void append(const char* fmt, ...) IM_PRINTFARGS(2);
|
IMGUI_API void append(const char* fmt, ...) IM_PRINTFARGS(2);
|
||||||
@ -917,33 +933,33 @@ struct ImGuiStorage
|
|||||||
Pair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; }
|
Pair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; }
|
||||||
Pair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; }
|
Pair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; }
|
||||||
};
|
};
|
||||||
ImVector<Pair> Data;
|
ImVector<Pair> Data;
|
||||||
|
|
||||||
// - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N)
|
// - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N)
|
||||||
// - Set***() functions find pair, insertion on demand if missing.
|
// - Set***() functions find pair, insertion on demand if missing.
|
||||||
// - Sorted insertion is costly but should amortize. A typical frame shouldn't need to insert any new pair.
|
// - Sorted insertion is costly but should amortize. A typical frame shouldn't need to insert any new pair.
|
||||||
IMGUI_API void Clear();
|
IMGUI_API void Clear();
|
||||||
IMGUI_API int GetInt(ImGuiID key, int default_val = 0) const;
|
IMGUI_API int GetInt(ImGuiID key, int default_val = 0) const;
|
||||||
IMGUI_API void SetInt(ImGuiID key, int val);
|
IMGUI_API void SetInt(ImGuiID key, int val);
|
||||||
IMGUI_API float GetFloat(ImGuiID key, float default_val = 0.0f) const;
|
IMGUI_API float GetFloat(ImGuiID key, float default_val = 0.0f) const;
|
||||||
IMGUI_API void SetFloat(ImGuiID key, float val);
|
IMGUI_API void SetFloat(ImGuiID key, float val);
|
||||||
IMGUI_API void* GetVoidPtr(ImGuiID key) const; // default_val is NULL
|
IMGUI_API void* GetVoidPtr(ImGuiID key) const; // default_val is NULL
|
||||||
IMGUI_API void SetVoidPtr(ImGuiID key, void* val);
|
IMGUI_API void SetVoidPtr(ImGuiID key, void* val);
|
||||||
|
|
||||||
// - Get***Ref() functions finds pair, insert on demand if missing, return pointer. Useful if you intend to do Get+Set.
|
// - Get***Ref() functions finds pair, insert on demand if missing, return pointer. Useful if you intend to do Get+Set.
|
||||||
// - References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer.
|
// - References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer.
|
||||||
// - A typical use case where this is convenient:
|
// - A typical use case where this is convenient:
|
||||||
// float* pvar = ImGui::GetFloatRef(key); ImGui::SliderFloat("var", pvar, 0, 100.0f); some_var += *pvar;
|
// float* pvar = ImGui::GetFloatRef(key); ImGui::SliderFloat("var", pvar, 0, 100.0f); some_var += *pvar;
|
||||||
// - You can also use this to quickly create temporary editable values during a session of using Edit&Continue, without restarting your application.
|
// - You can also use this to quickly create temporary editable values during a session of using Edit&Continue, without restarting your application.
|
||||||
IMGUI_API int* GetIntRef(ImGuiID key, int default_val = 0);
|
IMGUI_API int* GetIntRef(ImGuiID key, int default_val = 0);
|
||||||
IMGUI_API float* GetFloatRef(ImGuiID key, float default_val = 0);
|
IMGUI_API float* GetFloatRef(ImGuiID key, float default_val = 0);
|
||||||
IMGUI_API void** GetVoidPtrRef(ImGuiID key, void* default_val = NULL);
|
IMGUI_API void** GetVoidPtrRef(ImGuiID key, void* default_val = NULL);
|
||||||
|
|
||||||
// Use on your own storage if you know only integer are being stored (open/close all tree nodes)
|
// Use on your own storage if you know only integer are being stored (open/close all tree nodes)
|
||||||
IMGUI_API void SetAllInt(int val);
|
IMGUI_API void SetAllInt(int val);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Shared state of InputText(), passed to callback when a ImGuiInputTextFlags_Callback* flag is used.
|
// Shared state of InputText(), passed to callback when a ImGuiInputTextFlags_Callback* flag is used and the corresponding callback is triggered.
|
||||||
struct ImGuiTextEditCallbackData
|
struct ImGuiTextEditCallbackData
|
||||||
{
|
{
|
||||||
ImGuiInputTextFlags EventFlag; // One of ImGuiInputTextFlags_Callback* // Read-only
|
ImGuiInputTextFlags EventFlag; // One of ImGuiInputTextFlags_Callback* // Read-only
|
||||||
@ -955,21 +971,24 @@ struct ImGuiTextEditCallbackData
|
|||||||
ImWchar EventChar; // Character input // Read-write (replace character or set to zero)
|
ImWchar EventChar; // Character input // Read-write (replace character or set to zero)
|
||||||
|
|
||||||
// Completion,History,Always events:
|
// Completion,History,Always events:
|
||||||
|
// If you modify the buffer contents make sure you update 'BufTextLen' and set 'BufDirty' to true.
|
||||||
ImGuiKey EventKey; // Key pressed (Up/Down/TAB) // Read-only
|
ImGuiKey EventKey; // Key pressed (Up/Down/TAB) // Read-only
|
||||||
char* Buf; // Current text // Read-write (pointed data only)
|
char* Buf; // Current text buffer // Read-write (pointed data only, can't replace the actual pointer)
|
||||||
int BufSize; // // Read-only
|
int BufTextLen; // Current text length in bytes // Read-write
|
||||||
bool BufDirty; // Must set if you modify Buf directly // Write
|
int BufSize; // Maximum text length in bytes // Read-only
|
||||||
|
bool BufDirty; // Set if you modify Buf/BufTextLen!! // Write
|
||||||
int CursorPos; // // Read-write
|
int CursorPos; // // Read-write
|
||||||
int SelectionStart; // // Read-write (== to SelectionEnd when no selection)
|
int SelectionStart; // // Read-write (== to SelectionEnd when no selection)
|
||||||
int SelectionEnd; // // Read-write
|
int SelectionEnd; // // Read-write
|
||||||
|
|
||||||
// NB: calling those function loses selection.
|
// NB: Helper functions for text manipulation. Calling those function loses selection.
|
||||||
void DeleteChars(int pos, int bytes_count);
|
void DeleteChars(int pos, int bytes_count);
|
||||||
void InsertChars(int pos, const char* text, const char* text_end = NULL);
|
void InsertChars(int pos, const char* text, const char* text_end = NULL);
|
||||||
bool HasSelection() const { return SelectionStart != SelectionEnd; }
|
bool HasSelection() const { return SelectionStart != SelectionEnd; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// ImColor() is just a helper that implicity converts to either ImU32 (packed 4x1 byte) or ImVec4 (4x1 float)
|
// ImColor() helper to implicity converts colors to either ImU32 (packed 4x1 byte) or ImVec4 (4x1 float)
|
||||||
|
// Avoid storing ImColor! Store either u32 of ImVec4. This is not a full-featured color class.
|
||||||
// None of the ImGui API are using ImColor directly but you can use it as a convenience to pass colors in either ImU32 or ImVec4 formats.
|
// None of the ImGui API are using ImColor directly but you can use it as a convenience to pass colors in either ImU32 or ImVec4 formats.
|
||||||
struct ImColor
|
struct ImColor
|
||||||
{
|
{
|
||||||
@ -1026,15 +1045,20 @@ struct ImGuiListClipper
|
|||||||
// Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList.
|
// Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Helpers macros to generate 32-bits encoded colors
|
||||||
|
#define IM_COL32(R,G,B,A) (((ImU32)(A)<<24) | ((ImU32)(B)<<16) | ((ImU32)(G)<<8) | ((ImU32)(R)))
|
||||||
|
#define IM_COL32_WHITE (0xFFFFFFFF)
|
||||||
|
#define IM_COL32_BLACK (0xFF000000)
|
||||||
|
#define IM_COL32_BLACK_TRANS (0x00000000) // Transparent black
|
||||||
|
|
||||||
// Draw callbacks for advanced uses.
|
// Draw callbacks for advanced uses.
|
||||||
// NB- You most likely do NOT need to use draw callbacks just to create your own widget or customized UI rendering (you can poke into the draw list for that)
|
// NB- You most likely do NOT need to use draw callbacks just to create your own widget or customized UI rendering (you can poke into the draw list for that)
|
||||||
// Draw callback are useful for example if you want to render a complex 3D scene inside a UI element.
|
// Draw callback may be useful for example, if you want to render a complex 3D scene inside a UI element, change your GPU render state, etc.
|
||||||
// The expected behavior from your rendering loop is:
|
// The expected behavior from your rendering loop is:
|
||||||
// if (cmd.UserCallback != NULL)
|
// if (cmd.UserCallback != NULL)
|
||||||
// cmd.UserCallback(parent_list, cmd);
|
// cmd.UserCallback(parent_list, cmd);
|
||||||
// else
|
// else
|
||||||
// RenderTriangles()
|
// RenderTriangles()
|
||||||
// It is up to you to decide if your rendering loop or the callback should be responsible for backup/restoring rendering state.
|
|
||||||
typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd);
|
typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd);
|
||||||
|
|
||||||
// Typically, 1 command = 1 gpu draw call (unless command is a callback)
|
// Typically, 1 command = 1 gpu draw call (unless command is a callback)
|
||||||
@ -1063,9 +1087,9 @@ struct ImDrawVert
|
|||||||
ImU32 col;
|
ImU32 col;
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
// You can change the vertex format layout by defining IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT in imconfig.h
|
// You can override the vertex format layout by defining IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT in imconfig.h
|
||||||
// The code expect ImVec2 pos (8 bytes), ImVec2 uv (8 bytes), ImU32 col (4 bytes), but you can re-order them or add other fields as needed to simplify integration in your engine.
|
// The code expect ImVec2 pos (8 bytes), ImVec2 uv (8 bytes), ImU32 col (4 bytes), but you can re-order them or add other fields as needed to simplify integration in your engine.
|
||||||
// The type has to be described by the #define (you can either declare the struct or use a typedef)
|
// The type has to be described within the macro (you can either declare the struct or use a typedef)
|
||||||
IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT;
|
IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1083,7 +1107,6 @@ struct ImDrawChannel
|
|||||||
// If you want to add custom rendering within a window, you can use ImGui::GetWindowDrawList() to access the current draw list and add your own primitives.
|
// If you want to add custom rendering within a window, you can use ImGui::GetWindowDrawList() to access the current draw list and add your own primitives.
|
||||||
// You can interleave normal ImGui:: calls and adding primitives to the current draw list.
|
// You can interleave normal ImGui:: calls and adding primitives to the current draw list.
|
||||||
// All positions are in screen coordinates (0,0=top-left, 1 pixel per unit). Primitives are always added to the list and not culled (culling is done at render time and at a higher-level by ImGui:: functions).
|
// All positions are in screen coordinates (0,0=top-left, 1 pixel per unit). Primitives are always added to the list and not culled (culling is done at render time and at a higher-level by ImGui:: functions).
|
||||||
// Note that this only gives you access to rendering polygons. If your intent is to create custom widgets and the publicly exposed functions/data aren't sufficient, you can add code in imgui_user.inl
|
|
||||||
struct ImDrawList
|
struct ImDrawList
|
||||||
{
|
{
|
||||||
// This is what you have to render
|
// This is what you have to render
|
||||||
@ -1105,7 +1128,7 @@ struct ImDrawList
|
|||||||
|
|
||||||
ImDrawList() { _OwnerName = NULL; Clear(); }
|
ImDrawList() { _OwnerName = NULL; Clear(); }
|
||||||
~ImDrawList() { ClearFreeMemory(); }
|
~ImDrawList() { ClearFreeMemory(); }
|
||||||
IMGUI_API void PushClipRect(const ImVec4& clip_rect); // Scissoring. The values are x1, y1, x2, y2. Only apply to rendering. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling)
|
IMGUI_API void PushClipRect(const ImVec4& clip_rect); // Scissoring. Note that the values are (x1,y1,x2,y2) and NOT (x1,y1,w,h). This is passed down to your render function but not used for CPU-side clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling)
|
||||||
IMGUI_API void PushClipRectFullScreen();
|
IMGUI_API void PushClipRectFullScreen();
|
||||||
IMGUI_API void PopClipRect();
|
IMGUI_API void PopClipRect();
|
||||||
IMGUI_API void PushTextureID(const ImTextureID& texture_id);
|
IMGUI_API void PushTextureID(const ImTextureID& texture_id);
|
||||||
@ -1113,11 +1136,12 @@ struct ImDrawList
|
|||||||
|
|
||||||
// Primitives
|
// Primitives
|
||||||
IMGUI_API void AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness = 1.0f);
|
IMGUI_API void AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness = 1.0f);
|
||||||
IMGUI_API void AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F);
|
IMGUI_API void AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F, float thickness = 1.0f); // a: upper-left, b: lower-right
|
||||||
IMGUI_API void AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F);
|
IMGUI_API void AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners = 0x0F); // a: upper-left, b: lower-right
|
||||||
IMGUI_API void AddRectFilledMultiColor(const ImVec2& a, const ImVec2& b, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left);
|
IMGUI_API void AddRectFilledMultiColor(const ImVec2& a, const ImVec2& b, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left);
|
||||||
|
IMGUI_API void AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness = 1.0f);
|
||||||
IMGUI_API void AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col);
|
IMGUI_API void AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col);
|
||||||
IMGUI_API void AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12);
|
IMGUI_API void AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12, float thickness = 1.0f);
|
||||||
IMGUI_API void AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12);
|
IMGUI_API void AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12);
|
||||||
IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL);
|
IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL);
|
||||||
IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);
|
IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);
|
||||||
@ -1129,7 +1153,7 @@ struct ImDrawList
|
|||||||
// Stateful path API, add points then finish with PathFill() or PathStroke()
|
// Stateful path API, add points then finish with PathFill() or PathStroke()
|
||||||
inline void PathClear() { _Path.resize(0); }
|
inline void PathClear() { _Path.resize(0); }
|
||||||
inline void PathLineTo(const ImVec2& pos) { _Path.push_back(pos); }
|
inline void PathLineTo(const ImVec2& pos) { _Path.push_back(pos); }
|
||||||
inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || _Path[_Path.Size-1].x != pos.x || _Path[_Path.Size-1].y != pos.y) _Path.push_back(pos); }
|
inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path[_Path.Size-1], &pos, 8) != 0) _Path.push_back(pos); }
|
||||||
inline void PathFill(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col, true); PathClear(); }
|
inline void PathFill(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col, true); PathClear(); }
|
||||||
inline void PathStroke(ImU32 col, bool closed, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, closed, thickness, true); PathClear(); }
|
inline void PathStroke(ImU32 col, bool closed, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, closed, thickness, true); PathClear(); }
|
||||||
IMGUI_API void PathArcTo(const ImVec2& centre, float radius, float a_min, float a_max, int num_segments = 10);
|
IMGUI_API void PathArcTo(const ImVec2& centre, float radius, float a_min, float a_max, int num_segments = 10);
|
||||||
@ -1153,8 +1177,9 @@ struct ImDrawList
|
|||||||
IMGUI_API void Clear();
|
IMGUI_API void Clear();
|
||||||
IMGUI_API void ClearFreeMemory();
|
IMGUI_API void ClearFreeMemory();
|
||||||
IMGUI_API void PrimReserve(int idx_count, int vtx_count);
|
IMGUI_API void PrimReserve(int idx_count, int vtx_count);
|
||||||
IMGUI_API void PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col);
|
IMGUI_API void PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col); // Axis aligned rectangle (composed of two triangles)
|
||||||
IMGUI_API void PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col);
|
IMGUI_API void PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col);
|
||||||
|
IMGUI_API void PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col);
|
||||||
inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); }
|
inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); }
|
||||||
inline void PrimWriteVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col){ _VtxWritePtr->pos = pos; _VtxWritePtr->uv = uv; _VtxWritePtr->col = col; _VtxWritePtr++; _VtxCurrentIdx++; }
|
inline void PrimWriteVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col){ _VtxWritePtr->pos = pos; _VtxWritePtr->uv = uv; _VtxWritePtr->col = col; _VtxWritePtr++; _VtxCurrentIdx++; }
|
||||||
inline void PrimWriteIdx(ImDrawIdx idx) { *_IdxWritePtr = idx; _IdxWritePtr++; }
|
inline void PrimWriteIdx(ImDrawIdx idx) { *_IdxWritePtr = idx; _IdxWritePtr++; }
|
||||||
@ -1246,8 +1271,8 @@ struct ImFontAtlas
|
|||||||
int TexWidth; // Texture width calculated during Build().
|
int TexWidth; // Texture width calculated during Build().
|
||||||
int TexHeight; // Texture height calculated during Build().
|
int TexHeight; // Texture height calculated during Build().
|
||||||
int TexDesiredWidth; // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height.
|
int TexDesiredWidth; // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height.
|
||||||
ImVec2 TexUvWhitePixel; // Texture coordinates to a white pixel (part of the TexExtraData block)
|
ImVec2 TexUvWhitePixel; // Texture coordinates to a white pixel
|
||||||
ImVector<ImFont*> Fonts;
|
ImVector<ImFont*> Fonts; // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font.
|
||||||
|
|
||||||
// Private
|
// Private
|
||||||
ImVector<ImFontConfig> ConfigData; // Internal data
|
ImVector<ImFontConfig> ConfigData; // Internal data
|
||||||
|
213
imgui_demo.cpp
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.47
|
// dear imgui, v1.48
|
||||||
// (demo code)
|
// (demo code)
|
||||||
|
|
||||||
// Don't remove this file from your project! It is useful reference code that you can execute.
|
// Don't remove this file from your project! It is useful reference code that you can execute.
|
||||||
@ -139,7 +139,6 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
static bool no_scrollbar = false;
|
static bool no_scrollbar = false;
|
||||||
static bool no_collapse = false;
|
static bool no_collapse = false;
|
||||||
static bool no_menu = false;
|
static bool no_menu = false;
|
||||||
static float bg_alpha = -0.01f; // <0: default
|
|
||||||
|
|
||||||
// Demonstrate the various window flags. Typically you would just use the default.
|
// Demonstrate the various window flags. Typically you would just use the default.
|
||||||
ImGuiWindowFlags window_flags = 0;
|
ImGuiWindowFlags window_flags = 0;
|
||||||
@ -150,7 +149,8 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
if (no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar;
|
if (no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar;
|
||||||
if (no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse;
|
if (no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse;
|
||||||
if (!no_menu) window_flags |= ImGuiWindowFlags_MenuBar;
|
if (!no_menu) window_flags |= ImGuiWindowFlags_MenuBar;
|
||||||
if (!ImGui::Begin("ImGui Demo", p_opened, ImVec2(550,680), bg_alpha, window_flags))
|
ImGui::SetNextWindowSize(ImVec2(550,680), ImGuiSetCond_FirstUseEver);
|
||||||
|
if (!ImGui::Begin("ImGui Demo", p_opened, window_flags))
|
||||||
{
|
{
|
||||||
// Early out if the window is collapsed, as an optimization.
|
// Early out if the window is collapsed, as an optimization.
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
@ -211,10 +211,6 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
ImGui::Checkbox("No collapse", &no_collapse);
|
ImGui::Checkbox("No collapse", &no_collapse);
|
||||||
ImGui::Checkbox("No menu", &no_menu);
|
ImGui::Checkbox("No menu", &no_menu);
|
||||||
|
|
||||||
ImGui::PushItemWidth(100);
|
|
||||||
ImGui::DragFloat("Window Fill Alpha", &bg_alpha, 0.005f, -0.01f, 1.0f, bg_alpha < 0.0f ? "(default)" : "%.3f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero.
|
|
||||||
ImGui::PopItemWidth();
|
|
||||||
|
|
||||||
if (ImGui::TreeNode("Style"))
|
if (ImGui::TreeNode("Style"))
|
||||||
{
|
{
|
||||||
ImGui::ShowStyleEditor();
|
ImGui::ShowStyleEditor();
|
||||||
@ -223,8 +219,7 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
|
|
||||||
if (ImGui::TreeNode("Fonts", "Fonts (%d)", ImGui::GetIO().Fonts->Fonts.Size))
|
if (ImGui::TreeNode("Fonts", "Fonts (%d)", ImGui::GetIO().Fonts->Fonts.Size))
|
||||||
{
|
{
|
||||||
ImGui::SameLine();
|
ImGui::SameLine(); ShowHelpMarker("Tip: Load fonts with io.Fonts->AddFontFromFileTTF()\nbefore calling io.Fonts->GetTex* functions.");
|
||||||
ShowHelpMarker("Tip: Load fonts with io.Fonts->AddFontFromFileTTF()\nbefore calling io.Fonts->GetTex* functions.");
|
|
||||||
ImFontAtlas* atlas = ImGui::GetIO().Fonts;
|
ImFontAtlas* atlas = ImGui::GetIO().Fonts;
|
||||||
if (ImGui::TreeNode("Atlas texture", "Atlas texture (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight))
|
if (ImGui::TreeNode("Atlas texture", "Atlas texture (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight))
|
||||||
{
|
{
|
||||||
@ -393,11 +388,14 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
{
|
{
|
||||||
if (ImGui::TreeNode("Basic"))
|
if (ImGui::TreeNode("Basic"))
|
||||||
{
|
{
|
||||||
static bool selected[3] = { false, true, false };
|
static bool selected[4] = { false, true, false, false };
|
||||||
ImGui::Selectable("1. I am selectable", &selected[0]);
|
ImGui::Selectable("1. I am selectable", &selected[0]);
|
||||||
ImGui::Selectable("2. I am selectable", &selected[1]);
|
ImGui::Selectable("2. I am selectable", &selected[1]);
|
||||||
ImGui::Text("3. I am not selectable");
|
ImGui::Text("3. I am not selectable");
|
||||||
ImGui::Selectable("4. I am selectable", &selected[2]);
|
ImGui::Selectable("4. I am selectable", &selected[2]);
|
||||||
|
if (ImGui::Selectable("5. I am double clickable", selected[3], ImGuiSelectableFlags_AllowDoubleClick))
|
||||||
|
if (ImGui::IsMouseDoubleClicked(0))
|
||||||
|
selected[3] = !selected[3];
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
if (ImGui::TreeNode("Rendering more text into the same block"))
|
if (ImGui::TreeNode("Rendering more text into the same block"))
|
||||||
@ -442,9 +440,9 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
|
|
||||||
ImGui::Text("Password input");
|
ImGui::Text("Password input");
|
||||||
static char bufpass[64] = "password123";
|
static char bufpass[64] = "password123";
|
||||||
ImGui::InputText("password", bufpass, 64, ImGuiInputTextFlags_Password);
|
ImGui::InputText("password", bufpass, 64, ImGuiInputTextFlags_Password | ImGuiInputTextFlags_CharsNoBlank);
|
||||||
ImGui::SameLine(); ShowHelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n");
|
ImGui::SameLine(); ShowHelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n");
|
||||||
ImGui::InputText("password (clear)", bufpass, 64);
|
ImGui::InputText("password (clear)", bufpass, 64, ImGuiInputTextFlags_CharsNoBlank);
|
||||||
|
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
@ -714,7 +712,9 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
|
static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f };
|
||||||
ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr));
|
ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr));
|
||||||
|
|
||||||
static ImVector<float> values; if (values.empty()) { values.resize(90); memset(values.Data, 0, values.Size*sizeof(float)); }
|
// Create a dummy array of contiguous float values to plot
|
||||||
|
// Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float and the sizeof() of your structure in the Stride parameter.
|
||||||
|
static float values[90] = { 0 };
|
||||||
static int values_offset = 0;
|
static int values_offset = 0;
|
||||||
if (animate)
|
if (animate)
|
||||||
{
|
{
|
||||||
@ -723,11 +723,11 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
{
|
{
|
||||||
static float phase = 0.0f;
|
static float phase = 0.0f;
|
||||||
values[values_offset] = cosf(phase);
|
values[values_offset] = cosf(phase);
|
||||||
values_offset = (values_offset+1)%values.Size;
|
values_offset = (values_offset+1) % IM_ARRAYSIZE(values);
|
||||||
phase += 0.10f*values_offset;
|
phase += 0.10f*values_offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::PlotLines("Lines", values.Data, values.Size, values_offset, "avg 0.0", -1.0f, 1.0f, ImVec2(0,80));
|
ImGui::PlotLines("Lines", values, IM_ARRAYSIZE(values), values_offset, "avg 0.0", -1.0f, 1.0f, ImVec2(0,80));
|
||||||
ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0,80));
|
ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0,80));
|
||||||
|
|
||||||
// Use functions to generate output
|
// Use functions to generate output
|
||||||
@ -813,25 +813,35 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
{
|
{
|
||||||
static float f = 0.0f;
|
static float f = 0.0f;
|
||||||
ImGui::Text("PushItemWidth(100)");
|
ImGui::Text("PushItemWidth(100)");
|
||||||
|
ImGui::SameLine(); ShowHelpMarker("Fixed width.");
|
||||||
ImGui::PushItemWidth(100);
|
ImGui::PushItemWidth(100);
|
||||||
ImGui::DragFloat("float##1", &f);
|
ImGui::DragFloat("float##1", &f);
|
||||||
ImGui::PopItemWidth();
|
ImGui::PopItemWidth();
|
||||||
|
|
||||||
ImGui::Text("PushItemWidth(GetWindowWidth() * 0.5f);");
|
ImGui::Text("PushItemWidth(GetWindowWidth() * 0.5f)");
|
||||||
|
ImGui::SameLine(); ShowHelpMarker("Half of window width.");
|
||||||
ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.5f);
|
ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.5f);
|
||||||
ImGui::DragFloat("float##2", &f);
|
ImGui::DragFloat("float##2", &f);
|
||||||
ImGui::PopItemWidth();
|
ImGui::PopItemWidth();
|
||||||
|
|
||||||
ImGui::Text("PushItemWidth(GetContentRegionAvailWidth() * 0.5f);");
|
ImGui::Text("PushItemWidth(GetContentRegionAvailWidth() * 0.5f)");
|
||||||
|
ImGui::SameLine(); ShowHelpMarker("Half of available width.\n(~ right-cursor_pos)\n(works within a column set)");
|
||||||
ImGui::PushItemWidth(ImGui::GetContentRegionAvailWidth() * 0.5f);
|
ImGui::PushItemWidth(ImGui::GetContentRegionAvailWidth() * 0.5f);
|
||||||
ImGui::DragFloat("float##3", &f);
|
ImGui::DragFloat("float##3", &f);
|
||||||
ImGui::PopItemWidth();
|
ImGui::PopItemWidth();
|
||||||
|
|
||||||
ImGui::Text("PushItemWidth(-100);");
|
ImGui::Text("PushItemWidth(-100)");
|
||||||
|
ImGui::SameLine(); ShowHelpMarker("Align to right edge minus 100");
|
||||||
ImGui::PushItemWidth(-100);
|
ImGui::PushItemWidth(-100);
|
||||||
ImGui::DragFloat("float##4", &f);
|
ImGui::DragFloat("float##4", &f);
|
||||||
ImGui::PopItemWidth();
|
ImGui::PopItemWidth();
|
||||||
|
|
||||||
|
ImGui::Text("PushItemWidth(-1)");
|
||||||
|
ImGui::SameLine(); ShowHelpMarker("Align to right edge");
|
||||||
|
ImGui::PushItemWidth(-1);
|
||||||
|
ImGui::DragFloat("float##5", &f);
|
||||||
|
ImGui::PopItemWidth();
|
||||||
|
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1094,7 +1104,7 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
ImGui::InvisibleButton("##dummy", size);
|
ImGui::InvisibleButton("##dummy", size);
|
||||||
if (ImGui::IsItemActive() && ImGui::IsMouseDragging()) { offset.x += ImGui::GetIO().MouseDelta.x; offset.y += ImGui::GetIO().MouseDelta.y; }
|
if (ImGui::IsItemActive() && ImGui::IsMouseDragging()) { offset.x += ImGui::GetIO().MouseDelta.x; offset.y += ImGui::GetIO().MouseDelta.y; }
|
||||||
ImGui::GetWindowDrawList()->AddRectFilled(pos, ImVec2(pos.x+size.x,pos.y+size.y), ImColor(90,90,120,255));
|
ImGui::GetWindowDrawList()->AddRectFilled(pos, ImVec2(pos.x+size.x,pos.y+size.y), ImColor(90,90,120,255));
|
||||||
ImGui::GetWindowDrawList()->AddText(ImGui::GetWindowFont(), ImGui::GetWindowFontSize()*2.0f, ImVec2(pos.x+offset.x,pos.y+offset.y), ImColor(255,255,255,255), "Line 1 hello\nLine 2 clip me!", NULL, 0.0f, &clip_rect);
|
ImGui::GetWindowDrawList()->AddText(ImGui::GetFont(), ImGui::GetFontSize()*2.0f, ImVec2(pos.x+offset.x,pos.y+offset.y), ImColor(255,255,255,255), "Line 1 hello\nLine 2 clip me!", NULL, 0.0f, &clip_rect);
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1486,15 +1496,19 @@ void ImGui::ShowTestWindow(bool* p_opened)
|
|||||||
ImGui::Text("Keys down:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (io.KeysDownDuration[i] >= 0.0f) { ImGui::SameLine(); ImGui::Text("%d (%.02f secs)", i, io.KeysDownDuration[i]); }
|
ImGui::Text("Keys down:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (io.KeysDownDuration[i] >= 0.0f) { ImGui::SameLine(); ImGui::Text("%d (%.02f secs)", i, io.KeysDownDuration[i]); }
|
||||||
ImGui::Text("Keys pressed:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyPressed(i)) { ImGui::SameLine(); ImGui::Text("%d", i); }
|
ImGui::Text("Keys pressed:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyPressed(i)) { ImGui::SameLine(); ImGui::Text("%d", i); }
|
||||||
ImGui::Text("Keys release:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyReleased(i)) { ImGui::SameLine(); ImGui::Text("%d", i); }
|
ImGui::Text("Keys release:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyReleased(i)) { ImGui::SameLine(); ImGui::Text("%d", i); }
|
||||||
ImGui::Text("KeyMods: %s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "");
|
ImGui::Text("KeyMods: %s%s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : "");
|
||||||
|
|
||||||
ImGui::Text("WantCaptureMouse: %s", io.WantCaptureMouse ? "true" : "false");
|
ImGui::Text("WantCaptureMouse: %s", io.WantCaptureMouse ? "true" : "false");
|
||||||
ImGui::Text("WantCaptureKeyboard: %s", io.WantCaptureKeyboard ? "true" : "false");
|
ImGui::Text("WantCaptureKeyboard: %s", io.WantCaptureKeyboard ? "true" : "false");
|
||||||
ImGui::Text("WantTextInput: %s", io.WantTextInput ? "true" : "false");
|
ImGui::Text("WantTextInput: %s", io.WantTextInput ? "true" : "false");
|
||||||
|
|
||||||
ImGui::Button("Hover me\nto enforce\ninputs capture");
|
ImGui::Button("Hovering me sets the\nkeyboard capture flag");
|
||||||
if (ImGui::IsItemHovered())
|
if (ImGui::IsItemHovered())
|
||||||
ImGui::CaptureKeyboardFromApp();
|
ImGui::CaptureKeyboardFromApp(true);
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::Button("Holding me clears the\nthe keyboard capture flag");
|
||||||
|
if (ImGui::IsItemActive())
|
||||||
|
ImGui::CaptureKeyboardFromApp(false);
|
||||||
|
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
@ -1543,7 +1557,6 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
|
|||||||
ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, FLT_MAX, NULL, 2.0f);
|
ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, FLT_MAX, NULL, 2.0f);
|
||||||
if (style.CurveTessellationTol < 0.0f) style.CurveTessellationTol = 0.10f;
|
if (style.CurveTessellationTol < 0.0f) style.CurveTessellationTol = 0.10f;
|
||||||
ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero.
|
ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero.
|
||||||
ImGui::DragFloat("Window Fill Alpha Default", &style.WindowFillAlphaDefault, 0.005f, 0.0f, 1.0f, "%.2f");
|
|
||||||
ImGui::PopItemWidth();
|
ImGui::PopItemWidth();
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
@ -1600,7 +1613,7 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
|
|||||||
static ImGuiTextFilter filter;
|
static ImGuiTextFilter filter;
|
||||||
filter.Draw("Filter colors", 200);
|
filter.Draw("Filter colors", 200);
|
||||||
|
|
||||||
ImGui::BeginChild("#colors", ImVec2(0, 300), true);
|
ImGui::BeginChild("#colors", ImVec2(0, 300), true, ImGuiWindowFlags_AlwaysVerticalScrollbar);
|
||||||
ImGui::PushItemWidth(-160);
|
ImGui::PushItemWidth(-160);
|
||||||
ImGui::ColorEditMode(edit_mode);
|
ImGui::ColorEditMode(edit_mode);
|
||||||
for (int i = 0; i < ImGuiCol_COUNT; i++)
|
for (int i = 0; i < ImGuiCol_COUNT; i++)
|
||||||
@ -1763,7 +1776,7 @@ static void ShowExampleAppManipulatingWindowTitle(bool* opened)
|
|||||||
|
|
||||||
static void ShowExampleAppCustomRendering(bool* opened)
|
static void ShowExampleAppCustomRendering(bool* opened)
|
||||||
{
|
{
|
||||||
ImGui::SetNextWindowSize(ImVec2(300,350), ImGuiSetCond_FirstUseEver);
|
ImGui::SetNextWindowSize(ImVec2(350,560), ImGuiSetCond_FirstUseEver);
|
||||||
if (!ImGui::Begin("Example: Custom rendering", opened))
|
if (!ImGui::Begin("Example: Custom rendering", opened))
|
||||||
{
|
{
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
@ -1773,59 +1786,90 @@ static void ShowExampleAppCustomRendering(bool* opened)
|
|||||||
// Tip: If you do a lot of custom rendering, you probably want to use your own geometrical types and benefit of overloaded operators, etc.
|
// Tip: If you do a lot of custom rendering, you probably want to use your own geometrical types and benefit of overloaded operators, etc.
|
||||||
// Define IM_VEC2_CLASS_EXTRA in imconfig.h to create implicit conversions between your types and ImVec2/ImVec4.
|
// Define IM_VEC2_CLASS_EXTRA in imconfig.h to create implicit conversions between your types and ImVec2/ImVec4.
|
||||||
// ImGui defines overloaded operators but they are internal to imgui.cpp and not exposed outside (to avoid messing with your types)
|
// ImGui defines overloaded operators but they are internal to imgui.cpp and not exposed outside (to avoid messing with your types)
|
||||||
// In this example we aren't using the operators.
|
// In this example we are not using the maths operators!
|
||||||
|
|
||||||
static ImVector<ImVec2> points;
|
|
||||||
static bool adding_line = false;
|
|
||||||
if (ImGui::Button("Clear")) points.clear();
|
|
||||||
if (points.Size >= 2) { ImGui::SameLine(); if (ImGui::Button("Undo")) { points.pop_back(); points.pop_back(); } }
|
|
||||||
ImGui::Text("Left-click and drag to add lines");
|
|
||||||
ImGui::Text("Right-click to undo");
|
|
||||||
|
|
||||||
ImDrawList* draw_list = ImGui::GetWindowDrawList();
|
ImDrawList* draw_list = ImGui::GetWindowDrawList();
|
||||||
|
|
||||||
// Here we are using InvisibleButton() as a convenience to 1) advance the cursor and 2) allows us to use IsItemHovered()
|
// Primitives
|
||||||
// However you can draw directly and poll mouse/keyboard by yourself. You can manipulate the cursor using GetCursorPos() and SetCursorPos().
|
ImGui::Text("Primitives");
|
||||||
// If you only use the ImDrawList API, you can notify the owner window of its extends by using SetCursorPos(max).
|
static float sz = 36.0f;
|
||||||
ImVec2 canvas_pos = ImGui::GetCursorScreenPos(); // ImDrawList API uses screen coordinates!
|
static ImVec4 col = ImVec4(1.0f,1.0f,0.4f,1.0f);
|
||||||
ImVec2 canvas_size = ImGui::GetContentRegionAvail(); // Resize canvas to what's available
|
ImGui::DragFloat("Size", &sz, 0.2f, 2.0f, 72.0f, "%.0f");
|
||||||
if (canvas_size.x < 50.0f) canvas_size.x = 50.0f;
|
ImGui::ColorEdit3("Color", &col.x);
|
||||||
if (canvas_size.y < 50.0f) canvas_size.y = 50.0f;
|
|
||||||
draw_list->AddRectFilledMultiColor(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(0,0,0), ImColor(255,0,0), ImColor(255,255,0), ImColor(0,255,0));
|
|
||||||
draw_list->AddRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(255,255,255));
|
|
||||||
|
|
||||||
draw_list->AddBezierCurve(ImVec2(canvas_pos.x+20,canvas_pos.y+20), ImVec2(canvas_pos.x+100,canvas_pos.y+20), ImVec2(canvas_pos.x+canvas_size.x-100,canvas_pos.y+canvas_size.y-20), ImVec2(canvas_pos.x+canvas_size.x-20,canvas_pos.y+canvas_size.y-20), ImColor(255,200,0), 5.0f);
|
|
||||||
|
|
||||||
bool adding_preview = false;
|
|
||||||
ImGui::InvisibleButton("canvas", canvas_size);
|
|
||||||
if (ImGui::IsItemHovered())
|
|
||||||
{
|
{
|
||||||
ImVec2 mouse_pos_in_canvas = ImVec2(ImGui::GetIO().MousePos.x - canvas_pos.x, ImGui::GetIO().MousePos.y - canvas_pos.y);
|
const ImVec2 p = ImGui::GetCursorScreenPos();
|
||||||
if (!adding_line && ImGui::IsMouseClicked(0))
|
const ImU32 col32 = ImColor(col);
|
||||||
|
float x = p.x + 4.0f, y = p.y + 4.0f, spacing = 8.0f;
|
||||||
|
for (int n = 0; n < 2; n++)
|
||||||
{
|
{
|
||||||
points.push_back(mouse_pos_in_canvas);
|
float thickness = (n == 0) ? 1.0f : 4.0f;
|
||||||
adding_line = true;
|
draw_list->AddCircle(ImVec2(x+sz*0.5f, y+sz*0.5f), sz*0.5f, col32, 20, thickness); x += sz+spacing;
|
||||||
}
|
draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 0.0f, ~0, thickness); x += sz+spacing;
|
||||||
if (adding_line)
|
draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f, ~0, thickness); x += sz+spacing;
|
||||||
{
|
draw_list->AddTriangle(ImVec2(x+sz*0.5f, y), ImVec2(x+sz,y+sz-0.5f), ImVec2(x,y+sz-0.5f), col32, thickness); x += sz+spacing;
|
||||||
adding_preview = true;
|
draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y ), col32, thickness); x += sz+spacing;
|
||||||
points.push_back(mouse_pos_in_canvas);
|
draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, thickness); x += sz+spacing;
|
||||||
if (!ImGui::GetIO().MouseDown[0])
|
draw_list->AddLine(ImVec2(x, y), ImVec2(x, y+sz), col32, thickness); x += spacing;
|
||||||
adding_line = adding_preview = false;
|
draw_list->AddBezierCurve(ImVec2(x, y), ImVec2(x+sz*1.3f,y+sz*0.3f), ImVec2(x+sz-sz*1.3f,y+sz-sz*0.3f), ImVec2(x+sz, y+sz), col32, thickness);
|
||||||
}
|
x = p.x + 4;
|
||||||
if (ImGui::IsMouseClicked(1) && !points.empty())
|
y += sz+spacing;
|
||||||
{
|
|
||||||
adding_line = adding_preview = false;
|
|
||||||
points.pop_back();
|
|
||||||
points.pop_back();
|
|
||||||
}
|
}
|
||||||
|
draw_list->AddCircleFilled(ImVec2(x+sz*0.5f, y+sz*0.5f), sz*0.5f, col32, 32); x += sz+spacing;
|
||||||
|
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32); x += sz+spacing;
|
||||||
|
draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f); x += sz+spacing;
|
||||||
|
draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f, y), ImVec2(x+sz,y+sz-0.5f), ImVec2(x,y+sz-0.5f), col32); x += sz+spacing;
|
||||||
|
draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x+sz, y+sz), ImColor(0,0,0), ImColor(255,0,0), ImColor(255,255,0), ImColor(0,255,0));
|
||||||
|
ImGui::Dummy(ImVec2((sz+spacing)*8, (sz+spacing)*3));
|
||||||
|
}
|
||||||
|
ImGui::Separator();
|
||||||
|
{
|
||||||
|
static ImVector<ImVec2> points;
|
||||||
|
static bool adding_line = false;
|
||||||
|
ImGui::Text("Canvas example");
|
||||||
|
if (ImGui::Button("Clear")) points.clear();
|
||||||
|
if (points.Size >= 2) { ImGui::SameLine(); if (ImGui::Button("Undo")) { points.pop_back(); points.pop_back(); } }
|
||||||
|
ImGui::Text("Left-click and drag to add lines,\nRight-click to undo");
|
||||||
|
|
||||||
|
// Here we are using InvisibleButton() as a convenience to 1) advance the cursor and 2) allows us to use IsItemHovered()
|
||||||
|
// However you can draw directly and poll mouse/keyboard by yourself. You can manipulate the cursor using GetCursorPos() and SetCursorPos().
|
||||||
|
// If you only use the ImDrawList API, you can notify the owner window of its extends by using SetCursorPos(max).
|
||||||
|
ImVec2 canvas_pos = ImGui::GetCursorScreenPos(); // ImDrawList API uses screen coordinates!
|
||||||
|
ImVec2 canvas_size = ImGui::GetContentRegionAvail(); // Resize canvas to what's available
|
||||||
|
if (canvas_size.x < 50.0f) canvas_size.x = 50.0f;
|
||||||
|
if (canvas_size.y < 50.0f) canvas_size.y = 50.0f;
|
||||||
|
draw_list->AddRectFilledMultiColor(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(50,50,50), ImColor(50,50,60), ImColor(60,60,70), ImColor(50,50,60));
|
||||||
|
draw_list->AddRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), ImColor(255,255,255));
|
||||||
|
|
||||||
|
bool adding_preview = false;
|
||||||
|
ImGui::InvisibleButton("canvas", canvas_size);
|
||||||
|
if (ImGui::IsItemHovered())
|
||||||
|
{
|
||||||
|
ImVec2 mouse_pos_in_canvas = ImVec2(ImGui::GetIO().MousePos.x - canvas_pos.x, ImGui::GetIO().MousePos.y - canvas_pos.y);
|
||||||
|
if (!adding_line && ImGui::IsMouseClicked(0))
|
||||||
|
{
|
||||||
|
points.push_back(mouse_pos_in_canvas);
|
||||||
|
adding_line = true;
|
||||||
|
}
|
||||||
|
if (adding_line)
|
||||||
|
{
|
||||||
|
adding_preview = true;
|
||||||
|
points.push_back(mouse_pos_in_canvas);
|
||||||
|
if (!ImGui::GetIO().MouseDown[0])
|
||||||
|
adding_line = adding_preview = false;
|
||||||
|
}
|
||||||
|
if (ImGui::IsMouseClicked(1) && !points.empty())
|
||||||
|
{
|
||||||
|
adding_line = adding_preview = false;
|
||||||
|
points.pop_back();
|
||||||
|
points.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
draw_list->PushClipRect(ImVec4(canvas_pos.x, canvas_pos.y, canvas_pos.x+canvas_size.x, canvas_pos.y+canvas_size.y)); // clip lines within the canvas (if we resize it, etc.)
|
||||||
|
for (int i = 0; i < points.Size - 1; i += 2)
|
||||||
|
draw_list->AddLine(ImVec2(canvas_pos.x + points[i].x, canvas_pos.y + points[i].y), ImVec2(canvas_pos.x + points[i+1].x, canvas_pos.y + points[i+1].y), 0xFF00FFFF, 2.0f);
|
||||||
|
draw_list->PopClipRect();
|
||||||
|
if (adding_preview)
|
||||||
|
points.pop_back();
|
||||||
}
|
}
|
||||||
draw_list->PushClipRect(ImVec4(canvas_pos.x, canvas_pos.y, canvas_pos.x+canvas_size.x, canvas_pos.y+canvas_size.y)); // clip lines within the canvas (if we resize it, etc.)
|
|
||||||
for (int i = 0; i < points.Size - 1; i += 2)
|
|
||||||
draw_list->AddLine(ImVec2(canvas_pos.x + points[i].x, canvas_pos.y + points[i].y), ImVec2(canvas_pos.x + points[i+1].x, canvas_pos.y + points[i+1].y), 0xFF00FFFF, 2.0f);
|
|
||||||
draw_list->PopClipRect();
|
|
||||||
if (adding_preview)
|
|
||||||
points.pop_back();
|
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1842,19 +1886,26 @@ struct ExampleAppConsole
|
|||||||
ExampleAppConsole()
|
ExampleAppConsole()
|
||||||
{
|
{
|
||||||
ClearLog();
|
ClearLog();
|
||||||
|
memset(InputBuf, 0, sizeof(InputBuf));
|
||||||
HistoryPos = -1;
|
HistoryPos = -1;
|
||||||
Commands.push_back("HELP");
|
Commands.push_back("HELP");
|
||||||
Commands.push_back("HISTORY");
|
Commands.push_back("HISTORY");
|
||||||
Commands.push_back("CLEAR");
|
Commands.push_back("CLEAR");
|
||||||
Commands.push_back("CLASSIFY"); // "classify" is here to provide an example of "C"+[tab] completing to "CL" and displaying matches.
|
Commands.push_back("CLASSIFY"); // "classify" is here to provide an example of "C"+[tab] completing to "CL" and displaying matches.
|
||||||
|
AddLog("Welcome to ImGui!");
|
||||||
}
|
}
|
||||||
~ExampleAppConsole()
|
~ExampleAppConsole()
|
||||||
{
|
{
|
||||||
ClearLog();
|
ClearLog();
|
||||||
for (int i = 0; i < Items.Size; i++)
|
for (int i = 0; i < History.Size; i++)
|
||||||
free(History[i]);
|
free(History[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Portable helpers
|
||||||
|
static int Stricmp(const char* str1, const char* str2) { int d; while ((d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; } return d; }
|
||||||
|
static int Strnicmp(const char* str1, const char* str2, int n) { int d = 0; while (n > 0 && (d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; n--; } return d; }
|
||||||
|
static char* Strdup(const char *str) { size_t len = strlen(str) + 1; void* buff = malloc(len); return (char*)memcpy(buff, (const void*)str, len); }
|
||||||
|
|
||||||
void ClearLog()
|
void ClearLog()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < Items.Size; i++)
|
for (int i = 0; i < Items.Size; i++)
|
||||||
@ -1871,7 +1922,7 @@ struct ExampleAppConsole
|
|||||||
vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args);
|
vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args);
|
||||||
buf[IM_ARRAYSIZE(buf)-1] = 0;
|
buf[IM_ARRAYSIZE(buf)-1] = 0;
|
||||||
va_end(args);
|
va_end(args);
|
||||||
Items.push_back(strdup(buf));
|
Items.push_back(Strdup(buf));
|
||||||
ScrollToBottom = true;
|
ScrollToBottom = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1943,14 +1994,11 @@ struct ExampleAppConsole
|
|||||||
|
|
||||||
// Demonstrate keeping auto focus on the input box
|
// Demonstrate keeping auto focus on the input box
|
||||||
if (ImGui::IsItemHovered() || (ImGui::IsRootWindowOrAnyChildFocused() && !ImGui::IsAnyItemActive() && !ImGui::IsMouseClicked(0)))
|
if (ImGui::IsItemHovered() || (ImGui::IsRootWindowOrAnyChildFocused() && !ImGui::IsAnyItemActive() && !ImGui::IsMouseClicked(0)))
|
||||||
ImGui::SetKeyboardFocusHere(-1); // Auto focus
|
ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget
|
||||||
|
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int Stricmp(const char* str1, const char* str2) { int d; while ((d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; } return d; }
|
|
||||||
static int Strnicmp(const char* str1, const char* str2, int count) { int d = 0; while (count > 0 && (d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; count--; } return d; }
|
|
||||||
|
|
||||||
void ExecCommand(const char* command_line)
|
void ExecCommand(const char* command_line)
|
||||||
{
|
{
|
||||||
AddLog("# %s\n", command_line);
|
AddLog("# %s\n", command_line);
|
||||||
@ -1964,7 +2012,7 @@ struct ExampleAppConsole
|
|||||||
History.erase(History.begin() + i);
|
History.erase(History.begin() + i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
History.push_back(strdup(command_line));
|
History.push_back(Strdup(command_line));
|
||||||
|
|
||||||
// Process command
|
// Process command
|
||||||
if (Stricmp(command_line, "CLEAR") == 0)
|
if (Stricmp(command_line, "CLEAR") == 0)
|
||||||
@ -2085,9 +2133,8 @@ struct ExampleAppConsole
|
|||||||
// A better implementation would preserve the data on the current input line along with cursor position.
|
// A better implementation would preserve the data on the current input line along with cursor position.
|
||||||
if (prev_history_pos != HistoryPos)
|
if (prev_history_pos != HistoryPos)
|
||||||
{
|
{
|
||||||
snprintf(data->Buf, data->BufSize, "%s", (HistoryPos >= 0) ? History[HistoryPos] : "");
|
data->CursorPos = data->SelectionStart = data->SelectionEnd = data->BufTextLen = (int)snprintf(data->Buf, data->BufSize, "%s", (HistoryPos >= 0) ? History[HistoryPos] : "");
|
||||||
data->BufDirty = true;
|
data->BufDirty = true;
|
||||||
data->CursorPos = data->SelectionStart = data->SelectionEnd = (int)strlen(data->Buf);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2248,12 +2295,12 @@ static void ShowExampleAppPropertyEditor(bool* opened)
|
|||||||
{
|
{
|
||||||
ImGui::PushID(uid); // Use object uid as identifier. Most commonly you could also use the object pointer as a base ID.
|
ImGui::PushID(uid); // Use object uid as identifier. Most commonly you could also use the object pointer as a base ID.
|
||||||
ImGui::AlignFirstTextHeightToWidgets(); // Text and Tree nodes are less high than regular widgets, here we add vertical spacing to make the tree lines equal high.
|
ImGui::AlignFirstTextHeightToWidgets(); // Text and Tree nodes are less high than regular widgets, here we add vertical spacing to make the tree lines equal high.
|
||||||
bool opened = ImGui::TreeNode("Object", "%s_%u", prefix, uid);
|
bool is_opened = ImGui::TreeNode("Object", "%s_%u", prefix, uid);
|
||||||
ImGui::NextColumn();
|
ImGui::NextColumn();
|
||||||
ImGui::AlignFirstTextHeightToWidgets();
|
ImGui::AlignFirstTextHeightToWidgets();
|
||||||
ImGui::Text("my sailor is rich");
|
ImGui::Text("my sailor is rich");
|
||||||
ImGui::NextColumn();
|
ImGui::NextColumn();
|
||||||
if (opened)
|
if (is_opened)
|
||||||
{
|
{
|
||||||
static float dummy_members[8] = { 0.0f,0.0f,1.0f,3.1416f,100.0f,999.0f };
|
static float dummy_members[8] = { 0.0f,0.0f,1.0f,3.1416f,100.0f,999.0f };
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
|
105
imgui_draw.cpp
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.47
|
// dear imgui, v1.48
|
||||||
// (drawing and font code)
|
// (drawing and font code)
|
||||||
|
|
||||||
// Contains implementation for
|
// Contains implementation for
|
||||||
@ -14,11 +14,11 @@
|
|||||||
|
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
#define IMGUI_DEFINE_MATH_OPERATORS
|
#define IMGUI_DEFINE_MATH_OPERATORS
|
||||||
|
#define IMGUI_DEFINE_PLACEMENT_NEW
|
||||||
#include "imgui_internal.h"
|
#include "imgui_internal.h"
|
||||||
|
|
||||||
#include <stdio.h> // vsnprintf, sscanf, printf
|
#include <stdio.h> // vsnprintf, sscanf, printf
|
||||||
#include <new> // new (ptr)
|
#if !defined(alloca) && !defined(__FreeBSD__) && !defined(__DragonFly__)
|
||||||
#if !defined(alloca) && !defined(__FreeBSD__)
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <malloc.h> // alloca
|
#include <malloc.h> // alloca
|
||||||
#else
|
#else
|
||||||
@ -31,6 +31,14 @@
|
|||||||
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
|
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
|
||||||
#define snprintf _snprintf
|
#define snprintf _snprintf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse.
|
||||||
|
#pragma clang diagnostic ignored "-Wfloat-equal" // warning : comparing floating point with == or != is unsafe // storing and comparing against same constants ok.
|
||||||
|
#pragma clang diagnostic ignored "-Wglobal-constructors" // warning : declaration requires a global destructor // similar to above, not sure what the exact difference it.
|
||||||
|
#pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness //
|
||||||
|
//#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning : macro name is a reserved identifier //
|
||||||
|
#endif
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
|
#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
|
||||||
#endif
|
#endif
|
||||||
@ -55,6 +63,7 @@ namespace IMGUI_STB_NAMESPACE
|
|||||||
|
|
||||||
#ifdef __clang__
|
#ifdef __clang__
|
||||||
#pragma clang diagnostic push
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse.
|
||||||
#pragma clang diagnostic ignored "-Wunused-function"
|
#pragma clang diagnostic ignored "-Wunused-function"
|
||||||
#pragma clang diagnostic ignored "-Wmissing-prototypes"
|
#pragma clang diagnostic ignored "-Wmissing-prototypes"
|
||||||
#endif
|
#endif
|
||||||
@ -257,7 +266,7 @@ void ImDrawList::ChannelsSplit(int channels_count)
|
|||||||
{
|
{
|
||||||
if (i >= old_channels_count)
|
if (i >= old_channels_count)
|
||||||
{
|
{
|
||||||
new(&_Channels[i]) ImDrawChannel();
|
IM_PLACEMENT_NEW(&_Channels[i]) ImDrawChannel();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -335,13 +344,13 @@ void ImDrawList::PrimReserve(int idx_count, int vtx_count)
|
|||||||
_IdxWritePtr = IdxBuffer.Data + idx_buffer_size;
|
_IdxWritePtr = IdxBuffer.Data + idx_buffer_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fully unrolled with inline call to keep our debug builds decently fast.
|
||||||
void ImDrawList::PrimRect(const ImVec2& a, const ImVec2& c, ImU32 col)
|
void ImDrawList::PrimRect(const ImVec2& a, const ImVec2& c, ImU32 col)
|
||||||
{
|
{
|
||||||
const ImVec2 uv = GImGui->FontTexUvWhitePixel;
|
ImVec2 b(c.x, a.y), d(a.x, c.y), uv(GImGui->FontTexUvWhitePixel);
|
||||||
const ImVec2 b(c.x, a.y);
|
ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx;
|
||||||
const ImVec2 d(a.x, c.y);
|
_IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2);
|
||||||
_IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+2);
|
_IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3);
|
||||||
_IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx+2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx+3);
|
|
||||||
_VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;
|
_VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;
|
||||||
_VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col;
|
_VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col;
|
||||||
_VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col;
|
_VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col;
|
||||||
@ -353,12 +362,24 @@ void ImDrawList::PrimRect(const ImVec2& a, const ImVec2& c, ImU32 col)
|
|||||||
|
|
||||||
void ImDrawList::PrimRectUV(const ImVec2& a, const ImVec2& c, const ImVec2& uv_a, const ImVec2& uv_c, ImU32 col)
|
void ImDrawList::PrimRectUV(const ImVec2& a, const ImVec2& c, const ImVec2& uv_a, const ImVec2& uv_c, ImU32 col)
|
||||||
{
|
{
|
||||||
const ImVec2 b(c.x, a.y);
|
ImVec2 b(c.x, a.y), d(a.x, c.y), uv_b(uv_c.x, uv_a.y), uv_d(uv_a.x, uv_c.y);
|
||||||
const ImVec2 d(a.x, c.y);
|
ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx;
|
||||||
const ImVec2 uv_b(uv_c.x, uv_a.y);
|
_IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2);
|
||||||
const ImVec2 uv_d(uv_a.x, uv_c.y);
|
_IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3);
|
||||||
_IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx+1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx+2);
|
_VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col;
|
||||||
_IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx+2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx+3);
|
_VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col;
|
||||||
|
_VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col;
|
||||||
|
_VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col;
|
||||||
|
_VtxWritePtr += 4;
|
||||||
|
_VtxCurrentIdx += 4;
|
||||||
|
_IdxWritePtr += 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImDrawList::PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col)
|
||||||
|
{
|
||||||
|
ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx;
|
||||||
|
_IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2);
|
||||||
|
_IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3);
|
||||||
_VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col;
|
_VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col;
|
||||||
_VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col;
|
_VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col;
|
||||||
_VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col;
|
_VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col;
|
||||||
@ -762,12 +783,13 @@ void ImDrawList::AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thic
|
|||||||
PathStroke(col, false, thickness);
|
PathStroke(col, false, thickness);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImDrawList::AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners)
|
// a: upper-left, b: lower-right. we don't render 1 px sized rectangles properly.
|
||||||
|
void ImDrawList::AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners, float thickness)
|
||||||
{
|
{
|
||||||
if ((col >> 24) == 0)
|
if ((col >> 24) == 0)
|
||||||
return;
|
return;
|
||||||
PathRect(a + ImVec2(0.5f,0.5f), b + ImVec2(0.5f,0.5f), rounding, rounding_corners);
|
PathRect(a + ImVec2(0.5f,0.5f), b - ImVec2(0.5f,0.5f), rounding, rounding_corners);
|
||||||
PathStroke(col, true);
|
PathStroke(col, true, thickness);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImDrawList::AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners)
|
void ImDrawList::AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners)
|
||||||
@ -801,6 +823,17 @@ void ImDrawList::AddRectFilledMultiColor(const ImVec2& a, const ImVec2& c, ImU32
|
|||||||
PrimWriteVtx(ImVec2(a.x, c.y), uv, col_bot_left);
|
PrimWriteVtx(ImVec2(a.x, c.y), uv, col_bot_left);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImDrawList::AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness)
|
||||||
|
{
|
||||||
|
if ((col >> 24) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
PathLineTo(a);
|
||||||
|
PathLineTo(b);
|
||||||
|
PathLineTo(c);
|
||||||
|
PathStroke(col, true, thickness);
|
||||||
|
}
|
||||||
|
|
||||||
void ImDrawList::AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col)
|
void ImDrawList::AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col)
|
||||||
{
|
{
|
||||||
if ((col >> 24) == 0)
|
if ((col >> 24) == 0)
|
||||||
@ -812,14 +845,14 @@ void ImDrawList::AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec
|
|||||||
PathFill(col);
|
PathFill(col);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImDrawList::AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments)
|
void ImDrawList::AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments, float thickness)
|
||||||
{
|
{
|
||||||
if ((col >> 24) == 0)
|
if ((col >> 24) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const float a_max = IM_PI*2.0f * ((float)num_segments - 1.0f) / (float)num_segments;
|
const float a_max = IM_PI*2.0f * ((float)num_segments - 1.0f) / (float)num_segments;
|
||||||
PathArcTo(centre, radius, 0.0f, a_max, num_segments);
|
PathArcTo(centre, radius-0.5f, 0.0f, a_max, num_segments);
|
||||||
PathStroke(col, true);
|
PathStroke(col, true, thickness);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImDrawList::AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments)
|
void ImDrawList::AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments)
|
||||||
@ -852,6 +885,13 @@ void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos,
|
|||||||
if (text_begin == text_end)
|
if (text_begin == text_end)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Note: This is one of the few instance of breaking the encapsulation of ImDrawList, as we pull this from ImGui state, but it is just SO useful.
|
||||||
|
// Might just move Font/FontSize to ImDrawList?
|
||||||
|
if (font == NULL)
|
||||||
|
font = GImGui->Font;
|
||||||
|
if (font_size == 0.0f)
|
||||||
|
font_size = GImGui->FontSize;
|
||||||
|
|
||||||
IM_ASSERT(font->ContainerAtlas->TexID == _TextureIdStack.back()); // Use high-level ImGui::PushFont() or low-level ImDrawList::PushTextureId() to change font.
|
IM_ASSERT(font->ContainerAtlas->TexID == _TextureIdStack.back()); // Use high-level ImGui::PushFont() or low-level ImDrawList::PushTextureId() to change font.
|
||||||
|
|
||||||
// reserve vertices for worse case (over-reserving is useful and easily amortized)
|
// reserve vertices for worse case (over-reserving is useful and easily amortized)
|
||||||
@ -881,15 +921,11 @@ void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos,
|
|||||||
CmdBuffer.back().ElemCount -= idx_unused;
|
CmdBuffer.back().ElemCount -= idx_unused;
|
||||||
_VtxWritePtr -= vtx_unused;
|
_VtxWritePtr -= vtx_unused;
|
||||||
_IdxWritePtr -= idx_unused;
|
_IdxWritePtr -= idx_unused;
|
||||||
_VtxCurrentIdx = (ImDrawIdx)VtxBuffer.Size;
|
_VtxCurrentIdx = (unsigned int)VtxBuffer.Size;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is one of the few function breaking the encapsulation of ImDrawLst, but it is just so useful.
|
|
||||||
void ImDrawList::AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end)
|
void ImDrawList::AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end)
|
||||||
{
|
{
|
||||||
if ((col >> 24) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
AddText(GImGui->Font, GImGui->FontSize, pos, col, text_begin, text_end);
|
AddText(GImGui->Font, GImGui->FontSize, pos, col, text_begin, text_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1075,7 +1111,7 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg)
|
|||||||
if (!font_cfg->MergeMode)
|
if (!font_cfg->MergeMode)
|
||||||
{
|
{
|
||||||
ImFont* font = (ImFont*)ImGui::MemAlloc(sizeof(ImFont));
|
ImFont* font = (ImFont*)ImGui::MemAlloc(sizeof(ImFont));
|
||||||
new (font) ImFont();
|
IM_PLACEMENT_NEW(font) ImFont();
|
||||||
Fonts.push_back(font);
|
Fonts.push_back(font);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1174,7 +1210,7 @@ ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_d
|
|||||||
ImFont* ImFontAtlas::AddFontFromMemoryCompressedBase85TTF(const char* compressed_ttf_data_base85, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges)
|
ImFont* ImFontAtlas::AddFontFromMemoryCompressedBase85TTF(const char* compressed_ttf_data_base85, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges)
|
||||||
{
|
{
|
||||||
int compressed_ttf_size = (((int)strlen(compressed_ttf_data_base85) + 4) / 5) * 4;
|
int compressed_ttf_size = (((int)strlen(compressed_ttf_data_base85) + 4) / 5) * 4;
|
||||||
void* compressed_ttf = ImGui::MemAlloc(compressed_ttf_size);
|
void* compressed_ttf = ImGui::MemAlloc((size_t)compressed_ttf_size);
|
||||||
Decode85((const unsigned char*)compressed_ttf_data_base85, (unsigned char*)compressed_ttf);
|
Decode85((const unsigned char*)compressed_ttf_data_base85, (unsigned char*)compressed_ttf);
|
||||||
ImFont* font = AddFontFromMemoryCompressedTTF(compressed_ttf, compressed_ttf_size, size_pixels, font_cfg, glyph_ranges);
|
ImFont* font = AddFontFromMemoryCompressedTTF(compressed_ttf, compressed_ttf_size, size_pixels, font_cfg, glyph_ranges);
|
||||||
ImGui::MemFree(compressed_ttf);
|
ImGui::MemFree(compressed_ttf);
|
||||||
@ -1223,8 +1259,9 @@ bool ImFontAtlas::Build()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start packing
|
// Start packing. We need a known width for the skyline algorithm. Using a cheap heuristic here to decide of width. User can override TexDesiredWidth if they wish.
|
||||||
TexWidth = (TexDesiredWidth > 0) ? TexDesiredWidth : (total_glyph_count > 2000) ? 2048 : (total_glyph_count > 1000) ? 1024 : 512; // Width doesn't actually matters much but some API/GPU have texture size limitations, and increasing width can decrease height.
|
// After packing is done, width shouldn't matter much, but some API/GPU have texture size limitations and increasing width can decrease height.
|
||||||
|
TexWidth = (TexDesiredWidth > 0) ? TexDesiredWidth : (total_glyph_count > 4000) ? 4096 : (total_glyph_count > 2000) ? 2048 : (total_glyph_count > 1000) ? 1024 : 512;
|
||||||
TexHeight = 0;
|
TexHeight = 0;
|
||||||
const int max_tex_height = 1024*32;
|
const int max_tex_height = 1024*32;
|
||||||
stbtt_pack_context spc;
|
stbtt_pack_context spc;
|
||||||
@ -1969,10 +2006,10 @@ void ImFont::RenderText(float size, ImVec2 pos, ImU32 col, const ImVec4& clip_re
|
|||||||
{
|
{
|
||||||
char_width = glyph->XAdvance * scale;
|
char_width = glyph->XAdvance * scale;
|
||||||
|
|
||||||
// Clipping on Y is more likely
|
// Arbitrarily assume that both space and tabs are empty glyphs as an optimization
|
||||||
if (c != ' ' && c != '\t')
|
if (c != ' ' && c != '\t')
|
||||||
{
|
{
|
||||||
// We don't do a second finer clipping test on the Y axis (TODO: do some measurement see if it is worth it, probably not)
|
// We don't do a second finer clipping test on the Y axis as we've already skipped anything before clip_rect.y and exit once we pass clip_rect.w
|
||||||
float y1 = (float)(y + glyph->Y0 * scale);
|
float y1 = (float)(y + glyph->Y0 * scale);
|
||||||
float y2 = (float)(y + glyph->Y1 * scale);
|
float y2 = (float)(y + glyph->Y1 * scale);
|
||||||
|
|
||||||
@ -2016,8 +2053,8 @@ void ImFont::RenderText(float size, ImVec2 pos, ImU32 col, const ImVec4& clip_re
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NB: we are not calling PrimRectUV() here because non-inlined causes too much overhead in a debug build.
|
// We are NOT calling PrimRectUV() here because non-inlined causes too much overhead in a debug build.
|
||||||
// inlined:
|
// Inlined here:
|
||||||
{
|
{
|
||||||
idx_write[0] = (ImDrawIdx)(vtx_current_idx); idx_write[1] = (ImDrawIdx)(vtx_current_idx+1); idx_write[2] = (ImDrawIdx)(vtx_current_idx+2);
|
idx_write[0] = (ImDrawIdx)(vtx_current_idx); idx_write[1] = (ImDrawIdx)(vtx_current_idx+1); idx_write[2] = (ImDrawIdx)(vtx_current_idx+2);
|
||||||
idx_write[3] = (ImDrawIdx)(vtx_current_idx); idx_write[4] = (ImDrawIdx)(vtx_current_idx+2); idx_write[5] = (ImDrawIdx)(vtx_current_idx+3);
|
idx_write[3] = (ImDrawIdx)(vtx_current_idx); idx_write[4] = (ImDrawIdx)(vtx_current_idx+2); idx_write[5] = (ImDrawIdx)(vtx_current_idx+3);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.47
|
// dear imgui, v1.48
|
||||||
// (internals)
|
// (internals)
|
||||||
|
|
||||||
// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
|
// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
|
||||||
@ -137,20 +137,30 @@ static inline float ImLengthSqr(const ImVec4& lhs)
|
|||||||
static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = lhs.x*lhs.x + lhs.y*lhs.y; if (d > 0.0f) return 1.0f / sqrtf(d); return fail_value; }
|
static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = lhs.x*lhs.x + lhs.y*lhs.y; if (d > 0.0f) return 1.0f / sqrtf(d); return fail_value; }
|
||||||
static inline ImVec2 ImRound(ImVec2 v) { return ImVec2((float)(int)v.x, (float)(int)v.y); }
|
static inline ImVec2 ImRound(ImVec2 v) { return ImVec2((float)(int)v.x, (float)(int)v.y); }
|
||||||
|
|
||||||
|
// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax.
|
||||||
|
// Defining a custom placement new() with a dummy parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions.
|
||||||
|
#ifdef IMGUI_DEFINE_PLACEMENT_NEW
|
||||||
|
struct ImPlacementNewDummy {};
|
||||||
|
inline void* operator new(size_t, ImPlacementNewDummy, void* ptr) { return ptr; }
|
||||||
|
inline void operator delete(void*, ImPlacementNewDummy, void*) {}
|
||||||
|
#define IM_PLACEMENT_NEW(_PTR) new(ImPlacementNewDummy() ,_PTR)
|
||||||
|
#endif
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Types
|
// Types
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
enum ImGuiButtonFlags_
|
enum ImGuiButtonFlags_
|
||||||
{
|
{
|
||||||
ImGuiButtonFlags_Repeat = 1 << 0,
|
ImGuiButtonFlags_Repeat = 1 << 0, // hold to repeat
|
||||||
ImGuiButtonFlags_PressedOnClick = 1 << 1, // return pressed on click only (default requires click+release)
|
ImGuiButtonFlags_PressedOnClick = 1 << 1, // return pressed on click (default requires click+release)
|
||||||
ImGuiButtonFlags_PressedOnRelease = 1 << 2, // return pressed on release only (default requires click+release)
|
ImGuiButtonFlags_PressedOnRelease = 1 << 2, // return pressed on release (default requires click+release)
|
||||||
ImGuiButtonFlags_FlattenChilds = 1 << 3,
|
ImGuiButtonFlags_PressedOnDoubleClick = 1 << 3, // return pressed on double-click (default requires click+release)
|
||||||
ImGuiButtonFlags_DontClosePopups = 1 << 4,
|
ImGuiButtonFlags_FlattenChilds = 1 << 4, // allow interaction even if a child window is overlapping
|
||||||
ImGuiButtonFlags_Disabled = 1 << 5,
|
ImGuiButtonFlags_DontClosePopups = 1 << 5, // disable automatically closing parent popup on press
|
||||||
ImGuiButtonFlags_AlignTextBaseLine = 1 << 6,
|
ImGuiButtonFlags_Disabled = 1 << 6, // disable interaction
|
||||||
ImGuiButtonFlags_NoKeyModifiers = 1 << 7
|
ImGuiButtonFlags_AlignTextBaseLine = 1 << 7, // vertically align button to match text baseline - ButtonEx() only
|
||||||
|
ImGuiButtonFlags_NoKeyModifiers = 1 << 8 // disable interaction if a key modifier is held
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ImGuiTreeNodeFlags_
|
enum ImGuiTreeNodeFlags_
|
||||||
@ -161,16 +171,16 @@ enum ImGuiTreeNodeFlags_
|
|||||||
|
|
||||||
enum ImGuiSliderFlags_
|
enum ImGuiSliderFlags_
|
||||||
{
|
{
|
||||||
ImGuiSliderFlags_Vertical = 1 << 0,
|
ImGuiSliderFlags_Vertical = 1 << 0
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ImGuiSelectableFlagsPrivate_
|
enum ImGuiSelectableFlagsPrivate_
|
||||||
{
|
{
|
||||||
// NB: need to be in sync with last value of ImGuiSelectableFlags_
|
// NB: need to be in sync with last value of ImGuiSelectableFlags_
|
||||||
ImGuiSelectableFlags_Menu = 1 << 2,
|
ImGuiSelectableFlags_Menu = 1 << 3,
|
||||||
ImGuiSelectableFlags_MenuItem = 1 << 3,
|
ImGuiSelectableFlags_MenuItem = 1 << 4,
|
||||||
ImGuiSelectableFlags_Disabled = 1 << 4,
|
ImGuiSelectableFlags_Disabled = 1 << 5,
|
||||||
ImGuiSelectableFlags_DrawFillAvailWidth = 1 << 5
|
ImGuiSelectableFlags_DrawFillAvailWidth = 1 << 6
|
||||||
};
|
};
|
||||||
|
|
||||||
// FIXME: this is in development, not exposed/functional as a generic feature yet.
|
// FIXME: this is in development, not exposed/functional as a generic feature yet.
|
||||||
@ -346,7 +356,7 @@ struct ImGuiState
|
|||||||
ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()
|
ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()
|
||||||
float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize()
|
float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize()
|
||||||
float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Size of characters.
|
float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Size of characters.
|
||||||
ImVec2 FontTexUvWhitePixel; // (Shortcut) == Font->TexUvForWhite
|
ImVec2 FontTexUvWhitePixel; // (Shortcut) == Font->TexUvWhitePixel
|
||||||
|
|
||||||
float Time;
|
float Time;
|
||||||
int FrameCount;
|
int FrameCount;
|
||||||
@ -371,7 +381,6 @@ struct ImGuiState
|
|||||||
ImGuiWindow* MovedWindow; // Track the child window we clicked on to move a window. Pointer is only valid if ActiveID is the "#MOVE" identifier of a window.
|
ImGuiWindow* MovedWindow; // Track the child window we clicked on to move a window. Pointer is only valid if ActiveID is the "#MOVE" identifier of a window.
|
||||||
ImVector<ImGuiIniData> Settings; // .ini Settings
|
ImVector<ImGuiIniData> Settings; // .ini Settings
|
||||||
float SettingsDirtyTimer; // Save .ini settinngs on disk when time reaches zero
|
float SettingsDirtyTimer; // Save .ini settinngs on disk when time reaches zero
|
||||||
int DisableHideTextAfterDoubleHash;
|
|
||||||
ImVector<ImGuiColMod> ColorModifiers; // Stack for PushStyleColor()/PopStyleColor()
|
ImVector<ImGuiColMod> ColorModifiers; // Stack for PushStyleColor()/PopStyleColor()
|
||||||
ImVector<ImGuiStyleMod> StyleModifiers; // Stack for PushStyleVar()/PopStyleVar()
|
ImVector<ImGuiStyleMod> StyleModifiers; // Stack for PushStyleVar()/PopStyleVar()
|
||||||
ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont()
|
ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont()
|
||||||
@ -426,8 +435,8 @@ struct ImGuiState
|
|||||||
float FramerateSecPerFrame[120]; // calculate estimate of framerate for user
|
float FramerateSecPerFrame[120]; // calculate estimate of framerate for user
|
||||||
int FramerateSecPerFrameIdx;
|
int FramerateSecPerFrameIdx;
|
||||||
float FramerateSecPerFrameAccum;
|
float FramerateSecPerFrameAccum;
|
||||||
bool CaptureMouseNextFrame; // explicit capture via CaptureInputs() sets those flags
|
int CaptureMouseNextFrame; // explicit capture via CaptureInputs() sets those flags
|
||||||
bool CaptureKeyboardNextFrame;
|
int CaptureKeyboardNextFrame;
|
||||||
char TempBuffer[1024*3+1]; // temporary text buffer
|
char TempBuffer[1024*3+1]; // temporary text buffer
|
||||||
|
|
||||||
ImGuiState()
|
ImGuiState()
|
||||||
@ -455,13 +464,13 @@ struct ImGuiState
|
|||||||
ActiveIdWindow = NULL;
|
ActiveIdWindow = NULL;
|
||||||
MovedWindow = NULL;
|
MovedWindow = NULL;
|
||||||
SettingsDirtyTimer = 0.0f;
|
SettingsDirtyTimer = 0.0f;
|
||||||
DisableHideTextAfterDoubleHash = 0;
|
|
||||||
|
|
||||||
SetNextWindowPosVal = ImVec2(0.0f, 0.0f);
|
SetNextWindowPosVal = ImVec2(0.0f, 0.0f);
|
||||||
SetNextWindowSizeVal = ImVec2(0.0f, 0.0f);
|
SetNextWindowSizeVal = ImVec2(0.0f, 0.0f);
|
||||||
SetNextWindowCollapsedVal = false;
|
SetNextWindowCollapsedVal = false;
|
||||||
SetNextWindowPosCond = 0;
|
SetNextWindowPosCond = 0;
|
||||||
SetNextWindowSizeCond = 0;
|
SetNextWindowSizeCond = 0;
|
||||||
|
SetNextWindowContentSizeCond = 0;
|
||||||
SetNextWindowCollapsedCond = 0;
|
SetNextWindowCollapsedCond = 0;
|
||||||
SetNextWindowFocus = false;
|
SetNextWindowFocus = false;
|
||||||
SetNextTreeNodeOpenedVal = false;
|
SetNextTreeNodeOpenedVal = false;
|
||||||
@ -482,6 +491,7 @@ struct ImGuiState
|
|||||||
ModalWindowDarkeningRatio = 0.0f;
|
ModalWindowDarkeningRatio = 0.0f;
|
||||||
OverlayDrawList._OwnerName = "##Overlay"; // Give it a name for debugging
|
OverlayDrawList._OwnerName = "##Overlay"; // Give it a name for debugging
|
||||||
MouseCursor = ImGuiMouseCursor_Arrow;
|
MouseCursor = ImGuiMouseCursor_Arrow;
|
||||||
|
memset(MouseCursorData, 0, sizeof(MouseCursorData));
|
||||||
|
|
||||||
LogEnabled = false;
|
LogEnabled = false;
|
||||||
LogFile = NULL;
|
LogFile = NULL;
|
||||||
@ -492,7 +502,8 @@ struct ImGuiState
|
|||||||
memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));
|
memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));
|
||||||
FramerateSecPerFrameIdx = 0;
|
FramerateSecPerFrameIdx = 0;
|
||||||
FramerateSecPerFrameAccum = 0.0f;
|
FramerateSecPerFrameAccum = 0.0f;
|
||||||
CaptureMouseNextFrame = CaptureKeyboardNextFrame = false;
|
CaptureMouseNextFrame = CaptureKeyboardNextFrame = -1;
|
||||||
|
memset(TempBuffer, 0, sizeof(TempBuffer));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -597,7 +608,8 @@ struct IMGUI_API ImGuiWindow
|
|||||||
ImVec2 ScrollTarget; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change)
|
ImVec2 ScrollTarget; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change)
|
||||||
ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered
|
ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered
|
||||||
bool ScrollbarX, ScrollbarY;
|
bool ScrollbarX, ScrollbarY;
|
||||||
ImVec2 ScrollbarSizes; //
|
ImVec2 ScrollbarSizes;
|
||||||
|
float BorderSize;
|
||||||
bool Active; // Set to true on Begin()
|
bool Active; // Set to true on Begin()
|
||||||
bool WasActive;
|
bool WasActive;
|
||||||
bool Accessed; // Set to true when any widget access the current window
|
bool Accessed; // Set to true when any widget access the current window
|
||||||
@ -664,14 +676,15 @@ namespace ImGui
|
|||||||
inline ImGuiWindow* GetCurrentWindowRead() { ImGuiState& g = *GImGui; return g.CurrentWindow; }
|
inline ImGuiWindow* GetCurrentWindowRead() { ImGuiState& g = *GImGui; return g.CurrentWindow; }
|
||||||
inline ImGuiWindow* GetCurrentWindow() { ImGuiState& g = *GImGui; g.CurrentWindow->Accessed = true; return g.CurrentWindow; }
|
inline ImGuiWindow* GetCurrentWindow() { ImGuiState& g = *GImGui; g.CurrentWindow->Accessed = true; return g.CurrentWindow; }
|
||||||
IMGUI_API ImGuiWindow* GetParentWindow();
|
IMGUI_API ImGuiWindow* GetParentWindow();
|
||||||
|
IMGUI_API ImGuiWindow* FindWindowByName(const char* name);
|
||||||
IMGUI_API void FocusWindow(ImGuiWindow* window);
|
IMGUI_API void FocusWindow(ImGuiWindow* window);
|
||||||
|
|
||||||
|
IMGUI_API void EndFrame(); // Ends the ImGui frame. Automatically called by Render()! you most likely don't need to ever call that yourself directly. If you don't need to render you can call EndFrame() but you'll have wasted CPU already. If you don't need to render, don't create any windows instead!
|
||||||
|
|
||||||
IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window);
|
IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window);
|
||||||
IMGUI_API void SetHoveredID(ImGuiID id);
|
IMGUI_API void SetHoveredID(ImGuiID id);
|
||||||
IMGUI_API void KeepAliveID(ImGuiID id);
|
IMGUI_API void KeepAliveID(ImGuiID id);
|
||||||
|
|
||||||
IMGUI_API void EndFrame(); // Automatically called by Render()
|
|
||||||
|
|
||||||
IMGUI_API void ItemSize(const ImVec2& size, float text_offset_y = 0.0f);
|
IMGUI_API void ItemSize(const ImVec2& size, float text_offset_y = 0.0f);
|
||||||
IMGUI_API void ItemSize(const ImRect& bb, float text_offset_y = 0.0f);
|
IMGUI_API void ItemSize(const ImRect& bb, float text_offset_y = 0.0f);
|
||||||
IMGUI_API bool ItemAdd(const ImRect& bb, const ImGuiID* id);
|
IMGUI_API bool ItemAdd(const ImRect& bb, const ImGuiID* id);
|
||||||
@ -681,7 +694,6 @@ namespace ImGui
|
|||||||
IMGUI_API void FocusableItemUnregister(ImGuiWindow* window);
|
IMGUI_API void FocusableItemUnregister(ImGuiWindow* window);
|
||||||
IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_x, float default_y);
|
IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_x, float default_y);
|
||||||
IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);
|
IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);
|
||||||
IMGUI_API void SetItemAllowOverlap(); // Allow last item to be overlapped by a subsequent item
|
|
||||||
|
|
||||||
IMGUI_API void OpenPopupEx(const char* str_id, bool reopen_existing);
|
IMGUI_API void OpenPopupEx(const char* str_id, bool reopen_existing);
|
||||||
|
|
||||||
@ -696,6 +708,7 @@ namespace ImGui
|
|||||||
IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
|
IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
|
||||||
IMGUI_API void RenderCollapseTriangle(ImVec2 p_min, bool opened, float scale = 1.0f, bool shadow = false);
|
IMGUI_API void RenderCollapseTriangle(ImVec2 p_min, bool opened, float scale = 1.0f, bool shadow = false);
|
||||||
IMGUI_API void RenderCheckMark(ImVec2 pos, ImU32 col);
|
IMGUI_API void RenderCheckMark(ImVec2 pos, ImU32 col);
|
||||||
|
IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
|
||||||
|
|
||||||
IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_existing_clip_rect = true);
|
IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_existing_clip_rect = true);
|
||||||
IMGUI_API void PopClipRect();
|
IMGUI_API void PopClipRect();
|
||||||
|
143
stb_textedit.h
@ -1,8 +1,8 @@
|
|||||||
// [ImGui] this is a slightly modified version of stb_truetype.h 1.4
|
// [ImGui] this is a slightly modified version of stb_truetype.h 1.8
|
||||||
// [ImGui] we made a fix for using the END key on multi-line text edit, see https://github.com/ocornut/imgui/issues/275
|
// [ImGui] - fixed some minor warnings
|
||||||
// [ImGui] we made a fix for using keyboard while using mouse, see https://github.com/nothings/stb/pull/209
|
// [ImGui] - added STB_TEXTEDIT_MOVEWORDLEFT/STB_TEXTEDIT_MOVEWORDRIGHT custom handler (#473)
|
||||||
|
|
||||||
// stb_textedit.h - v1.4 - public domain - Sean Barrett
|
// stb_textedit.h - v1.8 - public domain - Sean Barrett
|
||||||
// Development of this library was sponsored by RAD Game Tools
|
// Development of this library was sponsored by RAD Game Tools
|
||||||
//
|
//
|
||||||
// This C header file implements the guts of a multi-line text-editing
|
// This C header file implements the guts of a multi-line text-editing
|
||||||
@ -21,19 +21,24 @@
|
|||||||
//
|
//
|
||||||
// LICENSE
|
// LICENSE
|
||||||
//
|
//
|
||||||
// This software has been placed in the public domain by its author.
|
// This software is dual-licensed to the public domain and under the following
|
||||||
// Where that dedication is not recognized, you are granted a perpetual,
|
// license: you are granted a perpetual, irrevocable license to copy, modify,
|
||||||
// irrevocable license to copy and modify this file as you see fit.
|
// publish, and distribute this file as you see fit.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// DEPENDENCIES
|
// DEPENDENCIES
|
||||||
//
|
//
|
||||||
// Uses the C runtime function 'memmove'. Uses no other functions.
|
// Uses the C runtime function 'memmove', which you can override
|
||||||
// Performs no runtime allocations.
|
// by defining STB_TEXTEDIT_memmove before the implementation.
|
||||||
|
// Uses no other functions. Performs no runtime allocations.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// VERSION HISTORY
|
// VERSION HISTORY
|
||||||
//
|
//
|
||||||
|
// 1.8 (2016-04-02) better keyboard handling when mouse button is down
|
||||||
|
// 1.7 (2015-09-13) change y range handling in case baseline is non-0
|
||||||
|
// 1.6 (2015-04-15) allow STB_TEXTEDIT_memmove
|
||||||
|
// 1.5 (2014-09-10) add support for secondary keys for OS X
|
||||||
// 1.4 (2014-08-17) fix signed/unsigned warnings
|
// 1.4 (2014-08-17) fix signed/unsigned warnings
|
||||||
// 1.3 (2014-06-19) fix mouse clicking to round to nearest char boundary
|
// 1.3 (2014-06-19) fix mouse clicking to round to nearest char boundary
|
||||||
// 1.2 (2014-05-27) fix some RAD types that had crept into the new code
|
// 1.2 (2014-05-27) fix some RAD types that had crept into the new code
|
||||||
@ -46,7 +51,13 @@
|
|||||||
// ADDITIONAL CONTRIBUTORS
|
// ADDITIONAL CONTRIBUTORS
|
||||||
//
|
//
|
||||||
// Ulf Winklemann: move-by-word in 1.1
|
// Ulf Winklemann: move-by-word in 1.1
|
||||||
// Scott Graham: mouse selection bugfix in 1.3
|
// Fabian Giesen: secondary key inputs in 1.5
|
||||||
|
// Martins Mozeiko: STB_TEXTEDIT_memmove
|
||||||
|
//
|
||||||
|
// Bugfixes:
|
||||||
|
// Scott Graham
|
||||||
|
// Daniel Keller
|
||||||
|
// Omar Cornut
|
||||||
//
|
//
|
||||||
// USAGE
|
// USAGE
|
||||||
//
|
//
|
||||||
@ -141,11 +152,17 @@
|
|||||||
// STB_TEXTEDIT_K_REDO keyboard input to perform redo
|
// STB_TEXTEDIT_K_REDO keyboard input to perform redo
|
||||||
//
|
//
|
||||||
// Optional:
|
// Optional:
|
||||||
// STB_TEXTEDIT_K_INSERT keyboard input to toggle insert mode
|
// STB_TEXTEDIT_K_INSERT keyboard input to toggle insert mode
|
||||||
// STB_TEXTEDIT_IS_SPACE(ch) true if character is whitespace (e.g. 'isspace'),
|
// STB_TEXTEDIT_IS_SPACE(ch) true if character is whitespace (e.g. 'isspace'),
|
||||||
// required for WORDLEFT/WORDRIGHT
|
// required for default WORDLEFT/WORDRIGHT handlers
|
||||||
// STB_TEXTEDIT_K_WORDLEFT keyboard input to move cursor left one word // e.g. ctrl-LEFT
|
// STB_TEXTEDIT_MOVEWORDLEFT(obj,i) custom handler for WORDLEFT, returns index to move cursor to
|
||||||
// STB_TEXTEDIT_K_WORDRIGHT keyboard input to move cursor right one word // e.g. ctrl-RIGHT
|
// STB_TEXTEDIT_MOVEWORDRIGHT(obj,i) custom handler for WORDRIGHT, returns index to move cursor to
|
||||||
|
// STB_TEXTEDIT_K_WORDLEFT keyboard input to move cursor left one word // e.g. ctrl-LEFT
|
||||||
|
// STB_TEXTEDIT_K_WORDRIGHT keyboard input to move cursor right one word // e.g. ctrl-RIGHT
|
||||||
|
// STB_TEXTEDIT_K_LINESTART2 secondary keyboard input to move cursor to start of line
|
||||||
|
// STB_TEXTEDIT_K_LINEEND2 secondary keyboard input to move cursor to end of line
|
||||||
|
// STB_TEXTEDIT_K_TEXTSTART2 secondary keyboard input to move cursor to start of text
|
||||||
|
// STB_TEXTEDIT_K_TEXTEND2 secondary keyboard input to move cursor to end of text
|
||||||
//
|
//
|
||||||
// Todo:
|
// Todo:
|
||||||
// STB_TEXTEDIT_K_PGUP keyboard input to move cursor up a page
|
// STB_TEXTEDIT_K_PGUP keyboard input to move cursor up a page
|
||||||
@ -356,7 +373,10 @@ typedef struct
|
|||||||
// included just the "header" portion
|
// included just the "header" portion
|
||||||
#ifdef STB_TEXTEDIT_IMPLEMENTATION
|
#ifdef STB_TEXTEDIT_IMPLEMENTATION
|
||||||
|
|
||||||
#include <string.h> // memmove
|
#ifndef STB_TEXTEDIT_memmove
|
||||||
|
#include <string.h>
|
||||||
|
#define STB_TEXTEDIT_memmove memmove
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
@ -372,9 +392,6 @@ static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y)
|
|||||||
float base_y = 0, prev_x;
|
float base_y = 0, prev_x;
|
||||||
int i=0, k;
|
int i=0, k;
|
||||||
|
|
||||||
if (y < 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
r.x0 = r.x1 = 0;
|
r.x0 = r.x1 = 0;
|
||||||
r.ymin = r.ymax = 0;
|
r.ymin = r.ymax = 0;
|
||||||
r.num_chars = 0;
|
r.num_chars = 0;
|
||||||
@ -385,6 +402,9 @@ static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y)
|
|||||||
if (r.num_chars <= 0)
|
if (r.num_chars <= 0)
|
||||||
return n;
|
return n;
|
||||||
|
|
||||||
|
if (i==0 && y < base_y + r.ymin)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (y < base_y + r.ymax)
|
if (y < base_y + r.ymax)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -601,9 +621,9 @@ static int is_word_boundary( STB_TEXTEDIT_STRING *_str, int _idx )
|
|||||||
return _idx > 0 ? (STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(_str,_idx-1) ) && !STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(_str, _idx) ) ) : 1;
|
return _idx > 0 ? (STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(_str,_idx-1) ) && !STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(_str, _idx) ) ) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *_str, STB_TexteditState *_state )
|
#ifndef STB_TEXTEDIT_MOVEWORDLEFT
|
||||||
|
static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *_str, int c )
|
||||||
{
|
{
|
||||||
int c = _state->cursor - 1;
|
|
||||||
while( c >= 0 && !is_word_boundary( _str, c ) )
|
while( c >= 0 && !is_word_boundary( _str, c ) )
|
||||||
--c;
|
--c;
|
||||||
|
|
||||||
@ -612,11 +632,13 @@ static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *_str, STB_Te
|
|||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
#define STB_TEXTEDIT_MOVEWORDLEFT stb_textedit_move_to_word_previous
|
||||||
|
#endif
|
||||||
|
|
||||||
static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *_str, STB_TexteditState *_state )
|
#ifndef STB_TEXTEDIT_MOVEWORDRIGHT
|
||||||
|
static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *_str, int c )
|
||||||
{
|
{
|
||||||
const int len = STB_TEXTEDIT_STRINGLEN(_str);
|
const int len = STB_TEXTEDIT_STRINGLEN(_str);
|
||||||
int c = _state->cursor+1;
|
|
||||||
while( c < len && !is_word_boundary( _str, c ) )
|
while( c < len && !is_word_boundary( _str, c ) )
|
||||||
++c;
|
++c;
|
||||||
|
|
||||||
@ -625,6 +647,9 @@ static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *_str, STB_Texted
|
|||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
#define STB_TEXTEDIT_MOVEWORDRIGHT stb_textedit_move_to_word_next
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// update selection and cursor to match each other
|
// update selection and cursor to match each other
|
||||||
@ -746,21 +771,12 @@ retry:
|
|||||||
state->has_preferred_x = 0;
|
state->has_preferred_x = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef STB_TEXTEDIT_IS_SPACE
|
#ifdef STB_TEXTEDIT_MOVEWORDLEFT
|
||||||
case STB_TEXTEDIT_K_WORDLEFT:
|
case STB_TEXTEDIT_K_WORDLEFT:
|
||||||
if (STB_TEXT_HAS_SELECTION(state))
|
if (STB_TEXT_HAS_SELECTION(state))
|
||||||
stb_textedit_move_to_first(state);
|
stb_textedit_move_to_first(state);
|
||||||
else {
|
else {
|
||||||
state->cursor = stb_textedit_move_to_word_previous(str, state);
|
state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor-1);
|
||||||
stb_textedit_clamp( str, state );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STB_TEXTEDIT_K_WORDRIGHT:
|
|
||||||
if (STB_TEXT_HAS_SELECTION(state))
|
|
||||||
stb_textedit_move_to_last(str, state);
|
|
||||||
else {
|
|
||||||
state->cursor = stb_textedit_move_to_word_next(str, state);
|
|
||||||
stb_textedit_clamp( str, state );
|
stb_textedit_clamp( str, state );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -769,17 +785,28 @@ retry:
|
|||||||
if( !STB_TEXT_HAS_SELECTION( state ) )
|
if( !STB_TEXT_HAS_SELECTION( state ) )
|
||||||
stb_textedit_prep_selection_at_cursor(state);
|
stb_textedit_prep_selection_at_cursor(state);
|
||||||
|
|
||||||
state->cursor = stb_textedit_move_to_word_previous(str, state);
|
state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor-1);
|
||||||
state->select_end = state->cursor;
|
state->select_end = state->cursor;
|
||||||
|
|
||||||
stb_textedit_clamp( str, state );
|
stb_textedit_clamp( str, state );
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef STB_TEXTEDIT_MOVEWORDRIGHT
|
||||||
|
case STB_TEXTEDIT_K_WORDRIGHT:
|
||||||
|
if (STB_TEXT_HAS_SELECTION(state))
|
||||||
|
stb_textedit_move_to_last(str, state);
|
||||||
|
else {
|
||||||
|
state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor+1);
|
||||||
|
stb_textedit_clamp( str, state );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT:
|
case STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT:
|
||||||
if( !STB_TEXT_HAS_SELECTION( state ) )
|
if( !STB_TEXT_HAS_SELECTION( state ) )
|
||||||
stb_textedit_prep_selection_at_cursor(state);
|
stb_textedit_prep_selection_at_cursor(state);
|
||||||
|
|
||||||
state->cursor = stb_textedit_move_to_word_next(str, state);
|
state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor+1);
|
||||||
state->select_end = state->cursor;
|
state->select_end = state->cursor;
|
||||||
|
|
||||||
stb_textedit_clamp( str, state );
|
stb_textedit_clamp( str, state );
|
||||||
@ -923,23 +950,35 @@ retry:
|
|||||||
state->has_preferred_x = 0;
|
state->has_preferred_x = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef STB_TEXTEDIT_K_TEXTSTART2
|
||||||
|
case STB_TEXTEDIT_K_TEXTSTART2:
|
||||||
|
#endif
|
||||||
case STB_TEXTEDIT_K_TEXTSTART:
|
case STB_TEXTEDIT_K_TEXTSTART:
|
||||||
state->cursor = state->select_start = state->select_end = 0;
|
state->cursor = state->select_start = state->select_end = 0;
|
||||||
state->has_preferred_x = 0;
|
state->has_preferred_x = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef STB_TEXTEDIT_K_TEXTEND2
|
||||||
|
case STB_TEXTEDIT_K_TEXTEND2:
|
||||||
|
#endif
|
||||||
case STB_TEXTEDIT_K_TEXTEND:
|
case STB_TEXTEDIT_K_TEXTEND:
|
||||||
state->cursor = STB_TEXTEDIT_STRINGLEN(str);
|
state->cursor = STB_TEXTEDIT_STRINGLEN(str);
|
||||||
state->select_start = state->select_end = 0;
|
state->select_start = state->select_end = 0;
|
||||||
state->has_preferred_x = 0;
|
state->has_preferred_x = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef STB_TEXTEDIT_K_TEXTSTART2
|
||||||
|
case STB_TEXTEDIT_K_TEXTSTART2 | STB_TEXTEDIT_K_SHIFT:
|
||||||
|
#endif
|
||||||
case STB_TEXTEDIT_K_TEXTSTART | STB_TEXTEDIT_K_SHIFT:
|
case STB_TEXTEDIT_K_TEXTSTART | STB_TEXTEDIT_K_SHIFT:
|
||||||
stb_textedit_prep_selection_at_cursor(state);
|
stb_textedit_prep_selection_at_cursor(state);
|
||||||
state->cursor = state->select_end = 0;
|
state->cursor = state->select_end = 0;
|
||||||
state->has_preferred_x = 0;
|
state->has_preferred_x = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef STB_TEXTEDIT_K_TEXTEND2
|
||||||
|
case STB_TEXTEDIT_K_TEXTEND2 | STB_TEXTEDIT_K_SHIFT:
|
||||||
|
#endif
|
||||||
case STB_TEXTEDIT_K_TEXTEND | STB_TEXTEDIT_K_SHIFT:
|
case STB_TEXTEDIT_K_TEXTEND | STB_TEXTEDIT_K_SHIFT:
|
||||||
stb_textedit_prep_selection_at_cursor(state);
|
stb_textedit_prep_selection_at_cursor(state);
|
||||||
state->cursor = state->select_end = STB_TEXTEDIT_STRINGLEN(str);
|
state->cursor = state->select_end = STB_TEXTEDIT_STRINGLEN(str);
|
||||||
@ -947,6 +986,9 @@ retry:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef STB_TEXTEDIT_K_LINESTART2
|
||||||
|
case STB_TEXTEDIT_K_LINESTART2:
|
||||||
|
#endif
|
||||||
case STB_TEXTEDIT_K_LINESTART: {
|
case STB_TEXTEDIT_K_LINESTART: {
|
||||||
StbFindState find;
|
StbFindState find;
|
||||||
stb_textedit_clamp(str, state);
|
stb_textedit_clamp(str, state);
|
||||||
@ -957,18 +999,25 @@ retry:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef STB_TEXTEDIT_K_LINEEND2
|
||||||
|
case STB_TEXTEDIT_K_LINEEND2:
|
||||||
|
#endif
|
||||||
case STB_TEXTEDIT_K_LINEEND: {
|
case STB_TEXTEDIT_K_LINEEND: {
|
||||||
StbFindState find;
|
StbFindState find;
|
||||||
stb_textedit_clamp(str, state);
|
stb_textedit_clamp(str, state);
|
||||||
stb_textedit_move_to_first(state);
|
stb_textedit_move_to_first(state);
|
||||||
stb_textedit_find_charpos(&find, str, state->cursor, state->single_line);
|
stb_textedit_find_charpos(&find, str, state->cursor, state->single_line);
|
||||||
|
|
||||||
|
state->has_preferred_x = 0;
|
||||||
state->cursor = find.first_char + find.length;
|
state->cursor = find.first_char + find.length;
|
||||||
if (find.length > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) == STB_TEXTEDIT_NEWLINE)
|
if (find.length > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) == STB_TEXTEDIT_NEWLINE)
|
||||||
state->cursor--;
|
--state->cursor;
|
||||||
state->has_preferred_x = 0;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef STB_TEXTEDIT_K_LINESTART2
|
||||||
|
case STB_TEXTEDIT_K_LINESTART2 | STB_TEXTEDIT_K_SHIFT:
|
||||||
|
#endif
|
||||||
case STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT: {
|
case STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT: {
|
||||||
StbFindState find;
|
StbFindState find;
|
||||||
stb_textedit_clamp(str, state);
|
stb_textedit_clamp(str, state);
|
||||||
@ -979,15 +1028,19 @@ retry:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef STB_TEXTEDIT_K_LINEEND2
|
||||||
|
case STB_TEXTEDIT_K_LINEEND2 | STB_TEXTEDIT_K_SHIFT:
|
||||||
|
#endif
|
||||||
case STB_TEXTEDIT_K_LINEEND | STB_TEXTEDIT_K_SHIFT: {
|
case STB_TEXTEDIT_K_LINEEND | STB_TEXTEDIT_K_SHIFT: {
|
||||||
StbFindState find;
|
StbFindState find;
|
||||||
stb_textedit_clamp(str, state);
|
stb_textedit_clamp(str, state);
|
||||||
stb_textedit_prep_selection_at_cursor(state);
|
stb_textedit_prep_selection_at_cursor(state);
|
||||||
stb_textedit_find_charpos(&find, str, state->cursor, state->single_line);
|
stb_textedit_find_charpos(&find, str, state->cursor, state->single_line);
|
||||||
state->cursor = state->select_end = find.first_char + find.length;
|
|
||||||
if (find.length > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) == STB_TEXTEDIT_NEWLINE)
|
|
||||||
state->cursor = state->select_end = state->cursor - 1;
|
|
||||||
state->has_preferred_x = 0;
|
state->has_preferred_x = 0;
|
||||||
|
state->cursor = find.first_char + find.length;
|
||||||
|
if (find.length > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) == STB_TEXTEDIT_NEWLINE)
|
||||||
|
--state->cursor;
|
||||||
|
state->select_end = state->cursor;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1018,13 +1071,13 @@ static void stb_textedit_discard_undo(StbUndoState *state)
|
|||||||
int n = state->undo_rec[0].insert_length, i;
|
int n = state->undo_rec[0].insert_length, i;
|
||||||
// delete n characters from all other records
|
// delete n characters from all other records
|
||||||
state->undo_char_point = state->undo_char_point - (short) n; // vsnet05
|
state->undo_char_point = state->undo_char_point - (short) n; // vsnet05
|
||||||
memmove(state->undo_char, state->undo_char + n, (size_t) ((size_t)state->undo_char_point*sizeof(STB_TEXTEDIT_CHARTYPE)));
|
STB_TEXTEDIT_memmove(state->undo_char, state->undo_char + n, (size_t) ((size_t)state->undo_char_point*sizeof(STB_TEXTEDIT_CHARTYPE)));
|
||||||
for (i=0; i < state->undo_point; ++i)
|
for (i=0; i < state->undo_point; ++i)
|
||||||
if (state->undo_rec[i].char_storage >= 0)
|
if (state->undo_rec[i].char_storage >= 0)
|
||||||
state->undo_rec[i].char_storage = state->undo_rec[i].char_storage - (short) n; // vsnet05 // @OPTIMIZE: get rid of char_storage and infer it
|
state->undo_rec[i].char_storage = state->undo_rec[i].char_storage - (short) n; // vsnet05 // @OPTIMIZE: get rid of char_storage and infer it
|
||||||
}
|
}
|
||||||
--state->undo_point;
|
--state->undo_point;
|
||||||
memmove(state->undo_rec, state->undo_rec+1, (size_t) ((size_t)state->undo_point*sizeof(state->undo_rec[0])));
|
STB_TEXTEDIT_memmove(state->undo_rec, state->undo_rec+1, (size_t) ((size_t)state->undo_point*sizeof(state->undo_rec[0])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1042,13 +1095,13 @@ static void stb_textedit_discard_redo(StbUndoState *state)
|
|||||||
int n = state->undo_rec[k].insert_length, i;
|
int n = state->undo_rec[k].insert_length, i;
|
||||||
// delete n characters from all other records
|
// delete n characters from all other records
|
||||||
state->redo_char_point = state->redo_char_point + (short) n; // vsnet05
|
state->redo_char_point = state->redo_char_point + (short) n; // vsnet05
|
||||||
memmove(state->undo_char + state->redo_char_point, state->undo_char + state->redo_char_point-n, (size_t) ((size_t)(STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_char_point)*sizeof(STB_TEXTEDIT_CHARTYPE)));
|
STB_TEXTEDIT_memmove(state->undo_char + state->redo_char_point, state->undo_char + state->redo_char_point-n, (size_t) ((size_t)(STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_char_point)*sizeof(STB_TEXTEDIT_CHARTYPE)));
|
||||||
for (i=state->redo_point; i < k; ++i)
|
for (i=state->redo_point; i < k; ++i)
|
||||||
if (state->undo_rec[i].char_storage >= 0)
|
if (state->undo_rec[i].char_storage >= 0)
|
||||||
state->undo_rec[i].char_storage = state->undo_rec[i].char_storage + (short) n; // vsnet05
|
state->undo_rec[i].char_storage = state->undo_rec[i].char_storage + (short) n; // vsnet05
|
||||||
}
|
}
|
||||||
++state->redo_point;
|
++state->redo_point;
|
||||||
memmove(state->undo_rec + state->redo_point-1, state->undo_rec + state->redo_point, (size_t) ((size_t)(STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point)*sizeof(state->undo_rec[0])));
|
STB_TEXTEDIT_memmove(state->undo_rec + state->redo_point-1, state->undo_rec + state->redo_point, (size_t) ((size_t)(STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point)*sizeof(state->undo_rec[0])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// stb_truetype.h - v1.08 - public domain
|
// stb_truetype.h - v1.10 - public domain
|
||||||
// authored from 2009-2015 by Sean Barrett / RAD Game Tools
|
// authored from 2009-2015 by Sean Barrett / RAD Game Tools
|
||||||
//
|
//
|
||||||
// This library processes TrueType files:
|
// This library processes TrueType files:
|
||||||
@ -21,6 +21,10 @@
|
|||||||
// Mikko Mononen: compound shape support, more cmap formats
|
// Mikko Mononen: compound shape support, more cmap formats
|
||||||
// Tor Andersson: kerning, subpixel rendering
|
// Tor Andersson: kerning, subpixel rendering
|
||||||
//
|
//
|
||||||
|
// Misc other:
|
||||||
|
// Ryan Gordon
|
||||||
|
// Simon Glass
|
||||||
|
//
|
||||||
// Bug/warning reports/fixes:
|
// Bug/warning reports/fixes:
|
||||||
// "Zer" on mollyrocket (with fix)
|
// "Zer" on mollyrocket (with fix)
|
||||||
// Cass Everitt
|
// Cass Everitt
|
||||||
@ -42,12 +46,13 @@
|
|||||||
// Sergey Popov
|
// Sergey Popov
|
||||||
// Giumo X. Clanjor
|
// Giumo X. Clanjor
|
||||||
// Higor Euripedes
|
// Higor Euripedes
|
||||||
//
|
// Thomas Fields
|
||||||
// Misc other:
|
// Derek Vinyard
|
||||||
// Ryan Gordon
|
|
||||||
//
|
//
|
||||||
// VERSION HISTORY
|
// VERSION HISTORY
|
||||||
//
|
//
|
||||||
|
// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef
|
||||||
|
// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly
|
||||||
// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges
|
// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges
|
||||||
// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints;
|
// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints;
|
||||||
// variant PackFontRanges to pack and render in separate phases;
|
// variant PackFontRanges to pack and render in separate phases;
|
||||||
@ -65,9 +70,9 @@
|
|||||||
//
|
//
|
||||||
// LICENSE
|
// LICENSE
|
||||||
//
|
//
|
||||||
// This software is in the public domain. Where that dedication is not
|
// This software is dual-licensed to the public domain and under the following
|
||||||
// recognized, you are granted a perpetual, irrevocable license to copy,
|
// license: you are granted a perpetual, irrevocable license to copy, modify,
|
||||||
// distribute, and modify this file as you see fit.
|
// publish, and distribute this file as you see fit.
|
||||||
//
|
//
|
||||||
// USAGE
|
// USAGE
|
||||||
//
|
//
|
||||||
@ -403,6 +408,11 @@ int main(int arg, char **argv)
|
|||||||
#define STBTT_sqrt(x) sqrt(x)
|
#define STBTT_sqrt(x) sqrt(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBTT_fabs
|
||||||
|
#include <math.h>
|
||||||
|
#define STBTT_fabs(x) fabs(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
// #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h
|
// #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h
|
||||||
#ifndef STBTT_malloc
|
#ifndef STBTT_malloc
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -626,7 +636,7 @@ STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index);
|
|||||||
|
|
||||||
// The following structure is defined publically so you can declare one on
|
// The following structure is defined publically so you can declare one on
|
||||||
// the stack or as a global or etc, but you should treat it as opaque.
|
// the stack or as a global or etc, but you should treat it as opaque.
|
||||||
typedef struct stbtt_fontinfo
|
struct stbtt_fontinfo
|
||||||
{
|
{
|
||||||
void * userdata;
|
void * userdata;
|
||||||
unsigned char * data; // pointer to .ttf file
|
unsigned char * data; // pointer to .ttf file
|
||||||
@ -637,7 +647,7 @@ typedef struct stbtt_fontinfo
|
|||||||
int loca,head,glyf,hhea,hmtx,kern; // table locations as offset from start of .ttf
|
int loca,head,glyf,hhea,hmtx,kern; // table locations as offset from start of .ttf
|
||||||
int index_map; // a cmap mapping for our chosen character encoding
|
int index_map; // a cmap mapping for our chosen character encoding
|
||||||
int indexToLocFormat; // format needed to map from glyph index to glyph
|
int indexToLocFormat; // format needed to map from glyph index to glyph
|
||||||
} stbtt_fontinfo;
|
};
|
||||||
|
|
||||||
STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset);
|
STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset);
|
||||||
// Given an offset into the file that defines a font, this function builds
|
// Given an offset into the file that defines a font, this function builds
|
||||||
@ -1556,7 +1566,7 @@ STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v)
|
|||||||
|
|
||||||
STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1)
|
STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1)
|
||||||
{
|
{
|
||||||
int x0,y0,x1,y1;
|
int x0=0,y0=0,x1,y1; // =0 suppresses compiler warning
|
||||||
if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) {
|
if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) {
|
||||||
// e.g. space character
|
// e.g. space character
|
||||||
if (ix0) *ix0 = 0;
|
if (ix0) *ix0 = 0;
|
||||||
@ -1672,6 +1682,7 @@ static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, i
|
|||||||
{
|
{
|
||||||
stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata);
|
stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata);
|
||||||
float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);
|
float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);
|
||||||
|
STBTT_assert(z != NULL);
|
||||||
if (!z) return z;
|
if (!z) return z;
|
||||||
|
|
||||||
// round dx down to avoid overshooting
|
// round dx down to avoid overshooting
|
||||||
@ -1693,6 +1704,7 @@ static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, i
|
|||||||
{
|
{
|
||||||
stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata);
|
stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata);
|
||||||
float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);
|
float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);
|
||||||
|
STBTT_assert(z != NULL);
|
||||||
//STBTT_assert(e->y0 <= start_point);
|
//STBTT_assert(e->y0 <= start_point);
|
||||||
if (!z) return z;
|
if (!z) return z;
|
||||||
z->fdx = dxdy;
|
z->fdx = dxdy;
|
||||||
@ -1817,21 +1829,23 @@ static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e,
|
|||||||
while (e->y0 <= scan_y) {
|
while (e->y0 <= scan_y) {
|
||||||
if (e->y1 > scan_y) {
|
if (e->y1 > scan_y) {
|
||||||
stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata);
|
stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata);
|
||||||
// find insertion point
|
if (z != NULL) {
|
||||||
if (active == NULL)
|
// find insertion point
|
||||||
active = z;
|
if (active == NULL)
|
||||||
else if (z->x < active->x) {
|
active = z;
|
||||||
// insert at front
|
else if (z->x < active->x) {
|
||||||
z->next = active;
|
// insert at front
|
||||||
active = z;
|
z->next = active;
|
||||||
} else {
|
active = z;
|
||||||
// find thing to insert AFTER
|
} else {
|
||||||
stbtt__active_edge *p = active;
|
// find thing to insert AFTER
|
||||||
while (p->next && p->next->x < z->x)
|
stbtt__active_edge *p = active;
|
||||||
p = p->next;
|
while (p->next && p->next->x < z->x)
|
||||||
// at this point, p->next->x is NOT < z->x
|
p = p->next;
|
||||||
z->next = p->next;
|
// at this point, p->next->x is NOT < z->x
|
||||||
p->next = z;
|
z->next = p->next;
|
||||||
|
p->next = z;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
++e;
|
++e;
|
||||||
@ -1986,7 +2000,7 @@ static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill,
|
|||||||
}
|
}
|
||||||
y_crossing += dy * (x2 - (x1+1));
|
y_crossing += dy * (x2 - (x1+1));
|
||||||
|
|
||||||
STBTT_assert(fabs(area) <= 1.01f);
|
STBTT_assert(STBTT_fabs(area) <= 1.01f);
|
||||||
|
|
||||||
scanline[x2] += area + sign * (1-((x2-x2)+(x_bottom-x2))/2) * (sy1-y_crossing);
|
scanline[x2] += area + sign * (1-((x2-x2)+(x_bottom-x2))/2) * (sy1-y_crossing);
|
||||||
|
|
||||||
@ -2102,10 +2116,12 @@ static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e,
|
|||||||
while (e->y0 <= scan_y_bottom) {
|
while (e->y0 <= scan_y_bottom) {
|
||||||
if (e->y0 != e->y1) {
|
if (e->y0 != e->y1) {
|
||||||
stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata);
|
stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata);
|
||||||
STBTT_assert(z->ey >= scan_y_top);
|
if (z != NULL) {
|
||||||
// insert at front
|
STBTT_assert(z->ey >= scan_y_top);
|
||||||
z->next = active;
|
// insert at front
|
||||||
active = z;
|
z->next = active;
|
||||||
|
active = z;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
++e;
|
++e;
|
||||||
}
|
}
|
||||||
@ -2121,7 +2137,7 @@ static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e,
|
|||||||
int m;
|
int m;
|
||||||
sum += scanline2[i];
|
sum += scanline2[i];
|
||||||
k = scanline[i] + sum;
|
k = scanline[i] + sum;
|
||||||
k = (float) fabs(k)*255 + 0.5f;
|
k = (float) STBTT_fabs(k)*255 + 0.5f;
|
||||||
m = (int) k;
|
m = (int) k;
|
||||||
if (m > 255) m = 255;
|
if (m > 255) m = 255;
|
||||||
result->pixels[j*result->stride + i] = (unsigned char) m;
|
result->pixels[j*result->stride + i] = (unsigned char) m;
|
||||||
@ -2422,7 +2438,10 @@ STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info
|
|||||||
|
|
||||||
if (scale_x == 0) scale_x = scale_y;
|
if (scale_x == 0) scale_x = scale_y;
|
||||||
if (scale_y == 0) {
|
if (scale_y == 0) {
|
||||||
if (scale_x == 0) return NULL;
|
if (scale_x == 0) {
|
||||||
|
STBTT_free(vertices, info->userdata);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
scale_y = scale_x;
|
scale_y = scale_x;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2514,6 +2533,7 @@ STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // fo
|
|||||||
float scale;
|
float scale;
|
||||||
int x,y,bottom_y, i;
|
int x,y,bottom_y, i;
|
||||||
stbtt_fontinfo f;
|
stbtt_fontinfo f;
|
||||||
|
f.userdata = NULL;
|
||||||
if (!stbtt_InitFont(&f, data, offset))
|
if (!stbtt_InitFont(&f, data, offset))
|
||||||
return -1;
|
return -1;
|
||||||
STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels
|
STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels
|
||||||
@ -2707,6 +2727,7 @@ static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_i
|
|||||||
unsigned char buffer[STBTT_MAX_OVERSAMPLE];
|
unsigned char buffer[STBTT_MAX_OVERSAMPLE];
|
||||||
int safe_w = w - kernel_width;
|
int safe_w = w - kernel_width;
|
||||||
int j;
|
int j;
|
||||||
|
STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze
|
||||||
for (j=0; j < h; ++j) {
|
for (j=0; j < h; ++j) {
|
||||||
int i;
|
int i;
|
||||||
unsigned int total;
|
unsigned int total;
|
||||||
@ -2768,6 +2789,7 @@ static void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_i
|
|||||||
unsigned char buffer[STBTT_MAX_OVERSAMPLE];
|
unsigned char buffer[STBTT_MAX_OVERSAMPLE];
|
||||||
int safe_h = h - kernel_width;
|
int safe_h = h - kernel_width;
|
||||||
int j;
|
int j;
|
||||||
|
STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze
|
||||||
for (j=0; j < w; ++j) {
|
for (j=0; j < w; ++j) {
|
||||||
int i;
|
int i;
|
||||||
unsigned int total;
|
unsigned int total;
|
||||||
@ -2976,6 +2998,7 @@ STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, unsigned char *fontd
|
|||||||
if (rects == NULL)
|
if (rects == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
info.userdata = spc->user_allocator_context;
|
||||||
stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index));
|
stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index));
|
||||||
|
|
||||||
n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects);
|
n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects);
|
||||||
@ -3193,6 +3216,10 @@ STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *font_collection, const
|
|||||||
|
|
||||||
// FULL VERSION HISTORY
|
// FULL VERSION HISTORY
|
||||||
//
|
//
|
||||||
|
// 1.10 (2016-04-02) allow user-defined fabs() replacement
|
||||||
|
// fix memory leak if fontsize=0.0
|
||||||
|
// fix warning from duplicate typedef
|
||||||
|
// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges
|
||||||
// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges
|
// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges
|
||||||
// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints;
|
// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints;
|
||||||
// allow PackFontRanges to pack and render in separate phases;
|
// allow PackFontRanges to pack and render in separate phases;
|
||||||
|