public LSL_Integer llEdgeOfWorld(LSL_Vector pos, LSL_Vector dir)
{
m_host.AddScriptLPS(1);
if(dir.x == 0 && dir.y == 0)
return 1; // SL wiki
float rsx = World.RegionInfo.RegionSizeX;
float rsy = World.RegionInfo.RegionSizeY;
// can understand what sl does if position is not in region, so do something :)
float px = (float)Util.Clamp(pos.x, 0.5, rsx - 0.5);
float py = (float)Util.Clamp(pos.y, 0.5, rsy - 0.5);
float ex, ey;
if (dir.x == 0)
{
ex = px;
ey = dir.y > 0 ? rsy + 1.0f : -1.0f;
}
else if(dir.y == 0)
{
ex = dir.x > 0 ? rsx + 1.0f : -1.0f;
ey = py;
}
else
{
float dx = (float) dir.x;
float dy = (float) dir.y;
float t1 = dx * dx + dy * dy;
t1 = (float)Math.Sqrt(t1);
dx /= t1;
dy /= t1;
if(dx > 0)
t1 = (rsx + 1f - px)/dx;
else
t1 = -(px + 1f)/dx;
float t2;
if(dy > 0)
t2 = (rsy + 1f - py)/dy;
else
t2 = -(py + 1f)/dy;
if(t1 > t2)
t1 = t2;
ex = px + t1 * dx;
ey = py + t1 * dy;
}
ex += World.RegionInfo.WorldLocX;
ey += World.RegionInfo.WorldLocY;
if(World.GridService.GetRegionByPosition(World.RegionInfo.ScopeID, (int)ex, (int)ey) != null)
return 0;
return 1;
}