OpenSim.Region.ScriptEngine.Shared.Api.LSL_Api.llEdgeOfWorld C# (CSharp) Method

llEdgeOfWorld() public method

public llEdgeOfWorld ( OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3 pos, OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3 dir ) : OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger
pos OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3
dir OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3
return OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger
        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;
        }
LSL_Api