diff --git a/examples/processes/voxelizers.yaml b/examples/processes/voxelizers.yaml new file mode 100644 index 000000000..40bfb3fd0 --- /dev/null +++ b/examples/processes/voxelizers.yaml @@ -0,0 +1,69 @@ +heightmaps: + ground: + default: 0 + water: + default: 0 + +forEachTile: + + fetchAltitude: + type: fetchData + modelType: altitude + provider: + type: wmsFloat + url: https://data.geopf.fr/wms-r/wms + layer: RGEALTI-MNT_PYR-ZIP_FXX_LAMB93_WMS + processor: + type: floatMatrix + retry: 5 + retryDelay: 1 + + setAltitude: + after: fetchAltitude + type: populateHeightmap + models: + type: altitude + heightmap: ground + + setSpawn: + after: setAltitude + type: setSpawn + heightmap: + sum: [ground, 1] + x: 0 + y: 0 + + renderGround: + after: setAltitude + type: renderHeightmap + at: ground + place: + structure: + - put: *voxel-grass + at: [0, 0, 0] + - put: *voxel-dirt + at: [0, 0, -3..-1] + - put: *voxel-stone + at: [0, 0, -20..-4] + + fetchBuildings: + type: fetchData + modelType: buildings + provider: + type: wfs + url: https://data.geopf.fr/wfs/wfs + features: BDTOPO_V3:batiment + maxFeaturesPerQuery: 500 + + renderBuildings: + after: fetchBuildings + type: place + models: + type: buildings + voxels: + type: setAltitude + voxels: + type: surface + altitude: ground + place: default:sand + diff --git a/src/main/java/com/ignfab/minalac/generator/MinalacGenerator.java b/src/main/java/com/ignfab/minalac/generator/MinalacGenerator.java index 99e5f1cf4..df58e893a 100644 --- a/src/main/java/com/ignfab/minalac/generator/MinalacGenerator.java +++ b/src/main/java/com/ignfab/minalac/generator/MinalacGenerator.java @@ -40,6 +40,7 @@ import com.ignfab.minalac.generator.parameters.tasks.FillBetweenHeightmapAndMetadataTaskParams; import com.ignfab.minalac.generator.parameters.tasks.HeightmapStatsTaskParams; import com.ignfab.minalac.generator.parameters.tasks.NoOperationTaskParams; +import com.ignfab.minalac.generator.parameters.tasks.PlaceTaskParams; import com.ignfab.minalac.generator.parameters.tasks.PopulateHeightmapTaskParams; import com.ignfab.minalac.generator.parameters.tasks.RenderBuildingsTaskParams; import com.ignfab.minalac.generator.parameters.tasks.RenderHeightmapTaskParams; @@ -51,6 +52,8 @@ import com.ignfab.minalac.generator.parameters.tasks.ScheduleTaskParams; import com.ignfab.minalac.generator.parameters.tasks.SequenceTaskParams; import com.ignfab.minalac.generator.parameters.tasks.SetSpawnTaskParams; +import com.ignfab.minalac.generator.parameters.voxelizers.voxelizers2d.Voxelizer2dParams; +import com.ignfab.minalac.generator.parameters.voxelizers.voxelizers3d.Voxelizer3dParams; import com.ignfab.minalac.generator.utils.FileHelpers; import com.ignfab.minalac.generator.utils.execution.TaskFailedException; import com.ignfab.minalac.generator.utils.modules.ModulesLoader; @@ -124,6 +127,7 @@ public static void main(String[] args) throws FactoryException, InterruptedExcep parser.registerParams("computeHeightmapStats", HeightmapStatsTaskParams.class); parser.registerParams("fetchData", FetchDataTaskParams.class); parser.registerParams("fillBetweenHeightmapAndMetadata", FillBetweenHeightmapAndMetadataTaskParams.class); + parser.registerParams("place", PlaceTaskParams.class); parser.registerParams("populateHeightmap", PopulateHeightmapTaskParams.class); parser.registerParams("renderBuildings", RenderBuildingsTaskParams.class); parser.registerParams("renderHeightmap", RenderHeightmapTaskParams.class); @@ -155,6 +159,9 @@ public static void main(String[] args) throws FactoryException, InterruptedExcep parser.registerParams("geometryBuffer", JTSGeometryBufferPostProcessorParams.class); parser.registerParams("remap", MetadataValueMappingPostProcessorParams.class); + Voxelizer2dParams.register(parser); + Voxelizer3dParams.register(parser); + modules.registerParams(parser); Generation generation = parser.parse(parameters).create(destination, maxTileSize); diff --git a/src/main/java/com/ignfab/minalac/generator/generation/Generation.java b/src/main/java/com/ignfab/minalac/generator/generation/Generation.java index 6f1fae4f9..92622c03f 100644 --- a/src/main/java/com/ignfab/minalac/generator/generation/Generation.java +++ b/src/main/java/com/ignfab/minalac/generator/generation/Generation.java @@ -51,6 +51,22 @@ public class Generation { private final Collection tiles; private final Iterator tileIterator; + + private static Generation currentGeneration = null; + + /** + * @return current generation. + */ + public static Generation current() { + if (currentGeneration == null) + throw new IllegalStateException("No current generation!"); + return currentGeneration; + } + + /* package private */ static void setCurrent(Generation generation) { + currentGeneration = generation; + } + /** * Constructs a new generation context. * It sets {@code VoxelWorld}'s limits in way the center is at {@code WorldCoords2d} (0, 0). @@ -115,6 +131,9 @@ public Generation( voxelToCrs.rotate(angle); voxelToCrs.scale(horizontalScale, horizontalScale); voxelToCrs.translate(centerX, centerY); + + // TODO: MANAGE THAT WITH SCOPED VALUES + setCurrent(this); } /** diff --git a/src/main/java/com/ignfab/minalac/generator/models/FloatMatrixModel.java b/src/main/java/com/ignfab/minalac/generator/models/FloatMatrixModel.java index d6dbc8098..3af21966f 100644 --- a/src/main/java/com/ignfab/minalac/generator/models/FloatMatrixModel.java +++ b/src/main/java/com/ignfab/minalac/generator/models/FloatMatrixModel.java @@ -7,7 +7,7 @@ import com.ignfab.minalac.generator.utils.coordinates.WorldToMapConverter; import com.ignfab.minalac.generator.utils.world2d.WorldBBox2d; import com.ignfab.minalac.generator.utils.world2d.WorldCoords2d; -import com.ignfab.minalac.generator.voxelization.Matrix2d; +import com.ignfab.minalac.generator.voxelization.matrix2d.Matrix2d; /** * A model based on a matrix of floats (usually a heightmap model). diff --git a/src/main/java/com/ignfab/minalac/generator/models/Voxelizable2d.java b/src/main/java/com/ignfab/minalac/generator/models/Voxelizable2d.java deleted file mode 100644 index f6e9df569..000000000 --- a/src/main/java/com/ignfab/minalac/generator/models/Voxelizable2d.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.ignfab.minalac.generator.models; - -import com.ignfab.minalac.generator.utils.world2d.WorldBBox2d; -import com.ignfab.minalac.generator.voxelization.Voxelizer2d; - -/** - * Represents a model that can be transformed into 2d voxels using a voxelizer. - */ -public interface Voxelizable2d extends Model { - /** - * Provides a voxelizer that returns voxels representing this model in 2d. - * The voxelizer must only return voxels inside the given bounding box. - *

- * Note that the voxelizer is not required to: - *

- * - * @param bbox the limits for this voxelization. - * @return a {@link Voxelizer2d} to represent this object in 2d voxels. - */ - Voxelizer2d voxelize2d(WorldBBox2d bbox); -} diff --git a/src/main/java/com/ignfab/minalac/generator/models/Voxelizable3d.java b/src/main/java/com/ignfab/minalac/generator/models/Voxelizable3d.java deleted file mode 100644 index e16af2ecc..000000000 --- a/src/main/java/com/ignfab/minalac/generator/models/Voxelizable3d.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.ignfab.minalac.generator.models; - -import com.ignfab.minalac.generator.utils.world3d.WorldBBox3d; -import com.ignfab.minalac.generator.voxelization.Voxelizer3d; - -/** - * Represents an object that can be transformed into 3d voxels using a voxelizer. - * This interface usually applies to models. - * Most models representable in 3d can also be represented in 2d, but this is not always the case! - */ -public interface Voxelizable3d extends Model { - /** - * Provides a voxelizer that returns voxels representing this model in 3d. - * The voxelizer must only return voxels inside the given bounding box. - *

- * Note that the voxelizer is not required to: - *

- * - * @param bbox the limits for this voxelization. - * @return a {@link Voxelizer3d} to represent this object in 3d voxels. - */ - Voxelizer3d voxelize3d(WorldBBox3d bbox); -} diff --git a/src/main/java/com/ignfab/minalac/generator/parameters/tasks/PlaceTaskParams.java b/src/main/java/com/ignfab/minalac/generator/parameters/tasks/PlaceTaskParams.java new file mode 100644 index 000000000..6eccdb877 --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/parameters/tasks/PlaceTaskParams.java @@ -0,0 +1,59 @@ +package com.ignfab.minalac.generator.parameters.tasks; + +import java.beans.ConstructorProperties; + +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; + +import com.ignfab.minalac.generator.generation.Generation; +import com.ignfab.minalac.generator.parameters.placeables.PlaceableParams; +import com.ignfab.minalac.generator.parameters.voxelizers.voxelizers3d.Voxelizer3dParams; +import com.ignfab.minalac.generator.tasks.PlaceTask; +import com.ignfab.minalac.generator.utils.execution.Task; + +/** + * Parameters for a {@link PlaceTask}. + */ +public class PlaceTaskParams extends ModelTaskParams { + + /** + * Voxelizer to use to determine where to place (required). + */ + @JsonSetter(nulls = Nulls.FAIL) + public Voxelizer3dParams voxels; + + /** + * Placeable to place at points (required). + */ + @JsonSetter(nulls = Nulls.FAIL) + public PlaceableParams place; + + /** + * Constructor used to ensure that the required fields are present during deserialization. + * + * @param voxels where to place + * @param place what to place + */ + @ConstructorProperties({ "voxels", "place"}) + public PlaceTaskParams(Voxelizer3dParams voxels, PlaceableParams place) { + this.voxels = voxels; + this.place = place; + } + + @Override + public void validate() { + super.validate(); + voxels.validate(); + place.validate(); + } + + @Override + public Task create(Generation generation) { + return new PlaceTask( + models.create(), + voxels.create(), + place.create(generation.seed()) + ); + } + +} diff --git a/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/PointVoxelizer2dParams.java b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/PointVoxelizer2dParams.java new file mode 100644 index 000000000..9d8496db8 --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/PointVoxelizer2dParams.java @@ -0,0 +1,15 @@ +package com.ignfab.minalac.generator.parameters.voxelizers.voxelizers2d; + +import com.ignfab.minalac.generator.voxelization.Voxelizer2d; +import com.ignfab.minalac.generator.voxelization.shape2d.voxelizer.PointVoxelizer2d; + +/** + * Parameters for a {@link PointVoxelizer2d}. + */ +public class PointVoxelizer2dParams extends Voxelizer2dParams { + + @Override + public Voxelizer2d create() { + return new PointVoxelizer2d(); + } +} diff --git a/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/SurfaceVoxelizer2dParams.java b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/SurfaceVoxelizer2dParams.java new file mode 100644 index 000000000..34adecc7c --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/SurfaceVoxelizer2dParams.java @@ -0,0 +1,15 @@ +package com.ignfab.minalac.generator.parameters.voxelizers.voxelizers2d; + +import com.ignfab.minalac.generator.voxelization.Voxelizer2d; +import com.ignfab.minalac.generator.voxelization.shape2d.voxelizer.SurfaceVoxelizer2d; + +/** + * Parameters for a {@link SurfaceVoxelizer2d}. + */ +public class SurfaceVoxelizer2dParams extends Voxelizer2dParams { + + @Override + public Voxelizer2d create() { + return new SurfaceVoxelizer2d(); + } +} diff --git a/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/ThickLineVoxelizer2dParams.java b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/ThickLineVoxelizer2dParams.java new file mode 100644 index 000000000..76fec9990 --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/ThickLineVoxelizer2dParams.java @@ -0,0 +1,24 @@ +package com.ignfab.minalac.generator.parameters.voxelizers.voxelizers2d; + +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; + +import com.ignfab.minalac.generator.voxelization.Voxelizer2d; +import com.ignfab.minalac.generator.voxelization.shape2d.voxelizer.ThickLinearIndexedVoxelizer2d; + +/** + * Parameters for a {@link ThickLinearIndexedVoxelizer2d}. + */ +public class ThickLineVoxelizer2dParams extends Voxelizer2dParams { + + /** + * Thickness of the line, in voxels. + */ + @JsonSetter(nulls = Nulls.SKIP) + public double thickness = 1.0; + + @Override + public Voxelizer2d create() { + return new ThickLinearIndexedVoxelizer2d(thickness); + } +} diff --git a/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/ThinLinearVoxelizer2dParams.java b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/ThinLinearVoxelizer2dParams.java new file mode 100644 index 000000000..f319194e8 --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/ThinLinearVoxelizer2dParams.java @@ -0,0 +1,15 @@ +package com.ignfab.minalac.generator.parameters.voxelizers.voxelizers2d; + +import com.ignfab.minalac.generator.voxelization.Voxelizer2d; +import com.ignfab.minalac.generator.voxelization.shape2d.voxelizer.ThinLinearVoxelizer2d; + +/** + * Parameters for a {@link ThinLinearVoxelizer2dParams}. + */ +public class ThinLinearVoxelizer2dParams extends Voxelizer2dParams { + + @Override + public Voxelizer2d create() { + return new ThinLinearVoxelizer2d(); + } +} diff --git a/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/ToVoxelizer2dParams.java b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/ToVoxelizer2dParams.java new file mode 100644 index 000000000..2ac50fa66 --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/ToVoxelizer2dParams.java @@ -0,0 +1,41 @@ +package com.ignfab.minalac.generator.parameters.voxelizers.voxelizers2d; + +import java.beans.ConstructorProperties; + +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; + +import com.ignfab.minalac.generator.parameters.voxelizers.voxelizers3d.Voxelizer3dParams; +import com.ignfab.minalac.generator.voxelization.ToVoxelizer2d; +import com.ignfab.minalac.generator.voxelization.Voxelizer2d; + +/** + * Parameters for a {@link ToVoxelizer2d}. + */ +public class ToVoxelizer2dParams extends Voxelizer2dParams { + /** + * Voxels (from voxelizer) to turn to 2d. + */ + @JsonSetter(nulls = Nulls.FAIL) + public Voxelizer3dParams voxels; + + /** + * Constructor used to ensure that the required fields are present during deserialization. + * + * @param voxels voxelizer to transform + */ + @ConstructorProperties({ "voxels" }) + public ToVoxelizer2dParams(Voxelizer3dParams voxels) { + this.voxels = voxels; + } + + @Override + public void validate() { + voxels.validate(); + } + + @Override + public Voxelizer2d create() { + return new ToVoxelizer2d(voxels.create()); + } +} diff --git a/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/Voxelizer2dParams.java b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/Voxelizer2dParams.java new file mode 100644 index 000000000..c8c6b2a27 --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers2d/Voxelizer2dParams.java @@ -0,0 +1,31 @@ +package com.ignfab.minalac.generator.parameters.voxelizers.voxelizers2d; + +import com.ignfab.minalac.generator.parameters.ParamsParser; +import com.ignfab.minalac.generator.parameters.PolymorphicParams; +import com.ignfab.minalac.generator.voxelization.Voxelizer2d; + +/** + * Parameters for a {@link Voxelizer2d}. + */ +public abstract class Voxelizer2dParams extends PolymorphicParams { + + /** + * Creates a {@link Voxelizer2d} from parameters. + * + * @return created voxelizer + */ + public abstract Voxelizer2d create(); + + /** + * Registers all voxelizers into a given {@link ParamsParser}. + * + * @param parser parser into which register voxelizers + */ + public static void register(ParamsParser parser) { + parser.registerParams("point", PointVoxelizer2dParams.class); + parser.registerParams("thickLine", ThickLineVoxelizer2dParams.class); + parser.registerParams("line", ThinLinearVoxelizer2dParams.class); + parser.registerParams("surface", SurfaceVoxelizer2dParams.class); + parser.registerParams("to2d", ToVoxelizer2dParams.class); + } +} diff --git a/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers3d/PointVoxelizer3dParams.java b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers3d/PointVoxelizer3dParams.java new file mode 100644 index 000000000..1b7165eb9 --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers3d/PointVoxelizer3dParams.java @@ -0,0 +1,15 @@ +package com.ignfab.minalac.generator.parameters.voxelizers.voxelizers3d; + +import com.ignfab.minalac.generator.voxelization.Voxelizer3d; +import com.ignfab.minalac.generator.voxelization.shape3d.voxelizer.PointVoxelizer3d; + +/** + * Parameters for a {@link PointVoxelizer3d}. + */ +public class PointVoxelizer3dParams extends Voxelizer3dParams { + + @Override + public Voxelizer3d create() { + return new PointVoxelizer3d(); + } +} diff --git a/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers3d/SetAtlitudeVoxelizer3dParams.java b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers3d/SetAtlitudeVoxelizer3dParams.java new file mode 100644 index 000000000..6f9e4fc54 --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers3d/SetAtlitudeVoxelizer3dParams.java @@ -0,0 +1,52 @@ +package com.ignfab.minalac.generator.parameters.voxelizers.voxelizers3d; + +import java.beans.ConstructorProperties; + +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; + +import com.ignfab.minalac.generator.generation.Generation; +import com.ignfab.minalac.generator.parameters.heightmaps.ReadableHeightmapParams; +import com.ignfab.minalac.generator.parameters.voxelizers.voxelizers2d.Voxelizer2dParams; +import com.ignfab.minalac.generator.voxelization.SetAltitudeVoxelizer3d; +import com.ignfab.minalac.generator.voxelization.Voxelizer3d; + +/** + * Parameters for a {@link SetAltitudeVoxelizer3d}. + */ +public class SetAtlitudeVoxelizer3dParams extends Voxelizer3dParams { + /** + * Voxels (from voxelizer) to turn to 3d. + */ + @JsonSetter(nulls = Nulls.FAIL) + public Voxelizer2dParams voxels; + + /** + * Altitude (from heightmap) to set as z-coordinate. + */ + @JsonSetter(nulls = Nulls.FAIL) + public ReadableHeightmapParams altitude; + + /** + * Constructor used to ensure that the required fields are present during deserialization. + * + * @param voxels voxelizer to transform + * @param altitude heightmap to fetch altitudes from + */ + @ConstructorProperties({ "voxels", "altitude" }) + public SetAtlitudeVoxelizer3dParams(Voxelizer2dParams voxels, ReadableHeightmapParams altitude) { + this.voxels = voxels; + this.altitude = altitude; + } + + @Override + public void validate() { + altitude.validate(); + voxels.validate(); + } + + @Override + public Voxelizer3d create() { + return new SetAltitudeVoxelizer3d(voxels.create(), altitude.create(Generation.current().heightmaps())); + } +} diff --git a/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers3d/ThickLineVoxelizer3dParams.java b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers3d/ThickLineVoxelizer3dParams.java new file mode 100644 index 000000000..662423636 --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers3d/ThickLineVoxelizer3dParams.java @@ -0,0 +1,24 @@ +package com.ignfab.minalac.generator.parameters.voxelizers.voxelizers3d; + +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; + +import com.ignfab.minalac.generator.voxelization.Voxelizer3d; +import com.ignfab.minalac.generator.voxelization.shape3d.voxelizer.ThickLinearIndexedVoxelizer2d5; + +/** + * Parameters for a {@link ThickLinearIndexedVoxelizer2d5}. + */ +public class ThickLineVoxelizer3dParams extends Voxelizer3dParams { + + /** + * Thickness of the line, in voxels. + */ + @JsonSetter(nulls = Nulls.SKIP) + public double thickness = 1.0; + + @Override + public Voxelizer3d create() { + return new ThickLinearIndexedVoxelizer2d5(thickness); + } +} diff --git a/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers3d/Voxelizer3dParams.java b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers3d/Voxelizer3dParams.java new file mode 100644 index 000000000..c4d339fef --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/parameters/voxelizers/voxelizers3d/Voxelizer3dParams.java @@ -0,0 +1,29 @@ +package com.ignfab.minalac.generator.parameters.voxelizers.voxelizers3d; + +import com.ignfab.minalac.generator.parameters.ParamsParser; +import com.ignfab.minalac.generator.parameters.PolymorphicParams; +import com.ignfab.minalac.generator.voxelization.Voxelizer3d; + +/** + * Parameters for a {@link Voxelizer3d}. + */ +public abstract class Voxelizer3dParams extends PolymorphicParams { + + /** + * Creates a {@link Voxelizer3d} from parameters. + * + * @return created voxelizer + */ + public abstract Voxelizer3d create(); + + /** + * Registers all voxelizers into a given {@link ParamsParser}. + * + * @param parser parser into which register voxelizers + */ + public static void register(ParamsParser parser) { + parser.registerParams("point", PointVoxelizer3dParams.class); + parser.registerParams("line", ThickLineVoxelizer3dParams.class); + parser.registerParams("setAltitude", SetAtlitudeVoxelizer3dParams.class); + } +} diff --git a/src/main/java/com/ignfab/minalac/generator/tasks/PlaceTask.java b/src/main/java/com/ignfab/minalac/generator/tasks/PlaceTask.java new file mode 100644 index 000000000..b800e5c55 --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/tasks/PlaceTask.java @@ -0,0 +1,35 @@ +package com.ignfab.minalac.generator.tasks; + +import com.ignfab.minalac.generator.generation.GenerationTile; +import com.ignfab.minalac.generator.models.Model; +import com.ignfab.minalac.generator.models.ModelSelection; +import com.ignfab.minalac.generator.placeables.Placeable; +import com.ignfab.minalac.generator.utils.world3d.Positioned3d; +import com.ignfab.minalac.generator.voxelization.Voxelizer3d; + +/** + * A task placing a placeable according to a given voxelizer. + */ +public class PlaceTask extends ModelTask { + private final Voxelizer3d voxelizer; + private final Placeable placeable; + + /** + * Creates a new {@code PlaceTask}. + * + * @param selection Selection of models to voxelize + * @param voxelizer Voxelizer to use + * @param placeable What to place on each voxel + */ + public PlaceTask(ModelSelection selection, Voxelizer3d voxelizer, Placeable placeable) { + super(Model.class, selection); + this.voxelizer = voxelizer; + this.placeable = placeable; + } + + @Override + protected void run(Model model, GenerationTile tile) { + for (Positioned3d pos : tile.limits().filterInside(voxelizer.voxelize(model))) + placeable.place(tile.voxels(), pos.coords()); + } +} diff --git a/src/main/java/com/ignfab/minalac/generator/tasks/PopulateHeightmapTask.java b/src/main/java/com/ignfab/minalac/generator/tasks/PopulateHeightmapTask.java index cf6cc3b90..307951569 100644 --- a/src/main/java/com/ignfab/minalac/generator/tasks/PopulateHeightmapTask.java +++ b/src/main/java/com/ignfab/minalac/generator/tasks/PopulateHeightmapTask.java @@ -7,7 +7,7 @@ import com.ignfab.minalac.generator.models.ModelSelection; import com.ignfab.minalac.generator.utils.world2d.WorldBBox2d; import com.ignfab.minalac.generator.utils.world2d.WorldCoords2d; -import com.ignfab.minalac.generator.voxelization.Matrix2d; +import com.ignfab.minalac.generator.voxelization.matrix2d.Matrix2d; /** * A {@link TileTask} copying data from a {@link ModelSelection} to a heightmap. diff --git a/src/main/java/com/ignfab/minalac/generator/tasks/RenderPoints2dTask.java b/src/main/java/com/ignfab/minalac/generator/tasks/RenderPoints2dTask.java index a93ea3cde..e4f0b900f 100644 --- a/src/main/java/com/ignfab/minalac/generator/tasks/RenderPoints2dTask.java +++ b/src/main/java/com/ignfab/minalac/generator/tasks/RenderPoints2dTask.java @@ -8,7 +8,7 @@ import com.ignfab.minalac.generator.placeables.Placeable; import com.ignfab.minalac.generator.utils.world2d.Positioned2d; import com.ignfab.minalac.generator.utils.world2d.WorldCoords2d; -import com.ignfab.minalac.generator.voxelization.shape2d.voxelizer.Point2dVoxelizer; +import com.ignfab.minalac.generator.voxelization.shape2d.voxelizer.PointVoxelizer2d; /** * A task rendering points by placing placeables at them. @@ -16,7 +16,7 @@ public class RenderPoints2dTask extends ModelTask { private final Placeable placeable; private final ReadableHeightmapSpec heightmapSpec; - private final Point2dVoxelizer voxelizer; + private final PointVoxelizer2d voxelizer; /** * Creates a new {@code RenderPoints2dTask}. @@ -33,7 +33,7 @@ public RenderPoints2dTask( super(Shape2dConvertibleModel.class, selection); this.placeable = placeable; this.heightmapSpec = heightmapSpec; - voxelizer = new Point2dVoxelizer(); + voxelizer = new PointVoxelizer2d(); } @Override diff --git a/src/main/java/com/ignfab/minalac/generator/tasks/RenderPointsTask.java b/src/main/java/com/ignfab/minalac/generator/tasks/RenderPointsTask.java index 8af23dd75..ee5a44d11 100644 --- a/src/main/java/com/ignfab/minalac/generator/tasks/RenderPointsTask.java +++ b/src/main/java/com/ignfab/minalac/generator/tasks/RenderPointsTask.java @@ -5,14 +5,14 @@ import com.ignfab.minalac.generator.models.Shape3dConvertibleModel; import com.ignfab.minalac.generator.placeables.Placeable; import com.ignfab.minalac.generator.utils.world3d.Positioned3d; -import com.ignfab.minalac.generator.voxelization.shape3d.voxelizer.Point3dVoxelizer; +import com.ignfab.minalac.generator.voxelization.shape3d.voxelizer.PointVoxelizer3d; /** * A task rendering points by placing placeables at them. */ public class RenderPointsTask extends ModelTask { private final Placeable placeable; - private final Point3dVoxelizer voxelizer; + private final PointVoxelizer3d voxelizer; /** * Creates a new {@code RenderPointsTask}. @@ -26,7 +26,7 @@ public RenderPointsTask( ) { super(Shape3dConvertibleModel.class, selection); this.placeable = placeable; - voxelizer = new Point3dVoxelizer(); + voxelizer = new PointVoxelizer3d(); } @Override diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/SetAltitudeVoxelizer3d.java b/src/main/java/com/ignfab/minalac/generator/voxelization/SetAltitudeVoxelizer3d.java new file mode 100644 index 000000000..e19a67b11 --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/SetAltitudeVoxelizer3d.java @@ -0,0 +1,40 @@ +package com.ignfab.minalac.generator.voxelization; + +import com.ignfab.minalac.generator.generation.GenerationTile; +import com.ignfab.minalac.generator.generation.heightmaps.ReadableHeightmap; +import com.ignfab.minalac.generator.generation.heightmaps.ReadableHeightmapSpec; +import com.ignfab.minalac.generator.models.Model; +import com.ignfab.minalac.generator.utils.iterator.Iterables; +import com.ignfab.minalac.generator.utils.world3d.Positioned3d; + +/** + * A 3d voxelizer adding a z-coordinate to voxels from a 2d voxelizer. + */ +public class SetAltitudeVoxelizer3d implements Voxelizer3d { + + private final Voxelizer2d voxelizer; + private final ReadableHeightmapSpec altitude; + + /** + * Creates a new {@code SetAltitudeVoxelizer3d}. + * + * @param voxelizer 2d voxelizer to get horizontal coordinates from + * @param altitude heightmap giving the vertical coordinate + */ + public SetAltitudeVoxelizer3d(Voxelizer2d voxelizer, ReadableHeightmapSpec altitude) { + this.voxelizer = voxelizer; + this.altitude = altitude; + } + + @Override + public Iterable voxelize(Model model) { + // TODO: This could move into a HeightmapSpec method + ReadableHeightmap heightmap = GenerationTile.current().heightmap(altitude); + + return Iterables.remap( + // TODO: If we had voxelizers already filtered by current tile, we wouldn't need to filter here + heightmap.bbox().filterInside(voxelizer.voxelize(model)), + (pos) -> pos.coords().to3d(heightmap.get(pos.coords())) + ); + } +} diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/ToVoxelizer2d.java b/src/main/java/com/ignfab/minalac/generator/voxelization/ToVoxelizer2d.java new file mode 100644 index 000000000..9462b4650 --- /dev/null +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/ToVoxelizer2d.java @@ -0,0 +1,30 @@ +package com.ignfab.minalac.generator.voxelization; + +import com.ignfab.minalac.generator.models.Model; +import com.ignfab.minalac.generator.utils.iterator.Iterables; +import com.ignfab.minalac.generator.utils.world2d.Positioned2d; + +/** + * A 2d voxelizer flattening voxels from a 3d voxelizer. + */ +public class ToVoxelizer2d implements Voxelizer2d { + + private final Voxelizer3d voxelizer; + + /** + * Creates a new {@code ToVoxelizer2d}. + * + * @param voxelizer voxelizer to flatted to 2d + */ + public ToVoxelizer2d(Voxelizer3d voxelizer) { + this.voxelizer = voxelizer; + } + + @Override + public Iterable voxelize(Model model) { + return Iterables.remap( + voxelizer.voxelize(model), + (pos) -> pos.coords().to2d() + ); + } +} diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/Voxelizer2d.java b/src/main/java/com/ignfab/minalac/generator/voxelization/Voxelizer2d.java index f4a7de2c5..45e87378f 100644 --- a/src/main/java/com/ignfab/minalac/generator/voxelization/Voxelizer2d.java +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/Voxelizer2d.java @@ -1,22 +1,19 @@ package com.ignfab.minalac.generator.voxelization; -import java.util.Iterator; - +import com.ignfab.minalac.generator.models.Model; import com.ignfab.minalac.generator.utils.world2d.Positioned2d; /** - * A 2d voxelizer provides a way to iterate over 2d voxels. - * This is the minimal voxelizer, which only tells which voxels are in the model. - *

- * The voxels returned by iterators are not guaranteed to be unique: - * It may contain duplicate coordinate. + * A voxelizer converting a model into 2d voxels. */ -public interface Voxelizer2d extends Iterable { +public interface Voxelizer2d { /** - * Returns an iterator over all the voxels in this object. + * Performs voxelization of a {@link Model} into an iterable over 2d positions. + *

+ * If unable to voxelize model, returns an empty iterator. * - * @return the global iterator of this object. + * @param model model to voxelize + * @return iterable over corresponding voxel positions */ - @Override - Iterator iterator(); + Iterable voxelize(Model model); } diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/Voxelizer3d.java b/src/main/java/com/ignfab/minalac/generator/voxelization/Voxelizer3d.java index 9e25abcc1..3c7eaa765 100644 --- a/src/main/java/com/ignfab/minalac/generator/voxelization/Voxelizer3d.java +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/Voxelizer3d.java @@ -1,22 +1,19 @@ package com.ignfab.minalac.generator.voxelization; -import java.util.Iterator; - +import com.ignfab.minalac.generator.models.Model; import com.ignfab.minalac.generator.utils.world3d.Positioned3d; /** - * A 3d voxelizer provides a way to iterate over 3d voxels. - * This is the minimal voxelizer, which only tells which voxels are in the model. - *

- * The voxels returned by iterators are not guaranteed to be unique: - * It may contain duplicate coordinate. + * A voxelizer converting a model into 3d voxels. */ -public interface Voxelizer3d extends Iterable { +public interface Voxelizer3d { /** - * Returns an iterator over all the voxels in this object. + * Performs voxelization of a {@link Model} into an iterable over 3d positions. + *

+ * If unable to voxelize model, returns an empty iterator. * - * @return the global iterator of this object. + * @param model model to voxelize + * @return iterable over corresponding voxel positions */ - @Override - Iterator iterator(); + Iterable voxelize(Model model); } diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/Matrix2d.java b/src/main/java/com/ignfab/minalac/generator/voxelization/matrix2d/Matrix2d.java similarity index 95% rename from src/main/java/com/ignfab/minalac/generator/voxelization/Matrix2d.java rename to src/main/java/com/ignfab/minalac/generator/voxelization/matrix2d/Matrix2d.java index ce05bcc8c..c9afd6d0e 100644 --- a/src/main/java/com/ignfab/minalac/generator/voxelization/Matrix2d.java +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/matrix2d/Matrix2d.java @@ -1,4 +1,4 @@ -package com.ignfab.minalac.generator.voxelization; +package com.ignfab.minalac.generator.voxelization.matrix2d; import com.ignfab.minalac.generator.utils.world2d.Bounded2d; import com.ignfab.minalac.generator.utils.world2d.Positioned2d; diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/Matrix2dIterator.java b/src/main/java/com/ignfab/minalac/generator/voxelization/matrix2d/Matrix2dIterator.java similarity index 95% rename from src/main/java/com/ignfab/minalac/generator/voxelization/Matrix2dIterator.java rename to src/main/java/com/ignfab/minalac/generator/voxelization/matrix2d/Matrix2dIterator.java index cc8f30a0c..46ac62fdd 100644 --- a/src/main/java/com/ignfab/minalac/generator/voxelization/Matrix2dIterator.java +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/matrix2d/Matrix2dIterator.java @@ -1,4 +1,4 @@ -package com.ignfab.minalac.generator.voxelization; +package com.ignfab.minalac.generator.voxelization.matrix2d; import java.util.Iterator; diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/Point2dVoxelizer.java b/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/PointVoxelizer2d.java similarity index 57% rename from src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/Point2dVoxelizer.java rename to src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/PointVoxelizer2d.java index 95b1342a0..985b49464 100644 --- a/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/Point2dVoxelizer.java +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/PointVoxelizer2d.java @@ -1,14 +1,14 @@ package com.ignfab.minalac.generator.voxelization.shape2d.voxelizer; import com.ignfab.minalac.generator.utils.world2d.Positioned2d; -import com.ignfab.minalac.generator.voxelization.shape2d.Shape2dConvertible; +import com.ignfab.minalac.generator.voxelization.shape2d.Shape2d; /** * A voxelizer that returns the points of a 2D shape. */ -public class Point2dVoxelizer implements Shape2dVoxelizer { +public class PointVoxelizer2d implements Shape2dVoxelizer { @Override - public Iterable voxelize(Shape2dConvertible convertible) { - return convertible.toShape2d().points(); + public Iterable voxelizeShape2d(Shape2d shape) { + return shape.points(); } } diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/Shape2dVoxelizer.java b/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/Shape2dVoxelizer.java index 736b0a48a..bda06eea9 100644 --- a/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/Shape2dVoxelizer.java +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/Shape2dVoxelizer.java @@ -1,17 +1,30 @@ package com.ignfab.minalac.generator.voxelization.shape2d.voxelizer; +import java.util.Collections; + +import com.ignfab.minalac.generator.models.Model; import com.ignfab.minalac.generator.utils.world2d.Positioned2d; +import com.ignfab.minalac.generator.voxelization.Voxelizer2d; +import com.ignfab.minalac.generator.voxelization.shape2d.Shape2d; import com.ignfab.minalac.generator.voxelization.shape2d.Shape2dConvertible; /** - * Interface for voxelizers able to voxelize {@link Shape2dConvertible} into {@link Positioned2d}. + * Interface for voxelizers able to voxelize {@link Shape2dConvertible} models into {@link Positioned2d}. */ -public interface Shape2dVoxelizer { +public interface Shape2dVoxelizer extends Voxelizer2d { /** - * Performs voxelization of a {@link Shape2dConvertible} into an iterable over 2d positions. + * Performs voxelization of a {@link Shape2d} into an iterable over 2d positions. * - * @param convertible something convertible into {@code Shape2d} + * @param shape shape to voxelize * @return iterable over corresponding voxel positions */ - Iterable voxelize(Shape2dConvertible convertible); + Iterable voxelizeShape2d(Shape2d shape); + + @Override + default Iterable voxelize(Model model) { + if (model instanceof Shape2dConvertible convertible) + return voxelizeShape2d(convertible.toShape2d()); + else + return Collections.emptyList(); + } } diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/SurfaceVoxelizer2d.java b/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/SurfaceVoxelizer2d.java index 91443746b..faf44da3a 100644 --- a/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/SurfaceVoxelizer2d.java +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/SurfaceVoxelizer2d.java @@ -3,7 +3,7 @@ import com.ignfab.minalac.generator.utils.iterator.Iterables; import com.ignfab.minalac.generator.utils.world2d.Positioned2d; import com.ignfab.minalac.generator.voxelization.shape2d.Polygon2d; -import com.ignfab.minalac.generator.voxelization.shape2d.Shape2dConvertible; +import com.ignfab.minalac.generator.voxelization.shape2d.Shape2d; import com.ignfab.minalac.generator.voxelization.shape2d.iterator.Polygon2dIterator; /** @@ -21,8 +21,8 @@ public Iterable voxelize(Polygon2d polygon) { } @Override - public Iterable voxelize(Shape2dConvertible convertible) { - return Iterables.flatMap(convertible.toShape2d().polygons(), this::voxelize); + public Iterable voxelizeShape2d(Shape2d shape) { + return Iterables.flatMap(shape.polygons(), this::voxelize); } } diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/ThickLinearIndexedVoxelizer2d.java b/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/ThickLinearIndexedVoxelizer2d.java index a926cf20f..d7a11682c 100644 --- a/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/ThickLinearIndexedVoxelizer2d.java +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/ThickLinearIndexedVoxelizer2d.java @@ -1,7 +1,11 @@ package com.ignfab.minalac.generator.voxelization.shape2d.voxelizer; +import java.util.Collections; + +import com.ignfab.minalac.generator.models.Model; import com.ignfab.minalac.generator.utils.iterator.Iterables; import com.ignfab.minalac.generator.voxelization.shape2d.LineString2d; +import com.ignfab.minalac.generator.voxelization.shape2d.Shape2d; import com.ignfab.minalac.generator.voxelization.shape2d.Shape2dConvertible; import com.ignfab.minalac.generator.voxelization.shape2d.iterator.IndexedPosition2d; import com.ignfab.minalac.generator.voxelization.shape2d.iterator.ThickLineString2dIndexedIterator; @@ -33,13 +37,21 @@ public ThickLinearIndexedVoxelizer2d(double thickness) { * @param lineString Line string to voxelize * @return an iterable over voxelized positions */ - public Iterable voxelize(LineString2d lineString) { + public Iterable voxelizeShape2d(LineString2d lineString) { return () -> new ThickLineString2dIndexedIterator(lineString, thickness); } @Override - public Iterable voxelize(Shape2dConvertible convertible) { - return Iterables.flatMap(convertible.toShape2d().lineStrings(), this::voxelize); + public Iterable voxelizeShape2d(Shape2d shape) { + return Iterables.flatMap(shape.lineStrings(), this::voxelizeShape2d); } + // Needed to precise return type + @Override + public Iterable voxelize(Model model) { + if (model instanceof Shape2dConvertible convertible) + return voxelizeShape2d(convertible.toShape2d()); + else + return Collections.emptyList(); + } } diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/ThinLinearVoxelizer2d.java b/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/ThinLinearVoxelizer2d.java index 3bf28880a..ca4154b20 100644 --- a/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/ThinLinearVoxelizer2d.java +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/shape2d/voxelizer/ThinLinearVoxelizer2d.java @@ -3,7 +3,7 @@ import com.ignfab.minalac.generator.utils.iterator.Iterables; import com.ignfab.minalac.generator.utils.world2d.Positioned2d; import com.ignfab.minalac.generator.voxelization.shape2d.LineString2d; -import com.ignfab.minalac.generator.voxelization.shape2d.Shape2dConvertible; +import com.ignfab.minalac.generator.voxelization.shape2d.Shape2d; import com.ignfab.minalac.generator.voxelization.shape2d.iterator.ThinSegment2dIterator; /** @@ -23,8 +23,8 @@ public Iterable voxelize(LineString2d lineString) { } @Override - public Iterable voxelize(Shape2dConvertible convertible) { - return Iterables.flatMap(convertible.toShape2d().lineStrings(), this::voxelize); + public Iterable voxelizeShape2d(Shape2d shape) { + return Iterables.flatMap(shape.lineStrings(), this::voxelize); } } diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/Point3dVoxelizer.java b/src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/PointVoxelizer3d.java similarity index 57% rename from src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/Point3dVoxelizer.java rename to src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/PointVoxelizer3d.java index 0be3ddaf0..a18753c4f 100644 --- a/src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/Point3dVoxelizer.java +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/PointVoxelizer3d.java @@ -1,14 +1,14 @@ package com.ignfab.minalac.generator.voxelization.shape3d.voxelizer; import com.ignfab.minalac.generator.utils.world3d.Positioned3d; -import com.ignfab.minalac.generator.voxelization.shape3d.Shape3dConvertible; +import com.ignfab.minalac.generator.voxelization.shape3d.Shape3d; /** * A voxelizer that returns the points of a 3D shape. */ -public class Point3dVoxelizer implements Shape3dVoxelizer { +public class PointVoxelizer3d implements Shape3dVoxelizer { @Override - public Iterable voxelize(Shape3dConvertible convertible) { - return convertible.toShape3d().points(); + public Iterable voxelizeShape3d(Shape3d shape) { + return shape.points(); } } diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/Shape3dVoxelizer.java b/src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/Shape3dVoxelizer.java index e0510630f..051a2be89 100644 --- a/src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/Shape3dVoxelizer.java +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/Shape3dVoxelizer.java @@ -1,17 +1,30 @@ package com.ignfab.minalac.generator.voxelization.shape3d.voxelizer; +import java.util.Collections; + +import com.ignfab.minalac.generator.models.Model; import com.ignfab.minalac.generator.utils.world3d.Positioned3d; +import com.ignfab.minalac.generator.voxelization.Voxelizer3d; +import com.ignfab.minalac.generator.voxelization.shape3d.Shape3d; import com.ignfab.minalac.generator.voxelization.shape3d.Shape3dConvertible; /** - * Interface for voxelizers able to voxelize {@link Shape3dConvertible} into {@link Positioned3d}. + * Interface for voxelizers able to voxelize {@link Shape3dConvertible} models into {@link Positioned3d}. */ -public interface Shape3dVoxelizer { +public interface Shape3dVoxelizer extends Voxelizer3d { /** - * Perform voxelization of a {@link Shape3dConvertible} into an iterable over 3d positions. + * Perform voxelization of a {@link Shape3d} into an iterable over 3d positions. * - * @param convertible something convertible into {@code Shape3d} + * @param shape shape to voxelize * @return iterable over corresponding voxel positions */ - Iterable voxelize(Shape3dConvertible convertible); + Iterable voxelizeShape3d(Shape3d shape); + + @Override + default Iterable voxelize(Model model) { + if (model instanceof Shape3dConvertible convertible) + return voxelizeShape3d(convertible.toShape3d()); + else + return Collections.emptyList(); + } } diff --git a/src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/ThickLinearIndexedVoxelizer2d5.java b/src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/ThickLinearIndexedVoxelizer2d5.java index 8b2d01f69..4ef4f00f6 100644 --- a/src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/ThickLinearIndexedVoxelizer2d5.java +++ b/src/main/java/com/ignfab/minalac/generator/voxelization/shape3d/voxelizer/ThickLinearIndexedVoxelizer2d5.java @@ -1,7 +1,11 @@ package com.ignfab.minalac.generator.voxelization.shape3d.voxelizer; +import java.util.Collections; + +import com.ignfab.minalac.generator.models.Model; import com.ignfab.minalac.generator.utils.iterator.Iterables; import com.ignfab.minalac.generator.voxelization.shape3d.LineString3d; +import com.ignfab.minalac.generator.voxelization.shape3d.Shape3d; import com.ignfab.minalac.generator.voxelization.shape3d.Shape3dConvertible; import com.ignfab.minalac.generator.voxelization.shape3d.iterator.IndexedPosition3d; import com.ignfab.minalac.generator.voxelization.shape3d.iterator.ThickLineString2d5IndexedIterator; @@ -35,12 +39,22 @@ public ThickLinearIndexedVoxelizer2d5(double thickness) { * @param lineString Line string to voxelize * @return an iterable over voxelized positions and indexes */ - public Iterable voxelize(LineString3d lineString) { + public Iterable voxelizeShape3d(LineString3d lineString) { return () -> new ThickLineString2d5IndexedIterator(lineString, thickness); } @Override - public Iterable voxelize(Shape3dConvertible convertible) { - return Iterables.flatMap(convertible.toShape3d().lineStrings(), this::voxelize); + public Iterable voxelizeShape3d(Shape3d shape) { + return Iterables.flatMap(shape.lineStrings(), this::voxelizeShape3d); + } + + // Needed to precise return type + @Override + public Iterable voxelize(Model model) { + if (model instanceof Shape3dConvertible convertible) + return voxelizeShape3d(convertible.toShape3d()); + else + return Collections.emptyList(); } } +