Skip to content

Commit 9f7cc97

Browse files
authored
Merge pull request #5 from camnewnham/feature/encode-point-clouds
support point cloud encoding
2 parents d8f24e3 + 4c1f5e7 commit 9f7cc97

File tree

2 files changed

+119
-35
lines changed

2 files changed

+119
-35
lines changed

src/draco/unity/draco_unity_enc_plugin.cc

Lines changed: 92 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,19 @@
2121

2222
namespace draco {
2323

24-
DracoEncoder * dracoEncoderCreate(uint32_t vertexCount)
24+
DracoEncoder *dracoEncoderCreate(uint32_t vertexCount)
2525
{
26-
DracoEncoder *encoder = new DracoEncoder;
27-
encoder->mesh.set_num_points(vertexCount);
28-
return encoder;
26+
DracoMeshEncoder *encoder = new DracoMeshEncoder;
27+
encoder->is_point_cloud = false;
28+
encoder->mesh.set_num_points(vertexCount);
29+
return encoder;
30+
}
31+
32+
DracoEncoder *dracoEncoderCreatePointCloud(uint32_t vertexCount) {
33+
DracoPointsEncoder *encoder = new DracoPointsEncoder;
34+
encoder->is_point_cloud = true;
35+
encoder->mesh.set_num_points(vertexCount);
36+
return encoder;
2937
}
3038

3139
void dracoEncoderRelease(DracoEncoder *encoder)
@@ -47,31 +55,64 @@ namespace draco {
4755
encoder->quantization.generic = generic;
4856
}
4957

50-
bool dracoEncoderEncode(DracoEncoder *encoder, uint8_t preserveTriangleOrder)
58+
bool dracoEncoderEncode(DracoEncoder *encoder, uint8_t sequentialEncode)
5159
{
52-
draco::Encoder dracoEncoder;
53-
dracoEncoder.SetSpeedOptions(encoder->encodingSpeed, encoder->decodingSpeed);
54-
dracoEncoder.SetAttributeQuantization(draco::GeometryAttribute::POSITION, encoder->quantization.position);
55-
dracoEncoder.SetAttributeQuantization(draco::GeometryAttribute::NORMAL, encoder->quantization.normal);
56-
dracoEncoder.SetAttributeQuantization(draco::GeometryAttribute::TEX_COORD, encoder->quantization.uv);
57-
dracoEncoder.SetAttributeQuantization(draco::GeometryAttribute::COLOR, encoder->quantization.color);
58-
dracoEncoder.SetAttributeQuantization(draco::GeometryAttribute::GENERIC, encoder->quantization.generic);
59-
dracoEncoder.SetTrackEncodedProperties(true);
60-
61-
if (preserveTriangleOrder) {
62-
dracoEncoder.SetEncodingMethod(draco::MESH_SEQUENTIAL_ENCODING);
60+
if (encoder->is_point_cloud) {
61+
return dracoEncode((DracoPointsEncoder *)encoder, sequentialEncode);
62+
} else {
63+
return dracoEncode((DracoMeshEncoder *)encoder, sequentialEncode);
64+
}
65+
}
66+
67+
template<class T>
68+
bool dracoEncode(T *encoderT, uint8_t sequentialEncode) {
69+
auto encoder = (DracoEncoder *)encoderT;
70+
draco::Encoder dracoEncoder;
71+
dracoEncoder.SetSpeedOptions(encoder->encodingSpeed,
72+
encoder->decodingSpeed);
73+
dracoEncoder.SetAttributeQuantization(draco::GeometryAttribute::POSITION,
74+
encoder->quantization.position);
75+
dracoEncoder.SetAttributeQuantization(draco::GeometryAttribute::NORMAL,
76+
encoder->quantization.normal);
77+
dracoEncoder.SetAttributeQuantization(draco::GeometryAttribute::TEX_COORD,
78+
encoder->quantization.uv);
79+
dracoEncoder.SetAttributeQuantization(draco::GeometryAttribute::COLOR,
80+
encoder->quantization.color);
81+
dracoEncoder.SetAttributeQuantization(draco::GeometryAttribute::GENERIC,
82+
encoder->quantization.generic);
83+
dracoEncoder.SetTrackEncodedProperties(true);
84+
85+
draco::Status encodeStatus;
86+
87+
if (encoder->is_point_cloud) {
88+
if (sequentialEncode) {
89+
dracoEncoder.SetEncodingMethod(draco::POINT_CLOUD_SEQUENTIAL_ENCODING);
6390
} else {
64-
dracoEncoder.SetEncodingMethod(draco::MESH_EDGEBREAKER_ENCODING);
91+
dracoEncoder.SetEncodingMethod(draco::POINT_CLOUD_KD_TREE_ENCODING);
6592
}
66-
67-
auto encoderStatus = dracoEncoder.EncodeMeshToBuffer(encoder->mesh, &encoder->encoderBuffer);
68-
if (encoderStatus.ok()) {
69-
encoder->encodedVertices = static_cast<uint32_t>(dracoEncoder.num_encoded_points());
70-
encoder->encodedIndices = static_cast<uint32_t>(dracoEncoder.num_encoded_faces() * 3);
71-
return true;
93+
94+
encodeStatus = dracoEncoder.EncodePointCloudToBuffer(
95+
((DracoPointsEncoder *)encoder)->mesh, &encoder->encoderBuffer);
96+
} else {
97+
if (sequentialEncode) {
98+
dracoEncoder.SetEncodingMethod(draco::MESH_SEQUENTIAL_ENCODING);
7299
} else {
73-
return false;
100+
dracoEncoder.SetEncodingMethod(draco::MESH_EDGEBREAKER_ENCODING);
74101
}
102+
103+
encodeStatus = dracoEncoder.EncodeMeshToBuffer(
104+
((DracoMeshEncoder *)encoder)->mesh, &encoder->encoderBuffer);
105+
}
106+
107+
if (encodeStatus.ok()) {
108+
encoder->encodedVertices =
109+
static_cast<uint32_t>(dracoEncoder.num_encoded_points());
110+
encoder->encodedIndices =
111+
static_cast<uint32_t>(dracoEncoder.num_encoded_faces() * 3);
112+
return true;
113+
} else {
114+
return false;
115+
}
75116
}
76117

77118
uint32_t dracoEncoderGetEncodedVertexCount(DracoEncoder *encoder)
@@ -94,7 +135,7 @@ namespace draco {
94135
memcpy(data, encoder->encoderBuffer.data(), encoder->encoderBuffer.size());
95136
}
96137

97-
bool dracoEncodeIndices(DracoEncoder *encoder, uint32_t indexCount, DataType indexType, void *indices)
138+
bool dracoEncodeIndices(DracoMeshEncoder *encoder, uint32_t indexCount, DataType indexType, void *indices)
98139
{
99140
switch (indexType)
100141
{
@@ -112,7 +153,7 @@ namespace draco {
112153
}
113154

114155
template<class T>
115-
void dracoEncodeIndices(DracoEncoder *encoder, uint32_t indexCount, T *indices)
156+
void dracoEncodeIndices(DracoMeshEncoder *encoder, uint32_t indexCount, T *indices)
116157
{
117158
int face_count = indexCount / 3;
118159
encoder->mesh.SetNumFaces(static_cast<size_t>(face_count));
@@ -129,7 +170,7 @@ namespace draco {
129170
}
130171
}
131172

132-
bool dracoEncoderSetIndices(DracoEncoder *encoder, DataType indexComponentType, uint32_t indexCount, void *indices)
173+
bool dracoEncoderSetIndices(DracoMeshEncoder *encoder, DataType indexComponentType, uint32_t indexCount, void *indices)
133174
{
134175
switch (indexComponentType)
135176
{
@@ -154,7 +195,30 @@ namespace draco {
154195
return true;
155196
}
156197

157-
uint32_t dracoEncoderSetAttribute(DracoEncoder *encoder, GeometryAttribute::Type attributeType, draco::DataType dracoDataType, int32_t componentCount, int32_t stride, void *data)
198+
199+
uint32_t dracoEncoderSetAttribute(DracoEncoder *encoder,
200+
GeometryAttribute::Type attributeType,
201+
draco::DataType dracoDataType,
202+
int32_t componentCount, int32_t stride,
203+
void *data) {
204+
if (encoder->is_point_cloud) {
205+
return dracoSetAttribute<DracoPointsEncoder>(
206+
(DracoPointsEncoder*)encoder, attributeType, dracoDataType,
207+
componentCount, stride, data);
208+
} else {
209+
return dracoSetAttribute((DracoMeshEncoder *)encoder, attributeType,
210+
dracoDataType,
211+
componentCount, stride, data);
212+
}
213+
214+
}
215+
216+
template <class T>
217+
uint32_t dracoSetAttribute(T *encoder,
218+
GeometryAttribute::Type attributeType,
219+
draco::DataType dracoDataType,
220+
int32_t componentCount, int32_t stride,
221+
void *data)
158222
{
159223
auto buffer = std::unique_ptr<draco::DataBuffer>( new draco::DataBuffer());
160224
uint32_t count = encoder->mesh.num_points();

src/draco/unity/draco_unity_enc_plugin.h

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ namespace draco {
3636

3737
struct DracoEncoder
3838
{
39-
draco::Mesh mesh;
4039
uint32_t encodedVertices;
4140
uint32_t encodedIndices;
4241
std::vector<std::unique_ptr<draco::DataBuffer>> buffers;
@@ -52,14 +51,34 @@ namespace draco {
5251
uint32_t color = 10;
5352
uint32_t generic = 12;
5453
} quantization;
54+
bool is_point_cloud;
55+
};
56+
57+
struct DracoMeshEncoder : DracoEncoder {
58+
draco::Mesh mesh;
59+
};
60+
61+
struct DracoPointsEncoder : DracoEncoder {
62+
draco::PointCloud mesh;
5563
};
5664

5765
template<class T>
58-
void dracoEncodeIndices(DracoEncoder *encoder, uint32_t indexCount, T *indices);
66+
void dracoEncodeIndices(DracoMeshEncoder *encoder, uint32_t indexCount,
67+
T *indices);
68+
template <class T>
69+
uint32_t dracoSetAttribute(T *encoder, GeometryAttribute::Type attributeType,
70+
draco::DataType dracoDataType,
71+
int32_t componentCount, int32_t stride,
72+
void *data);
73+
74+
template<class T>
75+
bool dracoEncode(T *encoder, uint8_t sequentialEncode);
76+
5977

6078
extern "C" {
6179

62-
EXPORT_API DracoEncoder * dracoEncoderCreate(uint32_t vertexCount);
80+
EXPORT_API DracoEncoder *dracoEncoderCreate(uint32_t vertexCount);
81+
EXPORT_API DracoEncoder *dracoEncoderCreatePointCloud(uint32_t pointCount);
6382
void EXPORT_API dracoEncoderRelease(DracoEncoder *encoder);
6483
void EXPORT_API dracoEncoderSetCompressionSpeed(DracoEncoder *encoder, uint32_t encodingSpeed, uint32_t decodingSpeed);
6584
void EXPORT_API dracoEncoderSetQuantizationBits(DracoEncoder *encoder, uint32_t position, uint32_t normal, uint32_t uv, uint32_t color, uint32_t generic);
@@ -68,10 +87,11 @@ extern "C" {
6887
uint32_t EXPORT_API dracoEncoderGetEncodedIndexCount(DracoEncoder *encoder);
6988
uint64_t EXPORT_API dracoEncoderGetByteLength(DracoEncoder *encoder);
7089
void EXPORT_API dracoEncoderCopy(DracoEncoder *encoder, uint8_t *data);
71-
bool EXPORT_API dracoEncoderSetIndices(DracoEncoder *encoder, DataType indexComponentType, uint32_t indexCount, void *indices);
72-
uint32_t EXPORT_API dracoEncoderSetAttribute(DracoEncoder *encoder, GeometryAttribute::Type attributeType, draco::DataType dracoDataType, int32_t componentCount, int32_t stride, void *data);
73-
74-
} // extern "C"
90+
bool EXPORT_API dracoEncoderSetIndices(DracoMeshEncoder *encoder,
91+
DataType indexComponentType,
92+
uint32_t indexCount, void *indices);
93+
uint32_t EXPORT_API dracoEncoderSetAttribute(DracoEncoder *encoder, GeometryAttribute::Type attributeType, draco::DataType dracoDataType, int32_t componentCount, int32_t stride, void *data);
94+
} // extern "C"
7595

7696
} // namespace draco
7797

0 commit comments

Comments
 (0)