Class RotatingGlobeMap
java.lang.Object
com.github.yellowstonegames.world.WorldMapGenerator
com.github.yellowstonegames.world.RotatingGlobeMap
A concrete implementation of
Example view of a planet rotating. Another example.
WorldMapGenerator that imitates an infinite-distance perspective view of a
world, showing only one hemisphere, that should be as wide as it is tall (its outline is a circle). It should
look as a world would when viewed from space, or as a globe would from its side, and implements rotation differently
to allow the planet to be rotated without recalculating all the data. Note that calling
setCenterLongitude(float) does a lot more work than in other classes, but less than fully calling
WorldMapGenerator.generate() in those classes, since it doesn't remake the map data at a slightly different rotation and
instead keeps a single map in use the whole time, using sections of it. This uses an
Orthographic projection with
the latitude always at the equator; the internal map is stored as a StretchWorldMap, which uses a
cylindrical equal-area
projection, specifically the Lambert equal-area projection.
Example view of a planet rotating. Another example.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected final int[]protected floatprotected floatprotected floatprotected floatprotected floatprotected floatfinal StretchWorldMapfinal float[][]final float[][]final float[][]Fields inherited from class WorldMapGenerator
cacheA, cacheB, centerLongitude, coastalWaterLower, coastalWaterUpper, deepWaterLower, deepWaterUpper, DEFAULT_NOISE, forestLower, forestUpper, grassLower, grassUpper, heatData, heatModifier, height, heightCodeData, heightData, landData, landModifier, maxHeat, maxHeight, maxWet, mediumWaterLower, mediumWaterUpper, minHeat, minHeight, minWet, moistureData, rng, rockLower, rockUpper, sandLower, sandUpper, seedA, seedB, shallowWaterLower, shallowWaterUpper, snowLower, snowUpper, startCacheX, startCacheY, startX, startY, usedHeight, usedWidth, width, zoom, zoomStartX, zoomStartY -
Constructor Summary
ConstructorsConstructorDescriptionConstructs a concrete WorldMapGenerator for a map that can be used to view a spherical world from space, showing only one hemisphere at a time.RotatingGlobeMap(int mapWidth, int mapHeight) Constructs a concrete WorldMapGenerator for a map that can be used to view a spherical world from space, showing only one hemisphere at a time.RotatingGlobeMap(int width, int height, String serialized) Creates a new generator from the given serialized String, produced bystringSerialize(), but this also requires width and height that match the first two lines of the given String (inBase.BASE86).RotatingGlobeMap(long initialSeed, int mapWidth, int mapHeight) Constructs a concrete WorldMapGenerator for a map that can be used to view a spherical world from space, showing only one hemisphere at a time.RotatingGlobeMap(long initialSeed, int mapWidth, int mapHeight, float octaveMultiplier) Constructs a concrete WorldMapGenerator for a map that can be used to view a spherical world from space, showing only one hemisphere at a time.RotatingGlobeMap(long initialSeed, int mapWidth, int mapHeight, com.github.yellowstonegames.grid.INoise noiseGenerator) Constructs a concrete WorldMapGenerator for a map that can be used to view a spherical world from space, showing only one hemisphere at a time.RotatingGlobeMap(long initialSeed, int mapWidth, int mapHeight, com.github.yellowstonegames.grid.INoise noiseGenerator, float octaveMultiplier) Constructs a concrete WorldMapGenerator for a map that can be used to view a spherical world from space, showing only one hemisphere at a time.RotatingGlobeMap(RotatingGlobeMap other) Copies the RotatingGlobeMapotherto construct a new one that is exactly the same. -
Method Summary
Modifier and TypeMethodDescriptionbooleaninthashCode()static RotatingGlobeMaprecreateFromString(String data) Creates a new instance of this class from a serialized String produced bystringSerialize().protected voidregenerate(int startX, int startY, int usedWidth, int usedHeight, float landMod, float heatMod, long stateA, long stateB) voidsetCenterLongitude(float centerLongitude) Sets the center longitude line to a longitude measured in radians, from 0 to 2 * PI.Serializes this generator's entire state to a String; it can be read back when creating a new instance of this type withRotatingGlobeMap(int, int, String)or (preferably)recreateFromString(String).toString()intwrapX(int x, int y) intwrapY(int x, int y) Methods inherited from class WorldMapGenerator
codeHeight, generate, generate, generate, getCenterLongitude, project, removeExcess, zoomIn, zoomIn, zoomOut, zoomOut
-
Field Details
-
minHeat0
protected float minHeat0 -
maxHeat0
protected float maxHeat0 -
minHeat1
protected float minHeat1 -
maxHeat1
protected float maxHeat1 -
minWet0
protected float minWet0 -
maxWet0
protected float maxWet0 -
xPositions
public final float[][] xPositions -
yPositions
public final float[][] yPositions -
zPositions
public final float[][] zPositions -
edges
protected final int[] edges -
storedMap
-
-
Constructor Details
-
RotatingGlobeMap
public RotatingGlobeMap()Constructs a concrete WorldMapGenerator for a map that can be used to view a spherical world from space, showing only one hemisphere at a time. Always makes a 100x100 map. Uses Noise as its noise generator, with 1f as the octave multiplier affecting detail. If you were usingRotatingGlobeMap(long, int, int, INoise, float), then this would be the same as passing the parameters0x1337BABE1337D00DL, 100, 100, new Noise(DEFAULT_NOISE), 1f. -
RotatingGlobeMap
public RotatingGlobeMap(int mapWidth, int mapHeight) Constructs a concrete WorldMapGenerator for a map that can be used to view a spherical world from space, showing only one hemisphere at a time. Takes only the width/height of the map. The initial seed is set to the same large long every time, and it's likely that you would set the seed when you callWorldMapGenerator.generate(long, long). The width and height of the map cannot be changed after the fact, but you can zoom in. Uses Noise as its noise generator, with 1f as the octave multiplier affecting detail.- Parameters:
mapWidth- the width of the map(s) to generate; cannot be changed latermapHeight- the height of the map(s) to generate; cannot be changed later
-
RotatingGlobeMap
public RotatingGlobeMap(long initialSeed, int mapWidth, int mapHeight) Constructs a concrete WorldMapGenerator for a map that can be used to view a spherical world from space, showing only one hemisphere at a time. Takes an initial seed and the width/height of the map. TheinitialSeedparameter may or may not be used, since you can specify the seed to use when you callWorldMapGenerator.generate(long, long). The width and height of the map cannot be changed after the fact, but you can zoom in. Uses Noise as its noise generator, with 1f as the octave multiplier affecting detail.- Parameters:
initialSeed- the seed for the FlowRandom this uses; this may also be set per-call to generatemapWidth- the width of the map(s) to generate; cannot be changed latermapHeight- the height of the map(s) to generate; cannot be changed later
-
RotatingGlobeMap
public RotatingGlobeMap(long initialSeed, int mapWidth, int mapHeight, float octaveMultiplier) Constructs a concrete WorldMapGenerator for a map that can be used to view a spherical world from space, showing only one hemisphere at a time. Takes an initial seed and the width/height of the map. TheinitialSeedparameter may or may not be used, since you can specify the seed to use when you callWorldMapGenerator.generate(long, long). The width and height of the map cannot be changed after the fact, but you can zoom in. Uses Noise as its noise generator, with the given octave multiplier affecting detail.- Parameters:
initialSeed- the seed for the FlowRandom this uses; this may also be set per-call to generatemapWidth- the width of the map(s) to generate; cannot be changed latermapHeight- the height of the map(s) to generate; cannot be changed lateroctaveMultiplier- used to adjust the level of detail, with 0.5f at the bare-minimum detail and 1f normal
-
RotatingGlobeMap
public RotatingGlobeMap(long initialSeed, int mapWidth, int mapHeight, com.github.yellowstonegames.grid.INoise noiseGenerator) Constructs a concrete WorldMapGenerator for a map that can be used to view a spherical world from space, showing only one hemisphere at a time. Takes an initial seed and the width/height of the map. TheinitialSeedparameter may or may not be used, since you can specify the seed to use when you callWorldMapGenerator.generate(long, long). The width and height of the map cannot be changed after the fact, but you can zoom in. Uses the given noise generator, with 1f as the octave multiplier affecting detail.- Parameters:
initialSeed- the seed for the FlowRandom this uses; this may also be set per-call to generatemapWidth- the width of the map(s) to generate; cannot be changed latermapHeight- the height of the map(s) to generate; cannot be changed laternoiseGenerator- an instance of a noise generator capable of 3D noise, usuallyNoise
-
RotatingGlobeMap
public RotatingGlobeMap(long initialSeed, int mapWidth, int mapHeight, com.github.yellowstonegames.grid.INoise noiseGenerator, float octaveMultiplier) Constructs a concrete WorldMapGenerator for a map that can be used to view a spherical world from space, showing only one hemisphere at a time. Takes an initial seed, the width/height of the map, and parameters for noise generation (anINoiseimplementation, which is usuallyNoise.instance, and a multiplier on how many octaves of noise to use, with 1f being normal (high) detail and higher multipliers producing even more detailed noise when zoomed-in). TheinitialSeedparameter may or may not be used, since you can specify the seed to use when you callWorldMapGenerator.generate(long, long). The width and height of the map cannot be changed after the fact, but you can zoom in. Noise will be the fastest 3D generator to use fornoiseGenerator, and the seed it's constructed with doesn't matter because this will change the seed several times at different scales of noise (it's fine to use the staticNoise.instancebecause it has no changing state between runs of the program). TheoctaveMultiplierparameter should probably be no lower than 0.5f, but can be arbitrarily high if you're willing to spend much more time on generating detail only noticeable at very high zoom; normally 1f is fine and may even be too high for maps that don't require zooming.- Parameters:
initialSeed- the seed for the FlowRandom this uses; this may also be set per-call to generatemapWidth- the width of the map(s) to generate; cannot be changed latermapHeight- the height of the map(s) to generate; cannot be changed laternoiseGenerator- an instance of a noise generator capable of 3D noise, usuallyNoiseoctaveMultiplier- used to adjust the level of detail, with 0.5f at the bare-minimum detail and 1f normal
-
RotatingGlobeMap
Copies the RotatingGlobeMapotherto construct a new one that is exactly the same. References will only be shared to INoise classes.- Parameters:
other- a RotatingGlobeMap to copy
-
RotatingGlobeMap
Creates a new generator from the given serialized String, produced bystringSerialize(), but this also requires width and height that match the first two lines of the given String (inBase.BASE86). It is almost always easier to userecreateFromString(String)instead.- Parameters:
width- width of the map or maps to generate; must match the first line of the given String inBase.BASE86height- height of the map or maps to generate; must match the second line of the given String inBase.BASE86serialized- should have been produced bystringSerialize()
-
-
Method Details
-
stringSerialize
Serializes this generator's entire state to a String; it can be read back when creating a new instance of this type withRotatingGlobeMap(int, int, String)or (preferably)recreateFromString(String). UsesBase.BASE86to represent values very concisely, but not at all readably. The String this produces tends to be very long because it includes several 2D arrays and a Region as Strings.- Overrides:
stringSerializein classWorldMapGenerator- Returns:
- a String that stores the entire state of this generator
-
recreateFromString
Creates a new instance of this class from a serialized String produced bystringSerialize(). This can get the width and height from the String, which makes this probably preferable to using the constructorRotatingGlobeMap(int, int, String). This stores the last-generated map in this WorldMapGenerator, where it can be used by other code like aWorldMapView.- Parameters:
data- the output ofstringSerialize()- Returns:
- the map that was serialized, as a new generator
-
wrapX
public int wrapX(int x, int y) - Overrides:
wrapXin classWorldMapGenerator
-
wrapY
public int wrapY(int x, int y) - Overrides:
wrapYin classWorldMapGenerator
-
setCenterLongitude
public void setCenterLongitude(float centerLongitude) Description copied from class:WorldMapGeneratorSets the center longitude line to a longitude measured in radians, from 0 to 2 * PI. Positive arguments will be corrected with modulo, but negative ones may not always act as expected, and are strongly discouraged.- Overrides:
setCenterLongitudein classWorldMapGenerator- Parameters:
centerLongitude- the longitude to center the map projection on, from 0 to 2 * PI (can be any non-negative float).
-
regenerate
protected void regenerate(int startX, int startY, int usedWidth, int usedHeight, float landMod, float heatMod, long stateA, long stateB) - Specified by:
regeneratein classWorldMapGenerator
-
equals
-
hashCode
-
toString
-