// This isn't lovely as we have to seek for each dimension access. void BpfReader::readDimMajor(PointRef& point) { double x(0), y(0), z(0); for (size_t dim = 0; dim < m_dims.size(); ++dim) { seekDimMajor(dim, m_index); float f; m_stream >> f; double d = f + m_dims[dim].m_offset; if (m_dims[dim].m_id == Dimension::Id::X) x = d; else if (m_dims[dim].m_id == Dimension::Id::Y) y = d; else if (m_dims[dim].m_id == Dimension::Id::Z) z = d; else point.setField(m_dims[dim].m_id, d); } // Transformation only applies to X, Y and Z m_header.m_xform.apply(x, y, z); point.setField(Dimension::Id::X, x); point.setField(Dimension::Id::Y, y); point.setField(Dimension::Id::Z, z); m_index++; }
point_count_t BpfReader::readDimMajor(PointBuffer& data, point_count_t count) { PointId idx(0); PointId startId = data.size(); point_count_t numRead = 0; for (size_t d = 0; d < m_dims.size(); ++d) { idx = m_index; PointId nextId = startId; numRead = 0; seekDimMajor(d, idx); for (; numRead < count && idx < numPoints(); idx++, numRead++, nextId++) { float f; m_stream >> f; data.setField(m_dims[d].m_id, nextId, f + m_dims[d].m_offset); } } m_index = idx; // Transformation only applies to X, Y and Z for (PointId idx = startId; idx < data.size(); idx++) { double x = data.getFieldAs<double>(Dimension::Id::X, idx); double y = data.getFieldAs<double>(Dimension::Id::Y, idx); double z = data.getFieldAs<double>(Dimension::Id::Z, idx); m_header.m_xform.apply(x, y, z); data.setField(Dimension::Id::X, idx, x); data.setField(Dimension::Id::Y, idx, y); data.setField(Dimension::Id::Z, idx, z); } return numRead; }