Possibly improved transformation performance, closes #10

This commit is contained in:
malte0811 2017-07-03 21:08:39 +02:00
parent f8f2de930e
commit 292c150466
3 changed files with 117 additions and 45 deletions

View file

@ -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());

View file

@ -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

View file

@ -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;