Skip to content

Commit cbd4b24

Browse files
committed
support point clouds
1 parent 103831b commit cbd4b24

File tree

6 files changed

+178
-143
lines changed

6 files changed

+178
-143
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ endif()
2121
list(APPEND draco_c_sources
2222
"${CMAKE_CURRENT_SOURCE_DIR}/src/decoder.cc"
2323
"${CMAKE_CURRENT_SOURCE_DIR}/src/mesh.cc"
24+
"${CMAKE_CURRENT_SOURCE_DIR}/src/point_cloud.cc"
2425
"${CMAKE_CURRENT_SOURCE_DIR}/src/point_attribute.cc"
2526
)
2627

include/c_api.h

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -101,48 +101,56 @@ EXPORT_API int64_t dracoPointAttrByteOffset(const draco_point_attr* pa);
101101

102102
EXPORT_API uint32_t dracoPointAttrUniqueId(const draco_point_attr* pa);
103103

104+
// draco::PointCloud
105+
106+
typedef struct draco_point_cloud draco_point_cloud;
107+
108+
EXPORT_API draco_point_cloud* dracoNewPointCloud();
109+
110+
EXPORT_API void dracoPointCloudRelease(draco_point_cloud *pc);
111+
112+
EXPORT_API uint32_t dracoPointCloudNumPoints(const draco_point_cloud *pc);
113+
114+
EXPORT_API int32_t dracoPointCloudNumAttrs(const draco_point_cloud *pc);
115+
116+
EXPORT_API const draco_point_attr* dracoPointCloudGetAttribute(const draco_point_cloud *pc, int32_t att_id);
117+
118+
EXPORT_API int32_t dracoPointCloudGetNamedAttributeId(const draco_point_cloud *pc, draco_geometry_type geo_type);
119+
120+
EXPORT_API const draco_point_attr* dracoPointCloudGetAttributeByUniqueId(const draco_point_cloud *pc, uint32_t unique_id);
121+
122+
EXPORT_API bool dracoPointCloudGetAttributeData(const draco_point_cloud *pc,
123+
const draco_point_attr *pa,
124+
draco_data_type data_type,
125+
const size_t out_size,
126+
void *out_values);
127+
104128
// draco::Mesh
105129

106-
typedef struct draco_mesh draco_mesh;
130+
typedef struct draco_point_cloud draco_mesh;
107131

108132
EXPORT_API draco_mesh* dracoNewMesh();
109133

110134
EXPORT_API void dracoMeshRelease(draco_mesh *mesh);
111135

112136
EXPORT_API uint32_t dracoMeshNumFaces(const draco_mesh *mesh);
113137

114-
EXPORT_API uint32_t dracoMeshNumPoints(const draco_mesh *mesh);
115-
116-
EXPORT_API int32_t dracoMeshNumAttrs(const draco_mesh *mesh);
117-
118138
// Queries an array of 3*face_count elements containing the triangle indices.
119139
// out_values must be allocated to contain at least 3*face_count uint16_t elements.
120140
// out_size must be exactly 3*face_count*sizeof(uint16_t), else out_values
121-
// won´t be filled and returns false.
141+
// won't be filled and returns false.
122142
EXPORT_API bool dracoMeshGetTrianglesUint16(const draco_mesh *mesh,
123143
const size_t out_size,
124144
uint16_t *out_values);
125145

126146
// Queries an array of 3*face_count elements containing the triangle indices.
127147
// out_values must be allocated to contain at least 3*face_count uint32_t elements.
128148
// out_size must be exactly 3*face_count*sizeof(uint32_t), else out_values
129-
// won´t be filled and returns false.
149+
// won't be filled and returns false.
130150
EXPORT_API bool dracoMeshGetTrianglesUint32(const draco_mesh *mesh,
131151
const size_t out_size,
132152
uint32_t *out_values);
133153

134-
EXPORT_API const draco_point_attr* dracoMeshGetAttribute(const draco_mesh *mesh, int32_t att_id);
135-
136-
EXPORT_API int32_t dracoMeshGetNamedAttributeId(const draco_mesh *mesh, draco_geometry_type geo_type);
137-
138-
EXPORT_API const draco_point_attr* dracoMeshGetAttributeByUniqueId(const draco_mesh *mesh, uint32_t unique_id);
139-
140-
EXPORT_API bool dracoMeshGetAttributeData(const draco_mesh *mesh,
141-
const draco_point_attr *pa,
142-
draco_data_type data_type,
143-
const size_t out_size,
144-
void *out_values);
145-
146154
// draco::Decoder
147155

148156
typedef struct draco_decoder draco_decoder;
@@ -151,10 +159,16 @@ EXPORT_API draco_decoder* dracoNewDecoder();
151159

152160
EXPORT_API void dracoDecoderRelease(draco_decoder *decoder);
153161

154-
EXPORT_API draco_status* dracoDecoderArrayToMesh(draco_decoder *decoder,
155-
const char *data,
156-
size_t data_size,
157-
draco_mesh *out_mesh);
162+
EXPORT_API draco_status* dracoDecoderDecodeMesh(draco_decoder *decoder,
163+
const char *data,
164+
size_t data_size,
165+
draco_mesh *out_mesh);
166+
167+
168+
EXPORT_API draco_status* dracoDecoderDecodePointCloud(draco_decoder *decoder,
169+
const char *data,
170+
size_t data_size,
171+
draco_point_cloud *out_pc);
158172

159173
#ifdef __cplusplus
160174
}

src/c_api_test.cc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ draco_mesh *DecodeToDracoMesh(const std::string &file_name) {
3535

3636
auto mesh = dracoNewMesh();
3737
auto decoder = dracoNewDecoder();
38-
dracoDecoderArrayToMesh(decoder, data.data(), data.size(), mesh);
38+
dracoDecoderDecodeMesh(decoder, data.data(), data.size(), mesh);
3939
dracoDecoderRelease(decoder);
4040
return mesh;
4141
}
@@ -45,24 +45,24 @@ TEST(DracoCAPITest, TestDecode) {
4545
ASSERT_NE(mesh, nullptr);
4646
auto num_faces = dracoMeshNumFaces(mesh);
4747
ASSERT_EQ(num_faces, 170);
48-
ASSERT_EQ(dracoMeshNumPoints(mesh), 99);
49-
auto num_attrs = dracoMeshNumAttrs(mesh);
48+
ASSERT_EQ(dracoPointCloudNumPoints(mesh), 99);
49+
auto num_attrs = dracoPointCloudNumAttrs(mesh);
5050
ASSERT_EQ(num_attrs, 2);
5151

5252
auto indices_size = 3 * num_faces * sizeof(uint32_t);
5353
uint32_t *indices = (uint32_t *)malloc(indices_size);
5454
ASSERT_TRUE(dracoMeshGetTrianglesUint32(mesh, indices_size, indices));
5555
free(indices);
5656

57-
auto pa1 = dracoMeshGetAttribute(mesh, 0);
57+
auto pa1 = dracoPointCloudGetAttribute(mesh, 0);
5858
ASSERT_EQ(dracoPointAttrType(pa1), GT_POSITION);
5959
ASSERT_EQ(dracoPointAttrDataType(pa1), DT_FLOAT32);
6060
ASSERT_EQ(dracoPointAttrNumComponents(pa1), 3);
6161
ASSERT_FALSE(dracoPointAttrNormalized(pa1));
6262
ASSERT_EQ(dracoPointAttrByteStride(pa1), 12);
6363
ASSERT_EQ(dracoPointAttrUniqueId(pa1), 0);
6464

65-
auto pa2 = dracoMeshGetAttribute(mesh, 1);
65+
auto pa2 = dracoPointCloudGetAttribute(mesh, 1);
6666
ASSERT_EQ(dracoPointAttrType(pa2), GT_NORMAL);
6767
ASSERT_EQ(dracoPointAttrDataType(pa2), DT_FLOAT32);
6868
ASSERT_EQ(dracoPointAttrNumComponents(pa2), 3);
@@ -72,9 +72,9 @@ TEST(DracoCAPITest, TestDecode) {
7272

7373
auto arr_size = 3*99*sizeof(float);
7474
auto arr = (float *)malloc(arr_size);
75-
ASSERT_TRUE(dracoMeshGetAttributeData(mesh, pa2, DT_FLOAT32, arr_size, arr));
76-
ASSERT_FALSE(dracoMeshGetAttributeData(mesh, pa2, DT_FLOAT32, arr_size+1, arr));
77-
ASSERT_FALSE(dracoMeshGetAttributeData(mesh, pa2, DT_FLOAT32, arr_size-1, arr));
75+
ASSERT_TRUE(dracoPointCloudGetAttributeData(mesh, pa2, DT_FLOAT32, arr_size, arr));
76+
ASSERT_FALSE(dracoPointCloudGetAttributeData(mesh, pa2, DT_FLOAT32, arr_size+1, arr));
77+
ASSERT_FALSE(dracoPointCloudGetAttributeData(mesh, pa2, DT_FLOAT32, arr_size-1, arr));
7878

7979
dracoMeshRelease(mesh);
8080
}

src/decoder.cc

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,24 @@ void dracoDecoderRelease(draco_decoder *decoder) {
4040
free(decoder);
4141
}
4242

43-
draco_status* dracoDecoderArrayToMesh(draco_decoder *decoder,
44-
const char *data,
45-
size_t data_size,
46-
draco_mesh *out_mesh) {
43+
draco_status* dracoDecoderDecodeMesh(draco_decoder *decoder,
44+
const char *data,
45+
size_t data_size,
46+
draco_mesh *out_mesh) {
4747
draco::DecoderBuffer buffer;
4848
buffer.Init(data, data_size);
4949
auto m = reinterpret_cast<draco::Mesh*>(out_mesh);
5050
const auto &last_status_ = reinterpret_cast<draco::Decoder*>(decoder)->DecodeBufferToGeometry(&buffer, m);
5151
return reinterpret_cast<draco_status*>(new draco::Status(last_status_));
5252
}
53+
54+
draco_status* dracoDecoderDecodePointCloud(draco_decoder *decoder,
55+
const char *data,
56+
size_t data_size,
57+
draco_point_cloud *out_pc) {
58+
draco::DecoderBuffer buffer;
59+
buffer.Init(data, data_size);
60+
auto m = reinterpret_cast<draco::PointCloud*>(out_pc);
61+
const auto &last_status_ = reinterpret_cast<draco::Decoder*>(decoder)->DecodeBufferToGeometry(&buffer, m);
62+
return reinterpret_cast<draco_status*>(new draco::Status(last_status_));
63+
}

src/mesh.cc

Lines changed: 0 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,6 @@ uint32_t dracoMeshNumFaces(const draco_mesh *mesh) {
1313
return reinterpret_cast<const draco::Mesh*>(mesh)->num_faces();
1414
}
1515

16-
17-
uint32_t dracoMeshNumPoints(const draco_mesh *mesh) {
18-
return reinterpret_cast<const draco::Mesh*>(mesh)->num_points();
19-
}
20-
21-
int32_t dracoMeshNumAttrs(const draco_mesh *mesh) {
22-
return reinterpret_cast<const draco::Mesh*>(mesh)->num_attributes();
23-
}
24-
2516
template <typename T>
2617
bool GetTrianglesArray(const draco::Mesh *m, const size_t out_size,
2718
T *out_values) {
@@ -58,102 +49,3 @@ bool dracoMeshGetTrianglesUint32(const draco_mesh *mesh, const size_t out_size,
5849

5950
return GetTrianglesArray(m, out_size, out_values);
6051
}
61-
62-
const draco_point_attr* dracoMeshGetAttribute(const draco_mesh *mesh, int32_t att_id) {
63-
auto m = reinterpret_cast<const draco::Mesh*>(mesh);
64-
if (att_id < 0 || att_id > m->num_attributes()) {
65-
return nullptr;
66-
}
67-
auto attr = m->attribute(att_id);
68-
return reinterpret_cast<const draco_point_attr*>(attr);
69-
}
70-
71-
const draco_point_attr* dracoMeshGetAttributeByUniqueId(const draco_mesh *mesh, uint32_t unique_id) {
72-
auto m = reinterpret_cast<const draco::Mesh*>(mesh);
73-
auto attr = m->GetAttributeByUniqueId(unique_id);
74-
return reinterpret_cast<const draco_point_attr*>(attr);
75-
}
76-
77-
78-
int32_t dracoMeshGetNamedAttributeId(const draco_mesh *mesh, draco_geometry_type geo_type) {
79-
auto type = static_cast<draco::GeometryAttribute::Type>(geo_type);
80-
return reinterpret_cast<const draco::Mesh*>(mesh)->GetNamedAttributeId(type);
81-
}
82-
83-
template <class T>
84-
static bool GetAttributeDataArrayForAllPoints(const draco::PointCloud *pc,
85-
const draco::PointAttribute *pa,
86-
draco::DataType type,
87-
size_t out_size,
88-
void *out_values) {
89-
const int components = pa->num_components();
90-
const int num_points = pc->num_points();
91-
const int data_size = num_points * components * sizeof(T);
92-
if (data_size != out_size) {
93-
return false;
94-
}
95-
const bool requested_type_matches = pa->data_type() == type;
96-
if (requested_type_matches && pa->is_mapping_identity()) {
97-
// Copy values directly to the output vector.
98-
const auto ptr = pa->GetAddress(draco::AttributeValueIndex(0));
99-
::memcpy(out_values, ptr, data_size);
100-
return true;
101-
}
102-
103-
// Copy values one by one.
104-
std::vector<T> values(components);
105-
int entry_id = 0;
106-
107-
T *const typed_output = reinterpret_cast<T *>(out_values);
108-
for (draco::PointIndex i(0); i < num_points; ++i) {
109-
const draco::AttributeValueIndex val_index = pa->mapped_index(i);
110-
if (requested_type_matches) {
111-
pa->GetValue(val_index, values.data());
112-
} else {
113-
if (!pa->ConvertValue<T>(val_index, values.data())) {
114-
return false;
115-
}
116-
}
117-
for (int j = 0; j < components; ++j) {
118-
typed_output[entry_id++] = values[j];
119-
}
120-
}
121-
return true;
122-
}
123-
124-
bool dracoMeshGetAttributeData(const draco_mesh *pc,
125-
const draco_point_attr *pa,
126-
draco_data_type data_type,
127-
const size_t out_size,
128-
void *out_values) {
129-
auto pcc = reinterpret_cast<const draco::Mesh*>(pc);
130-
auto pac = reinterpret_cast<const draco::PointAttribute*>(pa);
131-
switch (data_type) {
132-
case DT_INT8:
133-
return GetAttributeDataArrayForAllPoints<int8_t>(pcc, pac, draco::DT_INT8,
134-
out_size, out_values);
135-
case DT_INT16:
136-
return GetAttributeDataArrayForAllPoints<int16_t>(pcc, pac, draco::DT_INT16,
137-
out_size, out_values);
138-
case DT_INT32:
139-
return GetAttributeDataArrayForAllPoints<int32_t>(pcc, pac, draco::DT_INT32,
140-
out_size, out_values);
141-
case DT_UINT8:
142-
return GetAttributeDataArrayForAllPoints<uint8_t>(pcc, pac, draco::DT_UINT8,
143-
out_size, out_values);
144-
case DT_UINT16:
145-
return GetAttributeDataArrayForAllPoints<uint16_t>(pcc, pac, draco::DT_UINT16,
146-
out_size, out_values);
147-
case DT_UINT32:
148-
return GetAttributeDataArrayForAllPoints<uint32_t>(pcc, pac, draco::DT_UINT32,
149-
out_size, out_values);
150-
case DT_FLOAT32:
151-
return GetAttributeDataArrayForAllPoints<float>(pcc, pac, draco::DT_FLOAT32,
152-
out_size, out_values);
153-
case DT_FLOAT64:
154-
return GetAttributeDataArrayForAllPoints<double>(pcc, pac, draco::DT_FLOAT64,
155-
out_size, out_values);
156-
default:
157-
return false;
158-
}
159-
}

0 commit comments

Comments
 (0)