From 9337a6e6aa78853f3813b5de3358647ee57ed392 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Tue, 8 Nov 2016 08:53:30 +0100 Subject: [PATCH] Added proper laser rendering instead of the particles --- .../mod/blocks/render/RenderLaserRelay.java | 66 ++++++++++ .../mod/proxy/ClientProxy.java | 9 ++ .../mod/tile/TileEntityLaserRelay.java | 13 +- .../actuallyadditions/mod/util/AssetUtil.java | 116 ++++++++++++++++++ 4 files changed, 199 insertions(+), 5 deletions(-) create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mod/blocks/render/RenderLaserRelay.java diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/render/RenderLaserRelay.java b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/render/RenderLaserRelay.java new file mode 100644 index 000000000..a6a1f76a0 --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/blocks/render/RenderLaserRelay.java @@ -0,0 +1,66 @@ +/* + * This file ("RenderLaserRelay.java") is part of the Actually Additions mod for Minecraft. + * It is created and owned by Ellpeck and distributed + * under the Actually Additions License to be found at + * http://ellpeck.de/actaddlicense + * View the source code at https://github.com/Ellpeck/ActuallyAdditions + * + * © 2015-2016 Ellpeck + */ + +package de.ellpeck.actuallyadditions.mod.blocks.render; + + +import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI; +import de.ellpeck.actuallyadditions.api.laser.IConnectionPair; +import de.ellpeck.actuallyadditions.api.laser.LaserType; +import de.ellpeck.actuallyadditions.mod.data.PlayerData; +import de.ellpeck.actuallyadditions.mod.data.PlayerData.PlayerSave; +import de.ellpeck.actuallyadditions.mod.items.ItemLaserWrench; +import de.ellpeck.actuallyadditions.mod.items.ItemLaserWrench.WrenchMode; +import de.ellpeck.actuallyadditions.mod.tile.TileEntityLaserRelay; +import de.ellpeck.actuallyadditions.mod.util.AssetUtil; +import io.netty.util.internal.ConcurrentSet; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; + +public class RenderLaserRelay extends TileEntitySpecialRenderer{ + + private static final float[] COLOR = new float[]{1F, 0F, 0F}; + private static final float[] COLOR_ITEM = new float[]{43F/255F, 158F/255F, 39/255F}; + private static final float[] COLOR_FLUIDS = new float[]{139F/255F, 94F/255F, 1F}; + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float par5, int par6){ + if(tile instanceof TileEntityLaserRelay){ + TileEntityLaserRelay relay = (TileEntityLaserRelay)tile; + + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + if(player != null){ + PlayerSave data = PlayerData.getDataFromPlayer(player); + WrenchMode mode = WrenchMode.values()[data.theCompound.getInteger("LaserWrenchMode")]; + if(mode != WrenchMode.NO_PARTICLES){ + ItemStack stack = player.getHeldItemMainhand(); + if(mode == WrenchMode.ALWAYS_PARTICLES || (stack != null && stack.getItem() instanceof ItemLaserWrench)){ + ConcurrentSet connections = ActuallyAdditionsAPI.connectionHandler.getConnectionsFor(tile.getPos(), tile.getWorld()); + if(connections != null && !connections.isEmpty()){ + for(IConnectionPair pair : connections){ + if(!pair.doesSuppressRender() && tile.getPos().equals(pair.getPositions()[0])){ + BlockPos first = tile.getPos(); + BlockPos second = pair.getPositions()[1]; + float[] color = relay.type == LaserType.ITEM ? COLOR_ITEM : (relay.type == LaserType.FLUID ? COLOR_FLUIDS : COLOR); + + AssetUtil.renderLaser(first.getX()+0.5, first.getY()+0.5, first.getZ()+0.5, second.getX()+0.5, second.getY()+0.5, second.getZ()+0.5, 120, 0.5F, 0.05, color); + } + } + } + } + } + } + } + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/proxy/ClientProxy.java b/src/main/java/de/ellpeck/actuallyadditions/mod/proxy/ClientProxy.java index 1cc5b7ce4..43b8a2cc4 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/proxy/ClientProxy.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/proxy/ClientProxy.java @@ -28,6 +28,7 @@ import de.ellpeck.actuallyadditions.mod.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.client.resources.IReloadableResourceManager; import net.minecraft.client.resources.IResourceManager; import net.minecraft.client.resources.IResourceManagerReloadListener; @@ -153,6 +154,14 @@ public class ClientProxy implements IProxy{ ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDisplayStand.class, new RenderDisplayStand()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityEmpowerer.class, new RenderEmpowerer()); + TileEntitySpecialRenderer laser = new RenderLaserRelay(); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLaserRelayEnergy.class, laser); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLaserRelayEnergyAdvanced.class, laser); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLaserRelayEnergyExtreme.class, laser); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLaserRelayItem.class, laser); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLaserRelayItemWhitelist.class, laser); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLaserRelayFluids.class, laser); + //VillagerRegistry.INSTANCE().registerVillagerSkin(ConfigIntValues.JAM_VILLAGER_ID.getValue(), new ResourceLocation(ModUtil.MOD_ID, "textures/entity/villager/jamVillager.png")); for(Item item : COLOR_PRODIVIDING_ITEMS_FOR_REGISTERING){ diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelay.java b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelay.java index b5a187458..11bf204c3 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelay.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityLaserRelay.java @@ -27,6 +27,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -35,9 +36,6 @@ import java.util.Set; public abstract class TileEntityLaserRelay extends TileEntityBase{ public static final int MAX_DISTANCE = 15; - private static final float[] COLOR = new float[]{1F, 0F, 0F}; - private static final float[] COLOR_ITEM = new float[]{43F/255F, 158F/255F, 39/255F}; - private static final float[] COLOR_FLUIDS = new float[]{139F/255F, 94F/255F, 1F}; public final LaserType type; @@ -86,7 +84,7 @@ public abstract class TileEntityLaserRelay extends TileEntityBase{ } } - @Override + /*@Override public void updateEntity(){ super.updateEntity(); if(this.worldObj.isRemote){ @@ -116,7 +114,7 @@ public abstract class TileEntityLaserRelay extends TileEntityBase{ } } } - } + }*/ @Override public void invalidate(){ @@ -139,4 +137,9 @@ public abstract class TileEntityLaserRelay extends TileEntityBase{ super.validate(); } + + @Override + public AxisAlignedBB getRenderBoundingBox(){ + return INFINITE_EXTENT_AABB; + } } 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 2f03aa888..7b44c952b 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/util/AssetUtil.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/util/AssetUtil.java @@ -21,6 +21,7 @@ import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -202,4 +203,119 @@ public final class AssetUtil{ } } } + + //Thanks to feldim2425 for this. + //I can't do rendering code. Ever. + @SideOnly(Side.CLIENT) + public static void renderLaser(double firstX, double firstY, double firstZ, double secondX, double secondY, double secondZ, int rotationTime, float alpha, double beamWidth, float[] color){ + Tessellator tessy = Tessellator.getInstance(); + VertexBuffer render = tessy.getBuffer(); + World world = Minecraft.getMinecraft().theWorld; + + GlStateManager.disableFog(); + + float r = color[0]; + float g = color[1]; + float b = color[2]; + + Vec3d vec1 = new Vec3d(firstX, firstY, firstZ); + Vec3d vec2 = new Vec3d(secondX, secondY, secondZ); + Vec3d combinedVec = vec2.subtract(vec1); + + double rot = rotationTime > 0 ? (360F*(((float)world.getTotalWorldTime()%(float)rotationTime)/(float)rotationTime)) : 0; + double pitch = Math.atan2(combinedVec.yCoord, Math.sqrt(combinedVec.xCoord*combinedVec.xCoord+combinedVec.zCoord*combinedVec.zCoord)); + double yaw = Math.atan2(-combinedVec.zCoord, combinedVec.xCoord); + + double length = combinedVec.lengthVector(); + + GlStateManager.pushMatrix(); + + GlStateManager.disableLighting(); + GlStateManager.enableBlend(); + GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); + GlStateManager.depthMask(false); + 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); + + /*if(r != r2 || g != g2 || b != b2){ + render.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR); + Minecraft.getMinecraft().renderEngine.bindTexture(ClientUtil.LIGHT_BEAM_GRADIENT); + + 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(); + + 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(); + } + else{*/ + GlStateManager.disableTexture2D(); + render.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR); + render.pos(length, beamWidth, beamWidth).color(r, g, b, alpha).endVertex(); + render.pos(0, beamWidth, beamWidth).color(r, g, b, alpha).endVertex(); + render.pos(0, -beamWidth, beamWidth).color(r, g, b, alpha).endVertex(); + render.pos(length, -beamWidth, beamWidth).color(r, g, b, alpha).endVertex(); + + render.pos(length, -beamWidth, -beamWidth).color(r, g, b, alpha).endVertex(); + render.pos(0, -beamWidth, -beamWidth).color(r, g, b, alpha).endVertex(); + render.pos(0, beamWidth, -beamWidth).color(r, g, b, alpha).endVertex(); + render.pos(length, beamWidth, -beamWidth).color(r, g, b, alpha).endVertex(); + + render.pos(length, beamWidth, -beamWidth).color(r, g, b, alpha).endVertex(); + render.pos(0, beamWidth, -beamWidth).color(r, g, b, alpha).endVertex(); + render.pos(0, beamWidth, beamWidth).color(r, g, b, alpha).endVertex(); + render.pos(length, beamWidth, beamWidth).color(r, g, b, alpha).endVertex(); + + render.pos(length, -beamWidth, beamWidth).color(r, g, b, alpha).endVertex(); + render.pos(0, -beamWidth, beamWidth).color(r, g, b, alpha).endVertex(); + render.pos(0, -beamWidth, -beamWidth).color(r, g, b, alpha).endVertex(); + render.pos(length, -beamWidth, -beamWidth).color(r, g, b, alpha).endVertex(); + tessy.draw(); + + GlStateManager.enableTexture2D(); + //} + + GlStateManager.disableBlend(); + GlStateManager.enableLighting(); + GlStateManager.depthMask(true); + GlStateManager.popMatrix(); + + GlStateManager.enableFog(); + } }