Branan Purvine-Riley
13 years ago
148 changed files with 15 additions and 19723 deletions
@ -1,51 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include <windows.h> |
||||
|
||||
__declspec(dllexport) const unsigned long* GetKey() |
||||
{ |
||||
// So the crackers know who the tard is
|
||||
static const char* tauntText = "My copy protection is uncrackable! -Brice"; |
||||
|
||||
static const unsigned long kDefaultKey[4] = { 0x6c0a5452, 0x3827d0f, 0x3a170b92, 0x16db7fc2 }; |
||||
return kDefaultKey; |
||||
} |
@ -1,63 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "plClientKey.h" |
||||
|
||||
typedef const uint32_t* (*GETKEY)(); |
||||
|
||||
const uint32_t* plClientKey::GetKey() |
||||
{ |
||||
HMODULE hDll = LoadLibrary("sp.dll"); |
||||
if (hDll) |
||||
{ |
||||
GETKEY getKey = (GETKEY)GetProcAddress(hDll, "GetKey"); |
||||
if (getKey) |
||||
{ |
||||
static uint32_t key[4]; |
||||
memcpy(key, getKey(), sizeof(key)); |
||||
FreeLibrary(hDll); |
||||
return key; |
||||
} |
||||
} |
||||
|
||||
return nil; |
||||
} |
||||
|
@ -1,5 +0,0 @@
|
||||
LIBRARY |
||||
EXPORTS |
||||
GetKey @1 |
||||
SECTIONS |
||||
.data READ WRITE |
@ -1,59 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#ifndef plClientKey_h_inc |
||||
#define plClientKey_h_inc |
||||
|
||||
#include "HeadSpin.h" |
||||
|
||||
//
|
||||
// For getting the "SafeDisc protected" encryption key in single player mode
|
||||
//
|
||||
// Include plClientKey.cpp/h in your project and call plClientKey::GetKey
|
||||
// It will load the Dll and get the key for you
|
||||
// Returns nil if it fails
|
||||
//
|
||||
namespace plClientKey |
||||
{ |
||||
const uint32_t* GetKey(); |
||||
} |
||||
|
||||
#endif // plClientKey_h_inc
|
Before Width: | Height: | Size: 2.5 KiB |
@ -1,63 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "HeadSpin.h" |
||||
#include "plPlasmaInstaller.h" |
||||
#include "jvCoreUtil.h" |
||||
|
||||
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) |
||||
{ |
||||
jvCoreUtil::SetHInstance(hInstance); |
||||
plPlasmaInstaller installer; |
||||
installer.Create(); |
||||
|
||||
MSG msg; |
||||
while (GetMessage(&msg, NULL, 0, 0)) |
||||
{ |
||||
if (!IsDialogMessage(installer.GetHWnd(), &msg)) |
||||
{ |
||||
TranslateMessage(&msg); |
||||
DispatchMessage(&msg); |
||||
} |
||||
} |
||||
|
||||
return msg.wParam; |
||||
} |
@ -1,113 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "HeadSpin.h" |
||||
#include "plInstallerReg.h" |
||||
#include <windows.h> |
||||
|
||||
static HKEY GetInstallerKey() |
||||
{ |
||||
HKEY hSoftKey = NULL; |
||||
HKEY hCompanyKey = NULL; |
||||
HKEY hAppKey = NULL; |
||||
|
||||
if(RegOpenKeyEx(HKEY_CURRENT_USER, "software", 0, KEY_WRITE|KEY_READ, |
||||
&hSoftKey) == ERROR_SUCCESS) |
||||
{ |
||||
DWORD dw; |
||||
if(RegCreateKeyEx(hSoftKey, "Cyan", 0, REG_NONE, |
||||
REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL, |
||||
&hCompanyKey, &dw) == ERROR_SUCCESS) |
||||
{ |
||||
RegCreateKeyEx(hCompanyKey, "PlasmaInstaller", 0, REG_NONE, |
||||
REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL, |
||||
&hAppKey, &dw); |
||||
} |
||||
} |
||||
|
||||
if (hSoftKey != NULL) |
||||
RegCloseKey(hSoftKey); |
||||
if (hCompanyKey != NULL) |
||||
RegCloseKey(hCompanyKey); |
||||
|
||||
return hAppKey; |
||||
} |
||||
|
||||
static void WriteRegString(const char* valueName, const char* value) |
||||
{ |
||||
HKEY installKey = GetInstallerKey(); |
||||
RegSetValueEx(installKey, valueName, 0, REG_SZ, (const BYTE*)value, strlen(value)+1); |
||||
RegCloseKey(installKey); |
||||
} |
||||
|
||||
static bool ReadRegString(const char* valueName, char* value, DWORD size) |
||||
{ |
||||
HKEY installKey = GetInstallerKey(); |
||||
bool ret = (RegQueryValueEx(installKey, valueName, NULL, NULL, (LPBYTE)value, &size) == ERROR_SUCCESS); |
||||
RegCloseKey(installKey); |
||||
return ret; |
||||
} |
||||
|
||||
void plInstallerReg::SetClientDir(const char* dir) |
||||
{ |
||||
WriteRegString("Client", dir); |
||||
} |
||||
|
||||
void plInstallerReg::SetMaxDir(const char* dir) |
||||
{ |
||||
WriteRegString("3dsmax", dir); |
||||
} |
||||
|
||||
const char* plInstallerReg::GetClientDir() |
||||
{ |
||||
static char dir[MAX_PATH]; |
||||
if (!ReadRegString("Client", dir, sizeof(dir))) |
||||
strcpy(dir, "C:\\PlasmaClient"); |
||||
return dir; |
||||
} |
||||
|
||||
const char* plInstallerReg::GetMaxDir() |
||||
{ |
||||
static char dir[MAX_PATH]; |
||||
dir[0] = '\0'; |
||||
ReadRegString("3dsmax", dir, sizeof(dir)); |
||||
return dir; |
||||
} |
@ -1,50 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
namespace plInstallerReg |
||||
{ |
||||
void SetClientDir(const char* dir); |
||||
void SetMaxDir(const char* dir); |
||||
|
||||
const char* GetClientDir(); |
||||
const char* GetMaxDir(); |
||||
} |
@ -1,408 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "HeadSpin.h" |
||||
#include "plPlasmaInstaller.h" |
||||
#include "resource.h" |
||||
#include <windowsx.h> |
||||
#include <commctrl.h> |
||||
|
||||
#include "../plFile/hsFiles.h" |
||||
#include "plUnzip.h" |
||||
#include "plInstallerReg.h" |
||||
#include "../plFile/plBrowseFolder.h" |
||||
#include "plSetPlasmaPath.h" |
||||
|
||||
plPlasmaInstaller::plPlasmaInstaller() |
||||
{ |
||||
fDailyDir[0] = '\0'; |
||||
fDidGet = false; |
||||
fStatusList = nil; |
||||
|
||||
INITCOMMONCONTROLSEX icc = {0}; |
||||
icc.dwSize = sizeof(INITCOMMONCONTROLSEX); |
||||
icc.dwICC = ICC_DATE_CLASSES; |
||||
InitCommonControlsEx(&icc); |
||||
} |
||||
|
||||
void plPlasmaInstaller::Create() |
||||
{ |
||||
ICreateDialog(IDD_INSTALLER, NULL); |
||||
} |
||||
|
||||
static const char* kAllClientExes = "AllClientExes.zip"; |
||||
static const char* kAllDllsRelease = "AllDllsRelease.zip"; |
||||
static const char* kScripts = "Scripts.zip"; |
||||
static const char* kTools = "AllToolsRelease.zip"; |
||||
|
||||
bool FileExists(const char* path, const char* filename) |
||||
{ |
||||
char fullpath[MAX_PATH]; |
||||
sprintf(fullpath, "%s%s", path, filename); |
||||
HANDLE hFile = CreateFile(fullpath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); |
||||
if (hFile != INVALID_HANDLE_VALUE) |
||||
{ |
||||
CloseHandle(hFile); |
||||
return true; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
bool plPlasmaInstaller::IGetDailyDir() |
||||
{ |
||||
// Get the branch
|
||||
HWND hBuild = GetDlgItem(fDlg, IDC_BUILD_COMBO); |
||||
int idx = ComboBox_GetCurSel(hBuild); |
||||
int buildServer = ComboBox_GetItemData(hBuild, idx); |
||||
|
||||
HWND hTime = GetDlgItem(fDlg, IDC_TIME_COMBO); |
||||
idx = ComboBox_GetCurSel(hTime); |
||||
int time = ComboBox_GetItemData(hTime, idx); |
||||
|
||||
// Get the build date
|
||||
SYSTEMTIME date; |
||||
DateTime_GetSystemtime(GetDlgItem(fDlg, IDC_BRANCH_DATE), &date); |
||||
char dateStr[] = "xx-xx-xxxx"; |
||||
sprintf(dateStr, "%02d-%02d-%04d", date.wMonth, date.wDay, date.wYear); |
||||
|
||||
fDailyDir[0] = '\0'; |
||||
|
||||
IAddStatusLine("Searching for %s build...", dateStr); |
||||
|
||||
|
||||
char buildDir[MAX_PATH]; |
||||
|
||||
static const char* kMainBuild = "\\\\Plasmabuild\\Output\\"; |
||||
static const char* kBranchBuild = "\\\\Branchbuild\\Output\\"; |
||||
static const char* kActiveBuild = "\\\\Activebuild\\Output\\"; |
||||
static const char* kInternalMain = "Main-Internal\\"; |
||||
static const char* kInternalBranch = "Branch-Internal\\"; |
||||
static const char* kInternalActive = "Active-Internal\\"; |
||||
|
||||
switch (buildServer) |
||||
{ |
||||
case kBuildMain: strcpy(buildDir, kMainBuild); break; |
||||
case kBuildBranch: strcpy(buildDir, kBranchBuild); break; |
||||
case kBuildActive: strcpy(buildDir, kActiveBuild); break; |
||||
} |
||||
|
||||
switch (time) |
||||
{ |
||||
case kNightly: |
||||
strcat(buildDir, "Nightly\\"); |
||||
break; |
||||
case kAfternoon: |
||||
strcat(buildDir, "Afternoon\\"); |
||||
break; |
||||
case kEvening: |
||||
strcat(buildDir, "Evening\\"); |
||||
break; |
||||
} |
||||
|
||||
strcat(buildDir, dateStr); |
||||
strcat(buildDir, "\\"); |
||||
|
||||
switch (buildServer) |
||||
{ |
||||
case kBuildMain: strcat(buildDir, kInternalMain); break; |
||||
case kBuildBranch: strcat(buildDir, kInternalBranch); break; |
||||
case kBuildActive: strcat(buildDir, kInternalActive); break; |
||||
} |
||||
|
||||
if (FileExists(buildDir, kAllClientExes) && FileExists(buildDir, kAllDllsRelease) && FileExists(buildDir, kScripts)) |
||||
{ |
||||
strcpy(fDailyDir, buildDir); |
||||
|
||||
const char* serverName = nil; |
||||
switch (buildServer) |
||||
{ |
||||
case kBuildMain: serverName = "Main"; break; |
||||
case kBuildBranch: serverName = "Branch"; break; |
||||
case kBuildActive: serverName = "Active"; break; |
||||
} |
||||
IAddStatusLine("Found %s at %s", serverName, fDailyDir); |
||||
|
||||
EnableWindow(GetDlgItem(fDlg, IDC_GET_BUTTON), TRUE); |
||||
return true; |
||||
} |
||||
|
||||
IAddStatusLine("Couldn't find build"); |
||||
EnableWindow(GetDlgItem(fDlg, IDC_GET_BUTTON), FALSE); |
||||
return false; |
||||
} |
||||
|
||||
void plPlasmaInstaller::IInit() |
||||
{ |
||||
const char* clientDir = plInstallerReg::GetClientDir(); |
||||
SetDlgItemText(fDlg, IDC_CLIENT_EDIT, clientDir); |
||||
|
||||
const char* maxDir = plInstallerReg::GetMaxDir(); |
||||
SetDlgItemText(fDlg, IDC_3DSMAX_EDIT, maxDir); |
||||
|
||||
fStatusList = GetDlgItem(fDlg, IDC_STATUS_LIST); |
||||
|
||||
HWND hCombo = GetDlgItem(fDlg, IDC_BUILD_COMBO); |
||||
int idx = ComboBox_AddString(hCombo, "Main"); |
||||
ComboBox_SetItemData(hCombo, idx, kBuildMain); |
||||
ComboBox_SetCurSel(hCombo, idx); |
||||
idx = ComboBox_AddString(hCombo, "Branch"); |
||||
ComboBox_SetItemData(hCombo, idx, kBuildBranch); |
||||
idx = ComboBox_AddString(hCombo, "Active"); |
||||
ComboBox_SetItemData(hCombo, idx, kBuildActive); |
||||
|
||||
HWND hTime = GetDlgItem(fDlg, IDC_TIME_COMBO); |
||||
idx = ComboBox_AddString(hTime, "Nightly"); |
||||
ComboBox_SetItemData(hTime, idx, kNightly); |
||||
ComboBox_SetCurSel(hTime, idx); |
||||
idx = ComboBox_AddString(hTime, "Afternoon"); |
||||
ComboBox_SetItemData(hTime, idx, kAfternoon); |
||||
idx = ComboBox_AddString(hTime, "Evening"); |
||||
ComboBox_SetItemData(hTime, idx, kEvening); |
||||
|
||||
CheckDlgButton(fDlg, IDC_CLIENT_CHECK, BST_CHECKED); |
||||
CheckDlgButton(fDlg, IDC_SCRIPTS_CHECK, BST_CHECKED); |
||||
CheckDlgButton(fDlg, IDC_PLUGINS_CHECK, BST_CHECKED); |
||||
|
||||
ShowWindow(fDlg, SW_SHOW); |
||||
|
||||
IGetDailyDir(); |
||||
} |
||||
|
||||
BOOL plPlasmaInstaller::IDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
{ |
||||
switch (msg) |
||||
{ |
||||
case WM_INITDIALOG: |
||||
IInit(); |
||||
SetFocus(GetDlgItem(fDlg, IDC_GET_BUTTON)); |
||||
return FALSE; |
||||
|
||||
case WM_CLOSE: |
||||
DestroyWindow(hDlg); |
||||
return TRUE; |
||||
|
||||
case WM_DESTROY: |
||||
PostQuitMessage(0); |
||||
return TRUE; |
||||
|
||||
case WM_COMMAND: |
||||
if (HIWORD(wParam) == BN_CLICKED) |
||||
{ |
||||
switch (LOWORD(wParam)) |
||||
{ |
||||
case IDCANCEL: |
||||
PostMessage(hDlg, WM_CLOSE, 0, 0); |
||||
return TRUE; |
||||
|
||||
case IDC_BROWSE_3DSMAX: |
||||
case IDC_BROWSE_CLIENT: |
||||
IGetFolder(LOWORD(wParam) == IDC_BROWSE_CLIENT); |
||||
return TRUE; |
||||
|
||||
case IDC_GET_BUTTON: |
||||
if (fDidGet) |
||||
PostMessage(hDlg, WM_CLOSE, 0, 0); |
||||
else |
||||
IGet(); |
||||
return TRUE; |
||||
} |
||||
} |
||||
else if (HIWORD(wParam) == CBN_SELCHANGE && (LOWORD(wParam) == IDC_TIME_COMBO || LOWORD(wParam) == IDC_BUILD_COMBO)) |
||||
{ |
||||
IGetDailyDir(); |
||||
return TRUE; |
||||
} |
||||
break; |
||||
|
||||
case WM_NOTIFY: |
||||
{ |
||||
NMHDR* nmhdr = (NMHDR*)lParam; |
||||
if (nmhdr->idFrom == IDC_BRANCH_DATE && nmhdr->code == DTN_CLOSEUP/*DTN_DATETIMECHANGE*/) |
||||
{ |
||||
IGetDailyDir(); |
||||
return TRUE; |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
|
||||
return FALSE; |
||||
} |
||||
|
||||
void plPlasmaInstaller::IExtractZip(const char* filename, const char* dest) |
||||
{ |
||||
plUnzip unzip; |
||||
if (unzip.Open(filename)) |
||||
{ |
||||
IAddStatusLine("Extracting %s...", filename); |
||||
|
||||
char buf[MAX_PATH]; |
||||
while (unzip.ExtractNext(dest, buf)) |
||||
IAddStatusLine(" %s", buf); |
||||
IAddStatusLine(" %s", buf); |
||||
|
||||
unzip.Close(); |
||||
} |
||||
} |
||||
|
||||
void plPlasmaInstaller::IGet() |
||||
{ |
||||
bool getClient = (IsDlgButtonChecked(fDlg, IDC_CLIENT_CHECK) == BST_CHECKED); |
||||
bool getScripts = (IsDlgButtonChecked(fDlg, IDC_SCRIPTS_CHECK) == BST_CHECKED); |
||||
bool getPlugins = (IsDlgButtonChecked(fDlg, IDC_PLUGINS_CHECK) == BST_CHECKED); |
||||
bool getTools = (IsDlgButtonChecked(fDlg, IDC_TOOLS_CHECK) == BST_CHECKED); |
||||
|
||||
const char* clientDir = plInstallerReg::GetClientDir(); |
||||
if (*clientDir == '\0' && (getClient || getScripts)) |
||||
{ |
||||
MessageBox(fDlg, "You need to set your client directory", "Plasma Installer", MB_OK | MB_ICONASTERISK); |
||||
return; |
||||
} |
||||
const char* maxDir = plInstallerReg::GetMaxDir(); |
||||
if (*maxDir == '\0' && getPlugins) |
||||
{ |
||||
MessageBox(fDlg, "You need to set your 3dsmax directory", "Plasma Installer", MB_OK | MB_ICONASTERISK); |
||||
return; |
||||
} |
||||
|
||||
HWND hGetButton = GetDlgItem(fDlg, IDC_GET_BUTTON); |
||||
EnableWindow(hGetButton, FALSE); |
||||
HCURSOR hOldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); |
||||
|
||||
char buf[MAX_PATH]; |
||||
|
||||
if (getScripts) |
||||
{ |
||||
sprintf(buf, "%s%s", fDailyDir, kScripts); |
||||
IExtractZip(buf, clientDir); |
||||
} |
||||
|
||||
if (getClient) |
||||
{ |
||||
sprintf(buf, "%s%s", fDailyDir, kAllClientExes); |
||||
IExtractZip(buf, clientDir); |
||||
} |
||||
|
||||
if (getPlugins) |
||||
{ |
||||
sprintf(buf, "%s%s", fDailyDir, kAllDllsRelease); |
||||
char pluginDir[MAX_PATH]; |
||||
sprintf(pluginDir, "%s\\plugins", maxDir); |
||||
IExtractZip(buf, pluginDir); |
||||
|
||||
IAddStatusLine("Updating PlasmaMAX2.ini..."); |
||||
sprintf(buf, "%s\\plugcfg\\PlasmaMAX2.ini", maxDir); |
||||
WritePrivateProfileString("SceneViewer", "Directory", clientDir, buf); |
||||
} |
||||
|
||||
if (getTools) |
||||
{ |
||||
sprintf(buf, "%s%s", fDailyDir, kTools); |
||||
|
||||
char toolBuf[MAX_PATH]; |
||||
sprintf(toolBuf, "%s\\Tools", clientDir); |
||||
IExtractZip(buf, toolBuf); |
||||
} |
||||
|
||||
IAddStatusLine("Updating path..."); |
||||
SetPlasmaPath(clientDir); |
||||
|
||||
IAddStatusLine("Done"); |
||||
|
||||
SetCursor(hOldCursor); |
||||
|
||||
fDidGet = true; |
||||
SetWindowText(hGetButton, "Close"); |
||||
EnableWindow(hGetButton, TRUE); |
||||
} |
||||
|
||||
void plPlasmaInstaller::IGetFolder(bool client) |
||||
{ |
||||
char path[MAX_PATH]; |
||||
if (client) |
||||
strcpy(path, plInstallerReg::GetClientDir()); |
||||
else |
||||
strcpy(path, plInstallerReg::GetMaxDir()); |
||||
|
||||
if (plBrowseFolder::GetFolder(path, path)) |
||||
{ |
||||
if (client) |
||||
{ |
||||
SetDlgItemText(fDlg, IDC_CLIENT_EDIT, path); |
||||
plInstallerReg::SetClientDir(path); |
||||
} |
||||
else |
||||
{ |
||||
SetDlgItemText(fDlg, IDC_3DSMAX_EDIT, path); |
||||
plInstallerReg::SetMaxDir(path); |
||||
} |
||||
} |
||||
} |
||||
|
||||
void plPlasmaInstaller::IAddStatusLine(const char* format, ...) |
||||
{ |
||||
if (!format || *format == '\0') |
||||
return; |
||||
|
||||
va_list args; |
||||
va_start(args, format); |
||||
|
||||
char buf[2048]; |
||||
int numWritten = _vsnprintf(buf, sizeof(buf), format, args); |
||||
hsAssert(numWritten > 0, "Buffer too small"); |
||||
|
||||
va_end(args); |
||||
|
||||
int idx = ListBox_AddString(fStatusList, buf); |
||||
ListBox_SetCurSel(fStatusList, idx); |
||||
|
||||
// Pump the message queue
|
||||
MSG msg; |
||||
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) |
||||
{ |
||||
if (!IsDialogMessage(&msg)) |
||||
{ |
||||
TranslateMessage(&msg); |
||||
DispatchMessage(&msg); |
||||
} |
||||
} |
||||
} |
@ -1,73 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "jvBaseDlg.h" |
||||
|
||||
class plPlasmaInstaller : public jvBaseDlg |
||||
{ |
||||
protected: |
||||
char fDailyDir[MAX_PATH]; |
||||
bool fDidGet; |
||||
|
||||
HWND fStatusList; |
||||
|
||||
enum { kBuildMain, kBuildBranch, kBuildActive }; |
||||
enum { kNightly, kAfternoon, kEvening }; |
||||
|
||||
virtual BOOL IDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); |
||||
|
||||
bool IGetDailyDir(); |
||||
void IGetFolder(bool client); |
||||
|
||||
void IGet(); |
||||
|
||||
void IInit(); |
||||
void IExtractZip(const char* filename, const char* dest); |
||||
|
||||
void IAddStatusLine(const char* format, ...); |
||||
|
||||
public: |
||||
plPlasmaInstaller(); |
||||
|
||||
void Create(); |
||||
|
||||
HWND GetHWnd() { return fDlg; } |
||||
}; |
@ -1,122 +0,0 @@
|
||||
//Microsoft Developer Studio generated resource script. |
||||
// |
||||
#include "resource.h" |
||||
|
||||
#define WIN32_LEAN_AND_MEAN |
||||
#include <windows.h> |
||||
#define IDC_STATIC (-1) // all static controls |
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// English (U.S.) resources |
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) |
||||
#ifdef _WIN32 |
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US |
||||
#pragma code_page(1252) |
||||
#endif //_WIN32 |
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// Dialog |
||||
// |
||||
|
||||
IDD_INSTALLER DIALOG DISCARDABLE 0, 0, 241, 170 |
||||
STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | |
||||
WS_SYSMENU |
||||
CAPTION "Plasma Installer" |
||||
FONT 8, "MS Sans Serif" |
||||
BEGIN |
||||
LTEXT "Build:",IDC_STATIC,7,8,18,8 |
||||
COMBOBOX IDC_TIME_COMBO,27,6,46,167,CBS_DROPDOWNLIST | WS_VSCROLL | |
||||
WS_TABSTOP |
||||
LTEXT "3dsmax Directory:",IDC_STATIC,7,26,57,8 |
||||
EDITTEXT IDC_3DSMAX_EDIT,7,36,173,12,ES_AUTOHSCROLL | ES_READONLY |
||||
PUSHBUTTON "Browse...",IDC_BROWSE_3DSMAX,183,35,50,14 |
||||
LTEXT "Client Directory:",IDC_STATIC,7,53,50,8 |
||||
EDITTEXT IDC_CLIENT_EDIT,7,63,173,12,ES_AUTOHSCROLL | ES_READONLY |
||||
PUSHBUTTON "Browse...",IDC_BROWSE_CLIENT,183,62,50,14 |
||||
DEFPUSHBUTTON "Get",IDC_GET_BUTTON,93,146,56,16,WS_DISABLED |
||||
LISTBOX IDC_STATUS_LIST,7,85,226,54,LBS_NOSEL | WS_VSCROLL | |
||||
WS_TABSTOP |
||||
CONTROL "DateTimePicker1",IDC_BRANCH_DATE,"SysDateTimePick32", |
||||
DTS_RIGHTALIGN | WS_TABSTOP,125,6,55,12 |
||||
COMBOBOX IDC_BUILD_COMBO,76,6,46,167,CBS_DROPDOWNLIST | |
||||
WS_VSCROLL | WS_TABSTOP |
||||
CONTROL "Client",IDC_CLIENT_CHECK,"Button",BS_AUTOCHECKBOX | |
||||
WS_TABSTOP,159,144,33,10 |
||||
CONTROL "Scripts",IDC_SCRIPTS_CHECK,"Button",BS_AUTOCHECKBOX | |
||||
WS_TABSTOP,159,154,37,10 |
||||
CONTROL "Plugins",IDC_PLUGINS_CHECK,"Button",BS_AUTOCHECKBOX | |
||||
WS_TABSTOP,197,144,39,10 |
||||
CONTROL "Tools",IDC_TOOLS_CHECK,"Button",BS_AUTOCHECKBOX | |
||||
WS_TABSTOP,197,154,33,10 |
||||
END |
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// DESIGNINFO |
||||
// |
||||
|
||||
#ifdef APSTUDIO_INVOKED |
||||
GUIDELINES DESIGNINFO DISCARDABLE |
||||
BEGIN |
||||
IDD_INSTALLER, DIALOG |
||||
BEGIN |
||||
LEFTMARGIN, 7 |
||||
RIGHTMARGIN, 234 |
||||
TOPMARGIN, 7 |
||||
BOTTOMMARGIN, 163 |
||||
END |
||||
END |
||||
#endif // APSTUDIO_INVOKED |
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED |
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// TEXTINCLUDE |
||||
// |
||||
|
||||
1 TEXTINCLUDE DISCARDABLE |
||||
BEGIN |
||||
"resource.h\0" |
||||
END |
||||
|
||||
2 TEXTINCLUDE DISCARDABLE |
||||
BEGIN |
||||
"\0" |
||||
END |
||||
|
||||
3 TEXTINCLUDE DISCARDABLE |
||||
BEGIN |
||||
"\r\n" |
||||
"\0" |
||||
END |
||||
|
||||
#endif // APSTUDIO_INVOKED |
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// Icon |
||||
// |
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon |
||||
// remains consistent on all systems. |
||||
IDI_ICON1 ICON DISCARDABLE "Dirt.ICO" |
||||
#endif // English (U.S.) resources |
||||
///////////////////////////////////////////////////////////////////////////// |
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED |
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// Generated from the TEXTINCLUDE 3 resource. |
||||
// |
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
#endif // not APSTUDIO_INVOKED |
||||
|
@ -1,120 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "HeadSpin.h" |
||||
#include <windows.h> |
||||
|
||||
static HKEY GetEnvironKey() |
||||
{ |
||||
HKEY hSystemKey = NULL; |
||||
HKEY hControlSetKey = NULL; |
||||
HKEY hControlKey = NULL; |
||||
HKEY hSessionKey = NULL; |
||||
HKEY hEnvironKey = NULL; |
||||
|
||||
if ((RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM", 0, KEY_READ, &hSystemKey) == ERROR_SUCCESS) && |
||||
(RegOpenKeyEx(hSystemKey, "CurrentControlSet", 0, KEY_READ, &hControlSetKey) == ERROR_SUCCESS) && |
||||
(RegOpenKeyEx(hControlSetKey, "Control", 0, KEY_READ, &hControlKey) == ERROR_SUCCESS) && |
||||
(RegOpenKeyEx(hControlKey, "Session Manager", 0, KEY_READ, &hSessionKey) == ERROR_SUCCESS)) |
||||
{ |
||||
RegOpenKeyEx(hSessionKey, "Environment", 0, KEY_READ | KEY_WRITE, &hEnvironKey); |
||||
} |
||||
|
||||
if (hSystemKey != NULL) |
||||
RegCloseKey(hSystemKey); |
||||
if (hControlSetKey != NULL) |
||||
RegCloseKey(hControlSetKey); |
||||
if (hControlKey != NULL) |
||||
RegCloseKey(hControlKey); |
||||
if (hSessionKey != NULL) |
||||
RegCloseKey(hSessionKey); |
||||
|
||||
return hEnvironKey; |
||||
} |
||||
|
||||
void SetPlasmaPath(const char* plasmaPath) |
||||
{ |
||||
bool pathSet = false; |
||||
|
||||
HKEY hEnvironKey = GetEnvironKey(); |
||||
if (hEnvironKey) |
||||
{ |
||||
// Make sure the PlasmaGameDir var is in the path
|
||||
DWORD size = 0; |
||||
if (ERROR_SUCCESS == RegQueryValueEx(hEnvironKey, "Path", NULL, NULL, NULL, &size)) |
||||
{ |
||||
char* oldPath = new char[size]; |
||||
static const char* kPlasmaVar = "%PlasmaGameDir%"; |
||||
|
||||
if (ERROR_SUCCESS == RegQueryValueEx(hEnvironKey, "Path", NULL, NULL, (BYTE*)oldPath, &size)) |
||||
{ |
||||
pathSet = (strstr(oldPath, kPlasmaVar) != NULL); |
||||
|
||||
if (!pathSet) |
||||
{ |
||||
char* newPath = new char[size+strlen(kPlasmaVar)+1]; |
||||
strcpy(newPath, oldPath); |
||||
strcat(newPath, ";"); |
||||
strcat(newPath, kPlasmaVar); |
||||
|
||||
RegSetValueEx(hEnvironKey, "Path", 0, REG_EXPAND_SZ, (BYTE*)newPath, strlen(newPath)+1); |
||||
|
||||
delete [] newPath; |
||||
} |
||||
} |
||||
|
||||
delete [] oldPath; |
||||
} |
||||
|
||||
// Set the PlasmaGameDir var
|
||||
RegSetValueEx(hEnvironKey, "PlasmaGameDir", 0, REG_SZ, (BYTE*)plasmaPath, strlen(plasmaPath)+1); |
||||
|
||||
// Notify command prompts and stuff that environ changed
|
||||
DWORD ret; |
||||
SendMessageTimeout(HWND_BROADCAST, |
||||
WM_SETTINGCHANGE, |
||||
0, |
||||
(LPARAM)"Environment", |
||||
SMTO_ABORTIFHUNG, |
||||
5000, |
||||
&ret); |
||||
} |
||||
} |
@ -1,42 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
void SetPlasmaPath(const char* plasmaPath); |
@ -1,169 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "HeadSpin.h" |
||||
#include "plUnzip.h" |
||||
#include "hsTypes.h" |
||||
#include "hsWindows.h" |
||||
#include "hsStream.h" |
||||
|
||||
plUnzip::plUnzip() : fFile(nil) |
||||
{ |
||||
} |
||||
|
||||
bool plUnzip::Open(const char* filename) |
||||
{ |
||||
fFile = unzOpen(filename); |
||||
return (fFile != nil); |
||||
} |
||||
|
||||
bool plUnzip::Close() |
||||
{ |
||||
bool ret = false; |
||||
|
||||
if (fFile != nil) |
||||
{ |
||||
ret = (UNZ_OK == unzClose(fFile)); |
||||
fFile = nil; |
||||
} |
||||
|
||||
return ret; |
||||
} |
||||
|
||||
void plUnzip::IGetFullPath(const char* destDir, const char* filename, char* outFilename) |
||||
{ |
||||
// Make sure the dest ends with a slash
|
||||
strcpy(outFilename, destDir); |
||||
char lastChar = outFilename[strlen(outFilename)-1]; |
||||
if (lastChar != '\\' && lastChar != '/') |
||||
strcat(outFilename, "\\"); |
||||
|
||||
// Check if the output filename has any directories in it
|
||||
const char* forward = strrchr(filename, '/'); |
||||
const char* backward = strrchr(filename, '\\'); |
||||
|
||||
if (!forward && !backward) |
||||
{ |
||||
CreateDirectory(outFilename, NULL); |
||||
strcat(outFilename, filename); |
||||
} |
||||
else |
||||
{ |
||||
const char* fileOnly = (forward > backward) ? forward+1 : backward+1; |
||||
strncat(outFilename, filename, fileOnly-filename); |
||||
CreateDirectory(outFilename, NULL); |
||||
|
||||
strcat(outFilename, fileOnly); |
||||
} |
||||
} |
||||
|
||||
void plUnzip::IExtractCurrent(const char* destDir, char* fileName) |
||||
{ |
||||
char filename[MAX_PATH]; |
||||
if (unzGetCurrentFileInfo(fFile, nil, filename, sizeof(filename), nil, 0, nil, 0) == UNZ_OK) |
||||
{ |
||||
strcpy(fileName, filename); |
||||
|
||||
if (unzOpenCurrentFile(fFile) == UNZ_OK) |
||||
{ |
||||
char outFilename[MAX_PATH]; |
||||
IGetFullPath(destDir, filename, outFilename); |
||||
|
||||
// Make sure to take off the read-only flag if the file exists, and is RO
|
||||
DWORD attrs = GetFileAttributes(outFilename); |
||||
if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_READONLY)) |
||||
SetFileAttributes(outFilename, attrs & ~FILE_ATTRIBUTE_READONLY); |
||||
|
||||
hsUNIXStream outFile; |
||||
if (outFile.Open(outFilename, "wb")) |
||||
{ |
||||
char buf[2048]; |
||||
int numRead; |
||||
while ((numRead = unzReadCurrentFile(fFile, buf, sizeof(buf))) > 0) |
||||
{ |
||||
outFile.Write(numRead, buf); |
||||
} |
||||
|
||||
outFile.Close(); |
||||
|
||||
unz_file_info_s info; |
||||
unzGetCurrentFileInfo(fFile, &info, NULL, 0, NULL, 0, NULL, 0); |
||||
|
||||
SYSTEMTIME sysTime = {0}; |
||||
sysTime.wDay = info.tmu_date.tm_mday; |
||||
sysTime.wMonth = info.tmu_date.tm_mon+1; |
||||
sysTime.wYear = info.tmu_date.tm_year; |
||||
sysTime.wHour = info.tmu_date.tm_hour; |
||||
sysTime.wMinute = info.tmu_date.tm_min; |
||||
sysTime.wSecond = info.tmu_date.tm_sec; |
||||
|
||||
FILETIME localFileTime, utcFileTime; |
||||
SystemTimeToFileTime(&sysTime, &localFileTime); |
||||
|
||||
LocalFileTimeToFileTime(&localFileTime, &utcFileTime); |
||||
|
||||
HANDLE hFile = CreateFile(outFilename, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); |
||||
SetFileTime(hFile, NULL, NULL, &utcFileTime); |
||||
CloseHandle(hFile); |
||||
} |
||||
|
||||
unzCloseCurrentFile(fFile); |
||||
} |
||||
} |
||||
} |
||||
|
||||
void plUnzip::ExtractAll(const char* destDir) |
||||
{ |
||||
if (unzGoToFirstFile(fFile) != UNZ_OK) |
||||
return; |
||||
|
||||
do |
||||
{ |
||||
IExtractCurrent(destDir); |
||||
} |
||||
while (unzGoToNextFile(fFile) == UNZ_OK); |
||||
} |
||||
|
||||
bool plUnzip::ExtractNext(const char* destDir, char* fileName) |
||||
{ |
||||
IExtractCurrent(destDir, fileName); |
||||
return (unzGoToNextFile(fFile) == UNZ_OK); |
||||
} |
@ -1,66 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#ifndef plUnzip_h_inc |
||||
#define plUnzip_h_inc |
||||
|
||||
#include "hsTypes.h" |
||||
#include "../src/contrib/minizip/unzip.h" |
||||
|
||||
class plUnzip |
||||
{ |
||||
protected: |
||||
unzFile fFile; |
||||
|
||||
void IGetFullPath(const char* destDir, const char* filename, char* outFilename); |
||||
void IExtractCurrent(const char* destDir, char* fileName=nil); |
||||
|
||||
public: |
||||
plUnzip(); |
||||
|
||||
bool Open(const char* filename); |
||||
bool Close(); |
||||
|
||||
void ExtractAll(const char* destDir); |
||||
bool ExtractNext(const char* destDir, char* fileName); |
||||
}; |
||||
|
||||
#endif // plUnzip_h_inc
|
@ -1,30 +0,0 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by plPlasmaInstaller.rc
|
||||
//
|
||||
#define IDD_INSTALLER 101 |
||||
#define IDI_ICON1 102 |
||||
#define IDC_3DSMAX_EDIT 1000 |
||||
#define IDC_BROWSE_3DSMAX 1001 |
||||
#define IDC_TIME_COMBO 1002 |
||||
#define IDC_CLIENT_EDIT 1003 |
||||
#define IDC_BROWSE_CLIENT 1004 |
||||
#define IDC_GET_BUTTON 1005 |
||||
#define IDC_STATUS_LIST 1006 |
||||
#define IDC_BRANCH_DATE 1007 |
||||
#define IDC_BUILD_COMBO 1008 |
||||
#define IDC_CLIENT_CHECK 1009 |
||||
#define IDC_SCRIPTS_CHECK 1010 |
||||
#define IDC_PLUGINS_CHECK 1011 |
||||
#define IDC_TOOLS_CHECK 1012 |
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED |
||||
#ifndef APSTUDIO_READONLY_SYMBOLS |
||||
#define _APS_NEXT_RESOURCE_VALUE 103 |
||||
#define _APS_NEXT_COMMAND_VALUE 40001 |
||||
#define _APS_NEXT_CONTROL_VALUE 1013 |
||||
#define _APS_NEXT_SYMED_VALUE 101 |
||||
#endif |
||||
#endif |
Before Width: | Height: | Size: 2.5 KiB |
@ -1,67 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "HeadSpin.h" |
||||
#include "plPlasmaUpdate.h" |
||||
#include "jvCoreUtil.h" |
||||
|
||||
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) |
||||
{ |
||||
jvCoreUtil::SetHInstance(hInstance); |
||||
plPlasmaUpdate installer; |
||||
if (!installer.Create()) |
||||
return 0; |
||||
|
||||
if (!stricmp(lpCmdLine, "AutoDownload")) |
||||
installer.SetAutoDownload(); |
||||
|
||||
MSG msg; |
||||
while (GetMessage(&msg, NULL, 0, 0)) |
||||
{ |
||||
if (!jvBaseDlg::IsDialogMessage(&msg)) |
||||
{ |
||||
TranslateMessage(&msg); |
||||
DispatchMessage(&msg); |
||||
} |
||||
} |
||||
|
||||
return 0; |
||||
} |
@ -1,186 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "plFileGrabber.h" |
||||
|
||||
/* Not needed currently - if we want it again we'll have to reimplement HTTP comm
|
||||
plHttpFileGrabber::plHttpFileGrabber() |
||||
{ |
||||
fRequestMgr.SetHostname(""); |
||||
} |
||||
|
||||
bool plHttpFileGrabber::FileToStream(const char* path, hsStream* stream) |
||||
{ |
||||
std::string pathStr(path); |
||||
bool retVal = fRequestMgr.GetFileToStream(path, stream); |
||||
stream->SetPosition(0); |
||||
|
||||
return retVal; |
||||
} |
||||
|
||||
void plHttpFileGrabber::SetServer(const char* server) |
||||
{ |
||||
std::string serverPath(server); |
||||
|
||||
fRequestMgr.SetHostname(serverPath); |
||||
} |
||||
|
||||
void plHttpFileGrabber::MakeProperPath(char* path) |
||||
{ |
||||
char* slash = NULL; |
||||
do { |
||||
slash = strchr(path, '\\'); |
||||
if (slash) |
||||
*slash = '/'; |
||||
} while(slash != NULL); |
||||
} |
||||
|
||||
void plHttpFileGrabber::SetUsernamePassword(const std::string& username, const std::string& password) |
||||
{ |
||||
fRequestMgr.SetUsername(username); |
||||
fRequestMgr.SetPassword(password); |
||||
} |
||||
|
||||
bool plHttpFileGrabber::IsServerAvailable(const char* serverName) |
||||
{ |
||||
bool retVal = false; |
||||
|
||||
HINTERNET hInternet = InternetOpen("Parable Patcher",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0); |
||||
if (hInternet) |
||||
{ |
||||
HINTERNET hHttp = InternetConnect(hInternet,serverName,8080,fUserName.c_str(),fPassword.c_str(),INTERNET_SERVICE_HTTP,0,0); |
||||
if (hHttp) |
||||
{ |
||||
HINTERNET hRequest = HttpOpenRequest(hHttp, "GET", "/Current/Current.txt", NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_KEEP_CONNECTION, 0); |
||||
if (hRequest) |
||||
{ |
||||
DWORD dwCode; |
||||
DWORD dwSize = sizeof(dwCode); |
||||
HttpSendRequest(hRequest, NULL, 0, NULL, 0); |
||||
HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwCode, &dwSize, NULL); |
||||
if (dwCode >= 200 && dwCode < 300) |
||||
{ |
||||
retVal = true; |
||||
} |
||||
|
||||
InternetCloseHandle(hRequest); |
||||
} |
||||
|
||||
InternetCloseHandle(hHttp); |
||||
} |
||||
InternetCloseHandle(hInternet); |
||||
} |
||||
|
||||
return retVal; |
||||
} |
||||
*/ |
||||
|
||||
plNetShareFileGrabber::plNetShareFileGrabber() |
||||
{ |
||||
} |
||||
|
||||
#define BUFFER_SIZE 1024*1024 |
||||
bool plNetShareFileGrabber::FileToStream(const char* path, hsStream* stream) |
||||
{ |
||||
hsUNIXStream fileStream; |
||||
std::string filePath = fServerName + path; |
||||
|
||||
if (fileStream.Open(filePath.c_str())) |
||||
{ |
||||
char* buffer = new char[BUFFER_SIZE]; |
||||
uint32_t streamSize = fileStream.GetSizeLeft(); |
||||
while (streamSize > (BUFFER_SIZE)) |
||||
{ |
||||
fileStream.Read(BUFFER_SIZE, buffer); |
||||
stream->Write(BUFFER_SIZE, buffer); |
||||
|
||||
streamSize = fileStream.GetSizeLeft(); |
||||
} |
||||
|
||||
if (streamSize > 0) |
||||
{ |
||||
fileStream.Read(streamSize, buffer); |
||||
stream->Write(streamSize, buffer); |
||||
} |
||||
|
||||
stream->Rewind(); |
||||
|
||||
fileStream.Close(); |
||||
delete [] buffer; |
||||
|
||||
return true; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
void plNetShareFileGrabber::SetServer(const char* server) |
||||
{ |
||||
fServerName = "\\\\"; |
||||
fServerName += server; |
||||
} |
||||
|
||||
void plNetShareFileGrabber::MakeProperPath(char* path) |
||||
{ |
||||
char* slash = NULL; |
||||
do { |
||||
slash = strchr(path, '/'); |
||||
if (slash) |
||||
*slash = '\\'; |
||||
} while(slash != NULL); |
||||
} |
||||
|
||||
bool plNetShareFileGrabber::IsServerAvailable(const char* serverName, const char* currentDir) |
||||
{ |
||||
bool retVal = false; |
||||
|
||||
char serverPath[MAX_PATH]; |
||||
sprintf(serverPath, "\\\\%s\\%s\\Current.txt", serverName, currentDir); |
||||
|
||||
hsUNIXStream si; |
||||
if (si.Open(serverPath, "rb")) |
||||
{ |
||||
retVal = true; |
||||
si.Close(); |
||||
} |
||||
|
||||
return retVal; |
||||
} |
@ -1,89 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#ifndef plFileGrabber_h_inc |
||||
#define plFileGrabber_h_inc |
||||
|
||||
#include <string> |
||||
#include "hsStream.h" |
||||
|
||||
class plFileGrabber |
||||
{ |
||||
public: |
||||
virtual bool IsServerAvailable(const char* serverName, const char* currentDir) = 0; |
||||
virtual bool FileToStream(const char* path, hsStream* stream) = 0; |
||||
virtual void SetServer(const char* server) = 0; |
||||
virtual void MakeProperPath(char* path) = 0; |
||||
virtual bool NeedsAuth() { return false; } |
||||
virtual void SetUsernamePassword(const std::string& username, const std::string& password) {} |
||||
}; |
||||
|
||||
/* Not needed currently - if we want it again we'll have to reimplement HTTP comm
|
||||
class plHttpFileGrabber : public plFileGrabber |
||||
{ |
||||
private: |
||||
plHttpDiverseRequestMgr fRequestMgr; |
||||
|
||||
public: |
||||
plHttpFileGrabber(); |
||||
virtual bool IsServerAvailable(const char* serverName); |
||||
virtual bool FileToStream(const char* path, hsStream* stream); |
||||
virtual void SetServer(const char* server); |
||||
virtual void MakeProperPath(char* path); |
||||
virtual bool NeedsAuth() { return true; } |
||||
virtual void SetUsernamePassword(const std::string& username, const std::string& password); |
||||
}; |
||||
*/ |
||||
|
||||
class plNetShareFileGrabber : public plFileGrabber |
||||
{ |
||||
private: |
||||
std::string fServerName; |
||||
|
||||
public: |
||||
plNetShareFileGrabber(); |
||||
virtual bool IsServerAvailable(const char* serverName, const char* currentDir); |
||||
virtual bool FileToStream(const char* path, hsStream* stream); |
||||
virtual void SetServer(const char* server); |
||||
virtual void MakeProperPath(char* path); |
||||
}; |
||||
|
||||
#endif |
@ -1,361 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "HeadSpin.h" |
||||
#include "plManifest.h" |
||||
|
||||
#include "../pnEncryption/plChecksum.h" |
||||
#include "../plCompression/plZlibStream.h" |
||||
#include "../plFile/plEncryptedStream.h" |
||||
#include "../plFile/plFileUtils.h" |
||||
#include "../plUnifiedTime/plUnifiedTime.h" |
||||
|
||||
class plManifestFile |
||||
{ |
||||
public: |
||||
char* fFilename; |
||||
plMD5Checksum fSum; |
||||
plMD5Checksum fLocalSum; |
||||
uint32_t fSize; |
||||
uint32_t fCompressedSize; |
||||
uint32_t fFlags; |
||||
}; |
||||
|
||||
plManifest::plManifest(LogFunc log) : |
||||
fDownloadFiles(0), |
||||
fDownloadBytes(0), |
||||
fDirtySums(false), |
||||
fLog(log) |
||||
{ |
||||
} |
||||
|
||||
plManifest::~plManifest() |
||||
{ |
||||
if (fDirtySums) |
||||
IWriteCache(); |
||||
|
||||
delete [] fManifestName; |
||||
|
||||
for (int i = 0; i < fFiles.size(); i++) |
||||
{ |
||||
delete [] fFiles[i]->fFilename; |
||||
delete fFiles[i]; |
||||
} |
||||
} |
||||
|
||||
bool plManifest::Read(hsStream* mfsStream, const char* basePath, const char* mfsName) |
||||
{ |
||||
fBasePath = basePath; |
||||
fManifestName = hsStrcpy(mfsName); |
||||
|
||||
fLog("--- Reading manifest for %s", fManifestName); |
||||
|
||||
char buf[256]; |
||||
while (mfsStream->ReadLn(buf, sizeof(buf))) |
||||
{ |
||||
plManifestFile* file = new plManifestFile; |
||||
|
||||
char* tok = strtok(buf, "\t"); |
||||
file->fFilename = hsStrcpy(tok); |
||||
|
||||
tok = strtok(nil, "\t"); |
||||
file->fSum.SetFromHexString(tok); |
||||
|
||||
tok = strtok(nil, "\t"); |
||||
file->fSize = atoi(tok); |
||||
|
||||
tok = strtok(nil, "\t"); |
||||
file->fCompressedSize = atoi(tok); |
||||
|
||||
tok = strtok(nil, "\t"); |
||||
file->fFlags = atoi(tok); |
||||
|
||||
fFiles.push_back(file); |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
|
||||
void plManifest::ValidateFiles(ProgressFunc progress) |
||||
{ |
||||
if (fFiles.empty()) |
||||
return; |
||||
|
||||
fLog("--- Validating files for %s", fManifestName); |
||||
|
||||
IReadCache(progress); |
||||
|
||||
fDownloadFiles = 0; |
||||
fDownloadBytes = 0; |
||||
|
||||
for (int i = 0; i < fFiles.size(); i++) |
||||
{ |
||||
plManifestFile* file = fFiles[i]; |
||||
|
||||
// If the local checksum is invalid, this file wasn't in our cache.
|
||||
// Get the sum, and update the progress bar.
|
||||
if (!file->fLocalSum.IsValid()) |
||||
{ |
||||
fLog(" No sum for %s, calculating", file->fFilename); |
||||
file->fLocalSum.CalcFromFile(file->fFilename); |
||||
fDirtySums = true; |
||||
progress(file->fFilename, 1); |
||||
} |
||||
|
||||
if (file->fLocalSum != file->fSum) |
||||
{ |
||||
fLog(" Incorrect sum for %s", file->fFilename); |
||||
fDownloadFiles++; |
||||
fDownloadBytes += file->fCompressedSize; |
||||
} |
||||
} |
||||
|
||||
fLog("--- Need to download %d files, %.1f MB", fDownloadFiles, float(fDownloadBytes) / (1024.f*1024.f)); |
||||
} |
||||
|
||||
void plManifest::DownloadUpdates(ProgressFunc progress, plFileGrabber* grabber) |
||||
{ |
||||
for (int i = 0; i < fFiles.size(); i++) |
||||
{ |
||||
plManifestFile* file = fFiles[i]; |
||||
if (file->fLocalSum != file->fSum) |
||||
{ |
||||
char serverPath[MAX_PATH]; |
||||
|
||||
sprintf(serverPath, "%s%s.gz", fBasePath.c_str(), file->fFilename); |
||||
grabber->MakeProperPath(serverPath); |
||||
|
||||
hsRAMStream serverStream; |
||||
if (grabber->FileToStream(serverPath, &serverStream)) |
||||
{ |
||||
plFileUtils::EnsureFilePathExists(file->fFilename); |
||||
|
||||
plFileUtils::RemoveFile(file->fFilename, true); |
||||
|
||||
plZlibStream localStream; |
||||
if (localStream.Open(file->fFilename, "wb")) |
||||
{ |
||||
char dataBuf[1024]; |
||||
uint32_t sizeLeft = serverStream.GetSizeLeft(); |
||||
while (uint32_t amtRead = serverStream.Read( (sizeof(dataBuf) > sizeLeft) ? sizeLeft : sizeof(dataBuf), dataBuf)) |
||||
{ |
||||
progress(file->fFilename, amtRead); |
||||
|
||||
localStream.Write(amtRead, dataBuf); |
||||
sizeLeft = serverStream.GetSizeLeft(); |
||||
} |
||||
|
||||
localStream.Close(); |
||||
|
||||
// FIXME - Should we recalc this?
|
||||
file->fLocalSum = file->fSum; |
||||
fDirtySums = true; |
||||
|
||||
if (file->fFlags != 0) |
||||
IDecompressSound(file); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
plManifestFile* plManifest::IFindFile(const char* name) |
||||
{ |
||||
// FIXME
|
||||
for (int i = 0; i < fFiles.size(); i++) |
||||
{ |
||||
if (hsStrEQ(fFiles[i]->fFilename, name)) |
||||
return fFiles[i]; |
||||
} |
||||
|
||||
return nil; |
||||
} |
||||
|
||||
// KLUDGE - Put age checksums in the dat dir, for backwards compatability
|
||||
const char* plManifest::IGetCacheDir() |
||||
{ |
||||
const char* prefix = ""; |
||||
if (strncmp(fFiles[0]->fFilename, "dat\\", strlen("dat\\")) == 0) |
||||
return "dat\\"; |
||||
else |
||||
return ""; |
||||
} |
||||
|
||||
#define kCacheFileVersion 1 |
||||
|
||||
void plManifest::IWriteCache() |
||||
{ |
||||
plEncryptedStream s; |
||||
|
||||
bool openedFile = false; |
||||
|
||||
uint32_t numFiles = 0; |
||||
for (int i = 0; i < fFiles.size(); i++) |
||||
{ |
||||
plManifestFile* file = fFiles[i]; |
||||
|
||||
plUnifiedTime modifiedTime; |
||||
if (file->fLocalSum.IsValid() && |
||||
plFileUtils::GetFileTimes(file->fFilename, nil, &modifiedTime)) |
||||
{ |
||||
if (!openedFile) |
||||
{ |
||||
openedFile = true; |
||||
char buf[256]; |
||||
sprintf(buf, "%s%s.sum", IGetCacheDir(), fManifestName); |
||||
s.Open(buf, "wb"); |
||||
s.WriteSwap32(0); |
||||
s.WriteSwap32(kCacheFileVersion); |
||||
} |
||||
|
||||
s.WriteSafeString(file->fFilename); |
||||
|
||||
plMD5Checksum& checksum = file->fLocalSum; |
||||
s.Write(checksum.GetSize(), checksum.GetValue()); |
||||
|
||||
modifiedTime.Write(&s); |
||||
|
||||
numFiles++; |
||||
} |
||||
} |
||||
|
||||
if (openedFile) |
||||
{ |
||||
s.Rewind(); |
||||
s.WriteSwap32(numFiles); |
||||
|
||||
s.Close(); |
||||
} |
||||
} |
||||
|
||||
void plManifest::IReadCache(ProgressFunc progress) |
||||
{ |
||||
//
|
||||
// Load valid cached checksums
|
||||
//
|
||||
char buf[256]; |
||||
sprintf(buf, "%s%s.sum", IGetCacheDir(), fManifestName); |
||||
hsStream* s = plEncryptedStream::OpenEncryptedFile(buf); |
||||
|
||||
if (s) |
||||
{ |
||||
uint32_t numCached = s->ReadSwap32(); |
||||
uint32_t cacheFileVersion = s->ReadSwap32(); |
||||
|
||||
if (cacheFileVersion != kCacheFileVersion) |
||||
{ |
||||
s->Close(); |
||||
delete s; |
||||
return; |
||||
} |
||||
|
||||
fLog(" Reading cache...found %d cached sums", numCached); |
||||
|
||||
for (int i = 0; i < numCached; i++) |
||||
{ |
||||
char* name = s->ReadSafeString(); |
||||
|
||||
uint8_t checksumBuf[MD5_DIGEST_LENGTH]; |
||||
s->Read(sizeof(checksumBuf), checksumBuf); |
||||
plMD5Checksum checksum; |
||||
checksum.SetValue(checksumBuf); |
||||
|
||||
plUnifiedTime modifiedTime; |
||||
modifiedTime.Read(s); |
||||
|
||||
plManifestFile* file = IFindFile(name); |
||||
if (file) |
||||
{ |
||||
plUnifiedTime curModifiedTime; |
||||
if (plFileUtils::GetFileTimes(file->fFilename, nil, &curModifiedTime)) |
||||
{ |
||||
if (curModifiedTime == modifiedTime) |
||||
file->fLocalSum = checksum; |
||||
else |
||||
fLog(" Invalid modified time for %s", name); |
||||
} |
||||
else |
||||
fLog(" Couldn't get modified time for %s", name); |
||||
|
||||
progress(file->fFilename, 1); |
||||
} |
||||
else |
||||
fLog(" Couldn't find cached file '%s' in manifest, discarding", name); |
||||
|
||||
|
||||
delete [] name; |
||||
} |
||||
|
||||
s->Close(); |
||||
delete s; |
||||
} |
||||
} |
||||
|
||||
#include "../plAudioCore/plAudioFileReader.h" |
||||
#include "../plAudio/plOGGCodec.h" |
||||
#include "../plAudio/plWavFile.h" |
||||
|
||||
|
||||
bool plManifest::IDecompressSound(plManifestFile* file) |
||||
{ |
||||
enum
|
||||
{ |
||||
kSndFlagCacheSplit = 1<<0, |
||||
kSndFlagCacheStereo = 1<<2, |
||||
}; |
||||
|
||||
if (hsCheckBits(file->fFlags, kSndFlagCacheSplit) || |
||||
hsCheckBits(file->fFlags, kSndFlagCacheStereo)) |
||||
{ |
||||
plAudioFileReader* reader = plAudioFileReader::CreateReader(file->fFilename, plAudioCore::kAll, plAudioFileReader::kStreamNative); |
||||
if (!reader) |
||||
return false; |
||||
uint32_t size = reader->GetDataSize(); |
||||
delete reader; |
||||
|
||||
if (hsCheckBits(file->fFlags, kSndFlagCacheSplit)) |
||||
plAudioFileReader::CacheFile(file->fFilename, true); |
||||
if (hsCheckBits(file->fFlags, kSndFlagCacheStereo)) |
||||
plAudioFileReader::CacheFile(file->fFilename, false); |
||||
} |
||||
|
||||
return true; |
||||
} |
@ -1,93 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#ifndef plManifest_h_inc |
||||
#define plManifest_h_inc |
||||
|
||||
#include "HeadSpin.h" |
||||
#include "plFileGrabber.h" |
||||
#include <vector> |
||||
#include <string> |
||||
|
||||
class plManifestFile; |
||||
|
||||
typedef void (*ProgressFunc)(const char* name, int progDelta); |
||||
typedef void (*LogFunc)(const char* format, ...); |
||||
|
||||
class plManifest |
||||
{ |
||||
protected: |
||||
std::string fBasePath; |
||||
char* fManifestName; |
||||
|
||||
typedef std::vector<plManifestFile*> FileVec; |
||||
FileVec fFiles; |
||||
|
||||
uint32_t fDownloadFiles; |
||||
uint32_t fDownloadBytes; |
||||
|
||||
bool fDirtySums; |
||||
|
||||
LogFunc fLog; |
||||
|
||||
bool IDecompressSound(plManifestFile* file); |
||||
|
||||
plManifestFile* IFindFile(const char* name); |
||||
|
||||
const char* IGetCacheDir(); |
||||
void IReadCache(ProgressFunc progress); |
||||
void IWriteCache(); |
||||
|
||||
public: |
||||
plManifest(LogFunc log); |
||||
~plManifest(); |
||||
|
||||
bool Read(hsStream* mfsStream, const char* basePath, const char* mfsName); |
||||
|
||||
void ValidateFiles(ProgressFunc progress); |
||||
void DownloadUpdates(ProgressFunc progress, plFileGrabber* grabber); |
||||
|
||||
int NumFiles() { return fFiles.size(); } |
||||
uint32_t NumDownloadFiles() { return fDownloadFiles; } |
||||
uint32_t DownloadSize() { return fDownloadBytes; } |
||||
}; |
||||
|
||||
#endif // plManifest_h_inc
|
@ -1,94 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "plPlasmaServers.h" |
||||
#include "hsStream.h" |
||||
|
||||
bool plPlasmaServers::GetServerInfo() |
||||
{ |
||||
bool ret = true; |
||||
|
||||
hsUNIXStream si; |
||||
if (si.Open("\\\\dirtcake\\ServerInfo\\ServerInfo.txt", "rb")) |
||||
{ |
||||
char line[256]; |
||||
|
||||
// Make sure we've got the latest version
|
||||
if (si.ReadLn(line, sizeof(line))) |
||||
{ |
||||
int version = atoi(line); |
||||
si.ReadLn(line, sizeof(line)); |
||||
if (version != 4) |
||||
{ |
||||
char errorMsg[512]; |
||||
sprintf(errorMsg, "This installer is out of date.\nPlease get the latest version from:\n\n%s", line); |
||||
hsMessageBox(errorMsg, "Error", hsMessageBoxNormal, hsMessageBoxIconError); |
||||
ret = false; |
||||
} |
||||
} |
||||
else |
||||
ret = false; |
||||
|
||||
// Read in the servers, one per line
|
||||
while (ret && si.ReadLn(line, sizeof(line))) |
||||
{ |
||||
ServerInfo info; |
||||
|
||||
info.fServerAddress = strtok(line, ","); |
||||
info.fServerName = strtok(nil, ","); |
||||
info.fURLBase = strtok(nil, ","); |
||||
info.fOutputDir = strtok(nil, ","); |
||||
info.fCurrentDir = strtok(nil, ","); |
||||
info.fCodeDir = strtok(nil, ","); |
||||
|
||||
fServers.push_back(info); |
||||
} |
||||
|
||||
si.Close(); |
||||
} |
||||
else |
||||
{ |
||||
hsMessageBox("Couldn't find server info", "Error", hsMessageBoxNormal, hsMessageBoxIconError); |
||||
ret = false; |
||||
} |
||||
|
||||
return ret; |
||||
} |
@ -1,75 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#ifndef plPlasmaServers_h_inc |
||||
#define plPlasmaServers_h_inc |
||||
|
||||
#include "HeadSpin.h" |
||||
#include <vector> |
||||
|
||||
class plPlasmaServers |
||||
{ |
||||
protected: |
||||
class ServerInfo |
||||
{ |
||||
public: |
||||
std::string fServerAddress; |
||||
std::string fServerName; |
||||
std::string fURLBase; |
||||
std::string fOutputDir; |
||||
std::string fCurrentDir; |
||||
std::string fCodeDir; |
||||
}; |
||||
std::vector<ServerInfo> fServers; |
||||
|
||||
public: |
||||
bool GetServerInfo(); |
||||
|
||||
int GetNumServers() { return fServers.size(); } |
||||
std::string& GetServerAddress(int i) { return fServers[i].fServerAddress; } |
||||
std::string& GetServerName(int i) { return fServers[i].fServerName; } |
||||
std::string& GetServerURLBase(int i) { return fServers[i].fURLBase; } |
||||
std::string& GetServerOutputDir(int i) { return fServers[i].fOutputDir; } |
||||
std::string& GetServerCurrentDir(int i) { return fServers[i].fCurrentDir; } |
||||
std::string& GetServerCodeDir(int i) { return fServers[i].fCodeDir; } |
||||
}; |
||||
|
||||
#endif // plPlasmaServers_h_inc
|
@ -1,514 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "HeadSpin.h" |
||||
#include "plPlasmaUpdate.h" |
||||
#include "resource.h" |
||||
#include <windowsx.h> |
||||
#include <commctrl.h> |
||||
#include <direct.h> |
||||
#include "jvCoreUtil.h" |
||||
#include "jvDialogResizer.h" |
||||
|
||||
#include "hsTypes.h" |
||||
#include "../plFile/plFileUtils.h" |
||||
#include "../plUnifiedTime/plUnifiedTime.h" |
||||
#include "hsStream.h" |
||||
#include "plManifest.h" |
||||
#include "../plStatusLog/plStatusLog.h" |
||||
|
||||
static plPlasmaUpdate* gInst = nil; |
||||
|
||||
#define WM_UPDATE_SERVER WM_APP+1 |
||||
|
||||
std::string plPlasmaUpdate::fUserName = "dataserver"; |
||||
std::string plPlasmaUpdate::fPassword = "parabledata"; |
||||
|
||||
plPlasmaUpdate::plPlasmaUpdate() : fCanExit(true), fProgressType(kValidating), fResizer(nil), fAutoDownload(false) |
||||
{ |
||||
INITCOMMONCONTROLSEX icc = {0}; |
||||
icc.dwSize = sizeof(INITCOMMONCONTROLSEX); |
||||
icc.dwICC = ICC_PROGRESS_CLASS; |
||||
InitCommonControlsEx(&icc); |
||||
gInst = this; |
||||
|
||||
_getcwd(fIniPath, sizeof(fIniPath)); |
||||
char lastChar = fIniPath[strlen(fIniPath)]; |
||||
if (lastChar != '\\' && lastChar != '/') |
||||
strcat(fIniPath, "\\"); |
||||
strcat(fIniPath, "ParableUpdate.ini"); |
||||
|
||||
fFileGrabber = new plNetShareFileGrabber; |
||||
} |
||||
|
||||
plPlasmaUpdate::~plPlasmaUpdate() |
||||
{ |
||||
delete fResizer; |
||||
if (fFileGrabber) |
||||
delete fFileGrabber; |
||||
} |
||||
|
||||
bool plPlasmaUpdate::Create() |
||||
{ |
||||
if (!fServers.GetServerInfo()) |
||||
return false; |
||||
|
||||
ICreateDialog(IDD_UPDATE, NULL); |
||||
return true; |
||||
} |
||||
|
||||
BOOL CALLBACK plPlasmaUpdate::ILoginWinProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
{ |
||||
switch( msg ) |
||||
{ |
||||
case WM_INITDIALOG: |
||||
SetFocus(GetDlgItem(hDlg, IDC_USERNAME)); |
||||
break; |
||||
case WM_COMMAND: |
||||
if (HIWORD(wParam) == BN_CLICKED && (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)) |
||||
{ |
||||
bool ok = (LOWORD(wParam) == IDOK); |
||||
if (ok) |
||||
{ |
||||
char username[25]; |
||||
char password[25]; |
||||
|
||||
GetDlgItemText(hDlg, IDC_USERNAME, username, 25); |
||||
GetDlgItemText(hDlg, IDC_PASSWORD, password, 25); |
||||
|
||||
fUserName = username; |
||||
hsAssert(false, "who uses this program?"); |
||||
// plChallengeResponse::HashPassword(password, fPassword);
|
||||
} |
||||
EndDialog(hDlg, ok); |
||||
return TRUE; |
||||
} |
||||
break; |
||||
} |
||||
return FALSE; |
||||
} |
||||
|
||||
void plPlasmaUpdate::IInit() |
||||
{ |
||||
char curServerAddress[256]; |
||||
GetPrivateProfileString("PlasmaUpdate", "ServerAddress", "", curServerAddress, sizeof(curServerAddress), fIniPath); |
||||
bool external = (GetPrivateProfileInt("PlasmaUpdate", "External", 0, fIniPath) != 0); |
||||
|
||||
HWND hCombo = GetDlgItem(fDlg, IDC_BUILD_COMBO); |
||||
|
||||
for (int i = 0; i < fServers.GetNumServers(); i++) |
||||
{ |
||||
std::string& serverAddress = fServers.GetServerAddress(i); |
||||
std::string& serverName = fServers.GetServerName(i); |
||||
std::string& currentDir = fServers.GetServerCurrentDir(i); |
||||
|
||||
if (!fFileGrabber->IsServerAvailable(serverAddress.c_str(), currentDir.c_str())) |
||||
continue; |
||||
|
||||
bool thisServer = (serverAddress == curServerAddress); |
||||
|
||||
int idx = ComboBox_AddString(hCombo, serverName.c_str()); |
||||
ComboBox_SetItemData(hCombo, idx, MAKELPARAM(i, 0)); |
||||
if (thisServer && !external) |
||||
ComboBox_SetCurSel(hCombo, idx); |
||||
|
||||
std::string extName = serverName + " (External)"; |
||||
idx = ComboBox_AddString(hCombo, extName.c_str()); |
||||
ComboBox_SetItemData(hCombo, idx, MAKELPARAM(i, 1)); |
||||
if (thisServer && external) |
||||
ComboBox_SetCurSel(hCombo, idx); |
||||
} |
||||
|
||||
if (ComboBox_GetCurSel(hCombo) == -1) |
||||
ComboBox_SetCurSel(hCombo, 0); |
||||
|
||||
SendMessage(fDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(jvCoreUtil::GetHInstance(), MAKEINTRESOURCE(IDI_ICON))); |
||||
SendMessage(fDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(jvCoreUtil::GetHInstance(), MAKEINTRESOURCE(IDI_ICON))); |
||||
|
||||
fResizer = new jvDialogResizer(fDlg); |
||||
fResizer->AddControl(IDC_BUILD_COMBO, jvDialogResizer::kResizeX); |
||||
fResizer->AddControl(IDC_STATUS_LIST, jvDialogResizer::kResizeX | jvDialogResizer::kResizeY); |
||||
fResizer->AddControl(IDC_PROGRESS, jvDialogResizer::kLockBottom | jvDialogResizer::kResizeX); |
||||
fResizer->AddControl(IDC_DL_TEXT, jvDialogResizer::kLockBottom | jvDialogResizer::kResizeX); |
||||
fResizer->AddControl(IDC_DL_BUTTON, jvDialogResizer::kLockBottom | jvDialogResizer::kCenterX); |
||||
fResizer->SetSize(360, 320); |
||||
fResizer->LoadPosAndSize("PlasmaUpdate"); |
||||
|
||||
bool goTime = true; |
||||
if (fFileGrabber->NeedsAuth()) |
||||
{ |
||||
/*
|
||||
if (!DialogBox(NULL, MAKEINTRESOURCE(IDD_PLASMAUPDATE_LOGIN), fDlg, ILoginWinProc)) |
||||
goTime = false; |
||||
else |
||||
*/ |
||||
fFileGrabber->SetUsernamePassword(fUserName, fPassword); |
||||
} |
||||
|
||||
if (goTime) |
||||
{ |
||||
ShowWindow(fDlg, SW_SHOW); |
||||
PostMessage(fDlg, WM_UPDATE_SERVER, 0, 0); |
||||
} |
||||
else |
||||
PostQuitMessage(0); |
||||
} |
||||
|
||||
void plPlasmaUpdate::IShutdown() |
||||
{ |
||||
fResizer->SavePosAndSize("PlasmaUpdate"); |
||||
delete fResizer; |
||||
fResizer = NULL; |
||||
|
||||
IDeleteManifests(); |
||||
} |
||||
|
||||
void plPlasmaUpdate::IEnableCtrls(bool enable) |
||||
{ |
||||
fCanExit = enable; |
||||
EnableWindow(GetDlgItem(fDlg, IDC_BUILD_COMBO), enable); |
||||
|
||||
HWND hDlButton = GetDlgItem(fDlg, IDC_DL_BUTTON); |
||||
|
||||
if (fManifests.empty()) |
||||
SetWindowText(hDlButton, "Close"); |
||||
else |
||||
SetWindowText(hDlButton, "Download"); |
||||
|
||||
EnableWindow(hDlButton, enable); |
||||
|
||||
if (enable) |
||||
SetFocus(hDlButton); |
||||
} |
||||
|
||||
void plPlasmaUpdate::IDeleteManifests() |
||||
{ |
||||
for (int i = 0; i < fManifests.size(); i++) |
||||
delete fManifests[i]; |
||||
fManifests.clear(); |
||||
} |
||||
|
||||
bool plPlasmaUpdate::IGetManifests(const char* serverRoot, bool external) |
||||
{ |
||||
IDeleteManifests(); |
||||
|
||||
char filePath[MAX_PATH]; |
||||
sprintf(filePath, "%sCurrent.txt", serverRoot); |
||||
|
||||
enum Sections |
||||
{ |
||||
kVersion, |
||||
kInternal, |
||||
kExternal, |
||||
kAll |
||||
}; |
||||
int curSection = kVersion; |
||||
|
||||
hsRAMStream s; |
||||
hsRAMStream manifestStream; |
||||
|
||||
if (fFileGrabber->FileToStream(filePath, &s)) |
||||
{ |
||||
char buf[256]; |
||||
while (s.ReadLn(buf, sizeof(buf))) |
||||
{ |
||||
if (buf[0] == '[') |
||||
{ |
||||
if (hsStrEQ(buf, "[Version]")) |
||||
curSection = kVersion; |
||||
else if (hsStrEQ(buf, "[Internal]")) |
||||
curSection = kInternal; |
||||
else if (hsStrEQ(buf, "[External]")) |
||||
curSection = kExternal; |
||||
else if (hsStrEQ(buf, "[All]")) |
||||
curSection = kAll; |
||||
} |
||||
else |
||||
{ |
||||
if (curSection == kVersion) |
||||
{ |
||||
int version = atoi(buf); |
||||
if (version != 1) |
||||
{ |
||||
hsMessageBox("Your copy of PlasmaUpdate is out of date.\nPlease get the latest version.", "Error", hsMessageBoxNormal, hsMessageBoxIconError); |
||||
return false; |
||||
} |
||||
} |
||||
else if ((!external && curSection == kInternal) |
||||
|| (external && curSection == kExternal) |
||||
|| curSection == kAll) |
||||
{ |
||||
//if (curSection == kAll && !(!strcmp(buf, "Data\\Movies.mfs") || !strcmp(buf, "Data\\Sounds.mfs")))
|
||||
// continue;
|
||||
|
||||
sprintf(filePath, "%s%s", serverRoot, buf); |
||||
|
||||
fFileGrabber->MakeProperPath(filePath); |
||||
|
||||
manifestStream.Reset(); |
||||
fFileGrabber->FileToStream(filePath, &manifestStream); |
||||
|
||||
plFileUtils::StripFile(filePath); |
||||
|
||||
plManifest* manifest = new plManifest(ILog); |
||||
manifest->Read(&manifestStream, filePath, buf); |
||||
fManifests.push_back(manifest); |
||||
} |
||||
} |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
void plPlasmaUpdate::IUpdateServer() |
||||
{ |
||||
char buf[256]; |
||||
|
||||
IEnableCtrls(false); |
||||
|
||||
SetDlgItemText(fDlg, IDC_DL_TEXT, "Checking for updates..."); |
||||
|
||||
//
|
||||
// Figure out what server we're checking
|
||||
//
|
||||
bool external = false; |
||||
char serverRoot[MAX_PATH]; |
||||
|
||||
{ |
||||
HWND hCombo = GetDlgItem(fDlg, IDC_BUILD_COMBO); |
||||
int idx = ComboBox_GetCurSel(hCombo); |
||||
LPARAM data = ComboBox_GetItemData(hCombo, idx); |
||||
int server = LOWORD(data); |
||||
external = (HIWORD(data) != 0); |
||||
|
||||
sprintf(serverRoot, "/%s/", fServers.GetServerCurrentDir(server).c_str()); |
||||
const char* serverName = fServers.GetServerAddress(server).c_str(); |
||||
|
||||
ILog("===== Server set to %s %s =====", serverName, external ? "external" : "internal"); |
||||
|
||||
WritePrivateProfileString("PlasmaUpdate", "ServerAddress", serverName, fIniPath); |
||||
WritePrivateProfileString("PlasmaUpdate", "External", external ? "1" : "0", fIniPath); |
||||
|
||||
fFileGrabber->SetServer(serverName); |
||||
} |
||||
|
||||
//
|
||||
// Get the latest publish notes
|
||||
//
|
||||
{ |
||||
HWND hList = GetDlgItem(fDlg, IDC_STATUS_LIST); |
||||
ListBox_ResetContent(hList); |
||||
|
||||
char updateFile[MAX_PATH]; |
||||
if (external) |
||||
sprintf(updateFile, "%sUpdates-External.txt", serverRoot); |
||||
else |
||||
sprintf(updateFile, "%sUpdates-Internal.txt", serverRoot); |
||||
|
||||
hsRAMStream updates; |
||||
fFileGrabber->MakeProperPath(updateFile); |
||||
if (fFileGrabber->FileToStream(updateFile, &updates)) |
||||
{ |
||||
while (updates.ReadLn(buf, sizeof(buf))) |
||||
ListBox_InsertString(hList, 0, buf); |
||||
} |
||||
} |
||||
|
||||
//
|
||||
// Get the manifests
|
||||
//
|
||||
bool gotManifests = IGetManifests(serverRoot, external); |
||||
uint32_t dlSize = 0; |
||||
|
||||
fProgressType = kValidating; |
||||
|
||||
if (gotManifests) |
||||
{ |
||||
int i; |
||||
|
||||
uint32_t numFiles = 0; |
||||
for (i = 0; i < fManifests.size(); i++) |
||||
numFiles += fManifests[i]->NumFiles(); |
||||
|
||||
HWND hProgress = GetDlgItem(fDlg, IDC_PROGRESS); |
||||
SendMessage(hProgress, PBM_SETRANGE32, 0, numFiles); |
||||
|
||||
for (i = 0; i < fManifests.size(); i++) |
||||
{ |
||||
fManifests[i]->ValidateFiles(ProgressFunc); |
||||
dlSize += fManifests[i]->DownloadSize(); |
||||
} |
||||
|
||||
SendMessage(hProgress, PBM_SETPOS, 0, 0); |
||||
} |
||||
|
||||
// Print how many megs there are to download
|
||||
if (dlSize == 0) |
||||
{ |
||||
strcpy(buf, "No updates to download"); |
||||
IDeleteManifests(); |
||||
} |
||||
else |
||||
{ |
||||
float dlMegs = float(dlSize) / (1024.f*1024.f); |
||||
if (dlMegs < .1) |
||||
dlMegs = .1; |
||||
sprintf(buf, "%.1f MB of updates to download", dlMegs); |
||||
} |
||||
SetDlgItemText(fDlg, IDC_DL_TEXT, buf); |
||||
|
||||
IEnableCtrls(true); |
||||
|
||||
if (fAutoDownload) |
||||
PostMessage(fDlg, WM_COMMAND, MAKEWPARAM(IDC_DL_BUTTON, BN_CLICKED), LPARAM(GetDlgItem(fDlg, IDC_DL_BUTTON))); |
||||
} |
||||
|
||||
void plPlasmaUpdate::IDownloadUpdates() |
||||
{ |
||||
fProgressType = kDownloading; |
||||
|
||||
IEnableCtrls(false); |
||||
|
||||
int i; |
||||
|
||||
uint32_t dlSize = 0; |
||||
for (i = 0; i < fManifests.size(); i++) |
||||
dlSize += fManifests[i]->DownloadSize(); |
||||
|
||||
HWND hProgress = GetDlgItem(fDlg, IDC_PROGRESS); |
||||
SendMessage(hProgress, PBM_SETRANGE32, 0, dlSize); |
||||
|
||||
for (i = 0; i < fManifests.size(); i++) |
||||
fManifests[i]->DownloadUpdates(ProgressFunc, fFileGrabber); |
||||
|
||||
SendMessage(hProgress, PBM_SETPOS, 0, 0); |
||||
|
||||
EnableWindow(GetDlgItem(fDlg, IDC_DL_BUTTON), false); |
||||
SetDlgItemText(fDlg, IDC_DL_TEXT, "No updates to download"); |
||||
|
||||
IDeleteManifests(); |
||||
|
||||
IEnableCtrls(true); |
||||
|
||||
if (fAutoDownload) |
||||
PostMessage(fDlg, WM_COMMAND, MAKEWPARAM(IDC_DL_BUTTON, BN_CLICKED), LPARAM(GetDlgItem(fDlg, IDC_DL_BUTTON))); |
||||
} |
||||
|
||||
void plPlasmaUpdate::ProgressFunc(const char* name, int delta) |
||||
{ |
||||
static const char* lastName = nil; |
||||
if (lastName != name) |
||||
{ |
||||
lastName = name; |
||||
|
||||
char buf[256]; |
||||
if (gInst->fProgressType == kValidating) |
||||
strcpy(buf, "Checking "); |
||||
else |
||||
strcpy(buf, "Downloading "); |
||||
strcat(buf, name); |
||||
|
||||
SetDlgItemText(gInst->fDlg, IDC_DL_TEXT, buf); |
||||
} |
||||
|
||||
SendDlgItemMessage(gInst->fDlg, IDC_PROGRESS, PBM_DELTAPOS, delta, 0); |
||||
|
||||
jvBaseDlg::PumpQueue(); |
||||
} |
||||
|
||||
void plPlasmaUpdate::ILog(const char* format, ...) |
||||
{ |
||||
static plStatusLog* log = nil; |
||||
|
||||
if (!log) |
||||
log = plStatusLogMgr::GetInstance().CreateStatusLog(0, "PlasmaUpdate.log"); |
||||
|
||||
va_list args; |
||||
va_start(args, format); |
||||
log->AddLineV(format, args); |
||||
va_end(args); |
||||
} |
||||
|
||||
BOOL plPlasmaUpdate::IDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) |
||||
{ |
||||
switch (msg) |
||||
{ |
||||
case WM_INITDIALOG: |
||||
IInit(); |
||||
SetFocus(GetDlgItem(fDlg, IDC_DL_BUTTON)); |
||||
return FALSE; |
||||
|
||||
case WM_CLOSE: |
||||
if (fCanExit) |
||||
DestroyWindow(hDlg); |
||||
return TRUE; |
||||
|
||||
case WM_DESTROY: |
||||
IShutdown(); |
||||
PostQuitMessage(0); |
||||
return TRUE; |
||||
|
||||
case WM_COMMAND: |
||||
if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_DL_BUTTON) |
||||
{ |
||||
if (fManifests.empty()) |
||||
SendMessage(fDlg, WM_CLOSE, 0, 0); |
||||
else |
||||
IDownloadUpdates(); |
||||
return TRUE; |
||||
} |
||||
else if (HIWORD(wParam) == CBN_SELCHANGE && LOWORD(wParam) == IDC_BUILD_COMBO) |
||||
{ |
||||
IUpdateServer(); |
||||
return TRUE; |
||||
} |
||||
break; |
||||
|
||||
case WM_UPDATE_SERVER: |
||||
IUpdateServer(); |
||||
return TRUE; |
||||
} |
||||
|
||||
return FALSE; |
||||
} |
@ -1,94 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "hsTypes.h" |
||||
#include "jvBaseDlg.h" |
||||
#include <vector> |
||||
#include <string> |
||||
#include "plPlasmaServers.h" |
||||
#include "plFileGrabber.h" |
||||
|
||||
class plManifest; |
||||
class jvDialogResizer; |
||||
|
||||
class plPlasmaUpdate : public jvBaseDlg |
||||
{ |
||||
protected: |
||||
static BOOL CALLBACK ILoginWinProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); |
||||
static std::string fUserName; |
||||
static std::string fPassword; |
||||
|
||||
std::vector<plManifest*> fManifests; |
||||
char fIniPath[MAX_PATH]; |
||||
bool fCanExit; |
||||
enum ProgressType { kValidating, kDownloading }; |
||||
ProgressType fProgressType; |
||||
jvDialogResizer* fResizer; |
||||
plPlasmaServers fServers; |
||||
bool fAutoDownload; |
||||
plFileGrabber* fFileGrabber; |
||||
|
||||
void IInit(); |
||||
void IShutdown(); |
||||
|
||||
bool IReadServerInfo(); |
||||
|
||||
void IEnableCtrls(bool enable); |
||||
|
||||
BOOL IDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); |
||||
|
||||
static void ProgressFunc(const char* name, int delta); |
||||
static void ILog(const char* format, ...); |
||||
|
||||
void IUpdateServer(); |
||||
|
||||
void IDeleteManifests(); |
||||
bool IGetManifests(const char* serverRoot, bool external); |
||||
void IDownloadUpdates(); |
||||
|
||||
public: |
||||
plPlasmaUpdate(); |
||||
virtual ~plPlasmaUpdate(); |
||||
|
||||
bool Create(); |
||||
|
||||
void SetAutoDownload() { fAutoDownload = true; } |
||||
}; |
@ -1,131 +0,0 @@
|
||||
// Microsoft Visual C++ generated resource script. |
||||
// |
||||
#include "resource.h" |
||||
|
||||
#define WIN32_LEAN_AND_MEAN |
||||
#include <windows.h> |
||||
#define IDC_STATIC (-1) // all static controls |
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// English (U.S.) resources |
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) |
||||
#ifdef _WIN32 |
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US |
||||
#pragma code_page(1252) |
||||
#endif //_WIN32 |
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// Dialog |
||||
// |
||||
|
||||
IDD_UPDATE DIALOGEX 0, 0, 128, 105 |
||||
STYLE DS_SETFONT | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | |
||||
WS_THICKFRAME |
||||
CAPTION "Parable Update" |
||||
FONT 8, "MS Sans Serif", 0, 0, 0x0 |
||||
BEGIN |
||||
LTEXT "Build:",IDC_STATIC,7,8,18,8 |
||||
COMBOBOX IDC_BUILD_COMBO,27,6,90,167,CBS_DROPDOWNLIST | |
||||
WS_VSCROLL | WS_TABSTOP |
||||
DEFPUSHBUTTON "Download",IDC_DL_BUTTON,34,86,56,16,WS_DISABLED |
||||
LISTBOX IDC_STATUS_LIST,7,36,110,11,LBS_NOINTEGRALHEIGHT | |
||||
LBS_NOSEL | WS_VSCROLL | WS_TABSTOP |
||||
CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER | |
||||
0x1,7,54,110,16 |
||||
LTEXT "Latest Updates:",IDC_STATIC,7,26,51,8 |
||||
CONTROL "xx.x MB of updates to download",IDC_DL_TEXT,"Static", |
||||
SS_LEFTNOWORDWRAP | WS_GROUP,7,74,110,8 |
||||
END |
||||
|
||||
IDD_PLASMAUPDATE_LOGIN DIALOGEX 0, 0, 150, 102 |
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | |
||||
WS_SYSMENU |
||||
CAPTION "Login" |
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1 |
||||
BEGIN |
||||
DEFPUSHBUTTON "OK",IDOK,48,62,50,14 |
||||
PUSHBUTTON "Cancel",IDCANCEL,48,80,50,14 |
||||
EDITTEXT IDC_USERNAME,7,17,135,12,ES_AUTOHSCROLL |
||||
EDITTEXT IDC_PASSWORD,7,45,135,12,ES_PASSWORD | ES_AUTOHSCROLL |
||||
LTEXT "Username",IDC_STATIC,7,7,134,8 |
||||
LTEXT "Password",IDC_STATIC,7,35,136,10 |
||||
END |
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// DESIGNINFO |
||||
// |
||||
|
||||
#ifdef APSTUDIO_INVOKED |
||||
GUIDELINES DESIGNINFO |
||||
BEGIN |
||||
IDD_UPDATE, DIALOG |
||||
BEGIN |
||||
LEFTMARGIN, 7 |
||||
RIGHTMARGIN, 121 |
||||
TOPMARGIN, 7 |
||||
BOTTOMMARGIN, 98 |
||||
END |
||||
|
||||
IDD_PLASMAUPDATE_LOGIN, DIALOG |
||||
BEGIN |
||||
LEFTMARGIN, 7 |
||||
RIGHTMARGIN, 143 |
||||
TOPMARGIN, 7 |
||||
BOTTOMMARGIN, 95 |
||||
END |
||||
END |
||||
#endif // APSTUDIO_INVOKED |
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED |
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// TEXTINCLUDE |
||||
// |
||||
|
||||
1 TEXTINCLUDE |
||||
BEGIN |
||||
"resource.h\0" |
||||
END |
||||
|
||||
2 TEXTINCLUDE |
||||
BEGIN |
||||
"\0" |
||||
END |
||||
|
||||
3 TEXTINCLUDE |
||||
BEGIN |
||||
"\r\n" |
||||
"\0" |
||||
END |
||||
|
||||
#endif // APSTUDIO_INVOKED |
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// Icon |
||||
// |
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon |
||||
// remains consistent on all systems. |
||||
IDI_ICON ICON "Dirt.ICO" |
||||
#endif // English (U.S.) resources |
||||
///////////////////////////////////////////////////////////////////////////// |
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED |
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// Generated from the TEXTINCLUDE 3 resource. |
||||
// |
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
#endif // not APSTUDIO_INVOKED |
||||
|
@ -1,27 +0,0 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by plPlasmaUpdate.rc
|
||||
//
|
||||
#define IDD_UPDATE 101 |
||||
#define IDI_ICON1 102 |
||||
#define IDI_ICON 102 |
||||
#define IDD_PLASMAUPDATE_LOGIN 103 |
||||
#define IDC_DL_BUTTON 1005 |
||||
#define IDC_STATUS_LIST 1006 |
||||
#define IDC_BUILD_COMBO 1008 |
||||
#define IDC_PROGRESS 1014 |
||||
#define IDC_DL_TEXT 1015 |
||||
#define IDC_EDIT1 1016 |
||||
#define IDC_USERNAME 1016 |
||||
#define IDC_PASSWORD 1017 |
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED |
||||
#ifndef APSTUDIO_READONLY_SYMBOLS |
||||
#define _APS_NEXT_RESOURCE_VALUE 104 |
||||
#define _APS_NEXT_COMMAND_VALUE 40001 |
||||
#define _APS_NEXT_CONTROL_VALUE 1018 |
||||
#define _APS_NEXT_SYMED_VALUE 101 |
||||
#endif |
||||
#endif |
@ -1,19 +0,0 @@
|
||||
include_directories(../../CoreLib) |
||||
include_directories(../../FeatureLib) |
||||
include_directories(../../NucleusLib) |
||||
include_directories(../../NucleusLib/inc) |
||||
include_directories(../../PubUtilLib) |
||||
|
||||
set(pfCsrSrv_SOURCES |
||||
pfCsrSrv.cpp |
||||
) |
||||
|
||||
set(pfCsrSrv_HEADERS |
||||
Pch.h |
||||
pfCsrSrv.h |
||||
) |
||||
|
||||
add_library(pfCsrSrv STATIC ${pfCsrSrv_SOURCES} ${pfCsrSrv_HEADERS}) |
||||
|
||||
source_group("Source Files" FILES ${pfCsrSrv_SOURCES}) |
||||
source_group("Header Files" FILES ${pfCsrSrv_HEADERS}) |
@ -1,58 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/FeatureLib/pfCsrSrv/Pch.h |
||||
*
|
||||
***/ |
||||
|
||||
#ifdef PLASMA20_SOURCES_PLASMA_FEATURELIB_PFCSRSRV_PCH_H |
||||
#error "Header $/Plasma20/Sources/Plasma/FeatureLib/pfCsrSrv/Pch.h included more than once" |
||||
#endif |
||||
#define PLASMA20_SOURCES_PLASMA_FEATURELIB_PFCSRSRV_PCH_H |
||||
|
||||
|
||||
#include "pfCsrSrv.h" |
||||
|
||||
#pragma warning(push, 0) |
||||
#include "pfConsole/pfConsole.h" |
||||
#pragma warning(pop) |
@ -1,160 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/FeatureLib/pfCsrSrv/pfCsrSrv.cpp |
||||
*
|
||||
***/ |
||||
|
||||
#include "Pch.h" |
||||
#pragma hdrstop |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Local types |
||||
* |
||||
***/ |
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Local data |
||||
* |
||||
***/ |
||||
|
||||
static bool s_running; |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Local functions |
||||
* |
||||
***/ |
||||
|
||||
//============================================================================
|
||||
static bool Recv_ExecConsoleCmd ( |
||||
SimpleNetConn * , |
||||
CsrNet_ExecConsoleCmd * msg |
||||
) { |
||||
LogMsg(kLogPerf, L"pfCsrSrv: ExecConsoleCmd: %S", msg->cmd); |
||||
|
||||
pfConsole::RunCommandAsync(msg->cmd); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static bool OnMsg ( |
||||
SimpleNetConn * conn, |
||||
SimpleNet_MsgHeader * msg |
||||
) { |
||||
bool result; |
||||
|
||||
#define DISPATCH(a) case kCsrNet_##a: result = Recv_##a(conn, (CsrNet_##a *) msg); break |
||||
switch (msg->messageId) { |
||||
DISPATCH(ExecConsoleCmd); |
||||
default: |
||||
result = false; |
||||
} |
||||
#undef DISPATCH |
||||
|
||||
return result; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void OnError ( |
||||
SimpleNetConn * , |
||||
ENetError error |
||||
) { |
||||
LogMsg(kLogPerf, L"pfCsrSrv NetError: %s", NetErrorToString(error)); |
||||
} |
||||
|
||||
//============================================================================
|
||||
static bool QueryAccept ( |
||||
void * , |
||||
unsigned channel, |
||||
SimpleNetConn * , |
||||
const plNetAddress& addr |
||||
) { |
||||
plString str = addr.AsString(); |
||||
LogMsg(kLogPerf, L"pfCsrSrv: Accepted connection from %s", str.c_str()); |
||||
return channel == kSimpleNetChannelCsr; |
||||
} |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Exports |
||||
* |
||||
***/ |
||||
|
||||
//============================================================================
|
||||
void CsrSrvInitialize () { |
||||
|
||||
#ifdef PLASMA_ENABLE_CSR_EXTERNAL |
||||
|
||||
LogMsg(kLogPerf, L"pfCsrSrv: Initializing"); |
||||
|
||||
s_running = true; |
||||
|
||||
SimpleNetInitialize(); |
||||
SimpleNetCreateChannel(kSimpleNetChannelCsr, OnMsg, OnError);
|
||||
SimpleNetStartListening(QueryAccept, nil); |
||||
|
||||
#endif |
||||
} |
||||
|
||||
//============================================================================
|
||||
void CsrSrvShutdown () { |
||||
|
||||
#ifdef PLASMA_ENABLE_CSR_EXTERNAL |
||||
|
||||
LogMsg(kLogPerf, L"pfCsrSrv: Shutting down"); |
||||
|
||||
s_running = false; |
||||
|
||||
SimpleNetStopListening(); |
||||
SimpleNetDestroyChannel(kSimpleNetChannelCsr); |
||||
SimpleNetShutdown(); |
||||
|
||||
#endif |
||||
} |
@ -1,66 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/FeatureLib/pfCsrSrv/pfCsrSrv.h |
||||
*
|
||||
***/ |
||||
|
||||
#ifndef PLASMA20_SOURCES_PLASMA_FEATURELIB_PFCSRSRV_PFCSRSRV_H |
||||
#define PLASMA20_SOURCES_PLASMA_FEATURELIB_PFCSRSRV_PFCSRSRV_H |
||||
|
||||
|
||||
#include "pnCsrNet/pnCsrNet.h" |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* pfCsrSrv |
||||
* - Executes remote CSR commands received through pnCsrNet |
||||
* |
||||
***/ |
||||
|
||||
void CsrSrvInitialize (); |
||||
void CsrSrvShutdown (); |
||||
|
||||
|
||||
#endif // PLASMA20_SOURCES_PLASMA_FEATURELIB_PFCSRSRV_PFCSRSRV_H
|
@ -1,23 +0,0 @@
|
||||
include_directories(../../CoreLib) |
||||
include_directories(../../NucleusLib) |
||||
include_directories(../../NucleusLib/inc) |
||||
include_directories(../../PubUtilLib) |
||||
|
||||
set(pfLoginDialog_SOURCES |
||||
plLoginDialog.cpp |
||||
) |
||||
|
||||
set(pfLoginDialog_HEADERS |
||||
plLoginDialog.h |
||||
resource.h |
||||
) |
||||
|
||||
set(pfLoginDialog_RESOURCES |
||||
pfLoginDialog.rc |
||||
) |
||||
|
||||
add_library(pfLoginDialog STATIC ${pfLoginDialog_SOURCES} ${pfLoginDialog_HEADERS} ${pfLoginDialog_RESOURCES}) |
||||
|
||||
source_group("Source Files" FILES ${pfLoginDialog_SOURCES}) |
||||
source_group("Header Files" FILES ${pfLoginDialog_HEADERS}) |
||||
source_group("Resource Files" FILES ${pfLoginDialog_RESOURCES}) |
@ -1,103 +0,0 @@
|
||||
//Microsoft Developer Studio generated resource script. |
||||
// |
||||
#include "resource.h" |
||||
|
||||
#define WIN32_LEAN_AND_MEAN |
||||
#include <windows.h> |
||||
#define IDC_STATIC (-1) // all static controls |
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// English (U.S.) resources |
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) |
||||
#ifdef _WIN32 |
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US |
||||
#pragma code_page(1252) |
||||
#endif //_WIN32 |
||||
|
||||
#ifdef APSTUDIO_INVOKED |
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// TEXTINCLUDE |
||||
// |
||||
|
||||
1 TEXTINCLUDE DISCARDABLE |
||||
BEGIN |
||||
"resource.h\0" |
||||
END |
||||
|
||||
2 TEXTINCLUDE DISCARDABLE |
||||
BEGIN |
||||
"\0" |
||||
END |
||||
|
||||
3 TEXTINCLUDE DISCARDABLE |
||||
BEGIN |
||||
"\r\n" |
||||
"\0" |
||||
END |
||||
|
||||
#endif // APSTUDIO_INVOKED |
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// Dialog |
||||
// |
||||
|
||||
IDD_DIALOG_LOGIN DIALOGEX 0, 0, 186, 114 |
||||
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION |
||||
EXSTYLE WS_EX_CONTROLPARENT |
||||
CAPTION "Login" |
||||
FONT 8, "Tahoma" |
||||
BEGIN |
||||
EDITTEXT IDC_LOGIN_USERNAME,55,7,98,12,ES_AUTOHSCROLL |
||||
EDITTEXT IDC_LOGIN_PASSWORD,55,23,98,12,ES_PASSWORD | |
||||
ES_AUTOHSCROLL |
||||
COMBOBOX IDC_LOGIN_LOBBYLIST,55,39,98,76,CBS_DROPDOWN | |
||||
CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP |
||||
DEFPUSHBUTTON "Login",IDC_LOGIN_LOGIN,41,58,50,14 |
||||
PUSHBUTTON "Cancel",IDC_LOGIN_CANCEL,94,58,50,14 |
||||
LTEXT "Account:",IDC_STATIC,21,9,30,8,0,WS_EX_RIGHT |
||||
LTEXT "Password:",IDC_STATIC,17,25,34,8,0,WS_EX_RIGHT |
||||
LTEXT "Server:",IDC_LOGIN_STATIC_SERVER,27,41,24,8,0, |
||||
WS_EX_RIGHT |
||||
PUSHBUTTON "?",IDC_SERVER_QUERY_BTN,157,39,22,13,NOT WS_VISIBLE |
||||
CONTROL "Remember Password",IDC_REMEMBER_PASSWORD,"Button", |
||||
BS_AUTOCHECKBOX | WS_TABSTOP,18,79,119,12 |
||||
END |
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// DESIGNINFO |
||||
// |
||||
|
||||
#ifdef APSTUDIO_INVOKED |
||||
GUIDELINES DESIGNINFO DISCARDABLE |
||||
BEGIN |
||||
IDD_DIALOG_LOGIN, DIALOG |
||||
BEGIN |
||||
LEFTMARGIN, 7 |
||||
RIGHTMARGIN, 179 |
||||
TOPMARGIN, 7 |
||||
BOTTOMMARGIN, 107 |
||||
END |
||||
END |
||||
#endif // APSTUDIO_INVOKED |
||||
|
||||
#endif // English (U.S.) resources |
||||
///////////////////////////////////////////////////////////////////////////// |
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED |
||||
///////////////////////////////////////////////////////////////////////////// |
||||
// |
||||
// Generated from the TEXTINCLUDE 3 resource. |
||||
// |
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////// |
||||
#endif // not APSTUDIO_INVOKED |
||||
|
@ -1,672 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#include "plLoginDialog.h" |
||||
#include "resource.h" |
||||
#include "plNetCommon/plNetCommonConstants.h" |
||||
#include "plNetMessage/plNetMessage.h" |
||||
// #include "plHttpServer/plHttpResponse.h"
|
||||
#include "plSDL/plSDL.h" |
||||
#include "plFile/hsFiles.h" |
||||
#include "plNetMessage/plNetCommonMessage.h" |
||||
|
||||
// 'this' : used in base member initializer list
|
||||
#pragma warning(disable:4355) |
||||
|
||||
#define kAuthTimedOut WM_USER+2 |
||||
|
||||
plLoginDialog::plLoginDialog( HWND parentWnd ) |
||||
: plDialog(IDD_DIALOG_LOGIN) |
||||
, fParentWnd( parentWnd ) |
||||
, fLoginBtn(this, IDC_LOGIN_LOGIN, plDelegate(this,(TDelegate)ILogin)) |
||||
, fCancelBtn(this, IDC_LOGIN_CANCEL, plDelegate(this,(TDelegate)IExit)) |
||||
, fAccountName(this,IDC_LOGIN_USERNAME) |
||||
, fPassword(this,IDC_LOGIN_PASSWORD) |
||||
, fLobbyList(this,IDC_LOGIN_LOBBYLIST) |
||||
, fLobbyText(this, IDC_LOGIN_STATIC_SERVER) |
||||
, fRememberPassword(this, IDC_REMEMBER_PASSWORD, plDelegate(this, (TDelegate)IOnRememberPwdChanged)) |
||||
, fCancelled(false) |
||||
, fAutoLogin(false) |
||||
#ifndef PLASMA_EXTERNAL_RELEASE |
||||
, fServerQueryBtn(this, IDC_SERVER_QUERY_BTN) |
||||
#endif |
||||
{ |
||||
fLobbyList.fSelectionEndOkDelegate = plDelegate(this,(TDelegate)SelectedLobbyChanged); |
||||
fLobbyList.fEditUpdateDelegate = plDelegate(this,(TDelegate)SelectedLobbyTextEdited); |
||||
fLobbyList.fKillFocusDelegate = plDelegate(this,(TDelegate)OnLobbyListLostFocus); |
||||
#ifndef PLASMA_EXTERNAL_RELEASE |
||||
fServerQueryBtn.fClickDelegate = plDelegate(this,(TDelegate)ServerQueryBtnClicked); |
||||
#endif |
||||
} |
||||
|
||||
std::string plLoginDialog::MakeSafeLobbyServerName(const std::string & value) |
||||
{ |
||||
return ""; |
||||
} |
||||
|
||||
|
||||
void plLoginDialog::SelectedLobbyChanged() |
||||
{ |
||||
fLobbyVal.SetValue(fLobbyList.GetValue().c_str()); |
||||
fLobbyList.SetEdited(false); |
||||
} |
||||
|
||||
void plLoginDialog::SelectedLobbyTextEdited() |
||||
{ |
||||
fLobbyVal.SetValue(fLobbyList.GetValue().c_str()); |
||||
fLobbyList.SetEdited(true); |
||||
} |
||||
|
||||
// Ugh
|
||||
#ifdef PLASMA_EXTERNAL_RELEASE |
||||
#include <time.h> |
||||
#endif |
||||
|
||||
bool plLoginDialog::RefreshLobbyList() |
||||
{ |
||||
fStatusBar.SetText(L"Refreshing lobby server list..."); |
||||
|
||||
plStringList lobbies; |
||||
std::vector<std::wstring> wLobbies; |
||||
GetLobbyList(lobbies); |
||||
|
||||
// Strip off the shard name and just leave the address
|
||||
for (int i = 0; i < lobbies.size(); i++) |
||||
{ |
||||
std::string& str = lobbies[i]; |
||||
|
||||
std::string::size_type endofname = str.find('\t'); |
||||
if (endofname != std::string::npos) |
||||
str.erase(str.begin() + endofname, str.end()); |
||||
|
||||
wchar_t *wLobby = hsStringToWString(str.c_str()); |
||||
wLobbies.push_back(wLobby); |
||||
delete [] wLobby; |
||||
} |
||||
|
||||
fLobbyList.Empty(); |
||||
|
||||
#ifdef PLASMA_EXTERNAL_RELEASE |
||||
// In release mode, put the user in a random lobby for rudimentary load balancing
|
||||
int numLobbies = lobbies.size(); |
||||
if (numLobbies > 0) |
||||
{ |
||||
srand(time(NULL)); |
||||
int rnum = rand(); |
||||
int whichLobby = rnum % numLobbies; |
||||
|
||||
fLobbyList.AddString(wLobbies[whichLobby].c_str()); |
||||
} |
||||
|
||||
fLobbyList.SetCurrent(0); |
||||
#else |
||||
if (AllowSinglePlayerLobby()) |
||||
fLobbyList.AddString(L"Single Player"); |
||||
fLobbyList.AddStrings(wLobbies); |
||||
|
||||
wchar_t *wLobby = hsStringToWString(fLobbyVal.GetValue().c_str()); |
||||
int index = fLobbyList.FindStringExact(wLobby); |
||||
if (index==LB_ERR && fLobbyVal.GetValue().length()>0) |
||||
{ |
||||
fLobbyList.AddString(wLobby); |
||||
index = fLobbyList.FindStringExact(wLobby); |
||||
} |
||||
delete [] wLobby; |
||||
|
||||
fLobbyList.SetCurrent((index!=LB_ERR)?index:0); |
||||
#endif // PLASMA_EXTERNAL_RELEASE
|
||||
|
||||
SelectedLobbyChanged(); |
||||
|
||||
fStatusBar.SetText(L""); |
||||
return true; |
||||
} |
||||
|
||||
void plLoginDialog::OnLobbyListLostFocus() |
||||
{ |
||||
std::string value = fLobbyList.GetValue(); |
||||
if (value.length()==0) |
||||
{ |
||||
fLobbyList.SetCurrent(0); |
||||
fLobbyList.SetValue(MakeSafeLobbyServerName(fLobbyList.GetValue()).c_str()); |
||||
SelectedLobbyChanged(); |
||||
} |
||||
} |
||||
|
||||
#if 0 |
||||
void plLoginDialog::UpdateCtrls() |
||||
{ |
||||
bool networkEnabled = IsNetworkPlayEnabled(); |
||||
bool loggedIn = GetLoggedIn(); |
||||
bool loggingIn = GetLoggingIn(); |
||||
bool loggedOut = GetLoggedOut(); |
||||
if (!networkEnabled && (loggedIn || loggingIn)) |
||||
{ |
||||
Logout(); |
||||
|
||||
// these don't do anything. need to set the vars in fMainDIalog?
|
||||
loggedIn = false;
|
||||
loggingIn = false; |
||||
loggedOut = true; |
||||
} |
||||
} |
||||
#endif |
||||
|
||||
bool plLoginDialog::IsNetworkPlayDisabled() |
||||
{ |
||||
#ifdef PLASMA_EXTERNAL_RELEASE |
||||
return false; |
||||
#else |
||||
xtl::istring tmp = fLobbyVal.GetValue().c_str(); |
||||
return (tmp.compare("single player")==0); |
||||
#endif |
||||
} |
||||
|
||||
bool plLoginDialog::IsNetworkPlayEnabled() |
||||
{ |
||||
return !IsNetworkPlayDisabled(); |
||||
} |
||||
|
||||
void plLoginDialog::OnInitDialog() |
||||
{ |
||||
plDialog::OnInitDialog(); |
||||
|
||||
if ( fParentWnd ) |
||||
SetParent( Handle(), fParentWnd ); |
||||
|
||||
fStatusBar.OpenWindow(this,true); |
||||
|
||||
#ifdef PLASMA_EXTERNAL_RELEASE |
||||
fLobbyList.Show(false); |
||||
fLobbyText.Show(false); |
||||
#endif |
||||
|
||||
#ifndef PLASMA_EXTERNAL_RELEASE |
||||
fServerQueryBtn.Show(true); |
||||
#endif |
||||
|
||||
bool rememberPwd = (fRememberPasswordVal.GetValue()=="true"); |
||||
fAccountName.SetValue(fAccountNameVal.GetValue().c_str()); |
||||
if (rememberPwd) |
||||
{ |
||||
int len = atoi(fPasswordLen.GetValue().c_str()); |
||||
std::string fakePwd(len, '*'); |
||||
fPassword.SetValue(fakePwd.c_str()); |
||||
} |
||||
|
||||
fRememberPassword.Check(rememberPwd); |
||||
|
||||
RefreshLobbyList(); |
||||
|
||||
if ( fAutoLogin ) |
||||
fLoginBtn.Click(); |
||||
|
||||
// SetForegroundWindow(*this);
|
||||
} |
||||
|
||||
bool plLoginDialog::Login() |
||||
{ |
||||
int ret = DoModal(); |
||||
if (ret<0) |
||||
{ |
||||
hsAssert(false, xtl::format("plLoginDialog failed to initialize, err code %d, GetLastError %d",
|
||||
ret, GetLastError()).c_str()); |
||||
} |
||||
|
||||
return (ret != 0); |
||||
} |
||||
|
||||
void plLoginDialog::ILogin() |
||||
{ |
||||
OnLoginClicked(); |
||||
|
||||
fAccountNameVal.SetValue(fAccountName.GetValue().c_str()); |
||||
|
||||
std::string pwd = fPassword.GetValue(); |
||||
int pwdSize = pwd.size(); |
||||
|
||||
std::string fakePwd = "*" + std::string(pwdSize-1, '*'); |
||||
if (pwd != fakePwd) // user has entered a real pwd
|
||||
{ |
||||
fPasswordLen.SetValue(xtl::format("%d",pwd.size()).c_str()); |
||||
// MD5 HASH the pwd
|
||||
std::string hex; |
||||
plChallengeResponse::HashPassword(pwd.c_str(), hex); |
||||
fPasswordVal.SetValue(hex.c_str()); |
||||
} |
||||
|
||||
SetDataServerUserName(true, fAccountNameVal.GetValue().c_str()); |
||||
SetDataServerPassword(true, fPasswordVal.GetValue().c_str()); |
||||
SetDataServerUserName(false, fAccountNameVal.GetValue().c_str()); |
||||
SetDataServerPassword(false, fPasswordVal.GetValue().c_str()); |
||||
|
||||
if (IsNetworkPlayEnabled()) |
||||
StartLogin(); |
||||
else |
||||
CompleteLogin(); |
||||
} |
||||
|
||||
void plLoginDialog::IOnRememberPwdChanged() |
||||
{ |
||||
fRememberPasswordVal.SetValue(fRememberPassword.IsChecked() ? "true" : "false"); |
||||
} |
||||
|
||||
void plLoginDialog::IExit() |
||||
{ |
||||
fAccountNameVal.SetValue(fAccountName.GetValue().c_str()); |
||||
fPasswordVal.SetValue(fPassword.GetValue().c_str()); |
||||
fLobbyVal.SetValue(fLobbyList.GetValue().c_str()); |
||||
SetDataServerUserName(true, fAccountNameVal.GetValue().c_str()); |
||||
SetDataServerPassword(true, fPasswordVal.GetValue().c_str()); |
||||
SetDataServerUserName(false, fAccountNameVal.GetValue().c_str()); |
||||
SetDataServerPassword(false, fPasswordVal.GetValue().c_str()); |
||||
SHORT state = GetKeyState(VK_SHIFT); |
||||
if (state&0x8000) |
||||
EndDialogTrue(); |
||||
else |
||||
EndDialogFalse(); |
||||
fCancelled=true; |
||||
} |
||||
|
||||
int plLoginDialog::ICheckNetVersion(plNetMsgAuthenticateChallenge * msg) |
||||
{ |
||||
if (msg) |
||||
{ |
||||
if (msg->GetVersionMajor() != plNetMessage::kVerMajor || |
||||
msg->GetVersionMinor() != plNetMessage::kVerMinor) |
||||
{ |
||||
std::string str = xtl::format("Login Failed, client/server version mismatch, client %d.%d, server %d.%d", |
||||
plNetMessage::kVerMajor, plNetMessage::kVerMinor,
|
||||
msg->GetVersionMajor(), |
||||
msg->GetVersionMinor()); |
||||
FailLogin(str.c_str()); |
||||
return hsFail; |
||||
} |
||||
return hsOK; |
||||
} |
||||
return hsFail;
|
||||
} |
||||
|
||||
void plLoginDialog::HandleAuthChallenge(plNetMsgAuthenticateChallenge * msg) |
||||
{ |
||||
int cnt = msg->PeekBuffer(msg->GetNetCoreMsg()->GetData(),msg->GetNetCoreMsg()->GetLen()); |
||||
|
||||
// check protocol version first, in case msg contents are hosed
|
||||
if (ICheckNetVersion(msg) == hsFail) |
||||
return; // version err
|
||||
|
||||
if (msg->IsContinuing()) |
||||
{ |
||||
// Respond to the Challenge
|
||||
std::string hex = plChallengeResponse::GetBufferAsHexStr(msg->GetChallenge().data(), msg->GetChallenge().size(), true); |
||||
fChallengeResponse.SetChallenge(hex); |
||||
fChallengeResponse.GenerateResponse(fAccountNameVal.GetValue().c_str(),fPasswordVal.GetValue().c_str()); |
||||
KillTimer(*this,kAuthTimedOut); |
||||
SendAuthenticateResponse(); |
||||
} |
||||
else |
||||
{ |
||||
FailLogin(msg->GetHelloResult()); |
||||
} |
||||
} |
||||
|
||||
void plLoginDialog::HandleAccountAuthenticated(plNetMsgAccountAuthenticated * msg) |
||||
{ |
||||
int cnt = msg->PeekBuffer(msg->GetNetCoreMsg()->GetData(),msg->GetNetCoreMsg()->GetLen()); |
||||
if (msg->IsAuthenticated()) |
||||
{ |
||||
CompleteLogin(); |
||||
} |
||||
else |
||||
{ |
||||
FailLogin(msg->GetAuthResult()); |
||||
} |
||||
} |
||||
|
||||
|
||||
void plLoginDialog::StartLogin() |
||||
{ |
||||
fLoginBtn.SetEnabled(false); |
||||
std::string value = fLobbyList.GetValue(); |
||||
if (value.length()==0) |
||||
{ |
||||
fLobbyList.SetCurrent(0); |
||||
fLobbyList.SetValue(MakeSafeLobbyServerName(fLobbyList.GetValue()).c_str()); |
||||
SelectedLobbyChanged(); |
||||
} |
||||
fStatusBar.SetText(L"Authenticating..."); |
||||
// fMainDialog->InitNetCore();
|
||||
// fMainDialog->fLoginState = kLoggingIn;
|
||||
// fAccountTab.UpdateCtrls();
|
||||
// fPlayerTab.SetPlayerVault(nil);
|
||||
SendAuthenticateHello(); |
||||
} |
||||
|
||||
void plLoginDialog::CompleteLogin() |
||||
{ |
||||
if ( Handle() ) |
||||
fLoginBtn.SetEnabled(true); |
||||
|
||||
KillTimer(*this,kAuthTimedOut); |
||||
|
||||
fStatusBar.SetText(L""); |
||||
if (IsNetworkPlayEnabled()) |
||||
NotifyConnected(); |
||||
else |
||||
NotifyDisconnected(); |
||||
|
||||
EndDialogTrue(); |
||||
|
||||
GetClientManifests(); |
||||
UpdateAllCtrls(); |
||||
} |
||||
|
||||
void plLoginDialog::FailLogin(const char* str) |
||||
{ |
||||
fLoginBtn.SetEnabled(true); |
||||
KillTimer(*this, kAuthTimedOut); |
||||
fStatusBar.SetText(L""); |
||||
hsMessageBoxWithOwner((void*)*this,str,"Error",hsMessageBoxNormal); |
||||
Logout(); |
||||
} |
||||
|
||||
void plLoginDialog::FailLogin(int reasonCode) |
||||
{ |
||||
std::string str = xtl::format("Failed to login to lobby server %s: %s",
|
||||
fLobbyVal.GetValue().c_str(), plNetMsgAccountAuthenticated::GetAuthResultString(reasonCode)); |
||||
FailLogin(str.c_str()); |
||||
} |
||||
|
||||
void plLoginDialog::TimeoutLogin() |
||||
{ |
||||
fLoginBtn.SetEnabled(true); |
||||
|
||||
wchar_t *wStr = hsStringToWString(xtl::format("Timed out logging into lobby server %s.", fLobbyVal.GetValue().c_str()).c_str()); |
||||
fStatusBar.SetText(wStr); |
||||
delete [] wStr; |
||||
|
||||
KillTimer(*this, kAuthTimedOut); |
||||
Logout(); |
||||
} |
||||
|
||||
void plLoginDialog::Logout() |
||||
{ |
||||
KillTimer(*this, kAuthTimedOut); |
||||
SendLobbyLeave(); |
||||
//fMainDialog->ShutdownNetCore();
|
||||
NotifyDisconnected(); |
||||
} |
||||
|
||||
void plLoginDialog::SendLobbyLeave() |
||||
{ |
||||
plNetMsgLeave msg; |
||||
msg.SetReason( plPlayerUpdateConstants::kPlayerQuitting ); |
||||
SendMsg(&msg,plNetAddress(fLobbyVal.GetValue().c_str(),plNetLobbyServerConstants::GetPort())); |
||||
RemoveLobbyPeer(); |
||||
} |
||||
|
||||
#define MSG_TIMEOUT 8000 |
||||
#include "../pnNetCommon/plNetAddress.h" |
||||
|
||||
void plLoginDialog::SendAuthenticateHello() |
||||
{ |
||||
SetTimer(*this,kAuthTimedOut,MSG_TIMEOUT,nil); |
||||
plNetMsgAuthenticateHello msg; |
||||
msg.SetAccountName(fAccountNameVal.GetValue().c_str()); |
||||
msg.SetMaxPacketSize(GetPacketSize()); |
||||
SendMsg(&msg,plNetAddress(fLobbyVal.GetValue().c_str(),plNetLobbyServerConstants::GetPort())); |
||||
} |
||||
|
||||
void plLoginDialog::SendAuthenticateResponse() |
||||
{ |
||||
SetTimer(*this,kAuthTimedOut,MSG_TIMEOUT,nil); |
||||
plNetMsgAuthenticateResponse msg; |
||||
msg.SetResponse(fChallengeResponse.GetResponse()); |
||||
SendMsg(&msg,plNetAddress(fLobbyVal.GetValue().c_str(),plNetLobbyServerConstants::GetPort())); |
||||
} |
||||
|
||||
int plLoginDialog::CallDefaultProc( unsigned int message, unsigned int wParam, LONG lParam ) |
||||
{ |
||||
switch (message) |
||||
{ |
||||
case WM_TIMER: |
||||
switch (wParam) |
||||
{ |
||||
case kAuthTimedOut: |
||||
TimeoutLogin(); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#ifndef PLASMA_EXTERNAL_RELEASE |
||||
#define kServerInfoFilename "server_info.html" |
||||
|
||||
static void StringToLines(std::string str, plStringList & lines, bool includeBlankLines=true) |
||||
{ |
||||
xtl::trim(str); |
||||
if (str.length()==0) |
||||
return; |
||||
str.append("\n"); |
||||
int pos; |
||||
while ((pos=str.find("\n"))!=std::string::npos) |
||||
{ |
||||
std::string line = xtl::trim(str.substr(0,pos).c_str()); |
||||
str.erase(0,pos+1); |
||||
if (includeBlankLines || (!includeBlankLines && line.length()>0)) |
||||
lines.push_back(line); |
||||
} |
||||
} |
||||
|
||||
static void GetPathElements(std::string filename, plStringList & lst) |
||||
{ |
||||
int pos; |
||||
while ((pos=filename.find_first_of("\\/"))!=std::string::npos) |
||||
{ |
||||
std::string element = filename.substr(0,pos); |
||||
filename.erase(0,pos+1); |
||||
if (element.length()) |
||||
lst.push_back(element); |
||||
} |
||||
} |
||||
|
||||
struct SDLInfoParser |
||||
{ |
||||
std::string fFilename; |
||||
std::string fDescriptorName; |
||||
int fVersion; |
||||
void ParseString( const char * s ) |
||||
{ |
||||
std::string str = s; |
||||
int p = str.find(","); |
||||
fFilename = str.substr(0,p); |
||||
str.erase(0,p+1); |
||||
p = str.find(","); |
||||
fDescriptorName = str.substr(0,p); |
||||
str.erase(0,p+1); |
||||
fVersion = atoi(str.c_str()); |
||||
|
||||
p = fFilename.find_last_of("\\"); |
||||
if( p!=std::string::npos ) |
||||
fFilename.erase(0,p+1); |
||||
p = fFilename.find_last_of("/"); |
||||
if( p!=std::string::npos ) |
||||
fFilename.erase(0,p+1); |
||||
} |
||||
}; |
||||
|
||||
|
||||
struct DescriptorReport |
||||
{ |
||||
int fServerVersion; // 0 means the descriptor is missing
|
||||
int fClientVersion; |
||||
DescriptorReport(): fServerVersion(0),fClientVersion(0){} |
||||
}; |
||||
|
||||
#define kStyleSheet \ |
||||
"<style>" \
|
||||
"BODY {" \
|
||||
" font-size : 10pt;" \
|
||||
" font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;" \
|
||||
"}" \
|
||||
"TD {" \
|
||||
" font-size : 10pt;" \
|
||||
" font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;" \
|
||||
"}" \
|
||||
"PRE {" \
|
||||
" margin-top : 0px;" \
|
||||
"}" \
|
||||
".SDLFile { background-color : #FFFF99; }" \
|
||||
".Title {" \
|
||||
" font-weight : bold;" \
|
||||
" text-align : center;" \
|
||||
" text-decoration : underline;" \
|
||||
"}" \
|
||||
".SectionHeader {" \
|
||||
" margin-bottom : 0px;" \
|
||||
"}" \
|
||||
"</style>" |
||||
|
||||
void plLoginDialog::ServerQueryBtnClicked() |
||||
{ |
||||
hsUNIXStream file; |
||||
file.Open( kServerInfoFilename, "wt" ); |
||||
file.WriteString("<html>"kStyleSheet"<body>\n"); |
||||
|
||||
try |
||||
{ |
||||
typedef std::map< std::string, DescriptorReport > DescriptorReports; |
||||
typedef std::map< std::string, DescriptorReports > FileReports; |
||||
|
||||
FileReports fileReports; |
||||
|
||||
|
||||
/*plURL url;
|
||||
plHttpRequest request; |
||||
plHttpResponse response; |
||||
|
||||
// read server build date etc.
|
||||
url.SetHost( fLobbyList.GetValue().c_str() ); |
||||
url.SetPort( 7676 ); |
||||
url.SetFile( "VersionInfo" ); |
||||
request.SetUrl( url ); |
||||
request.SetType( plHttpRequest::kGet ); |
||||
if ( !request.MakeRequest( response ) ) |
||||
throw 0; |
||||
file.WriteString("<h3 class=SectionHeader>Server Info</h3>\n" ); |
||||
file.WriteString( "<pre>\n" ); |
||||
file.WriteString( response.c_str() ); |
||||
file.WriteString( "</pre>\n" ); |
||||
|
||||
// get server's SDL info
|
||||
url.SetFile( "SDLInfo" ); |
||||
request.SetUrl( url ); |
||||
if ( !request.MakeRequest( response ) ) |
||||
throw 0; |
||||
plStringList lines; |
||||
StringToLines( response, lines, false ); |
||||
SDLInfoParser parser; |
||||
{for ( plStringList::iterator ii=lines.begin(); ii!=lines.end(); ++ii ) |
||||
{ |
||||
parser.ParseString( (*ii).c_str() ); |
||||
fileReports[ parser.fFilename ][ parser.fDescriptorName ].fServerVersion = parser.fVersion; |
||||
}} |
||||
|
||||
// get client's SDL info
|
||||
plSDLMgr::GetInstance()->DeInit(); |
||||
plSDLMgr::GetInstance()->SetSDLDir( "SDL" ); |
||||
plSDLMgr::GetInstance()->Init(); |
||||
const plSDL::DescriptorList * cds = plSDLMgr::GetInstance()->GetDescriptors(); |
||||
{for ( plSDL::DescriptorList::const_iterator ii=cds->begin(); ii!=cds->end(); ++ii ) |
||||
{ |
||||
plStateDescriptor * descriptor = *ii; |
||||
std::string filename = descriptor->GetFilename(); |
||||
int p = filename.find_last_of(PATH_SEPARATOR_STR); |
||||
if( p!=std::string::npos ) |
||||
filename.erase(0,p+1); |
||||
fileReports[ filename ][ descriptor->GetName() ].fClientVersion = descriptor->GetVersion(); |
||||
}} |
||||
|
||||
// write SDL comparison report
|
||||
file.WriteString("<h3 class=SectionHeader>SDL File Comparison</h3>\n" ); |
||||
file.WriteString("Version=0 means descriptor doesn't exist.<br><br>\n" ); |
||||
file.WriteString( "<table><tr class=Title><td>File</td><td>Server Version</td><td>Client Version</td><td>Status</td></tr>\n" ); |
||||
|
||||
|
||||
{ for ( FileReports::iterator ii=fileReports.begin(); ii!=fileReports.end(); ++ii ) |
||||
{ |
||||
std::string sdlFilename = ii->first; |
||||
DescriptorReports & descrReports = ii->second; |
||||
file.WriteFmt( "<tr><td colspan=5 class=SDLFile>%s</td></tr>\n", sdlFilename.c_str() ); |
||||
{ for ( DescriptorReports::iterator jj=descrReports.begin(); jj!=descrReports.end(); ++jj ) |
||||
{ |
||||
#define kSDLBad "<font color=red><b>Bad</b></font>" |
||||
#define kSDLOk "<font color=green><b>Ok</b></font>" |
||||
std::string descrName = jj->first; |
||||
DescriptorReport & descrReport = jj->second; |
||||
file.WriteFmt( "<tr><td> %s</td><td align=right>%d</td><td align=right>%d</td><td align=center>%s</td></tr>\n", |
||||
descrName.c_str(), descrReport.fServerVersion, descrReport.fClientVersion, |
||||
( descrReport.fServerVersion==descrReport.fClientVersion ) ? kSDLOk:kSDLBad ); |
||||
}} |
||||
}} |
||||
|
||||
file.WriteString("</table>\n");*/ |
||||
} |
||||
catch (...) |
||||
{ |
||||
file.WriteString("<p>An error occurred while querying the server.\n"); |
||||
} |
||||
|
||||
file.WriteString("</body></html>\n"); |
||||
file.Close(); |
||||
|
||||
ShellExecute( nil, nil, kServerInfoFilename, nil, nil, SW_SHOWNORMAL ); |
||||
} |
||||
#endif |
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -1,138 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#ifndef plLoginDialog_h_inc |
||||
#define plLoginDialog_h_inc |
||||
|
||||
#include "plWndCtrls/plWndCtrls.h" |
||||
// #include "plEncryption/plChallengeResponse.h"
|
||||
#include "pnNetCommon/plNetAddress.h" |
||||
|
||||
class plMainDialog; |
||||
class plNetMsgAuthenticateChallenge; |
||||
class plNetMsgAccountAuthenticated; |
||||
class plNetMessage; |
||||
|
||||
class plLoginDialog : public plDialog |
||||
{ |
||||
HWND fParentWnd; |
||||
public: |
||||
DECLARE_WINDOWCLASS(plLoginDialog, plDialog); |
||||
|
||||
plLoginDialog( HWND parentWnd=nil ); |
||||
|
||||
bool Login(); |
||||
|
||||
void OnInitDialog(); |
||||
|
||||
void HandleAuthChallenge(plNetMsgAuthenticateChallenge * msg); |
||||
void HandleAccountAuthenticated(plNetMsgAccountAuthenticated * msg); |
||||
void StartLogin(); |
||||
void CompleteLogin(); |
||||
void FailLogin(int reasonCode); |
||||
void FailLogin(const char* str); |
||||
void TimeoutLogin(); |
||||
void Logout(); |
||||
void SendAuthenticateHello(); |
||||
void SendAuthenticateResponse(); |
||||
|
||||
bool IsNetworkPlayDisabled(); |
||||
bool IsNetworkPlayEnabled(); |
||||
// void UpdateCtrls();
|
||||
void SelectedLobbyChanged(); |
||||
void SelectedLobbyTextEdited(); |
||||
void OnLobbyListLostFocus(); |
||||
void SendLobbyLeave(); |
||||
bool RefreshLobbyList(); |
||||
bool GetCancelled() const { return fCancelled; } |
||||
bool GetRememberPassword() const { return fRememberPassword.IsChecked(); } |
||||
|
||||
// callbacks
|
||||
virtual void GetLobbyList(plStringList& lobbies) = 0;
|
||||
virtual bool AllowSinglePlayerLobby() { return true; } // checked in non external-release build
|
||||
virtual void SetDataServerUserName(bool local, const char* s) {} |
||||
virtual void SetDataServerPassword(bool local, const char* s) {} |
||||
virtual void RemoveLobbyPeer() {} |
||||
virtual void NotifyConnected() {} |
||||
virtual void NotifyDisconnected() {} |
||||
virtual void GetClientManifests() {} |
||||
virtual void UpdateAllCtrls() {} |
||||
virtual unsigned int GetPacketSize() = 0; |
||||
virtual bool SendMsg(plNetMessage * msg, plNetAddress & addr) = 0; |
||||
virtual void OnLoginClicked() {} |
||||
|
||||
std::string MakeSafeLobbyServerName(const std::string & value); |
||||
|
||||
int CallDefaultProc( unsigned int message, unsigned int wParam, LONG lParam ); |
||||
|
||||
plEdit fAccountName; |
||||
plEdit fPassword; |
||||
plChallengeResponse fChallengeResponse; |
||||
plComboBox fLobbyList; |
||||
plLabel fLobbyText; |
||||
plCheckBox fRememberPassword; |
||||
|
||||
#ifndef PLASMA_EXTERNAL_RELEASE |
||||
plButton fServerQueryBtn; |
||||
void ServerQueryBtnClicked(); |
||||
#endif |
||||
|
||||
plConfigValue fAccountNameVal; |
||||
plConfigValue fPasswordVal; // the pwd as a MD5 hash
|
||||
plConfigValue fRememberPasswordVal; // the checkbox state
|
||||
plConfigValue fPasswordLen; // the length of the original pwd
|
||||
plConfigValue fLobbyVal; |
||||
bool fAutoLogin; |
||||
|
||||
plStatusBar fStatusBar; |
||||
|
||||
protected: |
||||
int ICheckNetVersion(plNetMsgAuthenticateChallenge * msg); |
||||
void ILogin(); |
||||
void IExit(); |
||||
void IOnRememberPwdChanged(); |
||||
|
||||
bool fCancelled; |
||||
plButton fLoginBtn; |
||||
plButton fCancelBtn; |
||||
}; |
||||
|
||||
#endif // plLoginDialog_h_inc
|
@ -1,24 +0,0 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by pfLoginDialog.rc
|
||||
//
|
||||
#define IDD_DIALOG_LOGIN 326 |
||||
#define IDC_LOGIN_USERNAME 3029 |
||||
#define IDC_LOGIN_PASSWORD 3031 |
||||
#define IDC_LOGIN_LOBBYLIST 3033 |
||||
#define IDC_LOGIN_STATIC_SERVER 3127 |
||||
#define IDC_LOGIN_LOGIN 3130 |
||||
#define IDC_LOGIN_CANCEL 3131 |
||||
#define IDC_SERVER_QUERY_BTN 3132 |
||||
#define IDC_REMEMBER_PASSWORD 3133 |
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED |
||||
#ifndef APSTUDIO_READONLY_SYMBOLS |
||||
#define _APS_NEXT_RESOURCE_VALUE 327 |
||||
#define _APS_NEXT_COMMAND_VALUE 42001 |
||||
#define _APS_NEXT_CONTROL_VALUE 3134 |
||||
#define _APS_NEXT_SYMED_VALUE 327 |
||||
#endif |
||||
#endif |
@ -1,16 +0,0 @@
|
||||
include_directories(../../CoreLib) |
||||
include_directories(../../NucleusLib) |
||||
|
||||
set(pnCsrCli_SOURCES |
||||
pnCsrCli.cpp |
||||
) |
||||
|
||||
set(pnCsrCli_HEADERS |
||||
Pch.h |
||||
pnCsrCli.h |
||||
) |
||||
|
||||
add_library(pnCsrCli STATIC ${pnCsrCli_SOURCES} ${pnCsrCli_HEADERS}) |
||||
|
||||
source_group("Source Files" FILES ${pnCsrCli_SOURCES}) |
||||
source_group("Header Files" FILES ${pnCsrCli_HEADERS}) |
@ -1,56 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnCsrCli/Pch.h |
||||
*
|
||||
***/ |
||||
|
||||
#ifdef PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNCSRCLI_PCH_H |
||||
#error "Header $/Plasma20/Sources/Plasma/NucleusLib/pnCsrCli/Pch.h included more than once" |
||||
#endif |
||||
#define PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNCSRCLI_PCH_H |
||||
|
||||
|
||||
#include "pnCsrCli.h" |
||||
|
||||
#include <malloc.h> |
@ -1,269 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnCsrCli/pnCsrCli.cpp |
||||
*
|
||||
***/ |
||||
|
||||
#include "Pch.h" |
||||
#pragma hdrstop |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Local types |
||||
* |
||||
***/ |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Local data |
||||
* |
||||
***/ |
||||
|
||||
static bool s_running; |
||||
static CCritSect s_critsect; |
||||
static SimpleNetConn * s_conn; |
||||
static FCsrCliOnError s_onError; |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Local functions |
||||
* |
||||
***/ |
||||
|
||||
//============================================================================
|
||||
static SimpleNetConn * GetConnIncRef () { |
||||
|
||||
SimpleNetConn * conn; |
||||
s_critsect.Enter(); |
||||
{ |
||||
if (nil != (conn = s_conn)) |
||||
SimpleNetConnIncRef(conn); |
||||
} |
||||
s_critsect.Leave(); |
||||
return conn; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static bool SimpleNetOnMsg ( |
||||
SimpleNetConn * , |
||||
SimpleNet_MsgHeader *
|
||||
) { |
||||
LogMsg(kLogPerf, L"pnCsrCli: Rcvd unexpected message from peer"); |
||||
return false; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void SimpleNetOnError ( |
||||
SimpleNetConn * , |
||||
ENetError error |
||||
) { |
||||
if (!s_running) |
||||
return; |
||||
|
||||
LogMsg(kLogPerf, L"pnCsrCli: NetError: %s", NetErrorToString(error)); |
||||
|
||||
if (error == kNetErrDisconnected) |
||||
CsrCliDisconnect(); |
||||
|
||||
s_onError(error); |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void SimpleNetOnConnect ( |
||||
void * param, |
||||
SimpleNetConn * conn, |
||||
ENetError result |
||||
) { |
||||
FCsrCliOnConnect onConnect = (FCsrCliOnConnect)param; |
||||
|
||||
LogMsg(kLogPerf, L"pnCsrCli: OnConnect: %s", NetErrorToString(result)); |
||||
|
||||
if (s_conn) |
||||
CsrCliDisconnect(); |
||||
|
||||
if (IS_NET_SUCCESS(result)) { |
||||
s_critsect.Enter(); |
||||
{ |
||||
s_conn = conn; |
||||
} |
||||
s_critsect.Leave(); |
||||
} |
||||
|
||||
if (onConnect) |
||||
onConnect(result); |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void Send_ExecConsoleCmd (const char cmd[]) { |
||||
|
||||
SimpleNetConn * conn = GetConnIncRef(); |
||||
if (!conn) |
||||
return; |
||||
|
||||
unsigned cmdBytes = StrBytes(cmd); |
||||
|
||||
CsrNet_ExecConsoleCmd * msg; |
||||
|
||||
unsigned msgBytes |
||||
= sizeof(*msg) |
||||
- sizeof(msg->cmd) |
||||
+ cmdBytes |
||||
+ sizeof(cmd[0]) |
||||
; |
||||
|
||||
msg = new(_alloca(msgBytes)) CsrNet_ExecConsoleCmd(); |
||||
msg->messageBytes = msgBytes; |
||||
|
||||
StrCopy(msg->cmd, cmd, cmdBytes / sizeof(cmd[0])); |
||||
msg->cmd[cmdBytes] = 0; |
||||
|
||||
SimpleNetSend(conn, msg); |
||||
SimpleNetConnDecRef(conn);
|
||||
} |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Exports |
||||
* |
||||
***/ |
||||
|
||||
//============================================================================
|
||||
void CsrCliInitialize (FCsrCliOnError onError) { |
||||
|
||||
ASSERT(!s_running); |
||||
ASSERT(onError); |
||||
|
||||
s_running = true; |
||||
s_onError = onError; |
||||
|
||||
SimpleNetInitialize(); |
||||
SimpleNetCreateChannel(kSimpleNetChannelCsr, SimpleNetOnMsg, SimpleNetOnError); |
||||
}; |
||||
|
||||
//============================================================================
|
||||
void CsrCliShutdown () { |
||||
|
||||
s_running = false; |
||||
s_onError = nil; |
||||
|
||||
CsrCliDisconnect();
|
||||
SimpleNetDestroyChannel(kSimpleNetChannelCsr); |
||||
SimpleNetShutdown(); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void CsrCliStartConnecting ( |
||||
const wchar_t addr[], |
||||
FCsrCliOnConnect onConnect |
||||
) { |
||||
ASSERT(s_running); |
||||
|
||||
CsrCliDisconnect();
|
||||
SimpleNetStartConnecting(kSimpleNetChannelCsr, addr, SimpleNetOnConnect, onConnect); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void CsrCliDisconnect () { |
||||
|
||||
SimpleNetConn * conn = nil; |
||||
s_critsect.Enter(); |
||||
{ |
||||
SWAP(conn, s_conn); |
||||
} |
||||
s_critsect.Leave(); |
||||
if (conn) |
||||
SimpleNetDisconnect(conn); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void CsrCliToggleAvatarPhysical () { |
||||
|
||||
ASSERT(s_running); |
||||
|
||||
Send_ExecConsoleCmd("Avatar.Physics.TogglePhysical"); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void CsrCliWarpPlayerHere (unsigned playerId) { |
||||
|
||||
ASSERT(s_running); |
||||
|
||||
char cmd[1024]; |
||||
StrPrintf(cmd, arrsize(cmd), "CCR.WarpPlayerHere %u", playerId); |
||||
Send_ExecConsoleCmd(cmd); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void CsrCliWarpToPlayer (unsigned playerId) { |
||||
|
||||
ASSERT(s_running); |
||||
|
||||
char cmd[1024]; |
||||
StrPrintf(cmd, arrsize(cmd), "CCR.WarpToPlayer %u", playerId); |
||||
Send_ExecConsoleCmd(cmd); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void CsrCliLinkPlayerHere (unsigned playerId) { |
||||
|
||||
ASSERT(s_running); |
||||
|
||||
char cmd[1024]; |
||||
StrPrintf(cmd, arrsize(cmd), "CCR.LinkPlayerHere %u", playerId); |
||||
Send_ExecConsoleCmd(cmd); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void CsrCliLinkToPlayer (unsigned playerId) { |
||||
|
||||
ASSERT(s_running); |
||||
|
||||
char cmd[1024]; |
||||
StrPrintf(cmd, arrsize(cmd), "CCR.LinkToPlayer %u", playerId); |
||||
Send_ExecConsoleCmd(cmd); |
||||
} |
@ -1,83 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnCsrCli/pnCsrCli.h |
||||
*
|
||||
***/ |
||||
|
||||
#ifndef PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNCSRCLI_PNCSRCLI_H |
||||
#define PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNCSRCLI_PNCSRCLI_H |
||||
|
||||
|
||||
#include "pnCsrNet/pnCsrNet.h" |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* pnCsrCli |
||||
* - Connects to pfCsrSrv in remote CSR client. |
||||
* - Sends commands to pfCsrSrv for remote execution. |
||||
* |
||||
***/ |
||||
|
||||
typedef void (*FCsrCliOnError) (ENetError error); |
||||
|
||||
void CsrCliInitialize (FCsrCliOnError onError); |
||||
void CsrCliShutdown (); |
||||
|
||||
typedef void (*FCsrCliOnConnect) (ENetError result); |
||||
|
||||
void CsrCliStartConnecting ( |
||||
const wchar_t addr[], |
||||
FCsrCliOnConnect onConnect |
||||
); |
||||
void CsrCliDisconnect (); |
||||
|
||||
void CsrCliToggleAvatarPhysical (); |
||||
void CsrCliWarpPlayerHere (unsigned playerId); |
||||
void CsrCliWarpToPlayer (unsigned playerId); |
||||
void CsrCliLinkPlayerHere (unsigned playerId); |
||||
void CsrCliLinkToPlayer (unsigned playerId); |
||||
|
||||
|
||||
#endif // PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNCSRCLI_PNCSRCLI_H
|
@ -1,16 +0,0 @@
|
||||
include_directories(../../CoreLib) |
||||
include_directories(../../NucleusLib) |
||||
|
||||
set(pnCsrNet_SOURCES |
||||
pnCsrNet.cpp |
||||
) |
||||
|
||||
set(pnCsrNet_HEADERS |
||||
Pch.h |
||||
pnCsrNet.h |
||||
) |
||||
|
||||
add_library(pnCsrNet STATIC ${pnCsrNet_SOURCES} ${pnCsrNet_HEADERS}) |
||||
|
||||
source_group("Source Files" FILES ${pnCsrNet_SOURCES}) |
||||
source_group("Header Files" FILES ${pnCsrNet_HEADERS}) |
@ -1,54 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnCsrNet/Pch.h |
||||
*
|
||||
***/ |
||||
|
||||
#ifdef PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNCSRNET_PCH_H |
||||
#error "Header $/Plasma20/Sources/Plasma/NucleusLib/pnCsrNet/Pch.h included more than once" |
||||
#endif |
||||
#define PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNCSRNET_PCH_H |
||||
|
||||
|
||||
#include "pnCsrNet.h" |
@ -1,49 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnCsrNet/pnCsrNet.cpp |
||||
*
|
||||
***/ |
||||
|
||||
#include "Pch.h" |
||||
#pragma hdrstop |
@ -1,88 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnCsrNet/pnCsrNet.h |
||||
*
|
||||
***/ |
||||
|
||||
#ifndef PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNCSRNET_PNCSRNET_H |
||||
#define PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNCSRNET_PNCSRNET_H |
||||
|
||||
|
||||
#include "pnSimpleNet/pnSimpleNet.h" |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* CSR Client Automation - Types and Constants |
||||
* |
||||
***/ |
||||
|
||||
// Newer CSR game clients must remain compatible with older CSR tools,
|
||||
// therefore these values may not change. Only append to this enum.
|
||||
enum { |
||||
kCsrNet_ExecConsoleCmd, |
||||
}; |
||||
|
||||
//============================================================================
|
||||
// BEGIN PACKED DATA STRUCTURES
|
||||
//============================================================================
|
||||
#pragma pack(push,1) |
||||
|
||||
#define CSRNET_MSG(a) \ |
||||
CsrNet_##a () : SimpleNet_MsgHeader(kSimpleNetChannelCsr, kCsrNet_##a) { } |
||||
|
||||
struct CsrNet_ExecConsoleCmd : SimpleNet_MsgHeader { |
||||
CSRNET_MSG (ExecConsoleCmd); |
||||
|
||||
char cmd[1]; // null-terminated string
|
||||
}; |
||||
|
||||
#undef CSRNET_MSG |
||||
//============================================================================
|
||||
// END PACKED DATA STRUCTURES
|
||||
//============================================================================
|
||||
#pragma pack(pop) |
||||
|
||||
|
||||
#endif // PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNCSRNET_PNCSRNET_H
|
@ -1,122 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnNetProtocol/Private/Protocols/Cli2Csr/pnNpCli2Csr.cpp |
||||
*
|
||||
***/ |
||||
|
||||
#define USES_PROTOCOL_CLI2CSR |
||||
#include "../../../Pch.h" |
||||
#pragma hdrstop |
||||
|
||||
|
||||
namespace Cli2Csr { |
||||
/*****************************************************************************
|
||||
* |
||||
* Cli2Csr message field definitions |
||||
* |
||||
***/ |
||||
|
||||
static const NetMsgField kPingRequestFields[] = { |
||||
kNetMsgFieldTransId, // transId
|
||||
kNetMsgFieldTimeMs, // pingTimeMs
|
||||
NET_MSG_FIELD_VAR_COUNT(1, 64 * 1024), // payloadBytes
|
||||
NET_MSG_FIELD_VAR_PTR(), // payload
|
||||
}; |
||||
|
||||
static const NetMsgField kRegisterRequestFields[] = { |
||||
kNetMsgFieldTransId, // transId
|
||||
}; |
||||
|
||||
static const NetMsgField kLoginRequestFields[] = { |
||||
kNetMsgFieldTransId, // transId
|
||||
NET_MSG_FIELD_DWORD(), // clientChallenge
|
||||
kNetMsgFieldAccountName, // csrName
|
||||
kNetMsgFieldShaDigest, // challenge
|
||||
}; |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Csr2Cli message field definitions |
||||
* |
||||
***/ |
||||
|
||||
static const NetMsgField kPingReplyFields[] = { |
||||
kNetMsgFieldTransId, // transId
|
||||
kNetMsgFieldTimeMs, // pingTimeMs
|
||||
NET_MSG_FIELD_VAR_COUNT(1, 64 * 1024), // payloadBytes
|
||||
NET_MSG_FIELD_VAR_PTR(), // payload
|
||||
}; |
||||
|
||||
static const NetMsgField kRegisterReplyFields[] = { |
||||
kNetMsgFieldTransId, // transId
|
||||
NET_MSG_FIELD_DWORD(), // serverChallenge
|
||||
NET_MSG_FIELD_DWORD(), // latestBuildId
|
||||
}; |
||||
|
||||
static const NetMsgField kLoginReplyFields[] = { |
||||
kNetMsgFieldTransId, // transId
|
||||
kNetMsgFieldENetError, // result
|
||||
kNetMsgFieldUuid, // csrId
|
||||
NET_MSG_FIELD_DWORD(), // csrFlags
|
||||
}; |
||||
|
||||
|
||||
} using namespace Cli2Csr; |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Exports |
||||
* |
||||
***/ |
||||
|
||||
const NetMsg kNetMsg_Cli2Csr_PingRequest = NET_MSG(kCli2Csr_PingRequest, kPingRequestFields); |
||||
const NetMsg kNetMsg_Cli2Csr_RegisterRequest = NET_MSG(kCli2Csr_RegisterRequest, kRegisterRequestFields); |
||||
const NetMsg kNetMsg_Cli2Csr_LoginRequest = NET_MSG(kCli2Csr_LoginRequest, kLoginRequestFields); |
||||
|
||||
const NetMsg kNetMsg_Csr2Cli_PingReply = NET_MSG(kCsr2Cli_PingReply, kPingReplyFields); |
||||
const NetMsg kNetMsg_Csr2Cli_RegisterReply = NET_MSG(kCsr2Cli_RegisterReply, kRegisterReplyFields); |
||||
const NetMsg kNetMsg_Csr2Cli_LoginReply = NET_MSG(kCsr2Cli_LoginReply, kLoginReplyFields); |
||||
|
@ -1,178 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnNetProtocol/Private/Protocols/Cli2Csr/pnNpCli2Csr.h |
||||
*
|
||||
***/ |
||||
|
||||
#ifdef PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNNETPROTOCOL_PRIVATE_PROTOCOLS_CLI2CSR_PNNPCLI2CSR_H |
||||
#error "Header $/Plasma20/Sources/Plasma/NucleusLib/pnNetProtocol/Private/Protocols/Cli2Csr/pnNpCli2Csr.h included more than once" |
||||
#endif |
||||
#define PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNNETPROTOCOL_PRIVATE_PROTOCOLS_CLI2CSR_PNNPCLI2CSR_H |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* kNetProtocolCli2Csr message ids |
||||
* |
||||
***/ |
||||
|
||||
// Because SrvCsr must remain backward compatible with all client builds,
|
||||
// the following enum values may never change under any circumstances.
|
||||
|
||||
//============================================================================
|
||||
// Cli2Csr
|
||||
|
||||
enum { |
||||
// Misc
|
||||
kCli2Csr_PingRequest = 0, |
||||
// Encrypt
|
||||
kCli2Csr_RegisterRequest = 1, |
||||
// Login
|
||||
kCli2Csr_LoginRequest = 2, |
||||
// Patch
|
||||
kCli2Csr_PatchRequest = 3, |
||||
|
||||
kNumCli2CsrMessages |
||||
}; |
||||
COMPILER_ASSERT_HEADER(Cli2Scr, kNumCli2CsrMessages <= (uint16_t)-1); |
||||
|
||||
|
||||
//============================================================================
|
||||
// Csr2Cli
|
||||
|
||||
enum { |
||||
// Misc
|
||||
kCsr2Cli_PingReply = 0, |
||||
// Encrypt
|
||||
kCsr2Cli_RegisterReply = 1, |
||||
// Login
|
||||
kCsr2Cli_LoginReply = 2, |
||||
// Patch
|
||||
kCli2Csr_PatchReply = 3, |
||||
|
||||
kNumCsr2CliMessages |
||||
}; |
||||
COMPILER_ASSERT_HEADER(Cli2Scr, kNumCsr2CliMessages <= (uint16_t)-1); |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Networked structures |
||||
* |
||||
***/ |
||||
#pragma pack(push,1) |
||||
|
||||
//============================================================================
|
||||
// Connect packet
|
||||
|
||||
struct Cli2Csr_ConnData { |
||||
uint32_t dataBytes; |
||||
}; |
||||
struct Cli2Csr_Connect { |
||||
AsyncSocketConnectPacket hdr; |
||||
Cli2Csr_ConnData data; |
||||
}; |
||||
|
||||
//============================================================================
|
||||
// Message header
|
||||
|
||||
struct Cli2Csr_MsgHeader { |
||||
uint32_t messageId; |
||||
uint32_t transId; |
||||
}; |
||||
|
||||
//============================================================================
|
||||
// Cli --> Csr message structures
|
||||
|
||||
// PingRequest
|
||||
extern const NetMsg kNetMsg_Cli2Csr_PingRequest; |
||||
struct Cli2Csr_PingRequest : Cli2Csr_MsgHeader { |
||||
uint32_t pingTimeMs; |
||||
uint32_t payloadBytes; |
||||
uint8_t payload[1]; // [payloadBytes]
|
||||
}; |
||||
|
||||
// RegisterRequest
|
||||
extern const NetMsg kNetMsg_Cli2Csr_RegisterRequest; |
||||
struct Cli2Csr_RegisterRequest : Cli2Csr_MsgHeader { |
||||
}; |
||||
|
||||
// LoginRequest
|
||||
extern const NetMsg kNetMsg_Cli2Csr_LoginRequest; |
||||
struct Cli2Csr_LoginRequest : Cli2Csr_MsgHeader { |
||||
uint32_t clientChallenge; |
||||
wchar_t csrName[kMaxAccountNameLength]; |
||||
ShaDigest challengeHash; |
||||
}; |
||||
|
||||
|
||||
//============================================================================
|
||||
// Csr --> Cli message structures
|
||||
|
||||
// PingReply
|
||||
extern const NetMsg kNetMsg_Csr2Cli_PingReply; |
||||
struct Csr2Cli_PingReply : Cli2Csr_MsgHeader { |
||||
uint32_t pingTimeMs; |
||||
uint32_t payloadBytes; |
||||
uint8_t payload[1]; // [payloadBytes]
|
||||
}; |
||||
|
||||
// RegisterReply
|
||||
extern const NetMsg kNetMsg_Csr2Cli_RegisterReply; |
||||
struct Csr2Cli_RegisterReply : Cli2Csr_MsgHeader { |
||||
uint32_t serverChallenge; |
||||
uint32_t csrBuildId; // buildId of the latest csr client
|
||||
}; |
||||
|
||||
// LoginReply
|
||||
extern const NetMsg kNetMsg_Csr2Cli_LoginReply; |
||||
struct Csr2Cli_LoginReply : Cli2Csr_MsgHeader { |
||||
ENetError result; |
||||
Uuid csrId; |
||||
uint32_t csrFlags; |
||||
}; |
||||
|
||||
|
||||
#pragma pack(pop) |
||||
|
@ -1,15 +0,0 @@
|
||||
include_directories("../../CoreLib") |
||||
include_directories("../../NucleusLib") |
||||
|
||||
set(pnSimpleNet_HEADERS |
||||
pnSimpleNet.h |
||||
) |
||||
|
||||
set(pnSimpleNet_SOURCES |
||||
pnSimpleNet.cpp |
||||
) |
||||
|
||||
add_library(pnSimpleNet STATIC ${pnSimpleNet_HEADERS} ${pnSimpleNet_SOURCES}) |
||||
|
||||
source_group("Header Files" FILES ${pnSimpleNet_HEADERS}) |
||||
source_group("Source Files" FILES ${pnSimpleNet_SOURCES}) |
@ -1,658 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnSimpleNet/pnSimpleNet.cpp |
||||
*
|
||||
***/ |
||||
|
||||
#include "pnSimpleNet.h" |
||||
#include "hsThread.h" |
||||
|
||||
#include <list> |
||||
#include <map> |
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Local types |
||||
* |
||||
***/ |
||||
|
||||
struct SimpleNetConn : AtomicRef { |
||||
AsyncSocket sock; |
||||
AsyncCancelId cancelId; |
||||
uint32_t channelId; |
||||
bool abandoned; |
||||
struct ConnectParam * connectParam; |
||||
|
||||
SimpleNet_MsgHeader * oversizeMsg; |
||||
ARRAY(uint8_t) oversizeBuffer; |
||||
}; |
||||
|
||||
struct SimpleNetChannel : AtomicRef { |
||||
FSimpleNetOnMsg onMsg; |
||||
FSimpleNetOnError onError; |
||||
uint32_t channelId; |
||||
std::list<SimpleNetConn*> conns; |
||||
|
||||
SimpleNetChannel (uint32_t channel) : channelId(channel) { } |
||||
~SimpleNetChannel () { |
||||
ASSERT(!conns.size()); |
||||
} |
||||
}; |
||||
|
||||
struct ConnectParam { |
||||
SimpleNetChannel * channel; |
||||
FSimpleNetOnConnect callback; |
||||
void * param; |
||||
|
||||
~ConnectParam () { |
||||
if (channel) |
||||
channel->DecRef(); |
||||
} |
||||
}; |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Local data |
||||
* |
||||
***/ |
||||
|
||||
static bool s_running; |
||||
static hsMutex s_critsect; |
||||
static FSimpleNetQueryAccept s_queryAccept; |
||||
static void * s_queryAcceptParam; |
||||
static std::map<uint32_t, SimpleNetChannel*> s_channels; |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Local functions |
||||
* |
||||
***/ |
||||
|
||||
//============================================================================
|
||||
static void NotifyConnSocketConnect (SimpleNetConn * conn) { |
||||
|
||||
conn->TransferRef("Connecting", "Connected"); |
||||
|
||||
conn->connectParam->callback( |
||||
conn->connectParam->param, |
||||
conn, |
||||
kNetSuccess |
||||
); |
||||
|
||||
delete conn->connectParam; |
||||
conn->connectParam = nil; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void NotifyConnSocketConnectFailed (SimpleNetConn * conn) { |
||||
|
||||
s_critsect.Lock(); |
||||
{ |
||||
std::map<uint32_t, SimpleNetChannel*>::iterator it; |
||||
if ((it = s_channels.find(conn->channelId)) != s_channels.end()) { |
||||
it->second->conns.remove(conn); |
||||
} |
||||
} |
||||
s_critsect.Unlock(); |
||||
|
||||
conn->connectParam->callback( |
||||
conn->connectParam->param, |
||||
nil, |
||||
kNetErrConnectFailed |
||||
); |
||||
|
||||
delete conn->connectParam; |
||||
conn->connectParam = nil; |
||||
|
||||
conn->DecRef("Connecting"); |
||||
conn->DecRef("Lifetime"); |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void NotifyConnSocketDisconnect (SimpleNetConn * conn) { |
||||
|
||||
bool abandoned; |
||||
SimpleNetChannel* channel = nil; |
||||
s_critsect.Lock(); |
||||
{ |
||||
abandoned = conn->abandoned; |
||||
std::map<uint32_t, SimpleNetChannel*>::iterator it; |
||||
if ((it = s_channels.find(conn->channelId)) != s_channels.end()) { |
||||
channel = it->second; |
||||
channel->IncRef(); |
||||
channel->conns.remove(conn); |
||||
} |
||||
} |
||||
s_critsect.Unlock(); |
||||
|
||||
if (channel && !abandoned) { |
||||
channel->onError(conn, kNetErrDisconnected); |
||||
channel->DecRef(); |
||||
} |
||||
|
||||
conn->DecRef("Connected"); |
||||
} |
||||
|
||||
//============================================================================
|
||||
static bool NotifyConnSocketRead (SimpleNetConn * conn, AsyncNotifySocketRead * read) { |
||||
|
||||
SimpleNetChannel* channel = nil; |
||||
s_critsect.Lock(); |
||||
{ |
||||
std::map<uint32_t, SimpleNetChannel*>::iterator it; |
||||
if ((it = s_channels.find(conn->channelId)) != s_channels.end()) { |
||||
channel = it->second; |
||||
channel->IncRef(); |
||||
} |
||||
} |
||||
s_critsect.Unlock(); |
||||
|
||||
if (!channel) |
||||
return false; |
||||
|
||||
bool result = true; |
||||
|
||||
const uint8_t * curr = read->buffer; |
||||
const uint8_t * term = curr + read->bytes; |
||||
|
||||
while (curr < term) { |
||||
// Reading oversize msg?
|
||||
if (conn->oversizeBuffer.Count()) { |
||||
unsigned spaceLeft = conn->oversizeMsg->messageBytes - conn->oversizeBuffer.Count(); |
||||
unsigned copyBytes = min(spaceLeft, term - curr); |
||||
conn->oversizeBuffer.Add(curr, copyBytes); |
||||
|
||||
curr += copyBytes; |
||||
|
||||
// Wait until we have received the entire message
|
||||
if (copyBytes != spaceLeft) |
||||
break; |
||||
|
||||
// Dispatch oversize msg
|
||||
if (!channel->onMsg(conn, conn->oversizeMsg)) { |
||||
result = false; |
||||
break; |
||||
} |
||||
|
||||
conn->oversizeBuffer.SetCount(0); |
||||
continue; |
||||
} |
||||
|
||||
// Wait until we receive the entire message header
|
||||
if (term - curr < sizeof(SimpleNet_MsgHeader)) |
||||
break; |
||||
|
||||
SimpleNet_MsgHeader * msg = (SimpleNet_MsgHeader *) read->buffer; |
||||
|
||||
// Sanity check message size
|
||||
if (msg->messageBytes < sizeof(*msg)) { |
||||
result = false; |
||||
break; |
||||
} |
||||
|
||||
// Handle oversized messages
|
||||
if (msg->messageBytes > kAsyncSocketBufferSize) { |
||||
|
||||
conn->oversizeBuffer.SetCount(msg->messageBytes); |
||||
conn->oversizeMsg = (SimpleNet_MsgHeader *) conn->oversizeBuffer.Ptr(); |
||||
*conn->oversizeMsg = *msg; |
||||
|
||||
curr += sizeof(*msg); |
||||
continue; |
||||
} |
||||
|
||||
// Wait until we have received the entire message
|
||||
const uint8_t * msgTerm = (const uint8_t *) curr + msg->messageBytes; |
||||
if (msgTerm > term) |
||||
break; |
||||
curr = msgTerm; |
||||
|
||||
// Dispatch msg
|
||||
if (!channel->onMsg(conn, msg)) { |
||||
result = false; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
// Return count of bytes we processed
|
||||
read->bytesProcessed = curr - read->buffer; |
||||
|
||||
channel->DecRef(); |
||||
return result; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static bool AsyncNotifySocketProc ( |
||||
AsyncSocket sock, |
||||
EAsyncNotifySocket code, |
||||
AsyncNotifySocket * notify, |
||||
void ** userState |
||||
) { |
||||
bool result = true; |
||||
SimpleNetConn * conn; |
||||
|
||||
switch (code) { |
||||
case kNotifySocketListenSuccess: { |
||||
|
||||
AsyncNotifySocketListen * listen = (AsyncNotifySocketListen *) notify; |
||||
|
||||
const SimpleNet_ConnData & connect = *(const SimpleNet_ConnData *) listen->buffer; |
||||
listen->bytesProcessed += sizeof(connect); |
||||
|
||||
SimpleNetChannel* channel = nil; |
||||
s_critsect.Lock(); |
||||
{ |
||||
std::map<uint32_t, SimpleNetChannel*>::iterator it; |
||||
if ((it = s_channels.find(connect.channelId)) != s_channels.end()) { |
||||
channel = it->second; |
||||
channel->IncRef(); |
||||
} |
||||
} |
||||
s_critsect.Unlock(); |
||||
|
||||
if (!channel) |
||||
break; |
||||
|
||||
conn = NEWZERO(SimpleNetConn); |
||||
conn->channelId = channel->channelId; |
||||
conn->IncRef("Lifetime"); |
||||
conn->IncRef("Connected"); |
||||
conn->sock = sock; |
||||
*userState = conn; |
||||
|
||||
bool accepted = s_queryAccept( |
||||
s_queryAcceptParam, |
||||
channel->channelId, |
||||
conn, |
||||
listen->remoteAddr |
||||
); |
||||
|
||||
if (!accepted) { |
||||
SimpleNetDisconnect(conn); |
||||
} |
||||
else { |
||||
s_critsect.Lock(); |
||||
{ |
||||
channel->conns.push_back(conn); |
||||
} |
||||
s_critsect.Unlock(); |
||||
} |
||||
|
||||
channel->DecRef(); |
||||
} |
||||
break; |
||||
|
||||
case kNotifySocketConnectSuccess: { |
||||
conn = (SimpleNetConn *) notify->param; |
||||
*userState = conn; |
||||
bool abandoned; |
||||
|
||||
s_critsect.Lock(); |
||||
{ |
||||
conn->sock = sock; |
||||
conn->cancelId = 0; |
||||
abandoned = conn->abandoned; |
||||
} |
||||
s_critsect.Unlock(); |
||||
|
||||
if (abandoned) |
||||
AsyncSocketDisconnect(sock, true); |
||||
else |
||||
NotifyConnSocketConnect(conn); |
||||
} |
||||
break; |
||||
|
||||
case kNotifySocketConnectFailed: |
||||
conn = (SimpleNetConn *) notify->param; |
||||
NotifyConnSocketConnectFailed(conn); |
||||
break; |
||||
|
||||
case kNotifySocketDisconnect: |
||||
conn = (SimpleNetConn *) *userState; |
||||
NotifyConnSocketDisconnect(conn); |
||||
break; |
||||
|
||||
case kNotifySocketRead: |
||||
conn = (SimpleNetConn *) *userState; |
||||
result = NotifyConnSocketRead(conn, (AsyncNotifySocketRead *) notify); |
||||
break; |
||||
|
||||
default: |
||||
break; |
||||
} |
||||
|
||||
return result; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void Connect(const plNetAddress& addr, ConnectParam * cp) { |
||||
|
||||
SimpleNetConn * conn = NEWZERO(SimpleNetConn); |
||||
conn->channelId = cp->channel->channelId; |
||||
conn->connectParam = cp; |
||||
conn->IncRef("Lifetime"); |
||||
conn->IncRef("Connecting"); |
||||
|
||||
s_critsect.Lock(); |
||||
{ |
||||
cp->channel->conns.push_back(conn); |
||||
|
||||
SimpleNet_Connect connect; |
||||
connect.hdr.connType = kConnTypeSimpleNet; |
||||
connect.hdr.hdrBytes = sizeof(connect.hdr); |
||||
connect.hdr.buildId = BuildId(); |
||||
connect.hdr.buildType = BUILD_TYPE_LIVE; |
||||
connect.hdr.branchId = BranchId(); |
||||
connect.hdr.productId = ProductId(); |
||||
connect.data.channelId = cp->channel->channelId; |
||||
|
||||
AsyncSocketConnect( |
||||
&conn->cancelId, |
||||
addr, |
||||
AsyncNotifySocketProc, |
||||
conn, |
||||
&connect, |
||||
sizeof(connect) |
||||
); |
||||
|
||||
conn = nil; |
||||
cp = nil; |
||||
} |
||||
s_critsect.Unlock(); |
||||
|
||||
delete conn; |
||||
delete cp; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void AsyncLookupCallback ( |
||||
void * param, |
||||
const char name[], |
||||
unsigned addrCount, |
||||
const plNetAddress addrs[] |
||||
) { |
||||
ConnectParam * cp = (ConnectParam *)param; |
||||
|
||||
if (!addrCount) { |
||||
if (cp->callback) |
||||
cp->callback(cp->param, nil, kNetErrNameLookupFailed); |
||||
delete cp; |
||||
return; |
||||
} |
||||
|
||||
Connect(addrs[0], (ConnectParam *)param); |
||||
} |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Exported functions |
||||
* |
||||
***/ |
||||
|
||||
//============================================================================
|
||||
void SimpleNetInitialize () { |
||||
|
||||
s_running = true; |
||||
|
||||
AsyncSocketRegisterNotifyProc( |
||||
kConnTypeSimpleNet, |
||||
AsyncNotifySocketProc |
||||
); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void SimpleNetShutdown () { |
||||
|
||||
s_running = false; |
||||
|
||||
ASSERT(!s_channels.size()); |
||||
|
||||
AsyncSocketUnregisterNotifyProc( |
||||
kConnTypeSimpleNet, |
||||
AsyncNotifySocketProc |
||||
); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void SimpleNetConnIncRef (SimpleNetConn * conn) { |
||||
|
||||
ASSERT(s_running); |
||||
ASSERT(conn); |
||||
|
||||
conn->IncRef(); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void SimpleNetConnDecRef (SimpleNetConn * conn) { |
||||
|
||||
ASSERT(s_running); |
||||
ASSERT(conn); |
||||
|
||||
conn->DecRef(); |
||||
} |
||||
|
||||
//============================================================================
|
||||
bool SimpleNetStartListening ( |
||||
FSimpleNetQueryAccept queryAccept, |
||||
void * param |
||||
) { |
||||
ASSERT(s_running); |
||||
ASSERT(queryAccept); |
||||
ASSERT(!s_queryAccept); |
||||
|
||||
s_queryAccept = queryAccept; |
||||
s_queryAcceptParam = param; |
||||
|
||||
plNetAddress addr; |
||||
addr.SetPort(kNetDefaultSimpleNetPort); |
||||
addr.SetAnyAddr(); |
||||
return (0 != AsyncSocketStartListening(addr, nil)); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void SimpleNetStopListening () { |
||||
|
||||
ASSERT(s_running); |
||||
|
||||
plNetAddress addr; |
||||
addr.SetPort(kNetDefaultSimpleNetPort); |
||||
addr.SetAnyAddr(); |
||||
AsyncSocketStopListening(addr, nil); |
||||
|
||||
s_queryAccept = nil; |
||||
s_queryAcceptParam = nil; |
||||
} |
||||
|
||||
//============================================================================
|
||||
void SimpleNetCreateChannel ( |
||||
unsigned channelId, |
||||
FSimpleNetOnMsg onMsg, |
||||
FSimpleNetOnError onError |
||||
) { |
||||
ASSERT(s_running); |
||||
|
||||
SimpleNetChannel * channel = NEWZERO(SimpleNetChannel)(channelId); |
||||
channel->IncRef(); |
||||
|
||||
s_critsect.Lock(); |
||||
{ |
||||
#ifdef HS_DEBUGGING |
||||
{ |
||||
std::map<uint32_t, SimpleNetChannel*>::iterator it = s_channels.find(channelId); |
||||
ASSERT(it == s_channels.end()); |
||||
} |
||||
#endif |
||||
|
||||
channel->onMsg = onMsg; |
||||
channel->onError = onError; |
||||
s_channels[channelId] = channel; |
||||
channel->IncRef(); |
||||
} |
||||
s_critsect.Unlock(); |
||||
|
||||
channel->DecRef(); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void SimpleNetDestroyChannel (unsigned channelId) { |
||||
|
||||
ASSERT(s_running); |
||||
|
||||
SimpleNetChannel * channel; |
||||
s_critsect.Lock(); |
||||
{ |
||||
std::map<uint32_t, SimpleNetChannel*>::iterator it; |
||||
if ((it = s_channels.find(channelId)) != s_channels.end()) { |
||||
channel = it->second; |
||||
|
||||
while (channel->conns.size()) { |
||||
SimpleNetConn* conn = channel->conns.front(); |
||||
SimpleNetDisconnect(conn); |
||||
|
||||
channel->conns.pop_front(); |
||||
} |
||||
|
||||
s_channels.erase(it); |
||||
} |
||||
} |
||||
s_critsect.Unlock(); |
||||
|
||||
if (channel) |
||||
channel->DecRef(); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void SimpleNetStartConnecting ( |
||||
unsigned channelId, |
||||
const char addr[], |
||||
FSimpleNetOnConnect onConnect, |
||||
void * param |
||||
) { |
||||
ASSERT(s_running); |
||||
ASSERT(onConnect); |
||||
|
||||
ConnectParam * cp = new ConnectParam; |
||||
cp->callback = onConnect; |
||||
cp->param = param; |
||||
cp->channel = nil; |
||||
|
||||
s_critsect.Lock(); |
||||
{ |
||||
std::map<uint32_t, SimpleNetChannel*>::iterator it; |
||||
if ((it = s_channels.find(channelId)) != s_channels.end()) { |
||||
cp->channel = it->second; |
||||
cp->channel->IncRef(); |
||||
} |
||||
} |
||||
s_critsect.Unlock(); |
||||
|
||||
ASSERT(cp->channel); |
||||
|
||||
// Do we need to lookup the address?
|
||||
const char* name = addr; |
||||
while (unsigned ch = *name) { |
||||
++name; |
||||
if (!(isdigit(ch) || ch == L'.' || ch == L':')) { |
||||
|
||||
AsyncCancelId cancelId; |
||||
AsyncAddressLookupName( |
||||
&cancelId, |
||||
AsyncLookupCallback, |
||||
addr, |
||||
kNetDefaultSimpleNetPort, |
||||
cp |
||||
); |
||||
break; |
||||
} |
||||
} |
||||
if (!name[0]) { |
||||
plNetAddress netAddr(addr, kNetDefaultSimpleNetPort); |
||||
Connect(netAddr, cp); |
||||
} |
||||
} |
||||
|
||||
//============================================================================
|
||||
void SimpleNetDisconnect ( |
||||
SimpleNetConn * conn |
||||
) { |
||||
ASSERT(s_running); |
||||
ASSERT(conn); |
||||
|
||||
s_critsect.Lock(); |
||||
{ |
||||
conn->abandoned = true; |
||||
if (conn->sock) { |
||||
AsyncSocketDisconnect(conn->sock, true); |
||||
conn->sock = nil; |
||||
} |
||||
else if (conn->cancelId) { |
||||
AsyncSocketConnectCancel(AsyncNotifySocketProc, conn->cancelId); |
||||
conn->cancelId = nil; |
||||
} |
||||
} |
||||
s_critsect.Unlock(); |
||||
|
||||
conn->DecRef("Lifetime"); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void SimpleNetSend ( |
||||
SimpleNetConn * conn, |
||||
SimpleNet_MsgHeader * msg |
||||
) { |
||||
ASSERT(s_running); |
||||
ASSERT(msg); |
||||
ASSERT(msg->messageBytes != (uint32_t)-1); |
||||
ASSERT(conn); |
||||
|
||||
s_critsect.Lock(); |
||||
{ |
||||
if (conn->sock) |
||||
AsyncSocketSend(conn->sock, msg, msg->messageBytes); |
||||
} |
||||
s_critsect.Unlock(); |
||||
} |
@ -1,185 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnSimpleNet/pnSimpleNet.h |
||||
*
|
||||
***/ |
||||
|
||||
#ifndef PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNSIMPLENET_PNSIMPLENET_H |
||||
#define PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNSIMPLENET_PNSIMPLENET_H |
||||
|
||||
|
||||
#include "pnUtils/pnUtils.h" |
||||
#include "pnProduct/pnProduct.h" |
||||
#include "pnNetBase/pnNetBase.h" |
||||
#include "pnAsyncCore/pnAsyncCore.h" |
||||
#include "pnNetCommon/plNetAddress.h" |
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* SimpleNet: |
||||
* - TCP only, Nagle buffered only. |
||||
* - Asynchronous callbacks only. |
||||
* - Not encrypted, not compressed, no transaction support. |
||||
* - Good for trivial networked applications only. Examples include: |
||||
* - CSR client automation by CSR tools. |
||||
* - Bob and I (eap) talked about 3dsmax automating |
||||
* the client for the purpose of reloading reexported |
||||
* assets. With SimpleNet, the client could be running |
||||
* on a separate machine than Max. |
||||
* |
||||
***/ |
||||
|
||||
// Because newer clients must remain compatible with older servers,
|
||||
// these values may never change.
|
||||
enum ESimpleNetChannel { |
||||
kSimpleNetChannelNil = 0, |
||||
kSimpleNetChannelCsr = 1, |
||||
kSimpleNetChannelMax = 2, |
||||
|
||||
kMaxSimpleNetChannels |
||||
}; |
||||
COMPILER_ASSERT_HEADER(ESimpleNetChannel, kMaxSimpleNetChannels <= 0xff); |
||||
|
||||
|
||||
//============================================================================
|
||||
// BEGIN PACKED DATA STRUCTURES
|
||||
//============================================================================
|
||||
#pragma pack(push,1) |
||||
|
||||
//============================================================================
|
||||
// Connect packet
|
||||
|
||||
struct SimpleNet_ConnData { |
||||
unsigned channelId; |
||||
}; |
||||
struct SimpleNet_Connect { |
||||
AsyncSocketConnectPacket hdr; |
||||
SimpleNet_ConnData data; |
||||
}; |
||||
|
||||
//============================================================================
|
||||
// Message header
|
||||
|
||||
struct SimpleNet_MsgHeader { |
||||
private: |
||||
uint32_t channelId; |
||||
public: |
||||
uint32_t messageId; |
||||
uint32_t messageBytes; |
||||
|
||||
SimpleNet_MsgHeader (uint32_t channelId, uint32_t messageId) |
||||
: channelId(channelId) |
||||
, messageId(messageId) |
||||
#ifdef HS_DEBUGGING |
||||
, messageBytes((uint32_t)-1) |
||||
#endif |
||||
{ } |
||||
}; |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Simple Network API |
||||
* |
||||
***/ |
||||
|
||||
struct SimpleNetConn; |
||||
|
||||
void SimpleNetInitialize (); |
||||
void SimpleNetShutdown (); |
||||
|
||||
void SimpleNetConnIncRef (SimpleNetConn * conn); |
||||
void SimpleNetConnDecRef (SimpleNetConn * conn); |
||||
|
||||
typedef bool (*FSimpleNetOnMsg) ( // return false to disconnect socket
|
||||
SimpleNetConn * conn, |
||||
SimpleNet_MsgHeader * msg |
||||
); |
||||
typedef void (*FSimpleNetOnError) ( |
||||
SimpleNetConn * conn, |
||||
ENetError error |
||||
); |
||||
typedef void (*FSimpleNetOnConnect) ( |
||||
void * param, |
||||
SimpleNetConn * conn, |
||||
ENetError result |
||||
); |
||||
typedef bool (*FSimpleNetQueryAccept) ( // return true to accept incoming connection
|
||||
void * param, |
||||
unsigned channel, |
||||
SimpleNetConn * conn, |
||||
const plNetAddress& addr |
||||
); |
||||
|
||||
void SimpleNetCreateChannel ( |
||||
unsigned channel, |
||||
FSimpleNetOnMsg onMsg, |
||||
FSimpleNetOnError onError |
||||
); |
||||
void SimpleNetDestroyChannel ( |
||||
unsigned channel |
||||
); |
||||
|
||||
bool SimpleNetStartListening ( |
||||
FSimpleNetQueryAccept queryAccept, |
||||
void * param |
||||
); |
||||
void SimpleNetStopListening (); |
||||
|
||||
void SimpleNetStartConnecting ( |
||||
unsigned channel, |
||||
const wchar_t addr[], |
||||
FSimpleNetOnConnect onConnect, |
||||
void * param |
||||
); |
||||
void SimpleNetDisconnect ( |
||||
SimpleNetConn * conn |
||||
); |
||||
void SimpleNetSend ( |
||||
SimpleNetConn * conn, |
||||
SimpleNet_MsgHeader * msg |
||||
); |
||||
#pragma pack(pop) |
||||
|
||||
#endif // PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNSIMPLENET_PNSIMPLENET_H
|
@ -1,587 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#include "plDeviceSelector.h" |
||||
#include "hsStream.h" |
||||
#include "hsUtils.h" |
||||
|
||||
#include <algorithm> |
||||
|
||||
DeviceSelector::DeviceSelector() : |
||||
fSelDevType(hsG3DDeviceSelector::kDevTypeUnknown), |
||||
fSelDev(0), |
||||
fSelMode(0), |
||||
fDevDesc(0), |
||||
fModeDesc(0), |
||||
fPerformance(0), |
||||
fFilterBPP(0), |
||||
fFilterWidth(0), |
||||
fFilterHeight(0), |
||||
fWindowed(false) |
||||
{ |
||||
memset(fStr, 0x00, sizeof(fStr)); |
||||
} |
||||
|
||||
const char *DeviceSelector::GetErrorString( void ) |
||||
{ |
||||
return fSelector.GetErrorString(); |
||||
} |
||||
|
||||
hsBool DeviceSelector::Enumerate(HWND hWnd, hsBool expertMode ) |
||||
{ |
||||
plDemoDebugFile::Enable( true ); /// ALWAYS enable (well, for now at least)
|
||||
|
||||
if( !fSelector.Init() ) |
||||
return false; |
||||
|
||||
fSelector.Enumerate(hWnd); |
||||
|
||||
// 11.25.2000 mcn - Now we are tough if we're not in expert mode
|
||||
fSelector.RemoveUnusableDevModes( !expertMode ); |
||||
|
||||
// Sort the modes
|
||||
hsTArray<hsG3DDeviceRecord> &recs = fSelector.GetDeviceRecords(); |
||||
for (int32_t i = 0; i < recs.Count(); i++) |
||||
{ |
||||
hsTArray<hsG3DDeviceMode> &modes = recs[i].GetModes(); |
||||
std::sort(modes.FirstIter(), modes.StopIter()); |
||||
} |
||||
|
||||
IRefreshFilter(); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
void DeviceSelector::SetModeFilter( int bitDepth, int minWidth, int minHeight ) |
||||
{ |
||||
fFilterBPP = bitDepth; |
||||
fFilterWidth = minWidth; |
||||
fFilterHeight = minHeight; |
||||
|
||||
IRefreshFilter(); |
||||
} |
||||
|
||||
void DeviceSelector::IRefreshFilter( void ) |
||||
{ |
||||
if (fSelDev >= fRecords.Count() ) |
||||
return; |
||||
|
||||
// Make sure to preserve fSelMode if possible
|
||||
const hsG3DDeviceMode *oldMode = nil; |
||||
if( fSelMode < fFilteredModes.GetCount() && fFilteredModes[ fSelMode ]<fSelRec.GetModes().GetCount() ) |
||||
oldMode = fSelRec.GetMode( fFilteredModes[ fSelMode ] ); |
||||
|
||||
fFilteredModes.Reset(); |
||||
|
||||
int i; |
||||
for( i = 0; i < fRecords[ fSelDev ].GetModes().Count(); i++ ) |
||||
{ |
||||
hsG3DDeviceMode* mode = fRecords[ fSelDev ].GetMode( i ); |
||||
|
||||
// Filter out modes we don't want listed
|
||||
if( fFilterBPP != 0 && fFilterBPP != mode->GetColorDepth() ) |
||||
continue; |
||||
|
||||
if( mode->GetWidth() < fFilterWidth || mode->GetHeight() < fFilterHeight ) |
||||
continue; |
||||
|
||||
// Remove any non 4:3 modes
|
||||
bool goodAspectRatio = (mode->GetWidth() / 4 == mode->GetHeight() / 3) && |
||||
(mode->GetWidth() % 4 == 0) && |
||||
(mode->GetHeight() % 3 == 0); |
||||
|
||||
if (!goodAspectRatio && !(mode->GetWidth() == 1280 && mode->GetHeight() == 1024)) |
||||
{ |
||||
continue; |
||||
} |
||||
|
||||
// Add the remaining to our filter index
|
||||
fFilteredModes.Append( i ); |
||||
} |
||||
|
||||
if( oldMode != nil ) |
||||
{ |
||||
fSelMode = IFindFiltered( GetModeNum( oldMode ) ); |
||||
if( fSelMode == -1 ) |
||||
{ |
||||
// Try w/o bpp
|
||||
fSelMode = IFindFiltered( IGetModeNumNoBPP( oldMode ) ); |
||||
if( fSelMode == -1 ) |
||||
fSelMode = 0; |
||||
} |
||||
} |
||||
else |
||||
fSelMode = 0; |
||||
|
||||
} |
||||
|
||||
int DeviceSelector::IFindFiltered( int realIndex ) |
||||
{ |
||||
int idx = fFilteredModes.Find( realIndex ); |
||||
if( idx == fFilteredModes.kMissingIndex ) |
||||
return -1; |
||||
|
||||
return idx; |
||||
} |
||||
|
||||
hsBool DeviceSelector::CheckDeviceType(uint32_t type) |
||||
{ |
||||
hsTArray<hsG3DDeviceRecord>& records = fSelector.GetDeviceRecords(); |
||||
|
||||
for (int32_t i = 0; i < records.Count(); i++) |
||||
{ |
||||
if (type == records[i].GetG3DDeviceType()) |
||||
return true; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
hsBool DeviceSelector::IsDirect3DAvailable() |
||||
{ |
||||
return CheckDeviceType(hsG3DDeviceSelector::kDevTypeDirect3D); |
||||
} |
||||
|
||||
hsBool DeviceSelector::IsDirect3DTnLAvailable() |
||||
{ |
||||
return CheckDeviceType(hsG3DDeviceSelector::kDevTypeDirect3DTnL); |
||||
} |
||||
|
||||
hsBool DeviceSelector::IsGlideAvailable() |
||||
{ |
||||
return CheckDeviceType(hsG3DDeviceSelector::kDevTypeGlide); |
||||
} |
||||
|
||||
hsBool DeviceSelector::IsOpenGLAvailable() |
||||
{ |
||||
return CheckDeviceType(hsG3DDeviceSelector::kDevTypeOpenGL); |
||||
} |
||||
|
||||
void DeviceSelector::SetDirect3D() |
||||
{ |
||||
SetDeviceType(hsG3DDeviceSelector::kDevTypeDirect3D); |
||||
} |
||||
|
||||
void DeviceSelector::SetDirect3DTnL() |
||||
{ |
||||
SetDeviceType(hsG3DDeviceSelector::kDevTypeDirect3DTnL); |
||||
} |
||||
|
||||
void DeviceSelector::SetGlide() |
||||
{ |
||||
SetDeviceType(hsG3DDeviceSelector::kDevTypeGlide); |
||||
} |
||||
|
||||
void DeviceSelector::SetOpenGL() |
||||
{ |
||||
SetDeviceType(hsG3DDeviceSelector::kDevTypeOpenGL); |
||||
} |
||||
|
||||
void DeviceSelector::SetDeviceType (uint32_t type) |
||||
{ |
||||
int32_t i; |
||||
for(i = 0; i < fRecords.GetCount(); i++) |
||||
fRecords[i].Clear(); |
||||
fRecords.Reset(); |
||||
|
||||
hsTArray<hsG3DDeviceRecord>& records = fSelector.GetDeviceRecords(); |
||||
for (i = 0; i < records.Count(); i++) |
||||
{ |
||||
if (records[i].GetG3DDeviceType() == type) |
||||
fRecords.Push(records[i]); |
||||
} |
||||
|
||||
fSelDevType = type; |
||||
fSelDev = 0; |
||||
fDevDesc = 0; |
||||
fModeDesc = 0; |
||||
|
||||
IRefreshFilter(); |
||||
} |
||||
|
||||
hsBool DeviceSelector::IsDirect3D() |
||||
{ |
||||
if (fSelDevType == hsG3DDeviceSelector::kDevTypeDirect3D) |
||||
return true; |
||||
else |
||||
return false; |
||||
} |
||||
|
||||
hsBool DeviceSelector::IsDirect3DTnL() |
||||
{ |
||||
return ( fSelDevType == hsG3DDeviceSelector::kDevTypeDirect3DTnL ) ? true : false; |
||||
} |
||||
|
||||
hsBool DeviceSelector::IsGlide() |
||||
{ |
||||
if (fSelDevType == hsG3DDeviceSelector::kDevTypeGlide) |
||||
return true; |
||||
else |
||||
return false; |
||||
} |
||||
|
||||
hsBool DeviceSelector::IsOpenGL() |
||||
{ |
||||
if (fSelDevType == hsG3DDeviceSelector::kDevTypeOpenGL) |
||||
return true; |
||||
else |
||||
return false; |
||||
} |
||||
|
||||
hsBool DeviceSelector::SetDevice(uint32_t index) |
||||
{ |
||||
if (index < fRecords.Count()) |
||||
{ |
||||
fSelDev = index; |
||||
fSelMode = 0; |
||||
fSelRec = fRecords[index]; |
||||
fSelRec.SetMaxAnisotropicSamples(0); |
||||
|
||||
IRefreshFilter(); |
||||
return true; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
hsBool DeviceSelector::SetMode(uint32_t index) |
||||
{ |
||||
if (fSelDev >= fRecords.Count()) |
||||
return false; |
||||
|
||||
if (index < fFilteredModes.GetCount()) |
||||
{ |
||||
fSelMode = index; |
||||
return true; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
char* DeviceSelector::GetDeviceDescription() |
||||
{ |
||||
if (fDevDesc == fRecords.Count()) |
||||
{ |
||||
fDevDesc = 0; |
||||
return nil; |
||||
} |
||||
|
||||
sprintf(fStr, "%s [%s]", fRecords[fDevDesc].GetDriverDesc(), fRecords[fDevDesc].GetDeviceDesc()); |
||||
fDevDesc++; |
||||
return fStr; |
||||
} |
||||
|
||||
char* DeviceSelector::GetModeDescription( void ) |
||||
{ |
||||
if (fSelDev >= fRecords.Count() ) |
||||
return nil; |
||||
|
||||
if (fModeDesc == fFilteredModes.GetCount()) |
||||
{ |
||||
fModeDesc = 0; |
||||
return nil; |
||||
} |
||||
|
||||
hsG3DDeviceMode* mode = fRecords[fSelDev].GetMode( fFilteredModes[ fModeDesc ] ); |
||||
fModeDesc++; |
||||
|
||||
if( fFilterBPP != 0 ) |
||||
sprintf( fStr, "%ux%u", mode->GetWidth(), mode->GetHeight() ); |
||||
else |
||||
sprintf(fStr, "%ux%u %u bit", mode->GetWidth(), mode->GetHeight(), mode->GetColorDepth()); |
||||
|
||||
return fStr; |
||||
} |
||||
|
||||
uint32_t DeviceSelector::GetNumModes() |
||||
{ |
||||
return fFilteredModes.GetCount(); |
||||
} |
||||
|
||||
void DeviceSelector::GetMode(uint32_t i, int& width, int& height, int& depth) |
||||
{ |
||||
if (i >= fFilteredModes.GetCount()) |
||||
return; |
||||
|
||||
hsG3DDeviceMode* mode = fRecords[fSelDev].GetMode(fFilteredModes[i]); |
||||
|
||||
width = mode->GetWidth(); |
||||
height = mode->GetHeight(); |
||||
depth = mode->GetColorDepth(); |
||||
} |
||||
|
||||
hsBool DeviceSelector::SetDefault() |
||||
{ |
||||
hsG3DDeviceModeRecord dmr; |
||||
if (fSelector.GetDefault(&dmr)) |
||||
{ |
||||
SetDeviceType(dmr.GetDevice()->GetG3DDeviceType()); |
||||
fSelDev = GetDeviceNum(dmr.GetDevice()); |
||||
fSelMode = IFindFiltered( GetModeNum(dmr.GetMode()) ); |
||||
fSelRec = fRecords[fSelDev]; |
||||
fSelRec.SetMaxAnisotropicSamples( 0 ); // Also off unless explicitly requested
|
||||
|
||||
// Set a default detail level based on the available memory
|
||||
if (hsMemorySpec() == kBlows) |
||||
fPerformance = 25; |
||||
else |
||||
fPerformance = 100; |
||||
|
||||
IRefreshFilter(); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
hsBool DeviceSelector::Save() |
||||
{ |
||||
hsUNIXStream stream; |
||||
if (!stream.Open(DEV_MODE_DAT, "wb")) |
||||
return false; |
||||
|
||||
hsG3DDeviceRecord selRec = fSelRec; |
||||
hsG3DDeviceMode selMode = *(selRec.GetMode( fFilteredModes[ fSelMode ] )); |
||||
selRec.ClearModes(); |
||||
|
||||
selRec.Write(&stream); |
||||
|
||||
if (fWindowed) |
||||
selMode.SetColorDepth(0); |
||||
selMode.Write(&stream); |
||||
|
||||
stream.WriteSwap16(fPerformance); |
||||
|
||||
stream.Close(); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
hsBool DeviceSelector::Load() |
||||
{ |
||||
hsUNIXStream stream; |
||||
if (!stream.Open(DEV_MODE_DAT, "rb")) |
||||
return false; |
||||
|
||||
hsG3DDeviceRecord LoadRec; // Device copy for reading/writing
|
||||
hsG3DDeviceMode LoadMode; // Modes copy for reading/writing
|
||||
|
||||
LoadRec.Read(&stream); |
||||
if (LoadRec.IsInvalid()) |
||||
{ |
||||
stream.Close(); |
||||
return false; |
||||
} |
||||
|
||||
LoadMode.Read(&stream); |
||||
|
||||
fPerformance = stream.ReadSwap16(); |
||||
|
||||
stream.Close(); |
||||
|
||||
// If selected device is available use it, otherwise return false
|
||||
if ((LoadRec.GetG3DDeviceType() == hsG3DDeviceSelector::kDevTypeDirect3D) && IsDirect3DAvailable()) |
||||
SetDirect3D(); |
||||
else if ((LoadRec.GetG3DDeviceType() == hsG3DDeviceSelector::kDevTypeDirect3DTnL) && IsDirect3DTnLAvailable()) |
||||
SetDirect3DTnL(); |
||||
else if ((LoadRec.GetG3DDeviceType() == hsG3DDeviceSelector::kDevTypeGlide) && IsGlideAvailable()) |
||||
SetGlide(); |
||||
else |
||||
return false; |
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Attempt to match the saved device and mode to the ones that are currently
|
||||
// available.
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
int num = GetDeviceNum(&LoadRec); |
||||
if (num == -1) |
||||
return false; |
||||
SetDevice(num); |
||||
|
||||
// Copy the flags
|
||||
fSelRec.SetCap(hsG3DDeviceSelector::kCapsCompressTextures, |
||||
LoadRec.GetCap(hsG3DDeviceSelector::kCapsCompressTextures)); |
||||
fSelRec.SetAASetting( LoadRec.GetAASetting() ); |
||||
fSelRec.SetMaxAnisotropicSamples( LoadRec.GetMaxAnisotropicSamples() ); |
||||
|
||||
if (LoadMode.GetColorDepth() == 0) |
||||
{ |
||||
fWindowed = true; |
||||
LoadMode.SetColorDepth(32); |
||||
} |
||||
num = GetModeNum(&LoadMode); |
||||
if (num == -1) |
||||
return false; |
||||
|
||||
SetMode(IFindFiltered(num)); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
int DeviceSelector::GetDeviceNum(const hsG3DDeviceRecord *pLoadRec) |
||||
{ |
||||
hsTArray<hsG3DDeviceRecord>& records = fRecords; |
||||
|
||||
for (int i = 0; i < records.Count(); i++) |
||||
{ |
||||
if (!strcmp(records[i].GetDriverDesc(), pLoadRec->GetDriverDesc()) && |
||||
!strcmp(records[i].GetDriverName(), pLoadRec->GetDriverName()) && |
||||
!strcmp(records[i].GetDriverVersion(), pLoadRec->GetDriverVersion()) && |
||||
!strcmp(records[i].GetDeviceDesc(), pLoadRec->GetDeviceDesc())) |
||||
return i; |
||||
}
|
||||
|
||||
return -1; |
||||
} |
||||
|
||||
int DeviceSelector::IGetModeNumNoBPP( const hsG3DDeviceMode *pLoadMode ) |
||||
{ |
||||
hsTArray<hsG3DDeviceMode>& modes = fRecords[fSelDev].GetModes(); |
||||
|
||||
for (int i = 0; i < modes.Count(); i++) |
||||
{ |
||||
if ((modes[i].GetWidth() == pLoadMode->GetWidth()) && |
||||
(modes[i].GetHeight() == pLoadMode->GetHeight()) |
||||
) |
||||
{ |
||||
if( fFilteredModes.Find( i ) != fFilteredModes.kMissingIndex ) |
||||
{ |
||||
#ifndef M3DRELEASE |
||||
if (pLoadMode->GetColorDepth() == 0) |
||||
fSelRec.GetMode( i )->SetColorDepth(0); |
||||
#endif |
||||
return i; |
||||
} |
||||
} |
||||
} |
||||
|
||||
return -1; |
||||
} |
||||
|
||||
int DeviceSelector::GetModeNum(const hsG3DDeviceMode *pLoadMode) |
||||
{ |
||||
hsTArray<hsG3DDeviceMode>& modes = fRecords[fSelDev].GetModes(); |
||||
|
||||
for (int i = 0; i < modes.Count(); i++) |
||||
{ |
||||
if ((modes[i].GetWidth() == pLoadMode->GetWidth()) && |
||||
(modes[i].GetHeight() == pLoadMode->GetHeight()) && |
||||
(modes[i].GetColorDepth() == pLoadMode->GetColorDepth())) |
||||
{ |
||||
return i; |
||||
} |
||||
} |
||||
|
||||
return -1; |
||||
} |
||||
|
||||
uint8_t DeviceSelector::CanAntiAlias() |
||||
{ |
||||
hsG3DDeviceMode *mode = fRecords[ fSelDev ].GetMode( fFilteredModes[ fSelMode ] ); |
||||
|
||||
return mode->GetNumFSAATypes(); |
||||
} |
||||
|
||||
uint8_t DeviceSelector::IsAntiAliased() |
||||
{ |
||||
return fSelRec.GetAASetting(); |
||||
} |
||||
|
||||
void DeviceSelector::SetAntiAlias(uint8_t numSamples) |
||||
{ |
||||
fSelRec.SetAASetting( numSamples ); |
||||
} |
||||
|
||||
uint8_t DeviceSelector::CanAnisotropicFilter() |
||||
{ |
||||
uint8_t hi = fRecords[ fSelDev ].GetMaxAnisotropicSamples(); |
||||
if( hi > 1 ) |
||||
return hi; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
uint8_t DeviceSelector::GetAnisotropicLevel() |
||||
{ |
||||
return fSelRec.GetMaxAnisotropicSamples(); |
||||
} |
||||
|
||||
void DeviceSelector::SetAnisotropicLevel( uint8_t level ) |
||||
{ |
||||
fSelRec.SetMaxAnisotropicSamples( level ); |
||||
} |
||||
|
||||
bool DeviceSelector::CanWindow () |
||||
{ |
||||
return !fSelRec.GetCap(hsG3DDeviceSelector::kCapsNoWindow); |
||||
} |
||||
|
||||
bool DeviceSelector::IsWindowed() |
||||
{ |
||||
return fWindowed; |
||||
} |
||||
|
||||
void DeviceSelector::SetWindowed(bool state) |
||||
{ |
||||
fWindowed = state; |
||||
} |
||||
|
||||
hsBool DeviceSelector::CanCompress () |
||||
{ |
||||
return fRecords[fSelDev].GetCap(hsG3DDeviceSelector::kCapsCompressTextures); |
||||
} |
||||
|
||||
hsBool DeviceSelector::IsCompressed() |
||||
{ |
||||
return fSelRec.GetCap(hsG3DDeviceSelector::kCapsCompressTextures); |
||||
} |
||||
|
||||
void DeviceSelector::SetCompressed(hsBool state) |
||||
{ |
||||
fSelRec.SetCap(hsG3DDeviceSelector::kCapsCompressTextures, state); |
||||
} |
||||
|
||||
bool DeviceSelector::GetCap(uint32_t cap) |
||||
{ |
||||
return fSelRec.GetCap(cap) != 0; |
||||
} |
@ -1,160 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
#ifndef DEVICESELECTOR_H |
||||
#define DEVICESELECTOR_H |
||||
|
||||
#include "HeadSpin.h" |
||||
//#include "plRender.h"
|
||||
#include "../../PubUtilLib/plPipeline/hsG3DDeviceSelector.h" |
||||
|
||||
#define DEV_MODE_DAT "dev_mode.dat" |
||||
|
||||
//
|
||||
// A wrapper class to simplify hsG3DDeviceSelector.
|
||||
// Make sure to call Enumerate before doing anything else.
|
||||
//
|
||||
class DeviceSelector |
||||
{ |
||||
protected: |
||||
uint32_t fSelDevType; // Current type of driver. Set by the SetDirect3D/Glide/OpenGL functions
|
||||
uint32_t fSelDev; // Index of selected device. Set by SetDevice() or
|
||||
uint32_t fSelMode; // Index of selected mode for current device
|
||||
|
||||
int fDevDesc; // Used by GetDeviceDescription() to store index of current device
|
||||
int fModeDesc; // Used by GetModeDescription() to store index of current mode
|
||||
|
||||
char fStr[1024]; // Used to return text
|
||||
|
||||
uint16_t fPerformance; // Performance level (0-100)
|
||||
|
||||
int fFilterBPP, fFilterWidth, fFilterHeight; |
||||
|
||||
bool fWindowed; |
||||
|
||||
hsG3DDeviceSelector fSelector; |
||||
hsTArray<hsG3DDeviceRecord> fRecords; // Copy of all records for the current device type
|
||||
hsG3DDeviceRecord fSelRec; // Device copy for reading/writing
|
||||
|
||||
hsTArray<int> fFilteredModes; |
||||
|
||||
void IRefreshFilter( void ); |
||||
int IFindFiltered( int realIndex ); |
||||
int IGetModeNumNoBPP( const hsG3DDeviceMode *pLoadMode ); // Returns index of passed in mode
|
||||
|
||||
public: |
||||
DeviceSelector(); |
||||
|
||||
hsBool Enumerate(HWND hWnd, hsBool expertMode); // Enumerates all devices
|
||||
const char *GetErrorString( void ); |
||||
|
||||
// Determines if any devices of the specified type are available
|
||||
hsBool IsDirect3DAvailable(); |
||||
hsBool IsGlideAvailable(); |
||||
hsBool IsOpenGLAvailable(); |
||||
hsBool IsDirect3DTnLAvailable(); |
||||
|
||||
// Set current device type
|
||||
void SetDirect3D(); |
||||
void SetGlide(); |
||||
void SetOpenGL(); |
||||
void SetDirect3DTnL(); |
||||
|
||||
// Returns true if current device is of the specified type
|
||||
hsBool IsDirect3D(); |
||||
hsBool IsDirect3DTnL(); |
||||
hsBool IsGlide(); |
||||
hsBool IsOpenGL(); |
||||
|
||||
// Gets and sets the current device or mode.
|
||||
uint32_t GetSelectedDevice() { return fSelDev; } |
||||
uint32_t GetSelectedMode() { return fSelMode; } |
||||
hsBool SetDevice(uint32_t index); |
||||
hsBool SetMode(uint32_t index); |
||||
|
||||
// Returns the device or mode descriptions. Call repeatedly until nil is returned.
|
||||
char* GetDeviceDescription(); |
||||
char* GetModeDescription( void ); |
||||
|
||||
uint32_t GetNumModes(); |
||||
void GetMode(uint32_t i, int& width, int& height, int& depth); |
||||
|
||||
void SetModeFilter( int bitDepth = 0, int minWidth = 0, int minHeight = 0 ); |
||||
|
||||
void SetPerformance (uint16_t value) { fPerformance = value; } |
||||
uint16_t GetPerformance () { return fPerformance; } |
||||
|
||||
// Returns max number of samples allowed for AA
|
||||
uint8_t CanAntiAlias (); |
||||
// Returns current # of samples selected for AA, 0 if none
|
||||
uint8_t IsAntiAliased (); |
||||
void SetAntiAlias (uint8_t numSamples); |
||||
|
||||
uint8_t CanAnisotropicFilter(); |
||||
uint8_t GetAnisotropicLevel(); |
||||
void SetAnisotropicLevel( uint8_t level ); |
||||
|
||||
bool CanWindow(); |
||||
bool IsWindowed(); |
||||
void SetWindowed(bool state); |
||||
|
||||
hsBool CanCompress (); |
||||
hsBool IsCompressed (); |
||||
void SetCompressed (hsBool state); |
||||
|
||||
// Caps from hsG3DDeviceSelector
|
||||
bool GetCap(uint32_t cap); |
||||
|
||||
// Save and load
|
||||
hsBool Save(); // Returns false if output file can't be opened
|
||||
hsBool Load(); // Returns false if input file can't be opened
|
||||
hsBool SetDefault(); // Returns false if no suitable renderers are found
|
||||
|
||||
protected: |
||||
hsBool CheckDeviceType(uint32_t type); // Used by the Is*Available() functions
|
||||
void SetDeviceType(uint32_t type); // Used by SetDirect3D/Glide/OpenGL
|
||||
|
||||
// Helpers for LoadDeviceMode()
|
||||
int GetDeviceNum(const hsG3DDeviceRecord *pLoadRec); // Returns index of passed in device
|
||||
int GetModeNum(const hsG3DDeviceMode *pLoadMode); // Returns index of passed in mode
|
||||
}; |
||||
|
||||
#endif //DEVICESELECTOR_H
|
@ -1 +0,0 @@
|
||||
What do you see? An empty folder. |
@ -1,250 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#include "hsTypes.h" |
||||
#include "hsUtils.h" |
||||
#include "hsScalar.h" |
||||
#include "hsMemory.h" |
||||
#include "hsGRenderProcs.h" |
||||
#include "hsStream.h" |
||||
#include "../plResMgr/plKey.h" |
||||
#include "../plResMgr/hsResMgr.h" |
||||
|
||||
hsGRenderProcs::hsGRenderProcs() |
||||
: fNext(nil),
|
||||
fBack(nil),
|
||||
fPipeline(nil),
|
||||
fFlags(kNone), |
||||
fLinkCount(0) |
||||
{ |
||||
} |
||||
|
||||
hsGRenderProcs::~hsGRenderProcs() |
||||
{ |
||||
} |
||||
|
||||
hsGRenderProcs** hsGRenderProcs::IOneBeforeMe(hsGRenderProcs** base) |
||||
{ |
||||
hsAssert(base, "Searching for place in baseless list"); |
||||
|
||||
if( !*base ||((*base)->GetPriority() > GetPriority()) ) |
||||
return base; |
||||
|
||||
hsGRenderProcs* trav = *base; |
||||
|
||||
while( trav->fNext && (trav->fNext->GetPriority() > GetPriority()) ) |
||||
trav = trav->fNext; |
||||
|
||||
hsAssert((trav != this)&&(trav->fNext != this), "Found self in bad place"); |
||||
return &trav->fNext; |
||||
} |
||||
|
||||
void hsGRenderProcs::IInsert(hsGRenderProcs** ptr) |
||||
{ |
||||
hsAssert(*ptr != this, "Re-Inserting self"); |
||||
hsAssert(ptr, "Inserting into nil list"); |
||||
if( *ptr ) |
||||
(*ptr)->fBack = &fNext; |
||||
fNext = *ptr; |
||||
fBack = ptr; |
||||
*ptr = this; |
||||
} |
||||
|
||||
void hsGRenderProcs::IDetach() |
||||
{ |
||||
if( fNext ) |
||||
fNext->fBack = fBack; |
||||
*fBack = fNext; |
||||
|
||||
fNext = nil; |
||||
fBack = nil; |
||||
} |
||||
|
||||
void hsGRenderProcs::Enqueue(hsGRenderProcs** base) |
||||
{ |
||||
// Already linked? Just note another link.
|
||||
if( fLinkCount++ ) |
||||
return; |
||||
|
||||
IInsert(IOneBeforeMe(base)); |
||||
Ref(); |
||||
} |
||||
|
||||
void hsGRenderProcs::Dequeue() |
||||
{ |
||||
if( fBack && !--fLinkCount ) |
||||
{ |
||||
IDetach(); |
||||
UnRef(); |
||||
} |
||||
} |
||||
|
||||
|
||||
void hsGRenderProcs::Read(hsStream* s, hsResMgr* mgr) |
||||
{ |
||||
SetFlags(s->ReadSwap32()); |
||||
ReadObjectRefs(s, mgr); |
||||
Read(s); |
||||
} |
||||
|
||||
void hsGRenderProcs::ReadObjectRefs(hsStream* s, hsResMgr* mgr) |
||||
{ |
||||
if( fFlags & kObjectRefs ) |
||||
{ |
||||
int n = s->ReadSwap32(); |
||||
fObjectRefs.SetCount(n); |
||||
int i; |
||||
for( i = 0; i < n; i++ ) |
||||
{ |
||||
fObjectRefs[i] = mgr->ReadKey(s); |
||||
} |
||||
} |
||||
} |
||||
|
||||
void hsGRenderProcs::WriteObjectRefs(hsStream* s, hsResMgr* mgr) |
||||
{ |
||||
if( fFlags & kObjectRefs ) |
||||
{ |
||||
s->WriteSwap32(fObjectRefs.GetCount()); |
||||
int i; |
||||
for( i = 0; i < fObjectRefs.GetCount(); i++ ) |
||||
{ |
||||
// if( fObjectRefs[i] )
|
||||
{ |
||||
mgr->WriteKey(s,fObjectRefs[i]); // writes nil any...right?
|
||||
} |
||||
// else
|
||||
// {
|
||||
// mgr->WriteKey(s, nil);
|
||||
// }
|
||||
} |
||||
} |
||||
} |
||||
|
||||
void hsGRenderProcs::Write(hsStream* s, hsResMgr* mgr) |
||||
{ |
||||
s->WriteSwap32(fFlags); |
||||
|
||||
WriteObjectRefs(s, mgr); |
||||
Write(s); |
||||
} |
||||
|
||||
plDrawable* hsGRenderProcs::GetObjectRef(int i)
|
||||
{
|
||||
return (plDrawable*)((i < fObjectRefs.GetCount()) && fObjectRefs[i] ? fObjectRefs[i]->GetObjectPtr() : nil);
|
||||
} |
||||
|
||||
void hsGRenderProcs::SetNumObjectRefs(int n) |
||||
{ |
||||
if( n > fObjectRefs.GetCount() ) |
||||
{ |
||||
int oldCnt = fObjectRefs.GetCount(); |
||||
fObjectRefs.SetCount(n); |
||||
int i; |
||||
for( i = oldCnt; i < n; i++ ) |
||||
fObjectRefs[i] = nil; |
||||
} |
||||
} |
||||
|
||||
void hsGRenderProcs::SetObjectRef(plKey* key, int i)
|
||||
{
|
||||
if( i >= fObjectRefs.GetCount() ) |
||||
SetNumObjectRefs(i+1); |
||||
fObjectRefs[i] = key;
|
||||
fFlags |= kObjectRefs;
|
||||
} |
||||
|
||||
hsBool32 hsGRenderProcs::BeginTree(plPipeline* pipe, plDrawable* root)
|
||||
{
|
||||
hsAssert(fFlags & kObjectRefsInit, "Should have had refs initialized on read"); |
||||
|
||||
fPipeline = pipe;
|
||||
|
||||
if( Inclusive() ) |
||||
{ |
||||
fColorizer.Init(pipe); |
||||
hsColorRGBA col = fColorizer.GetCurrentColor(); |
||||
if( !fColorizer.Colorizing() ) |
||||
{ |
||||
col.r = col.g = col.b = 1.f; |
||||
} |
||||
if( !fColorizer.Alpharizing() ) |
||||
col.a = 0.999f; |
||||
fColorizer.PushColorize(col, !fColorizer.Colorizing() /* alpha only */); |
||||
} |
||||
return true;
|
||||
} |
||||
|
||||
hsBool32 hsGRenderProcs::BeginObject(plPipeline* pipe, plDrawable* obj)
|
||||
{
|
||||
hsAssert(fFlags & kObjectRefsInit, "Should have had refs initialized on read"); |
||||
|
||||
fPipeline = pipe;
|
||||
|
||||
if( !Inclusive() ) |
||||
{ |
||||
fColorizer.Init(pipe); |
||||
hsColorRGBA col = fColorizer.GetCurrentColor(); |
||||
if( !fColorizer.Colorizing() ) |
||||
{ |
||||
col.r = col.g = col.b = 1.f; |
||||
} |
||||
if( !fColorizer.Alpharizing() ) |
||||
col.a = 0.999f; |
||||
fColorizer.PushColorize(col, !fColorizer.Colorizing() /* alpha only */); |
||||
} |
||||
return true;
|
||||
}
|
||||
|
||||
void hsGRenderProcs::EndObject()
|
||||
{
|
||||
if( !Inclusive() ) |
||||
fColorizer.PopColorize(); |
||||
} |
||||
|
||||
void hsGRenderProcs::EndTree()
|
||||
{
|
||||
if( Inclusive() ) |
||||
fColorizer.PopColorize(); |
||||
fPipeline = nil;
|
||||
} |
||||
|
@ -1,218 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#ifndef hsGRenderProcs_inc |
||||
#define hsGRenderProcs_inc |
||||
|
||||
#include "hsRefCnt.h" |
||||
#include "hsScalar.h" |
||||
#include "hsMemory.h" |
||||
#include "hsBiExpander.h" |
||||
#include "../plPipeline/hsGColorizer.h" |
||||
#include "../plResMgr/plCreatable.h" |
||||
|
||||
class plPipeline; |
||||
class plDrawable; |
||||
class hsTriangle3; |
||||
struct hsGTriVertex; |
||||
struct hsGVertex3; |
||||
struct hsGShadeVertex; |
||||
struct hsGSplat3; |
||||
class hsStream; |
||||
class plKey; |
||||
class hsBounds3Ext; |
||||
class hsResMgr; |
||||
|
||||
class hsGRenderProcs : public plCreatable {
|
||||
public: |
||||
enum { |
||||
kMaxLabelLen = 128 |
||||
}; |
||||
enum ProcType { |
||||
kTypeAngleFade, |
||||
kTypeDistFade, |
||||
kTypeMotionBlur1, |
||||
kTypeMotionBlur2, |
||||
kTypeIntenseAlpha, |
||||
kTypeGlobalShade, |
||||
kTypeObjDistFade, |
||||
kTypeDistShade, |
||||
kTypeObjDistShade |
||||
}; |
||||
enum { |
||||
kNone = 0x0, |
||||
kInclusive = 0x1, // Affect children
|
||||
kNOP = 0x2, // Turned off (till EndObject)
|
||||
kOpaque = 0x4, |
||||
kCulled = 0x8, |
||||
kObjectRefs = 0x10, |
||||
kObjectRefsInit = 0x20 |
||||
}; |
||||
private: |
||||
// Base class private stuff for managing the Queue of Procs on the device.
|
||||
|
||||
uint32_t fLinkCount; |
||||
hsGRenderProcs* fNext; |
||||
hsGRenderProcs** fBack; |
||||
|
||||
hsGRenderProcs** IOneBeforeMe(hsGRenderProcs** base); |
||||
void IInsert(hsGRenderProcs** beforeMe); |
||||
void IDetach(); |
||||
|
||||
protected: |
||||
|
||||
uint32_t fFlags; |
||||
|
||||
hsGColorizer fColorizer; |
||||
|
||||
plPipeline* fPipeline; |
||||
|
||||
hsDynamicArray<plKey*> fObjectRefs; |
||||
public:
|
||||
hsGRenderProcs(); |
||||
virtual ~hsGRenderProcs(); |
||||
|
||||
// BeginTree returns false if entire subtree is don't bother to draw,
|
||||
// else true. Mostly a culling tool.
|
||||
virtual hsBool32 BeginTree(plPipeline* pipe, plDrawable* root); |
||||
|
||||
// BeginObject returns true if the object should be drawn, false if
|
||||
// don't bother. Can also do any initialization it wants. Should this
|
||||
// get something more innocuous like a bound instead of the SceneObject?
|
||||
// Is there anything else it might need to know?
|
||||
virtual hsBool32 BeginObject(plPipeline* pipe, plDrawable* obj); |
||||
|
||||
// ProcessVerts takes the list of TriVerts and does what it will.
|
||||
// I'll outline the hsGTriVertex below. The difference between
|
||||
// the BaseVertex list and the UsedVertex list is interpolation.
|
||||
// Shade values and generated Texture Coords are computed for
|
||||
// the Base Triangle only, and then interpolated for vertices
|
||||
// generated by clipping. So Shade Values and Texture Coordinates
|
||||
// should only be computed in ProcessBaseVerts(). On the other
|
||||
// hand, only the vertices from actual drawn triangles are
|
||||
// transformed, and hence have a screen position to mess with.
|
||||
// So any wiggling of the screen position should happen in
|
||||
// ProcessUsedVerts(). These functions might be better named
|
||||
// ProcessShadeVerts() and ProcessXformVerts(), except that
|
||||
// vertex illumination (shade) is interpolated, but then
|
||||
// the interpolated shade is fed into the material to calculate
|
||||
// color. So messing with final color would happen in ProcessUsedVerts(),
|
||||
// whereas messing with illumination's in ProcessBaseVerts(). Messing
|
||||
// with UV's is equally valid in either. In general though, the number
|
||||
// of BaseVerts is less than or equal to the number of UsedVerts. Most
|
||||
// shaders would have one or the other a no-op.
|
||||
|
||||
// Process list of unique vertices (with unique hsGXformVerts) which will be drawn to screen
|
||||
virtual void ProcessScreenVerts(hsExpander<hsGVertex3*>& vList) {} |
||||
|
||||
// Take a list of verts and modulate shades for them. Care should be taken to only bother with verts that
|
||||
// are not (hsGVertex3::kCulled|hsGVertex3::kDisabled). Also, any verts that this RenderProc causes
|
||||
// to go completely transparent should be flagged hsGVertex3::kCulled (NOT DISABLED).
|
||||
// See hsSfxDistFade for example (not exemplary) code.
|
||||
|
||||
// Process list of unique vertices (unique hsGShadeVerts) before interpolation
|
||||
virtual void ProcessPreInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList) {} |
||||
// Process list of unique vertices (unique hsGShadeVerts) after interpolation - these will be drawn to screen
|
||||
virtual void ProcessPostInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList) {} |
||||
|
||||
// Process list of unique Pre or Post Interpolation TriVerts (with hsGShade and hsGXformVerts)
|
||||
// While the TriVerts are unique, there may be sharing among constituents, i.e. position and uv.
|
||||
// Care must be taken when accumulating effects.
|
||||
virtual void ProcessPreInterpVerts(hsExpander<hsGTriVertex*>& vList) {} |
||||
virtual void ProcessPostInterpVerts(hsExpander<hsGTriVertex*>& vList) {} |
||||
|
||||
// Process list of triangles which are headed for the screen. vList is the full list of unique TriVerts
|
||||
// used by these triangles. If triangles are added, any generated verts MUST be added to vList. If
|
||||
// Triangles are removed, verts may be removed from vList (keeping in mind that vList verts may be
|
||||
// shared between triangles).
|
||||
virtual void ProcessPreClipTris(hsExpander<hsTriangle3*>& tList, hsExpander<hsGTriVertex*>& vList) {} |
||||
virtual void ProcessPreInterpTris(hsExpander<hsTriangle3*>& tList, hsExpander<hsGTriVertex*>& vList) {} |
||||
virtual void ProcessPostInterpTris(hsExpander<hsTriangle3*>& tList, hsExpander<hsGTriVertex*>& vList) {} |
||||
|
||||
// Any cleanup for this object
|
||||
virtual void EndObject(); |
||||
|
||||
// Any cleanup for this subtree
|
||||
virtual void EndTree(); |
||||
|
||||
// Shaders can set their priority to affect order in which they are called
|
||||
// When pushed onto device, device uses this priority to sort into queue
|
||||
virtual hsScalar GetPriority() { return 0; } |
||||
|
||||
// When a shader is pushed onto the device (by an object), the object
|
||||
// will pop it back off either before or after drawing its children,
|
||||
// depending on Inclusive(). Not meaningful for mate
|
||||
virtual hsBool32 Inclusive() { return fFlags & kInclusive; } |
||||
|
||||
virtual void Enqueue(hsGRenderProcs** list); |
||||
virtual void Dequeue(); |
||||
hsGRenderProcs* GetNext() { return fNext; } |
||||
|
||||
// External object references. Individual RenderProc type responsible for what they're used for.
|
||||
void SetNumObjectRefs(int n); |
||||
uint32_t GetNumObjectRefs() { return fObjectRefs.GetCount(); } |
||||
void AddObjectRef(plKey* key) { fObjectRefs.Append(key); fFlags |= kObjectRefs; } |
||||
void SetObjectRef(plKey* key, int i=0); |
||||
void InsertObjectRef(int i, plKey* key) { fObjectRefs.InsertAtIndex(i, key); fFlags |= kObjectRefs; } |
||||
plDrawable* GetObjectRef(int i); |
||||
plKey* GetObjectRefKey(int i) { return fObjectRefs[i]; } |
||||
void ReadObjectRefs(hsStream* s, hsResMgr* mgr); |
||||
void WriteObjectRefs(hsStream* s, hsResMgr* mgr); |
||||
|
||||
|
||||
virtual void Read(hsStream* s, hsResMgr* mgr); |
||||
virtual void Write(hsStream* s, hsResMgr* mgr); |
||||
|
||||
virtual void Read(hsStream* s) = 0; |
||||
virtual void Write(hsStream* s) = 0; |
||||
|
||||
virtual const char* GetLabel() const = 0; |
||||
virtual ProcType GetType() const = 0; |
||||
|
||||
uint32_t GetFlags() { return fFlags; } |
||||
void SetFlags(uint32_t f) { fFlags = f; } |
||||
|
||||
CLASSNAME_REGISTER( hsGRenderProcs ); |
||||
GETINTERFACE_ANY( hsGRenderProcs, plCreatable ); |
||||
};
|
||||
|
||||
#endif // hsGRenderProcs_inc
|
@ -1,234 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#include "hsTypes.h" |
||||
#include "hsMemory.h" |
||||
#include "hsSfxAngleFade.h" |
||||
#include "hsStream.h" |
||||
#include "../plPipeline/plPipeline.h" |
||||
//#include "../plPipeline/hsG3DDevice.h"
|
||||
#include "../plGeometry/hsTriangle3.h" |
||||
#include "../plMath/hsFastMath.h" |
||||
|
||||
hsSfxAngleFade::hsSfxAngleFade() |
||||
{ |
||||
} |
||||
|
||||
hsSfxAngleFade::~hsSfxAngleFade() |
||||
{ |
||||
} |
||||
|
||||
hsScalar hsSfxAngleFade::IOpacFromDot(hsScalar dot) |
||||
{ |
||||
if( (fFlags & kTwoSided) |
||||
&&(dot < 0) ) |
||||
dot = -dot; |
||||
|
||||
if( dot <= fTable[0].fCosineDel ) |
||||
return fTable[0].fOpacity; |
||||
|
||||
int i; |
||||
for( i = 0; (i < fTable.GetCount()) && (dot >= fTable[i].fCosineDel); i++ ) |
||||
dot -= fTable[i].fCosineDel; |
||||
|
||||
if( i >= fTable.GetCount() ) |
||||
return fTable[fTable.GetCount()-1].fOpacity; |
||||
|
||||
dot *= fTable[i-1].fCosineNorm; |
||||
hsScalar opac0 = fTable[i-1].fOpacity; |
||||
hsScalar opac1 = fTable[i].fOpacity; |
||||
|
||||
return opac0 + dot * (opac1 - opac0); |
||||
} |
||||
|
||||
void hsSfxAngleFade::ProcessPreInterpTris(hsExpander<hsTriangle3*>& tList, hsExpander<hsGTriVertex*>& vList) |
||||
{ |
||||
if( !(fFlags & kFaceNormals) ) |
||||
return; |
||||
|
||||
#if 0 // Taken out 2.26.2001 mcn 'cause it accesses the (now defunct) 3DDevice directly
|
||||
|
||||
hsPoint3 vPos = fPipeline->GetViewPositionLocal(); |
||||
hsG3DDevice* dev = fPipeline->Get3DDevice(); |
||||
|
||||
fSetVector.Clear(); |
||||
|
||||
for( tList.First(); tList.More(); tList.Plus() ) |
||||
{ |
||||
hsTriangle3* tri = tList.Current(); |
||||
hsVector3& norm = tri->fNormal; |
||||
|
||||
|
||||
hsScalar dot, opac; |
||||
hsGVertex3* vtx; |
||||
hsGShadeVertex* shade; |
||||
hsVector3 vDir; |
||||
|
||||
vtx = tri->GetVertex(0); |
||||
if( !fSetVector.IsBitSet(vtx->fShadeIdx) ) |
||||
{ |
||||
vDir.Set(&vPos, &vtx->fLocalPos); |
||||
dot = hsFastMath::InvSqrtAppr(vDir.MagnitudeSquared()); |
||||
dot *= norm.InnerProduct(vDir); |
||||
|
||||
shade = dev->GetShadeEntry(vtx); |
||||
opac = IOpacFromDot(dot); |
||||
shade->fColor.a *= opac; |
||||
|
||||
fSetVector.SetBit(vtx->fShadeIdx); |
||||
} |
||||
|
||||
vtx = tri->GetVertex(1); |
||||
if( !fSetVector.IsBitSet(vtx->fShadeIdx) ) |
||||
{ |
||||
vDir.Set(&vPos, &vtx->fLocalPos); |
||||
dot = hsFastMath::InvSqrtAppr(vDir.MagnitudeSquared()); |
||||
dot *= norm.InnerProduct(vDir); |
||||
|
||||
shade = dev->GetShadeEntry(vtx); |
||||
opac = IOpacFromDot(dot); |
||||
shade->fColor.a *= opac; |
||||
|
||||
fSetVector.SetBit(vtx->fShadeIdx); |
||||
} |
||||
|
||||
vtx = tri->GetVertex(2); |
||||
if( !fSetVector.IsBitSet(vtx->fShadeIdx) ) |
||||
{ |
||||
vDir.Set(&vPos, &vtx->fLocalPos); |
||||
dot = hsFastMath::InvSqrtAppr(vDir.MagnitudeSquared()); |
||||
dot *= norm.InnerProduct(vDir); |
||||
|
||||
shade = dev->GetShadeEntry(vtx); |
||||
opac = IOpacFromDot(dot); |
||||
shade->fColor.a *= opac; |
||||
|
||||
fSetVector.SetBit(vtx->fShadeIdx); |
||||
} |
||||
|
||||
} |
||||
#endif |
||||
} |
||||
|
||||
void hsSfxAngleFade::ProcessPreInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList) |
||||
{ |
||||
if( fFlags & kFaceNormals ) |
||||
return; |
||||
|
||||
hsVector3 vDir =fPipeline->GetViewDirLocal(); |
||||
hsPoint3 vPos = fPipeline->GetViewPositionLocal(); |
||||
|
||||
for( vList.First(); vList.More(); vList.Plus() ) |
||||
{ |
||||
hsGShadeVertex* shade = vList.Current(); |
||||
|
||||
hsScalar dot; |
||||
if( !(fFlags & kDirectional) ) |
||||
{ |
||||
vDir.Set(&vPos, &shade->fLocalPos); |
||||
dot = hsFastMath::InvSqrtAppr(vDir.MagnitudeSquared()); |
||||
dot *= shade->fNormal.InnerProduct(vDir); |
||||
} |
||||
else |
||||
{ |
||||
dot = shade->fNormal.InnerProduct(vDir); |
||||
} |
||||
|
||||
hsScalar opac = IOpacFromDot(dot); |
||||
|
||||
shade->fShade.a *= opac; |
||||
} |
||||
} |
||||
|
||||
void hsSfxAngleFade::MakeTable(float* cosList, float* opacList, int num) |
||||
{ |
||||
fTable.Reset(); |
||||
if( !num ) |
||||
return; |
||||
|
||||
int i; |
||||
for( i = 0; i < num; i++ ) |
||||
{ |
||||
hsSfxAfTableEntry* t = fTable.Append(); |
||||
t->fCosineDel = cosList[i]; |
||||
t->fOpacity = opacList[i]; |
||||
} |
||||
for( i = num-1; i > 0; i-- ) |
||||
fTable[i].fCosineDel -= fTable[i-1].fCosineDel; |
||||
for( i = 0; i < num-1; i++ ) |
||||
fTable[i].fCosineNorm = hsScalarInvert(fTable[i+1].fCosineDel); |
||||
fTable[num-1].fCosineNorm = 0; |
||||
hsAssert(fTable.GetCount() == num, "Mismatch making table"); |
||||
} |
||||
|
||||
void hsSfxAngleFade::Read(hsStream* s) |
||||
{ |
||||
fTable.Reset(); |
||||
|
||||
int32_t cnt = s->ReadSwap32(); |
||||
|
||||
if( cnt ) |
||||
{ |
||||
hsSfxAfTableEntry* arr = new hsSfxAfTableEntry[cnt]; |
||||
int i; |
||||
for( i = 0; i < cnt; i++ ) |
||||
{ |
||||
arr[i].fCosineDel = s->ReadSwapScalar(); |
||||
arr[i].fCosineNorm = s->ReadSwapScalar(); |
||||
arr[i].fOpacity = s->ReadSwapScalar(); |
||||
} |
||||
|
||||
fTable.SetArray(arr, cnt); |
||||
} |
||||
} |
||||
|
||||
void hsSfxAngleFade::Write(hsStream* s) |
||||
{ |
||||
s->WriteSwap32(fTable.GetCount()); |
||||
|
||||
for( fTable.First(); fTable.More(); fTable.Plus() ) |
||||
{ |
||||
s->WriteSwapScalar(fTable.Current().fCosineDel); |
||||
s->WriteSwapScalar(fTable.Current().fCosineNorm); |
||||
s->WriteSwapScalar(fTable.Current().fOpacity); |
||||
} |
||||
} |
@ -1,90 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#ifndef hsSfxAngleFade_inc |
||||
#define hsSfxAngleFade_inc |
||||
|
||||
#include "hsBiExpander.h" |
||||
#include "hsGRenderProcs.h" |
||||
#include "hsBitVector.h" |
||||
|
||||
class hsSfxAngleFade : public hsGRenderProcs { |
||||
public: |
||||
enum { |
||||
kDirectional = 0x10000, |
||||
kTargetRelative = 0x20000, |
||||
kTwoSided = 0x40000, |
||||
kFaceNormals = 0x80000 |
||||
}; |
||||
struct hsSfxAfTableEntry { |
||||
hsScalar fCosineDel; |
||||
hsScalar fCosineNorm; |
||||
hsScalar fOpacity; |
||||
}; |
||||
protected: |
||||
|
||||
hsBitVector fSetVector; |
||||
hsExpander<hsSfxAfTableEntry> fTable; |
||||
|
||||
hsScalar IOpacFromDot(hsScalar dot); |
||||
public: |
||||
hsSfxAngleFade(); |
||||
virtual ~hsSfxAngleFade(); |
||||
|
||||
virtual void ProcessPreInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList); |
||||
virtual void ProcessPreInterpTris(hsExpander<hsTriangle3*>& tList, hsExpander<hsGTriVertex*>& vList); |
||||
|
||||
void MakeTable(float* cosList, float* opacList, int num); // lists sorted from lowest cosine to highest
|
||||
|
||||
virtual void Read(hsStream* s); |
||||
virtual void Write(hsStream* s); |
||||
|
||||
virtual const char* GetLabel() const { return "hsSfxAngleFade"; } |
||||
|
||||
virtual ProcType GetType() const { return kTypeAngleFade; } |
||||
|
||||
CLASSNAME_REGISTER( hsSfxAngleFade ); |
||||
GETINTERFACE_ANY( hsSfxAngleFade, hsGRenderProcs ); |
||||
|
||||
}; |
||||
|
||||
#endif // hsSfxAngleFade_inc
|
@ -1,331 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#include "hsTypes.h" |
||||
#include "hsMemory.h" |
||||
#include "hsSfxDistFade.h" |
||||
#include "hsStream.h" |
||||
#include "../plPipeline/plPipeline.h" |
||||
#include "../plGeometry/hsTriangle3.h" |
||||
#include "../plDrawable/plDrawable.h" |
||||
|
||||
#include "../plIntersect/hsBounds.h" |
||||
|
||||
|
||||
static hsScalar globalScale = 1.f; |
||||
|
||||
hsSfxDistFade::hsSfxDistFade() |
||||
: fMinDist(0), fMaxDist(0) |
||||
{ |
||||
} |
||||
|
||||
hsSfxDistFade::~hsSfxDistFade() |
||||
{ |
||||
} |
||||
|
||||
hsScalar hsSfxDistFade::IOpacFromDist(hsScalar dist) |
||||
{ |
||||
if( dist <= fTable[0].fDistDel ) |
||||
return fTable[0].fOpacity; |
||||
|
||||
int i; |
||||
for( i = 0; (i < fTable.GetCount()) && (dist >= fTable[i].fDistDel); i++ ) |
||||
dist -= fTable[i].fDistDel; |
||||
|
||||
if( i >= fTable.GetCount() ) |
||||
return fTable[fTable.GetCount()-1].fOpacity; |
||||
|
||||
dist *= fTable[i-1].fDistNorm; |
||||
hsScalar opac0 = fTable[i-1].fOpacity; |
||||
hsScalar opac1 = fTable[i].fOpacity; |
||||
|
||||
return opac0 + dist * (opac1 - opac0); |
||||
} |
||||
|
||||
hsBool32 hsSfxDistFade::BeginObject(plPipeline* pipe, plDrawable* obj) |
||||
{ |
||||
hsGRenderProcs::BeginObject(pipe, obj); |
||||
|
||||
fFlags &= ~(kCulled | kNOP); |
||||
|
||||
hsPoint3 vPos; |
||||
if( GetObjectRef(1) ) |
||||
{ |
||||
hsPoint3 wPos; |
||||
GetObjectRef(1)->GetLocalToWorld().GetTranslate(&wPos); |
||||
hsMatrix44 w2l = fPipeline->GetWorldToLocal(); |
||||
vPos = w2l * wPos; |
||||
} |
||||
else |
||||
{ |
||||
vPos = fPipeline->GetViewPositionLocal(); |
||||
} |
||||
|
||||
hsScalar scale = 1.f / fPipeline->GetLocalScale(); |
||||
scale *= globalScale; |
||||
|
||||
const hsBounds3Ext& bnd = obj->GetLocalBounds(); |
||||
|
||||
hsPoint3 inner, outer; |
||||
bnd.ClosestPoint(vPos, inner, outer); |
||||
|
||||
hsScalar minDist, maxDist; |
||||
|
||||
minDist = hsVector3(&vPos, &inner).Magnitude(); |
||||
maxDist = hsVector3(&vPos, &outer).Magnitude(); |
||||
|
||||
minDist *= scale; |
||||
maxDist *= scale; |
||||
|
||||
if( (fFlags & kCullsBefore) |
||||
&&(maxDist <= fMinDist) ) |
||||
{ |
||||
fFlags |= kCulled; |
||||
return false; |
||||
} |
||||
|
||||
if( (fFlags & kCullsBeyond) |
||||
&&(minDist > fMaxDist) ) |
||||
{ |
||||
fFlags |= kCulled; |
||||
return false; |
||||
} |
||||
|
||||
if( (fFlags & kIdleBefore) |
||||
&&(maxDist < fMinIdle) ) |
||||
fFlags |= kNOP; |
||||
|
||||
if( (fFlags & kIdleBeyond) |
||||
&&(minDist > fMaxIdle) ) |
||||
fFlags |= kNOP; |
||||
|
||||
return true; |
||||
} |
||||
|
||||
void hsSfxDistFade::ProcessPreInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList) |
||||
{ |
||||
if( fFlags & (kPostInterp | kNOP) ) |
||||
return; |
||||
|
||||
hsPoint3 vPos; |
||||
if( GetObjectRef(1) ) |
||||
{ |
||||
hsPoint3 wPos; |
||||
GetObjectRef(1)->GetLocalToWorld().GetTranslate(&wPos); |
||||
hsMatrix44 w2l = fPipeline->GetWorldToLocal(); |
||||
vPos = w2l * wPos; |
||||
} |
||||
else |
||||
{ |
||||
vPos = fPipeline->GetViewPositionLocal(); |
||||
} |
||||
hsScalar scale = 1.f / fPipeline->GetLocalScale(); |
||||
|
||||
scale *= globalScale; |
||||
|
||||
for( vList.First(); vList.More(); vList.Plus() ) |
||||
{ |
||||
hsGShadeVertex* shade = vList.Current(); |
||||
|
||||
hsScalar dist = hsVector3(&shade->fLocalPos, &vPos).Magnitude(); |
||||
dist *= scale; |
||||
|
||||
hsScalar opac = IOpacFromDist(dist); |
||||
|
||||
if( opac > 0 ) |
||||
shade->fShade.a *= opac; |
||||
else |
||||
{ |
||||
shade->fShade.a = 0; |
||||
shade->fBaseVertex->fFlags |= hsGVertex3::kCulled; |
||||
} |
||||
} |
||||
} |
||||
|
||||
void hsSfxDistFade::ProcessPostInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList) |
||||
{ |
||||
if( !(fFlags & kPostInterp) ) |
||||
return; |
||||
|
||||
if( fFlags & kNOP ) |
||||
return; |
||||
|
||||
hsPoint3 vPos; |
||||
if( GetObjectRef(1) ) |
||||
{ |
||||
hsPoint3 wPos; |
||||
GetObjectRef(1)->GetLocalToWorld().GetTranslate(&wPos); |
||||
hsMatrix44 w2l = fPipeline->GetWorldToLocal(); |
||||
vPos = w2l * wPos; |
||||
} |
||||
else |
||||
{ |
||||
vPos = fPipeline->GetViewPositionLocal(); |
||||
} |
||||
hsScalar scale = 1.f / fPipeline->GetLocalScale(); |
||||
|
||||
for( vList.First(); vList.More(); vList.Plus() ) |
||||
{ |
||||
hsGShadeVertex* shade = vList.Current(); |
||||
|
||||
hsScalar dist = hsVector3(&shade->fLocalPos, &vPos).Magnitude(); |
||||
dist *= scale; |
||||
|
||||
hsScalar opac = IOpacFromDist(dist); |
||||
|
||||
if( opac > 0 ) |
||||
shade->fColor.a *= opac; |
||||
else |
||||
{ |
||||
shade->fColor.a = 0; |
||||
shade->fBaseVertex->fFlags |= hsGVertex3::kCulled; |
||||
} |
||||
} |
||||
} |
||||
|
||||
void hsSfxDistFade::MakeTable(float* distList, float* opacList, int num) |
||||
{ |
||||
fTable.Reset(); |
||||
if( !num ) |
||||
return; |
||||
|
||||
int i; |
||||
for( i = 0; i < num; i++ ) |
||||
{ |
||||
hsSfxDfTableEntry* t = fTable.Append(); |
||||
t->fDistDel = distList[i]; |
||||
t->fOpacity = opacList[i]; |
||||
} |
||||
for( i = num-1; i > 0; i-- ) |
||||
fTable[i].fDistDel -= fTable[i-1].fDistDel; |
||||
for( i = 0; i < num-1; i++ ) |
||||
fTable[i].fDistNorm = hsScalarInvert(fTable[i+1].fDistDel); |
||||
fTable[num-1].fDistNorm = 0; |
||||
hsAssert(fTable.GetCount() == num, "Mismatch making table"); |
||||
|
||||
if( fTable[0].fOpacity <= 0 ) |
||||
fFlags |= kCullsBefore; |
||||
if( fTable[num-1].fOpacity <= 0 ) |
||||
fFlags |= kCullsBeyond; |
||||
if( fTable[0].fOpacity >= 1.f ) |
||||
fFlags |= kIdleBefore; |
||||
if( fTable[num-1].fOpacity >= 1.f ) |
||||
fFlags |= kIdleBeyond; |
||||
|
||||
int iMin; |
||||
for( iMin = 0; (iMin < fTable.GetCount())&&(fTable[iMin].fOpacity <= 0); iMin++ ); |
||||
fMinDist = fTable[0].fDistDel; |
||||
for( i = 1; i < iMin; i++ ) |
||||
fMinDist += fTable[i].fDistDel; |
||||
|
||||
for( iMin = 0; (iMin < fTable.GetCount())&&(fTable[iMin].fOpacity >= 1.f); iMin++ ); |
||||
fMinIdle = fTable[0].fDistDel; |
||||
for( i = 1; i < iMin; i++ ) |
||||
fMinIdle += fTable[i].fDistDel; |
||||
|
||||
int iMax; |
||||
for( iMax = fTable.GetCount()-1; (iMax >= 0)&&(fTable[iMax].fOpacity <= 0); iMax-- ); |
||||
if( ++iMax >= fTable.GetCount() ) |
||||
iMax = fTable.GetCount()-1; |
||||
fMaxDist = fTable[0].fDistDel; |
||||
for( i = 1; i <= iMax; i++ ) |
||||
fMaxDist += fTable[i].fDistDel; |
||||
|
||||
for( iMax = fTable.GetCount()-1; (iMax >= 0)&&(fTable[iMax].fOpacity >= 1.f); iMax-- ); |
||||
if( ++iMax >= fTable.GetCount() ) |
||||
iMax = fTable.GetCount()-1; |
||||
fMaxIdle = fTable[0].fDistDel; |
||||
for( i = 1; i <= iMax; i++ ) |
||||
fMaxIdle += fTable[i].fDistDel; |
||||
} |
||||
|
||||
void hsSfxDistFade::Read(hsStream* s) |
||||
{ |
||||
fTable.Reset(); |
||||
|
||||
fMinDist = s->ReadSwapScalar(); |
||||
fMaxDist = s->ReadSwapScalar(); |
||||
|
||||
if( fFlags & (kIdleBefore | kIdleBeyond) ) |
||||
{ |
||||
fMinIdle = s->ReadSwapScalar(); |
||||
fMaxIdle = s->ReadSwapScalar(); |
||||
} |
||||
|
||||
int32_t cnt = s->ReadSwap32(); |
||||
|
||||
if( cnt ) |
||||
{ |
||||
hsSfxDfTableEntry* arr = new hsSfxDfTableEntry[cnt]; |
||||
int i; |
||||
for( i = 0; i < cnt; i++ ) |
||||
{ |
||||
arr[i].fDistDel = s->ReadSwapScalar(); |
||||
arr[i].fDistNorm = s->ReadSwapScalar(); |
||||
arr[i].fOpacity = s->ReadSwapScalar(); |
||||
} |
||||
|
||||
fTable.SetArray(arr, cnt); |
||||
} |
||||
} |
||||
|
||||
void hsSfxDistFade::Write(hsStream* s) |
||||
{ |
||||
s->WriteSwapScalar(fMinDist); |
||||
s->WriteSwapScalar(fMaxDist); |
||||
|
||||
if( fFlags & (kIdleBefore | kIdleBeyond) ) |
||||
{ |
||||
s->WriteSwapScalar(fMinIdle); |
||||
s->WriteSwapScalar(fMaxIdle); |
||||
} |
||||
|
||||
s->WriteSwap32(fTable.GetCount()); |
||||
|
||||
for( fTable.First(); fTable.More(); fTable.Plus() ) |
||||
{ |
||||
s->WriteSwapScalar(fTable.Current().fDistDel); |
||||
s->WriteSwapScalar(fTable.Current().fDistNorm); |
||||
s->WriteSwapScalar(fTable.Current().fOpacity); |
||||
} |
||||
} |
||||
|
@ -1,107 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#ifndef hsSfxDistFade_inc |
||||
#define hsSfxDistFade_inc |
||||
|
||||
#include "hsBiExpander.h" |
||||
#include "hsGRenderProcs.h" |
||||
|
||||
class hsSfxDistFade : public hsGRenderProcs { |
||||
public: |
||||
enum { |
||||
kCullsBefore = 0x10000, |
||||
kCullsBeyond = 0x20000, |
||||
|
||||
kDistFromView = 0x40000, |
||||
kDistFromTarget = 0x80000, |
||||
kDistAlongX = 0x100000, |
||||
kDistAlongY = 0x200000, |
||||
kDistAlongZ = 0x400000, |
||||
kWorldDist = 0x800000, |
||||
|
||||
kPostInterp = 0x1000000, |
||||
|
||||
kIdleBefore = 0x2000000, |
||||
kIdleBeyond = 0x4000000 |
||||
}; |
||||
|
||||
struct hsSfxDfTableEntry { |
||||
hsScalar fDistDel; |
||||
hsScalar fDistNorm; |
||||
hsScalar fOpacity; |
||||
}; |
||||
protected: |
||||
|
||||
hsScalar fMinDist; |
||||
hsScalar fMaxDist; |
||||
|
||||
hsScalar fMinIdle; |
||||
hsScalar fMaxIdle; |
||||
|
||||
hsExpander<hsSfxDfTableEntry> fTable; |
||||
|
||||
hsScalar IOpacFromDist(hsScalar dist); |
||||
public: |
||||
hsSfxDistFade(); |
||||
virtual ~hsSfxDistFade(); |
||||
|
||||
virtual hsBool32 BeginObject(plPipeline* pipe, plDrawable* obj); |
||||
|
||||
virtual void ProcessPreInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList); |
||||
virtual void ProcessPostInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList); |
||||
|
||||
void MakeTable(float* distList, float* opacList, int num); // lists sorted from lowest cosine to highest
|
||||
|
||||
virtual void Read(hsStream* s); |
||||
virtual void Write(hsStream* s); |
||||
|
||||
virtual const char* GetLabel() const { return "hsSfxDistFade"; } |
||||
|
||||
virtual ProcType GetType() const { return kTypeDistFade; } |
||||
|
||||
CLASSNAME_REGISTER( hsSfxDistFade ); |
||||
GETINTERFACE_ANY( hsSfxDistFade, hsGRenderProcs ); |
||||
|
||||
}; |
||||
|
||||
#endif // hsSfxDistFade_inc
|
@ -1,292 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#include "hsTypes.h" |
||||
#include "hsMemory.h" |
||||
#include "hsSfxDistShade.h" |
||||
#include "hsStream.h" |
||||
#include "../plGeometry/hsTriangle3.h" |
||||
|
||||
#include "../plIntersect/hsBounds.h" |
||||
#include "../plDrawable/plDrawable.h" |
||||
#include "../plPipeline/plPipeline.h" |
||||
|
||||
static hsScalar globalScale = 1.f; |
||||
|
||||
hsSfxDistShade::hsSfxDistShade() |
||||
: fMinDist(0), fMaxDist(0) |
||||
{ |
||||
} |
||||
|
||||
hsSfxDistShade::~hsSfxDistShade() |
||||
{ |
||||
} |
||||
|
||||
hsScalar hsSfxDistShade::IShadeFromDist(hsScalar dist) |
||||
{ |
||||
if( dist <= fTable[0].fDistDel ) |
||||
return fTable[0].fShade; |
||||
|
||||
int i; |
||||
for( i = 0; (i < fTable.GetCount()) && (dist >= fTable[i].fDistDel); i++ ) |
||||
dist -= fTable[i].fDistDel; |
||||
|
||||
if( i >= fTable.GetCount() ) |
||||
return fTable[fTable.GetCount()-1].fShade; |
||||
|
||||
dist *= fTable[i-1].fDistNorm; |
||||
hsScalar shade0 = fTable[i-1].fShade; |
||||
hsScalar shade1 = fTable[i].fShade; |
||||
|
||||
return shade0 + dist * (shade1 - shade0); |
||||
} |
||||
|
||||
|
||||
|
||||
hsBool32 hsSfxDistShade::BeginObject(plPipeline* pipe, plDrawable* obj) |
||||
{ |
||||
hsGRenderProcs::BeginObject(pipe, obj); |
||||
|
||||
fFlags &= ~(kCulled | kNOP); |
||||
|
||||
hsPoint3 vPos; |
||||
if( GetObjectRef(1) ) |
||||
{ |
||||
hsPoint3 wPos; |
||||
GetObjectRef(1)->GetLocalToWorld().GetTranslate(&wPos); |
||||
hsMatrix44 w2l = pipe->GetWorldToLocal(); |
||||
vPos = w2l * wPos; |
||||
} |
||||
else |
||||
{ |
||||
vPos = pipe->GetViewPositionLocal(); |
||||
} |
||||
hsVector3 vDir = -pipe->GetViewDirLocal(); |
||||
|
||||
hsScalar scale = 1.f / fPipeline->GetLocalScale(); |
||||
scale *= globalScale; |
||||
|
||||
hsScalar vD = -(vDir.InnerProduct(vPos)); |
||||
vD *= scale; |
||||
|
||||
const hsBounds3Ext& bnd = obj->GetLocalBounds(); |
||||
|
||||
hsPoint3 corner; |
||||
bnd.GetCorner(&corner); |
||||
hsVector3 axis[3]; |
||||
bnd.GetAxes(axis+0, axis+1, axis+2); |
||||
|
||||
hsScalar dist = vDir.InnerProduct(corner) + vD; |
||||
hsScalar minDist = dist; |
||||
hsScalar maxDist = dist; |
||||
|
||||
int i; |
||||
for( i = 0; i < 3; i++ ) |
||||
{ |
||||
dist = vDir.InnerProduct(axis[i]); |
||||
if( dist < 0 ) |
||||
minDist += dist; |
||||
else |
||||
maxDist += dist; |
||||
} |
||||
|
||||
minDist *= scale; |
||||
maxDist *= scale; |
||||
|
||||
fFlags &= ~kShadeConstant; |
||||
if( maxDist < fMinDist ) |
||||
{ |
||||
fFlags |= kShadeConstant; |
||||
fConstShade = fTable[0].fShade; |
||||
} |
||||
else if( minDist > fMaxDist ) |
||||
{ |
||||
fFlags |= kShadeConstant; |
||||
fConstShade = fTable[fTable.GetCount()-1].fShade; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
void hsSfxDistShade::ProcessPreInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList) |
||||
{ |
||||
if( fFlags & kShadeConstant ) |
||||
{ |
||||
IConstShadeVerts(vList); |
||||
} |
||||
else |
||||
{ |
||||
ICalcShadeVerts(vList); |
||||
} |
||||
} |
||||
|
||||
void hsSfxDistShade::IConstShadeVerts(hsExpander<hsGShadeVertex*>& vList) |
||||
{ |
||||
for( vList.First(); vList.More(); vList.Plus() ) |
||||
{ |
||||
hsGShadeVertex* svtx = vList.Current(); |
||||
svtx->fShade.r *= fConstShade; |
||||
svtx->fShade.g *= fConstShade; |
||||
svtx->fShade.b *= fConstShade; |
||||
} |
||||
} |
||||
|
||||
void hsSfxDistShade::ICalcShadeVerts(hsExpander<hsGShadeVertex*>& vList) |
||||
{ |
||||
hsPoint3 vPos; |
||||
if( GetObjectRef(1) ) |
||||
{ |
||||
hsPoint3 wPos; |
||||
GetObjectRef(1)->GetLocalToWorld().GetTranslate(&wPos); |
||||
hsMatrix44 w2l = fPipeline->GetWorldToLocal(); |
||||
vPos = w2l * wPos; |
||||
} |
||||
else |
||||
{ |
||||
vPos = fPipeline->GetViewPositionLocal(); |
||||
} |
||||
hsVector3 vDir = fPipeline->GetViewDirLocal(); |
||||
|
||||
hsScalar vDist = vDir.InnerProduct(vPos); |
||||
|
||||
hsScalar scale = 1.f / fPipeline->GetLocalScale(); |
||||
scale *= globalScale; |
||||
|
||||
for( vList.First(); vList.More(); vList.Plus() ) |
||||
{ |
||||
hsGShadeVertex* svtx = vList.Current(); |
||||
|
||||
hsScalar dist = -vDir.InnerProduct(svtx->fLocalPos); |
||||
dist += vDist; |
||||
dist *= scale; |
||||
|
||||
hsScalar shade = IShadeFromDist(dist); |
||||
|
||||
if( shade > 0 ) |
||||
{ |
||||
svtx->fShade.r *= shade; |
||||
svtx->fShade.g *= shade; |
||||
svtx->fShade.b *= shade; |
||||
} |
||||
else |
||||
{ |
||||
svtx->fShade.r = 0; |
||||
svtx->fShade.g = 0; |
||||
svtx->fShade.b = 0; |
||||
} |
||||
} |
||||
} |
||||
|
||||
void hsSfxDistShade::MakeTable(float* distList, float* shadeList, int num) |
||||
{ |
||||
fTable.Reset(); |
||||
if( !num ) |
||||
return; |
||||
|
||||
int i; |
||||
for( i = 0; i < num; i++ ) |
||||
{ |
||||
hsSfxDfTableEntry* t = fTable.Append(); |
||||
t->fDistDel = distList[i]; |
||||
t->fShade = shadeList[i]; |
||||
} |
||||
for( i = num-1; i > 0; i-- ) |
||||
fTable[i].fDistDel -= fTable[i-1].fDistDel; |
||||
for( i = 0; i < num-1; i++ ) |
||||
fTable[i].fDistNorm = hsScalarInvert(fTable[i+1].fDistDel); |
||||
fTable[num-1].fDistNorm = 0; |
||||
hsAssert(fTable.GetCount() == num, "Mismatch making table"); |
||||
|
||||
int iMin; |
||||
for( iMin = 0; (iMin < fTable.GetCount())&&(fTable[iMin].fShade <= 0); iMin++ ); |
||||
fMinDist = fTable[0].fDistDel; |
||||
for( i = 1; i < iMin; i++ ) |
||||
fMinDist += fTable[i].fDistDel; |
||||
|
||||
int iMax; |
||||
for( iMax = fTable.GetCount()-1; (iMax >= 0)&&(fTable[iMax].fShade <= 0); iMax-- ); |
||||
if( ++iMax >= fTable.GetCount() ) |
||||
iMax = fTable.GetCount()-1; |
||||
fMaxDist = fTable[0].fDistDel; |
||||
for( i = 1; i <= iMax; i++ ) |
||||
fMaxDist += fTable[i].fDistDel; |
||||
|
||||
} |
||||
|
||||
void hsSfxDistShade::Read(hsStream* s) |
||||
{ |
||||
fTable.Reset(); |
||||
|
||||
fMinDist = s->ReadSwapScalar(); |
||||
fMaxDist = s->ReadSwapScalar(); |
||||
|
||||
int32_t cnt = s->ReadSwap32(); |
||||
|
||||
if( cnt ) |
||||
{ |
||||
hsSfxDfTableEntry* arr = new hsSfxDfTableEntry[cnt]; |
||||
int i; |
||||
for( i = 0; i < cnt; i++ ) |
||||
{ |
||||
arr[i].fDistDel = s->ReadSwapScalar(); |
||||
arr[i].fDistNorm = s->ReadSwapScalar(); |
||||
arr[i].fShade = s->ReadSwapScalar(); |
||||
} |
||||
|
||||
fTable.SetArray(arr, cnt); |
||||
} |
||||
} |
||||
|
||||
void hsSfxDistShade::Write(hsStream* s) |
||||
{ |
||||
s->WriteSwapScalar(fMinDist); |
||||
s->WriteSwapScalar(fMaxDist); |
||||
|
||||
s->WriteSwap32(fTable.GetCount()); |
||||
|
||||
for( fTable.First(); fTable.More(); fTable.Plus() ) |
||||
{ |
||||
s->WriteSwapScalar(fTable.Current().fDistDel); |
||||
s->WriteSwapScalar(fTable.Current().fDistNorm); |
||||
s->WriteSwapScalar(fTable.Current().fShade); |
||||
} |
||||
} |
||||
|
@ -1,97 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#ifndef hsSfxDistShade_inc |
||||
#define hsSfxDistShade_inc |
||||
|
||||
#include "hsBiExpander.h" |
||||
#include "hsGRenderProcs.h" |
||||
|
||||
class hsSfxDistShade : public hsGRenderProcs { |
||||
public: |
||||
enum { |
||||
kShadeConstant = 0x10000 |
||||
}; |
||||
|
||||
struct hsSfxDfTableEntry { |
||||
hsScalar fDistDel; |
||||
hsScalar fDistNorm; |
||||
hsScalar fShade; |
||||
}; |
||||
protected: |
||||
|
||||
hsScalar fMinDist; |
||||
hsScalar fMaxDist; |
||||
|
||||
hsScalar fConstShade; |
||||
|
||||
hsScalar fMinIdle; |
||||
hsScalar fMaxIdle; |
||||
|
||||
hsExpander<hsSfxDfTableEntry> fTable; |
||||
|
||||
void IConstShadeVerts(hsExpander<hsGShadeVertex*>& vList); |
||||
void ICalcShadeVerts(hsExpander<hsGShadeVertex*>& vList); |
||||
hsScalar IShadeFromDist(hsScalar dist); |
||||
public: |
||||
hsSfxDistShade(); |
||||
virtual ~hsSfxDistShade(); |
||||
|
||||
virtual hsBool32 BeginObject(plPipeline* pipe, plDrawable* obj); |
||||
|
||||
virtual void ProcessPreInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList); |
||||
|
||||
void MakeTable(float* distList, float* shadeList, int num); // lists sorted from lowest cosine to highest
|
||||
|
||||
virtual void Read(hsStream* s); |
||||
virtual void Write(hsStream* s); |
||||
|
||||
virtual const char* GetLabel() const { return "hsSfxDistShade"; } |
||||
|
||||
virtual ProcType GetType() const { return kTypeDistShade; } |
||||
|
||||
CLASSNAME_REGISTER( hsSfxDistShade ); |
||||
GETINTERFACE_ANY( hsSfxDistShade, hsGRenderProcs ); |
||||
|
||||
}; |
||||
|
||||
#endif // hsSfxDistShade_inc
|
@ -1,242 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#include "hsTypes.h" |
||||
#include "hsMemory.h" |
||||
#include "hsSfxGlobalShade.h" |
||||
#include "hsStream.h" |
||||
//#include "../plPipeline/hsG3DDevice.h"
|
||||
#include "../plPipeline/plPipeline.h" |
||||
#include "../plGLight/hsGProjector3.h" |
||||
#include "../plSurface/hsGLayer.h" |
||||
#include "../plSurface/hsGMaterial.h" |
||||
#include "../plDrawable/plDrawable.h" |
||||
#include "../plIntersect/hsBounds.h" |
||||
|
||||
|
||||
void hsSfxGlobalShade::ISetIntensity(hsPoint3& pos) |
||||
{ |
||||
if( fGSFlags & kFromFog ) |
||||
ISetFromFog(pos); |
||||
else |
||||
if( fGSFlags & kFromClear ) |
||||
ISetFromClear(pos); |
||||
else |
||||
if( fGSFlags & kFromLights ) |
||||
ISetFromLights(pos); |
||||
|
||||
fIntensity.a = hsMaximum(fIntensity.r, hsMaximum(fIntensity.g, fIntensity.b)); |
||||
} |
||||
|
||||
void hsSfxGlobalShade::ISetFromClear(hsPoint3& pos) |
||||
{ |
||||
fIntensity.Set(0,0,0,0); |
||||
#if 0 // Taken out 2.26.2001 mcn 'cause it accesses the (now defunct) 3DDevice directly
|
||||
hsG3DDevice* dev = fPipeline->Get3DDevice(); |
||||
hsGEnvironment* env = dev->GetEnvironment(); |
||||
if( env && (env->GetFlags() & hsGEnvironment::kClearColorSet) ) |
||||
{ |
||||
fIntensity = env->GetClearColor(); |
||||
} |
||||
#endif |
||||
} |
||||
|
||||
void hsSfxGlobalShade::ISetFromFog(hsPoint3& pos) |
||||
{ |
||||
fIntensity.Set(0,0,0,0); |
||||
#if 0 // Taken out 2.26.2001 mcn 'cause it accesses the (now defunct) 3DDevice directly
|
||||
hsG3DDevice* dev = fPipeline->Get3DDevice(); |
||||
hsGEnvironment* env = dev->GetEnvironment(); |
||||
if( env && (env->GetFlags() & hsGEnvironment::kFogColorSet) ) |
||||
{ |
||||
fIntensity = env->GetFogColor(); |
||||
} |
||||
#endif |
||||
} |
||||
|
||||
void hsSfxGlobalShade::ISetFromLights(hsPoint3& pos) |
||||
{ |
||||
fIntensity = ISumLights(pos); |
||||
} |
||||
|
||||
hsColorRGBA hsSfxGlobalShade::ISumLights(hsPoint3& pos) |
||||
{ |
||||
hsColorRGBA accum; |
||||
accum.Set(0,0,0,0); |
||||
|
||||
#if 0 // Taken out 2.26.2001 mcn 'cause it accesses the (now defunct) 3DDevice directly
|
||||
hsG3DDevice* dev = fPipeline->Get3DDevice(); |
||||
for( dev->FirstProjector(); dev->MoreProjectors(); dev->IncProjector() ) |
||||
{ |
||||
hsGProjector3* proj = dev->CurrProjector(); |
||||
|
||||
if( proj->IsOmni() ) |
||||
{ |
||||
hsScalar intensity = proj->AttenuatePoint(&pos) * proj->GetIntensity(); |
||||
|
||||
if( intensity > 0.f ) |
||||
{ |
||||
hsColorRGBA col = intensity * proj->GetLightColor();
|
||||
accum += col; |
||||
} |
||||
} |
||||
else |
||||
if( proj->IsPerspective() ) // spot
|
||||
{ |
||||
hsPoint4 ang; |
||||
uint32_t clips; |
||||
proj->GetNdcPoints(1, &pos, sizeof(pos), &ang, kClipAll, &clips); |
||||
|
||||
if( !clips |
||||
|| !( proj->IsAttenuated() || proj->AttenuatesAlpha() || (clips & ~kClipYon) ) |
||||
) |
||||
{ |
||||
hsScalar intensity = proj->AttenuatePoint(&pos) * proj->GetIntensity(); |
||||
|
||||
if( intensity > 0.f ) |
||||
{ |
||||
hsColorRGBA col = intensity * proj->GetLightColor();
|
||||
accum += col; |
||||
} |
||||
} |
||||
} |
||||
else // directional
|
||||
{ |
||||
hsColorRGBA col = proj->GetIntensity() * proj->GetLightColor();
|
||||
accum += col; |
||||
} |
||||
} |
||||
#endif |
||||
return accum; |
||||
} |
||||
|
||||
void hsSfxGlobalShade::ProcessPreInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList) |
||||
{ |
||||
if( fCurrentLayer ) |
||||
{ |
||||
if( fGSFlags & kAffectDiffuse ) |
||||
fCurrentLayer->SetColor(fRestoreColor.r, fRestoreColor.g, fRestoreColor.b, fRestoreColor.a); |
||||
else |
||||
fCurrentLayer->SetAmbientColor(fRestoreColor.r, fRestoreColor.g, fRestoreColor.b, fRestoreColor.a); |
||||
} |
||||
|
||||
#if 0 // Taken out 2.26.2001 mcn 'cause it accesses the (now defunct) 3DDevice directly
|
||||
hsG3DDevice* dev = fPipeline->Get3DDevice(); |
||||
hsRefCnt_SafeAssign(fCurrentLayer, dev->GetCurrentLayer()); |
||||
if( fCurrentLayer ) |
||||
{ |
||||
fRestoreColor = fGSFlags & kAffectDiffuse ? fCurrentLayer->GetColor() : fCurrentLayer->GetAmbientColor(); |
||||
hsColorRGBA col = fAmbient; |
||||
if( fGSFlags & kScalarIntensity ) |
||||
{ |
||||
col.r += fDiffuse.r * fIntensity.a; |
||||
col.g += fDiffuse.g * fIntensity.a; |
||||
col.b += fDiffuse.b * fIntensity.a; |
||||
} |
||||
else |
||||
{ |
||||
col.r += fDiffuse.r * fIntensity.r; |
||||
col.g += fDiffuse.g * fIntensity.g; |
||||
col.b += fDiffuse.b * fIntensity.b; |
||||
} |
||||
if( fGSFlags & kAffectDiffuse ) |
||||
fCurrentLayer->SetColor(col.r, col.g, col.b, fRestoreColor.a); |
||||
else |
||||
fCurrentLayer->SetAmbientColor(col.r, col.g, col.b, fRestoreColor.a); |
||||
} |
||||
#endif |
||||
} |
||||
|
||||
hsBool32 hsSfxGlobalShade::BeginObject(plPipeline* pipe, plDrawable* obj) |
||||
{ |
||||
hsBool32 retVal = hsGRenderProcs::BeginObject(pipe, obj); |
||||
|
||||
const hsBounds3Ext& bnd = obj->GetLocalBounds(); |
||||
hsPoint3 pos = bnd.GetCenter(); |
||||
ISetIntensity(pos); |
||||
|
||||
return retVal; |
||||
} |
||||
|
||||
void hsSfxGlobalShade::EndObject() |
||||
{ |
||||
hsGRenderProcs::EndObject(); |
||||
if( fCurrentLayer ) |
||||
{ |
||||
if( fGSFlags & kAffectDiffuse ) |
||||
fCurrentLayer->SetColor(fRestoreColor.r, fRestoreColor.g, fRestoreColor.b, fRestoreColor.a); |
||||
else |
||||
fCurrentLayer->SetAmbientColor(fRestoreColor.r, fRestoreColor.g, fRestoreColor.b, fRestoreColor.a); |
||||
hsRefCnt_SafeUnRef(fCurrentLayer); |
||||
fCurrentLayer = nil; |
||||
} |
||||
} |
||||
|
||||
void hsSfxGlobalShade::Read(hsStream* s) |
||||
{ |
||||
fGSFlags = s->ReadSwap32(); |
||||
fAmbient.Read(s); |
||||
fDiffuse.Read(s); |
||||
if( fGSFlags & kFromLights ) |
||||
fGSFlags |= kAffectDiffuse; |
||||
} |
||||
|
||||
void hsSfxGlobalShade::Write(hsStream* s) |
||||
{ |
||||
s->WriteSwap32(fGSFlags); |
||||
fAmbient.Write(s); |
||||
fDiffuse.Write(s); |
||||
} |
||||
|
||||
hsSfxGlobalShade::hsSfxGlobalShade() |
||||
{ |
||||
fCurrentLayer = nil; |
||||
fGSFlags = 0; |
||||
fAmbient.Set(0,0,0,0); |
||||
fDiffuse.Set(1.f,1.f,1.f,1.f); |
||||
} |
||||
|
||||
hsSfxGlobalShade::~hsSfxGlobalShade() |
||||
{ |
||||
hsRefCnt_SafeUnRef(fCurrentLayer); // should be nil anyway unless we're destroyed during processing
|
||||
} |
||||
|
@ -1,120 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
|
||||
#ifndef hsSfxGlobalShade_inc |
||||
#define hsSfxGlobalShade_inc |
||||
|
||||
#include "hsBiExpander.h" |
||||
#include "hsGRenderProcs.h" |
||||
#include "hsColorRGBA.h" |
||||
#include "hsGeometry3.h" |
||||
|
||||
class hsGLayer; |
||||
|
||||
class hsSfxGlobalShade : public hsGRenderProcs { |
||||
public: |
||||
enum { |
||||
kNone = 0x0, |
||||
kFromFog = 0x1, |
||||
kFromClear = 0x2, |
||||
kFromLights = 0x4, |
||||
kSourceMask = kFromFog | kFromClear | kFromLights, |
||||
kScalarIntensity = 0x8, |
||||
kAffectDiffuse = 0x10 |
||||
}; |
||||
protected: |
||||
|
||||
// Constants from which to work.
|
||||
uint32_t fGSFlags; |
||||
|
||||
hsColorRGBA fAmbient; |
||||
hsColorRGBA fDiffuse; |
||||
|
||||
// Calculated each invocation.
|
||||
hsColorRGBA fIntensity; |
||||
|
||||
hsGLayer* fCurrentLayer; |
||||
hsColorRGBA fRestoreColor; |
||||
|
||||
void ISetIntensity(hsPoint3& pos); |
||||
void ISetFromFog(hsPoint3& pos); |
||||
void ISetFromClear(hsPoint3& pos); |
||||
void ISetFromLights(hsPoint3& pos); |
||||
hsColorRGBA ISumLights(hsPoint3& pos); |
||||
public: |
||||
hsSfxGlobalShade(); |
||||
virtual ~hsSfxGlobalShade(); |
||||
|
||||
virtual void ProcessPreInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList); |
||||
|
||||
virtual hsBool32 BeginObject(plPipeline* pipe, plDrawable* obj); |
||||
virtual void EndObject(); |
||||
|
||||
virtual void Read(hsStream* s); |
||||
virtual void Write(hsStream* s); |
||||
|
||||
virtual const char* GetLabel() const { return "hsSfxGlobalShade"; } |
||||
|
||||
virtual ProcType GetType() const { return kTypeGlobalShade; } |
||||
|
||||
void SetAmbient(const hsColorRGBA& col) { fAmbient = col; } |
||||
hsColorRGBA GetAmbient() const { return fAmbient; } |
||||
|
||||
void SetDiffuse(const hsColorRGBA& col) { fDiffuse = col; } |
||||
hsColorRGBA GetDiffuse() const { return fDiffuse; } |
||||
|
||||
void SetSource(uint32_t f) { fGSFlags &= ~kSourceMask; fGSFlags |= f; } |
||||
uint32_t GetSource() { return fGSFlags & kSourceMask; } |
||||
|
||||
void SetScalar(hsBool32 on) { if(on)fGSFlags |= kScalarIntensity; else fGSFlags &= ~kScalarIntensity; } |
||||
hsBool32 GetScalar() { return 0 != (fGSFlags & kScalarIntensity); } |
||||
|
||||
void SetAffectDiffuse(hsBool32 on) { if(on)fGSFlags |= kAffectDiffuse; else fGSFlags &= ~kAffectDiffuse; } |
||||
hsBool32 GetAffectDiffuse() { return 0 != (fGSFlags & kAffectDiffuse); } |
||||
|
||||
CLASSNAME_REGISTER( hsSfxGlobalShade ); |
||||
GETINTERFACE_ANY( hsSfxGlobalShade, hsGRenderProcs ); |
||||
|
||||
}; |
||||
|
||||
#endif // hsSfxGlobalShade_inc
|
@ -1,81 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
|
||||
#include "hsTypes.h" |
||||
#include "hsGeometry3.h" |
||||
#include "hsSfxIntenseAlpha.h" |
||||
#include "../plGeometry/hsTriangle3.h" |
||||
|
||||
|
||||
hsSfxIntenseAlpha::hsSfxIntenseAlpha() |
||||
: fMinAlpha(0) |
||||
{ |
||||
fFlags |= kInclusive; |
||||
} |
||||
|
||||
hsSfxIntenseAlpha::~hsSfxIntenseAlpha() |
||||
{ |
||||
} |
||||
|
||||
void hsSfxIntenseAlpha::ProcessPreInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList) |
||||
{ |
||||
hsScalar oScale = 1.f - fMinAlpha; |
||||
for( vList.First(); vList.More(); vList.Plus() ) |
||||
{ |
||||
hsGShadeVertex* s = vList.Current(); |
||||
hsScalar o = hsMaximum(hsMaximum(s->fShade.r, s->fShade.g), s->fShade.b); |
||||
o *= oScale; |
||||
o += fMinAlpha; |
||||
s->fShade.a *= o; |
||||
} |
||||
} |
||||
|
||||
void hsSfxIntenseAlpha::Read(hsStream* s) |
||||
{ |
||||
fMinAlpha = s->ReadSwapScalar(); |
||||
} |
||||
|
||||
void hsSfxIntenseAlpha::Write(hsStream* s) |
||||
{ |
||||
s->WriteSwapScalar(fMinAlpha); |
||||
} |
@ -1,82 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#ifndef hsSfxIntenseAlpha_inc |
||||
#define hsSfxIntenseAlpha_inc |
||||
|
||||
#include "hsGRenderProcs.h" |
||||
#include "hsGeometry3.h" |
||||
|
||||
class hsSfxIntenseAlpha : public hsGRenderProcs |
||||
{ |
||||
protected: |
||||
hsVector3 fDirViewPerp; |
||||
hsVector3 fDirScreen; |
||||
hsScalar fOpacityScale; |
||||
hsScalar fOpacityMax; |
||||
|
||||
hsScalar fMinAlpha; |
||||
|
||||
public: |
||||
hsSfxIntenseAlpha(); |
||||
virtual ~hsSfxIntenseAlpha(); |
||||
|
||||
void SetMinAlpha(hsScalar s) { fMinAlpha = s; } |
||||
hsScalar GetMinAlpha() { return fMinAlpha; } |
||||
|
||||
virtual void ProcessPreInterpShadeVerts(hsExpander<hsGShadeVertex*>& vList); |
||||
|
||||
virtual void Read(hsStream* s); |
||||
virtual void Write(hsStream* s); |
||||
|
||||
virtual const char* GetLabel() const { return "hsSfxIntenseAlpha"; } |
||||
|
||||
virtual ProcType GetType() const { return kTypeIntenseAlpha; } |
||||
|
||||
CLASSNAME_REGISTER( hsSfxIntenseAlpha ); |
||||
GETINTERFACE_ANY( hsSfxIntenseAlpha, hsGRenderProcs ); |
||||
|
||||
}; |
||||
|
||||
|
||||
|
||||
#endif // hsSfxIntenseAlpha_inc
|
@ -1,320 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#include "hsTypes.h" |
||||
#include "hsMemory.h" |
||||
#include "hsSfxObjDistFade.h" |
||||
#include "hsStream.h" |
||||
//#include "hsG3DDevice.h"
|
||||
#include "../plPipeline/plPipeline.h" |
||||
#include "../plGeometry/hsTriangle3.h" |
||||
|
||||
#include "../plIntersect/hsBounds.h" |
||||
#include "../plDrawable/plDrawable.h" |
||||
|
||||
static hsScalar globalScale = 1.f; |
||||
|
||||
hsSfxObjDistFade::hsSfxObjDistFade() |
||||
: fMinDist(0), fMaxDist(0), fTreeCnt(0) |
||||
{ |
||||
} |
||||
|
||||
hsSfxObjDistFade::~hsSfxObjDistFade() |
||||
{ |
||||
} |
||||
|
||||
hsScalar hsSfxObjDistFade::IOpacFromDist(hsScalar dist) |
||||
{ |
||||
if( dist <= fTable[0].fDistDel ) |
||||
return fTable[0].fOpacity; |
||||
|
||||
int i; |
||||
for( i = 0; (i < fTable.GetCount()) && (dist >= fTable[i].fDistDel); i++ ) |
||||
dist -= fTable[i].fDistDel; |
||||
|
||||
if( i >= fTable.GetCount() ) |
||||
return fTable[fTable.GetCount()-1].fOpacity; |
||||
|
||||
dist *= fTable[i-1].fDistNorm; |
||||
hsScalar opac0 = fTable[i-1].fOpacity; |
||||
hsScalar opac1 = fTable[i].fOpacity; |
||||
|
||||
return opac0 + dist * (opac1 - opac0); |
||||
} |
||||
|
||||
hsBool32 hsSfxObjDistFade::ISetOpac(plDrawable* refObj) |
||||
{ |
||||
hsPoint3 refPos; |
||||
if( fFlags & kByBoundsCenter ) |
||||
{ |
||||
const hsBounds3Ext& bnd = refObj->GetWorldBounds(); |
||||
if( kBoundsNormal != bnd.GetType() ) |
||||
return true; |
||||
refPos = bnd.GetCenter(); |
||||
} |
||||
else |
||||
{ |
||||
refObj->GetLocalToWorld().GetTranslate(&refPos); |
||||
} |
||||
|
||||
fFlags &= ~(kCulled | kNOP); |
||||
|
||||
hsPoint3 vPos; |
||||
if( GetObjectRef(1) ) |
||||
{ |
||||
GetObjectRef(1)->GetLocalToWorld().GetTranslate(&vPos); |
||||
} |
||||
else |
||||
{ |
||||
vPos = fPipeline->GetViewPositionWorld(); |
||||
} |
||||
|
||||
hsScalar dist = hsVector3(&vPos, &refPos).Magnitude(); |
||||
|
||||
if( (fFlags & kCullsBefore) |
||||
&&(dist <= fMinDist) ) |
||||
{ |
||||
fFlags |= kCulled; |
||||
return false; |
||||
} |
||||
|
||||
if( (fFlags & kCullsBeyond) |
||||
&&(dist > fMaxDist) ) |
||||
{ |
||||
fFlags |= kCulled; |
||||
return false; |
||||
} |
||||
|
||||
if( (fFlags & kIdleBefore) |
||||
&&(dist < fMinIdle) ) |
||||
fFlags |= kNOP; |
||||
else |
||||
if( (fFlags & kIdleBeyond) |
||||
&&(dist > fMaxIdle) ) |
||||
fFlags |= kNOP; |
||||
else |
||||
{ |
||||
hsScalar opac = IOpacFromDist(dist); |
||||
hsColorRGBA col = fColorizer.GetCurrentColor(); |
||||
if( fColorizer.Alpharizing() ) |
||||
col.a *= opac; |
||||
else |
||||
col.a = opac; |
||||
fColorizer.PushColorize(col, fColorizer.Colorizing()); |
||||
|
||||
if( fFlags & kNoZTrans ) |
||||
{ |
||||
if( !(fPipeline->GetMaterialOverrideOff(hsGMatState::kZ) & hsGMatState::kZNoZWrite) ) |
||||
{ |
||||
fRestoreOver = fPipeline->PushMaterialOverride(hsGMatState::kZ, hsGMatState::kZNoZWrite, true); |
||||
} |
||||
} |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
|
||||
hsBool32 hsSfxObjDistFade::BeginObject(plPipeline* pipe, plDrawable* obj) |
||||
{ |
||||
if( Inclusive() ) |
||||
return true; |
||||
|
||||
hsGRenderProcs::BeginObject(pipe, obj); |
||||
|
||||
#if 0 |
||||
// This is bogus. We may want to fade something, but not fade it out entirely.
|
||||
if( !(fFlags & (kCullsBefore | kCullsBeyond | kIdleBefore | kIdleBeyond)) ) |
||||
return true; |
||||
#endif |
||||
|
||||
plDrawable* refObj = fFlags & kObjectRefs ? GetObjectRef(0) : nil; |
||||
if( !refObj ) |
||||
refObj = obj; |
||||
|
||||
return ISetOpac(refObj); |
||||
} |
||||
|
||||
hsBool32 hsSfxObjDistFade::BeginTree(plPipeline* pipe, plDrawable* obj) |
||||
{ |
||||
if( !Inclusive() ) |
||||
return true; |
||||
|
||||
if( fTreeCnt++ ) |
||||
return true; |
||||
|
||||
hsGRenderProcs::BeginTree(pipe, obj); |
||||
|
||||
plDrawable* refObj = fFlags & kObjectRefs ? GetObjectRef(0) : nil; |
||||
if( !refObj ) |
||||
refObj = obj; |
||||
|
||||
return ISetOpac(refObj); |
||||
} |
||||
|
||||
void hsSfxObjDistFade::EndObject() |
||||
{ |
||||
if( !Inclusive() ) |
||||
{ |
||||
fPipeline->PopMaterialOverride(fRestoreOver, true); |
||||
} |
||||
hsGRenderProcs::EndObject(); |
||||
} |
||||
|
||||
void hsSfxObjDistFade::EndTree() |
||||
{ |
||||
if( Inclusive() ) |
||||
{ |
||||
fPipeline->PopMaterialOverride(fRestoreOver, true); |
||||
|
||||
fTreeCnt--; |
||||
hsAssert(fTreeCnt >= 0, "Push/Pop tree problem"); |
||||
} |
||||
hsGRenderProcs::EndTree(); |
||||
} |
||||
|
||||
void hsSfxObjDistFade::MakeTable(float* distList, float* opacList, int num) |
||||
{ |
||||
fTable.Reset(); |
||||
if( !num ) |
||||
return; |
||||
|
||||
int i; |
||||
for( i = 0; i < num; i++ ) |
||||
{ |
||||
hsSfxDfTableEntry* t = fTable.Append(); |
||||
t->fDistDel = distList[i]; |
||||
t->fOpacity = opacList[i]; |
||||
} |
||||
for( i = num-1; i > 0; i-- ) |
||||
fTable[i].fDistDel -= fTable[i-1].fDistDel; |
||||
for( i = 0; i < num-1; i++ ) |
||||
fTable[i].fDistNorm = hsScalarInvert(fTable[i+1].fDistDel); |
||||
fTable[num-1].fDistNorm = 0; |
||||
hsAssert(fTable.GetCount() == num, "Mismatch making table"); |
||||
|
||||
if( fTable[0].fOpacity <= 0 ) |
||||
fFlags |= kCullsBefore; |
||||
if( fTable[num-1].fOpacity <= 0 ) |
||||
fFlags |= kCullsBeyond; |
||||
if( fTable[0].fOpacity >= 1.f ) |
||||
fFlags |= kIdleBefore; |
||||
if( fTable[num-1].fOpacity >= 1.f ) |
||||
fFlags |= kIdleBeyond; |
||||
|
||||
int iMin; |
||||
for( iMin = 0; (iMin < fTable.GetCount())&&(fTable[iMin].fOpacity <= 0); iMin++ ); |
||||
fMinDist = fTable[0].fDistDel; |
||||
for( i = 1; i < iMin; i++ ) |
||||
fMinDist += fTable[i].fDistDel; |
||||
|
||||
for( iMin = 0; (iMin < fTable.GetCount())&&(fTable[iMin].fOpacity >= 1.f); iMin++ ); |
||||
fMinIdle = fTable[0].fDistDel; |
||||
for( i = 1; i < iMin; i++ ) |
||||
fMinIdle += fTable[i].fDistDel; |
||||
|
||||
int iMax; |
||||
for( iMax = fTable.GetCount()-1; (iMax >= 0)&&(fTable[iMax].fOpacity <= 0); iMax-- ); |
||||
if( ++iMax >= fTable.GetCount() ) |
||||
iMax = fTable.GetCount()-1; |
||||
fMaxDist = fTable[0].fDistDel; |
||||
for( i = 1; i <= iMax; i++ ) |
||||
fMaxDist += fTable[i].fDistDel; |
||||
|
||||
for( iMax = fTable.GetCount()-1; (iMax >= 0)&&(fTable[iMax].fOpacity >= 1.f); iMax-- ); |
||||
if( ++iMax >= fTable.GetCount() ) |
||||
iMax = fTable.GetCount()-1; |
||||
fMaxIdle = fTable[0].fDistDel; |
||||
for( i = 1; i <= iMax; i++ ) |
||||
fMaxIdle += fTable[i].fDistDel; |
||||
} |
||||
|
||||
void hsSfxObjDistFade::Read(hsStream* s) |
||||
{ |
||||
fTable.Reset(); |
||||
|
||||
fMinDist = s->ReadSwapScalar(); |
||||
fMaxDist = s->ReadSwapScalar(); |
||||
|
||||
if( fFlags & (kIdleBefore | kIdleBeyond) ) |
||||
{ |
||||
fMinIdle = s->ReadSwapScalar(); |
||||
fMaxIdle = s->ReadSwapScalar(); |
||||
} |
||||
|
||||
int32_t cnt = s->ReadSwap32(); |
||||
|
||||
if( cnt ) |
||||
{ |
||||
hsSfxDfTableEntry* arr = new hsSfxDfTableEntry[cnt]; |
||||
int i; |
||||
for( i = 0; i < cnt; i++ ) |
||||
{ |
||||
arr[i].fDistDel = s->ReadSwapScalar(); |
||||
arr[i].fDistNorm = s->ReadSwapScalar(); |
||||
arr[i].fOpacity = s->ReadSwapScalar(); |
||||
} |
||||
|
||||
fTable.SetArray(arr, cnt); |
||||
} |
||||
} |
||||
|
||||
void hsSfxObjDistFade::Write(hsStream* s) |
||||
{ |
||||
s->WriteSwapScalar(fMinDist); |
||||
s->WriteSwapScalar(fMaxDist); |
||||
|
||||
if( fFlags & (kIdleBefore | kIdleBeyond) ) |
||||
{ |
||||
s->WriteSwapScalar(fMinIdle); |
||||
s->WriteSwapScalar(fMaxIdle); |
||||
} |
||||
|
||||
s->WriteSwap32(fTable.GetCount()); |
||||
|
||||
for( fTable.First(); fTable.More(); fTable.Plus() ) |
||||
{ |
||||
s->WriteSwapScalar(fTable.Current().fDistDel); |
||||
s->WriteSwapScalar(fTable.Current().fDistNorm); |
||||
s->WriteSwapScalar(fTable.Current().fOpacity); |
||||
} |
||||
} |
||||
|
@ -1,116 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#ifndef hsSfxObjDistFade_inc |
||||
#define hsSfxObjDistFade_inc |
||||
|
||||
#include "hsBiExpander.h" |
||||
#include "hsGRenderProcs.h" |
||||
#include "../plPipeline/hsGMatState.h" |
||||
|
||||
class hsSfxObjDistFade : public hsGRenderProcs { |
||||
public: |
||||
enum { |
||||
kCullsBefore = 0x10000, |
||||
kCullsBeyond = 0x20000, |
||||
|
||||
kDistFromView = 0x40000, |
||||
kDistFromTarget = 0x80000, |
||||
kDistAlongX = 0x100000, |
||||
kZOff = 0x200000, |
||||
kNoZTrans = 0x400000, |
||||
kByBoundsCenter = 0x800000, |
||||
|
||||
kPostInterp = 0x1000000, |
||||
|
||||
kIdleBefore = 0x2000000, |
||||
kIdleBeyond = 0x4000000, |
||||
|
||||
kZWasOff = 0x8000000 |
||||
}; |
||||
|
||||
struct hsSfxDfTableEntry { |
||||
hsScalar fDistDel; |
||||
hsScalar fDistNorm; |
||||
hsScalar fOpacity; |
||||
}; |
||||
protected: |
||||
|
||||
hsScalar fMinDist; |
||||
hsScalar fMaxDist; |
||||
|
||||
hsScalar fMinIdle; |
||||
hsScalar fMaxIdle; |
||||
|
||||
int32_t fTreeCnt; |
||||
|
||||
hsExpander<hsSfxDfTableEntry> fTable; |
||||
|
||||
hsGMatState fRestoreOver; |
||||
|
||||
hsBool32 ISetOpac(plDrawable* refObj); |
||||
hsScalar IOpacFromDist(hsScalar dist); |
||||
public: |
||||
hsSfxObjDistFade(); |
||||
virtual ~hsSfxObjDistFade(); |
||||
|
||||
virtual hsBool32 BeginTree(plPipeline* pipe, plDrawable* root); |
||||
virtual hsBool32 BeginObject(plPipeline* pipe, plDrawable* obj); |
||||
|
||||
virtual void EndObject(); |
||||
virtual void EndTree(); |
||||
|
||||
void MakeTable(float* distList, float* opacList, int num); // lists sorted from lowest cosine to highest
|
||||
|
||||
virtual void Read(hsStream* s); |
||||
virtual void Write(hsStream* s); |
||||
|
||||
virtual const char* GetLabel() const { return "hsSfxObjDistFade"; } |
||||
|
||||
virtual ProcType GetType() const { return kTypeObjDistFade; } |
||||
|
||||
CLASSNAME_REGISTER( hsSfxObjDistFade ); |
||||
GETINTERFACE_ANY( hsSfxObjDistFade, hsGRenderProcs ); |
||||
|
||||
}; |
||||
|
||||
#endif // hsSfxObjDistFade_inc
|
@ -1,217 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#include "hsTypes.h" |
||||
#include "hsMemory.h" |
||||
#include "hsSfxObjDistShade.h" |
||||
#include "hsStream.h" |
||||
#include "../plPipeline/plPipeline.h" |
||||
#include "../plGeometry/hsTriangle3.h" |
||||
|
||||
#include "../plIntersect/hsBounds.h" |
||||
#include "../plDrawable/plDrawable.h" |
||||
|
||||
static hsScalar globalScale = 1.f; |
||||
|
||||
hsSfxObjDistShade::hsSfxObjDistShade() |
||||
: fMinDist(0), fMaxDist(0), fTreeCnt(0) |
||||
{ |
||||
} |
||||
|
||||
hsSfxObjDistShade::~hsSfxObjDistShade() |
||||
{ |
||||
} |
||||
|
||||
hsScalar hsSfxObjDistShade::IShadeFromDist(hsScalar dist) |
||||
{ |
||||
if( dist <= fTable[0].fDistDel ) |
||||
return fTable[0].fShade; |
||||
|
||||
int i; |
||||
for( i = 0; (i < fTable.GetCount()) && (dist >= fTable[i].fDistDel); i++ ) |
||||
dist -= fTable[i].fDistDel; |
||||
|
||||
if( i >= fTable.GetCount() ) |
||||
return fTable[fTable.GetCount()-1].fShade; |
||||
|
||||
dist *= fTable[i-1].fDistNorm; |
||||
hsScalar shade0 = fTable[i-1].fShade; |
||||
hsScalar shade1 = fTable[i].fShade; |
||||
|
||||
return shade0 + dist * (shade1 - shade0); |
||||
} |
||||
|
||||
hsBool32 hsSfxObjDistShade::ISetShade(plDrawable* refObj) |
||||
{ |
||||
hsPoint3 refPos; |
||||
if( fFlags & kByBoundsCenter ) |
||||
{ |
||||
const hsBounds3Ext& bnd = refObj->GetWorldBounds(); |
||||
if( kBoundsNormal != bnd.GetType() ) |
||||
return true; |
||||
refPos = bnd.GetCenter(); |
||||
} |
||||
else |
||||
{ |
||||
refObj->GetLocalToWorld().GetTranslate(&refPos); |
||||
} |
||||
|
||||
hsPoint3 vPos; |
||||
if( GetObjectRef(1) ) |
||||
{ |
||||
GetObjectRef(1)->GetLocalToWorld().GetTranslate(&vPos); |
||||
} |
||||
else |
||||
{ |
||||
vPos = fPipeline->GetViewPositionWorld(); |
||||
} |
||||
|
||||
hsScalar dist = hsVector3(&vPos, &refPos).Magnitude(); |
||||
|
||||
hsScalar shade = IShadeFromDist(dist); |
||||
|
||||
hsColorRGBA col = fColorizer.GetCurrentColor(); |
||||
if( fColorizer.Colorizing() ) |
||||
{ |
||||
col.r *= shade; |
||||
col.g *= shade; |
||||
col.b *= shade; |
||||
} |
||||
else |
||||
{ |
||||
col.r = shade; |
||||
col.g = shade; |
||||
col.b = shade; |
||||
} |
||||
fColorizer.PushColorize(col, false); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
|
||||
|
||||
hsBool32 hsSfxObjDistShade::BeginObject(plPipeline* pipe, plDrawable* obj) |
||||
{ |
||||
hsGRenderProcs::BeginObject(pipe, obj); |
||||
|
||||
plDrawable* refObj = fFlags & kObjectRefs ? GetObjectRef(0) : nil; |
||||
if( !refObj ) |
||||
refObj = obj; |
||||
|
||||
return ISetShade(refObj); |
||||
} |
||||
|
||||
void hsSfxObjDistShade::MakeTable(float* distList, float* shadeList, int num) |
||||
{ |
||||
fTable.Reset(); |
||||
if( !num ) |
||||
return; |
||||
|
||||
int i; |
||||
for( i = 0; i < num; i++ ) |
||||
{ |
||||
hsSfxDfTableEntry* t = fTable.Append(); |
||||
t->fDistDel = distList[i]; |
||||
t->fShade = shadeList[i]; |
||||
} |
||||
for( i = num-1; i > 0; i-- ) |
||||
fTable[i].fDistDel -= fTable[i-1].fDistDel; |
||||
for( i = 0; i < num-1; i++ ) |
||||
fTable[i].fDistNorm = hsScalarInvert(fTable[i+1].fDistDel); |
||||
fTable[num-1].fDistNorm = 0; |
||||
hsAssert(fTable.GetCount() == num, "Mismatch making table"); |
||||
|
||||
int iMin; |
||||
for( iMin = 0; (iMin < fTable.GetCount())&&(fTable[iMin].fShade <= 0); iMin++ ); |
||||
fMinDist = fTable[0].fDistDel; |
||||
for( i = 1; i < iMin; i++ ) |
||||
fMinDist += fTable[i].fDistDel; |
||||
|
||||
int iMax; |
||||
for( iMax = fTable.GetCount()-1; (iMax >= 0)&&(fTable[iMax].fShade <= 0); iMax-- ); |
||||
if( ++iMax >= fTable.GetCount() ) |
||||
iMax = fTable.GetCount()-1; |
||||
fMaxDist = fTable[0].fDistDel; |
||||
for( i = 1; i <= iMax; i++ ) |
||||
fMaxDist += fTable[i].fDistDel; |
||||
|
||||
} |
||||
|
||||
void hsSfxObjDistShade::Read(hsStream* s) |
||||
{ |
||||
fTable.Reset(); |
||||
|
||||
fMinDist = s->ReadSwapScalar(); |
||||
fMaxDist = s->ReadSwapScalar(); |
||||
|
||||
int32_t cnt = s->ReadSwap32(); |
||||
|
||||
if( cnt ) |
||||
{ |
||||
hsSfxDfTableEntry* arr = new hsSfxDfTableEntry[cnt]; |
||||
int i; |
||||
for( i = 0; i < cnt; i++ ) |
||||
{ |
||||
arr[i].fDistDel = s->ReadSwapScalar(); |
||||
arr[i].fDistNorm = s->ReadSwapScalar(); |
||||
arr[i].fShade = s->ReadSwapScalar(); |
||||
} |
||||
|
||||
fTable.SetArray(arr, cnt); |
||||
} |
||||
} |
||||
|
||||
void hsSfxObjDistShade::Write(hsStream* s) |
||||
{ |
||||
s->WriteSwapScalar(fMinDist); |
||||
s->WriteSwapScalar(fMaxDist); |
||||
|
||||
s->WriteSwap32(fTable.GetCount()); |
||||
|
||||
for( fTable.First(); fTable.More(); fTable.Plus() ) |
||||
{ |
||||
s->WriteSwapScalar(fTable.Current().fDistDel); |
||||
s->WriteSwapScalar(fTable.Current().fDistNorm); |
||||
s->WriteSwapScalar(fTable.Current().fShade); |
||||
} |
||||
} |
||||
|
@ -1,98 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#ifndef hsSfxObjDistShade_inc |
||||
#define hsSfxObjDistShade_inc |
||||
|
||||
#include "hsBiExpander.h" |
||||
#include "hsGRenderProcs.h" |
||||
|
||||
class hsSfxObjDistShade : public hsGRenderProcs { |
||||
public: |
||||
enum { |
||||
kShadeConstant = 0x10000, |
||||
kByBoundsCenter = 0x800000, |
||||
|
||||
}; |
||||
|
||||
struct hsSfxDfTableEntry { |
||||
hsScalar fDistDel; |
||||
hsScalar fDistNorm; |
||||
hsScalar fShade; |
||||
}; |
||||
protected: |
||||
|
||||
hsScalar fMinDist; |
||||
hsScalar fMaxDist; |
||||
|
||||
hsScalar fConstShade; |
||||
|
||||
hsScalar fMinIdle; |
||||
hsScalar fMaxIdle; |
||||
|
||||
int32_t fTreeCnt; |
||||
|
||||
hsExpander<hsSfxDfTableEntry> fTable; |
||||
|
||||
hsBool32 ISetShade(plDrawable* refObj); |
||||
hsScalar IShadeFromDist(hsScalar dist); |
||||
public: |
||||
hsSfxObjDistShade(); |
||||
virtual ~hsSfxObjDistShade(); |
||||
|
||||
virtual hsBool32 BeginObject(plPipeline* pipe, plDrawable* obj); |
||||
|
||||
void MakeTable(float* distList, float* shadeList, int num); // lists sorted from lowest cosine to highest
|
||||
|
||||
virtual void Read(hsStream* s); |
||||
virtual void Write(hsStream* s); |
||||
|
||||
virtual const char* GetLabel() const { return "hsSfxObjDistShade"; } |
||||
|
||||
virtual ProcType GetType() const { return kTypeObjDistShade; } |
||||
|
||||
CLASSNAME_REGISTER( hsSfxObjDistShade ); |
||||
GETINTERFACE_ANY( hsSfxObjDistShade, hsGRenderProcs ); |
||||
|
||||
}; |
||||
|
||||
#endif // hsSfxObjDistShade_inc
|
@ -1,80 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#ifndef plGRenderProcsCreatable_inc |
||||
#define plGRenderProcsCreatable_inc |
||||
|
||||
#include "../plResMgr/plCreator.h" |
||||
|
||||
#include "hsGRenderProcs.h" |
||||
|
||||
REGISTER_NONCREATABLE( hsGRenderProcs ); |
||||
|
||||
#include "hsSfxAngleFade.h" |
||||
|
||||
REGISTER_CREATABLE( hsSfxAngleFade ); |
||||
|
||||
#include "hsSfxDistFade.h" |
||||
|
||||
REGISTER_CREATABLE( hsSfxDistFade ); |
||||
|
||||
#include "hsSfxDistShade.h" |
||||
|
||||
REGISTER_CREATABLE( hsSfxDistShade ); |
||||
|
||||
#include "hsSfxGlobalShade.h" |
||||
|
||||
REGISTER_CREATABLE( hsSfxGlobalShade ); |
||||
|
||||
#include "hsSfxIntenseAlpha.h" |
||||
|
||||
REGISTER_CREATABLE( hsSfxIntenseAlpha ); |
||||
|
||||
#include "hsSfxObjDistFade.h" |
||||
|
||||
REGISTER_CREATABLE( hsSfxObjDistFade ); |
||||
|
||||
#include "hsSfxObjDistShade.h" |
||||
|
||||
REGISTER_CREATABLE( hsSfxObjDistShade ); |
||||
|
||||
#endif // plGRenderProcsCreatable_inc
|
@ -1,763 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#include "hsTypes.h" |
||||
#include "hsStream.h" |
||||
#include "hsOscillator.h" |
||||
#include "../plMath/hsFastMath.h" |
||||
#include "hsGTriMesh.h" |
||||
#include "hsTriangle3.h" |
||||
#include "../plPipeline/plPipeline.h" |
||||
|
||||
#if defined(__MWERKS__) && !defined(HS_DEBUGGING) |
||||
#pragma optimization_level 0 |
||||
#endif |
||||
|
||||
static hsScalar rnd0_1() |
||||
{ |
||||
return hsScalar(rand()) / hsScalar(RAND_MAX); |
||||
} |
||||
|
||||
void hsWave::Save(hsStream* s, hsScalar secs) |
||||
{ |
||||
fWorldCenter.Write(s); |
||||
|
||||
s->WriteSwapScalar(fWorldFrequency); |
||||
|
||||
s->WriteSwapScalar(fWorldAmplitude); |
||||
|
||||
s->WriteSwapScalar(fPhase); |
||||
s->WriteSwapScalar(fRate); |
||||
|
||||
s->WriteSwapScalar(secs - fStartSecs); |
||||
|
||||
s->WriteSwapScalar(fSecsToLive); |
||||
} |
||||
|
||||
void hsWave::Load(hsStream* s, hsScalar secs) |
||||
{ |
||||
fWorldCenter.Read(s); |
||||
|
||||
fWorldFrequency = s->ReadSwapScalar(); |
||||
|
||||
fWorldAmplitude = s->ReadSwapScalar(); |
||||
|
||||
fPhase = s->ReadSwapScalar(); |
||||
fRate = s->ReadSwapScalar(); |
||||
|
||||
fStartSecs = s->ReadSwapScalar(); |
||||
fStartSecs = secs - fStartSecs; |
||||
|
||||
fSecsToLive = s->ReadSwapScalar(); |
||||
} |
||||
|
||||
void hsWave::Init(hsScalar secs, hsPoint3& center, hsScalar per, hsScalar amp, hsScalar rate, hsScalar life, hsBool32 attenOut) |
||||
{ |
||||
fStartSecs = secs; |
||||
fWorldCenter = center; |
||||
fWorldFrequency = hsScalarInvert(per); |
||||
fWorldAmplitude = amp; |
||||
fRate = rate; |
||||
fSecsToLive = life; |
||||
AttenuateOut(attenOut); |
||||
} |
||||
|
||||
hsBool32 hsWave::IsSpent(hsScalar secs) const |
||||
{
|
||||
return secs - fStartSecs > fSecsToLive; |
||||
} |
||||
|
||||
void hsWave::Accumulate(const hsPoint3& pos, const hsVector3& localZ, hsVector3& accum, hsVector3& accumNorm) const |
||||
{ |
||||
hsVector3 del(&pos, &fLocalCenter); |
||||
hsScalar dot = del.InnerProduct(localZ); |
||||
dot *= -2.f; |
||||
del += localZ * dot; |
||||
|
||||
hsScalar dist = del.MagnitudeSquared(); |
||||
dist = hsFastMath::InvSqrtAppr(dist); |
||||
del *= dist; |
||||
dist = hsScalarInvert(dist); |
||||
|
||||
hsScalar ampl = fLocalAmplitude; |
||||
if( fAttenuateOutScale > 0 ) |
||||
{ |
||||
if( dist > fInnerRadius ) |
||||
{ |
||||
if( dist > fOuterRadius ) |
||||
return; |
||||
ampl *= fOuterRadius - dist; |
||||
ampl *= fAttenuateOutScale; |
||||
} |
||||
} |
||||
|
||||
dist *= fLocalFrequency; |
||||
dist += fPhase; |
||||
|
||||
hsScalar s, c; |
||||
hsFastMath::SinCosAppr(dist, s, c); |
||||
|
||||
s *= ampl; |
||||
s += ampl; |
||||
c *= ampl * fLocalFrequency; |
||||
|
||||
// accum += s * localZ;
|
||||
accum.fZ += s / localZ.fZ; |
||||
|
||||
hsVector3 norm; |
||||
norm = localZ; |
||||
norm += del * -c; |
||||
accumNorm += norm; |
||||
|
||||
return; |
||||
} |
||||
|
||||
void hsWave::Update(hsScalar secs, const hsMatrix44& l2w, const hsMatrix44& w2l) |
||||
{ |
||||
if( l2w.fFlags & hsMatrix44::kIsIdent ) |
||||
{ |
||||
fLocalCenter = fWorldCenter; |
||||
fLocalFrequency = fWorldFrequency; |
||||
fLocalAmplitude = fWorldAmplitude; |
||||
} |
||||
else |
||||
{ |
||||
hsVector3 ax; |
||||
ax.Set(w2l.fMap[0][2], w2l.fMap[1][2], w2l.fMap[2][2]); |
||||
hsScalar ooScale = ax.MagnitudeSquared(); |
||||
ooScale = hsFastMath::InvSqrtAppr(ooScale); |
||||
|
||||
fLocalCenter = w2l * fWorldCenter; |
||||
fLocalFrequency = fWorldFrequency * ooScale; |
||||
|
||||
hsScalar scale = 1.f / ooScale; |
||||
fLocalAmplitude = fWorldAmplitude * scale; |
||||
} |
||||
fLocalAmplitude *= AgeScale(secs); |
||||
|
||||
if( fAttenuateOutScale > 0 ) |
||||
{ |
||||
fInnerRadius = fRate * (secs - fStartSecs) * hsScalarPI * 2.f; |
||||
fOuterRadius = fInnerRadius * (5.f/4.f); |
||||
fAttenuateOutScale = hsScalarInvert(fOuterRadius - fInnerRadius); |
||||
} |
||||
|
||||
fPhase = -(secs - fStartSecs) * fRate * hsScalarPI * 2.f; |
||||
} |
||||
|
||||
hsScalar hsWave::ScaledAmplitude(hsScalar secs) const |
||||
{ |
||||
return fWorldAmplitude * AgeScale(secs); |
||||
} |
||||
|
||||
hsScalar hsWave::AgeScale(hsScalar secs) const |
||||
{ |
||||
hsScalar age = secs - fStartSecs; |
||||
extern int dbgCurrentTest; |
||||
if( dbgCurrentTest ) |
||||
{ |
||||
age *= 4.f; |
||||
age -= 2.f * fSecsToLive; |
||||
if( age < 0 ) |
||||
age = -age; |
||||
age -= fSecsToLive; |
||||
} |
||||
else |
||||
{ |
||||
age *= 2.f; |
||||
age -= fSecsToLive; |
||||
if( age < 0 ) |
||||
age = -age; |
||||
} |
||||
hsScalar ageScale = 1.f - age / fSecsToLive; |
||||
if( ageScale < 0 ) |
||||
ageScale = 0; |
||||
else if( ageScale > 1.f ) |
||||
ageScale = 1.f; |
||||
return ageScale; |
||||
} |
||||
|
||||
hsOscillator::hsOscillator() |
||||
{ |
||||
} |
||||
|
||||
hsOscillator::~hsOscillator() |
||||
{ |
||||
} |
||||
|
||||
hsWave& hsOscillator::GetWeakestWave(hsScalar secs) |
||||
{ |
||||
hsAssert(!GetDisabled(), "Shouldn't be messing with disabled oscillator system"); |
||||
int weakest = 0; |
||||
hsScalar amp = fWaves[0].ScaledAmplitude(secs); |
||||
int i; |
||||
for( i = 0; i < fWaves.GetCount(); i++ ) |
||||
{ |
||||
hsScalar tAmp = fWaves[i].ScaledAmplitude(secs); |
||||
if( tAmp < amp ) |
||||
{ |
||||
weakest = i; |
||||
amp = tAmp; |
||||
} |
||||
} |
||||
return fWaves[weakest]; |
||||
} |
||||
|
||||
hsWave& hsOscillator::GetTempWave(hsScalar secs) |
||||
{ |
||||
int i; |
||||
for( i = 0; i < fTempWaves.GetCount(); i++ ) |
||||
{ |
||||
if( fTempWaves[i].IsSpent(secs) ) |
||||
return fTempWaves[i]; |
||||
} |
||||
fTempWaves.Push(); |
||||
return fTempWaves[fTempWaves.GetCount()-1]; |
||||
} |
||||
|
||||
void hsOscillator::ISpawnWave(hsScalar secs, int i) |
||||
{ |
||||
hsPoint3 corner; |
||||
fWorldCenterBounds.GetCorner(&corner); |
||||
hsVector3 ax[3]; |
||||
fWorldCenterBounds.GetAxes(ax+0, ax+1, ax+2); |
||||
hsScalar r; |
||||
r = rnd0_1(); |
||||
ax[0] *= r; |
||||
corner += ax[0]; |
||||
r = rnd0_1(); |
||||
ax[1] *= r; |
||||
corner += ax[1]; |
||||
r = rnd0_1(); |
||||
ax[2] *= r; |
||||
corner += ax[2]; |
||||
|
||||
hsScalar per = fMinPeriod; |
||||
r = rnd0_1(); |
||||
hsScalar rr = r; |
||||
r *= fMaxPeriod - fMinPeriod; |
||||
per += r; |
||||
|
||||
hsScalar amp = fMinAmplitude; |
||||
r = rr * rnd0_1(); |
||||
r *= fMaxAmplitude - fMinAmplitude; |
||||
amp += r; |
||||
|
||||
hsScalar life = fMinLife; |
||||
r = rnd0_1(); |
||||
r *= fMaxLife - fMinLife; |
||||
life += r; |
||||
|
||||
hsScalar rate = fMinRate; |
||||
r = rnd0_1(); |
||||
r *= fMaxRate - fMinRate; |
||||
rate += r; |
||||
|
||||
fWaves[i].Init(secs, corner, per, amp, rate, life); |
||||
|
||||
} |
||||
|
||||
void hsOscillator::IUpdate(hsScalar secs, plPipeline* pipe, const hsMatrix44& l2w, const hsMatrix44& w2l) |
||||
{ |
||||
if( GetDisabled() ) |
||||
return; |
||||
|
||||
fWorldCenter = pipe->GetViewPositionWorld(); |
||||
fWorldCenter.fZ = (fWorldCenterBounds.GetMins().fZ + fWorldCenterBounds.GetMaxs().fZ) * 0.5f; |
||||
fLocalCenter = w2l * fWorldCenter; |
||||
|
||||
fLocalToWorld = l2w; |
||||
fWorldToLocal = w2l; |
||||
|
||||
fLocalX.Set(w2l.fMap[0][0],w2l.fMap[1][0],w2l.fMap[2][0]); |
||||
fLocalX.Normalize(); |
||||
fLocalY.Set(w2l.fMap[0][1],w2l.fMap[1][1],w2l.fMap[2][1]); |
||||
fLocalY.Normalize(); |
||||
fLocalZ.Set(w2l.fMap[0][2],w2l.fMap[1][2],w2l.fMap[2][2]); |
||||
fLocalZ.Normalize(); |
||||
|
||||
hsVector3 ax; |
||||
hsScalar ooScale; |
||||
ax.Set(w2l.fMap[0][0], w2l.fMap[1][0], w2l.fMap[2][0]); |
||||
ooScale = ax.MagnitudeSquared(); |
||||
ooScale = hsFastMath::InvSqrtAppr(ooScale); |
||||
fLocalAttenScale.fX = fWorldAttenScale.fX * ooScale; |
||||
|
||||
ax.Set(w2l.fMap[0][1], w2l.fMap[1][1], w2l.fMap[2][1]); |
||||
ooScale = ax.MagnitudeSquared(); |
||||
ooScale = hsFastMath::InvSqrtAppr(ooScale); |
||||
fLocalAttenScale.fY = fWorldAttenScale.fY * ooScale; |
||||
|
||||
fLocalAttenScale.fZ = 0; |
||||
|
||||
int i; |
||||
for( i = 0; i < fWaves.GetCount(); i++ ) |
||||
{ |
||||
if( fWaves[i].IsSpent(secs) ) |
||||
ISpawnWave(secs, i); |
||||
fWaves[i].Update(secs, l2w, w2l); |
||||
} |
||||
for( i = 0; i < fTempWaves.GetCount(); i++ ) |
||||
{ |
||||
while( (i < fTempWaves.GetCount()) && fTempWaves[i].IsSpent(secs) ) |
||||
fTempWaves.Remove(i, 1); |
||||
if( i < fTempWaves.GetCount() ) |
||||
fTempWaves[i].Update(secs, l2w, w2l); |
||||
} |
||||
} |
||||
|
||||
hsScalar hsOscillator::IAttenuate(const hsPoint3& in) const
|
||||
{ |
||||
const hsPoint3& cen = fLocalCenter; |
||||
hsVector3 del(&in, &cen); |
||||
|
||||
hsScalar atX = del.InnerProduct(fLocalX); |
||||
atX *= fLocalAttenScale.fX; |
||||
if( atX > 0 ) |
||||
atX = -atX; |
||||
atX += 1.f; |
||||
if( atX < 0 ) |
||||
atX = 0; |
||||
|
||||
hsScalar atY = del.InnerProduct(fLocalY); |
||||
atY *= fLocalAttenScale.fY; |
||||
if( atY > 0 ) |
||||
atY = -atY; |
||||
atY += 1.f; |
||||
if( atY < 0 ) |
||||
atY = 0; |
||||
|
||||
hsScalar at = atX * atY; |
||||
return at; |
||||
} |
||||
|
||||
void hsOscillator::AdjustWorldBounds(const hsMatrix44& l2w, const hsMatrix44& w2l, hsBounds3Ext& bnd) const |
||||
{ |
||||
if( GetDisabled() ) |
||||
return; |
||||
|
||||
hsVector3 adj; |
||||
adj.Set(0,1.f/fLocalZ.fZ,0); |
||||
adj = l2w * adj; |
||||
adj *= fMaxAmplitude * fWaves.GetCount(); |
||||
|
||||
bnd.Union(&adj); |
||||
adj = -adj; |
||||
bnd.Union(&adj); |
||||
} |
||||
|
||||
void hsOscillator::IPerterb(const hsPoint3& in, hsGVertex3& out) const |
||||
{ |
||||
hsPoint3 pos = in; |
||||
hsVector3 del(&pos, &fLocalCenter); |
||||
hsScalar dot = del.InnerProduct(fLocalZ); |
||||
pos += fLocalZ * -dot; |
||||
|
||||
hsVector3 accum; |
||||
hsVector3 accumNorm; |
||||
accum.Set(0,0,0); |
||||
accumNorm.Set(0,0,0); |
||||
int i; |
||||
for( i = 0; i < fWaves.GetCount(); i++ ) |
||||
{ |
||||
fWaves[i].Accumulate(pos, fLocalZ, accum, accumNorm); |
||||
} |
||||
for( i = 0; i < fTempWaves.GetCount(); i++ ) |
||||
{ |
||||
fTempWaves[i].Accumulate(pos, fLocalZ, accum, accumNorm); |
||||
} |
||||
hsScalar atten = IAttenuate(pos); |
||||
static int attenuating = 1; |
||||
if( attenuating ) // nuke me
|
||||
accum *= atten; |
||||
out.fLocalPos = in + accum; |
||||
|
||||
hsScalar invNorm = hsFastMath::InvSqrtAppr(accumNorm.MagnitudeSquared()); |
||||
accumNorm *= invNorm; |
||||
out.fNormal = accumNorm; |
||||
} |
||||
|
||||
void hsOscillator::Read(hsStream* s) |
||||
{ |
||||
int n = s->ReadSwap32(); |
||||
SetNumWaves(n); |
||||
|
||||
fWorldAttenScale.Read(s); |
||||
fWorldCenterBounds.Read(s); |
||||
|
||||
fMinPeriod = s->ReadSwapScalar(); |
||||
fMaxPeriod = s->ReadSwapScalar(); |
||||
|
||||
fMinAmplitude = s->ReadSwapScalar(); |
||||
fMaxAmplitude = s->ReadSwapScalar(); |
||||
|
||||
fMinRate = s->ReadSwapScalar(); |
||||
fMaxRate = s->ReadSwapScalar(); |
||||
|
||||
fMinLife = s->ReadSwapScalar(); |
||||
fMaxLife = s->ReadSwapScalar(); |
||||
|
||||
int i; |
||||
for( i = 0; i < fWaves.GetCount(); i++ ) |
||||
fWaves[i].Kill(); |
||||
|
||||
fTempWaves.Reset(); |
||||
} |
||||
|
||||
void hsOscillator::Load(hsStream* s, hsScalar secs) |
||||
{ |
||||
Read(s); |
||||
|
||||
int i; |
||||
for( i = 0; i < fWaves.GetCount(); i++ ) |
||||
fWaves[i].Load(s, secs); |
||||
|
||||
fTempWaves.Reset(); |
||||
} |
||||
|
||||
void hsOscillator::Write(hsStream* s) |
||||
{ |
||||
s->WriteSwap32(fWaves.GetCount()); |
||||
|
||||
fWorldAttenScale.Write(s); |
||||
fWorldCenterBounds.Write(s); |
||||
|
||||
s->WriteSwapScalar(fMinPeriod); |
||||
s->WriteSwapScalar(fMaxPeriod); |
||||
|
||||
s->WriteSwapScalar(fMinAmplitude); |
||||
s->WriteSwapScalar(fMaxAmplitude); |
||||
|
||||
s->WriteSwapScalar(fMinRate); |
||||
s->WriteSwapScalar(fMaxRate); |
||||
|
||||
s->WriteSwapScalar(fMinLife); |
||||
s->WriteSwapScalar(fMaxLife); |
||||
|
||||
} |
||||
|
||||
void hsOscillator::Save(hsStream* s, hsScalar secs) |
||||
{ |
||||
Write(s); |
||||
|
||||
int i; |
||||
for( i = 0; i < fWaves.GetCount(); i++ ) |
||||
fWaves[i].Save(s, secs); |
||||
} |
||||
|
||||
void hsOscillator::SetNumWaves(int n) |
||||
{ |
||||
fWaves.SetCount(n); |
||||
int i; |
||||
for( i = 0; i < n; i++ ) |
||||
fWaves[i].Kill(); |
||||
} |
||||
|
||||
void hsOscillator::Init(int32_t nParams, hsScalar* params) |
||||
{ |
||||
// NumWaves = 1
|
||||
// AttenScale = 2
|
||||
// WorldCenterBounds = 6
|
||||
// Period = 2
|
||||
// Amp = 2
|
||||
// Rate = 2
|
||||
// Life = 2
|
||||
|
||||
hsAssert(17 == nParams, "Parameter input mismatch"); |
||||
|
||||
SetNumWaves(int(*params++)); |
||||
|
||||
fWorldAttenScale.fX = *params++; |
||||
fWorldAttenScale.fY = *params++; |
||||
fWorldAttenScale.fZ = 0; |
||||
|
||||
hsPoint3 pt; |
||||
hsBounds3Ext bnd; |
||||
pt.fX = *params++; |
||||
pt.fY = *params++; |
||||
pt.fZ = *params++; |
||||
bnd.Reset(&pt); |
||||
pt.fX = *params++; |
||||
pt.fY = *params++; |
||||
pt.fZ = *params++; |
||||
bnd.Union(&pt); |
||||
SetWorldCenterBounds(bnd); |
||||
|
||||
SetPeriodRange(params[0], params[1]); |
||||
params += 2; |
||||
|
||||
SetAmplitudeRange(params[0], params[1]); |
||||
params += 2; |
||||
|
||||
SetRateRange(params[0], params[1]); |
||||
params += 2; |
||||
|
||||
SetLifeRange(params[0], params[1]); |
||||
|
||||
fTempWaves.Reset(); |
||||
} |
||||
|
||||
|
||||
#if 1 |
||||
hsGTriMesh* hsOscillator::MakeWaveMesh(int nSpokes, const hsPoint3& center, hsScalar minRad, hsScalar maxRad, hsScalar uRange, hsScalar vRange, hsScalar attenStartFrac, hsBool32 stitch) |
||||
{ |
||||
hsGTriMesh* triMesh = new hsGTriMesh; |
||||
|
||||
hsTArray<hsScalar> radii; |
||||
hsScalar cRad = 0; |
||||
while( cRad < maxRad ) |
||||
{ |
||||
// OOPS - for the half circle, this should be PI*R/n, not 2PI. Don't fix until we've corrected the callers. Or we might want to leave it like
|
||||
// this anyway, since we're looking obliquely at these faces anyway, and this error stretches the side that perspective compresses. May
|
||||
// want to make the unstitched version wrong in the same way.
|
||||
hsScalar tRad = 2.f * hsScalarPI * cRad / nSpokes; |
||||
if( tRad < minRad ) |
||||
tRad = minRad; |
||||
cRad += tRad; |
||||
radii.Append(cRad); |
||||
} |
||||
|
||||
int nShell = radii.GetCount(); |
||||
|
||||
int nTris = stitch |
||||
? 2 * nSpokes * (nShell-1) + nSpokes |
||||
: 2 * (nSpokes-1) * (nShell-1) + (nSpokes-1); |
||||
int nVerts = nSpokes * nShell + 1; |
||||
triMesh->AllocatePointers(nTris, nVerts, nVerts, nVerts); |
||||
triMesh->SetNumTriVertex(nVerts); |
||||
triMesh->SetNumPoints(nVerts); |
||||
triMesh->SetNumUvs(nVerts); |
||||
triMesh->SetHasColors(true); |
||||
|
||||
*triMesh->GetPoint(0) = center; |
||||
triMesh->GetNormal(0)->Set(0,1.f,0); |
||||
triMesh->GetColor(0)->Set(0,0,0,1.f); |
||||
triMesh->GetUvs(0)->fX = triMesh->GetUvs(0)->fY = triMesh->GetUvs(0)->fZ = 0; |
||||
|
||||
hsScalar iToRadians = stitch
|
||||
? 2.f * hsScalarPI / nSpokes |
||||
: hsScalarPI / nSpokes; |
||||
hsScalar attenStart = maxRad * attenStartFrac; |
||||
hsScalar attenEnd = maxRad; |
||||
hsScalar attenScale = hsScalarInvert(attenEnd - attenStart); |
||||
int i, j; |
||||
for( i = 0; i < nSpokes; i++ ) |
||||
{ |
||||
hsScalar s = hsSine(i * iToRadians); |
||||
hsScalar c = hsCosine(i * iToRadians); |
||||
for( j = 0; j < nShell; j++ ) |
||||
{ |
||||
hsAssert(1 + i*nShell + j < nVerts, "Going out of range on verts"); |
||||
hsGVertex3* vtx = triMesh->GetVertex(1 + i*nShell + j); |
||||
hsColorRGBA* col = triMesh->GetColor(1 + i*nShell + j); |
||||
hsGUv* uv = triMesh->GetUvs(1 + i*nShell + j); |
||||
|
||||
hsScalar x = c * radii[j]; |
||||
hsScalar y = s * radii[j]; |
||||
|
||||
hsScalar u = x / uRange; |
||||
hsScalar v = y / vRange; |
||||
|
||||
vtx->fLocalPos.fX = center.fX + x; |
||||
vtx->fLocalPos.fY = center.fY + y; |
||||
vtx->fLocalPos.fZ = 0.f; |
||||
|
||||
vtx->fNormal.Set(0,0,1.f); |
||||
|
||||
uv->fX = u; |
||||
uv->fY = v; |
||||
uv->fZ = 0.f; |
||||
|
||||
if( radii[j] > attenStart ) |
||||
{ |
||||
hsScalar a = (attenEnd - radii[j]) * attenScale; |
||||
if( a < 0 ) |
||||
a = 0; |
||||
else if( a > 1.f ) |
||||
a = 1.f; |
||||
col->Set(0,0,0,a); |
||||
} |
||||
else |
||||
col->Set(0,0,0,1.f); |
||||
} |
||||
} |
||||
|
||||
int spokeEnd = stitch ? nSpokes : nSpokes-1; |
||||
int nextTri = 0; |
||||
for( i = 0; i < spokeEnd; i++ ) |
||||
{ |
||||
hsTriangle3* tri = triMesh->GetTriFromPool(nextTri); |
||||
tri->Zero(); |
||||
tri->fOrigTri = tri; |
||||
triMesh->SetTriangle(nextTri++, tri); |
||||
|
||||
tri->fVert[0] = triMesh->GetTriVertex(0); |
||||
tri->fVert[0]->fVtx = triMesh->GetVertex(0); |
||||
tri->fVert[0]->SetNumUvChannels(1); |
||||
tri->fVert[0]->fUvChan[0] = triMesh->GetUvs(0); |
||||
tri->fVert[0]->fVtxColor = triMesh->GetColor(0); |
||||
|
||||
int iv0 = 1 + i * nShell; |
||||
int iv1 = i < nSpokes - 1 ? 1 + (i+1)*nShell : 1; |
||||
hsAssert((iv0 < nVerts)&&(iv1 < nVerts), "Out of range on triverts"); |
||||
|
||||
tri->fVert[1] = triMesh->GetTriVertex(iv0); |
||||
tri->fVert[1]->fVtx = triMesh->GetVertex(iv0); |
||||
tri->fVert[1]->SetNumUvChannels(1); |
||||
tri->fVert[1]->fUvChan[0] = triMesh->GetUvs(iv0); |
||||
tri->fVert[1]->fVtxColor = triMesh->GetColor(iv0); |
||||
|
||||
tri->fVert[2] = triMesh->GetTriVertex(iv1); |
||||
tri->fVert[2]->fVtx = triMesh->GetVertex(iv1); |
||||
tri->fVert[2]->SetNumUvChannels(1); |
||||
tri->fVert[2]->fUvChan[0] = triMesh->GetUvs(iv1); |
||||
tri->fVert[2]->fVtxColor = triMesh->GetColor(iv1); |
||||
|
||||
tri->fVert[0]->fFlags = hsGTriVertex::kHasPointers |
||||
| hsGTriVertex::kHasVertexUvs |
||||
| hsGTriVertex::kHasVertexColors; |
||||
tri->fVert[1]->fFlags = hsGTriVertex::kHasPointers |
||||
| hsGTriVertex::kHasVertexUvs |
||||
| hsGTriVertex::kHasVertexColors; |
||||
tri->fVert[2]->fFlags = hsGTriVertex::kHasPointers |
||||
| hsGTriVertex::kHasVertexUvs |
||||
| hsGTriVertex::kHasVertexColors; |
||||
|
||||
tri->fFlags |= hsTriangle3::kHasVertexPosNorms
|
||||
| hsTriangle3::kHasVertexUvs |
||||
| hsTriangle3::kHasVertexColors |
||||
| hsTriangle3::kHasPointers; |
||||
|
||||
int iv2 = iv0 + 1; |
||||
int iv3 = iv1 + 1; |
||||
hsAssert((iv1 < nVerts)&&(iv2 < nVerts), "Out of range on triverts"); |
||||
for( j = 0; j < nShell-1; j++ ) |
||||
{ |
||||
tri = triMesh->GetTriFromPool(nextTri); |
||||
tri->Zero(); |
||||
tri->fOrigTri = tri; |
||||
triMesh->SetTriangle(nextTri++, tri); |
||||
|
||||
tri->fVert[0] = triMesh->GetTriVertex(iv0); |
||||
tri->fVert[0]->fVtx = triMesh->GetVertex(iv0); |
||||
tri->fVert[0]->SetNumUvChannels(1); |
||||
tri->fVert[0]->fUvChan[0] = triMesh->GetUvs(iv0); |
||||
tri->fVert[0]->fVtxColor = triMesh->GetColor(iv0); |
||||
|
||||
tri->fVert[1] = triMesh->GetTriVertex(iv2); |
||||
tri->fVert[1]->fVtx = triMesh->GetVertex(iv2); |
||||
tri->fVert[1]->SetNumUvChannels(1); |
||||
tri->fVert[1]->fUvChan[1] = triMesh->GetUvs(iv2); |
||||
tri->fVert[1]->fVtxColor = triMesh->GetColor(iv2); |
||||
|
||||
tri->fVert[2] = triMesh->GetTriVertex(iv3); |
||||
tri->fVert[2]->fVtx = triMesh->GetVertex(iv3); |
||||
tri->fVert[2]->SetNumUvChannels(1); |
||||
tri->fVert[2]->fUvChan[0] = triMesh->GetUvs(iv3); |
||||
tri->fVert[2]->fVtxColor = triMesh->GetColor(iv3); |
||||
|
||||
tri->fVert[0]->fFlags = hsGTriVertex::kHasPointers |
||||
| hsGTriVertex::kHasVertexUvs |
||||
| hsGTriVertex::kHasVertexColors; |
||||
tri->fVert[1]->fFlags = hsGTriVertex::kHasPointers |
||||
| hsGTriVertex::kHasVertexUvs |
||||
| hsGTriVertex::kHasVertexColors; |
||||
tri->fVert[2]->fFlags = hsGTriVertex::kHasPointers |
||||
| hsGTriVertex::kHasVertexUvs |
||||
| hsGTriVertex::kHasVertexColors; |
||||
|
||||
tri->fFlags |= hsTriangle3::kHasVertexPosNorms
|
||||
| hsTriangle3::kHasVertexUvs |
||||
| hsTriangle3::kHasVertexColors |
||||
| hsTriangle3::kHasPointers; |
||||
|
||||
tri = triMesh->GetTriFromPool(nextTri); |
||||
tri->Zero(); |
||||
tri->fOrigTri = tri; |
||||
triMesh->SetTriangle(nextTri++, tri); |
||||
|
||||
tri->fVert[0] = triMesh->GetTriVertex(iv0); |
||||
tri->fVert[0]->fVtx = triMesh->GetVertex(iv0); |
||||
tri->fVert[0]->SetNumUvChannels(1); |
||||
tri->fVert[0]->fUvChan[0] = triMesh->GetUvs(iv0); |
||||
tri->fVert[0]->fVtxColor = triMesh->GetColor(iv0); |
||||
|
||||
tri->fVert[1] = triMesh->GetTriVertex(iv3); |
||||
tri->fVert[1]->fVtx = triMesh->GetVertex(iv3); |
||||
tri->fVert[1]->SetNumUvChannels(1); |
||||
tri->fVert[1]->fUvChan[0] = triMesh->GetUvs(iv3); |
||||
tri->fVert[1]->fVtxColor = triMesh->GetColor(iv3); |
||||
|
||||
tri->fVert[2] = triMesh->GetTriVertex(iv1); |
||||
tri->fVert[2]->fVtx = triMesh->GetVertex(iv1); |
||||
tri->fVert[2]->SetNumUvChannels(1); |
||||
tri->fVert[2]->fUvChan[0] = triMesh->GetUvs(iv1); |
||||
tri->fVert[2]->fVtxColor = triMesh->GetColor(iv1); |
||||
|
||||
tri->fVert[0]->fFlags = hsGTriVertex::kHasPointers |
||||
| hsGTriVertex::kHasVertexUvs |
||||
| hsGTriVertex::kHasVertexColors; |
||||
tri->fVert[1]->fFlags = hsGTriVertex::kHasPointers |
||||
| hsGTriVertex::kHasVertexUvs |
||||
| hsGTriVertex::kHasVertexColors; |
||||
tri->fVert[2]->fFlags = hsGTriVertex::kHasPointers |
||||
| hsGTriVertex::kHasVertexUvs |
||||
| hsGTriVertex::kHasVertexColors; |
||||
|
||||
tri->fFlags |= hsTriangle3::kHasVertexPosNorms
|
||||
| hsTriangle3::kHasVertexUvs |
||||
| hsTriangle3::kHasVertexColors |
||||
| hsTriangle3::kHasPointers; |
||||
|
||||
iv0++; |
||||
iv1++; |
||||
iv2++; |
||||
iv3++; |
||||
} |
||||
} |
||||
hsAssert(nextTri <= nTris, "Out of range on tris"); |
||||
|
||||
triMesh->StoreOrigPoints(); |
||||
|
||||
return triMesh; |
||||
} |
||||
#endif |
@ -1,180 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#ifndef hsOscillator_inc |
||||
#define hsOscillator_inc |
||||
|
||||
#include "hsPerterber.h" |
||||
#include "hsTemplates.h" |
||||
|
||||
#include "hsGeometry3.h" |
||||
#include "../plIntersect/hsBounds.h" |
||||
|
||||
class hsStream; |
||||
class plPipeline; |
||||
|
||||
class hsWave |
||||
{ |
||||
protected: |
||||
hsPoint3 fWorldCenter; |
||||
hsPoint3 fLocalCenter; |
||||
|
||||
hsScalar fWorldFrequency; // 1.0 / Period
|
||||
hsScalar fLocalFrequency; |
||||
|
||||
hsScalar fWorldAmplitude; |
||||
hsScalar fLocalAmplitude; |
||||
|
||||
hsScalar fPhase; |
||||
hsScalar fRate; // how long a crest takes to reach next crest
|
||||
|
||||
hsScalar fStartSecs; |
||||
hsScalar fSecsToLive; |
||||
|
||||
hsScalar fInnerRadius; |
||||
hsScalar fOuterRadius; |
||||
hsScalar fAttenuateOutScale; |
||||
|
||||
hsScalar AgeScale(hsScalar secs) const; |
||||
|
||||
public: |
||||
void Accumulate(const hsPoint3& pos, const hsVector3& localZ, hsVector3& accum, hsVector3& accumNorm) const; |
||||
hsScalar ScaledAmplitude(hsScalar secs) const; |
||||
|
||||
void Init(hsScalar secs, hsPoint3& center, hsScalar per, hsScalar amp, hsScalar rate, hsScalar life, hsBool32 attenOut=false); |
||||
|
||||
void Update(hsScalar secs, const hsMatrix44& l2w, const hsMatrix44& w2l); |
||||
hsBool32 IsSpent(hsScalar secs) const; |
||||
void Kill() { fStartSecs = fSecsToLive = 0; } |
||||
void AttenuateOut(hsBool32 on) { fAttenuateOutScale = (on ? 1.f : 0); } |
||||
hsBool32 GetAttenuateOut() { return fAttenuateOutScale > 0; } |
||||
|
||||
void Save(hsStream* s, hsScalar secs); |
||||
void Load(hsStream* s, hsScalar secs); |
||||
}; |
||||
|
||||
class hsOscillator : public hsPerterber |
||||
{ |
||||
protected: |
||||
hsTArray<hsWave> fWaves; |
||||
hsTArray<hsWave> fTempWaves; |
||||
|
||||
hsMatrix44 fLocalToWorld; |
||||
hsMatrix44 fWorldToLocal; |
||||
|
||||
hsPoint3 fWorldCenter; |
||||
hsPoint3 fLocalCenter; |
||||
|
||||
hsVector3 fWorldAttenScale; |
||||
hsVector3 fLocalAttenScale; |
||||
|
||||
hsBounds3Ext fWorldCenterBounds; |
||||
|
||||
hsScalar fMinPeriod; |
||||
hsScalar fMaxPeriod; |
||||
|
||||
hsScalar fMinAmplitude; |
||||
hsScalar fMaxAmplitude; |
||||
|
||||
hsScalar fMinRate; |
||||
hsScalar fMaxRate; |
||||
|
||||
hsScalar fMinLife; |
||||
hsScalar fMaxLife; |
||||
|
||||
hsVector3 fLocalX; |
||||
hsVector3 fLocalY; |
||||
hsVector3 fLocalZ; |
||||
|
||||
hsScalar IAttenuate(const hsPoint3& in) const; |
||||
void ISpawnWave(hsScalar secs, int i); |
||||
|
||||
virtual void IUpdate(hsScalar secs, plPipeline* pipe, const hsMatrix44& l2w, const hsMatrix44& w2l); |
||||
|
||||
virtual void IPerterb(const hsPoint3& in, hsGVertex3& out) const; |
||||
public: |
||||
hsOscillator(); |
||||
virtual ~hsOscillator(); |
||||
|
||||
virtual void AdjustWorldBounds(const hsMatrix44& l2w, const hsMatrix44& w2l, hsBounds3Ext& bnd) const; |
||||
|
||||
virtual uint32_t GetType() const { return kTypeOscillator; } |
||||
|
||||
// Don't call these, use base class LabelAndWrite() and CreateAndRead()
|
||||
virtual void Read(hsStream* s); |
||||
virtual void Write(hsStream* s); |
||||
|
||||
virtual void Load(hsStream* s, hsScalar secs); |
||||
virtual void Save(hsStream* s, hsScalar secs); |
||||
|
||||
void SetPeriodRange(hsScalar lo, hsScalar hi) { fMinPeriod = lo; fMaxPeriod = hi; } |
||||
void SetAmplitudeRange(hsScalar lo, hsScalar hi) { fMinAmplitude = lo; fMaxAmplitude = hi; } |
||||
void SetRateRange(hsScalar lo, hsScalar hi) { fMinRate = lo; fMaxRate = hi; } |
||||
void SetLifeRange(hsScalar lo, hsScalar hi) { fMinLife = lo; fMaxLife = hi; } |
||||
|
||||
hsScalar GetMinPeriod() const { return fMinPeriod; } |
||||
hsScalar GetMaxPeriod() const { return fMaxPeriod; } |
||||
hsScalar GetMinAmplitude() const { return fMinAmplitude; } |
||||
hsScalar GetMaxAmplitude() const { return fMaxAmplitude; } |
||||
hsScalar GetMinRate() const { return fMinRate; } |
||||
hsScalar GetMaxRate() const { return fMaxRate; } |
||||
hsScalar GetMinLife() const { return fMinLife; } |
||||
hsScalar GetMaxLife() const { return fMaxLife; } |
||||
|
||||
void SetWorldAttenScale(const hsVector3& s) { fWorldAttenScale = s; } |
||||
void SetWorldCenterBounds(const hsBounds3Ext& bnd) { fWorldCenterBounds = bnd; } |
||||
|
||||
const hsVector3& GetWorldAttenScale() const { return fWorldAttenScale; } |
||||
const hsBounds3Ext& GetWorldCenterBounds() const { return fWorldCenterBounds; } |
||||
|
||||
void SetNumWaves(int n); |
||||
uint32_t GetNumWaves() const { return fWaves.GetCount(); } |
||||
hsWave& GetWeakestWave(hsScalar secs); |
||||
hsWave& GetTempWave(hsScalar secs); |
||||
|
||||
virtual void Init(int32_t nParams, hsScalar* params); |
||||
|
||||
static hsGTriMesh* MakeWaveMesh(int nSpokes, const hsPoint3& center, hsScalar minRad, hsScalar maxRad, hsScalar uRange, hsScalar vRange, hsScalar attenStartFrac, hsBool32 stitch); |
||||
|
||||
}; |
||||
|
||||
#endif // hsOscillator_inc
|
@ -1,350 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#include "hsTypes.h" |
||||
#include "hsStream.h" |
||||
#include "hsPerterber.h" |
||||
#include "hsOscillator.h" |
||||
#include "hsGMesh.h" |
||||
#if 0 // GET_RID_OF_SHAPE_LAYER_DEFER
|
||||
#include "hsGShape3.h" |
||||
#include "hsGShape3MegaMesh.h" |
||||
#endif// GET_RID_OF_SHAPE_LAYER_DEFER
|
||||
#include "../plResMgr/plKey.h" |
||||
#include "../plSurface/hsGMaterial.h" |
||||
#include "hsTimer.h" |
||||
#include "../plPipeline/plPipeline.h" |
||||
|
||||
hsBool32 hsPerterber::fDisabled = false; |
||||
|
||||
hsPerterber::hsPerterber() |
||||
{ |
||||
} |
||||
|
||||
hsPerterber::~hsPerterber() |
||||
{ |
||||
} |
||||
|
||||
void hsPerterber::IUpdate(hsScalar secs, plPipeline* pipe, const hsMatrix44& l2w, const hsMatrix44& w2l) |
||||
{ |
||||
} |
||||
|
||||
void hsPerterber::TimeStampAndSave(hsStream* s) |
||||
{ |
||||
hsScalar secs = hsTimer::GetSeconds(); |
||||
|
||||
hsKeyedObject::Save(s, nil); |
||||
|
||||
Save(s, secs); |
||||
} |
||||
|
||||
void hsPerterber::TimeStampAndLoad(hsStream* s) |
||||
{ |
||||
hsScalar secs = hsTimer::GetSeconds(); |
||||
|
||||
hsKeyedObject::Load(s, nil); |
||||
|
||||
Load(s, secs); |
||||
} |
||||
|
||||
void hsPerterber::LabelAndWrite(hsStream* s) |
||||
{ |
||||
s->WriteSwap32(GetType()); |
||||
Write(s); |
||||
} |
||||
|
||||
hsPerterber* hsPerterber::CreateAndRead(hsStream* s) |
||||
{ |
||||
hsPerterber* retVal = nil; |
||||
|
||||
uint32_t t = s->ReadSwap32(); |
||||
switch( t ) |
||||
{ |
||||
case kTypeOscillator: |
||||
retVal = new hsOscillator; |
||||
break; |
||||
default: |
||||
hsAssert(false, "Unknown perterber type"); |
||||
return nil; |
||||
} |
||||
retVal->Read(s); |
||||
|
||||
return retVal; |
||||
} |
||||
|
||||
hsGMesh* hsPerterber::IGetMesh(hsGShape3* shape) |
||||
{ |
||||
hsGMesh* mesh = nil; |
||||
#if 0 // GET_RID_OF_SHAPE_LAYER_DEFER
|
||||
if( shape->GetShapeType() == hsGShape3::kTypeTriMesh ) |
||||
{ |
||||
hsGShape3TriMesh* shp = (hsGShape3TriMesh*)shape; |
||||
mesh = shp->GetMesh(); |
||||
|
||||
#if 0 // move to export
|
||||
if( mesh->GetKey() && strstr(mesh->GetKey()->GetName(), "create") ) |
||||
{ |
||||
|
||||
hsTArray<hsGMaterial*> matList; |
||||
shp->AppendMaterials(matList); |
||||
|
||||
hsGTriMesh* newMesh = hsOscillator::MakeWaveMesh(40, hsPoint3(0,0,0), 4.f, 75.f, 1200.f, 1200.f, 0.75f, false); |
||||
newMesh->SetMaterial(matList[0]); |
||||
hsRefCnt_SafeUnRef(matList[0]); |
||||
|
||||
shp->SetMesh(newMesh); |
||||
hsRefCnt_SafeUnRef(newMesh); |
||||
mesh = newMesh; |
||||
} |
||||
else if( mesh->GetKey() && strstr(mesh->GetKey()->GetName(), "destroy") ) |
||||
{ |
||||
|
||||
hsTArray<hsGMaterial*> matList; |
||||
shp->AppendMaterials(matList); |
||||
|
||||
hsGTriMesh* newMesh = hsOscillator::MakeWaveMesh(50, hsPoint3(0,0,0), 1.5f, 30.f, 600.f, 600.f, 0.6f, true); |
||||
newMesh->SetMaterial(matList[0]); |
||||
hsRefCnt_SafeUnRef(matList[0]); |
||||
|
||||
shp->SetMesh(newMesh); |
||||
hsRefCnt_SafeUnRef(newMesh); |
||||
mesh = newMesh; |
||||
} |
||||
else |
||||
#endif // move to export
|
||||
{ |
||||
hsGTriMesh* triMesh = (hsGTriMesh*)shp->GetMesh(); |
||||
if( triMesh->GetTriangle(0)->fFlags & hsTriangle3::kHasFacePlane ) |
||||
triMesh->TrashPlanes(); |
||||
mesh = triMesh; |
||||
} |
||||
} |
||||
else if( shape->GetShapeType() == hsGShape3::kTypeMegaMesh ) |
||||
{ |
||||
hsGShape3MegaMesh* mega = (hsGShape3MegaMesh*)shape; |
||||
hsGMegaMesh* megaMesh = (hsGMegaMesh*)mega->GetMegaMesh(); |
||||
hsGTriMesh* triMesh = (hsGTriMesh*)megaMesh->GetMesh(0); |
||||
if( triMesh->GetTriangle(0)->fFlags & hsTriangle3::kHasFacePlane ) |
||||
{ |
||||
int iMesh; |
||||
for( iMesh = 0; iMesh < megaMesh->GetMeshCount(); iMesh++ ) |
||||
{ |
||||
triMesh = (hsGTriMesh*)megaMesh->GetMesh(iMesh); |
||||
triMesh->TrashPlanes(); |
||||
} |
||||
} |
||||
mesh = mega->GetMegaMesh(); |
||||
} |
||||
#endif // GET_RID_OF_SHAPE_LAYER_DEFER
|
||||
return mesh; |
||||
} |
||||
|
||||
void hsPerterber::Perterb(hsScalar secs, plPipeline* pipe, const hsMatrix44& l2w, const hsMatrix44& w2l, hsGShape3* shape) |
||||
{ |
||||
if( GetDisabled() ) |
||||
return; |
||||
|
||||
hsGMesh* mesh = IGetMesh(shape); |
||||
|
||||
IUpdate(secs, pipe, l2w, w2l); |
||||
|
||||
if( !mesh->HasOrigPoints() ) |
||||
mesh->StoreOrigPoints(); |
||||
int i; |
||||
for( i = 0; i < mesh->GetNumPoints(); i++ ) |
||||
{ |
||||
IPerterb(*mesh->GetOrigPoint(i), *mesh->GetVertex(i)); |
||||
} |
||||
} |
||||
|
||||
const int kPertCount = 6; |
||||
const int kMaxPertParams = 32; |
||||
|
||||
struct hsPertDesc |
||||
{ |
||||
|
||||
char fName[256]; |
||||
uint32_t fType; |
||||
uint32_t fNumParams; |
||||
hsScalar fParams[kMaxPertParams]; |
||||
}; |
||||
|
||||
// NumWaves = 1
|
||||
// AttenScale = 2
|
||||
// WorldCenterBounds = 6
|
||||
// Period = 2
|
||||
// Amp = 2
|
||||
// Rate = 2
|
||||
// Life = 2
|
||||
//
|
||||
hsPertDesc sPertTable[kPertCount] = |
||||
{ |
||||
{ |
||||
"mystocean", |
||||
hsPerterber::kTypeOscillator, |
||||
17, |
||||
{ |
||||
5.f, |
||||
1.f/100.f, 1.f/100.f, |
||||
-100.f, 100.f, 0, 100.f, 150.f, 0, |
||||
2.f, 5.f, |
||||
0.5, 0.75f, |
||||
0.68f, 0.68f, |
||||
5.f, 10.f |
||||
} |
||||
}, |
||||
{ |
||||
"stoneocean", |
||||
hsPerterber::kTypeOscillator, |
||||
17, |
||||
{ |
||||
5.f, |
||||
1.f/100.f, 1.f/100.f, |
||||
-100.f, 100.f, 0, 100.f, 150.f, 0, |
||||
2.f, 5.f, |
||||
0.5, 0.75f, |
||||
0.68f, 0.68f, |
||||
5.f, 10.f |
||||
} |
||||
}, |
||||
{ |
||||
"seleniticocean", |
||||
hsPerterber::kTypeOscillator, |
||||
17, |
||||
{ |
||||
5.f, |
||||
1.f/100.f, 1.f/100.f, |
||||
-100.f, 100.f, 0, 100.f, 150.f, 0, |
||||
2.f, 5.f, |
||||
0.25, 0.45f, |
||||
0.6f, 0.6f, |
||||
5.f, 10.f |
||||
} |
||||
}, |
||||
{ |
||||
"channelocean", |
||||
hsPerterber::kTypeOscillator, |
||||
17, |
||||
{ |
||||
5.f, |
||||
1.f/30.f, 1.f/30.f, |
||||
-100.f, -100.f, 0, 100.f, 100.f, 0, |
||||
0.25f, 0.5f, |
||||
0.1, 0.2f, |
||||
0.4f, 0.8f, |
||||
5.f, 10.f |
||||
} |
||||
}, |
||||
{ |
||||
"mechocean", |
||||
hsPerterber::kTypeOscillator, |
||||
17, |
||||
{ |
||||
5.f, |
||||
1.f/100.f, 1.f/100.f, |
||||
-100.f, 100.f, 0, 100.f, 150.f, 0, |
||||
2.f, 5.f, |
||||
0.5, 0.4f, |
||||
0.68f, 0.68f, |
||||
5.f, 10.f |
||||
} |
||||
}, |
||||
{ |
||||
"rimeocean", |
||||
hsPerterber::kTypeOscillator, |
||||
17, |
||||
{ |
||||
5.f, |
||||
1.f/100.f, 1.f/100.f, |
||||
-100.f, 100.f, 0, 100.f, 150.f, 0, |
||||
2.f, 5.f, |
||||
0.5, 0.75, |
||||
0.68f, 0.68f, |
||||
5.f, 10.f |
||||
} |
||||
} |
||||
}; |
||||
|
||||
|
||||
|
||||
#if 0 // Used Registry...need to change paulg
|
||||
void hsPerterber::InitSystem(hsRegistry* reg) |
||||
{ |
||||
if( GetDisabled() ) |
||||
return; |
||||
|
||||
int i; |
||||
for( i = 0; i < kPertCount; i++ ) |
||||
{ |
||||
switch( sPertTable[i].fType ) |
||||
{ |
||||
case kTypeOscillator: |
||||
{ |
||||
hsOscillator* oscar = new hsOscillator; |
||||
oscar->Init(sPertTable[i].fNumParams, sPertTable[i].fParams); |
||||
|
||||
#ifdef PAULFIX |
||||
oscar->Register(reg, sPertTable[i].fName, 0, true); |
||||
#endif |
||||
} |
||||
break; |
||||
default: |
||||
hsAssert(false, "Unknown perterber type"); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
void hsPerterber::Shutdown(hsRegistry* reg) |
||||
{ |
||||
#ifdef PAULFIX |
||||
int i; |
||||
|
||||
for( i = 0; i < reg->GetNumKeys(); i++ ) |
||||
{ |
||||
hsPerterber* pert = (hsPerterber*)(reg->GetKey(i)->GetObjectPtr()); |
||||
delete pert; |
||||
} |
||||
#endif |
||||
} |
||||
|
||||
#endif |
@ -1,107 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#ifndef hsPerterber_inc |
||||
#define hsPerterber_inc |
||||
|
||||
#include "../plResMgr/hsKeyedObject.h" |
||||
#include "hsGeometry3.h" |
||||
|
||||
class hsStream; |
||||
class hsGShape3; |
||||
class hsBounds3Ext; |
||||
class hsGMesh; |
||||
class plPipeline; |
||||
struct hsMatrix44; |
||||
struct hsGVertex3; |
||||
|
||||
class hsPerterber : public hsKeyedObject |
||||
{ |
||||
public: |
||||
enum { |
||||
kTypeUndefined = 0x0, |
||||
kTypeOscillator = 0x1 |
||||
}; |
||||
protected: |
||||
static hsBool32 fDisabled; |
||||
|
||||
virtual void IUpdate(hsScalar secs, plPipeline* pipe, const hsMatrix44& l2w, const hsMatrix44& w2l); |
||||
|
||||
virtual void IPerterb(const hsPoint3& in, hsGVertex3& out) const = 0; |
||||
|
||||
hsGMesh* IGetMesh(hsGShape3* shape); |
||||
public: |
||||
hsPerterber(); |
||||
virtual ~hsPerterber(); |
||||
|
||||
static void SetDisabled(hsBool32 on) { fDisabled = on; } |
||||
static void ToggleDisabled() { fDisabled = !fDisabled; } |
||||
static hsBool32 GetDisabled() { return fDisabled; } |
||||
|
||||
virtual void Perterb(hsScalar secs, plPipeline* pipe, const hsMatrix44& l2w, const hsMatrix44& w2l, hsGShape3* shape); |
||||
|
||||
virtual void AdjustWorldBounds(const hsMatrix44& l2w, const hsMatrix44& w2l, hsBounds3Ext& bnd) const = 0; |
||||
|
||||
virtual uint32_t GetType() const = 0; |
||||
|
||||
virtual void Write(hsStream* s) = 0; |
||||
virtual void Read(hsStream* s) = 0; |
||||
|
||||
virtual void Save(hsStream* s, hsScalar secs) = 0; |
||||
virtual void Load(hsStream* s, hsScalar secs) = 0; |
||||
|
||||
void TimeStampAndSave(hsStream* s); |
||||
void TimeStampAndLoad(hsStream* s); |
||||
|
||||
void LabelAndWrite(hsStream* s); |
||||
static hsPerterber* CreateAndRead(hsStream* s); |
||||
|
||||
virtual void Init(int32_t nParams, hsScalar* params) = 0; |
||||
|
||||
#if 0 // Used Registry...need to change paulg
|
||||
static void InitSystem(plResMgr* reg); |
||||
|
||||
static void Shutdown(plResMgr* reg); |
||||
#endif |
||||
}; |
||||
|
||||
#endif hsPerterber_inc |
@ -1,70 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
|
||||
#ifndef plGeometryCreatable_inc |
||||
#define plGeometryCreatable_inc |
||||
|
||||
#include "../pnFactory/plCreator.h" |
||||
|
||||
/* Taken out 6.12.2001 mcn - You can remove this file entirely if you wish, I just left
|
||||
it in in case we wanted to use it in the future... |
||||
|
||||
#include "hsGVertexPool.h" |
||||
|
||||
REGISTER_CREATABLE( hsGVertexPool ); |
||||
|
||||
|
||||
#include "hsGMesh.h" |
||||
|
||||
REGISTER_NONCREATABLE( hsGMesh ); |
||||
|
||||
#include "hsGTriMesh.h" |
||||
|
||||
REGISTER_CREATABLE( hsGTriMesh ); |
||||
|
||||
|
||||
#include "hsGMegaMesh.h" |
||||
|
||||
REGISTER_CREATABLE( hsGMegaMesh ); |
||||
*/ |
||||
|
||||
#endif plGeometryCreatable_inc |
@ -1,900 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/PubUtilLib/plNetGameLib/Private/plNglCsr.cpp |
||||
*
|
||||
***/ |
||||
|
||||
#include "../Pch.h" |
||||
#pragma hdrstop |
||||
|
||||
#include "pnEncryption/plChallengeHash.h" |
||||
|
||||
|
||||
namespace Ngl { namespace Csr { |
||||
/*****************************************************************************
|
||||
* |
||||
* Internal types |
||||
* |
||||
***/ |
||||
|
||||
struct ConnectParam { |
||||
FNetCliCsrConnectedCallback callback; |
||||
void * param; |
||||
}; |
||||
|
||||
//============================================================================
|
||||
// Connection record
|
||||
//============================================================================
|
||||
struct CliCsConn : AtomicRef { |
||||
LINK(CliCsConn) link; |
||||
|
||||
CCritSect critsect; |
||||
AsyncSocket sock; |
||||
AsyncCancelId cancelId; |
||||
NetCli * cli; |
||||
plNetAddress addr; |
||||
unsigned seq; |
||||
bool abandoned; |
||||
unsigned serverChallenge; |
||||
unsigned latestBuildId; |
||||
ConnectParam * connectParam; |
||||
|
||||
// ping
|
||||
AsyncTimer * pingTimer; |
||||
unsigned pingSendTimeMs; |
||||
unsigned lastHeardTimeMs; |
||||
|
||||
CliCsConn (); |
||||
~CliCsConn (); |
||||
|
||||
void AutoPing (); |
||||
void StopAutoPing (); |
||||
void TimerPing (); |
||||
|
||||
void Send (const uintptr_t fields[], unsigned count); |
||||
}; |
||||
|
||||
|
||||
//============================================================================
|
||||
// Transaction objects
|
||||
//============================================================================
|
||||
struct ConnectedNotifyTrans : NetNotifyTrans { |
||||
|
||||
ConnectParam * m_connectParam; |
||||
unsigned m_latestBuildId; |
||||
|
||||
ConnectedNotifyTrans (ConnectParam * cp, unsigned lbi) |
||||
: NetNotifyTrans(kCsrConnectedNotifyTrans) |
||||
, m_connectParam(cp) |
||||
, m_latestBuildId(lbi) |
||||
{ } |
||||
~ConnectedNotifyTrans () { |
||||
delete m_connectParam; |
||||
} |
||||
void Post (); |
||||
}; |
||||
|
||||
struct LoginRequestTrans : NetCsrTrans { |
||||
|
||||
wchar_t m_csrName[kMaxAccountNameLength]; |
||||
ShaDigest m_namePassHash; |
||||
FNetCliCsrLoginCallback m_callback; |
||||
void * m_param; |
||||
|
||||
Uuid m_csrId; |
||||
unsigned m_csrFlags; |
||||
|
||||
LoginRequestTrans ( |
||||
const wchar_t csrName[], |
||||
const ShaDigest & namePassHash, |
||||
FNetCliCsrLoginCallback callback, |
||||
void * param |
||||
); |
||||
|
||||
bool Send (); |
||||
void Post (); |
||||
bool Recv ( |
||||
const uint8_t msg[], |
||||
unsigned bytes |
||||
); |
||||
}; |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Internal data |
||||
* |
||||
***/ |
||||
|
||||
enum { |
||||
kPerfConnCount, |
||||
kPingDisabled, |
||||
kNumPerf |
||||
}; |
||||
|
||||
static bool s_running; |
||||
static CCritSect s_critsect; |
||||
static LISTDECL(CliCsConn, link) s_conns; |
||||
static CliCsConn * s_active; |
||||
static long s_perf[kNumPerf]; |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Internal functions |
||||
* |
||||
***/ |
||||
|
||||
//===========================================================================
|
||||
static unsigned GetNonZeroTimeMs () { |
||||
if (unsigned ms = TimeGetMs()) |
||||
return ms; |
||||
return 1; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static CliCsConn * GetConnIncRef_CS (const char tag[]) { |
||||
|
||||
if (CliCsConn * conn = s_active) |
||||
if (conn->cli) { |
||||
conn->IncRef(tag); |
||||
return conn; |
||||
} |
||||
return nil; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static CliCsConn * GetConnIncRef (const char tag[]) { |
||||
CliCsConn * conn; |
||||
s_critsect.Enter(); |
||||
{ |
||||
conn = GetConnIncRef_CS(tag); |
||||
} |
||||
s_critsect.Leave(); |
||||
return conn; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void UnlinkAndAbandonConn_CS (CliCsConn * conn) { |
||||
|
||||
s_conns.Unlink(conn); |
||||
conn->abandoned = true; |
||||
if (conn->cancelId) { |
||||
AsyncSocketConnectCancel(nil, conn->cancelId); |
||||
conn->cancelId = 0; |
||||
} |
||||
else if (conn->sock) { |
||||
AsyncSocketDisconnect(conn->sock, true); |
||||
} |
||||
else { |
||||
conn->DecRef("Lifetime"); |
||||
} |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void SendRegisterRequest (CliCsConn * conn) { |
||||
|
||||
const uintptr_t msg[] = { |
||||
kCli2Csr_RegisterRequest, |
||||
0 |
||||
}; |
||||
|
||||
conn->Send(msg, arrsize(msg)); |
||||
} |
||||
|
||||
//============================================================================
|
||||
static bool ConnEncrypt (ENetError error, void * param) { |
||||
|
||||
CliCsConn * conn = (CliCsConn *) param; |
||||
|
||||
if (IS_NET_SUCCESS(error)) { |
||||
s_critsect.Enter(); |
||||
{ |
||||
s_active = conn; |
||||
conn->AutoPing(); |
||||
conn->IncRef(); |
||||
} |
||||
s_critsect.Leave(); |
||||
|
||||
SendRegisterRequest(conn); |
||||
|
||||
conn->DecRef(); |
||||
} |
||||
|
||||
return IS_NET_SUCCESS(error); |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void NotifyConnSocketConnect (CliCsConn * conn) { |
||||
|
||||
conn->cli = NetCliConnectAccept( |
||||
conn->sock, |
||||
kNetProtocolCli2Csr, |
||||
false, |
||||
ConnEncrypt, |
||||
0, |
||||
nil, |
||||
conn |
||||
); |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void NotifyConnSocketConnectFailed (CliCsConn * conn) { |
||||
|
||||
bool notify; |
||||
s_critsect.Enter(); |
||||
{ |
||||
conn->cancelId = 0; |
||||
s_conns.Unlink(conn); |
||||
|
||||
notify |
||||
= s_running |
||||
&& !conn->abandoned |
||||
&& (!s_active || conn == s_active); |
||||
|
||||
if (conn == s_active) |
||||
s_active = nil; |
||||
} |
||||
s_critsect.Leave(); |
||||
|
||||
NetTransCancelByConnId(conn->seq, kNetErrTimeout); |
||||
conn->DecRef("Connecting"); |
||||
conn->DecRef("Lifetime"); |
||||
|
||||
if (notify) |
||||
ReportNetError(kNetProtocolCli2Csr, kNetErrConnectFailed); |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void NotifyConnSocketDisconnect (CliCsConn * conn) { |
||||
|
||||
conn->StopAutoPing(); |
||||
|
||||
bool notify; |
||||
s_critsect.Enter(); |
||||
{ |
||||
s_conns.Unlink(conn); |
||||
|
||||
notify |
||||
= s_running |
||||
&& !conn->abandoned |
||||
&& (!s_active || conn == s_active); |
||||
|
||||
if (conn == s_active) |
||||
s_active = nil; |
||||
} |
||||
s_critsect.Leave(); |
||||
|
||||
// Cancel all transactions in process on this connection.
|
||||
NetTransCancelByConnId(conn->seq, kNetErrTimeout); |
||||
conn->DecRef("Connected"); |
||||
conn->DecRef("Lifetime"); |
||||
|
||||
if (notify) |
||||
ReportNetError(kNetProtocolCli2Csr, kNetErrDisconnected); |
||||
} |
||||
|
||||
//============================================================================
|
||||
static bool NotifyConnSocketRead (CliCsConn * conn, AsyncNotifySocketRead * read) { |
||||
|
||||
conn->lastHeardTimeMs = GetNonZeroTimeMs(); |
||||
bool result = NetCliDispatch(conn->cli, read->buffer, read->bytes, conn); |
||||
read->bytesProcessed += read->bytes; |
||||
return result; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static bool SocketNotifyCallback ( |
||||
AsyncSocket sock, |
||||
EAsyncNotifySocket code, |
||||
AsyncNotifySocket * notify, |
||||
void ** userState |
||||
) { |
||||
bool result = true; |
||||
CliCsConn * conn; |
||||
|
||||
switch (code) { |
||||
case kNotifySocketConnectSuccess: { |
||||
conn = (CliCsConn *) notify->param; |
||||
*userState = conn; |
||||
conn->TransferRef("Connecting", "Connected"); |
||||
bool abandoned = true; |
||||
|
||||
if (abandoned) |
||||
AsyncSocketDisconnect(sock, true); |
||||
else |
||||
NotifyConnSocketConnect(conn); |
||||
} |
||||
break; |
||||
|
||||
case kNotifySocketConnectFailed: |
||||
conn = (CliCsConn *) notify->param; |
||||
NotifyConnSocketConnectFailed(conn); |
||||
break; |
||||
|
||||
case kNotifySocketDisconnect: |
||||
conn = (CliCsConn *) *userState; |
||||
NotifyConnSocketDisconnect(conn); |
||||
break; |
||||
|
||||
case kNotifySocketRead: |
||||
conn = (CliCsConn *) *userState; |
||||
result = NotifyConnSocketRead(conn, (AsyncNotifySocketRead *) notify); |
||||
break; |
||||
} |
||||
|
||||
return result; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void Connect ( |
||||
const plNetAddress& addr, |
||||
ConnectParam * cp |
||||
) { |
||||
CliCsConn * conn = NEWZERO(CliCsConn); |
||||
conn->addr = addr; |
||||
conn->seq = ConnNextSequence(); |
||||
conn->lastHeardTimeMs = GetNonZeroTimeMs(); |
||||
conn->connectParam = cp; |
||||
|
||||
conn->IncRef("Lifetime"); |
||||
conn->IncRef("Connecting"); |
||||
|
||||
s_critsect.Enter(); |
||||
{ |
||||
while (CliCsConn * conn = s_conns.Head()) |
||||
UnlinkAndAbandonConn_CS(conn); |
||||
s_conns.Link(conn); |
||||
} |
||||
s_critsect.Leave(); |
||||
|
||||
Cli2Csr_Connect connect; |
||||
connect.hdr.connType = kConnTypeCliToCsr; |
||||
connect.hdr.hdrBytes = sizeof(connect.hdr); |
||||
connect.hdr.buildId = BuildId(); |
||||
connect.hdr.buildType = BUILD_TYPE_LIVE; |
||||
connect.hdr.branchId = BranchId(); |
||||
connect.hdr.productId = ProductId(); |
||||
connect.data.dataBytes = sizeof(connect.data); |
||||
|
||||
AsyncSocketConnect( |
||||
&conn->cancelId, |
||||
addr, |
||||
SocketNotifyCallback, |
||||
conn, |
||||
&connect, |
||||
sizeof(connect), |
||||
0, |
||||
0 |
||||
); |
||||
} |
||||
|
||||
//============================================================================
|
||||
static void AsyncLookupCallback ( |
||||
void * param, |
||||
const char name[], |
||||
unsigned addrCount, |
||||
const plNetAddress addrs[] |
||||
) { |
||||
if (!addrCount) { |
||||
ReportNetError(kNetProtocolCli2Auth, kNetErrNameLookupFailed); |
||||
return; |
||||
} |
||||
|
||||
// Only connect to one server
|
||||
addrCount = MIN(addrCount, 1); |
||||
|
||||
for (unsigned i = 0; i < addrCount; ++i) { |
||||
Connect(addrs[i], (ConnectParam *)param); |
||||
} |
||||
} |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Message handlers |
||||
* |
||||
***/ |
||||
|
||||
//============================================================================
|
||||
static bool Recv_PingReply ( |
||||
const uint8_t msg[], |
||||
unsigned bytes, |
||||
void * |
||||
) { |
||||
const Csr2Cli_PingReply & reply = *(const Csr2Cli_PingReply *)msg; |
||||
|
||||
NetTransRecv(reply.transId, msg, bytes); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static bool Recv_RegisterReply ( |
||||
const uint8_t msg[], |
||||
unsigned , |
||||
void * param |
||||
) { |
||||
CliCsConn * conn = (CliCsConn *)param; |
||||
|
||||
const Csr2Cli_RegisterReply & reply = *(const Csr2Cli_RegisterReply *)msg; |
||||
|
||||
conn->serverChallenge = reply.serverChallenge; |
||||
conn->latestBuildId = reply.csrBuildId; |
||||
|
||||
ConnectedNotifyTrans * trans = new ConnectedNotifyTrans( |
||||
conn->connectParam, |
||||
conn->latestBuildId |
||||
); |
||||
NetTransSend(trans); |
||||
|
||||
conn->connectParam = nil; |
||||
|
||||
return true; |
||||
} |
||||
|
||||
//============================================================================
|
||||
static bool Recv_LoginReply ( |
||||
const uint8_t msg[], |
||||
unsigned bytes, |
||||
void * |
||||
) { |
||||
const Csr2Cli_LoginReply & reply = *(const Csr2Cli_LoginReply *)msg; |
||||
|
||||
NetTransRecv(reply.transId, msg, bytes); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Protocol |
||||
* |
||||
***/ |
||||
|
||||
#define MSG(s) kNetMsg_Cli2Csr_##s |
||||
static NetMsgInitSend s_send[] = { |
||||
{ MSG(PingRequest) }, |
||||
{ MSG(RegisterRequest) }, |
||||
{ MSG(LoginRequest) }, |
||||
}; |
||||
#undef MSG |
||||
|
||||
#define MSG(s) kNetMsg_Csr2Cli_##s, Recv_##s |
||||
static NetMsgInitRecv s_recv[] = { |
||||
{ MSG(PingReply) }, |
||||
{ MSG(RegisterReply) }, |
||||
{ MSG(LoginReply) }, |
||||
}; |
||||
#undef MSG |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* CliCsConn |
||||
* |
||||
***/ |
||||
|
||||
//===========================================================================
|
||||
static unsigned CliCsConnTimerDestroyed (void * param) { |
||||
|
||||
CliCsConn * conn = (CliCsConn *) param; |
||||
conn->DecRef("PingTimer"); |
||||
return kAsyncTimeInfinite; |
||||
} |
||||
|
||||
//===========================================================================
|
||||
static unsigned CliCsConnPingTimerProc (void * param) { |
||||
|
||||
((CliCsConn *) param)->TimerPing(); |
||||
return kPingIntervalMs; |
||||
} |
||||
|
||||
//============================================================================
|
||||
CliCsConn::CliCsConn () { |
||||
|
||||
AtomicAdd(&s_perf[kPerfConnCount], 1); |
||||
} |
||||
|
||||
//============================================================================
|
||||
CliCsConn::~CliCsConn () { |
||||
|
||||
// Delete 'cli' after all refs have been removed
|
||||
if (cli) |
||||
NetCliDelete(cli, true); |
||||
|
||||
delete connectParam; |
||||
|
||||
AtomicAdd(&s_perf[kPerfConnCount], -1); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void CliCsConn::AutoPing () { |
||||
ASSERT(!pingTimer); |
||||
|
||||
IncRef("PingTimer"); |
||||
critsect.Enter(); |
||||
{ |
||||
AsyncTimerCreate( |
||||
&pingTimer, |
||||
CliCsConnPingTimerProc, |
||||
sock ? 0 : kAsyncTimeInfinite, |
||||
this |
||||
); |
||||
} |
||||
critsect.Leave(); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void CliCsConn::StopAutoPing () { |
||||
critsect.Enter(); |
||||
{ |
||||
if (AsyncTimer * timer = pingTimer) { |
||||
pingTimer = nil; |
||||
AsyncTimerDeleteCallback(timer, CliCsConnTimerDestroyed); |
||||
} |
||||
} |
||||
critsect.Leave(); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void CliCsConn::TimerPing () { |
||||
|
||||
// Send a ping request
|
||||
pingSendTimeMs = GetNonZeroTimeMs(); |
||||
|
||||
const uintptr_t msg[] = { |
||||
kCli2Auth_PingRequest, |
||||
0, // not a transaction
|
||||
pingSendTimeMs, |
||||
0, // no payload
|
||||
nil |
||||
}; |
||||
|
||||
Send(msg, arrsize(msg)); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void CliCsConn::Send (const uintptr_t fields[], unsigned count) { |
||||
|
||||
critsect.Enter(); |
||||
{ |
||||
NetCliSend(cli, fields, count); |
||||
NetCliFlush(cli); |
||||
} |
||||
critsect.Leave(); |
||||
} |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* ConnectedNotifyTrans |
||||
* |
||||
***/ |
||||
|
||||
//============================================================================
|
||||
void ConnectedNotifyTrans::Post () { |
||||
|
||||
if (m_connectParam && m_connectParam->callback) |
||||
m_connectParam->callback(m_connectParam->param, m_latestBuildId); |
||||
} |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* LoginRequestTrans |
||||
* |
||||
***/ |
||||
|
||||
//============================================================================
|
||||
LoginRequestTrans::LoginRequestTrans ( |
||||
const wchar_t csrName[], |
||||
const ShaDigest & namePassHash, |
||||
FNetCliCsrLoginCallback callback, |
||||
void * param |
||||
) : NetCsrTrans(kCsrLoginTrans) |
||||
, m_callback(callback) |
||||
, m_param(param) |
||||
{ |
||||
ASSERT(callback); |
||||
memcpy(m_namePassHash, namePassHash, sizeof(ShaDigest)); |
||||
StrCopy(m_csrName, csrName, arrsize(m_csrName)); |
||||
} |
||||
|
||||
//============================================================================
|
||||
bool LoginRequestTrans::Send () { |
||||
|
||||
if (!AcquireConn()) |
||||
return false; |
||||
|
||||
ShaDigest challengeHash; |
||||
uint32_t clientChallenge = 0; |
||||
|
||||
CryptCreateRandomSeed( |
||||
sizeof(clientChallenge), |
||||
(uint8_t *) &clientChallenge |
||||
); |
||||
|
||||
CryptHashPasswordChallenge( |
||||
clientChallenge, |
||||
s_active->serverChallenge, |
||||
m_namePassHash, |
||||
challengeHash |
||||
); |
||||
|
||||
const uintptr_t msg[] = { |
||||
kCli2Csr_LoginRequest, |
||||
m_transId, |
||||
clientChallenge, |
||||
(uintptr_t) m_csrName, |
||||
(uintptr_t) &challengeHash |
||||
}; |
||||
|
||||
m_conn->Send(msg, arrsize(msg)); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
//============================================================================
|
||||
void LoginRequestTrans::Post () { |
||||
m_callback( |
||||
m_result, |
||||
m_param, |
||||
m_csrId, |
||||
m_csrFlags |
||||
); |
||||
} |
||||
|
||||
//============================================================================
|
||||
bool LoginRequestTrans::Recv ( |
||||
const uint8_t msg[], |
||||
unsigned bytes |
||||
) { |
||||
const Csr2Cli_LoginReply & reply = *(const Csr2Cli_LoginReply *) msg; |
||||
|
||||
m_result = reply.result; |
||||
m_csrId = reply.csrId; |
||||
m_csrFlags = reply.csrFlags; |
||||
|
||||
m_state = kTransStateComplete; |
||||
|
||||
return true; |
||||
} |
||||
|
||||
|
||||
} using namespace Csr; |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* NetCsrTrans |
||||
* |
||||
***/ |
||||
|
||||
//============================================================================
|
||||
NetCsrTrans::NetCsrTrans (ETransType transType) |
||||
: NetTrans(kNetProtocolCli2Csr, transType) |
||||
, m_conn(nil) |
||||
{ |
||||
} |
||||
|
||||
//============================================================================
|
||||
NetCsrTrans::~NetCsrTrans () { |
||||
ReleaseConn(); |
||||
} |
||||
|
||||
//============================================================================
|
||||
bool NetCsrTrans::AcquireConn () { |
||||
if (!m_conn) |
||||
m_conn = GetConnIncRef("AcquireConn"); |
||||
return m_conn != nil; |
||||
} |
||||
|
||||
//============================================================================
|
||||
void NetCsrTrans::ReleaseConn () { |
||||
if (m_conn) { |
||||
m_conn->DecRef("AcquireConn"); |
||||
m_conn = nil; |
||||
} |
||||
} |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Module functions |
||||
* |
||||
***/ |
||||
|
||||
//============================================================================
|
||||
void CsrInitialize () { |
||||
|
||||
s_running = true; |
||||
|
||||
NetMsgProtocolRegister( |
||||
kNetProtocolCli2Csr, |
||||
false, |
||||
s_send, arrsize(s_send), |
||||
s_recv, arrsize(s_recv), |
||||
kCsrDhGValue, |
||||
plBigNum(sizeof(kCsrDhXData), kCsrDhXData), |
||||
plBigNum(sizeof(kCsrDhNData), kCsrDhNData) |
||||
); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void CsrDestroy (bool wait) { |
||||
|
||||
s_running = false; |
||||
|
||||
NetTransCancelByProtocol( |
||||
kNetProtocolCli2Csr, |
||||
kNetErrRemoteShutdown |
||||
);
|
||||
NetMsgProtocolDestroy( |
||||
kNetProtocolCli2Csr, |
||||
false |
||||
); |
||||
|
||||
s_critsect.Enter(); |
||||
{ |
||||
while (CliCsConn * conn = s_conns.Head()) |
||||
UnlinkAndAbandonConn_CS(conn); |
||||
s_active = nil; |
||||
} |
||||
s_critsect.Leave(); |
||||
|
||||
if (!wait) |
||||
return; |
||||
|
||||
while (s_perf[kPerfConnCount]) { |
||||
NetTransUpdate(); |
||||
AsyncSleep(10); |
||||
} |
||||
} |
||||
|
||||
//============================================================================
|
||||
bool CsrQueryConnected () { |
||||
|
||||
bool result; |
||||
s_critsect.Enter(); |
||||
{ |
||||
if (nil != (result = s_active)) |
||||
result &= (nil != s_active->cli); |
||||
} |
||||
s_critsect.Leave(); |
||||
return result; |
||||
} |
||||
|
||||
//============================================================================
|
||||
unsigned CsrGetConnId () { |
||||
|
||||
unsigned connId; |
||||
s_critsect.Enter(); |
||||
{ |
||||
connId = (s_active) ? s_active->seq : 0; |
||||
} |
||||
s_critsect.Leave(); |
||||
return connId; |
||||
} |
||||
|
||||
} using namespace Ngl; |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Exports |
||||
* |
||||
***/ |
||||
|
||||
//============================================================================
|
||||
void NetCliCsrStartConnect ( |
||||
const char* addrList[], |
||||
uint32_t addrCount, |
||||
FNetCliCsrConnectedCallback callback, |
||||
void * param |
||||
) { |
||||
// Only connect to one server
|
||||
addrCount = min(addrCount, 1); |
||||
|
||||
for (unsigned i = 0; i < addrCount; ++i) { |
||||
// Do we need to lookup the address?
|
||||
const char* name = addrList[i]; |
||||
while (unsigned ch = *name) { |
||||
++name; |
||||
if (!(isdigit(ch) || ch == L'.' || ch == L':')) { |
||||
ConnectParam * cp = new ConnectParam; |
||||
cp->callback = callback; |
||||
cp->param = param; |
||||
|
||||
AsyncCancelId cancelId; |
||||
AsyncAddressLookupName( |
||||
&cancelId, |
||||
AsyncLookupCallback, |
||||
addrList[i], |
||||
kNetDefaultClientPort, |
||||
cp |
||||
); |
||||
break; |
||||
} |
||||
} |
||||
if (!name[0]) { |
||||
plNetAddress addr(addrList[i], kNetDefaultClientPort); |
||||
|
||||
ConnectParam * cp = new ConnectParam; |
||||
cp->callback = callback; |
||||
cp->param = param; |
||||
|
||||
Connect(addr, cp); |
||||
} |
||||
} |
||||
} |
||||
|
||||
//============================================================================
|
||||
void NetCliCsrDisconnect () { |
||||
|
||||
s_critsect.Enter(); |
||||
{ |
||||
while (CliCsConn * conn = s_conns.Head()) |
||||
UnlinkAndAbandonConn_CS(conn); |
||||
s_active = nil; |
||||
} |
||||
s_critsect.Leave(); |
||||
} |
||||
|
||||
//============================================================================
|
||||
void NetCliCsrLoginRequest ( |
||||
const wchar_t csrName[], |
||||
const ShaDigest & namePassHash, |
||||
FNetCliCsrLoginCallback callback, |
||||
void * param |
||||
) { |
||||
LoginRequestTrans * trans = new LoginRequestTrans( |
||||
csrName, |
||||
namePassHash, |
||||
callback, |
||||
param |
||||
); |
||||
NetTransSend(trans); |
||||
} |
@ -1,94 +0,0 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools |
||||
Copyright (C) 2011 Cyan Worlds, Inc. |
||||
|
||||
This program is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7 |
||||
|
||||
If you modify this Program, or any covered work, by linking or |
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
||||
(or a modified version of those libraries), |
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
||||
licensors of this Program grant you additional |
||||
permission to convey the resulting work. Corresponding Source for a |
||||
non-source form of such a combination shall include the source code for |
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
||||
work. |
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
||||
or by snail mail at: |
||||
Cyan Worlds, Inc. |
||||
14617 N Newport Hwy |
||||
Mead, WA 99021 |
||||
|
||||
*==LICENSE==*/ |
||||
/*****************************************************************************
|
||||
* |
||||
* $/Plasma20/Sources/Plasma/PubUtilLib/plNetGameLib/Private/plNglCsr.h |
||||
*
|
||||
***/ |
||||
|
||||
#ifdef PLASMA20_SOURCES_PLASMA_PUBUTILLIB_PLNETGAMELIB_PRIVATE_PLNGLCSR_H |
||||
#error "Header $/Plasma20/Sources/Plasma/PubUtilLib/plNetGameLib/Private/plNglCsr.h included more than once" |
||||
#endif |
||||
#define PLASMA20_SOURCES_PLASMA_PUBUTILLIB_PLNETGAMELIB_PRIVATE_PLNGLCSR_H |
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* |
||||
* Client-side CSR functions |
||||
* |
||||
***/ |
||||
|
||||
typedef void (*FNetCliCsrConnectedCallback) ( |
||||
void * param, |
||||
unsigned latestBuildId |
||||
); |
||||
void NetCliCsrStartConnect ( |
||||
const char* addrList[], |
||||
uint32_t addrCount, |
||||
FNetCliCsrConnectedCallback callback = nil, |
||||
void * param = nil |
||||
); |
||||
void NetCliCsrDisconnect (); |
||||
|
||||
typedef void (*FNetCliCsrLoginCallback)( |
||||
ENetError result, |
||||
void * param, |
||||
const Uuid & csrId, |
||||
unsigned csrFlags |
||||
); |
||||
void NetCliCsrLoginRequest ( |
||||
const wchar_t csrName[], |
||||
const ShaDigest & namePassHash, |
||||
FNetCliCsrLoginCallback callback, |
||||
void * param |
||||
); |
||||
|
||||
typedef void (*FNetCliCsrSetTicketFilterCallback)( |
||||
ENetError result, |
||||
void * param |
||||
); |
||||
void NetCliCsrSetTicketFilter ( |
||||
const wchar_t filterSpec[], |
||||
FNetCliCsrSetTicketFilterCallback callback, |
||||
void * param |
||||
); |
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue