Manifold 3.0
Robust geometry
 
Loading...
Searching...
No Matches
manifold.h
1// Copyright 2021 The Manifold Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#pragma once
16#include <cstdint> // uint32_t, uint64_t
17#include <functional>
18#include <memory> // needed for shared_ptr
19
20#include "manifold/common.h"
21#include "manifold/vec_view.h"
22
23namespace manifold {
24
33
34class CsgNode;
35class CsgLeafNode;
36
41
112template <typename Precision, typename I = uint32_t>
113struct MeshGLP {
115 I NumVert() const { return vertProperties.size() / numProp; };
117 I NumTri() const { return triVerts.size() / 3; };
119 I numProp = 3;
123 std::vector<Precision> vertProperties;
126 std::vector<I> triVerts;
129 std::vector<I> mergeFromVert;
133 std::vector<I> mergeToVert;
141 std::vector<I> runIndex;
147 std::vector<uint32_t> runOriginalID;
152 std::vector<Precision> runTransform;
158 std::vector<I> faceID;
163 std::vector<Precision> halfedgeTangent;
168 Precision tolerance = 0;
169
170 MeshGLP() = default;
171
186 bool Merge();
187
193 la::vec<Precision, 3> GetVertPos(size_t v) const {
194 size_t offset = v * numProp;
195 return la::vec<Precision, 3>(vertProperties[offset],
196 vertProperties[offset + 1],
197 vertProperties[offset + 2]);
198 }
199
205 la::vec<I, 3> GetTriVerts(size_t t) const {
206 size_t offset = 3 * t;
207 return la::vec<I, 3>(triVerts[offset], triVerts[offset + 1],
208 triVerts[offset + 2]);
209 }
210
216 la::vec<Precision, 4> GetTangent(size_t h) const {
217 size_t offset = 4 * h;
218 return la::vec<Precision, 4>(
219 halfedgeTangent[offset], halfedgeTangent[offset + 1],
220 halfedgeTangent[offset + 2], halfedgeTangent[offset + 3]);
221 }
222};
223
232
256class Manifold {
257 public:
262 Manifold();
263 ~Manifold();
264 Manifold(const Manifold& other);
265 Manifold& operator=(const Manifold& other);
266 Manifold(Manifold&&) noexcept;
267 Manifold& operator=(Manifold&&) noexcept;
269
274 Manifold(const MeshGL&);
275 Manifold(const MeshGL64&);
276 MeshGL GetMeshGL(int normalIdx = -1) const;
277 MeshGL64 GetMeshGL64(int normalIdx = -1) const;
279
284 std::vector<Manifold> Decompose() const;
285 static Manifold Compose(const std::vector<Manifold>&);
286 static Manifold Tetrahedron();
287 static Manifold Cube(vec3 size = vec3(1.0), bool center = false);
288 static Manifold Cylinder(double height, double radiusLow,
289 double radiusHigh = -1.0, int circularSegments = 0,
290 bool center = false);
291 static Manifold Sphere(double radius, int circularSegments = 0);
292 static Manifold LevelSet(std::function<double(vec3)> sdf, Box bounds,
293 double edgeLength, double level = 0,
294 double tolerance = -1, bool canParallel = true);
296
301 Polygons Slice(double height = 0) const;
302 Polygons Project() const;
303 static Manifold Extrude(const Polygons& crossSection, double height,
304 int nDivisions = 0, double twistDegrees = 0.0,
305 vec2 scaleTop = vec2(1.0));
306 static Manifold Revolve(const Polygons& crossSection,
307 int circularSegments = 0,
308 double revolveDegrees = 360.0f);
310
311 enum class Error {
312 NoError,
313 NonFiniteVertex,
314 NotManifold,
315 VertexOutOfBounds,
316 PropertiesWrongLength,
317 MissingPositionProperties,
318 MergeVectorsDifferentLengths,
319 MergeIndexOutOfBounds,
320 TransformWrongLength,
321 RunIndexWrongLength,
322 FaceIDWrongLength,
323 InvalidConstruction,
324 ResultTooLarge,
325 };
326
331 Error Status() const;
332 bool IsEmpty() const;
333 size_t NumVert() const;
334 size_t NumEdge() const;
335 size_t NumTri() const;
336 size_t NumProp() const;
337 size_t NumPropVert() const;
338 Box BoundingBox() const;
339 int Genus() const;
340 double GetTolerance() const;
342
346 double SurfaceArea() const;
347 double Volume() const;
348 double MinGap(const Manifold& other, double searchLength) const;
350
356 int OriginalID() const;
357 Manifold AsOriginal() const;
358 static uint32_t ReserveIDs(uint32_t);
360
364 Manifold Translate(vec3) const;
365 Manifold Scale(vec3) const;
366 Manifold Rotate(double xDegrees, double yDegrees = 0.0,
367 double zDegrees = 0.0) const;
368 Manifold Mirror(vec3) const;
369 Manifold Transform(const mat3x4&) const;
370 Manifold Warp(std::function<void(vec3&)>) const;
371 Manifold WarpBatch(std::function<void(VecView<vec3>)>) const;
372 Manifold SetTolerance(double) const;
373 Manifold Simplify(double tolerance = 0) const;
375
380 Manifold Boolean(const Manifold& second, OpType op) const;
381 static Manifold BatchBoolean(const std::vector<Manifold>& manifolds,
382 OpType op);
383 // Boolean operation shorthand
384 Manifold operator+(const Manifold&) const; // Add (Union)
386 Manifold operator-(const Manifold&) const; // Subtract (Difference)
388 Manifold operator^(const Manifold&) const; // Intersect
390 std::pair<Manifold, Manifold> Split(const Manifold&) const;
391 std::pair<Manifold, Manifold> SplitByPlane(vec3 normal,
392 double originOffset) const;
393 Manifold TrimByPlane(vec3 normal, double originOffset) const;
395
401 int numProp,
402 std::function<void(double*, vec3, const double*)> propFunc) const;
403 Manifold CalculateCurvature(int gaussianIdx, int meanIdx) const;
404 Manifold CalculateNormals(int normalIdx, double minSharpAngle = 60) const;
406
412 Manifold Refine(int) const;
413 Manifold RefineToLength(double) const;
414 Manifold RefineToTolerance(double) const;
415 Manifold SmoothByNormals(int normalIdx) const;
416 Manifold SmoothOut(double minSharpAngle = 60, double minSmoothness = 0) const;
417 static Manifold Smooth(const MeshGL&,
418 const std::vector<Smoothness>& sharpenedEdges = {});
419 static Manifold Smooth(const MeshGL64&,
420 const std::vector<Smoothness>& sharpenedEdges = {});
422
426 Manifold Hull() const;
427 static Manifold Hull(const std::vector<Manifold>& manifolds);
428 static Manifold Hull(const std::vector<vec3>& pts);
430
477#ifdef MANIFOLD_DEBUG
478 static Manifold ReadOBJ(std::istream& stream);
479 bool WriteOBJ(std::ostream& stream) const;
480#endif
481
486 bool MatchesTriNormals() const;
487 size_t NumDegenerateTris() const;
488 double GetEpsilon() const;
490
491 struct Impl;
492
493 private:
494 Manifold(std::shared_ptr<CsgNode> pNode_);
495 Manifold(std::shared_ptr<Impl> pImpl_);
496 static Manifold Invalid();
497 mutable std::shared_ptr<CsgNode> pNode_;
498
499 CsgLeafNode& GetCsgLeafNode() const;
500};
501
502
511#ifdef MANIFOLD_DEBUG
512inline std::string ToString(const Manifold::Error& error) {
513 switch (error) {
514 case Manifold::Error::NoError:
515 return "No Error";
516 case Manifold::Error::NonFiniteVertex:
517 return "Non Finite Vertex";
518 case Manifold::Error::NotManifold:
519 return "Not Manifold";
520 case Manifold::Error::VertexOutOfBounds:
521 return "Vertex Out Of Bounds";
522 case Manifold::Error::PropertiesWrongLength:
523 return "Properties Wrong Length";
524 case Manifold::Error::MissingPositionProperties:
525 return "Missing Position Properties";
526 case Manifold::Error::MergeVectorsDifferentLengths:
527 return "Merge Vectors Different Lengths";
528 case Manifold::Error::MergeIndexOutOfBounds:
529 return "Merge Index Out Of Bounds";
530 case Manifold::Error::TransformWrongLength:
531 return "Transform Wrong Length";
532 case Manifold::Error::RunIndexWrongLength:
533 return "Run Index Wrong Length";
534 case Manifold::Error::FaceIDWrongLength:
535 return "Face ID Wrong Length";
536 case Manifold::Error::InvalidConstruction:
537 return "Invalid Construction";
538 case Manifold::Error::ResultTooLarge:
539 return "Result Too Large";
540 default:
541 return "Unknown Error";
542 };
543}
544
545inline std::ostream& operator<<(std::ostream& stream,
546 const Manifold::Error& error) {
547 return stream << ToString(error);
548}
549#endif
551} // namespace manifold
static Manifold LevelSet(std::function< double(vec3)> sdf, Box bounds, double edgeLength, double level=0, double tolerance=-1, bool canParallel=true)
Definition sdf.cpp:456
Manifold SmoothOut(double minSharpAngle=60, double minSmoothness=0) const
Definition manifold.cpp:730
Manifold RefineToLength(double) const
Definition manifold.cpp:779
Manifold CalculateCurvature(int gaussianIdx, int meanIdx) const
Definition manifold.cpp:666
static Manifold BatchBoolean(const std::vector< Manifold > &manifolds, OpType op)
Definition manifold.cpp:845
double MinGap(const Manifold &other, double searchLength) const
Definition manifold.cpp:1008
static uint32_t ReserveIDs(uint32_t)
Definition manifold.cpp:476
size_t NumProp() const
Definition manifold.cpp:341
Polygons Project() const
Definition manifold.cpp:964
size_t NumPropVert() const
Definition manifold.cpp:349
static Manifold Extrude(const Polygons &crossSection, double height, int nDivisions=0, double twistDegrees=0.0, vec2 scaleTop=vec2(1.0))
Definition constructors.cpp:229
Box BoundingBox() const
Definition manifold.cpp:356
std::pair< Manifold, Manifold > SplitByPlane(vec3 normal, double originOffset) const
Definition manifold.cpp:930
Error Status() const
Definition manifold.cpp:319
int Genus() const
Definition manifold.cpp:422
Manifold & operator+=(const Manifold &)
Definition manifold.cpp:867
Manifold Warp(std::function< void(vec3 &)>) const
Definition manifold.cpp:570
Manifold Refine(int) const
Definition manifold.cpp:761
MeshGL64 GetMeshGL64(int normalIdx=-1) const
Definition manifold.cpp:304
static Manifold Sphere(double radius, int circularSegments=0)
Definition constructors.cpp:190
std::pair< Manifold, Manifold > Split(const Manifold &) const
Definition manifold.cpp:909
bool MatchesTriNormals() const
Definition manifold.cpp:485
size_t NumEdge() const
Definition manifold.cpp:331
int OriginalID() const
Definition manifold.cpp:446
double Volume() const
Definition manifold.cpp:437
Manifold Transform(const mat3x4 &) const
Definition manifold.cpp:540
MeshGL GetMeshGL(int normalIdx=-1) const
Definition manifold.cpp:285
Manifold RefineToTolerance(double) const
Definition manifold.cpp:800
Manifold WarpBatch(std::function< void(VecView< vec3 >)>) const
Definition manifold.cpp:589
Manifold Translate(vec3) const
Definition manifold.cpp:504
std::vector< Manifold > Decompose() const
Definition constructors.cpp:467
Manifold Rotate(double xDegrees, double yDegrees=0.0, double zDegrees=0.0) const
Definition manifold.cpp:528
Manifold SetTolerance(double) const
Definition manifold.cpp:381
static Manifold Cylinder(double height, double radiusLow, double radiusHigh=-1.0, int circularSegments=0, bool center=false)
Definition constructors.cpp:158
Manifold & operator^=(const Manifold &)
Definition manifold.cpp:897
static Manifold Revolve(const Polygons &crossSection, int circularSegments=0, double revolveDegrees=360.0f)
Definition constructors.cpp:316
bool IsEmpty() const
Definition manifold.cpp:312
static Manifold Compose(const std::vector< Manifold > &)
Definition constructors.cpp:454
Manifold Boolean(const Manifold &second, OpType op) const
Definition manifold.cpp:837
Manifold AsOriginal() const
Definition manifold.cpp:457
Manifold Hull() const
Definition manifold.cpp:986
Manifold SmoothByNormals(int normalIdx) const
Definition manifold.cpp:704
Manifold Scale(vec3) const
Definition manifold.cpp:514
Manifold TrimByPlane(vec3 normal, double originOffset) const
Definition manifold.cpp:944
size_t NumTri() const
Definition manifold.cpp:337
Manifold SetProperties(int numProp, std::function< void(double *, vec3, const double *)> propFunc) const
Definition manifold.cpp:614
Manifold CalculateNormals(int normalIdx, double minSharpAngle=60) const
Definition manifold.cpp:687
double SurfaceArea() const
Definition manifold.cpp:430
size_t NumVert() const
Definition manifold.cpp:325
Polygons Slice(double height=0) const
Definition manifold.cpp:954
double GetTolerance() const
Definition manifold.cpp:373
Manifold operator^(const Manifold &) const
Definition manifold.cpp:890
double GetEpsilon() const
Definition manifold.cpp:364
static Manifold Cube(vec3 size=vec3(1.0), bool center=false)
Definition constructors.cpp:136
Manifold()
Definition manifold.cpp:207
Manifold Mirror(vec3) const
Definition manifold.cpp:552
Manifold operator-(const Manifold &) const
Definition manifold.cpp:875
Manifold & operator-=(const Manifold &)
Definition manifold.cpp:882
Manifold Simplify(double tolerance=0) const
Definition manifold.cpp:403
size_t NumDegenerateTris() const
Definition manifold.cpp:494
Manifold operator+(const Manifold &) const
Definition manifold.cpp:860
static Manifold Tetrahedron()
Definition constructors.cpp:124
static Manifold Smooth(const MeshGL &, const std::vector< Smoothness > &sharpenedEdges={})
Definition constructors.cpp:82
Definition vec_view.h:32
MeshGLP< double, uint64_t > MeshGL64
Double-precision, 64-bit indices - best for huge meshes.
Definition manifold.h:231
MeshGLP< float > MeshGL
Single-precision - ideal for most uses, especially graphics.
Definition manifold.h:227
ExecutionParams & ManifoldParams()
Definition manifold.cpp:968
Global parameters that control debugging output. Only has an effect when compiled with the MANIFOLD_D...
Definition common.h:577
std::vector< SimplePolygon > Polygons
Set of polygons with holes. Order of contours is arbitrary. Can contain any depth of nested holes and...
Definition common.h:140
OpType
Boolean operation type: Add (Union), Subtract (Difference), and Intersect.
Definition common.h:474
Axis-aligned 3D box, primarily for bounding.
Definition common.h:158
Mesh input/output suitable for pushing directly into graphics libraries.
Definition manifold.h:113
la::vec< I, 3 > GetTriVerts(size_t t) const
Definition manifold.h:205
std::vector< uint32_t > mergeFromVert
Definition manifold.h:129
std::vector< uint32_t > runIndex
Definition manifold.h:141
std::vector< float > vertProperties
Definition manifold.h:123
std::vector< float > runTransform
Definition manifold.h:152
std::vector< uint32_t > mergeToVert
Definition manifold.h:133
I NumTri() const
Number of triangles.
Definition manifold.h:117
std::vector< float > halfedgeTangent
Definition manifold.h:163
std::vector< uint32_t > runOriginalID
Definition manifold.h:147
std::vector< uint32_t > triVerts
Definition manifold.h:126
la::vec< Precision, 4 > GetTangent(size_t h) const
Definition manifold.h:216
float tolerance
Definition manifold.h:168
I NumVert() const
Number of property vertices.
Definition manifold.h:115
std::vector< uint32_t > faceID
Definition manifold.h:158
la::vec< Precision, 3 > GetVertPos(size_t v) const
Definition manifold.h:193
uint32_t numProp
Definition manifold.h:119