Merge pull request #2 from Treer/revert-1-infinite-zoom

Revert "Infinite zoom"
master
Treer 2018-03-08 23:39:59 +11:00 committed by GitHub
commit 196a2bca7b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 10 additions and 75 deletions

View File

@ -1,7 +1,6 @@
package amidst.fragment; package amidst.fragment;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicReferenceArray; import java.util.concurrent.atomic.AtomicReferenceArray;
@ -77,12 +76,7 @@ import amidst.mojangapi.world.oracle.EndIsland;
*/ */
@NotThreadSafe @NotThreadSafe
public class Fragment { public class Fragment {
// Every pixel in the fragment is 2^size blocks in minecraft public static final int SIZE = Resolution.FRAGMENT.getStep();
private int size; //= Resolution.FRAGMENT.getStep();
public static int SIZE = 1 << 9;
// Resolution, same as size
public static Resolution resolution = null;
public Resolution localResolution = null;
private volatile boolean isInitialized = false; private volatile boolean isInitialized = false;
private volatile boolean isLoaded = false; private volatile boolean isLoaded = false;
@ -107,69 +101,16 @@ public class Fragment {
return alpha; return alpha;
} }
public void initBiomeData(int width, int height, Resolution resolution) { public void initBiomeData(int width, int height) {
this.localResolution = resolution;
biomeData = new short[width][height]; biomeData = new short[width][height];
} }
@CalledOnlyBy(AmidstThread.FRAGMENT_LOADER) @CalledOnlyBy(AmidstThread.FRAGMENT_LOADER)
public void populateBiomeData(BiomeDataOracle biomeDataOracle) { public void populateBiomeData(BiomeDataOracle biomeDataOracle) {
if(localResolution == Resolution.WORLD) { biomeDataOracle.populateArray(corner, biomeData, true);
biomeDataOracle.populateArray(corner, biomeData, false);
}
else if(localResolution == Resolution.QUARTER) {
biomeDataOracle.populateArray(corner, biomeData, true);
}
else {
int size = Resolution.QUARTER.getStepsPerFragment();
int step = localResolution.getStep() / Resolution.QUARTER.getStep();
short[][] tmpBiomeData = new short[size][size];
biomeDataOracle.populateArray(corner, tmpBiomeData, true);
for (int i = 0; i<biomeData.length; i++) {
for (int j = 0; j<biomeData[i].length; j++) {
// This way is faster
//short biome = tmpBiomeData[i*step][j*step];
// This way is more accurate: it finds the most common biome
short biomes[] = new short[step*step];
for (int k = 0; k<step; k++) {
for (int l = 0; l<step; l++) {
biomes[k*step+l] = tmpBiomeData[i*step+k][j*step+l];
}
}
short biome = mostCommonFromArray(biomes);
biomeData[i][j] = biome;
}
}
}
}
private short mostCommonFromArray(short a[]) {
Arrays.sort(a);
short previous = a[0];
short popular = a[0];
int count = 1;
int maxCount = 1;
for (int i = 1; i < a.length; i++) {
if (a[i] == previous)
count++;
else {
if (count > maxCount) {
popular = a[i-1];
maxCount = count;
}
previous = a[i];
count = 1;
}
}
return count > maxCount ? a[a.length-1] : popular;
} }
public short getBiomeDataAt(int x, int y) { public short getBiomeDataAt(int x, int y) {
//if(x==0 || y==0) return 0;
//return (short)(((x+y)&1)+5);
return biomeData[x][y]; return biomeData[x][y];
} }

View File

@ -5,22 +5,19 @@ import amidst.documentation.CalledOnlyBy;
import amidst.documentation.Immutable; import amidst.documentation.Immutable;
import amidst.fragment.Fragment; import amidst.fragment.Fragment;
import amidst.mojangapi.world.coordinates.Resolution; import amidst.mojangapi.world.coordinates.Resolution;
import amidst.settings.Setting;
@Immutable @Immutable
public class BiomeDataConstructor implements FragmentConstructor { public class BiomeDataConstructor implements FragmentConstructor {
private final int size; private final int size;
private final Resolution resolution;
@CalledOnlyBy(AmidstThread.EDT) @CalledOnlyBy(AmidstThread.EDT)
public BiomeDataConstructor(Resolution resolution) { public BiomeDataConstructor(Resolution resolution) {
this.size = resolution.getStepsPerFragment(); this.size = resolution.getStepsPerFragment();
this.resolution = resolution;
} }
@CalledOnlyBy(AmidstThread.EDT) @CalledOnlyBy(AmidstThread.EDT)
@Override @Override
public void construct(Fragment fragment) { public void construct(Fragment fragment) {
fragment.initBiomeData(size, size, resolution); fragment.initBiomeData(size, size);
} }
} }

View File

@ -40,11 +40,8 @@ import amidst.settings.Settings;
@Immutable @Immutable
public class LayerBuilder { public class LayerBuilder {
private final Iterable<FragmentConstructor> constructors; private final Iterable<FragmentConstructor> constructors;
private Resolution biomeResolution;
public LayerBuilder() { public LayerBuilder() {
this.biomeResolution = Resolution.CHUNK;
Fragment.resolution = this.biomeResolution;
this.constructors = createConstructors(); this.constructors = createConstructors();
} }
@ -54,9 +51,9 @@ public class LayerBuilder {
private Iterable<FragmentConstructor> createConstructors() { private Iterable<FragmentConstructor> createConstructors() {
return Collections.unmodifiableList( return Collections.unmodifiableList(
Arrays.asList( Arrays.asList(
new BiomeDataConstructor(this.biomeResolution), new BiomeDataConstructor(Resolution.QUARTER),
new EndIslandsConstructor(), new EndIslandsConstructor(),
new ImageConstructor(this.biomeResolution, LayerIds.BACKGROUND), new ImageConstructor(Resolution.QUARTER, LayerIds.BACKGROUND),
new ImageConstructor(Resolution.CHUNK, LayerIds.SLIME))); new ImageConstructor(Resolution.CHUNK, LayerIds.SLIME)));
} }
@ -136,7 +133,7 @@ public class LayerBuilder {
new AlphaInitializer( declarations.get(LayerIds.ALPHA), settings.fragmentFading), new AlphaInitializer( declarations.get(LayerIds.ALPHA), settings.fragmentFading),
new BiomeDataLoader( declarations.get(LayerIds.BIOME_DATA), world.getBiomeDataOracle()), new BiomeDataLoader( declarations.get(LayerIds.BIOME_DATA), world.getBiomeDataOracle()),
new EndIslandsLoader( declarations.get(LayerIds.END_ISLANDS), world.getEndIslandOracle()), new EndIslandsLoader( declarations.get(LayerIds.END_ISLANDS), world.getEndIslandOracle()),
new ImageLoader( declarations.get(LayerIds.BACKGROUND), this.biomeResolution, new BackgroundColorProvider(new BiomeColorProvider(biomeSelection, settings.biomeProfileSelection), new TheEndColorProvider())), new ImageLoader( declarations.get(LayerIds.BACKGROUND), Resolution.QUARTER, new BackgroundColorProvider(new BiomeColorProvider(biomeSelection, settings.biomeProfileSelection), new TheEndColorProvider())),
new ImageLoader( declarations.get(LayerIds.SLIME), Resolution.CHUNK, new SlimeColorProvider(world.getSlimeChunkOracle())), new ImageLoader( declarations.get(LayerIds.SLIME), Resolution.CHUNK, new SlimeColorProvider(world.getSlimeChunkOracle())),
new WorldIconLoader<>(declarations.get(LayerIds.SPAWN), world.getSpawnProducer()), new WorldIconLoader<>(declarations.get(LayerIds.SPAWN), world.getSpawnProducer()),
new WorldIconLoader<>(declarations.get(LayerIds.STRONGHOLD), world.getStrongholdProducer()), new WorldIconLoader<>(declarations.get(LayerIds.STRONGHOLD), world.getStrongholdProducer()),
@ -162,7 +159,7 @@ public class LayerBuilder {
// @formatter:off // @formatter:off
return Collections.unmodifiableList(Arrays.asList( return Collections.unmodifiableList(Arrays.asList(
new AlphaUpdater( declarations.get(LayerIds.ALPHA)), new AlphaUpdater( declarations.get(LayerIds.ALPHA)),
new ImageDrawer( declarations.get(LayerIds.BACKGROUND), this.biomeResolution, accelerationCounter), new ImageDrawer( declarations.get(LayerIds.BACKGROUND), Resolution.QUARTER, accelerationCounter),
new ImageDrawer( declarations.get(LayerIds.SLIME), Resolution.CHUNK, accelerationCounter), new ImageDrawer( declarations.get(LayerIds.SLIME), Resolution.CHUNK, accelerationCounter),
new GridDrawer( declarations.get(LayerIds.GRID), zoom), new GridDrawer( declarations.get(LayerIds.GRID), zoom),
new WorldIconDrawer(declarations.get(LayerIds.SPAWN), zoom, worldIconSelection), new WorldIconDrawer(declarations.get(LayerIds.SPAWN), zoom, worldIconSelection),

View File

@ -69,8 +69,8 @@ public class CursorInformationWidget extends TextWidget {
private String getOverworldBiomeNameAt(CoordinatesInWorld coordinates) { private String getOverworldBiomeNameAt(CoordinatesInWorld coordinates) {
Fragment fragment = graph.getFragmentAt(coordinates); Fragment fragment = graph.getFragmentAt(coordinates);
if (fragment != null && fragment.isLoaded()) { if (fragment != null && fragment.isLoaded()) {
long x = coordinates.getXRelativeToFragmentAs(Fragment.resolution); long x = coordinates.getXRelativeToFragmentAs(Resolution.QUARTER);
long y = coordinates.getYRelativeToFragmentAs(Fragment.resolution); long y = coordinates.getYRelativeToFragmentAs(Resolution.QUARTER);
short biome = fragment.getBiomeDataAt((int) x, (int) y); short biome = fragment.getBiomeDataAt((int) x, (int) y);
try { try {
return Biome.getByIndex(biome).getName(); return Biome.getByIndex(biome).getName();