diff --git a/src/main/java/com/volmit/iris/core/loader/IrisData.java b/src/main/java/com/volmit/iris/core/loader/IrisData.java
index f610033f7..1c8b2380b 100644
--- a/src/main/java/com/volmit/iris/core/loader/IrisData.java
+++ b/src/main/java/com/volmit/iris/core/loader/IrisData.java
@@ -33,6 +33,7 @@ import com.volmit.iris.engine.data.cache.AtomicCache;
import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.object.*;
import com.volmit.iris.engine.object.annotations.Snippet;
+import com.volmit.iris.engine.object.matter.IrisMatterObject;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.context.IrisContext;
diff --git a/src/main/java/com/volmit/iris/core/loader/MatterObjectResourceLoader.java b/src/main/java/com/volmit/iris/core/loader/MatterObjectResourceLoader.java
index d828f723e..28ee0d1f6 100644
--- a/src/main/java/com/volmit/iris/core/loader/MatterObjectResourceLoader.java
+++ b/src/main/java/com/volmit/iris/core/loader/MatterObjectResourceLoader.java
@@ -20,8 +20,7 @@ package com.volmit.iris.core.loader;
import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings;
-import com.volmit.iris.engine.object.IrisMatterObject;
-import com.volmit.iris.engine.object.IrisObject;
+import com.volmit.iris.engine.object.matter.IrisMatterObject;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KSet;
import com.volmit.iris.util.data.KCache;
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisMatterPlacement.java b/src/main/java/com/volmit/iris/engine/object/IrisMatterPlacement.java
deleted file mode 100644
index 4641b2efc..000000000
--- a/src/main/java/com/volmit/iris/engine/object/IrisMatterPlacement.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Iris is a World Generator for Minecraft Bukkit Servers
- * Copyright (c) 2022 Arcane Arts (Volmit Software)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package com.volmit.iris.engine.object;
-
-import com.volmit.iris.core.loader.ObjectResourceLoader;
-import com.volmit.iris.engine.object.annotations.*;
-import com.volmit.iris.util.collection.KList;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.experimental.Accessors;
-
-@Snippet("matter-placer")
-@EqualsAndHashCode()
-@Accessors(chain = true)
-@NoArgsConstructor
-@Desc("Represents an iris object placer. It places matter objects.")
-@Data
-public class IrisMatterPlacement {
- @RegistryListResource(IrisMatterObject.class)
- @Required
- @ArrayType(min = 1, type = String.class)
- @Desc("List of objects to place")
- private KList place = new KList<>();
-}
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObject.java b/src/main/java/com/volmit/iris/engine/object/IrisObject.java
index 14c999103..b0f34e31d 100644
--- a/src/main/java/com/volmit/iris/engine/object/IrisObject.java
+++ b/src/main/java/com/volmit/iris/engine/object/IrisObject.java
@@ -34,6 +34,8 @@ import com.volmit.iris.util.math.AxisAlignedBB;
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.IrisMatter;
+import com.volmit.iris.util.matter.Matter;
import com.volmit.iris.util.matter.MatterMarker;
import com.volmit.iris.util.parallel.BurstExecutor;
import com.volmit.iris.util.parallel.MultiBurst;
diff --git a/src/main/java/com/volmit/iris/engine/object/IrisMatterObject.java b/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterObject.java
similarity index 91%
rename from src/main/java/com/volmit/iris/engine/object/IrisMatterObject.java
rename to src/main/java/com/volmit/iris/engine/object/matter/IrisMatterObject.java
index 3d5186ff2..8ea9e35f6 100644
--- a/src/main/java/com/volmit/iris/engine/object/IrisMatterObject.java
+++ b/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterObject.java
@@ -1,12 +1,11 @@
-package com.volmit.iris.engine.object;
+package com.volmit.iris.engine.object.matter;
-import com.volmit.iris.core.loader.IrisData;
import com.volmit.iris.core.loader.IrisRegistrant;
+import com.volmit.iris.engine.object.IrisObject;
import com.volmit.iris.util.json.JSONObject;
import com.volmit.iris.util.matter.IrisMatter;
import com.volmit.iris.util.matter.Matter;
import com.volmit.iris.util.plugin.VolmitSender;
-import jdk.jfr.DataAmount;
import lombok.Data;
import java.io.File;
diff --git a/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacement.java b/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacement.java
new file mode 100644
index 000000000..e85f102d9
--- /dev/null
+++ b/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacement.java
@@ -0,0 +1,93 @@
+/*
+ * Iris is a World Generator for Minecraft Bukkit Servers
+ * Copyright (c) 2022 Arcane Arts (Volmit Software)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.volmit.iris.engine.object.matter;
+
+import com.volmit.iris.core.loader.IrisData;
+import com.volmit.iris.engine.IrisEngine;
+import com.volmit.iris.engine.object.IRare;
+import com.volmit.iris.engine.object.IrisStyledRange;
+import com.volmit.iris.engine.object.annotations.*;
+import com.volmit.iris.util.collection.KList;
+import com.volmit.iris.util.mantle.Mantle;
+import com.volmit.iris.util.math.RNG;
+import com.volmit.iris.util.matter.MatterSlice;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@Snippet("matter-placer")
+@EqualsAndHashCode()
+@Accessors(chain = true)
+@NoArgsConstructor
+@Desc("Represents an iris object placer. It places matter objects.")
+@Data
+public class IrisMatterPlacement implements IRare {
+ @RegistryListResource(IrisMatterObject.class)
+ @Required
+ @ArrayType(min = 1, type = String.class)
+ @Desc("List of objects to place")
+ private KList place = new KList<>();
+
+ @MinNumber(0)
+ @Desc("The rarity of this object placing")
+ private int rarity = 0;
+
+ @MinNumber(0)
+ @Desc("The styled density of this object")
+ private IrisStyledRange densityRange;
+
+ @Desc("The absolute density for this object")
+ private double density = 1;
+
+ @Desc("Translate this matter object before placement")
+ private IrisMatterTranslate translate;
+
+ @Desc("Place this object on the surface height, bedrock or the sky, then use translate if need be.")
+ private IrisMatterPlacementLocation location = IrisMatterPlacementLocation.SURFACE;
+
+ public void place(IrisEngine engine, IrisData data, RNG rng, int ax, int az)
+ {
+ IrisMatterObject object = data.getMatterLoader().load(place.getRandom(rng));
+ int x = ax;
+ int z = az;
+ int yoff = 0;
+
+ if(translate != null)
+ {
+ x += translate.xOffset(data, rng, x, z);
+ yoff += translate.yOffset(data, rng, x, z);
+ z += translate.zOffset(data, rng, x, z);
+ }
+
+ int y = yoff + location.at(engine, x, z);
+ Mantle mantle = engine.getMantle().getMantle();
+
+ int xx = x;
+ int yy = y;
+ int zz = z;
+
+ for(MatterSlice> slice : object.getMatter().getSliceMap().values())
+ {
+ slice.iterate((mx, my, mz, v) -> {
+ mantle.set(xx + mx, yy + my, zz + mz, v);
+ });
+ }
+ }
+}
diff --git a/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacementLocation.java b/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacementLocation.java
new file mode 100644
index 000000000..ed9f1b762
--- /dev/null
+++ b/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterPlacementLocation.java
@@ -0,0 +1,24 @@
+package com.volmit.iris.engine.object.matter;
+
+import com.volmit.iris.engine.IrisEngine;
+import com.volmit.iris.util.function.Function3;
+
+import java.util.function.Function;
+
+public enum IrisMatterPlacementLocation {
+ SURFACE((e, x, z) -> e.getHeight(x, z, true)),
+ SURFACE_ON_FLUID((e, x, z) -> e.getHeight(x, z, false)),
+ BEDROCK((e, x, z) -> 0),
+ SKY((e, x, z) -> e.getHeight());
+
+ private final Function3 computer;
+
+ private IrisMatterPlacementLocation(Function3 computer)
+ {
+ this.computer = computer;
+ }
+
+ public int at(IrisEngine engine, int x, int z) {
+ return computer.apply(engine, x, z);
+ }
+}
diff --git a/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterTranslate.java b/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterTranslate.java
new file mode 100644
index 000000000..7b7e599c9
--- /dev/null
+++ b/src/main/java/com/volmit/iris/engine/object/matter/IrisMatterTranslate.java
@@ -0,0 +1,63 @@
+package com.volmit.iris.engine.object.matter;
+
+import com.volmit.iris.core.loader.IrisData;
+import com.volmit.iris.engine.IrisEngine;
+import com.volmit.iris.engine.object.IrisStyledRange;
+import com.volmit.iris.engine.object.annotations.Desc;
+import com.volmit.iris.util.math.RNG;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode()
+@Accessors(chain = true)
+@Desc("Represents a matter translator")
+public class IrisMatterTranslate {
+ @Desc("For varied coordinate shifts use ranges not the literal coordinate")
+ private IrisStyledRange rangeX = null;
+ @Desc("For varied coordinate shifts use ranges not the literal coordinate")
+ private IrisStyledRange rangeY = null;
+ @Desc("For varied coordinate shifts use ranges not the literal coordinate")
+ private IrisStyledRange rangeZ = null;
+ @Desc("Define an absolute shift instead of varied.")
+ private int x = 0;
+ @Desc("Define an absolute shift instead of varied.")
+ private int y = 0;
+ @Desc("Define an absolute shift instead of varied.")
+ private int z = 0;
+
+ public int xOffset(IrisData data, RNG rng, int rx, int rz)
+ {
+ if(rangeX != null)
+ {
+ return (int) Math.round(rangeX.get(rng, rx, rz, data));
+ }
+
+ return x;
+ }
+
+ public int yOffset(IrisData data, RNG rng, int rx, int rz)
+ {
+ if(rangeY != null)
+ {
+ return (int) Math.round(rangeY.get(rng, rx, rz, data));
+ }
+
+ return y;
+ }
+
+ public int zOffset(IrisData data, RNG rng, int rx, int rz)
+ {
+ if(rangeZ != null)
+ {
+ return (int) Math.round(rangeZ.get(rng, rx, rz, data));
+ }
+
+ return z;
+ }
+}
diff --git a/src/main/java/com/volmit/iris/util/mantle/Mantle.java b/src/main/java/com/volmit/iris/util/mantle/Mantle.java
index d548919f9..1150cb17d 100644
--- a/src/main/java/com/volmit/iris/util/mantle/Mantle.java
+++ b/src/main/java/com/volmit/iris/util/mantle/Mantle.java
@@ -379,6 +379,14 @@ public class Mantle {
return closed.get();
}
+ public void set(int x, int y, int z, Matter matter)
+ {
+ for(MatterSlice> i : matter.getSliceMap().values())
+ {
+ i.iterate((mx, my, mz, v) -> set(mx + x, my + y, mz + z, v));
+ }
+ }
+
/**
* Closes the Mantle. By closing the mantle, you can no longer read or writeNodeData
* any data to the mantle or it's Tectonic Plates. Closing will also flush any