Manifold 1.0
Robust computational 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 <functional>
17#include <memory>
18
19#include "cross_section.h"
20#include "public.h"
21#include "vec_view.h"
22
23namespace manifold {
24
32ExecutionParams& ManifoldParams();
33
34class CsgNode;
35class CsgLeafNode;
36
47struct MeshGL {
49 uint32_t NumVert() const {
50 if (vertProperties.size() / numProp >= std::numeric_limits<int>::max())
51 throw std::out_of_range("mesh too large");
52 return vertProperties.size() / numProp;
53 };
55 uint32_t NumTri() const {
56 if (vertProperties.size() / numProp >= std::numeric_limits<int>::max())
57 throw std::out_of_range("mesh too large");
58 return triVerts.size() / 3;
59 };
60
62 uint32_t numProp = 3;
66 std::vector<float> vertProperties;
69 std::vector<uint32_t> triVerts;
72 std::vector<uint32_t> mergeFromVert;
76 std::vector<uint32_t> mergeToVert;
84 std::vector<uint32_t> runIndex;
90 std::vector<uint32_t> runOriginalID;
95 std::vector<float> runTransform;
103 std::vector<uint32_t> faceID;
108 std::vector<float> halfedgeTangent;
113 float precision = 0;
114
115 MeshGL() = default;
116 MeshGL(const Mesh& mesh);
117
118 bool Merge();
119};
151class Manifold {
152 public:
157 Manifold();
158 ~Manifold();
159 Manifold(const Manifold& other);
160 Manifold& operator=(const Manifold& other);
161 Manifold(Manifold&&) noexcept;
162 Manifold& operator=(Manifold&&) noexcept;
163
164 Manifold(const MeshGL&, const std::vector<float>& propertyTolerance = {});
165 Manifold(const Mesh&);
166
167 static Manifold Smooth(const MeshGL&,
168 const std::vector<Smoothness>& sharpenedEdges = {});
169 static Manifold Smooth(const Mesh&,
170 const std::vector<Smoothness>& sharpenedEdges = {});
171 static Manifold Tetrahedron();
172 static Manifold Cube(glm::vec3 size = glm::vec3(1.0f), bool center = false);
173 static Manifold Cylinder(float height, float radiusLow,
174 float radiusHigh = -1.0f, int circularSegments = 0,
175 bool center = false);
176 static Manifold Sphere(float radius, int circularSegments = 0);
177 static Manifold Extrude(const CrossSection& crossSection, float height,
178 int nDivisions = 0, float twistDegrees = 0.0f,
179 glm::vec2 scaleTop = glm::vec2(1.0f));
180 static Manifold Revolve(const CrossSection& crossSection,
181 int circularSegments = 0,
182 float revolveDegrees = 360.0f);
184
189 static Manifold Compose(const std::vector<Manifold>&);
190 std::vector<Manifold> Decompose() const;
192
197 Mesh GetMesh() const;
198 MeshGL GetMeshGL(glm::ivec3 normalIdx = glm::ivec3(0)) const;
199 bool IsEmpty() const;
200 enum class Error {
201 NoError,
202 NonFiniteVertex,
203 NotManifold,
204 VertexOutOfBounds,
205 PropertiesWrongLength,
206 MissingPositionProperties,
207 MergeVectorsDifferentLengths,
208 MergeIndexOutOfBounds,
209 TransformWrongLength,
210 RunIndexWrongLength,
211 FaceIDWrongLength,
212 InvalidConstruction,
213 };
214 Error Status() const;
215 int NumVert() const;
216 int NumEdge() const;
217 int NumTri() const;
218 int NumProp() const;
219 int NumPropVert() const;
220 Box BoundingBox() const;
221 float Precision() const;
222 int Genus() const;
224 float MinGap(const Manifold& other, float searchLength) const;
226
232 int OriginalID() const;
233 Manifold AsOriginal() const;
234 static uint32_t ReserveIDs(uint32_t);
236
240 Manifold Translate(glm::vec3) const;
241 Manifold Scale(glm::vec3) const;
242 Manifold Rotate(float xDegrees, float yDegrees = 0.0f,
243 float zDegrees = 0.0f) const;
244 Manifold Transform(const glm::mat4x3&) const;
245 Manifold Mirror(glm::vec3) const;
246 Manifold Warp(std::function<void(glm::vec3&)>) const;
247 Manifold WarpBatch(std::function<void(VecView<glm::vec3>)>) const;
249 int, std::function<void(float*, glm::vec3, const float*)>) const;
250 Manifold CalculateCurvature(int gaussianIdx, int meanIdx) const;
251 Manifold CalculateNormals(int normalIdx, float minSharpAngle = 60) const;
252 Manifold SmoothByNormals(int normalIdx) const;
253 Manifold SmoothOut(float minSharpAngle = 60, float minSmoothness = 0) const;
254 Manifold Refine(int) const;
255 Manifold RefineToLength(float) const;
256 // Manifold RefineToPrecision(float);
258
263 Manifold Boolean(const Manifold& second, OpType op) const;
264 static Manifold BatchBoolean(const std::vector<Manifold>& manifolds,
265 OpType op);
266 // Boolean operation shorthand
267 Manifold operator+(const Manifold&) const; // Add (Union)
269 Manifold operator-(const Manifold&) const; // Subtract (Difference)
271 Manifold operator^(const Manifold&) const; // Intersect
273 std::pair<Manifold, Manifold> Split(const Manifold&) const;
274 std::pair<Manifold, Manifold> SplitByPlane(glm::vec3 normal,
275 float originOffset) const;
276 Manifold TrimByPlane(glm::vec3 normal, float originOffset) const;
278
282 CrossSection Slice(float height = 0) const;
283 CrossSection Project() const;
285
289 Manifold Hull() const;
290 static Manifold Hull(const std::vector<Manifold>& manifolds);
291 static Manifold Hull(const std::vector<glm::vec3>& pts);
293
298 bool MatchesTriNormals() const;
299 int NumDegenerateTris() const;
300 int NumOverlaps(const Manifold& second) const;
302
303 struct Impl;
304
305 private:
306 Manifold(std::shared_ptr<CsgNode> pNode_);
307 Manifold(std::shared_ptr<Impl> pImpl_);
308 static Manifold Invalid();
309 mutable std::shared_ptr<CsgNode> pNode_;
310
311 CsgLeafNode& GetCsgLeafNode() const;
312};
314} // namespace manifold
Definition cross_section.h:40
Definition csg_tree.h:41
Definition manifold.h:151
float Precision() const
Definition manifold.cpp:404
int NumOverlaps(const Manifold &second) const
Definition manifold.cpp:483
int NumEdge() const
Definition manifold.cpp:374
Manifold CalculateCurvature(int gaussianIdx, int meanIdx) const
Definition manifold.cpp:653
Manifold SetProperties(int, std::function< void(float *, glm::vec3, const float *)>) const
Definition manifold.cpp:597
static Manifold BatchBoolean(const std::vector< Manifold > &manifolds, OpType op)
Definition manifold.cpp:784
Manifold TrimByPlane(glm::vec3 normal, float originOffset) const
Definition manifold.cpp:883
static uint32_t ReserveIDs(uint32_t)
Definition manifold.cpp:455
static Manifold Sphere(float radius, int circularSegments=0)
Definition constructors.cpp:203
Box BoundingBox() const
Definition manifold.cpp:395
Error Status() const
Definition manifold.cpp:364
static Manifold Cube(glm::vec3 size=glm::vec3(1.0f), bool center=false)
Definition constructors.cpp:151
int NumProp() const
Definition manifold.cpp:382
float MinGap(const Manifold &other, float searchLength) const
Definition manifold.cpp:961
int NumTri() const
Definition manifold.cpp:378
int Genus() const
Definition manifold.cpp:413
Manifold RefineToLength(float) const
Definition manifold.cpp:754
Manifold & operator+=(const Manifold &)
Definition manifold.cpp:806
Manifold Rotate(float xDegrees, float yDegrees=0.0f, float zDegrees=0.0f) const
Definition manifold.cpp:525
MeshGL GetMeshGL(glm::ivec3 normalIdx=glm::ivec3(0)) const
Definition manifold.cpp:193
Manifold Refine(int) const
Definition manifold.cpp:736
std::pair< Manifold, Manifold > Split(const Manifold &) const
Definition manifold.cpp:848
bool MatchesTriNormals() const
Definition manifold.cpp:464
int OriginalID() const
Definition manifold.cpp:430
Manifold CalculateNormals(int normalIdx, float minSharpAngle=60) const
Definition manifold.cpp:674
Manifold Transform(const glm::mat4x3 &) const
Definition manifold.cpp:537
Mesh GetMesh() const
Definition manifold.cpp:158
Manifold WarpBatch(std::function< void(VecView< glm::vec3 >)>) const
Definition manifold.cpp:580
std::vector< Manifold > Decompose() const
Definition constructors.cpp:466
CrossSection Project() const
Definition manifold.cpp:901
int NumVert() const
Definition manifold.cpp:370
Manifold & operator^=(const Manifold &)
Definition manifold.cpp:836
Manifold SmoothOut(float minSharpAngle=60, float minSmoothness=0) const
Definition manifold.cpp:717
bool IsEmpty() const
Definition manifold.cpp:355
CrossSection Slice(float height=0) const
Definition manifold.cpp:893
Manifold Mirror(glm::vec3) const
Definition manifold.cpp:549
static Manifold Compose(const std::vector< Manifold > &)
Definition constructors.cpp:453
Manifold Boolean(const Manifold &second, OpType op) const
Definition manifold.cpp:776
Manifold AsOriginal() const
Definition manifold.cpp:440
Manifold Hull() const
Definition manifold.cpp:943
Manifold SmoothByNormals(int normalIdx) const
Definition manifold.cpp:691
int NumPropVert() const
Definition manifold.cpp:388
static Manifold Revolve(const CrossSection &crossSection, int circularSegments=0, float revolveDegrees=360.0f)
Definition constructors.cpp:325
Manifold Translate(glm::vec3) const
Definition manifold.cpp:499
static Manifold Extrude(const CrossSection &crossSection, float height, int nDivisions=0, float twistDegrees=0.0f, glm::vec2 scaleTop=glm::vec2(1.0f))
Definition constructors.cpp:238
Properties GetProperties() const
Definition manifold.cpp:421
static Manifold Cylinder(float height, float radiusLow, float radiusHigh=-1.0f, int circularSegments=0, bool center=false)
Definition constructors.cpp:174
Manifold operator^(const Manifold &) const
Definition manifold.cpp:829
Manifold()
Definition manifold.cpp:84
Manifold operator-(const Manifold &) const
Definition manifold.cpp:814
std::pair< Manifold, Manifold > SplitByPlane(glm::vec3 normal, float originOffset) const
Definition manifold.cpp:869
Manifold Scale(glm::vec3) const
Definition manifold.cpp:509
Manifold & operator-=(const Manifold &)
Definition manifold.cpp:821
Manifold Warp(std::function< void(glm::vec3 &)>) const
Definition manifold.cpp:567
Manifold operator+(const Manifold &) const
Definition manifold.cpp:799
static Manifold Tetrahedron()
Definition constructors.cpp:139
int NumDegenerateTris() const
Definition manifold.cpp:473
static Manifold Smooth(const MeshGL &, const std::vector< Smoothness > &sharpenedEdges={})
Definition constructors.cpp:81
Definition vec_view.h:27
Definition public.h:129
Definition public.h:167
OpType
Definition public.h:493
ExecutionParams & ManifoldParams()
Definition manifold.cpp:905
Definition meshIO.h:20
Definition public.h:171
Definition impl.h:30
Definition manifold.h:47
std::vector< uint32_t > runIndex
Definition manifold.h:84
bool Merge()
Definition sort.cpp:520
uint32_t NumVert() const
Number of property vertices.
Definition manifold.h:49
std::vector< float > runTransform
Definition manifold.h:95
uint32_t NumTri() const
Number of triangles.
Definition manifold.h:55
std::vector< float > halfedgeTangent
Definition manifold.h:108
std::vector< uint32_t > mergeFromVert
Definition manifold.h:72
std::vector< float > vertProperties
Definition manifold.h:66
std::vector< uint32_t > runOriginalID
Definition manifold.h:90
std::vector< uint32_t > faceID
Definition manifold.h:103
float precision
Definition manifold.h:113
uint32_t numProp
Number of properties per vertex, always >= 3.
Definition manifold.h:62
std::vector< uint32_t > mergeToVert
Definition manifold.h:76
std::vector< uint32_t > triVerts
Definition manifold.h:69