-
Notifications
You must be signed in to change notification settings - Fork 173
/
cork.h
74 lines (63 loc) · 2.67 KB
/
cork.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// +-------------------------------------------------------------------------
// | cork.h
// |
// | Author: Gilbert Bernstein
// +-------------------------------------------------------------------------
// | COPYRIGHT:
// | Copyright Gilbert Bernstein 2013
// | See the included COPYRIGHT file for further details.
// |
// | This file is part of the Cork library.
// |
// | Cork is free software: you can redistribute it and/or modify
// | it under the terms of the GNU Lesser General Public License as
// | published by the Free Software Foundation, either version 3 of
// | the License, or (at your option) any later version.
// |
// | Cork is distributed in the hope that it will be useful,
// | but WITHOUT ANY WARRANTY; without even the implied warranty of
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// | GNU Lesser General Public License for more details.
// |
// | You should have received a copy
// | of the GNU Lesser General Public License
// | along with Cork. If not, see <http://www.gnu.org/licenses/>.
// +-------------------------------------------------------------------------
#pragma once
#ifndef uint
typedef unsigned int uint;
#endif
// if a mesh is taken as input, the client must manage the memory
// if a mesh is given as output, please use the provided
// function to free the allocated memory.
struct CorkTriMesh
{
uint n_triangles;
uint n_vertices;
uint *triangles;
float *vertices;
};
void freeCorkTriMesh(CorkTriMesh *mesh);
// the inputs to Boolean operations must be "solid":
// - closed (aka. watertight; see comment at bottom)
// - non-self-intersecting
// additionally, inputs should use a counter-clockwise convention
// for triangle facing. If the triangles are presented in clockwise
// orientation, the object is interpreted as its unbounded complement
// This function will test whether or not a mesh is solid
bool isSolid(CorkTriMesh mesh);
// Boolean operations follow
// result = A U B
void computeUnion(CorkTriMesh in0, CorkTriMesh in1, CorkTriMesh *out);
// result = A - B
void computeDifference(CorkTriMesh in0, CorkTriMesh in1, CorkTriMesh *out);
// result = A ^ B
void computeIntersection(CorkTriMesh in0, CorkTriMesh in1, CorkTriMesh *out);
// result = A XOR B
void computeSymmetricDifference(
CorkTriMesh in0, CorkTriMesh in1, CorkTriMesh *out);
// Not a Boolean operation, but related:
// No portion of either surface is deleted. However, the
// curve of intersection between the two surfaces is made explicit,
// such that the two surfaces are now connected.
void resolveIntersections(CorkTriMesh in0, CorkTriMesh in1, CorkTriMesh *out);