Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit ab0bb2f

Browse files
committed
Improve scalar conversion mechanism
1 parent c34e192 commit ab0bb2f

File tree

1 file changed

+21
-12
lines changed

1 file changed

+21
-12
lines changed

impeller/scene/importer/vertices_builder.cc

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <cstring>
88
#include <limits>
9+
#include <type_traits>
910

1011
#include "impeller/scene/importer/conversions.h"
1112
#include "impeller/scene/importer/scene_flatbuffers.h"
@@ -48,13 +49,20 @@ void VerticesBuilder::WriteFBVertices(std::vector<fb::Vertex>& vertices) const {
4849
}
4950
}
5051

51-
template <typename SourceType, size_t Divisor>
52-
void WriteComponentsAsScalars(void* destination,
53-
const void* source,
54-
size_t component_count) {
52+
/// @brief Reads a contiguous sequence of numeric components from `source` and
53+
/// writes them to `destination` buffer as 32bit floats. Signed
54+
/// SourceTypes convert to a range of -1 to 1, and unsigned SourceTypes
55+
/// convert to a range of 0 to 1.
56+
template <typename SourceType>
57+
static void WriteComponentsAsScalars(void* destination,
58+
const void* source,
59+
size_t component_count) {
60+
constexpr size_t divisor = std::is_integral_v<SourceType>
61+
? std::numeric_limits<SourceType>::max()
62+
: 1;
5563
for (size_t i = 0; i < component_count; i++) {
5664
const SourceType* s = reinterpret_cast<const SourceType*>(source) + i;
57-
Scalar v = static_cast<Scalar>(*s) / static_cast<Scalar>(Divisor);
65+
Scalar v = static_cast<Scalar>(*s) / static_cast<Scalar>(divisor);
5866
Scalar* dest = reinterpret_cast<Scalar*>(destination) + i;
5967
*dest = v;
6068
}
@@ -66,18 +74,19 @@ static std::map<
6674
void(void* destination, const void* source, size_t component_count)>>
6775
kAttributeWriters = {
6876
{VerticesBuilder::ComponentType::kSignedByte,
69-
WriteComponentsAsScalars<int8_t, std::numeric_limits<int8_t>::max()>},
77+
WriteComponentsAsScalars<int8_t>},
7078
{VerticesBuilder::ComponentType::kUnsignedByte,
71-
WriteComponentsAsScalars<uint8_t, std::numeric_limits<uint8_t>::max()>},
79+
WriteComponentsAsScalars<uint8_t>},
7280
{VerticesBuilder::ComponentType::kSignedShort,
73-
WriteComponentsAsScalars<int16_t, std::numeric_limits<int16_t>::max()>},
81+
WriteComponentsAsScalars<int16_t>},
7482
{VerticesBuilder::ComponentType::kUnsignedShort,
75-
WriteComponentsAsScalars<uint16_t, std::numeric_limits<uint16_t>::max()>},
83+
WriteComponentsAsScalars<uint16_t>},
7684
{VerticesBuilder::ComponentType::kSignedInt,
77-
WriteComponentsAsScalars<int32_t, std::numeric_limits<int32_t>::max()>},
85+
WriteComponentsAsScalars<int32_t>},
7886
{VerticesBuilder::ComponentType::kUnsignedInt,
79-
WriteComponentsAsScalars<uint32_t, std::numeric_limits<uint32_t>::max()>},
80-
{VerticesBuilder::ComponentType::kFloat, WriteComponentsAsScalars<float, 1>},
87+
WriteComponentsAsScalars<uint32_t>},
88+
{VerticesBuilder::ComponentType::kFloat,
89+
WriteComponentsAsScalars<float>},
8190
};
8291

8392
void VerticesBuilder::SetAttributeFromBuffer(Attribute attribute,

0 commit comments

Comments
 (0)