Merge pull request #7244 from Abextm/sky-target-boundscheck

Skybox: Do bounds check on the localPlayer's location, not the camera's
This commit is contained in:
Abex
2019-01-09 10:52:54 -07:00
committed by GitHub
3 changed files with 23 additions and 14 deletions

View File

@@ -327,7 +327,7 @@ class Skybox
{ {
return -1; return -1;
} }
cy = itp >> 3 & 0x7FF; cy = itp >> 3 & 0x7FF;
cx = itp >> 14 & 0x3FF; cx = itp >> 14 & 0x3FF;
plane = itp >> 24 & 0x3; plane = itp >> 24 & 0x3;
@@ -365,11 +365,13 @@ class Skybox
/** /**
* Calculates the RGB color for a specific world coordinate. Arguments are floats for sub-tile accuracy. * Calculates the RGB color for a specific world coordinate. Arguments are floats for sub-tile accuracy.
* *
* @param x X coordinate in tiles * @param x Sample X coordinate in tiles
* @param y Y coordinate in tiles * @param y Samlpe Y coordinate in tiles
* @param x Player X coordinate in tiles
* @param y Player Y coordinate in tiles
* @param chunkMapper maps chunks to their instance templates, or null if not in an instance * @param chunkMapper maps chunks to their instance templates, or null if not in an instance
*/ */
public int getColorForPoint(double x, double y, int plane, double brightness, ChunkMapper chunkMapper) public int getColorForPoint(double x, double y, int px, int py, int plane, double brightness, ChunkMapper chunkMapper)
{ {
x /= 8.d; x /= 8.d;
y /= 8.d; y /= 8.d;
@@ -377,7 +379,7 @@ class Skybox
int cx = (int) x; int cx = (int) x;
int cy = (int) y; int cy = (int) y;
int centerChunkData = chunkData(cx, cy, plane, chunkMapper); int centerChunkData = chunkData(px / 8, py / 8, plane, chunkMapper);
if (centerChunkData == -1) if (centerChunkData == -1)
{ {
// No data in the center chunk? // No data in the center chunk?
@@ -477,7 +479,7 @@ class Skybox
* *
* @param resolution The number of pixels per tile * @param resolution The number of pixels per tile
* @param line How many tiles to put a line * @param line How many tiles to put a line
* @param plane the plane (0-4) to render * @param plane the plane (0-4) to render
*/ */
BufferedImage render(double resolution, int line, int plane, ChunkMapper chunkMapper) BufferedImage render(double resolution, int line, int plane, ChunkMapper chunkMapper)
{ {
@@ -499,7 +501,7 @@ class Skybox
{ {
double fx = (x1 * 8) + (x / resolution); double fx = (x1 * 8) + (x / resolution);
double fy = (y1 * 8) + (y / resolution); double fy = (y1 * 8) + (y / resolution);
color = getColorForPoint(fx, fy, plane, .8, chunkMapper); color = getColorForPoint(fx, fy, (int) fx, (int) fy, plane, .8, chunkMapper);
} }
img.setRGB(x, h - 1 - y, color | 0xFF000000); img.setRGB(x, h - 1 - y, color | 0xFF000000);
} }

View File

@@ -105,12 +105,17 @@ public class SkyboxPlugin extends Plugin
} }
// Inverse of camera location / 2 // Inverse of camera location / 2
int spx = px - ((client.getCameraX() - px) >> 1); int spx = -((client.getCameraX() - px) >> 1);
int spy = py - ((client.getCameraY() - py) >> 1); int spy = -((client.getCameraY() - py) >> 1);
int baseX = client.getBaseX();
int baseY = client.getBaseY();
client.setSkyboxColor(skybox.getColorForPoint( client.setSkyboxColor(skybox.getColorForPoint(
client.getBaseX() + (spx / 128.f), baseX + ((px + spx) / 128.f),
client.getBaseY() + (spy / 128.f), baseY + ((py + spy) / 128.f),
baseX + (px / 128),
baseY + (py / 128),
client.getPlane(), client.getPlane(),
client.getTextureProvider().getBrightness(), client.getTextureProvider().getBrightness(),
client.isInInstancedRegion() ? this::mapChunk : null client.isInInstancedRegion() ? this::mapChunk : null

View File

@@ -41,8 +41,10 @@ public class SkyboxTest
public void testLoadSimple() throws IOException public void testLoadSimple() throws IOException
{ {
Skybox skybox = new Skybox(CharSource.wrap("bounds 0 0 100 100 #00F // R 0 0 100 100\r\nr 99 99").openStream(), "simple"); Skybox skybox = new Skybox(CharSource.wrap("bounds 0 0 100 100 #00F // R 0 0 100 100\r\nr 99 99").openStream(), "simple");
Assert.assertEquals(0, skybox.getColorForPoint(0, 0, 0, 1, null)); Assert.assertEquals(0, skybox.getColorForPoint(0, 0, 0, 0, 0, 1, null));
Assert.assertEquals(0x0000FF, skybox.getColorForPoint((99 * 64) + 32, (99 * 64) + 32, 0, 1, null)); int x = (99 * 64) + 32;
int y = (99 * 64) + 32;
Assert.assertEquals(0x0000FF, skybox.getColorForPoint(x, y, x, y, 0, 1, null));
} }
@Test @Test
@@ -63,6 +65,6 @@ public class SkyboxTest
ImageIO.write(img, "png", new File(skyboxFile)); ImageIO.write(img, "png", new File(skyboxFile));
} }
Assert.assertNotEquals(skybox.getColorForPoint(3232, 3232, 0, .9, null), 0); // Lumbridge will never be black Assert.assertNotEquals(skybox.getColorForPoint(3232, 3232, 3232, 3232, 0, .9, null), 0); // Lumbridge will never be black
} }
} }