501 lines
25 KiB
C++
501 lines
25 KiB
C++
/*
|
|
* libtcod 1.6.0
|
|
* Copyright (c) 2008,2009,2010,2012,2013 Jice & Mingos
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* * The name of Jice or Mingos may not be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY JICE AND MINGOS ``AS IS'' AND ANY
|
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL JICE OR MINGOS BE LIABLE FOR ANY
|
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
#ifndef _TCOD_HEIGHTMAP_HPP
|
|
#define _TCOD_HEIGHTMAP_HPP
|
|
|
|
/**
|
|
@PageName heightmap
|
|
@PageCategory Roguelike toolkits
|
|
@PageTitle Heightmap toolkit
|
|
@PageDesc This toolkit allows to create a 2D grid of float values using various algorithms.
|
|
|
|
The code using the heightmap toolkit can be automatically generated with the heightmap tool (hmtool) included in the libtcod package.
|
|
*/
|
|
class TCODLIB_API TCODHeightMap {
|
|
public :
|
|
int w,h;
|
|
float *values;
|
|
|
|
/**
|
|
@PageName heightmap_init
|
|
@PageFather heightmap
|
|
@PageTitle Creating a heightmap
|
|
@FuncTitle Creating an empty map
|
|
@FuncDesc As with other modules, you have to create a heightmap object first :
|
|
Note that whereas most other modules use opaque structs, the TCOD_heightmap_t fields can be freely accessed. Thus, the TCOD_heightmap_new function returns a TCOD_heightmap_t pointer, not a TCOD_heightmap_t. The w and h fields should not be modified after the heightmap creation. The newly created heightmap is filled with 0.0 values.
|
|
@Cpp TCODHeightMap::TCODHeightMap(int w, int h)
|
|
@C
|
|
typedef struct {
|
|
int w,h;
|
|
float *values;
|
|
} TCOD_heightmap_t;
|
|
TCOD_heightmap_t *TCOD_heightmap_new(int w,int h)
|
|
@Py heightmap_new(w,h)
|
|
@C# TCODHeightMap::TCODHeightMap(int w, int h)
|
|
@Param w,h The width and height of the heightmap.
|
|
@CppEx TCODHeightMap myMap(50,50);
|
|
@CEx TCOD_heightmap_t *my_map=TCOD_heightmap_new(50,50);
|
|
@PyEx
|
|
map=libtcod.heightmap_new(50,50)
|
|
print map.w, map.h
|
|
*/
|
|
TCODHeightMap(int w, int h);
|
|
|
|
/**
|
|
@PageName heightmap_init
|
|
@FuncTitle Destroying a heightmap
|
|
@FuncDesc To release the resources used by a heightmap, destroy it with :
|
|
@Cpp TCODHeightMap::~TCODHeightMap()
|
|
@C void TCOD_heightmap_delete(TCOD_heightmap_t *hm)
|
|
@Py heightmap_delete(hm)
|
|
@C# void TCODHeightMap::Dispose()
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
*/
|
|
virtual ~TCODHeightMap();
|
|
|
|
/**
|
|
@PageName heightmap_base
|
|
@PageFather heightmap
|
|
@PageTitle Basic operations
|
|
@PageDesc Those are simple operations applied either on a single map cell or on every map cell.
|
|
@FuncTitle Setting a cell value
|
|
@FuncDesc Once the heightmap has been created, you can do some basic operations on the values inside it.
|
|
You can set a single value :
|
|
@Cpp void TCODHeightMap::setValue(int x, int y, float v)
|
|
@C void TCOD_heightmap_set_value(TCOD_heightmap_t *hm, int x, int y, float value)
|
|
@Py heightmap_set_value(hm, x, y, value)
|
|
@C# void TCODHeightMap::setValue(int x, int y, float v)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param x,y Coordinates of the cells to modify inside the map.
|
|
0 <= x < map width
|
|
0 <= y < map height
|
|
@Param value The new value of the map cell.
|
|
*/
|
|
inline void setValue(int x, int y, float v) {
|
|
values[x+y*w]=v;
|
|
}
|
|
|
|
/**
|
|
@PageName heightmap_base
|
|
@FuncTitle Adding a float value to all cells
|
|
@Cpp void TCODHeightMap::add(float value)
|
|
@C void TCOD_heightmap_add(TCOD_heightmap_t *hm, float value)
|
|
@Py heightmap_add(hm, value)
|
|
@C# void TCODHeightMap::add(float value)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param value Value to add to every cell.
|
|
*/
|
|
void add(float f);
|
|
|
|
/**
|
|
@PageName heightmap_base
|
|
@FuncTitle Multiplying all values by a float
|
|
@Cpp void TCODHeightMap::scale(float value)
|
|
@C void TCOD_heightmap_scale(TCOD_heightmap_t *hm, float value)
|
|
@Py heightmap_scale(hm, value)
|
|
@C# void TCODHeightMap::scale(float value)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param value Every cell's value is multiplied by this value.
|
|
*/
|
|
void scale(float f);
|
|
|
|
/**
|
|
@PageName heightmap_base
|
|
@FuncTitle Resetting all values to 0.0
|
|
@Cpp void TCODHeightMap::clear()
|
|
@C void TCOD_heightmap_clear(TCOD_heightmap_t *hm)
|
|
@Py heightmap_clear(hm)
|
|
@C# void TCODHeightMap::clear()
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
*/
|
|
void clear(); // resets all values to 0.0
|
|
|
|
/**
|
|
@PageName heightmap_base
|
|
@FuncTitle Clamping all values
|
|
@Cpp void TCODHeightMap::clamp(float min, float max)
|
|
@C void TCOD_heightmap_clamp(TCOD_heightmap_t *hm, float min, float max)
|
|
@Py heightmap_clamp(hm, mi, ma)
|
|
@C# void TCODHeightMap::clamp(float min, float max)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param min,max Every cell value is clamped between min and max.
|
|
min < max
|
|
*/
|
|
void clamp(float min, float max);
|
|
|
|
/**
|
|
@PageName heightmap_base
|
|
@FuncTitle Copying values from another heightmap
|
|
@Cpp void TCODHeightMap::copy(const TCODHeightMap *source)
|
|
@C void TCOD_heightmap_copy(const TCOD_heightmap_t *source,TCOD_heightmap_t *dest)
|
|
@Py heightmap_copy(source,dest)
|
|
@C# void TCODHeightMap::copy(TCODHeightMap source)
|
|
@Param source Each cell value from the source heightmap is copied in the destination (this for C++) heightmap.
|
|
The source and destination heightmap must have the same width and height.
|
|
@Param dest In the C and python versions, the address of the destination heightmap.
|
|
*/
|
|
void copy(const TCODHeightMap *source);
|
|
|
|
/**
|
|
@PageName heightmap_base
|
|
@FuncTitle Normalizing values
|
|
@Cpp void TCODHeightMap::normalize(float min=0.0f, float max=1.0f)
|
|
@C void TCOD_heightmap_normalize(TCOD_heightmap_t *hm, float min, float max)
|
|
@Py heightmap_normalize(hm, mi=0.0, ma=1.0)
|
|
@C#
|
|
void TCODHeightMap::normalize()
|
|
void TCODHeightMap::normalize(float min)
|
|
void TCODHeightMap::normalize(float min, float max)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param min,max The whole heightmap is translated and scaled so that the lowest cell value becomes min and the highest cell value becomes max
|
|
min < max
|
|
*/
|
|
void normalize(float newMin=0.0f, float newMax=1.0f); // scales the values to the range [newMin;newMax]
|
|
|
|
/**
|
|
@PageName heightmap_base
|
|
@FuncTitle Doing a lerp operation between two heightmaps
|
|
@Cpp void TCODHeightMap::lerp(const TCODHeightMap *a, const TCODHeightMap *b,float coef)
|
|
@C void TCOD_heightmap_lerp_hm(const TCOD_heightmap_t *a, const TCOD_heightmap_t *b, TCOD_heightmap_t *res, float coef)
|
|
@Py heightmap_lerp_hm(a, b, res, coef)
|
|
@C# void TCODHeightMap::lerp(TCODHeightMap a, TCODHeightMap b, float coef)
|
|
@Param a First heightmap in the lerp operation.
|
|
@Param b Second heightmap in the lerp operation.
|
|
@Param coef lerp coefficient.
|
|
For each cell in the destination map (this for C++), value = a.value + (b.value - a.value) * coef
|
|
@Param res In the C and python versions, the address of the destination heightmap.
|
|
*/
|
|
void lerp(const TCODHeightMap *a, const TCODHeightMap *b,float coef);
|
|
|
|
/**
|
|
@PageName heightmap_base
|
|
@FuncTitle Adding two heightmaps
|
|
@Cpp void TCODHeightMap::add(const TCODHeightMap *a, const TCODHeightMap *b)
|
|
@C void TCOD_heightmap_add_hm(const TCOD_heightmap_t *a, const TCOD_heightmap_t *b, TCOD_heightmap_t *res)
|
|
@Py heightmap_add_hm(a, b, res)
|
|
@C# void TCODHeightMap::add(TCODHeightMap a, TCODHeightMap b)
|
|
@Param a First heightmap.
|
|
@Param b Second heightmap. For each cell in the destination map (this for C++), value = a.value + b.value
|
|
@Param res In the C and python versions, the address of the destination heightmap.
|
|
*/
|
|
void add(const TCODHeightMap *a, const TCODHeightMap *b);
|
|
|
|
/**
|
|
@PageName heightmap_base
|
|
@FuncTitle Multiplying two heightmaps
|
|
@Cpp void TCODHeightMap::multiply(const TCODHeightMap *a, const TCODHeightMap *b)
|
|
@C void TCOD_heightmap_multiply_hm(const TCOD_heightmap_t *a, const TCOD_heightmap_t *b, TCOD_heightmap_t *res)
|
|
@Py heightmap_multiply_hm(a, b, res)
|
|
@C# void TCODHeightMap::multiply(TCODHeightMap a, TCODHeightMap b)
|
|
@Param a First heightmap.
|
|
@Param b Second heightmap. For each cell in the destination map (this for C++), value = a.value * b.value
|
|
@Param res In the C and python versions, the address of the destination heightmap.
|
|
*/
|
|
void multiply(const TCODHeightMap *a, const TCODHeightMap *b);
|
|
|
|
/**
|
|
@PageName heightmap_modify
|
|
@PageFather heightmap
|
|
@PageTitle Modifying the heightmap
|
|
@PageDesc Those are advanced operations involving several or all map cells.
|
|
@FuncTitle Add hills
|
|
@FuncDesc This function adds a hill (a half spheroid) at given position.
|
|
@Cpp void TCODHeightMap::addHill(float x, float y, float radius, float height)
|
|
@C void TCOD_heightmap_add_hill(TCOD_heightmap_t *hm, float x, float y, float radius, float height)
|
|
@Py heightmap_add_hill(hm, x, y, radius, height)
|
|
@C# void TCODHeightMap::addHill(float x, float y, float radius, float height)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param x,y Coordinates of the center of the hill.
|
|
0 <= x < map width
|
|
0 <= y < map height
|
|
@Param radius The hill radius.
|
|
@Param height The hill height. If height == radius or -radius, the hill is a half-sphere.
|
|
*/
|
|
void addHill(float x, float y, float radius, float height); // adds a hill (half sphere) at given position
|
|
|
|
/**
|
|
@PageName heightmap_modify
|
|
@FuncTitle Dig hills
|
|
@FuncDesc This function takes the highest value (if height > 0) or the lowest (if height < 0) between the map and the hill.
|
|
It's main goal is to carve things in maps (like rivers) by digging hills along a curve.
|
|
@Cpp void TCODHeightMap::digHill(float hx, float hy, float hradius, float height)
|
|
@C void TCOD_heightmap_dig_hill(TCOD_heightmap_t *hm, float x, float y, float radius, float height)
|
|
@Py heightmap_dig_hill(hm, x, y, radius, height)
|
|
@C# void TCODHeightMap::digHill(float hx, float hy, float hradius, float height)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param x,y Coordinates of the center of the hill.
|
|
0 <= x < map width
|
|
0 <= y < map height
|
|
@Param radius The hill radius.
|
|
@Param height The hill height. Can be < 0 or > 0
|
|
*/
|
|
void digHill(float hx, float hy, float hradius, float height);
|
|
|
|
/**
|
|
@PageName heightmap_modify
|
|
@FuncTitle Simulate rain erosion
|
|
@FuncDesc This function simulates the effect of rain drops on the terrain, resulting in erosion patterns.
|
|
@Cpp void TCODHeightMap::rainErosion(int nbDrops,float erosionCoef,float sedimentationCoef,TCODRandom *rnd)
|
|
@C void TCOD_heightmap_rain_erosion(TCOD_heightmap_t *hm, int nbDrops,float erosionCoef,float sedimentationCoef,TCOD_random_t rnd)
|
|
@Py heightmap_rain_erosion(hm, nbDrops,erosionCoef,sedimentationCoef,rnd=0)
|
|
@C# void TCODHeightMap::rainErosion(int nbDrops, float erosionCoef, float sedimentationCoef, TCODRandom rnd)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param nbDrops Number of rain drops to simulate. Should be at least width * height.
|
|
@Param erosionCoef Amount of ground eroded on the drop's path.
|
|
@Param sedimentationCoef Amount of ground deposited when the drops stops to flow
|
|
@Param rnd RNG to use, NULL for default generator.
|
|
*/
|
|
void rainErosion(int nbDrops,float erosionCoef,float sedimentationCoef,TCODRandom *rnd);
|
|
|
|
/**
|
|
@PageName heightmap_modify
|
|
@FuncTitle Do a generic transformation
|
|
@FuncDesc This function allows you to apply a generic transformation on the map, so that each resulting cell value is the weighted sum of several neighbour cells. This can be used to smooth/sharpen the map. See examples below for a simple horizontal smoothing kernel : replace value(x,y) with 0.33*value(x-1,y) + 0.33*value(x,y) + 0.33*value(x+1,y).To do this, you need a kernel of size 3 (the sum involves 3 surrounding cells). The dx,dy array will contain :
|
|
dx=-1,dy = 0 for cell x-1,y
|
|
dx=1,dy=0 for cell x+1,y
|
|
dx=0,dy=0 for current cell (x,y)
|
|
The weight array will contain 0.33 for each cell.
|
|
@Cpp void TCODHeightMap::kernelTransform(int kernelSize, int *dx, int *dy, float *weight, float minLevel,float maxLevel)
|
|
@C void TCOD_heightmap_kernel_transform(TCOD_heightmap_t *hm, int kernelsize, int *dx, int *dy, float *weight, float minLevel,float maxLevel)
|
|
@Py heightmap_kernel_transform(hm, kernelsize, dx, dy, weight, minLevel,maxLevel)
|
|
@C# void TCODHeightMap::kernelTransform(int kernelSize, int[] dx, int[] dy, float[] weight, float minLevel, float maxLevel)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
kernelSize Number of neighbour cells involved.
|
|
@Param dx,dy Array of kernelSize cells coordinates. The coordinates are relative to the current cell (0,0) is current cell, (-1,0) is west cell, (0,-1) is north cell, (1,0) is east cell, (0,1) is south cell, ...
|
|
@Param weight Array of kernelSize cells weight. The value of each neighbour cell is scaled by its corresponding weight
|
|
@Param minLevel The transformation is only applied to cells which value is >= minLevel.
|
|
@Param maxLevel The transformation is only applied to cells which value is <= maxLevel.
|
|
@CEx
|
|
int dx [] = {-1,1,0};
|
|
int dy[] = {0,0,0};
|
|
float weight[] = {0.33f,0.33f,0.33f};
|
|
TCOD_heightMap_kernel_transform(heightmap,3,dx,dy,weight,0.0f,1.0f);
|
|
@CppEx
|
|
int dx [] = {-1,1,0};
|
|
int dy[] = {0,0,0};
|
|
float weight[] = {0.33f,0.33f,0.33f};
|
|
heightmap->kernelTransform(heightmap,3,dx,dy,weight,0.0f,1.0f);
|
|
*/
|
|
void kernelTransform(int kernelSize, const int *dx, const int *dy, const float *weight, float minLevel,float maxLevel);
|
|
|
|
/**
|
|
@PageName heightmap_modify
|
|
@FuncTitle Add a Voronoi diagram
|
|
@FuncDesc This function adds values from a Voronoi diagram to the map.
|
|
@Cpp void TCODHeightMap::addVoronoi(int nbPoints, int nbCoef, float *coef,TCODRandom *rnd)
|
|
@C void TCOD_heightmap_add_voronoi(TCOD_heightmap_t *hm, int nbPoints, int nbCoef, float *coef,TCOD_random_t rnd)
|
|
@Py heightmap_add_voronoi(hm, nbPoints, nbCoef, coef,rnd=0)
|
|
@C# void TCODHeightMap::addVoronoi(int nbPoints, int nbCoef, float[] coef, TCODRandom rnd)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param nbPoints Number of Voronoi sites.
|
|
@Param nbCoef The diagram value is calculated from the nbCoef closest sites.
|
|
@Param coef The distance to each site is scaled by the corresponding coef.
|
|
Closest site : coef[0], second closest site : coef[1], ...
|
|
@Param rnd RNG to use, NULL for default generator.
|
|
*/
|
|
void addVoronoi(int nbPoints, int nbCoef, const float *coef,TCODRandom *rnd);
|
|
|
|
/**
|
|
@PageName heightmap_modify
|
|
@FuncTitle Add a fbm
|
|
This function adds values from a simplex fbm function to the map.
|
|
@Cpp void TCODHeightMap::addFbm(TCODNoise *noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale)
|
|
@C void TCOD_heightmap_add_fbm(TCOD_heightmap_t *hm, TCOD_noise_t noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale)
|
|
@Py heightmap_add_fbm(hm, noise,mulx, muly, addx, addy, octaves, delta, scale)
|
|
@C# void TCODHeightMap::addFbm(TCODNoise noise, float mulx, float muly, float addx, float addy, float octaves, float delta, float scale)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param noise The 2D noise to use.
|
|
@Param mulx, muly / addx, addy The noise coordinate for map cell (x,y) are (x + addx)*mulx / width , (y + addy)*muly / height.
|
|
Those values allow you to scale and translate the noise function over the heightmap.
|
|
@Param octaves Number of octaves in the fbm sum.
|
|
@Param delta / scale The value added to the heightmap is delta + noise * scale.
|
|
@Param noise is between -1.0 and 1.0
|
|
*/
|
|
void addFbm(TCODNoise *noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale);
|
|
|
|
/**
|
|
@PageName heightmap_modify
|
|
@FuncTitle Scale with a fbm
|
|
@FuncDesc This function works exactly as the previous one, but it multiplies the resulting value instead of adding it to the heightmap.
|
|
@Cpp void TCODHeightMap::scaleFbm(TCODNoise *noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale)
|
|
@C void TCOD_heightmap_scale_fbm(TCOD_heightmap_t *hm, TCOD_noise_t noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale)
|
|
@Py heightmap_scale_fbm(hm, noise,mulx, muly, addx, addy, octaves, delta, scale)
|
|
@C# void TCODHeightMap::scaleFbm(TCODNoise noise, float mulx, float muly, float addx, float addy, float octaves, float delta, float scale)
|
|
*/
|
|
void scaleFbm(TCODNoise *noise,float mulx, float muly, float addx, float addy, float octaves, float delta, float scale);
|
|
|
|
/**
|
|
@PageName heightmap_modify
|
|
@FuncTitle Dig along a Bezier curve
|
|
@FuncDesc This function carve a path along a cubic Bezier curve using the digHill function.
|
|
Could be used for roads/rivers/...
|
|
Both radius and depth can vary linearly along the path.
|
|
@Cpp void TCODHeightMap::digBezier(int px[4], int py[4], float startRadius, float startDepth, float endRadius, float endDepth)
|
|
@C void TCOD_heightmap_dig_bezier(TCOD_heightmap_t *hm, int px[4], int py[4], float startRadius, float startDepth, float endRadius, float endDepth)
|
|
@Py heightmap_dig_bezier(hm, px, py, startRadius, startDepth, endRadius, endDepth)
|
|
@C# void TCODHeightMap::digBezier(int[] px, int[] py, float startRadius, float startDepth, float endRadius, float endDepth)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param px,py The coordinates of the 4 Bezier control points.
|
|
@Param startRadius The path radius in map cells at point P0. Might be < 1.0
|
|
@Param startDepth The path depth at point P0.
|
|
@Param endRadius The path radius in map cells at point P3. Might be < 1.0
|
|
@Param endDepth The path depth at point P3.
|
|
*/
|
|
void digBezier(int px[4], int py[4], float startRadius, float startDepth, float endRadius, float endDepth);
|
|
|
|
/**
|
|
@PageName heightmap_read
|
|
@PageFather heightmap
|
|
@PageTitle Reading data from the heightmap
|
|
@PageDesc Those functions return raw or computed information about the heightmap.
|
|
@FuncTitle Get the value of a cell
|
|
@FuncDesc This function returns the height value of a map cell.
|
|
@Cpp float TCODHeightMap::getValue(int x, int y) const
|
|
@C float TCOD_heightmap_get_value(const TCOD_heightmap_t *hm, int x, int y)
|
|
@Py heightmap_get_value(hm, x, y)
|
|
@C# float TCODHeightMap::getValue(int x, int y)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param x,y Coordinates of the map cell.
|
|
0 <= x < map width
|
|
0 <= y < map height
|
|
*/
|
|
inline float getValue(int x, int y) const {
|
|
return values[x+y*w];
|
|
}
|
|
|
|
/**
|
|
@PageName heightmap_read
|
|
@FuncTitle Interpolate the height
|
|
@FuncDesc This function returns the interpolated height at non integer coordinates.
|
|
@Cpp float TCODHeightMap::getInterpolatedValue(float x, float y) const
|
|
@C float TCOD_heightmap_get_interpolated_value(const TCOD_heightmap_t *hm, float x, float y)
|
|
@Py heightmap_get_interpolated_value(hm, x, y)
|
|
@C# float TCODHeightMap::getInterpolatedValue(float x, float y)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param x,y Coordinates of the map cell.
|
|
0 <= x < map width
|
|
0 <= y < map height
|
|
*/
|
|
float getInterpolatedValue(float x, float y) const;
|
|
|
|
/**
|
|
@PageName heightmap_read
|
|
@FuncTitle Get the map slope
|
|
@FuncDesc This function returns the slope between 0 and PI/2 at given coordinates.
|
|
@Cpp float TCODHeightMap::getSlope(int x, int y) const
|
|
@C float TCOD_heightmap_get_slope(const TCOD_heightmap_t *hm, int x, int y)
|
|
@Py heightmap_get_slope(hm, x, y)
|
|
@C# float TCODHeightMap::getSlope(int x, int y)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param x,y Coordinates of the map cell.
|
|
0 <= x < map width
|
|
0 <= y < map height
|
|
*/
|
|
float getSlope(int x, int y) const; // returns the slope in radian between 0 and PI/2
|
|
|
|
/**
|
|
@PageName heightmap_read
|
|
@FuncTitle Get the map normal
|
|
@FuncDesc This function returns the map normal at given coordinates.
|
|
@Cpp void TCODHeightMap::getNormal(float x, float y,float n[3], float waterLevel=0.0f) const
|
|
@C void TCOD_heightmap_get_normal(const TCOD_heightmap_t *hm, float x, float y, float n[3], float waterLevel)
|
|
@Py heightmap_get_normal(hm, x, y, waterLevel) # returns nx,ny,nz
|
|
@C# void TCODHeightMap::getNormal(float x, float y, float[] n, float waterLevel)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param x,y Coordinates of the map cell.
|
|
0 <= x < map width
|
|
0 <= y < map height
|
|
@Param n The function stores the normalized normal vector in this array.
|
|
@Param waterLevel The map height is clamped at waterLevel so that the sea is flat.
|
|
*/
|
|
void getNormal(float x, float y,float n[3], float waterLevel=0.0f) const; // returns the surface normal or (0,0,1) if beyond water level.
|
|
|
|
/**
|
|
@PageName heightmap_read
|
|
@FuncTitle Count the map cells inside a height range
|
|
@FuncDesc This function returns the number of map cells which value is between min and max.
|
|
@Cpp int TCODHeightMap::countCells(float min,float max) const
|
|
@C int TCOD_heightmap_count_cells(const TCOD_heightmap_t *hm, float min, float max)
|
|
@Py heightmap_count_cells(hm, min, max)
|
|
@C# int TCODHeightMap::countCells(float min, float max)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param min,max Only cells which value is >=min and <= max are counted.
|
|
*/
|
|
int countCells(float min,float max) const;
|
|
|
|
/**
|
|
@PageName heightmap_read
|
|
@FuncTitle Check if the map is an island
|
|
@FuncDesc This function checks if the cells on the map border are below a certain height.
|
|
@Cpp bool TCODHeightMap::hasLandOnBorder(float waterLevel) const
|
|
@C bool TCOD_heightmap_has_land_on_border(const TCOD_heightmap_t *hm, float waterLevel)
|
|
@Py heightmap_has_land_on_border(hm, waterLevel)
|
|
@C# bool TCODHeightMap::hasLandOnBorder(float waterLevel)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param waterLevel Return true only if no border cell is > waterLevel.
|
|
*/
|
|
bool hasLandOnBorder(float waterLevel) const;
|
|
|
|
/**
|
|
@PageName heightmap_read
|
|
@FuncTitle Get the map min and max values
|
|
@FuncDesc This function calculates the min and max of all values inside the map.
|
|
@Cpp void TCODHeightMap::getMinMax(float *min, float *max) const
|
|
@C void TCOD_heightmap_get_minmax(const TCOD_heightmap_t *hm, float *min, float *max)
|
|
@Py heightmap_get_minmax(hm) # returns min,max
|
|
@C# void TCODHeightMap::getMinMax(out float min, out float max)
|
|
@Param hm In the C version, the address of the heightmap struct returned by the creation function.
|
|
@Param min, max The min and max values are returned in these variables.
|
|
*/
|
|
void getMinMax(float *min, float *max) const;
|
|
|
|
// void heatErosion(int nbPass,float minSlope,float erosionCoef,float sedimentationCoef,TCODRandom *rnd);
|
|
/**
|
|
@PageName heightmap_modify
|
|
@FuncTitle Generate a map with mid-point displacement
|
|
@FuncDesc This algorithm generates a realistic fractal heightmap using the <a href="http://en.wikipedia.org/wiki/Diamond-square_algorithm">diamond-square</a> (or random midpoint displacement) algorithm.
|
|
The roughness range should be comprised between 0.4 and 0.6. The image below show the same map with roughness varying from 0.4 to 0.6.
|
|
<img src="midpoint.png" />
|
|
It's also a good habit to normalize the map after using this algorithm to avoid unexpected heights.
|
|
|
|
@Cpp void TCODHeightMap::midPointDisplacement(TCODRandom *rng=NULL,float roughness=0.45f)
|
|
@C void TCOD_heightmap_mid_point_displacement(TCOD_heightmap_t *hm, TCOD_random_t rnd, float roughness)
|
|
@Py heightmap_mid_point_displacement(hm, rng, roughness)
|
|
@Param hm In the C and python version, the adress of the heightmap struct returned by the creation function.
|
|
@Param rng Random number generation to use, or NULL/0 to use the default one.
|
|
@Param roughness Map roughness.
|
|
*/
|
|
void midPointDisplacement(TCODRandom *rnd = NULL, float roughness=0.45f);
|
|
void islandify(float seaLevel,TCODRandom *rnd); // lowers the terrain near the heightmap borders
|
|
// TODO : checks island connectivity with floodfill
|
|
private :
|
|
// void setMPDHeight(TCODRandom *rnd,int x,int y, float z, float offset);
|
|
// void setMDPHeightSquare(TCODRandom *rnd,int x, int y, int initsz, int sz,float offset);
|
|
};
|
|
|
|
#endif
|