--- /dev/null
+#include "GenerateJSON.hpp"\r
+\r
+namespace\r
+{\r
+ int ADFUNC_DXconvAnsiToWide(int destsize, WCHAR* wstrDest, const CHAR* strSrc )\r
+ {\r
+ // \88ø\90\94\82Ì*\82ªNULL\82Ì\8fê\8d\87\82Í\83G\83\89\81[\r
+ if( strSrc==NULL )\r
+ return 0;\r
+ int ct = strlen(strSrc) + 1;\r
+ if( wstrDest == NULL )\r
+ return MultiByteToWideChar( CP_ACP, 0, strSrc, ct, NULL, 0 );\r
+ int nResult = MultiByteToWideChar( CP_ACP, 0, strSrc, ct, wstrDest, destsize );\r
+ wstrDest[destsize-1] = 0;\r
+\r
+ if( nResult == 0 )\r
+ return 0;\r
+ return nResult;\r
+ }\r
+\r
+ TCHAR* _ftot_s( TCHAR* pString, size_t Size, float Value, int FracDigits )\r
+ {\r
+ if( pString == NULL )\r
+ goto _error;\r
+ TCHAR* pSource = pString;\r
+ if( *(long*)&Value < 0 )\r
+ {\r
+ if( (size_t)( pString - pSource ) >= Size )\r
+ goto _error;\r
+ *pString++ = '-';\r
+ *(long*)&Value ^= 0x80000000;\r
+ }\r
+ TCHAR* pBegin = pString;\r
+ int Integer = (int)Value;\r
+ for( int i = 10; i <= Integer; i *= 10, pString++ );\r
+ if( (size_t)( pString - pSource ) >= Size )\r
+ goto _error;\r
+ TCHAR* pCode = pString++;\r
+ *pCode-- = '0' + (char)( Integer % 10 );\r
+ for( int i = Integer / 10; i != 0; i /= 10 )\r
+ *pCode-- = '0' + (char)( i % 10 );\r
+ if( FracDigits > 0 )\r
+ {\r
+ if( (size_t)( pString - pSource ) >= Size )\r
+ goto _error;\r
+ *pString++ = '.';\r
+ while( FracDigits-- > 1 )\r
+ {\r
+ Value -= Integer;\r
+ Integer = (int)( Value *= 10.0f );\r
+ if( (size_t)( pString - pSource ) >= Size )\r
+ goto _error;\r
+ *pString++ = '0' + (char)Integer;\r
+ }\r
+ Integer = (int)( ( Value - Integer ) * 10.0f + 0.5f );\r
+ if( Integer < 10 )\r
+ {\r
+ if( (size_t)( pString - pSource ) >= Size )\r
+ goto _error;\r
+ *pString++ = '0' + (char)Integer;\r
+ }\r
+ else\r
+ {\r
+ pCode = pString - 1;\r
+ if( (size_t)( pString - pSource ) >= Size )\r
+ goto _error;\r
+ *pString++ = '0';\r
+ do\r
+ {\r
+ if( *pCode == '.' )\r
+ pCode--;\r
+ if( *pCode != '9' )\r
+ {\r
+ *pCode += 1;\r
+ break;\r
+ }\r
+ else\r
+ *pCode = '0';\r
+ if( pCode == pBegin )\r
+ {\r
+ if( (size_t)( pString - pSource ) >= Size )\r
+ goto _error;\r
+ TCHAR* pEnd = pString++;\r
+ while( pEnd-- != pCode )\r
+ *( pEnd + 1 ) = *pEnd;\r
+ *pCode = '1';\r
+ }\r
+ } while( *pCode-- == '0' );\r
+ }\r
+ }\r
+ if( (size_t)( pString - pSource ) >= Size )\r
+ goto _error;\r
+ *pString = '\0';\r
+ return pSource;\r
+_error:\r
+ __debugbreak();\r
+ return NULL;\r
+ }\r
+\r
+ BOOL DeleteDirectory( LPCTSTR lpPathName )\r
+ {\r
+ // \93ü\97Í\92l\83`\83F\83b\83N\r
+ if( NULL == lpPathName )\r
+ {\r
+ return FALSE;\r
+ }\r
+\r
+ // \83f\83B\83\8c\83N\83g\83\8a\96¼\82Ì\95Û\91¶\81i\8fI\92[\82É'\'\82ª\82È\82¢\82È\82ç\95t\82¯\82é\81j\r
+ TCHAR szDirectoryPathName[_MAX_PATH];\r
+ _tcsncpy_s( szDirectoryPathName, _MAX_PATH, lpPathName, _TRUNCATE );\r
+ if( '\\' != szDirectoryPathName[_tcslen(szDirectoryPathName) - 1] )\r
+ { // \88ê\94Ô\8dÅ\8cã\82É'\'\82ª\82È\82¢\82È\82ç\95t\89Á\82·\82é\81B\r
+ _tcsncat_s( szDirectoryPathName, _MAX_PATH, _T("\\"), _TRUNCATE );\r
+ }\r
+\r
+ // \83f\83B\83\8c\83N\83g\83\8a\93à\82Ì\83t\83@\83C\83\8b\91\96\8d¸\97p\82Ì\83t\83@\83C\83\8b\96¼\8dì\90¬\r
+ TCHAR szFindFilePathName[_MAX_PATH];\r
+ _tcsncpy_s( szFindFilePathName, _MAX_PATH, szDirectoryPathName, _TRUNCATE );\r
+ _tcsncat_s( szFindFilePathName, _MAX_PATH, _T("*"), _TRUNCATE );\r
+\r
+ // \83f\83B\83\8c\83N\83g\83\8a\93à\82Ì\83t\83@\83C\83\8b\91\96\8d¸\8aJ\8en\r
+ WIN32_FIND_DATA fd;\r
+ HANDLE hFind = FindFirstFile( szFindFilePathName, &fd );\r
+ if( INVALID_HANDLE_VALUE == hFind )\r
+ { // \91\96\8d¸\91Î\8fÛ\83t\83H\83\8b\83_\82ª\91¶\8dÝ\82µ\82È\82¢\81B\r
+ return FALSE;\r
+ }\r
+\r
+ do\r
+ {\r
+ //if( '.' != fd.cFileName[0] )\r
+ if( 0 != _tcscmp( fd.cFileName, _T(".") ) // \83J\83\8c\83\93\83g\83t\83H\83\8b\83_\81u.\81v\82Æ\r
+ && 0 != _tcscmp( fd.cFileName, _T("..") ) ) // \90e\83t\83H\83\8b\83_\81u..\81v\82Í\81A\8f\88\97\9d\82ð\83X\83L\83b\83v\r
+ {\r
+ TCHAR szFoundFilePathName[_MAX_PATH];\r
+ _tcsncpy_s( szFoundFilePathName, _MAX_PATH, szDirectoryPathName, _TRUNCATE );\r
+ _tcsncat_s( szFoundFilePathName, _MAX_PATH, fd.cFileName, _TRUNCATE );\r
+\r
+ if( FILE_ATTRIBUTE_DIRECTORY & fd.dwFileAttributes )\r
+ { // \83f\83B\83\8c\83N\83g\83\8a\82È\82ç\8dÄ\8bN\8cÄ\82Ñ\8fo\82µ\82Å\8dí\8f\9c\r
+ if( !DeleteDirectory( szFoundFilePathName ) )\r
+ {\r
+ FindClose( hFind );\r
+ return FALSE;\r
+ }\r
+ }\r
+ else\r
+ { // \83t\83@\83C\83\8b\82È\82çWin32API\8aÖ\90\94\82ð\97p\82¢\82Ä\8dí\8f\9c\r
+ if( !DeleteFile( szFoundFilePathName ) )\r
+ {\r
+ FindClose( hFind );\r
+ return FALSE;\r
+ }\r
+ }\r
+ }\r
+ } while( FindNextFile( hFind, &fd ) );\r
+\r
+ FindClose( hFind );\r
+\r
+ return RemoveDirectory( lpPathName );\r
+ }\r
+\r
+};\r
+\r
+JsonGen::JsonGen()\r
+{\r
+ HANDLE hFind,hPmdFind,hTxtFind; // Directory Pmd Text\r
+ WIN32_FIND_DATA win32fd_dir,win32fd_pmd,win32fd_txt; // Directory Pmd Text\r
+ TCHAR tcsTmpPath[MAX_PATH] = {0};\r
+ TCHAR tcsTmpPath_Pmd[MAX_PATH] = {0};\r
+ TCHAR tcsTmpDir[MAX_PATH] = {0};\r
+\r
+ std::vector<std::wstring> pmd_paths;\r
+ std::wstring prejson;\r
+ DxLib::VECTOR prePos = {0},curPos = {0},lclPos = {0};\r
+ DxLib::MATRIX chglcl = {0};\r
+\r
+ char pmd_model_name_[256] = {0};\r
+ char pmd_author_name_[256] = {0};\r
+\r
+ int exist_num_pmd_ = 0;\r
+\r
+ int model_handle_ = 0;\r
+\r
+ FILE *json_file = 0;\r
+\r
+ // resources/models/\93à\8c\9f\8dõ\81@\97ñ\8b\93\r
+ hFind = FindFirstFile(_T("\\resources\\models\\?*"), &win32fd_dir);\r
+\r
+ if (hFind == INVALID_HANDLE_VALUE) {\r
+ return;\r
+ }\r
+\r
+ do {\r
+ if (win32fd_dir.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&\r
+ _tcscmp(win32fd_dir.cFileName,_T("."))!=0 &&\r
+ _tcscmp(win32fd_dir.cFileName,_T(".."))!=0 &&\r
+ _tcscmp(win32fd_dir.cFileName,_T(".svn"))!=0) {\r
+ _tcscpy_s(tcsTmpDir,_T("\\resources\\models\\"));\r
+ _tcscat_s(tcsTmpDir,win32fd_dir.cFileName);\r
+ _tcscat_s(tcsTmpDir,_T("\\"));\r
+\r
+ ZeroMemory(tcsTmpPath,MAX_PATH);\r
+ _tcscpy_s(tcsTmpPath,tcsTmpDir);\r
+ _tcscat_s(tcsTmpPath,_T("info.json"));\r
+\r
+ // info.json\82ª\91¶\8dÝ\82µ\82È\82¢\8fê\8d\87\81Apmd\82É\8f]\82Á\82Ä\8dì\90¬\r
+ if(!PathFileExists(tcsTmpPath))\r
+ {\r
+ ZeroMemory(tcsTmpPath_Pmd,MAX_PATH);\r
+ _tcscpy_s(tcsTmpPath_Pmd,tcsTmpDir);\r
+ _tcscat_s(tcsTmpPath_Pmd,_T("*.pmd"));\r
+ hPmdFind = FindFirstFile(tcsTmpPath_Pmd, &win32fd_pmd);\r
+ if(hPmdFind < 0)\r
+ {\r
+ FindClose(hPmdFind);\r
+ continue;\r
+ }\r
+\r
+ TCHAR cur_dir[MAX_PATH];\r
+ ZeroMemory(cur_dir,MAX_PATH);\r
+ GetCurrentDirectory(MAX_PATH,cur_dir);\r
+ bool flag = false;\r
+ for(int k = MAX_PATH - 1;k != 0;--k)\r
+ {\r
+ if( cur_dir[k] == _T('\\') )\r
+ {\r
+ cur_dir[k] = 0;\r
+ break;\r
+ }\r
+ }\r
+ do {\r
+ std::wstring tmp_path = cur_dir;\r
+ tmp_path += _T("\\resources\\models\\");\r
+ tmp_path += win32fd_dir.cFileName;\r
+ tmp_path += _T("\\");\r
+ tmp_path += win32fd_pmd.cFileName;\r
+ pmd_paths.push_back(tmp_path);\r
+ } while (FindNextFile(hPmdFind, &win32fd_pmd));\r
+ FindClose(hPmdFind);\r
+\r
+ for(int i = 0;i < pmd_paths.size();++i){\r
+ char pmd_info[PMDINFO_SIZE+1];\r
+ int fd = _topen(pmd_paths[i].c_str(),O_RDONLY);\r
+ read(fd,pmd_info,PMDINFO_SIZE);\r
+ close(fd);\r
+\r
+ // \83\82\83f\83\8b\96¼\8eæ\93¾\r
+ strcpy_s(pmd_model_name_,pmd_info+7);\r
+\r
+ int cnt = 7 + strlen(pmd_info+7);\r
+ while(cnt < PMDINFO_SIZE){\r
+ if(!strncmp("\83\82\83f\83\8a\83\93\83O",pmd_info+cnt,10))break;\r
+ else ++cnt;\r
+ }\r
+ if(cnt == PMDINFO_SIZE)\r
+ {\r
+ strcpy_s(pmd_author_name_,"Unknown");\r
+ }else{\r
+ for(cnt;cnt<PMDINFO_SIZE && (*(pmd_info+cnt) != 0x46 && *(pmd_info+cnt-1) != 0x81);++cnt);\r
+ int tmp_str_cnt = 1;\r
+ for(tmp_str_cnt;cnt+tmp_str_cnt<PMDINFO_SIZE && (*(pmd_info+cnt+tmp_str_cnt) != 0x0a && *(pmd_info+cnt+tmp_str_cnt) != 0x20);++tmp_str_cnt);\r
+ // \8dì\8eÒ\8eæ\93¾\r
+ strncpy_s(pmd_author_name_,pmd_info+cnt+1,tmp_str_cnt-1);\r
+ }\r
+\r
+ TCHAR tmp_mv1_path[MAX_PATH] = {0};\r
+ _tcscpy_s(tmp_mv1_path,pmd_paths[i].c_str());\r
+\r
+ model_handle_ = MV1LoadModel( tmp_mv1_path );\r
+ int tex_num = MV1GetTextureNum( model_handle_ );\r
+ int frame_num = MV1GetFrameNum( model_handle_ );\r
+\r
+\r
+ // \83{\81[\83\93\82É\8aî\82Ã\82¢\82½\83\82\83f\83\8b\82Ì\8d\82\82³\90Ý\92è\r
+ for(int j = 0;j < frame_num;++j)\r
+ {\r
+ curPos = MV1GetFramePosition( model_handle_, j );\r
+ chglcl = MV1GetFrameLocalMatrix( model_handle_, j );\r
+ lclPos.x = chglcl.m[3][0];\r
+ lclPos.y = chglcl.m[3][1];\r
+ lclPos.z = chglcl.m[3][2];\r
+\r
+ if( prePos.y < curPos.y &&\r
+ lclPos.x == curPos.x &&\r
+ lclPos.y == curPos.y &&\r
+ lclPos.z == curPos.z)prePos = curPos;\r
+ }\r
+\r
+ // JSON\82Ì\8d\\92z\r
+ prejson = _T("{\n\t\"name\": \"char:");\r
+ size_t tmp_w_s_m = ADFUNC_DXconvAnsiToWide(0,0,pmd_model_name_);\r
+ TCHAR *tmp_w_m = new TCHAR[tmp_w_s_m + 1];\r
+ ADFUNC_DXconvAnsiToWide(tmp_w_s_m,tmp_w_m,pmd_model_name_);\r
+ prejson += tmp_w_m;\r
+ prejson += _T(":");\r
+ size_t tmp_w_s_a = ADFUNC_DXconvAnsiToWide(0,0,pmd_author_name_);\r
+ TCHAR *tmp_w_a = new TCHAR[tmp_w_s_a + 1];\r
+ ADFUNC_DXconvAnsiToWide(tmp_w_s_a,tmp_w_a,pmd_author_name_);\r
+ prejson += tmp_w_a;\r
+ prejson += _T("\8e®\",\n\t\"character\":\n\t\t{\n\t\t\t\"height\":");\r
+ TCHAR tmp_f[32];\r
+ _ftot_s(tmp_f,32,floor(prePos.y*2)/10.0f,2);\r
+ prejson += tmp_f;\r
+ prejson += _T(",\n\t\t\t\"motions\":\n\t\t\t\t{\n\t\t\t\t\t\"stand\":\"basic_stand.vmd\",\n\t\t\t\t\t\"walk\": \t\"basic_walk.vmd\",\n\t\t\t\t\t\"run\":\t\"basic_run.vmd\"\n\t\t\t\t}\n\t\t}\n}");\r
+ TCHAR tmp_dir[MAX_PATH];\r
+ _tcscpy_s(tmp_dir,_T("\\resources\\models\\"));\r
+ _tcscat_s(tmp_dir,tmp_w_a);\r
+ _tcscat_s(tmp_dir,_T("\8e®"));\r
+ _tcscat_s(tmp_dir,tmp_w_m);\r
+ _tcscat_s(tmp_dir,_T("\\"));\r
+ _wmkdir(tmp_dir);\r
+ delete [] tmp_w_m;\r
+ delete [] tmp_w_a;\r
+ TCHAR json_path[MAX_PATH];\r
+ _tcscpy_s(json_path,tmp_dir);\r
+ _tcscat_s(json_path,_T("info.json"));\r
+ _tfopen_s(&json_file,json_path, _T("w, ccs=UTF-8"));\r
+ fseek(json_file, 0, SEEK_SET);\r
+ _ftprintf_s(json_file,prejson.c_str());\r
+ fclose(json_file);\r
+ TCHAR tmp_src[MAX_PATH];\r
+ TCHAR tmp_cpy[MAX_PATH];\r
+\r
+ // \83e\83N\83X\83`\83\83\82Ì\83R\83s\81[\r
+ for(int t = 0;t < tex_num;++t)\r
+ {\r
+ _tcscpy_s(tmp_src,tcsTmpDir);\r
+ _tcscat_s(tmp_src,MV1GetTextureName( model_handle_, t));\r
+ _tcscpy_s(tmp_cpy,tmp_dir);\r
+ _tcscat_s(tmp_cpy,MV1GetTextureName( model_handle_, t));\r
+ CopyFile(tmp_src,tmp_cpy,TRUE);\r
+ }\r
+ TCHAR tmp_txt_f[MAX_PATH];\r
+ _tcscpy_s(tmp_txt_f,tcsTmpDir);\r
+ _tcscat_s(tmp_txt_f,_T("*.txt"));\r
+ hTxtFind = FindFirstFile(tmp_txt_f,&win32fd_txt);\r
+ do{\r
+ _tcscpy_s(tmp_src,tcsTmpDir);\r
+ _tcscat_s(tmp_src,win32fd_txt.cFileName);\r
+ _tcscpy_s(tmp_cpy,tmp_dir);\r
+ _tcscat_s(tmp_cpy,win32fd_txt.cFileName);\r
+ CopyFile(tmp_src,tmp_cpy,TRUE);\r
+ }while(FindNextFile(hTxtFind, &win32fd_txt));\r
+ FindClose(hTxtFind);\r
+ TCHAR tmp_type[128] = {0};\r
+ _tsplitpath(pmd_paths[i].c_str(),NULL,NULL,tmp_cpy,tmp_type);\r
+ _tcscat_s(tmp_cpy,tmp_type);\r
+ _tcscpy_s(tmp_type,tmp_dir);\r
+ _tcscat_s(tmp_type,tmp_cpy);\r
+ CopyFile(pmd_paths[i].c_str(),tmp_type,TRUE);\r
+ }\r
+\r
+ DeleteDirectory(tcsTmpDir);\r
+ }\r
+ }\r
+ } while (FindNextFile(hFind, &win32fd_dir));\r
+\r
+ FindClose(hFind);\r
+}
\ No newline at end of file