Adam Johnson
13 years ago
32 changed files with 0 additions and 6160 deletions
@ -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,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 |
|
Loading…
Reference in new issue