Class SpiralGen
java.lang.Object
net.rodofire.easierworldcreator.shape.block.instanciator.AbstractBlockShape
net.rodofire.easierworldcreator.shape.block.gen.SpiralGen
Class to generate spiral related shapes
The Main purpose of this class is to generate the coordinates based on a shape. The coordinates are organized depending on a
The Main purpose of this class is to generate the coordinates based on a shape. The coordinates are organized depending on a
Map<ChunkPos, LongOpenHashSet>.
It emply some things:
- The coordinates are divided in chunk
- It uses
LongOpenHashSetfor several reasons.- First, We use a set to avoid doing unnecessary calculations on the shape. It ensures that no duplicate is present.
- Second, it compresses the BlockPos: The
BlockPosare saved under long usingLongPosHelper. It saves some memory since that we save four bytes of data for eachBlockPos, and there should not have overhead since that we use primitive data type. - Third, since that we use primitive data types and that they take less memory,
coordinate generation, accession or deletion is much faster than using a
Set<BlockPos>. Encoding and decoding blockPos and then adding it intoLongOpenHashSetis extremely faster compared to only adding aBlockPos. ~60- 70% facter.
Dividing Coordinates into Chunk has some advantages :
- allow a multithreaded block assignement when using
LayerManager - allow to be used during WG, when using
DividedBlockListManageror when placing usingShapePlacer
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enumset every possible spiral shape of the mod -
Field Summary
Fields inherited from class net.rodofire.easierworldcreator.shape.block.instanciator.AbstractBlockShape
centerPos, centerX, centerY, centerZ, chunkMap, covered, lastChunkX, lastChunkZ, rotator -
Constructor Summary
ConstructorsConstructorDescriptionSpiralGen(@NotNull net.minecraft.util.math.BlockPos pos, int radius, int height) SpiralGen(@NotNull net.minecraft.util.math.BlockPos pos, Rotator rotator, net.minecraft.util.Pair<Integer, Integer> radiusX, net.minecraft.util.Pair<Integer, Integer> radiusZ, int height, float turnNumber) init the Spiral Shape -
Method Summary
Modifier and TypeMethodDescriptionit.unimi.dsi.fastutil.longs.LongOpenHashSetMethod to know the chunks that will be covered by the shape.Map<net.minecraft.util.math.ChunkPos, it.unimi.dsi.fastutil.longs.LongOpenHashSet> method to get the coordinates that will be placed latervoidplace(net.minecraft.world.StructureWorldAccess world, BlockLayerManager blockLayerManager) if you don't need to use a shape layer, you can directly place the shape to avoid allocating unnecessary posvoidsetHeight(int height) voidsetHelicoidAngle(net.minecraft.util.Pair<Integer, Integer> helicoidAngle) voidsetOutlineRadiusX(int outlineRadiusX) voidsetOutlineRadiusZ(int outlineRadiusZ) voidsetRadiusX(net.minecraft.util.Pair<Integer, Integer> radiusX) voidsetRadiusZ(net.minecraft.util.Pair<Integer, Integer> radiusZ) voidsetSpiralFilling(float spiralFilling) voidsetSpiralOffset(int spiralOffset) voidsetSpiralType(SpiralGen.SpiralType spiralType) voidsetTurnNumber(float turnNumber) Methods inherited from class net.rodofire.easierworldcreator.shape.block.instanciator.AbstractBlockShape
modifyChunkMap, setRotator, shouldAddChunk, shouldAddChunkPrecomputedX
-
Constructor Details
-
SpiralGen
public SpiralGen(@NotNull @NotNull net.minecraft.util.math.BlockPos pos, Rotator rotator, net.minecraft.util.Pair<Integer, Integer> radiusX, net.minecraft.util.Pair<Integer, Integer> radiusZ, int height, float turnNumber) init the Spiral Shape- Parameters:
pos- the center of the spiralradiusX- the radius on the x-axis. The first value corresponding to the radius at the base of the spiral, the second, corresponding to the radius at the top of the spiralradiusZ- the radius on the z-axis. The first value corresponding to the radius at the base of the spiral, the second, corresponding to the radius at the top of the spiralheight- the height of the spiralturnNumber- the number of turn that the spiral will do (ex: 1 -> 1 turn, 3.5 -> 3.5 turn)
-
SpiralGen
public SpiralGen(@NotNull @NotNull net.minecraft.util.math.BlockPos pos, int radius, int height) - Parameters:
pos- the center of the spiralradius- the radius of the spiralheight- the height of the spiral
-
-
Method Details
-
setOutlineRadiusZ
public void setOutlineRadiusZ(int outlineRadiusZ) -
setOutlineRadiusX
public void setOutlineRadiusX(int outlineRadiusX) -
setSpiralFilling
public void setSpiralFilling(float spiralFilling) -
setSpiralType
-
setHeight
public void setHeight(int height) -
setRadiusZ
-
setRadiusX
-
setTurnNumber
public void setTurnNumber(float turnNumber) -
setSpiralOffset
public void setSpiralOffset(int spiralOffset) - Parameters:
spiralOffset- the offset of the start of the spiral
-
setHelicoidAngle
- Parameters:
helicoidAngle- the start and the end angle of the blocks on the side
-
getShapeCoordinates
public Map<net.minecraft.util.math.ChunkPos,it.unimi.dsi.fastutil.longs.LongOpenHashSet> getShapeCoordinates()Description copied from class:AbstractBlockShapemethod to get the coordinates that will be placed later- Specified by:
getShapeCoordinatesin classAbstractBlockShape- Returns:
- a map of ChunkPos of blockPos for every shape
-
getCoveredChunks
public it.unimi.dsi.fastutil.longs.LongOpenHashSet getCoveredChunks()Description copied from class:AbstractBlockShapeMethod to know the chunks that will be covered by the shape. This avoids generating all the structure, enhancing performance- Specified by:
getCoveredChunksin classAbstractBlockShape- Returns:
- a set of chunkPos.
For performance reasons, we use long instead of
ChunkPos.To convert the long into a
ChunkPos, use the long in a constructor.
-
place
public void place(net.minecraft.world.StructureWorldAccess world, BlockLayerManager blockLayerManager) Description copied from class:AbstractBlockShapeif you don't need to use a shape layer, you can directly place the shape to avoid allocating unnecessary pos- Specified by:
placein classAbstractBlockShape
-