OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::TriangleSelector::TriangleSplittingData Struct Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/TriangleSelector.hpp>

Collaboration diagram for Slic3r::TriangleSelector::TriangleSplittingData:

Public Member Functions

 TriangleSplittingData ()=default
void reset_used_states ()
bool update_used_states (size_t bitstream_start_idx)
bool read_nibble (int &ibit, int &nibble) const

Public Attributes

std::vector< TriangleBitStreamMapping > triangles_to_split
std::vector< bool > bitstream
std::vector< bool > used_states { std::vector<bool>(static_cast<size_t>(EnforcerBlockerType::ExtruderMax) + 1, false) }

Private Member Functions

template<class Archive>
void serialize (Archive &ar)

Friends

class cereal::access
bool operator== (const TriangleSplittingData &lhs, const TriangleSplittingData &rhs)
bool operator!= (const TriangleSplittingData &lhs, const TriangleSplittingData &rhs)

Detailed Description

Constructor & Destructor Documentation

◆ TriangleSplittingData()

Slic3r::TriangleSelector::TriangleSplittingData::TriangleSplittingData ( )
default

Referenced by operator!=, and operator==.

Here is the caller graph for this function:

Member Function Documentation

◆ read_nibble()

bool Slic3r::TriangleSelector::TriangleSplittingData::read_nibble ( int & ibit,
int & nibble ) const
inline
317 {
318 if (ibit < 0 || static_cast<size_t>(ibit) + 4 > bitstream.size())
319 return false;
320 nibble = 0;
321 for (int i = 0; i < 4; ++i)
322 nibble |= static_cast<int>(bitstream[ibit++]) << i;
323 return true;
324 }
std::vector< bool > bitstream
Definition TriangleSelector.hpp:291

References bitstream.

Referenced by Slic3r::TriangleSelector::deserialize(), Slic3r::TriangleSelector::has_facets(), and update_used_states().

Here is the caller graph for this function:

◆ reset_used_states()

void Slic3r::TriangleSelector::TriangleSplittingData::reset_used_states ( )
inline
306 {
307 used_states.resize(static_cast<size_t>(EnforcerBlockerType::ExtruderMax) + 1, false);
308 std::fill(used_states.begin(), used_states.end(), false);
309 }
@ ExtruderMax
Definition TriangleSelector.hpp:66
std::vector< bool > used_states
Definition TriangleSelector.hpp:293

References Slic3r::ExtruderMax, and used_states.

◆ serialize()

template<class Archive>
void Slic3r::TriangleSelector::TriangleSplittingData::serialize ( Archive & ar)
inlineprivate
std::vector< TriangleBitStreamMapping > triangles_to_split
Definition TriangleSelector.hpp:289

References bitstream, triangles_to_split, and used_states.

Referenced by Slic3r::GUI::GLGizmoMmuSegmentation::update_used_filaments().

Here is the caller graph for this function:

◆ update_used_states()

bool Slic3r::TriangleSelector::TriangleSplittingData::update_used_states ( size_t bitstream_start_idx)
1954 {
1955 int ibit = static_cast<int>(bitstream_start_idx);
1956 uint64_t states = 0;
1957 do {
1958 // Walk one triangle's tree depth-first, counting the nodes still to be read; a split node adds its children.
1959 for (int pending_nodes = 1; pending_nodes > 0; --pending_nodes) {
1960 int code;
1961 if (!this->read_nibble(ibit, code))
1962 return false;
1963
1964 if (const int num_of_split_sides = code & 0b11; num_of_split_sides != 0) {
1965 if (!split_code_valid(code))
1966 return false;
1967 pending_nodes += num_of_split_sides + 1;
1968 continue;
1969 }
1970
1971 int facet_state = code >> 2;
1972 if (facet_state == 0b11) {
1973 // Leaf behind the "11" prefix: one nibble of (state-3), or 0b1111 + (state-18).
1974 int nibble;
1975 if (!this->read_nibble(ibit, nibble))
1976 return false;
1977 facet_state = nibble + 3;
1978 if (nibble == 0b1111) {
1979 if (!this->read_nibble(ibit, nibble))
1980 return false;
1981 facet_state = nibble + 18;
1982 }
1983 }
1984 states |= uint64_t(1) << facet_state;
1985 }
1986 } while (static_cast<size_t>(ibit) < this->bitstream.size());
1987
1988 // The leaf encoding tops out at state 33, so every state fits the 64-bit mask.
1989 for (size_t state_idx = 0; state_idx < std::min<size_t>(this->used_states.size(), 64); ++state_idx)
1990 if (states & (uint64_t(1) << state_idx))
1991 this->used_states[state_idx] = true;
1992 return true;
1993}
static bool split_code_valid(int code)
Definition TriangleSelector.cpp:1808
bool read_nibble(int &ibit, int &nibble) const
Definition TriangleSelector.hpp:317

References bitstream, read_nibble(), Slic3r::split_code_valid(), and used_states.

Here is the call graph for this function:

◆ cereal::access

friend class cereal::access
friend

References cereal::access.

Referenced by cereal::access.

◆ operator!=

bool operator!= ( const TriangleSplittingData & lhs,
const TriangleSplittingData & rhs )
friend
303{ return !(lhs == rhs); }

References TriangleSplittingData().

◆ operator==

bool operator== ( const TriangleSplittingData & lhs,
const TriangleSplittingData & rhs )
friend
297 {
298 return lhs.triangles_to_split == rhs.triangles_to_split
299 && lhs.bitstream == rhs.bitstream
300 && lhs.used_states == rhs.used_states;
301 }

References TriangleSplittingData(), bitstream, triangles_to_split, and used_states.

Member Data Documentation

◆ bitstream

◆ triangles_to_split

◆ used_states

std::vector<bool> Slic3r::TriangleSelector::TriangleSplittingData::used_states { std::vector<bool>(static_cast<size_t>(EnforcerBlockerType::ExtruderMax) + 1, false) }

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