From 8e9a7e12bceb78540059b616ad7bede61c744bb8 Mon Sep 17 00:00:00 2001 From: Tobias Knerr Date: Tue, 4 Feb 2025 11:40:55 +0100 Subject: [PATCH] Wrap config in an O2WConfig class --- .../org/osm2world/core/ConversionFacade.java | 29 ++-- .../core/{util => conversion}/ConfigUtil.java | 11 +- .../osm2world/core/conversion/O2WConfig.java | 148 ++++++++++++++++++ .../org/osm2world/core/target/Target.java | 9 +- .../core/target/common/AbstractTarget.java | 11 +- .../target/common/ResourceOutputSettings.java | 4 +- .../target/common/material/Materials.java | 14 +- .../core/target/common/model/Models.java | 6 +- .../core/target/gltf/GltfTarget.java | 2 +- .../osm2world/core/target/obj/ObjWriter.java | 6 +- .../core/world/creation/WorldCreator.java | 11 +- .../core/world/creation/WorldModule.java | 6 +- .../world/modules/ExternalModelModule.java | 4 +- .../core/world/modules/RoadModule.java | 12 +- .../core/world/modules/TreeModule.java | 4 +- .../core/world/modules/building/Building.java | 9 +- .../world/modules/building/BuildingPart.java | 12 +- .../building/ExteriorBuildingWall.java | 8 +- .../building/indoor/IndoorObjectData.java | 4 +- .../common/ConfigurableWorldModule.java | 9 +- .../traffic_sign/TrafficSignGroup.java | 6 +- .../traffic_sign/TrafficSignModel.java | 4 +- .../modules/traffic_sign/TrafficSignType.java | 12 +- .../core/conversion/O2WConfigTest.java | 58 +++++++ .../building/Indoor/IndoorWallTest.java | 4 +- .../building/LevelAndHeightDataTest.java | 24 +-- .../traffic_sign/TrafficSignModuleTest.java | 11 +- .../resources/config/parentConfig.properties | 4 + .../config}/testConfig_01.properties | 0 .../config}/testConfig_02.properties | 0 .../test/resources/config/textures/test.png | Bin 0 -> 8712 bytes .../org/osm2world/console/ImageExporter.java | 16 +- .../java/org/osm2world/console/OSM2World.java | 51 +----- .../java/org/osm2world/console/Output.java | 6 +- .../java/org/osm2world/viewer/Viewer.java | 4 +- .../actions/AbstractLoadOSMAction.java | 5 +- .../viewer/control/actions/SetLodAction.java | 6 +- .../control/actions/StatisticsAction.java | 2 +- .../java/org/osm2world/viewer/model/Data.java | 25 ++- .../osm2world/viewer/view/ViewerFrame.java | 12 +- .../osm2world/viewer/view/ViewerGLCanvas.java | 4 +- .../viewer/view/debug/DebugView.java | 6 +- .../org/osm2world/console/OSM2WorldTest.java | 28 ---- .../core/target/jogl/JOGLTarget.java | 4 +- 44 files changed, 372 insertions(+), 239 deletions(-) rename core/src/main/java/org/osm2world/core/{util => conversion}/ConfigUtil.java (92%) create mode 100644 core/src/main/java/org/osm2world/core/conversion/O2WConfig.java create mode 100644 core/src/test/java/org/osm2world/core/conversion/O2WConfigTest.java create mode 100644 core/src/test/resources/config/parentConfig.properties rename {desktop/src/test/resources => core/src/test/resources/config}/testConfig_01.properties (100%) rename {desktop/src/test/resources => core/src/test/resources/config}/testConfig_02.properties (100%) create mode 100644 core/src/test/resources/config/textures/test.png delete mode 100644 desktop/src/test/java/org/osm2world/console/OSM2WorldTest.java diff --git a/core/src/main/java/org/osm2world/core/ConversionFacade.java b/core/src/main/java/org/osm2world/core/ConversionFacade.java index a8b015cee..c207432c1 100644 --- a/core/src/main/java/org/osm2world/core/ConversionFacade.java +++ b/core/src/main/java/org/osm2world/core/ConversionFacade.java @@ -19,9 +19,9 @@ import javax.annotation.Nullable; -import org.apache.commons.configuration.BaseConfiguration; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.ConfigUtil; import org.osm2world.core.conversion.ConversionLog; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.creation.OSMToMapDataConverter; import org.osm2world.core.map_data.data.MapData; import org.osm2world.core.map_data.data.MapMetadata; @@ -41,7 +41,6 @@ import org.osm2world.core.target.TargetUtil; import org.osm2world.core.target.common.material.Materials; import org.osm2world.core.target.common.model.Models; -import org.osm2world.core.util.ConfigUtil; import org.osm2world.core.util.FaultTolerantIterationUtil; import org.osm2world.core.util.functions.Factory; import org.osm2world.core.world.attachment.AttachmentConnector; @@ -96,7 +95,7 @@ public TerrainElevationData getEleData() { /** * generates a default list of modules for the conversion */ - static final List createDefaultModuleList(Configuration config) { + static final List createDefaultModuleList(O2WConfig config) { List excludedModules = config.getList("excludeWorldModule") .stream().map(m -> m.toString()).toList(); @@ -173,7 +172,7 @@ public void setTerrainEleInterpolatorFactory(@Nullable Factory worldModules, Configuration config, + List worldModules, O2WConfig config, List targets) throws IOException { @@ -188,7 +187,7 @@ public Results createRepresentations(File osmFile, @Nullable MapMetadata metadat } /** - * variant of {@link #createRepresentations(File, MapMetadata, List, Configuration, List)} + * variant of {@link #createRepresentations(File, MapMetadata, List, O2WConfig, List)} * that accepts {@link OSMData} instead of a file. * Use this when all data is already * in memory, for example with editor applications. @@ -204,7 +203,7 @@ public Results createRepresentations(File osmFile, @Nullable MapMetadata metadat * you want to handle the returned results yourself */ public Results createRepresentations(OSMData osmData, @Nullable MapMetadata metadata, - List worldModules, Configuration config, + List worldModules, O2WConfig config, List targets) throws IOException { @@ -234,14 +233,14 @@ public Results createRepresentations(OSMData osmData, @Nullable MapMetadata meta } /** - * variant of {@link #createRepresentations(OSMData, MapMetadata, List, Configuration, List)} + * variant of {@link #createRepresentations(OSMData, MapMetadata, List, O2WConfig, List)} * that takes {@link MapData} instead of {@link OSMData} * * @param mapProjection projection for converting between {@link LatLon} and local coordinates in {@link MapData}. * May be null, but that prevents accessing additional data sources such as {@link SRTMData}. */ public Results createRepresentations(@Nullable MapProjection mapProjection, MapData mapData, - @Nullable List worldModules, @Nullable Configuration config, + @Nullable List worldModules, @Nullable O2WConfig config, @Nullable List targets) { /* check the inputs */ @@ -251,7 +250,7 @@ public Results createRepresentations(@Nullable MapProjection mapProjection, MapD } if (config == null) { - config = new BaseConfiguration(); + config = new O2WConfig(); } /* apply world modules */ @@ -261,13 +260,13 @@ public Results createRepresentations(@Nullable MapProjection mapProjection, MapD worldModules = createDefaultModuleList(config); } + ConfigUtil.parseFonts(config); Materials.configureMaterials(config); Models.configureModels(config); //this will cause problems if multiple conversions are run //at the same time, because global variables are being modified - WorldCreator moduleManager = - new WorldCreator(config, worldModules); + WorldCreator moduleManager = new WorldCreator(config, worldModules); moduleManager.addRepresentationsTo(mapData); /* determine elevations */ @@ -402,7 +401,7 @@ protected static void attachConnectorIfValid(AttachmentConnector connector, Atta * {@link WorldObject}s */ private void calculateElevations(MapData mapData, - TerrainElevationData eleData, Configuration config) { + TerrainElevationData eleData, O2WConfig config) { TerrainInterpolator interpolator = createTerrainInterpolator(config); @@ -448,7 +447,7 @@ private void calculateElevations(MapData mapData, } - private EleCalculator createEleCalculator(Configuration config) { + private EleCalculator createEleCalculator(O2WConfig config) { if (eleCalculatorFactory != null) { return eleCalculatorFactory.get(); @@ -463,7 +462,7 @@ private EleCalculator createEleCalculator(Configuration config) { } - private TerrainInterpolator createTerrainInterpolator(Configuration config) { + private TerrainInterpolator createTerrainInterpolator(O2WConfig config) { if (terrainEleInterpolatorFactory != null) { return terrainEleInterpolatorFactory.get(); diff --git a/core/src/main/java/org/osm2world/core/util/ConfigUtil.java b/core/src/main/java/org/osm2world/core/conversion/ConfigUtil.java similarity index 92% rename from core/src/main/java/org/osm2world/core/util/ConfigUtil.java rename to core/src/main/java/org/osm2world/core/conversion/ConfigUtil.java index 8c58f3a9e..b50e6cafb 100644 --- a/core/src/main/java/org/osm2world/core/util/ConfigUtil.java +++ b/core/src/main/java/org/osm2world/core/conversion/ConfigUtil.java @@ -1,4 +1,4 @@ -package org.osm2world.core.util; +package org.osm2world.core.conversion; import static org.osm2world.core.target.common.mesh.LevelOfDetail.*; @@ -11,7 +11,6 @@ import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.FileConfiguration; import org.osm2world.core.target.common.mesh.LevelOfDetail; @@ -27,7 +26,7 @@ private ConfigUtil() { } public static final String CANVAS_LIMIT_KEY = "canvasLimit"; /** reads and parses the value of the lod property */ - public static LevelOfDetail readLOD(Configuration config) { + public static LevelOfDetail readLOD(O2WConfig config) { return switch (config.getInt("lod", 4)) { case 0 -> LOD0; case 1 -> LOD1; @@ -106,7 +105,7 @@ public static final Color parseColorTuple(String colorString) { * by the "fontDirectory" key in the configuration file. * The respective fonts can then be used in Font object constructors. */ - public static void parseFonts(Configuration config) { + public static void parseFonts(O2WConfig config) { if(!config.containsKey("fontDirectory")) return; @@ -132,7 +131,7 @@ public static void parseFonts(Configuration config) { } } - public static > @Nullable T readEnum(Class enumClass, Configuration config, String key) { + public static > @Nullable T readEnum(Class enumClass, O2WConfig config, String key) { String value = config.getString(key); if (value != null) { try { @@ -146,7 +145,7 @@ public static void parseFonts(Configuration config) { * If config references some files by path e.g. textures * resolve file paths relative to config location */ - public static File resolveFileConfigProperty(Configuration config, String fileName) { + public static File resolveFileConfigProperty(O2WConfig config, String fileName) { if (fileName == null) { return null; } diff --git a/core/src/main/java/org/osm2world/core/conversion/O2WConfig.java b/core/src/main/java/org/osm2world/core/conversion/O2WConfig.java new file mode 100644 index 000000000..302a4a2ff --- /dev/null +++ b/core/src/main/java/org/osm2world/core/conversion/O2WConfig.java @@ -0,0 +1,148 @@ +package org.osm2world.core.conversion; + +import java.io.File; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nullable; + +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.MapConfiguration; +import org.apache.commons.configuration.PropertiesConfiguration; +import org.osm2world.core.target.common.mesh.LevelOfDetail; + +/** + * a set of configuration options for OSM2World. + * Includes models, materials and settings which control the visual appearance of the scene. + */ +public class O2WConfig { + + private final PropertiesConfiguration config; + + private O2WConfig(PropertiesConfiguration config) { + this.config = config; + } + + /** + * constructs a configuration with all options at their default values. + */ + public O2WConfig() { + this(Map.of()); + } + + /** + * constructs a configuration from a {@link Map} containing key-value options for OSM2World. + */ + public O2WConfig(@Nullable Map properties) { + this(properties, new File[0]); + } + + /** + * constructs a configuration from a {@link Map} containing key-value options for OSM2World + * and one or more config files. Config files use the .properties format. + * For keys which are present multiple times, values from the map take precedence over values from the config files. + * Among configFiles, those later in the list take precedence. + */ + public O2WConfig(@Nullable Map properties, File... configFiles) { + try { + var mapConfig = new MapConfiguration(properties == null ? Map.of() : properties); + PropertiesConfiguration loadedConfig = loadConfigFiles(configFiles); + loadedConfig.copy(mapConfig); + this.config = loadedConfig; + } catch (ConfigurationException e) { + throw new RuntimeException(e); + } + } + + /** + * returns a modified copy of this config that has one key set to a new value. + * @param value the new value; can be set to null to delete an existing property + */ + public O2WConfig withProperty(String key, @Nullable Object value) { + PropertiesConfiguration newConfig = (PropertiesConfiguration) config.clone(); + newConfig.clearProperty(key); + if (value != null) { + newConfig.addProperty(key, value); + } + return new O2WConfig(newConfig); + } + + public Iterator getKeys() { + return config.getKeys(); + } + + public boolean containsKey(String key) { + return config.containsKey(key); + } + + public String getString(String key) { + return config.getString(key); + } + + public String getString(String key, String defaultValue) { + return config.getString(key, defaultValue); + } + + public boolean getBoolean(String key) { + return config.getBoolean(key); + } + + public boolean getBoolean(String key, boolean defaultValue) { + return config.getBoolean(key, defaultValue); + } + + public int getInt(String key, int defaultValue) { + return config.getInt(key, defaultValue); + } + + public Integer getInteger(String key, Integer defaultValue) { + return config.getInteger(key, defaultValue); + } + + public float getFloat(String key, float defaultValue) { + return config.getFloat(key, defaultValue); + } + + public Float getFloat(String key, Float defaultValue) { + return config.getFloat(key, defaultValue); + } + + public double getDouble(String key, double defaultValue) { + return config.getDouble(key, defaultValue); + } + + public Double getDouble(String key, Double defaultValue) { + return config.getDouble(key, defaultValue); + } + + public List getList(String key) { + return config.getList(key); + } + + public LevelOfDetail getLod() { + return ConfigUtil.readLOD(this); + } + + private static PropertiesConfiguration loadConfigFiles(File... configFiles) throws ConfigurationException { + + PropertiesConfiguration config = new PropertiesConfiguration(); + config.setListDelimiter(';'); + + for (File it : configFiles) { + config.load(it); + } + + Arrays.stream(configFiles) + .filter(File::exists) + .findFirst() + .ifPresent(f -> { + config.addProperty("configPath", f.getAbsoluteFile().getParent()); + }); + + return config; + + } + +} diff --git a/core/src/main/java/org/osm2world/core/target/Target.java b/core/src/main/java/org/osm2world/core/target/Target.java index c2ee4b49c..be2b266ee 100644 --- a/core/src/main/java/org/osm2world/core/target/Target.java +++ b/core/src/main/java/org/osm2world/core/target/Target.java @@ -2,12 +2,11 @@ import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.target.common.MeshTarget; import org.osm2world.core.target.common.mesh.LevelOfDetail; import org.osm2world.core.target.common.mesh.Mesh; import org.osm2world.core.target.common.mesh.TriangleGeometry; -import org.osm2world.core.util.ConfigUtil; import org.osm2world.core.world.data.WorldObject; /** @@ -15,11 +14,11 @@ */ public interface Target extends CommonTarget { - void setConfiguration(Configuration config); - Configuration getConfiguration(); + void setConfiguration(O2WConfig config); + O2WConfig getConfiguration(); default LevelOfDetail getLod() { - return ConfigUtil.readLOD(getConfiguration()); + return getConfiguration().getLod(); } /** diff --git a/core/src/main/java/org/osm2world/core/target/common/AbstractTarget.java b/core/src/main/java/org/osm2world/core/target/common/AbstractTarget.java index d4e2c3a29..769964f94 100644 --- a/core/src/main/java/org/osm2world/core/target/common/AbstractTarget.java +++ b/core/src/main/java/org/osm2world/core/target/common/AbstractTarget.java @@ -2,8 +2,7 @@ import javax.annotation.Nonnull; -import org.apache.commons.configuration.Configuration; -import org.apache.commons.configuration.PropertiesConfiguration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.target.Target; /** @@ -13,19 +12,19 @@ */ public abstract class AbstractTarget implements Target { - protected @Nonnull Configuration config = new PropertiesConfiguration(); + protected @Nonnull O2WConfig config = new O2WConfig(); @Override - public Configuration getConfiguration() { + public O2WConfig getConfiguration() { return config; } @Override - public void setConfiguration(Configuration config) { + public void setConfiguration(O2WConfig config) { if (config != null) { this.config = config; } else { - this.config = new PropertiesConfiguration(); + this.config = new O2WConfig(); } } diff --git a/core/src/main/java/org/osm2world/core/target/common/ResourceOutputSettings.java b/core/src/main/java/org/osm2world/core/target/common/ResourceOutputSettings.java index a44691253..78bc6c18b 100644 --- a/core/src/main/java/org/osm2world/core/target/common/ResourceOutputSettings.java +++ b/core/src/main/java/org/osm2world/core/target/common/ResourceOutputSettings.java @@ -11,7 +11,7 @@ import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.target.common.material.ImageFileTexture; import org.osm2world.core.target.common.material.RasterImageFileTexture; import org.osm2world.core.target.common.material.TextureData; @@ -77,7 +77,7 @@ public String storeTexture(TextureData texture, @Nullable URI baseForRelativePat } - public static ResourceOutputSettings fromConfig(Configuration config, URI textureDirectory, boolean canEmbed) { + public static ResourceOutputSettings fromConfig(O2WConfig config, URI textureDirectory, boolean canEmbed) { /* parse the modes */ diff --git a/core/src/main/java/org/osm2world/core/target/common/material/Materials.java b/core/src/main/java/org/osm2world/core/target/common/material/Materials.java index ef0ca2c18..5e324d1eb 100644 --- a/core/src/main/java/org/osm2world/core/target/common/material/Materials.java +++ b/core/src/main/java/org/osm2world/core/target/common/material/Materials.java @@ -2,7 +2,7 @@ import static java.awt.Color.*; import static java.util.Collections.emptyList; -import static org.osm2world.core.util.ConfigUtil.readEnum; +import static org.osm2world.core.conversion.ConfigUtil.readEnum; import java.awt.*; import java.io.File; @@ -16,14 +16,14 @@ import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.ConfigUtil; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.target.common.material.Material.Interpolation; import org.osm2world.core.target.common.material.Material.Transparency; import org.osm2world.core.target.common.material.TextTexture.FontStyle; import org.osm2world.core.target.common.material.TextureData.Wrap; import org.osm2world.core.target.common.texcoord.NamedTexCoordFunction; import org.osm2world.core.target.common.texcoord.TexCoordFunction; -import org.osm2world.core.util.ConfigUtil; import org.osm2world.core.world.creation.WorldModule; /** @@ -370,7 +370,7 @@ synchronized public static final String getUniqueName(Material material) { * configures the attributes of the materials within this class * based on external configuration settings */ - synchronized public static final void configureMaterials(Configuration config) { + synchronized public static final void configureMaterials(O2WConfig config) { externalMaterials.clear(); @@ -475,7 +475,7 @@ synchronized public static final void configureMaterials(Configuration config) { } - private static @Nullable TextureLayer createTextureLayer(Configuration config, String keyPrefix, boolean implicitColorTexture) { + private static @Nullable TextureLayer createTextureLayer(O2WConfig config, String keyPrefix, boolean implicitColorTexture) { File baseColorTexture = null; File ormTexture = null; @@ -523,7 +523,7 @@ synchronized public static final void configureMaterials(Configuration config) { * @param defaultFile texture file to use if there's no _file attribute * @return valid {@link TextureData} extracted from the config file, or null */ - private static @Nullable TextureData createTextureData(Configuration config, String keyPrefix, + private static @Nullable TextureData createTextureData(O2WConfig config, String keyPrefix, @Nullable File defaultFile) { TextureDataDimensions dimensions = createTextureDataDimensions(config, keyPrefix); @@ -627,7 +627,7 @@ synchronized public static final void configureMaterials(Configuration config) { /** * @return valid {@link TextureDataDimensions} extracted from the config file, possibly using default values */ - private static TextureDataDimensions createTextureDataDimensions(Configuration config, String keyPrefix) { + private static TextureDataDimensions createTextureDataDimensions(O2WConfig config, String keyPrefix) { double width = config.getDouble(keyPrefix + "_width", 1.0); double height = config.getDouble(keyPrefix + "_height", 1.0); diff --git a/core/src/main/java/org/osm2world/core/target/common/model/Models.java b/core/src/main/java/org/osm2world/core/target/common/model/Models.java index fd4353913..d300f15c5 100644 --- a/core/src/main/java/org/osm2world/core/target/common/model/Models.java +++ b/core/src/main/java/org/osm2world/core/target/common/model/Models.java @@ -8,9 +8,9 @@ import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.ConfigUtil; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.target.gltf.GltfModel; -import org.osm2world.core.util.ConfigUtil; import org.osm2world.core.world.creation.WorldModule; /** @@ -59,7 +59,7 @@ private Models() {} } - synchronized public static void configureModels(Configuration config) { + synchronized public static void configureModels(O2WConfig config) { models.clear(); diff --git a/core/src/main/java/org/osm2world/core/target/gltf/GltfTarget.java b/core/src/main/java/org/osm2world/core/target/gltf/GltfTarget.java index 320d45ba7..8bbc2a007 100644 --- a/core/src/main/java/org/osm2world/core/target/gltf/GltfTarget.java +++ b/core/src/main/java/org/osm2world/core/target/gltf/GltfTarget.java @@ -17,6 +17,7 @@ import org.apache.commons.io.FilenameUtils; import org.osm2world.core.GlobalValues; +import org.osm2world.core.conversion.ConfigUtil; import org.osm2world.core.map_data.data.MapRelationElement; import org.osm2world.core.map_data.data.TagSet; import org.osm2world.core.math.Vector3D; @@ -42,7 +43,6 @@ import org.osm2world.core.target.gltf.data.GltfMaterial.OcclusionTextureInfo; import org.osm2world.core.target.gltf.data.GltfMaterial.PbrMetallicRoughness; import org.osm2world.core.target.gltf.data.GltfMaterial.TextureInfo; -import org.osm2world.core.util.ConfigUtil; import org.osm2world.core.util.FaultTolerantIterationUtil; import org.osm2world.core.util.color.LColor; diff --git a/core/src/main/java/org/osm2world/core/target/obj/ObjWriter.java b/core/src/main/java/org/osm2world/core/target/obj/ObjWriter.java index b2d5c315a..0eba030bb 100644 --- a/core/src/main/java/org/osm2world/core/target/obj/ObjWriter.java +++ b/core/src/main/java/org/osm2world/core/target/obj/ObjWriter.java @@ -9,8 +9,8 @@ import java.io.PrintStream; import java.util.Iterator; -import org.apache.commons.configuration.Configuration; import org.osm2world.core.GlobalValues; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.MapData; import org.osm2world.core.math.VectorXYZ; import org.osm2world.core.math.VectorXZ; @@ -29,7 +29,7 @@ private ObjWriter() { } public static final void writeObjFile( File objFile, MapData mapData, MapProjection mapProjection, - Configuration config, Camera camera, Projection projection, boolean underground) + O2WConfig config, Camera camera, Projection projection, boolean underground) throws IOException { if (!objFile.exists()) { @@ -70,7 +70,7 @@ public static final void writeObjFile( public static final void writeObjFiles( final File objDirectory, MapData mapData, final MapProjection mapProjection, - Configuration config, Camera camera, Projection projection, + O2WConfig config, Camera camera, Projection projection, int primitiveThresholdPerFile) throws IOException { diff --git a/core/src/main/java/org/osm2world/core/world/creation/WorldCreator.java b/core/src/main/java/org/osm2world/core/world/creation/WorldCreator.java index 4f12a3109..ff96ef6c3 100644 --- a/core/src/main/java/org/osm2world/core/world/creation/WorldCreator.java +++ b/core/src/main/java/org/osm2world/core/world/creation/WorldCreator.java @@ -1,14 +1,11 @@ package org.osm2world.core.world.creation; -import static java.util.Collections.emptyMap; - import java.util.Arrays; import java.util.List; import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; -import org.apache.commons.configuration.MapConfiguration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.MapData; import org.osm2world.core.world.network.NetworkCalculator; @@ -16,16 +13,16 @@ public class WorldCreator { private List modules; - public WorldCreator(@Nullable Configuration config, WorldModule... modules) { + public WorldCreator(@Nullable O2WConfig config, WorldModule... modules) { this(config, Arrays.asList(modules)); } - public WorldCreator(@Nullable Configuration config, List modules) { + public WorldCreator(@Nullable O2WConfig config, List modules) { this.modules = modules; if (config == null) { - config = new MapConfiguration(emptyMap()); + config = new O2WConfig(); } for (WorldModule module : modules) { diff --git a/core/src/main/java/org/osm2world/core/world/creation/WorldModule.java b/core/src/main/java/org/osm2world/core/world/creation/WorldModule.java index 87d30076f..ef626c1ee 100644 --- a/core/src/main/java/org/osm2world/core/world/creation/WorldModule.java +++ b/core/src/main/java/org/osm2world/core/world/creation/WorldModule.java @@ -1,6 +1,6 @@ package org.osm2world.core.world.creation; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.MapData; import org.osm2world.core.map_data.data.MapElement; import org.osm2world.core.world.data.WorldObject; @@ -8,14 +8,14 @@ public interface WorldModule { /** - * provides a {@link Configuration} that can be used to control aspects + * provides an {@link O2WConfig} that can be used to control aspects * of a WorldModule's behavior. * * This is guaranteed to be called before {@link #applyTo(MapData)}, * but not all parameters might be explicitly set in the configuration, * so defaults need to be available. */ - public void setConfiguration(Configuration config); + public void setConfiguration(O2WConfig config); /** * adds {@link WorldObject}s to {@link MapElement}s diff --git a/core/src/main/java/org/osm2world/core/world/modules/ExternalModelModule.java b/core/src/main/java/org/osm2world/core/world/modules/ExternalModelModule.java index 8edef976a..333633cfd 100644 --- a/core/src/main/java/org/osm2world/core/world/modules/ExternalModelModule.java +++ b/core/src/main/java/org/osm2world/core/world/modules/ExternalModelModule.java @@ -4,7 +4,7 @@ import java.util.List; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.*; import org.osm2world.core.map_elevation.creation.EleConstraintEnforcer; import org.osm2world.core.map_elevation.data.EleConnector; @@ -39,7 +39,7 @@ public void applyTo(MapData mapData) { } @Override - public void setConfiguration(Configuration config) {} + public void setConfiguration(O2WConfig config) {} /** temporary placeholder, to be replaced with an actual 3dmr model by the Target */ private abstract static class ExternalModelPlaceholder implements WorldObject { diff --git a/core/src/main/java/org/osm2world/core/world/modules/RoadModule.java b/core/src/main/java/org/osm2world/core/world/modules/RoadModule.java index 34aec66f8..cd787c7c3 100644 --- a/core/src/main/java/org/osm2world/core/world/modules/RoadModule.java +++ b/core/src/main/java/org/osm2world/core/world/modules/RoadModule.java @@ -29,8 +29,8 @@ import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; import org.apache.commons.lang3.ArrayUtils; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.*; import org.osm2world.core.map_elevation.creation.EleConstraintEnforcer; import org.osm2world.core.map_elevation.data.GroundState; @@ -111,16 +111,16 @@ public void applyTo(MapData mapData) { } - /** returns the default driving side based on a {@link Configuration} */ - public static LeftRight getDefaultDrivingSide(Configuration config) { - return "left".equals(config.getString("drivingSide", "right").toLowerCase()) ? LeftRight.LEFT : LeftRight.RIGHT; + /** returns the default driving side based on an {@link O2WConfig} */ + public static LeftRight getDefaultDrivingSide(O2WConfig config) { + return "left".equalsIgnoreCase(config.getString("drivingSide", "right")) ? LeftRight.LEFT : LeftRight.RIGHT; } /** * Determine whether this segment has left-hand or right-hand traffic, * based on the configured default and the way's driving_side tags, if any. */ - public static LeftRight getDrivingSide(MapWaySegment segment, Configuration config) { + public static LeftRight getDrivingSide(MapWaySegment segment, O2WConfig config) { if (segment.getTags().contains("driving_side", "left")) { return LeftRight.LEFT; } else if (segment.getTags().contains("driving_side", "right")) { @@ -773,7 +773,7 @@ public static class Road extends AbstractNetworkWaySegmentWorldObject final private boolean steps; - public Road(MapWaySegment segment, Configuration config) { + public Road(MapWaySegment segment, O2WConfig config) { super(segment); diff --git a/core/src/main/java/org/osm2world/core/world/modules/TreeModule.java b/core/src/main/java/org/osm2world/core/world/modules/TreeModule.java index 401d77da9..eb30da6e9 100644 --- a/core/src/main/java/org/osm2world/core/world/modules/TreeModule.java +++ b/core/src/main/java/org/osm2world/core/world/modules/TreeModule.java @@ -13,7 +13,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.*; import org.osm2world.core.map_data.data.overlaps.MapOverlap; import org.osm2world.core.map_elevation.data.EleConnector; @@ -186,7 +186,7 @@ public static TreeDimensions fromTags(TagSet tags, @Nullable Random random, @Nul private double defaultTreeHeightForest = 20; @Override - public void setConfiguration(@Nonnull Configuration config) { + public void setConfiguration(@Nonnull O2WConfig config) { super.setConfiguration(config); useBillboards = config.getBoolean("useBillboards", false); defaultTreeHeight = config.getDouble("defaultTreeHeight", 10); diff --git a/core/src/main/java/org/osm2world/core/world/modules/building/Building.java b/core/src/main/java/org/osm2world/core/world/modules/building/Building.java index 758ec895c..68f2d71d1 100644 --- a/core/src/main/java/org/osm2world/core/world/modules/building/Building.java +++ b/core/src/main/java/org/osm2world/core/world/modules/building/Building.java @@ -10,7 +10,7 @@ import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.*; import org.osm2world.core.map_data.data.MapRelation.Membership; import org.osm2world.core.map_data.data.overlaps.MapOverlap; @@ -22,7 +22,6 @@ import org.osm2world.core.math.shapes.PolygonShapeXZ; import org.osm2world.core.math.shapes.SimplePolygonXZ; import org.osm2world.core.target.common.mesh.LevelOfDetail; -import org.osm2world.core.util.ConfigUtil; import org.osm2world.core.world.attachment.AttachmentSurface; import org.osm2world.core.world.data.AreaWorldObject; import org.osm2world.core.world.data.CachingProceduralWorldObject; @@ -36,7 +35,7 @@ public class Building extends CachingProceduralWorldObject implements AreaWorldO /** a {@link MapArea} or {@link MapMultipolygonRelation} (for a multipolygon with multiple outer rings) */ private final MapRelationElement element; - private final Configuration config; + private final O2WConfig config; private final List parts = new ArrayList<>(); @@ -44,7 +43,7 @@ public class Building extends CachingProceduralWorldObject implements AreaWorldO private Map> wallNodePolygonSegments = new HashMap<>(); - public Building(MapRelationElement element, Configuration config) { + public Building(MapRelationElement element, O2WConfig config) { this.element = element; this.config = config; @@ -183,7 +182,7 @@ public double getGroundLevelEle() { @Override protected @Nullable LevelOfDetail getConfiguredLod() { - return ConfigUtil.readLOD(config); + return config.getLod(); } @Override diff --git a/core/src/main/java/org/osm2world/core/world/modules/building/BuildingPart.java b/core/src/main/java/org/osm2world/core/world/modules/building/BuildingPart.java index 0e0233385..73a70f414 100644 --- a/core/src/main/java/org/osm2world/core/world/modules/building/BuildingPart.java +++ b/core/src/main/java/org/osm2world/core/world/modules/building/BuildingPart.java @@ -18,7 +18,7 @@ import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.*; import org.osm2world.core.map_data.data.overlaps.MapOverlap; import org.osm2world.core.map_elevation.data.EleConnector; @@ -58,7 +58,7 @@ public class BuildingPart implements AreaWorldObject, ProceduralWorldObject { final MapArea area; private final PolygonWithHolesXZ polygon; - final Configuration config; + final O2WConfig config; /** the tags for this part, including tags inherited from the parent */ final TagSet tags; @@ -72,7 +72,7 @@ public class BuildingPart implements AreaWorldObject, ProceduralWorldObject { private final @Nullable BuildingPartInterior buildingPartInterior; - public BuildingPart(Building building, MapArea area, Configuration config) { + public BuildingPart(Building building, MapArea area, O2WConfig config) { area.addRepresentation(this); @@ -510,7 +510,7 @@ public Roof getRoof() { public Building getBuilding() { return building; } - public Configuration getConfig() { return config; } + public O2WConfig getConfig() { return config; } public TagSet getTags() { return tags; } @@ -533,7 +533,7 @@ BuildingPartInterior getIndoor() { return buildingPartInterior; } - static Material createWallMaterial(TagSet tags, Configuration config) { + static Material createWallMaterial(TagSet tags, O2WConfig config) { BuildingDefaults defaults = BuildingDefaults.getDefaultsFor(tags); @@ -550,7 +550,7 @@ static Material createWallMaterial(TagSet tags, Configuration config) { } - private static Material createRoofMaterial(TagSet tags, Configuration config) { + private static Material createRoofMaterial(TagSet tags, O2WConfig config) { BuildingDefaults defaults = BuildingDefaults.getDefaultsFor(tags); diff --git a/core/src/main/java/org/osm2world/core/world/modules/building/ExteriorBuildingWall.java b/core/src/main/java/org/osm2world/core/world/modules/building/ExteriorBuildingWall.java index 7ca4c055b..71f0f7381 100644 --- a/core/src/main/java/org/osm2world/core/world/modules/building/ExteriorBuildingWall.java +++ b/core/src/main/java/org/osm2world/core/world/modules/building/ExteriorBuildingWall.java @@ -6,11 +6,11 @@ import static java.util.Comparator.comparingDouble; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; +import static org.osm2world.core.conversion.ConfigUtil.readLOD; import static org.osm2world.core.math.VectorXZ.NULL_VECTOR; import static org.osm2world.core.math.VectorXZ.listXYZ; import static org.osm2world.core.math.algorithms.GeometryUtil.insertIntoPolygon; import static org.osm2world.core.target.common.mesh.LevelOfDetail.*; -import static org.osm2world.core.util.ConfigUtil.readLOD; import static org.osm2world.core.util.ValueParseUtil.parseLevels; import static org.osm2world.core.world.modules.common.WorldModuleParseUtil.inheritTags; @@ -18,8 +18,8 @@ import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; import org.osm2world.core.conversion.ConversionLog; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.MapNode; import org.osm2world.core.map_data.data.MapSegment; import org.osm2world.core.map_data.data.MapWay; @@ -201,7 +201,7 @@ public void renderTo(ProceduralWorldObject.Target target) { LODRange lodRange = windowImplementations.get(windowImplementation); if (buildingPart.config.containsKey("lod") && - !lodRange.contains(readLOD(buildingPart.config))) continue; + !lodRange.contains(buildingPart.config.getLod())) continue; target.setCurrentLodRange(lodRange); /* construct the surface(s) */ @@ -375,7 +375,7 @@ List getNodes() { protected PolylineShapeXZ getPoints() { return points; } private static Map chooseWindowImplementations( - boolean explicitWindows, boolean hasDoor, Configuration config) { + boolean explicitWindows, boolean hasDoor, O2WConfig config) { var explicitWI = WindowImplementation.getValue(config.getString("explicitWindowImplementation"), null); var implicitWI = WindowImplementation.getValue(config.getString("implicitWindowImplementation"), null); diff --git a/core/src/main/java/org/osm2world/core/world/modules/building/indoor/IndoorObjectData.java b/core/src/main/java/org/osm2world/core/world/modules/building/indoor/IndoorObjectData.java index a395b7d70..feceadba5 100644 --- a/core/src/main/java/org/osm2world/core/world/modules/building/indoor/IndoorObjectData.java +++ b/core/src/main/java/org/osm2world/core/world/modules/building/indoor/IndoorObjectData.java @@ -7,7 +7,7 @@ import java.util.List; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.MapArea; import org.osm2world.core.map_data.data.MapElement; import org.osm2world.core.map_data.data.TagSet; @@ -32,7 +32,7 @@ public IndoorObjectData(BuildingPart buildingPart, MapElement mapElement){ this.levels = parseLevels(mapElement.getTags().getValue("level"), emptyList()); - Configuration config = buildingPart.getConfig(); + O2WConfig config = buildingPart.getConfig(); if (config.getString("renderLevels") != null){ List renLevels = asList(config.getString("renderLevels").split(",")); diff --git a/core/src/main/java/org/osm2world/core/world/modules/common/ConfigurableWorldModule.java b/core/src/main/java/org/osm2world/core/world/modules/common/ConfigurableWorldModule.java index 50a37c5f9..190624b79 100644 --- a/core/src/main/java/org/osm2world/core/world/modules/common/ConfigurableWorldModule.java +++ b/core/src/main/java/org/osm2world/core/world/modules/common/ConfigurableWorldModule.java @@ -2,20 +2,19 @@ import javax.annotation.Nonnull; -import org.apache.commons.configuration.Configuration; -import org.apache.commons.configuration.PropertiesConfiguration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.world.creation.WorldModule; /** * simple superclass for {@link WorldModule}s that stores a configuration set by - * {@link #setConfiguration(org.apache.commons.configuration.Configuration)} + * {@link #setConfiguration(O2WConfig)} */ public abstract class ConfigurableWorldModule implements WorldModule { - protected @Nonnull Configuration config = new PropertiesConfiguration(); + protected @Nonnull O2WConfig config = new O2WConfig(); @Override - public void setConfiguration(@Nonnull Configuration config) { + public void setConfiguration(@Nonnull O2WConfig config) { this.config = config; } diff --git a/core/src/main/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignGroup.java b/core/src/main/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignGroup.java index 1a5a85ee4..d2ac6cc0f 100644 --- a/core/src/main/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignGroup.java +++ b/core/src/main/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignGroup.java @@ -19,8 +19,8 @@ import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; import org.apache.commons.lang3.tuple.Pair; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.MapNode; import org.osm2world.core.map_elevation.data.GroundState; import org.osm2world.core.math.VectorXYZ; @@ -51,13 +51,13 @@ public class TrafficSignGroup extends NoOutlineNodeWorldObject { private AttachmentConnector connector = null; - public TrafficSignGroup(MapNode node, Configuration config) { + public TrafficSignGroup(MapNode node, O2WConfig config) { // TODO remove this constructor and make the class immutable this(node, null, null, null, config); } public TrafficSignGroup(MapNode node, List signs, VectorXZ position, @Nullable Double direction, - Configuration config) { + O2WConfig config) { super(node); this.signs = signs; this.position = position; diff --git a/core/src/main/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignModel.java b/core/src/main/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignModel.java index 716aff764..3c6c3a8b0 100644 --- a/core/src/main/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignModel.java +++ b/core/src/main/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignModel.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.TagSet; import org.osm2world.core.math.VectorXYZ; import org.osm2world.core.target.common.material.*; @@ -64,7 +64,7 @@ public TrafficSignModel(Material material, TrafficSignType type, int numPosts, d this.defaultHeight = height; } - public static TrafficSignModel create(TrafficSignIdentifier signId, TagSet tagsOfElement, Configuration config) { + public static TrafficSignModel create(TrafficSignIdentifier signId, TagSet tagsOfElement, O2WConfig config) { /* prepare map with subtype and/or brackettext values */ diff --git a/core/src/main/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignType.java b/core/src/main/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignType.java index a92ca0c90..888adfdad 100644 --- a/core/src/main/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignType.java +++ b/core/src/main/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignType.java @@ -5,7 +5,7 @@ import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.target.common.material.ConfMaterial; import org.osm2world.core.target.common.material.Material; import org.osm2world.core.target.common.material.Material.Interpolation; @@ -38,12 +38,12 @@ public String toString() { } /** - * Parses a {@link Configuration} for the traffic sign-specific keys - * trafficSign_NAME_numPosts|defaultHeight|material + * Parses an {@link O2WConfig} for the traffic sign-specific keys + * trafficSign_NAME_numPosts|defaultHeight|material * - * @return a {@link TrafficSignType} with the the parsed values; null if the type does not exist or is invalid + * @return a {@link TrafficSignType} with the parsed values; null if the type does not exist or is invalid */ - public static @Nullable TrafficSignType fromConfig(TrafficSignIdentifier sign, Configuration config) { + public static @Nullable TrafficSignType fromConfig(TrafficSignIdentifier sign, O2WConfig config) { TrafficSignType result = fromConfig(sign.configKey(), config); if (result == null) { result = fromConfig(sign.configKeyWithoutSubType(), config); @@ -51,7 +51,7 @@ public String toString() { return result; } - private static @Nullable TrafficSignType fromConfig(String configKey, Configuration config) { + private static @Nullable TrafficSignType fromConfig(String configKey, O2WConfig config) { String keyPrefix = "trafficSign_" + configKey; diff --git a/core/src/test/java/org/osm2world/core/conversion/O2WConfigTest.java b/core/src/test/java/org/osm2world/core/conversion/O2WConfigTest.java new file mode 100644 index 000000000..1b56a24f8 --- /dev/null +++ b/core/src/test/java/org/osm2world/core/conversion/O2WConfigTest.java @@ -0,0 +1,58 @@ +package org.osm2world.core.conversion; + +import static org.junit.Assert.*; + +import java.io.File; + +import org.junit.Test; + +public class O2WConfigTest { + + @Test + public void testLoadConfigFiles() { + + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + File config01 = new File(classLoader.getResource("config/testConfig_01.properties").getFile()); + File config02 = new File(classLoader.getResource("config/testConfig_02.properties").getFile()); + + O2WConfig result = new O2WConfig(null, config01, config02); + + assertEquals(0.02, result.getDouble("treesPerSquareMeter", 0.42), 0); + assertEquals("foobar", result.getString("stringProperty")); + assertFalse(result.getBoolean("keepOsmElements")); + + result = result.withProperty("treesPerSquareMeter", null); + result = result.withProperty("stringProperty", "baz"); + + assertEquals(0.42, result.getDouble("treesPerSquareMeter", 0.42), 0); + assertEquals("baz", result.getString("stringProperty", "something")); + assertFalse(result.getBoolean("keepOsmElements")); + + File texturePath = ConfigUtil.resolveFileConfigProperty(result, "textures/test.png"); + assertTrue(texturePath.exists()); + + } + + @Test + public void testLoadIncludedConfigFiles() { + + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + File parentConfig = new File(classLoader.getResource("config/parentConfig.properties").getFile()); + + O2WConfig result = new O2WConfig(null, parentConfig); + + assertEquals(0.02, result.getDouble("treesPerSquareMeter", 0), 0); + assertEquals("foobar", result.getString("stringProperty")); + assertEquals(3.14f, result.getFloat("parentProperty", 0), 0); + assertFalse(result.getBoolean("keepOsmElements")); + + result = result.withProperty("treesPerSquareMeter", null); + result = result.withProperty("stringProperty", "baz"); + + assertEquals(0.42, result.getDouble("treesPerSquareMeter", 0.42), 0); + assertEquals("baz", result.getString("stringProperty", "something")); + assertFalse(result.getBoolean("keepOsmElements")); + + } + +} \ No newline at end of file diff --git a/core/src/test/java/org/osm2world/core/world/modules/building/Indoor/IndoorWallTest.java b/core/src/test/java/org/osm2world/core/world/modules/building/Indoor/IndoorWallTest.java index d99f0a408..e5e4423b4 100644 --- a/core/src/test/java/org/osm2world/core/world/modules/building/Indoor/IndoorWallTest.java +++ b/core/src/test/java/org/osm2world/core/world/modules/building/Indoor/IndoorWallTest.java @@ -7,8 +7,8 @@ import java.util.List; -import org.apache.commons.configuration.BaseConfiguration; import org.junit.Test; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.creation.MapDataBuilder; import org.osm2world.core.map_data.data.MapArea; import org.osm2world.core.map_data.data.MapNode; @@ -38,7 +38,7 @@ public void testGetNewEndPoints(){ builder.createNode(-10, +5)); MapArea buildingPartArea = builder.createWayArea(buildingNodes, TagSet.of("building", "yes", "building:levels", "5", "height", "12.5")); - Building building = new Building(buildingPartArea, new BaseConfiguration()); + Building building = new Building(buildingPartArea, new O2WConfig()); BuildingPart buildingPart = building.getParts().get(0); /* generate wall */ diff --git a/core/src/test/java/org/osm2world/core/world/modules/building/LevelAndHeightDataTest.java b/core/src/test/java/org/osm2world/core/world/modules/building/LevelAndHeightDataTest.java index 7d2fe2e55..370d50a9a 100644 --- a/core/src/test/java/org/osm2world/core/world/modules/building/LevelAndHeightDataTest.java +++ b/core/src/test/java/org/osm2world/core/world/modules/building/LevelAndHeightDataTest.java @@ -8,8 +8,8 @@ import java.util.List; import java.util.stream.IntStream; -import org.apache.commons.configuration.BaseConfiguration; import org.junit.Test; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.creation.MapDataBuilder; import org.osm2world.core.map_data.data.MapArea; import org.osm2world.core.map_data.data.MapNode; @@ -38,7 +38,7 @@ public void testLevelBasics() { "building", "yes", "building:levels", "5", "height", "12.5")); - Building building = new Building(buildingArea, new BaseConfiguration()); + Building building = new Building(buildingArea, new O2WConfig()); LevelAndHeightData levelStructure = building.getParts().get(0).levelStructure; assertEquals(12.5, levelStructure.height(), 0); @@ -76,7 +76,7 @@ public void testMinLevel() { "height", "12.5", "building:min_level", "2")); - Building building = new Building(buildingArea, new BaseConfiguration()); + Building building = new Building(buildingArea, new O2WConfig()); LevelAndHeightData levelStructure = building.getParts().get(0).levelStructure; assertEquals(12.5, levelStructure.height(), 0); @@ -117,7 +117,7 @@ public void testSITLevelsAndRoof() { builder.createWayArea(nodes, TagSet.of("indoor", "level", "level", "10", "height", "5")); builder.createWayArea(nodes, TagSet.of("indoor", "level", "level", "11", "ref", "L11")); - Building building = new Building(buildingArea, new BaseConfiguration()); + Building building = new Building(buildingArea, new O2WConfig()); LevelAndHeightData levelStructure = building.getParts().get(0).levelStructure; assertEquals(19, levelStructure.height(), 0); @@ -157,7 +157,7 @@ public void testSingleLevel() { "building:levels", "1", "min_level", "42", "max_level", "42")); - Building building = new Building(buildingArea, new BaseConfiguration()); + Building building = new Building(buildingArea, new O2WConfig()); LevelAndHeightData levelStructure = building.getParts().get(0).levelStructure; assertEquals(1, levelStructure.levels.size()); @@ -179,7 +179,7 @@ public void testRoofLevelsOnly() { "roof:levels", "2", "roof:shape", "gabled", "height", "8 m")); - Building building = new Building(buildingArea, new BaseConfiguration()); + Building building = new Building(buildingArea, new O2WConfig()); LevelAndHeightData levelStructure = building.getParts().get(0).levelStructure; assertEquals(8, levelStructure.height(), 0); @@ -202,7 +202,7 @@ public void testRoofLevelsOnly() { "building:levels", "0", "roof:levels", "2", "roof:shape", "gabled")); - building = new Building(buildingArea, new BaseConfiguration()); + building = new Building(buildingArea, new O2WConfig()); LevelAndHeightData result2 = building.getParts().get(0).levelStructure; assertEquals(0, result2.heightWithoutRoof(), 0); @@ -231,7 +231,7 @@ public void testUndergroundLevelsOnly() { "building:levels", "0", "building:levels:underground", "2", "max_level", "-1")); - Building building = new Building(buildingArea, new BaseConfiguration()); + Building building = new Building(buildingArea, new O2WConfig()); LevelAndHeightData levelStructure = building.getParts().get(0).levelStructure; assertEquals(0, levelStructure.height(), 0); @@ -260,7 +260,7 @@ public void testSITMinLevelWithoutMaxLevel() { "min_level", "7", "non_existent_levels", "8;11")); - Building building = new Building(buildingPartArea, new BaseConfiguration()); + Building building = new Building(buildingPartArea, new O2WConfig()); LevelAndHeightData levelStructure = building.getParts().get(0).levelStructure; assertEquals(1, levelStructure.levels(EnumSet.of(LevelType.UNDERGROUND)).size()); @@ -288,7 +288,7 @@ public void testExplicitLevelHeightsDoNotMatchTotalHeight() { builder.createWayArea(nodes, TagSet.of("indoor", "level", "level", "0", "height", "4")); builder.createWayArea(nodes, TagSet.of("indoor", "level", "level", "1", "height", "6")); - Building building = new Building(buildingArea, new BaseConfiguration()); + Building building = new Building(buildingArea, new O2WConfig()); LevelAndHeightData levelStructure = building.getParts().get(0).levelStructure; assertEquals(5, levelStructure.height(), 0); @@ -315,7 +315,7 @@ public void testInvalidMinHeight() { "roof:height", "2", "min_height", "4")); - Building building = new Building(buildingArea, new BaseConfiguration()); + Building building = new Building(buildingArea, new O2WConfig()); LevelAndHeightData levelStructure = building.getParts().get(0).levelStructure; assertEquals(5, levelStructure.height(), 5); @@ -337,7 +337,7 @@ public void testRoofLevelAndMinLevel() { "building:min_level", "2", "roof:levels", "1", "roof:shape", "round")); - Building building = new Building(buildingArea, new BaseConfiguration()); + Building building = new Building(buildingArea, new O2WConfig()); LevelAndHeightData levelStructure = building.getParts().get(0).levelStructure; assertEquals(2, levelStructure.levels.size()); diff --git a/core/src/test/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignModuleTest.java b/core/src/test/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignModuleTest.java index 58acb96b2..2bc65c6db 100644 --- a/core/src/test/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignModuleTest.java +++ b/core/src/test/java/org/osm2world/core/world/modules/traffic_sign/TrafficSignModuleTest.java @@ -1,7 +1,6 @@ package org.osm2world.core.world.modules.traffic_sign; import static java.lang.Math.PI; -import static java.util.Collections.emptyMap; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.osm2world.core.world.modules.traffic_sign.TrafficSignModule.findClosestJunction; @@ -10,9 +9,9 @@ import java.util.ArrayList; import java.util.List; -import org.apache.commons.configuration.MapConfiguration; import org.junit.Test; import org.osm2world.core.ConversionFacade; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.creation.MapDataBuilder; import org.osm2world.core.map_data.data.MapNode; import org.osm2world.core.map_data.data.MapWay; @@ -96,7 +95,7 @@ public void zeroConnectedJunctions() throws Exception { List wayNodes = List.of(node00, node01, node02, node03); MapWay way = builder.createWay(wayNodes, TagSet.of("highway", "tertiary")); - way.getWaySegments().forEach(s -> s.addRepresentation(new Road(s, new MapConfiguration(emptyMap())))); + way.getWaySegments().forEach(s -> s.addRepresentation(new Road(s, new O2WConfig()))); /* check that no junction is found for any starting node */ @@ -131,7 +130,7 @@ public void oneConnectedJunction() throws Exception { for (List wayNodes : wayNodeLists) { MapWay way = builder.createWay(wayNodes, TagSet.of("highway", "tertiary")); - way.getWaySegments().forEach(s -> s.addRepresentation(new Road(s, new MapConfiguration(emptyMap())))); + way.getWaySegments().forEach(s -> s.addRepresentation(new Road(s, new O2WConfig()))); } /* check that the single junction node is found for each starting node */ @@ -172,7 +171,7 @@ public void twoConnectedJunctions() throws Exception { for (List wayNodes : wayNodeLists) { MapWay way = builder.createWay(wayNodes, TagSet.of("highway", "tertiary")); - way.getWaySegments().forEach(s -> s.addRepresentation(new Road(s, new MapConfiguration(emptyMap())))); + way.getWaySegments().forEach(s -> s.addRepresentation(new Road(s, new O2WConfig()))); } /* check that the correct junction node is found for each starting node */ @@ -203,7 +202,7 @@ public void zeroConnectedJunctionsWithLoop() { List wayNodes = List.of(node00, node01, node02, node03, node00); MapWay way = builder.createWay(wayNodes, TagSet.of("highway", "tertiary")); - way.getWaySegments().forEach(s -> s.addRepresentation(new Road(s, new MapConfiguration(emptyMap())))); + way.getWaySegments().forEach(s -> s.addRepresentation(new Road(s, new O2WConfig()))); /* check that there is no infinite loop and that no junction is reported */ diff --git a/core/src/test/resources/config/parentConfig.properties b/core/src/test/resources/config/parentConfig.properties new file mode 100644 index 000000000..518d444ba --- /dev/null +++ b/core/src/test/resources/config/parentConfig.properties @@ -0,0 +1,4 @@ +include = testConfig_01.properties +include = testConfig_02.properties + +parentProperty = 3.14 diff --git a/desktop/src/test/resources/testConfig_01.properties b/core/src/test/resources/config/testConfig_01.properties similarity index 100% rename from desktop/src/test/resources/testConfig_01.properties rename to core/src/test/resources/config/testConfig_01.properties diff --git a/desktop/src/test/resources/testConfig_02.properties b/core/src/test/resources/config/testConfig_02.properties similarity index 100% rename from desktop/src/test/resources/testConfig_02.properties rename to core/src/test/resources/config/testConfig_02.properties diff --git a/core/src/test/resources/config/textures/test.png b/core/src/test/resources/config/textures/test.png new file mode 100644 index 0000000000000000000000000000000000000000..d2aba34fcc59489b890f31a2d7c487ae6be5069d GIT binary patch literal 8712 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 extraProperties = lod == null ? Map.of() : Map.of("lod", lod.ordinal()); + config = new O2WConfig(extraProperties, configFiles); + } catch (Exception e) { System.err.println("could not read config, ignoring it:\n" + e); } @@ -225,32 +218,4 @@ private static void executeArgumentsGroup(CLIArgumentsGroup argumentsGroup) { } } - public static Configuration loadConfigFiles(@Nullable LevelOfDetail lod, File... configFiles) - throws ConfigurationException { - - PropertiesConfiguration config = new PropertiesConfiguration(); - config.setListDelimiter(';'); - - for (File it : configFiles) { - config.load(it); - } - - Arrays.stream(configFiles) - .filter(f -> f.exists()) - .findFirst() - .ifPresent(f -> { - config.addProperty("configPath", f.getAbsoluteFile().getParent()); - }); - - if (lod != null) { - config.clearProperty("lod"); - config.addProperty("lod", lod.ordinal()); - } - - ConfigUtil.parseFonts(config); - - return config; - - } - } \ No newline at end of file diff --git a/desktop/src/main/java/org/osm2world/console/Output.java b/desktop/src/main/java/org/osm2world/console/Output.java index 87972353c..9da65dcbf 100644 --- a/desktop/src/main/java/org/osm2world/console/Output.java +++ b/desktop/src/main/java/org/osm2world/console/Output.java @@ -24,7 +24,6 @@ import javax.annotation.Nullable; -import org.apache.commons.configuration.Configuration; import org.imintel.mbtiles4j.MBTilesReadException; import org.osm2world.console.CLIArgumentsUtil.OutputMode; import org.osm2world.core.ConversionFacade; @@ -32,6 +31,7 @@ import org.osm2world.core.ConversionFacade.ProgressListener; import org.osm2world.core.ConversionFacade.Results; import org.osm2world.core.conversion.ConversionLog; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.MapMetadata; import org.osm2world.core.math.VectorXYZ; import org.osm2world.core.math.geo.LatLonEle; @@ -57,7 +57,7 @@ public final class Output { private Output() {} - public static void output(Configuration config, + public static void output(O2WConfig config, CLIArgumentsGroup argumentsGroup) throws IOException { @@ -264,7 +264,7 @@ public static void output(Configuration config, } private static void writeLogFiles(File logDir, String fileNameBase, PerformanceListener perfListener, - Configuration config) { + O2WConfig config) { double totalTime = Duration.between(perfListener.startTime, now()).toMillis() / 1000.0; diff --git a/desktop/src/main/java/org/osm2world/viewer/Viewer.java b/desktop/src/main/java/org/osm2world/viewer/Viewer.java index b9c846794..86ff18e9a 100644 --- a/desktop/src/main/java/org/osm2world/viewer/Viewer.java +++ b/desktop/src/main/java/org/osm2world/viewer/Viewer.java @@ -2,7 +2,7 @@ import javax.swing.*; -import org.apache.commons.configuration.BaseConfiguration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.viewer.view.ViewerFrame; public class Viewer { @@ -15,7 +15,7 @@ private Viewer(String[] args) { System.out.println("Error setting native look and feel: " + e); } - new ViewerFrame(new BaseConfiguration(), null, null, null).setVisible(true); + new ViewerFrame(new O2WConfig(), null, null, null).setVisible(true); } diff --git a/desktop/src/main/java/org/osm2world/viewer/control/actions/AbstractLoadOSMAction.java b/desktop/src/main/java/org/osm2world/viewer/control/actions/AbstractLoadOSMAction.java index 940dc78ea..0c087151a 100644 --- a/desktop/src/main/java/org/osm2world/viewer/control/actions/AbstractLoadOSMAction.java +++ b/desktop/src/main/java/org/osm2world/viewer/control/actions/AbstractLoadOSMAction.java @@ -8,13 +8,12 @@ import javax.swing.*; -import org.apache.commons.configuration.ConfigurationException; import org.osm2world.core.ConversionFacade.Phase; import org.osm2world.core.ConversionFacade.ProgressListener; import org.osm2world.core.map_elevation.creation.EleCalculator; import org.osm2world.core.map_elevation.creation.TerrainInterpolator; -import org.osm2world.core.util.exception.InvalidGeometryException; import org.osm2world.core.osm.creation.OSMDataReaderView; +import org.osm2world.core.util.exception.InvalidGeometryException; import org.osm2world.core.util.functions.DefaultFactory; import org.osm2world.viewer.model.Data; import org.osm2world.viewer.model.RenderOptions; @@ -45,7 +44,7 @@ protected void loadOSMData(OSMDataReaderView dataReader, boolean resetCamera) { try { data.reloadConfig(renderOptions); - } catch (ConfigurationException e) { + } catch (Exception e) { JOptionPane.showMessageDialog(viewerFrame, "Could not reload the properties configuration file:\n" diff --git a/desktop/src/main/java/org/osm2world/viewer/control/actions/SetLodAction.java b/desktop/src/main/java/org/osm2world/viewer/control/actions/SetLodAction.java index 6a81d9023..9bd95fd7b 100644 --- a/desktop/src/main/java/org/osm2world/viewer/control/actions/SetLodAction.java +++ b/desktop/src/main/java/org/osm2world/viewer/control/actions/SetLodAction.java @@ -5,7 +5,7 @@ import javax.swing.*; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.target.common.mesh.LevelOfDetail; import org.osm2world.viewer.model.Data; import org.osm2world.viewer.model.RenderOptions; @@ -39,9 +39,7 @@ public void actionPerformed(ActionEvent e) { renderOptions.setLod(lod); - Configuration config = data.getConfig(); - config.clearProperty("lod"); - config.addProperty("lod", lod.ordinal()); + O2WConfig config = data.getConfig().withProperty("lod", lod.ordinal()); data.setConfig(config); putValue(SELECTED_KEY, lod == renderOptions.getLod()); diff --git a/desktop/src/main/java/org/osm2world/viewer/control/actions/StatisticsAction.java b/desktop/src/main/java/org/osm2world/viewer/control/actions/StatisticsAction.java index 227b011d2..5e0146009 100644 --- a/desktop/src/main/java/org/osm2world/viewer/control/actions/StatisticsAction.java +++ b/desktop/src/main/java/org/osm2world/viewer/control/actions/StatisticsAction.java @@ -7,10 +7,10 @@ import javax.swing.*; import org.osm2world.core.ConversionFacade.Results; +import org.osm2world.core.conversion.ConfigUtil; import org.osm2world.core.target.TargetUtil; import org.osm2world.core.target.common.mesh.LevelOfDetail; import org.osm2world.core.target.statistics.StatisticsTarget; -import org.osm2world.core.util.ConfigUtil; import org.osm2world.viewer.model.Data; import org.osm2world.viewer.view.StatisticsDialog; import org.osm2world.viewer.view.ViewerFrame; diff --git a/desktop/src/main/java/org/osm2world/viewer/model/Data.java b/desktop/src/main/java/org/osm2world/viewer/model/Data.java index a4496fd1e..11f45c0ef 100644 --- a/desktop/src/main/java/org/osm2world/viewer/model/Data.java +++ b/desktop/src/main/java/org/osm2world/viewer/model/Data.java @@ -4,16 +4,15 @@ import java.io.IOException; import java.io.Serial; import java.util.List; +import java.util.Map; import java.util.Observable; import javax.annotation.Nonnull; -import org.apache.commons.configuration.Configuration; -import org.apache.commons.configuration.ConfigurationException; -import org.osm2world.console.OSM2World; import org.osm2world.core.ConversionFacade; import org.osm2world.core.ConversionFacade.ProgressListener; import org.osm2world.core.ConversionFacade.Results; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_elevation.creation.EleCalculator; import org.osm2world.core.map_elevation.creation.TerrainInterpolator; import org.osm2world.core.osm.creation.GeodeskReader; @@ -21,32 +20,29 @@ import org.osm2world.core.osm.creation.OSMDataReaderView; import org.osm2world.core.osm.creation.OSMFileReader; import org.osm2world.core.osm.data.OSMData; -import org.osm2world.core.util.ConfigUtil; import org.osm2world.core.util.functions.Factory; public class Data extends Observable { private final @Nonnull List configFiles; - private Configuration config; + private O2WConfig config; private File osmFile = null; private Results conversionResults = null; - public Data(List configFiles, Configuration config) { + public Data(List configFiles, O2WConfig config) { this.configFiles = configFiles; this.config = config; } - public Configuration getConfig() { + public O2WConfig getConfig() { return config; } /** updates the configuration */ - public void setConfig(Configuration config) { + public void setConfig(O2WConfig config) { this.config = config; - ConfigUtil.parseFonts(config); - if (conversionResults != null) { this.setChanged(); this.notifyObservers(); @@ -55,8 +51,8 @@ public void setConfig(Configuration config) { } /** reloads the configuration from the config file */ - public void reloadConfig(RenderOptions options) throws ConfigurationException { - Configuration config = OSM2World.loadConfigFiles(options.lod, configFiles.toArray(new File[0])); + public void reloadConfig(RenderOptions options) { + var config = new O2WConfig(Map.of("lod", options.lod.ordinal()), configFiles.toArray(new File[0])); this.setConfig(config); } @@ -94,8 +90,11 @@ public void loadOSMData(OSMDataReaderView reader, boolean failOnLargeBBox, } } + // disable LOD restrictions to make all LOD available through the LOD selector + O2WConfig configForLoad = config.withProperty("lod", null); + conversionResults = converter.createRepresentations( - osmData, null, null, config, null); + osmData, null, null, configForLoad, null); } catch (IOException | BoundingBoxSizeException e) { diff --git a/desktop/src/main/java/org/osm2world/viewer/view/ViewerFrame.java b/desktop/src/main/java/org/osm2world/viewer/view/ViewerFrame.java index 8d7a91910..6a6e18d77 100644 --- a/desktop/src/main/java/org/osm2world/viewer/view/ViewerFrame.java +++ b/desktop/src/main/java/org/osm2world/viewer/view/ViewerFrame.java @@ -13,7 +13,7 @@ import javax.annotation.Nullable; import javax.swing.*; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_elevation.creation.*; import org.osm2world.core.target.common.mesh.LevelOfDetail; import org.osm2world.viewer.control.actions.*; @@ -49,7 +49,7 @@ public class ViewerFrame extends JFrame { * @param configFiles properties (where config was loaded from), can be null * @param inputFile osm data file to be loaded at viewer start, can be null */ - public ViewerFrame(final Configuration config, @Nullable LevelOfDetail lod, + public ViewerFrame(final O2WConfig config, @Nullable LevelOfDetail lod, final List configFiles, File inputFile) { super("OSM2World Viewer"); @@ -277,8 +277,8 @@ public MessageManager getMessageManager() { * Prepare OpenGL (Profile/Capabilities) and create matching canvas. * @param config config for OpenGL parameters */ - private void createCanvas(Configuration config) { - // select OpengGL implementation. TODO: autodetection + private void createCanvas(O2WConfig config) { + // select OpenGL implementation. TODO: autodetection GLProfile profile; if ("shader".equals(config.getString("joglImplementation"))) { profile = GLProfile.get(GLProfile.GL3); @@ -319,7 +319,7 @@ private void createCanvas(Configuration config) { /** * Update with new configuration. May recreate the canvas when the OpenGL-Parameters changed */ - public void setConfiguration(Configuration config) { + public void setConfiguration(O2WConfig config) { if (!checkConfiguration(config)) { System.out.println("OpenGL configuration changed. Recreating canvas."); @@ -342,7 +342,7 @@ public void setConfiguration(Configuration config) { * Check if the current OpenGL-Parameters match the given configuration. * @return true if the configuration matches, false otherwise. In the latter case the GLCanvas needs to be recreated */ - private boolean checkConfiguration(Configuration config) { + private boolean checkConfiguration(O2WConfig config) { if ("shader".equals(config.getString("joglImplementation"))) { if (!glCanvas.getGLProfile().isGL3()) return false; diff --git a/desktop/src/main/java/org/osm2world/viewer/view/ViewerGLCanvas.java b/desktop/src/main/java/org/osm2world/viewer/view/ViewerGLCanvas.java index 387cf8349..a3a0131f3 100644 --- a/desktop/src/main/java/org/osm2world/viewer/view/ViewerGLCanvas.java +++ b/desktop/src/main/java/org/osm2world/viewer/view/ViewerGLCanvas.java @@ -1,8 +1,8 @@ package org.osm2world.viewer.view; import static jogamp.nativewindow.awt.AWTMisc.getWindow; -import static org.osm2world.core.util.ConfigUtil.BG_COLOR_KEY; -import static org.osm2world.core.util.ConfigUtil.parseColor; +import static org.osm2world.core.conversion.ConfigUtil.BG_COLOR_KEY; +import static org.osm2world.core.conversion.ConfigUtil.parseColor; import java.awt.*; diff --git a/desktop/src/main/java/org/osm2world/viewer/view/debug/DebugView.java b/desktop/src/main/java/org/osm2world/viewer/view/debug/DebugView.java index b74d65815..b5be5e764 100644 --- a/desktop/src/main/java/org/osm2world/viewer/view/debug/DebugView.java +++ b/desktop/src/main/java/org/osm2world/viewer/view/debug/DebugView.java @@ -6,8 +6,8 @@ import java.awt.*; import java.util.List; -import org.apache.commons.configuration.Configuration; import org.osm2world.core.ConversionFacade.Results; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.map_data.data.MapData; import org.osm2world.core.map_elevation.creation.TerrainElevationData; import org.osm2world.core.math.VectorXYZ; @@ -29,7 +29,7 @@ */ public abstract class DebugView { - protected Configuration config; + protected O2WConfig config; protected MapData map; protected TerrainElevationData eleData; @@ -45,7 +45,7 @@ public abstract class DebugView { private JOGLTarget target = null; private boolean targetNeedsReset; - public final void setConfiguration(Configuration config) { + public final void setConfiguration(O2WConfig config) { this.config = config; diff --git a/desktop/src/test/java/org/osm2world/console/OSM2WorldTest.java b/desktop/src/test/java/org/osm2world/console/OSM2WorldTest.java deleted file mode 100644 index 3083b09ae..000000000 --- a/desktop/src/test/java/org/osm2world/console/OSM2WorldTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.osm2world.console; - -import static org.junit.Assert.assertEquals; - -import java.io.File; - -import org.apache.commons.configuration.Configuration; -import org.apache.commons.configuration.ConfigurationException; -import org.junit.Test; - -public class OSM2WorldTest { - - @Test - public void testLoadConfigFiles() throws ConfigurationException { - - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - File config01 = new File(classLoader.getResource("testConfig_01.properties").getFile()); - File config02 = new File(classLoader.getResource("testConfig_02.properties").getFile()); - - Configuration result = OSM2World.loadConfigFiles(null, config01, config02); - - assertEquals(0.02, result.getDouble("treesPerSquareMeter"), 0); - assertEquals("foobar", result.getString("stringProperty")); - assertEquals(false, result.getBoolean("keepOsmElements")); - - } - -} \ No newline at end of file diff --git a/opengl/src/main/java/org/osm2world/core/target/jogl/JOGLTarget.java b/opengl/src/main/java/org/osm2world/core/target/jogl/JOGLTarget.java index d594d7e71..1016d8e21 100644 --- a/opengl/src/main/java/org/osm2world/core/target/jogl/JOGLTarget.java +++ b/opengl/src/main/java/org/osm2world/core/target/jogl/JOGLTarget.java @@ -4,7 +4,7 @@ import java.io.File; import java.util.List; -import org.apache.commons.configuration.Configuration; +import org.osm2world.core.conversion.O2WConfig; import org.osm2world.core.math.VectorXYZ; import org.osm2world.core.math.shapes.AxisAlignedRectangleXZ; import org.osm2world.core.target.Target; @@ -43,7 +43,7 @@ public void setGlobalLightingParameters( public void setRenderingParameters( JOGLRenderingParameters renderingParameters); - public void setConfiguration(Configuration config); + public void setConfiguration(O2WConfig config); public boolean isFinished();