hsBool plModifier::MsgReceive(plMessage* msg) { plEvalMsg* eval = plEvalMsg::ConvertNoRef(msg); if( eval ) { uint32_t dirty = ~0L; IEval(eval->DSeconds(), eval->DelSeconds(), dirty); return true; } return plSynchedObject::MsgReceive(msg); }
bool plCubicRenderTargetModifier::MsgReceive( plMessage* msg ) { plEvalMsg* eval = plEvalMsg::ConvertNoRef(msg); if (eval) { const double secs = eval->DSeconds(); const float del = eval->DelSeconds(); IEval(secs, del, 0); return true; } plRefMsg* refMsg = plRefMsg::ConvertNoRef(msg); if (refMsg) { plSceneObject* scene = plSceneObject::ConvertNoRef(refMsg->GetRef()); if (scene) { if (refMsg->GetContext() & (plRefMsg::kOnCreate | plRefMsg::kOnRequest | plRefMsg::kOnReplace)) AddTarget(scene); else RemoveTarget(scene); } plCubicRenderTarget* cubic = plCubicRenderTarget::ConvertNoRef(refMsg->GetRef()); if (cubic) { if (refMsg->GetContext() & (plRefMsg::kOnCreate | plRefMsg::kOnRequest | plRefMsg::kOnReplace)) { fCubic = cubic; for (int i = 0; i < 6; i++) ICreateRenderRequest(i); } else { fCubic = nullptr; for (int i = 0; i < 6; i++) { delete fRequests[i]; fRequests[i] = nullptr; } } } return true; } return plModifier::MsgReceive(msg); }
bool plListener::MsgReceive(plMessage* msg) { plSetListenerMsg *setMsg = plSetListenerMsg::ConvertNoRef( msg ); if( setMsg != nil ) { bool useVCam; if( setMsg->GetType() & plSetListenerMsg::kVCam ) { // Reset any ratios if( setMsg->GetType() & plSetListenerMsg::kPosition ) fPosRatio = 0.f; if( setMsg->GetType() & plSetListenerMsg::kVelocity ) fVelRatio = 0.f; if( setMsg->GetType() & plSetListenerMsg::kFacing ) fFacingRatio = 0.f; IEnsureVCamValid(); } else { useVCam = setMsg->IsBinding(); if( setMsg->GetType() & plSetListenerMsg::kPosition ) fPosRatio = 1.f; if( setMsg->GetType() & plSetListenerMsg::kVelocity ) fVelRatio = 1.f; if( setMsg->GetType() & plSetListenerMsg::kFacing ) fFacingRatio = 1.f; if( fPosRatio > 0.f || fVelRatio > 0.f || fFacingRatio > 0.f ) // Need this, so store it now ISetRef( setMsg->GetSrcKey(), setMsg->IsBinding(), kRefObject ); } return true; } plEvalMsg* pEMsg = plEvalMsg::ConvertNoRef(msg); if (pEMsg) { IEval(pEMsg->GetTimeStamp(), pEMsg->DelSeconds(), true); if( fInitMe ) { // By default, position and orientation are camera based plSetListenerMsg *set = new plSetListenerMsg( plSetListenerMsg::kVCam | plSetListenerMsg::kFacing, nil, true ); set->Send(); set = new plSetListenerMsg( plSetListenerMsg::kVCam | plSetListenerMsg::kPosition, nil, true ); set->Send(); fInitMe = false; } return true; } plGenRefMsg* refMsg = plGenRefMsg::ConvertNoRef( msg ); if( refMsg != nil ) { if( refMsg->fType == kRefVCam ) { if( refMsg->GetContext() & ( plRefMsg::kOnCreate | plRefMsg::kOnRequest | plRefMsg::kOnReplace ) ) { fVCam = plVirtualCam1::ConvertNoRef( refMsg->GetRef() ); } else if( refMsg->GetContext() & ( plRefMsg::kOnRemove | plRefMsg::kOnDestroy ) ) { if( plVirtualCam1::ConvertNoRef( refMsg->GetRef() ) == fVCam ) fVCam = nil; } ICheckAudio(); } return true; } return plSingleModifier::MsgReceive(msg); }
bool plInputInterfaceMgr::MsgReceive( plMessage *msg ) { int i; plEvalMsg *pEvalMsg = plEvalMsg::ConvertNoRef( msg ); if( pEvalMsg ) { IEval( pEvalMsg->GetTimeStamp(), pEvalMsg->DelSeconds(), false ); return true; } plInputEventMsg *ieMsg = plInputEventMsg::ConvertNoRef( msg ); if( ieMsg != nil ) { const char *inputIEM = "InputEventMsg"; plProfile_BeginLap(Input, inputIEM); bool handled = false; uint32_t missedInputStartIdx = 0; plInputInterface *oldCurrentFocus = fCurrentFocus; // Current focus (if there is one) gets first crack if( fCurrentFocus ) { if( fCurrentFocus->IsEnabled() ) { handled = (fCurrentFocus->ProcessKeyBindings(ieMsg) || fCurrentFocus->InterpretInputEvent(ieMsg)); } } if (!handled) { // Walk our stack for( i = 0; i < fInterfaces.GetCount(); i++ ) { if( fInterfaces[ i ]->IsEnabled() && fInterfaces[ i ] != oldCurrentFocus) { // Try the key bindings first (common for all layers) if( fInterfaces[ i ]->ProcessKeyBindings( ieMsg ) || fInterfaces[ i ]->InterpretInputEvent( ieMsg )) { handled = true; break; } } } if( !handled ) { // Fell all the way through the stack...must've been a very uninteresting message... if( plKeyEventMsg::ConvertNoRef( ieMsg ) && fDefaultCatcher != nil ) { // But somebody loves those keys :) fDefaultCatcher->HandleKeyEvent( plKeyEventMsg::ConvertNoRef( ieMsg ) ); } } missedInputStartIdx = i + 1; } // Notify the rest of the interfaces in the stack that they missed the event ("lost focus", as it were) for (i = missedInputStartIdx; i < fInterfaces.GetCount(); i++) if (fInterfaces[i] != oldCurrentFocus) fInterfaces[i]->MissedInputEvent(ieMsg); // Now we re-walk to see who's the new interested party. Note that we have to re-walk // because a key down may have changed some layer's interest in the cursor if( !fForceCursorHidden ) { bool cursorHandled = false; if (fCurrentFocus) cursorHandled = ICheckCursor(fCurrentFocus); if (!cursorHandled) { for( i = 0; i < fInterfaces.GetCount(); i++ ) { if (ICheckCursor(fInterfaces[i])) { cursorHandled = true; break; } } if (!cursorHandled) { // NOBODY is interested in the mouse, so set to our default cursor IUpdateCursor( plInputInterface::kCursorUp ); fCursorOpacity = 1.f; plMouseDevice::SetCursorOpacity( fCursorOpacity ); } } } else { // Special debug flag to force the cursor to be hidden if( fCursorOpacity != 0.f ) { fCursorOpacity = 0.f; plMouseDevice::SetCursorOpacity( fCursorOpacity ); } } plProfile_EndLap(Input, inputIEM); return true; } plInputIfaceMgrMsg *mgrMsg = plInputIfaceMgrMsg::ConvertNoRef( msg ); if( mgrMsg != nil ) { if( mgrMsg->GetCommand() == plInputIfaceMgrMsg::kAddInterface ) { IAddInterface( mgrMsg->GetIFace() ); return true; } else if( mgrMsg->GetCommand() == plInputIfaceMgrMsg::kRemoveInterface ) { IRemoveInterface( mgrMsg->GetIFace() ); return true; } else if( mgrMsg->GetCommand() == plInputIfaceMgrMsg::kEnableClickables ) { fClickEnabled = true; } else if( mgrMsg->GetCommand() == plInputIfaceMgrMsg::kDisableClickables ) { fClickEnabled = false; } } plPlayerPageMsg *pPMsg = plPlayerPageMsg::ConvertNoRef( msg ); if( pPMsg != nil && !pPMsg->fUnload) { if( pPMsg->fPlayer == plNetClientMgr::GetInstance()->GetLocalPlayerKey() ) fReceivers.Append( pPMsg->fPlayer ); else { int idx = fReceivers.Find( pPMsg->fPlayer ); if( idx != fReceivers.kMissingIndex ) fReceivers.Remove( idx ); } } plCmdIfaceModMsg *pCMsg = plCmdIfaceModMsg::ConvertNoRef( msg ); if( pCMsg ) { if( pCMsg->Cmd( plCmdIfaceModMsg::kAdd ) ) { for( int i = 0; i < fReceivers.Count(); i++ ) { if( fReceivers[i] == pCMsg->GetSender() ) return true; } fReceivers.Append( pCMsg->GetSender() ); return true; } else if( pCMsg->Cmd( plCmdIfaceModMsg::kRemove ) ) { for( int i = 0; i < fReceivers.Count(); i++ ) { if( fReceivers[ i ] == pCMsg->GetSender() ) { fReceivers.Remove( i ); break; } } return true; } } plClientMsg *cMsg = plClientMsg::ConvertNoRef(msg); if (cMsg && cMsg->GetClientMsgFlag() == plClientMsg::kInitComplete) { // Backwards compatability hack: // We've loaded in the user prefs for input. If they bind movement // to an arrow, or numpad, and the other binding is free, automatically // bind the other one. plKeyMap *map = plAvatarInputInterface::GetInstance()->fControlMap; map->HandleAutoDualBinding(KEY_UP, KEY_NUMPAD8); map->HandleAutoDualBinding(KEY_DOWN, KEY_NUMPAD2); map->HandleAutoDualBinding(KEY_LEFT, KEY_NUMPAD4); map->HandleAutoDualBinding(KEY_RIGHT, KEY_NUMPAD6); plgDispatch::Dispatch()->UnRegisterForExactType( plClientMsg::Index(), GetKey() ); return true; } // Wasn't one we want. Was it one that one of our interfaces wanted? for( i = 0; i < fInterfaces.GetCount(); i++ ) { if( fInterfaces[ i ]->MsgReceive( msg ) ) return true; } // Nothing, pass on... return plSingleModifier::MsgReceive( msg ); }