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:
@@ -327,7 +327,7 @@ class Skybox
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
cy = itp >> 3 & 0x7FF;
|
||||
cx = itp >> 14 & 0x3FF;
|
||||
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.
|
||||
*
|
||||
* @param x X coordinate in tiles
|
||||
* @param y Y coordinate in tiles
|
||||
* @param x Sample X 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
|
||||
*/
|
||||
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;
|
||||
y /= 8.d;
|
||||
@@ -377,7 +379,7 @@ class Skybox
|
||||
int cx = (int) x;
|
||||
int cy = (int) y;
|
||||
|
||||
int centerChunkData = chunkData(cx, cy, plane, chunkMapper);
|
||||
int centerChunkData = chunkData(px / 8, py / 8, plane, chunkMapper);
|
||||
if (centerChunkData == -1)
|
||||
{
|
||||
// No data in the center chunk?
|
||||
@@ -477,7 +479,7 @@ class Skybox
|
||||
*
|
||||
* @param resolution The number of pixels per tile
|
||||
* @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)
|
||||
{
|
||||
@@ -499,7 +501,7 @@ class Skybox
|
||||
{
|
||||
double fx = (x1 * 8) + (x / 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);
|
||||
}
|
||||
|
||||
@@ -105,12 +105,17 @@ public class SkyboxPlugin extends Plugin
|
||||
}
|
||||
|
||||
// Inverse of camera location / 2
|
||||
int spx = px - ((client.getCameraX() - px) >> 1);
|
||||
int spy = py - ((client.getCameraY() - py) >> 1);
|
||||
int spx = -((client.getCameraX() - px) >> 1);
|
||||
int spy = -((client.getCameraY() - py) >> 1);
|
||||
|
||||
int baseX = client.getBaseX();
|
||||
int baseY = client.getBaseY();
|
||||
|
||||
client.setSkyboxColor(skybox.getColorForPoint(
|
||||
client.getBaseX() + (spx / 128.f),
|
||||
client.getBaseY() + (spy / 128.f),
|
||||
baseX + ((px + spx) / 128.f),
|
||||
baseY + ((py + spy) / 128.f),
|
||||
baseX + (px / 128),
|
||||
baseY + (py / 128),
|
||||
client.getPlane(),
|
||||
client.getTextureProvider().getBrightness(),
|
||||
client.isInInstancedRegion() ? this::mapChunk : null
|
||||
|
||||
@@ -41,8 +41,10 @@ public class SkyboxTest
|
||||
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");
|
||||
Assert.assertEquals(0, skybox.getColorForPoint(0, 0, 0, 1, null));
|
||||
Assert.assertEquals(0x0000FF, skybox.getColorForPoint((99 * 64) + 32, (99 * 64) + 32, 0, 1, null));
|
||||
Assert.assertEquals(0, skybox.getColorForPoint(0, 0, 0, 0, 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
|
||||
@@ -63,6 +65,6 @@ public class SkyboxTest
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user