Skip to content

Commit 20640a7

Browse files
authored
Merge pull request #6 from camnewnham/color-pad
add support for overriding component count (padding color attributes)
2 parents 9f7cc97 + f58e9d7 commit 20640a7

File tree

2 files changed

+22
-25
lines changed

2 files changed

+22
-25
lines changed

src/draco/unity/draco_unity_plugin.cc

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
3333
template <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.
7167
template <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

391388
bool 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
}

src/draco/unity/draco_unity_plugin.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ bool EXPORT_API GetMeshIndices(const DracoMesh *mesh, DataType dataType, void* i
113113
// with ReleaseDracoData.
114114
bool EXPORT_API GetAttributeData(const DracoMesh *mesh,
115115
const DracoAttribute *attribute,
116-
DracoData **data, bool flip);
116+
DracoData **data, bool flip, int component_stride);
117117

118118
// DracoToUnityMesh is deprecated.
119119
struct EXPORT_API DracoToUnityMesh {

0 commit comments

Comments
 (0)