From: <wjp...@us...> - 2008-02-16 21:23:40
|
Revision: 5040 http://gemrb.svn.sourceforge.net/gemrb/?rev=5040&view=rev Author: wjpalenstijn Date: 2008-02-16 13:23:43 -0800 (Sat, 16 Feb 2008) Log Message: ----------- let Selectable::IsOver only check if point is inside the ground circle, ignoring the sprite's bounding box Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2008-02-16 20:52:53 UTC (rev 5039) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2008-02-16 21:23:43 UTC (rev 5040) @@ -730,13 +730,23 @@ } } -bool Selectable::IsOver(Point &Pos) +// Check if P is over our ground circle +bool Selectable::IsOver(Point &P) { - //actually, i'm not sure if bbox should be used or just the feet circle - if ((signed) Distance(Pos, this->Pos)<size*10) { - return true; - } - return BBox.PointInside( Pos ); + int csize = size; + if (csize < 2) csize = 2; + + int dx = P.x - Pos.x; + int dy = P.y - Pos.y; + + // check rectangle first + if (dx < -(csize-1)*16 || dx > (csize-1)*16) return false; + if (dy < -(csize-1)*12 || dy > (csize-1)*12) return false; + + // then check ellipse + int r = 9*dx*dx + 16*dy*dy; // 48^2 * ( (dx/16)^2 + (dy/12)^2 ) + + return (r <= 48*48*(csize-1)*(csize-1)); } bool Selectable::IsSelected() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |