From fb80bf33eff9669dbd3caadfa8e5bf1fc632eba1 Mon Sep 17 00:00:00 2001 From: Mrbysco Date: Tue, 12 Mar 2024 02:32:04 +0100 Subject: [PATCH] Wait... the particle beam renders now? --- .../mod/particle/ParticleBeam.java | 50 +++++- .../actuallyadditions/mod/util/AssetUtil.java | 160 +++++++----------- 2 files changed, 103 insertions(+), 107 deletions(-) diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/particle/ParticleBeam.java b/src/main/java/de/ellpeck/actuallyadditions/mod/particle/ParticleBeam.java index 765cde6bf..d821ef28d 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/particle/ParticleBeam.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/particle/ParticleBeam.java @@ -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; } @@ -68,8 +98,20 @@ public class ParticleBeam extends Particle { } public static ParticleOptions createData(double endX, double endY, double endZ, float[] color, float alpha, - int maxAge, double rotationTime, float size) { + 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}; + } } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/util/AssetUtil.java b/src/main/java/de/ellpeck/actuallyadditions/mod/util/AssetUtil.java index 0381b5dd4..361a074d3 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/util/AssetUtil.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/util/AssetUtil.java @@ -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)