11 #include <laszip/laszip_api.h>
14 std::vector<LasExtraScalarField>&& extraFields)
15 : m_standardFields(standardFields)
16 , m_extraFields(extraFields)
24 Q_ASSERT_X(field.sf !=
nullptr, __func__,
"LasScalarField has a null ptr to ccScalarField");
25 ScalarType value = field.sf->getValue(pointIndex);
26 value =
std::max(field.range.min, value);
27 value =
std::min(field.range.max, value);
33 point.intensity =
static_cast<laszip_U16
>(value);
39 point.return_number =
static_cast<laszip_U8
>(value);
45 point.number_of_returns =
static_cast<laszip_U8
>(value);
51 point.scan_direction_flag = (
static_cast<laszip_U8
>(value) > 0);
57 point.edge_of_flight_line = (
static_cast<laszip_U8
>(value) > 0);
63 point.classification =
static_cast<laszip_U8
>(value);
68 point.synthetic_flag = (
static_cast<laszip_U8
>(value) > 0);
74 point.keypoint_flag = (
static_cast<laszip_U8
>(value) > 0);
80 point.withheld_flag = (
static_cast<laszip_U8
>(value) > 0);
86 point.scan_angle_rank =
static_cast<laszip_I8
>(value);
91 point.user_data =
static_cast<laszip_U8
>(value);
97 point.point_source_ID =
static_cast<laszip_U16
>(value);
103 point.gps_time =
static_cast<laszip_F64
>(value) + field.sf->getGlobalShift();
115 point.extended_scanner_channel =
static_cast<laszip_U8
>(value);
127 point.extended_classification =
static_cast<laszip_U8
>(value);
133 point.extended_return_number =
static_cast<laszip_U16
>(value);
139 point.extended_number_of_returns =
static_cast<laszip_U16
>(value);
145 point.rgb[3] =
static_cast<laszip_U16
>(value);
154 if (
point.num_extra_bytes == 0 ||
point.extra_bytes ==
nullptr)
163 laszip_U8* dataStart =
point.extra_bytes + extraField.byteOffset;
165 assert(extraField.byteOffset <
static_cast<unsigned>(
point.num_extra_bytes));
166 assert(extraField.byteOffset + extraField.byteSize() <=
static_cast<unsigned>(
point.num_extra_bytes));
168 for (
size_t elemIndex{0}; elemIndex < extraField.numElements(); ++elemIndex)
170 values[elemIndex] = (*extraField.scalarFields[elemIndex])[pointIndex];
173 if (extraField.scaleIsRelevant() || extraField.offsetIsRelevant())
175 assert(extraField.numElements() <= 3);
176 for (
size_t elemIndex{0}; elemIndex < extraField.numElements(); ++elemIndex)
178 values[elemIndex] = (values[elemIndex] - extraField.offsets[elemIndex]) / extraField.scales[elemIndex];
182 for (
unsigned i = 0; i < extraField.numElements(); i++)
184 switch (extraField.type)
187 WriteScalarValueAs<uint8_t>(values[i], dataStart);
190 WriteScalarValueAs<uint16_t>(values[i], dataStart);
193 WriteScalarValueAs<uint32_t>(values[i], dataStart);
196 WriteScalarValueAs<uint64_t>(values[i], dataStart);
199 WriteScalarValueAs<int8_t>(values[i], dataStart);
202 WriteScalarValueAs<int16_t>(values[i], dataStart);
205 WriteScalarValueAs<int32_t>(values[i], dataStart);
208 WriteScalarValueAs<int64_t>(values[i], dataStart);
211 WriteScalarValueAs<float>(values[i], dataStart);
214 WriteScalarValueAs<double>(values[i], dataStart);
220 dataStart += extraField.elementSize();
constexpr double SCAN_ANGLE_SCALE
void handleExtraFields(size_t pointIndex, laszip_point &point)
Saves the extra scalar fields values for pointIndex into the given laszip_point.
LasScalarFieldSaver()=default
void handleScalarFields(size_t pointIndex, laszip_point &point)
Saves the scalar fields values for pointIndex into the given laszip_point.
constexpr unsigned OVERLAP_FLAG_BIT_MASK
@ ExtendedNumberOfReturns