Skip to content

Commit 4cb6ad4

Browse files
committed
WIP code for improving missing projector rendering
1 parent 095255a commit 4cb6ad4

13 files changed

+265
-32
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package dev.compactmods.crafting.capability;
2+
3+
import javax.annotation.Nullable;
4+
import net.minecraft.nbt.CompoundNBT;
5+
import net.minecraft.nbt.INBT;
6+
import net.minecraft.util.Direction;
7+
import net.minecraftforge.common.capabilities.Capability;
8+
import net.minecraftforge.common.capabilities.CapabilityInject;
9+
import net.minecraftforge.common.capabilities.CapabilityManager;
10+
11+
public class CapabilityProjectorRenderInfo {
12+
@CapabilityInject(IProjectorRenderInfo.class)
13+
public static Capability<IProjectorRenderInfo> TEMP_PROJECTOR_RENDERING = null;
14+
15+
public static void setup() {
16+
CapabilityManager.INSTANCE.register(
17+
IProjectorRenderInfo.class,
18+
new Capability.IStorage<IProjectorRenderInfo>() {
19+
@Nullable
20+
@Override
21+
public INBT writeNBT(Capability<IProjectorRenderInfo> capability, IProjectorRenderInfo instance, Direction side) {
22+
return new CompoundNBT();
23+
}
24+
25+
@Override
26+
public void readNBT(Capability<IProjectorRenderInfo> capability, IProjectorRenderInfo instance, Direction side, INBT nbt) {
27+
28+
}
29+
}, null);
30+
}
31+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package dev.compactmods.crafting.capability;
2+
3+
import java.util.Set;
4+
import com.mojang.blaze3d.matrix.MatrixStack;
5+
import net.minecraft.util.math.BlockPos;
6+
import net.minecraft.world.World;
7+
8+
public interface IProjectorRenderInfo {
9+
10+
Set<BlockPos> getMissingProjectors();
11+
12+
int getRenderTimeLeft();
13+
14+
void render(MatrixStack matrixStack);
15+
16+
void tick();
17+
18+
void resetRenderTime();
19+
20+
void setProjector(World world, BlockPos pos);
21+
}

src/main/java/dev/compactmods/crafting/client/ClientEventHandler.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import dev.compactmods.crafting.CompactCrafting;
55
import dev.compactmods.crafting.api.EnumCraftingState;
66
import dev.compactmods.crafting.api.field.IActiveWorldFields;
7+
import dev.compactmods.crafting.capability.CapabilityProjectorRenderInfo;
8+
import dev.compactmods.crafting.capability.IProjectorRenderInfo;
79
import dev.compactmods.crafting.field.capability.CapabilityActiveWorldFields;
810
import dev.compactmods.crafting.field.render.CraftingPreviewRenderer;
911
import net.minecraft.client.Minecraft;
12+
import net.minecraft.client.entity.player.ClientPlayerEntity;
1013
import net.minecraft.client.renderer.ActiveRenderInfo;
1114
import net.minecraft.client.renderer.IRenderTypeBuffer;
12-
import net.minecraft.client.renderer.WorldRenderer;
1315
import net.minecraft.client.renderer.texture.OverlayTexture;
1416
import net.minecraft.client.world.ClientWorld;
1517
import net.minecraft.util.math.BlockPos;
@@ -28,6 +30,12 @@ public class ClientEventHandler {
2830
public static void onTick(final TickEvent.ClientTickEvent evt) {
2931
if (evt.phase != TickEvent.Phase.START) return;
3032

33+
final ClientPlayerEntity player = Minecraft.getInstance().player;
34+
if(player != null) {
35+
player.getCapability(CapabilityProjectorRenderInfo.TEMP_PROJECTOR_RENDERING)
36+
.ifPresent(IProjectorRenderInfo::tick);
37+
}
38+
3139
ClientWorld level = Minecraft.getInstance().level;
3240
if (level != null && !Minecraft.getInstance().isPaused()) {
3341
level.getCapability(CapabilityActiveWorldFields.ACTIVE_WORLD_FIELDS)
@@ -37,13 +45,14 @@ public static void onTick(final TickEvent.ClientTickEvent evt) {
3745

3846
@SubscribeEvent
3947
public static void onWorldRender(final RenderWorldLastEvent event) {
40-
final WorldRenderer renderer = event.getContext();
41-
4248
final Minecraft mc = Minecraft.getInstance();
4349

4450
if (mc.level == null)
4551
return;
4652

53+
mc.player.getCapability(CapabilityProjectorRenderInfo.TEMP_PROJECTOR_RENDERING)
54+
.ifPresent(render -> render.render(event.getMatrixStack()));
55+
4756
final ActiveRenderInfo mainCamera = mc.gameRenderer.getMainCamera();
4857
final RayTraceResult hitResult = mc.hitResult;
4958

src/main/java/dev/compactmods/crafting/projector/render/CCRenderTypes.java renamed to src/main/java/dev/compactmods/crafting/client/render/CCRenderTypes.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.compactmods.crafting.projector.render;
1+
package dev.compactmods.crafting.client.render;
22

33
import com.mojang.blaze3d.platform.GlStateManager;
44
import com.mojang.blaze3d.systems.RenderSystem;
@@ -36,13 +36,12 @@ public CCRenderTypes(String p_i225992_1_, VertexFormat p_i225992_2_, int p_i2259
3636
.setWriteMaskState(COLOR_WRITE)
3737
.createCompositeState(false));
3838

39-
// public static final RenderType FIELD_PROJECTION_ARC = RenderType.create("projection_field_arc",
40-
// DefaultVertexFormats.POSITION_COLOR, GL11.GL_QUADS, 256,
41-
// RenderType.State.builder()
42-
// .setTransparencyState(PROJECTION_TRANSPARENCY)
43-
// .setCullState(new RenderState.CullState(false))
44-
// .setWriteMaskState(new RenderState.WriteMaskState(true, true))
45-
// .createCompositeState(false));
39+
public static final RenderType PHANTOM = create("phantom", DefaultVertexFormats.BLOCK, 7, 2097152, true, false, RenderType.State.builder()
40+
.setShadeModelState(RenderState.SMOOTH_SHADE)
41+
.setLightmapState(RenderState.LIGHTMAP)
42+
.setTextureState(BLOCK_SHEET_MIPPED)
43+
.setTransparencyState(TRANSLUCENT_TRANSPARENCY)
44+
.createCompositeState(true));
4645

4746

4847

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package dev.compactmods.crafting.client.render;
2+
3+
import java.util.Set;
4+
import java.util.stream.Collectors;
5+
import com.mojang.blaze3d.matrix.MatrixStack;
6+
import dev.compactmods.crafting.Registration;
7+
import dev.compactmods.crafting.capability.IProjectorRenderInfo;
8+
import dev.compactmods.crafting.projector.FieldProjectorBlock;
9+
import dev.compactmods.crafting.projector.ProjectorHelper;
10+
import net.minecraft.block.BlockState;
11+
import net.minecraft.client.Minecraft;
12+
import net.minecraft.client.renderer.ActiveRenderInfo;
13+
import net.minecraft.client.renderer.IRenderTypeBuffer;
14+
import net.minecraft.util.Direction;
15+
import net.minecraft.util.math.BlockPos;
16+
import net.minecraft.util.math.vector.Vector3d;
17+
import net.minecraft.world.World;
18+
19+
public class ClientProjectorRenderInfo implements IProjectorRenderInfo {
20+
21+
private final BlockState baseState;
22+
private Set<BlockPos> remainingProjectors;
23+
private int renderTime;
24+
25+
26+
public ClientProjectorRenderInfo() {
27+
this.baseState = Registration.FIELD_PROJECTOR_BLOCK.get().defaultBlockState();
28+
}
29+
30+
@Override
31+
public Set<BlockPos> getMissingProjectors() {
32+
return remainingProjectors;
33+
}
34+
35+
@Override
36+
public int getRenderTimeLeft() {
37+
return renderTime;
38+
}
39+
40+
@Override
41+
public void render(MatrixStack matrixStack) {
42+
if(this.renderTime == 0) return;
43+
if(this.remainingProjectors.isEmpty()) return;
44+
45+
final IRenderTypeBuffer.Impl buffers = Minecraft.getInstance().renderBuffers().bufferSource();
46+
final ActiveRenderInfo mainCamera = Minecraft.getInstance().gameRenderer.getMainCamera();
47+
48+
matrixStack.pushPose();
49+
Vector3d projectedView = mainCamera.getPosition();
50+
matrixStack.translate(-projectedView.x, -projectedView.y, -projectedView.z);
51+
52+
remainingProjectors.forEach(pos -> {
53+
matrixStack.pushPose();
54+
matrixStack.translate(
55+
(double) pos.getX(),
56+
(double) pos.getY(),
57+
(double) pos.getZ()
58+
);
59+
60+
GhostRenderer.renderTransparentBlock(baseState, matrixStack, buffers);
61+
matrixStack.popPose();
62+
});
63+
64+
matrixStack.popPose();
65+
}
66+
67+
@Override
68+
public void tick() {
69+
if(renderTime > 0)
70+
this.renderTime--;
71+
if(renderTime < 0)
72+
this.renderTime = 0;
73+
}
74+
75+
@Override
76+
public void resetRenderTime() {
77+
this.renderTime = 20 * 10;
78+
}
79+
80+
@Override
81+
public void setProjector(World level, BlockPos initial) {
82+
this.remainingProjectors = ProjectorHelper.getMissingProjectors(level, initial,
83+
FieldProjectorBlock.getDirection(level, initial).orElse(Direction.UP))
84+
.collect(Collectors.toSet());
85+
}
86+
}

src/main/java/dev/compactmods/crafting/projector/render/CubeRenderHelper.java renamed to src/main/java/dev/compactmods/crafting/client/render/CubeRenderHelper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.compactmods.crafting.projector.render;
1+
package dev.compactmods.crafting.client.render;
22

33
import com.mojang.blaze3d.matrix.MatrixStack;
44
import com.mojang.blaze3d.vertex.IVertexBuilder;
@@ -98,7 +98,7 @@ public static Vector3d getCubeFacePoint(AxisAlignedBB cube, Direction face, Enum
9898

9999
public static double getScanLineHeight(AxisAlignedBB cube, double gameTime) {
100100
// Get the height of the scan line
101-
double zAngle = ((Math.sin(Math.toDegrees(gameTime) / -FieldProjectorRenderer.RotationSpeed.MEDIUM.getSpeed()) + 1.0d) / 2) * (cube.getYsize());
101+
double zAngle = ((Math.sin(Math.toDegrees(gameTime) / -RotationSpeed.MEDIUM.getSpeed()) + 1.0d) / 2) * (cube.getYsize());
102102
double scanHeight = (cube.minY + zAngle);
103103

104104
return scanHeight;

src/main/java/dev/compactmods/crafting/projector/render/EnumCubeFaceCorner.java renamed to src/main/java/dev/compactmods/crafting/client/render/EnumCubeFaceCorner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.compactmods.crafting.projector.render;
1+
package dev.compactmods.crafting.client.render;
22

33
public enum EnumCubeFaceCorner {
44
BOTTOM_LEFT,
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package dev.compactmods.crafting.client.render;
2+
3+
import java.util.Arrays;
4+
import java.util.Random;
5+
import com.mojang.blaze3d.matrix.MatrixStack;
6+
import com.mojang.blaze3d.vertex.IVertexBuilder;
7+
import net.minecraft.block.BlockState;
8+
import net.minecraft.client.Minecraft;
9+
import net.minecraft.client.renderer.IRenderTypeBuffer;
10+
import net.minecraft.client.renderer.LightTexture;
11+
import net.minecraft.client.renderer.model.IBakedModel;
12+
import net.minecraft.client.renderer.texture.OverlayTexture;
13+
import net.minecraft.util.Direction;
14+
import net.minecraftforge.client.model.data.EmptyModelData;
15+
16+
public class GhostRenderer {
17+
public static void renderTransparentBlock(BlockState state, MatrixStack matrix, IRenderTypeBuffer buffer) {
18+
IVertexBuilder builder = buffer.getBuffer(CCRenderTypes.PHANTOM);
19+
matrix.translate(0.1F, 0.1F, 0.1F);
20+
matrix.scale(0.8F, 0.8F, 0.8F);
21+
IBakedModel model = Minecraft.getInstance().getBlockRenderer().getBlockModel(state.getBlockState());
22+
if(model != Minecraft.getInstance().getModelManager().getMissingModel()) {
23+
Arrays.stream(Direction.values())
24+
.flatMap(direction -> model.getQuads(state.getBlockState(), direction, new Random(42L), EmptyModelData.INSTANCE).stream())
25+
.forEach(quad -> builder.addVertexData(matrix.last(), quad, 1.0F, 1.0F, 1.0F, 0.8F, LightTexture.pack(15, 15), OverlayTexture.NO_OVERLAY));
26+
model.getQuads(state.getBlockState(), null, new Random(42L), EmptyModelData.INSTANCE)
27+
.forEach(quad -> builder.addVertexData(matrix.last(), quad, 1.0F, 1.0F, 1.0F, 0.8F, LightTexture.pack(15, 15), OverlayTexture.NO_OVERLAY));
28+
}
29+
}
30+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package dev.compactmods.crafting.client.render;
2+
3+
public enum RotationSpeed {
4+
SLOW(5000),
5+
MEDIUM(2500),
6+
FAST(1000);
7+
8+
private int speed;
9+
10+
RotationSpeed(int speed) {
11+
this.speed = speed;
12+
}
13+
14+
public int getSpeed() {
15+
return speed;
16+
}
17+
}

src/main/java/dev/compactmods/crafting/compat/jei/JeiMiniaturizationCraftingCategory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import dev.compactmods.crafting.CompactCrafting;
1010
import dev.compactmods.crafting.Registration;
1111
import dev.compactmods.crafting.client.fakeworld.RenderingWorld;
12-
import dev.compactmods.crafting.projector.render.CCRenderTypes;
12+
import dev.compactmods.crafting.client.render.CCRenderTypes;
1313
import dev.compactmods.crafting.recipes.MiniaturizationRecipe;
1414
import dev.compactmods.crafting.recipes.components.BlockComponent;
1515
import dev.compactmods.crafting.client.ui.ScreenArea;

0 commit comments

Comments
 (0)