start moving to int vector impls where possible

This commit is contained in:
dfsek 2021-11-24 13:54:43 -07:00
parent ba7722ce45
commit b04f7cfc55
15 changed files with 196 additions and 31 deletions

View File

@ -20,7 +20,7 @@ import com.dfsek.terra.api.block.state.properties.enums.Direction;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.Rotation;
import com.dfsek.terra.api.util.collection.MaterialSet;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.util.vector.Vector3;

View File

@ -237,7 +237,8 @@ public class CellularSampler extends NoiseFunction {
int xPrimed = (xr - 1) * PRIME_X;
int yPrimedBase = (yr - 1) * PRIME_Y;
Vector2 center = new Vector2(x, y);
double centerX = x;
double centerY = y;
switch(distanceFunction) {
default:
@ -259,8 +260,8 @@ public class CellularSampler extends NoiseFunction {
if(newDistance < distance0) {
distance0 = newDistance;
closestHash = hash;
center.setX((xi + RAND_VECS_2D[idx] * cellularJitter) / frequency);
center.setZ((yi + RAND_VECS_2D[idx | 1] * cellularJitter) / frequency);
centerX = ((xi + RAND_VECS_2D[idx] * cellularJitter) / frequency);
centerY = ((yi + RAND_VECS_2D[idx | 1] * cellularJitter) / frequency);
} else if(newDistance < distance1) {
distance2 = distance1;
distance1 = newDistance;
@ -289,8 +290,8 @@ public class CellularSampler extends NoiseFunction {
if(newDistance < distance0) {
distance0 = newDistance;
closestHash = hash;
center.setX((xi + RAND_VECS_2D[idx] * cellularJitter) / frequency);
center.setZ((yi + RAND_VECS_2D[idx | 1] * cellularJitter) / frequency);
centerX = ((xi + RAND_VECS_2D[idx] * cellularJitter) / frequency);
centerY = ((yi + RAND_VECS_2D[idx | 1] * cellularJitter) / frequency);
} else if(newDistance < distance1) {
distance2 = distance1;
distance1 = newDistance;
@ -319,8 +320,8 @@ public class CellularSampler extends NoiseFunction {
if(newDistance < distance0) {
distance0 = newDistance;
closestHash = hash;
center.setX((xi + RAND_VECS_2D[idx] * cellularJitter) / frequency);
center.setZ((yi + RAND_VECS_2D[idx | 1] * cellularJitter) / frequency);
centerX = ((xi + RAND_VECS_2D[idx] * cellularJitter) / frequency);
centerY = ((yi + RAND_VECS_2D[idx | 1] * cellularJitter) / frequency);
} else if(newDistance < distance1) {
distance2 = distance1;
distance1 = newDistance;
@ -349,7 +350,7 @@ public class CellularSampler extends NoiseFunction {
case Distance2Sub -> distance1 - distance0 - 1;
case Distance2Mul -> distance1 * distance0 * 0.5 - 1;
case Distance2Div -> distance0 / distance1 - 1;
case NoiseLookup -> noiseLookup.getNoiseSeeded(sl, center.getX(), center.getZ());
case NoiseLookup -> noiseLookup.getNoiseSeeded(sl, centerX, centerY);
case Distance3 -> distance2 - 1;
case Distance3Add -> (distance2 + distance0) * 0.5 - 1;
case Distance3Sub -> distance2 - distance0 - 1;

View File

@ -16,7 +16,7 @@ import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.config.WorldConfig;
import com.dfsek.terra.api.profiler.ProfileFrame;
import com.dfsek.terra.api.structure.configured.ConfiguredStructure;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.Rotation;
import com.dfsek.terra.api.util.PopulationUtil;
import com.dfsek.terra.api.util.vector.Vector3;
import com.dfsek.terra.api.world.Chunk;

View File

@ -28,7 +28,7 @@ import com.dfsek.terra.api.entity.CommandSender;
import com.dfsek.terra.api.entity.Player;
import com.dfsek.terra.api.inject.annotations.Inject;
import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.Rotation;
@PlayerCommand

View File

@ -10,7 +10,7 @@ package com.dfsek.terra.addons.generation.feature;
import com.dfsek.terra.addons.generation.feature.config.BiomeFeatures;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.profiler.ProfileFrame;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.Rotation;
import com.dfsek.terra.api.util.PopulationUtil;
import com.dfsek.terra.api.util.vector.Vector3;
import com.dfsek.terra.api.world.Chunk;

View File

@ -16,10 +16,9 @@ import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.buffer.items.BufferedBlock;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.util.vector.Vector2;
import com.dfsek.terra.api.util.Rotation;
import com.dfsek.terra.api.util.vector.Vector3;
import com.dfsek.terra.api.util.vector.integer.Vector2Int;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.World;
@ -44,9 +43,9 @@ public class SpongeStructure implements Structure {
int bZ = location.getBlockZ();
for(int x = 0; x < blocks.length; x++) {
for(int z = 0; z < blocks[x].length; z++) {
Vector2 r = RotationUtil.rotateVector(new Vector2(x, z), rotation);
int rX = r.getBlockX();
int rZ = r.getBlockZ();
Vector2Int r = Vector2Int.of(x, z).rotate(rotation);
int rX = r.getX();
int rZ = r.getZ();
if(FastMath.floorDiv(bX + rX, 16) != chunk.getX() || FastMath.floorDiv(bZ + rZ, 16) != chunk.getZ()) {
continue;
}
@ -64,9 +63,9 @@ public class SpongeStructure implements Structure {
public boolean generate(Buffer buffer, World world, Random random, Rotation rotation, int recursions) {
for(int x = 0; x < blocks.length; x++) {
for(int z = 0; z < blocks[x].length; z++) {
Vector2 r = RotationUtil.rotateVector(new Vector2(x, z), rotation);
int rX = r.getBlockX();
int rZ = r.getBlockZ();
Vector2Int r = Vector2Int.of(x, z).rotate(rotation);
int rX = r.getX();
int rZ = r.getZ();
for(int y = 0; y < blocks[z].length; y++) {
BlockState state = blocks[x][z][y];
if(state == null) continue;
@ -84,9 +83,9 @@ public class SpongeStructure implements Structure {
int bZ = location.getBlockZ();
for(int x = 0; x < blocks.length; x++) {
for(int z = 0; z < blocks[x].length; z++) {
Vector2 r = RotationUtil.rotateVector(new Vector2(x, z), rotation);
int rX = r.getBlockX();
int rZ = r.getBlockZ();
Vector2Int r = Vector2Int.of(x, z).rotate(rotation);
int rX = r.getX();
int rZ = r.getZ();
for(int y = 0; y < blocks[z].length; y++) {
BlockState state = blocks[x][z][y];
if(state == null) continue;

View File

@ -48,7 +48,7 @@ import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.buffer.buffers.DirectBuffer;
import com.dfsek.terra.api.structure.buffer.buffers.StructureBuffer;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.Rotation;
import com.dfsek.terra.api.util.vector.Vector3;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.World;

View File

@ -11,7 +11,7 @@ import java.util.Random;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.Rotation;
import com.dfsek.terra.api.world.World;

View File

@ -22,7 +22,7 @@ import com.dfsek.terra.addons.terrascript.tokenizer.Position;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.registry.Registry;
import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.Rotation;
import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.util.vector.Vector2;
import com.dfsek.terra.api.util.vector.Vector3;

View File

@ -7,7 +7,7 @@
package com.dfsek.terra.api.block.state.properties.enums;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.Rotation;
import com.dfsek.terra.api.util.generic.Construct;

View File

@ -10,7 +10,7 @@ package com.dfsek.terra.api.structure;
import java.util.Random;
import com.dfsek.terra.api.structure.buffer.Buffer;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.Rotation;
import com.dfsek.terra.api.util.StringIdentifiable;
import com.dfsek.terra.api.util.vector.Vector3;
import com.dfsek.terra.api.world.Chunk;

View File

@ -15,7 +15,6 @@ import com.dfsek.terra.api.block.state.properties.enums.Axis;
import com.dfsek.terra.api.block.state.properties.enums.RailShape;
import com.dfsek.terra.api.block.state.properties.enums.RedstoneConnection;
import com.dfsek.terra.api.block.state.properties.enums.WallHeight;
import com.dfsek.terra.api.structure.rotation.Rotation;
import com.dfsek.terra.api.util.vector.Vector2;

View File

@ -5,7 +5,7 @@
* reference the LICENSE file in the common/api directory.
*/
package com.dfsek.terra.api.structure.rotation;
package com.dfsek.terra.api.util;
import net.jafama.FastMath;

View File

@ -0,0 +1,86 @@
package com.dfsek.terra.api.util.vector.integer;
import com.dfsek.terra.api.util.Rotation;
/**
* oh yeah
*/
public class Vector2Int {
private final int x;
private final int z;
private static final Vector2Int ZERO = new Vector2Int(0, 0);
private static final Vector2Int UNIT = new Vector2Int(0, 1);
protected Vector2Int(int x, int z) {
this.x = x;
this.z = z;
}
public static Vector2Int zero() {
return ZERO;
}
public static Vector2Int unit() {
return UNIT;
}
public static Vector2Int of(int x, int z) {
return new Vector2Int(x, z);
}
public int getX() {
return x;
}
public int getZ() {
return z;
}
public Vector3Int toVector3(int y) {
return new Vector3Int(x, y, z);
}
public Mutable mutable() {
return new Mutable(x, z);
}
public Vector2Int rotate(Rotation rotation) {
return switch(rotation) {
case CW_90 -> of(z, -x);
case CCW_90 -> of(-z, x);
case CW_180 -> of(-x, -z);
default -> this;
};
}
public static class Mutable {
private int x, z;
protected Mutable(int x, int z) {
this.x = x;
this.z = z;
}
public int getZ() {
return z;
}
public int getX() {
return x;
}
public void setZ(int z) {
this.z = z;
}
public void setX(int x) {
this.x = x;
}
public Vector2Int immutable() {
return new Vector2Int(x, z);
}
}
}

View File

@ -0,0 +1,80 @@
package com.dfsek.terra.api.util.vector.integer;
public class Vector3Int {
private final int x, y, z;
private static final Vector3Int ZERO = new Vector3Int(0, 0, 0);
private static final Vector3Int UNIT = new Vector3Int(0, 1, 0);
protected Vector3Int(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getZ() {
return z;
}
public Mutable mutable() {
return new Mutable(x, y, z);
}
public static Vector3Int unit() {
return UNIT;
}
public static Vector3Int zero() {
return ZERO;
}
public static Vector3Int of(int x, int y, int z) {
return new Vector3Int(x, y, z);
}
public static class Mutable {
private int x, y, z;
protected Mutable(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public void setZ(int z) {
this.z = z;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getZ() {
return z;
}
public Vector3Int immutable() {
return Vector3Int.of(x, y, z);
}
}
}