Skip to content

Commit 3feb69b

Browse files
committed
Avoid using deprecated API, use new render events.
Potentially fixed some rendering issues, too.
1 parent 84f73cf commit 3feb69b

File tree

7 files changed

+55
-83
lines changed

7 files changed

+55
-83
lines changed

src/main/java/li/cil/oc2/client/ClientSetup.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ public static void handleSetupEvent(final FMLClientSetupEvent event) {
3939
BusInterfaceNameRenderer.initialize();
4040

4141
BlockEntityRenderers.register(BlockEntities.COMPUTER.get(), ComputerRenderer::new);
42-
BlockEntityRenderers.register(BlockEntities.NETWORK_CONNECTOR.get(), NetworkConnectorRenderer::new);
4342
BlockEntityRenderers.register(BlockEntities.DISK_DRIVE.get(), DiskDriveRenderer::new);
4443
BlockEntityRenderers.register(BlockEntities.CHARGER.get(), ChargerRenderer::new);
4544
BlockEntityRenderers.register(BlockEntities.PROJECTOR.get(), ProjectorRenderer::new);

src/main/java/li/cil/oc2/client/renderer/BusInterfaceNameRenderer.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import net.minecraft.world.level.Level;
2121
import net.minecraft.world.level.block.entity.BlockEntity;
2222
import net.minecraft.world.phys.BlockHitResult;
23-
import net.minecraftforge.client.event.RenderLevelLastEvent;
23+
import net.minecraftforge.client.event.RenderLevelStageEvent;
2424
import net.minecraftforge.common.MinecraftForge;
2525
import net.minecraftforge.eventbus.api.SubscribeEvent;
2626

@@ -34,7 +34,11 @@ public static void initialize() {
3434
}
3535

3636
@SubscribeEvent
37-
public void handleRenderLastEvent(final RenderLevelLastEvent event) {
37+
public void handleRenderLastEvent(final RenderLevelStageEvent event) {
38+
if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) {
39+
return;
40+
}
41+
3842
final Minecraft mc = Minecraft.getInstance();
3943
final Player player = mc.player;
4044
if (player == null) {

src/main/java/li/cil/oc2/client/renderer/NetworkCableRenderer.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@
88
import com.mojang.math.Vector3f;
99
import li.cil.oc2.api.API;
1010
import li.cil.oc2.common.blockentity.NetworkConnectorBlockEntity;
11-
import net.minecraft.client.Camera;
1211
import net.minecraft.client.Minecraft;
1312
import net.minecraft.client.renderer.LightTexture;
1413
import net.minecraft.client.renderer.MultiBufferSource;
1514
import net.minecraft.client.renderer.RenderType;
1615
import net.minecraft.client.renderer.culling.Frustum;
1716
import net.minecraft.core.BlockPos;
1817
import net.minecraft.util.Mth;
18+
import net.minecraft.world.entity.Entity;
1919
import net.minecraft.world.level.*;
2020
import net.minecraft.world.phys.AABB;
2121
import net.minecraft.world.phys.Vec3;
2222
import net.minecraftforge.api.distmarker.Dist;
23-
import net.minecraftforge.client.event.RenderLevelLastEvent;
23+
import net.minecraftforge.client.event.RenderLevelStageEvent;
2424
import net.minecraftforge.event.world.ChunkEvent;
2525
import net.minecraftforge.event.world.WorldEvent;
2626
import net.minecraftforge.eventbus.api.SubscribeEvent;
@@ -112,14 +112,14 @@ public static void handleWorldUnloadEvent(final WorldEvent.Unload event) {
112112
}
113113

114114
@SubscribeEvent
115-
public static void handleRenderWorld(final RenderLevelLastEvent event) {
116-
validateConnectors();
117-
validatePairs();
118-
119-
if (Minecraft.useShaderTransparency()) {
115+
public static void handleRenderWorld(final RenderLevelStageEvent event) {
116+
if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_CUTOUT_BLOCKS) {
120117
return;
121118
}
122119

120+
validateConnectors();
121+
validatePairs();
122+
123123
if (connections.isEmpty()) {
124124
return;
125125
}
@@ -132,8 +132,7 @@ public static void handleRenderWorld(final RenderLevelLastEvent event) {
132132

133133
final PoseStack stack = event.getPoseStack();
134134

135-
final Camera activeRenderInfo = client.gameRenderer.getMainCamera();
136-
final Vec3 eye = activeRenderInfo.getPosition();
135+
final Vec3 eye = event.getCamera().getPosition();
137136

138137
final Frustum frustum = new Frustum(stack.last().pose(), event.getProjectionMatrix());
139138
frustum.prepare(eye.x, eye.y, eye.z);

src/main/java/li/cil/oc2/client/renderer/ProjectorDepthRenderer.java

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,13 @@
3535
import net.minecraft.client.renderer.texture.DynamicTexture;
3636
import net.minecraft.core.BlockPos;
3737
import net.minecraft.core.Direction;
38+
import net.minecraft.world.entity.Entity;
3839
import net.minecraft.world.entity.player.Player;
3940
import net.minecraft.world.level.Level;
4041
import net.minecraft.world.phys.HitResult;
4142
import net.minecraft.world.phys.Vec3;
4243
import net.minecraftforge.client.event.EntityViewRenderEvent;
43-
import net.minecraftforge.client.event.RenderLevelLastEvent;
44+
import net.minecraftforge.client.event.RenderLevelStageEvent;
4445
import net.minecraftforge.client.event.RenderNameplateEvent;
4546
import net.minecraftforge.event.TickEvent;
4647
import net.minecraftforge.eventbus.api.Event;
@@ -66,7 +67,7 @@ public final class ProjectorDepthRenderer {
6667
private static final DynamicTexture[] PROJECTOR_COLOR_TARGETS = new DynamicTexture[ModShaders.MAX_PROJECTORS];
6768
private static final Matrix4f[] PROJECTOR_CAMERA_MATRICES = new Matrix4f[ModShaders.MAX_PROJECTORS];
6869
private static final Camera PROJECTOR_DEPTH_CAMERA = new Camera();
69-
private static final DepthOnlyRenderTarget MAIN_CAMERA_DEPTH = new DepthOnlyRenderTarget(MainTarget.DEFAULT_WIDTH, MainTarget.DEFAULT_HEIGHT);
70+
private static DepthOnlyRenderTarget MAIN_CAMERA_DEPTH = new DepthOnlyRenderTarget(MainTarget.DEFAULT_WIDTH, MainTarget.DEFAULT_HEIGHT);
7071
private static final float PROJECTOR_FORWARD_SHIFT = 7 / 16f; // From center of projector block.
7172
private static final float PROJECTOR_NEAR = 0.5f - PROJECTOR_FORWARD_SHIFT;
7273
private static final float PROJECTOR_FAR = ProjectorBlockEntity.MAX_RENDER_DISTANCE;
@@ -86,6 +87,8 @@ public final class ProjectorDepthRenderer {
8687
private static boolean isRenderingProjectorDepth;
8788
private static HitResult hitResultBak;
8889
private static boolean entityShadowsBak;
90+
private static Entity minecraftCameraEntityBak;
91+
private static Camera gameRendererMainCameraBak;
8992

9093
private static void handleProjectorNoLongerRendering(final RemovalNotification<ProjectorBlockEntity, RenderInfo> notification) {
9194
final ProjectorBlockEntity projector = notification.getKey();
@@ -140,7 +143,7 @@ public static boolean isIsRenderingProjectorDepth() {
140143
* method to grab the current depth buffer. This is necessary, because the depth buffer may be messed up by other
141144
* render passes when using the "Fabulous!" graphics mode.
142145
* <p>
143-
* Called before {@link #handleRenderLevelLast(RenderLevelLastEvent)} every frame.
146+
* Called before {@link #renderProjectors(RenderLevelStageEvent)} every frame.
144147
*/
145148
public static void captureMainCameraDepth() {
146149
final RenderTarget mainRenderTarget = Minecraft.getInstance().getMainRenderTarget();
@@ -149,6 +152,9 @@ public static void captureMainCameraDepth() {
149152
}
150153
if (mainRenderTarget.isStencilEnabled()) {
151154
MAIN_CAMERA_DEPTH.enableStencil();
155+
} else if (MAIN_CAMERA_DEPTH.isStencilEnabled()) {
156+
MAIN_CAMERA_DEPTH.destroyBuffers();
157+
MAIN_CAMERA_DEPTH = new DepthOnlyRenderTarget(mainRenderTarget.width, mainRenderTarget.height);
152158
}
153159
MAIN_CAMERA_DEPTH.copyDepthFrom(mainRenderTarget);
154160
mainRenderTarget.bindWrite(false);
@@ -159,7 +165,14 @@ public static void captureMainCameraDepth() {
159165
* {@link #addProjector(ProjectorBlockEntity)} this frame.
160166
*/
161167
@SubscribeEvent
162-
public static void handleRenderLevelLast(final RenderLevelLastEvent event) {
168+
public static void renderProjectors(final RenderLevelStageEvent event) {
169+
if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_PARTICLES) {
170+
return;
171+
}
172+
if (isIsRenderingProjectorDepth()) {
173+
return;
174+
}
175+
163176
if (VISIBLE_PROJECTORS.isEmpty()) {
164177
return;
165178
}
@@ -178,7 +191,7 @@ public static void handleRenderLevelLast(final RenderLevelLastEvent event) {
178191
});
179192

180193
final int projectorCount = Math.min(VISIBLE_PROJECTORS.size(), ModShaders.MAX_PROJECTORS);
181-
renderProjectorDepths(minecraft, level, player, event.getPartialTick(), event.getStartNanos(), projectorCount);
194+
renderProjectorDepths(minecraft, level, event.getPartialTick(), projectorCount);
182195
renderProjectorColors(minecraft, event.getPoseStack().last().pose(), event.getProjectionMatrix(), projectorCount);
183196
} finally {
184197
VISIBLE_PROJECTORS.clear();
@@ -221,10 +234,10 @@ public static void handleClientTick(final TickEvent.ClientTickEvent event) {
221234
* bre rendered. The output is the list of depth buffers, MVP matrices that were used to render them, and the
222235
* associated color texture for the projector.
223236
*/
224-
private static void renderProjectorDepths(final Minecraft minecraft, final ClientLevel level, final Player player,
225-
final float partialTicks, final long startNanos,
226-
final int projectorCount) {
227-
prepareDepthBufferRendering(minecraft, level);
237+
private static void renderProjectorDepths(final Minecraft minecraft, final ClientLevel level,
238+
final float partialTicks, final int projectorCount) {
239+
final Vec3 mainCameraPosition = minecraft.gameRenderer.getMainCamera().getPosition();
240+
prepareDepthBufferRendering(minecraft, level, partialTicks);
228241
try {
229242
final PoseStack viewModelStack = new PoseStack();
230243
for (int projectorIndex = 0; projectorIndex < projectorCount; projectorIndex++) {
@@ -239,22 +252,22 @@ private static void renderProjectorDepths(final Minecraft minecraft, final Clien
239252
RenderSystem.setProjectionMatrix(DEPTH_CAMERA_PROJECTION_MATRIX);
240253
setupViewModelMatrix(viewModelStack);
241254

242-
storeProjectorMatrix(projectorIndex, minecraft, projectorPos, viewModelStack);
255+
storeProjectorMatrix(projectorIndex, projectorPos, mainCameraPosition, viewModelStack);
243256

244257
bindProjectorDepthRenderTarget(projectorIndex, minecraft);
245258

246-
renderProjectorDepthBuffer(minecraft, partialTicks, startNanos, viewModelStack);
259+
renderProjectorDepthBuffer(minecraft, partialTicks, viewModelStack);
247260

248261
storeProjectorColorBuffer(projectorIndex, projector);
249262

250263
projector.onRendering();
251264
}
252265
} finally {
253-
finishDepthBufferRendering(minecraft, player);
266+
finishDepthBufferRendering(minecraft);
254267
}
255268
}
256269

257-
private static void prepareDepthBufferRendering(final Minecraft minecraft, final ClientLevel level) {
270+
private static void prepareDepthBufferRendering(final Minecraft minecraft, final ClientLevel level, final float partialTicks) {
258271
isRenderingProjectorDepth = true;
259272

260273
// Suppresses hit outlines being rendered.
@@ -265,12 +278,15 @@ private static void prepareDepthBufferRendering(final Minecraft minecraft, final
265278
entityShadowsBak = minecraft.options.entityShadows;
266279
minecraft.options.entityShadows = false;
267280

268-
minecraft.setCameraEntity(ProjectorCameraEntity.get(level, Vec3.ZERO, 0));
281+
minecraftCameraEntityBak = minecraft.getCameraEntity();
282+
minecraft.setCameraEntity(ProjectorCameraEntity.get(level, Vec3.ZERO, partialTicks));
283+
gameRendererMainCameraBak = minecraft.gameRenderer.mainCamera;
284+
minecraft.gameRenderer.mainCamera = PROJECTOR_DEPTH_CAMERA;
269285

270286
RenderSystem.backupProjectionMatrix();
271287
}
272288

273-
private static void finishDepthBufferRendering(final Minecraft minecraft, final Player player) {
289+
private static void finishDepthBufferRendering(final Minecraft minecraft) {
274290
minecraft.hitResult = hitResultBak;
275291
minecraft.options.entityShadows = entityShadowsBak;
276292

@@ -279,7 +295,8 @@ private static void finishDepthBufferRendering(final Minecraft minecraft, final
279295
((MinecraftExt) minecraft).setMainRenderTargetOverride(null);
280296
minecraft.getMainRenderTarget().bindWrite(true);
281297

282-
minecraft.setCameraEntity(player);
298+
minecraft.setCameraEntity(minecraftCameraEntityBak);
299+
minecraft.gameRenderer.mainCamera = gameRendererMainCameraBak;
283300

284301
isRenderingProjectorDepth = false;
285302
}
@@ -298,10 +315,7 @@ private static void setupViewModelMatrix(final PoseStack viewModelStack) {
298315
}
299316
}
300317

301-
private static void storeProjectorMatrix(final int projectorIndex, final Minecraft minecraft, final Vec3 projectorPos, final PoseStack viewModelStack) {
302-
final Camera mainCamera = minecraft.gameRenderer.getMainCamera();
303-
final Vec3 mainCameraPosition = mainCamera.getPosition();
304-
318+
private static void storeProjectorMatrix(final int projectorIndex, final Vec3 projectorPos, final Vec3 mainCameraPosition, final PoseStack viewModelStack) {
305319
// Save model-view-projection matrix for mapping in compositing shader. We use the position relative to the
306320
// main camera here, so that the main camera can sit at the origin. This avoids loss of precision.
307321
PROJECTOR_CAMERA_MATRICES[projectorIndex].load(DEPTH_CAMERA_PROJECTION_MATRIX);
@@ -321,7 +335,7 @@ private static void bindProjectorDepthRenderTarget(final int projectorIndex, fin
321335
((MinecraftExt) minecraft).setMainRenderTargetOverride(projectorDepthTarget);
322336
}
323337

324-
private static void renderProjectorDepthBuffer(final Minecraft minecraft, final float partialTicks, final long startNanos, final PoseStack viewModelStack) {
338+
private static void renderProjectorDepthBuffer(final Minecraft minecraft, final float partialTicks, final PoseStack viewModelStack) {
325339
final LevelRenderer levelRenderer = minecraft.levelRenderer;
326340
levelRenderer.prepareCullFrustum(
327341
viewModelStack,
@@ -331,7 +345,7 @@ private static void renderProjectorDepthBuffer(final Minecraft minecraft, final
331345
levelRenderer.renderLevel(
332346
viewModelStack,
333347
partialTicks,
334-
startNanos,
348+
/* startNanos */ 0,
335349
/* shouldRenderBlockOutline: */ false,
336350
PROJECTOR_DEPTH_CAMERA,
337351
minecraft.gameRenderer,
@@ -341,7 +355,7 @@ private static void renderProjectorDepthBuffer(final Minecraft minecraft, final
341355
}
342356

343357
private static void storeProjectorColorBuffer(final int projectorIndex, final ProjectorBlockEntity projector) {
344-
PROJECTOR_COLOR_TARGETS[projectorIndex] = getRenderInfo(projector).texture();
358+
PROJECTOR_COLOR_TARGETS[projectorIndex] = getColorBuffer(projector);
345359
}
346360

347361
/**
@@ -352,7 +366,6 @@ private static void storeProjectorColorBuffer(final int projectorIndex, final Pr
352366
*/
353367
private static void renderProjectorColors(final Minecraft minecraft, final Matrix4f modelViewMatrix, final Matrix4f projectionMatrix, final int projectorCount) {
354368
prepareColorBufferRendering();
355-
356369
try {
357370
prepareOrthographicRendering(minecraft);
358371

@@ -439,15 +452,15 @@ private static Matrix4f getFrustumMatrix(final float near, final float far, fina
439452
});
440453
}
441454

442-
private static RenderInfo getRenderInfo(final ProjectorBlockEntity projector) {
455+
private static DynamicTexture getColorBuffer(final ProjectorBlockEntity projector) {
443456
try {
444457
return RENDER_INFO.get(projector, () -> {
445458
final DynamicTexture texture = new DynamicTexture(ProjectorDevice.WIDTH, ProjectorDevice.HEIGHT, false);
446459
texture.upload();
447460
final RenderInfo renderInfo = new RenderInfo(texture);
448461
projector.setFrameConsumer(renderInfo);
449462
return renderInfo;
450-
});
463+
}).texture();
451464
} catch (final ExecutionException e) {
452465
throw new RuntimeException(e);
453466
}

src/main/java/li/cil/oc2/client/renderer/blockentity/NetworkConnectorRenderer.java

Lines changed: 0 additions & 44 deletions
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
public net.minecraft.client.MouseHandler f_91520_ # mouseGrabbed
22
public-f net.minecraft.world.entity.Entity m_142467_(Lnet/minecraft/world/entity/Entity$RemovalReason;)V # setRemoved
3+
public-f net.minecraft.client.renderer.GameRenderer f_109054_ # mainCamera

src/main/resources/META-INF/mods.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ This mod uses the Terminus Font under the Open Font License. The full license ca
1717
[[dependencies.oc2]]
1818
modId = "forge"
1919
mandatory = true
20-
versionRange = "[40.1.0,)"
20+
versionRange = "[40.1.68,)"
2121
ordering = "NONE"
2222
side = "BOTH"
2323
[[dependencies.oc2]]

0 commit comments

Comments
 (0)