OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
TextureDisplacement.cpp File Reference
#include "TextureDisplacement.hpp"
#include <Eigen/Core>
#include <Eigen/Geometry>
#include <algorithm>
#include <array>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <functional>
#include <cassert>
#include <chrono>
#include <cmath>
#include <iterator>
#include <limits>
#include <map>
#include <memory>
#include <math.h>
#include <mutex>
#include <numeric>
#include <optional>
#include "nlohmann/json.hpp"
#include <queue>
#include <ratio>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <Eigen/Eigenvalues>
#include <tbb/blocked_range.h>
#include <tbb/parallel_for.h>
#include <tbb/parallel_sort.h>
#include <boost/log/trivial.hpp>
#include <utility>
#include <vector>
#include "AABBTreeIndirect.hpp"
#include "MeshBoolean.hpp"
#include "Model.hpp"
#include "PNGReadWrite.hpp"
#include "Point.hpp"
#include "TriangleMesh.hpp"
#include "TextureBake/TextureBakeDisplace.hpp"
#include "TriangleSelector.hpp"
#include "TextureBake/TextureBakeDebug.hpp"
#include "TextureBake/TextureBakeMesh.hpp"
#include "TextureBake/TextureBakePipeline.hpp"
#include "TextureBake/TextureBakeIndex.hpp"
Include dependency graph for TextureDisplacement.cpp:

Go to the source code of this file.

Classes

struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::DecodedTextureCache
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::SmoothedTextureCache
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::SmoothedTextureCache::Entry
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::AdjustedTextureCache
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::AdjustedTextureCache::Entry
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::TextureDetailCache
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::UnionFind
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::UnwrapCache
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::ChartEdge
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::Entry
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::UVTransform
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::LscmLookup
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::PatchRegion
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::PreparedLayer
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::Crossing
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::Edge
struct  Slic3r::anonymous_namespace{TextureDisplacement.cpp}::StepScan

Namespaces

namespace  Slic3r
 |/ Copyright (c) Prusa Research 2020 - 2023 Enrico Turri @enricoturri1966 |/ |/ PrusaSlicer is released under the terms of the AGPLv3 or higher |/
namespace  Slic3r::anonymous_namespace{TextureDisplacement.cpp}

Typedefs

using Slic3r::anonymous_namespace{TextureDisplacement.cpp}::Tri2 = std::array<Vec2f, 3>

Functions

void Slic3r::anonymous_namespace{TextureDisplacement.cpp}::smooth_height_pixels_box (std::vector< uint8_t > &pixels, int width, int height, int radius)
void Slic3r::anonymous_namespace{TextureDisplacement.cpp}::smooth_height_pixels (std::vector< uint8_t > &pixels, int width, int height, float radius)
bool Slic3r::height_texture_has_color (const TextureDisplacementLayer &layer)
DecodedHeightTexture Slic3r::decode_height_texture (const TextureDisplacementLayer &layer, bool keep_decoded)
float Slic3r::anonymous_namespace{TextureDisplacement.cpp}::unsharp_radius (int width, int height)
float Slic3r::anonymous_namespace{TextureDisplacement.cpp}::apply_brightness (float v, float b)
float Slic3r::anonymous_namespace{TextureDisplacement.cpp}::apply_contrast (float v, float c)
void Slic3r::anonymous_namespace{TextureDisplacement.cpp}::adjust_channel_spatial (std::vector< uint8_t > &channel, int width, int height, float blur, float sharpness)
float Slic3r::adjustment_blur_radius (float blur, int width, int height)
DecodedHeightTexture Slic3r::downscale_height_texture (const DecodedHeightTexture &src, int max_px)
DecodedHeightTexture Slic3r::apply_texture_adjustments (const DecodedHeightTexture &src, const TextureAdjustments &adj)
TextureDetail Slic3r::analyze_texture_detail (const TextureDisplacementLayer &layer)
V2Resolution Slic3r::recommend_v2_resolution (const indexed_triangle_set &mesh, const std::vector< TextureDisplacementLayer > &layers, const Transform3d &volume_to_world)
float Slic3r::anonymous_namespace{TextureDisplacement.cpp}::box_face_sign (float n)
Vec2f Slic3r::anonymous_namespace{TextureDisplacement.cpp}::box_plane_yz (const Vec3f &p, float nx)
Vec2f Slic3r::anonymous_namespace{TextureDisplacement.cpp}::box_plane_xz (const Vec3f &p, float ny)
Vec2f Slic3r::anonymous_namespace{TextureDisplacement.cpp}::box_plane_xy (const Vec3f &p, float nz)
void Slic3r::box_projection_axes (const Vec3f &normal, Vec3f &u_axis, Vec3f &v_axis)
Vec2f Slic3r::project_planar (const Vec3f &position, const Vec3f &normal)
Vec2f Slic3r::anonymous_namespace{TextureDisplacement.cpp}::project_cylindrical (const Vec3f &position, const Vec3f &patch_center, const Vec3f &patch_axis)
Vec2f Slic3r::anonymous_namespace{TextureDisplacement.cpp}::project_spherical (const Vec3f &position, const Vec3f &patch_center)
indexed_triangle_set Slic3r::anonymous_namespace{TextureDisplacement.cpp}::compact_patch_with_map (const indexed_triangle_set &patch, std::vector< int > &original_to_compact)
uint64_t Slic3r::anonymous_namespace{TextureDisplacement.cpp}::undirected_edge_key (int a, int b)
Vec3f Slic3r::anonymous_namespace{TextureDisplacement.cpp}::face_normal (const indexed_triangle_set &mesh, const stl_triangle_vertex_indices &tri)
bool Slic3r::anonymous_namespace{TextureDisplacement.cpp}::chart_is_flattenable (const indexed_triangle_set &mesh, const std::vector< Vec3f > &normals, const std::vector< int > &faces)
std::vector< char > Slic3r::anonymous_namespace{TextureDisplacement.cpp}::split_chart_sides (const indexed_triangle_set &mesh, const std::vector< Vec3f > &normals, const std::vector< int > &faces)
std::vector< int > Slic3r::anonymous_namespace{TextureDisplacement.cpp}::segment_into_charts (const indexed_triangle_set &mesh, const std::vector< Vec3f > &normals, float seam_angle_deg, const std::unordered_set< uint64_t > &seam_keys, int &chart_count)
std::vector< Vec2f > Slic3r::anonymous_namespace{TextureDisplacement.cpp}::project_to_tangent_plane (const indexed_triangle_set &chart, const Vec3f &normal)
float Slic3r::anonymous_namespace{TextureDisplacement.cpp}::area_3d (const indexed_triangle_set &mesh)
float Slic3r::anonymous_namespace{TextureDisplacement.cpp}::area_2d (const std::vector< Vec2f > &uvs, const std::vector< stl_triangle_vertex_indices > &indices)
uint64_t Slic3r::anonymous_namespace{TextureDisplacement.cpp}::unwrap_cache_key (const indexed_triangle_set &patch, float seam_angle_deg, float padding_mm, const std::vector< std::pair< int, int > > &seam_edges)
PatchUnwrap Slic3r::compute_patch_unwrap (const indexed_triangle_set &patch, float seam_angle_deg, float padding_mm, const std::vector< std::pair< int, int > > &seam_edges)
Eigen::Matrix< float, 2, 3 > Slic3r::island_transform_matrix (int chart, const PatchUnwrap &unwrap, const std::vector< TextureIsland > &islands)
Vec2f Slic3r::apply_island_transform (const Vec2f &uv, int chart, const PatchUnwrap &unwrap, const std::vector< TextureIsland > &islands)
std::map< std::pair< int, int >, std::vector< ChartEdge > > Slic3r::anonymous_namespace{TextureDisplacement.cpp}::build_shared_edges (const PatchUnwrap &u)
TextureIsland Slic3r::anonymous_namespace{TextureDisplacement.cpp}::solve_edge_alignment (const Vec2f &rc0, const Vec2f &rc1, const Vec2f &pp0, const Vec2f &pp1, const Vec2f &cen)
bool Slic3r::join_chart_placement (const PatchUnwrap &unwrap, const std::vector< TextureIsland > &islands, int child, int parent, TextureIsland &out_child)
bool Slic3r::anonymous_namespace{TextureDisplacement.cpp}::triangles_overlap (const Tri2 &a, const Tri2 &b, float eps)
std::vector< TextureIsland > Slic3r::compute_connected_net (const PatchUnwrap &unwrap)
std::vector< uint8_t > Slic3r::transfer_facet_paint (const indexed_triangle_set &src_mesh, const TriangleSelector::TriangleSplittingData &src_paint, const indexed_triangle_set &dst_mesh)
void Slic3r::average_island_scales (std::vector< TextureIsland > &islands)
std::vector< bool > Slic3r::apply_lscm_uv_overrides (PatchUnwrap &unwrap, const std::vector< std::pair< int, Vec2f > > &overrides)
std::vector< Vec2f > Slic3r::compute_lscm_uvs (const indexed_triangle_set &patch, const TextureDisplacementLayer &layer)
std::vector< Vec2f > Slic3r::compute_lscm_corner_uvs (const indexed_triangle_set &patch, const TextureDisplacementLayer &layer)
static void Slic3r::barycentric_weights (const Vec3f &a, const Vec3f &b, const Vec3f &c, const Vec3f &p, float &w1, float &w2)
std::vector< Vec2f > Slic3r::compute_model_corner_uvs (const indexed_triangle_set &base_mesh, const std::vector< Vec2f > &model_uv, const indexed_triangle_set &patch, const std::vector< int > &patch_source)
std::vector< Vec2f > Slic3r::collapse_corner_uvs (const indexed_triangle_set &patch, const std::vector< Vec2f > &corner)
std::vector< Vec2f > Slic3r::transfer_uv_channel (const indexed_triangle_set &src_mesh, const std::vector< Vec2f > &src_uv, const indexed_triangle_set &dst_mesh, float max_distance)
Vec3f Slic3r::anonymous_namespace{TextureDisplacement.cpp}::triplanar_weights (const Vec3f &normal)
Vec2f Slic3r::apply_uv_transform (const Vec2f &planar, const TextureDisplacementLayer &layer, float aspect, bool normalized_uv)
float Slic3r::blend_displacement (float accumulated, float value, TextureBlendMode mode)
bool Slic3r::project_uv_projective (const std::array< float, 12 > &m, const Vec3f &position, Vec2f &uv)
float Slic3r::sample_layer_height (const DecodedHeightTexture &texture, const TextureDisplacementLayer &layer, const Vec3f &position, const Vec3f &normal, const Vec3f &patch_center, const Vec3f &patch_axis, const Vec2f *lscm_uv)
bool Slic3r::sample_layer_color (const DecodedHeightTexture &texture, const TextureDisplacementLayer &layer, const Vec3f &position, const Vec3f &normal, Vec3f &out, const Vec3f &patch_center, const Vec3f &patch_axis, const Vec2f *lscm_uv)
indexed_triangle_set Slic3r::extract_painted_patch (const indexed_triangle_set &base_mesh, const TriangleSelector::TriangleSplittingData &facet_data)
bool Slic3r::compute_layer_paint_anchor (const indexed_triangle_set &base_mesh, const TriangleSelector::TriangleSplittingData &facet_data, Vec3f &anchor_pos, Vec3f &anchor_normal)
std::vector< Vec3f > Slic3r::texture_displacement_vertex_normals (const indexed_triangle_set &its)
std::vector< float > Slic3r::anonymous_namespace{TextureDisplacement.cpp}::patch_boundary_distance (const indexed_triangle_set &patch, const std::vector< bool > &is_boundary)
void Slic3r::anonymous_namespace{TextureDisplacement.cpp}::despeckle_triangle_colors (const indexed_triangle_set &mesh, std::vector< int > &color, int passes)
void Slic3r::merge_small_color_regions (const indexed_triangle_set &mesh, std::vector< int > &color, float min_area_mm2)
indexed_triangle_set Slic3r::anonymous_namespace{TextureDisplacement.cpp}::build_texture_displacement_v2 (const indexed_triangle_set &mesh, const std::vector< TextureDisplacementLayer > &layers, const TextureDisplacementFacetsData &facets_data, const TextureDisplacementOptions &options, const DisplacementProgressFn &progress, const TextureColorRequest *color, bool flip_normals, BakeStageRecorder *debug, TextureBakeStats *stats, const std::vector< Vec2f > *model_uv, float resting_drop)
static indexed_triangle_set Slic3r::build_texture_displacement_in_place (const indexed_triangle_set &base_mesh, const std::vector< TextureDisplacementLayer > &layers, const TextureDisplacementFacetsData &facets_data, const TextureDisplacementOptions &options, const DisplacementProgressFn &progress, const TextureColorRequest *color, bool flip_normals, BakeStageRecorder *debug, TextureBakeStats *stats, const std::vector< Vec2f > *model_uv, float resting_drop)
indexed_triangle_set Slic3r::build_texture_displacement (const indexed_triangle_set &base_mesh, const std::vector< TextureDisplacementLayer > &layers, const TextureDisplacementFacetsData &facets_data, const TextureDisplacementOptions &options, const DisplacementProgressFn &progress, const TextureColorRequest *color, const Transform3d &volume_to_world, BakeStageRecorder *debug, TextureBakeStats *stats, const std::vector< Vec2f > *model_uv, const Vec3d *texture_anchor, float resting_drop)
void Slic3r::texture_displacement_patch_frame (const indexed_triangle_set &patch, const std::vector< Vec3f > &vertex_normals, Vec3f &center, Vec3f &axis, Vec3f &average_normal)
Transform3d Slic3r::texture_displacement_bake_frame (const Transform3d &volume_to_world, const Vec3d &anchor)
Transform3d Slic3r::texture_displacement_bake_frame (const Transform3d &volume_to_world)
Transform3d Slic3r::texture_displacement_volume_to_world (const ModelVolume &volume)
indexed_triangle_set Slic3r::build_texture_displacement (const ModelVolume &volume)
void Slic3r::smooth_mesh_vertices (indexed_triangle_set &mesh, const std::vector< uint8_t > &movable, float strength, int iterations, const DisplacementProgressFn &on_pass)
std::shared_ptr< std::vector< PreparedLayer > > Slic3r::anonymous_namespace{TextureDisplacement.cpp}::prepare_sampleable_layers (const indexed_triangle_set &base_mesh, const std::vector< TextureDisplacementLayer > &layers, const TextureDisplacementFacetsData &facets_data, bool need_color, const std::vector< Vec2f > *model_uv)
ColorFieldSampler Slic3r::make_combined_color_sampler (const indexed_triangle_set &base_mesh, const std::vector< TextureDisplacementLayer > &layers, const TextureDisplacementFacetsData &facets_data, ColorQuantizeFn quantize, ColorQuantizeFn quantize_pure, const std::vector< Vec2f > *model_uv)
HeightFieldSampler Slic3r::make_combined_displacement_sampler (const indexed_triangle_set &base_mesh, const std::vector< TextureDisplacementLayer > &layers, const TextureDisplacementFacetsData &facets_data, const std::vector< Vec2f > *model_uv)
indexed_triangle_set Slic3r::subdivide_mesh_uniform (const indexed_triangle_set &mesh, float max_edge_length_mm, int max_iterations)
indexed_triangle_set Slic3r::subdivide_mesh_adaptive (const indexed_triangle_set &mesh, const std::vector< uint8_t > &refine_region, float target_edge_length_mm, int max_triangles, std::vector< int > *out_source, const HeightFieldSampler &sampler, float chord_tolerance_mm, float min_edge_length_mm, float border_edge_length_mm, const DisplacementProgressFn &progress, const ColorFieldSampler &color, float color_edge_length_mm, bool split_multi_crossings)
void Slic3r::anonymous_namespace{TextureDisplacement.cpp}::ear_clip (const std::vector< Vec2f > &pts, std::vector< int > poly, const std::function< void(int, int, int)> &emit)
void Slic3r::anonymous_namespace{TextureDisplacement.cpp}::simplify_polyline (const std::vector< Vec2f > &in, float tol, std::vector< Vec2f > &out)
uint64_t Slic3r::anonymous_namespace{TextureDisplacement.cpp}::step_edge_key (int a, int b)
StepScan Slic3r::anonymous_namespace{TextureDisplacement.cpp}::scan_steps (const indexed_triangle_set &mesh, const std::vector< uint8_t > &region, const HeightFieldSampler &sampler, float step_width_mm, float seam_gap_mm, float min_feature_mm, bool nudge)
bool Slic3r::texture_has_steps_to_cut (const indexed_triangle_set &mesh, const std::vector< uint8_t > &region, const HeightFieldSampler &sampler, float step_width_mm, float seam_gap_mm, float min_feature_mm)
indexed_triangle_set Slic3r::cut_mesh_at_steps (const indexed_triangle_set &mesh, const std::vector< uint8_t > &region, const HeightFieldSampler &sampler, float step_width_mm, float seam_gap_mm, float min_feature_mm, std::vector< int > *out_source, size_t *out_cut_count)
nlohmann::json Slic3r::anonymous_namespace{TextureDisplacement.cpp}::vec2_to_json (const Vec2f &v)
nlohmann::json Slic3r::anonymous_namespace{TextureDisplacement.cpp}::vec3_to_json (const Vec3f &v)
Vec2f Slic3r::anonymous_namespace{TextureDisplacement.cpp}::vec2_from_json (const nlohmann::json &j, const Vec2f &fallback)
Vec3f Slic3r::anonymous_namespace{TextureDisplacement.cpp}::vec3_from_json (const nlohmann::json &j, const Vec3f &fallback)
template<class T>
void Slic3r::anonymous_namespace{TextureDisplacement.cpp}::read (const nlohmann::json &j, const char *k, T &out)
void Slic3r::anonymous_namespace{TextureDisplacement.cpp}::read_enum (const nlohmann::json &j, const char *k, int &out)
std::string Slic3r::texture_displacement_layers_to_json (const std::vector< TextureDisplacementLayer > &layers, const TextureDisplacementOptions &options)
bool Slic3r::texture_displacement_layers_from_json (const std::string &text, std::vector< TextureDisplacementLayer > &layers, TextureDisplacementOptions &options)

Variables

DecodedTextureCache Slic3r::anonymous_namespace{TextureDisplacement.cpp}::g_decoded_texture_cache
SmoothedTextureCache Slic3r::anonymous_namespace{TextureDisplacement.cpp}::g_smoothed_texture_cache
AdjustedTextureCache Slic3r::anonymous_namespace{TextureDisplacement.cpp}::g_adjusted_texture_cache
constexpr float Slic3r::anonymous_namespace{TextureDisplacement.cpp}::SOURCE_BLUR_SPAN = 0.05f
constexpr float Slic3r::anonymous_namespace{TextureDisplacement.cpp}::SOURCE_BLUR_MAX_PX = 48.f
TextureDetailCache Slic3r::anonymous_namespace{TextureDisplacement.cpp}::g_texture_detail_cache
UnwrapCache Slic3r::anonymous_namespace{TextureDisplacement.cpp}::g_unwrap_cache
const size_t Slic3r::anonymous_namespace{TextureDisplacement.cpp}::UNWRAP_CACHE_MAX_ENTRIES = 8

Class Documentation

◆ Slic3r::anonymous_namespace{TextureDisplacement.cpp}::DecodedTextureCache

struct Slic3r::anonymous_namespace{TextureDisplacement.cpp}::DecodedTextureCache
Collaboration diagram for Slic3r::anonymous_namespace{TextureDisplacement.cpp}::DecodedTextureCache:
Class Members
unordered_map< const void *, pair< weak_ptr< const vector< unsigned char > >, DecodedHeightTexture > > entries
mutex mutex

◆ Slic3r::anonymous_namespace{TextureDisplacement.cpp}::SmoothedTextureCache

struct Slic3r::anonymous_namespace{TextureDisplacement.cpp}::SmoothedTextureCache
Collaboration diagram for Slic3r::anonymous_namespace{TextureDisplacement.cpp}::SmoothedTextureCache:
Class Members
unordered_map< const void *, Entry > entries
mutex mutex

◆ Slic3r::anonymous_namespace{TextureDisplacement.cpp}::SmoothedTextureCache::Entry

struct Slic3r::anonymous_namespace{TextureDisplacement.cpp}::SmoothedTextureCache::Entry
Collaboration diagram for Slic3r::anonymous_namespace{TextureDisplacement.cpp}::SmoothedTextureCache::Entry:
Class Members
TextureAdjustments adjust
float smoothing = 0.f
weak_ptr< const vector< unsigned char > > source
DecodedHeightTexture texture

◆ Slic3r::anonymous_namespace{TextureDisplacement.cpp}::AdjustedTextureCache

struct Slic3r::anonymous_namespace{TextureDisplacement.cpp}::AdjustedTextureCache
Collaboration diagram for Slic3r::anonymous_namespace{TextureDisplacement.cpp}::AdjustedTextureCache:
Class Members
unordered_map< const void *, Entry > entries
mutex mutex

◆ Slic3r::anonymous_namespace{TextureDisplacement.cpp}::AdjustedTextureCache::Entry

struct Slic3r::anonymous_namespace{TextureDisplacement.cpp}::AdjustedTextureCache::Entry
Collaboration diagram for Slic3r::anonymous_namespace{TextureDisplacement.cpp}::AdjustedTextureCache::Entry:
Class Members
TextureAdjustments adjust
weak_ptr< const vector< unsigned char > > source
DecodedHeightTexture texture

◆ Slic3r::anonymous_namespace{TextureDisplacement.cpp}::TextureDetailCache

struct Slic3r::anonymous_namespace{TextureDisplacement.cpp}::TextureDetailCache
Collaboration diagram for Slic3r::anonymous_namespace{TextureDisplacement.cpp}::TextureDetailCache:
Class Members
unordered_map< const void *, pair< weak_ptr< const vector< unsigned char > >, TextureDetail > > entries
mutex mutex

◆ Slic3r::anonymous_namespace{TextureDisplacement.cpp}::UnwrapCache

struct Slic3r::anonymous_namespace{TextureDisplacement.cpp}::UnwrapCache
Collaboration diagram for Slic3r::anonymous_namespace{TextureDisplacement.cpp}::UnwrapCache:
Class Members
unordered_map< uint64_t, PatchUnwrap > entries
mutex mutex

◆ Slic3r::anonymous_namespace{TextureDisplacement.cpp}::ChartEdge

struct Slic3r::anonymous_namespace{TextureDisplacement.cpp}::ChartEdge
Class Members
int chart = -1
int uv_hi = -1
int uv_lo = -1

◆ Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::Entry

struct Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::Entry
Collaboration diagram for Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::Entry:
Class Members
Vec2f hi
Vec2f lo
Tri2 tri

◆ Slic3r::anonymous_namespace{TextureDisplacement.cpp}::Crossing

struct Slic3r::anonymous_namespace{TextureDisplacement.cpp}::Crossing
Class Members
int a = -1
int b = -1
float dt_max = std::numeric_limits<float>::max()
int hi = -1
int lo = -1
Vec3f n
int near_a = -1
int near_b = -1
bool no_seam = false
Vec3f p
bool sharp = false
float sin_min = 1.f
int single = -1
float t
float thick = 0.f
bool used = false

◆ Slic3r::anonymous_namespace{TextureDisplacement.cpp}::Edge

struct Slic3r::anonymous_namespace{TextureDisplacement.cpp}::Edge
Collaboration diagram for Slic3r::anonymous_namespace{TextureDisplacement.cpp}::Edge:
Class Members
vector< Crossing > xs