@@ -31,29 +31,25 @@ draco::DracoAttribute *CreateDracoAttribute(const draco::PointAttribute *attr) {
3131
3232// Returns the attribute data in |attr| as an array of type T.
3333template <typename T>
34- T *CopyAttributeData (int num_points, const draco::PointAttribute *attr) {
34+ T *CopyAttributeData (int num_points, const draco::PointAttribute *attr, int component_stride ) {
3535 const int num_components = attr->num_components ();
36- T *const data = new T[num_points * num_components ];
36+ T *const data = new T[num_points * component_stride ];
3737
3838 for (draco::PointIndex i (0 ); i < num_points; ++i) {
3939 const draco::AttributeValueIndex val_index = attr->mapped_index (i);
4040 bool got_data = false ;
4141 switch (num_components) {
4242 case 1 :
43- got_data = attr->ConvertValue <T, 1 >(val_index,
44- data + i.value () * num_components);
43+ got_data = attr->ConvertValue <T, 1 >(val_index, data + i.value () * component_stride);
4544 break ;
4645 case 2 :
47- got_data = attr->ConvertValue <T, 2 >(val_index,
48- data + i.value () * num_components);
46+ got_data = attr->ConvertValue <T, 2 >(val_index, data + i.value () * component_stride);
4947 break ;
5048 case 3 :
51- got_data = attr->ConvertValue <T, 3 >(val_index,
52- data + i.value () * num_components);
49+ got_data = attr->ConvertValue <T, 3 >(val_index, data + i.value () * component_stride);
5350 break ;
5451 case 4 :
55- got_data = attr->ConvertValue <T, 4 >(val_index,
56- data + i.value () * num_components);
52+ got_data = attr->ConvertValue <T, 4 >(val_index, data + i.value () * component_stride);
5753 break ;
5854 default :
5955 break ;
@@ -69,14 +65,14 @@ T *CopyAttributeData(int num_points, const draco::PointAttribute *attr) {
6965
7066// Returns the attribute data in |attr| as an array of type T.
7167template <typename T>
72- T *CopyAttributeDataFlipped (int num_points, const draco::PointAttribute *attr) {
68+ T *CopyAttributeDataFlipped (int num_points, const draco::PointAttribute *attr, int component_stride ) {
7369 const int num_components = attr->num_components ();
74- T *const data = new T[num_points * num_components ];
70+ T *const data = new T[num_points * component_stride ];
7571
7672 for (draco::PointIndex i (0 ); i < num_points; ++i) {
7773 const draco::AttributeValueIndex val_index = attr->mapped_index (i);
7874 bool got_data = false ;
79- T* outPtr = data + i.value () * num_components ;
75+ T * outPtr = data + i.value () * component_stride ;
8076 switch (num_components) {
8177 case 1 :
8278 got_data = attr->ConvertValue <T, 1 >(val_index,outPtr);
@@ -110,22 +106,23 @@ T *CopyAttributeDataFlipped(int num_points, const draco::PointAttribute *attr) {
110106}
111107
112108// Returns the attribute data in |attr| as an array of void*.
113- void *ConvertAttributeData (int num_points, const draco::PointAttribute *attr, bool flip) {
109+ void *ConvertAttributeData (int num_points, const draco::PointAttribute *attr,
110+ bool flip, int component_stride) {
114111 switch (attr->data_type ()) {
115112 case draco::DataType::DT_INT8:
116- return static_cast <void *>(flip ? CopyAttributeDataFlipped<int8_t >(num_points, attr) : CopyAttributeData<int8_t >(num_points, attr));
113+ return static_cast <void *>(flip ? CopyAttributeDataFlipped<int8_t >(num_points, attr, component_stride ) : CopyAttributeData<int8_t >(num_points, attr, component_stride ));
117114 case draco::DataType::DT_UINT8:
118- return static_cast <void *>(flip ? CopyAttributeDataFlipped<uint8_t >(num_points, attr) : CopyAttributeData<uint8_t >(num_points, attr));
115+ return static_cast <void *>(flip ? CopyAttributeDataFlipped<uint8_t >(num_points, attr, component_stride ) : CopyAttributeData<uint8_t >(num_points, attr, component_stride ));
119116 case draco::DataType::DT_INT16:
120- return static_cast <void *>(flip ? CopyAttributeDataFlipped<int16_t >(num_points, attr) : CopyAttributeData<int16_t >(num_points, attr));
117+ return static_cast <void *>(flip ? CopyAttributeDataFlipped<int16_t >(num_points, attr, component_stride ) : CopyAttributeData<int16_t >(num_points, attr, component_stride ));
121118 case draco::DataType::DT_UINT16:
122- return static_cast <void *>(flip ? CopyAttributeDataFlipped<uint16_t >(num_points, attr) : CopyAttributeData<uint16_t >(num_points, attr));
119+ return static_cast <void *>(flip ? CopyAttributeDataFlipped<uint16_t >(num_points, attr, component_stride ) : CopyAttributeData<uint16_t >(num_points, attr, component_stride ));
123120 case draco::DataType::DT_INT32:
124- return static_cast <void *>(flip ? CopyAttributeDataFlipped<int32_t >(num_points, attr) : CopyAttributeData<int32_t >(num_points, attr));
121+ return static_cast <void *>(flip ? CopyAttributeDataFlipped<int32_t >(num_points, attr, component_stride ) : CopyAttributeData<int32_t >(num_points, attr, component_stride ));
125122 case draco::DataType::DT_UINT32:
126- return static_cast <void *>(flip ? CopyAttributeDataFlipped<uint32_t >(num_points, attr) : CopyAttributeData<uint32_t >(num_points, attr));
123+ return static_cast <void *>(flip ? CopyAttributeDataFlipped<uint32_t >(num_points, attr, component_stride ) : CopyAttributeData<uint32_t >(num_points, attr, component_stride ));
127124 case draco::DataType::DT_FLOAT32:
128- return static_cast <void *>(flip ? CopyAttributeDataFlipped<float >(num_points, attr) : CopyAttributeData<float >(num_points, attr));
125+ return static_cast <void *>(flip ? CopyAttributeDataFlipped<float >(num_points, attr, component_stride ) : CopyAttributeData<float >(num_points, attr, component_stride ));
129126 default :
130127 return nullptr ;
131128 }
@@ -294,7 +291,7 @@ int EXPORT_API DecodeDracoMeshStep1(
294291 } else if (geom_type == draco::POINT_CLOUD) {
295292 auto statusor = (*decoder)->DecodePointCloudFromBuffer (*buffer);
296293 if (!statusor.ok ()) {
297- return -4 ;
294+ return -5 ;
298295 }
299296
300297 std::unique_ptr<draco::PointCloud> in_cloud = std::move (statusor).value ();
@@ -390,15 +387,15 @@ bool EXPORT_API GetMeshIndices(const DracoMesh *mesh, DataType dataType, void* i
390387
391388bool EXPORT_API GetAttributeData (const DracoMesh *mesh,
392389 const DracoAttribute *attribute,
393- DracoData **data, bool flip) {
390+ DracoData **data, bool flip, int stride ) {
394391 if (mesh == nullptr || data == nullptr || *data != nullptr ) {
395392 return false ;
396393 }
397394 const Mesh *const m = static_cast <const Mesh *>(mesh->private_mesh );
398395 const PointAttribute *const attr =
399396 static_cast <const PointAttribute *>(attribute->private_attribute );
400397
401- void *temp_data = ConvertAttributeData (m->num_points (), attr, flip);
398+ void *temp_data = ConvertAttributeData (m->num_points (), attr, flip, stride );
402399 if (temp_data == nullptr ) {
403400 return false ;
404401 }
0 commit comments