DYT/Tool/OpenSceneGraph-3.6.5/include/osgEarth/SDF
2024-12-25 07:49:36 +08:00

126 lines
4.8 KiB
C++

/* -*-c++-*- */
/* osgEarth - Geospatial SDK for OpenSceneGraph
* Copyright 2020 Pelican Mapping
* http://osgearth.org
*
* osgEarth is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
#ifndef OSGEARTH_SDF_H
#define OSGEARTH_SDF_H
#include <osgEarth/Common>
#include <osgEarth/Feature>
#include <osgEarth/GLUtils>
#include <osg/Image>
namespace osg {
class Uniform;
}
namespace osgEarth { namespace Util
{
class Session;
class OSGEARTH_EXPORT SDFGenerator
{
public:
SDFGenerator();
//! Allocate a new SDF image
//! @param size X and Y dimension; must be a power of 2
//! @param extent Geospatial extent
GeoImage allocateSDF(
unsigned size,
const GeoExtent& extent,
GLenum pixelFormat =GL_RED) const;
//! Encode a nearest-neighbor field for vector data. Each pixel contains
//! the coordinates of the nearest pixel with feature data. The coordinate
//! system is [x,y] relate to the lower-left corner.
//!
//! You can pass this field to the createDistanceField function to convert
//! it to a distance field.
//!
//! @param features Features to use for distance calculation
//! @param nnfieldSize Size of raster to create
//! @param extent Geospatial extent of the raster
//! @param nnfield Input/output nearest neighbor field
//! @param inverted Whether to test empty pixels instead of full pixels
//! @param progress Progress tracker object
//! @return True upon success
bool createNearestNeighborField(
const FeatureList& features,
unsigned nnfieldSize,
const GeoExtent& extent,
bool inverted,
GeoImage& nnfield,
Cancelable* progress) const;
//! Encode a nearest-neighbor field from a raster image.
//! The input raster is typically rasterized feature data, but can be
//! anything.
//!
//! You can pass this field to the createDistanceField function to convert
//! it to a distance field.
//!
//! @param input Input raster data
//! @param inverted Whether to test empty pixels instead of full pixels
//! @param nnfield Input/output nearest neighbor field
//! @param progress Progress tracker object
//! @return True upon success
bool createNearestNeighborField(
const GeoImage& input,
bool inverted,
GeoImage& nnfield,
Cancelable* progress) const;
//! Encode a distance field into an image.
//! @param nnfield Input NN Field to conver to a distance field
//! @param sdf Distance field to populate (additively). Distance values are
//! in the range [0..1] normalized from the min_dist and max_dist inputs.
//! @param min_dist Distances <= min_dist are encoded as 0.0
//! @param max_dist Distances >= max_dist are encoded as 1.0
//! @param progress Progress tracker object
void createDistanceField(
const GeoImage& nnfield,
GeoImage& sdf,
float tile_size,
float min_dist,
float max_dist,
Cancelable* progress) const;
//! Whether to permit use of the GPU. Set this to true if there
//! is a running frame loop with an active graphics context available
//! and you are willing to shunt the processing to the GPU.
void setUseGPU(bool value);
//! Computes the distance field from an image using the technique described in http://cs.brown.edu/people/pfelzens/papers/dt-final.pdf
//! A great visualization of this algorithm is at https://observablehq.com/@mourner/fast-distance-transform
//! @param image The image to compute the distance field from with an alpha value of 0 indicating empty pixels
//! @param minPixels Pixel distances <= minPixels are encoded as 0.0
//! @param maxPixels Pixel distances >= maxPixels are encoded as 1.0
osg::Image* createDistanceField(const osg::Image* image, float minPixels, float maxPixels) const;
private:
void compute_nnf_on_cpu(osg::Image* buf) const;
bool _useGPU;
};
} } // osgEarth::Util
#endif // OSGEARTH_SDF_H