Skip to content

Commit

Permalink
Abstract line rendering into an interface
Browse files Browse the repository at this point in the history
  • Loading branch information
robotman2412 committed Feb 24, 2024
1 parent fd6b3b1 commit 7624d89
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 77 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import java.util.Collection;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import mods.railcraft.client.util.LineRenderer;
import mods.railcraft.client.util.RenderUtil;
import mods.railcraft.client.util.SimpleLineRenderer;
import mods.railcraft.network.play.LinkedCartsMessage;
import mods.railcraft.world.item.GogglesItem;
import mods.railcraft.world.item.RailcraftItems;
Expand All @@ -13,6 +15,7 @@
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;

public class ShuntingAuraRenderer {

Expand Down Expand Up @@ -48,36 +51,13 @@ public void render(PoseStack poseStack, Camera mainCamera, float partialTick) {
continue;
}

var consumer = bufferSource.getBuffer(RenderType.lines());
var pose = poseStack.last();

var renderer = new SimpleLineRenderer(bufferSource);
final int color = linkedCart.trainId().hashCode();
float red = RenderUtil.getRed(color);
float green = RenderUtil.getGreen(color);
float blue = RenderUtil.getBlue(color);

final var cartPosition = cart.getPosition(partialTick);
final float cartX = (float) cartPosition.x();
final float cartY = (float) cartPosition.y();
final float cartZ = (float) cartPosition.z();

var matrix4f = pose.pose();
var matrix3f = pose.normal();
consumer
.vertex(matrix4f, cartX, cartY, cartZ)
.color(red, green, blue, 1)
.normal(matrix3f, 0, 0, 0)
.endVertex();
consumer
.vertex(matrix4f, cartX, cartY + 2, cartZ)
.color(red, green, blue, 1)
.normal(matrix3f, 0, 0, 0)
.endVertex();

this.renderLink(level, cartX, cartY, cartZ, linkedCart.linkAId(), red,
green, blue, partialTick, consumer, pose);
this.renderLink(level, cartX, cartY, cartZ, linkedCart.linkBId(), red,
green, blue, partialTick, consumer, pose);
renderer.renderLine(poseStack, color, cartPosition, cartPosition.add(0, 2, 0));
this.renderLink(level, cartPosition, linkedCart.linkAId(), color, partialTick, renderer, poseStack);
this.renderLink(level, cartPosition, linkedCart.linkBId(), color, partialTick, renderer, poseStack);

bufferSource.endBatch();
}
Expand All @@ -86,9 +66,7 @@ public void render(PoseStack poseStack, Camera mainCamera, float partialTick) {
}
}

private void renderLink(Level level, float cartX, float cartY, float cartZ, int cartId,
float red, float green, float blue, float partialTick, VertexConsumer consumer,
PoseStack.Pose pose) {
private void renderLink(Level level, Vec3 cartPosition, int cartId, int color, float partialTick, LineRenderer renderer, PoseStack poseStack) {
if (cartId == -1) {
return;
}
Expand All @@ -99,16 +77,6 @@ private void renderLink(Level level, float cartX, float cartY, float cartZ, int
}

var cartAPosition = cartA.getPosition(partialTick);
consumer
.vertex(pose.pose(), cartX, cartY + 2, cartZ)
.color(red, green, blue, 1)
.normal(pose.normal(), 0, 0, 0)
.endVertex();
consumer
.vertex(pose.pose(), (float) cartAPosition.x(), (float) cartAPosition.y() + 1.5F,
(float) cartAPosition.z())
.color(red, green, blue, 1)
.normal(pose.normal(), 0, 0, 0)
.endVertex();
renderer.renderLine(poseStack, color, cartAPosition.add(0, 1.5f, 0), cartPosition.add(0, 2, 0));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
import java.util.Collection;
import java.util.Collections;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import mods.railcraft.api.signal.BlockSignalEntity;
import mods.railcraft.api.signal.TokenSignalEntity;
import mods.railcraft.api.signal.entity.SignalControllerEntity;
import mods.railcraft.client.util.RenderUtil;
import mods.railcraft.client.util.SimpleLineRenderer;
import mods.railcraft.world.item.GogglesItem;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
Expand Down Expand Up @@ -59,34 +59,23 @@ private static void renderSignalAuraf(
return;
}

poseStack.pushPose();
var consumer = bufferSource.getBuffer(RenderType.lines());
var matrix = poseStack.last().pose();
var normal = poseStack.last().normal();

var renderer = new SimpleLineRenderer(bufferSource);
for (Vec3 target : endPoints) {
int color = colorProfile.getColor(blockEntity, blockEntity.getBlockPos(), BlockPos.containing(target));
float red = RenderUtil.getRed(color);
float green = RenderUtil.getGreen(color);
float blue = RenderUtil.getBlue(color);

consumer
.vertex(matrix, 0.5F, 0.5F, 0.5F)
.color(red, green, blue, 1)
.normal(normal, 1, 0, 0)
.endVertex();

float endX = (float) target.x() - blockEntity.getBlockPos().getX();
float endY = (float) target.y() - blockEntity.getBlockPos().getY();
float endZ = (float) target.z() - blockEntity.getBlockPos().getZ();

consumer
.vertex(matrix, endX, endY, endZ)
.color(red, green, blue, 1)
.normal(normal, 1, 0, 0)
.endVertex();
renderer.renderLine(poseStack,
red ,green, blue, 1,
0.5F, 0.5F, 0.5F,
endX, endY, endZ
);
}
poseStack.popPose();
}

private static void renderSignalAura(
Expand All @@ -96,34 +85,23 @@ private static void renderSignalAura(
return;
}

poseStack.pushPose();
var consumer = bufferSource.getBuffer(RenderType.lines());
var matrix = poseStack.last().pose();
var normal = poseStack.last().normal();

var renderer = new SimpleLineRenderer(bufferSource);
for (BlockPos target : endPoints) {
int color = colorProfile.getColor(blockEntity, blockEntity.getBlockPos(), target);
float red = RenderUtil.getRed(color);
float green = RenderUtil.getGreen(color);
float blue = RenderUtil.getBlue(color);

consumer
.vertex(matrix, 0.5F, 0.5F, 0.5F)
.color(red, green, blue, 1)
.normal(normal, 1, 0, 0)
.endVertex();

float endX = 0.5F + target.getX() - blockEntity.getBlockPos().getX();
float endY = 0.5F + target.getY() - blockEntity.getBlockPos().getY();
float endZ = 0.5F + target.getZ() - blockEntity.getBlockPos().getZ();

consumer
.vertex(matrix, endX, endY, endZ)
.color(red, green, blue, 1)
.normal(normal, 1, 0, 0)
.endVertex();
renderer.renderLine(poseStack,
red ,green, blue, 1,
0.5F, 0.5F, 0.5F,
endX, endY, endZ
);
}
poseStack.popPose();
}

@FunctionalInterface
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/mods/railcraft/client/util/LineRenderer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package mods.railcraft.client.util;

import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.world.phys.Vec3;

public interface LineRenderer {
default void renderLine(PoseStack poseStack, int color, Vec3 from, Vec3 to) {
renderLine(poseStack,
RenderUtil.getRed(color), RenderUtil.getGreen(color), RenderUtil.getBlue(color), 1,
(float) from.x, (float) from.y, (float) from.z,
(float) to.x, (float) to.y, (float) to.z
);
}

void renderLine(PoseStack poseStack, float r, float g, float b, float a, float x0, float y0, float z0, float x1, float y1, float z1);
}
31 changes: 31 additions & 0 deletions src/main/java/mods/railcraft/client/util/SimpleLineRenderer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package mods.railcraft.client.util;

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;

public class SimpleLineRenderer implements LineRenderer {
private final VertexConsumer consumer;

public SimpleLineRenderer(MultiBufferSource bufferSource) {
consumer = bufferSource.getBuffer(RenderType.lines());
}

public void renderLine(PoseStack poseStack, float r, float g, float b, float a, float x0, float y0, float z0, float x1, float y1, float z1) {
poseStack.pushPose();
var matrix = poseStack.last().pose();
var normal = poseStack.last().normal();
consumer
.vertex(matrix, x0, y0, z0)
.color(r, g, b, a)
.normal(normal, 0, 0, 0)
.endVertex();
consumer
.vertex(matrix, x1, y1, z1)
.color(r, g, b, a)
.normal(normal, 0, 0, 0)
.endVertex();
poseStack.popPose();
}
}
1 change: 0 additions & 1 deletion src/main/java/mods/railcraft/util/MathUtil.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package mods.railcraft.util;

import java.util.Collection;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Vec3i;
import net.minecraft.world.phys.Vec3;

Expand Down

0 comments on commit 7624d89

Please sign in to comment.