Merge branch 'master' into sysmgrtooltip_syschaninfo

This commit is contained in:
Eknous 2024-08-18 22:03:29 +04:00 committed by GitHub
commit e50b3438f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
834 changed files with 780920 additions and 160607 deletions

View file

@ -36,6 +36,8 @@
#include "fileDialog.h"
#define FURNACE_APP_ID "org.tildearrow.furnace"
#define rightClickable if (ImGui::IsItemClicked(ImGuiMouseButton_Right)) ImGui::SetKeyboardFocusHere(-1);
#define ctrlWheeling ((ImGui::IsKeyDown(ImGuiKey_LeftCtrl) || ImGui::IsKeyDown(ImGuiKey_RightCtrl)) && wheelY!=0)
@ -43,7 +45,7 @@
#define unimportant(x) if (x) {handleUnimportant}
#define MARK_MODIFIED modified=true;
#define WAKE_UP drawHalt=16;
#define WAKE_UP drawHalt=5;
#define RESET_WAVE_MACRO_ZOOM \
for (DivInstrument* _wi: e->song.ins) { \
@ -56,7 +58,7 @@
// for now
#define NOTIFY_LONG_HOLD \
if (vibrator && vibratorAvailable) { \
if (SDL_HapticRumblePlay(vibrator,0.5f,20)!=0) { \
if (SDL_HapticRumblePlay(vibrator,settings.vibrationStrength,settings.vibrationLength)!=0) { \
logV("could not vibrate: %s!",SDL_GetError()); \
} \
} else { \
@ -70,25 +72,69 @@
enum FurnaceGUIRenderBackend {
GUI_BACKEND_SDL=0,
GUI_BACKEND_GL,
GUI_BACKEND_DX11
GUI_BACKEND_GL3,
GUI_BACKEND_GL2,
GUI_BACKEND_GL1,
GUI_BACKEND_DX11,
GUI_BACKEND_DX9,
GUI_BACKEND_METAL,
GUI_BACKEND_SOFTWARE
};
#ifdef HAVE_RENDER_DX11
#define GUI_BACKEND_DEFAULT GUI_BACKEND_DX11
#define GUI_BACKEND_DEFAULT_NAME "DirectX 11"
#define GUI_BACKEND_DEFAULT GUI_BACKEND_DX11
#define GUI_BACKEND_DEFAULT_NAME "DirectX 11"
#else
#ifdef HAVE_RENDER_GL
#define GUI_BACKEND_DEFAULT GUI_BACKEND_GL
#define GUI_BACKEND_DEFAULT_NAME "OpenGL"
#else
#ifdef HAVE_RENDER_SDL
#define GUI_BACKEND_DEFAULT GUI_BACKEND_SDL
#define GUI_BACKEND_DEFAULT_NAME "SDL"
#else
#error how did you manage to do that?
#ifdef HAVE_RENDER_GL
#ifdef SUPPORT_XP
#define GUI_BACKEND_DEFAULT GUI_BACKEND_GL1
#define GUI_BACKEND_DEFAULT_NAME "OpenGL 1.1"
#else
#ifdef USE_GLES
#define GUI_BACKEND_DEFAULT GUI_BACKEND_GL3
#define GUI_BACKEND_DEFAULT_NAME "OpenGL ES 2.0"
#else
#define GUI_BACKEND_DEFAULT GUI_BACKEND_GL3
#define GUI_BACKEND_DEFAULT_NAME "OpenGL 3.0"
#endif
#endif
#else
#ifdef HAVE_RENDER_SDL
#define GUI_BACKEND_DEFAULT GUI_BACKEND_SDL
#define GUI_BACKEND_DEFAULT_NAME "SDL"
#else
#define GUI_BACKEND_DEFAULT GUI_BACKEND_SOFTWARE
#define GUI_BACKEDN_DEFAULT_NAME "Software"
#endif
#endif
#endif
#ifdef SUPPORT_XP
#define GUI_WIDTH_DEFAULT 800
#define GUI_HEIGHT_DEFAULT 600
#define GUI_MAIN_FONT_DEFAULT 3
#define GUI_PAT_FONT_DEFAULT 3
#define GUI_FONT_SIZE_DEFAULT 13
#define GUI_ICON_SIZE_DEFAULT 12
#define GUI_OVERSAMPLE_DEFAULT 1
#define GUI_FONT_ANTIALIAS_DEFAULT 0
#define GUI_FONT_HINTING_DEFAULT 1
#define GUI_DECORATIONS_DEFAULT 0
#else
#define GUI_WIDTH_DEFAULT 1280
#define GUI_HEIGHT_DEFAULT 800
#define GUI_MAIN_FONT_DEFAULT 0
#define GUI_PAT_FONT_DEFAULT 0
#define GUI_FONT_SIZE_DEFAULT 18
#define GUI_ICON_SIZE_DEFAULT 16
#define GUI_OVERSAMPLE_DEFAULT 2
#define GUI_FONT_ANTIALIAS_DEFAULT 1
#define GUI_FONT_HINTING_DEFAULT 0
#define GUI_DECORATIONS_DEFAULT 1
#endif
#ifdef HAVE_MOMO
#define ngettext momo_ngettext
#endif
// TODO:
@ -231,10 +277,15 @@ enum FurnaceGUIColors {
GUI_COLOR_FM_SSG,
GUI_COLOR_FM_WAVE,
GUI_COLOR_MACRO_HIGHLIGHT,
GUI_COLOR_MACRO_VOLUME,
GUI_COLOR_MACRO_PITCH,
GUI_COLOR_MACRO_OTHER,
GUI_COLOR_MACRO_WAVE,
GUI_COLOR_MACRO_NOISE,
GUI_COLOR_MACRO_FILTER,
GUI_COLOR_MACRO_ENVELOPE,
GUI_COLOR_MACRO_GLOBAL,
GUI_COLOR_INSTR_STD,
GUI_COLOR_INSTR_FM,
@ -298,6 +349,8 @@ enum FurnaceGUIColors {
GUI_COLOR_INSTR_NDS,
GUI_COLOR_INSTR_GBA_DMA,
GUI_COLOR_INSTR_GBA_MINMOD,
GUI_COLOR_INSTR_BIFURCATOR,
GUI_COLOR_INSTR_SID2,
GUI_COLOR_INSTR_UNKNOWN,
GUI_COLOR_CHANNEL_BG,
@ -485,6 +538,7 @@ enum FurnaceGUIWindows {
GUI_WINDOW_INTRO_MON,
GUI_WINDOW_MEMORY,
GUI_WINDOW_CS_PLAYER,
GUI_WINDOW_USER_PRESETS,
GUI_WINDOW_SPOILER
};
@ -526,17 +580,20 @@ enum FurnaceGUIFileDialogs {
GUI_FILE_INS_OPEN_REPLACE,
GUI_FILE_INS_SAVE,
GUI_FILE_INS_SAVE_DMP,
GUI_FILE_INS_SAVE_ALL,
GUI_FILE_WAVE_OPEN,
GUI_FILE_WAVE_OPEN_REPLACE,
GUI_FILE_WAVE_SAVE,
GUI_FILE_WAVE_SAVE_DMW,
GUI_FILE_WAVE_SAVE_RAW,
GUI_FILE_WAVE_SAVE_ALL,
GUI_FILE_SAMPLE_OPEN,
GUI_FILE_SAMPLE_OPEN_RAW,
GUI_FILE_SAMPLE_OPEN_REPLACE,
GUI_FILE_SAMPLE_OPEN_REPLACE_RAW,
GUI_FILE_SAMPLE_SAVE,
GUI_FILE_SAMPLE_SAVE_RAW,
GUI_FILE_SAMPLE_SAVE_ALL,
GUI_FILE_EXPORT_AUDIO_ONE,
GUI_FILE_EXPORT_AUDIO_PER_SYS,
GUI_FILE_EXPORT_AUDIO_PER_CHANNEL,
@ -551,9 +608,14 @@ enum FurnaceGUIFileDialogs {
GUI_FILE_IMPORT_COLORS,
GUI_FILE_IMPORT_KEYBINDS,
GUI_FILE_IMPORT_LAYOUT,
GUI_FILE_IMPORT_USER_PRESETS,
GUI_FILE_IMPORT_USER_PRESETS_REPLACE,
GUI_FILE_IMPORT_CONFIG,
GUI_FILE_EXPORT_COLORS,
GUI_FILE_EXPORT_KEYBINDS,
GUI_FILE_EXPORT_LAYOUT,
GUI_FILE_EXPORT_USER_PRESETS,
GUI_FILE_EXPORT_CONFIG,
GUI_FILE_YRW801_ROM_OPEN,
GUI_FILE_TG100_ROM_OPEN,
GUI_FILE_MU5_ROM_OPEN,
@ -578,6 +640,8 @@ enum FurnaceGUIWarnings {
GUI_WARN_SUBSONG_DEL,
GUI_WARN_SYSTEM_DEL,
GUI_WARN_CLEAR_HISTORY,
GUI_WARN_CV,
GUI_WARN_RESET_CONFIG,
GUI_WARN_GENERIC
};
@ -586,9 +650,9 @@ enum FurnaceGUIExportTypes {
GUI_EXPORT_AUDIO=0,
GUI_EXPORT_VGM,
GUI_EXPORT_ROM,
GUI_EXPORT_ZSM,
GUI_EXPORT_CMD_STREAM,
GUI_EXPORT_AMIGA_VAL,
GUI_EXPORT_TEXT,
GUI_EXPORT_DMF
};
@ -677,6 +741,7 @@ enum FurnaceGUIActions {
GUI_ACTION_WINDOW_XY_OSC,
GUI_ACTION_WINDOW_MEMORY,
GUI_ACTION_WINDOW_CS_PLAYER,
GUI_ACTION_WINDOW_USER_PRESETS,
GUI_ACTION_COLLAPSE_WINDOW,
GUI_ACTION_CLOSE_WINDOW,
@ -723,6 +788,10 @@ enum FurnaceGUIActions {
GUI_ACTION_PAT_SELECTION_END,
GUI_ACTION_PAT_SELECTION_UP_COARSE,
GUI_ACTION_PAT_SELECTION_DOWN_COARSE,
GUI_ACTION_PAT_MOVE_UP,
GUI_ACTION_PAT_MOVE_DOWN,
GUI_ACTION_PAT_MOVE_LEFT_CHANNEL,
GUI_ACTION_PAT_MOVE_RIGHT_CHANNEL,
GUI_ACTION_PAT_DELETE,
GUI_ACTION_PAT_PULL_DELETE,
GUI_ACTION_PAT_INSERT,
@ -747,6 +816,7 @@ enum FurnaceGUIActions {
GUI_ACTION_PAT_LATCH,
GUI_ACTION_PAT_SCROLL_MODE,
GUI_ACTION_PAT_CLEAR_LATCH,
GUI_ACTION_PAT_ABSORB_INSTRUMENT,
GUI_ACTION_PAT_MAX,
GUI_ACTION_INS_LIST_MIN,
@ -763,6 +833,7 @@ enum FurnaceGUIActions {
GUI_ACTION_INS_LIST_UP,
GUI_ACTION_INS_LIST_DOWN,
GUI_ACTION_INS_LIST_DIR_VIEW,
GUI_ACTION_INS_LIST_SAVE_ALL,
GUI_ACTION_INS_LIST_MAX,
GUI_ACTION_WAVE_LIST_MIN,
@ -780,6 +851,7 @@ enum FurnaceGUIActions {
GUI_ACTION_WAVE_LIST_UP,
GUI_ACTION_WAVE_LIST_DOWN,
GUI_ACTION_WAVE_LIST_DIR_VIEW,
GUI_ACTION_WAVE_LIST_SAVE_ALL,
GUI_ACTION_WAVE_LIST_MAX,
GUI_ACTION_SAMPLE_LIST_MIN,
@ -801,6 +873,7 @@ enum FurnaceGUIActions {
GUI_ACTION_SAMPLE_LIST_STOP_PREVIEW,
GUI_ACTION_SAMPLE_LIST_DIR_VIEW,
GUI_ACTION_SAMPLE_LIST_MAKE_MAP,
GUI_ACTION_SAMPLE_LIST_SAVE_ALL,
GUI_ACTION_SAMPLE_LIST_MAX,
GUI_ACTION_SAMPLE_MIN,
@ -887,12 +960,6 @@ enum FurnaceGUIChanOscRef {
GUI_OSCREF_MAX
};
enum FurnaceGUITutorials {
GUI_TUTORIAL_OVERVIEW=0,
GUI_TUTORIAL_MAX
};
enum PasteMode {
GUI_PASTE_MODE_NORMAL=0,
GUI_PASTE_MODE_MIX_FG,
@ -1231,22 +1298,25 @@ struct Gradient2D {
struct FurnaceGUISysDefChip {
DivSystem sys;
float vol, pan;
const char* flags;
FurnaceGUISysDefChip(DivSystem s, float v, float p, const char* f):
float vol, pan, panFR;
String flags;
FurnaceGUISysDefChip(DivSystem s, float v, float p, const char* f, float pf=0.0):
sys(s),
vol(v),
pan(p),
panFR(pf),
flags(f) {}
};
struct FurnaceGUISysDef {
const char* name;
const char* extra;
String name;
String extra;
String definition;
std::vector<FurnaceGUISysDefChip> orig;
std::vector<FurnaceGUISysDef> subDefs;
void bake();
FurnaceGUISysDef(const char* n, std::initializer_list<FurnaceGUISysDefChip> def, const char* e=NULL);
FurnaceGUISysDef(const char* n, const char* def, DivEngine* e);
};
struct FurnaceGUISysCategory {
@ -1261,31 +1331,6 @@ struct FurnaceGUISysCategory {
description(NULL) {}
};
typedef std::function<void()> TutorialFunc;
struct FurnaceGUITutorialStep {
const char* text;
int waitForTrigger;
TutorialFunc run;
TutorialFunc runBefore;
TutorialFunc runAfter;
FurnaceGUITutorialStep(const char* t, int trigger=-1, TutorialFunc activeFunc=NULL, TutorialFunc beginFunc=NULL, TutorialFunc endFunc=NULL):
text(t),
waitForTrigger(trigger),
run(activeFunc),
runBefore(beginFunc),
runAfter(endFunc) {}
};
struct FurnaceGUITutorialDef {
const char* name;
std::vector<FurnaceGUITutorialStep> steps;
FurnaceGUITutorialDef():
name("Help!") {}
FurnaceGUITutorialDef(const char* n, std::initializer_list<FurnaceGUITutorialStep> step);
};
struct FurnaceGUIMacroDesc {
DivInstrumentMacro* macro;
int min, max;
@ -1412,6 +1457,14 @@ struct FurnaceGUIWaveSizeEntry {
sys(NULL) {}
};
enum FurnaceGUITextureFormat: unsigned int {
GUI_TEXFORMAT_UNKNOWN=0,
GUI_TEXFORMAT_ABGR32=1,
GUI_TEXFORMAT_ARGB32=2,
GUI_TEXFORMAT_BGRA32=4,
GUI_TEXFORMAT_RGBA32=8,
};
class FurnaceGUITexture {
};
@ -1439,6 +1492,16 @@ struct FurnaceGUIPerfMetric {
elapsed(0) {}
};
struct FurnaceGUIBackupEntry {
String name;
uint64_t size;
struct tm lastEntryTime;
FurnaceGUIBackupEntry():
size(0) {
memset(&lastEntryTime,0,sizeof(struct tm));
}
};
enum FurnaceGUIBlendMode {
GUI_BLEND_MODE_NONE=0,
GUI_BLEND_MODE_BLEND,
@ -1449,16 +1512,21 @@ enum FurnaceGUIBlendMode {
class FurnaceGUIRender {
public:
virtual ImTextureID getTextureID(FurnaceGUITexture* which);
virtual float getTextureU(FurnaceGUITexture* which);
virtual float getTextureV(FurnaceGUITexture* which);
virtual FurnaceGUITextureFormat getTextureFormat(FurnaceGUITexture* which);
virtual bool isTextureValid(FurnaceGUITexture* which);
virtual bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch);
virtual bool unlockTexture(FurnaceGUITexture* which);
virtual bool updateTexture(FurnaceGUITexture* which, void* data, int pitch);
virtual FurnaceGUITexture* createTexture(bool dynamic, int width, int height);
virtual FurnaceGUITexture* createTexture(bool dynamic, int width, int height, bool interpolate=true, FurnaceGUITextureFormat format=GUI_TEXFORMAT_ABGR32);
virtual bool destroyTexture(FurnaceGUITexture* which);
virtual void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode);
virtual void setBlendMode(FurnaceGUIBlendMode mode);
virtual void resized(const SDL_Event& ev);
virtual void clear(ImVec4 color);
virtual bool newFrame();
virtual bool canVSync();
virtual void createFontsTexture();
virtual void destroyFontsTexture();
virtual void renderGUI();
@ -1466,12 +1534,19 @@ class FurnaceGUIRender {
virtual void drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 pos1, ImVec4 color, ImVec2 canvasSize, float lineWidth);
virtual void present();
virtual bool supportsDrawOsc();
virtual const char* getStupidFragment();
virtual bool regenOscShader(const char* fragment);
virtual bool areTexturesSquare();
virtual bool getOutputSize(int& w, int& h);
virtual int getWindowFlags();
virtual void preInit();
virtual bool init(SDL_Window* win);
virtual int getMaxTextureWidth();
virtual int getMaxTextureHeight();
virtual unsigned int getTextureFormats();
virtual const char* getBackendName();
virtual const char* getVendorName();
virtual const char* getDeviceName();
virtual const char* getAPIVersion();
virtual void setSwapInterval(int swapInterval);
virtual void preInit(const DivConfig& conf);
virtual bool init(SDL_Window* win, int swapInterval);
virtual void initGUI(SDL_Window* win);
virtual void quitGUI();
virtual bool quit();
@ -1497,31 +1572,39 @@ struct PendingDrawOsc {
lineSize(0.0f) {}
};
struct FurnaceCV;
class FurnaceGUI {
DivEngine* e;
FurnaceGUIRenderBackend renderBackend;
FurnaceGUIRender* rend;
FurnaceGUITextureFormat bestTexFormat;
SDL_Window* sdlWin;
SDL_Haptic* vibrator;
bool vibratorAvailable;
FurnaceCV* cv;
FurnaceGUITexture* cvTex;
FurnaceGUITexture* sampleTex;
int sampleTexW, sampleTexH;
bool updateSampleTex;
String newOscFragment;
String workingDir, fileName, clipboard, warnString, errorString, lastError, curFileName, nextFile, sysSearchQuery, newSongQuery, paletteQuery;
String workingDir, fileName, clipboard, warnString, errorString, lastError, curFileName, nextFile, sysSearchQuery, newSongQuery, paletteQuery, sampleBankSearchQuery;
String workingDirSong, workingDirIns, workingDirWave, workingDirSample, workingDirAudioExport;
String workingDirVGMExport, workingDirZSMExport, workingDirROMExport, workingDirFont, workingDirColors, workingDirKeybinds;
String workingDirVGMExport, workingDirZSMExport, workingDirROMExport;
String workingDirFont, workingDirColors, workingDirKeybinds;
String workingDirLayout, workingDirROM, workingDirTest;
String workingDirConfig;
String mmlString[32];
String mmlStringW, grooveString, grooveListString, mmlStringModTable;
String mmlStringSNES[DIV_MAX_CHIPS];
String folderString;
std::vector<DivSystem> sysSearchResults;
std::vector<std::pair<DivSample*,bool>> sampleBankSearchResults;
std::vector<FurnaceGUISysDef> newSongSearchResults;
std::vector<int> paletteSearchResults;
FixedQueue<String,32> recentFile;
@ -1534,9 +1617,12 @@ class FurnaceGUI {
bool vgmExportDirectStream, displayInsTypeList, displayWaveSizeList;
bool portrait, injectBackUp, mobileMenuOpen, warnColorPushed;
bool wantCaptureKeyboard, oldWantCaptureKeyboard, displayMacroMenu;
bool displayNew, displayExport, displayPalette, fullScreen, preserveChanPos, sysDupCloneChannels, sysDupEnd, wantScrollList, noteInputPoly, notifyWaveChange;
bool displayNew, displayExport, displayPalette, fullScreen, preserveChanPos, sysDupCloneChannels, sysDupEnd, noteInputPoly, notifyWaveChange;
bool wantScrollListIns, wantScrollListWave, wantScrollListSample;
bool displayPendingIns, pendingInsSingle, displayPendingRawSample, snesFilterHex, modTableHex, displayEditString;
bool shaderEditor;
bool displayPendingSamples, replacePendingSample;
bool displayExportingROM;
bool changeCoarse;
bool mobileEdit;
bool killGraphics;
bool safeMode;
@ -1546,6 +1632,7 @@ class FurnaceGUI {
bool willExport[DIV_MAX_CHIPS];
int vgmExportVersion;
int vgmExportTrailingTicks;
int cvHiScore;
int drawHalt;
int zsmExportTickRate;
int macroPointSize;
@ -1601,6 +1688,12 @@ class FurnaceGUI {
std::mutex backupLock;
String backupPath;
std::vector<FurnaceGUIBackupEntry> backupEntries;
std::future<bool> backupEntryTask;
std::mutex backupEntryLock;
uint64_t totalBackupSize;
bool refreshBackups;
std::mutex midiLock;
FixedQueue<TAMidiMessage,4096> midiQueue;
MIDIMap midiMap;
@ -1613,6 +1706,7 @@ class FurnaceGUI {
ImFont* bigFont;
ImFont* headFont;
ImWchar* fontRange;
ImWchar* fontRangeB;
ImVec4 uiColors[GUI_COLOR_MAX];
ImVec4 volColors[128];
ImU32 pitchGrad[256];
@ -1643,10 +1737,25 @@ class FurnaceGUI {
int fdsCore;
int c64Core;
int pokeyCore;
int opnCore;
int opn1Core;
int opnaCore;
int opnbCore;
int opl2Core;
int opl3Core;
int esfmCore;
int opllCore;
int ayCore;
int bubsysQuality;
int dsidQuality;
int gbQuality;
int ndsQuality;
int pceQuality;
int pnQuality;
int saaQuality;
int sccQuality;
int smQuality;
int swanQuality;
int vbQuality;
int arcadeCoreRender;
int ym2612CoreRender;
int snCoreRender;
@ -1654,10 +1763,25 @@ class FurnaceGUI {
int fdsCoreRender;
int c64CoreRender;
int pokeyCoreRender;
int opnCoreRender;
int opn1CoreRender;
int opnaCoreRender;
int opnbCoreRender;
int opl2CoreRender;
int opl3CoreRender;
int esfmCoreRender;
int opllCoreRender;
int ayCoreRender;
int bubsysQualityRender;
int dsidQualityRender;
int gbQualityRender;
int ndsQualityRender;
int pceQualityRender;
int pnQualityRender;
int saaQualityRender;
int sccQualityRender;
int smQualityRender;
int swanQualityRender;
int vbQualityRender;
int pcSpeakerOutMethod;
String yrw801Path;
String tg100Path;
@ -1705,6 +1829,7 @@ class FurnaceGUI {
int loadChinese;
int loadChineseTraditional;
int loadKorean;
int loadFallback;
int fmLayout;
int sampleLayout;
int waveLayout;
@ -1802,7 +1927,6 @@ class FurnaceGUI {
int wasapiEx;
int chanOscThreads;
int renderPoolThreads;
int showPool;
int writeInsNames;
int readInsNames;
int fontBackend;
@ -1810,14 +1934,35 @@ class FurnaceGUI {
int fontBitmap;
int fontAutoHint;
int fontAntiAlias;
int fontOversample;
int selectAssetOnLoad;
int basicColors;
int playbackTime;
int shaderOsc;
int cursorWheelStep;
int vsync;
int frameRateLimit;
int displayRenderTime;
int inputRepeat;
int glRedSize;
int glGreenSize;
int glBlueSize;
int glAlphaSize;
int glDepthSize;
int glStencilSize;
int glBufferSize;
int glDoubleBuffer;
int backupEnable;
int backupInterval;
int backupMaxCopies;
int autoFillSave;
int autoMacroStepSize;
unsigned int maxUndoSteps;
float vibrationStrength;
int vibrationLength;
int s3mOPL3;
int chipManagerTooltip;
int sysTooltipChanInfoStyle;
unsigned int maxUndoSteps;
String mainFontPath;
String headFontPath;
String patFontPath;
@ -1834,14 +1979,15 @@ class FurnaceGUI {
String emptyLabel2;
String sdlAudioDriver;
String defaultAuthorName;
String locale;
DivConfig initialSys;
Settings():
settingsChanged(false),
mainFontSize(18),
patFontSize(18),
mainFontSize(GUI_FONT_SIZE_DEFAULT),
patFontSize(GUI_FONT_SIZE_DEFAULT),
headFontSize(27),
iconSize(16),
iconSize(GUI_ICON_SIZE_DEFAULT),
audioEngine(DIV_AUDIO_SDL),
audioQuality(0),
audioHiPass(1),
@ -1853,10 +1999,25 @@ class FurnaceGUI {
fdsCore(0),
c64Core(0),
pokeyCore(1),
opnCore(1),
opn1Core(1),
opnaCore(1),
opnbCore(1),
opl2Core(0),
opl3Core(0),
esfmCore(0),
opllCore(0),
ayCore(0),
bubsysQuality(3),
dsidQuality(3),
gbQuality(3),
ndsQuality(3),
pceQuality(3),
pnQuality(3),
saaQuality(3),
sccQuality(3),
smQuality(3),
swanQuality(3),
vbQuality(3),
arcadeCoreRender(1),
ym2612CoreRender(0),
snCoreRender(0),
@ -1864,10 +2025,25 @@ class FurnaceGUI {
fdsCoreRender(1),
c64CoreRender(1),
pokeyCoreRender(1),
opnCoreRender(1),
opn1CoreRender(1),
opnaCoreRender(1),
opnbCoreRender(1),
opl2CoreRender(0),
opl3CoreRender(0),
esfmCoreRender(0),
opllCoreRender(0),
ayCoreRender(0),
bubsysQualityRender(3),
dsidQualityRender(3),
gbQualityRender(3),
ndsQualityRender(3),
pceQualityRender(3),
pnQualityRender(3),
saaQualityRender(3),
sccQualityRender(3),
smQualityRender(3),
swanQualityRender(3),
vbQualityRender(3),
pcSpeakerOutMethod(0),
yrw801Path(""),
tg100Path(""),
@ -1913,6 +2089,7 @@ class FurnaceGUI {
loadChinese(0),
loadChineseTraditional(0),
loadKorean(0),
loadFallback(1),
fmLayout(4),
sampleLayout(0),
waveLayout(0),
@ -2009,7 +2186,6 @@ class FurnaceGUI {
wasapiEx(0),
chanOscThreads(0),
renderPoolThreads(0),
showPool(0),
writeInsNames(0),
readInsNames(1),
fontBackend(1),
@ -2017,14 +2193,35 @@ class FurnaceGUI {
fontBitmap(0),
fontAutoHint(1),
fontAntiAlias(1),
fontOversample(GUI_OVERSAMPLE_DEFAULT),
selectAssetOnLoad(1),
basicColors(1),
playbackTime(1),
shaderOsc(1),
cursorWheelStep(0),
vsync(1),
frameRateLimit(60),
displayRenderTime(0),
inputRepeat(0),
glRedSize(8),
glGreenSize(8),
glBlueSize(8),
glAlphaSize(0),
glDepthSize(24),
glStencilSize(0),
glBufferSize(32),
glDoubleBuffer(1),
backupEnable(1),
backupInterval(30),
backupMaxCopies(5),
autoFillSave(0),
autoMacroStepSize(0),
maxUndoSteps(100),
vibrationStrength(0.5f),
vibrationLength(20),
s3mOPL3(1),
chipManagerTooltip(1), // poll?
sysTooltipChanInfoStyle(3), // poll?
maxUndoSteps(100),
mainFontPath(""),
headFontPath(""),
patFontPath(""),
@ -2040,24 +2237,31 @@ class FurnaceGUI {
emptyLabel("..."),
emptyLabel2(".."),
sdlAudioDriver(""),
defaultAuthorName("") {}
defaultAuthorName(""),
locale("") {}
} settings;
struct Tutorial {
int userComesFrom;
bool introPlayed;
bool protoWelcome;
bool taken[GUI_TUTORIAL_MAX];
Tutorial():
userComesFrom(0),
#ifdef SUPPORT_XP
introPlayed(true),
#else
introPlayed(false),
#endif
protoWelcome(false) {
memset(taken,0,GUI_TUTORIAL_MAX*sizeof(bool));
}
} tutorial;
char finalLayoutPath[4096];
bool localeRequiresJapanese;
bool localeRequiresChinese;
bool localeRequiresChineseTrad;
bool localeRequiresKorean;
std::vector<ImWchar> localeExtraRanges;
DivInstrument* prevInsData;
unsigned char* pendingLayoutImport;
@ -2065,14 +2269,14 @@ class FurnaceGUI {
int pendingLayoutImportStep;
FixedQueue<bool*,64> pendingLayoutImportReopen;
int curIns, curWave, curSample, curOctave, curOrder, playOrder, prevIns, oldRow, editStep, exportLoops, soloChan, orderEditMode, orderCursor;
int curIns, curWave, curSample, curOctave, curOrder, playOrder, prevIns, oldRow, editStep, editStepCoarse, soloChan, orderEditMode, orderCursor;
int loopOrder, loopRow, loopEnd, isClipping, newSongCategory, latchTarget;
int wheelX, wheelY, dragSourceX, dragSourceXFine, dragSourceY, dragDestinationX, dragDestinationXFine, dragDestinationY, oldBeat, oldBar;
int curGroove, exitDisabledTimer;
int curPaletteChoice, curPaletteType;
float soloTimeout;
double exportFadeOut;
int purgeYear, purgeMonth, purgeDay;
bool patExtraButtons, patChannelNames, patChannelPairs;
unsigned char patChannelHints;
@ -2083,7 +2287,9 @@ class FurnaceGUI {
bool mixerOpen, debugOpen, inspectorOpen, oscOpen, volMeterOpen, statsOpen, compatFlagsOpen;
bool pianoOpen, notesOpen, channelsOpen, regViewOpen, logOpen, effectListOpen, chanOscOpen;
bool subSongsOpen, findOpen, spoilerOpen, patManagerOpen, sysManagerOpen, clockOpen, speedOpen;
bool groovesOpen, xyOscOpen, memoryOpen, csPlayerOpen;
bool groovesOpen, xyOscOpen, memoryOpen, csPlayerOpen, cvOpen, userPresetsOpen;
bool cvNotSerious;
bool shortIntro;
bool insListDir, waveListDir, sampleListDir;
@ -2172,9 +2378,11 @@ class FurnaceGUI {
std::vector<DivCommand> cmdStream;
std::vector<Particle> particles;
std::vector<std::pair<DivInstrument*,bool>> pendingIns;
std::vector<std::pair<DivSample*,bool>> pendingSamples;
std::vector<FurnaceGUISysCategory> sysCategories;
FurnaceGUITutorialDef tutorials[GUI_TUTORIAL_MAX];
std::vector<String> audioLoadFormats;
bool wavePreviewOn;
SDL_Scancode wavePreviewKey;
@ -2253,6 +2461,7 @@ class FurnaceGUI {
uint64_t drawTimeBegin, drawTimeEnd, drawTimeDelta;
uint64_t swapTimeBegin, swapTimeEnd, swapTimeDelta;
uint64_t eventTimeBegin, eventTimeEnd, eventTimeDelta;
uint64_t nextPresentTime;
FurnaceGUIPerfMetric perfMetrics[64];
int perfMetricsLen;
@ -2271,7 +2480,7 @@ class FurnaceGUI {
ImVec2 fourChars, threeChars, twoChars;
ImVec2 noteCellSize, insCellSize, volCellSize, effectCellSize, effectValCellSize;
SelectionPoint sel1, sel2;
int dummyRows, demandX;
int dummyRows;
int transposeAmount, randomizeMin, randomizeMax, fadeMin, fadeMax, collapseAmount;
float scaleMax;
bool fadeMode, randomMode, haveHitBounds;
@ -2472,14 +2681,30 @@ class FurnaceGUI {
ImGuiListClipper csClipper;
// export options
int audioExportType;
DivAudioExportOptions audioExportOptions;
int dmfExportVersion;
FurnaceGUIExportTypes curExportType;
// ROM export specific
DivROMExportOptions romTarget;
DivConfig romConfig;
bool romMultiFile;
bool romExportSave;
String romFilterName, romFilterExt;
String romExportPath;
DivROMExport* pendingExport;
bool romExportAvail[DIV_ROM_MAX];
bool romExportExists;
// user presets window
std::vector<int> selectedUserPreset;
std::vector<String> randomDemoSong;
void drawExportAudio(bool onWindow=false);
void drawExportVGM(bool onWindow=false);
void drawExportROM(bool onWindow=false);
void drawExportZSM(bool onWindow=false);
void drawExportAmigaVal(bool onWindow=false);
void drawExportText(bool onWindow=false);
void drawExportCommand(bool onWindow=false);
void drawExportDMF(bool onWindow=false);
@ -2501,6 +2726,9 @@ class FurnaceGUI {
void renderFMPreviewOPZ(const DivInstrumentFM& params, int pos=0);
void renderFMPreviewESFM(const DivInstrumentFM& params, const DivInstrumentESFM& esfmParams, int pos=0);
// combo with locale
static bool LocalizedComboGetter(void* data, int idx, const char** out_text);
// these ones offer ctrl-wheel fine value changes.
bool CWSliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format=NULL, ImGuiSliderFlags flags=0);
bool CWVSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format=NULL, ImGuiSliderFlags flags=0);
@ -2516,6 +2744,7 @@ class FurnaceGUI {
bool portSet(String label, unsigned int portSetID, int ins, int outs, int activeIns, int activeOuts, int& clickedPort, std::map<unsigned int,ImVec2>& portPos);
void updateWindowTitle();
void updateROMExportAvail();
void autoDetectSystem();
void autoDetectSystemIter(std::vector<FurnaceGUISysDef>& category, bool& isMatch, std::map<DivSystem,int>& defCountMap, std::map<DivSystem,DivConfig>& defConfMap, std::map<DivSystem,int>& sysCountMap, std::map<DivSystem,DivConfig>& sysConfMap);
void prepareLayout();
@ -2545,6 +2774,8 @@ class FurnaceGUI {
void drawMacros(std::vector<FurnaceGUIMacroDesc>& macros, FurnaceGUIMacroEditState& state);
void alterSampleMap(int column, int val);
void insTabFMModernHeader(DivInstrument* ins);
void insTabFM(DivInstrument* ins);
void insTabSample(DivInstrument* ins);
void drawOrderButtons();
@ -2556,7 +2787,9 @@ class FurnaceGUI {
void waveListItem(int index, float* wavePreview, int dir, int asset);
void sampleListItem(int index, int dir, int asset);
void drawSysDefs(std::vector<FurnaceGUISysDef>& category, bool& accepted, std::vector<int>& sysDefStack);
void drawSysDefs(std::vector<FurnaceGUISysDef>& category, bool& accepted, std::vector<int>& sysDefStack, bool& alreadyHover);
void printPresets(std::vector<FurnaceGUISysDef>& items, size_t depth, std::vector<int>& depthStack);
FurnaceGUISysDef* selectPreset(std::vector<FurnaceGUISysDef>& items);
void toggleMobileUI(bool enable, bool force=false);
@ -2612,6 +2845,7 @@ class FurnaceGUI {
void drawClock();
void drawTutorial();
void drawXYOsc();
void drawUserPresets();
void drawSystemChannelInfo(const DivSysDef* whichDef);
void drawSystemChannelInfoText(const DivSysDef* whichDef);
@ -2625,12 +2859,17 @@ class FurnaceGUI {
bool exportKeybinds(String path);
bool importLayout(String path);
bool exportLayout(String path);
bool importConfig(String path);
bool exportConfig(String path);
float computeGradPos(int type, int chan);
void resetColors();
void resetKeybinds();
bool splitBackupName(const char* input, String& backupName, struct tm& backupTime);
void purgeBackups(int year, int month, int day);
void readConfig(DivConfig& conf, FurnaceGUISettingGroups groups=GUI_SETTINGS_ALL);
void writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups=GUI_SETTINGS_ALL);
@ -2638,7 +2877,8 @@ class FurnaceGUI {
void commitSettings();
void syncTutorial();
void commitTutorial();
void commitState();
void syncState();
void commitState(DivConfig& conf);
void processDrags(int dragX, int dragY);
void processPoint(SDL_Event& ev);
@ -2659,6 +2899,7 @@ class FurnaceGUI {
void doDelete();
void doPullDelete();
void doInsert();
void moveSelected(int x, int y);
void doTranspose(int amount, OperationMask& mask);
String doCopy(bool cut, bool writeClipboard, const SelectionPoint& sStart, const SelectionPoint& sEnd);
void doPasteFurnace(PasteMode mode, int arg, bool readClipboard, String clipb, std::vector<String> data, int startOff, bool invalidData, UndoRegion ur);
@ -2720,11 +2961,12 @@ class FurnaceGUI {
void applyUISettings(bool updateFonts=true);
void initSystemPresets();
void initTutorial();
void activateTutorial(FurnaceGUITutorials which);
bool loadUserPresets(bool redundancy=true);
bool saveUserPresets(bool redundancy=true);
void initRandomDemoSong();
bool loadRandomDemoSong();
bool loadUserPresets(bool redundancy=true, String path="", bool append=false);
bool saveUserPresets(bool redundancy=true, String path="");
void encodeMMLStr(String& target, int* macro, int macroLen, int macroLoop, int macroRel, bool hex=false, bool bit30=false);
void decodeMMLStr(String& source, int* macro, unsigned char& macroLen, unsigned char& macroLoop, int macroMin, int macroMax, unsigned char& macroRel, bool bit30=false);
@ -2736,6 +2978,8 @@ class FurnaceGUI {
bool initRender();
bool quitRender();
ImFont* addFontZlib(const void* data, size_t len, float size_pixels, const ImFontConfig* font_cfg=NULL, const ImWchar* glyph_ranges=NULL);
const char* getSystemName(DivSystem which);
const char* getSystemPartNumber(DivSystem sys, DivConfig& flags);