2
3
mirror of https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git synced 2025-07-14 14:37:41 +00:00

Compare commits

...

16 Commits

Author SHA1 Message Date
38bf3ed1dc Merge branch 'ticket/17' into working 2021-08-11 14:17:14 -06:00
67a9e4a892 Merge branch 'ticket/16'
closes #16
2021-08-05 10:45:18 -06:00
13e3022087 Merge branch 'ticket/15'
closes #15
2021-08-05 10:44:53 -06:00
9b80ebf645 Remove PDB and MAP symbol files from list of files to delete upon startup. 2021-07-29 19:19:01 -06:00
d007fac536 Limit the scope of callback suppression.
Per testing on Minkata, suppressing callbacks during all vault downloads
has a deleterious effect on imagers. While my high level assumption is
correct, vault downloads can encompass situations where we want
notifications (eg re-downloading imager inbox folders, new age info
vault fragments). Whoops!
2021-07-28 22:27:26 -04:00
099a171f85 Merge branch 'ticket/14'
closes #14
2021-07-26 10:10:02 -06:00
994cee47b1 Merge branch 'master' of https://foundry.openuru.org/gitblit/r/CWE-ou-minkata 2021-07-24 13:03:32 -06:00
ba7b2d0caf Merge branch 'ticket/12'
closes #12
closes #13
2021-07-24 13:03:03 -06:00
9be38cb29b Merge branch 'ticket/12'
closes #12
2021-07-24 13:00:25 -06:00
8c46126007 Suppress vault callbacks when loading or unloading VNodeMgrs.
On MOULa, there have been complaints about linking to some Neighborhoods
and activating some players taking a very long time. One of these
Neighborhoods in particular is the "DRC(67) Bevin". When I attempted to
link to this Age, I found the link took approximately 85 seconds each
time. On profiling, I discovered that for every node downloaded during
the initialization phase, we were calling into Python at least once.
Suppressing vault callbacks during times when they are obviously going
to storm and be useless decreases the link time to 7 seconds.
2021-07-23 00:28:29 -04:00
bef0bfa262 Revert part of a89577e that allowed message handlers to override the
default window proc, killing key commands like Alt+F4
2021-07-22 17:24:36 -06:00
3d3d70fc08 Merge branch 'ticket/13'
closes #13
2021-07-22 15:57:34 -06:00
2a63116726 Merge branch 'ticket/12'
closes #12
2021-07-22 15:57:20 -06:00
86d2da35b7 Fix H-uru/Plasma#941.
Fixes a reference counting issue that prevents non-DirectXCompressed
mipmaps from being used in GUI Lists (eg as icons for avatar clothing).
All future clothing PRPs produced by CreateClothingPRP.py will depend on
this change.
2021-07-13 19:26:09 -04:00
1bfa806843 Hoikas' client window flashing when unfocused
5beda0ab87
2021-06-05 17:40:41 -07:00
23126d3135 Hoikas' Windows 7 taskbar loading indicator
dcba1fb60a
and
3a354020e1
2021-06-05 16:29:38 -07:00
13 changed files with 228 additions and 50 deletions

View File

@ -162,6 +162,8 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
#include "plTweak.h"
#include <ShObjIdl.h>
#define MSG_LOADING_BAR
// static hsVector3 gAbsDown(0,0,-hsScalar1);
@ -170,6 +172,10 @@ static plDispatchBase* gDisp = nil;
static plTimerCallbackManager* gTimerMgr = nil;
static plAudioSystem* gAudio = nil;
#ifdef HS_BUILD_FOR_WIN32
extern ITaskbarList3* gTaskbarList;
#endif
hsBool plClient::fDelayMS = false;
plClient* plClient::fInstance=nil;
@ -771,6 +777,12 @@ hsBool plClient::MsgReceive(plMessage* msg)
}
break;
case plClientMsg::kFlashWindow:
{
FlashWindow();
}
break;
}
return true;
}
@ -1286,6 +1298,32 @@ void plClient::IProgressMgrCallbackProc(plOperationProgress * progress)
if(!fInstance)
return;
// Increments the taskbar progress [Windows 7+]
#ifdef HS_BUILD_FOR_WIN32
if (gTaskbarList && fInstance->GetWindowHandle())
{
static TBPFLAG lastState = TBPF_NOPROGRESS;
TBPFLAG myState;
// So, calling making these kernel calls is kind of SLOW. So, let's
// hide that behind a userland check--this helps linking go faster!
if (progress->IsLastUpdate())
myState = TBPF_NOPROGRESS;
else if (progress->GetMax() == 0.f)
myState = TBPF_INDETERMINATE;
else
// This will set TBPF_NORMAL for us
myState = TBPF_NORMAL;
if (myState == TBPF_NORMAL)
// This sets us to TBPF_NORMAL
gTaskbarList->SetProgressValue(fInstance->GetWindowHandle(), (ULONGLONG)progress->GetProgress(), (ULONGLONG)progress->GetMax());
else if (myState != lastState)
gTaskbarList->SetProgressState(fInstance->GetWindowHandle(), myState);
lastState = myState;
}
#endif
fInstance->fMessagePumpProc();
// HACK HACK HACK HACK!
@ -2426,6 +2464,17 @@ void plClient::WindowActivate(bool active)
fWindowActive = active;
}
void plClient::FlashWindow()
{
#ifdef HS_BUILD_FOR_WIN32
FLASHWINFO info;
info.cbSize = sizeof(info);
info.dwFlags = FLASHW_TIMERNOFG | FLASHW_ALL;
info.hwnd = fWindowHndl;
info.uCount = -1;
FlashWindowEx(&info);
#endif
}
//============================================================================
void plClient::IOnAsyncInitComplete () {

View File

@ -292,6 +292,7 @@ public:
virtual void WindowActivate(bool active);
virtual hsBool WindowActive() const { return fWindowActive; }
void FlashWindow();
void SetMessagePumpProc( plMessagePumpProc proc ) { fMessagePumpProc = proc; }
void ResetDisplayDevice(int Width, int Height, int ColorDepth, hsBool Windowed, int NumAASamples, int MaxAnisotropicSamples, hsBool VSync = false);
void ResizeDisplayDevice(int Width, int Height, hsBool Windowed);

View File

@ -77,6 +77,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
#include <shellapi.h>
#include "WinHttp.h"
#include "loginfix.h"
#include <ShObjIdl.h>
//
// Defines
//
@ -99,6 +100,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
// Globals
//
hsBool gHasMouse = false;
ITaskbarList3* gTaskbarList = nil; // NT 6.1+ taskbar stuff
extern hsBool gDataServerLocal;
extern hsBool gUseBackgroundDownloader;
@ -137,6 +139,7 @@ bool gPendingActivateFlag = false;
static bool s_loginDlgRunning = false;
static CEvent s_statusEvent(kEventManualReset);
static UINT s_WmTaskbarList = RegisterWindowMessage("TaskbarButtonCreated");
FILE *errFP = nil;
HINSTANCE gHInst = NULL; // Instance of this app
@ -476,10 +479,22 @@ void DebugMsgF(const char* format, ...);
// Handles all the windows messages we might receive
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
{
static bool gDragging = false;
static UInt8 mouse_down = 0;
// Messages we registered for manually (no const value)
if (message == s_WmTaskbarList)
{
// Grab the Windows 7 taskbar list stuff
if (gTaskbarList)
gTaskbarList->Release();
HRESULT result = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, IID_ITaskbarList3, (void**)&gTaskbarList);
if (FAILED(result))
gTaskbarList = nil;
return 0;
}
// Handle messages
switch (message) {
case WM_LBUTTONDOWN:
@ -541,13 +556,13 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
break;
case WM_SYSCOMMAND:
switch (wParam) {
// Trap ALT so it doesn't pause the app
case SC_KEYMENU :
//// disable screensavers and monitor power downs too.
case SC_SCREENSAVE:
case SC_MONITORPOWER:
return 0;
switch (wParam) {
// Trap ALT so it doesn't pause the app
case SC_KEYMENU :
//// disable screensavers and monitor power downs too.
case SC_SCREENSAVE:
case SC_MONITORPOWER:
return 0;
case SC_CLOSE :
// kill game if window is closed
gClient->SetDone(TRUE);
@ -555,8 +570,8 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
mgr->QueueDisableNet(false, nil);
DestroyWindow(gClient->GetWindowHandle());
break;
}
break;
}
break;
case WM_SETCURSOR:
{
@ -579,11 +594,10 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
plMouseDevice::HideCursor();
}
}
return TRUE;
}
break;
case WM_ACTIVATE:
case WM_ACTIVATE:
{
bool active = (LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE);
bool minimized = (HIWORD(wParam) != 0);
@ -668,18 +682,16 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
if (plNetClientMgr * mgr = plNetClientMgr::GetInstance())
mgr->QueueDisableNet(false, nil);
DestroyWindow(gClient->GetWindowHandle());
return TRUE;
break;
case WM_DESTROY:
gClient->SetDone(TRUE);
if (plNetClientMgr * mgr = plNetClientMgr::GetInstance())
mgr->QueueDisableNet(false, nil);
PostQuitMessage(0);
return TRUE;
case WM_CREATE:
// Create renderer
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
void PumpMessageQueueProc( void )

View File

@ -172,8 +172,8 @@ static CEvent s_statusEvent(kEventManualReset);
static const wchar * s_deleteFiles[] = {
L"NetDiag.exe",
L"UruExplorer.pdb",
L"UruExplorer.map",
// L"UruExplorer.pdb", // removed for OpenUru Builds
// L"UruExplorer.map",
};
#else

View File

@ -224,8 +224,9 @@ pfGUIListPicture::pfGUIListPicture( plKey mipKey, hsBool respectAlpha ) : pfGUIL
char str[ 512 ];
sprintf( str, "%s_uncomp", mip->GetKeyName() );
fMipmapKey = hsgResMgr::ResMgr()->NewKey( str, uncompBuffer, fMipmapKey->GetUoid().GetLocation() );
fMipmapKey->RefObject();
}
fMipmapKey->RefObject();
}
pfGUIListPicture::~pfGUIListPicture()

View File

@ -722,6 +722,13 @@ void cyMisc::ExcludeRegionSetNow(pyKey& sender, pyKey& exKey, UInt16 state)
plgDispatch::MsgSend( msg ); // whoosh... off it goes
}
void cyMisc::FlashWindow()
{
plKey clientKey = hsgResMgr::ResMgr()->FindKey(kClient_KEY);
plClientMsg* pMsg = new plClientMsg(plClientMsg::kFlashWindow);
pMsg->Send(clientKey); // whoosh... off it goes
}
#include "hsTimer.h"
/////////////////////////////////////////////////////////////////////////////
//

View File

@ -244,6 +244,15 @@ public:
//
static hsBool WasLocallyNotified(pyKey &selfkey);
/////////////////////////////////////////////////////////////////////////////
//
// Function : FlashWindow
// PARAMETERS :
//
// PURPOSE : Flashes the client window if it is not focused
//
static void FlashWindow();
/////////////////////////////////////////////////////////////////////////////
//
// Function : GetClientName

View File

@ -48,6 +48,8 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
#include <python.h>
PYTHON_BASIC_GLOBAL_METHOD_DEFINITION(PtFlashWindow, cyMisc::FlashWindow, "Flashes the client window if it is not focused");
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtGetAgeName, "DEPRECIATED - use ptDniInfoSource instead")
{
return PyString_FromString(cyMisc::GetAgeName());
@ -496,6 +498,8 @@ PYTHON_GLOBAL_METHOD_DEFINITION(PtDumpLogs, args, "Params: folder\nDumps all cur
void cyMisc::AddPlasmaMethods(std::vector<PyMethodDef> &methods)
{
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtFlashWindow);
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtGetAgeName);
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtGetAgeInfo);
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtGetAgeTime);

View File

@ -94,6 +94,8 @@ public:
kEnableRenderScene,
kResetGraphicsDevice,
kSetGraphicsDefaults,
kFlashWindow,
};
// graphics settings fields

View File

@ -385,7 +385,7 @@ bool plNCAgeJoiner::MsgReceive (plMessage * msg) {
}
else if (unsigned ageVaultId = NetCommGetAge()->ageVaultId) {
// Download the age vault
VaultDownload(
VaultDownloadNoCallbacks(
L"AgeJoin",
ageVaultId,
AgeVaultDownloadCallback,

View File

@ -318,7 +318,7 @@ static void INetCliAuthSetPlayerRequestCallback (
else {
s_needAvatarLoad = true;
VaultDownload(
VaultDownloadNoCallbacks(
L"SetActivePlayer",
s_player->playerInt,
PlayerInitCallback,
@ -374,7 +374,7 @@ static void INetCliAuthLoginSetPlayerRequestCallback (
msg->Send();
}
else {
VaultDownload(
VaultDownloadNoCallbacks(
L"SetActivePlayer",
s_player->playerInt,
LoginPlayerInitCallback,

View File

@ -181,8 +181,24 @@ struct VaultDownloadTrans {
unsigned vaultId;
ENetError result;
VaultDownloadTrans ();
VaultDownloadTrans()
: callback(), cbParam(), progressCallback(), cbProgressParam(),
nodeCount(), nodesLeft(), vaultId(), result(kNetSuccess)
{
}
VaultDownloadTrans(const wchar_t* _tag, FVaultDownloadCallback _callback,
void* _cbParam, FVaultProgressCallback _progressCallback,
void* _cbProgressParam, unsigned _vaultId)
: callback(_callback), cbParam(_cbParam), progressCallback(_progressCallback),
cbProgressParam(_cbProgressParam), nodeCount(), nodesLeft(),
vaultId(_vaultId), result(kNetSuccess)
{
StrCopy(tag, _tag, arrsize(tag));
}
virtual ~VaultDownloadTrans() { }
static void VaultNodeFetched (
ENetError result,
void * param,
@ -196,6 +212,28 @@ struct VaultDownloadTrans {
);
};
struct VaultDownloadNoCallbacksTrans : VaultDownloadTrans {
VaultDownloadNoCallbacksTrans()
: VaultDownloadTrans()
{
VaultSuppressCallbacks();
}
VaultDownloadNoCallbacksTrans(const wchar_t* _tag, FVaultDownloadCallback _callback,
void* _cbParam, FVaultProgressCallback _progressCallback,
void* _cbProgressParam, unsigned _vaultId)
: VaultDownloadTrans(_tag, _callback, _cbParam, _progressCallback, _cbProgressParam, _vaultId)
{
VaultSuppressCallbacks();
}
~VaultDownloadNoCallbacksTrans()
{
VaultEnableCallbacks();
}
};
struct VaultAgeInitTrans {
FVaultInitAgeCallback callback;
void * cbState;
@ -262,6 +300,8 @@ static HASHTABLEDECL(
static bool s_processPlayerInbox = false;
static long s_suppressCallbacks = 0;
/*****************************************************************************
*
* Local functions
@ -303,8 +343,10 @@ static void VaultNodeAddedDownloadCallback(ENetError result, void * param) {
VaultProcessUnvisitNote(childLink->node);
}
for (IVaultCallback * cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->AddedChildNode(parentLink->node, childLink->node);
if (s_suppressCallbacks == 0) {
for (IVaultCallback* cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->AddedChildNode(parentLink->node, childLink->node);
}
}
}
@ -377,9 +419,11 @@ static void BuildNodeTree (
parentNode->state->children.Add(childLink);
if (notifyNow || childNode->nodeType != 0) {
// We made a new link, so make the callbacks
for (IVaultCallback * cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->AddedChildNode(parentNode, childNode);
if (s_suppressCallbacks == 0) {
// We made a new link, so make the callbacks
for (IVaultCallback* cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->AddedChildNode(parentNode, childNode);
}
}
else {
INotifyAfterDownload* notify = NEWZERO(INotifyAfterDownload)(parentNode->nodeId, childNode->nodeId);
@ -543,6 +587,10 @@ static void ChangedVaultNodeFetched (
RelVaultNodeLink* savedLink = s_nodes.Find(node->nodeId);
// Yeah, we are purposefully allowing this global callback to go out,
// even if callback suppression has been enabled. The intent behind
// that is to suppress spurious callbacks, but node changes are
// probably not spurious.
if (savedLink) {
for (IVaultCallback * cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->ChangedNode(savedLink->node);
@ -638,7 +686,7 @@ static void VaultNodeAdded (
RelVaultNodeLink* parentLink = s_nodes.Find(parentId);
RelVaultNodeLink* childLink = s_nodes.Find(childId);
if (childLink->node->nodeType != 0) {
if (childLink->node->nodeType != 0 && s_suppressCallbacks == 0) {
for (IVaultCallback * cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->AddedChildNode(parentLink->node, childLink->node);
}
@ -660,7 +708,7 @@ static void VaultNodeRemoved (
if (!childLink)
break;
if (parentLink->node->IsParentOf(childId, 1)) {
if (parentLink->node->IsParentOf(childId, 1) && s_suppressCallbacks == 0) {
// We have the relationship, so make the callbacks
for (IVaultCallback * cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->RemovingChildNode(parentLink->node, childLink->node);
@ -831,11 +879,6 @@ void VaultFindNodeTrans::VaultNodeFound (
*
***/
//============================================================================
VaultDownloadTrans::VaultDownloadTrans () {
ASSERT(!nodeCount); // must be alloced with
}
//============================================================================
void VaultDownloadTrans::VaultNodeFetched (
ENetError result,
@ -1047,8 +1090,10 @@ void IRelVaultNode::UnlinkFromRelatives () {
next = parents.Next(link);
// We have the relationship, so make the callbacks
for (IVaultCallback * cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->RemovingChildNode(link->node, this->node);
if (s_suppressCallbacks == 0) {
for (IVaultCallback* cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->RemovingChildNode(link->node, this->node);
}
link->node->state->Unlink(node);
}
@ -1478,6 +1523,16 @@ void VaultUnregisterCallback (VaultCallback * cb) {
cb->internal = nil;
}
//============================================================================
void VaultSuppressCallbacks() {
AtomicAdd(&s_suppressCallbacks, 1);
}
//============================================================================
void VaultEnableCallbacks() {
long prevValue = AtomicAdd(&s_suppressCallbacks, -1);
hsAssert(prevValue > 0, "Hmm... A negative vault callback suppression count?");
}
/*****************************************************************************
*
@ -1772,8 +1827,10 @@ void VaultRemoveChildNode (
if (parentLink->node->IsParentOf(childId, 1)) {
// We have the relationship, so make the callbacks
for (IVaultCallback * cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->RemovingChildNode(parentLink->node, childLink->node);
if (s_suppressCallbacks == 0) {
for (IVaultCallback* cb = s_callbacks.Head(); cb; cb = s_callbacks.Next(cb))
cb->cb->RemovingChildNode(parentLink->node, childLink->node);
}
}
parentLink->node->state->Unlink(childLink->node);
@ -4945,13 +5002,27 @@ void VaultDownload (
FVaultProgressCallback progressCallback,
void * cbProgressParam
) {
VaultDownloadTrans * trans = NEWZERO(VaultDownloadTrans);
StrCopy(trans->tag, tag, arrsize(trans->tag));
trans->callback = callback;
trans->cbParam = cbParam;
trans->progressCallback = progressCallback;
trans->cbProgressParam = cbProgressParam;
trans->vaultId = vaultId;
VaultDownloadTrans * trans = new VaultDownloadTrans(tag, callback, cbParam,
progressCallback, cbProgressParam, vaultId);
NetCliAuthVaultFetchNodeRefs(
vaultId,
VaultDownloadTrans::VaultNodeRefsFetched,
trans
);
}
//============================================================================
void VaultDownloadNoCallbacks (
const wchar tag[],
unsigned vaultId,
FVaultDownloadCallback callback,
void* cbParam,
FVaultProgressCallback progressCallback,
void* cbProgressParam
) {
VaultDownloadNoCallbacksTrans* trans = new VaultDownloadNoCallbacksTrans(tag, callback,
cbParam, progressCallback, cbProgressParam, vaultId);
NetCliAuthVaultFetchNodeRefs(
vaultId,
@ -5001,6 +5072,8 @@ void VaultDownloadAndWait (
//============================================================================
void VaultCull (unsigned vaultId) {
VaultCallbackSuppressor suppress;
// Remove the node from the global table
if (RelVaultNodeLink * link = s_nodes.Find(vaultId)) {
LogMsg(kLogDebug, L"Vault: Culling node %u", link->node->nodeId);

View File

@ -82,6 +82,18 @@ struct VaultCallback {
void VaultRegisterCallback (VaultCallback * cb);
void VaultUnregisterCallback (VaultCallback * cb);
void VaultSuppressCallbacks();
void VaultEnableCallbacks();
class VaultCallbackSuppressor
{
VaultCallbackSuppressor(const VaultCallbackSuppressor&) { }
VaultCallbackSuppressor(VaultCallbackSuppressor&&) { }
public:
VaultCallbackSuppressor() { VaultSuppressCallbacks(); }
~VaultCallbackSuppressor() { VaultEnableCallbacks(); }
};
/*****************************************************************************
*
@ -476,6 +488,14 @@ void VaultDownload (
FVaultProgressCallback progressCallback,
void * cbProgressParam
);
void VaultDownloadNoCallbacks(
const wchar tag[],
unsigned vaultId,
FVaultDownloadCallback callback,
void* cbParam,
FVaultProgressCallback progressCallback,
void* cbProgressParam
);
void VaultDownloadAndWait (
const wchar tag[],
unsigned vaultId,