Compare commits

...

278 Commits

Author SHA1 Message Date
tildearrow ec4063641a GUI: fix sample preview needle visible when switch
ing samples
2023-09-05 15:38:02 -05:00
tildearrow 803c8b0582 GUI: update intro
ticket #1453
2023-09-05 15:31:27 -05:00
tildearrow fc760eed43 GUI: fix cut off text in settings 2023-09-05 15:30:53 -05:00
tildearrow eb18b28928 workPool: improvements 2023-09-05 06:02:58 -05:00
tildearrow d42b503e81 GUI: update credits 2023-09-05 05:33:23 -05:00
tildearrow 2c0ae7c8bb reduce intro volume, part 1 2023-09-05 04:55:22 -05:00
tildearrow 5f0fe2c8f7
READY! DOWN! HUT HUT HUT HUT HUT HUT HUT HUT HUT
****** CHANGE SIDES ******
NEXT DEFENSE      NEXT OFFENSE
2023-09-05 04:42:35 -05:00
tildearrow 1da000b00c GUI: per-chan osc multi-threading! 2023-09-05 04:38:57 -05:00
tildearrow c99899a002 GUI: re-organize chan osc code
prepare for possible multi-threading
2023-09-04 18:54:33 -05:00
tildearrow 55eeb241cf this won't build 2023-09-04 18:35:18 -05:00
tildearrow ad7b4f61b5 YM2612: fix missing 30xx effect 2023-09-04 15:02:19 -05:00
tildearrow 2ca5856800 a fix 2023-09-04 04:25:21 -05:00
tildearrow 60df7e26f4 GUI: even more chan osc improvements 2023-09-04 04:14:47 -05:00
tildearrow ab7b26a2e7 GUI: improve chan osc wave centering 2023-09-04 01:18:48 -05:00
tildearrow 7a78ec1b60 GUI: optimize chan osc
don't process FFT if not loud enough
don't process DFT if we couldn't determine wave length
2023-09-03 20:09:03 -05:00
tildearrow 90980a3062 GUI: center chan osc 2023-09-03 19:08:30 -05:00
tildearrow 83c64aa4b4 fix the crash
the hell? one double and suddenly it crashes on Android?
2023-09-03 17:18:31 -05:00
thacuber2a03 25a83bf1b9 add sweatsmile bossfight 2023-09-03 14:12:56 -04:00
tildearrow 7ea5f2de07 remove some debug info 2023-09-03 04:22:17 -05:00
tildearrow f6db75fae1 GUI: massive chan osc improvements 2023-09-03 04:22:00 -05:00
tildearrow 19d0ed617a what? 2023-09-02 23:57:55 -05:00
tildearrow 20ed22d6e8 Revert "."
This reverts commit b26a76f343.
2023-09-02 23:07:09 -05:00
tildearrow b26a76f343 . 2023-09-02 22:46:46 -05:00
tildearrow ef23b88ad3 NES: fix chan osc (noise, NSFplay) 2023-09-02 03:58:11 -05:00
tildearrow 716d42ee6d IGFD: fix .* filter with label 2023-09-01 19:59:43 -05:00
tildearrow 1c171ed7bd GUI: de-duplicate file dialog filters
untested. may not work...
2023-09-01 18:33:32 -05:00
tildearrow c21f880e3e GUI: update credits 2023-09-01 18:33:08 -05:00
tildearrow 4f02f1f90b update settings.md 2023-09-01 16:43:08 -05:00
tildearrow 65cd433ac7 fix hang detection (DirectSound) 2023-08-31 04:46:52 -05:00
tildearrow 5a9402abcd fix build 2023-08-31 04:39:19 -05:00
tildearrow fa7405090e add WASAPI exclusive mode flag to PortAudio backen
d
2023-08-31 04:30:49 -05:00
tildearrow be38b992e3
Merge pull request #1446 from Eknous-P/partnums
update part numbers
2023-08-31 03:24:30 -05:00
tildearrow addbc986f0 ExtCh: fix forceIns
why KVS
2023-08-31 03:23:15 -05:00
Eknous 914855d751
Merge branch 'tildearrow:master' into partnums 2023-08-31 12:16:16 +04:00
Eknous-P 2a370dbb1f update part numbers
fix opl/opll cases
rm "MOS" from sids
c219 case
2023-08-31 12:15:29 +04:00
tildearrow b315b84e31 GUI: clear out audio dev when changing backend 2023-08-31 03:01:38 -05:00
tildearrow 35aeb51b79 ugh why 2023-08-31 02:31:33 -05:00
tildearrow 05d5eb5ca3 asd 2023-08-31 02:19:27 -05:00
tildearrow 879e770e58 and again 2023-08-31 02:09:54 -05:00
tildearrow 7f35d06ccb why does this happen 2023-08-31 01:59:37 -05:00
tildearrow 43ef57390a GUI: clamp CWSliders 2023-08-31 01:52:11 -05:00
tildearrow 4ad1ae78fa ASDFGHJKL 2023-08-31 01:43:19 -05:00
tildearrow a882d7bcf2 GUI: detect UI scale factor when moving window 2023-08-31 01:24:06 -05:00
tildearrow 9caa2f38f4 SoundUnit: fix getPan() 2023-08-31 00:42:25 -05:00
tildearrow 5140acd51f
Merge pull request #1443 from tildearrow/doc-general
Small documentation fixes and improvements.
2023-08-31 00:20:18 -05:00
tildearrow 9aacc706f1 Merge branch 'master' into doc-general 2023-08-31 00:20:05 -05:00
Electric Keet fb3a3890d5 And the rest of the fixes. 2023-08-30 22:18:15 -07:00
Electric Keet 29c2879397 Small correction. 2023-08-30 22:07:06 -07:00
tildearrow 8b3fc84b51 don't show JACK/PA backends if not available 2023-08-30 23:23:27 -05:00
tildearrow 922800d864 oh crap 2023-08-30 23:14:47 -05:00
tildearrow 274ce8a646 remove many TODOs 2023-08-30 19:21:38 -05:00
tildearrow d1b78f787b update credits 2023-08-30 17:38:45 -05:00
tildearrow 68787a4d8b add PortAudio backend - PLEASE READ
PLEASE DO:

```
git submodule update --init --recursive
```

AFTER PULLING THIS COMMIT.
2023-08-30 17:32:51 -05:00
Electric Keet 1ebf828743 A couple more slight edits.
Typo fix and update for new macro props indicator, just to show what that looks like.
2023-08-30 14:13:06 -07:00
tildearrow 7d605c9d76 GUI: why do I see a 0.5 reference 2023-08-30 14:27:29 -05:00
tildearrow 80013089a2 GUI: colorize macro speed/delay button if used 2023-08-30 14:06:04 -05:00
tildearrow 5a688c58cb OPM/OPZ: invert noise frequencies
since ymfm is default
2023-08-30 13:46:47 -05:00
tildearrow 63dcacf33d dev170 - YM2151: fix noise frequency on ymfm
issue #1441
raising ver num to allow possible compat change
2023-08-30 13:35:22 -05:00
tildearrow 426d4b44f0 dang it let me freeze 2023-08-30 13:12:25 -05:00
tildearrow 6ac4529f3b possibly fix HiDPI input problem on macOS/Wayland
issue #1425
2023-08-30 05:21:33 -05:00
tildearrow ff3cebfffd
Merge pull request #1022 from tildearrow/x1_010_bank
Add Seta 2 Bankswitch support
2023-08-30 02:22:18 -05:00
tildearrow fda2ca0645 introduce p r e - e f f e c t s
the ultimate fix to #1439
2023-08-30 02:17:16 -05:00
tildearrow da259a33b7 GUI: fix orders scroll 2023-08-30 01:31:25 -05:00
tildearrow 5da54a7678 update ImGui to 1.89.8
commit f8704cd085c4347f835c21dc12a3951924143872
with Furnace patches
2023-08-30 00:42:51 -05:00
tildearrow 23a1fd4796
Merge pull request #1438 from tildearrow/ui-settings-keyboard
Complete keyboard settings.
2023-08-29 18:58:32 -05:00
tildearrow 015899a43f GUI: fix cursor inconsistency after stop
issue #1424
2023-08-29 18:54:08 -05:00
Electric Keet 6fb738294a Don't need the default note keys table. 2023-08-29 16:33:47 -07:00
tildearrow d38ff59cb8 GUI: fix pattern play flicker 2023-08-29 18:13:01 -05:00
tildearrow f9237dc69c GUI: fix input pad flickering
issue #1436
2023-08-29 17:16:10 -05:00
tildearrow d7f3be70c6 GUI: fix wrong cursor pos on step row 2023-08-29 17:06:40 -05:00
tildearrow de34b5c9c4 K053260: implement ADPCM 2023-08-29 16:43:37 -05:00
Electric Keet e65e79f192 Complete keyboard settings.
All* the settings are here now!

* minus the one that shouldn't be
2023-08-29 11:24:47 -07:00
Electric Keet da5d110e73 Doc update for new features. 2023-08-29 10:52:07 -07:00
tildearrow 4abae260f4 implement K05 ADPCM 2023-08-29 06:23:38 -05:00
tildearrow 61b0179da1 kind of implement K05 ADPCM
low quality
2023-08-29 06:16:07 -05:00
tildearrow 32ec87ca27 prepare for K05 ADPCM 2023-08-29 04:26:25 -05:00
tildearrow eaac5cc224 C219: fix VGM export
a sample word has two 8-bit samples in reverse order
(need hardware confirmation)
2023-08-29 04:09:11 -05:00
tildearrow e7fe99f795 C219: fix VGM export crash 2023-08-29 03:42:16 -05:00
tildearrow ead19d6111 C219: fix bank restore 2023-08-29 03:40:40 -05:00
tildearrow ca51ee9f32 C219: fix bank note off 2023-08-29 03:38:59 -05:00
tildearrow fccb6aff6e GUI: C219 in sample editor 2023-08-29 03:33:34 -05:00
tildearrow eff22ae7b9 fix µ-law encoder 2023-08-29 03:26:32 -05:00
tildearrow e6c52e34d1 C219: finish C219 sample format 2023-08-29 03:19:26 -05:00
tildearrow da7ad75afd C219: fix audio 2023-08-29 02:32:59 -05:00
tildearrow 87ae995ff9 MSM5232: fix chan osc again
issue #1435
2023-08-29 02:14:55 -05:00
tildearrow 8d887058ec YESSSSSSSSS
disable SSE on the 32-bit Windows builds
2023-08-29 02:01:56 -05:00
tildearrow a5f351c232 C219: new sample format (work in progress) 2023-08-28 20:31:22 -05:00
tildearrow 9cb239438e C219: chip config and proper clock rate 2023-08-28 18:37:35 -05:00
tildearrow 35faa8c23c C219: presets and VGM export 2023-08-28 18:21:49 -05:00
tildearrow 2fddd9e4d4 C219: noise/invert/surround effects/macro 2023-08-28 17:59:34 -05:00
tildearrow 980c93aac4 CRAP 2023-08-28 17:01:22 -05:00
tildearrow 044859f6d1 GUI: add option to choose between chip menus and
chip manager in File menu
2023-08-28 17:00:39 -05:00
Electric Keet 2813e8e3b3 Merge branch 'master' into doc-general 2023-08-28 14:51:17 -07:00
tildearrow cfd5131081
Merge pull request #1434 from tildearrow/doc-general
Docs update for 0.6pre9.
2023-08-28 16:50:00 -05:00
tildearrow decd2fde0f MSM5232: work around possible chip quirk
when changing control, it seemingly retriggers all channels
issue #1433
2023-08-28 16:36:26 -05:00
tildearrow f07ad0044b Merge branch 'master' of github.com:tildearrow/furnace 2023-08-28 16:02:56 -05:00
tildearrow 281598812c fix FFxx and "reset channels" loop modality
issue #1427
2023-08-28 16:02:29 -05:00
Electric Keet 0b5afcb8d6 Docs update for 0.6pre9. 2023-08-28 13:58:33 -07:00
tildearrow 74bd071873
Merge pull request #1415 from tildearrow/ui-chanosc-rearrange
Move chanOsc "Center waveform" option to next line.
2023-08-28 14:42:36 -05:00
tildearrow 2ea43329a2
Merge pull request #1432 from tildearrow/letter-icons
Adding C219 to letter icons (again).
2023-08-28 14:42:11 -05:00
Electric Keet ed05c16d95 Adding the missing TableNextRow. 2023-08-28 10:39:40 -07:00
tildearrow 684633aa1e GUI: preview sample button in unified assets
issue #1430
2023-08-28 06:37:13 -05:00
tildearrow f5ac9b13b6 GUI: fix crash inducing typo
issue #1429
2023-08-28 06:17:42 -05:00
tildearrow 2357093bc8 GUI: fix image loading (big endian) 2023-08-28 05:58:46 -05:00
tildearrow bd730cbeec GUI: furIcon big endian fix 2023-08-28 05:44:38 -05:00
tildearrow 347b3cf2b1 fix missing big endian writeI_BE 2023-08-28 05:32:09 -05:00
tildearrow 628ddc91ca fix void pointer 2023-08-28 05:09:48 -05:00
tildearrow bcf877b7ca C219: fix out of bounds access 2023-08-28 04:12:09 -05:00
tildearrow 4e3de466ce C219: looooooool 2023-08-28 04:10:48 -05:00
tildearrow 23a70381c6 fix type limits, part 2 2023-08-28 04:06:25 -05:00
tildearrow 0e7dbf7b4a fix type limits, part 1? 2023-08-28 04:03:32 -05:00
tildearrow 7ea7f72b45
Merge pull request #1422 from Eknous-P/guimprove
Numerous GUI improvements
2023-08-28 03:02:50 -05:00
tildearrow 284a4f39ad :< 2023-08-28 03:02:35 -05:00
Electric Keet d65df2facd Adding C219 to letter icons.
This time for real.
2023-08-28 00:38:52 -07:00
Eknous-P cd2d60ac58 table stuff into if 2023-08-28 10:37:51 +04:00
Electric Keet ac7e05550a Merge branch 'master' into letter-icons 2023-08-27 23:23:21 -07:00
Electric Keet 7a6cbcc00d Adding C219 to letter icons. 2023-08-27 23:18:37 -07:00
Eknous 06f2595861
formatting 2023-08-28 10:00:32 +04:00
Eknous 4078da6685
Merge branch 'tildearrow:master' into guimprove 2023-08-28 09:42:30 +04:00
tildearrow 288441617b C219: more updates 2023-08-27 23:04:40 -05:00
tildearrow 26f6f22ef5 C219: more updates
to-do:
- VGM export
- presets
- noise/invert toggles
2023-08-27 20:05:08 -05:00
tildearrow 859182bb08 C219: initial work 2023-08-27 18:46:59 -05:00
tildearrow 80961354f7 prepare for C219 2023-08-27 18:46:59 -05:00
tildearrow 886e311c0d
Merge pull request #1416 from tildearrow/doc-general
Assorted documentation upkeep.
2023-08-27 16:27:22 -05:00
tildearrow 17a88fda70 C140: update emulator
with the one from C219 branch
2023-08-27 15:52:54 -05:00
Electric Keet ba25910d48 Requested fixes. 2023-08-27 08:55:06 -07:00
Eknous 7a87702518
Merge branch 'tildearrow:master' into guimprove 2023-08-27 15:05:50 +04:00
tildearrow 440cbff5e4 GUI: update credits 2023-08-27 04:14:50 -05:00
tildearrow 64e6cf12c2 GUI: re-apply UI settings when displays are connec 2023-08-27 03:58:01 -05:00
Eknous-P 65fbdba831 wavetable list selectable sizing fix 2023-08-27 12:49:53 +04:00
tildearrow 0e19716dcd GUI: auto-detect scale factor on settings change 2023-08-27 03:31:26 -05:00
tildearrow f53bc88242 ES5506: make chan osc louder 2023-08-27 03:26:32 -05:00
tildearrow 2d5fcf8aca how could I not expose this compat flag 2023-08-27 03:19:00 -05:00
Eknous-P 4eda4aeb39 revert icon changes 2023-08-27 10:18:39 +04:00
Eknous-P fdd9b598a7 revert additive hint 2023-08-27 10:15:28 +04:00
Eknous 8192a8e0f6
Merge branch 'tildearrow:master' into guimprove 2023-08-27 10:03:06 +04:00
tildearrow dee7a1820d OPZ: fix ALG/FB macro keying off 2023-08-27 00:35:56 -05:00
tildearrow 76746dcb28 what is going on 2023-08-26 19:18:39 -05:00
tildearrow bd92347950 fix the release scripts 2023-08-26 13:09:01 -05:00
tildearrow 962943185d split 32-bit Windows release 2023-08-26 12:55:32 -05:00
tildearrow 338b67da9c Revert "re-enable DX11 on 32-bit Windows build"
This reverts commit 510bcfb56d.
2023-08-26 12:47:02 -05:00
tildearrow 2c99bc9593 Revert "oh no there's a problem"
This reverts commit 29651aabfd.
2023-08-26 12:45:06 -05:00
Electric Keet 9a9b69c319 Merge branch 'master' into doc-general 2023-08-26 10:33:01 -07:00
tildearrow b6448e8c0d disable Werror on 32-bit build 2023-08-26 12:30:19 -05:00
tildearrow 29651aabfd oh no there's a problem
why did I not remove this before? now Yuzu is mad at me
2023-08-26 11:54:25 -05:00
Eknous-P 6fa746f04d uncolor grooves remove tooltip 2023-08-26 16:30:17 +04:00
Eknous-P a6b08b5449 Merge branch 'guimprove' of github.com:Eknous-P/furnace into guimprove 2023-08-26 16:16:00 +04:00
Eknous-P a7eb62a5d6 add sample add add color 2023-08-26 16:15:40 +04:00
Eknous fb67357cf8
Merge branch 'tildearrow:master' into guimprove 2023-08-26 16:09:55 +04:00
Eknous-P 19f7376337 the rest of the add colors 2023-08-26 16:09:27 +04:00
Eknous-P 0dbe1b401f some pushaddcolor's and improve grooves 2023-08-26 16:01:56 +04:00
Eknous-P 9e405e86fa improve find/replace 2023-08-26 15:49:06 +04:00
Eknous-P 3c38a79801 more pushdestcolor 2023-08-26 15:37:28 +04:00
Eknous-P f0bcb1c06a add color push/pop 2023-08-26 15:24:32 +04:00
Eknous-P ccdd5693c6 additive hint 2023-08-26 15:16:38 +04:00
freq-mod b5d6971f93
Update sms.md
Noise mode descrption
2023-08-26 13:10:05 +02:00
Eknous-P 6250dd970f improve font settings 2023-08-26 14:20:53 +04:00
Eknous-P eef3dacc78 indent 2023-08-26 14:03:34 +04:00
Eknous-P b993d4b58d improve audio settings 2023-08-26 14:01:39 +04:00
Eknous-P 89921b1ff3 improve inital sys steeings 2023-08-26 13:53:01 +04:00
Eknous-P a832adeac5 chanosc gradient point remove is red 2023-08-26 13:35:26 +04:00
tildearrow 3dd4f3e7e8 release v0.6pre9
also fix a bug in TL macro compat
2023-08-26 03:36:28 -05:00
tildearrow 29fa249227 GUI: really fix wave synth display issues
issue #1417
2023-08-26 03:13:17 -05:00
tildearrow a17f7249d6 update settings doc
with clarifications
2023-08-25 20:41:50 -05:00
tildearrow 324fce3b1c GUI: hide sample ROMs option
OPL4 won't make it to 0.6
2023-08-25 20:41:13 -05:00
tildearrow 16bc35d75b manual system recent file tracking
issue #1406
2023-08-25 18:32:34 -05:00
tildearrow 2b0feefe28 don't add to recent
issue #1406
2023-08-25 18:13:00 -05:00
tildearrow bd95a76a48 fix nextOrder still happening after FFxx
issue #1408
2023-08-25 17:51:10 -05:00
tildearrow 41316860a5 GUI: fix wave synth display issues
issue #1417
2023-08-25 17:36:47 -05:00
tildearrow 6c5ea4b950 fix step length in macroInt 2023-08-25 17:22:04 -05:00
tildearrow c4b23e8643 K007232: fix (?) loop marker being output
issue #1409
2023-08-25 16:28:20 -05:00
tildearrow 55d7a5e9bc K007232: oscBuf was too fast 2023-08-25 04:18:22 -05:00
tildearrow 91c3c04082 fix again.... 2023-08-25 03:47:09 -05:00
tildearrow c3b5004e66 fix TL macro compat for ADSR/LFO 2023-08-25 03:38:17 -05:00
Electric Keet f4c778d90e A few more small edits.
Right-clicking every widget to see what happens....
2023-08-24 23:33:32 -07:00
Electric Keet 98a95e83c6 Assorted documentation upkeep. 2023-08-24 23:14:06 -07:00
tildearrow 06840de4c7 fix the macroInt fixes 2023-08-24 20:22:41 -05:00
tildearrow 8a1ba5a544 NFD click callback should return S_OK on OK 2023-08-24 15:34:16 -05:00
tildearrow 2b007a03e0 code style 2023-08-24 15:33:53 -05:00
tildearrow 4999d9a387
Merge pull request #1410 from GermanAizek/master
More optimize inserts using reserve()
2023-08-24 15:32:28 -05:00
tildearrow f5f1a29486 macroInt fixes
issue #1412
2023-08-24 15:28:04 -05:00
tildearrow a31b847f32 GUI: don't show wave macro for beeper ins 2023-08-24 14:59:17 -05:00
tildearrow 9bf736a513 GUI: tweak SNES ins editor 2023-08-24 14:52:18 -05:00
tildearrow 6e28a8b01c WaveSynth: fix distorted sound
issue #1411
2023-08-24 14:23:00 -05:00
Герман Семенов 1cbb61ec27 More optimize inserts using reserve()
Signed-off-by: German Semenov <GermanAizek@yandex.ru>
2023-08-24 19:08:06 +03:00
tildearrow d4e60e0c03
Merge pull request #1403 from tildearrow/macro-values-fix
Fix macro mode changes resetting Bottom and Top.
2023-08-24 04:32:17 -05:00
tildearrow cb0a8396c4 improve 2023-08-24 04:31:32 -05:00
tildearrow 95b0b25011 Merge branch 'master' into macro-values-fix 2023-08-24 03:43:56 -05:00
tildearrow 009b9f74df Merge branch 'master' of github.com:tildearrow/furnace 2023-08-24 03:39:17 -05:00
tildearrow d36b43415f fix getPan() on VERA and MSM6258 2023-08-24 03:39:05 -05:00
tildearrow 972c66812b
Merge pull request #1407 from tildearrow/doc-general
Cleaning up the AY envelope guide.
2023-08-24 03:26:45 -05:00
tildearrow d240066df8 fix issue #1371 2023-08-24 03:25:38 -05:00
tildearrow 31335b95c9 finish it 2023-08-24 03:05:25 -05:00
Electric Keet 01a5c6c4f9 Cleaning up the AY envelope guide.
Lots of formatting, small corrections, and edits for clarity.
2023-08-23 23:33:17 -07:00
tildearrow c9cbf133d6 Eknous please HELP ME 2023-08-23 17:25:05 -05:00
tildearrow 62a1a383ee dev168 - new behavior for porta in C64 2023-08-23 12:50:22 -05:00
tildearrow b946c35fa7 GUI: don't update FM/wave synth preview twice
issue #1404
2023-08-23 12:21:39 -05:00
Electric Keet 92773adb37 Correcting an ampersand.
Little things like this make a difference.
2023-08-23 09:47:31 -07:00
tildearrow e4e92f9af3 too many buttons 2023-08-23 04:29:17 -05:00
tildearrow 7e63692f60 improve demo song 2023-08-23 02:22:49 -05:00
tildearrow 5c71b64195 GUI: improve wavetable tab in ins edit 2023-08-23 02:19:36 -05:00
tildearrow f22910d8e2 Merge branch 'master' of github.com:tildearrow/furnace 2023-08-22 20:23:57 -05:00
tildearrow 577d6fd4d4 GUI: fix expand selection upwards 2023-08-22 20:23:21 -05:00
Electric Keet cae3fa43b2 Move chanOsc "Center waveform" option to next line. 2023-08-22 15:15:49 -07:00
Electric Keet ab76546f7a Fixing the fix.
This checks for both values being set to zero (their freshly-initialized state, which shouldn't happen in normal use) and sets them to proper defaults if so. Otherwise, it uses what was already there.
2023-08-22 14:23:32 -07:00
Electric Keet 4a9bf44b56 Fix macro mode changes resetting Bottom and Top. 2023-08-22 13:24:45 -07:00
tildearrow 5d3aedbbc1
Merge pull request #1390 from tildearrow/doc-general
Minor updates and cleanup of docs.
2023-08-22 05:38:45 -05:00
tildearrow cc8c79375d add demo song
by tildearrow
2023-08-22 04:14:35 -05:00
tildearrow e79f0b652a prepare to add release texts 2023-08-22 04:13:38 -05:00
tildearrow 7ba5b172d5 GUI: finally fix scroll changes order 2023-08-22 02:30:33 -05:00
tildearrow 251893c5f8 Lynx: fix sample mode switching glitch
issue #1372
2023-08-22 00:25:23 -05:00
tildearrow 54934dcfc9 dev167 - fix TL macro
previously, 127 mapped to TL 0
but now 127 maps to TL 127

yeah, the graph will look inverted I know...
2023-08-21 23:57:07 -05:00
tildearrow b35235b82e GUI: OPZ preview
it's complete
2023-08-21 22:41:35 -05:00
tildearrow 97b6b39049 GUI: OPL preview 2023-08-21 22:20:31 -05:00
tildearrow 70f774312b GUI: OPLL preview 2023-08-21 19:56:22 -05:00
tildearrow e1140c5015 GUI: OPM preview 2023-08-21 19:27:19 -05:00
tildearrow bcb8fdbf06 no longer crashes 2023-08-21 17:41:41 -05:00
tildearrow 617ee5e324 THIS CRASHES 2023-08-21 17:24:41 -05:00
tildearrow 18dc353392 GUI: why are there DPCM settings on FDS... 2023-08-21 16:16:50 -05:00
tildearrow f3c438eee5 GUI: use less video memory
don't oversample icons, big font and header font
2023-08-21 16:03:16 -05:00
Electric Keet ce9a023993 Exorcising two newlines.
Extra vertical space above a level 1 header is evil. _Evil._
2023-08-21 13:16:04 -07:00
tildearrow bb874d9415 move use math defines to top 2023-08-21 15:07:28 -05:00
tildearrow 2bf5392f7b split sample loading functions 2023-08-21 14:56:10 -05:00
tildearrow 4776eaed68 split audio/command stream export functions
into two other source files
2023-08-21 14:49:31 -05:00
Electric Keet c4f3930e3c Merge branch 'doc-general' of https://github.com/tildearrow/furnace into doc-general 2023-08-21 12:35:22 -07:00
Electric Keet ef410b7d73 Losing disclaimer. 2023-08-21 12:35:15 -07:00
Electric Keet f4726190b7
Merge branch 'master' into doc-general 2023-08-21 12:34:51 -07:00
tildearrow 510bcfb56d re-enable DX11 on 32-bit Windows build 2023-08-21 14:30:08 -05:00
tildearrow 94d8076a58 fix hang 2023-08-21 14:25:22 -05:00
tildearrow f5a881917f fix 2023-08-21 14:18:04 -05:00
tildearrow 6ba8527cb6 fix some threading issues 2023-08-21 14:18:04 -05:00
freq-mod d0f498189c
Add AY hw env tutorial 2023-08-21 16:02:44 +02:00
tildearrow 33d932f548 PCM DAC: fix osc buf
issue #1393
2023-08-21 04:30:49 -05:00
tildearrow d74172680f GUI: prepare FM preview for the other OPs 2023-08-20 20:18:27 -05:00
tildearrow 80a9677b0e update readme again 2023-08-20 19:11:02 -05:00
tildearrow 91d7157b5d GUI: Amiga rate limit 2023-08-20 19:07:38 -05:00
tildearrow 6faf80b5c6 update readme 2023-08-20 19:07:29 -05:00
tildearrow 2efbf93853
Merge pull request #1389 from tildearrow/ui-pretty
Vertical label alignment for macros.
2023-08-20 18:56:27 -05:00
Electric Keet 4cf58b158e Gotta update these images too. 2023-08-20 14:48:47 -07:00
Electric Keet 9397f95499 Vertical label alignment for macros.
I don't know how I missed these. I use them constantly!
2023-08-20 14:39:03 -07:00
Electric Keet 46a078d62a More tweaks, fixes.
Getting rid of a bunch of unused images, replacing one that was supposed to be updated already, and a touch of added documentation on the instrument editor.
2023-08-20 14:23:24 -07:00
Electric Keet 13bb256075 Adding link to FM patch tutorial. 2023-08-20 12:33:19 -07:00
Electric Keet 036aac3b80 Updating docs to 0.6pre8. 2023-08-20 12:24:51 -07:00
tildearrow 9814d7dd88 GUI: why isn't there a wave reverse option yet 2023-08-20 01:41:01 -05:00
tildearrow 5720e5670d AAAAAAAAAAAA 2023-08-20 00:46:17 -05:00
tildearrow 7479296d54 UPDATE FMT TO 10.1.0 -> **PLEASE READ!** <-
after pulling this commit, type:

```
git submodule update extern/fmt
```
2023-08-20 00:25:01 -05:00
tildearrow e3eea680d5 ExtCh: panning macro
issue #1382
2023-08-19 23:52:13 -05:00
tildearrow f3167d2fc9 C140: fix possible overflow 2023-08-19 23:39:27 -05:00
tildearrow 993c5904e2 C140: fix possible crash 2023-08-19 23:30:35 -05:00
tildearrow 396f51c75f ExtCh: fix 18xx being a post effect 2023-08-19 19:19:14 -05:00
tildearrow 6fe98f1502 damn it 2023-08-19 18:54:35 -05:00
tildearrow 1dd02dd389 fix samples going away during audio export
issue #1387
2023-08-19 18:52:08 -05:00
tildearrow d68de019d6
Merge pull request #1385 from tildearrow/ui-pretty
Vertically centering labels.
2023-08-19 18:38:13 -05:00
tildearrow 75549bdd22
Merge pull request #1386 from tildearrow/doc-general
General docs updates.
2023-08-19 18:38:02 -05:00
Electric Keet 3075a58d0d Minor doc image updates.
With all the newly aligned labels, and a few things I noticed could use slight improvement...
2023-08-19 16:34:14 -07:00
Electric Keet 10ea584857 Vertically centering labels.
Oops, missed two!
2023-08-19 16:09:22 -07:00
tildearrow dba96812aa add more raw sample import options 2023-08-19 18:01:12 -05:00
Electric Keet 6ac9fd3d91 Documentation updates. 2023-08-19 15:55:33 -07:00
tildearrow c8222fd491 handle non-BMP characters
issue #1376
2023-08-19 16:50:21 -05:00
tildearrow 14d3baae56 GUI: invert cursor follows wheel
issue #1374
2023-08-19 16:25:08 -05:00
tildearrow 487065478d GUI: mark modified in channel list 2023-08-19 15:54:49 -05:00
tildearrow f352162151 GUI: make it clear
continuous vibrato
2023-08-19 15:47:49 -05:00
cam900 8ad7a5bf7d Remove global rendersamples 2023-07-27 21:10:45 +09:00
cam900 e0dc22a6f1 Remove unnecessary functions 2023-07-26 19:39:13 +09:00
cam900 a3d54ca933 Merge branch 'master' of https://github.com/tildearrow/furnace into x1_010_bank 2023-07-26 19:28:39 +09:00
cam900 1873a2a708 Merge branch 'master' of https://github.com/tildearrow/furnace into x1_010_bank 2023-07-18 20:17:28 +09:00
cam900 b1e2e33f2d Merge branch 'master' of https://github.com/tildearrow/furnace into x1_010_bank 2023-06-29 21:36:29 +09:00
cam900 b326087721 Merge branch 'master' of https://github.com/tildearrow/furnace into x1_010_bank 2023-05-02 13:46:23 +09:00
cam900 213d613534 Fix regression 2023-04-20 10:02:29 +09:00
cam900 36f542972c Fix possible issue when bank flag is changed 2023-04-20 08:54:40 +09:00
cam900 c69318b222 Merge branch 'master' of https://github.com/tildearrow/furnace into x1_010_bank 2023-04-20 08:47:24 +09:00
cam900 2a43272c66 Spacing 2023-03-27 15:08:37 +09:00
cam900 2a881c9f66 Merge branch 'master' of https://github.com/tildearrow/furnace into x1_010_bank 2023-03-27 15:07:45 +09:00
cam900 90fa977d23 Fix seta2 preset 2023-03-27 15:07:35 +09:00
cam900 d84d678929 Merge branch 'master' of https://github.com/tildearrow/furnace into x1_010_bank 2023-03-12 21:10:00 +09:00
cam900 b1070f531a Merge branch 'master' of https://github.com/tildearrow/furnace into x1_010_bank 2023-03-12 20:59:50 +09:00
cam900 c8c2704a99 Revert unnecessary change 2023-03-12 11:56:19 +09:00
cam900 e6b84280aa Add Seta 2 Bankswitch support 2023-03-11 18:55:32 +09:00
288 changed files with 20632 additions and 15930 deletions

1
.gitignore vendored
View File

@ -6,6 +6,7 @@ release/
t/
winbuild/
win32build/
xpbuild/
macbuild/
linuxbuild/
*.swp

3
.gitmodules vendored
View File

@ -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

View File

@ -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

View File

@ -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 |

View File

@ -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"

View File

@ -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 -->

Binary file not shown.

Binary file not shown.

View File

@ -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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 576 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 648 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 436 B

View File

@ -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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 725 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 464 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 684 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 620 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 362 KiB

After

Width:  |  Height:  |  Size: 436 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 368 KiB

After

Width:  |  Height:  |  Size: 435 KiB

View File

@ -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.

View File

@ -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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 128 KiB

View File

@ -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).

View File

@ -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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 58 KiB

View File

@ -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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 94 KiB

View File

@ -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.

View File

@ -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

View File

@ -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.

View File

@ -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
|------:|--------:|:----:|-----:|--------:|:----:|-----:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 125 KiB

View File

@ -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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

@ -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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -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.

View File

@ -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.

34
doc/9-guides/envelope.md Normal file
View File

@ -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

2
extern/fmt vendored

@ -1 +1 @@
Subproject commit afbcf1e8eafc5d7f27e29c7397f22521eaa33fac
Subproject commit e57ca2e3685b160617d3d95fcd9e789c4e06ca88

View File

@ -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;
}

View File

@ -745,6 +745,7 @@ namespace IGFD
{
public:
std::string filter;
std::string firstFilter;
std::set<std::string> collectionfilters;
public:

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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)

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