Skip to content

Commit

Permalink
Allow opening SKA models from binary model configs, if available.
Browse files Browse the repository at this point in the history
- Allow browsing for SMC and BMC config files simultaneously when using the file requester.

#8
  • Loading branch information
DreamyCecil committed Jan 15, 2025
1 parent 972369e commit 5fa4a67
Show file tree
Hide file tree
Showing 9 changed files with 80 additions and 75 deletions.
2 changes: 2 additions & 0 deletions Sources/Engine/API/EngineGUI.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define FILTER_LST "List files (*.lst)\0*.lst\0"
#define FILTER_TGA "TGA files (*.tga)\0*.tga\0"
#define FILTER_SMC "SMC files (*.smc)\0*.smc\0"
#define FILTER_BMC "BMC files (*.bmc)\0*.bmc\0" // [Cecil] Binary model configs
#define FILTER_MODELCFG "Model config files (*.smc;*.bmc)\0*.smc;*.bmc\0" // [Cecil] All model configs
#define FILTER_END "\0"

// SKA studio
Expand Down
18 changes: 14 additions & 4 deletions Sources/Engine/Base/Stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1434,11 +1434,21 @@ BOOL RemoveFile(const CTFileName &fnmFile)
// check for some file extensions that can be substituted
static BOOL SubstExt_internal(CTFileName &fnmFullFileName)
{
if (fnmFullFileName.FileExt()==".mp3") {
fnmFullFileName = fnmFullFileName.NoExt()+".ogg";
if (fnmFullFileName.FileExt() == ".mp3") {
fnmFullFileName = fnmFullFileName.NoExt() + ".ogg";
return TRUE;
} else if (fnmFullFileName.FileExt()==".ogg") {
fnmFullFileName = fnmFullFileName.NoExt()+".mp3";

} else if (fnmFullFileName.FileExt() == ".ogg") {
fnmFullFileName = fnmFullFileName.NoExt() + ".mp3";
return TRUE;

// [Cecil] ASCII and binary model configs are interchangeable
} else if (fnmFullFileName.FileExt() == ".smc") {
fnmFullFileName = fnmFullFileName.NoExt() + ".bmc";
return TRUE;

} else if (fnmFullFileName.FileExt() == ".bmc") {
fnmFullFileName = fnmFullFileName.NoExt() + ".smc";
return TRUE;
}

Expand Down
4 changes: 2 additions & 2 deletions Sources/Engine/Entities/Entity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2421,7 +2421,7 @@ void CEntity::SetSkaModel_t(const CTString &fnmModel)
}
try {
// load the new model data
en_pmiModelInstance = ParseSmcFile_t(fnmModel);
en_pmiModelInstance = LoadModelInstance_t(fnmModel);
} catch (char *strErrorDefault) {
throw(strErrorDefault);
}
Expand All @@ -2441,7 +2441,7 @@ BOOL CEntity::SetSkaModel(const CTString &fnmModel)
// try to
try {
// load the default model data
en_pmiModelInstance = ParseSmcFile_t(fnmDefault);
en_pmiModelInstance = LoadModelInstance_t(fnmDefault);
// if failed
} catch(char *strErrorDefault) {
FatalError(TRANS("Cannot load default model '%s':\n%s"), fnmDefault.ConstData(), strErrorDefault);
Expand Down
24 changes: 20 additions & 4 deletions Sources/Engine/Ska/ModelInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,14 +87,30 @@ void ParseSmcFile_t(CModelInstance &mi, const CTString &fnSmcFile)
syyparse();
}

// Create model instance and parse smc file in it
CModelInstance *ParseSmcFile_t(const CTString &fnSmcFile)
// [Cecil] Create model instance load data from a model config into it
CModelInstance *LoadModelInstance_t(const CTString &fnConfigFile)
{
_yy_mi = NULL;
// Create new model instance for parser
_yy_mi = CreateModelInstance("Temp");
// Parse given smc file
ParseSmcFile_t(*_yy_mi,fnSmcFile);

// [Cecil] Parse a binary model config
if (fnConfigFile.FileExt() == ".bmc") {
CTFileStream strm;
strm.Open_t(fnConfigFile);

// Remember path to the source file, like the SMC parser
if (bRememberSourceFN) {
_yy_mi->mi_fnSourceFile = fnConfigFile;
}

ReadModelInstance_t(strm, *_yy_mi);
strm.Close();

} else {
// Parse an ASCII model config
ParseSmcFile_t(*_yy_mi, fnConfigFile);
}

return _yy_mi;
}
Expand Down
4 changes: 2 additions & 2 deletions Sources/Engine/Ska/ModelInstance.h
Original file line number Diff line number Diff line change
Expand Up @@ -271,8 +271,8 @@ class ENGINE_API CModelInstance

// Parse smc file in existing model instance
ENGINE_API void ParseSmcFile_t(CModelInstance &mi, const CTString &fnSmcFile);
// Create model instance and parse smc file in it
ENGINE_API CModelInstance *ParseSmcFile_t(const CTString &fnSmcFile);
// [Cecil] Create model instance load data from a model config into it
ENGINE_API CModelInstance *LoadModelInstance_t(const CTString &fnConfigFile);
// Create empty model instance
ENGINE_API CModelInstance *CreateModelInstance(CTString strName);
// Delete model instance
Expand Down
2 changes: 1 addition & 1 deletion Sources/EntitiesMP/GruntSka.es
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ functions:
SetSkaModel("ModelsSKA\\Enemies\\Grunt\\CommanderNoGun.smc");
CModelInstance *pmiFlamer = NULL;
try{
pmiFlamer = ParseSmcFile_t("ModelsSKA\\Weapons\\Flamer\\Flamer.smc");
pmiFlamer = LoadModelInstance_t("ModelsSKA\\Weapons\\Flamer\\Flamer.smc");
} catch(char *strErr) {
FatalError(strErr);
}
Expand Down
24 changes: 11 additions & 13 deletions Sources/SeriousSkaStudio/SeriousSkaStudio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ BOOL CSeriousSkaStudioApp::SubInitInstance()
// try to load lamp model
try
{
pmiLight = ParseSmcFile_t(_fnmApplicationPath + LAMP_MODEL_FILENAME);
pmiLight = LoadModelInstance_t(_fnmApplicationPath + LAMP_MODEL_FILENAME);
pmiLight->StretchModel(FLOAT3D(.5f,.5f,.5f)) ;
}
catch(char *strError)
Expand Down Expand Up @@ -295,9 +295,8 @@ void CSeriousSkaStudioApp::OnFileOpen()
{
CTFileName fnSim;
// get file name
fnSim = _EngineGUI.FileRequester( "Select existing Smc file",
"ASCII model files (*.smc)\0*.smc\0"
"All files (*.*)\0*.*\0\0",
fnSim = _EngineGUI.FileRequester("Select a model config file",
FILTER_MODELCFG FILTER_ALL FILTER_END // [Cecil] Using filters
"Open directory", "Models\\", "");
if (fnSim=="") return;

Expand Down Expand Up @@ -792,7 +791,7 @@ void CSeriousSkaStudioApp::ReloadRootModelInstance()
pDoc->m_ModelInstance->Clear();
// try parsing smc file
try {
pDoc->m_ModelInstance = ParseSmcFile_t(pDoc->m_ModelInstance->mi_fnSourceFile);
pDoc->m_ModelInstance = LoadModelInstance_t(pDoc->m_ModelInstance->mi_fnSourceFile);
} catch(char *strError) {
// error in parsing occured
ErrorMessage("%s",strError);
Expand Down Expand Up @@ -1226,9 +1225,9 @@ CModelInstance *CSeriousSkaStudioApp::OnAddNewModelInstance()
CSeriousSkaStudioDoc *pDoc = GetDocument();
CTFileName fnSim;
// get file name
fnSim = _EngineGUI.FileRequester( "Type name for new Smc file or select existing one",
"ASCII model files (*.smc)\0*.smc\0"
"All files (*.*)\0*.*\0\0",
fnSim = _EngineGUI.FileRequester("Type name for a new model config file or select an existing one",
// [Cecil] TODO: Use FILTER_MODELCFG when it becomes possible to save into both SMC and BMC
FILTER_SMC FILTER_ALL FILTER_END // [Cecil] Using filters
"Open directory", "Models\\", "");
if (fnSim=="") return NULL;
CTFileName fnFull;
Expand All @@ -1255,7 +1254,7 @@ CModelInstance *CSeriousSkaStudioApp::OnAddNewModelInstance()
// close file
ostrFile.Close();
// load new smc file
pmi = ParseSmcFile_t(fnFull);
pmi = LoadModelInstance_t(fnFull);
}
catch(char *strError)
{
Expand All @@ -1281,7 +1280,7 @@ CModelInstance *CSeriousSkaStudioApp::OnOpenExistingInstance(CTString strModelIn
// start parsing smc file
try
{
pmi = ParseSmcFile_t(_fnmApplicationPath + strModelInstance);
pmi = LoadModelInstance_t(_fnmApplicationPath + strModelInstance);
}
catch(char *strError)
{
Expand Down Expand Up @@ -1413,9 +1412,8 @@ BOOL CSeriousSkaStudioApp::SaveModelAs(CModelInstance *pmi)

// get smc file name
CTFileName fnSim;
fnSim = _EngineGUI.FileRequester( "Select existing Smc file",
"ASCII model files (*.smc)\0*.smc\0"
"All files (*.*)\0*.*\0\0",
fnSim = _EngineGUI.FileRequester("Select a model config file",
FILTER_MODELCFG FILTER_ALL FILTER_END // [Cecil] Using filters
"Open directory", "Models\\", "",NULL,FALSE);
if (fnSim=="") return FALSE;

Expand Down
7 changes: 3 additions & 4 deletions Sources/SeriousSkaStudio/SeriousSkaStudioView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1235,9 +1235,8 @@ void CSeriousSkaStudioView::OnAddChildModelInstance()
}

CTFileName fnSim;
fnSim = _EngineGUI.FileRequester( "Open ASCII intermediate files",
"ASCII model files (*.smc)\0*.smc\0"
"All files (*.*)\0*.*\0\0",
fnSim = _EngineGUI.FileRequester("Select a model config file",
FILTER_MODELCFG FILTER_ALL FILTER_END // [Cecil] Using filters
"Open directory", "Models\\", "");
if (fnSim=="") return;

Expand All @@ -1246,7 +1245,7 @@ void CSeriousSkaStudioView::OnAddChildModelInstance()
CModelInstance *pcmi=NULL;
try
{
pcmi = ParseSmcFile_t(fnFull);
pcmi = LoadModelInstance_t(fnFull);
}
catch(char *strError)
{
Expand Down
70 changes: 25 additions & 45 deletions Sources/WorldEditor/CtrlBrowseFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,45 +133,29 @@ void CCtrlBrowseFile::OnClicked()
// file name to contain selection intersecting file
CTFileName fnIntersectingFile = GetIntersectingFile();

// call file requester
CTFileName fnChoosedFile;
if( fnIntersectingFile.FileExt() == ".mdl")
{
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
FILTER_MDL FILTER_ALL FILTER_END,
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
}
else if( fnIntersectingFile.FileExt() == ".tex")
{
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
FILTER_TEX FILTER_ALL FILTER_END,
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
}
else if( fnIntersectingFile.FileExt() == ".wav")
{
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
FILTER_WAV FILTER_ALL FILTER_END,
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
}
else if( fnIntersectingFile.FileExt() == ".smc")
{
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
FILTER_SMC FILTER_ALL FILTER_END,
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
}
else
{
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
FILTER_ALL FILTER_MDL FILTER_TEX FILTER_WAV FILTER_END,
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
// [Cecil] Simplified chunk of code for opening an appropriate file requester
const CTString strFileExt = fnIntersectingFile.FileExt();
const char *pchFilters = FILTER_ALL FILTER_MDL FILTER_TEX FILTER_WAV FILTER_END;

if (strFileExt == ".mdl") {
pchFilters = FILTER_MDL FILTER_ALL FILTER_END;

} else if (strFileExt == ".tex") {
pchFilters = FILTER_TEX FILTER_ALL FILTER_END;

} else if (strFileExt == ".wav") {
pchFilters = FILTER_WAV FILTER_ALL FILTER_END;

// [Cecil] Both ASCII and binary model configs
} else if (strFileExt == ".smc" || strFileExt == ".bmc") {
pchFilters = FILTER_MODELCFG FILTER_ALL FILTER_END;
}

if( fnChoosedFile == "") return;
// Call file requester
const CTString fnChosenFile = _EngineGUI.FileRequester("Choose file", pchFilters, KEY_NAME_REQUEST_FILE_DIR,
fnIntersectingFile.FileDir(), fnIntersectingFile.FileName() + strFileExt);

if (fnChosenFile == "") return;

// for each of the selected entities
FOREACHINDYNAMICCONTAINER(pDoc->m_selEntitySelection, CEntity, iten)
Expand All @@ -181,14 +165,10 @@ void CCtrlBrowseFile::OnClicked()
// discard old entity settings
iten->End();
// set new file name value
if( m_bFileNameNoDep)
{
ENTITYPROPERTY( &*iten, penpProperty->ep_slOffset, CTFileNameNoDep) =
(CTFileNameNoDep) fnChoosedFile;
}
else
{
ENTITYPROPERTY( &*iten, penpProperty->ep_slOffset, CTFileName) = fnChoosedFile;
if (m_bFileNameNoDep) {
ENTITYPROPERTY(&*iten, penpProperty->ep_slOffset, CTFileNameNoDep) = fnChosenFile;
} else {
ENTITYPROPERTY(&*iten, penpProperty->ep_slOffset, CTFileName) = fnChosenFile;
}
// apply new entity settings
iten->Initialize();
Expand Down

0 comments on commit 5fa4a67

Please sign in to comment.