Mercator
Public Types | Public Member Functions | Static Public Attributes | Private Member Functions | Private Attributes | List of all members
Mercator::Terrain Class Reference

Class storing centrally all data about an instance of some terrain. More...

#include <Terrain.h>

Public Types

typedef WFMath::AxisBox< 2 > Rect
 Bounding box.
 
typedef std::map< int, BasePointPointcolumn
 STL map to store sparse array of BasePoints.
 
typedef std::map< int, Segment * > Segmentcolumn
 STL map to store sparse array of Segment pointers.
 
typedef std::map< int, PointcolumnPointstore
 STL map to store sparse array of BasePoint columns.
 
typedef std::map< int, SegmentcolumnSegmentstore
 STL map to store sparse array of Segment pointer columns.
 
typedef std::map< int, const Shader * > Shaderstore
 STL map to store sparse array of Shader pointers.
 
typedef std::map< const Effector *, RectEffectorstore
 STL map to store terrain effectors.
 

Public Member Functions

 Terrain (unsigned int options=DEFAULT, unsigned int resolution=defaultResolution)
 Construct a new Terrain object with optional options and resolution. More...
 
 ~Terrain ()
 Desctruct Terrain object, deleting contained objects. More...
 
float get (float x, float y) const
 Get the height value at a given coordinate x,y. More...
 
bool getHeightAndNormal (float x, float y, float &, WFMath::Vector< 3 > &) const
 Get an accurate height and normal vector at a given coordinate x,y. More...
 
bool getBasePoint (int x, int y, BasePoint &z) const
 Get the BasePoint at a given base point coordinate. More...
 
void setBasePoint (int x, int y, const BasePoint &z)
 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.
 
SegmentgetSegment (float x, float y) const
 Get a pointer to the segment which contains the coord x,y. More...
 
SegmentgetSegment (int x, int y) const
 Get the Segment at a given base point coordinate. More...
 
int getResolution () const
 Accessor for base point resolution.
 
float getSpacing () const
 Accessor for base point spacing.
 
const SegmentstoregetTerrain () const
 Accessor for 2D sparse array of Segment pointers.
 
const PointstoregetPoints () const
 Accessor for 2D sparse array of BasePoint objects.
 
const ShaderstoregetShaders () const
 Accessor for list of Shader pointers.
 
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...
 
void addMod (const TerrainMod *mod)
 Add a modifier to the terrain. More...
 
Rect updateMod (const TerrainMod *mod)
 Updates the terrain affected by a mod. More...
 
void removeMod (const TerrainMod *mod)
 
void addArea (const Area *a)
 Add an area modifier to the terrain. More...
 
Rect updateArea (const Area *a)
 Updates the terrain affected by an area. More...
 
void removeArea (const Area *a)
 Remove an area modifier from the terrain. More...
 

Static Public Attributes

static const unsigned int DEFAULT = 0x0000
 value provided for no flags set.
 
static const unsigned int SHADED = 0x0001
 set if shaders are going to be used on this terrain.
 
static const float defaultLevel = 8.f
 Height value used when no data is available.
 

Private Member Functions

void addSurfaces (Segment &)
 Add the required Surface objects to a Segment. More...
 
void shadeSurfaces (Segment &)
 Populate the Surface objects associated with a Segment. More...
 
void addEffector (const Effector *effector)
 Add an effector to the terrain.
 
Rect updateEffector (const Effector *effector)
 Updates the terrain affected by an Effector. More...
 
void removeEffector (const Effector *effector)
 Remove an effector from the terrain.
 
bool isShaded () const
 Determine whether this terrain object has shading enabled. More...
 

Private Attributes

const unsigned int m_options
 Bitset of option flags controlling various aspects of terrain.
 
const int m_res
 BasePoint resolution, or distance between adjacent points.
 
const float m_spacing
 BasePoints spacing, same as m_res in float form for efficiency.
 
Pointstore m_basePoints
 2D spatial container with all BasePoints.
 
Segmentstore m_segments
 2D spatial container with pointers to all Segments.
 
Shaderstore m_shaders
 List of shaders to be applied to terrain.
 
Effectorstore m_effectors
 List of effectors be applied to the terrain.
 

Detailed Description

Class storing centrally all data about an instance of some terrain.

All the data includes:

Constructor & Destructor Documentation

Mercator::Terrain::Terrain ( unsigned int  options = DEFAULT,
unsigned int  resolution = defaultResolution 
)
explicit

Construct a new Terrain object with optional options and resolution.

Parameters
optionsa bitfield of option flags. Defaults to no flags set.
  • DEFAULT value provided for no flags set.
  • SHADED is set if shaders are going to be used on this terrain.
resolutionthe spacing between adjacent base points. Defaults to 64.
Mercator::Terrain::~Terrain ( )

Desctruct Terrain object, deleting contained objects.

All Segment objects are deleted, but Shader objects are not yet deleted. Probably need to be fixed.

References m_segments.

Member Function Documentation

void Mercator::Terrain::addArea ( const Area area)

Add an area modifier to the terrain.

Add a new Area object to the terrain, which defines a modification to the surface.

References addEffector(), Mercator::Area::getLayer(), and m_shaders.

Referenced by getShaders().

void Mercator::Terrain::addMod ( const TerrainMod mod)

Add a modifier to the terrain.

Add a new TerrainMod object to the terrain, which defines a modification to the terrain heightfield or surface data. The segments are responsible for storing the TerrainMod objects, so the apropriate Segment objects are found and the TerrainMode is passed to each in turn.

Parameters
treference to the TerrainMod object to be applied.

References addEffector().

Referenced by getShaders().

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.

References Mercator::Shader::checkIntersect(), Mercator::Segment::getSurfaces(), m_segments, m_shaders, and Mercator::Shader::newSurface().

Referenced by getShaders().

void Mercator::Terrain::addSurfaces ( Segment seg)
private

Add the required Surface objects to a Segment.

If shading is enabled, each Segment has a set of Surface objects corresponding to the Shader objects available for this terrain. This function creates the necessary Surface objects, and adds them to the list in the Segment object. At this point the Segment is not yet populated with heightfield data, so the Surface cannot be populated. A newly constructed surface does not allocate its buffer memory, so there is very little overhead to creating it.

References Mercator::Segment::getSurfaces(), and m_shaders.

Referenced by setBasePoint().

float Mercator::Terrain::get ( float  x,
float  y 
) const

Get the height value at a given coordinate x,y.

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.

References defaultLevel, Mercator::Segment::get(), getSegment(), Mercator::Segment::isValid(), m_res, and m_spacing.

bool Mercator::Terrain::getBasePoint ( int  x,
int  y,
BasePoint z 
) const

Get the BasePoint at a given base point coordinate.

Get the BasePoint value for the given coordinate on the base point grid.

Parameters
xcoordinate on the base point grid.
ycoordinate on the base point grid.
zreference to varaible which will be used to store the BasePoint data.
Returns
true if a BasePoint is defined at the given coordinate, false otherwise.

References m_basePoints.

Referenced by setBasePoint().

bool Mercator::Terrain::getHeightAndNormal ( float  x,
float  y,
float &  h,
WFMath::Vector< 3 > &  n 
) const

Get an accurate height and normal vector at a given coordinate x,y.

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.

Parameters
xcoordinate of point to be returned.
ycoordinate of point to be returned.
hreference to variable which will be used to store the resulting height value.
nreference to variable which will be used to store the resulting normal value.
Returns
true if heightdata was available, false otherwise.

References Mercator::Segment::getHeightAndNormal(), getSegment(), Mercator::Segment::isValid(), m_res, and m_spacing.

Segment* Mercator::Terrain::getSegment ( float  x,
float  y 
) const
inline

Get a pointer to the segment which contains the coord x,y.

Returns
zero if no segment is defined at that location, or a pointer to a Segment otherwise.

Referenced by addEffector(), get(), getHeightAndNormal(), removeEffector(), setBasePoint(), and updateEffector().

Segment * Mercator::Terrain::getSegment ( int  x,
int  y 
) const

Get the Segment at a given base point coordinate.

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.

Parameters
xcoordinate on the base point grid.
ycoordinate on the base point grid.
Returns
a valid pointer if a Segment is defined at the given coordinate, zero otherwise.

References m_segments.

bool Mercator::Terrain::isShaded ( ) const
inlineprivate

Determine whether this terrain object has shading enabled.

Returns
true if shading is enabled, false otherwise.

Referenced by setBasePoint().

void Mercator::Terrain::removeArea ( const Area area)

Remove an area modifier from the terrain.

Remove an existing Area object from the terrain, and mark all the affected terrain surfaces as invalid.

References removeEffector().

Referenced by getShaders().

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

References Mercator::Segment::getSurfaces(), m_segments, and m_shaders.

Referenced by getShaders().

void Mercator::Terrain::setBasePoint ( int  x,
int  y,
const BasePoint z 
)

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.

Parameters
xcoordinate on the base point grid.
ycoordinate on the base point grid.
zBasePoint value to be used at the given coordinate.

References addSurfaces(), getBasePoint(), Mercator::Segment::getControlPoints(), getSegment(), Mercator::BasePoint::height(), isShaded(), m_basePoints, m_effectors, m_res, m_segments, Mercator::Segment::setCornerPoint(), and Mercator::Segment::setMinMax().

Referenced by setBasePoint().

void Mercator::Terrain::shadeSurfaces ( Segment seg)
private

Populate the Surface objects associated with a Segment.

This is called after a Segment has been populated with heightfield data. The actual responsibility for populating the Surface objects is in Segment::populateSurfaces().

References Mercator::Segment::populateSurfaces().

Terrain::Rect Mercator::Terrain::updateArea ( const Area a)

Updates the terrain affected by an area.

Apply changes to an area modifier to the terrain.

Call this when an already added terrain area has changed.

Parameters
aThe terrain area which has changed.
Returns
The area affected by the terrain area before it was updated.

References updateEffector().

Referenced by getShaders().

Terrain::Rect Mercator::Terrain::updateEffector ( const Effector effector)
private

Updates the terrain affected by an Effector.

Call this when an already added terrain effector has changed.

Parameters
effectorThe terrain effector which has changed.
Returns
The area affected by the terrain effector before it was updated.

References Mercator::Effector::bbox(), getSegment(), m_effectors, and m_spacing.

Referenced by updateArea(), and updateMod().

Terrain::Rect Mercator::Terrain::updateMod ( const TerrainMod mod)

Updates the terrain affected by a mod.

Call this when an already added terrain mod has changed.

Parameters
modThe terrain mod which has changed.
Returns
The area affected by the terrain mod before it was updated.

References removeEffector(), and updateEffector().

Referenced by getShaders().


The documentation for this class was generated from the following files: