From 68efe9f28e3849c6cafbe5629f220ca340d5b17b Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 19 Apr 2022 14:28:41 +0200 Subject: [PATCH] why is it called a quarternion when you quarter in the cold food out hot eat the food? --- .../java/com/hbm/animloader/Transform.java | 101 +++++++++++++----- .../hbm/blocks/machine/MachineChungus.java | 9 +- .../tileentity/machine/TileEntityChungus.java | 45 ++++++-- 3 files changed, 116 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/hbm/animloader/Transform.java b/src/main/java/com/hbm/animloader/Transform.java index 2461fcb39..6d0948ccd 100644 --- a/src/main/java/com/hbm/animloader/Transform.java +++ b/src/main/java/com/hbm/animloader/Transform.java @@ -2,6 +2,7 @@ package com.hbm.animloader; import java.nio.FloatBuffer; +import org.lwjgl.opengl.GL11; import org.lwjgl.util.vector.Matrix4f; import org.lwjgl.util.vector.Quaternion; @@ -10,6 +11,15 @@ import com.hbm.util.BobMathUtil; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.util.Vec3; +/** + * Bob: + * Ported from 1.12.2. + * Mostly gibberish to me, probably written in the ancient egyptian language. + * Any unmarked code comments are probably from Drillgon or code I had to throw out myself. + * + * @author Drillgon200 for the most part + * + */ public class Transform { protected static FloatBuffer auxGLMatrix = GLAllocation.createDirectFloatBuffer(16); @@ -49,37 +59,70 @@ public class Transform { } public void interpolateAndApply(Transform other, float inter){ - Vec3 trans = BobMathUtil.interpVec(this.translation, other.translation, inter); //ORIGINAL: translation.interpolate(other.translation, inter); - Vec3 scale = BobMathUtil.interpVec(this.scale, other.scale, inter); //ORIGINAL: this.scale.interpolate(other.scale, inter); + Vec3 trans = BobMathUtil.interpVec(this.translation, other.translation, inter); + Vec3 scale = BobMathUtil.interpVec(this.scale, other.scale, inter); Quaternion rot = slerp(rotation, other.rotation, inter); - //GlStateManager.quatToGlMatrix(auxGLMatrix, rot); TODO: find implementation + quatToGlMatrix(auxGLMatrix, rot); scale(auxGLMatrix, scale); auxGLMatrix.put(12, (float) trans.xCoord); auxGLMatrix.put(13, (float) trans.yCoord); auxGLMatrix.put(14, (float) trans.zCoord); - //for(int i = 0; i < 16; i ++){ - //System.out.print(auxGLMatrix.get(i) + " "); - //} - //System.out.println(); - //GlStateManager.multMatrix(auxGLMatrix); TODO: find implementation + GL11.glMultMatrix(auxGLMatrix); } - private void scale(FloatBuffer matrix, Vec3 scale){ - matrix.put(0, (float) (matrix.get(0)*scale.xCoord)); - matrix.put(4, (float) (matrix.get(4)*scale.xCoord)); - matrix.put(8, (float) (matrix.get(8)*scale.xCoord)); - matrix.put(12, (float) (matrix.get(12)*scale.xCoord)); + public static FloatBuffer quatToGlMatrix(FloatBuffer buf, Quaternion q) { + buf.clear(); + float xx = q.x * q.x; + float xy = q.x * q.y; + float xz = q.x * q.z; + float xw = q.x * q.w; + float yy = q.y * q.y; + float yz = q.y * q.z; + float yw = q.y * q.w; + float zz = q.z * q.z; + float zw = q.z * q.w; - matrix.put(1, (float) (matrix.get(1)*scale.yCoord)); - matrix.put(5, (float) (matrix.get(5)*scale.yCoord)); - matrix.put(9, (float) (matrix.get(9)*scale.yCoord)); - matrix.put(13, (float) (matrix.get(13)*scale.yCoord)); + //Bob: i may not know what a quarternion is but grouping these in parts of 4 looks nice + buf.put(1.0F - 2.0F * (yy + zz)); + buf.put(2.0F * (xy + zw)); + buf.put(2.0F * (xz - yw)); + buf.put(0.0F); - matrix.put(2, (float) (matrix.get(2)*scale.zCoord)); - matrix.put(6, (float) (matrix.get(6)*scale.zCoord)); - matrix.put(10, (float) (matrix.get(10)*scale.zCoord)); - matrix.put(14, (float) (matrix.get(14)*scale.zCoord)); + buf.put(2.0F * (xy - zw)); + buf.put(1.0F - 2.0F * (xx + zz)); + buf.put(2.0F * (yz + xw)); + buf.put(0.0F); + + buf.put(2.0F * (xz + yw)); + buf.put(2.0F * (yz - xw)); + buf.put(1.0F - 2.0F * (xx + yy)); + buf.put(0.0F); + + buf.put(0.0F); + buf.put(0.0F); + buf.put(0.0F); + buf.put(1.0F); + + buf.rewind(); + return buf; + } + + private void scale(FloatBuffer matrix, Vec3 scale) { + matrix.put(0, (float) (matrix.get(0) * scale.xCoord)); + matrix.put(4, (float) (matrix.get(4) * scale.xCoord)); + matrix.put(8, (float) (matrix.get(8) * scale.xCoord)); + matrix.put(12, (float) (matrix.get(12) * scale.xCoord)); + + matrix.put(1, (float) (matrix.get(1) * scale.yCoord)); + matrix.put(5, (float) (matrix.get(5) * scale.yCoord)); + matrix.put(9, (float) (matrix.get(9) * scale.yCoord)); + matrix.put(13, (float) (matrix.get(13) * scale.yCoord)); + + matrix.put(2, (float) (matrix.get(2) * scale.zCoord)); + matrix.put(6, (float) (matrix.get(6) * scale.zCoord)); + matrix.put(10, (float) (matrix.get(10) * scale.zCoord)); + matrix.put(14, (float) (matrix.get(14) * scale.zCoord)); } //Thanks, wikipedia @@ -116,18 +159,18 @@ public class Transform { } // Since dot is in range [0, DOT_THRESHOLD], acos is safe - double theta_0 = Math.acos(dot); // theta_0 = angle between input vectors - double theta = theta_0*t; // theta = angle between v0 and result - double sin_theta = Math.sin(theta); // compute this value only once - double sin_theta_0 = Math.sin(theta_0); // compute this value only once + double theta_0 = Math.acos(dot); // theta_0 = angle between input vectors + double theta = theta_0*t; // theta = angle between v0 and result + double sin_theta = Math.sin(theta); // compute this value only once + double sin_theta_0 = Math.sin(theta_0); // compute this value only once float s0 = (float) (Math.cos(theta) - dot * sin_theta / sin_theta_0); // == sin(theta_0 - theta) / sin(theta_0) float s1 = (float) (sin_theta / sin_theta_0); - return new Quaternion(s0*v0.x + s1*v1.x, - s0*v0.y + s1*v1.y, - s0*v0.z + s1*v1.z, - s0*v0.w + s1*v1.w); + return new Quaternion(s0 * v0.x + s1 * v1.x, + s0 * v0.y + s1 * v1.y, + s0 * v0.z + s1 * v1.z, + s0 * v0.w + s1 * v1.w); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/MachineChungus.java b/src/main/java/com/hbm/blocks/machine/MachineChungus.java index eb7edb807..7277ca8a2 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineChungus.java +++ b/src/main/java/com/hbm/blocks/machine/MachineChungus.java @@ -57,6 +57,8 @@ public class MachineChungus extends BlockDummyable { if(!world.isRemote) { FluidType type = entity.tanks[0].getTankType(); + entity.onLeverPull(type); + if(type == Fluids.STEAM) { entity.tanks[0].setTankType(Fluids.HOTSTEAM); entity.tanks[1].setTankType(Fluids.STEAM); @@ -78,7 +80,6 @@ public class MachineChungus extends BlockDummyable { entity.tanks[0].setFill(Math.min(entity.tanks[0].getFill() * 1000, entity.tanks[0].getMaxFill())); entity.tanks[1].setFill(0); } - entity.markDirty(); } @@ -108,10 +109,10 @@ public class MachineChungus extends BlockDummyable { MultiblockHandlerXR.fillSpace(world, x + dir.offsetX * o , y + dir.offsetY * o, z + dir.offsetZ * o, new int[] {2, 0, 10, -7, 1, 1}, this, dir); world.setBlock(x + dir.offsetX, y + 2, z + dir.offsetZ, this, dir.ordinal(), 3); - this.makeExtra(world, x + dir.offsetX, y + 2, z + dir.offsetZ); - this.makeExtra(world, x + dir.offsetX * (o - 10), y, z + dir.offsetZ * (o - 10)); + this.makeExtra(world, x + dir.offsetX, y + 2, z + dir.offsetZ); //front connector + this.makeExtra(world, x + dir.offsetX * (o - 10), y, z + dir.offsetZ * (o - 10)); //back connector ForgeDirection side = dir.getRotation(ForgeDirection.UP); - this.makeExtra(world, x + dir.offsetX * o + side.offsetX * 2 , y, z + dir.offsetZ * o + side.offsetZ * 2); + this.makeExtra(world, x + dir.offsetX * o + side.offsetX * 2 , y, z + dir.offsetZ * o + side.offsetZ * 2); //side connectors this.makeExtra(world, x + dir.offsetX * o - side.offsetX * 2 , y, z + dir.offsetZ * o - side.offsetZ * 2); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java index eb7c80bb8..028080a73 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java @@ -16,8 +16,10 @@ import com.hbm.packet.NBTPacket; import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.fauxpointtwelve.BlockPos; import api.hbm.energy.IEnergyGenerator; +import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -26,7 +28,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcceptor, IFluidSource, IEnergyGenerator, INBTPacketReceiver { +public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcceptor, IFluidSource, IEnergyGenerator, INBTPacketReceiver, IFluidStandardTransceiver { public long power; public static final long maxPower = 100000000000L; @@ -75,6 +77,11 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); this.sendPower(worldObj, xCoord - dir.offsetX * 11, yCoord, zCoord - dir.offsetZ * 11, dir); + for(BlockPos pos : this.getConPos()) { + this.sendFluid(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), dir); //TODO: there's no directions for this yet because idc + this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), dir); + } + if(power > maxPower) power = maxPower; @@ -119,6 +126,22 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc } } + public void onLeverPull(FluidType previous) { + for(BlockPos pos : getConPos()) { + this.tryUnsubscribe(previous, worldObj, pos.getX(), pos.getY(), pos.getZ()); + } + } + + public BlockPos[] getConPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + return new BlockPos[] { + new BlockPos(xCoord - dir.offsetX * 4, yCoord + 2, zCoord - dir.offsetZ * 4), + new BlockPos(xCoord + rot.offsetX * 3, yCoord, zCoord + rot.offsetZ * 3), + new BlockPos(xCoord - rot.offsetZ * 3, yCoord, zCoord - rot.offsetZ * 3) + }; + } + public void networkPack(NBTTagCompound nbt, int range) { PacketDispatcher.wrapper.sendToAllAround(new NBTPacket(nbt, xCoord, yCoord, zCoord), new TargetPoint(this.worldObj.provider.dimensionId, xCoord, yCoord, zCoord, range)); } @@ -168,17 +191,17 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc @Override public void setFluidFill(int i, FluidType type) { - if(type.name().equals(tanks[0].getTankType().name())) + if(type == tanks[0].getTankType()) tanks[0].setFill(i); - else if(type.name().equals(tanks[1].getTankType().name())) + else if(type == tanks[1].getTankType()) tanks[1].setFill(i); } @Override public int getFluidFill(FluidType type) { - if(type.name().equals(tanks[0].getTankType().name())) + if(type == tanks[0].getTankType()) return tanks[0].getFill(); - else if(type.name().equals(tanks[1].getTankType().name())) + else if(type == tanks[1].getTankType()) return tanks[1].getFill(); return 0; @@ -186,7 +209,7 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc @Override public int getMaxFluidFill(FluidType type) { - if(type.name().equals(tanks[0].getTankType().name())) + if(type == tanks[0].getTankType()) return tanks[0].getMaxFill(); return 0; @@ -244,4 +267,14 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc public void setPower(long power) { this.power = power; } + + @Override + public FluidTank[] getSendingTanks() { + return new FluidTank[] {tanks[1]}; + } + + @Override + public FluidTank[] getReceivingTanks() { + return new FluidTank[] {tanks[0]}; + } }