point_count_t BpfReader::readByteMajor(PointBuffer& data, point_count_t count) { PointId idx(0); PointId startId = data.size(); point_count_t numRead = 0; // We need a temp buffer for the point data. union uu { float f; uint32_t u32; }; std::unique_ptr<union uu> uArr( new uu[std::min(count, numPoints() - m_index)]); for (size_t d = 0; d < m_dims.size(); ++d) { for (size_t b = 0; b < sizeof(float); ++b) { idx = m_index; numRead = 0; PointId nextId = startId; seekByteMajor(d, b, idx); for (;numRead < count && idx < numPoints(); idx++, numRead++, nextId++) { union uu& u = *(uArr.get() + numRead); if (b == 0) u.u32 = 0; uint8_t u8; m_stream >> u8; u.u32 |= ((uint32_t)u8 << (b * CHAR_BIT)); if (b == 3) { u.f += m_dims[d].m_offset; data.setField(m_dims[d].m_id, nextId, u.f); } } } } 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; }
void BpfReader::readByteMajor(PointRef& point) { // We need a temp buffer for the point data union uu { float f; uint32_t u32; } u; double x(0), y(0), z(0); uint8_t u8; for (size_t dim = 0; dim < m_dims.size(); ++dim) { u.u32 = 0; for (size_t b = 0; b < sizeof(float); ++b) { seekByteMajor(dim, b, m_index); m_stream >> u8; u.u32 |= ((uint32_t)u8 << (b * CHAR_BIT)); } double d = u.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); } 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++; }