Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ else if (pri == 10)
}
}

void sortStaticModelFacesByDistance(
public void sortStaticModelFacesByDistance(
Zone.AlphaModel m,
int yawCos, int yawSin,
int pitchCos, int pitchSin
Expand Down
67 changes: 17 additions & 50 deletions src/main/java/rs117/hd/renderer/zone/SceneManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
Expand All @@ -23,6 +21,8 @@
import rs117.hd.opengl.uniforms.UBOWorldViews;
import rs117.hd.overlays.FrameTimer;
import rs117.hd.overlays.Timer;
import rs117.hd.renderer.zone.jobs.RoofChangesJob;
import rs117.hd.renderer.zone.jobs.ZoneUploadJob;
import rs117.hd.scene.AreaManager;
import rs117.hd.scene.EnvironmentManager;
import rs117.hd.scene.FishingSpotReplacer;
Expand Down Expand Up @@ -93,7 +93,6 @@ public class SceneManager {
private final WorldViewContext root = new WorldViewContext(null, null, null);
private final WorldViewContext[] subs = new WorldViewContext[MAX_WORLDVIEWS];

private final Map<Integer, Integer> nextRoofChanges = new HashMap<>();
private ZoneSceneContext nextSceneContext;
private Zone[][] nextZones;
private final List<SortedZone> sortedZones = new ArrayList<>();
Expand Down Expand Up @@ -357,45 +356,7 @@ private static boolean isEdgeTile(Zone[][] zones, int zx, int zz) {
task -> lightManager.loadSceneLights(nextSceneContext)
);

private final GenericJob calculateRoofChangesTask = GenericJob.build(
"calculateRoofChanges",
(task) -> {
Scene prev = client.getTopLevelWorldView().getScene();
Scene scene = nextSceneContext.scene;

// Calculate roof ids for the zone
final int[][][] prids = prev.getRoofs();
final int[][][] nrids = scene.getRoofs();

final int dx = scene.getBaseX() - prev.getBaseX() >> 3;
final int dy = scene.getBaseY() - prev.getBaseY() >> 3;

nextRoofChanges.clear();
for (int x = 0; x < EXTENDED_SCENE_SIZE; ++x) {
for (int z = 0; z < EXTENDED_SCENE_SIZE; ++z) {
int ox = x + (dx << 3);
int oz = z + (dy << 3);

for (int level = 0; level < 4; ++level) {
task.workerHandleCancel();
// old zone still in scene?
if (ox >= 0 && oz >= 0 && ox < EXTENDED_SCENE_SIZE && oz < EXTENDED_SCENE_SIZE) {
int prid = prids[level][ox][oz];
int nrid = nrids[level][x][z];
if (prid > 0 && nrid > 0 && prid != nrid) {
Integer old = nextRoofChanges.putIfAbsent(prid, nrid);
if (old == null) {
log.trace("Roof change: {} -> {}", prid, nrid);
} else if (old != nrid) {
log.debug("Roof change mismatch: {} -> {} vs {}", prid, nrid, old);
}
}
}
}
}
}
}
);
private final RoofChangesJob calculateRoofChangesTask = new RoofChangesJob();

public synchronized void loadScene(WorldView worldView, Scene scene) {
try {
Expand Down Expand Up @@ -500,6 +461,8 @@ public synchronized void loadScene(WorldView worldView, Scene scene) {
}

// Queue after ensuring previous scene has been cancelled
calculateRoofChangesTask.prev = client.getTopLevelWorldView().getScene();
calculateRoofChangesTask.scene = nextSceneContext.scene;
calculateRoofChangesTask.queue();

final int dx = scene.getBaseX() - prev.getBaseX() >> 3;
Expand Down Expand Up @@ -620,14 +583,18 @@ public void swapScene(Scene scene) {
calculateRoofChangesTask.waitForCompletion();

WorldViewContext ctx = root;
if (!nextRoofChanges.isEmpty()) {
for (int x = 0; x < ctx.sizeX; ++x) {
for (int z = 0; z < ctx.sizeZ; ++z) {
Zone zone = nextZones[x][z];
if (zone.needsRoofUpdate) {
zone.needsRoofUpdate = false;
zone.updateRoofs(nextRoofChanges);
}
for (int x = 0; x < ctx.sizeX; ++x) {
for (int z = 0; z < ctx.sizeZ; ++z) {
Zone zone = nextZones[x][z];
if(calculateRoofChangesTask.doesZoneHaveRoofMismatch(x, z)) {
zone.needsRoofUpdate = false;
zone.rebuild = true;
continue;
}

if (zone.needsRoofUpdate) {
zone.needsRoofUpdate = false;
zone.updateRoofs(calculateRoofChangesTask.result);
}
}
}
Expand Down
21 changes: 11 additions & 10 deletions src/main/java/rs117/hd/renderer/zone/WorldViewContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import rs117.hd.HdPlugin;
import rs117.hd.opengl.uniforms.UBOWorldViews;
import rs117.hd.opengl.uniforms.UBOWorldViews.WorldViewStruct;
import rs117.hd.renderer.zone.jobs.ZoneUploadJob;
import rs117.hd.utils.Camera;
import rs117.hd.utils.CommandBuffer;
import rs117.hd.utils.DestructibleHandler;
Expand Down Expand Up @@ -53,17 +54,17 @@ public class WorldViewContext {
@Inject
private SceneManager sceneManager;

final int worldViewId;
final int sizeX, sizeZ;
public final int worldViewId;
public final int sizeX, sizeZ;
@Nullable
WorldViewStruct uboWorldViewStruct;
ZoneSceneContext sceneContext;
Zone[][] zones;
GLBuffer vboM;
boolean isLoading = true;

int minLevel, level, maxLevel;
Set<Integer> hideRoofIds;
public WorldViewStruct uboWorldViewStruct;
public ZoneSceneContext sceneContext;
public Zone[][] zones;
public GLBuffer vboM;
public boolean isLoading = true;

public int minLevel, level, maxLevel;
public Set<Integer> hideRoofIds;

private final Comparator<Zone> alphaSortComparator = Comparator.comparingInt((Zone z) -> z.dist).reversed();
private final List<Zone> alphaZones = new ArrayList<>();
Expand Down
19 changes: 11 additions & 8 deletions src/main/java/rs117/hd/renderer/zone/Zone.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
import net.runelite.api.*;
import org.lwjgl.system.MemoryStack;
import rs117.hd.HdPlugin;
import rs117.hd.renderer.zone.jobs.EboAlphaWriterJob;
import rs117.hd.renderer.zone.jobs.StaticAlphaSortingJob;
import rs117.hd.renderer.zone.jobs.ZoneUploadJob;
import rs117.hd.scene.MaterialManager;
import rs117.hd.scene.SceneContext;
import rs117.hd.scene.materials.Material;
Expand Down Expand Up @@ -85,8 +88,8 @@ public class Zone implements Destructible {

public HashSet<Integer> animatedDynamicObjectIds = new HashSet<>();

final StaticAlphaSortingJob alphaSortingJob = new StaticAlphaSortingJob();
ZoneUploadJob uploadJob;
private final StaticAlphaSortingJob alphaSortingJob = new StaticAlphaSortingJob();
public ZoneUploadJob uploadJob;

int[] levelOffsets = new int[5]; // buffer pos in ints for the end of the level

Expand Down Expand Up @@ -417,19 +420,19 @@ public static class AlphaModel {
byte flags;

// only set for static geometry as they require sorting
int radius;
int[] packedFaces;
int[] sortedFaces;
int sortedFacesLen;
public int radius;
public int[] packedFaces;
public int[] sortedFaces;
public int sortedFacesLen;

int dist;
int asyncSortIdx = -1;
public int asyncSortIdx = -1;

static final int SKIP = 1; // temporary model is in a closer zone
static final int TEMP = 2; // temporary model added to a closer zone
static final int SORT_COMPLETED = 4;

void setSorted() {
public void setSorted() {
flags |= SORT_COMPLETED;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package rs117.hd.renderer.zone;
package rs117.hd.renderer.zone.jobs;

import java.nio.IntBuffer;
import java.util.ArrayDeque;
import lombok.extern.slf4j.Slf4j;
import rs117.hd.renderer.zone.Zone;
import rs117.hd.utils.buffer.GLMappedBufferIntWriter;
import rs117.hd.utils.jobs.Job;

Expand Down
60 changes: 60 additions & 0 deletions src/main/java/rs117/hd/renderer/zone/jobs/RoofChangesJob.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package rs117.hd.renderer.zone.jobs;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.*;
import rs117.hd.utils.jobs.Job;

import static net.runelite.api.Constants.*;

@Slf4j
public class RoofChangesJob extends Job {

public Scene prev;
public Scene scene;

public final boolean[] mismatched = new boolean[EXTENDED_SCENE_SIZE * EXTENDED_SCENE_SIZE];
public final Map<Integer, Integer> result = new HashMap<>();

@Override
protected void onRun() {
// Calculate roof ids for the zone
final int[][][] prids = prev.getRoofs();
final int[][][] nrids = scene.getRoofs();

final int dx = scene.getBaseX() - prev.getBaseX() >> 3;
final int dy = scene.getBaseY() - prev.getBaseY() >> 3;

result.clear();
Arrays.fill(mismatched, false);
for (int x = 0; x < EXTENDED_SCENE_SIZE; ++x) {
for (int z = 0; z < EXTENDED_SCENE_SIZE; ++z) {
int ox = x + (dx << 3);
int oz = z + (dy << 3);

for (int level = 0; level < 4; ++level) {
// old zone still in scene?
if (ox >= 0 && oz >= 0 && ox < EXTENDED_SCENE_SIZE && oz < EXTENDED_SCENE_SIZE) {
int prid = prids[level][ox][oz];
int nrid = nrids[level][x][z];
if (prid > 0 && nrid > 0 && prid != nrid) {
Integer old = result.putIfAbsent(prid, nrid);
if (old == null) {
log.trace("Roof change: {} -> {}", prid, nrid);
} else if (old != nrid) {
log.debug("Roof change mismatch: {} -> {} vs {}", prid, nrid, old);
mismatched[x * EXTENDED_SCENE_SIZE + z] = true;
}
}
}
}
}
}
}

public boolean doesZoneHaveRoofMismatch(int x, int z) {
return mismatched[x * EXTENDED_SCENE_SIZE + z];
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package rs117.hd.renderer.zone;
package rs117.hd.renderer.zone.jobs;

import java.util.Arrays;
import java.util.concurrent.atomic.AtomicIntegerArray;
import lombok.RequiredArgsConstructor;
import rs117.hd.overlays.FrameTimer;
import rs117.hd.overlays.Timer;
import rs117.hd.renderer.zone.FacePrioritySorter;
import rs117.hd.renderer.zone.Zone.AlphaModel;
import rs117.hd.utils.Camera;
import rs117.hd.utils.jobs.Job;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package rs117.hd.renderer.zone;
package rs117.hd.renderer.zone.jobs;

import java.util.concurrent.ConcurrentLinkedQueue;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.*;
import rs117.hd.renderer.zone.SceneUploader;
import rs117.hd.renderer.zone.WorldViewContext;
import rs117.hd.renderer.zone.Zone;
import rs117.hd.renderer.zone.ZoneSceneContext;
import rs117.hd.utils.DestructibleHandler;
import rs117.hd.utils.buffer.GLBuffer;
import rs117.hd.utils.buffer.GLTextureBuffer;
Expand All @@ -18,10 +22,10 @@ public final class ZoneUploadJob extends Job {
private WorldViewContext viewContext;
private ZoneSceneContext sceneContext;

Zone zone;
int x, z;
long revealAfterTimestampMs;
boolean shouldUnmap;
public Zone zone;
public int x, z;
public long revealAfterTimestampMs;
public boolean shouldUnmap;

@Override
protected void onRun() throws InterruptedException {
Expand Down