automatically run the decompiler when specifying a BSP file in Import...
This commit is contained in:
parent
599056d188
commit
7a0665f156
|
|
@ -43,7 +43,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
// if the spawn was fine
|
// if the spawn was fine
|
||||||
// TODO TTimo add functionality to track the process until it dies
|
// TODO TTimo add functionality to track the process until it dies
|
||||||
|
|
||||||
bool Q_Exec(const char *cmd, char *cmdline, const char *execdir, bool bCreateConsole);
|
bool Q_Exec(const char *cmd, char *cmdline, const char *execdir, bool bCreateConsole, bool waitfor);
|
||||||
|
|
||||||
// some easy portability crap
|
// some easy portability crap
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,16 +36,23 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
#if defined (POSIX)
|
#if defined (POSIX)
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
bool Q_Exec(const char *cmd, char *cmdline, const char *, bool)
|
bool Q_Exec(const char *cmd, char *cmdline, const char *, bool, bool waitfor)
|
||||||
{
|
{
|
||||||
char fullcmd[2048];
|
char fullcmd[2048];
|
||||||
char *pCmd;
|
char *pCmd;
|
||||||
|
pid_t pid;
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
printf("Q_Exec damnit\n");
|
printf("Q_Exec damnit\n");
|
||||||
#endif
|
#endif
|
||||||
switch (fork())
|
switch ((pid = fork()))
|
||||||
{
|
{
|
||||||
|
default:
|
||||||
|
if(waitfor)
|
||||||
|
waitpid(pid, NULL, 0);
|
||||||
|
break;
|
||||||
case -1:
|
case -1:
|
||||||
return true;
|
return true;
|
||||||
break;
|
break;
|
||||||
|
|
@ -84,7 +91,7 @@ bool Q_Exec(const char *cmd, char *cmdline, const char *, bool)
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
// NOTE TTimo windows is VERY nitpicky about the syntax in CreateProcess
|
// NOTE TTimo windows is VERY nitpicky about the syntax in CreateProcess
|
||||||
bool Q_Exec(const char *cmd, char *cmdline, const char *execdir, bool bCreateConsole)
|
bool Q_Exec(const char *cmd, char *cmdline, const char *execdir, bool bCreateConsole, bool waitfor)
|
||||||
{
|
{
|
||||||
PROCESS_INFORMATION ProcessInformation;
|
PROCESS_INFORMATION ProcessInformation;
|
||||||
STARTUPINFO startupinfo = {0};
|
STARTUPINFO startupinfo = {0};
|
||||||
|
|
@ -121,7 +128,11 @@ bool Q_Exec(const char *cmd, char *cmdline, const char *execdir, bool bCreateCon
|
||||||
&startupinfo,
|
&startupinfo,
|
||||||
&ProcessInformation
|
&ProcessInformation
|
||||||
))
|
))
|
||||||
|
{
|
||||||
|
if(waitfor)
|
||||||
|
WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -264,8 +264,9 @@ public:
|
||||||
|
|
||||||
MapQ3API()
|
MapQ3API()
|
||||||
{
|
{
|
||||||
GlobalFiletypesModule::getTable().addType(Type::Name(), Name(), filetype_t("quake3 maps", "*.map"));
|
GlobalFiletypesModule::getTable().addType(Type::Name(), Name(), filetype_t("quake3 maps", "*.map", true, true, true));
|
||||||
GlobalFiletypesModule::getTable().addType(Type::Name(), Name(), filetype_t("quake3 region", "*.reg"));
|
GlobalFiletypesModule::getTable().addType(Type::Name(), Name(), filetype_t("quake3 region", "*.reg", true, true, true));
|
||||||
|
GlobalFiletypesModule::getTable().addType(Type::Name(), Name(), filetype_t("quake3 compiled maps", "*.bsp", false, true, false));
|
||||||
}
|
}
|
||||||
MapFormat* getTable()
|
MapFormat* getTable()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1089,7 +1089,7 @@ void DoTextEditor (const char* filename, int cursorpos)
|
||||||
|
|
||||||
globalOutputStream() << "Launching: " << strEditCommand.c_str() << "\n";
|
globalOutputStream() << "Launching: " << strEditCommand.c_str() << "\n";
|
||||||
// note: linux does not return false if the command failed so it will assume success
|
// note: linux does not return false if the command failed so it will assume success
|
||||||
if (Q_Exec(0, const_cast<char*>(strEditCommand.c_str()), 0, true) == false)
|
if (Q_Exec(0, const_cast<char*>(strEditCommand.c_str()), 0, true, false) == false)
|
||||||
{
|
{
|
||||||
globalOutputStream() << "Failed to execute " << strEditCommand.c_str() << ", using default\n";
|
globalOutputStream() << "Failed to execute " << strEditCommand.c_str() << ", using default\n";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -85,6 +85,7 @@ MapModules& ReferenceAPI_getMapModules();
|
||||||
#include "commands.h"
|
#include "commands.h"
|
||||||
#include "autosave.h"
|
#include "autosave.h"
|
||||||
#include "brushmodule.h"
|
#include "brushmodule.h"
|
||||||
|
#include "brush.h"
|
||||||
|
|
||||||
class NameObserver
|
class NameObserver
|
||||||
{
|
{
|
||||||
|
|
@ -1637,29 +1638,81 @@ bool Map_ImportFile(const char* filename)
|
||||||
ScopeDisableScreenUpdates disableScreenUpdates("Processing...", "Loading Map");
|
ScopeDisableScreenUpdates disableScreenUpdates("Processing...", "Loading Map");
|
||||||
|
|
||||||
bool success = false;
|
bool success = false;
|
||||||
|
|
||||||
|
if(extension_equal(path_get_extension(filename), "bsp"))
|
||||||
|
goto tryDecompile;
|
||||||
|
|
||||||
{
|
{
|
||||||
Resource* resource = GlobalReferenceCache().capture(filename);
|
Resource* resource = GlobalReferenceCache().capture(filename);
|
||||||
resource->refresh(); // avoid loading old version if map has changed on disk since last import
|
resource->refresh(); // avoid loading old version if map has changed on disk since last import
|
||||||
if(resource->load())
|
if(!resource->load())
|
||||||
{
|
{
|
||||||
NodeSmartReference clone(NewMapRoot(""));
|
GlobalReferenceCache().release(filename);
|
||||||
|
goto tryDecompile;
|
||||||
{
|
|
||||||
//ScopeTimer timer("clone subgraph");
|
|
||||||
Node_getTraversable(*resource->getNode())->traverse(CloneAll(clone));
|
|
||||||
}
|
|
||||||
|
|
||||||
Map_gatherNamespaced(clone);
|
|
||||||
Map_mergeClonedNames();
|
|
||||||
MergeMap(clone);
|
|
||||||
success = true;
|
|
||||||
}
|
}
|
||||||
|
NodeSmartReference clone(NewMapRoot(""));
|
||||||
|
Node_getTraversable(*resource->getNode())->traverse(CloneAll(clone));
|
||||||
|
Map_gatherNamespaced(clone);
|
||||||
|
Map_mergeClonedNames();
|
||||||
|
MergeMap(clone);
|
||||||
|
success = true;
|
||||||
GlobalReferenceCache().release(filename);
|
GlobalReferenceCache().release(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
SceneChangeNotify();
|
SceneChangeNotify();
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
|
|
||||||
|
tryDecompile:
|
||||||
|
|
||||||
|
const char *type = GlobalRadiant().getRequiredGameDescriptionKeyValue("q3map2_type");
|
||||||
|
int n = string_length(path_get_extension(filename));
|
||||||
|
if(n && (extension_equal(path_get_extension(filename), "bsp") || extension_equal(path_get_extension(filename), "map")))
|
||||||
|
{
|
||||||
|
StringBuffer output;
|
||||||
|
output.push_string(AppPath_get());
|
||||||
|
output.push_string("q3map2.");
|
||||||
|
output.push_string(RADIANT_EXECUTABLE);
|
||||||
|
output.push_string(" -v -game ");
|
||||||
|
output.push_string((type && *type) ? type : "quake3");
|
||||||
|
output.push_string(" -fs_basepath \"");
|
||||||
|
output.push_string(EnginePath_get());
|
||||||
|
output.push_string("\" -fs_game ");
|
||||||
|
output.push_string(gamename_get());
|
||||||
|
output.push_string(" -convert -format ");
|
||||||
|
output.push_string(Brush::m_type == eBrushTypeQuake3BP ? "map_bp" : "map");
|
||||||
|
output.push_string(" \"");
|
||||||
|
output.push_string(filename);
|
||||||
|
output.push_string("\"");
|
||||||
|
|
||||||
|
// run
|
||||||
|
Q_Exec(NULL, output.c_str(), NULL, false, true);
|
||||||
|
|
||||||
|
// rebuild filename as "filenamewithoutext_converted.map"
|
||||||
|
output.clear();
|
||||||
|
output.push_range(filename, filename + string_length(filename) - (n + 1));
|
||||||
|
output.push_string("_converted.map");
|
||||||
|
filename = output.c_str();
|
||||||
|
|
||||||
|
// open
|
||||||
|
Resource* resource = GlobalReferenceCache().capture(filename);
|
||||||
|
resource->refresh(); // avoid loading old version if map has changed on disk since last import
|
||||||
|
if(!resource->load())
|
||||||
|
{
|
||||||
|
GlobalReferenceCache().release(filename);
|
||||||
|
goto tryDecompile;
|
||||||
|
}
|
||||||
|
NodeSmartReference clone(NewMapRoot(""));
|
||||||
|
Node_getTraversable(*resource->getNode())->traverse(CloneAll(clone));
|
||||||
|
Map_gatherNamespaced(clone);
|
||||||
|
Map_mergeClonedNames();
|
||||||
|
MergeMap(clone);
|
||||||
|
success = true;
|
||||||
|
GlobalReferenceCache().release(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
SceneChangeNotify();
|
||||||
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -333,7 +333,7 @@ void RunBSP(const char* name)
|
||||||
#endif
|
#endif
|
||||||
globalOutputStream() << "Writing the compile script to '" << batpath << "'\n";
|
globalOutputStream() << "Writing the compile script to '" << batpath << "'\n";
|
||||||
globalOutputStream() << "The build output will be saved in '" << junkpath << "'\n";
|
globalOutputStream() << "The build output will be saved in '" << junkpath << "'\n";
|
||||||
Q_Exec(batpath, NULL, NULL, true);
|
Q_Exec(batpath, NULL, NULL, true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -577,7 +577,7 @@ void CWatchBSP::DoEBeginStep()
|
||||||
globalOutputStream() << "=== running build command ===\n"
|
globalOutputStream() << "=== running build command ===\n"
|
||||||
<< static_cast<const char*>(g_ptr_array_index( m_pCmd, m_iCurrentStep )) << "\n";
|
<< static_cast<const char*>(g_ptr_array_index( m_pCmd, m_iCurrentStep )) << "\n";
|
||||||
|
|
||||||
if (!Q_Exec(NULL, (char *)g_ptr_array_index( m_pCmd, m_iCurrentStep ), NULL, true ))
|
if (!Q_Exec(NULL, (char *)g_ptr_array_index( m_pCmd, m_iCurrentStep ), NULL, true, false ))
|
||||||
{
|
{
|
||||||
StringOutputStream msg(256);
|
StringOutputStream msg(256);
|
||||||
msg << "Failed to execute the following command: ";
|
msg << "Failed to execute the following command: ";
|
||||||
|
|
@ -815,7 +815,7 @@ void CWatchBSP::RoutineProcessing()
|
||||||
globalOutputStream() << cmd.c_str() << " " << cmdline.c_str() << "\n";
|
globalOutputStream() << cmd.c_str() << " " << cmdline.c_str() << "\n";
|
||||||
|
|
||||||
// execute now
|
// execute now
|
||||||
if (!Q_Exec(cmd.c_str(), (char *)cmdline.c_str(), EnginePath_get(), false))
|
if (!Q_Exec(cmd.c_str(), (char *)cmdline.c_str(), EnginePath_get(), false, false))
|
||||||
{
|
{
|
||||||
StringOutputStream msg;
|
StringOutputStream msg;
|
||||||
msg << "Failed to execute the following command: " << cmd.c_str() << cmdline.c_str();
|
msg << "Failed to execute the following command: " << cmd.c_str() << cmdline.c_str();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user