Skip to content

Commit

Permalink
Backport this commit a838855
Browse files Browse the repository at this point in the history
  • Loading branch information
Edivad99 committed Mar 3, 2024
1 parent 57940f7 commit 088e339
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 112 deletions.
9 changes: 9 additions & 0 deletions src/api/java/mods/railcraft/api/signal/SignalAspect.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ This work (the API) is licensed under the "MIT" License,
import mods.railcraft.api.util.EnumUtil;
import net.minecraft.network.chat.Component;
import net.minecraft.util.StringRepresentable;
import net.minecraft.world.item.DyeColor;

/**
* Represents a Signal state.
Expand Down Expand Up @@ -131,6 +132,14 @@ public SignalAspect previous() {
return EnumUtil.previous(this, values());
}

public int color() {
return (switch (this) {
case GREEN -> DyeColor.LIME;
case YELLOW, BLINK_YELLOW -> DyeColor.YELLOW;
default -> DyeColor.RED;
}).getFireworkColor();
}

/**
* Return true if the light is currently off.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ This work (the API) is licensed under the "MIT" License,

import java.util.function.Consumer;
import org.jetbrains.annotations.Nullable;
import mods.railcraft.api.signal.entity.SignalControllerEntity;
import mods.railcraft.api.signal.entity.SignalReceiverEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.network.FriendlyByteBuf;
Expand Down Expand Up @@ -110,7 +111,7 @@ public void spawnTuningAuraParticles() {
var handler = SignalUtil.tuningAuraHandler();
if (handler.isTuningAuraActive()) {
this.stream().forEach(peer -> handler.spawnTuningAura(
this.getBlockEntity(), peer.asBlockEntity()));
(SignalControllerEntity )this.getBlockEntity(), peer.asBlockEntity()));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ This work (the API) is licensed under the "MIT" License,
-----------------------------------------------------------------------------*/
package mods.railcraft.api.signal;

import mods.railcraft.api.signal.entity.SignalControllerEntity;
import net.minecraft.world.level.block.entity.BlockEntity;

public interface TuningAuraHandler {

boolean isTuningAuraActive();

void spawnTuningAura(BlockEntity start, BlockEntity dest);
void spawnTuningAura(SignalControllerEntity start, BlockEntity dest);
}
16 changes: 7 additions & 9 deletions src/main/java/mods/railcraft/client/TuningAuraHandlerImpl.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package mods.railcraft.client;

import mods.railcraft.api.signal.TuningAuraHandler;
import mods.railcraft.api.signal.entity.SignalControllerEntity;
import mods.railcraft.client.renderer.blockentity.SignalAuraRenderUtil;
import mods.railcraft.particle.TuningAuraParticleOptions;
import mods.railcraft.world.item.GogglesItem;
Expand All @@ -16,24 +17,21 @@ public boolean isTuningAuraActive() {
}

@Override
public void spawnTuningAura(BlockEntity start, BlockEntity dest) {
var level = start.getLevel();
public void spawnTuningAura(SignalControllerEntity start, BlockEntity dest) {
var level = start.asBlockEntity().getLevel();
var random = level.getRandom();
if (random.nextInt(2) != 0) {
return;
}

var pos = start.getBlockPos();
var pos = start.asBlockEntity().getBlockPos();
var px = pos.getX() + getRandomParticleOffset(random);
var py = pos.getY() + getRandomParticleOffset(random);
var pz = pos.getZ() + getRandomParticleOffset(random);

var colorProfile =
GogglesItem.isGoggleAuraActive(GogglesItem.Aura.SIGNALLING)
? SignalAuraRenderUtil.ColorProfile.CONTROLLER_ASPECT
: SignalAuraRenderUtil.ColorProfile.COORD_RAINBOW;

int color = colorProfile.getColor(start, start.getBlockPos(), dest.getBlockPos());
var color = GogglesItem.isGoggleAuraActive(GogglesItem.Aura.SIGNALLING)
? start.getSignalController().aspect().color()
: SignalAuraRenderUtil.rainbow(pos, dest.getBlockPos());

level.addParticle(
new TuningAuraParticleOptions(dest.getBlockPos().getCenter(), color),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package mods.railcraft.client.renderer.blockentity;

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Objects;
import com.mojang.blaze3d.vertex.PoseStack;
import mods.railcraft.api.signal.BlockSignalEntity;
import mods.railcraft.api.signal.TokenSignalEntity;
Expand All @@ -11,135 +10,102 @@
import mods.railcraft.world.item.GogglesItem;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Position;
import net.minecraft.util.FastColor;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.phys.Vec3;

public class SignalAuraRenderUtil {

public static void tryRenderSignalAura(BlockEntity blockEntity,
PoseStack poseStack, MultiBufferSource bufferSource) {
var lineRenderer = LineRenderer.simple(bufferSource);
if (blockEntity instanceof SignalControllerEntity provider) {
var peers = provider.getSignalController().peers();
if (GogglesItem.isGoggleAuraActive(GogglesItem.Aura.TUNING)) {
renderSignalAura(blockEntity, poseStack, bufferSource, peers,
ColorProfile.COORD_RAINBOW);
} else if (GogglesItem.isGoggleAuraActive(GogglesItem.Aura.SIGNALLING)) {
renderSignalAura(blockEntity, poseStack, bufferSource, peers,
ColorProfile.CONTROLLER_ASPECT);
}
renderControllerAura(blockEntity.getBlockPos(), poseStack, lineRenderer, provider);
}
if (blockEntity instanceof BlockSignalEntity blockSignal) {
var peers = blockSignal.signalNetwork().peers();
if (GogglesItem.isGoggleAuraActive(GogglesItem.Aura.SURVEYING)) {
renderSignalAura(blockEntity, poseStack, bufferSource, peers,
ColorProfile.COORD_RAINBOW);
} else if (GogglesItem.isGoggleAuraActive(GogglesItem.Aura.SIGNALLING)) {
renderSignalAura(blockEntity, poseStack, bufferSource, peers,
ColorProfile.CONSTANT_BLUE);
}
renderBlockSignalAura(blockEntity.getBlockPos(), poseStack, lineRenderer, blockSignal);
} else if (blockEntity instanceof TokenSignalEntity tokenSignal) {
var centroid = Collections.singletonList(tokenSignal.ringCentroidPos());
if (GogglesItem.isGoggleAuraActive(GogglesItem.Aura.SURVEYING)) {
renderSignalAuraf(blockEntity, poseStack, bufferSource, centroid,
(t, s, d) -> tokenSignal.ringId().hashCode());
} else if (GogglesItem.isGoggleAuraActive(GogglesItem.Aura.SIGNALLING)) {
renderSignalAuraf(blockEntity, poseStack, bufferSource, centroid,
ColorProfile.CONSTANT_BLUE);
}
renderTokenSignalAura(blockEntity.getBlockPos(), poseStack, lineRenderer, tokenSignal);
}
}

private static void renderSignalAuraf(
BlockEntity blockEntity, PoseStack poseStack, MultiBufferSource bufferSource,
Collection<Vec3> endPoints, ColorSupplier colorProfile) {
if (endPoints.isEmpty()) {
return;
private static void renderControllerAura(BlockPos blockPos, PoseStack poseStack,
LineRenderer lineRenderer, SignalControllerEntity provider) {
var peers = provider.getSignalController().peers();
if (GogglesItem.isGoggleAuraActive(GogglesItem.Aura.TUNING)) {
renderSignalAura(blockPos, poseStack, lineRenderer, peers, SignalAuraRenderUtil::rainbow);
} else if (GogglesItem.isGoggleAuraActive(GogglesItem.Aura.SIGNALLING)) {
renderSignalAura(blockPos, poseStack, lineRenderer, peers,
ColorSupplier.of(provider.getSignalController().aspect().color()));
}
}

var renderer = LineRenderer.simple(bufferSource);
for (var target : endPoints) {
int color = colorProfile.getColor(blockEntity, blockEntity.getBlockPos(),
BlockPos.containing(target));
var red = FastColor.ARGB32.red(color);
var green = FastColor.ARGB32.green(color);
var blue = FastColor.ARGB32.blue(color);

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

renderer.renderLine(poseStack,
red, green, blue, 255,
0.5F, 0.5F, 0.5F,
endX, endY, endZ);
private static void renderBlockSignalAura(BlockPos blockPos, PoseStack poseStack,
LineRenderer lineRenderer, BlockSignalEntity blockSignal) {
var peers = blockSignal.signalNetwork().peers();
if (GogglesItem.isGoggleAuraActive(GogglesItem.Aura.SURVEYING)) {
renderSignalAura(blockPos, poseStack, lineRenderer, peers, SignalAuraRenderUtil::rainbow);
} else if (GogglesItem.isGoggleAuraActive(GogglesItem.Aura.SIGNALLING)) {
renderSignalAura(blockPos, poseStack, lineRenderer, peers, ColorSupplier.CONSTANT_BLUE);
}
}

private static void renderSignalAura(
BlockEntity blockEntity, PoseStack poseStack, MultiBufferSource bufferSource,
Collection<BlockPos> endPoints, ColorSupplier colorProfile) {
if (endPoints.isEmpty()) {
return;
private static void renderTokenSignalAura(BlockPos blockPos, PoseStack poseStack,
LineRenderer lineRenderer, TokenSignalEntity tokenSignal) {
if (GogglesItem.isGoggleAuraActive(GogglesItem.Aura.SURVEYING)) {
renderAuraLine(lineRenderer, poseStack, tokenSignal.ringId().hashCode(), blockPos,
tokenSignal.ringCentroidPos());
} else if (GogglesItem.isGoggleAuraActive(GogglesItem.Aura.SIGNALLING)) {
renderAuraLine(lineRenderer, poseStack, DyeColor.BLUE.getFireworkColor(), blockPos,
tokenSignal.ringCentroidPos());
}
}

private static void renderAuraLine(LineRenderer renderer, PoseStack poseStack, int color,
BlockPos source, Position target) {
var red = FastColor.ARGB32.red(color);
var green = FastColor.ARGB32.green(color);
var blue = FastColor.ARGB32.blue(color);

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

renderer.renderLine(poseStack,
red, green, blue, 255,
0.5F, 0.5F, 0.5F,
endX, endY, endZ);
}

var renderer = LineRenderer.simple(bufferSource);
private static void renderSignalAura(BlockPos source, PoseStack poseStack,
LineRenderer lineRenderer, Collection<BlockPos> endPoints, ColorSupplier colorProfile) {
for (var target : endPoints) {
int color = colorProfile.getColor(blockEntity, blockEntity.getBlockPos(), target);
var red = FastColor.ARGB32.red(color);
var green = FastColor.ARGB32.green(color);
var blue = FastColor.ARGB32.blue(color);

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();

renderer.renderLine(poseStack,
red, green, blue, 255,
0.5F, 0.5F, 0.5F,
endX, endY, endZ);
int color = colorProfile.getColor(source, target);
renderAuraLine(lineRenderer, poseStack, color, source, target.getCenter());
}
}

public static int rainbow(BlockPos source, BlockPos target) {
var comparison = source.compareTo(target);
return comparison < 0
? Objects.hash(source, target)
: Objects.hash(target, source);
}

@FunctionalInterface
public interface ColorSupplier {

int getColor(BlockEntity blockEntity, BlockPos source, BlockPos target);
}
ColorSupplier CONSTANT_BLUE = of(DyeColor.BLUE);

int getColor(BlockPos source, BlockPos target);

static ColorSupplier of(DyeColor color) {
return of(color.getFireworkColor());
}

public enum ColorProfile implements ColorSupplier {
COORD_RAINBOW {

private final BlockPos[] coords = new BlockPos[2];

@Override
public int getColor(BlockEntity blockEntity, BlockPos source, BlockPos target) {
this.coords[0] = source;
this.coords[1] = target;
Arrays.sort(this.coords);
return Arrays.hashCode(coords);
}
},
CONSTANT_BLUE {
@Override
public int getColor(BlockEntity blockEntity, BlockPos source, BlockPos target) {
return DyeColor.BLUE.getFireworkColor();
}
},
CONTROLLER_ASPECT {
@Override
public int getColor(BlockEntity blockEntity, BlockPos source, BlockPos target) {
if (blockEntity instanceof SignalControllerEntity signalControllerEntity) {
var aspect = signalControllerEntity.getSignalController().aspect();
return switch (aspect) {
case GREEN -> DyeColor.LIME.getFireworkColor();
case YELLOW, BLINK_YELLOW -> DyeColor.YELLOW.getFireworkColor();
default -> DyeColor.RED.getFireworkColor();
};
}
return CONSTANT_BLUE.getColor(blockEntity, source, target);
}
static ColorSupplier of(int color) {
return (source, target) -> color;
}
}
}

0 comments on commit 088e339

Please sign in to comment.