bool Remove( plCommonObjLib *lib ) { int idx = fLibs.Find( lib ); if( idx != fLibs.kMissingIndex ) fLibs.Remove( idx ); else { hsAssert( false, "Common Object Lib not found in list upon deletion. Are you misusing this class? Tsk tsk!" ); } fRefCount--; return ( fRefCount == 0 ) ? true : false; }
hsBool plMorphSequence::MsgReceive(plMessage* msg) { plRenderMsg* rend = plRenderMsg::ConvertNoRef(msg); if( rend ) { // For now, I'm ignoring the target weight stuff for shared meshes. // Can always add it in later if desired. if( fTgtWgts.GetCount() ) { float delWgt = hsTimer::GetDelSysSeconds() / (kMorphTime > 0 ? kMorphTime : 1.e-3f); int i; for( i = 0; i < fTgtWgts.GetCount(); i++ ) { float currWgt = GetWeight(fTgtWgts[i].fLayer, fTgtWgts[i].fDelta); if( fTgtWgts[i].fWeight < currWgt ) { if( fTgtWgts[i].fWeight >= (currWgt -= delWgt) ) currWgt = fTgtWgts[i].fWeight; } else if( fTgtWgts[i].fWeight > currWgt ) { if( fTgtWgts[i].fWeight <= (currWgt += delWgt) ) currWgt = fTgtWgts[i].fWeight; } fMorphs[fTgtWgts[i].fLayer].SetWeight(fTgtWgts[i].fDelta, currWgt); if( fTgtWgts[i].fWeight == currWgt ) { fTgtWgts.Remove(i); i--; } } ISetDirty(true); } if( !(fMorphFlags & kDirty) ) { // We went a whole frame without getting dirty, // we can stop refreshing now. plgDispatch::Dispatch()->UnRegisterForExactType(plRenderMsg::Index(), GetKey()); return true; } ISetDirty(false); if( fMorphFlags & kDirtyIndices ) IFindIndices(); if( fMorphFlags & kHaveShared ) { IApplyShared(); } else { Apply(); } return true; } plSharedMeshBCMsg *smMsg = plSharedMeshBCMsg::ConvertNoRef(msg); if (smMsg) { if (IGetDrawInterface()->GetKey() == smMsg->GetSender() || IIsUsingDrawable(smMsg->fDraw)) fMorphFlags |= kDirtyIndices; } plGenRefMsg *refMsg = plGenRefMsg::ConvertNoRef(msg); if (refMsg) { plSharedMesh *mesh = plSharedMesh::ConvertNoRef(refMsg->GetRef()); if (mesh) { if( refMsg->GetContext() & (plRefMsg::kOnCreate|plRefMsg::kOnRequest) ) { AddSharedMesh(mesh); } else if( refMsg->GetContext() & plRefMsg::kOnReplace) { plSharedMesh *oldMesh = plSharedMesh::ConvertNoRef(refMsg->GetOldRef()); if (oldMesh) RemoveSharedMesh(oldMesh); AddSharedMesh(mesh); } else if( refMsg->GetContext() & (plRefMsg::kOnDestroy|plRefMsg::kOnRemove) ) RemoveSharedMesh(mesh); return true; } } return plSingleModifier::MsgReceive(msg); }