Panda3D
Public Types | Public Member Functions | Static Public Member Functions | List of all members
GeoMipTerrain Class Reference

GeoMipTerrain, meaning Panda3D GeoMipMapping, can convert a heightfield image into a 3D terrain, consisting of several GeomNodes. More...

Inheritance diagram for GeoMipTerrain:
TypedObject

Public Types

enum  AutoFlattenMode { AFM_off = 0, AFM_light = 1, AFM_medium = 2, AFM_strong = 3 }
 

Public Member Functions

 __init__ (str name)
 
 calcAmbientOcclusion (float radius, float contrast, float brightness)
 Calculates an approximate for the ambient occlusion and stores it in the color map, so that it will be written to the vertex colors. More...
 
 clearColorMap ()
 Clears the color map. More...
 
PNMImage colorMap ()
 Returns a reference to the color map (a PNMImage) contained inside GeoMipTerrain. More...
 
 generate ()
 (Re)generates the entire terrain, erasing the current. More...
 
LVecBase2 getBlockFromPos (double x, double y)
 Gets the coordinates of the block at the specified position. More...
 
const NodePath getBlockNodePath (unsigned short int mx, unsigned short int my)
 Returns the NodePath of the specified block. More...
 
unsigned short int getBlockSize ()
 Gets the block size. More...
 
bool getBorderStitching ()
 Returns the current stitching setting. More...
 
bool getBruteforce ()
 Returns a boolean whether the terrain is rendered bruteforce or not. More...
 
double getElevation (double x, double y)
 Fetches the elevation at (x, y), where the input coordinate is specified in pixels. More...
 
double getFar ()
 Returns the far LOD distance in the terrain coordinate space. More...
 
int getFlattenMode ()
 Returns the automatic-flatten mode (e.g., off, flatten_light, flatten_medium, or flatten_strong) More...
 
NodePath getFocalPoint ()
 Returns the focal point, as a NodePath. More...
 
unsigned short int getMaxLevel ()
 Returns the highest level possible for this block size. More...
 
unsigned short int getMinLevel ()
 Gets the minimum level of detail at which blocks may be generated by generate() or update(). More...
 
double getNear ()
 Returns the near LOD distance in the terrain coordinate space. More...
 
LVector3 getNormal (int x, int y)
 Fetches the terrain normal at (x, y), where the input coordinate is specified in pixels. More...
 
LVector3 getNormal (unsigned short int mx, unsigned short int my, int x, int y)
 Fetches the terrain normal at (x,y), where the input coordinate is specified in pixels. More...
 
NodePath getRoot ()
 Returns the root of the terrain. More...
 
bool hasColorMap ()
 Returns whether a color map has been set. More...
 
PNMImage heightfield ()
 Returns a reference to the heightfield (a PNMImage) contained inside GeoMipTerrain. More...
 
bool isDirty ()
 Returns a bool indicating whether the terrain is marked 'dirty', that means the terrain has to be regenerated on the next update() call, because for instance the heightfield has changed. More...
 
PNMImage makeSlopeImage ()
 Returns a new grayscale image containing the slope angles. More...
 
 setAutoFlatten (int mode)
 The terrain can be automatically flattened (using flatten_light, flatten_medium, or flatten_strong) after each update. More...
 
 setBlockSize (unsigned short int newbs)
 Sets the block size. More...
 
 setBorderStitching (bool stitching)
 If this value is true, the LOD level at the borders of the terrain will be 0. More...
 
 setBruteforce (bool bf)
 Sets a boolean specifying whether the terrain will be rendered bruteforce. More...
 
bool setColorMap (const Filename filename, PNMFileType type)
 Loads the specified image as color map. More...
 
bool setColorMap (const PNMImage image)
 
bool setColorMap (const Texture image)
 
bool setColorMap (str path)
 
 setFactor (float factor)
 DEPRECATED method. More...
 
 setFar (double input_far)
 Sets the far LOD distance, at which the terrain will be rendered at lowest quality. More...
 
 setFocalPoint (const LPoint2d fp)
 
 setFocalPoint (const LPoint2f fp)
 
 setFocalPoint (const LPoint3d fp)
 
 setFocalPoint (const LPoint3f fp)
 
 setFocalPoint (NodePath fnp)
 
 setFocalPoint (double x, double y)
 Sets the focal point. More...
 
bool setHeightfield (const Filename filename, PNMFileType type)
 Loads the specified heightmap image file into the heightfield. More...
 
bool setHeightfield (const PNMImage image)
 Loads the specified heightmap image file into the heightfield. More...
 
 setMinLevel (unsigned short int minlevel)
 Sets the minimum level of detail at which blocks may be generated by generate() or update(). More...
 
 setNear (double input_near)
 Sets the near LOD distance, at which the terrain will be rendered at highest quality. More...
 
 setNearFar (double input_near, double input_far)
 Sets the near and far LOD distances in one call. More...
 
bool update ()
 Loops through all of the terrain blocks, and checks whether they need to be updated. More...
 
- Public Member Functions inherited from TypedObject
TypeHandle getType ()
 
int getTypeIndex ()
 Returns the internal index number associated with this object's TypeHandle, a unique number for each different type. More...
 
bool isExactType (TypeHandle handle)
 Returns true if the current object is the indicated type exactly. More...
 
bool isOfType (TypeHandle handle)
 Returns true if the current object is or derives from the indicated type. More...
 

Static Public Member Functions

static TypeHandle getClassType ()
 
- Static Public Member Functions inherited from TypedObject
static TypeHandle getClassType ()
 

Additional Inherited Members

- Public Attributes inherited from TypedObject
TypeHandle type
 Returns the TypeHandle representing this object's type. More...
 

Detailed Description

GeoMipTerrain, meaning Panda3D GeoMipMapping, can convert a heightfield image into a 3D terrain, consisting of several GeomNodes.

It uses the GeoMipMapping algorithm, or Geometrical MipMapping, based on the LOD (Level of Detail) algorithm. For more information about the GeoMipMapping algoritm, see this paper, written by Willem H. de Boer: http://flipcode.com/articles/article_geomipmaps.pdf

Member Enumeration Documentation

◆ AutoFlattenMode

Enumerator
AFM_off 

FM_off: don't ever flatten the terrain.

AFM_light 

FM_light: the terrain is flattened using flatten_light.

AFM_medium 

FM_medium: the terrain is flattened using flatten_medium.

AFM_strong 

FM_strong: the terrain is flattened using flatten_strong.

Member Function Documentation

◆ __init__()

__init__ ( str  name)

◆ calcAmbientOcclusion()

calcAmbientOcclusion ( float  radius,
float  contrast,
float  brightness 
)

Calculates an approximate for the ambient occlusion and stores it in the color map, so that it will be written to the vertex colors.

Any existing color map will be discarded. You need to call this before generating the geometry.

◆ clearColorMap()

clearColorMap ( )

Clears the color map.

◆ colorMap()

PNMImage colorMap ( )

Returns a reference to the color map (a PNMImage) contained inside GeoMipTerrain.

You can use the reference to alter the color map.

◆ generate()

generate ( )

(Re)generates the entire terrain, erasing the current.

This call un- flattens the terrain, so make sure you have set auto-flatten if you want to keep your terrain flattened.

◆ getBlockFromPos()

LVecBase2 getBlockFromPos ( double  x,
double  y 
)

Gets the coordinates of the block at the specified position.

This position must be relative to the terrain, not to render. Returns an array containing two values: the block x and the block y coords. If the positions are out of range, the closest block is taken. Note that the VecBase returned does not represent a vector, position, or rotation, but it contains the block index of the block which you can use in GeoMipTerrain::get_block_node_path.

◆ getBlockNodePath()

const NodePath getBlockNodePath ( unsigned short int  mx,
unsigned short int  my 
)

Returns the NodePath of the specified block.

If auto-flatten is enabled and the node is getting removed during the flattening process, it will still return a NodePath with the appropriate terrain chunk, but it will be in a temporary scenegraph. Please note that this returns a const object and you can not modify the node. Modify the heightfield instead.

◆ getBlockSize()

unsigned short int getBlockSize ( )

Gets the block size.

◆ getBorderStitching()

bool getBorderStitching ( )

Returns the current stitching setting.

False by default, unless set_stitching has been set.

◆ getBruteforce()

bool getBruteforce ( )

Returns a boolean whether the terrain is rendered bruteforce or not.

See set_bruteforce for more information.

◆ getClassType()

static TypeHandle getClassType ( )
static

◆ getElevation()

double getElevation ( double  x,
double  y 
)

Fetches the elevation at (x, y), where the input coordinate is specified in pixels.

This ignores the current LOD level and instead provides an accurate number. Linear blending is used for non-integral coordinates. Terrain scale is NOT taken into account! To get accurate normals, please multiply this with the terrain Z scale!

trueElev = terr.get_elevation(x,y) * terr.get_sz();

◆ getFar()

double getFar ( )

Returns the far LOD distance in the terrain coordinate space.

◆ getFlattenMode()

int getFlattenMode ( )

Returns the automatic-flatten mode (e.g., off, flatten_light, flatten_medium, or flatten_strong)

◆ getFocalPoint()

NodePath getFocalPoint ( )

Returns the focal point, as a NodePath.

If you have set it to be just a point, it will return an empty node at the focal position.

◆ getMaxLevel()

unsigned short int getMaxLevel ( )

Returns the highest level possible for this block size.

When a block is at this level, it will be the worst quality possible.

◆ getMinLevel()

unsigned short int getMinLevel ( )

Gets the minimum level of detail at which blocks may be generated by generate() or update().

The default value is 0, which is the highest quality.

◆ getNear()

double getNear ( )

Returns the near LOD distance in the terrain coordinate space.

◆ getNormal() [1/2]

LVector3 getNormal ( int  x,
int  y 
)

Fetches the terrain normal at (x, y), where the input coordinate is specified in pixels.

This ignores the current LOD level and instead provides an accurate number. Terrain scale is NOT taken into account! To get accurate normals, please divide it by the terrain scale and normalize it again, like this:

LVector3 normal (terr.get_normal(x, y)); normal.set(normal.get_x() / root.get_sx(), normal.get_y() / root.get_sy(), normal.get_z() / root.get_sz()); normal.normalize();

◆ getNormal() [2/2]

LVector3 getNormal ( unsigned short int  mx,
unsigned short int  my,
int  x,
int  y 
)

Fetches the terrain normal at (x,y), where the input coordinate is specified in pixels.

This ignores the current LOD level and instead provides an accurate number. Terrain scale is NOT taken into account! To get accurate normals, please divide it by the terrain scale and normalize it again!

◆ getRoot()

NodePath getRoot ( )

Returns the root of the terrain.

This is a single PandaNode to which all the rest of the terrain is parented. The generate and update operations replace the nodes which are parented to this root, but they don't replace this root itself.

◆ hasColorMap()

bool hasColorMap ( )

Returns whether a color map has been set.

◆ heightfield()

PNMImage heightfield ( )

Returns a reference to the heightfield (a PNMImage) contained inside GeoMipTerrain.

You can use the reference to alter the heightfield.

◆ isDirty()

bool isDirty ( )

Returns a bool indicating whether the terrain is marked 'dirty', that means the terrain has to be regenerated on the next update() call, because for instance the heightfield has changed.

Once the terrain has been regenerated, the dirty flag automatically gets reset internally.

◆ makeSlopeImage()

PNMImage makeSlopeImage ( )

Returns a new grayscale image containing the slope angles.

A white pixel value means a vertical slope, while a black pixel will mean that the terrain is entirely flat at that pixel. You can translate it to degrees by mapping the greyscale values from 0 to 90 degrees. The resulting image will have the same size as the heightfield image. The scale will be taken into respect – meaning, if you change the terrain scale, the slope image will need to be regenerated in order to be correct.

◆ setAutoFlatten()

setAutoFlatten ( int  mode)

The terrain can be automatically flattened (using flatten_light, flatten_medium, or flatten_strong) after each update.

This only affects future updates, it doesn't flatten the current terrain.

◆ setBlockSize()

setBlockSize ( unsigned short int  newbs)

Sets the block size.

If it is not a power of two, the closest power of two is used.

◆ setBorderStitching()

setBorderStitching ( bool  stitching)

If this value is true, the LOD level at the borders of the terrain will be 0.

This is useful if you have multiple terrains attached and you want to stitch them together, to fix seams. This setting also has effect when bruteforce is enabled, although in that case you are probably better off with setting the minlevels to the same value.

◆ setBruteforce()

setBruteforce ( bool  bf)

Sets a boolean specifying whether the terrain will be rendered bruteforce.

If the terrain is rendered bruteforce, there will be no Level of Detail, and the update() call will only update the terrain if it is marked dirty.

◆ setColorMap() [1/4]

bool setColorMap ( const Filename  filename,
PNMFileType  type 
)

Loads the specified image as color map.

The next time generate() is called, the terrain is painted with this color map using the vertex color column. Returns a boolean indicating whether the operation has succeeded.

◆ setColorMap() [2/4]

bool setColorMap ( const PNMImage  image)

◆ setColorMap() [3/4]

bool setColorMap ( const Texture  image)

◆ setColorMap() [4/4]

bool setColorMap ( str  path)

◆ setFactor()

setFactor ( float  factor)

DEPRECATED method.

Use set_near/far instead. Sets the quality factor at which blocks must be generated. The higher this level, the better quality the terrain will be, but more expensive to render. A value of 0 makes the terrain the lowest quality possible, depending on blocksize. The default value is 100.

◆ setFar()

setFar ( double  input_far)

Sets the far LOD distance, at which the terrain will be rendered at lowest quality.

This distance is in the terrain's coordinate space!

◆ setFocalPoint() [1/6]

setFocalPoint ( const LPoint2d  fp)

◆ setFocalPoint() [2/6]

setFocalPoint ( const LPoint2f  fp)

◆ setFocalPoint() [3/6]

setFocalPoint ( const LPoint3d  fp)

◆ setFocalPoint() [4/6]

setFocalPoint ( const LPoint3f  fp)

◆ setFocalPoint() [5/6]

setFocalPoint ( NodePath  fnp)

◆ setFocalPoint() [6/6]

setFocalPoint ( double  x,
double  y 
)

Sets the focal point.

GeoMipTerrain generates high-resolution terrain around the focal point, and progressively lower and lower resolution terrain as you get farther away. If a point is supplied and not a NodePath, make sure it's relative to the terrain. Only the x and y coordinates of the focal point are taken in respect.

◆ setHeightfield() [1/2]

bool setHeightfield ( const Filename  filename,
PNMFileType  type 
)

Loads the specified heightmap image file into the heightfield.

Returns true if succeeded, or false if an error has occured. If the heightmap is not a power of two plus one, it is scaled up using a gaussian filter.

◆ setHeightfield() [2/2]

bool setHeightfield ( const PNMImage  image)

Loads the specified heightmap image file into the heightfield.

Returns true if succeeded, or false if an error has occured. If the heightmap is not a power of two plus one, it is scaled up using a gaussian filter.

◆ setMinLevel()

setMinLevel ( unsigned short int  minlevel)

Sets the minimum level of detail at which blocks may be generated by generate() or update().

The default value is 0, which is the highest quality. This value is also taken in respect when generating the terrain bruteforce.

◆ setNear()

setNear ( double  input_near)

Sets the near LOD distance, at which the terrain will be rendered at highest quality.

This distance is in the terrain's coordinate space!

◆ setNearFar()

setNearFar ( double  input_near,
double  input_far 
)

Sets the near and far LOD distances in one call.

◆ update()

bool update ( )

Loops through all of the terrain blocks, and checks whether they need to be updated.

If that is indeed the case, it regenerates the mipmap. Returns a true when the terrain has changed. Returns false when the terrain isn't updated at all. If there is no terrain yet, it generates the entire terrain. This call un-flattens the terrain, so make sure you have set auto-flatten if you want to keep your terrain flattened.