Skip to content

Commit b7ba4be

Browse files
authored
Merge pull request #1 from Badel2/infinite-zoom
Infinite zoom
2 parents 92a876d + e32ef42 commit b7ba4be

File tree

4 files changed

+75
-10
lines changed

4 files changed

+75
-10
lines changed

src/main/java/amidst/fragment/Fragment.java

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package amidst.fragment;
22

33
import java.awt.image.BufferedImage;
4+
import java.util.Arrays;
45
import java.util.Collections;
56
import java.util.List;
67
import java.util.concurrent.atomic.AtomicReferenceArray;
@@ -76,7 +77,12 @@
7677
*/
7778
@NotThreadSafe
7879
public class Fragment {
79-
public static final int SIZE = Resolution.FRAGMENT.getStep();
80+
// Every pixel in the fragment is 2^size blocks in minecraft
81+
private int size; //= Resolution.FRAGMENT.getStep();
82+
public static int SIZE = 1 << 9;
83+
// Resolution, same as size
84+
public static Resolution resolution = null;
85+
public Resolution localResolution = null;
8086

8187
private volatile boolean isInitialized = false;
8288
private volatile boolean isLoaded = false;
@@ -101,16 +107,69 @@ public float getAlpha() {
101107
return alpha;
102108
}
103109

104-
public void initBiomeData(int width, int height) {
110+
public void initBiomeData(int width, int height, Resolution resolution) {
111+
this.localResolution = resolution;
105112
biomeData = new short[width][height];
106113
}
107114

108115
@CalledOnlyBy(AmidstThread.FRAGMENT_LOADER)
109116
public void populateBiomeData(BiomeDataOracle biomeDataOracle) {
110-
biomeDataOracle.populateArray(corner, biomeData, true);
117+
if(localResolution == Resolution.WORLD) {
118+
biomeDataOracle.populateArray(corner, biomeData, false);
119+
}
120+
else if(localResolution == Resolution.QUARTER) {
121+
biomeDataOracle.populateArray(corner, biomeData, true);
122+
}
123+
else {
124+
int size = Resolution.QUARTER.getStepsPerFragment();
125+
int step = localResolution.getStep() / Resolution.QUARTER.getStep();
126+
short[][] tmpBiomeData = new short[size][size];
127+
biomeDataOracle.populateArray(corner, tmpBiomeData, true);
128+
for (int i = 0; i<biomeData.length; i++) {
129+
for (int j = 0; j<biomeData[i].length; j++) {
130+
// This way is faster
131+
//short biome = tmpBiomeData[i*step][j*step];
132+
// This way is more accurate: it finds the most common biome
133+
short biomes[] = new short[step*step];
134+
for (int k = 0; k<step; k++) {
135+
for (int l = 0; l<step; l++) {
136+
biomes[k*step+l] = tmpBiomeData[i*step+k][j*step+l];
137+
}
138+
}
139+
short biome = mostCommonFromArray(biomes);
140+
biomeData[i][j] = biome;
141+
}
142+
}
143+
}
144+
}
145+
146+
private short mostCommonFromArray(short a[]) {
147+
Arrays.sort(a);
148+
149+
short previous = a[0];
150+
short popular = a[0];
151+
int count = 1;
152+
int maxCount = 1;
153+
154+
for (int i = 1; i < a.length; i++) {
155+
if (a[i] == previous)
156+
count++;
157+
else {
158+
if (count > maxCount) {
159+
popular = a[i-1];
160+
maxCount = count;
161+
}
162+
previous = a[i];
163+
count = 1;
164+
}
165+
}
166+
167+
return count > maxCount ? a[a.length-1] : popular;
111168
}
112169

113170
public short getBiomeDataAt(int x, int y) {
171+
//if(x==0 || y==0) return 0;
172+
//return (short)(((x+y)&1)+5);
114173
return biomeData[x][y];
115174
}
116175

src/main/java/amidst/fragment/constructor/BiomeDataConstructor.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,22 @@
55
import amidst.documentation.Immutable;
66
import amidst.fragment.Fragment;
77
import amidst.mojangapi.world.coordinates.Resolution;
8+
import amidst.settings.Setting;
89

910
@Immutable
1011
public class BiomeDataConstructor implements FragmentConstructor {
1112
private final int size;
13+
private final Resolution resolution;
1214

1315
@CalledOnlyBy(AmidstThread.EDT)
1416
public BiomeDataConstructor(Resolution resolution) {
1517
this.size = resolution.getStepsPerFragment();
18+
this.resolution = resolution;
1619
}
1720

1821
@CalledOnlyBy(AmidstThread.EDT)
1922
@Override
2023
public void construct(Fragment fragment) {
21-
fragment.initBiomeData(size, size);
24+
fragment.initBiomeData(size, size, resolution);
2225
}
2326
}

src/main/java/amidst/fragment/layer/LayerBuilder.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,11 @@
4040
@Immutable
4141
public class LayerBuilder {
4242
private final Iterable<FragmentConstructor> constructors;
43+
private Resolution biomeResolution;
4344

4445
public LayerBuilder() {
46+
this.biomeResolution = Resolution.CHUNK;
47+
Fragment.resolution = this.biomeResolution;
4548
this.constructors = createConstructors();
4649
}
4750

@@ -51,9 +54,9 @@ public LayerBuilder() {
5154
private Iterable<FragmentConstructor> createConstructors() {
5255
return Collections.unmodifiableList(
5356
Arrays.asList(
54-
new BiomeDataConstructor(Resolution.QUARTER),
57+
new BiomeDataConstructor(this.biomeResolution),
5558
new EndIslandsConstructor(),
56-
new ImageConstructor(Resolution.QUARTER, LayerIds.BACKGROUND),
59+
new ImageConstructor(this.biomeResolution, LayerIds.BACKGROUND),
5760
new ImageConstructor(Resolution.CHUNK, LayerIds.SLIME)));
5861
}
5962

@@ -133,7 +136,7 @@ private Iterable<FragmentLoader> createLoaders(
133136
new AlphaInitializer( declarations.get(LayerIds.ALPHA), settings.fragmentFading),
134137
new BiomeDataLoader( declarations.get(LayerIds.BIOME_DATA), world.getBiomeDataOracle()),
135138
new EndIslandsLoader( declarations.get(LayerIds.END_ISLANDS), world.getEndIslandOracle()),
136-
new ImageLoader( declarations.get(LayerIds.BACKGROUND), Resolution.QUARTER, new BackgroundColorProvider(new BiomeColorProvider(biomeSelection, settings.biomeProfileSelection), new TheEndColorProvider())),
139+
new ImageLoader( declarations.get(LayerIds.BACKGROUND), this.biomeResolution, new BackgroundColorProvider(new BiomeColorProvider(biomeSelection, settings.biomeProfileSelection), new TheEndColorProvider())),
137140
new ImageLoader( declarations.get(LayerIds.SLIME), Resolution.CHUNK, new SlimeColorProvider(world.getSlimeChunkOracle())),
138141
new WorldIconLoader<>(declarations.get(LayerIds.SPAWN), world.getSpawnProducer()),
139142
new WorldIconLoader<>(declarations.get(LayerIds.STRONGHOLD), world.getStrongholdProducer()),
@@ -159,7 +162,7 @@ private Iterable<FragmentDrawer> createDrawers(
159162
// @formatter:off
160163
return Collections.unmodifiableList(Arrays.asList(
161164
new AlphaUpdater( declarations.get(LayerIds.ALPHA)),
162-
new ImageDrawer( declarations.get(LayerIds.BACKGROUND), Resolution.QUARTER, accelerationCounter),
165+
new ImageDrawer( declarations.get(LayerIds.BACKGROUND), this.biomeResolution, accelerationCounter),
163166
new ImageDrawer( declarations.get(LayerIds.SLIME), Resolution.CHUNK, accelerationCounter),
164167
new GridDrawer( declarations.get(LayerIds.GRID), zoom),
165168
new WorldIconDrawer(declarations.get(LayerIds.SPAWN), zoom, worldIconSelection),

src/main/java/amidst/gui/main/viewer/widget/CursorInformationWidget.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ private String getBiomeNameAt(CoordinatesInWorld coordinates) {
6969
private String getOverworldBiomeNameAt(CoordinatesInWorld coordinates) {
7070
Fragment fragment = graph.getFragmentAt(coordinates);
7171
if (fragment != null && fragment.isLoaded()) {
72-
long x = coordinates.getXRelativeToFragmentAs(Resolution.QUARTER);
73-
long y = coordinates.getYRelativeToFragmentAs(Resolution.QUARTER);
72+
long x = coordinates.getXRelativeToFragmentAs(Fragment.resolution);
73+
long y = coordinates.getYRelativeToFragmentAs(Fragment.resolution);
7474
short biome = fragment.getBiomeDataAt((int) x, (int) y);
7575
try {
7676
return Biome.getByIndex(biome).getName();

0 commit comments

Comments
 (0)