mirror of
https://github.com/Ellpeck/ActuallyAdditions.git
synced 2024-11-26 00:38:35 +01:00
Wait... the particle beam renders now?
This commit is contained in:
parent
2e37a04a2a
commit
fb80bf33ef
2 changed files with 103 additions and 107 deletions
|
@ -10,6 +10,10 @@
|
|||
|
||||
package de.ellpeck.actuallyadditions.mod.particle;
|
||||
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.vertex.BufferBuilder;
|
||||
import com.mojang.blaze3d.vertex.Tesselator;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
import de.ellpeck.actuallyadditions.mod.util.AssetUtil;
|
||||
import net.minecraft.client.Camera;
|
||||
|
@ -18,9 +22,35 @@ import net.minecraft.client.particle.Particle;
|
|||
import net.minecraft.client.particle.ParticleProvider;
|
||||
import net.minecraft.client.particle.ParticleRenderType;
|
||||
import net.minecraft.client.particle.SpriteSet;
|
||||
import net.minecraft.client.renderer.texture.TextureManager;
|
||||
import net.minecraft.core.particles.ParticleOptions;
|
||||
import net.minecraft.util.FastColor;
|
||||
|
||||
public class ParticleBeam extends Particle {
|
||||
public static final ParticleRenderType LASER_RENDER = new ParticleRenderType() {
|
||||
|
||||
@Override
|
||||
public void begin(BufferBuilder buffer, TextureManager textureManager) {
|
||||
RenderSystem.disableCull();
|
||||
RenderSystem.enableBlend();
|
||||
RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.SRC_ALPHA);
|
||||
RenderSystem.enableDepthTest();
|
||||
RenderSystem.depthFunc(515);
|
||||
RenderSystem.depthMask(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void end(Tesselator tesselator) {
|
||||
RenderSystem.enableCull();
|
||||
RenderSystem.disableBlend();
|
||||
RenderSystem.defaultBlendFunc();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "actuallyadditions:laser_particle";
|
||||
}
|
||||
};
|
||||
|
||||
private final double endX;
|
||||
private final double endY;
|
||||
|
@ -44,15 +74,15 @@ public class ParticleBeam extends Particle {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void render(VertexConsumer buffer, Camera renderInfo, float partialTicks) {
|
||||
public void render(VertexConsumer buffer, Camera camera, float partialTicks) {
|
||||
float ageRatio = (float) this.age / (float) this.lifetime;
|
||||
float currAlpha = this.alpha - ageRatio * this.alpha;
|
||||
AssetUtil.renderLaser(this.x + 0.5, this.y + 0.5, this.z + 0.5, this.endX + 0.5, this.endY + 0.5, this.endZ + 0.5, this.rotationTime, currAlpha, this.size, this.color);
|
||||
AssetUtil.renderLaserParticle(buffer, camera, this.x + 0.5, this.y + 0.5, this.z + 0.5, this.endX + 0.5, this.endY + 0.5, this.endZ + 0.5, (float) this.rotationTime, currAlpha, this.size, this.color);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ParticleRenderType getRenderType() {
|
||||
return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT;
|
||||
return LASER_RENDER;
|
||||
}
|
||||
|
||||
|
||||
|
@ -71,5 +101,17 @@ public class ParticleBeam extends Particle {
|
|||
int maxAge, double rotationTime, float size) {
|
||||
return new BeamParticleData(endX, endY, endZ, color, alpha, maxAge, rotationTime, size);
|
||||
}
|
||||
|
||||
public static ParticleOptions createData(double endX, double endY, double endZ, int color, float alpha,
|
||||
int maxAge, double rotationTime, float size) {
|
||||
return new BeamParticleData(endX, endY, endZ, colorFromInt(color), alpha, maxAge, rotationTime, size);
|
||||
}
|
||||
|
||||
private static float[] colorFromInt(int color) {
|
||||
float red = (float)(FastColor.ARGB32.red(color) / 255.0);
|
||||
float green = (float)(FastColor.ARGB32.green(color) / 255.0);
|
||||
float blue = (float)(FastColor.ARGB32.blue(color) / 255.0);
|
||||
return new float[] {red, green, blue};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,22 +10,25 @@
|
|||
|
||||
package de.ellpeck.actuallyadditions.mod.util;
|
||||
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import com.mojang.blaze3d.vertex.BufferBuilder;
|
||||
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.Tesselator;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
import com.mojang.blaze3d.vertex.VertexFormat;
|
||||
import com.mojang.math.Axis;
|
||||
import de.ellpeck.actuallyadditions.mod.ActuallyAdditions;
|
||||
import de.ellpeck.actuallyadditions.mod.blocks.render.RenderTypes;
|
||||
import de.ellpeck.actuallyadditions.mod.network.PacketHandler;
|
||||
import de.ellpeck.actuallyadditions.mod.network.PacketServerToClient;
|
||||
import de.ellpeck.actuallyadditions.mod.particle.ParticleBeam;
|
||||
import de.ellpeck.actuallyadditions.mod.tile.TileEntityAtomicReconstructor;
|
||||
import de.ellpeck.actuallyadditions.mod.tile.TileEntityBase;
|
||||
import net.minecraft.client.Camera;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.Font;
|
||||
import net.minecraft.client.gui.GuiGraphics;
|
||||
import net.minecraft.client.renderer.GameRenderer;
|
||||
import net.minecraft.client.renderer.LightTexture;
|
||||
import net.minecraft.client.renderer.MultiBufferSource;
|
||||
import net.minecraft.client.renderer.entity.ItemRenderer;
|
||||
|
@ -242,14 +245,13 @@ public final class AssetUtil {
|
|||
public static void spawnLaserWithTimeClient(double startX, double startY, double startZ, double endX, double endY, double endZ, int color, int maxAge, double rotationTime, float size, float alpha) {
|
||||
Minecraft mc = Minecraft.getInstance();
|
||||
BlockEntity tile = mc.level.getBlockEntity(BlockPos.containing(startX, startY, startZ));
|
||||
if(tile instanceof TileEntityAtomicReconstructor)
|
||||
if (tile instanceof TileEntityAtomicReconstructor) {
|
||||
((TileEntityAtomicReconstructor) tile).resetBeam(maxAge, color);
|
||||
|
||||
|
||||
/* if (mc.player.distanceToSqr(startX, startY, startZ) <= 64 || mc.player.distanceToSqr(endX, endY, endZ) <= 64) {
|
||||
Particle fx = new ParticleBeam(mc.level, startX, startY, startZ, endX, endY, endZ, color, maxAge, rotationTime, size, alpha);
|
||||
mc.level.addParticle((IParticleData) fx, startX, startY, startZ, 0, 0, 0);
|
||||
}*/
|
||||
} else {
|
||||
if (mc.player != null && mc.player.distanceToSqr(startX, startY, startZ) <= 64 || mc.player.distanceToSqr(endX, endY, endZ) <= 64) {
|
||||
mc.level.addParticle(ParticleBeam.Factory.createData(endX, endY, endZ, color, alpha, maxAge, rotationTime, size), startX, startY, startZ, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* @OnlyIn(Dist.CLIENT)
|
||||
public static void renderLaser(MatrixStack matrixStack, IRenderTypeBuffer buffer, float x, float y, float z, float tx, float ty, float tz, float rotation, int color, float beamWidth) {
|
||||
|
@ -332,11 +334,10 @@ public final class AssetUtil {
|
|||
//Thanks to feldim2425 for this.
|
||||
//I can't do rendering code. Ever.
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
public static void renderLaser(double firstX, double firstY, double firstZ, double secondX, double secondY, double secondZ, double rotationTime, float alpha, double beamWidth, float[] color) {
|
||||
Tesselator tessy = Tesselator.getInstance();
|
||||
BufferBuilder render = tessy.getBuilder();
|
||||
public static void renderLaserParticle(VertexConsumer builder, Camera camera, double firstX, double firstY, double firstZ, double secondX, double secondY, double secondZ, float rotationTime, float a, float beamWidth, float[] color) {
|
||||
Level world = Minecraft.getInstance().level;
|
||||
|
||||
Vec3 cam = camera.getPosition();
|
||||
float r = color[0];
|
||||
float g = color[1];
|
||||
float b = color[2];
|
||||
|
@ -345,107 +346,60 @@ public final class AssetUtil {
|
|||
Vec3 vec2 = new Vec3(secondX, secondY, secondZ);
|
||||
Vec3 combinedVec = vec2.subtract(vec1);
|
||||
|
||||
double rot = rotationTime > 0
|
||||
? 360D * (world.getGameTime() % rotationTime / rotationTime)
|
||||
: 0;
|
||||
double pitch = Math.atan2(combinedVec.y, Math.sqrt(combinedVec.x * combinedVec.x + combinedVec.z * combinedVec.z));
|
||||
double yaw = Math.atan2(-combinedVec.z, combinedVec.x);
|
||||
int lightmap = LightTexture.pack(MAX_LIGHT_X, MAX_LIGHT_Y);
|
||||
|
||||
double length = combinedVec.length();
|
||||
double roll = rotationTime > 0 ? 360D * (world.getGameTime() % rotationTime / rotationTime) : 0;
|
||||
double pitch = Math.toDegrees(Math.atan2(combinedVec.y, Math.sqrt(combinedVec.x * combinedVec.x + combinedVec.z * combinedVec.z)));
|
||||
double yaw = Math.toDegrees(Math.atan2(-combinedVec.z, combinedVec.x)) - 90;
|
||||
|
||||
// GlStateManager._pushMatrix();
|
||||
float length = (float) combinedVec.length();
|
||||
|
||||
/* GlStateManager._disableLighting();
|
||||
GlStateManager._enableBlend();
|
||||
GlStateManager._blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE);
|
||||
int func = GL11.glGetInteger(GL11.GL_ALPHA_TEST_FUNC);
|
||||
float ref = GL11.glGetFloat(GL11.GL_ALPHA_TEST_REF);
|
||||
GlStateManager._alphaFunc(GL11.GL_ALWAYS, 0);
|
||||
GlStateManager.translate(firstX - TileEntityRendererDispatcher.staticPlayerX, firstY - TileEntityRendererDispatcher.staticPlayerY, firstZ - TileEntityRendererDispatcher.staticPlayerZ);
|
||||
GlStateManager.rotate((float) (180 * yaw / Math.PI), 0, 1, 0);
|
||||
GlStateManager.rotate((float) (180 * pitch / Math.PI), 0, 0, 1);
|
||||
GlStateManager.rotate((float) rot, 1, 0, 0);*/
|
||||
PoseStack matrixStack = new PoseStack();
|
||||
matrixStack.pushPose();
|
||||
|
||||
/*if(r != r2 || g != g2 || b != b2){
|
||||
render.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR);
|
||||
Minecraft.getInstance().renderEngine.bindTexture(ClientUtil.LIGHT_BEAM_GRADIENT);
|
||||
matrixStack.translate(firstX - cam.x, firstY - cam.y, firstZ - cam.z);
|
||||
|
||||
render.pos(length, -beamWidth, beamWidth).tex(0, 0).color(r, g, b, alpha).endVertex();
|
||||
render.pos(length, beamWidth, beamWidth).tex(0, 1).color(r, g, b, alpha).endVertex();
|
||||
render.pos(0, beamWidth, beamWidth).tex(1, 1).color(r, g, b, alpha).endVertex();
|
||||
render.pos(0, -beamWidth, beamWidth).tex(1, 0).color(r, g, b, alpha).endVertex();
|
||||
matrixStack.mulPose(Axis.YP.rotationDegrees((float)yaw));
|
||||
matrixStack.mulPose(Axis.XP.rotationDegrees((float)pitch));
|
||||
matrixStack.mulPose(Axis.ZP.rotationDegrees((float)roll));
|
||||
|
||||
render.pos(length, -beamWidth, beamWidth).tex(1, 0).color(r2, g2, b2, alpha).endVertex();
|
||||
render.pos(length, beamWidth, beamWidth).tex(1, 1).color(r2, g2, b2, alpha).endVertex();
|
||||
render.pos(0, beamWidth, beamWidth).tex(0, 1).color(r2, g2, b2, alpha).endVertex();
|
||||
render.pos(0, -beamWidth, beamWidth).tex(0, 0).color(r2, g2, b2, alpha).endVertex();
|
||||
Matrix4f matrix = matrixStack.last().pose();
|
||||
|
||||
render.pos(length, beamWidth, -beamWidth).tex(0, 0).color(r, g, b, alpha).endVertex();
|
||||
render.pos(length, -beamWidth, -beamWidth).tex(0, 1).color(r, g, b, alpha).endVertex();
|
||||
render.pos(0, -beamWidth, -beamWidth).tex(1, 1).color(r, g, b, alpha).endVertex();
|
||||
render.pos(0, beamWidth, -beamWidth).tex(1, 0).color(r, g, b, alpha).endVertex();
|
||||
RenderSystem.setShader(GameRenderer::getPositionColorLightmapShader);
|
||||
Tesselator.getInstance().getBuilder().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_LIGHTMAP);
|
||||
|
||||
render.pos(length, beamWidth, -beamWidth).tex(1, 0).color(r2, g2, b2, alpha).endVertex();
|
||||
render.pos(length, -beamWidth, -beamWidth).tex(1, 1).color(r2, g2, b2, alpha).endVertex();
|
||||
render.pos(0, -beamWidth, -beamWidth).tex(0, 1).color(r2, g2, b2, alpha).endVertex();
|
||||
render.pos(0, beamWidth, -beamWidth).tex(0, 0).color(r2, g2, b2, alpha).endVertex();
|
||||
TextureAtlasSprite sprite = Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS).apply(FORGE_WHITE);
|
||||
float minU = sprite.getU0();
|
||||
float maxU = sprite.getU1();
|
||||
float minV = sprite.getV0();
|
||||
float maxV = sprite.getV1();
|
||||
|
||||
render.pos(length, beamWidth, beamWidth).tex(0, 0).color(r, g, b, alpha).endVertex();
|
||||
render.pos(length, beamWidth, -beamWidth).tex(0, 1).color(r, g, b, alpha).endVertex();
|
||||
render.pos(0, beamWidth, -beamWidth).tex(1, 1).color(r, g, b, alpha).endVertex();
|
||||
render.pos(0, beamWidth, beamWidth).tex(1, 0).color(r, g, b, alpha).endVertex();
|
||||
|
||||
render.pos(length, beamWidth, beamWidth).tex(1, 0).color(r2, g2, b2, alpha).endVertex();
|
||||
render.pos(length, beamWidth, -beamWidth).tex(1, 1).color(r2, g2, b2, alpha).endVertex();
|
||||
render.pos(0, beamWidth, -beamWidth).tex(0, 1).color(r2, g2, b2, alpha).endVertex();
|
||||
render.pos(0, beamWidth, beamWidth).tex(0, 0).color(r2, g2, b2, alpha).endVertex();
|
||||
|
||||
render.pos(length, -beamWidth, -beamWidth).tex(0, 0).color(r, g, b, alpha).endVertex();
|
||||
render.pos(length, -beamWidth, beamWidth).tex(0, 1).color(r, g, b, alpha).endVertex();
|
||||
render.pos(0, -beamWidth, beamWidth).tex(1, 1).color(r, g, b, alpha).endVertex();
|
||||
render.pos(0, -beamWidth, -beamWidth).tex(1, 0).color(r, g, b, alpha).endVertex();
|
||||
|
||||
render.pos(length, -beamWidth, -beamWidth).tex(1, 0).color(r2, g2, b2, alpha).endVertex();
|
||||
render.pos(length, -beamWidth, beamWidth).tex(1, 1).color(r2, g2, b2, alpha).endVertex();
|
||||
render.pos(0, -beamWidth, beamWidth).tex(0, 1).color(r2, g2, b2, alpha).endVertex();
|
||||
render.pos(0, -beamWidth, -beamWidth).tex(0, 0).color(r2, g2, b2, alpha).endVertex();
|
||||
tessy.draw();
|
||||
//Draw laser tube faces
|
||||
for (int i = 1; i < 4; i++) {
|
||||
float width = beamWidth * (i / 4.0f);
|
||||
//top
|
||||
builder.vertex(matrix, -width, width, 0.0f).color(r, g, b, a).uv(minU, maxV).uv2(lightmap).endVertex();
|
||||
builder.vertex(matrix, width, width, 0.0f).color(r, g, b, a).uv(maxU, maxV).uv2(lightmap).endVertex();
|
||||
builder.vertex(matrix, width, width, -length).color(r, g, b, a).uv(maxU, minV).uv2(lightmap).endVertex();
|
||||
builder.vertex(matrix, -width, width, -length).color(r, g, b, a).uv(minU, minV).uv2(lightmap).endVertex();
|
||||
//bottom
|
||||
builder.vertex(matrix, -width, -width, 0.0f).color(r, g, b, a).uv(minU, maxV).uv2(lightmap).endVertex();
|
||||
builder.vertex(matrix, -width, -width, -length).color(r, g, b, a).uv(minU, minV).uv2(lightmap).endVertex();
|
||||
builder.vertex(matrix, width, -width, -length).color(r, g, b, a).uv(maxU, minV).uv2(lightmap).endVertex();
|
||||
builder.vertex(matrix, width, -width, 0.0f).color(r, g, b, a).uv(maxU, maxV).uv2(lightmap).endVertex();
|
||||
//left
|
||||
builder.vertex(matrix, -width, width, 0.0f).color(r, g, b, a).uv(maxU, maxV).uv2(lightmap).endVertex();
|
||||
builder.vertex(matrix, -width, -width, 0.0f).color(r, g, b, a).uv(maxU, maxV).uv2(lightmap).endVertex();
|
||||
builder.vertex(matrix, -width, -width, -length).color(r, g, b, a).uv(minU, minV).uv2(lightmap).endVertex();
|
||||
builder.vertex(matrix, -width, width, -length).color(r, g, b, a).uv(minU, minV).uv2(lightmap).endVertex();
|
||||
//right
|
||||
builder.vertex(matrix, width, width, 0.0f).color(r, g, b, a).uv(maxU, maxV).uv2(lightmap).endVertex();
|
||||
builder.vertex(matrix, width, -width, 0.0f).color(r, g, b, a).uv(maxU, maxV).uv2(lightmap).endVertex();
|
||||
builder.vertex(matrix, width, -width, -length).color(r, g, b, a).uv(minU, minV).uv2(lightmap).endVertex();
|
||||
builder.vertex(matrix, width, width, -length).color(r, g, b, a).uv(minU, minV).uv2(lightmap).endVertex();
|
||||
}
|
||||
else{*/
|
||||
//GlStateManager.disableTexture2D();
|
||||
//render.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_LMAP_COLOR);
|
||||
for (double i = 0; i < 4; i++) {
|
||||
double width = beamWidth * (i / 4.0);
|
||||
render.vertex(length, width, width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
render.vertex(0, width, width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
render.vertex(0, -width, width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
render.vertex(length, -width, width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
|
||||
render.vertex(length, -width, -width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
render.vertex(0, -width, -width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
render.vertex(0, width, -width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
render.vertex(length, width, -width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
|
||||
render.vertex(length, width, -width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
render.vertex(0, width, -width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
render.vertex(0, width, width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
render.vertex(length, width, width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
|
||||
render.vertex(length, -width, width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
render.vertex(0, -width, width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
render.vertex(0, -width, -width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
render.vertex(length, -width, -width).uv(0, 0).uv2(MAX_LIGHT_X, MAX_LIGHT_Y).color(r, g, b, alpha).endVertex();
|
||||
}
|
||||
tessy.end();
|
||||
|
||||
//GlStateManager.enableTexture2D();
|
||||
//}
|
||||
|
||||
//GlStateManager._alphaFunc(func, ref);
|
||||
//GlStateManager._blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA);
|
||||
GlStateManager._disableBlend();
|
||||
// GlStateManager._enableLighting();
|
||||
// GlStateManager._popMatrix();
|
||||
matrixStack.popPose();
|
||||
Tesselator.getInstance().end();
|
||||
}
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
|
|
Loading…
Reference in a new issue