Skip to content

Commit e968a95

Browse files
authored
Merge pull request #39 from OmbreMoon/beam_raycast
Beam Emitter Raycast (Thanks @OmbreMoon)
2 parents 7de0247 + acabf95 commit e968a95

File tree

4 files changed

+30
-6
lines changed

4 files changed

+30
-6
lines changed

src/main/java/com/lowdragmc/photon/client/gameobject/emitter/beam/BeamConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.joml.Vector3f;
3030

3131
import javax.annotation.Nonnull;
32+
import java.util.List;
3233
import java.util.Optional;
3334

3435
/**
@@ -67,6 +68,10 @@ public class BeamConfig implements IConfigurable, IPersistedSerializable {
6768
protected NumberFunction emitRate = NumberFunction.constant(0);
6869
@Setter
6970
@Getter
71+
@Configurable(name = "BeamConfig.raycast", tips = "photon.emitter.beam.config.raycast")
72+
protected boolean raycast = false;
73+
@Setter
74+
@Getter
7075
@Configurable(name = "BeamConfig.color", tips = "photon.emitter.beam.config.color")
7176
@NumberFunctionConfig(types = {Color.class, RandomColor.class, Gradient.class, RandomGradient.class}, defaultValue = -1)
7277
protected NumberFunction color = new Color();

src/main/java/com/lowdragmc/photon/client/gameobject/particle/BeamParticle.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,22 @@
22

33
import com.lowdragmc.lowdraglib2.utils.ColorUtils;
44
import com.lowdragmc.photon.client.gameobject.emitter.IParticleEmitter;
5-
import com.lowdragmc.photon.client.gameobject.emitter.renderpipeline.PhotonFXRenderPass;
65
import com.lowdragmc.photon.client.gameobject.emitter.beam.BeamConfig;
6+
import com.lowdragmc.photon.client.gameobject.emitter.renderpipeline.PhotonFXRenderPass;
77
import com.mojang.blaze3d.vertex.VertexConsumer;
88
import lombok.Getter;
99
import lombok.Setter;
10-
import net.neoforged.api.distmarker.Dist;
11-
import net.neoforged.api.distmarker.OnlyIn;
1210
import net.minecraft.client.Camera;
1311
import net.minecraft.core.BlockPos;
1412
import net.minecraft.util.Mth;
1513
import net.minecraft.util.RandomSource;
14+
import net.minecraft.world.level.ClipContext;
15+
import net.minecraft.world.level.Level;
16+
import net.minecraft.world.phys.HitResult;
17+
import net.minecraft.world.phys.Vec3;
18+
import net.minecraft.world.phys.shapes.CollisionContext;
19+
import net.neoforged.api.distmarker.Dist;
20+
import net.neoforged.api.distmarker.OnlyIn;
1621
import org.joml.Vector3f;
1722
import org.joml.Vector4f;
1823

@@ -146,11 +151,25 @@ protected float getRealEmit(float pPartialTicks) {
146151
return config.getEmitRate().get(getT(pPartialTicks), () -> getMemRandom("emit")).floatValue();
147152
}
148153

154+
protected Vector3f getRealEnd(@Nonnull Camera camera, Vector3f from) {
155+
var end = new Vector3f(from).add(emitter.transform().localToWorldMatrix().transformDirection(config.getEnd(), new Vector3f()));
156+
if (config.isRaycast()) {
157+
Level level = camera.getEntity().level();
158+
HitResult result = level.clip(
159+
new ClipContext(new Vec3(from.x, from.y, from.z), new Vec3(end.x, end.y, end.z), ClipContext.Block.VISUAL, ClipContext.Fluid.NONE, CollisionContext.empty()));
160+
if (result.getType() != HitResult.Type.MISS) {
161+
return result.getLocation().toVector3f();
162+
}
163+
}
164+
165+
return end;
166+
}
167+
149168
public void render(@Nonnull VertexConsumer pBuffer, @Nonnull Camera camera, float partialTicks) {
150169
if (delay <= 0) {
151170
var cameraPos = camera.getPosition().toVector3f();
152171
var from = getWorldPos();
153-
var end = new Vector3f(from).add(emitter.transform().localToWorldMatrix().transformDirection(config.getEnd(), new Vector3f()));
172+
var end = getRealEnd(camera, from);
154173

155174
var offset = - getRealEmit(partialTicks);
156175
var uvs = getRealUVs(partialTicks);

src/main/java/com/lowdragmc/photon/gui/editor/view/scene/FXObjectAnimationView.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@
88
import com.lowdragmc.lowdraglib2.gui.ui.elements.Button;
99
import com.lowdragmc.lowdraglib2.gui.ui.event.UIEvents;
1010
import com.lowdragmc.lowdraglib2.math.Transform;
11-
import com.lowdragmc.photon.client.gameobject.emitter.beam.BeamConfig;
1211
import lombok.Getter;
1312
import lombok.Setter;
1413
import net.minecraft.network.chat.Component;
1514
import org.appliedenergistics.yoga.YogaEdge;
1615
import org.appliedenergistics.yoga.YogaGutter;
17-
import org.joml.Quaternionf;
1816
import org.joml.Vector3f;
1917

2018
import java.util.ArrayList;

src/main/resources/assets/photon/lang/en_us.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@
175175
"photon.emitter.beam.config.end": "Beam end offset.",
176176
"photon.emitter.beam.config.width": "Controls the width during its lifetime.",
177177
"photon.emitter.beam.config.emitRate": "Controls the emit rate during its lifetime.",
178+
"photon.emitter.beam.config.raycast": "If true, the beam's length will be reduced upon hitting an object",
178179
"photon.emitter.beam.config.color": "Controls the color during its lifetime.",
179180
"photon.export_fx": "Export FX",
180181
"photon.gui.editor.fx_info.restart": "Restart",
@@ -345,6 +346,7 @@
345346
"TrailConfig.colorOverTrail": "Color Over Trail",
346347
"BeamConfig.color": "Color",
347348
"BeamConfig.emitRate": "Emit Rate",
349+
"BeamConfig.raycast": "Raycast",
348350
"BeamConfig.width": "Width",
349351
"BeamConfig.end": "End",
350352
"FXObject.transform": "Transform",

0 commit comments

Comments
 (0)