Advertisement
Guest User

Untitled

a guest
Nov 26th, 2016
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.16 KB | None | 0 0
  1.  
  2. import com.google.common.collect.AbstractIterator;
  3.  
  4. import net.minecraft.util.math.MathHelper;
  5. import net.minecraft.util.math.Vec3i;
  6.  
  7. import static java.lang.Math.max;
  8. import static java.lang.Math.min;
  9.  
  10. class ScalingLerpIBuilderIterator extends AbstractIterator<IBuilder.IEntry> {
  11.     private final int minX;
  12.     private final int minY;
  13.     private final int minZ;
  14.     private final int maxX;
  15.     private final int maxY;
  16.     private final int maxZ;
  17.  
  18.     private final double xStep;
  19.     private final double yStep;
  20.     private final double zStep;
  21.  
  22.     private final int minGridX;
  23.     private final int minGridY;
  24.     private final int minGridZ;
  25.     private final int maxGridX;
  26.     private final int maxGridY;
  27.     private final int maxGridZ;
  28.     private final int scaleX;
  29.     private final int scaleY;
  30.     private final int scaleZ;
  31.  
  32.     private final IBuilder builder;
  33.  
  34.     private int nextGridX;
  35.     private int nextGridY;
  36.     private int nextGridZ;
  37.  
  38.     private int nextRelX;
  39.     private int nextRelY;
  40.     private int nextRelZ;
  41.  
  42.     private double v000, v001, v010, v011, v100, v101, v110, v111;
  43.     private double vx00, vx01, vx10, vx11;
  44.     private double vxy0, vxy1;
  45.     private double vxyz;
  46.  
  47.     private double dx00, dx01, dx10, dx11;
  48.     private double dxy0, dxy1;
  49.     private double dxyz;
  50.  
  51.     ScalingLerpIBuilderIterator(IBuilder builder, Vec3i start, Vec3i end, int scaleX, int scaleY, int scaleZ) {
  52.         this.builder = builder;
  53.         this.scaleX = scaleX;
  54.         this.scaleY = scaleY;
  55.         this.scaleZ = scaleZ;
  56.  
  57.         minX = min(start.getX(), end.getX());
  58.         minY = min(start.getY(), end.getY());
  59.         minZ = min(start.getZ(), end.getZ());
  60.         maxX = max(start.getX(), end.getX());
  61.         maxY = max(start.getY(), end.getY());
  62.         maxZ = max(start.getZ(), end.getZ());
  63.  
  64.         minGridX = MathHelper.intFloorDiv(minX, scaleX);
  65.         minGridY = MathHelper.intFloorDiv(minY, scaleY);
  66.         minGridZ = MathHelper.intFloorDiv(minZ, scaleZ);
  67.         maxGridX = MathHelper.intFloorDiv(minX, scaleX);
  68.         maxGridY = MathHelper.intFloorDiv(minY, scaleY);
  69.         maxGridZ = MathHelper.intFloorDiv(minZ, scaleZ);
  70.  
  71.         nextGridX = minGridX;
  72.         nextGridY = minGridY;
  73.         nextGridZ = minGridZ;
  74.  
  75.         xStep = 1.0/scaleX;
  76.         yStep = 1.0/scaleY;
  77.         zStep = 1.0/scaleZ;
  78.  
  79.         nextRelX = 0;
  80.         nextRelY = 0;
  81.         nextRelZ = 0;
  82.     }
  83.  
  84.     @Override public IBuilder.IEntry computeNext() {
  85.         // if everything is out of bounds...
  86.         if (global(nextGridX, scaleX, nextRelX) > maxX &&
  87.             global(nextGridY, scaleY, nextRelY) > maxY &&
  88.             global(nextGridZ, scaleZ, nextRelZ) > maxZ) {
  89.             return null;
  90.         }
  91.         vxyz += dxyz;
  92.         if (nextRelZ == 0) {
  93.             assert nextRelX == 0 && nextRelY == 0;
  94.             recalculateLerpZ();
  95.         }
  96.         if (nextRelY == 0) {
  97.             assert nextRelX == 0;
  98.             recalculateLerpY();
  99.         }
  100.         if (nextRelX == 0) {
  101.             updateCorners();
  102.             recalculateLerpX();
  103.         }
  104.  
  105.         IBuilder.IEntry entry = new IBuilder.ImmutbleEntry(
  106.             global(nextGridX, scaleX, nextRelX),
  107.             global(nextGridY, scaleY, nextRelY),
  108.             global(nextGridZ, scaleZ, nextRelZ),
  109.             vxyz
  110.         );
  111.  
  112.         incrementPos();
  113.         return entry;
  114.     }
  115.  
  116.     private void updateCorners() {
  117.         // get corners
  118.         v000 = builder.get(nextGridX, nextGridY, nextGridZ);
  119.         v001 = builder.get(nextGridX, nextGridY, nextGridZ + 1);
  120.         v010 = builder.get(nextGridX, nextGridY + 1, nextGridZ);
  121.         v011 = builder.get(nextGridX, nextGridY + 1, nextGridZ + 1);
  122.         v100 = builder.get(nextGridX + 1, nextGridY, nextGridZ);
  123.         v101 = builder.get(nextGridX + 1, nextGridY, nextGridZ + 1);
  124.         v110 = builder.get(nextGridX + 1, nextGridY + 1, nextGridZ);
  125.         v111 = builder.get(nextGridX + 1, nextGridY + 1, nextGridZ + 1);
  126.     }
  127.  
  128.     private void recalculateLerpX() {
  129.         nextRelX = boundClampRelPosMin(nextGridX, scaleX, minX);
  130.         // step 1
  131.         dx00 = (v100 - v000)*xStep;
  132.         dx01 = (v101 - v001)*xStep;
  133.         dx10 = (v110 - v010)*xStep;
  134.         dx11 = (v111 - v011)*xStep;
  135.  
  136.         vx00 = v000 + dx00*nextRelX;
  137.         vx01 = v001 + dx01*nextRelX;
  138.         vx10 = v010 + dx10*nextRelX;
  139.         vx11 = v011 + dx11*nextRelX;
  140.     }
  141.  
  142.     private void recalculateLerpY() {
  143.         nextRelY = boundClampRelPosMin(nextGridY, scaleY, minY);
  144.         // step 2
  145.         dxy0 = (vx10 - vx00)*yStep;
  146.         dxy1 = (vx11 - vx01)*yStep;
  147.  
  148.         vxy0 = vx00 + dxy0*nextRelY;
  149.         vxy1 = vx01 + dxy1*nextRelY;
  150.     }
  151.  
  152.     private void recalculateLerpZ() {
  153.         nextRelZ = boundClampRelPosMin(nextGridZ, scaleZ, minZ);
  154.         // step 3
  155.         dxyz = (vxy1 - vxy0)*zStep;
  156.  
  157.         vxyz = vxy0 + dxyz*nextRelZ;
  158.     }
  159.  
  160.     private void incrementPos() {
  161.         nextRelZ++;
  162.         if (nextRelZ > scaleZ || global(nextGridX, scaleX, nextRelX) > maxX) {
  163.             nextRelZ = 0;
  164.             nextRelY++;
  165.             if (nextRelY > scaleY || global(nextGridY, scaleY, nextRelY) > maxY) {
  166.                 nextRelY = 0;
  167.                 nextRelX++;
  168.                 if (nextRelX > scaleY || global(nextGridY, scaleY, nextRelY) > maxY) {
  169.                     nextRelX = 0;
  170.                     incrementGridPos();
  171.                 }
  172.             }
  173.         }
  174.     }
  175.  
  176.     private void incrementGridPos() {
  177.         nextGridX++;
  178.         if (nextGridX > maxGridX) {
  179.             nextGridX = 0;
  180.             nextGridY++;
  181.             if (nextGridY > maxGridY) {
  182.                 nextGridY = 0;
  183.                 nextGridZ++;
  184.             }
  185.         }
  186.     }
  187.  
  188.     private static int boundClampRelPosMin(int gridPos, int scale, int minPos) {
  189.         int globPos = gridPos*scale;//+localPos
  190.         if (globPos < minPos) {
  191.             return minPos - globPos;
  192.         }
  193.         return gridPos;
  194.     }
  195.  
  196.     private static int global(int gridPos, int scale, int relPos) {
  197.         return gridPos*scale + relPos;
  198.     }
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement