// Home Paths
+#ifdef WIN32
+#include <shlobj.h>
+#include <objbase.h>
+const GUID qFOLDERID_SavedGames = {0x4C5C32FF, 0xBB9D, 0x43b0, {0xB5, 0xB4, 0x2D, 0x72, 0xE5, 0x4E, 0xAA, 0xA4}};
+#define qREFKNOWNFOLDERID GUID
+#define qKF_FLAG_CREATE 0x8000
+#define qKF_FLAG_NO_ALIAS 0x1000
+typedef HRESULT (WINAPI qSHGetKnownFolderPath_t) (qREFKNOWNFOLDERID rfid, DWORD dwFlags, HANDLE hToken, PWSTR *ppszPath);
+static qSHGetKnownFolderPath_t *qSHGetKnownFolderPath;
+#endif
void HomePaths_Realise()
{
-#if defined(POSIX)
- const char* prefix = g_pGameDescription->getKeyValue("prefix");
- if(!string_empty(prefix))
+ do
{
- StringOutputStream path(256);
- path << DirectoryCleaned(g_get_home_dir()) << prefix << "/";
- g_qeglobals.m_userEnginePath = path.c_str();
- Q_mkdir(g_qeglobals.m_userEnginePath.c_str());
- }
- else
+ const char* prefix = g_pGameDescription->getKeyValue("prefix");
+ if(!string_empty(prefix))
+ {
+ StringOutputStream path(256);
+
+#if defined(__APPLE__)
+ path.clear();
+ path << DirectoryCleaned(g_get_home_dir()) << "Library/Application Support" << (prefix+1) << "/";
+ if(file_is_directory(path.c_str()))
+ {
+ g_qeglobals.m_userEnginePath = path.c_str();
+ break;
+ }
#endif
- {
+
+#if defined(WIN32)
+ TCHAR mydocsdir[MAX_PATH + 1];
+ wchar_t *mydocsdirw;
+ HMODULE shfolder = LoadLibrary("shfolder.dll");
+ if(shfolder)
+ qSHGetKnownFolderPath = (qSHGetKnownFolderPath_t *) GetProcAddress(shfolder, "SHGetKnownFolderPath");
+ else
+ qSHGetKnownFolderPath = NULL;
+ CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
+ if(qSHGetKnownFolderPath && qSHGetKnownFolderPath(qFOLDERID_SavedGames, qKF_FLAG_CREATE | qKF_FLAG_NO_ALIAS, NULL, &mydocsdirw) == S_OK)
+ {
+ memset(mydocsdir, 0, sizeof(mydocsdir));
+ wcstombs(mydocsdir, mydocsdirw, sizeof(mydocsdir)-1);
+ CoTaskMemFree(mydocsdirw);
+ path.clear();
+ path << DirectoryCleaned(mydocsdir) << (prefix+1) << "/";
+ if(file_is_directory(path.c_str()))
+ {
+ g_qeglobals.m_userEnginePath = path.c_str();
+ CoUninitialize();
+ FreeLibrary(shfolder);
+ break;
+ }
+ }
+ CoUninitialize();
+ if(shfolder)
+ FreeLibrary(shfolder);
+ if(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, mydocsdir))
+ {
+ path.clear();
+ path << DirectoryCleaned(mydocsdir) << "My Games/" << (prefix+1) << "/";
+ // win32: only add it if it already exists
+ if(file_is_directory(path.c_str()))
+ {
+ g_qeglobals.m_userEnginePath = path.c_str();
+ break;
+ }
+ }
+#endif
+
+#if defined(POSIX)
+ path.clear();
+ path << DirectoryCleaned(g_get_home_dir()) << prefix << "/";
+ g_qeglobals.m_userEnginePath = path.c_str();
+ break;
+#endif
+ }
+
g_qeglobals.m_userEnginePath = EnginePath_get();
}
+ while(0);
+
+ Q_mkdir(g_qeglobals.m_userEnginePath.c_str());
{
StringOutputStream path(256);
// open the Q3Rad manual
void OpenHelpURL()
{
- // at least on win32, AppPath + "Q3Rad_Manual/index.htm"
+ // at least on win32, AppPath + "docs/index.html"
StringOutputStream help(256);
- help << AppPath_get() << "Q3Rad_Manual/index.htm";
+ help << AppPath_get() << "docs/index.html";
OpenURL(help.c_str());
}
class CloneSelected : public scene::Graph::Walker
{
bool doMakeUnique;
+ NodeSmartReference worldspawn;
public:
- CloneSelected(bool d): doMakeUnique(d) { }
+ CloneSelected(bool d): doMakeUnique(d), worldspawn(Map_FindOrInsertWorldspawn(g_map))
+ {
+ }
bool pre(const scene::Path& path, scene::Instance& instance) const
{
if(path.size() == 1)
return true;
+ // ignore worldspawn, but keep checking children
+ NodeSmartReference me(path.top().get());
+ if(me == worldspawn)
+ return true;
+
if(!path.top().get().isRoot())
{
Selectable* selectable = Instance_getSelectable(instance);
if(path.size() == 1)
return;
+ // ignore worldspawn, but keep checking children
+ NodeSmartReference me(path.top().get());
+ if(me == worldspawn)
+ return;
+
if(!path.top().get().isRoot())
{
Selectable* selectable = Instance_getSelectable(instance);
}
}
-namespace
-{
- GLFont g_font(0, 0, 0, 0);
-}
-
void GlobalGL_sharedContextCreated()
{
+ GLFont *g_font = NULL;
+
// report OpenGL information
globalOutputStream() << "GL_VENDOR: " << reinterpret_cast<const char*>(glGetString (GL_VENDOR)) << "\n";
globalOutputStream() << "GL_RENDERER: " << reinterpret_cast<const char*>(glGetString (GL_RENDERER)) << "\n";
#ifdef WIN32
/* win32 is dodgy here, just use courier new then */
- g_font = glfont_create("courier new 8");
+ g_font = glfont_create("arial 9");
#else
- /* use default font here (Sans 10 is gtk default) */
GtkSettings *settings = gtk_settings_get_default();
gchar *fontname;
g_object_get(settings, "gtk-font-name", &fontname, NULL);
g_font = glfont_create(fontname);
#endif
- GlobalOpenGL().m_font = g_font.getDisplayList();
- GlobalOpenGL().m_fontHeight = g_font.getPixelHeight();
- GlobalOpenGL().m_fontAscent = g_font.getPixelAscent();
- GlobalOpenGL().m_fontDescent = g_font.getPixelDescent();
+ GlobalOpenGL().m_font = g_font;
}
void GlobalGL_sharedContextDestroyed()