Merge branch 'master' of https://github.com/tildearrow/furnace into x1_010_bank

This commit is contained in:
cam900 2023-03-12 20:59:50 +09:00
commit b1070f531a
6 changed files with 88 additions and 4 deletions

View file

@ -132,8 +132,11 @@ namespace IGFD
#define resetButtonString ICON_FA_REPEAT #define resetButtonString ICON_FA_REPEAT
#endif // resetButtonString #endif // resetButtonString
#ifndef drivesButtonString #ifndef drivesButtonString
#define drivesButtonString "Drives" #define drivesButtonString ICON_FA_HDD_O
#endif // drivesButtonString #endif // drivesButtonString
#ifndef parentDirString
#define parentDirString ICON_FA_CHEVRON_UP
#endif // parentDirString
#ifndef editPathButtonString #ifndef editPathButtonString
#define editPathButtonString ICON_FA_PENCIL #define editPathButtonString ICON_FA_PENCIL
#endif // editPathButtonString #endif // editPathButtonString
@ -167,6 +170,9 @@ namespace IGFD
#ifndef buttonResetPathString #ifndef buttonResetPathString
#define buttonResetPathString "Reset to current directory" #define buttonResetPathString "Reset to current directory"
#endif // buttonResetPathString #endif // buttonResetPathString
#ifndef buttonParentDirString
#define buttonParentDirString "Go to parent directory"
#endif
#ifndef buttonCreateDirString #ifndef buttonCreateDirString
#define buttonCreateDirString "Create Directory" #define buttonCreateDirString "Create Directory"
#endif // buttonCreateDirString #endif // buttonCreateDirString
@ -603,6 +609,10 @@ namespace IGFD
IGFD::Utils::ReplaceString(res.name, "." + res.ext, ""); IGFD::Utils::ReplaceString(res.name, "." + res.ext, "");
} }
if (res.path.empty()) {
res.path=separator;
}
if (!res.isOk) if (!res.isOk)
{ {
res.name = std::move(pfn); res.name = std::move(pfn);
@ -1191,7 +1201,7 @@ namespace IGFD
if (puDLGDirectoryMode) // directory mode if (puDLGDirectoryMode) // directory mode
SetDefaultFileName("."); SetDefaultFileName(".");
else else
SetDefaultFileName(puDLGDefaultFileName); SetDefaultFileName("");
ScanDir(vFileDialogInternal, GetCurrentPath()); ScanDir(vFileDialogInternal, GetCurrentPath());
} }
@ -1475,7 +1485,7 @@ namespace IGFD
infos->fileNameExt_optimized = prOptimizeFilenameForSearchOperations(infos->fileNameExt); infos->fileNameExt_optimized = prOptimizeFilenameForSearchOperations(infos->fileNameExt);
infos->fileType = vFileType; infos->fileType = vFileType;
if (infos->fileNameExt.empty() || (infos->fileNameExt == "." && !vFileDialogInternal.puFilterManager.puDLGFilters.empty())) return; // filename empty or filename is the current dir '.' //-V807 if (infos->fileNameExt.empty() || ((infos->fileNameExt == "." || infos->fileNameExt == "..") && !vFileDialogInternal.puFilterManager.puDLGFilters.empty())) return; // filename empty or filename is the current dir '.' //-V807
if (infos->fileNameExt != ".." && (vFileDialogInternal.puDLGflags & ImGuiFileDialogFlags_DontShowHiddenFiles) && infos->fileNameExt[0] == '.') // dont show hidden files if (infos->fileNameExt != ".." && (vFileDialogInternal.puDLGflags & ImGuiFileDialogFlags_DontShowHiddenFiles) && infos->fileNameExt[0] == '.') // dont show hidden files
if (!vFileDialogInternal.puFilterManager.puDLGFilters.empty() || (vFileDialogInternal.puFilterManager.puDLGFilters.empty() && infos->fileNameExt != ".")) // except "." if in directory mode //-V728 if (!vFileDialogInternal.puFilterManager.puDLGFilters.empty() || (vFileDialogInternal.puFilterManager.puDLGFilters.empty() && infos->fileNameExt != ".")) // except "." if in directory mode //-V728
return; return;
@ -2217,6 +2227,16 @@ namespace IGFD
if (ImGui::IsItemHovered()) if (ImGui::IsItemHovered())
ImGui::SetTooltip(buttonResetPathString); ImGui::SetTooltip(buttonResetPathString);
ImGui::SameLine();
if (IMGUI_BUTTON(parentDirString))
{
if (SetPathOnParentDirectoryIfAny()) {
OpenCurrentPath(vFileDialogInternal);
}
}
if (ImGui::IsItemHovered())
ImGui::SetTooltip(buttonParentDirString);
#ifdef WIN32 #ifdef WIN32
ImGui::SameLine(); ImGui::SameLine();
@ -3401,7 +3421,7 @@ namespace IGFD
if (ps.isOk) if (ps.isOk)
{ {
prFileDialogInternal.puFileManager.puDLGpath = ps.path; prFileDialogInternal.puFileManager.puDLGpath = ps.path;
prFileDialogInternal.puFileManager.SetDefaultFileName(vFilePathName); prFileDialogInternal.puFileManager.SetDefaultFileName("");
prFileDialogInternal.puFilterManager.puDLGdefaultExt = "." + ps.ext; prFileDialogInternal.puFilterManager.puDLGdefaultExt = "." + ps.ext;
} }
else else

View file

@ -1567,6 +1567,49 @@ void DivEngine::changeSong(size_t songIndex) {
prevRow=0; prevRow=0;
} }
void DivEngine::checkAssetDir(std::vector<DivAssetDir>& dir, size_t entries) {
bool* inAssetDir=new bool[entries];
memset(inAssetDir,0,entries*sizeof(bool));
for (DivAssetDir& i: dir) {
for (size_t j=0; j<i.entries.size(); j++) {
// erase invalid entry
if (i.entries[j]<0 || i.entries[j]>=(int)entries) {
i.entries.erase(i.entries.begin()+j);
j--;
continue;
}
// mark entry as present
inAssetDir[j]=true;
}
}
// get unsorted directory
DivAssetDir* unsortedDir=NULL;
for (DivAssetDir& i: dir) {
if (i.name=="Unsorted") {
unsortedDir=&i;
break;
}
}
// create unsorted directory if it doesn't exist
if (unsortedDir==NULL) {
dir.push_back(DivAssetDir("Unsorted"));
unsortedDir=&(*dir.rbegin());
}
// add missing items to unsorted directory
for (size_t i=0; i<entries; i++) {
if (!inAssetDir[i]) {
unsortedDir->entries.push_back(i);
}
}
delete[] inAssetDir;
}
void DivEngine::swapChannelsP(int src, int dest) { void DivEngine::swapChannelsP(int src, int dest) {
if (src<0 || src>=chans) return; if (src<0 || src>=chans) return;
if (dest<0 || dest>=chans) return; if (dest<0 || dest>=chans) return;

View file

@ -490,6 +490,9 @@ class DivEngine {
// change song (UNSAFE) // change song (UNSAFE)
void changeSong(size_t songIndex); void changeSong(size_t songIndex);
// check whether an asset directory is complete
void checkAssetDir(std::vector<DivAssetDir>& dir, size_t entries);
public: public:
DivSong song; DivSong song;
DivOrders* curOrders; DivOrders* curOrders;

View file

@ -2935,6 +2935,7 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) {
size_t pos=reader.tell(); size_t pos=reader.tell();
logD("reading sample data..."); logD("reading sample data...");
for (int i=0; i<insCount; i++) { for (int i=0; i<insCount; i++) {
logV("- %d: %d %d %d",i,pos,ds.sample[i]->samples,sampLens[i]);
if (!reader.seek(pos,SEEK_SET)) { if (!reader.seek(pos,SEEK_SET)) {
logD("%d: couldn't seek to %d",i,pos); logD("%d: couldn't seek to %d",i,pos);
throw EndOfFileException(&reader,reader.tell()); throw EndOfFileException(&reader,reader.tell());
@ -2944,6 +2945,7 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) {
} }
// convert effects // convert effects
logD("converting module...");
for (int ch=0; ch<=chCount; ch++) { for (int ch=0; ch<=chCount; ch++) {
unsigned char fxCols=1; unsigned char fxCols=1;
for (int pat=0; pat<=patMax; pat++) { for (int pat=0; pat<=patMax; pat++) {

View file

@ -411,6 +411,7 @@ void DivPlatformAmiga::tick(bool sysTick) {
if (chan[i].keyOn) { if (chan[i].keyOn) {
rWrite(0x96,1<<i); rWrite(0x96,1<<i);
if (chan[i].useWave) { if (chan[i].useWave) {
rWrite(0x9a,(128<<i));
chWrite(i,0,0); chWrite(i,0,0);
chWrite(i,2,i<<8); chWrite(i,2,i<<8);
chWrite(i,4,chan[i].audLen); chWrite(i,4,chan[i].audLen);
@ -500,6 +501,7 @@ int DivPlatformAmiga::dispatch(DivCommand c) {
case DIV_CMD_NOTE_ON: { case DIV_CMD_NOTE_ON: {
DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_AMIGA); DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_AMIGA);
if (ins->amiga.useWave) { if (ins->amiga.useWave) {
if (!chan[c.chan].useWave) chan[c.chan].updateWave=true;
chan[c.chan].useWave=true; chan[c.chan].useWave=true;
chan[c.chan].audLen=(ins->amiga.waveLen+1)>>1; chan[c.chan].audLen=(ins->amiga.waveLen+1)>>1;
if (chan[c.chan].insChanged) { if (chan[c.chan].insChanged) {

View file

@ -181,6 +181,16 @@ struct DivSubSong {
} }
}; };
struct DivAssetDir {
String name;
std::vector<int> entries;
DivAssetDir():
name("New Directory") {}
DivAssetDir(String n):
name(n) {}
};
struct DivSong { struct DivSong {
// version number used for saving the song. // version number used for saving the song.
// Furnace will save using the latest possible version, // Furnace will save using the latest possible version,
@ -351,6 +361,10 @@ struct DivSong {
std::vector<unsigned int> patchbay; std::vector<unsigned int> patchbay;
std::vector<DivGroovePattern> grooves; std::vector<DivGroovePattern> grooves;
std::vector<DivAssetDir> insDir;
std::vector<DivAssetDir> waveDir;
std::vector<DivAssetDir> sampleDir;
DivInstrument nullIns, nullInsOPLL, nullInsOPL, nullInsOPLDrums, nullInsQSound; DivInstrument nullIns, nullInsOPLL, nullInsOPL, nullInsOPLDrums, nullInsQSound;
DivWavetable nullWave; DivWavetable nullWave;
DivSample nullSample; DivSample nullSample;