Skip to content
Open
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
10 changes: 4 additions & 6 deletions src/main/java/rs117/hd/renderer/legacy/LegacyModelPusher.java
Original file line number Diff line number Diff line change
Expand Up @@ -337,12 +337,10 @@ public void pushModel(
} else if (modelOverride.colorOverrides != null && (cacheUvData || !needsCaching)) {
// Color overrides are heavy. Only apply them if the UVs will be cached or don't need caching
int ahsl = (faceTransparencies == null ? 0xFF : 0xFF - (faceTransparencies[face] & 0xFF)) << 16 | faceColors[face];
for (var override : modelOverride.colorOverrides) {
if (override.ahslCondition.test(ahsl)) {
faceOverride = override;
material = faceOverride.baseMaterial;
break;
}
final var override = modelOverride.testColorOverrides(ahsl);
if (override != null) {
faceOverride = override;
material = faceOverride.baseMaterial;
}
}

Expand Down
10 changes: 6 additions & 4 deletions src/main/java/rs117/hd/renderer/zone/SceneUploader.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import rs117.hd.scene.SceneContext;
import rs117.hd.scene.ground_materials.GroundMaterial;
import rs117.hd.scene.materials.Material;
import rs117.hd.scene.model_overrides.AhslSupplier;
import rs117.hd.scene.model_overrides.InheritTileColorType;
import rs117.hd.scene.model_overrides.ModelOverride;
import rs117.hd.scene.model_overrides.TzHaarRecolorType;
Expand Down Expand Up @@ -147,6 +148,8 @@ public interface OnBeforeProcessTileFunc {
private final GpuIntBuffer zoneVboA = new GpuIntBuffer(false);
private final GpuIntBuffer zoneTboF = new GpuIntBuffer(false);

private final AhslSupplier ahslSupplier = new AhslSupplier();

// Lazily initialized staging buffers
public VertexWriteCache.Collection writeCache;

Expand Down Expand Up @@ -1631,8 +1634,7 @@ private int uploadStaticModel(
}
}
} else if (modelOverride.colorOverrides != null) {
final int ahsl = (0xFF - transparency) << 16 | color1;
final var override = modelOverride.testColorOverrides(ahsl);
final var override = modelOverride.testColorOverrides(ahslSupplier.ahsl(transparency, color1));
if (override != null) {
faceOverride = override;
material = faceOverride.baseMaterial;
Expand Down Expand Up @@ -1972,6 +1974,7 @@ public boolean preprocessTempModel(
visibleFaces.ensureCapacity(triangleCount);
culledFaces.ensureCapacity(triangleCount);

final int[] color1s = model.getFaceColors1();
final int[] color3s = model.getFaceColors3();
final int[] indices1 = model.getFaceIndices1();
final int[] indices2 = model.getFaceIndices2();
Expand Down Expand Up @@ -2029,8 +2032,7 @@ public boolean preprocessTempModel(
}
}
} else if (modelOverride.colorOverrides != null) {
final int ahsl = (0xFF - transparency) << 16 | model.getFaceColors1()[f];
final var override = modelOverride.testColorOverrides(ahsl);
final var override = modelOverride.testColorOverrides(ahslSupplier.ahsl(transparency, color1s[f]));
if (override != null) {
faceOverride = override;
material = faceOverride.baseMaterial;
Expand Down
12 changes: 9 additions & 3 deletions src/main/java/rs117/hd/scene/ProceduralGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import rs117.hd.scene.model_overrides.ModelOverride;
import rs117.hd.scene.model_overrides.TzHaarRecolorType;
import rs117.hd.scene.tile_overrides.TileOverride;
import rs117.hd.scene.tile_overrides.TileOverrideVariables;
import rs117.hd.scene.water_types.WaterType;
import rs117.hd.utils.ColorUtils;
import rs117.hd.utils.collections.ConcurrentPool;
Expand Down Expand Up @@ -84,6 +85,7 @@ public class ProceduralGenerator {
@Inject
private WaterTypeManager waterTypeManager;

private final TileOverrideVariables tileVar = new TileOverrideVariables();
private final ConcurrentPool<GeneratorContext> GENERATOR_POOL = new ConcurrentPool<>(GeneratorContext::new);

final class GeneratorContext implements AutoCloseable {
Expand Down Expand Up @@ -555,9 +557,13 @@ private void calculateTileOverride(

sceneContext.extendedSceneToWorld(tileExX, tileExY, tileZ, worldPos);

overrides[0] = tileOverrideManager.getOverride(sceneContext, tile, worldPos, ids);
overrides[1] = tileOverrideManager.getOverride(sceneContext, tile, worldPos, ids[1]);
overrides[2] = tileOverrideManager.getOverride(sceneContext, tile, worldPos, ids[0]);
try {
overrides[0] = tileOverrideManager.getOverride(sceneContext, tileVar, worldPos, ids);
overrides[1] = tileOverrideManager.getOverride(sceneContext, tileVar, worldPos, ids[1]);
overrides[2] = tileOverrideManager.getOverride(sceneContext, tileVar, worldPos, ids[0]);
} finally {
tileVar.setTile(null);
}

sceneContext.setTileOverride(tileZ, tileExX, tileExY, overrides);
}
Expand Down
18 changes: 13 additions & 5 deletions src/main/java/rs117/hd/scene/TileOverrideManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import rs117.hd.scene.areas.Area;
import rs117.hd.scene.ground_materials.GroundMaterial;
import rs117.hd.scene.tile_overrides.TileOverride;
import rs117.hd.scene.tile_overrides.TileOverrideVariables;
import rs117.hd.utils.FileWatcher;
import rs117.hd.utils.Props;
import rs117.hd.utils.ResourcePath;
Expand Down Expand Up @@ -228,6 +229,17 @@ public TileOverride getOverride(SceneContext sceneContext, Tile tile) {

@Nonnull
public TileOverride getOverride(SceneContext sceneContext, @Nonnull Tile tile, @Nonnull int[] worldPos, int... ids) {
final var vars = SceneContext.TILE_OVERRIDE_VARIABLES.get();
try {
return getOverride(sceneContext, vars.setTile(tile), worldPos, ids);
} finally {
vars.setTile(null); // Avoid accidentally keeping the old scene in memory
}
}

@Nonnull
public TileOverride getOverride(SceneContext sceneContext, TileOverrideVariables vars, @Nonnull int[] worldPos, int... ids) {
final Tile tile = vars.getTile();
if (ids.length == 0) {
var pos = tile.getSceneLocation();
int x = pos.getX() + sceneContext.sceneOffset;
Expand All @@ -244,11 +256,7 @@ public TileOverride getOverride(SceneContext sceneContext, @Nonnull Tile tile, @
if (override.isConstant())
return override;

final var vars = SceneContext.TILE_OVERRIDE_VARIABLES.get();
vars.setTile(tile);
TileOverride replacement = override.resolveReplacements(vars);
vars.setTile(null); // Avoid accidentally keeping the old scene in memory
return replacement;
return override.resolveReplacements(vars);
}

@Nonnull
Expand Down
68 changes: 68 additions & 0 deletions src/main/java/rs117/hd/scene/model_overrides/AhslSupplier.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package rs117.hd.scene.model_overrides;

import rs117.hd.utils.VariableSupplier;

public final class AhslSupplier implements VariableSupplier {
private int alpha;
private int h, s, l;
private int ahsl, hsl;

public AhslSupplier ahsl(int ahsl) {
this.ahsl = ahsl;
alpha = (ahsl >> 16) & 0xFF;
hsl = ahsl & 0xFFFF;
h = ahsl >>> 10 & 0x3F;
s = ahsl >>> 7 & 0x7;
l = ahsl & 0x7F;
return this;
}

public AhslSupplier ahsl(int transparency, int color) {
ahsl = (0xFF - transparency) << 16 | hsl;
alpha = transparency & 0xFF;
hsl = color & 0xFFFF;
h = ahsl >>> 10 & 0x3F;
s = ahsl >>> 7 & 0x7;
l = ahsl & 0x7F;
return this;
}

@Override
public Object get(String name) {
return getInt(name);
}

@Override
public int getInt(String name) {
if (name.length() == 1) {
switch (name.charAt(0)) {
case 'a':
return alpha;
case 'h':
return h;
case 's':
return s;
case 'l':
return l;
default:
assert false : "Unexpected variable: " + name;
return 0;
}
}

switch (name) {
case "ahsl":
return ahsl;
case "hsl":
return hsl;
default:
assert false : "Unexpected variable: " + name;
return 0;
}
}

@Override
public float getFloat(String name) {
return getInt(name);
}
}
13 changes: 13 additions & 0 deletions src/main/java/rs117/hd/scene/model_overrides/HslComparison.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package rs117.hd.scene.model_overrides;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public final class HslComparison implements ModelOverride.AhslPredicate {
public final int targetHsl;

@Override
public boolean test(AhslSupplier vars) {
return vars.getInt("hsl") == targetHsl;
}
}
Loading