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 from 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
8392void VerticesBuilder::SetAttributeFromBuffer (Attribute attribute,
0 commit comments