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); }
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))); } }
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); }
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); }