Compare commits
278 Commits
Author | SHA1 | Date |
---|---|---|
tildearrow | ec4063641a | |
tildearrow | 803c8b0582 | |
tildearrow | fc760eed43 | |
tildearrow | eb18b28928 | |
tildearrow | d42b503e81 | |
tildearrow | 2c0ae7c8bb | |
tildearrow | 5f0fe2c8f7 | |
tildearrow | 1da000b00c | |
tildearrow | c99899a002 | |
tildearrow | 55eeb241cf | |
tildearrow | ad7b4f61b5 | |
tildearrow | 2ca5856800 | |
tildearrow | 60df7e26f4 | |
tildearrow | ab7b26a2e7 | |
tildearrow | 7a78ec1b60 | |
tildearrow | 90980a3062 | |
tildearrow | 83c64aa4b4 | |
thacuber2a03 | 25a83bf1b9 | |
tildearrow | 7ea5f2de07 | |
tildearrow | f6db75fae1 | |
tildearrow | 19d0ed617a | |
tildearrow | 20ed22d6e8 | |
tildearrow | b26a76f343 | |
tildearrow | ef23b88ad3 | |
tildearrow | 716d42ee6d | |
tildearrow | 1c171ed7bd | |
tildearrow | c21f880e3e | |
tildearrow | 4f02f1f90b | |
tildearrow | 65cd433ac7 | |
tildearrow | 5a9402abcd | |
tildearrow | fa7405090e | |
tildearrow | be38b992e3 | |
tildearrow | addbc986f0 | |
Eknous | 914855d751 | |
Eknous-P | 2a370dbb1f | |
tildearrow | b315b84e31 | |
tildearrow | 35aeb51b79 | |
tildearrow | 05d5eb5ca3 | |
tildearrow | 879e770e58 | |
tildearrow | 7f35d06ccb | |
tildearrow | 43ef57390a | |
tildearrow | 4ad1ae78fa | |
tildearrow | a882d7bcf2 | |
tildearrow | 9caa2f38f4 | |
tildearrow | 5140acd51f | |
tildearrow | 9aacc706f1 | |
Electric Keet | fb3a3890d5 | |
Electric Keet | 29c2879397 | |
tildearrow | 8b3fc84b51 | |
tildearrow | 922800d864 | |
tildearrow | 274ce8a646 | |
tildearrow | d1b78f787b | |
tildearrow | 68787a4d8b | |
Electric Keet | 1ebf828743 | |
tildearrow | 7d605c9d76 | |
tildearrow | 80013089a2 | |
tildearrow | 5a688c58cb | |
tildearrow | 63dcacf33d | |
tildearrow | 426d4b44f0 | |
tildearrow | 6ac4529f3b | |
tildearrow | ff3cebfffd | |
tildearrow | fda2ca0645 | |
tildearrow | da259a33b7 | |
tildearrow | 5da54a7678 | |
tildearrow | 23a1fd4796 | |
tildearrow | 015899a43f | |
Electric Keet | 6fb738294a | |
tildearrow | d38ff59cb8 | |
tildearrow | f9237dc69c | |
tildearrow | d7f3be70c6 | |
tildearrow | de34b5c9c4 | |
Electric Keet | e65e79f192 | |
Electric Keet | da5d110e73 | |
tildearrow | 4abae260f4 | |
tildearrow | 61b0179da1 | |
tildearrow | 32ec87ca27 | |
tildearrow | eaac5cc224 | |
tildearrow | e7fe99f795 | |
tildearrow | ead19d6111 | |
tildearrow | ca51ee9f32 | |
tildearrow | fccb6aff6e | |
tildearrow | eff22ae7b9 | |
tildearrow | e6c52e34d1 | |
tildearrow | da7ad75afd | |
tildearrow | 87ae995ff9 | |
tildearrow | 8d887058ec | |
tildearrow | a5f351c232 | |
tildearrow | 9cb239438e | |
tildearrow | 35faa8c23c | |
tildearrow | 2fddd9e4d4 | |
tildearrow | 980c93aac4 | |
tildearrow | 044859f6d1 | |
Electric Keet | 2813e8e3b3 | |
tildearrow | cfd5131081 | |
tildearrow | decd2fde0f | |
tildearrow | f07ad0044b | |
tildearrow | 281598812c | |
Electric Keet | 0b5afcb8d6 | |
tildearrow | 74bd071873 | |
tildearrow | 2ea43329a2 | |
Electric Keet | ed05c16d95 | |
tildearrow | 684633aa1e | |
tildearrow | f5ac9b13b6 | |
tildearrow | 2357093bc8 | |
tildearrow | bd730cbeec | |
tildearrow | 347b3cf2b1 | |
tildearrow | 628ddc91ca | |
tildearrow | bcf877b7ca | |
tildearrow | 4e3de466ce | |
tildearrow | 23a70381c6 | |
tildearrow | 0e7dbf7b4a | |
tildearrow | 7ea7f72b45 | |
tildearrow | 284a4f39ad | |
Electric Keet | d65df2facd | |
Eknous-P | cd2d60ac58 | |
Electric Keet | ac7e05550a | |
Electric Keet | 7a6cbcc00d | |
Eknous | 06f2595861 | |
Eknous | 4078da6685 | |
tildearrow | 288441617b | |
tildearrow | 26f6f22ef5 | |
tildearrow | 859182bb08 | |
tildearrow | 80961354f7 | |
tildearrow | 886e311c0d | |
tildearrow | 17a88fda70 | |
Electric Keet | ba25910d48 | |
Eknous | 7a87702518 | |
tildearrow | 440cbff5e4 | |
tildearrow | 64e6cf12c2 | |
Eknous-P | 65fbdba831 | |
tildearrow | 0e19716dcd | |
tildearrow | f53bc88242 | |
tildearrow | 2d5fcf8aca | |
Eknous-P | 4eda4aeb39 | |
Eknous-P | fdd9b598a7 | |
Eknous | 8192a8e0f6 | |
tildearrow | dee7a1820d | |
tildearrow | 76746dcb28 | |
tildearrow | bd92347950 | |
tildearrow | 962943185d | |
tildearrow | 338b67da9c | |
tildearrow | 2c99bc9593 | |
Electric Keet | 9a9b69c319 | |
tildearrow | b6448e8c0d | |
tildearrow | 29651aabfd | |
Eknous-P | 6fa746f04d | |
Eknous-P | a6b08b5449 | |
Eknous-P | a7eb62a5d6 | |
Eknous | fb67357cf8 | |
Eknous-P | 19f7376337 | |
Eknous-P | 0dbe1b401f | |
Eknous-P | 9e405e86fa | |
Eknous-P | 3c38a79801 | |
Eknous-P | f0bcb1c06a | |
Eknous-P | ccdd5693c6 | |
freq-mod | b5d6971f93 | |
Eknous-P | 6250dd970f | |
Eknous-P | eef3dacc78 | |
Eknous-P | b993d4b58d | |
Eknous-P | 89921b1ff3 | |
Eknous-P | a832adeac5 | |
tildearrow | 3dd4f3e7e8 | |
tildearrow | 29fa249227 | |
tildearrow | a17f7249d6 | |
tildearrow | 324fce3b1c | |
tildearrow | 16bc35d75b | |
tildearrow | 2b0feefe28 | |
tildearrow | bd95a76a48 | |
tildearrow | 41316860a5 | |
tildearrow | 6c5ea4b950 | |
tildearrow | c4b23e8643 | |
tildearrow | 55d7a5e9bc | |
tildearrow | 91c3c04082 | |
tildearrow | c3b5004e66 | |
Electric Keet | f4c778d90e | |
Electric Keet | 98a95e83c6 | |
tildearrow | 06840de4c7 | |
tildearrow | 8a1ba5a544 | |
tildearrow | 2b007a03e0 | |
tildearrow | 4999d9a387 | |
tildearrow | f5f1a29486 | |
tildearrow | a31b847f32 | |
tildearrow | 9bf736a513 | |
tildearrow | 6e28a8b01c | |
Герман Семенов | 1cbb61ec27 | |
tildearrow | d4e60e0c03 | |
tildearrow | cb0a8396c4 | |
tildearrow | 95b0b25011 | |
tildearrow | 009b9f74df | |
tildearrow | d36b43415f | |
tildearrow | 972c66812b | |
tildearrow | d240066df8 | |
tildearrow | 31335b95c9 | |
Electric Keet | 01a5c6c4f9 | |
tildearrow | c9cbf133d6 | |
tildearrow | 62a1a383ee | |
tildearrow | b946c35fa7 | |
Electric Keet | 92773adb37 | |
tildearrow | e4e92f9af3 | |
tildearrow | 7e63692f60 | |
tildearrow | 5c71b64195 | |
tildearrow | f22910d8e2 | |
tildearrow | 577d6fd4d4 | |
Electric Keet | cae3fa43b2 | |
Electric Keet | ab76546f7a | |
Electric Keet | 4a9bf44b56 | |
tildearrow | 5d3aedbbc1 | |
tildearrow | cc8c79375d | |
tildearrow | e79f0b652a | |
tildearrow | 7ba5b172d5 | |
tildearrow | 251893c5f8 | |
tildearrow | 54934dcfc9 | |
tildearrow | b35235b82e | |
tildearrow | 97b6b39049 | |
tildearrow | 70f774312b | |
tildearrow | e1140c5015 | |
tildearrow | bcb8fdbf06 | |
tildearrow | 617ee5e324 | |
tildearrow | 18dc353392 | |
tildearrow | f3c438eee5 | |
Electric Keet | ce9a023993 | |
tildearrow | bb874d9415 | |
tildearrow | 2bf5392f7b | |
tildearrow | 4776eaed68 | |
Electric Keet | c4f3930e3c | |
Electric Keet | ef410b7d73 | |
Electric Keet | f4726190b7 | |
tildearrow | 510bcfb56d | |
tildearrow | 94d8076a58 | |
tildearrow | f5a881917f | |
tildearrow | 6ba8527cb6 | |
freq-mod | d0f498189c | |
tildearrow | 33d932f548 | |
tildearrow | d74172680f | |
tildearrow | 80a9677b0e | |
tildearrow | 91d7157b5d | |
tildearrow | 6faf80b5c6 | |
tildearrow | 2efbf93853 | |
Electric Keet | 4cf58b158e | |
Electric Keet | 9397f95499 | |
Electric Keet | 46a078d62a | |
Electric Keet | 13bb256075 | |
Electric Keet | 036aac3b80 | |
tildearrow | 9814d7dd88 | |
tildearrow | 5720e5670d | |
tildearrow | 7479296d54 | |
tildearrow | e3eea680d5 | |
tildearrow | f3167d2fc9 | |
tildearrow | 993c5904e2 | |
tildearrow | 396f51c75f | |
tildearrow | 6fe98f1502 | |
tildearrow | 1dd02dd389 | |
tildearrow | d68de019d6 | |
tildearrow | 75549bdd22 | |
Electric Keet | 3075a58d0d | |
Electric Keet | 10ea584857 | |
tildearrow | dba96812aa | |
Electric Keet | 6ac9fd3d91 | |
tildearrow | c8222fd491 | |
tildearrow | 14d3baae56 | |
tildearrow | 487065478d | |
tildearrow | f352162151 | |
cam900 | 8ad7a5bf7d | |
cam900 | e0dc22a6f1 | |
cam900 | a3d54ca933 | |
cam900 | 1873a2a708 | |
cam900 | b1e2e33f2d | |
cam900 | b326087721 | |
cam900 | 213d613534 | |
cam900 | 36f542972c | |
cam900 | c69318b222 | |
cam900 | 2a43272c66 | |
cam900 | 2a881c9f66 | |
cam900 | 90fa977d23 | |
cam900 | d84d678929 | |
cam900 | b1070f531a | |
cam900 | c8c2704a99 | |
cam900 | e6b84280aa |
|
@ -6,6 +6,7 @@ release/
|
|||
t/
|
||||
winbuild/
|
||||
win32build/
|
||||
xpbuild/
|
||||
macbuild/
|
||||
linuxbuild/
|
||||
*.swp
|
||||
|
|
|
@ -12,3 +12,6 @@
|
|||
[submodule "extern/adpcm"]
|
||||
path = extern/adpcm
|
||||
url = https://github.com/superctr/adpcm
|
||||
[submodule "extern/portaudio"]
|
||||
path = extern/portaudio
|
||||
url = https://github.com/PortAudio/portaudio.git
|
||||
|
|
|
@ -27,6 +27,7 @@ include(TestBigEndian)
|
|||
|
||||
if (ANDROID)
|
||||
set(USE_RTMIDI_DEFAULT OFF)
|
||||
set(WITH_PORTAUDIO_DEFAULT OFF)
|
||||
set(USE_BACKWARD_DEFAULT OFF)
|
||||
find_library(TERMUX rt)
|
||||
if (TERMUX)
|
||||
|
@ -34,6 +35,7 @@ if (ANDROID)
|
|||
endif()
|
||||
else()
|
||||
set(USE_RTMIDI_DEFAULT ON)
|
||||
set(WITH_PORTAUDIO_DEFAULT ON)
|
||||
if (WIN32 OR APPLE)
|
||||
set(USE_BACKWARD_DEFAULT ON)
|
||||
else()
|
||||
|
@ -78,6 +80,7 @@ option(USE_SDL2 "Build with SDL2. Required to build with GUI." ${USE_SDL2_DEFAUL
|
|||
option(USE_SNDFILE "Build with libsndfile. Required in order to work with audio files." ${USE_SNDFILE_DEFAULT})
|
||||
option(USE_BACKWARD "Use backward-cpp to print a backtrace on crash/abort." ${USE_BACKWARD_DEFAULT})
|
||||
option(WITH_JACK "Whether to build with JACK support. Auto-detects if JACK is available" ${WITH_JACK_DEFAULT})
|
||||
option(WITH_PORTAUDIO "Whether to build with PortAudio for audio output." ${WITH_PORTAUDIO_DEFAULT})
|
||||
option(WITH_RENDER_SDL "Whether to build with the SDL_Renderer render backend." ${WITH_RENDER_SDL_DEFAULT})
|
||||
option(WITH_RENDER_OPENGL "Whether to build with the OpenGL render backend." ${WITH_RENDER_OPENGL_DEFAULT})
|
||||
option(WITH_RENDER_DX11 "Whether to build with the DirectX 11 render backend." ${WITH_RENDER_DX11_DEFAULT})
|
||||
|
@ -85,6 +88,7 @@ option(USE_GLES "Use OpenGL ES for the OpenGL render backend." ${USE_GLES_DEFAUL
|
|||
option(SYSTEM_FFTW "Use a system-installed version of FFTW instead of the vendored one" OFF)
|
||||
option(SYSTEM_FMT "Use a system-installed version of fmt instead of the vendored one" OFF)
|
||||
option(SYSTEM_LIBSNDFILE "Use a system-installed version of libsndfile instead of the vendored one" OFF)
|
||||
option(SYSTEM_PORTAUDIO "Use a system-installed version of PortAudio instead of the vendored one" OFF)
|
||||
option(SYSTEM_RTMIDI "Use a system-installed version of RtMidi instead of the vendored one" OFF)
|
||||
option(SYSTEM_ZLIB "Use a system-installed version of zlib instead of the vendored one" OFF)
|
||||
option(SYSTEM_SDL2 "Use a system-installed version of SDL2 instead of the vendored one" ${SYSTEM_SDL2_DEFAULT})
|
||||
|
@ -204,6 +208,27 @@ else()
|
|||
message(STATUS "Not using libsndfile")
|
||||
endif()
|
||||
|
||||
if (WITH_PORTAUDIO)
|
||||
if (SYSTEM_PORTAUDIO)
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(PORTAUDIO REQUIRED portaudio)
|
||||
list(APPEND DEPENDENCIES_INCLUDE_DIRS ${PORTAUDIO_INCLUDE_DIRS})
|
||||
list(APPEND DEPENDENCIES_COMPILE_OPTIONS ${PORTAUDIO_CFLAGS_OTHER})
|
||||
list(APPEND DEPENDENCIES_LIBRARIES ${PORTAUDIO_LIBRARIES})
|
||||
list(APPEND DEPENDENCIES_LIBRARY_DIRS ${PORTAUDIO_LIBRARY_DIRS})
|
||||
list(APPEND DEPENDENCIES_LINK_OPTIONS ${PORTAUDIO_LDFLAGS_OTHER})
|
||||
list(APPEND DEPENDENCIES_LEGACY_LDFLAGS ${PORTAUDIO_LDFLAGS})
|
||||
message(STATUS "Using system-installed PortAudio")
|
||||
else()
|
||||
set(PA_BUILD_SHARED_LIBS OFF CACHE BOOL "Build dynamic library" FORCE)
|
||||
# don't - Furnace has its own implementation
|
||||
set(PA_USE_JACK OFF CACHE BOOL "Enable support for JACK Audio Connection Kit" FORCE)
|
||||
add_subdirectory(extern/portaudio EXCLUDE_FROM_ALL)
|
||||
list(APPEND DEPENDENCIES_LIBRARIES PortAudio)
|
||||
message(STATUS "Using vendored PortAudio")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (USE_RTMIDI)
|
||||
if (SYSTEM_RTMIDI)
|
||||
find_package(PkgConfig REQUIRED)
|
||||
|
@ -345,6 +370,14 @@ else()
|
|||
message(STATUS "Building without JACK support")
|
||||
endif()
|
||||
|
||||
if (WITH_PORTAUDIO)
|
||||
list(APPEND AUDIO_SOURCES src/audio/pa.cpp)
|
||||
message(STATUS "Building with PortAudio")
|
||||
list(APPEND DEPENDENCIES_DEFINES HAVE_PA)
|
||||
else()
|
||||
message(STATUS "Building without PortAudio")
|
||||
endif()
|
||||
|
||||
if (USE_RTMIDI)
|
||||
list(APPEND AUDIO_SOURCES src/audio/rtmidi.cpp)
|
||||
message(STATUS "Building with RtMidi")
|
||||
|
@ -507,7 +540,7 @@ src/engine/platform/sound/d65modified.c
|
|||
|
||||
src/engine/platform/sound/ted-sound.c
|
||||
|
||||
src/engine/platform/sound/c140.c
|
||||
src/engine/platform/sound/c140_c219.c
|
||||
|
||||
src/engine/platform/oplAInterface.cpp
|
||||
src/engine/platform/ym2608Interface.cpp
|
||||
|
@ -517,7 +550,9 @@ src/engine/blip_buf.c
|
|||
src/engine/brrUtils.c
|
||||
src/engine/safeReader.cpp
|
||||
src/engine/safeWriter.cpp
|
||||
src/engine/workPool.cpp
|
||||
src/engine/cmdStream.cpp
|
||||
src/engine/cmdStreamOps.cpp
|
||||
src/engine/config.cpp
|
||||
src/engine/configEngine.cpp
|
||||
src/engine/dispatchContainer.cpp
|
||||
|
@ -525,6 +560,7 @@ src/engine/engine.cpp
|
|||
src/engine/export.cpp
|
||||
src/engine/fileOps.cpp
|
||||
src/engine/fileOpsIns.cpp
|
||||
src/engine/fileOpsSample.cpp
|
||||
src/engine/filter.cpp
|
||||
src/engine/instrument.cpp
|
||||
src/engine/macroInt.cpp
|
||||
|
@ -535,6 +571,7 @@ src/engine/song.cpp
|
|||
src/engine/sysDef.cpp
|
||||
src/engine/wavetable.cpp
|
||||
src/engine/waveSynth.cpp
|
||||
src/engine/wavOps.cpp
|
||||
src/engine/vgmOps.cpp
|
||||
src/engine/zsmOps.cpp
|
||||
src/engine/zsm.cpp
|
||||
|
|
|
@ -48,8 +48,10 @@ for other operating systems, you may [build the source](#developer-info).
|
|||
- Ricoh RF5C68 used in Sega CD and FM Towns
|
||||
- OKI MSM6258 and MSM6295
|
||||
- Konami K007232
|
||||
- Konami K053260
|
||||
- Irem GA20
|
||||
- Ensoniq ES5506
|
||||
- Namco C140
|
||||
- wavetable chips:
|
||||
- HuC6280 used in PC Engine
|
||||
- Konami Bubble System WSG
|
||||
|
@ -73,6 +75,7 @@ for other operating systems, you may [build the source](#developer-info).
|
|||
- QuadTone engine
|
||||
- Pokémon Mini
|
||||
- Commodore PET
|
||||
- TED used in Commodore Plus/4
|
||||
- Casio PV-1000
|
||||
- TIA used in Atari 2600
|
||||
- POKEY used in Atari 8-bit computers
|
||||
|
@ -124,7 +127,7 @@ for other operating systems, you may [build the source](#developer-info).
|
|||
# quick references
|
||||
|
||||
- **discussion**: see the [Discussions](https://github.com/tildearrow/furnace/discussions) section, the [official Revolt](https://rvlt.gg/GRPS6tmc) or the [official Discord server](https://discord.gg/EfrwT2wq7z).
|
||||
- **help**: check out the [documentation](doc/README.md). it's about 80% complete.
|
||||
- **help**: check out the [documentation](doc/README.md). it's about 90% complete.
|
||||
|
||||
## packages
|
||||
|
||||
|
@ -249,6 +252,7 @@ Available options:
|
|||
| `USE_SNDFILE` | `ON` | Build with libsndfile (required in order to work with audio files) |
|
||||
| `USE_BACKWARD` | `ON` | Use backward-cpp to print a backtrace on crash/abort |
|
||||
| `WITH_JACK` | `ON` if system-installed JACK detected, otherwise `OFF` | Whether to build with JACK support. Auto-detects if JACK is available |
|
||||
| `WITH_PORTAUDIO` | `ON` | Whether to build with PortAudio. |
|
||||
| `SYSTEM_FFTW` | `OFF` | Use a system-installed version of FFTW instead of the vendored one |
|
||||
| `SYSTEM_FMT` | `OFF` | Use a system-installed version of fmt instead of the vendored one |
|
||||
| `SYSTEM_LIBSNDFILE` | `OFF` | Use a system-installed version of libsndfile instead of the vendored one |
|
||||
|
|
|
@ -15,8 +15,8 @@ android {
|
|||
}
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 26
|
||||
versionCode 166
|
||||
versionName "0.6pre8"
|
||||
versionCode 169
|
||||
versionName "0.6pre9"
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
arguments "-DANDROID_APP_PLATFORM=android-21", "-DANDROID_STL=c++_static", "-DWARNINGS_ARE_ERRORS=ON"
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.tildearrow.furnace"
|
||||
android:versionCode="166"
|
||||
android:versionName="0.6pre8"
|
||||
android:versionCode="169"
|
||||
android:versionName="0.6pre9"
|
||||
android:installLocation="auto">
|
||||
|
||||
<!-- OpenGL ES 2.0 -->
|
||||
|
|
|
@ -15,22 +15,22 @@ The **[pattern view](../3-pattern/README.md)** is like a spreadsheet that displa
|
|||
## structure
|
||||
|
||||
The **order list** is a smaller spreadsheet showing the overall song structure.
|
||||
- A song is made up of a list of **orders**.
|
||||
- An **order** is a set of numbered **patterns** used for each channel.
|
||||
- A song is made up of a list of orders.
|
||||
- An **order** is a set of numbered patterns used for each channel.
|
||||
- Each channel has its own unique list of patterns.
|
||||
- Each pattern contains note and effect data for that channel only.
|
||||
- Each **pattern** contains note and effect data for that channel only.
|
||||
- Patterns may be used multiple times in the order list. Changing a pattern's data in one order will affect the same pattern used in other orders.
|
||||
|
||||
## time
|
||||
|
||||
- Each pattern is made of the same number of **rows** as seen in the tracker view.
|
||||
- During playback, Each row lasts a number of **ticks** determined by its **speed** value.
|
||||
- A tick is the smallest measure of time to which all note, effect, and macro times are quantized.
|
||||
- Each pattern is made of the same number of rows as seen in the tracker view.
|
||||
- During playback, each **row** lasts a number of ticks determined by its **speed** value.
|
||||
- A **tick** is the smallest measure of time to which all note, effect, and macro times are quantized.
|
||||
|
||||
## sound
|
||||
|
||||
Different chips have different capabilities. Even within the same chip, each channel may have its own ways of making sound.
|
||||
- Some channels use one or more waveform **generators** (sine, square, noise...) to build up a sound.
|
||||
- Of special note are **[FM (frequency modulation)](../4-instrument/fm.md)** channels, which use a number of generators called **operators** that can interact to make very complex sounds.
|
||||
- Some channels use **[samples](../6-sample/README.md)** - recordings of sounds, often with defined loop points to allow a note to sustain.
|
||||
- Some channels use **[samples](../6-sample/README.md)** which are recordings of sounds, often with defined loop points to allow a note to sustain.
|
||||
- Some channels use **[wavetables](../5-wave/README.md)**, which are like very short samples of fixed length that automatically loop.
|
Before Width: | Height: | Size: 423 B |
Before Width: | Height: | Size: 576 B |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 436 B |
|
@ -3,10 +3,20 @@
|
|||
![instruments window](instruments.png)
|
||||
|
||||
Buttons from left to right:
|
||||
- **Add**: Creates a new, default instrument.
|
||||
- **Add**: pops up a menu to select which type of instrument to add. if only one instrument type is available, the menu is skipped.
|
||||
- If the "Display instrument type menu when adding instrument" setting is disabled, this skips the menu and creates an instrument according to the chip under the cursor.
|
||||
- Right-clicking always brings up the menu.
|
||||
- **Duplicate**: Duplicates the currently selected instrument.
|
||||
- **Open**: Brings up a file dialog to load a file as a new instrument at the end of the list.
|
||||
- **Save**: Brings up a file dialog to save the currently selected instrument.
|
||||
- **Save**: Brings up a file dialog to save the currently selected asset.
|
||||
- Instruments are saved as Furnace instrument (.fui) files.
|
||||
- Wavetables are saved as Furnace wavetable (.fuw) files.
|
||||
- Samples are saved as standard wave (.wav) files.
|
||||
- Right-clicking brings up a menu with the applicable items from this list:
|
||||
- **save instrument as .dmp...**: saves the selected instrument in DefleMask format.
|
||||
- **save wavetable as .dmw...**: saves the selected wavetable in DefleMask format.
|
||||
- **save raw wavetable...**: saves the selected wavetable as raw data.
|
||||
- **save raw sample...**: saves the selected sample as raw data.
|
||||
- **Toggle folders/standard view**: Enables (and disables) folder view, explained below.
|
||||
- **Move up**: Moves the currently selected instrument up in the list. Pattern data will automatically be adjusted to match.
|
||||
- **Move down**: Same, but downward.
|
||||
|
@ -33,6 +43,6 @@ Everything from the instrument list applies here also, with one major difference
|
|||
|
||||
![samples window](samples.png)
|
||||
|
||||
Everything from the wavetables list applies here also, with the addition of two buttons before the Delete button:
|
||||
Everything from the wavetables list applies here also, with the addition of one button before the Delete button:
|
||||
- **Preview**: Plays the selected sample at its default note.
|
||||
- **Stop preview**: Stops the sample playback.
|
||||
- Right-clicking stops the sample playback.
|
||||
|
|
Before Width: | Height: | Size: 725 B |
Before Width: | Height: | Size: 464 B |
Before Width: | Height: | Size: 684 B |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 406 B |
Before Width: | Height: | Size: 620 B |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 362 KiB After Width: | Height: | Size: 436 KiB |
Before Width: | Height: | Size: 368 KiB After Width: | Height: | Size: 435 KiB |
|
@ -1,15 +1,256 @@
|
|||
# global keyboard shortcuts
|
||||
# keyboard
|
||||
|
||||
this is a list of available shortcuts that may be used at any time, regardless of currently focused window.
|
||||
everything on this list can be configured in the "Keyboard" tab of the Settings dialog:
|
||||
- click on a keybind then enter a key or key combination to change it.
|
||||
- right-click to clear the keybind.
|
||||
|
||||
key | action
|
||||
-----------|-----------------------
|
||||
Ctrl-O | open file
|
||||
Ctrl-S | save file
|
||||
Enter | play/stop song
|
||||
F5/F6 | "
|
||||
Shift-Enter| play from cursor position
|
||||
F7 | "
|
||||
Ctrl-Enter | play one row
|
||||
NumPad `/` | decrease octave
|
||||
NumPad `*` | increase octave
|
||||
the keys in the "Global hotkeys" section can be used in any window, though not within text boxes.
|
||||
|
||||
| action | default keybind |
|
||||
|--------------------------------------------------------|------------------|
|
||||
| **Global hotkeys** | |
|
||||
| New | `Ctrl-N` |
|
||||
| Clear song data | — |
|
||||
| Open file | `Ctrl-O` |
|
||||
| Restore backup | — |
|
||||
| Save file | `Ctrl-S` |
|
||||
| Save as | `Ctrl-Shift-S` |
|
||||
| Undo | `Ctrl-Z` |
|
||||
| Redo | `Ctrl-Y` |
|
||||
| Play/Stop (toggle) | `Return` |
|
||||
| Play | — |
|
||||
| Stop | — |
|
||||
| Play (from beginning) | `F5` |
|
||||
| Play (repeat pattern) | — |
|
||||
| Play from cursor | `Shift-Return` |
|
||||
| Step row | `Ctrl-Return` |
|
||||
| Octave up | `Keypad *` |
|
||||
| Octave down | `Keypad /` |
|
||||
| Previous instrument | `Shift-Keypad /` |
|
||||
| Next instrument | `Shift-Keypad *` |
|
||||
| Increase edit step | `Ctrl-Keypad *` |
|
||||
| Decrease edit step | `Ctrl-Keypad /` |
|
||||
| Toggle edit mode | `Space` |
|
||||
| Metronome | `Ctrl-M` |
|
||||
| Toggle repeat pattern | — |
|
||||
| Follow orders | — |
|
||||
| Follow pattern | — |
|
||||
| Toggle full-screen | `F11` |
|
||||
| Request voice from TX81Z | — |
|
||||
| Panic | `F12` |
|
||||
| | |
|
||||
| **Window activation** | |
|
||||
| Find/Replace | Ctrl-F |
|
||||
| Settings | — |
|
||||
| Song Information | — |
|
||||
| Subsongs | — |
|
||||
| Speed | — |
|
||||
| Instrument List | — |
|
||||
| Wavetable List | — |
|
||||
| Sample List | — |
|
||||
| Orders | — |
|
||||
| Pattern | — |
|
||||
| Mixer | — |
|
||||
| Grooves | — |
|
||||
| Channels | — |
|
||||
| Pattern Manager | — |
|
||||
| Chip Manager | — |
|
||||
| Compatibility Flags | — |
|
||||
| Song Comments | — |
|
||||
| Instrument Editor | — |
|
||||
| Wavetable Editor | — |
|
||||
| Sample Editor | — |
|
||||
| Edit Controls | — |
|
||||
| Piano | — |
|
||||
| Oscilloscope (master) | — |
|
||||
| Oscilloscope (per-channel) | — |
|
||||
| Volume Meter | — |
|
||||
| Clock | — |
|
||||
| Register View | — |
|
||||
| Log Viewer | — |
|
||||
| Statistics | — |
|
||||
| Effect List | — |
|
||||
| Debug Menu | `Ctrl-Shift-D` |
|
||||
| About | — |
|
||||
| Collapse/expand current window | — |
|
||||
| Close current window | `Shift-Escape` |
|
||||
| | |
|
||||
| **Note input** | |
|
||||
| _see "note input" section after table_ | |
|
||||
| | |
|
||||
| **Pattern** | |
|
||||
| Transpose (+1) | `Ctrl-F2` |
|
||||
| Transpose (-1) | `Ctrl-F1` |
|
||||
| Transpose (+1 octave) | `Ctrl-F4` |
|
||||
| Transpose (-1 octave) | `Ctrl-F3` |
|
||||
| Increase values (+1) | `Ctrl-Shift-F2` |
|
||||
| Increase values (-1) | `Ctrl-Shift-F1` |
|
||||
| Increase values (+16) | `Ctrl-Shift-F4` |
|
||||
| Increase values (-16) | `Ctrl-Shift-F3` |
|
||||
| Select all | `Ctrl-A` |
|
||||
| Cut | `Ctrl-X` |
|
||||
| Copy | `Ctrl-C` |
|
||||
| Paste | `Ctrl-V` |
|
||||
| Paste Mix (foreground) | `Ctrl-Shift-V` |
|
||||
| Paste Mix (background) | — |
|
||||
| Paste Flood | — |
|
||||
| Paste Overflow | — |
|
||||
| Move cursor up | `Up` |
|
||||
| Move cursor down | `Down` |
|
||||
| Move cursor left | `Left` |
|
||||
| Move cursor right | `Right` |
|
||||
| Move cursor up by one (override Edit Step) | `Shift-Home` |
|
||||
| Move cursor down by one (override Edit Step) | `Shift-End` |
|
||||
| Move cursor to previous channel | — |
|
||||
| Move cursor to next channel | — |
|
||||
| Move cursor to next channel (overflow) | — |
|
||||
| Move cursor to previous channel (overflow) | — |
|
||||
| Move cursor to beginning of pattern | `Home` |
|
||||
| Move cursor to end of pattern | `End` |
|
||||
| Move cursor up (coarse) | `PageUp` |
|
||||
| Move cursor down (coarse) | `PageDown` |
|
||||
| Expand selection upwards | `Shift-Up` |
|
||||
| Expand selection downwards | `Shift-Down` |
|
||||
| Expand selection to the left | `Shift-Left` |
|
||||
| Expand selection to the right | `Shift-Right` |
|
||||
| Expand selection upwards by one (override Edit Step) | — |
|
||||
| Expand selection downwards by one (override Edit Step) | — |
|
||||
| Expand selection to beginning of pattern | — |
|
||||
| Expand selection to end of pattern | — |
|
||||
| Expand selection upwards (coarse) | `Shift-PageUp` |
|
||||
| Expand selection downwards (coarse) | `Shift-PageDown` |
|
||||
| Delete | `Delete` |
|
||||
| Pull delete | `Backspace` |
|
||||
| Insert | `Insert` |
|
||||
| Mute channel at cursor | `Alt-F9` |
|
||||
| Solo channel at cursor | `Alt-F10` |
|
||||
| Unmute all channels | `Alt-Shift-F9` |
|
||||
| Go to next order | — |
|
||||
| Go to previous order | — |
|
||||
| Collapse channel at cursor | — |
|
||||
| Increase effect columns | — |
|
||||
| Decrease effect columns | — |
|
||||
| Interpolate | — |
|
||||
| Fade | — |
|
||||
| Invert values | — |
|
||||
| Flip selection | — |
|
||||
| Collapse rows | — |
|
||||
| Expand rows | — |
|
||||
| Collapse pattern | — |
|
||||
| Expand pattern | — |
|
||||
| Collapse song | — |
|
||||
| Expand song | — |
|
||||
| Set note input latch | — |
|
||||
| Clear note input latch | — |
|
||||
| | |
|
||||
| **Instrument list** | |
|
||||
| Add | `Insert` |
|
||||
| Duplicate | `Ctrl-D` |
|
||||
| Open | — |
|
||||
| Open (replace current) | — |
|
||||
| Save | — |
|
||||
| Save (.dmp) | — |
|
||||
| Move up | `Shift-Up` |
|
||||
| Move down | `Shift-Down` |
|
||||
| Delete | — |
|
||||
| Edit | `Shift-Return` |
|
||||
| Cursor up | `Up` |
|
||||
| Cursor down | `Down` |
|
||||
| Toggle folders/standard view | `Ctrl-V` |
|
||||
| | |
|
||||
| **Wavetable list** | |
|
||||
| Add | `Insert` |
|
||||
| Duplicate | `Ctrl-D` |
|
||||
| Open | — |
|
||||
| Open (replace current) | — |
|
||||
| Save | — |
|
||||
| Save (.dmw) | — |
|
||||
| Save (raw) | — |
|
||||
| Move up | `Shift-Up` |
|
||||
| Move down | `Shift-Down` |
|
||||
| Delete | — |
|
||||
| Edit | `Shift-Return` |
|
||||
| Cursor up | `Up` |
|
||||
| Cursor down | `Down` |
|
||||
| Toggle folders/standard view | `Ctrl-V` |
|
||||
| | |
|
||||
| **Sample list** | |
|
||||
| Add | `Insert` |
|
||||
| Duplicate | `Ctrl-D` |
|
||||
| Create wavetable from selection | `Ctrl-W` |
|
||||
| Open | — |
|
||||
| Open (replace current) | — |
|
||||
| Import raw data | — |
|
||||
| Import raw data (replace current) | — |
|
||||
| Save | — |
|
||||
| Save (raw) | — |
|
||||
| Move up | `Shift-Up` |
|
||||
| Move down | `Shift-Down` |
|
||||
| Delete | — |
|
||||
| Edit | `Shift-Return` |
|
||||
| Cursor up | `Up` |
|
||||
| Cursor down | `Down` |
|
||||
| Preview | — |
|
||||
| Stop preview | — |
|
||||
| Toggle folders/standard view | `Ctrl-V` |
|
||||
| | |
|
||||
| **Orders** | |
|
||||
| Previous order | `Up` |
|
||||
| Next order | `Down` |
|
||||
| Cursor left | `Left` |
|
||||
| Cursor right | `Right` |
|
||||
| Increase value | — |
|
||||
| Decrease value | — |
|
||||
| Switch edit mode | — |
|
||||
| Toggle alter entire row | `Ctrl-L` |
|
||||
| Add | `Insert` |
|
||||
| Duplicate | `Ctrl-D` |
|
||||
| Deep clone | `Ctrl-Shift-D` |
|
||||
| Duplicate to end of song | `Ctrl-E` |
|
||||
| Deep clone to end of song | `Ctrl-Shift-E` |
|
||||
| Remove | `Delete` |
|
||||
| Move up | `Shift-Up` |
|
||||
| Move down | `Shift-Down` |
|
||||
| Replay | — |
|
||||
| | |
|
||||
| **Sample editor** | |
|
||||
| Edit mode: Select | `Shift-I` |
|
||||
| Edit mode: Draw | `Shift-D` |
|
||||
| Cut | `Ctrl-X` |
|
||||
| Copy | `Ctrl-C` |
|
||||
| Paste | `Ctrl-V` |
|
||||
| Paste replace | `Ctrl-Shift-V` |
|
||||
| Paste mix | `Ctrl-Alt-V` |
|
||||
| Select all | `Ctrl-A` |
|
||||
| Resize | `Ctrl-R` |
|
||||
| Resample | `Ctrl-E` |
|
||||
| Amplify | `Ctrl-B` |
|
||||
| Normalize | `Ctrl-N` |
|
||||
| Fade in | `Ctrl-I` |
|
||||
| Fade out | `Ctrl-O` |
|
||||
| Insert silence | `Insert` |
|
||||
| Apply silence | `Shift-Delete` |
|
||||
| Delete | `Delete` |
|
||||
| Trim | `Ctrl-Delete` |
|
||||
| Reverse | `Ctrl-T` |
|
||||
| Invert | `Ctrl-Shift-T` |
|
||||
| Signed/unsigned exchange | `Ctrl-U` |
|
||||
| Apply filter | `Ctrl-F` |
|
||||
| Preview sample | — |
|
||||
| Stop sample preview | — |
|
||||
| Zoom in | `Ctrl-=` |
|
||||
| Zoom out | `Ctrl--` |
|
||||
| Toggle auto-zoom | `Ctrl-0` |
|
||||
| Create instrument from sample | — |
|
||||
| Set loop to selection | `Ctrl-l` |
|
||||
|
||||
## note input
|
||||
|
||||
the settings for note input keybinds operate differently. each entry in the list of keybinds is made of the following:
|
||||
- **Key**: key assignment.
|
||||
- **Type**: type of note input. left-click cycles through "Note", "Note off", "Note release", and "Macro release".
|
||||
- _note:_ the list is sorted by type. on changing a key's type, it will instantly move to its new sorting position!
|
||||
- **Value**: number of semitones above C at the current octave. only appears for note type binds.
|
||||
- **Remove**: removes the keybind from the list.
|
||||
|
||||
below all the binds, select a key from the dropdown list to add it. it will appear at or near the top of the list as a note with value 0.
|
||||
|
|
|
@ -6,10 +6,10 @@ items in _italics_ don't appear in basic mode and are only available in advanced
|
|||
|
||||
# file
|
||||
|
||||
- **new...**: create a new song.
|
||||
- **new...**: creates a new song.
|
||||
- **open...**: opens the file picker, allowing you to select a song to open.
|
||||
- **open recent**: contains a list of the songs you've opened before.
|
||||
- **clear history**: this option erases the file history.
|
||||
- **clear history**: erases the file history.
|
||||
|
||||
- **save**: saves the current song.
|
||||
- opens the file picker if this is a new song, or a backup.
|
||||
|
@ -33,22 +33,16 @@ items in _italics_ don't appear in basic mode and are only available in advanced
|
|||
- Neo Geo CD (DefleMask 1.0+)
|
||||
- only use this option if you really need it. there are features which DefleMask does not support, like some effects and FM macros, so these will be lost.
|
||||
|
||||
- **export audio...**: export your song to a .wav file. see next section for more details.
|
||||
- **export VGM...**: export your song to a .vgm file. see next section for more details.
|
||||
- **export ZSM...**: export your song to a .zsm file. see next section for more details.
|
||||
- **export audio...**: opens the file picker, allowing you to export your song to a .wav file. see next section for more details.
|
||||
- **export VGM...**: opens the file picker, allowing you to export your song to a .vgm file. see next section for more details.
|
||||
- **export ZSM...**: opens the file picker, allowing you to export your song to a .zsm file. see next section for more details.
|
||||
- only available when there's a YM2151 and/or VERA.
|
||||
- **export command stream...**: export song data to a command stream file. see next section for more details.
|
||||
- this option is for developers.
|
||||
|
||||
- _**add chip...**:_ add a chip to the current song.
|
||||
- _**configure chip...**:_ set a chip's parameters.
|
||||
- for a list of parameters, see [7-systems](../7-systems/README.md).
|
||||
- _**change chip...**:_ change a chip to another.
|
||||
- **Preserve channel positions**: enable this option to make sure Furnace does not auto-arrange/delete channels to compensate for differing channel counts. this can be useful for doing ports, e.g. from Genesis to PC-98.
|
||||
- _**remove chip...**_: remove a chip.
|
||||
- **Preserve channel positions**: same thing as above.
|
||||
|
||||
- **restore backup**: restore a previously saved backup.
|
||||
- **manage chips**: opens the [Chip Manager](../8-advanced/chip-manager.md) dialog.
|
||||
|
||||
- **restore backup**: restores a previously saved backup.
|
||||
- Furnace keeps up to 5 backups of a song.
|
||||
- the backup directory is located in:
|
||||
- Windows: `%USERPROFILE%\AppData\Roaming\furnace\backups`
|
||||
|
@ -87,8 +81,8 @@ the following settings exist:
|
|||
- other versions may not support all chips.
|
||||
- use this option if you need to export for a quirky player or parser.
|
||||
- for example, RYMCast is picky with format versions. if you're going to use this player, select 1.60.
|
||||
- **loop**: writes loop. if disabled, the resulting file won't loop.
|
||||
- **loop trail**: this option allows you to set how much of the song is written after it loops.
|
||||
- **loop**: includes loop information. if disabled, the resulting file won't loop.
|
||||
- **loop trail**: sets how much of the song is written after it loops.
|
||||
- the reason this exists is to work around a VGM format limitation in where post-loop state isn't recorded at all.
|
||||
- this may change the song length as it appears on a player.
|
||||
- **auto-detect**: detect how much to write automatically.
|
||||
|
@ -122,6 +116,7 @@ the following settings are available:
|
|||
- I suggest you use the same rate as the song's.
|
||||
- apparently ZSM doesn't support changing the rate mid-song.
|
||||
- **loop**: enables loop. if disabled, the song won't loop.
|
||||
- **optimize size**: removes unnecessary commands to reduce size.
|
||||
|
||||
click on **Begin Export** to... you know.
|
||||
|
||||
|
@ -136,6 +131,8 @@ it's not really useful, unless you're a developer and want to use a command stre
|
|||
|
||||
# edit
|
||||
|
||||
- **...**: does nothing except prevent accidental clicks on later menu items if the menu is too tall to fit on the program window.
|
||||
|
||||
- **undo**: reverts the last action.
|
||||
- **redo**: repeats what you undid previously.
|
||||
|
||||
|
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 42 KiB |
|
@ -1,32 +1,31 @@
|
|||
# settings
|
||||
|
||||
settings are saved when clicking the **OK** button at the bottom of the dialog.
|
||||
|
||||
|
||||
settings are saved when clicking the **OK** or **Apply** buttons at the bottom of the dialog.
|
||||
|
||||
## General
|
||||
|
||||
### Program
|
||||
|
||||
- **Render backend**
|
||||
- changing this may help with performace issues.
|
||||
- **Late render clear**
|
||||
- **Render backend**: changing this may help with performace issues.
|
||||
- **Late render clear**: this option is only useful when using old versions of Mesa drivers. it force-waits for VBlank by clearing after present, reducing latency.
|
||||
- **Power-saving mode**: saves power by lowering the frame rate to 2fps when idle.
|
||||
- may cause issues under Mesa drivers!
|
||||
- **Disable threaded input (restart after changing!)**: processes key presses for note preview on a separate thread (on supported platforms), which reduces latency.
|
||||
- however, crashes have been reported when threaded input is on. enable this option if that is the case.
|
||||
- **Enable event delay**
|
||||
- may cause issues with high-polling-rate mice when previewing notes.
|
||||
- **Enable event delay**: may cause issues with high-polling-rate mice when previewing notes.
|
||||
|
||||
### File
|
||||
|
||||
- **Use system file picker**: uses native OS file dialog instead of Furnace's.
|
||||
- **Number of recent files**: number of files to show in the _open recent..._ menu.
|
||||
- **Compress when saving**
|
||||
- uses zlib to compress saved songs.
|
||||
- **Save unused patterns**
|
||||
- **Use new pattern format when saving**
|
||||
- **Don't apply compatibility flags when loading .dmf**
|
||||
- **Number of recent files**: number of files that will be remembered in the _open recent..._ menu.
|
||||
- **Compress when saving**: uses zlib to compress saved songs.
|
||||
- **Save unused patterns**: stores unused patterns in a saved song.
|
||||
- **Use new pattern format when saving**: stores patterns in the new, optimized and smaller format. only disable if you need to work with older versions of Furnace.
|
||||
- **Don't apply compatibility flags when loading .dmf**: does exactly what the option says. your .dmf songs may not play correctly after enabled.
|
||||
- **Play after opening song:**
|
||||
- No
|
||||
- Only if already playing
|
||||
- Yes
|
||||
- **Audio export loop/fade out time:**
|
||||
- **Set to these values on start-up:**
|
||||
- **Loops**: number of additional times to play through `0Bxx` song loop.
|
||||
|
@ -41,11 +40,10 @@ settings are saved when clicking the **OK** button at the bottom of the dialog.
|
|||
- this will not choose a random system at each start.
|
||||
- **Reset to defaults**: sets default to "Sega Genesis/Mega Drive".
|
||||
- **Name**: name for the default system. may be set to any text.
|
||||
- **Configure:**: same as in the [chip manager](../8-advanced/chip-manager.md) and [mixer](../8-advanced/mixer.md).
|
||||
- **Configure**: same as in the [chip manager](../8-advanced/chip-manager.md) and [mixer](../8-advanced/mixer.md).
|
||||
- **When creating new song**:
|
||||
- **Display system preset selector**
|
||||
- **Start with initial system**
|
||||
- **Restart song when changing chip properties**
|
||||
|
||||
### Start-up
|
||||
|
||||
|
@ -68,57 +66,81 @@ settings are saved when clicking the **OK** button at the bottom of the dialog.
|
|||
|
||||
### Output
|
||||
|
||||
- **Backend**: selects SDL or JACK for audio output.
|
||||
- only appears on Linux, or MacOS compiled with JACK support
|
||||
- **Driver**
|
||||
- **Backend**: selects a different backend for audio output.
|
||||
- SDL: the default one.
|
||||
- JACK: the JACK Audio Connection Kit (low-latency audio server). only appears on Linux, or MacOS compiled with JACK support.
|
||||
- PortAudio: this may or may not perform better than the SDL backend.
|
||||
- **Driver**: select a different audio driver if you're having problems with the default one.
|
||||
- only appears when Backend is SDL.
|
||||
- **Device**: audio device for playback.
|
||||
- **Sample rate**
|
||||
- if using PortAudio backend, devices will be prefixed with the audio API that PortAudio is going to use:
|
||||
- Windows WASAPI: a modern audio API available on Windows Vista and later, featuring an (optional) Exclusive Mode. be noted that your buffer size setting may be ignored.
|
||||
- Windows WDM-KS: low-latency, direct to hardware output mechanism. may not work all the time and prevents your audio device from being used for anything else!
|
||||
- Windows DirectSound: this is the worst choice. best to move on.
|
||||
- MME: an old audio API. doesn't have Exclusive Mode.
|
||||
- Core Audio: the only choice in macOS.
|
||||
- ALSA: low-level audio output on Linux. may prevent other applications from using your audio device.
|
||||
- **Sample rate**: audio output rate.
|
||||
- a lower rate decreases quality and isn't really beneficial.
|
||||
- if using PortAudio backend, be careful about this value.
|
||||
- **Outputs**: number of audio outputs created, up to 16.
|
||||
- only appears when Backend is JACK.
|
||||
- **Channels**: number of output channels to use.
|
||||
- **Channels**: mono, stereo or something.
|
||||
- **Buffer size**: size of buffer in both samples and milliseconds.
|
||||
- setting this to a low value may cause stuttering/glitches in playback (known as "underruns" or "xruns").
|
||||
- setting this to a high value increases latency.
|
||||
- **Exclusive mode**: enables Exclusive Mode, which may offer latency improvements.
|
||||
- only available on WASAPI devices in the PortAudio backend!
|
||||
- **Low-latency mode (experimental!)**: reduces latency by running the engine faster than the tick rate. useful for live playback/jam mode.
|
||||
- _warning:_ experimental! may produce glitches. only enable if your buffer size is small (10ms or less).
|
||||
- **Force mono audio**
|
||||
- only enable if your buffer size is small (10ms or less).
|
||||
- **Force mono audio**: use if you're unable to hear stereo audio (e.g. single speaker or hearing loss in one ear).
|
||||
- **want:** displays requested audio configuration.
|
||||
- **got:** displays actual audio configuration returned by audio backend.
|
||||
|
||||
### Mixing
|
||||
|
||||
- **Quality**: selects quality of resampling. low quality reduces CPU load.
|
||||
- **Quality**: selects quality of resampling. low quality reduces CPU load by a small amount.
|
||||
- **Software clipping**: clips output to nominal range (-1.0 to 1.0) before passing it to the audio device.
|
||||
- this avoids activating Windows' built-in limiter.
|
||||
- this option shall be enabled when using PortAudio backend with a DirectSound device.
|
||||
|
||||
### Metronome
|
||||
|
||||
- **Metronome volume**
|
||||
|
||||
|
||||
|
||||
## MIDI
|
||||
|
||||
### MIDI input
|
||||
|
||||
- **MIDI input**: input device.
|
||||
- **Note input**
|
||||
- **Velocity input**
|
||||
- **Map MIDI channels to direct channels**
|
||||
- **Map Yamaha FM voice data to instruments**
|
||||
- **Program change is instrument selection**
|
||||
- **Value input style**:
|
||||
- **Disabled/custom**
|
||||
- **Two octaves (0 is C-4, F is D#5)**
|
||||
- **Raw (note number is value)**
|
||||
- **Two octaves alternate (lower keys are 0-9, upper keys are A-F)**
|
||||
- **Use dual control change (one for each nibble)**
|
||||
- **CC of upper nibble**
|
||||
- **CC of lower nibble**
|
||||
- **Use 14-bit control change**
|
||||
- **MSB CC**
|
||||
- **LSB CC**
|
||||
- **Use single control change**
|
||||
- **Control**
|
||||
- **Per-column control change**
|
||||
- **Note input**: enables note input. disable if you intend to use this device only for binding actions.
|
||||
- **Velocity input**: enables velocity input when entering notes in the pattern.
|
||||
- **Map MIDI channels to direct channels**: when enabled, notes from MIDI channels will be mapped to channels rather than the cursor position.
|
||||
- **Map Yamaha FM voice data to instruments**: when enabled, Furnace will listen for any transmitted Yamaha SysEx patches.
|
||||
- this option is only useful if you have a Yamaha FM synthesizer (e.g. TX81Z).
|
||||
- selecting a voice or using the "Voice Transmit?" option will send a patch, and Furnace will create a new instrument with its data.
|
||||
- this may also be triggered by clicking on "Receive from TX81Z" in the instrument editor (OPZ only).
|
||||
- **Program change is instrument selection**: changes the current instrument when a program change event is received.
|
||||
- **Value input style**: changes the way values are entered when the pattern cursor is not in the Note column. the following styles are available:
|
||||
- **Disabled/custom**: no value input through MIDI.
|
||||
- **Two octaves (0 is C-4, F is D#5)**: maps keys in two octaves to single nibble input. the layout is:
|
||||
- ` - octave n -- octave n+1 -`
|
||||
- ` 1 3 6 8 A D F # # # `
|
||||
- `0 2 4 5 7 9 B C E # # # # #`
|
||||
- **Raw (note number is value)**: the note number becomes the input value. not useful if you want to input anything above 7F.
|
||||
- **Two octaves alternate (lower keys are 0-9, upper keys are A-F)**: maps keys in two octaves, but with a different layout:
|
||||
- ` - octave n -- octave n+1 -`
|
||||
- ` A B C D E F # # # # `
|
||||
- `0 1 2 3 4 5 6 7 8 9 # # # #`
|
||||
- **Use dual control change (one for each nibble)**: maps two control change events to the nibbles of a value.
|
||||
- **CC of upper nibble**: select the CC number that will change the upper nibble.
|
||||
- **CC of lower nibble**: select the CC number that will change the lower nibble.
|
||||
- **Use 14-bit control change**: maps two control change events that together form a single 14-bit CC. some MIDI controllers do these.
|
||||
- **MSB CC**: select the CC containing the upper portion of the control.
|
||||
- **LSB CC**: select the CC containing the lower portion of the control.
|
||||
- **Use single control change**: maps one control change event. not useful if you want to input odd numbers.
|
||||
- **Control**: select the CC number that will change the value.
|
||||
- **Per-column control change**: when enabled, you can map several control change events to a channel's columns.
|
||||
- **Instrument**\
|
||||
**Volume**\
|
||||
**Effect `x` type**\
|
||||
|
@ -132,36 +154,34 @@ settings are saved when clicking the **OK** button at the bottom of the dialog.
|
|||
- **LSB CC**
|
||||
- **Use single control change (imprecise)**
|
||||
- **Control**
|
||||
- **Volume curve**
|
||||
- **Actions:**
|
||||
- **Volume curve**: adjust the velocity to volume curve.
|
||||
- **Actions**: this allows you to bind note input and control change events to actions.
|
||||
- **`+`** button: adds a new action.
|
||||
- window-with-arrow button: new action with learning! press a button or move a slider/knob/something on your device.
|
||||
- each action has the following:
|
||||
- **Type**
|
||||
- **Channel**
|
||||
- **Note/Control**
|
||||
- **Velocity/Value**
|
||||
- **Action**
|
||||
- **Learn**
|
||||
- **Remove**
|
||||
- **Type**: type of event.
|
||||
- **Channel**: channel of event.
|
||||
- **Note/Control**: the note/control change number.
|
||||
- **Velocity/Value**: the velocity or control value
|
||||
- **Action**: the GUI action to perform.
|
||||
- **Learn**: after clicking on this button, do something in your MIDI device and Furnace will map that to this action.
|
||||
- **Remove**: remove this action.
|
||||
|
||||
### MIDI output
|
||||
|
||||
- **MIDI output**: output device.
|
||||
- **Output mode:**
|
||||
- **Off (use for TX81Z)**
|
||||
- **Melodic**
|
||||
- **Send Program Change**
|
||||
- **Send MIDI clock**
|
||||
- **Send MIDI timecode**
|
||||
- **Timecode frame rate:**
|
||||
- **Closest to Tick Rate**
|
||||
- **Film (24fps)**
|
||||
- **PAL (25fps)**
|
||||
- **NTSC drop (29.97fps)**
|
||||
- **NTSC non-drop (30fps)**
|
||||
|
||||
|
||||
- **Off (use for TX81Z)**: don't output anything. use if you plan to use Furnace as sync master, or the "Receive from TX81Z" button in the OPZ instrument editor.
|
||||
- **Melodic**: output MIDI events.
|
||||
- **Send Program Change**: output program change events when instrument change commands occur.
|
||||
- **Send MIDI clock**: output MIDI beat clock.
|
||||
- **Send MIDI timecode**: output MIDI timecode.
|
||||
- **Timecode frame rate**: sets the timing standard used for MIDI timecode.
|
||||
- **Closest to Tick Rate**: automatically sets the rate based on the song's Tick Rate.
|
||||
- **Film (24fps)**: output at 24 codes per second.
|
||||
- **PAL (25fps)**: output at 25 codes per second.
|
||||
- **NTSC drop (29.97fps)**: output at ~29.97 codes per second, skipping frames 0 and 1 of each minute that doesn't divide by 10.
|
||||
- **NTSC non-drop (30fps)**: output at 30 codes per second.
|
||||
|
||||
## Emulation
|
||||
|
||||
|
@ -174,17 +194,13 @@ settings are saved when clicking the **OK** button at the bottom of the dialog.
|
|||
**FDS core**\
|
||||
**SID core**\
|
||||
**POKEY core**\
|
||||
**OPN/OPNA/OPNB cores**: all of these are covered in the [guide to choosing emulation cores](../9-guides/emulation-cores.md).
|
||||
**OPN/OPNA/OPNB cores**:
|
||||
- **Playback Core(s)**: core(s) to use for realtime playback.
|
||||
- **Render Core(s)**: core(s) to use for exporting audio.
|
||||
- all of these are covered in the [guide to choosing emulation cores](../9-guides/emulation-cores.md).
|
||||
|
||||
- **PC Speaker strategy**: this is covered in the [PC speaker system doc](../7-systems/pcspkr.md).
|
||||
|
||||
- **Sample ROMs:**
|
||||
- **OPL4 YRW801 path**
|
||||
- **MultiPCM TG100 path**
|
||||
- **MultiPCM MU5 path**
|
||||
|
||||
|
||||
|
||||
## Keyboard
|
||||
|
||||
### Keyboard
|
||||
|
@ -192,7 +208,7 @@ settings are saved when clicking the **OK** button at the bottom of the dialog.
|
|||
- **Import**
|
||||
- **Export**
|
||||
- **Reset defaults**
|
||||
- several categories of keybinds...
|
||||
- [grouped list of keybinds...](keyboard.md)
|
||||
- click on a keybind then enter a key or key combination to change it
|
||||
- right-click to clear the keybind
|
||||
|
||||
|
@ -209,6 +225,7 @@ settings are saved when clicking the **OK** button at the bottom of the dialog.
|
|||
- **Allow docking editors**
|
||||
- **Remember window position**: remembers the window's last position on start-up.
|
||||
- **Only allow window movement when clicking on title bar**
|
||||
- **Center pop-up windows**
|
||||
- **Play/edit controls layout:**
|
||||
- **Classic**
|
||||
- **Compact**
|
||||
|
@ -324,6 +341,8 @@ settings are saved when clicking the **OK** button at the bottom of the dialog.
|
|||
- **File path**
|
||||
- **Cursor details or file path**
|
||||
- **Nothing**
|
||||
- **Capitalize menu bar**
|
||||
- **Display add/configure/change/remove chip menus in File menu**: if enabled, the "manage chips" item in the file menu is split into the four listed items for quick access.
|
||||
|
||||
### Orders
|
||||
|
||||
|
@ -396,6 +415,7 @@ settings are saved when clicking the **OK** button at the bottom of the dialog.
|
|||
- **Horizontal instrument list**: when there are more instruments than there is room to display them...
|
||||
- if on, scroll horizontally through multiple columns.
|
||||
- if off, scroll vertically in one long column.
|
||||
- only appears if "Unified instrument/wavetable/sample list" is off.
|
||||
- **Instrument list icon style:**
|
||||
- **None**
|
||||
- **Graphical icons**
|
||||
|
@ -408,10 +428,8 @@ settings are saved when clicking the **OK** button at the bottom of the dialog.
|
|||
|
||||
- **Macro editor layout:**
|
||||
- **Unified**
|
||||
- **Mobile**
|
||||
- **Grid**
|
||||
- **Single (with list)**
|
||||
- **Single (combo box)**
|
||||
- **Use classic macro editor vertical slider**
|
||||
|
||||
### Wave Editor
|
||||
|
|
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 128 KiB |
|
@ -1,6 +1,16 @@
|
|||
# instrument editor
|
||||
|
||||
every instrument can be renamed and have its type changed.
|
||||
the instrument editor always starts with this section:
|
||||
|
||||
![top of instrument editor](instrument-editor-top.png)
|
||||
|
||||
- top-left numeric dropdown: instrument selector.
|
||||
- folder icon: open an instrument file.
|
||||
- save icon: save current instrument as a file.
|
||||
- right-clicking gives the option to save a .dmp format DefleMask preset.
|
||||
- **Name**: instrument name.
|
||||
- **Type**: the system for which the instrument is intended.
|
||||
- if changed, all applicable settings and macros will remain as they are. numbers will not be adjusted.
|
||||
|
||||
depending on the instrument type, there are many different types of instrument editor:
|
||||
|
||||
|
@ -40,8 +50,9 @@ The very first numeric entry sets the visible width of the bars in sequence-type
|
|||
Each macro has two buttons on the left.
|
||||
- Macro type (explained below).
|
||||
- Timing editor, which pops up a small dialog:
|
||||
- Step Length (ticks): Determines how many ticks pass before each change of value.
|
||||
- Delay: Delays the start of the macro until this many ticks have passed.
|
||||
- Step Length (ticks): Determines how many ticks pass before each change of value. Default is 1.
|
||||
- Delay: Delays the start of the macro until this many ticks have passed. Default is 0.
|
||||
- The button is highlighted if either of these is set differently from default.
|
||||
|
||||
## macro types
|
||||
|
||||
|
@ -103,7 +114,7 @@ This tab appears for PC Engine, FDS, Namco WSG, and other wavetable-based instru
|
|||
|
||||
![wavetable tab](wavetable.png)
|
||||
|
||||
When **Enable synthesizer** is off, the only option is to select a wavetable entry with the text entry box beneath the **Wave 1** preview.
|
||||
When **Enable synthesizer** is off, the wavetable used for the instrument may be selected by creating a Waveform macro with a single value.
|
||||
|
||||
To use the wavetable synthesizer, refer to the bottom part of [the wavetable documentation](../5-wave/README.md).
|
||||
|
||||
|
|
|
@ -15,14 +15,17 @@ The OPLL synthesizer is two-operator, meaning it takes two oscillators to produc
|
|||
These apply to the instrument as a whole:
|
||||
- **Feedback (FB)**: Determines how many times operator 1 returns its output to itself. (0-7 range)
|
||||
- **Sustain (SUS)**: enables the sustain flag (sets the release rate to 5)
|
||||
- algorithm: shows the connection of operators (though they are always connected the same way).
|
||||
- Right-click to switch to a preview display of the waveform generated on a new note:
|
||||
- Left-click restarts the preview.
|
||||
- Middle-click pauses and unpauses the preview.
|
||||
- Right-click returns to algorithm view.
|
||||
- **DC (half-sine carrier)**: Sets the waveform produced by carrier operator to half-sine
|
||||
- **DM (half-sine modulator)**: Sets the waveform produced by modulator operator to half-sine
|
||||
|
||||
To the right, there is a drop down menu for OPLL preset instrument selection.
|
||||
- preset dropdown: selects OPLL preset instrument.
|
||||
|
||||
These apply to each operator:
|
||||
- The crossed-arrows button can be dragged to rearrange operators.
|
||||
- The **OP1**, **OP2** buttons enable or disable those operators.
|
||||
- **Amplitude Modulation (AM)**: Makes the operator affected by LFO tremolo.
|
||||
- **Envelope generator sustain flag (EGS)**: When enabled, value of Sustain Level is in effect.
|
||||
- **Attack Rate (AR)**: determines the rising time for the sound. The bigger the value, the faster the attack. (0-15 range)
|
||||
|
|
After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 22 KiB |
|
@ -19,7 +19,15 @@ these tabs are unique to the editor for SNES instruments.
|
|||
- **Effective (exponential decrease)**: after release, volume decays exponentially. see [gain chart](../7-systems/snes.md).
|
||||
- **Delayed (write R on release)**: after release, waits until A and D have completed before starting exponential decrease.
|
||||
|
||||
if envelope is off, select gain mode as described below.
|
||||
if envelope is off:
|
||||
- **Gain Mode**: selects gain mode.
|
||||
- **Direct**: direct gain from 0 to 127
|
||||
- **Decrease (linear)**: linear gain from -0 to -31
|
||||
- **Decrease (logarithmic)**: exponential gain from -0 to -31
|
||||
- **Increase (linear)**: linear gain from +0 to +31
|
||||
- **Increase (bent line)**: exponential gain from +0 to +31
|
||||
- _note:_ using decrease modes will not produce any sound unless a Gain macro is set. The first tick must be the initial gain, and the second tick must be the decrease gain value. gain values are as described in the Macros section below.
|
||||
- **Gain**: value of gain.
|
||||
|
||||
|
||||
|
||||
|
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 58 KiB |
|
@ -27,8 +27,11 @@ Amiga | ≤256 | 256 |
|
|||
|
||||
controls across the top line:
|
||||
- waveform number. the `-` and `+` buttons step through the list.
|
||||
- open.
|
||||
- save.
|
||||
- open. opens a file selector to choose the file to open.
|
||||
- save. opens a file selector to choose the file to save to.
|
||||
- right-clicking brings up a menu:
|
||||
- **save as .dmw...**: saves the selected wavetable in DefleMask format.
|
||||
- **save raw...**: saves the selected wavetable as raw data.
|
||||
- **Steps**: view waveform as discrete blocks.
|
||||
- **Lines**: view waveform as a continuous line.
|
||||
- **Width**: length of the waveform data. maximum is 256.
|
||||
|
@ -84,6 +87,7 @@ these are useful editing tools to fine-tune the waveform:
|
|||
- **Amplify**. changes the volume of the waveform. it will clip at the top and bottom.
|
||||
- **Normalize**: stretches waveform to maximum within the wavetable height.
|
||||
- **Invert**: flips waveform vertically.
|
||||
- **Reverse**: flips waveform horizontally.
|
||||
- **Half**: halves the waveform's frequency by stretching its first half to fill the waveform length.
|
||||
- **Double**: doubles the waveform's frequency by squashing it to half length then repeating it.
|
||||
- **Convert Signed/Unsigned**. worth trying if an imported wave sounds corrupted.
|
||||
|
@ -107,6 +111,7 @@ input waveforms should match the size of the wavetable or unexpected results may
|
|||
- synthesizer type: selects the synthesis algorithm.
|
||||
- waveform displays.
|
||||
- **Wave 1**: selects input waveform.
|
||||
- this will turn yellow to indicate that a Waveform macro is set.
|
||||
- **Wave 2**: selects second input waveform. only appears when a dual-waveform synthesizer is selected.
|
||||
- **Pause preview**: toggles live waveform preview.
|
||||
- **Restart preview**: restarts preview from initial state.
|
||||
|
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 94 KiB |
|
@ -46,7 +46,7 @@ if you need to use more samples, you may change the sample bank using effect `EB
|
|||
|
||||
due to limitations in some of those sound chips, some restrictions exist:
|
||||
|
||||
- Amiga: maximum frequency is 31,469Hz, but anything over 28,867 will sound glitchy on hardware. sample lengths and loop will be set to an even number, and your sample can't be longer than 131070.
|
||||
- Amiga: maximum frequency is 31469Hz, but anything over 28867 will sound glitchy on hardware. sample lengths and loop will be set to an even number, and your sample can't be longer than 131070.
|
||||
- NES: if on DPCM mode, only a limited selection of frequencies is available, and loop position isn't supported (only entire sample).
|
||||
- SegaPCM: your sample can't be longer than 65535, and the maximum frequency is 31.25KHz.
|
||||
- QSound: your sample can't be longer than 65535, and the loop length shall not be greater than 32767.
|
||||
|
@ -75,11 +75,16 @@ in there, you can modify certain data pertaining to your sample, such as the:
|
|||
|
||||
- top-left drop-down box: sample slot.
|
||||
- **Open**: replaces current sample.
|
||||
- Right-clicking brings up a menu:
|
||||
- **import raw...**: brings up a file selector, then presents a dialog to choose the format of the selected file.
|
||||
- **Save**: saves current sample to disk.
|
||||
- Right-clicking brings up a menu:
|
||||
- **save raw...**: brings up a file selector, then saves the sample as raw data.
|
||||
- **Name**: name in sample list.
|
||||
- button to left of **Info**: collapses and expands the info bar.
|
||||
- **Type**: sample format. only 8-bit and 16-bit PCM samples are editable. selecting a format converts the sample data.
|
||||
- **BRR emphasis**: boosts higher frequencies to compensate for the SNES low-pass filter. should not be enabled for BRR-type samples.
|
||||
- **BRR emphasis**: boosts higher frequencies to compensate for the SNES low-pass filter. should not be enabled for BRR-type samples. only appears when applicable.
|
||||
- **8-bit dither**: applies dithering to samples meant to play back at 8-bit resolution. only appears when applicable.
|
||||
|
||||
- **Rate**: switches to normal rate values.
|
||||
- **Compat Rate**: switches to DefleMask-compatible rate values for sample mapping.
|
||||
|
|
|
@ -13,10 +13,8 @@ the YM2413 is equipped with the following features:
|
|||
|
||||
- 9 channels of 2 operator FM synthesis
|
||||
- a drum/percussion mode, replacing the last 3 voices with 5 rhythm channels, with drum mode tones hard-defined in the chip itself, like FM instruments. only pitch might be altered.
|
||||
|
||||
- drum mode works like following: FM channel 7 is for Kick Drum, which is a normal FM channel but routed through mixer twice for 2× volume, like all drum sounds. FM channel 8 splits to Snare, Drum, and Hi-Hat. Snare Drum is the carrier and it works with a special 1 bit noise generator combined with a square wave, all possible by overriding phase-generator with some different synthesis method. Hi-Hat is the modulator and it works with the noise generator and also the special synthesis. CH9 splits to Top-Cymbal and Tom-Tom, Top-Cymbal is the carrier and only has the special synthesis, while Tom-Tom is basically a 1op wave.
|
||||
- special synthesis mentioned already is: 5 square waves are gathered from 4×, 64× and 128× the pitch of channel 8 and 16× and 64× the pitch of channel 9 and they go through a process where 2 HH bits OR'd together, then 1 HH and 1 TC bit OR'd, then the two TC bits OR'd together, and those 3 results get XOR'd.
|
||||
|
||||
- 1 user-definable patch (this patch can be changed throughout the course of the song)
|
||||
- 15 pre-defined patches which can all be used at the same time
|
||||
- support for ADSR on both the modulator and the carrier
|
||||
|
@ -37,7 +35,7 @@ the YM2413 is equipped with the following features:
|
|||
- `y` is the multiplier.
|
||||
- `18xx`: **toggle drums mode.**
|
||||
- `0` disables it and `1` enables it.
|
||||
- only in drums chip.
|
||||
- only in drums mode.
|
||||
- `19xx`: **set attack of all operators.**
|
||||
- `1Axx`: **set attack of operator 1.**
|
||||
- `1Bxx`: **set attack of operator 2.**
|
||||
|
@ -69,3 +67,8 @@ the YM2413 is equipped with the following features:
|
|||
# info
|
||||
|
||||
this chip uses the [FM (OPLL)](../4-instrument/fm-opll.md) instrument editor.
|
||||
|
||||
## chip options
|
||||
|
||||
- **Ignore top/hi-hat frequency changes**: in drums mode, makes the top/hi-hat channels not write frequency since they share it with snare and tom
|
||||
- **Apply fixed frequency to all drums at once**: sets the frequency of all drums to that of a fixed frequency OPLL drums instrument when one note with it is reached
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
# TI SN76489 (e.g. Sega Master System)
|
||||
|
||||
a relatively simple sound chip made by Texas Instruments. a derivative of it is used in Sega's Master System, the predecessor to Genesis.
|
||||
a relatively simple sound chip made by Texas Instruments. a derivative of it is used in Sega's Master System, the predecessor to Genesis. It has three square wave channels and one noise channel... not really.
|
||||
|
||||
Nominal mode of SN76489 has 3 quare wave channels, with noise channel having only 3 preset frequencies to use (absurdly low, very low, low). To use more pitches, one can enable mode, which "steals" pitch data from square wave channel 3. By doing that, SN76489 becomes effectively a 3 channel sound chip. In addition, periodic noise mode can be enabled, with same caveats.
|
||||
|
||||
the original iteration of the SN76489 used in the TI-99/4A computer, the SN94624, could only produce tones as low as 100Hz, and was clocked at 447 KHz. all later versions (such as the one in the Master System and Genesis) had a clock divider but ran on a faster clock... except for the SN76494, which can play notes as low as 13.670 Hz (A -1). consequently, its pitch accuracy for higher notes is compromised.
|
||||
|
||||
|
|
|
@ -184,7 +184,7 @@ this chip uses the [TIA](../4-instrument/tia.md) instrument editor.
|
|||
| 30 | 32.7 | C-1 | 0.0 | 32.5 | C-1 | -11
|
||||
| 31 | 31.7 | B-0 | +44 | 31.5 | B-0 | +33
|
||||
|
||||
## shapes 8
|
||||
## shape 8
|
||||
|
||||
| pitch | NTSC | note | cent | PAL | note | cent
|
||||
|------:|--------:|:----:|-----:|--------:|:----:|-----:
|
||||
|
|
Before Width: | Height: | Size: 164 KiB After Width: | Height: | Size: 165 KiB |
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 125 KiB |
|
@ -2,7 +2,7 @@
|
|||
|
||||
![comments dialog](comments.png)
|
||||
|
||||
Comments, credits, or any arbitrary text may be entered here.
|
||||
Comments, credits, or any arbitrary text may be entered here.\
|
||||
It has no effect on the song.
|
||||
|
||||
There is no word wrap; long lines must be broken manually with the Enter key.
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 54 KiB |
|
@ -29,10 +29,5 @@ Key layout:
|
|||
- **Standard**: Black keys are 2/3 length.
|
||||
- **Continuous**: Black keys are full length.
|
||||
|
||||
Value input pad: (document this)
|
||||
- **Disabled**
|
||||
- **Replace piano**
|
||||
- **Split (automatic)**
|
||||
- **Split (always visible)**
|
||||
|
||||
**Share play/edit offset/range**: (document this)
|
||||
**Share play/edit offset/range**: If disabled, the piano will keep different octave and range values for playback and non-playback states.
|
||||
**Read-only (can't input notes): Prevents note entry.
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 15 KiB |
|
@ -4,4 +4,9 @@ here is a small collection of useful tricks and techniques to really make Furnac
|
|||
|
||||
- [using samples with limited playback rates](limited-samples.md)
|
||||
- [choosing emulation cores](emulation-cores.md)
|
||||
- [guide on using OPLL patch macro](opllswitching.md)
|
||||
- [using OPLL patch macro](opllswitching.md)
|
||||
- [using AY/SAA hardware envelope](envelope.md)
|
||||
|
||||
# links
|
||||
|
||||
- [FM Synthesis of Real Instruments](http://www.javelinart.com/FM_Synthesis_of_Real_Instruments.pdf): an in-depth tutorial on creating FM patches from scratch.
|
|
@ -1,36 +1,36 @@
|
|||
# choosing emulation cores
|
||||
|
||||
Furnace achieves the authentic sound of videogame hardware by emulating sound chips accurately as possible, using **emulator cores**. in some cases there are multiple cores to choose from, each with different strengths and weaknesses. here are the major differences between them all.
|
||||
Furnace achieves the authentic sound of videogame hardware by emulating sound chips as accurately as possible, using **emulator cores**. in some cases there are multiple cores to choose from, each with different strengths and weaknesses. here are the major differences between them all.
|
||||
|
||||
- **Arcade/YM2151 core**:
|
||||
- **ymfm**: default. much less CPU usage than Nuked-OPM, but less accurate. recommended for users with last-gen or earlier hardware.
|
||||
- **Nuked-OPM**: much more accurate than ymfm, due to the emulator being based on an image of the die map taken from a real YM2151. very CPU heavy, only recommended for users with recent hardware.
|
||||
- **ymfm**: default playback core. much less CPU usage than Nuked-OPM, but less accurate. recommended for users with last-gen or earlier hardware.
|
||||
- **Nuked-OPM**: default render core. much more accurate than ymfm, due to the emulator being based on an image of the die map taken from a real YM2151. very CPU heavy, only recommended for users with recent hardware.
|
||||
|
||||
- **Genesis/YM2612 core**:
|
||||
- **Nuked-OPN2**: default. a little lighter on the CPU than Nuked-OPM.
|
||||
- **Nuked-OPN2**: default core. a little lighter on the CPU than Nuked-OPM.
|
||||
- **ymfm**: same as ymfm above.
|
||||
|
||||
- **SN76489 core**:
|
||||
- **MAME**: default. less accurate than Nuked, but with lower CPU usage. comes from the MAME emulator project.
|
||||
- **MAME**: default core. less accurate than Nuked, but with lower CPU usage. comes from the MAME emulator project.
|
||||
- **Nuked-PSG Mod**: more accurate, but not by that much. this originally started as an emulator for the YM7101 PSG sound generator, but was modified to emulate the SN7 as the MAME core was deemed unsatisfactory by some.
|
||||
|
||||
- **NES core**:
|
||||
- **puNES**: default. it comes from a dedicated NES emulator.
|
||||
- **puNES**: default core. it comes from a dedicated NES emulator.
|
||||
- **NSFplay**: higher CPU usage than puNES.
|
||||
|
||||
- **FDS core**:
|
||||
- **puNES**: default. lower CPU usage and far less accurate.
|
||||
- **NSFplay**: higher CPU usage and much more accurate.
|
||||
- **puNES**: default playback core. lower CPU usage and far less accurate.
|
||||
- **NSFplay**: default render core. higher CPU usage and much more accurate.
|
||||
|
||||
- **SID core**:
|
||||
- **reSID**: default. a high quality emulation core. somewhat CPU heavy.
|
||||
- **reSIDfp**: improved version of reSID. the most accurate choice. _extremely_ CPU heavy.
|
||||
- **reSID**: default playback core. a high quality emulation core. somewhat CPU heavy.
|
||||
- **reSIDfp**: default render core. improved version of reSID. the most accurate choice. _extremely_ CPU heavy.
|
||||
- **dSID**: a lightweight open-source core used in DefleMask. not so accurate but it's very CPU light.
|
||||
|
||||
- **POKEY core**:
|
||||
- **Atari800 (mzpokeysnd)**: does not emulate two-tone mode.
|
||||
- **ASAP (C++ port)**: default. the sound core used in the ASAP player. most accurate option.
|
||||
- **ASAP (C++ port)**: default core. the sound core used in the ASAP player. most accurate option.
|
||||
|
||||
- **OPN/OPNA/OPNB cores**:
|
||||
- **ymfm only**: lower CPU usage, less accurate FM.
|
||||
- **Nuked-OPN2 (FM) + ymfm (SSG/ADPCM)**: default. more accurate FM at the cost of more CPU load.
|
||||
- **Nuked-OPN2 (FM) + ymfm (SSG/ADPCM)**: default cores. more accurate FM at the cost of more CPU load.
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
# AY-3-8910 / AY8930 / SAA1099 envelope guide
|
||||
|
||||
The AY-3-8910 programmable sound generator, aside from normal 4-bit volume control, has an hardware volume envelope. This feature that allows for defining the shape of the volume envelope at arbitrary speed according to 8 preset envelope shapes. One may think, what is any upside of hardware envelope? Well, it's somewhat independent of tone/noise generators, and since it goes so high in frequency, it can be used melodically! This guide explains how to make best use of the AY/SAA envelope.
|
||||
|
||||
## AY-3-8910 / AY8930
|
||||
|
||||
In the instrument editor:
|
||||
- Add a single tick to the "Waveform" macro with only `envelope` turned on. This will disable any output, but don't worry.
|
||||
- Add a single tick to the "Envelope" macro and select `enable`.
|
||||
|
||||
If you play a note now, you will hear a very high-pitched squeak. This is because you must set envelope period, which is the frequency at which the hardware envelope runs. You can do it in two ways:
|
||||
- `23xx` and `24xx` effects (envelope coarse and fine period);
|
||||
- `29xx` auto-envelope period effect and macros.
|
||||
|
||||
Auto-envelope works via numerator and denominator. In general, the higher the numerator, the higher the envelope pitch. The higher the denominator, the lower the envelope pitch. Why are there both of these? Because the envelope generator might be used to mask the tone output (i.e. affect the square wave as well). To do it, set the "Waveform" macro values to both `tone` and `envelope`. The higher the denominator value, then the lower the envelope pitch relative to the square wave output, and similarly with the numerator. With the square-and-envelope setting, a lot of wild, detuned synth instruments can be made.
|
||||
|
||||
Back to the hardware envelope itself. Depending on the "Envelope" macro value, different envelope shapes can be obtained. The most basic one, 8, is a sawtooth wave. The `direction` value will invert the envelope, producing the reverse sawtooth. The `alternate` value produces an interesting pseudo-triangular wave, similiar to halved sine. That one can also be reversed. `Hold` option disables the envelope.
|
||||
|
||||
_Warning:_ The envelope pitch resolution is fairly low; at high pitches it will be detuned. Because of this, it's used mostly for bass.
|
||||
|
||||
_Warning_: There is only one hardware envelope generator. You can't use two pitches or two waveforms at once.
|
||||
|
||||
## SAA1099
|
||||
|
||||
SAA envelope works a bit differently. It doesn't have its own pitch; instead, it relies on the channel 2/5 pitch. It also has many more parameters than the AY envelope. To use it:
|
||||
- Go to waveform macro and add a single tick set to 0 (unless you want to have a square wave mask).
|
||||
- Set up an envelope macro. Turn on `enabled`, `loop`, and depending on the desired shape, `cut` and `direction`. `Resolution` will give you higher pitch range than on the AY.
|
||||
- Place two notes in the pattern editor. One in channel 2 will control the envelope pitch. The other in channel 3 can be any note you wish; it's just to enable the envelope output.
|
||||
|
||||
## examples
|
||||
|
||||
- [Demoscene-type Beat by Duccinator](https://www.youtube.com/watch?v=qcBgmpPrlUA)
|
||||
- [Philips SAA1099 Test by Duccinator](https://www.youtube.com/watch?v=IBh2gr09zjs)
|
||||
- [Touhou Kaikidan: Mystic Square title theme by ZUN](https://www.youtube.com/watch?v=tUKei7Pz0Fw): Rare instance of AY envelope used for drums, it can be used to mask the noise generator output too
|
|
@ -1 +1 @@
|
|||
Subproject commit afbcf1e8eafc5d7f27e29c7397f22521eaa33fac
|
||||
Subproject commit e57ca2e3685b160617d3d95fcd9e789c4e06ca88
|
|
@ -720,6 +720,7 @@ namespace IGFD
|
|||
auto arr = IGFD::Utils::SplitStringToVector(fs, ',', false);
|
||||
for (auto a : arr)
|
||||
{
|
||||
infos.firstFilter=a;
|
||||
infos.collectionfilters.emplace(a);
|
||||
}
|
||||
}
|
||||
|
@ -1048,7 +1049,7 @@ namespace IGFD
|
|||
// check if current file extention is covered by current filter
|
||||
// we do that here, for avoid doing that during filelist display
|
||||
// for better fps
|
||||
if (prSelectedFilter.exist(vTag) || prSelectedFilter.filter == ".*")
|
||||
if (prSelectedFilter.exist(vTag) || prSelectedFilter.firstFilter == ".*")
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -745,6 +745,7 @@ namespace IGFD
|
|||
{
|
||||
public:
|
||||
std::string filter;
|
||||
std::string firstFilter;
|
||||
std::set<std::string> collectionfilters;
|
||||
|
||||
public:
|
||||
|
|
|
@ -1114,11 +1114,20 @@ static int u8to16s(wchar_t* dest, const char* src, size_t limit) {
|
|||
int ch, p;
|
||||
char chs;
|
||||
p=0;
|
||||
while (src[p]!=0 && ret<limit) {
|
||||
while (src[p]!=0 && ret<limit-1) {
|
||||
ch=decodeUTF8s((const unsigned char*)&src[p],&chs);
|
||||
dest[ret++]=(unsigned short)ch;
|
||||
// surrogates
|
||||
if (ch>=0x10000) {
|
||||
ch-=0x10000;
|
||||
if (ret+1>=limit-1) break;
|
||||
dest[ret++]=(unsigned short)(0xd800|((ch>>10)&0x3ff));
|
||||
dest[ret++]=(unsigned short)(0xdc00|(ch&0x3ff));
|
||||
} else if (ch<0xd800 || ch>0xdfff) {
|
||||
dest[ret++]=(unsigned short)ch;
|
||||
}
|
||||
p+=chs;
|
||||
}
|
||||
dest[ret]=0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1176,19 +1185,34 @@ dirent_mbstowcs_s(
|
|||
|
||||
static int u16to8s(char* dest, const wchar_t* src, size_t limit) {
|
||||
size_t ret=0;
|
||||
unsigned int next=0;
|
||||
for (; (*src)!=0; src++) {
|
||||
if ((*src)<0x80) {
|
||||
if (ret+1>=limit-1) break;
|
||||
dest[ret++]=(*src);
|
||||
} else if ((*src)<0x800) {
|
||||
if (ret+2>=limit-1) break;
|
||||
dest[ret++]=(0xc0+(((*src)>>6)&31));
|
||||
dest[ret++]=(0x80+((*src)&63));
|
||||
if ((*src)>=0xd800 && (*src)<0xdc00) {
|
||||
next=0x10000+(((*src)&0x3ff)<<10);
|
||||
continue;
|
||||
} else if ((*src)>=0xdc00 && (*src)<0xe000) {
|
||||
next|=(*src)&0x3ff;
|
||||
} else {
|
||||
next=(*src);
|
||||
}
|
||||
if (next<0x80) {
|
||||
if (ret+1>=limit-1) break;
|
||||
dest[ret++]=next;
|
||||
} else if (next<0x800) {
|
||||
if (ret+2>=limit-1) break;
|
||||
dest[ret++]=(0xc0+((next>>6)&31));
|
||||
dest[ret++]=(0x80+(next&63));
|
||||
} else if (next<0x10000) {
|
||||
if (ret+3>=limit-1) break;
|
||||
dest[ret++]=(0xe0+(((*src)>>12)&15));
|
||||
dest[ret++]=(0x80+(((*src)>>6)&63));
|
||||
dest[ret++]=(0x80+((*src)&63));
|
||||
dest[ret++]=(0xe0+((next>>12)&15));
|
||||
dest[ret++]=(0x80+((next>>6)&63));
|
||||
dest[ret++]=(0x80+(next&63));
|
||||
} else {
|
||||
if (ret+4>=limit-1) break;
|
||||
dest[ret++]=(0xf0+((next>>18)&7));
|
||||
dest[ret++]=(0x80+((next>>12)&63));
|
||||
dest[ret++]=(0x80+((next>>6)&63));
|
||||
dest[ret++]=(0x80+(next&63));
|
||||
}
|
||||
}
|
||||
dest[ret]=0;
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
# modified version
|
||||
|
||||
this is a modified version of Dear ImGui to fix UI scaling on macOS, which works in a really weird (but logical) way.
|
||||
this is a modified version of Dear ImGui (docking branch) to suit Furnace.
|
||||
the following changes have been made:
|
||||
|
||||
further modifications may be made to suit Furnace.
|
||||
- fix UI scaling on macOS, Wayland and any other platform where HiDPI is implemented through logical pixels
|
||||
- gradients on frames
|
||||
- improved touch support (inertial scrolling in particular)
|
||||
- disable text input undo/redo by default
|
||||
- add ability to lock dockspace
|
||||
|
|
|
@ -47,10 +47,11 @@
|
|||
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
|
||||
// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_allegro5.h"
|
||||
#include <stdint.h> // uint64_t
|
||||
#include <cstring> // memcpy
|
||||
#include "imgui.h"
|
||||
#include "imgui_impl_allegro5.h"
|
||||
|
||||
// Allegro
|
||||
#include <allegro5/allegro.h>
|
||||
|
@ -603,3 +604,7 @@ void ImGui_ImplAllegro5_NewFrame()
|
|||
// Setup mouse cursor shape
|
||||
ImGui_ImplAllegro5_UpdateMouseCursor();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
struct ALLEGRO_DISPLAY;
|
||||
union ALLEGRO_EVENT;
|
||||
|
@ -30,3 +31,5 @@ IMGUI_IMPL_API bool ImGui_ImplAllegro5_ProcessEvent(ALLEGRO_EVENT* event);
|
|||
// Use if you want to reset your rendering device without losing Dear ImGui state.
|
||||
IMGUI_IMPL_API bool ImGui_ImplAllegro5_CreateDeviceObjects();
|
||||
IMGUI_IMPL_API void ImGui_ImplAllegro5_InvalidateDeviceObjects();
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
// 2021-03-04: Initial version.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_android.h"
|
||||
#include <time.h>
|
||||
#include <android/native_window.h>
|
||||
|
@ -294,3 +295,7 @@ void ImGui_ImplAndroid_NewFrame()
|
|||
io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f / 60.0f);
|
||||
g_Time = current_time;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
// Read online: https://github.com/ocornut/imgui/tree/master/docs
|
||||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
struct ANativeWindow;
|
||||
struct AInputEvent;
|
||||
|
@ -27,3 +29,5 @@ IMGUI_IMPL_API bool ImGui_ImplAndroid_Init(ANativeWindow* window);
|
|||
IMGUI_IMPL_API int32_t ImGui_ImplAndroid_HandleInputEvent(AInputEvent* input_event);
|
||||
IMGUI_IMPL_API void ImGui_ImplAndroid_Shutdown();
|
||||
IMGUI_IMPL_API void ImGui_ImplAndroid_NewFrame();
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
// 2016-05-07: DirectX10: Disabling depth-write.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_dx10.h"
|
||||
|
||||
// DirectX
|
||||
|
@ -713,3 +714,6 @@ void ImGui_ImplDX10_ShutdownPlatformInterface()
|
|||
ImGui::DestroyPlatformWindows();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
struct ID3D10Device;
|
||||
|
||||
|
@ -24,3 +25,5 @@ IMGUI_IMPL_API void ImGui_ImplDX10_RenderDrawData(ImDrawData* draw_data);
|
|||
// Use if you want to reset your rendering device without losing Dear ImGui state.
|
||||
IMGUI_IMPL_API void ImGui_ImplDX10_InvalidateDeviceObjects();
|
||||
IMGUI_IMPL_API bool ImGui_ImplDX10_CreateDeviceObjects();
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
// DISCLAIMER: modified with d3dcompiler patch (see https://github.com/ocornut/imgui/pull/638).
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_dx11.h"
|
||||
|
||||
// DirectX
|
||||
|
@ -747,3 +748,7 @@ static void ImGui_ImplDX11_ShutdownPlatformInterface()
|
|||
{
|
||||
ImGui::DestroyPlatformWindows();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
struct ID3D11Device;
|
||||
struct ID3D11DeviceContext;
|
||||
|
@ -25,3 +26,5 @@ IMGUI_IMPL_API void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data);
|
|||
// Use if you want to reset your rendering device without losing Dear ImGui state.
|
||||
IMGUI_IMPL_API void ImGui_ImplDX11_InvalidateDeviceObjects();
|
||||
IMGUI_IMPL_API bool ImGui_ImplDX11_CreateDeviceObjects();
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
// 2018-02-22: Merged into master with all Win32 code synchronized to other examples.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_dx12.h"
|
||||
|
||||
// DirectX
|
||||
|
@ -1074,3 +1075,7 @@ void ImGui_ImplDX12_ShutdownPlatformInterface()
|
|||
{
|
||||
ImGui::DestroyPlatformWindows();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include <dxgiformat.h> // DXGI_FORMAT
|
||||
|
||||
struct ID3D12Device;
|
||||
|
@ -37,3 +38,5 @@ IMGUI_IMPL_API void ImGui_ImplDX12_RenderDrawData(ImDrawData* draw_data, ID3
|
|||
// Use if you want to reset your rendering device without losing Dear ImGui state.
|
||||
IMGUI_IMPL_API void ImGui_ImplDX12_InvalidateDeviceObjects();
|
||||
IMGUI_IMPL_API bool ImGui_ImplDX12_CreateDeviceObjects();
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_dx9.h"
|
||||
|
||||
// DirectX
|
||||
|
@ -540,3 +541,7 @@ static void ImGui_ImplDX9_InvalidateDeviceObjectsForPlatformWindows()
|
|||
if (platform_io.Viewports[i]->RendererUserData)
|
||||
ImGui_ImplDX9_DestroyWindow(platform_io.Viewports[i]);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
struct IDirect3DDevice9;
|
||||
|
||||
|
@ -24,3 +25,5 @@ IMGUI_IMPL_API void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data);
|
|||
// Use if you want to reset your rendering device without losing Dear ImGui state.
|
||||
IMGUI_IMPL_API bool ImGui_ImplDX9_CreateDeviceObjects();
|
||||
IMGUI_IMPL_API void ImGui_ImplDX9_InvalidateDeviceObjects();
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -22,6 +22,8 @@
|
|||
// CHANGELOG
|
||||
// (minor and older changes stripped away, please see git history for details)
|
||||
// 2023-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
|
||||
// 2023-07-18: Inputs: Revert ignoring mouse data on GLFW_CURSOR_DISABLED as it can be used differently. User may set ImGuiConfigFLags_NoMouse if desired. (#5625, #6609)
|
||||
// 2023-06-12: Accept glfwGetTime() not returning a monotonically increasing value. This seems to happens on some Windows setup when peripherals disconnect, and is likely to also happen on browser + Emscripten. (#6491)
|
||||
// 2023-04-04: Inputs: Added support for io.AddMouseSourceEvent() to discriminate ImGuiMouseSource_Mouse/ImGuiMouseSource_TouchScreen/ImGuiMouseSource_Pen on Windows ONLY, using a custom WndProc hook. (#2702)
|
||||
// 2023-03-16: Inputs: Fixed key modifiers handling on secondary viewports (docking branch). Broken on 2023/01/04. (#6248, #6034)
|
||||
// 2023-03-14: Emscripten: Avoid using glfwGetError() and glfwGetGamepadState() which are not correctly implemented in Emscripten emulation. (#6240)
|
||||
|
@ -32,7 +34,7 @@
|
|||
// 2022-10-18: Perform a dummy glfwGetError() read to cancel missing mouse cursors errors. Using GLFW_VERSION_COMBINED directly. (#5785)
|
||||
// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
|
||||
// 2022-09-26: Inputs: Renamed ImGuiKey_ModXXX introduced in 1.87 to ImGuiMod_XXX (old names still supported).
|
||||
// 2022-09-01: Inputs: Honor GLFW_CURSOR_DISABLED by not setting mouse position.
|
||||
// 2022-09-01: Inputs: Honor GLFW_CURSOR_DISABLED by not setting mouse position *EDIT* Reverted 2023-07-18.
|
||||
// 2022-04-30: Inputs: Fixed ImGui_ImplGlfw_TranslateUntranslatedKey() for lower case letters on OSX.
|
||||
// 2022-03-23: Inputs: Fixed a regression in 1.87 which resulted in keyboard modifiers events being reported incorrectly on Linux/X11.
|
||||
// 2022-02-07: Added ImGui_ImplGlfw_InstallCallbacks()/ImGui_ImplGlfw_RestoreCallbacks() helpers to facilitate user installing callbacks after initializing backend.
|
||||
|
@ -69,6 +71,7 @@
|
|||
// 2016-10-15: Misc: Added a void* user_data parameter to Clipboard function handlers.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_glfw.h"
|
||||
|
||||
// Clang warnings with -Weverything
|
||||
|
@ -418,8 +421,6 @@ void ImGui_ImplGlfw_CursorPosCallback(GLFWwindow* window, double x, double y)
|
|||
ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
|
||||
if (bd->PrevUserCallbackCursorPos != nullptr && ImGui_ImplGlfw_ShouldChainCallback(window))
|
||||
bd->PrevUserCallbackCursorPos(window, x, y);
|
||||
if (glfwGetInputMode(window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED)
|
||||
return;
|
||||
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
||||
|
@ -440,8 +441,6 @@ void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered)
|
|||
ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
|
||||
if (bd->PrevUserCallbackCursorEnter != nullptr && ImGui_ImplGlfw_ShouldChainCallback(window))
|
||||
bd->PrevUserCallbackCursorEnter(window, entered);
|
||||
if (glfwGetInputMode(window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED)
|
||||
return;
|
||||
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
if (entered)
|
||||
|
@ -727,11 +726,6 @@ static void ImGui_ImplGlfw_UpdateMouseData()
|
|||
ImGuiIO& io = ImGui::GetIO();
|
||||
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
||||
|
||||
if (glfwGetInputMode(bd->Window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED)
|
||||
{
|
||||
io.AddMousePosEvent(-FLT_MAX, -FLT_MAX);
|
||||
return;
|
||||
}
|
||||
|
||||
ImGuiID mouse_viewport_id = 0;
|
||||
const ImVec2 mouse_pos_prev = io.MousePos;
|
||||
|
@ -937,7 +931,10 @@ void ImGui_ImplGlfw_NewFrame()
|
|||
ImGui_ImplGlfw_UpdateMonitors();
|
||||
|
||||
// Setup time step
|
||||
// (Accept glfwGetTime() not returning a monotonically increasing value. Seems to happens on disconnecting peripherals and probably on VMs and Emscripten, see #6491, #6189, #6114, #3644)
|
||||
double current_time = glfwGetTime();
|
||||
if (current_time <= bd->Time)
|
||||
current_time = bd->Time + 0.00001f;
|
||||
io.DeltaTime = bd->Time > 0.0 ? (float)(current_time - bd->Time) : (float)(1.0f / 60.0f);
|
||||
bd->Time = current_time;
|
||||
|
||||
|
@ -1285,6 +1282,10 @@ static void ImGui_ImplGlfw_ShutdownPlatformInterface()
|
|||
ImGui::DestroyPlatformWindows();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if defined(__clang__)
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
struct GLFWwindow;
|
||||
struct GLFWmonitor;
|
||||
|
@ -50,3 +51,5 @@ IMGUI_IMPL_API void ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double
|
|||
IMGUI_IMPL_API void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);
|
||||
IMGUI_IMPL_API void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c);
|
||||
IMGUI_IMPL_API void ImGui_ImplGlfw_MonitorCallback(GLFWmonitor* monitor, int event);
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
// 2018-03-22: Added GLUT Platform binding.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_glut.h"
|
||||
#define GL_SILENCE_DEPRECATION
|
||||
#ifdef __APPLE__
|
||||
|
@ -298,3 +299,7 @@ void ImGui_ImplGLUT_MotionFunc(int x, int y)
|
|||
ImGuiIO& io = ImGui::GetIO();
|
||||
io.AddMousePosEvent((float)x, (float)y);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
// Read online: https://github.com/ocornut/imgui/tree/master/docs
|
||||
|
||||
#pragma once
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
|
||||
IMGUI_IMPL_API bool ImGui_ImplGLUT_Init();
|
||||
|
@ -29,7 +30,7 @@ IMGUI_IMPL_API void ImGui_ImplGLUT_NewFrame();
|
|||
|
||||
// You can call ImGui_ImplGLUT_InstallFuncs() to get all those functions installed automatically,
|
||||
// or call them yourself from your own GLUT handlers. We are using the same weird names as GLUT for consistency..
|
||||
//---------------------------------------- GLUT name --------------------------------------------- Decent Name ---------
|
||||
//------------------------------------ GLUT name ---------------------------------------------- Decent Name ---------
|
||||
IMGUI_IMPL_API void ImGui_ImplGLUT_ReshapeFunc(int w, int h); // ~ ResizeFunc
|
||||
IMGUI_IMPL_API void ImGui_ImplGLUT_MotionFunc(int x, int y); // ~ MouseMoveFunc
|
||||
IMGUI_IMPL_API void ImGui_ImplGLUT_MouseFunc(int button, int state, int x, int y); // ~ MouseButtonFunc
|
||||
|
@ -38,3 +39,5 @@ IMGUI_IMPL_API void ImGui_ImplGLUT_KeyboardFunc(unsigned char c, int x, int
|
|||
IMGUI_IMPL_API void ImGui_ImplGLUT_KeyboardUpFunc(unsigned char c, int x, int y); // ~ CharReleasedFunc
|
||||
IMGUI_IMPL_API void ImGui_ImplGLUT_SpecialFunc(int key, int x, int y); // ~ KeyPressedFunc
|
||||
IMGUI_IMPL_API void ImGui_ImplGLUT_SpecialUpFunc(int key, int x, int y); // ~ KeyReleasedFunc
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
// Read online: https://github.com/ocornut/imgui/tree/master/docs
|
||||
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// ObjC API
|
||||
|
@ -63,3 +64,7 @@ IMGUI_IMPL_API void ImGui_ImplMetal_DestroyDeviceObjects();
|
|||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
// 2018-07-05: Metal: Added new Metal backend implementation.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_metal.h"
|
||||
#import <time.h>
|
||||
#import <Metal/Metal.h>
|
||||
|
@ -740,3 +741,7 @@ static void ImGui_ImplMetal_InvalidateDeviceObjectsForPlatformWindows()
|
|||
}
|
||||
|
||||
@end
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -39,12 +39,9 @@
|
|||
// 2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_opengl2.h"
|
||||
#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
|
||||
#include <stddef.h> // intptr_t
|
||||
#else
|
||||
#include <stdint.h> // intptr_t
|
||||
#endif
|
||||
|
||||
// Clang/GCC warnings with -Weverything
|
||||
#if defined(__clang__)
|
||||
|
@ -305,6 +302,7 @@ void ImGui_ImplOpenGL2_DestroyDeviceObjects()
|
|||
ImGui_ImplOpenGL2_DestroyFontsTexture();
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------
|
||||
// MULTI-VIEWPORT / PLATFORM INTERFACE SUPPORT
|
||||
// This is an _advanced_ and _optional_ feature, allowing the backend to create and handle multiple viewports simultaneously.
|
||||
|
@ -333,6 +331,10 @@ static void ImGui_ImplOpenGL2_ShutdownPlatformInterface()
|
|||
ImGui::DestroyPlatformWindows();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if defined(__clang__)
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID!
|
||||
// [X] Renderer: Multi-viewport support (multiple windows). Enable with 'io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable'.
|
||||
|
||||
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||||
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||||
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
||||
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
|
||||
// Read online: https://github.com/ocornut/imgui/tree/master/docs
|
||||
|
@ -20,6 +20,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
IMGUI_IMPL_API bool ImGui_ImplOpenGL2_Init();
|
||||
IMGUI_IMPL_API void ImGui_ImplOpenGL2_Shutdown();
|
||||
|
@ -31,3 +32,5 @@ IMGUI_IMPL_API bool ImGui_ImplOpenGL2_CreateFontsTexture();
|
|||
IMGUI_IMPL_API void ImGui_ImplOpenGL2_DestroyFontsTexture();
|
||||
IMGUI_IMPL_API bool ImGui_ImplOpenGL2_CreateDeviceObjects();
|
||||
IMGUI_IMPL_API void ImGui_ImplOpenGL2_DestroyDeviceObjects();
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
// CHANGELOG
|
||||
// (minor and older changes stripped away, please see git history for details)
|
||||
// 2023-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
|
||||
// 2023-06-20: OpenGL: Fixed erroneous use glGetIntegerv(GL_CONTEXT_PROFILE_MASK) on contexts lower than 3.2. (#6539, #6333)
|
||||
// 2023-05-09: OpenGL: Support for glBindSampler() backup/restore on ES3. (#6375)
|
||||
// 2023-04-18: OpenGL: Restore front and back polygon mode separately when supported by context. (#6333)
|
||||
// 2023-03-23: OpenGL: Properly restoring "no shader program bound" if it was the case prior to running the rendering function. (#6267, #6220, #6224)
|
||||
|
@ -105,13 +106,10 @@
|
|||
#endif
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_opengl3.h"
|
||||
#include <stdio.h>
|
||||
#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
|
||||
#include <stddef.h> // intptr_t
|
||||
#else
|
||||
#include <stdint.h> // intptr_t
|
||||
#endif
|
||||
#if defined(__APPLE__)
|
||||
#include <TargetConditionals.h>
|
||||
#endif
|
||||
|
@ -292,7 +290,12 @@ bool ImGui_ImplOpenGL3_Init(const char* glsl_version)
|
|||
io.BackendRendererName = "imgui_impl_opengl3";
|
||||
|
||||
// Query for GL version (e.g. 320 for GL 3.2)
|
||||
#if !defined(IMGUI_IMPL_OPENGL_ES2)
|
||||
#if defined(IMGUI_IMPL_OPENGL_ES2)
|
||||
// GLES 2
|
||||
bd->GlVersion = 200;
|
||||
bd->GlProfileIsES2 = true;
|
||||
#else
|
||||
// Desktop or GLES 3
|
||||
GLint major = 0;
|
||||
GLint minor = 0;
|
||||
glGetIntegerv(GL_MAJOR_VERSION, &major);
|
||||
|
@ -305,10 +308,15 @@ bool ImGui_ImplOpenGL3_Init(const char* glsl_version)
|
|||
}
|
||||
bd->GlVersion = (GLuint)(major * 100 + minor * 10);
|
||||
#if defined(GL_CONTEXT_PROFILE_MASK)
|
||||
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &bd->GlProfileMask);
|
||||
if (bd->GlVersion >= 320)
|
||||
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &bd->GlProfileMask);
|
||||
bd->GlProfileIsCompat = (bd->GlProfileMask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) != 0;
|
||||
#endif
|
||||
|
||||
#if defined(IMGUI_IMPL_OPENGL_ES3)
|
||||
bd->GlProfileIsES3 = true;
|
||||
#endif
|
||||
|
||||
bd->UseBufferSubData = false;
|
||||
/*
|
||||
// Query vendor to enable glBufferSubData kludge
|
||||
|
@ -318,16 +326,10 @@ bool ImGui_ImplOpenGL3_Init(const char* glsl_version)
|
|||
bd->UseBufferSubData = true;
|
||||
#endif
|
||||
*/
|
||||
#elif defined(IMGUI_IMPL_OPENGL_ES2)
|
||||
bd->GlVersion = 200; // GLES 2
|
||||
bd->GlProfileIsES2 = true;
|
||||
#elif defined(IMGUI_IMPL_OPENGL_ES3)
|
||||
bd->GlVersion = 200; // Don't raise version as it is intended as a desktop version check for now.
|
||||
bd->GlProfileIsES3 = true;
|
||||
#endif
|
||||
|
||||
#ifdef IMGUI_IMPL_OPENGL_DEBUG
|
||||
logD("\nGL_VENDOR = '%s'\nGL_RENDERER = '%s'\n", (const char*)glGetString(GL_VENDOR), (const char*)glGetString(GL_RENDERER)); // [DEBUG]
|
||||
printf("GlVersion = %d\nGlProfileIsCompat = %d\nGlProfileMask = 0x%X\nGlProfileIsES2 = %d, GlProfileIsES3 = %d\nGL_VENDOR = '%s'\nGL_RENDERER = '%s'\n", bd->GlVersion, bd->GlProfileIsCompat, bd->GlProfileMask, bd->GlProfileIsES2, bd->GlProfileIsES3, (const char*)glGetString(GL_VENDOR), (const char*)glGetString(GL_RENDERER)); // [DEBUG]
|
||||
#endif
|
||||
|
||||
#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET
|
||||
|
@ -979,9 +981,13 @@ static void ImGui_ImplOpenGL3_ShutdownPlatformInterface()
|
|||
ImGui::DestroyPlatformWindows();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
#if defined(__clang__)
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
// Backend API
|
||||
IMGUI_IMPL_API bool ImGui_ImplOpenGL3_Init(const char* glsl_version = nullptr);
|
||||
|
@ -59,3 +60,5 @@ IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyDeviceObjects();
|
|||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
// Read online: https://github.com/ocornut/imgui/tree/master/docs
|
||||
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
#ifdef __OBJC__
|
||||
|
||||
|
@ -44,3 +45,5 @@ IMGUI_IMPL_API void ImGui_ImplOSX_NewFrame(void* _Nullable view);
|
|||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
// Read online: https://github.com/ocornut/imgui/tree/master/docs
|
||||
|
||||
#import "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#import "imgui_impl_osx.h"
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <Carbon/Carbon.h>
|
||||
|
@ -1109,3 +1110,7 @@ static void ImGui_ImplOSX_ShutdownPlatformInterface()
|
|||
main_viewport->PlatformUserData = nullptr;
|
||||
ImGui::DestroyPlatformWindows();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -77,6 +77,7 @@
|
|||
// 2016-10-15: Misc: Added a void* user_data parameter to Clipboard function handlers.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_sdl2.h"
|
||||
#include <stdio.h>
|
||||
#include <cmath>
|
||||
|
@ -321,14 +322,8 @@ bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event)
|
|||
mouse_pos.y += window_y;
|
||||
}
|
||||
// Fix for high DPI mac/idevice/wayland
|
||||
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
||||
if (!platform_io.Monitors.empty() && platform_io.Monitors[0].DpiScale > 1.0f)
|
||||
{
|
||||
// The Framebuffer is scaled by an integer ceiling of the actual ratio, so 2.0 not 1.685 on Mac!
|
||||
//printf("multiply by %f\n",platform_io.Monitors[0].DpiScale);
|
||||
mouse_pos.x *= std::ceil(platform_io.Monitors[0].DpiScale);
|
||||
mouse_pos.y *= std::ceil(platform_io.Monitors[0].DpiScale);
|
||||
}
|
||||
mouse_pos.x *= io.InputScale;
|
||||
mouse_pos.y *= io.InputScale;
|
||||
io.AddMouseSourceEvent(event->motion.which == SDL_TOUCH_MOUSEID ? ImGuiMouseSource_TouchScreen : ImGuiMouseSource_Mouse);
|
||||
io.AddMousePosEvent(mouse_pos.x, mouse_pos.y);
|
||||
return true;
|
||||
|
@ -626,13 +621,8 @@ static void ImGui_ImplSDL2_UpdateMouseData()
|
|||
mouse_y -= window_y;
|
||||
}
|
||||
// Fix for high DPI mac/idevice/wayland
|
||||
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
||||
if (!platform_io.Monitors.empty() && platform_io.Monitors[0].DpiScale > 1.0f)
|
||||
{
|
||||
// The Framebuffer is scaled by an integer ceiling of the actual ratio, so 2.0 not 1.685 on Mac!
|
||||
mouse_x *= std::ceil(platform_io.Monitors[0].DpiScale);
|
||||
mouse_y *= std::ceil(platform_io.Monitors[0].DpiScale);
|
||||
}
|
||||
mouse_x *= io.InputScale;
|
||||
mouse_y *= io.InputScale;
|
||||
io.AddMousePosEvent((float)mouse_x, (float)mouse_y);
|
||||
}
|
||||
}
|
||||
|
@ -792,7 +782,7 @@ void ImGui_ImplSDL2_NewFrame()
|
|||
io.DisplayFramebufferScale = ImVec2(1.0f, 1.0f);
|
||||
io.DisplaySize = ImVec2((float)display_w, (float)display_h);
|
||||
//printf("write %d/%d to DpiScale\n",display_w,w);
|
||||
platform_io.Monitors[0].DpiScale=(float)display_w/(float)w;
|
||||
io.InputScale=(float)display_w/(float)w;
|
||||
}
|
||||
|
||||
// Setup time step (we don't use SDL_GetTicks() because it is using millisecond resolution)
|
||||
|
@ -1072,6 +1062,10 @@ static void ImGui_ImplSDL2_ShutdownPlatformInterface()
|
|||
ImGui::DestroyPlatformWindows();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if defined(__clang__)
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
struct SDL_Window;
|
||||
struct SDL_Renderer;
|
||||
|
@ -37,3 +38,5 @@ IMGUI_IMPL_API bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event);
|
|||
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
|
||||
static inline void ImGui_ImplSDL2_NewFrame(SDL_Window*) { ImGui_ImplSDL2_NewFrame(); } // 1.84: removed unnecessary parameter
|
||||
#endif
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
// 2023-02-07: Forked "imgui_impl_sdl2" into "imgui_impl_sdl3". Removed version checks for old feature. Refer to imgui_impl_sdl2.cpp for older changelog.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_sdl3.h"
|
||||
|
||||
// Clang warnings with -Weverything
|
||||
|
@ -752,7 +753,7 @@ static void ImGui_ImplSDL3_CreateWindow(ImGuiViewport* viewport)
|
|||
sdl_flags |= (viewport->Flags & ImGuiViewportFlags_NoDecoration) ? 0 : SDL_WINDOW_RESIZABLE;
|
||||
#if !defined(_WIN32)
|
||||
// See SDL hack in ImGui_ImplSDL3_ShowWindow().
|
||||
sdl_flags |= (viewport->Flags & ImGuiViewportFlags_NoTaskBarIcon) ? SDL_WINDOW_SKIP_TASKBAR : 0;
|
||||
sdl_flags |= (viewport->Flags & ImGuiViewportFlags_NoTaskBarIcon) ? SDL_WINDOW_UTILITY : 0;
|
||||
#endif
|
||||
sdl_flags |= (viewport->Flags & ImGuiViewportFlags_TopMost) ? SDL_WINDOW_ALWAYS_ON_TOP : 0;
|
||||
vd->Window = SDL_CreateWindow("No Title Yet", (int)viewport->Size.x, (int)viewport->Size.y, sdl_flags);
|
||||
|
@ -801,7 +802,7 @@ static void ImGui_ImplSDL3_ShowWindow(ImGuiViewport* viewport)
|
|||
HWND hwnd = (HWND)viewport->PlatformHandleRaw;
|
||||
|
||||
// SDL hack: Hide icon from task bar
|
||||
// Note: SDL 2.0.6+ has a SDL_WINDOW_SKIP_TASKBAR flag which is supported under Windows but the way it create the window breaks our seamless transition.
|
||||
// Note: SDL 3.0.0+ has a SDL_WINDOW_UTILITY flag which is supported under Windows but the way it create the window breaks our seamless transition.
|
||||
if (viewport->Flags & ImGuiViewportFlags_NoTaskBarIcon)
|
||||
{
|
||||
LONG ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
|
||||
|
@ -944,6 +945,10 @@ static void ImGui_ImplSDL3_ShutdownPlatformInterface()
|
|||
ImGui::DestroyPlatformWindows();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if defined(__clang__)
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
struct SDL_Window;
|
||||
struct SDL_Renderer;
|
||||
|
@ -34,3 +35,5 @@ IMGUI_IMPL_API bool ImGui_ImplSDL3_InitForSDLRenderer(SDL_Window* window, SD
|
|||
IMGUI_IMPL_API void ImGui_ImplSDL3_Shutdown();
|
||||
IMGUI_IMPL_API void ImGui_ImplSDL3_NewFrame();
|
||||
IMGUI_IMPL_API bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event);
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -26,12 +26,9 @@
|
|||
// 2021-09-21: Initial version.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_sdlrenderer2.h"
|
||||
#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
|
||||
#include <stddef.h> // intptr_t
|
||||
#else
|
||||
#include <stdint.h> // intptr_t
|
||||
#endif
|
||||
|
||||
// Clang warnings with -Weverything
|
||||
#if defined(__clang__)
|
||||
|
@ -260,6 +257,10 @@ void ImGui_ImplSDLRenderer2_DestroyDeviceObjects()
|
|||
ImGui_ImplSDLRenderer2_DestroyFontsTexture();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if defined(__clang__)
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
// [ ] Renderer: Multi-viewport support (multiple windows).
|
||||
|
||||
#pragma once
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
|
||||
struct SDL_Renderer;
|
||||
|
@ -28,3 +29,5 @@ IMGUI_IMPL_API bool ImGui_ImplSDLRenderer2_CreateFontsTexture();
|
|||
IMGUI_IMPL_API void ImGui_ImplSDLRenderer2_DestroyFontsTexture();
|
||||
IMGUI_IMPL_API bool ImGui_ImplSDLRenderer2_CreateDeviceObjects();
|
||||
IMGUI_IMPL_API void ImGui_ImplSDLRenderer2_DestroyDeviceObjects();
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -21,12 +21,9 @@
|
|||
// 2023-05-30: Initial version.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_sdlrenderer3.h"
|
||||
#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
|
||||
#include <stddef.h> // intptr_t
|
||||
#else
|
||||
#include <stdint.h> // intptr_t
|
||||
#endif
|
||||
|
||||
// Clang warnings with -Weverything
|
||||
#if defined(__clang__)
|
||||
|
@ -253,6 +250,10 @@ void ImGui_ImplSDLRenderer3_DestroyDeviceObjects()
|
|||
ImGui_ImplSDLRenderer3_DestroyFontsTexture();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#if defined(__clang__)
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
struct SDL_Renderer;
|
||||
|
||||
|
@ -28,3 +29,5 @@ IMGUI_IMPL_API bool ImGui_ImplSDLRenderer3_CreateFontsTexture();
|
|||
IMGUI_IMPL_API void ImGui_ImplSDLRenderer3_DestroyFontsTexture();
|
||||
IMGUI_IMPL_API bool ImGui_ImplSDLRenderer3_CreateDeviceObjects();
|
||||
IMGUI_IMPL_API void ImGui_ImplSDLRenderer3_DestroyDeviceObjects();
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
// CHANGELOG
|
||||
// (minor and older changes stripped away, please see git history for details)
|
||||
// 2023-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
|
||||
// 2023-07-04: Vulkan: Added optional support for VK_KHR_dynamic_rendering. User needs to set init_info->UseDynamicRendering = true and init_info->ColorAttachmentFormat.
|
||||
// 2023-01-02: Vulkan: Fixed sampler passed to ImGui_ImplVulkan_AddTexture() not being honored + removed a bunch of duplicate code.
|
||||
// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
|
||||
// 2022-10-04: Vulkan: Added experimental ImGui_ImplVulkan_RemoveTexture() for api symetry. (#914, #5738).
|
||||
|
@ -67,6 +68,8 @@
|
|||
// 2016-10-18: Vulkan: Add location decorators & change to use structs as in/out in glsl, update embedded spv (produced with glslangValidator -x). Null the released resources.
|
||||
// 2016-08-27: Vulkan: Fix Vulkan example for use when a depth buffer is active.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_vulkan.h"
|
||||
#include <stdio.h>
|
||||
|
||||
|
@ -238,6 +241,12 @@ IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_DEF)
|
|||
#undef IMGUI_VULKAN_FUNC_DEF
|
||||
#endif // VK_NO_PROTOTYPES
|
||||
|
||||
#if defined(VK_VERSION_1_3) || defined(VK_KHR_dynamic_rendering)
|
||||
#define IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
||||
static PFN_vkCmdBeginRenderingKHR ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR;
|
||||
static PFN_vkCmdEndRenderingKHR ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR;
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SHADERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -872,6 +881,19 @@ static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationC
|
|||
info.layout = bd->PipelineLayout;
|
||||
info.renderPass = renderPass;
|
||||
info.subpass = subpass;
|
||||
|
||||
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
||||
VkPipelineRenderingCreateInfoKHR pipelineRenderingCreateInfo = {};
|
||||
pipelineRenderingCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR;
|
||||
pipelineRenderingCreateInfo.colorAttachmentCount = 1;
|
||||
pipelineRenderingCreateInfo.pColorAttachmentFormats = &bd->VulkanInitInfo.ColorAttachmentFormat;
|
||||
if (bd->VulkanInitInfo.UseDynamicRendering)
|
||||
{
|
||||
info.pNext = &pipelineRenderingCreateInfo;
|
||||
info.renderPass = VK_NULL_HANDLE; // Just make sure it's actually nullptr.
|
||||
}
|
||||
#endif
|
||||
|
||||
VkResult err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &info, allocator, pipeline);
|
||||
check_vk_result(err);
|
||||
}
|
||||
|
@ -984,10 +1006,17 @@ bool ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const ch
|
|||
return false;
|
||||
IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_LOAD)
|
||||
#undef IMGUI_VULKAN_FUNC_LOAD
|
||||
|
||||
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
||||
// Manually load those two (see #5446)
|
||||
ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR = reinterpret_cast<PFN_vkCmdBeginRenderingKHR>(loader_func("vkCmdBeginRenderingKHR", user_data));
|
||||
ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR = reinterpret_cast<PFN_vkCmdEndRenderingKHR>(loader_func("vkCmdEndRenderingKHR", user_data));
|
||||
#endif
|
||||
#else
|
||||
IM_UNUSED(loader_func);
|
||||
IM_UNUSED(user_data);
|
||||
#endif
|
||||
|
||||
g_FunctionsLoaded = true;
|
||||
return true;
|
||||
}
|
||||
|
@ -996,6 +1025,20 @@ bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass rend
|
|||
{
|
||||
IM_ASSERT(g_FunctionsLoaded && "Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set!");
|
||||
|
||||
if (info->UseDynamicRendering)
|
||||
{
|
||||
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
||||
#ifndef VK_NO_PROTOTYPES
|
||||
ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR = reinterpret_cast<PFN_vkCmdBeginRenderingKHR>(vkGetInstanceProcAddr(info->Instance, "vkCmdBeginRenderingKHR"));
|
||||
ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR = reinterpret_cast<PFN_vkCmdEndRenderingKHR>(vkGetInstanceProcAddr(info->Instance, "vkCmdEndRenderingKHR"));
|
||||
#endif
|
||||
IM_ASSERT(ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR != nullptr);
|
||||
IM_ASSERT(ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR != nullptr);
|
||||
#else
|
||||
IM_ASSERT(0 && "Can't use dynamic rendering when neither VK_VERSION_1_3 or VK_KHR_dynamic_rendering is defined.");
|
||||
#endif
|
||||
}
|
||||
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
|
||||
|
||||
|
@ -1013,7 +1056,8 @@ bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass rend
|
|||
IM_ASSERT(info->DescriptorPool != VK_NULL_HANDLE);
|
||||
IM_ASSERT(info->MinImageCount >= 2);
|
||||
IM_ASSERT(info->ImageCount >= info->MinImageCount);
|
||||
IM_ASSERT(render_pass != VK_NULL_HANDLE);
|
||||
if (info->UseDynamicRendering == false)
|
||||
IM_ASSERT(render_pass != VK_NULL_HANDLE);
|
||||
|
||||
bd->VulkanInitInfo = *info;
|
||||
bd->RenderPass = render_pass;
|
||||
|
@ -1350,6 +1394,7 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V
|
|||
vkDestroySwapchainKHR(device, old_swapchain, allocator);
|
||||
|
||||
// Create the Render Pass
|
||||
if (wd->UseDynamicRendering == false)
|
||||
{
|
||||
VkAttachmentDescription attachment = {};
|
||||
attachment.format = wd->SurfaceFormat.format;
|
||||
|
@ -1412,6 +1457,7 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V
|
|||
}
|
||||
|
||||
// Create Framebuffer
|
||||
if (wd->UseDynamicRendering == false)
|
||||
{
|
||||
VkImageView attachment[1];
|
||||
VkFramebufferCreateInfo info = {};
|
||||
|
@ -1553,6 +1599,7 @@ static void ImGui_ImplVulkan_CreateWindow(ImGuiViewport* viewport)
|
|||
|
||||
// Create SwapChain, RenderPass, Framebuffer, etc.
|
||||
wd->ClearEnable = (viewport->Flags & ImGuiViewportFlags_NoRendererClear) ? false : true;
|
||||
wd->UseDynamicRendering = v->UseDynamicRendering;
|
||||
ImGui_ImplVulkanH_CreateOrResizeWindow(v->Instance, v->PhysicalDevice, v->Device, wd, v->QueueFamily, v->Allocator, (int)viewport->Size.x, (int)viewport->Size.y, v->MinImageCount);
|
||||
vd->WindowOwned = true;
|
||||
}
|
||||
|
@ -1618,7 +1665,45 @@ static void ImGui_ImplVulkan_RenderWindow(ImGuiViewport* viewport, void*)
|
|||
{
|
||||
ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
memcpy(&wd->ClearValue.color.float32[0], &clear_color, 4 * sizeof(float));
|
||||
}
|
||||
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
||||
if (v->UseDynamicRendering)
|
||||
{
|
||||
// Transition swapchain image to a layout suitable for drawing.
|
||||
VkImageMemoryBarrier barrier = {};
|
||||
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
||||
barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||
barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
barrier.image = fd->Backbuffer;
|
||||
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
barrier.subresourceRange.levelCount = 1;
|
||||
barrier.subresourceRange.layerCount = 1;
|
||||
vkCmdPipelineBarrier(fd->CommandBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, nullptr, 0, nullptr, 1, &barrier);
|
||||
|
||||
VkRenderingAttachmentInfo attachmentInfo = {};
|
||||
attachmentInfo.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
|
||||
attachmentInfo.imageView = fd->BackbufferView;
|
||||
attachmentInfo.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
attachmentInfo.resolveMode = VK_RESOLVE_MODE_NONE;
|
||||
attachmentInfo.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||
attachmentInfo.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||
attachmentInfo.clearValue = wd->ClearValue;
|
||||
|
||||
VkRenderingInfo renderingInfo = {};
|
||||
renderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR;
|
||||
renderingInfo.renderArea.extent.width = wd->Width;
|
||||
renderingInfo.renderArea.extent.height = wd->Height;
|
||||
renderingInfo.layerCount = 1;
|
||||
renderingInfo.viewMask = 0;
|
||||
renderingInfo.colorAttachmentCount = 1;
|
||||
renderingInfo.pColorAttachments = &attachmentInfo;
|
||||
|
||||
ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR(fd->CommandBuffer, &renderingInfo);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
VkRenderPassBeginInfo info = {};
|
||||
info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
||||
info.renderPass = wd->RenderPass;
|
||||
|
@ -1634,7 +1719,28 @@ static void ImGui_ImplVulkan_RenderWindow(ImGuiViewport* viewport, void*)
|
|||
ImGui_ImplVulkan_RenderDrawData(viewport->DrawData, fd->CommandBuffer, wd->Pipeline);
|
||||
|
||||
{
|
||||
vkCmdEndRenderPass(fd->CommandBuffer);
|
||||
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
||||
if (v->UseDynamicRendering)
|
||||
{
|
||||
ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR(fd->CommandBuffer);
|
||||
|
||||
// Transition image to a layout suitable for presentation
|
||||
VkImageMemoryBarrier barrier = {};
|
||||
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
||||
barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||
barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
||||
barrier.image = fd->Backbuffer;
|
||||
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
barrier.subresourceRange.levelCount = 1;
|
||||
barrier.subresourceRange.layerCount = 1;
|
||||
vkCmdPipelineBarrier(fd->CommandBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1, &barrier);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
vkCmdEndRenderPass(fd->CommandBuffer);
|
||||
}
|
||||
{
|
||||
VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||
VkSubmitInfo info = {};
|
||||
|
@ -1701,3 +1807,7 @@ void ImGui_ImplVulkan_ShutdownPlatformInterface()
|
|||
{
|
||||
ImGui::DestroyPlatformWindows();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
// Read comments in imgui_impl_vulkan.h.
|
||||
|
||||
#pragma once
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
|
||||
// [Configuration] in order to use a custom Vulkan function loader:
|
||||
|
@ -60,6 +61,12 @@ struct ImGui_ImplVulkan_InitInfo
|
|||
uint32_t MinImageCount; // >= 2
|
||||
uint32_t ImageCount; // >= MinImageCount
|
||||
VkSampleCountFlagBits MSAASamples; // >= VK_SAMPLE_COUNT_1_BIT (0 -> default to VK_SAMPLE_COUNT_1_BIT)
|
||||
|
||||
// Dynamic Rendering (Optional)
|
||||
bool UseDynamicRendering; // Need to explicitly enable VK_KHR_dynamic_rendering extension to use this, even for Vulkan 1.3.
|
||||
VkFormat ColorAttachmentFormat; // Required for dynamic rendering
|
||||
|
||||
// Allocation, Debugging
|
||||
const VkAllocationCallbacks* Allocator;
|
||||
void (*CheckVkResultFn)(VkResult err);
|
||||
};
|
||||
|
@ -140,6 +147,7 @@ struct ImGui_ImplVulkanH_Window
|
|||
VkPresentModeKHR PresentMode;
|
||||
VkRenderPass RenderPass;
|
||||
VkPipeline Pipeline; // The window pipeline may uses a different VkRenderPass than the one passed in ImGui_ImplVulkan_InitInfo
|
||||
bool UseDynamicRendering;
|
||||
bool ClearEnable;
|
||||
VkClearValue ClearValue;
|
||||
uint32_t FrameIndex; // Current frame being rendered to (0 <= FrameIndex < FrameInFlightCount)
|
||||
|
@ -156,3 +164,4 @@ struct ImGui_ImplVulkanH_Window
|
|||
}
|
||||
};
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
// CHANGELOG
|
||||
// (minor and older changes stripped away, please see git history for details)
|
||||
// 2023-07-13: Use WGPUShaderModuleWGSLDescriptor's code instead of source. use WGPUMipmapFilterMode_Linear instead of WGPUFilterMode_Linear. (#6602)
|
||||
// 2023-04-11: Align buffer sizes. Use WGSL shaders instead of precompiled SPIR-V.
|
||||
// 2023-04-11: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
|
||||
// 2023-01-25: Revert automatic pipeline layout generation (see https://github.com/gpuweb/gpuweb/issues/2470)
|
||||
|
@ -28,6 +29,7 @@
|
|||
// 2021-01-28: Initial version.
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_wgpu.h"
|
||||
#include <limits.h>
|
||||
#include <webgpu/webgpu.h>
|
||||
|
@ -230,7 +232,7 @@ static WGPUProgrammableStageDescriptor ImGui_ImplWGPU_CreateShaderModule(const c
|
|||
|
||||
WGPUShaderModuleWGSLDescriptor wgsl_desc = {};
|
||||
wgsl_desc.chain.sType = WGPUSType_ShaderModuleWGSLDescriptor;
|
||||
wgsl_desc.source = wgsl_source;
|
||||
wgsl_desc.code = wgsl_source;
|
||||
|
||||
WGPUShaderModuleDescriptor desc = {};
|
||||
desc.nextInChain = reinterpret_cast<WGPUChainedStruct*>(&wgsl_desc);
|
||||
|
@ -511,7 +513,7 @@ static void ImGui_ImplWGPU_CreateFontsTexture()
|
|||
WGPUSamplerDescriptor sampler_desc = {};
|
||||
sampler_desc.minFilter = WGPUFilterMode_Linear;
|
||||
sampler_desc.magFilter = WGPUFilterMode_Linear;
|
||||
sampler_desc.mipmapFilter = WGPUFilterMode_Linear;
|
||||
sampler_desc.mipmapFilter = WGPUMipmapFilterMode_Linear;
|
||||
sampler_desc.addressModeU = WGPUAddressMode_Repeat;
|
||||
sampler_desc.addressModeV = WGPUAddressMode_Repeat;
|
||||
sampler_desc.addressModeW = WGPUAddressMode_Repeat;
|
||||
|
@ -761,3 +763,7 @@ void ImGui_ImplWGPU_NewFrame()
|
|||
if (!bd->pipelineState)
|
||||
ImGui_ImplWGPU_CreateDeviceObjects();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
#include <webgpu/webgpu.h>
|
||||
|
||||
IMGUI_IMPL_API bool ImGui_ImplWGPU_Init(WGPUDevice device, int num_frames_in_flight, WGPUTextureFormat rt_format, WGPUTextureFormat depth_format = WGPUTextureFormat_Undefined);
|
||||
|
@ -23,3 +25,5 @@ IMGUI_IMPL_API void ImGui_ImplWGPU_RenderDrawData(ImDrawData* draw_data, WGPURen
|
|||
// Use if you want to reset your rendering device without losing Dear ImGui state.
|
||||
IMGUI_IMPL_API void ImGui_ImplWGPU_InvalidateDeviceObjects();
|
||||
IMGUI_IMPL_API bool ImGui_ImplWGPU_CreateDeviceObjects();
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
// Read online: https://github.com/ocornut/imgui/tree/master/docs
|
||||
|
||||
#include "imgui.h"
|
||||
#ifndef IMGUI_DISABLE
|
||||
#include "imgui_impl_win32.h"
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
|
@ -950,11 +951,12 @@ void ImGui_ImplWin32_EnableAlphaCompositing(void* hwnd)
|
|||
struct ImGui_ImplWin32_ViewportData
|
||||
{
|
||||
HWND Hwnd;
|
||||
HWND HwndParent;
|
||||
bool HwndOwned;
|
||||
DWORD DwStyle;
|
||||
DWORD DwExStyle;
|
||||
|
||||
ImGui_ImplWin32_ViewportData() { Hwnd = nullptr; HwndOwned = false; DwStyle = DwExStyle = 0; }
|
||||
ImGui_ImplWin32_ViewportData() { Hwnd = HwndParent = nullptr; HwndOwned = false; DwStyle = DwExStyle = 0; }
|
||||
~ImGui_ImplWin32_ViewportData() { IM_ASSERT(Hwnd == nullptr); }
|
||||
};
|
||||
|
||||
|
@ -974,6 +976,14 @@ static void ImGui_ImplWin32_GetWin32StyleFromViewportFlags(ImGuiViewportFlags fl
|
|||
*out_ex_style |= WS_EX_TOPMOST;
|
||||
}
|
||||
|
||||
static HWND ImGui_ImplWin32_GetHwndFromViewportID(ImGuiID viewport_id)
|
||||
{
|
||||
if (viewport_id != 0)
|
||||
if (ImGuiViewport* viewport = ImGui::FindViewportByID(viewport_id))
|
||||
return (HWND)viewport->PlatformHandle;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static void ImGui_ImplWin32_CreateWindow(ImGuiViewport* viewport)
|
||||
{
|
||||
ImGui_ImplWin32_ViewportData* vd = IM_NEW(ImGui_ImplWin32_ViewportData)();
|
||||
|
@ -981,10 +991,7 @@ static void ImGui_ImplWin32_CreateWindow(ImGuiViewport* viewport)
|
|||
|
||||
// Select style and parent window
|
||||
ImGui_ImplWin32_GetWin32StyleFromViewportFlags(viewport->Flags, &vd->DwStyle, &vd->DwExStyle);
|
||||
HWND parent_window = nullptr;
|
||||
if (viewport->ParentViewportId != 0)
|
||||
if (ImGuiViewport* parent_viewport = ImGui::FindViewportByID(viewport->ParentViewportId))
|
||||
parent_window = (HWND)parent_viewport->PlatformHandle;
|
||||
vd->HwndParent = ImGui_ImplWin32_GetHwndFromViewportID(viewport->ParentViewportId);
|
||||
|
||||
// Create window
|
||||
RECT rect = { (LONG)viewport->Pos.x, (LONG)viewport->Pos.y, (LONG)(viewport->Pos.x + viewport->Size.x), (LONG)(viewport->Pos.y + viewport->Size.y) };
|
||||
|
@ -992,7 +999,7 @@ static void ImGui_ImplWin32_CreateWindow(ImGuiViewport* viewport)
|
|||
vd->Hwnd = ::CreateWindowEx(
|
||||
vd->DwExStyle, _T("ImGui Platform"), _T("Untitled"), vd->DwStyle, // Style, class name, window name
|
||||
rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, // Window area
|
||||
parent_window, nullptr, ::GetModuleHandle(nullptr), nullptr); // Parent window, Menu, Instance, Param
|
||||
vd->HwndParent, nullptr, ::GetModuleHandle(nullptr), nullptr); // Owner window, Menu, Instance, Param
|
||||
vd->HwndOwned = true;
|
||||
viewport->PlatformRequestResize = false;
|
||||
viewport->PlatformHandle = viewport->PlatformHandleRaw = vd->Hwnd;
|
||||
|
@ -1029,10 +1036,26 @@ static void ImGui_ImplWin32_ShowWindow(ImGuiViewport* viewport)
|
|||
|
||||
static void ImGui_ImplWin32_UpdateWindow(ImGuiViewport* viewport)
|
||||
{
|
||||
// (Optional) Update Win32 style if it changed _after_ creation.
|
||||
// Generally they won't change unless configuration flags are changed, but advanced uses (such as manually rewriting viewport flags) make this useful.
|
||||
ImGui_ImplWin32_ViewportData* vd = (ImGui_ImplWin32_ViewportData*)viewport->PlatformUserData;
|
||||
IM_ASSERT(vd->Hwnd != 0);
|
||||
|
||||
// Update Win32 parent if it changed _after_ creation
|
||||
// Unlike style settings derived from configuration flags, this is more likely to change for advanced apps that are manipulating ParentViewportID manually.
|
||||
HWND new_parent = ImGui_ImplWin32_GetHwndFromViewportID(viewport->ParentViewportId);
|
||||
if (new_parent != vd->HwndParent)
|
||||
{
|
||||
// Win32 windows can either have a "Parent" (for WS_CHILD window) or an "Owner" (which among other thing keeps window above its owner).
|
||||
// Our Dear Imgui-side concept of parenting only mostly care about what Win32 call "Owner".
|
||||
// The parent parameter of CreateWindowEx() sets up Parent OR Owner depending on WS_CHILD flag. In our case an Owner as we never use WS_CHILD.
|
||||
// Calling ::SetParent() here would be incorrect: it will create a full child relation, alter coordinate system and clipping.
|
||||
// Calling ::SetWindowLongPtr() with GWLP_HWNDPARENT seems correct although poorly documented.
|
||||
// https://devblogs.microsoft.com/oldnewthing/20100315-00/?p=14613
|
||||
vd->HwndParent = new_parent;
|
||||
::SetWindowLongPtr(vd->Hwnd, GWLP_HWNDPARENT, (LONG_PTR)vd->HwndParent);
|
||||
}
|
||||
|
||||
// (Optional) Update Win32 style if it changed _after_ creation.
|
||||
// Generally they won't change unless configuration flags are changed, but advanced uses (such as manually rewriting viewport flags) make this useful.
|
||||
DWORD new_style;
|
||||
DWORD new_ex_style;
|
||||
ImGui_ImplWin32_GetWin32StyleFromViewportFlags(viewport->Flags, &new_style, &new_ex_style);
|
||||
|
@ -1261,3 +1284,5 @@ static void ImGui_ImplWin32_ShutdownPlatformInterface()
|
|||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------------
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "imgui.h" // IMGUI_IMPL_API
|
||||
#ifndef IMGUI_DISABLE
|
||||
|
||||
IMGUI_IMPL_API bool ImGui_ImplWin32_Init(void* hwnd);
|
||||
IMGUI_IMPL_API bool ImGui_ImplWin32_InitForOpenGL(void* hwnd);
|
||||
|
@ -45,3 +46,5 @@ IMGUI_IMPL_API float ImGui_ImplWin32_GetDpiScaleForMonitor(void* monitor); //
|
|||
// - Use to enable alpha compositing transparency with the desktop.
|
||||
// - Use together with e.g. clearing your framebuffer with zero-alpha.
|
||||
IMGUI_IMPL_API void ImGui_ImplWin32_EnableAlphaCompositing(void* hwnd); // HWND hwnd
|
||||
|
||||
#endif // #ifndef IMGUI_DISABLE
|
||||
|
|
|
@ -5,25 +5,30 @@ This document holds the user-facing changelog that we also use in release notes.
|
|||
We generally fold multiple commits pertaining to the same topic as a single entry.
|
||||
Changes to backends are also included within the individual .cpp files of each backend.
|
||||
|
||||
RELEASE NOTES: https://github.com/ocornut/imgui/releases
|
||||
REPORT ISSUES: https://github.com/ocornut/imgui/issues
|
||||
DISCUSS, ASK QUESTIONS: https://github.com/ocornut/imgui/discussions
|
||||
WIKI https://github.com/ocornut/imgui/wiki
|
||||
FAQ https://www.dearimgui.com/faq/
|
||||
RELEASE NOTES: https://github.com/ocornut/imgui/releases
|
||||
WIKI https://github.com/ocornut/imgui/wiki
|
||||
GETTING STARTED https://github.com/ocornut/imgui/wiki/Getting-Started
|
||||
GLOSSARY https://github.com/ocornut/imgui/wiki/Glossary
|
||||
ISSUES & SUPPORT https://github.com/ocornut/imgui/issues
|
||||
|
||||
WHEN TO UPDATE?
|
||||
|
||||
- Keeping your copy of Dear ImGui updated regularly is recommended.
|
||||
- It is generally safe to sync to the latest commit in master or docking branches
|
||||
The library is fairly stable and regressions tends to be fixed fast when reported.
|
||||
- It is generally safe and recommended to sync to the latest commit in 'master' or 'docking'
|
||||
branches. The library is fairly stable and regressions tends to be fixed fast when reported.
|
||||
|
||||
HOW TO UPDATE?
|
||||
|
||||
- Overwrite every file except imconfig.h (if you have modified it).
|
||||
- You may also locally branch to modify imconfig.h and merge latest into your branch.
|
||||
- Update submodule or copy/overwrite every file.
|
||||
- About imconfig.h:
|
||||
- You may modify your copy of imconfig.h, in this case don't overwrite it.
|
||||
- or you may locally branch to modify imconfig.h and merge/rebase latest.
|
||||
- or you may '#define IMGUI_USER_CONFIG "my_config_file.h"' globally from your build system to
|
||||
specify a custom path for your imconfig.h file and instead not have to modify the default one.
|
||||
- Read the `Breaking Changes` section (in imgui.cpp or here in the Changelog).
|
||||
- If you have a problem with a missing function/symbols, search for its name in the code, there will likely be a comment about it.
|
||||
- If you are dropping this repository in your codebase, please leave the demo and text files in there, they will be useful.
|
||||
- If you are copying this repository in your codebase, please leave the demo and documentations files in there, they will be useful.
|
||||
- You may diff your previous Changelog with the one you just copied and read that diff.
|
||||
- You may enable `IMGUI_DISABLE_OBSOLETE_FUNCTIONS` in imconfig.h to forcefully disable legacy names and symbols.
|
||||
Doing it every once in a while is a good way to make sure you are not using obsolete symbols. Dear ImGui is in active development,
|
||||
|
@ -32,70 +37,193 @@ HOW TO UPDATE?
|
|||
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
DOCKING+MULTI-VIEWPORT BRANCH (In Progress)
|
||||
VERSION 1.89.8 (Released 2023-08-01)
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
DOCKING FEATURES
|
||||
(see https://github.com/ocornut/imgui/wiki/Docking for quick intro)
|
||||
Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.89.8
|
||||
|
||||
- Added Docking system: [BETA] (#2109, #351)
|
||||
- Added ImGuiConfigFlags_DockingEnable flag to enable Docking.
|
||||
Set with `io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;`.
|
||||
- Added DockSpace(), DockSpaceOverViewport() API.
|
||||
- Added ImGuiDockNodeFlags flags for DockSpace().
|
||||
- Added SetNextWindowDockID(), SetNextWindowClass() API.
|
||||
- Added GetWindowDockID(), IsWindowDocked() API.
|
||||
- Added ImGuiWindowFlags_NoDocking window flag to disable the possibility for a window to be docked.
|
||||
Popup, Menu and Child windows always have the ImGuiWindowFlags_NoDocking flag set.
|
||||
- Added ImGuiWindowClass to specify advanced docking/viewport related flags via SetNextWindowClass().
|
||||
- Added io.ConfigDockingNoSplit option.
|
||||
- Added io.ConfigDockingWithShift option.
|
||||
- Added io.ConfigDockingAlwaysTabBar option.
|
||||
- Added io.ConfigDockingTransparentPayload option.
|
||||
- Style: Added ImGuiCol_DockingPreview, ImGuiCol_DockingEmptyBg colors.
|
||||
- Demo: Added "DockSpace" example app showcasing use of explicit dockspace nodes.
|
||||
Breaking changes:
|
||||
|
||||
MULTI-VIEWPORT FEATURES
|
||||
(see https://github.com/ocornut/imgui/wiki/Multi-Viewports for quick intro)
|
||||
|
||||
Breaking Changes:
|
||||
|
||||
- IMPORTANT: When multi-viewports are enabled (with io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable),
|
||||
all coordinates/positions will be in your natural OS coordinates space. It means that:
|
||||
- Reference to hard-coded positions such as in SetNextWindowPos(ImVec2(0,0)) are _probably_ not what you want anymore.
|
||||
Use GetMainViewport()->Pos to offset hard-coded positions, e.g. SetNextWindowPos(GetMainViewport()->Pos).
|
||||
- Likewise io.MousePos and GetMousePos() will use OS coordinates.
|
||||
If you query mouse positions to interact with non-imgui coordinates you will need to offset them.
|
||||
e.g. subtract GetWindowViewport()->Pos.
|
||||
- IO: Removed io.DisplayVisibleMin, io.DisplayVisibleMax settings (they were marked obsoleted, used to clip within the (0,0)..(DisplaySize) range).
|
||||
- IO: Obsoleted io.ClearInputCharacters() (added in 1.47) as it now ambiguous
|
||||
and often incorrect/misleading considering the existence of a higher-level
|
||||
input queue. This is automatically cleared by io.ClearInputsKeys(). (#4921)
|
||||
- ImDrawData: CmdLists[] array is now owned, changed from 'ImDrawList**' to
|
||||
'ImVector<ImDrawList*>'. Majority of users shouldn't be affected, but you
|
||||
cannot compare to NULL nor reassign manually anymore.
|
||||
Instead use AddDrawList(). Allocation count are identical. (#6406, #4879, #1878)
|
||||
|
||||
Other changes:
|
||||
(FIXME: This need a fuller explanation!)
|
||||
|
||||
- Added ImGuiPlatformIO structure and GetPlatformIO().
|
||||
- Similarly to ImGuiIO and GetIO(), this structure is the main point of communication for backends supporting multi-viewports.
|
||||
- Backend sets functions in ImGuiPlatformIO to manipulate platform windows.
|
||||
- ImGuiPlatformIO::Monitors is a list of platform monitors (input from backend)
|
||||
- ImGuiPlatformIO::Viewports is a list of viewports (output from dear imgui)
|
||||
- Added ImGuiPlatformMonitor to feed OS monitor information in the ImGuiPlatformIO::Monitors.
|
||||
- Added GetWindowViewport(), SetNextWindowViewport().
|
||||
- Added GetWindowDpiScale().
|
||||
- Added GetOverlayDrawList(ImGuiViewport* viewport).
|
||||
The no-parameter version of GetOverlayDrawList() return the overlay for the current window's viewport.
|
||||
- Added UpdatePlatformWindows(), RenderPlatformWindowsDefault(), DestroyPlatformWindows() for usage in application setup.
|
||||
- Added FindViewportByID(), FindViewportByPlatformHandle() for usage by backends.
|
||||
- Added ImGuiConfigFlags_ViewportsEnable configuration flag and other viewport options.
|
||||
- Added io.ConfigViewportsNoAutoMerge option.
|
||||
- Added io.ConfigViewportsNoTaskBarIcon option.
|
||||
- Added io.ConfigViewportsNoDecoration option.
|
||||
- Added io.ConfigViewportsNoDefaultParent option.
|
||||
- Added ImGuiBackendFlags_PlatformHasViewports, ImGuiBackendFlags_RendererHasViewports, ImGuiBackendFlags_HasMouseHoveredViewport backend flags.
|
||||
- Added io.AddMouseViewportEvent() (optional _even_ for multi-viewport support, tied to ImGuiBackendFlags_HasMouseHoveredViewport flag).
|
||||
- Expanded ImGuiViewport structure, ImGuiViewportFlags flags.
|
||||
- Added ImGuiWindowClass and SetNextWindowClass() for passing viewport related hints to the OS/platform back-end.
|
||||
- Examples: Renderer: OpenGL2, OpenGL3, DirectX9, DirectX10, DirectX11, DirectX12, Vulkan: Added support for multi-viewports.
|
||||
- Examples: Platforms: Win32, GLFW, SDL2: Added support for multi-viewports.
|
||||
Note that Linux/Mac still have inconsistent support for multi-viewports. If you want to help see https://github.com/ocornut/imgui/issues/2117.
|
||||
- Fonts: ImFontConfig::OversampleH now defaults to 2 instead of 3, since the
|
||||
quality increase is largely minimal.
|
||||
- Fonts, imgui_freetype: Added support to render OpenType SVG fonts using lunasvg.
|
||||
Requires enabling IMGUI_ENABLE_FREETYPE_LUNASVG along with IMGUI_ENABLE_FREETYPE,
|
||||
and providing headers/libraries for lunasvg. (#6591, #6607) [@sakiodre]
|
||||
- ImDrawData: CmdLists[] array is now an ImVector<> owned by ImDrawData rather
|
||||
than a pointer to internal state.
|
||||
- This makes it easier for user to create their own or append to an existing draw data.
|
||||
Added a ImDrawData::AddDrawList() helper function to do that. (#6406, #4879, #1878)
|
||||
- This makes it easier to perform a deep-swap instead of a deep-copy, as array
|
||||
ownership is now clear. (#6597, #6475, #6167, #5776, #5109, #4763, #3515, #1860)
|
||||
- Syntax and allocation count are otherwise identical.
|
||||
- Fixed CTRL+Tab dimming background assert when target window has a callback
|
||||
in the last ImDrawCmd. (#4857, #5937)
|
||||
- IsItemHovered: Fixed ImGuiHoveredFlags_ForTooltip for Keyboard/Gamepad navigation,
|
||||
got broken prior to 1.89.7 due to an unrelated change making flags conflict. (#6622, #1485)
|
||||
- InputText: Fixed a case where deactivation frame would write to underlying
|
||||
buffer or call CallbackResize although unnecessary, in a frame where the
|
||||
return value was false.
|
||||
- Tables: fixed GetContentRegionAvail().y report not taking account of lower cell
|
||||
padding or of using ImGuiTableFlags_NoHostExtendY. Not taking it into account
|
||||
would make the idiom of creating vertically bottom-aligned content (e.g. a child
|
||||
window) inside a table make the parent window erroneously have a scrollbar. (#6619)
|
||||
- Tables: fixed calculation of multi-instance shared decoration/scrollbar width of
|
||||
scrolling tables, to avoid flickering width variation when resizing down a table
|
||||
hosting a child window. (#5920, #6619)
|
||||
- Scrollbar: layout needs to take account of window border size, so a border size
|
||||
will slightly reduce scrollbar size. Generally we tried to make it that window
|
||||
border size has no incidence on layout but this can't work with thick borders. (#2522)
|
||||
- IO: Added io.ClearEventsQueue() to clear incoming inputs events. (#4921)
|
||||
May be useful in conjunction with io.ClearInputsKeys() if you need to clear
|
||||
both current inputs state and queued events (e.g. when using blocking native
|
||||
dialogs such as Windows's ::MessageBox() or ::GetOpenFileName()).
|
||||
- IO: Changed io.ClearInputsKeys() specs to also clear current frame character buffer
|
||||
(what now obsoleted io.ClearInputCharacters() did), as this is effectively the
|
||||
desirable behavior.
|
||||
- Misc: Added IMGUI_DISABLE_STB_SPRINTF_IMPLEMENTATION config macro to disable
|
||||
stb_sprintf implementation when using IMGUI_USE_STB_SPRINTF. (#6626) [@septag]
|
||||
- Misc: Avoid stb_textedit.h reincluding string.h while in a namespace, which
|
||||
messes up with building with Clang Modules. (#6653, #4791) [@JohelEGP]
|
||||
- Demo: Better showcase use of SetNextItemAllowOverlap(). (#6574, #6512, #3909, #517)
|
||||
- Demo: Showcase a few more InputText() flags.
|
||||
- Backends: Made all backends sources files support global IMGUI_DISABLE. (#6601)
|
||||
- Backends: GLFW: Revert ignoring mouse data on GLFW_CURSOR_DISABLED as it can be used
|
||||
differently. User may set ImGuiConfigFlags_NoMouse if desired. (#5625, #6609) [@scorpion-26]
|
||||
- Backends: WebGPU: Update for changes in Dawn. (#6602, #6188) [@williamhCode]
|
||||
- Examples: Vulkan: Creating minimal descriptor pools to fit only what is needed by
|
||||
example. (#6642) [@SaschaWillem]
|
||||
|
||||
Docking+Viewports Branch:
|
||||
|
||||
- Docking, Style: resizing separators use same colors as window borders (ImGuiCol_Border)
|
||||
for consistency. With default styles it doesn't make a big difference. (#2522) [@rmitton]
|
||||
In the future if we promote using thick value for inner/outer docking padding we may
|
||||
need to introduce new colors for it.
|
||||
- Docking: added style.DockingSeparatorSize, ImGuiStyleVar_DockingSeparatorSize. Now
|
||||
also scaled by style.ScaleAllSizes(). (#3481, #4721, #2522) [@PossiblyAShrub, @wobbier]
|
||||
- Docking: fixed rendering of docked-window scrollbar above outer border. (#2522)
|
||||
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
VERSION 1.89.7 (Released 2023-07-04)
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Decorated log and release notes: https://github.com/ocornut/imgui/releases/tag/v1.89.7
|
||||
|
||||
Breaking changes:
|
||||
|
||||
- Moved io.HoverDelayShort/io.HoverDelayNormal to style.HoverDelayShort/style.HoverDelayNormal.
|
||||
As the fields were added in 1.89 and expected to be left unchanged by most users, or only
|
||||
tweaked once during app initialisation, we are exceptionally accepting the breakage.
|
||||
Majority of users should not even notice.
|
||||
- Overlapping items: (#6512, #3909, #517)
|
||||
- Added 'SetNextItemAllowOverlap()' (called before an item) as a replacement for using
|
||||
'SetItemAllowOverlap()' (called after an item). This is roughly equivalent to using the
|
||||
legacy 'SetItemAllowOverlap()' call (public API) + ImGuiButtonFlags_AllowOverlap (internal).
|
||||
- Obsoleted 'SetItemAllowOverlap()': it didn't and couldn't work reliably since 1.89 (2022-11-15),
|
||||
and relied on ambiguously defined design. Use 'SetNextItemAllowOverlap()' before item instead.
|
||||
- Selectable, TreeNode: When using ImGuiSelectableFlags_AllowOverlap/ImGuiTreeNodeFlags_AllowOverlap
|
||||
and holding item held, overlapping widgets won't appear as hovered. (#6512, #3909)
|
||||
While this fixes a common small visual issue, it also means that calling IsItemHovered()
|
||||
after a non-reactive elements - e.g. Text() - overlapping an active one may fail if you don't
|
||||
use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem). (#6610)
|
||||
- Renamed 'ImGuiTreeNodeFlags_AllowItemOverlap' to 'ImGuiTreeNodeFlags_AllowOverlap'.
|
||||
- Renamed 'ImGuiSelectableFlags_AllowItemOverlap' to 'ImGuiSelectableFlags_AllowOverlap'
|
||||
- Kept redirecting enums (will obsolete).
|
||||
|
||||
Other changes:
|
||||
|
||||
- Tooltips/IsItemHovered() related changes:
|
||||
- Tooltips: Added SetItemTooltip() and BeginItemTooltip() functions.
|
||||
They are shortcuts for the common idiom of using IsItemHovered().
|
||||
- SetItemTooltip("Hello") == if (IsItemHovered(ImGuiHoveredFlags_Tooltip)) { SetTooltip("Hello"); }
|
||||
- BeginItemTooltip() == IsItemHovered(ImGuiHoveredFlags_Tooltip) && BeginTooltip()
|
||||
The newly added ImGuiHoveredFlags_Tooltip is meant to facilitate standardizing
|
||||
mouse hovering delays and rules for a given application.
|
||||
The previously common idiom of using 'if (IsItemHovered()) { SetTooltip(...); }'
|
||||
won't use delay or stationary test.
|
||||
- IsItemHovered: Added ImGuiHoveredFlags_Stationary to require mouse being
|
||||
stationary when hovering a new item. Added style.HoverStationaryDelay (~0.15 sec).
|
||||
Once the mouse has been stationary once the state is preserved for same item. (#1485)
|
||||
- IsItemHovered: Added ImGuiHoveredFlags_ForTooltip as a shortcut for pulling flags
|
||||
from style.HoverFlagsForTooltipMouse or style.HoverFlagsForTooltipNav depending
|
||||
on active inputs (#1485)
|
||||
- style.HoverFlagsForTooltipMouse defaults to 'ImGuiHoveredFlags_Stationary | ImGuiHoveredFlags_DelayShort'
|
||||
- style.HoverFlagsForTooltipNav defaults to 'ImGuiHoveredFlags_NoSharedDelay | ImGuiHoveredFlags_DelayNormal'.
|
||||
- Tooltips: Tweak default offset for non-drag and drop tooltips so underlying items
|
||||
isn't covered as much. (Match offset for drag and drop tooltips)
|
||||
- IsItemHovered: Tweaked default value of style.HoverDelayNormal from 0.30 to 0.40,
|
||||
Tweaked default value of style.HoverDelayShort from 0.10 to 0.15. (#1485)
|
||||
- IsItemHovered: Added ImGuiHoveredFlags_AllowWhenOverlappedByWindow to ignore window-overlap only.
|
||||
Option ImGuiHoveredFlags_AllowWhenOverlapped now expand into a combination of both
|
||||
_AllowWhenOverlappedByWindow + _AllowWhenOverlappedByItem, matching old behavior.
|
||||
- Overlapping items: (#6512, #3909, #517)
|
||||
- Most item types should now work with SetNextItemAllowOverlap(). (#6512, #3909, #517)
|
||||
- Fixed first frame of an overlap highlighting underlying item if previous frame didn't hover anything.
|
||||
- IsItemHovered: Changed to return false when querying an item using AllowOverlap mode which
|
||||
is being overlapped. Added ImGuiHoveredFlags_AllowWhenOverlappedByItem to opt-out. (#6512, #3909, #517)
|
||||
- IsWindowHovered: Added support for ImGuiHoveredFlags_Stationary.
|
||||
- IsWindowHovered, IsItemHovered: Assert when passed any unsupported flags.
|
||||
- Tables: Fixed a regression in 1.89.6 leading to the first column of tables with either
|
||||
ScrollX or ScrollY flags from being impossible to resize. (#6503)
|
||||
- CollapsingHeader/TreeNode: Fixed text padding when using _Framed+_Leaf flags. (#6549) [@BobbyAnguelov]
|
||||
- InputText: Fixed not returning true when buffer is cleared while using the
|
||||
ImGuiInputTextFlags_EscapeClearsAll flag. (#5688, #2620)
|
||||
- InputText: Fixed a crash on deactivating a ReadOnly buffer. (#6570, #6292, #4714)
|
||||
- InputText: ImGuiInputTextCallbackData::InsertChars() accept (NULL,NULL) range, in order to conform
|
||||
to common idioms (e.g. passing .data(), .data() + .size() from a null string). (#6565, #6566, #3615)
|
||||
- Combo: Made simple/legacy Combo() function not returns true when picking already selected item.
|
||||
This is consistent with other widgets. If you need something else, you can use BeginCombo(). (#1182)
|
||||
- Clipper: Rework inner logic to allow functioning with a zero-clear constructor.
|
||||
This is order to facilitate usage for language bindings (e.g cimgui or dear_binding)
|
||||
where user may not be calling a constructor manually. (#5856)
|
||||
- Drag and Drop: Apply default behavior of drag source not reporting itself as hovered
|
||||
at lower-level, so DragXXX, SliderXXX, InputXXX, Plot widgets are fulfilling it.
|
||||
(Behavior doesn't apply when ImGuiDragDropFlags_SourceNoDisableHover is set).
|
||||
- Modals: In the case of nested modal, made sure that focused or appearing windows are
|
||||
moved below the lowest blocking modal (rather than the highest one). (#4317)
|
||||
- GetKeyName(): Fixed assert with ImGuiMod_XXX values when IMGUI_DISABLE_OBSOLETE_KEYIO is set.
|
||||
- Debug Tools: Added 'io.ConfigDebugIniSettings' option to save .ini data with extra
|
||||
comments. Currently mainly for inspecting Docking .ini data, but makes saving slower.
|
||||
- Demo: Added more developed "Widgets->Tooltips" section. (#1485)
|
||||
- Backends: OpenGL3: Fixed support for glBindSampler() backup/restore on ES3. (#6375, #6508) [@jsm174]
|
||||
- Backends: OpenGL3: Fixed erroneous use glGetIntegerv(GL_CONTEXT_PROFILE_MASK) on contexts
|
||||
lower than 3.2. (#6539, #6333) [@krumelmonster]
|
||||
- Backends: Vulkan: Added optional support for VK_KHR_dynamic_rendering (Vulkan 1.3+) in the
|
||||
backend for applications using it. User needs to set 'init_info->UseDynamicRendering = true'
|
||||
and 'init_info->ColorAttachmentFormat'. RenderPass becomes unused. (#5446, #5037) [@spnda, @cmarcelo]
|
||||
- Backends: GLFW: Accept glfwGetTime() not returning a monotonically increasing value.
|
||||
This seems to happens on some Windows setup when peripherals disconnect, and is likely
|
||||
to also happen on browser+Emscripten. Matches similar 1.89.4 fix in SDL backend. (#6491)
|
||||
- Examples: Win32+OpenGL3: Changed DefWindowProc() to DefWindowProcW() to match other examples
|
||||
and support the example app being compiled without UNICODE. (#6516, #5725, #5961, #5975) [@yenixing]
|
||||
|
||||
Docking+Viewports Branch:
|
||||
|
||||
- Viewports+Docking: Fixed extraneous viewport+platform-window recreation in various
|
||||
combination of showing or hiding windows, docking with/without split, undocking.
|
||||
While with some backends and without OS decorations, some extraneous window recreation
|
||||
were visibly not noticeable, they would typically become noticeable when enabling
|
||||
OS decorations on those windows (e.g. Windows title bar fade-in/animation).
|
||||
- Viewports: Closing a viewport via OS/platform means (e.g. OS close button or task-bar menu),
|
||||
mark all windows in this viewport as closed.
|
||||
- Docking: Fixed one-frame flickering on reappearing windows binding to a dock node
|
||||
where a later-submitted window was already bound.
|
||||
- Docking: Fixed dragging from title-bar empty space (regression from 1.88 related to
|
||||
keeping ID alive when calling low-level ButtonBehavior() directly). (#5181, #2645)
|
||||
- Docking: [Internal] DockBuilderDockWindow() API calls don't clear docking order
|
||||
if the target node is same as existing one.
|
||||
- Backends: Win32: Added support for changing ParentViewportID after viewport creation.
|
||||
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
|
@ -643,7 +771,7 @@ Other Changes:
|
|||
- ColorEdit3: fixed id collision leading to an assertion. (#5707)
|
||||
- IsItemHovered: Added ImGuiHoveredFlags_DelayNormal and ImGuiHoveredFlags_DelayShort flags,
|
||||
allowing to introduce a shared delay for tooltip idioms. The delays are respectively
|
||||
io.HoverDelayNormal (default to 0.30f) and io.HoverDelayFast (default to 0.10f). (#1485)
|
||||
io.HoverDelayNormal (default to 0.30f) and io.HoverDelayShort (default to 0.10f). (#1485)
|
||||
- IsItemHovered: Added ImGuiHoveredFlags_NoSharedDelay to disable sharing delays between items,
|
||||
so moving from one item to a nearby one will requires delay to elapse again. (#1485)
|
||||
- Tables: activating an ID (e.g. clicking button inside) column doesn't prevent columns
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
## Getting Started & General Advice
|
||||
|
||||
- Article: [How To Ask Good Questions](https://bit.ly/3nwRnx1).
|
||||
- Please browse the [Wiki](https://github.com/ocornut/imgui/wiki) to find code snippets, links and other resources (e.g. [Useful extensions](https://github.com/ocornut/imgui/wiki/Useful-Extensions)).
|
||||
- Please browse the [Wiki](https://github.com/ocornut/imgui/wiki) to find code snippets, links and other resources (e.g. [Getting Started](https://github.com/ocornut/imgui/wiki/Getting-Started), [Useful extensions](https://github.com/ocornut/imgui/wiki/Useful-Extensions)).
|
||||
- Please read [docs/FAQ.md](https://github.com/ocornut/imgui/blob/master/docs/FAQ.md).
|
||||
- Please read [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md) if your question relates to fonts or text.
|
||||
- Please read one of the [examples/](https://github.com/ocornut/imgui/tree/master/examples) application if your question relates to setting up Dear ImGui.
|
||||
|
|
|
@ -50,7 +50,8 @@ or view this file with any Markdown viewer.
|
|||
|
||||
**This library is poorly documented at the moment and expects the user to be acquainted with C/C++.**
|
||||
- The [Wiki](https://github.com/ocornut/imgui/wiki) is a hub to many resources and links.
|
||||
- Dozens of standalone example applications using e.g. OpenGL/DirectX are provided in the [examples/](https://github.com/ocornut/imgui/blob/master/examples/) folder to explain how to integrate Dear ImGui with your own engine/application. You can run those applications and explore them.
|
||||
- Handy [Getting Started](https://github.com/ocornut/imgui/wiki/Getting-Started) guide to integrate Dear ImGui in an existing application.
|
||||
- 20+ standalone example applications using e.g. OpenGL/DirectX are provided in the [examples/](https://github.com/ocornut/imgui/blob/master/examples/) folder to explain how to integrate Dear ImGui with your own engine/application. You can run those applications and explore them.
|
||||
- See demo code in [imgui_demo.cpp](https://github.com/ocornut/imgui/blob/master/imgui_demo.cpp) and particularly the `ImGui::ShowDemoWindow()` function. The demo covers most features of Dear ImGui, so you can read the code and see its output.
|
||||
- See documentation: [Backends](https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md), [Examples](https://github.com/ocornut/imgui/blob/master/docs/EXAMPLES.md), [Fonts](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md).
|
||||
- See documentation and comments at the top of [imgui.cpp](https://github.com/ocornut/imgui/blob/master/imgui.cpp) + general API comments in [imgui.h](https://github.com/ocornut/imgui/blob/master/imgui.h).
|
||||
|
@ -90,6 +91,7 @@ Many projects are using this branch and it is kept in sync with master regularly
|
|||
|
||||
### Q: How to get started?
|
||||
|
||||
Read [Getting Started](https://github.com/ocornut/imgui/wiki/Getting-Started). <BR>
|
||||
Read [EXAMPLES.md](https://github.com/ocornut/imgui/blob/master/docs/EXAMPLES.md). <BR>
|
||||
Read [BACKENDS.md](https://github.com/ocornut/imgui/blob/master/docs/BACKENDS.md). <BR>
|
||||
Read `PROGRAMMER GUIDE` section of [imgui.cpp](https://github.com/ocornut/imgui/blob/master/imgui.cpp). <BR>
|
||||
|
@ -163,8 +165,8 @@ Console SDK also sometimes provide equivalent tooling or wrapper for Synergy-lik
|
|||
---
|
||||
|
||||
### Q: I integrated Dear ImGui in my engine and little squares are showing instead of text...
|
||||
Your renderer is not using the font texture correctly or it hasn't been uploaded to the GPU.
|
||||
- If this happens using the standard backends: A) have you modified the font atlas after `ImGui_ImplXXX_NewFrame()`? B) maybe the texture failed to upload, which could happens if for some reason your texture is too big. Also see [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md).
|
||||
Your renderer backend is not using the font texture correctly or it hasn't been uploaded to the GPU.
|
||||
- If this happens using the standard backends: A) have you modified the font atlas after `ImGui_ImplXXX_NewFrame()`? B) maybe the texture failed to upload, which **can if your texture atlas is too big**. Also see [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md).
|
||||
- If this happens with a custom backend: make sure you have uploaded the font texture to the GPU, that all shaders are rendering states are setup properly (e.g. texture is bound). Compare your code to existing backends and use a graphics debugger such as [RenderDoc](https://renderdoc.org) to debug your rendering states.
|
||||
|
||||
##### [Return to Index](#index)
|
||||
|
@ -528,7 +530,7 @@ This approach is relatively easy and functional but comes with two issues:
|
|||
- Style override may be lost during the `Begin()` call crossing monitor boundaries. You may need to do some custom scaling mumbo-jumbo if you want your `OnChangedViewport()` handler to preserve style overrides.
|
||||
|
||||
Please note that if you are not using multi-viewports with multi-monitors using different DPI scales, you can ignore that and use the simpler technique recommended at the top.
|
||||
|
||||
|
||||
On Windows, in addition to scaling the font size (make sure to round to an integer) and using `style.ScaleAllSizes()`, you will need to inform Windows that your application is DPI aware. If this is not done, Windows will scale the application window and the UI text will be blurry. Potential solutions to indicate DPI awareness on Windows are:
|
||||
|
||||
- For SDL: the flag `SDL_WINDOW_ALLOW_HIGHDPI` needs to be passed to `SDL_CreateWindow()``.
|
||||
|
@ -568,44 +570,15 @@ io.Fonts->AddFontFromFileTTF("MyFolder/MyFont.ttf", size); // ALSO CORRECT
|
|||
### Q: How can I easily use icons in my application?
|
||||
The most convenient and practical way is to merge an icon font such as FontAwesome inside your
|
||||
main font. Then you can refer to icons within your strings.
|
||||
You may want to see `ImFontConfig::GlyphMinAdvanceX` to make your icon look monospace to facilitate alignment.
|
||||
(Read the [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md) file for more details about icons font loading.)
|
||||
With some extra effort, you may use colorful icons by registering custom rectangle space inside the font atlas,
|
||||
and copying your own graphics data into it. See docs/FONTS.md about using the AddCustomRectFontGlyph API.
|
||||
Read the [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md) file for more details about icons font loading.
|
||||
|
||||
##### [Return to Index](#index)
|
||||
|
||||
---
|
||||
|
||||
### Q: How can I load multiple fonts?
|
||||
Use the font atlas to pack them into a single texture:
|
||||
(Read the [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md) file and the code in ImFontAtlas for more details.)
|
||||
|
||||
```cpp
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
ImFont* font0 = io.Fonts->AddFontDefault();
|
||||
ImFont* font1 = io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels);
|
||||
ImFont* font2 = io.Fonts->AddFontFromFileTTF("myfontfile2.ttf", size_in_pixels);
|
||||
io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8()
|
||||
// the first loaded font gets used by default
|
||||
// use ImGui::PushFont()/ImGui::PopFont() to change the font at runtime
|
||||
|
||||
// Options
|
||||
ImFontConfig config;
|
||||
config.OversampleH = 2;
|
||||
config.OversampleV = 1;
|
||||
config.GlyphOffset.y -= 1.0f; // Move everything by 1 pixel up
|
||||
config.GlyphExtraSpacing.x = 1.0f; // Increase spacing between characters
|
||||
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_pixels, &config);
|
||||
|
||||
// Combine multiple fonts into one (e.g. for icon fonts)
|
||||
static ImWchar ranges[] = { 0xf000, 0xf3ff, 0 };
|
||||
ImFontConfig config;
|
||||
config.MergeMode = true;
|
||||
io.Fonts->AddFontDefault();
|
||||
io.Fonts->AddFontFromFileTTF("fontawesome-webfont.ttf", 16.0f, &config, ranges); // Merge icon font
|
||||
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_pixels, nullptr, &config, io.Fonts->GetGlyphRangesJapanese()); // Merge japanese glyphs
|
||||
```
|
||||
Use the font atlas to pack them into a single texture. Read [docs/FONTS.md](https://github.com/ocornut/imgui/blob/master/docs/FONTS.md) for more details.
|
||||
|
||||
##### [Return to Index](#index)
|
||||
|
||||
|
|