/* * Copyright 2012 Benjamin Glatzel <benjamin.glatzel@me.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.terasology.logic.manager; import com.google.protobuf.TextFormat; import org.lwjgl.opengl.DisplayMode; import org.lwjgl.opengl.PixelFormat; import org.terasology.game.CoreRegistry; import org.terasology.protobuf.Configuration; import org.terasology.rendering.world.WorldRenderer; import javax.vecmath.Vector2f; import java.io.*; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; /** * @author Benjamin Glatzel <benjamin.glatzel@me.com>, * @author Kai Kratz <kaikratz@googlemail.com> */ public final class Config { private Logger logger = Logger.getLogger(getClass().getName()); private final static Config _instance = new Config(); private Configuration.Setting.Builder _setting; public static Config getInstance() { return _instance; } private Config() { if (!loadLastConfig()) { loadDefaultConfig(); } } private boolean loadLastConfig() { return loadConfig(new File(PathManager.getInstance().getWorldPath(), "last.cfg")); } private void loadDefaultConfig() { _setting = Configuration.Setting.newBuilder(); } public boolean loadConfig(File file) { Configuration.Setting.Builder setting = Configuration.Setting.newBuilder(); if (file.exists()) { logger.log(Level.INFO, "Using config file: " + file); try { FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis); TextFormat.merge(isr, setting); isr.close(); } catch (Exception e) { logger.log(Level.WARNING, "Could not load config file " + file, e); return false; } } _setting = setting; return true; } public void saveConfig(File file) { try { logger.log(Level.INFO, "Using config file: " + file); FileOutputStream fos = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(fos); TextFormat.print(_setting.build(), osw); osw.close(); } catch (Exception e) { logger.log(Level.WARNING, "Could not write " + file, e); } } /** * Get / Set methods * */ public String getWorldTitle() { return _setting.getWorldBuilder().getWorldTitle(); } public void setWorldTitle(String _worldTitle) { _setting.getWorldBuilder().setWorldTitle(_worldTitle); } public float getForestGrassDensity() { return _setting.getWorldBuilder().getForestGrassDensity(); } public void setForestGrassDensity(float _forrestGrassDensity) { _setting.getWorldBuilder().setForestGrassDensity(_forrestGrassDensity); } public float getPlainsGrassDensity() { return _setting.getWorldBuilder().getPlainsGrassDensity(); } public void setPlainsGrassDensity(float plainsGrassDensity) { _setting.getWorldBuilder().setPlainsGrassDensity(plainsGrassDensity); } public float getSnowGrassDensity() { return _setting.getWorldBuilder().getSnowGrassDensity(); } public void setSnowGrassDensity(float snowGrassDensity) { _setting.getWorldBuilder().setSnowGrassDensity(snowGrassDensity); } public float getMountainGrassDensity() { return _setting.getWorldBuilder().getMountainGrassDensity(); } public void setMountainGrassDensity(float mountainsGrassDensity) { _setting.getWorldBuilder().setMountainGrassDensity(mountainsGrassDensity); } public float getDesertGrassDensity() { return _setting.getWorldBuilder().getDesertGrassDensity(); } public void setDesertGrassDensity(float desertGrassDensity) { _setting.getWorldBuilder().setDesertGrassDensity(desertGrassDensity); } public long getDayNightLengthInMs() { return _setting.getWorldBuilder().getDayNightLengthInMs(); } public void setDayNightLengthInMs(long dayNightLengthInMs) { _setting.getWorldBuilder().setDayNightLengthInMs(dayNightLengthInMs); } public long getInitialTimeOffsetInMs() { return _setting.getWorldBuilder().getInitialTimeOffsetInMs(); } public void setInitialTimeOffsetInMs(long initialTimeOffsetInMs) { _setting.getWorldBuilder().setInitialTimeOffsetInMs(initialTimeOffsetInMs); } public Vector2f getSpawnOrigin() { float x = _setting.getWorldBuilder().getSpawnOriginBuilder().getX(); float y = _setting.getWorldBuilder().getSpawnOriginBuilder().getX(); return new Vector2f(x, y); } public void setSpawnOrigin(Vector2f spawnOrigin) { _setting.getWorldBuilder().getSpawnOriginBuilder().setX(spawnOrigin.x); _setting.getWorldBuilder().getSpawnOriginBuilder().setY(spawnOrigin.y); } public String getDefaultSeed() { return _setting.getWorldBuilder().getDefaultSeed(); } public void setDefaultSeed(String defaultSeed) { _setting.getWorldBuilder().setDefaultSeed(defaultSeed); } public boolean isDebug() { return _setting.getDebugInfoBuilder().getDebug(); } public void setDebug(boolean debug) { _setting.getDebugInfoBuilder().setDebug(debug); } public boolean isDebugCollision() { return _setting.getDebugInfoBuilder().getDebugCollision(); } public void setDebugCollision(boolean debugCollision) { _setting.getDebugInfoBuilder().setDebugCollision(debugCollision); } public boolean isRenderChunkBoundingBoxes() { return _setting.getDebugInfoBuilder().getRenderChunkBoundingBoxes(); } public void setRenderChunkBoundingBoxes(boolean renderChunkBoundingBoxes) { _setting.getDebugInfoBuilder().setRenderChunkBoundingBoxes(renderChunkBoundingBoxes); } public boolean isDemoFlight() { return _setting.getDebugInfoBuilder().getDemoFlight(); } public void setDemoFlight(boolean demoFlight) { _setting.getDebugInfoBuilder().setDemoFlight(demoFlight); } public double getDemoFlightSpeed() { return _setting.getDebugInfoBuilder().getDemoFlightSpeed(); } public void setDemoFlightSpeed(float demoFlightSpeed) { _setting.getDebugInfoBuilder().setDemoFlightSpeed(demoFlightSpeed); } public int getMaxParticles() { return _setting.getSystemBuilder().getMaxParticles(); } public void setMaxParticles(int maxParticles) { _setting.getSystemBuilder().setMaxParticles(maxParticles); } public Vector2f getCloudResolution() { float x = _setting.getSystemBuilder().getCloudResolutionBuilder().getX(); float y = _setting.getSystemBuilder().getCloudResolutionBuilder().getY(); return new Vector2f(x, y); } public void setCloudResolution(Vector2f cloudResolution) { _setting.getSystemBuilder().getCloudResolutionBuilder().setX(cloudResolution.x); _setting.getSystemBuilder().getCloudResolutionBuilder().setX(cloudResolution.y); } public int getCloudUpdateInterval() { return _setting.getSystemBuilder().getCloudUpdateInterval(); } public void setCloudUpdateInterval(int cloudUpdateInterval) { _setting.getSystemBuilder().setCloudUpdateInterval(cloudUpdateInterval); } public int getMaxThreads() { return _setting.getSystemBuilder().getMaxThreads(); } public void setMaxThreads(int maxThreads) { _setting.getSystemBuilder().setMaxThreads(maxThreads); } public boolean isSaveChunks() { return _setting.getSystemBuilder().getSaveChunks(); } public void setSaveChunks(boolean saveChunks) { _setting.getSystemBuilder().setSaveChunks(saveChunks); } public int getChunkCacheSize() { return _setting.getSystemBuilder().getChunkCacheSize(); } public void setChunkCacheSize(int chunkCacheSize) { _setting.getSystemBuilder().setChunkCacheSize(chunkCacheSize); } public int getMaxChunkVBOs() { return _setting.getSystemBuilder().getMaxChunkVBOs(); } public void setMaxChunkVBOs(int maxChunkVBOs) { _setting.getSystemBuilder().setMaxChunkVBOs(maxChunkVBOs); } public double getGamma() { return _setting.getSystemBuilder().getGamma(); } public void setGamma(float gamma) { _setting.getSystemBuilder().setGamma(gamma); } public PixelFormat getPixelFormat() { int bits = _setting.getSystemBuilder().getPixelFormat(); return new PixelFormat().withDepthBits(bits); } public void setPixelFormat(PixelFormat pixelFormat) { _setting.getSystemBuilder().setPixelFormat(pixelFormat.getBitsPerPixel()); } public DisplayMode getDisplayMode() { int width = _setting.getSystemBuilder().getDisplayModeBuilder().getWidth(); int height = _setting.getSystemBuilder().getDisplayModeBuilder().getHeight(); return new DisplayMode(width, height); } public void setDisplayMode(DisplayMode displayMode) { _setting.getSystemBuilder().getDisplayModeBuilder().setWidth(displayMode.getWidth()); _setting.getSystemBuilder().getDisplayModeBuilder().setHeight(displayMode.getHeight()); } public boolean isFullscreen() { return _setting.getSystemBuilder().getFullscreen(); } public void setFullscreen(boolean fullscreen) { _setting.getSystemBuilder().setFullscreen(fullscreen); } public int getViewingDistanceNear() { return _setting.getSystemBuilder().getViewingDistanceNear(); } public void setViewingDistanceNear(int viewingDistanceNear) { _setting.getSystemBuilder().setViewingDistanceNear(viewingDistanceNear); } public int getViewingDistanceModerate() { return _setting.getSystemBuilder().getViewingDistanceModerate(); } public void setViewingDistanceModerate(int viewingDistanceModerate) { _setting.getSystemBuilder().setViewingDistanceModerate(viewingDistanceModerate); } public int getViewingDistanceFar() { return _setting.getSystemBuilder().getViewingDistanceFar(); } public void setViewingDistanceFar(int viewingDistanceFar) { _setting.getSystemBuilder().setViewingDistanceFar(viewingDistanceFar); } public int getViewingDistanceUltra() { return _setting.getSystemBuilder().getViewingDistanceUltra(); } public void setViewingDistanceUltra(int viewingDistanceUltra) { _setting.getSystemBuilder().setViewingDistanceUltra(viewingDistanceUltra); } public boolean isFlickeringLight() { return _setting.getSystemBuilder().getFlickeringLight(); } public void setFlickeringLight(boolean flickeringLight) { _setting.getSystemBuilder().setFlickeringLight(flickeringLight); } public boolean isEnablePostProcessingEffects() { return _setting.getSystemBuilder().getEnablePostProcessingEffects(); } public void setEnablePostProcessingEffects(boolean enablePostProcessingEffects) { _setting.getSystemBuilder().setEnablePostProcessingEffects(enablePostProcessingEffects); } public boolean isAnimatedWaterAndGrass() { return _setting.getSystemBuilder().getAnimatedWaterAndGrass(); } public void setAnimatedWaterAndGrass(boolean animatedWaterAndGrass) { _setting.getSystemBuilder().setAnimatedWaterAndGrass(animatedWaterAndGrass); } public int getVerticalChunkMeshSegments() { return _setting.getSystemBuilder().getVerticalChunkMeshSegments(); } public void setVerticalChunkMeshSegments(int verticalChunkMeshSegments) { _setting.getSystemBuilder().setVerticalChunkMeshSegments(verticalChunkMeshSegments); } public double getMouseSens() { return _setting.getPlayerBuilder().getMouseSens(); } public void setMouseSens(float mouseSens) { _setting.getPlayerBuilder().setMouseSens(mouseSens); } public float getFov() { return _setting.getPlayerBuilder().getFov(); } public void setFov(float fov) { _setting.getPlayerBuilder().setFov(fov); } public boolean isCameraBobbing() { return _setting.getPlayerBuilder().getCameraBobbing(); } public void setCameraBobbing(boolean cameraBobbing) { _setting.getPlayerBuilder().setCameraBobbing(cameraBobbing); } public boolean isRenderFirstPersonView() { return _setting.getPlayerBuilder().getRenderFirstPersonView(); } public void setRenderFirstPersonView(boolean renderFirstPersonView) { _setting.getPlayerBuilder().setRenderFirstPersonView(renderFirstPersonView); } public boolean isPlacingBox() { return _setting.getPlayerBuilder().getPlacingBox(); } public void setPlacingBox(boolean placingBox) { _setting.getPlayerBuilder().setPlacingBox(placingBox); } public boolean isComplexWater() { return false; } /* MODS */ public List<String> getActiveMods() { return _setting.getActiveModList(); } public void setActiveMods(List<String> activeMods) { _setting.getActiveModList().clear(); _setting.getActiveModList().addAll(activeMods); } /* SPECIAL STUFF */ public int getActiveViewingDistance() { if (_setting.getSystemBuilder().getActiveViewingDistanceId() == 1) return getViewingDistanceModerate(); else if (_setting.getSystemBuilder().getActiveViewingDistanceId() == 2) return getViewingDistanceFar(); else if (_setting.getSystemBuilder().getActiveViewingDistanceId() == 3) return getViewingDistanceUltra(); return getViewingDistanceNear(); } public int getActiveViewingDistanceId() { return _setting.getSystemBuilder().getActiveViewingDistanceId(); } //todo remove this from the config public void setViewingDistanceById(int viewingDistance) { _setting.getSystemBuilder().setActiveViewingDistanceId(viewingDistance); WorldRenderer worldRenderer = CoreRegistry.get(WorldRenderer.class); // Make sure to update the chunks "around" the player if (worldRenderer != null) worldRenderer.changeViewDistance(getActiveViewingDistance()); } //todo remove this from the config public void setGraphicsQuality(int qualityLevel) { if (qualityLevel == 0) { setEnablePostProcessingEffects(false); setAnimatedWaterAndGrass(false); setFlickeringLight(false); } else if (qualityLevel == 1) { setEnablePostProcessingEffects(true); setAnimatedWaterAndGrass(false); setFlickeringLight(true); } else if (qualityLevel == 2) { setEnablePostProcessingEffects(true); setAnimatedWaterAndGrass(true); setFlickeringLight(true); } ShaderManager.getInstance().recompileAllShaders(); } //todo remove this from the config public int getGraphicsQuality() { if (isEnablePostProcessingEffects() & isFlickeringLight() && !isAnimatedWaterAndGrass()) { return 1; } else if (isEnablePostProcessingEffects() & isFlickeringLight() && isAnimatedWaterAndGrass()) { return 2; } return 0; } }