Skip to content

Commit 1c7bec1

Browse files
committed
✨ Antenna Rewrite
1 parent 617f0c4 commit 1c7bec1

19 files changed

Lines changed: 127 additions & 90 deletions

common/src/main/java/org/modogthedev/superposition/blockentity/MonitorBlockEntity.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,14 @@
1212
import org.modogthedev.superposition.system.signal.data.EncodedData;
1313
import org.modogthedev.superposition.util.TickableBlockEntity;
1414

15-
import java.util.ArrayList;
16-
import java.util.Arrays;
17-
import java.util.Comparator;
18-
import java.util.List;
15+
import java.util.*;
1916

2017
public class MonitorBlockEntity extends SignalActorBlockEntity implements TickableBlockEntity {
2118
public MonitorBlockEntity(BlockPos pos, BlockState state) {
2219
super(SuperpositionBlockEntities.MONITOR.get(), pos, state);
2320
}
2421

2522
private BlockPos linkedPos = null;
26-
public Signal[] signals = new Signal[12];
2723
public float highestValue = 0;
2824
public float lowestValue = 0;
2925
public List<String> text = new ArrayList<>();
@@ -39,14 +35,21 @@ public void tick() {
3935
for (Signal signal : getSignals()) {
4036
EncodedData<?> encodedData = signal.getEncodedData();
4137
if (encodedData != null) {
42-
text.add(encodedData.stringValue());
38+
EncodedData.Type type = encodedData.type();
39+
if (type != EncodedData.Type.STRING && type != EncodedData.Type.COMPOUND_TAG) {
40+
text.add(encodedData.stringValue());
41+
} else {
42+
text.add('"' + encodedData.stringValue() + '"');
43+
}
4344
stateData = true;
4445
}
4546
}
4647
if (!text.isEmpty()) {
4748
StringBuilder whole = new StringBuilder();
48-
for (String string : text) {
49-
whole.append(" ").append(string);
49+
Iterator<String> iterator = text.iterator();
50+
while (iterator.hasNext()) {
51+
String next = iterator.next();
52+
whole.append(next).append(iterator.hasNext() ? ", " : "");
5053
}
5154
String[] strings = (WordUtils.wrap(whole.toString(), 14, "\n", true)).split("\n");
5255
text = new ArrayList<>(Arrays.asList(strings));
@@ -80,7 +83,6 @@ public void tick() {
8083
amplitudeSorted.remove(amplitudeSorted.getLast());
8184
frequencySorted.remove(frequencySorted.getLast());
8285
}
83-
signals = frequencySorted.toArray(new Signal[12]);
8486
}
8587
}
8688
super.tick();

common/src/main/java/org/modogthedev/superposition/blockentity/ReceiverBlockEntity.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import org.modogthedev.superposition.core.SuperpositionBlockEntities;
99
import org.modogthedev.superposition.system.antenna.AntennaManager;
1010
import org.modogthedev.superposition.system.signal.Signal;
11-
import org.modogthedev.superposition.system.signal.SignalManager;
1211

1312
import java.util.ArrayList;
1413
import java.util.List;
@@ -33,7 +32,6 @@ public List<Signal> getSignals() {
3332
if (antenna == null) {
3433
return new ArrayList<>();
3534
}
36-
antenna.signals.clear();
3735
if (level.isClientSide)
3836
return putSignals;
3937
return antenna.signals;

common/src/main/java/org/modogthedev/superposition/blockentity/TransmitterBlockEntity.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import net.minecraft.world.level.block.state.BlockState;
66
import org.modogthedev.superposition.core.SuperpositionBlockEntities;
77
import org.modogthedev.superposition.system.signal.Signal;
8-
import org.modogthedev.superposition.system.signal.SignalManager;
98
import org.modogthedev.superposition.util.SuperpositionMth;
109

1110
import java.util.ArrayList;
@@ -48,6 +47,8 @@ public void tick() {
4847
broadcastSignal.level = level;
4948
}
5049
antenna.sendSignals(signals);
50+
} else {
51+
antenna.sendSignals(List.of());
5152
}
5253
}
5354
}

common/src/main/java/org/modogthedev/superposition/client/renderer/DebugRenderer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public static void renderDebug(LevelRenderer levelRenderer, MultiBufferSource.Bu
5151
drawPosBox((PoseStack) matrixStack, vertexConsumer, signal.getPos().add(0, 1, 0, POS), 0.3f, 0.5f, 0.5f, 0.9f);
5252
}
5353
for (Antenna antenna : AntennaManager.getAntennaList(level)) {
54-
drawPosBox((PoseStack) matrixStack, vertexConsumer, antenna.getPosition(), 0.5f, 0.5f, 0.9f, 0.5f);
54+
drawPosBox((PoseStack) matrixStack, vertexConsumer, new Vec3(antenna.getPosition().x,antenna.getPosition().y,antenna.getPosition().z), 0.5f, 0.5f, 0.9f, 0.5f);
5555
for (AntennaElement antennaElement : antenna.getAntennaElements()) {
5656
drawPosBox((PoseStack) matrixStack, vertexConsumer, antennaElement.getPosition(), 0.25f, 0.5f, 0.9f, 0.5f);
5757
}

common/src/main/java/org/modogthedev/superposition/client/renderer/block/MonitorBlockEntityRenderer.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.modogthedev.superposition.client.renderer.block;
1+
package org.modogthedev.superposition.client.renderer.block;
22

33
import com.mojang.blaze3d.vertex.PoseStack;
44
import com.mojang.blaze3d.vertex.VertexConsumer;
@@ -89,16 +89,21 @@ public void render(MonitorBlockEntity be, float pPartialTick, PoseStack ms, Mult
8989

9090
Float[] signals = new Float[size];
9191
Arrays.fill(signals, 1f);
92-
for (Signal signal : be.signals) {
92+
for (Signal signal : be.getSignals()) {
9393
if (signal != null) {
9494
float frequency = Mth.map(signal.getFrequency() / 100000, 0, 158, 0, 256);
9595
int slot = Mth.clamp(Math.round(frequency), 2, 254);
96-
float normalValue = Mth.map(signal.getAmplitude(), 0, 40, 1, 2);
97-
signals[slot - 2] = normalValue / 1.6f;
98-
signals[slot - 1] = normalValue / 1.2f;
99-
signals[slot] = normalValue;
100-
signals[slot + 1] = normalValue / 1.2f;
101-
signals[slot + 2] = normalValue / 1.6f;
96+
float normalValue = Mth.map(signal.getAmplitude(), 0, 40, 0, 1);
97+
signals[slot - 2] += normalValue / 8f + signals[slot];
98+
signals[slot - 1] += normalValue / 4f + signals[slot-1];
99+
signals[slot] += normalValue + signals[slot];
100+
signals[slot + 1] += normalValue / 4f + signals[slot + 1];
101+
signals[slot + 2] += normalValue / 8f + signals[slot + 2];
102+
signals[slot - 2] /= 2;
103+
signals[slot - 1] /= 2;
104+
signals[slot] /= 2;
105+
signals[slot + 1] /= 2;
106+
signals[slot + 2] /= 2;
102107
}
103108
}
104109
for (int i = 0; i < size; i++) {
@@ -111,6 +116,8 @@ public void render(MonitorBlockEntity be, float pPartialTick, PoseStack ms, Mult
111116
}
112117
y += (float) (Math.random() / 64) * transformDown;
113118
yinverse = -y + .42f + (.05f * transformDown);
119+
y = Math.min(y,0.55f);
120+
yinverse = Math.max(yinverse, -0.55f);
114121

115122
buffer
116123
.addVertex(m, x + part, 0.5001f, yinverse)

common/src/main/java/org/modogthedev/superposition/system/antenna/Antenna.java

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,26 @@
22

33
import net.minecraft.core.BlockPos;
44
import net.minecraft.network.chat.Component;
5+
import net.minecraft.util.Mth;
56
import net.minecraft.world.level.Level;
67
import net.minecraft.world.phys.Vec3;
7-
import org.modogthedev.superposition.Superposition;
8+
import org.joml.Vector3d;
89
import org.modogthedev.superposition.system.signal.Signal;
910
import org.modogthedev.superposition.system.signal.SignalManager;
11+
import org.modogthedev.superposition.util.LongRaycast;
1012

11-
import java.util.*;
13+
import java.util.ArrayList;
14+
import java.util.HashMap;
15+
import java.util.List;
16+
import java.util.UUID;
1217

1318
public class Antenna {
1419
public Level level;
1520
public List<Signal> signals = new ArrayList<>();
16-
public HashMap<UUID,Signal> signalsSentLastTick = new HashMap<>();
21+
public HashMap<UUID, Signal> signalsSentLastTick = new HashMap<>();
1722
public BlockPos antennaActor;
1823
public boolean isReceiving;
19-
private Vec3 position = new Vec3(0,0,0);
24+
private Vector3d position = new Vector3d();
2025
protected List<AntennaElement> antennaElements = new ArrayList<>();
2126
//TODO: radiation pattern
2227

@@ -28,26 +33,28 @@ public Antenna(BlockPos antennaActor, Level level) {
2833
/**
2934
* Sends a new list of signals.
3035
* This method terminates any signals being broadcast if the list does not include them.
36+
*
3137
* @param signals The signals to be broadcast
3238
*/
3339
public void sendSignals(List<Signal> signals) {
40+
HashMap<UUID, Signal> oldSignalsSentLastTick = new HashMap<>(signalsSentLastTick);
41+
signalsSentLastTick.clear();
3442
for (Signal signal : signals) {
3543
signal.level = this.level;
36-
HashMap<UUID, Signal> oldSignalsSentLastTick = new HashMap<>(signalsSentLastTick);
37-
signalsSentLastTick.clear();
3844
Signal oldSignal = oldSignalsSentLastTick.get(signal.getUuid());
3945
if (signal.equals(oldSignal)) {
4046
SignalManager.markSignalUpdate(signal);
41-
signalsSentLastTick.put(signal.getUuid(), signal);
47+
signalsSentLastTick.put(signal.getUuid(), new Signal(signal));
4248
} else {
4349
sendSignal(signal);
44-
signalsSentLastTick.put(signal.getUuid(), signal);
50+
signalsSentLastTick.put(signal.getUuid(), new Signal(signal));
4551
}
4652
}
4753
}
4854

4955
/**
5056
* Broadcasts the given signal through the antenna
57+
*
5158
* @param signal The signal to send
5259
* @return Each signal sent, after the original has been sent through each AntennaElement
5360
*/
@@ -62,19 +69,37 @@ public List<Signal> sendSignal(Signal signal) {
6269
return returnSignals;
6370
}
6471

65-
public void receiveSignal(Signal signal) {
66-
signals.add(signal);
72+
public void receiveSignal(final Signal signal) {
73+
for (AntennaElement antennaElement : antennaElements) {
74+
double amplitude = signal.getAmplitude();
75+
float dist = (float) antennaElement.getPosition().distance(signal.getPos());
76+
77+
if (dist < signal.getMaxDist() && dist > signal.getMinDist()) {
78+
79+
amplitude *= (1.0F / Math.max(1, dist / (1000000000 / signal.getFrequency())));
80+
Vec3 to = antennaActor.getCenter().add(antennaElement.getPosition().x, antennaElement.getPosition().y, antennaElement.getPosition().z);
81+
float penetration = LongRaycast.getPenetration(signal.level, signal.getPos(), new Vector3d(to.x, to.y, to.z));
82+
amplitude *= (Mth.map(penetration, 0, signal.getFrequency() / 200000, 1, 0));
83+
amplitude *= antennaElement.getAmplitudeScalar(signal);
84+
if (amplitude > 0.5f) {
85+
Signal receiving = new Signal(signal);
86+
receiving.addTraversalDistance((float) signal.getPos().distance(new Vector3d(to.x, to.y, to.z)));
87+
receiving.setAmplitude((float) amplitude);
88+
signals.add(receiving);
89+
}
90+
}
91+
}
6792
}
6893

6994
public boolean isPos(BlockPos pos) {
7095
return antennaActor.equals(pos);
7196
}
7297

73-
protected void setPosition(Vec3 position) {
98+
protected void setPosition(Vector3d position) {
7499
this.position = position;
75100
}
76101

77-
public Vec3 getPosition() {
102+
public Vector3d getPosition() {
78103
return position;
79104
}
80105

common/src/main/java/org/modogthedev/superposition/system/antenna/AntennaElement.java

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import org.modogthedev.superposition.system.signal.SignalManager;
66
import org.modogthedev.superposition.util.SuperpositionMth;
77

8-
public class AntennaElement {
8+
public abstract class AntennaElement {
99
protected Vector3d position;
1010
protected Vector3d antennaPositionOffset = new Vector3d();
1111
public AntennaElement(Vector3d position) {
@@ -17,15 +17,20 @@ public String getClassificationName() {
1717
}
1818

1919
public Vector3d getPosition() {
20-
return position;
20+
return new Vector3d(position).add(antennaPositionOffset);
2121
}
2222

23+
/**
24+
* This collects the changes in the signal and broadcasts it.
25+
* @param signal
26+
* @return
27+
*/
2328
public Signal sendSignal(Signal signal) {
2429
Signal returnSignal = new Signal(signal);
2530
returnSignal.changeUUID();
2631
returnSignal.getPos().set(position).add(antennaPositionOffset);
2732
returnSignal.setEmitting(true);
28-
double multiplier = SuperpositionMth.calculateAntennaAmplitude(SuperpositionMth.hzToAntennaSize(getAntennaFrequency()),SuperpositionMth.hzToAntennaSize(returnSignal.getFrequency()));
33+
double multiplier = getAmplitudeScalar(signal);
2934
returnSignal.mulAmplitude((float) multiplier);
3035

3136
if (returnSignal.getAmplitude() > 0.5f) {
@@ -34,14 +39,29 @@ public Signal sendSignal(Signal signal) {
3439
return returnSignal;
3540
}
3641

42+
/**
43+
* Returns a scalar for the amplitude mismatch of this antenna.
44+
*/
45+
public double getAmplitudeScalar(Signal signal) {
46+
return SuperpositionMth.getAmplitudeScalar(getAntennaFrequency(),signal.getFrequency(),getQValue());
47+
}
48+
3749
public void updatePosition(double x, double y, double z) {
3850
position.set(x,y,z);
3951
}
4052

4153
public void updateOffsetPosition(double x, double y, double z) {
4254
antennaPositionOffset.set(x,y,z);
4355
}
44-
public float getAntennaFrequency() {
45-
return 0;
46-
}
56+
57+
/**
58+
* The current frequency of the antenna part.
59+
*/
60+
public abstract float getAntennaFrequency();
61+
62+
/**
63+
* The Q value of the antenna
64+
* @return
65+
*/
66+
public abstract double getQValue();
4767
}

common/src/main/java/org/modogthedev/superposition/system/antenna/AntennaManager.java

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,14 @@
22

33
import net.minecraft.core.BlockPos;
44
import net.minecraft.server.level.ServerLevel;
5-
import net.minecraft.util.Mth;
65
import net.minecraft.world.level.Level;
76
import net.minecraft.world.level.LevelReader;
87
import net.minecraft.world.level.block.entity.BlockEntity;
9-
import net.minecraft.world.phys.Vec3;
10-
import org.joml.Vector3d;
118
import org.modogthedev.superposition.blockentity.AntennaActorBlockEntity;
129
import org.modogthedev.superposition.core.SuperpositionBlocks;
1310
import org.modogthedev.superposition.system.antenna.type.PhysicalAntenna;
14-
import org.modogthedev.superposition.system.signal.Signal;
1511
import org.modogthedev.superposition.system.signal.SignalManager;
1612
import org.modogthedev.superposition.util.BlockHelper;
17-
import org.modogthedev.superposition.util.LongRaycast;
18-
import org.modogthedev.superposition.util.SuperpositionMth;
1913

2014
import java.util.ArrayList;
2115
import java.util.HashMap;
@@ -29,6 +23,7 @@ public static void tickAntennas(ServerLevel level) {
2923
List<Antenna> levelAntennas = antennas.get(level);
3024
if (levelAntennas != null) {
3125
for (Antenna antenna : levelAntennas) {
26+
antenna.signals.clear();
3227
SignalManager.postSignalsToAntenna(antenna);
3328
}
3429
}
@@ -55,25 +50,6 @@ public static void clearSignals(Level level) {
5550
}
5651
}
5752

58-
public static void submitSignalToAntenna(Signal signal, Antenna antenna) {
59-
BlockPos pos = SuperpositionMth.blockPosFromVec3(signal.getPos());
60-
61-
float dist = (float) antenna.getPosition().distanceTo(Vec3.atLowerCornerOf(pos));
62-
63-
if (dist < signal.getMaxDist() && dist > signal.getMinDist()) {
64-
Signal signal1 = new Signal(signal);
65-
66-
signal1.mulAmplitude(1.0F / Math.max(1, dist / (1000000000 / signal.getFrequency())));
67-
Vec3 to = antenna.antennaActor.getCenter().add(antenna.getPosition().x, antenna.getPosition().y, antenna.getPosition().z);
68-
float penetration = LongRaycast.getPenetration(signal.level, signal.getPos(), new Vector3d(to.x, to.y, to.z));
69-
signal1.addTraversalDistance((float) signal.getPos().distance(new Vector3d(to.x, to.y, to.z)));
70-
// TODO: Do all of this inside the antenna.
71-
signal1.mulAmplitude(Mth.map(penetration, 0, signal.getFrequency() / 200000, 1, 0));
72-
73-
antenna.receiveSignal(signal1);
74-
}
75-
}
76-
7753
public static int get(BlockPos pos, Level level) {
7854
ifAbsent(level);
7955
int i = 0;

common/src/main/java/org/modogthedev/superposition/system/antenna/classification/DipoleElement.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
package org.modogthedev.superposition.system.antenna.classification;
22

3-
import net.minecraft.core.BlockPos;
4-
import net.minecraft.world.phys.Vec3;
53
import org.joml.Vector3d;
64
import org.modogthedev.superposition.system.antenna.AntennaElement;
7-
import org.modogthedev.superposition.system.antenna.type.PhysicalAntenna;
85
import org.modogthedev.superposition.util.SuperpositionMth;
96

10-
import java.util.List;
11-
127
public class DipoleElement extends AntennaElement {
138

149
final float size;
@@ -27,4 +22,9 @@ public String getClassificationName() {
2722
public float getAntennaFrequency() {
2823
return SuperpositionMth.antennaSizeToHz(size);
2924
}
25+
26+
@Override
27+
public double getQValue() {
28+
return 11;
29+
}
3030
}

0 commit comments

Comments
 (0)