Panda3D
Loading...
Searching...
No Matches
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...

#include "geoMipTerrain.h"

Inheritance diagram for GeoMipTerrain:
TypedObject MemoryBase

Public Types

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

Public Member Functions

 GeoMipTerrain (const std::string &name)
 
 ~GeoMipTerrain ()
 This will not remove the terrain node itself.
 
void calc_ambient_occlusion (PN_stdfloat radius=32, PN_stdfloat contrast=2.0f, PN_stdfloat brightness=0.75f)
 Calculates an approximate for the ambient occlusion and stores it in the color map, so that it will be written to the vertex colors.
 
void clear_color_map ()
 Clears the color map.
 
PNMImagecolor_map ()
 Returns a reference to the color map (a PNMImage) contained inside GeoMipTerrain.
 
virtual TypeHandle force_init_type ()
 
void generate ()
 (Re)generates the entire terrain, erasing the current.
 
LVecBase2 get_block_from_pos (double x, double y)
 Gets the coordinates of the block at the specified position.
 
const NodePath get_block_node_path (unsigned short mx, unsigned short my)
 Returns the NodePath of the specified block.
 
unsigned short get_block_size ()
 Gets the block size.
 
bool get_border_stitching ()
 Returns the current stitching setting.
 
bool get_bruteforce ()
 Returns a boolean whether the terrain is rendered bruteforce or not.
 
double get_elevation (double x, double y)
 Fetches the elevation at (x, y), where the input coordinate is specified in pixels.
 
double get_far ()
 Returns the far LOD distance in the terrain coordinate space.
 
int get_flatten_mode ()
 Returns the automatic-flatten mode (e.g., off, flatten_light, flatten_medium, or flatten_strong)
 
NodePath get_focal_point () const
 Returns the focal point, as a NodePath.
 
unsigned short get_max_level ()
 Returns the highest level possible for this block size.
 
unsigned short get_min_level ()
 Gets the minimum level of detail at which blocks may be generated by generate() or update().
 
double get_near ()
 Returns the near LOD distance in the terrain coordinate space.
 
LVector3 get_normal (int x, int y)
 Fetches the terrain normal at (x, y), where the input coordinate is specified in pixels.
 
LVector3 get_normal (unsigned short mx, unsigned short my, int x, int y)
 Fetches the terrain normal at (x,y), where the input coordinate is specified in pixels.
 
NodePath get_root () const
 Returns the root of the terrain.
 
virtual TypeHandle get_type () const
 
bool has_color_map () const
 Returns whether a color map has been set.
 
PNMImageheightfield ()
 Returns a reference to the heightfield (a PNMImage) contained inside GeoMipTerrain.
 
bool is_dirty ()
 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.
 
PNMImage make_slope_image ()
 Returns a new grayscale image containing the slope angles.
 
void set_auto_flatten (int mode)
 The terrain can be automatically flattened (using flatten_light, flatten_medium, or flatten_strong) after each update.
 
void set_block_size (unsigned short newbs)
 Sets the block size.
 
void set_border_stitching (bool stitching)
 If this value is true, the LOD level at the borders of the terrain will be 0.
 
void set_bruteforce (bool bf)
 Sets a boolean specifying whether the terrain will be rendered bruteforce.
 
bool set_color_map (const Filename &filename, PNMFileType *type=nullptr)
 Loads the specified image as color map.
 
bool set_color_map (const PNMImage &image)
 
bool set_color_map (const std::string &path)
 
bool set_color_map (const Texture *image)
 
void set_factor (PN_stdfloat factor)
 DEPRECATED method.
 
void set_far (double input_far)
 Sets the far LOD distance, at which the terrain will be rendered at lowest quality.
 
void set_focal_point (const LPoint2d &fp)
 
void set_focal_point (const LPoint2f &fp)
 
void set_focal_point (const LPoint3d &fp)
 
void set_focal_point (const LPoint3f &fp)
 
void set_focal_point (double x, double y)
 Sets the focal point.
 
void set_focal_point (NodePath fnp)
 
bool set_heightfield (const Filename &filename, PNMFileType *type=nullptr)
 Loads the specified heightmap image file into the heightfield.
 
bool set_heightfield (const PNMImage &image)
 Loads the specified heightmap image file into the heightfield.
 
void set_min_level (unsigned short minlevel)
 Sets the minimum level of detail at which blocks may be generated by generate() or update().
 
void set_near (double input_near)
 Sets the near LOD distance, at which the terrain will be rendered at highest quality.
 
void set_near_far (double input_near, double input_far)
 Sets the near and far LOD distances in one call.
 
bool update ()
 Loops through all of the terrain blocks, and checks whether they need to be updated.
 
- Public Member Functions inherited from TypedObject
 TypedObject (const TypedObject &copy)=default
 
TypedObjectas_typed_object ()
 Returns the object, upcast (if necessary) to a TypedObject pointer.
 
const TypedObjectas_typed_object () const
 Returns the object, upcast (if necessary) to a TypedObject pointer.
 
int get_best_parent_from_Set (const std::set< int > &) const
 
int get_type_index () const
 Returns the internal index number associated with this object's TypeHandle, a unique number for each different type.
 
bool is_exact_type (TypeHandle handle) const
 Returns true if the current object is the indicated type exactly.
 
bool is_of_type (TypeHandle handle) const
 Returns true if the current object is or derives from the indicated type.
 
TypedObjectoperator= (const TypedObject &copy)=default
 
- Public Member Functions inherited from MemoryBase
void operator delete (void *, void *)
 
void operator delete (void *ptr)
 
void operator delete[] (void *, void *)
 
void operator delete[] (void *ptr)
 
void * operator new (size_t size)
 
void * operator new (size_t size, void *ptr)
 
void * operator new[] (size_t size)
 
void * operator new[] (size_t size, void *ptr)
 

Static Public Member Functions

static TypeHandle get_class_type ()
 
static void init_type ()
 
- Static Public Member Functions inherited from TypedObject
static TypeHandle get_class_type ()
 
static void init_type ()
 This function is declared non-inline to work around a compiler bug in g++ 2.96.
 

Additional Inherited Members

- Public Attributes inherited from TypedObject
 get_type
 

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: https://flipcode.com/articles/article_geomipmaps.pdf

Definition at line 36 of file geoMipTerrain.h.

Member Enumeration Documentation

◆ AutoFlattenMode

enum GeoMipTerrain::AutoFlattenMode

Definition at line 62 of file geoMipTerrain.h.

Constructor & Destructor Documentation

◆ GeoMipTerrain()

GeoMipTerrain::GeoMipTerrain ( const std::string & name)
inlineexplicit

Definition at line 19 of file geoMipTerrain.I.

◆ ~GeoMipTerrain()

GeoMipTerrain::~GeoMipTerrain ( )
inline

This will not remove the terrain node itself.

To have the terrain itself also deleted, please call remove_node() prior to destruction.

Definition at line 46 of file geoMipTerrain.I.

Member Function Documentation

◆ calc_ambient_occlusion()

void GeoMipTerrain::calc_ambient_occlusion ( PN_stdfloat radius = 32,
PN_stdfloat contrast = 2.0f,
PN_stdfloat brightness = 0.75f )

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.

Definition at line 370 of file geoMipTerrain.cxx.

References PNMImage::gaussian_filter(), PNMImage::get_gray(), PNMImageHeader::get_maxval, PNMImage::make_grayscale(), PNMImage::set_maxval(), and PNMImage::set_xel().

◆ clear_color_map()

void GeoMipTerrain::clear_color_map ( )
inline

Clears the color map.

Definition at line 443 of file geoMipTerrain.I.

References PNMImage::clear().

◆ color_map()

PNMImage & GeoMipTerrain::color_map ( )
inline

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

You can use the reference to alter the color map.

Definition at line 63 of file geoMipTerrain.I.

◆ force_init_type()

virtual TypeHandle GeoMipTerrain::force_init_type ( )
inlinevirtual

Implements TypedObject.

Definition at line 165 of file geoMipTerrain.h.

◆ generate()

void GeoMipTerrain::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.

Definition at line 400 of file geoMipTerrain.cxx.

References NodePath::attach_new_node(), NodePath::node(), and PandaNode::remove_all_children().

Referenced by update().

◆ get_block_from_pos()

LVecBase2 GeoMipTerrain::get_block_from_pos ( double x,
double y )
inline

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.

Definition at line 326 of file geoMipTerrain.I.

◆ get_block_node_path()

const NodePath GeoMipTerrain::get_block_node_path ( unsigned short mx,
unsigned short my )
inline

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.

Definition at line 310 of file geoMipTerrain.I.

References NodePath::fail().

◆ get_block_size()

unsigned short GeoMipTerrain::get_block_size ( )
inline

Gets the block size.

Definition at line 194 of file geoMipTerrain.I.

◆ get_border_stitching()

bool GeoMipTerrain::get_border_stitching ( )
inline

Returns the current stitching setting.

False by default, unless set_stitching has been set.

Definition at line 470 of file geoMipTerrain.I.

◆ get_bruteforce()

bool GeoMipTerrain::get_bruteforce ( )
inline

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

See set_bruteforce for more information.

Definition at line 85 of file geoMipTerrain.I.

◆ get_class_type()

static TypeHandle GeoMipTerrain::get_class_type ( )
inlinestatic

Definition at line 154 of file geoMipTerrain.h.

◆ get_elevation()

double GeoMipTerrain::get_elevation ( 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();

Definition at line 281 of file geoMipTerrain.cxx.

◆ get_far()

double GeoMipTerrain::get_far ( )
inline

Returns the far LOD distance in the terrain coordinate space.

Definition at line 281 of file geoMipTerrain.I.

◆ get_flatten_mode()

int GeoMipTerrain::get_flatten_mode ( )
inline

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

Definition at line 298 of file geoMipTerrain.I.

◆ get_focal_point()

NodePath GeoMipTerrain::get_focal_point ( ) const
inline

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.

Definition at line 145 of file geoMipTerrain.I.

◆ get_max_level()

unsigned short GeoMipTerrain::get_max_level ( )
inline

Returns the highest level possible for this block size.

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

Definition at line 186 of file geoMipTerrain.I.

◆ get_min_level()

unsigned short GeoMipTerrain::get_min_level ( )
inline

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.

Definition at line 177 of file geoMipTerrain.I.

◆ get_near()

double GeoMipTerrain::get_near ( )
inline

Returns the near LOD distance in the terrain coordinate space.

Definition at line 289 of file geoMipTerrain.I.

◆ get_normal() [1/2]

LVector3 GeoMipTerrain::get_normal ( 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();

Definition at line 316 of file geoMipTerrain.cxx.

Referenced by get_normal(), make_slope_image(), and PT().

◆ get_normal() [2/2]

LVector3 GeoMipTerrain::get_normal ( unsigned short mx,
unsigned short my,
int x,
int y )
inline

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!

Definition at line 507 of file geoMipTerrain.I.

References get_normal().

◆ get_root()

NodePath GeoMipTerrain::get_root ( ) const
inline

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.

Definition at line 156 of file geoMipTerrain.I.

◆ get_type()

virtual TypeHandle GeoMipTerrain::get_type ( ) const
inlinevirtual

Implements TypedObject.

Definition at line 162 of file geoMipTerrain.h.

◆ has_color_map()

bool GeoMipTerrain::has_color_map ( ) const
inline

Returns whether a color map has been set.

Definition at line 435 of file geoMipTerrain.I.

◆ heightfield()

PNMImage & GeoMipTerrain::heightfield ( )
inline

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

You can use the reference to alter the heightfield.

Definition at line 54 of file geoMipTerrain.I.

◆ init_type()

static void GeoMipTerrain::init_type ( )
inlinestatic

Definition at line 157 of file geoMipTerrain.h.

◆ is_dirty()

bool GeoMipTerrain::is_dirty ( )
inline

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.

Definition at line 229 of file geoMipTerrain.I.

◆ make_slope_image()

PNMImage GeoMipTerrain::make_slope_image ( )

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.

Definition at line 347 of file geoMipTerrain.cxx.

References get_normal(), PNMImage::make_grayscale(), and PNMImage::set_xel().

◆ set_auto_flatten()

void GeoMipTerrain::set_auto_flatten ( int mode)
inline

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.

Definition at line 95 of file geoMipTerrain.I.

◆ set_block_size()

void GeoMipTerrain::set_block_size ( unsigned short newbs)
inline

Sets the block size.

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

Definition at line 203 of file geoMipTerrain.I.

◆ set_border_stitching()

void GeoMipTerrain::set_border_stitching ( bool stitching)
inline

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.

Definition at line 458 of file geoMipTerrain.I.

◆ set_bruteforce()

void GeoMipTerrain::set_bruteforce ( bool bf)
inline

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.

Definition at line 73 of file geoMipTerrain.I.

◆ set_color_map() [1/4]

bool GeoMipTerrain::set_color_map ( const Filename & filename,
PNMFileType * ftype = nullptr )
inline

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.

Definition at line 402 of file geoMipTerrain.I.

References PNMImage::read().

◆ set_color_map() [2/4]

bool GeoMipTerrain::set_color_map ( const PNMImage & image)
inline

Definition at line 412 of file geoMipTerrain.I.

◆ set_color_map() [3/4]

bool GeoMipTerrain::set_color_map ( const std::string & path)
inline

Definition at line 427 of file geoMipTerrain.I.

◆ set_color_map() [4/4]

bool GeoMipTerrain::set_color_map ( const Texture * image)
inline

Definition at line 420 of file geoMipTerrain.I.

◆ set_factor()

void GeoMipTerrain::set_factor ( PN_stdfloat factor)
inline

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.

Definition at line 241 of file geoMipTerrain.I.

◆ set_far()

void GeoMipTerrain::set_far ( double input_far)
inline

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

This distance is in the terrain's coordinate space!

Definition at line 272 of file geoMipTerrain.I.

◆ set_focal_point() [1/6]

void GeoMipTerrain::set_focal_point ( const LPoint2d & fp)
inline

Definition at line 116 of file geoMipTerrain.I.

◆ set_focal_point() [2/6]

void GeoMipTerrain::set_focal_point ( const LPoint2f & fp)
inline

Definition at line 120 of file geoMipTerrain.I.

◆ set_focal_point() [3/6]

void GeoMipTerrain::set_focal_point ( const LPoint3d & fp)
inline

Definition at line 124 of file geoMipTerrain.I.

◆ set_focal_point() [4/6]

void GeoMipTerrain::set_focal_point ( const LPoint3f & fp)
inline

Definition at line 128 of file geoMipTerrain.I.

◆ set_focal_point() [5/6]

void GeoMipTerrain::set_focal_point ( double x,
double y )
inline

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.

Definition at line 107 of file geoMipTerrain.I.

◆ set_focal_point() [6/6]

void GeoMipTerrain::set_focal_point ( NodePath fnp)
inline

Definition at line 132 of file geoMipTerrain.I.

◆ set_heightfield() [1/2]

bool GeoMipTerrain::set_heightfield ( const Filename & filename,
PNMFileType * ftype = nullptr )

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.

Definition at line 618 of file geoMipTerrain.cxx.

References PNMImage::clear_read_size(), PNMImage::copy_header_from(), PNMImageHeader::get_color_space, PNMImageHeader::get_x_size(), PNMImageHeader::get_y_size(), PNMImage::read(), PNMImageHeader::read_header(), and PNMImage::set_read_size().

◆ set_heightfield() [2/2]

bool GeoMipTerrain::set_heightfield ( const PNMImage & image)
inline

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.

Definition at line 372 of file geoMipTerrain.I.

References PNMImage::get_color_space(), PNMImageHeader::get_x_size(), and PNMImageHeader::get_y_size().

◆ set_min_level()

void GeoMipTerrain::set_min_level ( unsigned short minlevel)
inline

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.

Definition at line 167 of file geoMipTerrain.I.

◆ set_near()

void GeoMipTerrain::set_near ( double input_near)
inline

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

This distance is in the terrain's coordinate space!

Definition at line 262 of file geoMipTerrain.I.

◆ set_near_far()

void GeoMipTerrain::set_near_far ( double input_near,
double input_far )
inline

Sets the near and far LOD distances in one call.

Definition at line 251 of file geoMipTerrain.I.

◆ update()

bool GeoMipTerrain::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.

Definition at line 438 of file geoMipTerrain.cxx.

References generate(), NodePath::node(), and PandaNode::remove_all_children().


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