mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2026-06-19 15:21:19 +00:00
Merge pull request #961 from CocoTheOwner/slopes-rotation
Implements slope rotation
This commit is contained in:
@@ -30,16 +30,14 @@ import com.volmit.iris.util.data.B;
|
|||||||
import com.volmit.iris.util.format.Form;
|
import com.volmit.iris.util.format.Form;
|
||||||
import com.volmit.iris.util.interpolation.IrisInterpolation;
|
import com.volmit.iris.util.interpolation.IrisInterpolation;
|
||||||
import com.volmit.iris.util.json.JSONObject;
|
import com.volmit.iris.util.json.JSONObject;
|
||||||
import com.volmit.iris.util.math.AxisAlignedBB;
|
import com.volmit.iris.util.math.*;
|
||||||
import com.volmit.iris.util.math.BlockPosition;
|
|
||||||
import com.volmit.iris.util.math.Position2;
|
|
||||||
import com.volmit.iris.util.math.RNG;
|
|
||||||
import com.volmit.iris.util.matter.MatterMarker;
|
import com.volmit.iris.util.matter.MatterMarker;
|
||||||
import com.volmit.iris.util.parallel.BurstExecutor;
|
import com.volmit.iris.util.parallel.BurstExecutor;
|
||||||
import com.volmit.iris.util.parallel.MultiBurst;
|
import com.volmit.iris.util.parallel.MultiBurst;
|
||||||
import com.volmit.iris.util.plugin.VolmitSender;
|
import com.volmit.iris.util.plugin.VolmitSender;
|
||||||
import com.volmit.iris.util.scheduling.IrisLock;
|
import com.volmit.iris.util.scheduling.IrisLock;
|
||||||
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
|
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
|
||||||
|
import com.volmit.iris.util.stream.ProceduralStream;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
@@ -496,12 +494,29 @@ public class IrisObject extends IrisRegistrant {
|
|||||||
public int place(int x, int yv, int z, IObjectPlacer oplacer, IrisObjectPlacement config, RNG rng, BiConsumer<BlockPosition, BlockData> listener, CarveResult c, IrisData rdata) {
|
public int place(int x, int yv, int z, IObjectPlacer oplacer, IrisObjectPlacement config, RNG rng, BiConsumer<BlockPosition, BlockData> listener, CarveResult c, IrisData rdata) {
|
||||||
IObjectPlacer placer = (config.getHeightmap() != null) ? new HeightmapObjectPlacer(oplacer.getEngine() == null ? IrisContext.get().getEngine() : oplacer.getEngine(), rng, x, yv, z, config, oplacer) : oplacer;
|
IObjectPlacer placer = (config.getHeightmap() != null) ? new HeightmapObjectPlacer(oplacer.getEngine() == null ? IrisContext.get().getEngine() : oplacer.getEngine(), rng, x, yv, z, config, oplacer) : oplacer;
|
||||||
|
|
||||||
// Slope calculation
|
// Rotation calculation
|
||||||
if (!config.getSlopeCondition().isDefault() &&
|
int slopeRotationY = 0;
|
||||||
!config.getSlopeCondition().isValid(rdata.getEngine().getComplex().getSlopeStream().get(x, z)))
|
ProceduralStream<Double> heightStream = rdata.getEngine().getComplex().getHeightStream();
|
||||||
{
|
if (config.isRotateTowardsSlope()) {
|
||||||
return -1;
|
// Whichever side of the rectangle that bounds the object is lowest is the 'direction' of the slope (simply said).
|
||||||
|
double hNorth = heightStream.get(x, z + ((float)d) / 2);
|
||||||
|
double hEast = heightStream.get(x + ((float)w) / 2, z);
|
||||||
|
double hSouth = heightStream.get(x, z - ((float)d) / 2);
|
||||||
|
double hWest = heightStream.get(x - ((float)w) / 2, z);
|
||||||
|
double min = Math.min(Math.min(hNorth, hEast), Math.min(hSouth, hWest));
|
||||||
|
if (min == hNorth) {
|
||||||
|
slopeRotationY = 0;
|
||||||
|
} else if (min == hEast) {
|
||||||
|
slopeRotationY = 90;
|
||||||
|
} else if (min == hSouth) {
|
||||||
|
slopeRotationY = 180;
|
||||||
|
} else if (min == hWest) {
|
||||||
|
slopeRotationY = 270;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
double newRotation = config.getRotation().getYAxis().getMin() + slopeRotationY;
|
||||||
|
config.getRotation().setYAxis(new IrisAxisRotationClamp(true, false, newRotation, newRotation, 360));
|
||||||
|
config.getRotation().setEnabled(true);
|
||||||
|
|
||||||
if (config.isSmartBore()) {
|
if (config.isSmartBore()) {
|
||||||
ensureSmartBored(placer.isDebugSmartBore());
|
ensureSmartBored(placer.isDebugSmartBore());
|
||||||
|
|||||||
@@ -62,8 +62,9 @@ public class IrisObjectPlacement {
|
|||||||
private double snow = 0;
|
private double snow = 0;
|
||||||
@Desc("Whether or not this object can be targeted by a dolphin.")
|
@Desc("Whether or not this object can be targeted by a dolphin.")
|
||||||
private boolean isDolphinTarget = false;
|
private boolean isDolphinTarget = false;
|
||||||
@Desc("The slope at which this object can be placed. Range from 0 to 10 by default. Calculated from the corners of the object.")
|
@Desc("Set to true to add the rotation of the direction of the slope of the terrain (wherever the slope is going down) to the y-axis rotation of the object." +
|
||||||
private IrisSlopeClip slopeCondition = new IrisSlopeClip();
|
"Rounded to 90 degrees. Adds the *min* rotation of the y axis as well (to still allow you to rotate objects nicely). Discards *max* and *interval* on *yaxis*")
|
||||||
|
private boolean rotateTowardsSlope = false;
|
||||||
@MinNumber(0)
|
@MinNumber(0)
|
||||||
@MaxNumber(1)
|
@MaxNumber(1)
|
||||||
@Desc("The chance for this to place in a chunk. If you need multiple per chunk, set this to 1 and use density.")
|
@Desc("The chance for this to place in a chunk. If you need multiple per chunk, set this to 1 and use density.")
|
||||||
|
|||||||
Reference in New Issue
Block a user