Skip to content

Commit a8f6981

Browse files
committed
Reimplement entity & BE mask
Now with more aggressive block entity finding!
1 parent 625dc78 commit a8f6981

12 files changed

Lines changed: 250 additions & 88 deletions

File tree

src/main/java/net/modfest/fireblanket/FireblanketMixin.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,6 @@ public String getRefMapperConfig() {
6565

6666
@Override
6767
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
68-
if (mixinClassName.contains("be_masking") || mixinClassName.contains("entity_masking")) {
69-
return DO_MASKING;
70-
}
71-
7268
if (mixinClassName.contains("region_chunk_cache")) {
7369
return false;
7470
// return FireblanketConfig.get(ConfigSpecs.FORCED_LOAD_RADIUS) > 0;
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package net.modfest.fireblanket.client.render;
2+
3+
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
4+
import it.unimi.dsi.fastutil.objects.Object2ObjectMaps;
5+
import net.minecraft.SharedConstants;
6+
import net.minecraft.client.Minecraft;
7+
import net.minecraft.client.multiplayer.ClientLevel;
8+
import net.minecraft.client.renderer.culling.Frustum;
9+
import net.minecraft.client.renderer.debug.DebugRenderer;
10+
import net.minecraft.core.BlockPos;
11+
import net.minecraft.gizmos.GizmoProperties;
12+
import net.minecraft.gizmos.GizmoStyle;
13+
import net.minecraft.gizmos.Gizmos;
14+
import net.minecraft.util.ARGB;
15+
import net.minecraft.util.debug.DebugValueAccess;
16+
import net.minecraft.world.level.ChunkPos;
17+
import net.minecraft.world.level.block.entity.BlockEntity;
18+
import net.minecraft.world.level.chunk.LevelChunk;
19+
import net.minecraft.world.phys.AABB;
20+
import net.modfest.fireblanket.FireblanketMixin;
21+
import net.modfest.fireblanket.client.ClientState;
22+
import net.modfest.fireblanket.mixin.client.accessor.AccessorClientChunkCache;
23+
import org.jspecify.annotations.Nullable;
24+
25+
import java.util.Iterator;
26+
import java.util.Map;
27+
import java.util.concurrent.atomic.AtomicReferenceArray;
28+
29+
/**
30+
* @author Ampflower
31+
**/
32+
public final class BlockEntityMaskRenderer implements DebugRenderer.SimpleDebugRenderer {
33+
34+
private static final boolean alwaysVisible = FireblanketMixin.DO_MASKING | SharedConstants.DEBUG_ENABLED;
35+
36+
private final Minecraft minecraft;
37+
38+
public BlockEntityMaskRenderer(final Minecraft minecraft) {
39+
this.minecraft = minecraft;
40+
}
41+
42+
@Override
43+
public void emitGizmos(
44+
final double camX,
45+
final double camY,
46+
final double camZ,
47+
final DebugValueAccess debugValues,
48+
final Frustum frustum,
49+
final float partialTicks
50+
) {
51+
if (ClientState.MASKED_BERS.isEmpty()) {
52+
return;
53+
}
54+
55+
final ClientLevel level = this.minecraft.level;
56+
57+
if (level == null) {
58+
return;
59+
}
60+
61+
final var clientChunkCache = (AccessorClientChunkCache) level.getChunkSource();
62+
63+
if (clientChunkCache == null) {
64+
return;
65+
}
66+
67+
final var storage = (AccessorClientChunkCache.Storage) (Object) (clientChunkCache).getStorage();
68+
69+
if (storage == null) {
70+
return;
71+
}
72+
73+
final AtomicReferenceArray<@Nullable LevelChunk> chunks = storage.getChunks();
74+
75+
if (chunks == null) {
76+
return;
77+
}
78+
79+
for (int i = 0; i < chunks.length(); i++) {
80+
final LevelChunk chunk = chunks.get(i);
81+
82+
if (chunk == null || chunk.isEmpty()) {
83+
continue;
84+
}
85+
86+
final AABB chunkBounds;
87+
{
88+
final ChunkPos pos = chunk.getPos();
89+
final BlockPos a = pos.getBlockAt(0, chunk.getMinY(), 0);
90+
final BlockPos b = pos.getBlockAt(15, chunk.getMaxY(), 15);
91+
chunkBounds = AABB.encapsulatingFullBlocks(a, b);
92+
}
93+
94+
if (!frustum.isVisible(chunkBounds)) {
95+
continue;
96+
}
97+
98+
if (chunk.getBlockEntities() instanceof Object2ObjectMap<BlockPos, BlockEntity> map) {
99+
iterate(Object2ObjectMaps.fastIterator(map), frustum);
100+
} else {
101+
iterate(chunk.getBlockEntities().entrySet().iterator(), frustum);
102+
}
103+
}
104+
}
105+
106+
private static void iterate(
107+
final Iterator<? extends Map.Entry<BlockPos, BlockEntity>> itr,
108+
final Frustum frustum
109+
) {
110+
while (itr.hasNext()) {
111+
final var entry = itr.next();
112+
final BlockPos pos = entry.getKey();
113+
final BlockEntity entity = entry.getValue();
114+
final AABB box = new AABB(pos);
115+
116+
if (!frustum.isVisible(box)) {
117+
continue;
118+
}
119+
120+
if (!ClientState.MASKED_BERS.contains(entity.getType())) {
121+
continue;
122+
}
123+
124+
final GizmoProperties gizmo = Gizmos.cuboid(
125+
box,
126+
GizmoStyle.stroke(ARGB.color(192, 200, 220, 40))
127+
);
128+
129+
if (alwaysVisible) {
130+
gizmo.setAlwaysOnTop();
131+
}
132+
}
133+
}
134+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package net.modfest.fireblanket.client.render;
2+
3+
import net.minecraft.SharedConstants;
4+
import net.minecraft.client.CameraType;
5+
import net.minecraft.client.Minecraft;
6+
import net.minecraft.client.multiplayer.ClientLevel;
7+
import net.minecraft.client.renderer.culling.Frustum;
8+
import net.minecraft.client.renderer.debug.DebugRenderer;
9+
import net.minecraft.gizmos.GizmoProperties;
10+
import net.minecraft.gizmos.GizmoStyle;
11+
import net.minecraft.gizmos.Gizmos;
12+
import net.minecraft.util.ARGB;
13+
import net.minecraft.util.debug.DebugValueAccess;
14+
import net.minecraft.world.entity.Entity;
15+
import net.minecraft.world.phys.Vec3;
16+
import net.modfest.fireblanket.FireblanketMixin;
17+
import net.modfest.fireblanket.client.ClientState;
18+
19+
/**
20+
* @author Ampflower
21+
**/
22+
public final class EntityMaskRenderer implements DebugRenderer.SimpleDebugRenderer {
23+
24+
private static final boolean alwaysVisible = FireblanketMixin.DO_MASKING | SharedConstants.DEBUG_ENABLED;
25+
26+
private final Minecraft minecraft;
27+
28+
public EntityMaskRenderer(final Minecraft minecraft) {
29+
this.minecraft = minecraft;
30+
}
31+
32+
@Override
33+
public void emitGizmos(
34+
final double camX,
35+
final double camY,
36+
final double camZ,
37+
final DebugValueAccess debugValues,
38+
final Frustum frustum,
39+
final float partialTicks
40+
) {
41+
if (ClientState.MASKED_ENTITIES.isEmpty()) {
42+
return;
43+
}
44+
45+
final ClientLevel level = this.minecraft.level;
46+
47+
if (level == null) {
48+
return;
49+
}
50+
51+
for (final Entity entity : level.entitiesForRendering()) {
52+
if (entity == this.minecraft.getCameraEntity() && this.minecraft.options.getCameraType() == CameraType.FIRST_PERSON) {
53+
continue;
54+
}
55+
56+
if ((!alwaysVisible && entity.isInvisible()) || !frustum.isVisible(entity.getBoundingBox())) {
57+
continue;
58+
}
59+
60+
if (!ClientState.MASKED_ENTITIES.contains(entity.getType())) {
61+
continue;
62+
}
63+
64+
final float entityPartialTicks = this.minecraft.getDeltaTracker()
65+
.getGameTimeDeltaPartialTick(!level.tickRateManager().isEntityFrozen(entity));
66+
67+
final Vec3 delta = entity.getPosition(entityPartialTicks).subtract(entity.position());
68+
69+
final GizmoProperties gizmo = Gizmos.cuboid(
70+
entity.getBoundingBox().move(delta),
71+
GizmoStyle.stroke(ARGB.color(192, 200, 220, 40))
72+
);
73+
74+
if (alwaysVisible) {
75+
gizmo.setAlwaysOnTop();
76+
}
77+
}
78+
}
79+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package net.modfest.fireblanket.mixin.client.accessor;
2+
3+
import net.minecraft.client.multiplayer.ClientChunkCache;
4+
import net.minecraft.world.level.chunk.LevelChunk;
5+
import org.jspecify.annotations.Nullable;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.gen.Accessor;
8+
9+
import java.util.concurrent.atomic.AtomicReferenceArray;
10+
11+
/**
12+
* @author Ampflower
13+
**/
14+
@Mixin(ClientChunkCache.class)
15+
public interface AccessorClientChunkCache {
16+
@Accessor
17+
ClientChunkCache.Storage getStorage();
18+
19+
@Mixin(ClientChunkCache.Storage.class)
20+
interface Storage {
21+
@Accessor
22+
AtomicReferenceArray<@Nullable LevelChunk> getChunks();
23+
}
24+
}

src/main/java/net/modfest/fireblanket/mixin/client/be_masking/MixinBlockEntityRenderDispatcher.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

src/main/java/net/modfest/fireblanket/mixin/client/be_masking/MixinRebuildTask.java

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/main/java/net/modfest/fireblanket/mixin/client/entity_masking/MixinEntityRenderer.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

src/main/java/net/modfest/fireblanket/mixin/client/hooks/MixinDebugRenderer.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
import net.fabricmc.api.Environment;
66
import net.minecraft.client.Minecraft;
77
import net.minecraft.client.renderer.debug.DebugRenderer;
8+
import net.modfest.fireblanket.FireblanketMixin;
89
import net.modfest.fireblanket.client.FireblanketDebug;
10+
import net.modfest.fireblanket.client.render.BlockEntityMaskRenderer;
911
import net.modfest.fireblanket.client.render.BlockTimingRenderer;
12+
import net.modfest.fireblanket.client.render.EntityMaskRenderer;
1013
import net.modfest.fireblanket.client.render.EntityTimingRenderer;
1114
import net.modfest.fireblanket.client.render.RenderRegionRenderer;
1215
import org.spongepowered.asm.mixin.Final;
@@ -42,5 +45,10 @@ private void injectFireblanketDebuggers(final CallbackInfo ci, final @Local Mine
4245
if (minecraft.debugEntries.isCurrentlyEnabled(FireblanketDebug.BLOCK_TICK_TIMES)) {
4346
this.renderers.add(new BlockTimingRenderer(minecraft));
4447
}
48+
49+
if (FireblanketMixin.DO_MASKING) {
50+
this.renderers.add(new EntityMaskRenderer(minecraft));
51+
this.renderers.add(new BlockEntityMaskRenderer(minecraft));
52+
}
4553
}
4654
}

src/main/java/net/modfest/fireblanket/mixin/mods/masking/sodium/MixinChunkRenderRebuildTask.java

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/main/java/net/modfest/fireblanket/mixin/mods/masking/sodium/package-info.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)