Possibly improved transformation performance, closes #10
This commit is contained in:
parent
f8f2de930e
commit
292c150466
|
@ -66,13 +66,13 @@ public class TileEntityPanel extends TileEntityIWBase implements IDirectionalTil
|
|||
Label lbl = new Label("->", color);
|
||||
ind.setX(0);
|
||||
ind.setY(i / 16F);
|
||||
ind.setPanelHeight(components.height);
|
||||
ind.setPanelHeight(components.getHeight());
|
||||
lbl.setX(2 / 16F);
|
||||
lbl.setY(i / 16F);
|
||||
lbl.setPanelHeight(components.height);
|
||||
lbl.setPanelHeight(components.getHeight());
|
||||
btn.setX(5 / 16F);
|
||||
btn.setY(i / 16F);
|
||||
btn.setPanelHeight(components.height);
|
||||
btn.setPanelHeight(components.getHeight());
|
||||
components.add(ind);
|
||||
components.add(lbl);
|
||||
components.add(btn);
|
||||
|
@ -101,15 +101,15 @@ public class TileEntityPanel extends TileEntityIWBase implements IDirectionalTil
|
|||
@Override
|
||||
public void writeNBT(NBTTagCompound out, boolean updatePacket) {
|
||||
writeToItemNBT(out, false);
|
||||
out.setInteger("facing", components.facing.getHorizontalIndex());
|
||||
out.setInteger("top", components.top.getIndex());
|
||||
out.setInteger("facing", components.getFacing().getHorizontalIndex());
|
||||
out.setInteger("top", components.getTop().getIndex());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readNBT(NBTTagCompound in, boolean updatePacket) {
|
||||
readFromItemNBT(in);
|
||||
components.facing = EnumFacing.getHorizontal(in.getInteger("facing"));
|
||||
components.top = EnumFacing.getFront(in.getInteger("top"));
|
||||
components.setFacing(EnumFacing.getHorizontal(in.getInteger("facing")));
|
||||
components.setTop(EnumFacing.getFront(in.getInteger("top")));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -133,8 +133,8 @@ public class TileEntityPanel extends TileEntityIWBase implements IDirectionalTil
|
|||
if (nbt != null) {
|
||||
NBTTagList l = nbt.getTagList("components", 10);
|
||||
PanelUtils.readListFromNBT(l, components);
|
||||
components.height = nbt.getFloat("height");
|
||||
components.angle = nbt.getFloat("angle");
|
||||
components.setHeight(nbt.getFloat("height"));
|
||||
components.setAngle(nbt.getFloat("angle"));
|
||||
}
|
||||
defAABB = null;
|
||||
}
|
||||
|
@ -147,19 +147,19 @@ public class TileEntityPanel extends TileEntityIWBase implements IDirectionalTil
|
|||
comps.appendTag(nbtInner);
|
||||
}
|
||||
nbt.setTag("components", comps);
|
||||
nbt.setFloat("height", components.height);
|
||||
nbt.setFloat("angle", components.angle);
|
||||
nbt.setFloat("height", components.getHeight());
|
||||
nbt.setFloat("angle", components.getAngle());
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public EnumFacing getFacing() {
|
||||
return components.facing;
|
||||
return components.getFacing();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFacing(@Nonnull EnumFacing facing) {
|
||||
this.components.facing = facing;
|
||||
this.components.setFacing(facing);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -172,19 +172,19 @@ public class TileEntityPanel extends TileEntityIWBase implements IDirectionalTil
|
|||
public EnumFacing getFacingForPlacement(@Nonnull EntityLivingBase placer, @Nonnull BlockPos pos, @Nonnull EnumFacing side, float hitX, float hitY, float hitZ) {
|
||||
switch (side) {
|
||||
case UP:
|
||||
components.top = EnumFacing.UP;
|
||||
components.setTop(EnumFacing.UP);
|
||||
return EnumFacing.fromAngle(placer.rotationYaw);
|
||||
case DOWN:
|
||||
components.top = EnumFacing.DOWN;
|
||||
return EnumFacing.fromAngle(placer.rotationYaw);
|
||||
components.setTop(EnumFacing.DOWN);
|
||||
return EnumFacing.fromAngle(-placer.rotationYaw);
|
||||
case NORTH:
|
||||
case SOUTH:
|
||||
case WEST:
|
||||
case EAST:
|
||||
components.top = side;
|
||||
components.setTop(side);
|
||||
return EnumFacing.SOUTH;//Should not matter
|
||||
}
|
||||
return components.facing;
|
||||
return components.getFacing();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -227,8 +227,7 @@ public class TileEntityPanel extends TileEntityIWBase implements IDirectionalTil
|
|||
@Nullable
|
||||
public Pair<PanelComponent, RayTraceResult> getSelectedComponent(EntityPlayer player, Vec3d hit, boolean hitAbs) {
|
||||
//TODO prevent clicking through the back of the panel
|
||||
Matrix4 mat = components.getPanelTopTransform();
|
||||
mat.invert();
|
||||
Matrix4 mat = components.getPanelTopTransformInverse();
|
||||
PanelComponent retPc = null;
|
||||
RayTraceResult retRay = null;
|
||||
Vec3d playerPosRelative = player.getPositionVector().addVector(-pos.getX(), player.getEyeHeight() - pos.getY(), -pos.getZ());
|
||||
|
|
|
@ -94,8 +94,8 @@ public final class PanelUtils {
|
|||
baseNorm.transpose();
|
||||
|
||||
List<RawQuad> rawOut = new ArrayList<>();
|
||||
float height1 = getLocalHeightFromZ(1, components.height, components.angle);
|
||||
float height0 = getLocalHeightFromZ(0, components.height, components.angle);
|
||||
float height1 = getLocalHeightFromZ(1, components.getHeight(), components.getAngle());
|
||||
float height0 = getLocalHeightFromZ(0, components.getHeight(), components.getAngle());
|
||||
float vMax1 = 16 * height1;
|
||||
float vMax0 = 16 * height0;
|
||||
//TOP
|
||||
|
|
|
@ -27,6 +27,7 @@ import net.minecraftforge.common.property.IUnlistedProperty;
|
|||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class PropertyComponents implements IUnlistedProperty<PropertyComponents.PanelRenderProperties> {
|
||||
|
@ -53,11 +54,15 @@ public class PropertyComponents implements IUnlistedProperty<PropertyComponents.
|
|||
}
|
||||
|
||||
public static class PanelRenderProperties extends ArrayList<PanelComponent> {
|
||||
public EnumFacing facing = EnumFacing.NORTH;
|
||||
public float height = .5F;
|
||||
public EnumFacing top = EnumFacing.UP;
|
||||
private EnumFacing facing = EnumFacing.NORTH;
|
||||
private float height = .5F;
|
||||
private EnumFacing top = EnumFacing.UP;
|
||||
// as radians!
|
||||
public float angle = 0;
|
||||
private float angle = 0;
|
||||
private Matrix4 topTransform;
|
||||
private Matrix4 topTransformInverse;
|
||||
private Matrix4 baseTransform;
|
||||
|
||||
|
||||
public PanelRenderProperties() {
|
||||
super();
|
||||
|
@ -79,11 +84,25 @@ public class PropertyComponents implements IUnlistedProperty<PropertyComponents.
|
|||
return ret + "]";
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public Matrix4 getPanelTopTransform() {
|
||||
return getPanelBaseTransform().translate(0, height, .5)
|
||||
.rotate(angle, 1, 0, 0).translate(0, 0, -.5);
|
||||
if (topTransform == null) {
|
||||
topTransform = getPanelBaseTransform().copy().translate(0, height, .5)
|
||||
.rotate(angle, 1, 0, 0).translate(0, 0, -.5);
|
||||
}
|
||||
return topTransform;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public Matrix4 getPanelTopTransformInverse() {
|
||||
if (topTransformInverse == null) {
|
||||
topTransformInverse = getPanelTopTransform().copy();
|
||||
topTransformInverse.invert();
|
||||
}
|
||||
return topTransformInverse;
|
||||
}
|
||||
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void transformGLForTop(BlockPos panelPos) {
|
||||
double px = panelPos.getX() - TileEntityRendererDispatcher.staticPlayerX;
|
||||
|
@ -112,25 +131,28 @@ public class PropertyComponents implements IUnlistedProperty<PropertyComponents.
|
|||
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public Matrix4 getPanelBaseTransform() {
|
||||
Matrix4 ret = new Matrix4();
|
||||
ret.translate(.5, .5, .5);
|
||||
switch (top) {
|
||||
case DOWN:
|
||||
ret.rotate(Math.PI, 0, 0, 1);
|
||||
case UP:
|
||||
ret.rotate(-facing.getHorizontalAngle() * Math.PI / 180 + Math.PI, 0, 1, 0);
|
||||
break;
|
||||
case NORTH:
|
||||
case SOUTH:
|
||||
case WEST:
|
||||
case EAST:
|
||||
ret.rotate(Math.PI / 2, 1, 0, 0);
|
||||
ret.rotate(top.getHorizontalAngle() * Math.PI / 180, 0, 0, 1);
|
||||
break;
|
||||
if (baseTransform == null) {
|
||||
baseTransform = new Matrix4();
|
||||
baseTransform.translate(.5, .5, .5);
|
||||
switch (top) {
|
||||
case DOWN:
|
||||
baseTransform.rotate(Math.PI, 0, 0, 1);
|
||||
case UP:
|
||||
baseTransform.rotate(-facing.getHorizontalAngle() * Math.PI / 180 + Math.PI, 0, 1, 0);
|
||||
break;
|
||||
case NORTH:
|
||||
case SOUTH:
|
||||
case WEST:
|
||||
case EAST:
|
||||
baseTransform.rotate(Math.PI / 2, 1, 0, 0);
|
||||
baseTransform.rotate(top.getHorizontalAngle() * Math.PI / 180, 0, 0, 1);
|
||||
break;
|
||||
}
|
||||
baseTransform.translate(-.5, -.5, -.5);
|
||||
}
|
||||
ret.translate(-.5, -.5, -.5);
|
||||
return ret;
|
||||
return baseTransform;
|
||||
}
|
||||
|
||||
public float getMaxHeight() {
|
||||
|
@ -159,6 +181,57 @@ public class PropertyComponents implements IUnlistedProperty<PropertyComponents.
|
|||
return (float) (height + Math.abs(Math.tan(angle) / 2));
|
||||
}
|
||||
|
||||
private void resetMatrixes() {
|
||||
baseTransform = null;
|
||||
topTransformInverse = null;
|
||||
topTransform = null;
|
||||
}
|
||||
|
||||
public EnumFacing getFacing() {
|
||||
return facing;
|
||||
}
|
||||
|
||||
public void setFacing(EnumFacing facing) {
|
||||
if (facing != this.facing) {
|
||||
this.facing = facing;
|
||||
resetMatrixes();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public float getHeight() {
|
||||
return height;
|
||||
}
|
||||
|
||||
public void setHeight(float height) {
|
||||
if (height != this.height) {
|
||||
this.height = height;
|
||||
resetMatrixes();
|
||||
}
|
||||
}
|
||||
|
||||
public EnumFacing getTop() {
|
||||
return top;
|
||||
}
|
||||
|
||||
public void setTop(EnumFacing top) {
|
||||
if (top != this.top) {
|
||||
this.top = top;
|
||||
resetMatrixes();
|
||||
}
|
||||
}
|
||||
|
||||
public float getAngle() {
|
||||
return angle;
|
||||
}
|
||||
|
||||
public void setAngle(float angle) {
|
||||
if (angle != this.angle) {
|
||||
this.angle = angle;
|
||||
resetMatrixes();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
|
|
Loading…
Reference in a new issue