OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid Struct Reference
Collaboration diagram for Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid:

Classes

struct  Entry

Public Member Functions

bool range (const Vec2f &lo, const Vec2f &hi, int &x0, int &y0, int &x1, int &y1) const
bool boxes_apart (const Entry &a, const Entry &b) const
bool hits (const Entry &q, const std::vector< Entry > &bucket) const
bool overlaps (const Tri2 &t) const
void insert (const Tri2 &t)

Static Public Member Functions

static uint64_t key (int x, int y)
static Entry entry (const Tri2 &t)

Public Attributes

float cell
float eps
std::unordered_map< uint64_t, std::vector< Entry > > cells
std::vector< Entry > big

Static Public Attributes

static constexpr int BIG_SPAN = 16

Detailed Description


Class Documentation

◆ 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

Member Function Documentation

◆ boxes_apart()

bool Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::boxes_apart ( const Entry & a,
const Entry & b ) const
inline
1629 {
1630 return a.hi.x() + eps < b.lo.x() || b.hi.x() + eps < a.lo.x() || a.hi.y() + eps < b.lo.y() ||
1631 b.hi.y() + eps < a.lo.y();
1632 }
float eps
Definition TextureDisplacement.cpp:1609

References eps, Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::Entry::hi, and Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::Entry::lo.

Referenced by hits().

Here is the caller graph for this function:

◆ entry()

Entry Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::entry ( const Tri2 & t)
inlinestatic
1615 {
1616 return Entry{ t, t[0].cwiseMin(t[1]).cwiseMin(t[2]), t[0].cwiseMax(t[1]).cwiseMax(t[2]) };
1617 }

Referenced by insert(), and overlaps().

Here is the caller graph for this function:

◆ hits()

bool Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::hits ( const Entry & q,
const std::vector< Entry > & bucket ) const
inline
1634 {
1635 for (const Entry &b : bucket)
1636 if (!boxes_apart(q, b) && triangles_overlap(q.tri, b.tri, eps))
1637 return true;
1638 return false;
1639 }
bool triangles_overlap(const Tri2 &a, const Tri2 &b, float eps)
Definition TextureDisplacement.cpp:1565
bool boxes_apart(const Entry &a, const Entry &b) const
Definition TextureDisplacement.cpp:1628

References boxes_apart(), eps, Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::Entry::tri, and Slic3r::anonymous_namespace{TextureDisplacement.cpp}::triangles_overlap().

Referenced by overlaps().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ insert()

void Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::insert ( const Tri2 & t)
inline
1659 {
1660 const Entry e = entry(t);
1661 int x0, y0, x1, y1;
1662 if (!range(e.lo, e.hi, x0, y0, x1, y1)) {
1663 big.push_back(e);
1664 return;
1665 }
1666 for (int x = x0; x <= x1; ++x)
1667 for (int y = y0; y <= y1; ++y)
1668 cells[key(x, y)].push_back(e);
1669 }
static uint64_t key(int x, int y)
Definition TextureDisplacement.cpp:1613
std::vector< Entry > big
Definition TextureDisplacement.cpp:1611
static Entry entry(const Tri2 &t)
Definition TextureDisplacement.cpp:1614
bool range(const Vec2f &lo, const Vec2f &hi, int &x0, int &y0, int &x1, int &y1) const
Definition TextureDisplacement.cpp:1618
std::unordered_map< uint64_t, std::vector< Entry > > cells
Definition TextureDisplacement.cpp:1610

References big, cells, entry(), Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::Entry::hi, key(), Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::Entry::lo, and range().

Here is the call graph for this function:

◆ key()

uint64_t Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::key ( int x,
int y )
inlinestatic
1613{ return (uint64_t(uint32_t(x)) << 32) | uint32_t(y); }

Referenced by insert(), and overlaps().

Here is the caller graph for this function:

◆ overlaps()

bool Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::overlaps ( const Tri2 & t) const
inline
1641 {
1642 const Entry q = entry(t);
1643 if (hits(q, big))
1644 return true;
1645 int x0, y0, x1, y1;
1646 if (!range(q.lo, q.hi, x0, y0, x1, y1)) {
1647 for (const auto &[k, bucket] : cells)
1648 if (hits(q, bucket))
1649 return true;
1650 return false;
1651 }
1652 for (int x = x0; x <= x1; ++x)
1653 for (int y = y0; y <= y1; ++y)
1654 if (const auto it = cells.find(key(x, y)); it != cells.end() && hits(q, it->second))
1655 return true;
1656 return false;
1657 }
bool hits(const Entry &q, const std::vector< Entry > &bucket) const
Definition TextureDisplacement.cpp:1633

References big, cells, entry(), Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::Entry::hi, hits(), key(), Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::Entry::lo, and range().

Here is the call graph for this function:

◆ range()

bool Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::range ( const Vec2f & lo,
const Vec2f & hi,
int & x0,
int & y0,
int & x1,
int & y1 ) const
inline
1619 {
1620 x0 = int(std::floor(lo.x() / cell));
1621 y0 = int(std::floor(lo.y() / cell));
1622 x1 = int(std::floor(hi.x() / cell));
1623 y1 = int(std::floor(hi.y() / cell));
1624 return x1 - x0 <= BIG_SPAN && y1 - y0 <= BIG_SPAN;
1625 }
float cell
Definition TextureDisplacement.cpp:1608
static constexpr int BIG_SPAN
Definition TextureDisplacement.cpp:1593

References BIG_SPAN, and cell.

Referenced by insert(), and overlaps().

Here is the caller graph for this function:

Member Data Documentation

◆ big

std::vector<Entry> Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::big

Referenced by insert(), and overlaps().

◆ BIG_SPAN

int Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::BIG_SPAN = 16
staticconstexpr

Referenced by range().

◆ cell

float Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::cell

Referenced by range().

◆ cells

std::unordered_map<uint64_t, std::vector<Entry> > Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::cells

Referenced by insert(), and overlaps().

◆ eps

float Slic3r::anonymous_namespace{TextureDisplacement.cpp}::NetGrid::eps

Referenced by boxes_apart(), and hits().


The documentation for this struct was generated from the following file: