void VisibilityManager::decreaseVisibility(CreatureObject* creature) { Reference<PlayerObject*> ghost = creature->getSlottedObject("ghost").castTo<PlayerObject*>(); if (ghost != NULL) { Locker locker(ghost); if (ghost->getVisibility() > 0) { float visibilityDecrease = ghost->getLastVisibilityUpdateTimestamp().miliDifference() / 1000.f / 3600.f; if (ghost->getVisibility() <= visibilityDecrease) { clearVisibility(creature); } else { ghost->setVisibility(ghost->getVisibility() - visibilityDecrease); if (ghost->getVisibility() < TERMINALVISIBILITYLIMIT) { removePlayerFromBountyList(creature); } } } } }
void eWidgetDesktop::calcWidgetClipRegion(eWidget *widget, gRegion &parent_visible) { /* start with our clip region, clipped with the parent's */ if (widget->m_vis & eWidget::wVisShow) { widget->m_visible_region = widget->m_clip_region; widget->m_visible_region.moveBy(widget->position()); widget->m_visible_region &= parent_visible; // in parent space! if (!widget->isTransparent()) /* remove everything this widget will contain from parent's visible list, unless widget is transparent. */ parent_visible -= widget->m_visible_region; // will remove child regions too! /* now prepare for recursing to childs */ widget->m_visible_region.moveBy(-widget->position()); // now in local space } else widget->m_visible_region = gRegion(); widget->m_visible_with_childs = widget->m_visible_region; /* add childs in reverse (Z) order - we're going from front-to-bottom here. */ ePtrList<eWidget>::iterator i(widget->m_childs.end()); for (;;) { if (i != widget->m_childs.end()) { if (i->m_vis & eWidget::wVisShow) calcWidgetClipRegion(*i, widget->m_visible_region); else clearVisibility(*i); } if (i == widget->m_childs.begin()) break; --i; } }
void eWidgetDesktop::recalcClipRegions(eWidget *root) { if (m_comp_mode == cmImmediate) { gRegion background_before = m_screen.m_background_region; m_screen.m_background_region = gRegion(eRect(ePoint(0, 0), m_screen.m_screen_size)); for (ePtrList<eWidget>::iterator i(m_root.begin()); i != m_root.end(); ++i) { if (!(i->m_vis & eWidget::wVisShow)) { clearVisibility(i); continue; } gRegion visible_before = i->m_visible_with_childs; calcWidgetClipRegion(*i, m_screen.m_background_region); gRegion redraw = (i->m_visible_with_childs - visible_before) | (visible_before - i->m_visible_with_childs); redraw.moveBy(i->position()); invalidate(redraw); } gRegion redraw = (background_before - m_screen.m_background_region) | (m_screen.m_background_region - background_before); invalidate(redraw); } else if (m_comp_mode == cmBuffered) { if (!(root->m_vis & eWidget::wVisShow)) { clearVisibility(root); for (int i = 0; i < MAX_LAYER; ++i) removeBufferForWidget(root, i); return; } for (int i = 0; i < MAX_LAYER; ++i) { eWidgetDesktopCompBuffer *comp = root->m_comp_buffer[i]; /* TODO: layers might not be required to have the screen size, for memory reasons. */ if ((i == 0 && !comp) || (comp && (root->size() != comp->m_screen_size))) createBufferForWidget(root, 0); comp = root->m_comp_buffer[i]; /* it might have changed. */ if (!comp) continue; /* WAIT, don't we need to invalidate,whatever */ /* CHECKME: don't we need to recalculate everything? after all, our buffer has changed and is likely to be cleared */ gRegion visible_before = root->m_visible_with_childs; comp->m_background_region = gRegion(eRect(comp->m_position, comp->m_screen_size)); gRegion visible_new = root->m_visible_with_childs - visible_before; gRegion visible_lost = visible_before - root->m_visible_with_childs; visible_new.moveBy(root->position()); visible_lost.moveBy(root->position()); invalidate(visible_new, root, i); invalidate(visible_lost, root, i); calcWidgetClipRegion(root, comp->m_background_region); } } }
void eWidgetDesktop::clearVisibility(eWidget *widget) { widget->m_visible_with_childs = gRegion(); for (ePtrList<eWidget>::iterator i(widget->m_childs.begin()); i != widget->m_childs.end(); ++i) clearVisibility(*i); }