2121
2222namespace 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 ();
0 commit comments