コード例 #1
0
        public float GetHeight(long dataX, long dataZ, long x, long z)
        {
            Data2D data = data2D[dataX][dataZ];

            if (data.IsLoaded)
            {
                return(data.GetHeight(x, z));
            }
            return(0.0f);
        }
コード例 #2
0
        public float GetRealPageHeight(float x, float z, long pageX, long pageZ, long Lod)
        {
            // scale position from world to page scale
            float localX = x / Options.Instance.Scale.x;
            float localZ = z / Options.Instance.Scale.z;

            // adjust x and z to be local to page
            long pSize = Options.Instance.PageSize - 1;

            localX -= (float)(pageX - Options.Instance.World_Width * 0.5f) * pSize;
            localZ -= (float)(pageZ - Options.Instance.World_Height * 0.5f) * pSize;

            // make sure x and z do not go outside the world boundaries
            if (localX < 0)
            {
                localX = 0;
            }
            else if (localX > pSize)
            {
                localX = pSize;
            }

            if (localZ < 0)
            {
                localZ = 0;
            }
            else if (localZ > pSize)
            {
                localZ = pSize;
            }

            // find the 4 vertices that surround the point
            // use LOD info to determine vertex spacing - this is passed into the method
            // determine vertices on left and right of point and top and bottom
            // don't access VBO since a big performance hit when only 4 vertices are needed
            int vertex_spread = 1 << (int)Lod;

            // find the vertex to the bottom left of the point
            int bottom_left_x = ((int)(localX / vertex_spread)) * vertex_spread;
            int bottom_left_z = ((int)(localZ / vertex_spread)) * vertex_spread;

            // find the 4 heights around the point
            Data2D data           = data2D[pageX][pageZ];
            float  bottom_left_y  = data.GetHeight(bottom_left_x, bottom_left_z);
            float  bottom_right_y = data.GetHeight(bottom_left_x + vertex_spread, bottom_left_z);
            float  top_left_y     = data.GetHeight(bottom_left_x, bottom_left_z + vertex_spread);
            float  top_right_y    = data.GetHeight(bottom_left_x + vertex_spread, bottom_left_z + vertex_spread);

            float x_pct = (localX - (float)bottom_left_x) / (float)vertex_spread;
            float z_pct = (localZ - (float)bottom_left_z) / (float)vertex_spread;

            //bilinear interpolate to find the height.

            // figure out which 3 vertices are closest to the point and use those to form triangle plane for intersection
            // Triangle strip has diagonal going from bottom left to top right
            if ((x_pct - z_pct) >= 0)
            {
                return((bottom_left_y + (bottom_right_y - bottom_left_y) * x_pct + (top_right_y - bottom_right_y) * z_pct));
            }
            else
            {
                return((top_left_y + (top_right_y - top_left_y) * x_pct + (bottom_left_y - top_left_y) * (1 - z_pct)));
            }
        }
コード例 #3
0
        public float GetHeightAtPage(long dataX, long dataZ, int x, int z)
        {
            Data2D data = data2D[dataX][dataZ];

            if (data.IsLoaded)
            {
                int lX    = x;
                int lZ    = z;
                int pSize = (int)Options.Instance.PageSize;
                //check if we have to change current page
                if (lX < 0)
                {
                    if (dataX == 0)
                    {
                        lX = 0;
                    }
                    else
                    {
                        data = data2D[dataX - 1][dataZ];
                        if (data.IsLoaded)
                        {
                            lX = pSize;
                        }
                        else
                        {
                            lX   = 0;
                            data = data2D[dataX][dataZ];
                        }
                    }
                }
                else if (lX > pSize)
                {
                    if (dataX == Options.Instance.World_Width)
                    {
                        lX = pSize;
                    }
                    else
                    {
                        data = data2D[dataX + 1][dataZ];
                        if (data.IsLoaded)
                        {
                            lX = 0;
                        }
                        else
                        {
                            lX   = pSize;
                            data = data2D[dataX][dataZ];
                        }
                    }
                }

                if (lZ < 0)
                {
                    if (dataZ == 0)
                    {
                        lZ = 0;
                    }
                    else
                    {
                        data = data2D[dataX][dataZ - 1];
                        if (data.IsLoaded)
                        {
                            lZ = pSize;
                        }
                        else
                        {
                            lZ   = 0;
                            data = data2D[dataX][dataZ];
                        }
                    }
                }
                else if (lZ > pSize)
                {
                    if (dataZ == Options.Instance.World_Height)
                    {
                        lZ = pSize;
                    }
                    else
                    {
                        data = data2D[dataX][dataZ + 1];
                        if (data.IsLoaded)
                        {
                            lZ = 0;
                        }
                        else
                        {
                            lZ   = pSize;
                            data = data2D[dataX][dataZ];
                        }
                    }
                }
                return(data.GetHeight(x, z));
            }
            return(0.0f);
        }
コード例 #4
0
        public float GetHeightAtPage(long dataX, long dataZ, float x, float z)
        {
            Data2D data = null;

            float lX    = x;
            float lZ    = z;
            float pSize = Options.Instance.PageSize;

            //check if we have to change current page
            if (lX < 0.0f)
            {
                if (dataX == 0)
                {
                    lX = 0.0f;
                }
                else
                {
                    data = data2D[dataX - 1][dataZ];
                    if (data.IsLoaded)
                    {
                        lX = (float)(pSize - 1);
                    }
                    else
                    {
                        lX   = 0.0f;
                        data = data2D[dataX][dataZ];
                    }
                }
            }
            else if (lX > pSize)
            {
                if (dataX == Options.Instance.World_Width - 1)
                {
                    lX = (float)(pSize);
                }
                else
                {
                    data = data2D[dataX + 1][dataZ];
                    if (data.IsLoaded)
                    {
                        lX = 0.0f;
                    }
                    else
                    {
                        lX   = (float)(pSize);
                        data = data2D[dataX][dataZ];
                    }
                }
            }

            if (lZ < 0.0f)
            {
                if (dataZ == 0)
                {
                    lZ = 0.0f;
                }
                else
                {
                    data = data2D[dataX][dataZ - 1];
                    if (data.IsLoaded)
                    {
                        lZ = (float)(pSize);
                    }
                    else
                    {
                        lZ   = 0.0f;
                        data = data2D[dataX][dataZ];
                    }
                }
            }
            else if (lZ > pSize)
            {
                if (dataZ == Options.Instance.World_Height - 1)
                {
                    lZ = (float)(pSize);
                }
                else
                {
                    data = data2D[dataX][dataZ + 1];
                    if (data.IsLoaded)
                    {
                        lZ = 0.0f;
                    }
                    else
                    {
                        lZ   = (float)(pSize);
                        data = data2D[dataX][dataZ];
                    }
                }
            }
            if (data == null)
            {
                data = data2D[dataX][dataZ];
            }

            if (data.IsLoaded)
            {
                return(data.GetHeight(lX, lZ));
            }
            return(0.0f);
        }