mercator 0.4.0
A terrain generation library for the Worldforge system.
|
Class storing centrally all data about an instance of some terrain. More...
#include <Terrain.h>
Public Types | |
typedef WFMath::AxisBox< 2 > | Rect |
Bounding box. More... | |
typedef std::map< int, BasePoint > | Pointcolumn |
STL map to store sparse array of BasePoints. More... | |
typedef std::map< int, std::unique_ptr< Segment > > | Segmentcolumn |
STL map to store sparse array of Segments. More... | |
typedef std::map< int, Pointcolumn > | Pointstore |
STL map to store sparse array of BasePoint columns. More... | |
typedef std::map< int, Segmentcolumn > | Segmentstore |
STL map to store sparse array of Segment pointer columns. More... | |
typedef std::map< int, const Shader * > | Shaderstore |
STL map to store sparse array of Shader pointers. More... | |
Public Member Functions | |
Terrain (unsigned int options=DEFAULT, int resolution=defaultResolution) | |
Construct a new Terrain object with optional options and resolution. More... | |
~Terrain () | |
Destroy Terrain object, deleting contained objects. More... | |
float | get (float x, float z) const |
Get the height value at a given coordinate x,z. More... | |
bool | getHeight (float x, float z, float &h) const |
Get an accurate height at a given coordinate x,z. More... | |
bool | getHeightAndNormal (float x, float z, float &h, WFMath::Vector< 3 > &n) const |
Get an accurate height and normal vector at a given coordinate x,z. More... | |
bool | getBasePoint (int x, int z, BasePoint &y) const |
Get the BasePoint at a given base point coordinate. More... | |
void | setBasePoint (int x, int z, const BasePoint &y) |
Set the BasePoint value at a given base point coordinate. More... | |
void | setBasePoint (int x, int y, float z) |
Set the height of the basepoint at x,y to z. More... | |
Segment * | getSegmentAtPos (float x, float z) const |
Get a pointer to the segment which contains the coord x,y. More... | |
Segment * | getSegmentAtIndex (int x, int z) const |
Get the Segment at a given index. More... | |
int | getResolution () const |
Accessor for base point resolution. More... | |
float | getSpacing () const |
Accessor for base point spacing. More... | |
const Segmentstore & | getTerrain () const |
Accessor for 2D sparse array of Segment pointers. More... | |
const Pointstore & | getPoints () const |
Accessor for 2D sparse array of BasePoint objects. More... | |
const Shaderstore & | getShaders () const |
Accessor for list of Shader pointers. More... | |
void | addShader (const Shader *t, int id) |
Add a new Shader to the list for this terrain. More... | |
void | removeShader (const Shader *t, int id) |
remove a Shader from the list for this terrain. More... | |
Rect | updateMod (long id, std::unique_ptr< TerrainMod > mod) |
Updates the terrain with a mod. More... | |
bool | hasMod (long id) const |
Checks if a mod with the supplied id has been registered with the terrain. More... | |
const TerrainMod * | getMod (long id) const |
Rect | updateArea (long id, std::unique_ptr< Area > a) |
Updates the terrain affected by an area. More... | |
const Area * | getArea (long id) const |
int | posToIndex (float pos) const |
Converts the supplied position into a segment index. More... | |
void | processSegments (const WFMath::AxisBox< 2 > &area, const std::function< void(Segment &, int, int)> &func) const |
Static Public Attributes | |
static const unsigned int | DEFAULT = 0x0000 |
value provided for no flags set. More... | |
static const unsigned int | SHADED = 0x0001 |
set if shaders are going to be used on this terrain. More... | |
static constexpr float | defaultLevel = 8.f |
Height value used when no data is available. More... | |
Class storing centrally all data about an instance of some terrain.
All the data includes:
typedef std::map<int, BasePoint> Mercator::Terrain::Pointcolumn |
typedef std::map<int, Pointcolumn > Mercator::Terrain::Pointstore |
typedef WFMath::AxisBox<2> Mercator::Terrain::Rect |
typedef std::map<int, std::unique_ptr<Segment> > Mercator::Terrain::Segmentcolumn |
typedef std::map<int, Segmentcolumn > Mercator::Terrain::Segmentstore |
typedef std::map<int, const Shader *> Mercator::Terrain::Shaderstore |
|
explicit |
Construct a new Terrain object with optional options and resolution.
options | a bitfield of option flags. Defaults to no flags set.
|
resolution | the spacing between adjacent base points. Defaults to 64. |
Definition at line 32 of file Terrain.cpp.
|
default |
void Mercator::Terrain::addShader | ( | const Shader * | t, |
int | id | ||
) |
Add a new Shader to the list for this terrain.
As each shader is added, surfaces are added to all existing segments to store the result of the shader.
Definition at line 40 of file Terrain.cpp.
References Mercator::Shader::newSurface().
float Mercator::Terrain::get | ( | float | x, |
float | z | ||
) | const |
Get the height value at a given coordinate x,z.
This is a convenience function provided to quickly get a height value at a given point. It always succeeds, as if no height data is available it just returns the default value. If a Segment does exist in the right place and is populated, the coords within that Segment are determined, and the heightfield queried. This function does not cause any data to be populated, and does not attempt to do any interpolation to get an accurate height figure. For more accurate results see Terrain::getHeightAndNormal.
Definition at line 114 of file Terrain.cpp.
References defaultLevel, Mercator::Segment::get(), getSegmentAtIndex(), Mercator::Segment::getXRef(), Mercator::Segment::getZRef(), Mercator::Segment::isValid(), and posToIndex().
const Area * Mercator::Terrain::getArea | ( | long | id | ) | const |
Definition at line 340 of file Terrain.cpp.
bool Mercator::Terrain::getBasePoint | ( | int | x, |
int | z, | ||
BasePoint & | y | ||
) | const |
Get the BasePoint at a given base point coordinate.
Get the BasePoint value for the given coordinate on the base point grid.
x | coordinate on the base point grid. |
z | coordinate on the base point grid. |
y | reference to variable which will be used to store the BasePoint data. |
Definition at line 144 of file Terrain.cpp.
Referenced by setBasePoint().
bool Mercator::Terrain::getHeight | ( | float | x, |
float | z, | ||
float & | h | ||
) | const |
Get an accurate height at a given coordinate x,z.
This is a more expensive function that Terrain::get() for getting an accurate height value. The main body of functionality is in the Segment::getHeight() function called from here. The height is interpolated based on a model where each tile of the heightfield comprises two triangles. If no heightfield data is available for the given location, this function returns false, and no data is returned.
x | coordinate of point to be returned. |
z | coordinate of point to be returned. |
h | reference to variable which will be used to store the resulting height value. |
Definition at line 123 of file Terrain.cpp.
References getSegmentAtIndex(), Mercator::Segment::getXRef(), Mercator::Segment::getZRef(), Mercator::Segment::isValid(), and posToIndex().
bool Mercator::Terrain::getHeightAndNormal | ( | float | x, |
float | z, | ||
float & | h, | ||
WFMath::Vector< 3 > & | n | ||
) | const |
Get an accurate height and normal vector at a given coordinate x,z.
This is a more expensive function that Terrain::get() for getting an accurate height value and surface normal at a given point. The main body of functionality is in the Segment::getHeightAndNormal() function called from here. The height and normal are interpolated based on a model where each tile of the heightfield comprises two triangles. If no heightfield data is available for the given location, this function returns false, and no data is returned.
x | coordinate of point to be returned. |
z | coordinate of point to be returned. |
h | reference to variable which will be used to store the resulting height value. |
n | reference to variable which will be used to store the resulting normal value. |
Definition at line 133 of file Terrain.cpp.
References Mercator::Segment::getHeightAndNormal(), getSegmentAtIndex(), Mercator::Segment::getXRef(), Mercator::Segment::getZRef(), Mercator::Segment::isValid(), and posToIndex().
const TerrainMod * Mercator::Terrain::getMod | ( | long | id | ) | const |
Definition at line 331 of file Terrain.cpp.
|
inline |
|
inline |
Segment * Mercator::Terrain::getSegmentAtIndex | ( | int | x, |
int | z | ||
) | const |
Get the Segment at a given index.
Get the Segment pointer for the given coordinate on the base point grid. The Segment in question may not have been populated with heightfield or surface data.
x | coordinate on the base point grid. |
z | coordinate on the base point grid. |
Definition at line 208 of file Terrain.cpp.
Referenced by get(), getHeight(), getHeightAndNormal(), getSegmentAtPos(), processSegments(), setBasePoint(), updateArea(), and updateMod().
|
inline |
Get a pointer to the segment which contains the coord x,y.
Definition at line 334 of file Terrain.h.
References getSegmentAtIndex(), and posToIndex().
|
inline |
|
inline |
|
inline |
bool Mercator::Terrain::hasMod | ( | long | id | ) | const |
Checks if a mod with the supplied id has been registered with the terrain.
id | The id of the mod to check for. |
Definition at line 326 of file Terrain.cpp.
|
inline |
Converts the supplied position into a segment index.
pos | A position, either x or y. |
Definition at line 330 of file Terrain.h.
Referenced by get(), getHeight(), getHeightAndNormal(), and getSegmentAtPos().
void Mercator::Terrain::processSegments | ( | const WFMath::AxisBox< 2 > & | area, |
const std::function< void(Segment &, int, int)> & | func | ||
) | const |
Processes all segments within the supplied area.
area | An area. |
func | Function called for each segment. X and Y index are submitted as second and third arguments. |
Definition at line 221 of file Terrain.cpp.
References getSegmentAtIndex().
void Mercator::Terrain::removeShader | ( | const Shader * | t, |
int | id | ||
) |
remove a Shader from the list for this terrain.
As each shader is removed, surfaces are removed from existing segments
Definition at line 62 of file Terrain.cpp.
|
inline |
Set the height of the basepoint at x,y to z.
Definition at line 233 of file Terrain.h.
References setBasePoint().
void Mercator::Terrain::setBasePoint | ( | int | x, |
int | z, | ||
const BasePoint & | y | ||
) |
Set the BasePoint value at a given base point coordinate.
Set the BasePoint value for the given coordinate on the base point grid. If inserting this BasePoint completes the set of points required to define one or more Segment objects which were not yet defined, new Segment objects are created. If this replaces a point for one or more Segment objects that were already defined, the contents of those Segment objects are invalidated.
x | coordinate on the base point grid. |
z | coordinate on the base point grid. |
y | BasePoint value to be used at the given coordinate. |
Definition at line 158 of file Terrain.cpp.
References getBasePoint(), getSegmentAtIndex(), and Mercator::Segment::setCornerPoint().
Referenced by setBasePoint().
Terrain::Rect Mercator::Terrain::updateArea | ( | long | id, |
std::unique_ptr< Area > | a | ||
) |
Updates the terrain affected by an area.
a | The terrain area which has changed, or null if the entry should be removed. |
Definition at line 350 of file Terrain.cpp.
References getSegmentAtIndex().
Terrain::Rect Mercator::Terrain::updateMod | ( | long | id, |
std::unique_ptr< TerrainMod > | mod | ||
) |
Updates the terrain with a mod.
id | The id of the mod, which is also used for ordering. |
mod | The terrain mod, or null if the entry for the id should be removed. |
Definition at line 241 of file Terrain.cpp.
References getSegmentAtIndex().
|
static |
|
staticconstexpr |
|
static |