MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ read_dense_vector()

bool MayaFlux::IO::Detail::VDBArchive::read_dense_vector ( size_t  index,
const glm::ivec3 &  region_min,
const glm::uvec3 &  resolution,
const glm::vec3 &  background,
std::vector< glm::vec3 > &  out,
bool *  precision_lost = nullptr 
) const

Materialize a vector grid's cells over an explicit region.

As read_dense_scalar, for a grid whose leaf value type is vec3f, vec3d or vec3i. Non-vec3f types are converted component-wise via MayaFlux::try_convert; precision_lost is set if any of the three components of any element lost precision.

Returns
False if index is out of range, the grid is scalar-typed, or resolution has a zero axis. Call last_error() for detail.

Definition at line 783 of file VDBArchive.cpp.

790{
791 if (!m_state->read_file_open || index >= m_state->read_file.num_grids) {
792 m_last_error = "read_dense_vector: grid index out of range";
793 return false;
794 }
795 if (resolution.x == 0 || resolution.y == 0 || resolution.z == 0) {
796 m_last_error = "read_dense_vector: zero resolution";
797 return false;
798 }
799
800 const tvdb_grid_t& grid = m_state->read_file.grids[index];
801 const tvdb_value_type_t vt = leaf_value_type(grid);
802
803 if (!is_vector_type(vt)) {
804 const char* name = tvdb_grid_name(&m_state->read_file, index);
805 m_last_error = "read_dense_vector: grid '" + std::string(name ? name : "") + "' is scalar-typed";
806 return false;
807 }
808 const size_t elem_size = tvdb_value_type_size(vt);
809 if (elem_size == 0) {
810 m_last_error = "read_dense_vector: grid has an unsupported leaf value type";
811 return false;
812 }
813
814 if (precision_lost) {
815 *precision_lost = false;
816 }
817
818 out.assign(static_cast<size_t>(resolution.x) * resolution.y * resolution.z, background);
819
820 DenseVectorCtx ctx {};
821 ctx.region_min = region_min;
822 ctx.region_max = region_min + glm::ivec3(resolution);
823 ctx.vt = vt;
824 ctx.elem_size = elem_size;
825 ctx.precision_lost = precision_lost;
826 ctx.out = &out;
827
828 tvdb_grid_visit_leaves(&grid, dense_vector_visit, &ctx);
829 return true;
830}
std::vector< float > * out
bool * precision_lost
glm::ivec3 region_min
tvdb_value_type_t vt
size_t elem_size
std::string name
Definition VKDevice.cpp:143
uint32_t index
Definition VKDevice.cpp:142
std::string m_last_error
Set from the const read-path accessors too.
std::unique_ptr< State > m_state

References elem_size, index, m_last_error, m_state, name, out, precision_lost, region_min, and vt.