1#define _CRT_SECURE_NO_WARNINGS
3#define CPPHTTPLIB_OPENSSL_SUPPORT
4#include <httplib/httplib.h>
5#include <openssl/md5.h>
6#include <openssl/sha.h>
18#define __int64 int64_t
21#define _lseek64 lseek64
22#define _O_RDONLY O_RDONLY
24#define _lseeki64 lseek64
26#define stricmp strcasecmp
35#include "GLFW/glfw3.h"
36#include "Application.h"
37#include "Data/ProjectData.h"
42#include <linux/limits.h>
43#define MAX_PATH PATH_MAX
51static std::string getExecutablePath()
53 char rawPathName[MAX_PATH];
55 GetModuleFileNameA(NULL, rawPathName, MAX_PATH);
57 readlink(
"/proc/self/exe", rawPathName, PATH_MAX);
59 return std::string(rawPathName);
62static std::string getExecutableDir()
64 std::string executablePath = getExecutablePath();
65 std::string directory = executablePath.substr(0, executablePath.find_last_of(
"\\/"));
69const char HEX_MAP[] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'A',
'B',
'C',
'D',
'E',
'F' };
71char replace(
unsigned char c)
73 return HEX_MAP[c & 0x0f];
76std::string UChar2Hex(
unsigned char c)
83 char right = (c & 0x0f);
85 hex += replace(right);
92std::wstring s2ws(
const std::string &s)
95 int slength = (int)s.length() + 1;
96 len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
97 wchar_t *buf =
new wchar_t[len];
98 MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
106std::string ShowSaveFileDialog(std::string ext)
110 WCHAR fileName[MAX_PATH];
111 ZeroMemory(fileName, MAX_PATH);
112 ZeroMemory(&ofn,
sizeof(ofn));
113 ofn.lStructSize =
sizeof(OPENFILENAME);
114 ofn.hwndOwner = NULL;
116 ofn.lpstrFilter = L
"*.*\0";
117 ofn.lpstrFile = fileName;
118 ofn.nMaxFile = MAX_PATH;
119 ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
120 ofn.lpstrDefExt = (LPWSTR)
"";
121 std::string fileNameStr;
123 if (GetSaveFileName(&ofn))
125 std::wstring ws(ofn.lpstrFile);
127 std::string str(ws.begin(), ws.end());
131 return std::string(
"");
133 char filename[PATH_MAX];
134 FILE *f = popen(
"zenity --file-selection --save",
"r");
135 fgets(filename, PATH_MAX, f);
137 filename[strcspn(filename,
"\n")] = 0;
138 return std::string(filename);
142std::string openfilename()
144 return ShowOpenFileDialog(
".obj");
147bool DeleteFileT(std::string path)
151 if (std::filesystem::remove(path))
153 std::cout <<
"File " << path <<
" deleted.\n";
158 std::cout <<
"File " << path <<
" could not be deleted.\n";
163 catch(
const std::filesystem::filesystem_error &err)
165 std::cout <<
"filesystem error: " << err.what() <<
'\n';
172std::string ShowOpenFileDialog(std::string ext)
176 WCHAR fileName[MAX_PATH];
177 ZeroMemory(fileName, MAX_PATH);
178 ZeroMemory(&ofn,
sizeof(ofn));
179 ofn.lStructSize =
sizeof(OPENFILENAME);
180 ofn.hwndOwner = NULL;
182 ofn.lpstrFilter = L
"*.*\0";
183 ofn.lpstrFile = fileName;
184 ofn.nMaxFile = MAX_PATH;
185 ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
186 ofn.lpstrDefExt = (LPWSTR)
"";
187 std::string fileNameStr;
189 if (GetOpenFileName(&ofn))
191 std::wstring ws(ofn.lpstrFile);
193 std::string str(ws.begin(), ws.end());
197 return std::string(
"");
199 char filename[PATH_MAX];
200 FILE *f = popen(
"zenity --file-selection",
"r");
201 fgets(filename, PATH_MAX, f);
203 filename[strcspn(filename,
"\n")] = 0;
204 return std::string(filename);
208std::string ReadShaderSourceFile(std::string path,
bool *result)
210 std::fstream newfile;
211 newfile.open(path.c_str(), std::ios::in);
213 if (newfile.is_open())
216 std::string res =
"";
217 getline(newfile, res,
'\0');
228 return std::string(
"");
231std::string GetExecutablePath()
233 return getExecutablePath();
236std::string GetExecutableDir()
238 return getExecutableDir();
241std::string GenerateId(uint32_t length)
246 for (
int i = 0; i < length; i++)
248 id += std::to_string(rand() % 9);
254std::string FetchURL(std::string baseURL, std::string path)
256 httplib::Client cli(baseURL);
257 auto res = cli.Get(path.c_str());
258 cli.set_read_timeout(10);
260 if (res.error() == httplib::Error::Success)
271 Log(
"Error in fetching " + baseURL+ path +
" ERROR : " + httplib::to_string(res.error()));
277char *UChar2Char(
unsigned char *data,
int length)
279 char *odata =
new char[length];
281 for (
int i = 0; i < length; i++)
283 odata[i] = (char)data[i];
289bool FileExists(std::string path,
bool writeAccess)
293 if ((_access(path.c_str(), 0)) != -1)
300 if ((_access(path.c_str(), 2)) != -1)
309 return (stat (path.c_str(), &buffer) == 0);
313bool PathExist(
const std::string &s)
316 return (stat(s.c_str(), &buffer) == 0);
322#pragma comment(lib, "Wininet.lib")
325bool IsNetWorkConnected()
328 bool bConnect = InternetCheckConnectionW(L
"http://www.google.com", FLAG_ICC_FORCE_CONNECTION, 0);
336char *ReadBinaryFile(std::string path,
int *fSize, uint32_t sizeToLoad)
338 std::ifstream in(path, std::ifstream::ate | std::ifstream::binary);
339 int size = in.tellg();
344 size = size < sizeToLoad ? size : sizeToLoad;
347 std::ifstream f1(path, std::fstream::binary);
354 char *buffer =
new char[size];
355 f1.read(buffer, size);
361char *ReadBinaryFile(std::string path, uint32_t sizeToLoad)
364 return ReadBinaryFile(path, &size, sizeToLoad);
367Hash MD5File(std::string path)
370 unsigned char *data = (
unsigned char *)ReadBinaryFile(path, &size);
371 unsigned char hash[MD5_DIGEST_LENGTH];
372 MD5(data, size, hash);
373 Hash resultHash(hash, MD5_DIGEST_LENGTH);
378void DownloadFile(std::string baseURL, std::string urlPath, std::string path,
int size)
382 std::ofstream outfile;
383 httplib::Client cli(baseURL);
385 outfile.open(path.c_str(), std::ios::binary | std::ios::out);
386 std::cout <<
"Starting download - " << baseURL << urlPath << std::endl;
387 auto res = cli.Get(urlPath.c_str(),
388 [&](
const char *data,
size_t data_length)
390 done = done + data_length;
394 float percent = (float)done / (float)size;
395 std::cout <<
"Downloaded " << (int)(percent * 100) <<
"% \r";
398 outfile.write(data, data_length);
401 std::cout <<
"Download Complete - " << path << std::endl;
408void SaveToFile(std::string filename, std::string content)
410 std::ofstream outfile;
411 outfile.open(filename);
416void Log(
const char *log)
418 std::cout << log << std::endl;
422void Log(std::string log)
424 std::cout << log << std::endl;
430void RegSet(HKEY hkeyHive,
const char *pszVar,
const char *pszValue)
433 char szValueCurrent[1000];
435 DWORD dwSize =
sizeof(szValueCurrent);
436 int iRC = RegGetValue(hkeyHive, CA2CT(pszVar), NULL, RRF_RT_ANY, &dwType, szValueCurrent, &dwSize);
437 bool bDidntExist = iRC == ERROR_FILE_NOT_FOUND;
439 if (iRC != ERROR_SUCCESS && !bDidntExist)
441 Log(
"RegGetValue( " + std::string(pszVar) +
" ) Failed : " + strerror(iRC));
446 if (dwType != REG_SZ)
448 Log(
"RegGetValue( " + std::string(pszVar) +
" ) found type unhandled " + std::to_string(dwType));
451 if (strcmp(szValueCurrent, pszValue) == 0)
453 Log(
"RegSet( \"" + std::string(pszVar) +
"\" \"" + std::string(pszValue) +
"\" ): already correct");
459 iRC = RegCreateKeyEx(hkeyHive, CA2CT(pszVar), 0, 0, 0, KEY_ALL_ACCESS, NULL, &hkey, &dwDisposition);
461 if (iRC != ERROR_SUCCESS)
463 Log(
"RegSetValue( " + std::string(pszVar) +
" ) Failed : " + strerror(iRC));
466 iRC = RegSetValueEx(hkey, L
"", 0, REG_SZ, (BYTE *)pszValue, strlen(pszValue) + 1);
468 if (iRC != ERROR_SUCCESS)
470 Log(
"RegSetValue( " + std::string(pszVar) +
" ) Failed: " + strerror(iRC));
475 Log(
"RegSet( " + std::string(pszVar) +
" ): set to \"" + std::string(pszValue) +
"\"");
480 Log(
"RegSet( " + std::string(pszVar) +
" ): changed \"" + std::string(szValueCurrent) +
"\" to \"" + std::string(pszValue) +
"\"");
491 RegSet(HKEY_CURRENT_USER,
"Software\\Classes\\.terr3d",
"TerraGen3D.TerraGen3D.1");
493 RegSet(HKEY_CURRENT_USER,
"Software\\Classes\\.terr3d\\Content Type",
"application/json");
494 RegSet(HKEY_CURRENT_USER,
"Software\\Classes\\.terr3d\\PerceivedType",
"json");
496 RegSet( HKEY_CURRENT_USER,
"Software\\Classes\\.terr3d\\OpenWithProgIds\\TerraGen3D.TerraGen3D.1",
"" );
497 RegSet(HKEY_CURRENT_USER,
"Software\\Classes\\TerraGen3D.TerraGen3D.1",
"TerraGen3D");
498 RegSet(HKEY_CURRENT_USER,
"Software\\Classes\\TerraGen3D.TerraGen3D.1\\Shell\\Open\\Command", (getExecutablePath() +
" %1").c_str());
502void MkDir(std::string path)
504 if (!PathExist(path))
507 system((std::string(
"mkdir \"") + path +
"\"").c_str());
509 system((std::string(
"mkdir -p \"") + path +
"\"").c_str());
515int get_file_size(
char *source)
517 FILE *fichier = fopen(source,
"rb");
518 fseek(fichier, 0, SEEK_END);
519 int size = ftell(fichier);
520 fseek(fichier, 0, SEEK_SET);
526void CopyFileData(std::string source, std::string destination)
529 CopyFileW(CString(source.c_str()), CString(destination.c_str()),
false);
531 int srcsize = get_file_size(source.data());
532 char *data = (
char *)malloc(srcsize);
533 int fsource = open(source.c_str(), O_RDONLY);
534 int fdest = open(destination.c_str(), O_WRONLY | O_CREAT, 0777);
535 read(fsource, data, srcsize);
536 write(fdest, data, srcsize);
543bool IsKeyDown(
int key)
545 return glfwGetKey(Application::Get()->GetWindow()->GetNativeWindow(), key) == GLFW_PRESS;
548bool IsMouseButtonDown(
int button)
550 return glfwGetMouseButton(Application::Get()->GetWindow()->GetNativeWindow(), button);
553void ShowMessageBox(std::string message, std::string title)
556 MessageBox(NULL, s2ws(message).c_str(), s2ws(title).c_str(), 0);
558 system((
"zenity --info --text=" + message +
" --title="+title +
"").c_str());
562bool LoadTexture(
Texture2D *texture,
bool loadToAssets,
bool preserveData,
bool readAlpha,
ProjectManager *projectManager)
564 std::string fileName = ShowOpenFileDialog(
".png");
566 if (fileName.size() > 3)
573 texture =
new Texture2D(fileName, preserveData, readAlpha);
575 if(projectManager ==
nullptr)
577 projectManager = ProjectManager::Get();
582 projectManager->SaveTexture(texture);
591void ToggleSystemConsole()
593 static bool state =
false;
596 ShowWindow(GetConsoleWindow(), state ? SW_SHOW : SW_HIDE);
598 std::cout <<
"Toogle Console Not Supported on Linux!" << std::endl;
602void OpenURL(std::string url)
605 std::string op = std::string(
"start ").append(url);
608 std::string op = std::string(
"xdg-open ").append(url);
std::size_t hash(const BasicJsonType &j)
hash a JSON value