void ui_core::PushScissor(const Frect& r_tgt, bool overlapped) { //. return; Frect r_top = ScreenRect(); Frect result = r_tgt; if (!m_Scissors.empty()&&!overlapped){ r_top = m_Scissors.top(); } if (!result.intersection(r_top,r_tgt)) result.set (0.0f,0.0f,0.0f,0.0f); if (!(result.x1>=0&&result.y1>=0&&result.x2<=UI_BASE_WIDTH&&result.y2<=UI_BASE_HEIGHT) ) { Msg("! r_tgt [%.3f][%.3f][%.3f][%.3f]", r_tgt.x1, r_tgt.y1, r_tgt.x2, r_tgt.y2); Msg("! result [%.3f][%.3f][%.3f][%.3f]", result.x1, result.y1, result.x2, result.y2); VERIFY(result.x1>=0&&result.y1>=0&&result.x2<=UI_BASE_WIDTH&&result.y2<=UI_BASE_HEIGHT); } m_Scissors.push (result); result.lt.x = ClientToScreenScaledX(result.lt.x); result.lt.y = ClientToScreenScaledY(result.lt.y); result.rb.x = ClientToScreenScaledX(result.rb.x); result.rb.y = ClientToScreenScaledY(result.rb.y); Irect r; r.x1 = iFloor(result.x1); r.x2 = iFloor(result.x2+0.5f); r.y1 = iFloor(result.y1); r.y2 = iFloor(result.y2+0.5f); RCache.set_Scissor (&r); }
//position and heading for drawing pointer to src pos bool CUICustomMap::GetPointerTo(const Fvector2& src, float item_radius, Fvector2& pos, float& heading) { Frect clip_rect_abs = GetClipperRect(); //absolute rect coords Frect map_rect_abs; GetAbsoluteRect(map_rect_abs); Frect rect; BOOL res = rect.intersection(clip_rect_abs, map_rect_abs); if(!res) return false; rect = clip_rect_abs; rect.sub(map_rect_abs.lt.x,map_rect_abs.lt.y); Fbox2 f_clip_rect_local; f_clip_rect_local.set(rect.x1, rect.y1, rect.x2, rect.y2 ); Fvector2 f_center; f_clip_rect_local.getcenter(f_center); Fvector2 f_dir, f_src; f_src.set(src.x, src.y ); f_dir.sub(f_center, f_src ); f_dir.normalize_safe(); Fvector2 f_intersect_point; res = f_clip_rect_local.Pick2(f_src,f_dir,f_intersect_point); VERIFY(res); heading = -f_dir.getH(); f_intersect_point.mad(f_intersect_point,f_dir,item_radius ); pos.set( iFloor(f_intersect_point.x), iFloor(f_intersect_point.y) ); return true; }