Compare commits
551
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d73dc1e4e0 | ||
|
|
aacd402f73 | ||
|
|
e6a7331381 | ||
|
|
8e5aa93e62 | ||
|
|
cd73f3a4f3 | ||
|
|
ae8f959ea2 | ||
|
|
b0aa5f2a1c | ||
|
|
09e1598e6d | ||
|
|
678e1fff76 | ||
|
|
47b557df58 | ||
|
|
182e36df24 | ||
|
|
bf9bdb9c70 | ||
|
|
73a2e0de9b | ||
|
|
8866f214a0 | ||
|
|
cf9ed7f492 | ||
|
|
40e7900ccb | ||
|
|
b443ac0261 | ||
|
|
b286e13ac6 | ||
|
|
e91ffcb549 | ||
|
|
d9524ade53 | ||
|
|
89267b4a80 | ||
|
|
7c3c05d637 | ||
|
|
7888711039 | ||
|
|
08be0704c2 | ||
|
|
0e360d5250 | ||
|
|
5e561c28c8 | ||
|
|
25d63024bb | ||
|
|
f85a3c76db | ||
|
|
0c9c8cd643 | ||
|
|
a72b9386c8 | ||
|
|
ba69acc509 | ||
|
|
a221faf1e4 | ||
|
|
69e2b7ee67 | ||
|
|
667101084a | ||
|
|
7472691fe6 | ||
|
|
20c3ee0740 | ||
|
|
5067c8b7eb | ||
|
|
c2f96e8e18 | ||
|
|
f962e4a6b6 | ||
|
|
5d93f800ba | ||
|
|
8aca5bd0c4 | ||
|
|
fac5d4a01d | ||
|
|
0e02103df7 | ||
|
|
dd9654a476 | ||
|
|
01f2dc0a60 | ||
|
|
8afe66e8fd | ||
|
|
6e32964a82 | ||
|
|
dafd52343b | ||
|
|
36930e5d19 | ||
|
|
b4d8556a6b | ||
|
|
81180a6e6a | ||
|
|
a8819dcf9b | ||
|
|
1886d18147 | ||
|
|
7e6bf3b81c | ||
|
|
c7a84522c3 | ||
|
|
fe65ecb907 | ||
|
|
33a931d019 | ||
|
|
94c6afde11 | ||
|
|
8185a213d0 | ||
|
|
7d1614af1e | ||
|
|
293e79ff86 | ||
|
|
37f3b1d821 | ||
|
|
a8b3833942 | ||
|
|
7f7f0fe007 | ||
|
|
0b9030b1ed | ||
|
|
112c1b8e48 | ||
|
|
7c9387c92b | ||
|
|
1c8c6d38ba | ||
|
|
7991ee81d8 | ||
|
|
fdaac01bcc | ||
|
|
b4152c576c | ||
|
|
1b07ebcf9e | ||
|
|
64c2740230 | ||
|
|
2b05343e0d | ||
|
|
7547801f58 | ||
|
|
d154f0587c | ||
|
|
dddfd92c7a | ||
|
|
6ddf3b0dd7 | ||
|
|
e139702373 | ||
|
|
fe8e17c095 | ||
|
|
0c78def493 | ||
|
|
3c0f31f132 | ||
|
|
2b62322cd5 | ||
|
|
cb111f6838 | ||
|
|
68684132e5 | ||
|
|
0c1865a8d6 | ||
|
|
5dcce37c9d | ||
|
|
d6448a86fb | ||
|
|
6a31dbf126 | ||
|
|
321d0d8ed0 | ||
|
|
9bfacf8fb6 | ||
|
|
f48c5a93f1 | ||
|
|
d326251896 | ||
|
|
74160c4c1c | ||
|
|
b774e1b31c | ||
|
|
f5702f63e7 | ||
|
|
0262ef5866 | ||
|
|
9350803420 | ||
|
|
0e39b473b1 | ||
|
|
7a84503c8e | ||
|
|
deae7a2767 | ||
|
|
a0bb5bb813 | ||
|
|
5779714a5b | ||
|
|
687530283c | ||
|
|
5c17f85621 | ||
|
|
e5e0539e7d | ||
|
|
eee808949e | ||
|
|
75209c5d6c | ||
|
|
ab6229c77a | ||
|
|
b1fe6ba49c | ||
|
|
8d940367bf | ||
|
|
fb13b11a19 | ||
|
|
7c58cb041d | ||
|
|
10e95bb93b | ||
|
|
00100b60db | ||
|
|
3f8c5426b8 | ||
|
|
fd16e24391 | ||
|
|
44785345e5 | ||
|
|
71676a111e | ||
|
|
e5e7d8a76a | ||
|
|
10002b6cf1 | ||
|
|
418dd43cfe | ||
|
|
9162fb7d79 | ||
|
|
dd38f82afd | ||
|
|
215368a07b | ||
|
|
17787c86d6 | ||
|
|
f3f7879364 | ||
|
|
e2a345a43d | ||
|
|
e45a7e0868 | ||
|
|
c410e80608 | ||
|
|
7765697eb6 | ||
|
|
83922780e1 | ||
|
|
02e0a1ba83 | ||
|
|
97fb89c955 | ||
|
|
62fe771ae1 | ||
|
|
a183e28109 | ||
|
|
a69c8c96f3 | ||
|
|
724ff6b05a | ||
|
|
3cf08b7f68 | ||
|
|
5ded7da086 | ||
|
|
2cc372f70d | ||
|
|
b1bd5b1216 | ||
|
|
598b0b194a | ||
|
|
4de0a0569a | ||
|
|
afafc7cf5a | ||
|
|
514271af51 | ||
|
|
282388c68a | ||
|
|
7b6cc27284 | ||
|
|
a05865e265 | ||
|
|
1d007f4252 | ||
|
|
3374c1ad71 | ||
|
|
90464ffbc3 | ||
|
|
7e5512ce71 | ||
|
|
46f0860c18 | ||
|
|
67b406d60d | ||
|
|
c01718d0b4 | ||
|
|
78015d4da1 | ||
|
|
4a91b88f81 | ||
|
|
3e3c96d0fd | ||
|
|
ee7a7a0aa1 | ||
|
|
70dad85a27 | ||
|
|
610a495be4 | ||
|
|
f1981ff873 | ||
|
|
83dbca4ffd | ||
|
|
a3b0fe4a20 | ||
|
|
50ac379c53 | ||
|
|
dcd1d45d4f | ||
|
|
e4b8bfb28d | ||
|
|
e9c9c5d228 | ||
|
|
bd85c8998f | ||
|
|
af06a10939 | ||
|
|
2f625e66fd | ||
|
|
d91f4edeb0 | ||
|
|
1284a39f13 | ||
|
|
0c77359c89 | ||
|
|
87a550af22 | ||
|
|
574ab1a3a8 | ||
|
|
d6db1cf8c2 | ||
|
|
3ea7f94809 | ||
|
|
3370a3e9ca | ||
|
|
33ed4e010b | ||
|
|
b4406f2397 | ||
|
|
fda700937b | ||
|
|
30019acb17 | ||
|
|
2869f98629 | ||
|
|
04f06d7837 | ||
|
|
91f6c503f6 | ||
|
|
639378c1f4 | ||
|
|
dbecea2bc4 | ||
|
|
238a607032 | ||
|
|
4fff4670d3 | ||
|
|
1c3d487d8e | ||
|
|
c35f0fee39 | ||
|
|
4498aa8dfc | ||
|
|
e83a560347 | ||
|
|
322db89acd | ||
|
|
d444bb173f | ||
|
|
7174a7ac94 | ||
|
|
6f1571bacd | ||
|
|
85db4b17e3 | ||
|
|
142fd6026a | ||
|
|
c98c375270 | ||
|
|
fc42e420cd | ||
|
|
a95612e2c9 | ||
|
|
5c2aa0bed8 | ||
|
|
068a28f431 | ||
|
|
6a8e81f800 | ||
|
|
92f790b48a | ||
|
|
3479ca7ab1 | ||
|
|
f9547b8e56 | ||
|
|
b7e94cb4a2 | ||
|
|
ec72a81b78 | ||
|
|
5da64bcbb5 | ||
|
|
69c662b1fa | ||
|
|
9de1784fcf | ||
|
|
1f44d1e025 | ||
|
|
d474dca3a1 | ||
|
|
1dca5f0fef | ||
|
|
45a4f79b5e | ||
|
|
66b3ef2253 | ||
|
|
269700322a | ||
|
|
09e90b47c4 | ||
|
|
19a7487a74 | ||
|
|
0b5148f646 | ||
|
|
b3294905f4 | ||
|
|
e91fb2b9e0 | ||
|
|
624b146a4a | ||
|
|
28a811da5d | ||
|
|
b319a97447 | ||
|
|
cf46c31e8c | ||
|
|
6829872b74 | ||
|
|
4c6966430c | ||
|
|
0c5c526817 | ||
|
|
60c6357a37 | ||
|
|
06ee3b5c1f | ||
|
|
799b54cb61 | ||
|
|
36cb980cb3 | ||
|
|
7fe68a3237 | ||
|
|
46a497559d | ||
|
|
29ac7b213f | ||
|
|
e19a68cfa6 | ||
|
|
10b3cd442e | ||
|
|
4166366c3b | ||
|
|
5a2180321c | ||
|
|
f8f2c70aee | ||
|
|
ce1de2c0db | ||
|
|
c828ecf4ef | ||
|
|
f6b88d6d81 | ||
|
|
237ffa20b1 | ||
|
|
3e8884d079 | ||
|
|
b0fd49d598 | ||
|
|
79dc4f6838 | ||
|
|
54a4e4bafd | ||
|
|
dcff572e35 | ||
|
|
3f3d186db7 | ||
|
|
fc7f4b9941 | ||
|
|
aa37a39e33 | ||
|
|
fa94bb27e8 | ||
|
|
579dc0e2a7 | ||
|
|
dda197248e | ||
|
|
7de3ff04fa | ||
|
|
957dcf32b3 | ||
|
|
2a3af5f5d3 | ||
|
|
96f5386b9a | ||
|
|
e314e83e98 | ||
|
|
87ed88a955 | ||
|
|
bd411de7db | ||
|
|
f0657f96bc | ||
|
|
b5d4d9b5d0 | ||
|
|
a537dc0c45 | ||
|
|
c6e4a656cd | ||
|
|
dfda6de04e | ||
|
|
7342dbe1f8 | ||
|
|
46b9ab8fdb | ||
|
|
61de7603d6 | ||
|
|
e9ff3a9e96 | ||
|
|
2ce04b54fc | ||
|
|
2aa80074d9 | ||
|
|
c62273ac43 | ||
|
|
78c5137453 | ||
|
|
be83a69332 | ||
|
|
4ba9c8de4e | ||
|
|
bf5607bf99 | ||
|
|
aaa89ffcbb | ||
|
|
e287703912 | ||
|
|
c37fa050f9 | ||
|
|
36e8435a2f | ||
|
|
3450b44688 | ||
|
|
bf079eb962 | ||
|
|
3ff8460324 | ||
|
|
51e4207155 | ||
|
|
b44b9ec895 | ||
|
|
45f0fd44d5 | ||
|
|
b99351efe4 | ||
|
|
a21c0e2be0 | ||
|
|
bb929a290a | ||
|
|
9f2ae303d4 | ||
|
|
e60423e28c | ||
|
|
c96b13b97a | ||
|
|
7a3af9c851 | ||
|
|
e9ff76d9bb | ||
|
|
b56f53beff | ||
|
|
ec9fe116f4 | ||
|
|
22620eb925 | ||
|
|
01086ed865 | ||
|
|
ad0f1e6b5b | ||
|
|
bdd33218a9 | ||
|
|
55f7aa89d9 | ||
|
|
38a1235756 | ||
|
|
6f0233183d | ||
|
|
00bd753289 | ||
|
|
31a9dff085 | ||
|
|
822ffc7684 | ||
|
|
5e2c82dbbc | ||
|
|
747274b792 | ||
|
|
f73dc5c9f5 | ||
|
|
2e988bec2e | ||
|
|
a6550e6849 | ||
|
|
233c1027db | ||
|
|
f7288d5655 | ||
|
|
b36868f15a | ||
|
|
8c4ebeb995 | ||
|
|
1a9bc50125 | ||
|
|
6e81f2555c | ||
|
|
eae92b5060 | ||
|
|
91ae2f6cea | ||
|
|
03448998fb | ||
|
|
4d70f145d4 | ||
|
|
c20c12460d | ||
|
|
86042b0085 | ||
|
|
c371e243da | ||
|
|
d85f0c7537 | ||
|
|
41591d2a49 | ||
|
|
4d8efa03ad | ||
|
|
505cbfa8a6 | ||
|
|
4e61844f27 | ||
|
|
f1017e507d | ||
|
|
bc3f4903e8 | ||
|
|
306e0b5087 | ||
|
|
24a9d0c804 | ||
|
|
70d2abaa53 | ||
|
|
6083cb3a5d | ||
|
|
f7f64f6491 | ||
|
|
780a5fbea5 | ||
|
|
ddf6927ca3 | ||
|
|
7b852d5340 | ||
|
|
7181b99a01 | ||
|
|
fe72a97bcc | ||
|
|
07c5b9c9d3 | ||
|
|
516ff49cff | ||
|
|
87384cf626 | ||
|
|
4d628e75fe | ||
|
|
44f2e1d8be | ||
|
|
a4791538de | ||
|
|
ef289fe39f | ||
|
|
5a68b6e924 | ||
|
|
48c596ba59 | ||
|
|
7e31fdd4bb | ||
|
|
babf491b69 | ||
|
|
a0c6750917 | ||
|
|
61588efa78 | ||
|
|
cef9c6594f | ||
|
|
9de4b6640f | ||
|
|
7ebb86734a | ||
|
|
5b7b50c026 | ||
|
|
148c5f72fc | ||
|
|
aafb6870c7 | ||
|
|
4d026eeef1 | ||
|
|
ea57dfa2ad | ||
|
|
85120e557e | ||
|
|
ad54f2dfe2 | ||
|
|
0ac1d696f8 | ||
|
|
fbfb2d56ad | ||
|
|
858c843971 | ||
|
|
723eb8d74d | ||
|
|
c60a948e7d | ||
|
|
ce32c4aa03 | ||
|
|
e7b3e45577 | ||
|
|
7be097d585 | ||
|
|
c47bb0507b | ||
|
|
b35d97472d | ||
|
|
2ea8312e5e | ||
|
|
f9b716fdf8 | ||
|
|
c608c60a6d | ||
|
|
7250ea7d91 | ||
|
|
e6482a8a42 | ||
|
|
dbba9ca921 | ||
|
|
225edb47b6 | ||
|
|
d14ab658df | ||
|
|
c7b5d0b6e3 | ||
|
|
21b62c5777 | ||
|
|
f06fb13014 | ||
|
|
59b517a4a4 | ||
|
|
efee81b7db | ||
|
|
bd30aa03b9 | ||
|
|
49a0ab8640 | ||
|
|
6e1ed534ce | ||
|
|
2ea66c3350 | ||
|
|
a3ba1f24f8 | ||
|
|
2e05e0f178 | ||
|
|
fbd4ce2399 | ||
|
|
6cde8347be | ||
|
|
645718cf77 | ||
|
|
a956dfd37d | ||
|
|
682e4b9685 | ||
|
|
69b0eccb15 | ||
|
|
03e14c609f | ||
|
|
782b7fc95d | ||
|
|
55817544c2 | ||
|
|
0bb27beb88 | ||
|
|
dbec07d9f5 | ||
|
|
80711ea630 | ||
|
|
c744410fe1 | ||
|
|
e706cc5b8b | ||
|
|
7ed7b06696 | ||
|
|
be9b795a16 | ||
|
|
0264736ed3 | ||
|
|
a8a1216363 | ||
|
|
fb3bd3571e | ||
|
|
d2bc41e99b | ||
|
|
0a92f2cdb2 | ||
|
|
870eb14ec2 | ||
|
|
1e905cba3d | ||
|
|
0e4e79f464 | ||
|
|
a2a1479a88 | ||
|
|
51b3f7093a | ||
|
|
249f37af52 | ||
|
|
63b3669a87 | ||
|
|
9814e81b4b | ||
|
|
c21ad49c38 | ||
|
|
d69073c329 | ||
|
|
8b5b424e8c | ||
|
|
1b745f81ed | ||
|
|
fa7eb0befb | ||
|
|
10c90309a8 | ||
|
|
062e3823c3 | ||
|
|
7b4a19da9d | ||
|
|
8c95d1044e | ||
|
|
9a1ab67df9 | ||
|
|
9921615af2 | ||
|
|
8ea0b8c6dc | ||
|
|
d9864be29e | ||
|
|
28008528b4 | ||
|
|
1ad4556268 | ||
|
|
35ba62b1a0 | ||
|
|
ec24dccc29 | ||
|
|
1fda040670 | ||
|
|
9bc3ffd98f | ||
|
|
af8944c7b6 | ||
|
|
3856ea92ce | ||
|
|
91faf24015 | ||
|
|
28ab0d11de | ||
|
|
5358cc5a36 | ||
|
|
775f2354fa | ||
|
|
9c49b73ade | ||
|
|
d2a4b51e1e | ||
|
|
e608aad744 | ||
|
|
10d2f75572 | ||
|
|
a22ed58dc4 | ||
|
|
4cb640737e | ||
|
|
86c7c7db2e | ||
|
|
21acee15fe | ||
|
|
eef47fe34c | ||
|
|
92dd81bb5d | ||
|
|
b42cfeba49 | ||
|
|
317f0522a8 | ||
|
|
b582ecada9 | ||
|
|
bae087d7eb | ||
|
|
f7067c69e9 | ||
|
|
7db28d5700 | ||
|
|
43da16bbd0 | ||
|
|
1de2627280 | ||
|
|
c183f419e7 | ||
|
|
20924d62f1 | ||
|
|
48051bc889 | ||
|
|
cb59839742 | ||
|
|
4a22178717 | ||
|
|
97bd52fb52 | ||
|
|
c61e28fe5a | ||
|
|
07e2b01a3c | ||
|
|
41454f823d | ||
|
|
1a4ccf65b7 | ||
|
|
98a1a31641 | ||
|
|
dde868d297 | ||
|
|
3b80edbd7c | ||
|
|
7be8dc32af | ||
|
|
abd9f0f365 | ||
|
|
b8ee8b99cf | ||
|
|
45cfc79fed | ||
|
|
015ac35cd1 | ||
|
|
d95f3a410f | ||
|
|
3a110bbf4d | ||
|
|
ac56a694f2 | ||
|
|
a3c3ef1572 | ||
|
|
b03769f26e | ||
|
|
1b53e54815 | ||
|
|
d22414e388 | ||
|
|
005ae90b67 | ||
|
|
39c7d33b4c | ||
|
|
61834f4fa1 | ||
|
|
d3248f0a0f | ||
|
|
7ee863c92f | ||
|
|
58a600aebf | ||
|
|
95a7b15efc | ||
|
|
ae5d163f7d | ||
|
|
8268a3f33b | ||
|
|
e4ab356031 | ||
|
|
762a4ec1f4 | ||
|
|
238d52c90f | ||
|
|
1e78a3473a | ||
|
|
3b0ec3ce63 | ||
|
|
d22f873ef2 | ||
|
|
ce201a7433 | ||
|
|
48a7e8cd02 | ||
|
|
feb71ef502 | ||
|
|
dc01d7e277 | ||
|
|
75a0c4fa2c | ||
|
|
60ffe1b0dc | ||
|
|
0b52794637 | ||
|
|
71e65516ae | ||
|
|
3f67752504 | ||
|
|
95a80d3fa9 | ||
|
|
5f72004d0d | ||
|
|
b0a8fa84e1 | ||
|
|
162f9b8f68 | ||
|
|
32e3edf229 | ||
|
|
f3a201f1e1 | ||
|
|
916a5c217d | ||
|
|
3141dfc26d | ||
|
|
14d6bcec3d | ||
|
|
6eb02be7db | ||
|
|
3da9d323fb | ||
|
|
c7324d3fa6 | ||
|
|
ae903ae468 | ||
|
|
3069260f07 | ||
|
|
1df0987271 | ||
|
|
ce9b23e8b9 | ||
|
|
3150c23b62 | ||
|
|
2d7037a945 | ||
|
|
7ed138a23e | ||
|
|
75540e118f | ||
|
|
49afe670d0 | ||
|
|
e2548f971c | ||
|
|
6983cfd1f4 | ||
|
|
2f570a0e97 | ||
|
|
edb21bef2c | ||
|
|
48e3c72dfe | ||
|
|
d7dd3c2356 | ||
|
|
61878ade62 | ||
|
|
3404ee671b | ||
|
|
21d95881ed |
@@ -0,0 +1,20 @@
|
||||
# Set the default behavior, in case people don't have core.autocrlf set.
|
||||
* text=auto
|
||||
|
||||
# Explicitly declare text files you want to always be normalized and converted
|
||||
# to native line endings on checkout.
|
||||
*.tex text
|
||||
*.bib text
|
||||
*.svg text
|
||||
*.py text
|
||||
*.vbs text
|
||||
*.cpp text
|
||||
*.hpp text
|
||||
Makefile text
|
||||
|
||||
# Declare files that will always have CRLF line endings on checkout.
|
||||
*.sln text eol=crlf
|
||||
|
||||
# Denote all files that are truly binary and should not be modified.
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
name: 🐛 Bug Report
|
||||
about: If something isn't working as expected
|
||||
title: ''
|
||||
labels: bug, pending verification
|
||||
assignees: ''
|
||||
@@ -8,10 +8,11 @@ assignees: ''
|
||||
---
|
||||
|
||||
#### Describe the bug
|
||||
<!-- A clear and concise description of what the bug is. -->
|
||||
|
||||
A clear and concise description of what the bug is.
|
||||
#### Platform
|
||||
<!-- Check all that apply (change to `[x]`) -->
|
||||
|
||||
#### Check all that apply (change to `[x]`)
|
||||
- [ ] Windows
|
||||
- [ ] macOS
|
||||
- [ ] Linux
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
name: Compilation issue
|
||||
name: 😱 Compilation issue
|
||||
about: Report a problem when compiling the code
|
||||
title: ''
|
||||
labels: 'compilation'
|
||||
@@ -7,11 +7,20 @@ assignees: ''
|
||||
|
||||
---
|
||||
|
||||
#### Describe your question
|
||||
#### Describe your issue
|
||||
<!-- Be sure to include any log file that may help use diagnose the issue -->
|
||||
|
||||
...
|
||||
|
||||
#### Check all that apply (change to `[x]`)
|
||||
#### Checklist
|
||||
<!-- Check all that apply (change to `[x]`) -->
|
||||
|
||||
- [ ] I have read the [bug report](https://libigl.github.io/bug-report/) page
|
||||
- [ ] CMake issue: I have tried with a fresh clone/empty build directory
|
||||
|
||||
#### Platform
|
||||
<!-- Check all that apply (change to `[x]`) -->
|
||||
|
||||
- [ ] Windows
|
||||
- [ ] macOS
|
||||
- [ ] macOS Intel
|
||||
- [ ] macOS Arm (e.g., M1, M2)
|
||||
- [ ] Linux
|
||||
|
||||
@@ -1 +1,8 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: 🚀 Feature Request
|
||||
url: https://github.com/libigl/libigl/discussions/new?category_id=32617689
|
||||
about: Share ideas for new features
|
||||
- name: ❓ Ask a Question
|
||||
url: https://github.com/libigl/libigl/discussions/new?category_id=32617688
|
||||
about: Ask the community for help
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: 'enhancement'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
#### Describe your feature request
|
||||
|
||||
...
|
||||
|
||||
#### Check all that apply (change to `[x]`)
|
||||
- [ ] Windows
|
||||
- [ ] macOS
|
||||
- [ ] Linux
|
||||
@@ -1,17 +0,0 @@
|
||||
---
|
||||
name: Question
|
||||
about: Ask question about the tutorial or documentation
|
||||
title: ''
|
||||
labels: 'question'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
#### Describe your question
|
||||
|
||||
...
|
||||
|
||||
#### Check all that apply (change to `[x]`)
|
||||
- [ ] Windows
|
||||
- [ ] macOS
|
||||
- [ ] Linux
|
||||
@@ -1,9 +1,11 @@
|
||||
Fixes # .
|
||||
|
||||
[Describe your changes and what you've already done to test it.]
|
||||
<!-- Describe your changes and what you've already done to test it. -->
|
||||
|
||||
|
||||
#### Check all that apply (change to `[x]`)
|
||||
#### Checklist
|
||||
<!-- Check all that apply (change to `[x]`) -->
|
||||
|
||||
- [ ] All changes meet [libigl style-guidelines](https://libigl.github.io/style-guidelines/).
|
||||
- [ ] Adds new .cpp file.
|
||||
- [ ] Adds corresponding unit test.
|
||||
|
||||
@@ -3,11 +3,11 @@ name: Build
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- main
|
||||
- stable
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- main
|
||||
- stable
|
||||
|
||||
env:
|
||||
@@ -20,21 +20,16 @@ jobs:
|
||||
####################
|
||||
|
||||
Unix:
|
||||
name: ${{ matrix.name }} (${{ matrix.config }}, ${{ matrix.static }})
|
||||
name: ${{ matrix.os }} ${{ fromJSON('["Header-Only", "Static"]')[matrix.build-params.static == 'ON'] }} ${{ matrix.build-params.tutorials == 'ON' && 'tutorial' || ''}} ${{ matrix.build-params.tests == 'ON' && 'tests' || ''}} ${{ matrix.config }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-18.04, macos-latest]
|
||||
os: [ubuntu-24.04, macos-latest]
|
||||
config: [Release]
|
||||
static: [ON, OFF]
|
||||
include:
|
||||
- os: macos-latest
|
||||
name: macOS
|
||||
- os: ubuntu-18.04
|
||||
name: Linux
|
||||
build-params: [ {static: ON, tutorials: ON, tests: ON }, {static: OFF, tutorials: OFF, tests: ON }, {static: OFF, tutorials: ON, tests: OFF }]
|
||||
env:
|
||||
LIBIGL_NUM_THREADS: 1 # See https://github.com/libigl/libigl/pull/996
|
||||
IGL_NUM_THREADS: 4 # don't go wild, but let the parallel_for tests do something
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v1
|
||||
@@ -44,27 +39,31 @@ jobs:
|
||||
- name: Dependencies (Linux)
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install \
|
||||
libblas-dev \
|
||||
libboost-filesystem-dev \
|
||||
libboost-system-dev \
|
||||
libboost-thread-dev \
|
||||
libglu1-mesa-dev \
|
||||
liblapack-dev \
|
||||
libmpfr-dev \
|
||||
xorg-dev \
|
||||
ccache
|
||||
libblas-dev \
|
||||
libglu1-mesa-dev \
|
||||
liblapack-dev \
|
||||
xorg-dev \
|
||||
ccache
|
||||
|
||||
- name: Dependencies (macOS)
|
||||
if: runner.os == 'macOS'
|
||||
run: brew install boost gmp mpfr ccache
|
||||
run: |
|
||||
HOMEBREW_NO_AUTO_UPDATE=1 brew install ccache
|
||||
|
||||
- name: Setup Xcode version
|
||||
if: runner.os == 'macOS'
|
||||
uses: maxim-lobanov/setup-xcode@v1
|
||||
with:
|
||||
xcode-version: '16.3.0'
|
||||
|
||||
- name: Cache Build
|
||||
id: cache-build
|
||||
uses: actions/cache@v1
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.ccache
|
||||
key: ${{ runner.os }}-${{ matrix.config }}-${{ matrix.static }}-cache
|
||||
key: ${{ runner.os }}-${{ matrix.config }}-${{ matrix.build-params.static }}-cache
|
||||
|
||||
- name: Prepare ccache
|
||||
run: |
|
||||
@@ -75,75 +74,104 @@ jobs:
|
||||
run: |
|
||||
mkdir -p build
|
||||
cd build
|
||||
# https://github.com/eclipse-ecal/ecal/issues/2041
|
||||
cmake .. \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_BUILD_TYPE=${{ matrix.config }} \
|
||||
-DLIBIGL_USE_STATIC_LIBRARY=${{ matrix.static }} \
|
||||
-DLIBIGL_WITH_CGAL=ON \
|
||||
-DLIBIGL_WITH_COMISO=ON
|
||||
-DLIBIGL_USE_STATIC_LIBRARY=${{ matrix.build-params.static }} \
|
||||
-DLIBIGL_BUILD_TUTORIALS=${{ matrix.build-params.tutorials }} \
|
||||
-DLIBIGL_GLFW_TESTS=OFF \
|
||||
-DLIBIGL_BUILD_TESTS=${{ matrix.build-params.tests }} \
|
||||
-DLIBIGL_COPYLEFT_CGAL=ON
|
||||
|
||||
- name: Build
|
||||
run: cd build; make -j2; ccache --show-stats
|
||||
|
||||
- name: Tests
|
||||
run: cd build; ctest --verbose
|
||||
run: cd build; ctest --show-only; ctest --verbose
|
||||
|
||||
####################
|
||||
# Windows
|
||||
####################
|
||||
|
||||
Windows:
|
||||
runs-on: windows-2019
|
||||
env:
|
||||
CC: cl.exe
|
||||
CXX: cl.exe
|
||||
name: Windows ${{ fromJSON('["Header-Only", "Static"]')[matrix.build-params.static == 'ON'] }} ${{ matrix.build-params.tutorials == 'ON' && 'tutorial' || ''}} ${{ matrix.build-params.selected_tutorial != 'NONE' && matrix.build-params.selected_tutorial || '' }} ${{ matrix.build-params.tests == 'ON' && 'tests' || ''}} ${{ matrix.config }}
|
||||
runs-on: windows-2022
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config: [Release]
|
||||
static: [ON, OFF]
|
||||
build-params: [
|
||||
{static: ON, tutorials: ON, tests: ON, selected_tutorial: NONE},
|
||||
{static: OFF, tutorials: OFF, tests: ON, selected_tutorial: NONE},
|
||||
{static: OFF, tutorials: ON, tests: OFF, selected_tutorial: 1},
|
||||
{static: OFF, tutorials: ON, tests: OFF, selected_tutorial: 2},
|
||||
{static: OFF, tutorials: ON, tests: OFF, selected_tutorial: 3},
|
||||
{static: OFF, tutorials: ON, tests: OFF, selected_tutorial: 4},
|
||||
{static: OFF, tutorials: ON, tests: OFF, selected_tutorial: 5},
|
||||
{static: OFF, tutorials: ON, tests: OFF, selected_tutorial: 6},
|
||||
{static: OFF, tutorials: ON, tests: OFF, selected_tutorial: 7},
|
||||
{static: OFF, tutorials: ON, tests: OFF, selected_tutorial: 8},
|
||||
{static: OFF, tutorials: ON, tests: OFF, selected_tutorial: 9},
|
||||
{static: OFF, tutorials: ON, tests: OFF, selected_tutorial: 10},
|
||||
]
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v1
|
||||
with:
|
||||
fetch-depth: 10
|
||||
- uses: seanmiddleditch/gha-setup-ninja@master
|
||||
|
||||
# https://github.com/actions/cache/issues/101
|
||||
- name: Set env
|
||||
- name: Install Ninja
|
||||
uses: seanmiddleditch/gha-setup-ninja@master
|
||||
|
||||
- name: Set env variable for sccache
|
||||
run: |
|
||||
echo "::set-env name=appdata::$($env:LOCALAPPDATA)"
|
||||
echo "::set-env name=BOOST_ROOT::$env:BOOST_ROOT_1_69_0"
|
||||
echo "appdata=$env:LOCALAPPDATA" >> ${env:GITHUB_ENV}
|
||||
|
||||
- name: Cache build
|
||||
id: cache-build
|
||||
uses: actions/cache@v1
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.appdata }}\Mozilla\sccache
|
||||
key: ${{ runner.os }}-${{ matrix.config }}-${{ matrix.static }}-cache
|
||||
key: ${{ runner.os }}-${{ matrix.config }}-${{ matrix.build-params.static }}-cache
|
||||
|
||||
- name: Prepare sccache
|
||||
run: |
|
||||
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
|
||||
iwr -useb 'https://raw.githubusercontent.com/scoopinstaller/install/master/install.ps1' -outfile 'install.ps1'
|
||||
.\install.ps1 -RunAsAdmin
|
||||
scoop install sccache --global
|
||||
# Scoop modifies the PATH so we make the modified PATH global.
|
||||
echo "::set-env name=PATH::$env:PATH"
|
||||
# Scoop modifies the PATH so we make it available for the next steps of the job
|
||||
echo "${env:PATH}" >> ${env:GITHUB_PATH}
|
||||
|
||||
# We run configure + build in the same step, since they both need to call VsDevCmd
|
||||
# Also, cmd uses ^ to break commands into multiple lines (in powershell this is `)
|
||||
- name: Configure and build
|
||||
shell: cmd
|
||||
run: |
|
||||
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=x64
|
||||
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=x64
|
||||
# https://github.com/eclipse-ecal/ecal/issues/2041
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 ^
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache ^
|
||||
-DCMAKE_BUILD_TYPE=${{ matrix.config }} ^
|
||||
-DLIBIGL_USE_STATIC_LIBRARY=${{ matrix.static }} ^
|
||||
-DLIBIGL_WITH_CGAL=ON ^
|
||||
-DLIBIGL_WITH_COMISO=OFF ^
|
||||
-DLIBIGL_USE_STATIC_LIBRARY=${{ matrix.build-params.static }} ^
|
||||
-DLIBIGL_COPYLEFT_CGAL=ON ^
|
||||
-DLIBIGL_BUILD_TUTORIALS=${{ matrix.build-params.tutorials }} ^
|
||||
-DLIBIGL_BUILD_TESTS=${{ matrix.build-params.tests }} ^
|
||||
-DLIBIGL_GLFW_TESTS=OFF ^
|
||||
-DLIBIGL_TUTORIALS_CHAPTER1=${{ (matrix.build-params.selected_tutorial == 'NONE' || matrix.build-params.selected_tutorial == '1') && 'ON' || 'OFF' }} ^
|
||||
-DLIBIGL_TUTORIALS_CHAPTER2=${{ (matrix.build-params.selected_tutorial == 'NONE' || matrix.build-params.selected_tutorial == '2') && 'ON' || 'OFF' }} ^
|
||||
-DLIBIGL_TUTORIALS_CHAPTER3=${{ (matrix.build-params.selected_tutorial == 'NONE' || matrix.build-params.selected_tutorial == '3') && 'ON' || 'OFF' }} ^
|
||||
-DLIBIGL_TUTORIALS_CHAPTER4=${{ (matrix.build-params.selected_tutorial == 'NONE' || matrix.build-params.selected_tutorial == '4') && 'ON' || 'OFF' }} ^
|
||||
-DLIBIGL_TUTORIALS_CHAPTER5=${{ (matrix.build-params.selected_tutorial == 'NONE' || matrix.build-params.selected_tutorial == '5') && 'ON' || 'OFF' }} ^
|
||||
-DLIBIGL_TUTORIALS_CHAPTER6=${{ (matrix.build-params.selected_tutorial == 'NONE' || matrix.build-params.selected_tutorial == '6') && 'ON' || 'OFF' }} ^
|
||||
-DLIBIGL_TUTORIALS_CHAPTER7=${{ (matrix.build-params.selected_tutorial == 'NONE' || matrix.build-params.selected_tutorial == '7') && 'ON' || 'OFF' }} ^
|
||||
-DLIBIGL_TUTORIALS_CHAPTER8=${{ (matrix.build-params.selected_tutorial == 'NONE' || matrix.build-params.selected_tutorial == '8') && 'ON' || 'OFF' }} ^
|
||||
-DLIBIGL_TUTORIALS_CHAPTER9=${{ (matrix.build-params.selected_tutorial == 'NONE' || matrix.build-params.selected_tutorial == '9') && 'ON' || 'OFF' }} ^
|
||||
-DLIBIGL_TUTORIALS_CHAPTER10=${{ (matrix.build-params.selected_tutorial == 'NONE' || matrix.build-params.selected_tutorial == '10') && 'ON' || 'OFF' }} ^
|
||||
-B build ^
|
||||
-S .
|
||||
cmake --build build
|
||||
cmake --build build -j2
|
||||
|
||||
- name: Tests
|
||||
run: cd build; ctest --verbose
|
||||
run: cd build; ctest --show-only; ctest --verbose -j2
|
||||
|
||||
|
||||
@@ -1,190 +0,0 @@
|
||||
name: Nightly
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 4 * * *'
|
||||
|
||||
env:
|
||||
CTEST_OUTPUT_ON_FAILURE: ON
|
||||
CTEST_PARALLEL_LEVEL: 2
|
||||
|
||||
jobs:
|
||||
####################
|
||||
# Linux / macOS
|
||||
####################
|
||||
|
||||
# Part of this file is inspired from
|
||||
# https://github.com/onqtam/doctest/blob/dev/.github/workflows/main.yml
|
||||
|
||||
Unix:
|
||||
name: ${{ matrix.name }} (${{ matrix.config }}, Static=${{ matrix.static }})
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
name: [
|
||||
ubuntu-18.04-gcc-7,
|
||||
ubuntu-18.04-gcc-8,
|
||||
ubuntu-18.04-gcc-9,
|
||||
ubuntu-18.04-clang-7,
|
||||
ubuntu-18.04-clang-8,
|
||||
ubuntu-18.04-clang-9,
|
||||
macOS-latest,
|
||||
]
|
||||
config: [Debug, Release]
|
||||
static: [ON, OFF]
|
||||
include:
|
||||
- name: ubuntu-18.04-gcc-7
|
||||
os: ubuntu-18.04
|
||||
compiler: gcc
|
||||
version: "7"
|
||||
|
||||
- name: ubuntu-18.04-gcc-8
|
||||
os: ubuntu-18.04
|
||||
compiler: gcc
|
||||
version: "8"
|
||||
|
||||
- name: ubuntu-18.04-gcc-9
|
||||
os: ubuntu-18.04
|
||||
compiler: gcc
|
||||
version: "9"
|
||||
|
||||
- name: ubuntu-18.04-clang-7
|
||||
os: ubuntu-18.04
|
||||
compiler: clang
|
||||
version: "7"
|
||||
|
||||
- name: ubuntu-18.04-clang-8
|
||||
os: ubuntu-18.04
|
||||
compiler: clang
|
||||
version: "8"
|
||||
|
||||
- name: ubuntu-18.04-clang-9
|
||||
os: ubuntu-18.04
|
||||
compiler: clang
|
||||
version: "9"
|
||||
|
||||
- name: macOS-latest
|
||||
os: macOS-latest
|
||||
|
||||
# Build tutorials for most configurations
|
||||
- tutorials: ON
|
||||
|
||||
# Except with Debug mode
|
||||
- config: Debug
|
||||
tutorials: OFF
|
||||
env:
|
||||
LIBIGL_NUM_THREADS: 1 # See https://github.com/libigl/libigl/pull/996
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v1
|
||||
with:
|
||||
fetch-depth: 10
|
||||
|
||||
- name: Dependencies (Linux)
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
# LLVM 9 is not in Bionic's repositories so we add the official LLVM repository.
|
||||
if [ "${{ matrix.compiler }}" = "clang" ] && [ "${{ matrix.version }}" = "9" ]; then
|
||||
sudo add-apt-repository "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-9 main"
|
||||
fi
|
||||
sudo apt-get update
|
||||
|
||||
if [ "${{ matrix.compiler }}" = "gcc" ]; then
|
||||
sudo apt-get install -y g++-${{ matrix.version }}
|
||||
echo "::set-env name=CC::gcc-${{ matrix.version }}"
|
||||
echo "::set-env name=CXX::g++-${{ matrix.version }}"
|
||||
else
|
||||
sudo apt-get install -y clang-${{ matrix.version }}
|
||||
echo "::set-env name=CC::clang-${{ matrix.version }}"
|
||||
echo "::set-env name=CXX::clang++-${{ matrix.version }}"
|
||||
fi
|
||||
|
||||
sudo apt-get install \
|
||||
libblas-dev \
|
||||
libboost-filesystem-dev \
|
||||
libboost-system-dev \
|
||||
libboost-thread-dev \
|
||||
libglu1-mesa-dev \
|
||||
liblapack-dev \
|
||||
libmpfr-dev \
|
||||
xorg-dev
|
||||
|
||||
- name: Dependencies (macOS)
|
||||
if: runner.os == 'macOS'
|
||||
run: brew install boost gmp mpfr
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake .. \
|
||||
-DCMAKE_BUILD_TYPE=${{ matrix.config }} \
|
||||
-DLIBIGL_USE_STATIC_LIBRARY=${{ matrix.static }} \
|
||||
-DLIBIGL_BUILD_TUTORIALS=${{ matrix.tutorials }} \
|
||||
-DLIBIGL_WITH_CGAL=ON \
|
||||
-DLIBIGL_WITH_COMISO=ON
|
||||
|
||||
- name: Free Disk Space
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
sudo swapoff -a
|
||||
sudo apt clean
|
||||
sudo rm -rf /swapfile /usr/share/dotnet /usr/local/lib/android /opt/ghc
|
||||
df -h
|
||||
|
||||
- name: Build
|
||||
run: cd build; make -j2
|
||||
|
||||
- name: Tests
|
||||
run: cd build; ctest --verbose
|
||||
|
||||
####################
|
||||
# Windows
|
||||
####################
|
||||
|
||||
Windows:
|
||||
name: Windows (${{ matrix.config }}, Static=${{ matrix.static }})
|
||||
runs-on: windows-2019
|
||||
env:
|
||||
CC: cl.exe
|
||||
CXX: cl.exe
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config: [Debug, Release]
|
||||
static: [ON, OFF]
|
||||
include:
|
||||
- config: Debug
|
||||
tutorials: OFF
|
||||
- config: Release
|
||||
tutorials: ON
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v1
|
||||
with:
|
||||
fetch-depth: 10
|
||||
- uses: seanmiddleditch/gha-setup-ninja@master
|
||||
|
||||
- name: Set env
|
||||
run: |
|
||||
echo "::set-env name=BOOST_ROOT::$env:BOOST_ROOT_1_69_0"
|
||||
|
||||
# We run configure + build in the same step, since they both need to call VsDevCmd
|
||||
# Also, cmd uses ^ to break commands into multiple lines (in powershell this is `)
|
||||
- name: Configure and build
|
||||
shell: cmd
|
||||
run: |
|
||||
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=x64
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_BUILD_TYPE=${{ matrix.config }} ^
|
||||
-DLIBIGL_USE_STATIC_LIBRARY=${{ matrix.static }} ^
|
||||
-DLIBIGL_BUILD_TUTORIALS=${{ matrix.tutorials }} ^
|
||||
-DLIBIGL_WITH_CGAL=ON ^
|
||||
-DLIBIGL_WITH_COMISO=OFF ^
|
||||
-B build ^
|
||||
-S .
|
||||
cmake --build build -j 2
|
||||
|
||||
- name: Tests
|
||||
run: cd build; ctest --verbose
|
||||
+50
-96
@@ -1,99 +1,53 @@
|
||||
# use glob syntax.
|
||||
*.a
|
||||
*.dylib
|
||||
*.egg-info/
|
||||
*.exe
|
||||
*.ilk
|
||||
*.log
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Compiled Object files
|
||||
*.slo
|
||||
*.lo
|
||||
*.o
|
||||
*.opensdf
|
||||
*.orig
|
||||
*.pdb
|
||||
*.psess
|
||||
*.pyc
|
||||
*.sdf
|
||||
*.obj
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Compiled Dynamic libraries
|
||||
*.so
|
||||
*.so.[0123456789]
|
||||
*.so.[0123456789].[0123456789]
|
||||
*.suo
|
||||
*.swo
|
||||
*.swp
|
||||
*.tlog
|
||||
*.user
|
||||
*.vsp
|
||||
*CMakeFiles*
|
||||
*buildXcode*
|
||||
*tags
|
||||
*~
|
||||
*.dylib
|
||||
*.dll
|
||||
|
||||
# Fortran module files
|
||||
*.mod
|
||||
*.smod
|
||||
|
||||
# Compiled Static libraries
|
||||
*.lai
|
||||
*.la
|
||||
*.a
|
||||
*.lib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
|
||||
# Build folders
|
||||
/build*
|
||||
/tests/data
|
||||
/tutorial/data
|
||||
/install
|
||||
|
||||
# Libigl specific
|
||||
LibiglOptions.cmake
|
||||
|
||||
# vim debris
|
||||
.*.un~
|
||||
.*.swo
|
||||
.*.swp
|
||||
|
||||
# macos debris
|
||||
.DS_Store
|
||||
.idea/
|
||||
.vs/
|
||||
.vscode/
|
||||
/external
|
||||
Debug/
|
||||
README.html
|
||||
Release/
|
||||
Untitled.ipynb
|
||||
build
|
||||
doc.html
|
||||
documentation/*.aux
|
||||
documentation/*.log
|
||||
documentation/*.out
|
||||
example
|
||||
example1
|
||||
example_header_only
|
||||
example_static
|
||||
examples/*/*.mexmaci64
|
||||
examples/*/*.rbr
|
||||
examples/bbw/bbw_demo
|
||||
examples/bbw/bbw_demo_selfcontained.zip
|
||||
examples/bbw/bbw_demo_selfcontained/*
|
||||
examples/bbw/examples/*-volume.dmat
|
||||
examples/bbw/examples/*-volume.mesh
|
||||
examples/principal_curvature/curvature
|
||||
examples/quicklook-mesh/Mesh.qlgenerator/*
|
||||
examples/upright/upright
|
||||
external/MeshFix/meshfix
|
||||
external/embree/build/*
|
||||
external/glew/build
|
||||
external/glfw/build
|
||||
external/libpng/build
|
||||
external/medit/rebar.rbr
|
||||
external/tetgen/tetgen
|
||||
external/tinyxml2/build
|
||||
external/tinyxml2/test
|
||||
external/tinyxml2/tinyxml2.pc
|
||||
external/yimg/showpng
|
||||
iglhelpers.pyc
|
||||
lib
|
||||
libigl.zip
|
||||
optional/build
|
||||
python/.idea
|
||||
python/.ipynb_checkpoints
|
||||
python/__pycache__
|
||||
python/build
|
||||
python/build2
|
||||
python/build3
|
||||
python/build4
|
||||
python/builddebug
|
||||
python/buildstatic
|
||||
python/py_igl/todo
|
||||
python/py_igl/todo
|
||||
python/scripts/generated
|
||||
scripts/change_name.sh
|
||||
site/
|
||||
syntax: glob
|
||||
tests/bin
|
||||
tests/build
|
||||
tests/data
|
||||
tutorial/*/*.mexmaci64
|
||||
tutorial/*/Makefile
|
||||
tutorial/*/build/*
|
||||
tutorial/.idea
|
||||
tutorial/XXX_test/CMakeLists.txt
|
||||
tutorial/XXX_test/main.cpp
|
||||
tutorial/build
|
||||
tutorial/cmake-build-debug
|
||||
tutorial/data
|
||||
tutorial/readme.html
|
||||
untitled
|
||||
*~
|
||||
dox/
|
||||
latex/
|
||||
scripts/
|
||||
|
||||
+167
-52
@@ -1,74 +1,189 @@
|
||||
cmake_minimum_required(VERSION 3.1)
|
||||
|
||||
# Toggles the use of the hunter package manager
|
||||
option(HUNTER_ENABLED "Enable Hunter package manager support" OFF)
|
||||
|
||||
include("cmake/HunterGate.cmake")
|
||||
HunterGate(
|
||||
URL "https://github.com/ruslo/hunter/archive/v0.23.171.tar.gz"
|
||||
SHA1 "5d68bcca78eee347239ca5f4d34f4b6c12683154"
|
||||
)
|
||||
|
||||
project(libigl)
|
||||
|
||||
# Detects whether this is a top-level project
|
||||
get_directory_property(LIBIGL_PARENT_DIR PARENT_DIRECTORY)
|
||||
if(NOT LIBIGL_PARENT_DIR)
|
||||
set(LIBIGL_TOPLEVEL_PROJECT ON)
|
||||
set(LIBIGL_TOPLEVEL_PROJECT ON)
|
||||
else()
|
||||
set(LIBIGL_TOPLEVEL_PROJECT OFF)
|
||||
set(LIBIGL_TOPLEVEL_PROJECT OFF)
|
||||
endif()
|
||||
|
||||
|
||||
|
||||
# Check required CMake version
|
||||
set(REQUIRED_CMAKE_VERSION "3.16.0")
|
||||
if(LIBIGL_TOPLEVEL_PROJECT)
|
||||
cmake_minimum_required(VERSION ${REQUIRED_CMAKE_VERSION})
|
||||
else()
|
||||
# Don't use cmake_minimum_required here to avoid implicitly overriding parent policies
|
||||
if(${CMAKE_VERSION} VERSION_LESS ${REQUIRED_CMAKE_VERSION})
|
||||
message(FATAL_ERROR "CMake required version to build Libigl is ${REQUIRED_CMAKE_VERSION}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Include user-provided default options if available. We do that before the main
|
||||
# `project()` so that we can define the C/C++ compilers from the option file.
|
||||
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/LibiglOptions.cmake)
|
||||
message(STATUS "Using local options file: ${CMAKE_CURRENT_SOURCE_DIR}/LibiglOptions.cmake")
|
||||
include(${CMAKE_CURRENT_SOURCE_DIR}/LibiglOptions.cmake)
|
||||
endif()
|
||||
|
||||
# If this option is enabled, this will setup the Hunter package manager.
|
||||
option(HUNTER_ENABLED "Enable Hunter package manager support" OFF)
|
||||
if(HUNTER_ENABLED)
|
||||
include("cmake/misc/HunterGate.cmake")
|
||||
HunterGate(
|
||||
URL "https://github.com/cpp-pm/hunter/archive/v0.24.8.tar.gz"
|
||||
SHA1 "ca7838dded9a1811b04ffd56175f629e0af82d3d"
|
||||
)
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
project(libigl VERSION 2.5.0)
|
||||
|
||||
# CMake module path
|
||||
list(PREPEND CMAKE_MODULE_PATH
|
||||
${CMAKE_CURRENT_LIST_DIR}/cmake/
|
||||
${CMAKE_CURRENT_LIST_DIR}/cmake/igl
|
||||
${CMAKE_CURRENT_LIST_DIR}/cmake/find
|
||||
${CMAKE_CURRENT_LIST_DIR}/cmake/recipes/external
|
||||
)
|
||||
|
||||
if(HUNTER_ENABLED)
|
||||
list(PREPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake/recipes/hunter)
|
||||
else()
|
||||
list(PREPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake/recipes/external)
|
||||
endif()
|
||||
|
||||
set_property(GLOBAL PROPERTY __igl_module_path ${CMAKE_MODULE_PATH})
|
||||
|
||||
set(LIBIGL_DEFAULT_CGAL ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
set(MATLAB_ADDITIONAL_VERSIONS
|
||||
"R2023b=10.4"
|
||||
"R2023a=10.4"
|
||||
"R2022b=10.3"
|
||||
"R2022a=10.2"
|
||||
"R2021b=10.1"
|
||||
"R2021a=10.0"
|
||||
)
|
||||
set(LIBIGL_DEFAULT_MATLAB ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
set(LIBIGL_DEFAULT_MOSEK ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
if(LIBIGL_TOPLEVEL_PROJECT)
|
||||
find_package(Matlab QUIET)
|
||||
if(NOT Matlab_FOUND)
|
||||
set(LIBIGL_DEFAULT_MATLAB OFF)
|
||||
message(WARNING "Matlab not found, disabling igl_restricted::matlab module.")
|
||||
endif()
|
||||
find_package(MOSEK QUIET)
|
||||
if(NOT MOSEK_FOUND)
|
||||
set(LIBIGL_DEFAULT_MOSEK OFF)
|
||||
message(WARNING "Mosek not found, disabling igl_restricted::mosek module.")
|
||||
endif()
|
||||
endif()
|
||||
set(LIBIGL_DEFAULT_COMISO ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
if(LIBIGL_TOPLEVEL_PROJECT AND (NOT APPLE) AND UNIX)
|
||||
find_package(BLAS QUIET)
|
||||
if(NOT BLAS_FOUND)
|
||||
set(LIBIGL_DEFAULT_COMISO OFF)
|
||||
message(WARNING "BLAS not found, disabling igl_copyleft::comiso module.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Build tests and tutorials
|
||||
option(LIBIGL_BUILD_TESTS "Build libigl unit test" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_BUILD_TUTORIALS "Build libigl tutorial" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_EXPORT_TARGETS "Export libigl CMake targets" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_BUILD_TESTS "Build libigl unit test" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_BUILD_TUTORIALS "Build libigl tutorial" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_INSTALL "Enable installation of libigl targets" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
|
||||
# USE_STATIC_LIBRARY speeds up the generation of multiple binaries,
|
||||
# at the cost of a longer initial compilation time
|
||||
# (by default, static build is off since libigl is a header-only library)
|
||||
option(LIBIGL_USE_STATIC_LIBRARY "Use libigl as static library" ON)
|
||||
option(LIBIGL_USE_STATIC_LIBRARY "Use libigl as static library" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
|
||||
# All dependencies that are downloaded as cmake projects and tested on the auto-builds are ON
|
||||
# (by default, all build options are off)
|
||||
option(LIBIGL_WITH_COMISO "Use CoMiso" ON)
|
||||
option(LIBIGL_WITH_EMBREE "Use Embree" ON)
|
||||
option(LIBIGL_WITH_OPENGL "Use OpenGL" ON)
|
||||
option(LIBIGL_WITH_OPENGL_GLFW "Use GLFW" ON)
|
||||
option(LIBIGL_WITH_OPENGL_GLFW_IMGUI "Use ImGui" ON)
|
||||
option(LIBIGL_WITH_PNG "Use PNG" ON)
|
||||
option(LIBIGL_WITH_TETGEN "Use Tetgen" ON)
|
||||
option(LIBIGL_WITH_TRIANGLE "Use Triangle" ON)
|
||||
option(LIBIGL_WITH_PREDICATES "Use exact predicates" ON)
|
||||
option(LIBIGL_WITH_XML "Use XML" ON)
|
||||
option(LIBIGL_WITH_PYTHON "Use Python" OFF)
|
||||
### End
|
||||
# Permissive modules. These modules are available under MPL2 license, and their dependencies are available
|
||||
# under a permissive or public domain license.
|
||||
option(LIBIGL_EMBREE "Build target igl::embree" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_GLFW "Build target igl::glfw" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_IMGUI "Build target igl::imgui" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_OPENGL "Build target igl::opengl" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_STB "Build target igl::stb" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_PREDICATES "Build target igl::predicates" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_SPECTRA "Build target igl::spectra" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_XML "Build target igl::xml" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
|
||||
if(${LIBIGL_WITH_PYTHON})
|
||||
message(FATAL_ERROR "Python binding are in the process of being redone. Please use the master branch or refer to https://github.com/geometryprocessing/libigl-python-bindings for the developement version or https://anaconda.org/conda-forge/igl for the stable version.")
|
||||
# Copyleft modules. These modules are available under GPL license, and their dependencies are
|
||||
# available under a copyleft license.
|
||||
option(LIBIGL_COPYLEFT_CORE "Build target igl_copyleft::core" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_COPYLEFT_CGAL "Build target igl_copyleft::cgal" ${LIBIGL_DEFAULT_CGAL})
|
||||
option(LIBIGL_COPYLEFT_COMISO "Build target igl_copyleft::comiso" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
option(LIBIGL_COPYLEFT_TETGEN "Build target igl_copyleft::tetgen" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
|
||||
# Restricted modules. These modules are available under MPL2 license, but their dependencies are
|
||||
# only available under a non-commercial or proprietary license.
|
||||
option(LIBIGL_RESTRICTED_MATLAB "Build target igl_restricted::matlab" ${LIBIGL_DEFAULT_MATLAB})
|
||||
option(LIBIGL_RESTRICTED_MOSEK "Build target igl_restricted::mosek" ${LIBIGL_DEFAULT_MOSEK})
|
||||
option(LIBIGL_RESTRICTED_TRIANGLE "Build target igl_restricted::triangle" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
|
||||
# GLFW doesn't run on headless CI machines so don't run (or build them).
|
||||
# Unfortunately on headless mac machines glfw seems to hang rather than crash
|
||||
# making it hard to catch at runtime.
|
||||
option(LIBIGL_GLFW_TESTS "Build igl::glfw tests" ${LIBIGL_TOPLEVEL_PROJECT})
|
||||
|
||||
option(LIBIGL_WARNINGS_AS_ERRORS "Turn on many warnings and treat as errors" OFF)
|
||||
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
|
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
|
||||
|
||||
|
||||
# Include CMake helper functions
|
||||
include(igl_add_library)
|
||||
include(igl_add_test)
|
||||
include(igl_add_tutorial)
|
||||
include(igl_copy_dll)
|
||||
include(igl_include)
|
||||
include(igl_install)
|
||||
include(igl_target_sources)
|
||||
|
||||
# Enable unit testing at the root level
|
||||
if(LIBIGL_BUILD_TESTS)
|
||||
include(CTest)
|
||||
endif()
|
||||
|
||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
|
||||
### conditionally compile certain modules depending on libraries found on the system
|
||||
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake)
|
||||
|
||||
### Adding libIGL: choose the path to your local copy libIGL
|
||||
# Defines CMake targets for selected libigl modules
|
||||
include(libigl)
|
||||
|
||||
if(LIBIGL_BUILD_TUTORIALS)
|
||||
add_subdirectory(tutorial)
|
||||
add_subdirectory(tutorial)
|
||||
endif()
|
||||
|
||||
if(LIBIGL_BUILD_TESTS)
|
||||
include(CTest)
|
||||
enable_testing()
|
||||
add_subdirectory(tests)
|
||||
################################################################################
|
||||
# Install CMake config files
|
||||
################################################################################
|
||||
|
||||
if(LIBIGL_INSTALL)
|
||||
include(GNUInstallDirs)
|
||||
set(project_config_in "${PROJECT_SOURCE_DIR}/cmake/igl/libigl-config.cmake.in")
|
||||
set(project_config_out "${CMAKE_CURRENT_BINARY_DIR}/libigl-config.cmake")
|
||||
set(config_targets_base "LibiglConfigTargets")
|
||||
set(version_config_file "${CMAKE_CURRENT_BINARY_DIR}/LibiglConfigVersion.cmake")
|
||||
set(export_dest_dir "${CMAKE_INSTALL_LIBDIR}/cmake/igl")
|
||||
|
||||
foreach(suffix IN ITEMS "") #"_restricted" "_copyleft")
|
||||
install(EXPORT LibiglTargets${suffix}
|
||||
DESTINATION ${export_dest_dir}
|
||||
NAMESPACE igl${suffix}::
|
||||
FILE ${config_targets_base}${suffix}.cmake
|
||||
COMPONENT LibiglDevelopment
|
||||
)
|
||||
endforeach()
|
||||
|
||||
include(CMakePackageConfigHelpers)
|
||||
configure_package_config_file(
|
||||
"${project_config_in}"
|
||||
"${project_config_out}"
|
||||
INSTALL_DESTINATION
|
||||
${CMAKE_INSTALL_DATAROOTDIR}/libigl/cmake
|
||||
)
|
||||
|
||||
write_basic_package_version_file("${version_config_file}" COMPATIBILITY SameMajorVersion)
|
||||
install(FILES "${project_config_out}" "${version_config_file}" DESTINATION "${export_dest_dir}")
|
||||
endif()
|
||||
|
||||
if(LIBIGL_TOPLEVEL_PROJECT)
|
||||
# Set folders for Visual Studio/Xcode
|
||||
igl_set_folders()
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
# If you are cloning and compiling the libigl repository as a standalone, you
|
||||
# can use this file as a convenience to set default CMake options. Simply copy
|
||||
# this file and remove the '.sample' suffix. Then, uncomment the relevant
|
||||
# options as desired. Note that this file is included before `project(Libigl)`
|
||||
# is defined, so we can use it to define the C and C++ compilers, but some
|
||||
# variables such as PROJECT_SOURCE_DIR will not be defined yet. You can use
|
||||
# CMAKE_SOURCE_DIR instead.
|
||||
#
|
||||
# If you are using libigl as a subproject (e.g. see the libigl-example-project
|
||||
# template), then you do NOT need to use this file. Simply set your preferred
|
||||
# CMake options in the parent project, # before including libigl.
|
||||
|
||||
################################################################################
|
||||
# CMake Options
|
||||
################################################################################
|
||||
|
||||
# Specify a custom install prefix path
|
||||
# set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE STRING "Install directory used by install().")
|
||||
|
||||
# Generates a `compile_commands.json` that can be used for autocompletion
|
||||
# set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE BOOL "Enable/Disable output of compile commands during generation.")
|
||||
|
||||
# Use ccache to speed up compilation of repeated builds
|
||||
# find_program(CCACHE_PROGRAM ccache)
|
||||
# if(CCACHE_PROGRAM)
|
||||
# message(STATUS "Enabling Ccache support")
|
||||
# set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PROGRAM} CACHE STRING "")
|
||||
# set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM} CACHE STRING "")
|
||||
# endif()
|
||||
|
||||
# Use a specific C/C++ compiler, e.g. llvm-clang on macOS (so we can use clangd)
|
||||
# set(CMAKE_C_COMPILER "/usr/bin/clang" CACHE STRING "C compiler")
|
||||
# set(CMAKE_CXX_COMPILER "/usr/bin/clang++" CACHE STRING "C++ compiler")
|
||||
|
||||
# Set deployment platform for macOS
|
||||
# set(CMAKE_OSX_DEPLOYMENT_TARGET 10.12 CACHE STRING "macOS deployment target")
|
||||
|
||||
# Always add colored output (e.g. when using Ninja)
|
||||
# add_compile_options(-fdiagnostics-color=always) # GCC
|
||||
# add_compile_options(-fcolor-diagnostics) # Clang
|
||||
|
||||
# add_compile_options(-ftime-trace) # Clang
|
||||
|
||||
################################################################################
|
||||
# Libigl Options
|
||||
################################################################################
|
||||
|
||||
# Build options
|
||||
# option(LIBIGL_BUILD_TESTS "Build libigl unit test" OFF)
|
||||
# option(LIBIGL_BUILD_TUTORIALS "Build libigl tutorial" OFF)
|
||||
# option(LIBIGL_INSTALL "Enable installation of libigl targets" OFF)
|
||||
# option(LIBIGL_USE_STATIC_LIBRARY "Use libigl as static library" OFF)
|
||||
|
||||
# Module options
|
||||
# option(LIBIGL_EMBREE "Build target igl::embree" ON)
|
||||
# option(LIBIGL_GLFW "Build target igl::glfw" ON)
|
||||
# option(LIBIGL_IMGUI "Build target igl::imgui" ON)
|
||||
# option(LIBIGL_OPENGL "Build target igl::opengl" ON)
|
||||
# option(LIBIGL_STB "Build target igl::stb" ON)
|
||||
# option(LIBIGL_PREDICATES "Build target igl::predicates" ON)
|
||||
# option(LIBIGL_XML "Build target igl::xml" ON)
|
||||
# option(LIBIGL_COPYLEFT_CGAL "Build target igl_copyleft::cgal" ON)
|
||||
# option(LIBIGL_COPYLEFT_COMISO "Build target igl_copyleft::comiso" ON)
|
||||
# option(LIBIGL_COPYLEFT_CORE "Build target igl_copyleft::core" ON)
|
||||
# option(LIBIGL_COPYLEFT_CORK "Build target igl_copyleft::cork" ON)
|
||||
# option(LIBIGL_COPYLEFT_TETGEN "Build target igl_copyleft::tetgen" ON)
|
||||
# option(LIBIGL_RESTRICTED_MATLAB "Build target igl_restricted::matlab" ON)
|
||||
# option(LIBIGL_RESTRICTED_MOSEK "Build target igl_restricted::mosek" ON)
|
||||
# option(LIBIGL_RESTRICTED_TRIANGLE "Build target igl_restricted::triangle" ON)
|
||||
|
||||
################################################################################
|
||||
# FetchContent Options
|
||||
################################################################################
|
||||
|
||||
# option(FETCHCONTENT_FULLY_DISCONNECTED "Disables all attempts to download or update content and assumes source dirs already exist" ON)
|
||||
# option(FETCHCONTENT_UPDATES_DISCONNECTED "Enables UPDATE_DISCONNECTED behavior for all content population" ON)
|
||||
# option(FETCHCONTENT_QUIET "Enables QUIET option for all content population" ON)
|
||||
# set(FETCHCONTENT_BASE_DIR "${CMAKE_SOURCE_DIR}/external" CACHE PATH "Directory under which to collect all populated content")
|
||||
@@ -1,7 +1,13 @@
|
||||
# libigl - A simple C++ geometry processing library
|
||||
[](https://github.com/libigl/libigl/actions)
|
||||
|
||||
[](https://github.com/libigl/libigl/actions?query=workflow%3ABuild+branch%3Amain+event%3Apush)
|
||||
[](https://anaconda.org/conda-forge/igl)
|
||||
|
||||

|
||||
|
||||
Documentation, tutorial, and instructions at <https://libigl.github.io>.
|
||||
|
||||
|
||||
| 🆕 Doxygen Documentation |
|
||||
|:---|
|
||||
| The latest version of libigl (v2.5.0) introduces [doxygen generated detailed documentation](https://libigl.github.io/dox/index.html) |
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
################################################################################
|
||||
|
||||
if(NOT (${CMAKE_VERSION} VERSION_LESS "3.8.0"))
|
||||
# For CMake 3.8 and above, we can use meta features directly provided by CMake itself
|
||||
set(CXX11_FEATURES cxx_std_11)
|
||||
set(CXX14_FEATURES cxx_std_14)
|
||||
set(CXX17_FEATURES cxx_std_17)
|
||||
return()
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
|
||||
set(CXX11_FEATURES
|
||||
cxx_auto_type
|
||||
cxx_constexpr
|
||||
)
|
||||
|
||||
set(CXX14_FEATURES
|
||||
cxx_generic_lambdas
|
||||
)
|
||||
|
||||
set(CXX17_FEATURES
|
||||
|
||||
)
|
||||
|
||||
################################################################################
|
||||
|
||||
# https://cmake.org/cmake/help/v3.1/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html
|
||||
# cxx_aggregate_default_initializers Aggregate default initializers, as defined in N3605.
|
||||
# cxx_alias_templates Template aliases, as defined in N2258.
|
||||
# cxx_alignas Alignment control alignas, as defined in N2341.
|
||||
# cxx_alignof Alignment control alignof, as defined in N2341.
|
||||
# cxx_attributes Generic attributes, as defined in N2761.
|
||||
# cxx_attribute_deprecated deprecated]] attribute, as defined in N3760.
|
||||
# cxx_auto_type Automatic type deduction, as defined in N1984.
|
||||
# cxx_binary_literals Binary literals, as defined in N3472.
|
||||
# cxx_constexpr Constant expressions, as defined in N2235.
|
||||
# cxx_contextual_conversions Contextual conversions, as defined in N3323.
|
||||
# cxx_decltype_incomplete_return_types Decltype on incomplete return types, as defined in N3276.
|
||||
# cxx_decltype Decltype, as defined in N2343.
|
||||
# cxx_decltype_auto decltype(auto) semantics, as defined in N3638.
|
||||
# cxx_default_function_template_args Default template arguments for function templates, as defined in DR226
|
||||
# cxx_defaulted_functions Defaulted functions, as defined in N2346.
|
||||
# cxx_defaulted_move_initializers Defaulted move initializers, as defined in N3053.
|
||||
# cxx_delegating_constructors Delegating constructors, as defined in N1986.
|
||||
# cxx_deleted_functions Deleted functions, as defined in N2346.
|
||||
# cxx_digit_separators Digit separators, as defined in N3781.
|
||||
# cxx_enum_forward_declarations Enum forward declarations, as defined in N2764.
|
||||
# cxx_explicit_conversions Explicit conversion operators, as defined in N2437.
|
||||
# cxx_extended_friend_declarations Extended friend declarations, as defined in N1791.
|
||||
# cxx_extern_templates Extern templates, as defined in N1987.
|
||||
# cxx_final Override control final keyword, as defined in N2928, N3206 and N3272.
|
||||
# cxx_func_identifier Predefined __func__ identifier, as defined in N2340.
|
||||
# cxx_generalized_initializers Initializer lists, as defined in N2672.
|
||||
# cxx_generic_lambdas Generic lambdas, as defined in N3649.
|
||||
# cxx_inheriting_constructors Inheriting constructors, as defined in N2540.
|
||||
# cxx_inline_namespaces Inline namespaces, as defined in N2535.
|
||||
# cxx_lambdas Lambda functions, as defined in N2927.
|
||||
# cxx_lambda_init_captures Initialized lambda captures, as defined in N3648.
|
||||
# cxx_local_type_template_args Local and unnamed types as template arguments, as defined in N2657.
|
||||
# cxx_long_long_type long long type, as defined in N1811.
|
||||
# cxx_noexcept Exception specifications, as defined in N3050.
|
||||
# cxx_nonstatic_member_init Non-static data member initialization, as defined in N2756.
|
||||
# cxx_nullptr Null pointer, as defined in N2431.
|
||||
# cxx_override Override control override keyword, as defined in N2928, N3206 and N3272.
|
||||
# cxx_range_for Range-based for, as defined in N2930.
|
||||
# cxx_raw_string_literals Raw string literals, as defined in N2442.
|
||||
# cxx_reference_qualified_functions Reference qualified functions, as defined in N2439.
|
||||
# cxx_relaxed_constexpr Relaxed constexpr, as defined in N3652.
|
||||
# cxx_return_type_deduction Return type deduction on normal functions, as defined in N3386.
|
||||
# cxx_right_angle_brackets Right angle bracket parsing, as defined in N1757.
|
||||
# cxx_rvalue_references R-value references, as defined in N2118.
|
||||
# cxx_sizeof_member Size of non-static data members, as defined in N2253.
|
||||
# cxx_static_assert Static assert, as defined in N1720.
|
||||
# cxx_strong_enums Strongly typed enums, as defined in N2347.
|
||||
# cxx_thread_local Thread-local variables, as defined in N2659.
|
||||
# cxx_trailing_return_types Automatic function return type, as defined in N2541.
|
||||
# cxx_unicode_literals Unicode string literals, as defined in N2442.
|
||||
# cxx_uniform_initialization Uniform initialization, as defined in N2640.
|
||||
# cxx_unrestricted_unions Unrestricted unions, as defined in N2544.
|
||||
# cxx_user_literals User-defined literals, as defined in N2765.
|
||||
# cxx_variable_templates Variable templates, as defined in N3651.
|
||||
# cxx_variadic_macros Variadic macros, as defined in N1653.
|
||||
# cxx_variadic_templates Variadic templates, as defined in N2242.
|
||||
# cxx_template_template_parameters Template template parameters, as defined in ISO/IEC 14882:1998.
|
||||
@@ -1,17 +0,0 @@
|
||||
# Distributed under the OSI-approved MIT License. See accompanying
|
||||
# file LICENSE or https://github.com/Crascit/DownloadProject for details.
|
||||
|
||||
cmake_minimum_required(VERSION 2.8.2)
|
||||
|
||||
project(${DL_ARGS_PROJ}-download NONE)
|
||||
|
||||
include(ExternalProject)
|
||||
ExternalProject_Add(${DL_ARGS_PROJ}-download
|
||||
${DL_ARGS_UNPARSED_ARGUMENTS}
|
||||
SOURCE_DIR "${DL_ARGS_SOURCE_DIR}"
|
||||
BINARY_DIR "${DL_ARGS_BINARY_DIR}"
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND ""
|
||||
INSTALL_COMMAND ""
|
||||
TEST_COMMAND ""
|
||||
)
|
||||
@@ -1,182 +0,0 @@
|
||||
# Distributed under the OSI-approved MIT License. See accompanying
|
||||
# file LICENSE or https://github.com/Crascit/DownloadProject for details.
|
||||
#
|
||||
# MODULE: DownloadProject
|
||||
#
|
||||
# PROVIDES:
|
||||
# download_project( PROJ projectName
|
||||
# [PREFIX prefixDir]
|
||||
# [DOWNLOAD_DIR downloadDir]
|
||||
# [SOURCE_DIR srcDir]
|
||||
# [BINARY_DIR binDir]
|
||||
# [QUIET]
|
||||
# ...
|
||||
# )
|
||||
#
|
||||
# Provides the ability to download and unpack a tarball, zip file, git repository,
|
||||
# etc. at configure time (i.e. when the cmake command is run). How the downloaded
|
||||
# and unpacked contents are used is up to the caller, but the motivating case is
|
||||
# to download source code which can then be included directly in the build with
|
||||
# add_subdirectory() after the call to download_project(). Source and build
|
||||
# directories are set up with this in mind.
|
||||
#
|
||||
# The PROJ argument is required. The projectName value will be used to construct
|
||||
# the following variables upon exit (obviously replace projectName with its actual
|
||||
# value):
|
||||
#
|
||||
# projectName_SOURCE_DIR
|
||||
# projectName_BINARY_DIR
|
||||
#
|
||||
# The SOURCE_DIR and BINARY_DIR arguments are optional and would not typically
|
||||
# need to be provided. They can be specified if you want the downloaded source
|
||||
# and build directories to be located in a specific place. The contents of
|
||||
# projectName_SOURCE_DIR and projectName_BINARY_DIR will be populated with the
|
||||
# locations used whether you provide SOURCE_DIR/BINARY_DIR or not.
|
||||
#
|
||||
# The DOWNLOAD_DIR argument does not normally need to be set. It controls the
|
||||
# location of the temporary CMake build used to perform the download.
|
||||
#
|
||||
# The PREFIX argument can be provided to change the base location of the default
|
||||
# values of DOWNLOAD_DIR, SOURCE_DIR and BINARY_DIR. If all of those three arguments
|
||||
# are provided, then PREFIX will have no effect. The default value for PREFIX is
|
||||
# CMAKE_BINARY_DIR.
|
||||
#
|
||||
# The QUIET option can be given if you do not want to show the output associated
|
||||
# with downloading the specified project.
|
||||
#
|
||||
# In addition to the above, any other options are passed through unmodified to
|
||||
# ExternalProject_Add() to perform the actual download, patch and update steps.
|
||||
# The following ExternalProject_Add() options are explicitly prohibited (they
|
||||
# are reserved for use by the download_project() command):
|
||||
#
|
||||
# CONFIGURE_COMMAND
|
||||
# BUILD_COMMAND
|
||||
# INSTALL_COMMAND
|
||||
# TEST_COMMAND
|
||||
#
|
||||
# Only those ExternalProject_Add() arguments which relate to downloading, patching
|
||||
# and updating of the project sources are intended to be used. Also note that at
|
||||
# least one set of download-related arguments are required.
|
||||
#
|
||||
# If using CMake 3.2 or later, the UPDATE_DISCONNECTED option can be used to
|
||||
# prevent a check at the remote end for changes every time CMake is run
|
||||
# after the first successful download. See the documentation of the ExternalProject
|
||||
# module for more information. It is likely you will want to use this option if it
|
||||
# is available to you. Note, however, that the ExternalProject implementation contains
|
||||
# bugs which result in incorrect handling of the UPDATE_DISCONNECTED option when
|
||||
# using the URL download method or when specifying a SOURCE_DIR with no download
|
||||
# method. Fixes for these have been created, the last of which is scheduled for
|
||||
# inclusion in CMake 3.8.0. Details can be found here:
|
||||
#
|
||||
# https://gitlab.kitware.com/cmake/cmake/commit/bdca68388bd57f8302d3c1d83d691034b7ffa70c
|
||||
# https://gitlab.kitware.com/cmake/cmake/issues/16428
|
||||
#
|
||||
# If you experience build errors related to the update step, consider avoiding
|
||||
# the use of UPDATE_DISCONNECTED.
|
||||
#
|
||||
# EXAMPLE USAGE:
|
||||
#
|
||||
# include(DownloadProject)
|
||||
# download_project(PROJ googletest
|
||||
# GIT_REPOSITORY https://github.com/google/googletest.git
|
||||
# GIT_TAG master
|
||||
# UPDATE_DISCONNECTED 1
|
||||
# QUIET
|
||||
# )
|
||||
#
|
||||
# add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
|
||||
#
|
||||
#========================================================================================
|
||||
|
||||
|
||||
set(_DownloadProjectDir "${CMAKE_CURRENT_LIST_DIR}")
|
||||
|
||||
include(CMakeParseArguments)
|
||||
|
||||
function(download_project)
|
||||
|
||||
set(options QUIET)
|
||||
set(oneValueArgs
|
||||
PROJ
|
||||
PREFIX
|
||||
DOWNLOAD_DIR
|
||||
SOURCE_DIR
|
||||
BINARY_DIR
|
||||
# Prevent the following from being passed through
|
||||
CONFIGURE_COMMAND
|
||||
BUILD_COMMAND
|
||||
INSTALL_COMMAND
|
||||
TEST_COMMAND
|
||||
)
|
||||
set(multiValueArgs "")
|
||||
|
||||
cmake_parse_arguments(DL_ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||
|
||||
# Hide output if requested
|
||||
if (DL_ARGS_QUIET)
|
||||
set(OUTPUT_QUIET "OUTPUT_QUIET")
|
||||
else()
|
||||
unset(OUTPUT_QUIET)
|
||||
message(STATUS "Downloading/updating ${DL_ARGS_PROJ}")
|
||||
endif()
|
||||
|
||||
# Set up where we will put our temporary CMakeLists.txt file and also
|
||||
# the base point below which the default source and binary dirs will be.
|
||||
# The prefix must always be an absolute path.
|
||||
if (NOT DL_ARGS_PREFIX)
|
||||
set(DL_ARGS_PREFIX "${CMAKE_BINARY_DIR}")
|
||||
else()
|
||||
get_filename_component(DL_ARGS_PREFIX "${DL_ARGS_PREFIX}" ABSOLUTE
|
||||
BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
endif()
|
||||
if (NOT DL_ARGS_DOWNLOAD_DIR)
|
||||
set(DL_ARGS_DOWNLOAD_DIR "${DL_ARGS_PREFIX}/${DL_ARGS_PROJ}-download")
|
||||
endif()
|
||||
|
||||
# Ensure the caller can know where to find the source and build directories
|
||||
if (NOT DL_ARGS_SOURCE_DIR)
|
||||
set(DL_ARGS_SOURCE_DIR "${DL_ARGS_PREFIX}/${DL_ARGS_PROJ}-src")
|
||||
endif()
|
||||
if (NOT DL_ARGS_BINARY_DIR)
|
||||
set(DL_ARGS_BINARY_DIR "${DL_ARGS_PREFIX}/${DL_ARGS_PROJ}-build")
|
||||
endif()
|
||||
set(${DL_ARGS_PROJ}_SOURCE_DIR "${DL_ARGS_SOURCE_DIR}" PARENT_SCOPE)
|
||||
set(${DL_ARGS_PROJ}_BINARY_DIR "${DL_ARGS_BINARY_DIR}" PARENT_SCOPE)
|
||||
|
||||
# The way that CLion manages multiple configurations, it causes a copy of
|
||||
# the CMakeCache.txt to be copied across due to it not expecting there to
|
||||
# be a project within a project. This causes the hard-coded paths in the
|
||||
# cache to be copied and builds to fail. To mitigate this, we simply
|
||||
# remove the cache if it exists before we configure the new project. It
|
||||
# is safe to do so because it will be re-generated. Since this is only
|
||||
# executed at the configure step, it should not cause additional builds or
|
||||
# downloads.
|
||||
file(REMOVE "${DL_ARGS_DOWNLOAD_DIR}/CMakeCache.txt")
|
||||
|
||||
# Create and build a separate CMake project to carry out the download.
|
||||
# If we've already previously done these steps, they will not cause
|
||||
# anything to be updated, so extra rebuilds of the project won't occur.
|
||||
# Make sure to pass through CMAKE_MAKE_PROGRAM in case the main project
|
||||
# has this set to something not findable on the PATH.
|
||||
configure_file("${_DownloadProjectDir}/DownloadProject.CMakeLists.cmake.in"
|
||||
"${DL_ARGS_DOWNLOAD_DIR}/CMakeLists.txt")
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}"
|
||||
-D "CMAKE_MAKE_PROGRAM:FILE=${CMAKE_MAKE_PROGRAM}"
|
||||
.
|
||||
RESULT_VARIABLE result
|
||||
${OUTPUT_QUIET}
|
||||
WORKING_DIRECTORY "${DL_ARGS_DOWNLOAD_DIR}"
|
||||
)
|
||||
if(result)
|
||||
message(FATAL_ERROR "CMake step for ${DL_ARGS_PROJ} failed: ${result}")
|
||||
endif()
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} --build .
|
||||
RESULT_VARIABLE result
|
||||
${OUTPUT_QUIET}
|
||||
WORKING_DIRECTORY "${DL_ARGS_DOWNLOAD_DIR}"
|
||||
)
|
||||
if(result)
|
||||
message(FATAL_ERROR "Build step for ${DL_ARGS_PROJ} failed: ${result}")
|
||||
endif()
|
||||
|
||||
endfunction()
|
||||
@@ -1,52 +0,0 @@
|
||||
#
|
||||
# Try to find CORK library and include path.
|
||||
# Once done this will define
|
||||
#
|
||||
# CORK_FOUND
|
||||
# CORK_INCLUDE_DIR
|
||||
# CORK_LIBRARIES
|
||||
#
|
||||
|
||||
if(NOT CORK_FOUND)
|
||||
|
||||
FIND_PATH(CORK_INCLUDE_DIR cork.h
|
||||
PATHS
|
||||
${PROJECT_SOURCE_DIR}/../../external/cork/include
|
||||
${PROJECT_SOURCE_DIR}/../external/cork/include
|
||||
${PROJECT_SOURCE_DIR}/external/cork/include
|
||||
/usr/local/include
|
||||
/usr/X11/include
|
||||
/usr/include
|
||||
/opt/local/include
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
|
||||
FIND_LIBRARY( CORK_LIBRARIES NAMES cork
|
||||
PATHS
|
||||
${PROJECT_SOURCE_DIR}/../../external/cork/lib/
|
||||
${PROJECT_SOURCE_DIR}/../external/cork/lib/
|
||||
${PROJECT_SOURCE_DIR}/external/cork/lib/
|
||||
/usr/local
|
||||
/usr/X11
|
||||
/usr
|
||||
PATH_SUFFIXES
|
||||
a
|
||||
lib64
|
||||
lib
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
|
||||
SET(CORK_FOUND "NO")
|
||||
IF (CORK_INCLUDE_DIR AND CORK_LIBRARIES)
|
||||
SET(CORK_FOUND "YES")
|
||||
ENDIF (CORK_INCLUDE_DIR AND CORK_LIBRARIES)
|
||||
|
||||
if(CORK_FOUND)
|
||||
message(STATUS "Found CORK: ${CORK_INCLUDE_DIR}")
|
||||
else(CORK_FOUND)
|
||||
if (NOT CORK_FIND_QUIETLY)
|
||||
message(FATAL_ERROR "could NOT find CORK")
|
||||
endif (NOT CORK_FIND_QUIETLY)
|
||||
endif(CORK_FOUND)
|
||||
|
||||
endif(NOT CORK_FOUND)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,190 +0,0 @@
|
||||
################################################################################
|
||||
include(DownloadProject)
|
||||
|
||||
# With CMake 3.8 and above, we can hide warnings about git being in a
|
||||
# detached head by passing an extra GIT_CONFIG option.
|
||||
set(LIBIGL_EXTRA_OPTIONS TLS_VERIFY OFF)
|
||||
if(NOT (${CMAKE_VERSION} VERSION_LESS "3.8.0"))
|
||||
list(APPEND LIBIGL_EXTRA_OPTIONS GIT_CONFIG advice.detachedHead=false)
|
||||
endif()
|
||||
|
||||
# On CMake 3.6.3 and above, there is an option to use shallow clones of git repositories.
|
||||
# The shallow clone option only works with real tags, not SHA1, so we use a separate option.
|
||||
set(LIBIGL_BRANCH_OPTIONS)
|
||||
if(NOT (${CMAKE_VERSION} VERSION_LESS "3.6.3"))
|
||||
# Disabled for now until we can make sure that it has no adverse effects
|
||||
# (Downside is that the eigen mirror is huge again)
|
||||
# list(APPEND LIBIGL_BRANCH_OPTIONS GIT_SHALLOW 1)
|
||||
endif()
|
||||
|
||||
option(LIBIGL_SKIP_DOWNLOAD "Skip downloading external libraries" OFF)
|
||||
|
||||
# Shortcut functions
|
||||
function(igl_download_project_aux name source)
|
||||
if(NOT LIBIGL_SKIP_DOWNLOAD)
|
||||
download_project(
|
||||
PROJ ${name}
|
||||
SOURCE_DIR "${source}"
|
||||
DOWNLOAD_DIR "${LIBIGL_EXTERNAL}/.cache/${name}"
|
||||
QUIET
|
||||
${LIBIGL_EXTRA_OPTIONS}
|
||||
${ARGN}
|
||||
)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(igl_download_project name)
|
||||
igl_download_project_aux(${name} "${LIBIGL_EXTERNAL}/${name}" ${ARGN})
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
|
||||
## CGAL
|
||||
function(igl_download_cgal)
|
||||
igl_download_project(cgal
|
||||
GIT_REPOSITORY https://github.com/CGAL/cgal.git
|
||||
GIT_TAG f7c3c8212b56c0d6dae63787efc99093f4383415
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## CoMISo
|
||||
function(igl_download_comiso)
|
||||
igl_download_project(CoMISo
|
||||
GIT_REPOSITORY https://github.com/libigl/CoMISo.git
|
||||
GIT_TAG 1f9618cf9b7bd77370d817976470d59091928606
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## Cork
|
||||
function(igl_download_cork)
|
||||
igl_download_project(cork
|
||||
GIT_REPOSITORY https://github.com/libigl/cork.git
|
||||
GIT_TAG 27ad8a285838f5a480d856429e39d3d56d4338f9
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## Eigen
|
||||
set(LIBIGL_EIGEN_VERSION 3.3.7 CACHE STRING "Default version of Eigen used by libigl.")
|
||||
function(igl_download_eigen)
|
||||
igl_download_project(eigen
|
||||
GIT_REPOSITORY https://github.com/eigenteam/eigen-git-mirror.git
|
||||
GIT_TAG ${LIBIGL_EIGEN_VERSION}
|
||||
${LIBIGL_BRANCH_OPTIONS}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## Embree
|
||||
function(igl_download_embree)
|
||||
igl_download_project(embree
|
||||
GIT_REPOSITORY https://github.com/embree/embree.git
|
||||
GIT_TAG v3.5.2
|
||||
${LIBIGL_BRANCH_OPTIONS}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## glad
|
||||
function(igl_download_glad)
|
||||
igl_download_project(glad
|
||||
GIT_REPOSITORY https://github.com/libigl/libigl-glad.git
|
||||
GIT_TAG 09b4969c56779f7ddf8e6176ec1873184aec890f
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## GLFW
|
||||
function(igl_download_glfw)
|
||||
igl_download_project(glfw
|
||||
GIT_REPOSITORY https://github.com/glfw/glfw.git
|
||||
GIT_TAG 3.3
|
||||
${LIBIGL_BRANCH_OPTIONS}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## ImGui
|
||||
function(igl_download_imgui)
|
||||
igl_download_project(imgui
|
||||
GIT_REPOSITORY https://github.com/ocornut/imgui.git
|
||||
GIT_TAG v1.69
|
||||
${LIBIGL_BRANCH_OPTIONS}
|
||||
)
|
||||
igl_download_project(libigl-imgui
|
||||
GIT_REPOSITORY https://github.com/libigl/libigl-imgui.git
|
||||
GIT_TAG 07ecd3858acc71e70f0f9b2dea20a139bdddf8ae
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## pybind11
|
||||
function(igl_download_pybind11)
|
||||
igl_download_project(pybind11
|
||||
GIT_REPOSITORY https://github.com/pybind/pybind11.git
|
||||
GIT_TAG 2d0507db43cd5a117f7843e053b17dffca114107
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## stb_image
|
||||
function(igl_download_stb)
|
||||
igl_download_project(stb
|
||||
GIT_REPOSITORY https://github.com/libigl/libigl-stb.git
|
||||
GIT_TAG cd0fa3fcd90325c83be4d697b00214e029f94ca3
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## TetGen
|
||||
function(igl_download_tetgen)
|
||||
igl_download_project(tetgen
|
||||
GIT_REPOSITORY https://github.com/jdumas/tetgen.git
|
||||
GIT_TAG c63e7a6434652b8a2065c835bd9d6d298db1a0bc
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## TinyXML
|
||||
function(igl_download_tinyxml2)
|
||||
igl_download_project(tinyxml2
|
||||
GIT_REPOSITORY https://github.com/leethomason/tinyxml2.git
|
||||
GIT_TAG d175e9de0be0d4db75d0a8cf065599a435a87eb6
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## Triangle
|
||||
function(igl_download_triangle)
|
||||
igl_download_project(triangle
|
||||
GIT_REPOSITORY https://github.com/libigl/triangle.git
|
||||
GIT_TAG d284c4a843efac043c310f5fa640b17cf7d96170
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## Catch2
|
||||
function(igl_download_catch2)
|
||||
igl_download_project(catch2
|
||||
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
|
||||
GIT_TAG v2.11.0
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## Predicates
|
||||
function(igl_download_predicates)
|
||||
igl_download_project(predicates
|
||||
GIT_REPOSITORY https://github.com/libigl/libigl-predicates.git
|
||||
GIT_TAG 5a1d2194ec114bff51d5a33230586cafb83adc86
|
||||
)
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
|
||||
## Test data
|
||||
function(igl_download_test_data)
|
||||
igl_download_project_aux(test_data
|
||||
"${LIBIGL_EXTERNAL}/../tests/data"
|
||||
GIT_REPOSITORY https://github.com/libigl/libigl-tests-data
|
||||
GIT_TAG b5dddf45e329af685cd107e38770a28cfc18eb15
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## Tutorial data
|
||||
function(igl_download_tutorial_data)
|
||||
igl_download_project_aux(tutorial_data
|
||||
"${LIBIGL_EXTERNAL}/../tutorial/data"
|
||||
GIT_REPOSITORY https://github.com/libigl/libigl-tutorial-data
|
||||
GIT_TAG 5c6a1ea809c043d71e5595775709c15325a7158c
|
||||
)
|
||||
endfunction()
|
||||
|
||||
@@ -1,116 +0,0 @@
|
||||
# Sort projects inside the solution
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
function(igl_folder_targets FOLDER_NAME)
|
||||
foreach(target IN ITEMS ${ARGN})
|
||||
if(TARGET ${target})
|
||||
get_target_property(TYPE ${target} TYPE)
|
||||
if(NOT (TYPE STREQUAL "INTERFACE_LIBRARY"))
|
||||
set_target_properties(${target} PROPERTIES FOLDER "${FOLDER_NAME}")
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
endfunction()
|
||||
|
||||
function(igl_set_folders)
|
||||
|
||||
igl_folder_targets("ThirdParty/Embree"
|
||||
algorithms
|
||||
embree
|
||||
lexers
|
||||
math
|
||||
simd
|
||||
sys
|
||||
tasking
|
||||
)
|
||||
|
||||
igl_folder_targets("ThirdParty"
|
||||
CoMISo
|
||||
glad
|
||||
glfw
|
||||
imgui
|
||||
predicates
|
||||
tetgen
|
||||
tinyxml2
|
||||
triangle
|
||||
)
|
||||
|
||||
igl_folder_targets("Libigl"
|
||||
igl
|
||||
igl_comiso
|
||||
igl_embree
|
||||
igl_opengl
|
||||
igl_opengl_glfw
|
||||
igl_opengl_glfw_imgui
|
||||
igl_png
|
||||
igl_predicates
|
||||
igl_stb_image
|
||||
igl_tetgen
|
||||
igl_triangle
|
||||
igl_xml
|
||||
)
|
||||
|
||||
igl_folder_targets("Unit Tests"
|
||||
libigl_tests
|
||||
)
|
||||
|
||||
igl_folder_targets("Tutorials"
|
||||
101_FileIO_bin
|
||||
102_DrawMesh_bin
|
||||
103_Events_bin
|
||||
104_Colors_bin
|
||||
105_Overlays_bin
|
||||
106_ViewerMenu_bin
|
||||
107_MultipleMeshes_bin
|
||||
108_MultipleViews_bin
|
||||
201_Normals_bin
|
||||
202_GaussianCurvature_bin
|
||||
203_CurvatureDirections_bin
|
||||
204_Gradient_bin
|
||||
205_Laplacian_bin
|
||||
206_GeodesicDistance_bin
|
||||
301_Slice_bin
|
||||
302_Sort_bin
|
||||
303_LaplaceEquation_bin
|
||||
304_LinearEqualityConstraints_bin
|
||||
305_QuadraticProgramming_bin
|
||||
306_EigenDecomposition_bin
|
||||
401_BiharmonicDeformation_bin
|
||||
402_PolyharmonicDeformation_bin
|
||||
403_BoundedBiharmonicWeights_bin
|
||||
404_DualQuaternionSkinning_bin
|
||||
405_AsRigidAsPossible_bin
|
||||
406_FastAutomaticSkinningTransformations_bin
|
||||
407_BiharmonicCoordinates_bin
|
||||
501_HarmonicParam_bin
|
||||
502_LSCMParam_bin
|
||||
503_ARAPParam_bin
|
||||
504_NRosyDesign_bin
|
||||
505_MIQ_bin
|
||||
506_FrameField_bin
|
||||
507_Planarization_bin
|
||||
601_Serialization_bin
|
||||
604_Triangle_bin
|
||||
605_Tetgen_bin
|
||||
606_AmbientOcclusion_bin
|
||||
607_ScreenCapture_bin
|
||||
701_Statistics_bin
|
||||
702_WindingNumber_bin
|
||||
703_Decimation_bin
|
||||
704_SignedDistance_bin
|
||||
705_MarchingCubes_bin
|
||||
706_FacetOrientation_bin
|
||||
707_SweptVolume_bin
|
||||
708_Picking_bin
|
||||
709_SLIM_bin
|
||||
710_SCAF_bin
|
||||
711_Subdivision_bin
|
||||
712_DataSmoothing_bin
|
||||
713_ShapeUp_bin
|
||||
714_MarchingTets_bin
|
||||
715_MeshImplicitFunction_bin
|
||||
716_HeatGeodesics_bin
|
||||
718_IterativeClosestPoint_bin
|
||||
)
|
||||
|
||||
endfunction()
|
||||
@@ -1,26 +0,0 @@
|
||||
if(MSVC)
|
||||
option(IGL_STATIC_RUNTIME "Use libigl with the static MSVC runtime." OFF)
|
||||
if(IGL_STATIC_RUNTIME)
|
||||
message(STATUS "MSVC -> forcing use of statically-linked runtime.")
|
||||
foreach(config ${CMAKE_CONFIGURATION_TYPES})
|
||||
string(TOUPPER ${config} config)
|
||||
string(REPLACE /MD /MT CMAKE_C_FLAGS_${config} "${CMAKE_C_FLAGS_${config}}")
|
||||
string(REPLACE /MD /MT CMAKE_CXX_FLAGS_${config} "${CMAKE_CXX_FLAGS_${config}}")
|
||||
endforeach()
|
||||
string(REPLACE "/MDd" "/MTd" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
|
||||
else()
|
||||
message(STATUS "MSVC -> forcing use of dynamically-linked runtime.")
|
||||
foreach(config ${CMAKE_CONFIGURATION_TYPES})
|
||||
string(TOUPPER ${config} config)
|
||||
string(REPLACE /MT /MD CMAKE_C_FLAGS_${config} "${CMAKE_C_FLAGS_${config}}")
|
||||
string(REPLACE /MT /MD CMAKE_CXX_FLAGS_${config} "${CMAKE_CXX_FLAGS_${config}}")
|
||||
endforeach()
|
||||
string(REPLACE "/MTd" "/MDd" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
|
||||
endif()
|
||||
|
||||
# https://github.com/mozilla/sccache/issues/242
|
||||
if(CMAKE_CXX_COMPILER_LAUNCHER STREQUAL "sccache")
|
||||
string(REGEX REPLACE "/Z[iI7]" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Z7")
|
||||
endif()
|
||||
endif()
|
||||
@@ -9,8 +9,10 @@
|
||||
|
||||
# Hardcoded search paths
|
||||
set(SEARCH_PATHS
|
||||
${CMAKE_SOURCE_DIR}/mosek/9.2/tools/platform/osx64x86/
|
||||
/usr/local/mosek/7/tools/platform/osx64x86/
|
||||
/usr/local/mosek/8/tools/platform/osx64x86/
|
||||
/usr/local/mosek/9.2/tools/platform/osx64x86/
|
||||
/opt/mosek/7/tools/platform/linux64x86/
|
||||
)
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
# Creates a CMake target for a given libigl module. This convenience function also defines common
|
||||
# compilation flags, as well as installation rules for the target. Target sources and dependencies
|
||||
# need to be added separately.
|
||||
function(igl_add_library module_name)
|
||||
# Check if category is `copyleft` or `restricted`
|
||||
if(${module_name} MATCHES "^igl_copyleft")
|
||||
set(suffix "_copyleft")
|
||||
elseif(${module_name} MATCHES "^igl_restricted")
|
||||
set(suffix "_restricted")
|
||||
else()
|
||||
set(suffix "")
|
||||
endif()
|
||||
|
||||
# Check module name
|
||||
if(NOT ${module_name} MATCHES "^igl_")
|
||||
message(FATAL_ERROR "Libigl module name should start with 'igl_'")
|
||||
endif()
|
||||
string(REPLACE "igl${suffix}_" "" module_shortname ${module_name})
|
||||
|
||||
# Define target
|
||||
if(LIBIGL_USE_STATIC_LIBRARY)
|
||||
add_library(${module_name} STATIC)
|
||||
else()
|
||||
add_library(${module_name} INTERFACE)
|
||||
endif()
|
||||
|
||||
# Alias target name
|
||||
message(STATUS "Creating target: igl${suffix}::${module_shortname} (${module_name})")
|
||||
add_library(igl${suffix}::${module_shortname} ALIAS ${module_name})
|
||||
|
||||
# Compile definitions
|
||||
if(LIBIGL_USE_STATIC_LIBRARY)
|
||||
target_compile_definitions(${module_name} ${IGL_SCOPE} -DIGL_STATIC_LIBRARY)
|
||||
endif()
|
||||
|
||||
# C++17 features
|
||||
target_compile_features(${module_name} ${IGL_SCOPE} cxx_std_17)
|
||||
|
||||
if(LIBIGL_WARNINGS_AS_ERRORS)
|
||||
target_compile_options(${module_name} PRIVATE -Wall -Wextra -Wpedantic -Wno-sign-compare -Werror -Wno-gnu -Wno-unknown-pragmas)
|
||||
endif()
|
||||
|
||||
# Other compilation flags
|
||||
if(MSVC)
|
||||
# Enable parallel compilation for Visual Studio
|
||||
target_compile_options(${module_name} ${IGL_SCOPE} $<$<COMPILE_LANGUAGE:CXX>:/MP> $<$<COMPILE_LANGUAGE:CXX>:/bigobj>)
|
||||
target_compile_definitions(${module_name} ${IGL_SCOPE} -DNOMINMAX)
|
||||
|
||||
|
||||
# Silencing some compilation warnings
|
||||
if(LIBIGL_USE_STATIC_LIBRARY)
|
||||
target_compile_options(${module_name} PRIVATE
|
||||
# Type conversion warnings. These can be fixed with some effort and possibly more verbose code.
|
||||
/wd4267 # conversion from 'size_t' to 'type', possible loss of data
|
||||
/wd4244 # conversion from 'type1' to 'type2', possible loss of data
|
||||
/wd4018 # signed/unsigned mismatch
|
||||
/wd4305 # truncation from 'double' to 'float'
|
||||
# This one is from template instantiations generated by autoexplicit.sh:
|
||||
/wd4667 # no function template defined that matches forced instantiation ()
|
||||
# This one is easy to fix, just need to switch to safe version of C functions
|
||||
/wd4996 # this function or variable may be unsafe
|
||||
# This one is when using bools in adjacency matrices
|
||||
/wd4804 #'+=': unsafe use of type 'bool' in operation
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Generate position independent code
|
||||
if(LIBIGL_POSITION_INDEPENDENT_CODE)
|
||||
set_target_properties(${module_name} PROPERTIES INTERFACE_POSITION_INDEPENDENT_CODE ON)
|
||||
if(LIBIGL_USE_STATIC_LIBRARY)
|
||||
set_target_properties(${module_name} PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Folder for IDE
|
||||
if(LIBIGL_USE_STATIC_LIBRARY OR CMAKE_VERSION VERSION_GREATER_EQUAL 3.19.0)
|
||||
set_target_properties(${module_name} PROPERTIES FOLDER "Libigl")
|
||||
endif()
|
||||
endfunction()
|
||||
@@ -0,0 +1,51 @@
|
||||
function(igl_add_test module_name)
|
||||
if(NOT LIBIGL_BUILD_TESTS)
|
||||
return()
|
||||
endif()
|
||||
|
||||
if(NOT TARGET ${module_name})
|
||||
message(FATAL_ERROR "'${module_name}' is not a CMake target")
|
||||
endif()
|
||||
|
||||
# Check if category is `copyleft` or `restricted`
|
||||
if(${module_name} MATCHES "^igl_copyleft")
|
||||
set(suffix "_copyleft")
|
||||
elseif(${module_name} MATCHES "^igl_restricted")
|
||||
set(suffix "_restricted")
|
||||
else()
|
||||
set(suffix "")
|
||||
endif()
|
||||
|
||||
# Create test executable
|
||||
add_executable(test_${module_name}
|
||||
${libigl_SOURCE_DIR}/tests/main.cpp
|
||||
${libigl_SOURCE_DIR}/tests/test_common.h
|
||||
${ARGN}
|
||||
)
|
||||
|
||||
# Include headers
|
||||
target_include_directories(test_${module_name} PUBLIC ${libigl_SOURCE_DIR}/tests)
|
||||
|
||||
# Compile definitions
|
||||
target_compile_definitions(test_${module_name} PUBLIC CATCH_CONFIG_ENABLE_BENCHMARKING)
|
||||
|
||||
# Dependencies
|
||||
include(catch2)
|
||||
include(libigl_tests_data)
|
||||
target_link_libraries(test_${module_name} PUBLIC
|
||||
${module_name}
|
||||
igl::tests_data
|
||||
Catch2::Catch2
|
||||
)
|
||||
|
||||
# IDE Folder
|
||||
set_target_properties(test_${module_name} PROPERTIES FOLDER Libigl_Tests)
|
||||
|
||||
# Output directory
|
||||
set_target_properties(test_${module_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests")
|
||||
|
||||
# Register tests
|
||||
FetchContent_GetProperties(catch2)
|
||||
include("${catch2_SOURCE_DIR}/contrib/Catch.cmake")
|
||||
catch_discover_tests(test_${module_name})
|
||||
endfunction()
|
||||
@@ -0,0 +1,29 @@
|
||||
function(igl_add_tutorial name)
|
||||
# Only create tutorial if dependencies have been enabled in the current build
|
||||
foreach(module IN ITEMS ${ARGN})
|
||||
if(NOT TARGET ${module})
|
||||
return()
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
message(STATUS "Creating libigl tutorial: ${name}")
|
||||
# get all cpp files in ${CMAKE_CURRENT_SOURCE_DIR}/${name}/
|
||||
file(GLOB SRCFILES ${CMAKE_CURRENT_SOURCE_DIR}/${name}/*.cpp)
|
||||
add_executable(${name} ${SRCFILES})
|
||||
target_link_libraries(${name} PRIVATE
|
||||
igl::core
|
||||
igl::tutorial_data
|
||||
${ARGN}
|
||||
)
|
||||
|
||||
set_target_properties(${name} PROPERTIES FOLDER Libigl_Tutorials)
|
||||
|
||||
# Do this codesign only on macOS
|
||||
# add_custom_command(TARGET your_target POST_BUILD COMMAND codesign -s - $<TARGET_FILE:your_target>
|
||||
if(APPLE)
|
||||
add_custom_command(TARGET ${name} POST_BUILD
|
||||
COMMAND codesign -f -s - $<TARGET_FILE:${name}>
|
||||
COMMENT "Codesigning ${name}"
|
||||
)
|
||||
endif()
|
||||
endfunction()
|
||||
@@ -0,0 +1,101 @@
|
||||
# Transitively list all link libraries of a target (recursive call)
|
||||
function(igl_get_dependencies_recursive OUTPUT_VARIABLE TARGET)
|
||||
get_target_property(_aliased ${TARGET} ALIASED_TARGET)
|
||||
if(_aliased)
|
||||
set(TARGET ${_aliased})
|
||||
endif()
|
||||
|
||||
get_target_property(_IMPORTED ${TARGET} IMPORTED)
|
||||
get_target_property(_TYPE ${TARGET} TYPE)
|
||||
if(_IMPORTED OR (${_TYPE} STREQUAL "INTERFACE_LIBRARY"))
|
||||
get_target_property(TARGET_DEPENDENCIES ${TARGET} INTERFACE_LINK_LIBRARIES)
|
||||
else()
|
||||
get_target_property(TARGET_DEPENDENCIES ${TARGET} LINK_LIBRARIES)
|
||||
endif()
|
||||
|
||||
# MKL-specific list of runtime dependencies
|
||||
get_property(RUNTIME_DEPENDENCIES TARGET ${TARGET} PROPERTY mkl_RUNTIME_DEPENDENCIES)
|
||||
if(RUNTIME_DEPENDENCIES)
|
||||
list(APPEND TARGET_DEPENDENCIES ${RUNTIME_DEPENDENCIES})
|
||||
endif()
|
||||
|
||||
set(VISITED_TARGETS ${${OUTPUT_VARIABLE}})
|
||||
foreach(DEPENDENCY IN ITEMS ${TARGET_DEPENDENCIES})
|
||||
if(TARGET ${DEPENDENCY})
|
||||
get_target_property(_aliased ${DEPENDENCY} ALIASED_TARGET)
|
||||
if(_aliased)
|
||||
set(DEPENDENCY ${_aliased})
|
||||
endif()
|
||||
|
||||
if(NOT (DEPENDENCY IN_LIST VISITED_TARGETS))
|
||||
list(APPEND VISITED_TARGETS ${DEPENDENCY})
|
||||
igl_get_dependencies_recursive(VISITED_TARGETS ${DEPENDENCY})
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
set(${OUTPUT_VARIABLE} ${VISITED_TARGETS} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# Transitively list all link libraries of a target
|
||||
function(igl_get_dependencies OUTPUT_VARIABLE TARGET)
|
||||
set(DISCOVERED_TARGETS "")
|
||||
igl_get_dependencies_recursive(DISCOVERED_TARGETS ${TARGET})
|
||||
set(${OUTPUT_VARIABLE} ${DISCOVERED_TARGETS} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# Copy .dll dependencies to a target executable's folder. This function must be called *after* all the CMake
|
||||
# dependencies of the executable target have been defined, otherwise some .dlls might not be copied to the target
|
||||
# folder.
|
||||
function(igl_copy_dll target)
|
||||
if(NOT WIN32)
|
||||
return()
|
||||
endif()
|
||||
if(NOT TARGET ${target})
|
||||
message(STATUS "igl_copy_dll() was called with a non-target: ${target}")
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Sanity checks
|
||||
get_target_property(TYPE ${target} TYPE)
|
||||
if(NOT ${TYPE} STREQUAL "EXECUTABLE")
|
||||
message(FATAL_ERROR "igl_copy_dll() was called on a non-executable target: ${target}")
|
||||
endif()
|
||||
|
||||
# Create a custom command to do the actual copy. This needs to be executed before Catch2's POST_BUILD command,
|
||||
# so we define this as a PRE_LINK command for the executable target.
|
||||
add_custom_command(
|
||||
TARGET ${target}
|
||||
PRE_LINK
|
||||
COMMAND ${CMAKE_COMMAND} -E touch "${CMAKE_BINARY_DIR}/runtime_deps/copy_dll_${target}_$<CONFIG>.cmake"
|
||||
COMMAND ${CMAKE_COMMAND} -P "${CMAKE_BINARY_DIR}/runtime_deps/copy_dll_${target}_$<CONFIG>.cmake"
|
||||
COMMENT "Copying dlls for target ${target}"
|
||||
)
|
||||
|
||||
# Retrieve all target dependencies
|
||||
igl_get_dependencies(TARGET_DEPENDENCIES ${target})
|
||||
|
||||
# Iterate over dependencies, and create a copy rule for each .dll that we find
|
||||
set(COPY_SCRIPT_CONTENT "")
|
||||
foreach(DEPENDENCY IN ITEMS ${TARGET_DEPENDENCIES})
|
||||
get_target_property(TYPE ${DEPENDENCY} TYPE)
|
||||
if(NOT (${TYPE} STREQUAL "SHARED_LIBRARY" OR ${TYPE} STREQUAL "MODULE_LIBRARY"))
|
||||
continue()
|
||||
endif()
|
||||
|
||||
# Instruction to copy target file if it exists
|
||||
string(APPEND COPY_SCRIPT_CONTENT
|
||||
"if(EXISTS \"$<TARGET_FILE:${DEPENDENCY}>\")\n "
|
||||
"execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "
|
||||
"\"$<TARGET_FILE:${DEPENDENCY}>\" "
|
||||
"\"$<TARGET_FILE_DIR:${target}>/$<TARGET_FILE_NAME:${DEPENDENCY}>\")\n"
|
||||
"endif()\n"
|
||||
)
|
||||
endforeach()
|
||||
|
||||
# Finally generate one script for each configuration supported by this generator
|
||||
message(STATUS "Populating copy rules for target: ${target}")
|
||||
file(GENERATE
|
||||
OUTPUT ${CMAKE_BINARY_DIR}/runtime_deps/copy_dll_${target}_$<CONFIG>.cmake
|
||||
CONTENT "${COPY_SCRIPT_CONTENT}"
|
||||
)
|
||||
endfunction()
|
||||
@@ -0,0 +1,56 @@
|
||||
# Helper functions to include libigl modules
|
||||
function(_igl_include_full prefix name force)
|
||||
string(TOUPPER "${prefix}" prefix_uc)
|
||||
string(TOUPPER "${name}" name_uc)
|
||||
if(prefix_uc)
|
||||
string(PREPEND prefix_uc _)
|
||||
endif()
|
||||
string(TOLOWER "${prefix_uc}" prefix_lc)
|
||||
|
||||
if(TARGET igl${prefix_lc}::${name})
|
||||
# Target already exists, skip
|
||||
return()
|
||||
endif()
|
||||
|
||||
if(${force} AND NOT ${name} STREQUAL "core")
|
||||
message(STATUS "Forcing include of libigl module: ${name}")
|
||||
endif()
|
||||
|
||||
# Dependencies are linked as INTERFACE targets unless libigl is compiled as a static library
|
||||
if(LIBIGL_USE_STATIC_LIBRARY)
|
||||
set(IGL_SCOPE PUBLIC)
|
||||
else()
|
||||
set(IGL_SCOPE INTERFACE)
|
||||
endif()
|
||||
|
||||
# Retrieve module path use by libigl (necessary when calling igl_include() from a subproject)
|
||||
get_property(igl_module_path GLOBAL PROPERTY __igl_module_path)
|
||||
set(CMAKE_MODULE_PATH ${igl_module_path})
|
||||
|
||||
# Include igl target definition
|
||||
if(LIBIGL${prefix_uc}_${name_uc} OR ${force})
|
||||
include(${libigl_SOURCE_DIR}/cmake/igl/modules/${prefix}/${name}.cmake)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# Include module only if CMake option is provided
|
||||
function(igl_include_optional name)
|
||||
if(ARGC GREATER_EQUAL 2)
|
||||
# Two args given: prefix + name
|
||||
_igl_include_full(${name} ${ARGV1} FALSE)
|
||||
else()
|
||||
# Only one arg given: prefix (which contains module name)
|
||||
_igl_include_full("" ${name} FALSE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# Include module only unconditionally (e.g. if module is a dependency of another module)
|
||||
function(igl_include name)
|
||||
if(ARGC GREATER_EQUAL 2)
|
||||
# Two args given: prefix + name
|
||||
_igl_include_full(${name} ${ARGV1} TRUE)
|
||||
else()
|
||||
# Only one arg given: prefix (which contains module name)
|
||||
_igl_include_full("" ${name} TRUE)
|
||||
endif()
|
||||
endfunction()
|
||||
@@ -0,0 +1,63 @@
|
||||
function(igl_install module_name)
|
||||
if(NOT LIBIGL_INSTALL)
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Check if category is `copyleft` or `restricted`
|
||||
if(${module_name} MATCHES "^igl_copyleft")
|
||||
set(suffix "_copyleft")
|
||||
elseif(${module_name} MATCHES "^igl_restricted")
|
||||
set(suffix "_restricted")
|
||||
else()
|
||||
set(suffix "")
|
||||
endif()
|
||||
|
||||
########################
|
||||
# Install CMake target #
|
||||
########################
|
||||
|
||||
set_property(TARGET ${module_name} PROPERTY EXPORT_NAME ${module_export})
|
||||
|
||||
include(GNUInstallDirs)
|
||||
install(TARGETS ${module_name}
|
||||
EXPORT LibiglTargets${suffix}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
COMPONENT LibiglRuntime
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
COMPONENT LibiglRuntime
|
||||
NAMELINK_COMPONENT LibiglDevelopment
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
COMPONENT LibiglRuntime
|
||||
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||
COMPONENT LibiglDevelopment
|
||||
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||
)
|
||||
|
||||
###################
|
||||
# Install headers #
|
||||
###################
|
||||
|
||||
# TODO: When moving module definition to their own CMakeLists.txt, we should
|
||||
# refactor this to use the folder where the target was defined (via the
|
||||
# target property SOURCE_DIR).
|
||||
set(target_include_dir ${libigl_SOURCE_DIR}/include)
|
||||
foreach(source_path IN ITEMS ${ARGN})
|
||||
# Filter out .cpp files in "static lib" mode
|
||||
if(LIBIGL_USE_STATIC_LIBRARY)
|
||||
get_filename_component(extension ${source_path} LAST_EXT)
|
||||
if(extension MATCHES ".cpp")
|
||||
continue()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Compute relative path to copy
|
||||
get_filename_component(source_directory ${source_path} DIRECTORY)
|
||||
file(RELATIVE_PATH source_subdir ${target_include_dir} ${source_directory})
|
||||
|
||||
# Create install rule to copy specific header
|
||||
install(
|
||||
FILES ${source_path}
|
||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${source_subdir}
|
||||
)
|
||||
endforeach()
|
||||
endfunction()
|
||||
@@ -0,0 +1,8 @@
|
||||
function(igl_target_sources module_name)
|
||||
if(${CMAKE_VERSION} VERSION_LESS 3.19 AND NOT LIBIGL_USE_STATIC_LIBRARY)
|
||||
# Old approach: defines a dummy custom target for the IDE
|
||||
add_custom_target(${module_name}_ SOURCES ${ARGN})
|
||||
else()
|
||||
target_sources(${module_name} PRIVATE ${ARGN})
|
||||
endif()
|
||||
endfunction()
|
||||
@@ -0,0 +1,7 @@
|
||||
if(MSVC)
|
||||
# https://github.com/mozilla/sccache/issues/242
|
||||
if(CMAKE_CXX_COMPILER_LAUNCHER STREQUAL "sccache")
|
||||
string(REGEX REPLACE "/Z[iI7]" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Z7")
|
||||
endif()
|
||||
endif()
|
||||
@@ -0,0 +1,7 @@
|
||||
@PACKAGE_INIT@
|
||||
|
||||
include(CMakeFindDependencyMacro)
|
||||
find_dependency(Eigen3 REQUIRED)
|
||||
find_dependency(Threads REQUIRED)
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/LibiglConfigTargets.cmake")
|
||||
check_required_components(Libigl)
|
||||
@@ -0,0 +1,34 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_copyleft_cgal)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_copyleft_cgal ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/copyleft/cgal/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/copyleft/cgal/*.cpp")
|
||||
igl_target_sources(igl_copyleft_cgal ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
include(cgal)
|
||||
igl_include(copyleft core)
|
||||
target_link_libraries(igl_copyleft_cgal ${IGL_SCOPE}
|
||||
igl::core
|
||||
igl_copyleft::core
|
||||
CGAL::CGAL
|
||||
CGAL::CGAL_Core
|
||||
)
|
||||
|
||||
# 5. Unit tests
|
||||
file(GLOB SRC_FILES
|
||||
"${libigl_SOURCE_DIR}/tests/include/igl/copyleft/boolean/*.cpp"
|
||||
"${libigl_SOURCE_DIR}/tests/include/igl/copyleft/cgal/*.cpp"
|
||||
)
|
||||
igl_add_test(igl_copyleft_cgal ${SRC_FILES})
|
||||
if(TARGET test_igl_copyleft_cgal)
|
||||
igl_copy_dll(test_igl_copyleft_cgal)
|
||||
endif()
|
||||
@@ -0,0 +1,19 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_copyleft_core)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_copyleft_core ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/copyleft/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/copyleft/*.cpp")
|
||||
igl_target_sources(igl_copyleft_core ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
target_link_libraries(igl_copyleft_core ${IGL_SCOPE}
|
||||
igl::core
|
||||
)
|
||||
@@ -0,0 +1,27 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_copyleft_tetgen)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_copyleft_tetgen ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/copyleft/tetgen/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/copyleft/tetgen/*.cpp")
|
||||
igl_target_sources(igl_copyleft_tetgen ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
include(tetgen)
|
||||
igl_include(copyleft core)
|
||||
target_link_libraries(igl_copyleft_tetgen ${IGL_SCOPE}
|
||||
igl::core
|
||||
igl_copyleft::core
|
||||
tetgen::tetgen
|
||||
)
|
||||
|
||||
# 5. Unit tests
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/tests/include/igl/copyleft/tetgen/*.cpp")
|
||||
igl_add_test(igl_copyleft_tetgen ${SRC_FILES})
|
||||
@@ -0,0 +1,32 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_core)
|
||||
if(LIBIGL_USE_STATIC_LIBRARY)
|
||||
set_target_properties(igl_core PROPERTIES OUTPUT_NAME igl)
|
||||
endif()
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_core ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/*.cpp")
|
||||
igl_target_sources(igl_core ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Install target & headers
|
||||
igl_install(igl_core ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 5. Dependencies
|
||||
include(eigen)
|
||||
find_package(Threads REQUIRED)
|
||||
target_link_libraries(igl_core ${IGL_SCOPE}
|
||||
Eigen3::Eigen
|
||||
Threads::Threads
|
||||
)
|
||||
|
||||
# 6. Unit tests
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/tests/include/igl/*.cpp")
|
||||
igl_add_test(igl_core ${SRC_FILES})
|
||||
@@ -0,0 +1,25 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_embree)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_embree ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/embree/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/embree/*.cpp")
|
||||
igl_target_sources(igl_embree ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
include(embree)
|
||||
target_link_libraries(igl_embree ${IGL_SCOPE}
|
||||
igl::core
|
||||
embree::embree
|
||||
)
|
||||
|
||||
# 5. Unit tests
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/tests/include/igl/embree/*.cpp")
|
||||
igl_add_test(igl_embree ${SRC_FILES})
|
||||
@@ -0,0 +1,29 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_glfw)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_glfw ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/opengl/glfw/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/opengl/glfw/*.cpp")
|
||||
igl_target_sources(igl_glfw ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
include(glfw)
|
||||
igl_include(opengl)
|
||||
target_link_libraries(igl_glfw ${IGL_SCOPE}
|
||||
igl::core
|
||||
igl::opengl
|
||||
glfw::glfw
|
||||
)
|
||||
|
||||
# 5. Unit tests
|
||||
if(LIBIGL_GLFW_TESTS)
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/tests/include/igl/opengl/glfw/*.cpp")
|
||||
igl_add_test(igl_glfw ${SRC_FILES})
|
||||
endif()
|
||||
@@ -0,0 +1,27 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_imgui)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_imgui ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/opengl/glfw/imgui/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/opengl/glfw/imgui/*.cpp")
|
||||
igl_target_sources(igl_imgui ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
include(imgui)
|
||||
include(imguizmo)
|
||||
include(libigl_imgui_fonts)
|
||||
igl_include(glfw)
|
||||
target_link_libraries(igl_imgui ${IGL_SCOPE}
|
||||
igl::core
|
||||
igl::glfw
|
||||
imgui::imgui
|
||||
imguizmo::imguizmo
|
||||
igl::imgui_fonts
|
||||
)
|
||||
@@ -0,0 +1,24 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_opengl)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_opengl ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/opengl/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/opengl/*.cpp")
|
||||
igl_target_sources(igl_opengl ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
include(glad)
|
||||
find_package(OpenGL REQUIRED OPTIONAL_COMPONENTS OpenGL)
|
||||
target_link_libraries(igl_opengl ${IGL_SCOPE}
|
||||
igl::core
|
||||
glad::glad
|
||||
# Link against OpenGL::OpenGL if available, or fallback to OpenGL::GL
|
||||
$<IF:$<TARGET_EXISTS:OpenGL::OpenGL>,OpenGL::OpenGL,OpenGL::GL>
|
||||
)
|
||||
@@ -0,0 +1,25 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_predicates)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_predicates ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/predicates/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/predicates/*.cpp")
|
||||
igl_target_sources(igl_predicates ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
include(predicates)
|
||||
target_link_libraries(igl_predicates ${IGL_SCOPE}
|
||||
igl::core
|
||||
predicates::predicates
|
||||
)
|
||||
|
||||
# 5. Unit tests
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/tests/include/igl/predicates/*.cpp")
|
||||
igl_add_test(igl_predicates ${SRC_FILES})
|
||||
@@ -0,0 +1,25 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_restricted_matlab)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_restricted_matlab ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/matlab/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/matlab/*.cpp")
|
||||
igl_target_sources(igl_restricted_matlab ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
# MATLAB_ADDITIONAL_VERSIONS should have already been set in libigl/CMakeLists.txt
|
||||
find_package(Matlab REQUIRED COMPONENTS MEX_COMPILER MX_LIBRARY ENG_LIBRARY MAT_LIBRARY)
|
||||
# to-do detect if imported targets are available (cmake 3.22's findmatlab has
|
||||
# them) and use those instead of hard coding these.
|
||||
target_link_libraries(igl_restricted_matlab ${IGL_SCOPE} igl::core ${Matlab_LIBRARIES})
|
||||
target_include_directories(igl_restricted_matlab ${IGL_SCOPE} ${Matlab_INCLUDE_DIRS})
|
||||
|
||||
# 5. Unit tests
|
||||
# to-do write some matlab tests
|
||||
@@ -0,0 +1,27 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_restricted_mosek)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_restricted_mosek ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/mosek/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/mosek/*.cpp")
|
||||
igl_target_sources(igl_restricted_mosek ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
find_package(MOSEK REQUIRED)
|
||||
target_include_directories(igl_restricted_mosek ${IGL_SCOPE} ${MOSEK_INCLUDE_DIRS})
|
||||
target_link_libraries(igl_restricted_mosek ${IGL_SCOPE} igl::core ${MOSEK_LIBRARIES})
|
||||
|
||||
# 5. Unit tests
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/tests/include/igl/mosek/*.cpp")
|
||||
igl_add_test(igl_restricted_mosek ${SRC_FILES})
|
||||
IF(APPLE)
|
||||
INCLUDE(${libigl_SOURCE_DIR}/cmake/misc/OSXFixDylibReferences.cmake)
|
||||
OSX_FIX_DYLIB_REFERENCES(test_igl_restricted_mosek "${MOSEK_LIBRARIES}")
|
||||
ENDIF()
|
||||
@@ -0,0 +1,29 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_restricted_triangle)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_restricted_triangle ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/triangle/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/triangle/*.cpp")
|
||||
igl_target_sources(igl_restricted_triangle ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
include(triangle)
|
||||
target_link_libraries(igl_restricted_triangle ${IGL_SCOPE}
|
||||
igl::core
|
||||
triangle::triangle
|
||||
)
|
||||
|
||||
# 5. Unit tests
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/tests/include/igl/triangle/*.cpp")
|
||||
igl_add_test(igl_restricted_triangle ${SRC_FILES})
|
||||
if(TARGET test_igl_restricted_triangle)
|
||||
igl_include(predicates)
|
||||
target_link_libraries(test_igl_restricted_triangle PUBLIC igl::predicates)
|
||||
endif()
|
||||
@@ -0,0 +1,25 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_spectra)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_spectra ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/spectra/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/spectra/*.cpp")
|
||||
igl_target_sources(igl_spectra ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
include(spectra)
|
||||
target_link_libraries(igl_spectra ${IGL_SCOPE}
|
||||
igl::core
|
||||
spectra::spectra
|
||||
)
|
||||
|
||||
# 5. Unit tests
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/tests/include/igl/spectra/*.cpp")
|
||||
igl_add_test(igl_spectra ${SRC_FILES})
|
||||
@@ -0,0 +1,35 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_stb)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_stb ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/stb/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/stb/*.cpp")
|
||||
if(LIBIGL_OPENGL)
|
||||
message(STATUS "Including igl/opengl/stb support")
|
||||
file(GLOB OPENGL_INC_FILES "${libigl_SOURCE_DIR}/include/igl/opengl/stb/*.h")
|
||||
file(GLOB OPENGL_SRC_FILES "${libigl_SOURCE_DIR}/include/igl/opengl/stb/*.cpp")
|
||||
list(APPEND INC_FILES ${OPENGL_INC_FILES})
|
||||
list(APPEND SRC_FILES ${OPENGL_SRC_FILES})
|
||||
endif()
|
||||
igl_target_sources(igl_stb ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
include(stb)
|
||||
target_link_libraries(igl_stb ${IGL_SCOPE}
|
||||
igl::core
|
||||
stb::stb
|
||||
)
|
||||
|
||||
if(LIBIGL_OPENGL)
|
||||
igl_include(opengl)
|
||||
target_link_libraries(igl_stb ${IGL_SCOPE}
|
||||
igl::opengl
|
||||
)
|
||||
endif()
|
||||
@@ -0,0 +1,21 @@
|
||||
# 1. Define module
|
||||
igl_add_library(igl_xml)
|
||||
|
||||
# 2. Include headers
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_xml ${IGL_SCOPE}
|
||||
$<BUILD_INTERFACE:${libigl_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
# 3. Target sources
|
||||
file(GLOB INC_FILES "${libigl_SOURCE_DIR}/include/igl/xml/*.h")
|
||||
file(GLOB SRC_FILES "${libigl_SOURCE_DIR}/include/igl/xml/*.cpp")
|
||||
igl_target_sources(igl_xml ${INC_FILES} ${SRC_FILES})
|
||||
|
||||
# 4. Dependencies
|
||||
include(tinyxml2)
|
||||
target_link_libraries(igl_xml ${IGL_SCOPE}
|
||||
igl::core
|
||||
tinyxml2::tinyxml2
|
||||
)
|
||||
@@ -1,8 +0,0 @@
|
||||
# This is a conda environment that can be used to compile libigl with CGAL on Windows
|
||||
# Only boost is required to be installed on the system, CGAL is automatically downloaded
|
||||
# by CMake and is built with libigl.
|
||||
name: libigl-cgal
|
||||
channels:
|
||||
- conda-forge
|
||||
dependencies:
|
||||
- boost-cpp=1.65.0
|
||||
@@ -1,31 +0,0 @@
|
||||
@PACKAGE_INIT@
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/libigl-export.cmake)
|
||||
|
||||
# Check if Eigen3 target is avaiable, if not try to locate it
|
||||
# with find_package.
|
||||
message(STATUS "[libigl] Looking for Eigen3")
|
||||
if (NOT TARGET Eigen3::Eigen)
|
||||
# Try if Eigen3 can be found with find_package
|
||||
find_package(Eigen3 CONFIG REQUIRED)
|
||||
endif()
|
||||
|
||||
|
||||
if (TARGET igl::core)
|
||||
if (TARGET Eigen3::Eigen)
|
||||
# Inject dependency
|
||||
set_target_properties(igl::core PROPERTIES INTERFACE_LINK_LIBRARIES Eigen3::Eigen)
|
||||
set(libigl_core_FOUND TRUE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (TARGET igl::common)
|
||||
if (TARGET Eigen3::Eigen)
|
||||
# Inject dependency
|
||||
set_target_properties(igl::common PROPERTIES INTERFACE_LINK_LIBRARIES Eigen3::Eigen)
|
||||
set(libigl_common_FOUND TRUE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
check_required_components(libigl)
|
||||
|
||||
+31
-568
@@ -1,570 +1,33 @@
|
||||
cmake_minimum_required(VERSION 3.1)
|
||||
|
||||
# https://github.com/libigl/libigl/issues/751
|
||||
# http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20160425/351643.html
|
||||
if(APPLE)
|
||||
if(NOT CMAKE_LIBTOOL)
|
||||
find_program(CMAKE_LIBTOOL NAMES libtool)
|
||||
endif()
|
||||
if(CMAKE_LIBTOOL)
|
||||
set(CMAKE_LIBTOOL ${CMAKE_LIBTOOL} CACHE PATH "libtool executable")
|
||||
message(STATUS "Found libtool - ${CMAKE_LIBTOOL}")
|
||||
get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES)
|
||||
foreach(lang ${languages})
|
||||
# Added -c
|
||||
set(CMAKE_${lang}_CREATE_STATIC_LIBRARY
|
||||
"${CMAKE_LIBTOOL} -c -static -o <TARGET> <LINK_FLAGS> <OBJECTS> ")
|
||||
endforeach()
|
||||
endif()
|
||||
# Sanity check for backward compatibility
|
||||
get_filename_component(PATH_X "${libigl_SOURCE_DIR}" REALPATH)
|
||||
get_filename_component(PATH_Y "${CMAKE_CURRENT_LIST_DIR}/.." REALPATH)
|
||||
if(NOT PATH_X STREQUAL PATH_Y)
|
||||
message(FATAL_ERROR "You included libigl.cmake directly from your own project. This behavior "
|
||||
"is not supported anymore. Please add libigl to your project via "
|
||||
"add_subdirectory(<path_to_libigl>). See the libigl example project for "
|
||||
"more information: https://github.com/libigl/libigl-example-project/")
|
||||
endif()
|
||||
|
||||
### Available options ###
|
||||
option(LIBIGL_USE_STATIC_LIBRARY "Use libigl as static library" OFF)
|
||||
option(LIBIGL_WITH_CGAL "Use CGAL" OFF)
|
||||
option(LIBIGL_WITH_COMISO "Use CoMiso" OFF)
|
||||
option(LIBIGL_WITH_CORK "Use Cork" OFF)
|
||||
option(LIBIGL_WITH_EMBREE "Use Embree" OFF)
|
||||
option(LIBIGL_WITH_MATLAB "Use Matlab" OFF)
|
||||
option(LIBIGL_WITH_MOSEK "Use MOSEK" OFF)
|
||||
option(LIBIGL_WITH_OPENGL "Use OpenGL" OFF)
|
||||
option(LIBIGL_WITH_OPENGL_GLFW "Use GLFW" OFF)
|
||||
option(LIBIGL_WITH_OPENGL_GLFW_IMGUI "Use ImGui" OFF)
|
||||
option(LIBIGL_WITH_PNG "Use PNG" OFF)
|
||||
option(LIBIGL_WITH_TETGEN "Use Tetgen" OFF)
|
||||
option(LIBIGL_WITH_TRIANGLE "Use Triangle" OFF)
|
||||
option(LIBIGL_WITH_PREDICATES "Use exact predicates" OFF)
|
||||
option(LIBIGL_WITH_XML "Use XML" OFF)
|
||||
option(LIBIGL_WITHOUT_COPYLEFT "Disable Copyleft libraries" OFF)
|
||||
option(LIBIGL_EXPORT_TARGETS "Export libigl CMake targets" OFF)
|
||||
|
||||
if(LIBIGL_BUILD_PYTHON)
|
||||
message(FATAL_ERROR "Python bindings have been removed in this version. Please use an older version of libigl, or wait for the new bindings to be released.")
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
|
||||
### Configuration
|
||||
set(LIBIGL_ROOT "${CMAKE_CURRENT_LIST_DIR}/..")
|
||||
set(LIBIGL_SOURCE_DIR "${LIBIGL_ROOT}/include")
|
||||
set(LIBIGL_EXTERNAL "${LIBIGL_ROOT}/external")
|
||||
|
||||
# Dependencies are linked as INTERFACE targets unless libigl is compiled as a static library
|
||||
if(LIBIGL_USE_STATIC_LIBRARY)
|
||||
set(IGL_SCOPE PUBLIC)
|
||||
else()
|
||||
set(IGL_SCOPE INTERFACE)
|
||||
endif()
|
||||
|
||||
# Download and update 3rdparty libraries
|
||||
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
include(LibiglDownloadExternal)
|
||||
|
||||
# Provides igl_set_folders() to set folders for Visual Studio/Xcode
|
||||
include(LibiglFolders)
|
||||
|
||||
################################################################################
|
||||
### IGL Common
|
||||
################################################################################
|
||||
|
||||
add_library(igl_common INTERFACE)
|
||||
target_include_directories(igl_common SYSTEM INTERFACE
|
||||
$<BUILD_INTERFACE:${LIBIGL_SOURCE_DIR}>
|
||||
$<INSTALL_INTERFACE:include>
|
||||
)
|
||||
# Export igl_common as igl::common
|
||||
set_property(TARGET igl_common PROPERTY EXPORT_NAME igl::common)
|
||||
if(LIBIGL_USE_STATIC_LIBRARY)
|
||||
target_compile_definitions(igl_common INTERFACE -DIGL_STATIC_LIBRARY)
|
||||
endif()
|
||||
|
||||
# Transitive C++11 flags
|
||||
include(CXXFeatures)
|
||||
target_compile_features(igl_common INTERFACE ${CXX11_FEATURES})
|
||||
|
||||
# Other compilation flags
|
||||
if(MSVC)
|
||||
# Enable parallel compilation for Visual Studio
|
||||
target_compile_options(igl_common INTERFACE /MP /bigobj)
|
||||
target_compile_definitions(igl_common INTERFACE -DNOMINMAX)
|
||||
endif()
|
||||
|
||||
# Controls whether to use the static MSVC runtime or not
|
||||
include(LibiglWindows)
|
||||
|
||||
if(BUILD_SHARED_LIBS)
|
||||
# Generate position independent code
|
||||
set_target_properties(igl_common PROPERTIES INTERFACE_POSITION_INDEPENDENT_CODE ON)
|
||||
endif()
|
||||
|
||||
if(UNIX AND NOT HUNTER_ENABLED)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
||||
endif()
|
||||
|
||||
if(HUNTER_ENABLED)
|
||||
hunter_add_package(Eigen)
|
||||
find_package(Eigen3 CONFIG REQUIRED)
|
||||
endif()
|
||||
|
||||
# Eigen
|
||||
if(NOT TARGET Eigen3::Eigen)
|
||||
igl_download_eigen()
|
||||
add_library(igl_eigen INTERFACE)
|
||||
target_include_directories(igl_eigen SYSTEM INTERFACE
|
||||
$<BUILD_INTERFACE:${LIBIGL_EXTERNAL}/eigen>
|
||||
$<INSTALL_INTERFACE:include>
|
||||
)
|
||||
set_property(TARGET igl_eigen PROPERTY EXPORT_NAME Eigen3::Eigen)
|
||||
add_library(Eigen3::Eigen ALIAS igl_eigen)
|
||||
endif()
|
||||
target_link_libraries(igl_common INTERFACE Eigen3::Eigen)
|
||||
|
||||
# C++11 Thread library
|
||||
find_package(Threads REQUIRED)
|
||||
target_link_libraries(igl_common INTERFACE ${CMAKE_THREAD_LIBS_INIT})
|
||||
|
||||
################################################################################
|
||||
|
||||
## CGAL dependencies on Windows: GMP & MPFR
|
||||
function(igl_download_cgal_deps)
|
||||
if(WIN32)
|
||||
igl_download_project(gmp
|
||||
URL https://cgal.geometryfactory.com/CGAL/precompiled_libs/auxiliary/x64/GMP/5.0.1/gmp-all-CGAL-3.9.zip
|
||||
URL_MD5 508c1292319c832609329116a8234c9f
|
||||
)
|
||||
igl_download_project(mpfr
|
||||
URL https://cgal.geometryfactory.com/CGAL/precompiled_libs/auxiliary/x64/MPFR/3.0.0/mpfr-all-CGAL-3.9.zip
|
||||
URL_MD5 48840454eef0ff18730050c05028734b
|
||||
)
|
||||
set(ENV{GMP_DIR} "${LIBIGL_EXTERNAL}/gmp")
|
||||
set(ENV{MPFR_DIR} "${LIBIGL_EXTERNAL}/mpfr")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
|
||||
function(compile_igl_module module_dir)
|
||||
string(REPLACE "/" "_" module_name "${module_dir}")
|
||||
if(module_name STREQUAL "core")
|
||||
set(module_libname "igl")
|
||||
else()
|
||||
set(module_libname "igl_${module_name}")
|
||||
endif()
|
||||
if(LIBIGL_USE_STATIC_LIBRARY)
|
||||
file(GLOB SOURCES_IGL_${module_name}
|
||||
"${LIBIGL_SOURCE_DIR}/igl/${module_dir}/*.cpp"
|
||||
"${LIBIGL_SOURCE_DIR}/igl/${module_dir}/*.h*"
|
||||
)
|
||||
if(NOT LIBIGL_WITHOUT_COPYLEFT)
|
||||
file(GLOB COPYLEFT_SOURCES_IGL_${module_name}
|
||||
"${LIBIGL_SOURCE_DIR}/igl/copyleft/${module_dir}/*.cpp"
|
||||
"${LIBIGL_SOURCE_DIR}/igl/copyleft/${module_dir}/*.h*"
|
||||
)
|
||||
list(APPEND SOURCES_IGL_${module_name} ${COPYLEFT_SOURCES_IGL_${module_name}})
|
||||
endif()
|
||||
add_library(${module_libname} STATIC ${SOURCES_IGL_${module_name}} ${ARGN})
|
||||
if(MSVC)
|
||||
# Silencing some compile warnings
|
||||
target_compile_options(${module_libname} PRIVATE
|
||||
# Type conversion warnings. These can be fixed with some effort and possibly more verbose code.
|
||||
/wd4267 # conversion from 'size_t' to 'type', possible loss of data
|
||||
/wd4244 # conversion from 'type1' to 'type2', possible loss of data
|
||||
/wd4018 # signed/unsigned mismatch
|
||||
/wd4305 # truncation from 'double' to 'float'
|
||||
# This one is from template instantiations generated by autoexplicit.sh:
|
||||
/wd4667 # no function template defined that matches forced instantiation ()
|
||||
# This one is easy to fix, just need to switch to safe version of C functions
|
||||
/wd4996 # this function or variable may be unsafe
|
||||
# This one is when using bools in adjacency matrices
|
||||
/wd4804 #'+=': unsafe use of type 'bool' in operation
|
||||
)
|
||||
endif()
|
||||
else()
|
||||
add_library(${module_libname} INTERFACE)
|
||||
endif()
|
||||
|
||||
target_link_libraries(${module_libname} ${IGL_SCOPE} igl_common)
|
||||
if(NOT module_name STREQUAL "core")
|
||||
target_link_libraries(${module_libname} ${IGL_SCOPE} igl)
|
||||
endif()
|
||||
|
||||
# Alias target because it looks nicer
|
||||
message(STATUS "Creating target: igl::${module_name} (${module_libname})")
|
||||
add_library(igl::${module_name} ALIAS ${module_libname})
|
||||
# Export as igl::${module_name}
|
||||
set_property(TARGET ${module_libname} PROPERTY EXPORT_NAME igl::${module_name})
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
### IGL Core
|
||||
################################################################################
|
||||
|
||||
if(LIBIGL_USE_STATIC_LIBRARY)
|
||||
file(GLOB SOURCES_IGL
|
||||
"${LIBIGL_SOURCE_DIR}/igl/*.cpp"
|
||||
"${LIBIGL_SOURCE_DIR}/igl/*.h*"
|
||||
"${LIBIGL_SOURCE_DIR}/igl/copyleft/*.cpp"
|
||||
"${LIBIGL_SOURCE_DIR}/igl/copyleft/*.h*"
|
||||
)
|
||||
endif()
|
||||
compile_igl_module("core" ${SOURCES_IGL})
|
||||
|
||||
################################################################################
|
||||
### Download the python part ###
|
||||
if(LIBIGL_WITH_PYTHON)
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the CGAL part ###
|
||||
if(LIBIGL_WITH_CGAL)
|
||||
# Try to find the CGAL library
|
||||
# CGAL Core is needed for
|
||||
# `Exact_predicates_exact_constructions_kernel_with_sqrt`
|
||||
if(NOT TARGET CGAL::CGAL)
|
||||
set(CGAL_DIR "${LIBIGL_EXTERNAL}/cgal")
|
||||
igl_download_cgal()
|
||||
igl_download_cgal_deps()
|
||||
message("BOOST_ROOT: ${BOOST_ROOT}")
|
||||
if(EXISTS ${LIBIGL_EXTERNAL}/boost)
|
||||
set(BOOST_ROOT "${LIBIGL_EXTERNAL}/boost")
|
||||
endif()
|
||||
option(CGAL_Boost_USE_STATIC_LIBS "Use static Boost libs with CGAL" ON)
|
||||
|
||||
find_package(CGAL CONFIG COMPONENTS Core PATHS ${CGAL_DIR} NO_DEFAULT_PATH)
|
||||
endif()
|
||||
|
||||
# If CGAL has been found, then build the libigl module
|
||||
if(TARGET CGAL::CGAL AND TARGET CGAL::CGAL_Core)
|
||||
compile_igl_module("cgal")
|
||||
target_link_libraries(igl_cgal ${IGL_SCOPE} CGAL::CGAL CGAL::CGAL_Core)
|
||||
else()
|
||||
message(FATAL_ERROR "Could not define CGAL::CGAL and CGAL::CGAL_Core.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Helper function for `igl_copy_cgal_dll()`
|
||||
function(igl_copy_imported_dll src_target dst_target)
|
||||
get_target_property(other_libs ${src_target} INTERFACE_LINK_LIBRARIES)
|
||||
set(locations)
|
||||
list(APPEND locations ${main_lib} ${other_libs})
|
||||
foreach(location ${locations})
|
||||
string(REGEX MATCH "^(.*)\\.[^.]*$" dummy ${location})
|
||||
set(location "${CMAKE_MATCH_1}.dll")
|
||||
if(EXISTS "${location}" AND location MATCHES "^.*\\.dll$")
|
||||
add_custom_command(TARGET ${dst_target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${location}" $<TARGET_FILE_DIR:${dst_target}>)
|
||||
endif()
|
||||
endforeach()
|
||||
endfunction()
|
||||
|
||||
# Convenient functions to copy CGAL dlls into a target (executable) destination folder (for Windows)
|
||||
function(igl_copy_cgal_dll target)
|
||||
if(WIN32 AND LIBIGL_WITH_CGAL)
|
||||
igl_copy_imported_dll(CGAL::CGAL ${target})
|
||||
igl_copy_imported_dll(CGAL::CGAL_Core ${target})
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
### Compile the CoMISo part ###
|
||||
# NOTE: this cmakefile works only with the
|
||||
# comiso available here: https://github.com/libigl/CoMISo
|
||||
if(LIBIGL_WITH_COMISO)
|
||||
compile_igl_module("comiso")
|
||||
if(NOT TARGET CoMISo)
|
||||
igl_download_comiso()
|
||||
add_subdirectory("${LIBIGL_EXTERNAL}/CoMISo" CoMISo)
|
||||
endif()
|
||||
target_link_libraries(igl_comiso ${IGL_SCOPE} CoMISo)
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the cork part ###
|
||||
if(LIBIGL_WITH_CORK)
|
||||
set(CORK_DIR "${LIBIGL_EXTERNAL}/cork")
|
||||
if(NOT TARGET cork)
|
||||
# call this "lib-cork" instead of "cork", otherwise cmake gets confused about
|
||||
# "cork" executable
|
||||
igl_download_cork()
|
||||
add_subdirectory("${CORK_DIR}" "lib-cork")
|
||||
endif()
|
||||
compile_igl_module("cork")
|
||||
target_include_directories(igl_cork ${IGL_SCOPE} cork)
|
||||
target_include_directories(igl_cork ${IGL_SCOPE} "${CORK_DIR}/src")
|
||||
target_link_libraries(igl_cork ${IGL_SCOPE} cork)
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the embree part ###
|
||||
if(LIBIGL_WITH_EMBREE)
|
||||
set(EMBREE_DIR "${LIBIGL_EXTERNAL}/embree")
|
||||
|
||||
if(NOT TARGET embree)
|
||||
igl_download_embree()
|
||||
|
||||
set(EMBREE_TESTING_INTENSITY 0 CACHE STRING "")
|
||||
set(EMBREE_ISPC_SUPPORT OFF CACHE BOOL " ")
|
||||
set(EMBREE_TASKING_SYSTEM "INTERNAL" CACHE BOOL " ")
|
||||
set(EMBREE_TUTORIALS OFF CACHE BOOL " ")
|
||||
set(EMBREE_MAX_ISA "SSE2" CACHE STRING " ")
|
||||
set(EMBREE_STATIC_LIB ON CACHE BOOL " ")
|
||||
if(MSVC)
|
||||
set(EMBREE_STATIC_RUNTIME ${IGL_STATIC_RUNTIME} CACHE BOOL "Use the static version of the C/C++ runtime library.")
|
||||
endif()
|
||||
|
||||
add_subdirectory("${EMBREE_DIR}" "embree" EXCLUDE_FROM_ALL)
|
||||
endif()
|
||||
|
||||
compile_igl_module("embree")
|
||||
target_link_libraries(igl_embree ${IGL_SCOPE} embree)
|
||||
target_include_directories(igl_embree ${IGL_SCOPE} ${EMBREE_DIR}/include)
|
||||
target_compile_definitions(igl_embree ${IGL_SCOPE} -DEMBREE_STATIC_LIB)
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the matlab part ###
|
||||
if(LIBIGL_WITH_MATLAB)
|
||||
find_package(Matlab REQUIRED COMPONENTS MEX_COMPILER MX_LIBRARY ENG_LIBRARY MAT_LIBRARY)
|
||||
compile_igl_module("matlab")
|
||||
target_link_libraries(igl_matlab ${IGL_SCOPE} ${Matlab_LIBRARIES})
|
||||
target_include_directories(igl_matlab ${IGL_SCOPE} ${Matlab_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the mosek part ###
|
||||
if(LIBIGL_WITH_MOSEK)
|
||||
find_package(MOSEK REQUIRED)
|
||||
compile_igl_module("mosek")
|
||||
target_link_libraries(igl_mosek ${IGL_SCOPE} ${MOSEK_LIBRARIES})
|
||||
target_include_directories(igl_mosek ${IGL_SCOPE} ${MOSEK_INCLUDE_DIRS})
|
||||
target_compile_definitions(igl_mosek ${IGL_SCOPE} -DLIBIGL_WITH_MOSEK)
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the opengl part ###
|
||||
if(LIBIGL_WITH_OPENGL)
|
||||
# OpenGL module
|
||||
compile_igl_module("opengl")
|
||||
|
||||
# OpenGL library
|
||||
if (NOT CMAKE_VERSION VERSION_LESS "3.11")
|
||||
cmake_policy(SET CMP0072 NEW)
|
||||
endif()
|
||||
find_package(OpenGL REQUIRED)
|
||||
if(TARGET OpenGL::GL)
|
||||
target_link_libraries(igl_opengl ${IGL_SCOPE} OpenGL::GL)
|
||||
else()
|
||||
target_link_libraries(igl_opengl ${IGL_SCOPE} ${OPENGL_gl_LIBRARY})
|
||||
target_include_directories(igl_opengl SYSTEM ${IGL_SCOPE} ${OPENGL_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
# glad module
|
||||
if(NOT TARGET glad)
|
||||
igl_download_glad()
|
||||
add_subdirectory(${LIBIGL_EXTERNAL}/glad glad)
|
||||
endif()
|
||||
target_link_libraries(igl_opengl ${IGL_SCOPE} glad)
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the GLFW part ###
|
||||
if(LIBIGL_WITH_OPENGL_GLFW)
|
||||
if(TARGET igl::opengl)
|
||||
# GLFW module
|
||||
compile_igl_module("opengl/glfw")
|
||||
if(NOT TARGET glfw)
|
||||
igl_download_glfw()
|
||||
option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" OFF)
|
||||
option(GLFW_BUILD_TESTS "Build the GLFW test programs" OFF)
|
||||
option(GLFW_BUILD_DOCS "Build the GLFW documentation" OFF)
|
||||
option(GLFW_INSTALL "Generate installation target" OFF)
|
||||
if(IGL_STATIC_RUNTIME)
|
||||
set(USE_MSVC_RUNTIME_LIBRARY_DLL OFF CACHE BOOL "Use MSVC runtime library DLL" FORCE)
|
||||
else()
|
||||
set(USE_MSVC_RUNTIME_LIBRARY_DLL ON CACHE BOOL "Use MSVC runtime library DLL" FORCE)
|
||||
endif()
|
||||
add_subdirectory(${LIBIGL_EXTERNAL}/glfw glfw)
|
||||
endif()
|
||||
target_link_libraries(igl_opengl_glfw ${IGL_SCOPE} igl_opengl glfw)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the ImGui part ###
|
||||
if(LIBIGL_WITH_OPENGL_GLFW_IMGUI)
|
||||
if(TARGET igl::opengl_glfw)
|
||||
# ImGui module
|
||||
compile_igl_module("opengl/glfw/imgui")
|
||||
if(NOT TARGET imgui)
|
||||
igl_download_imgui()
|
||||
add_subdirectory(${LIBIGL_EXTERNAL}/libigl-imgui imgui)
|
||||
endif()
|
||||
target_link_libraries(igl_opengl_glfw_imgui ${IGL_SCOPE} igl_opengl_glfw imgui)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the png part ###
|
||||
if(LIBIGL_WITH_PNG)
|
||||
# png/ module is anomalous because it also depends on opengl it really should
|
||||
# be moved into the opengl/ directory and namespace ...
|
||||
if(TARGET igl_opengl)
|
||||
if(NOT TARGET stb_image)
|
||||
igl_download_stb()
|
||||
add_subdirectory(${LIBIGL_EXTERNAL}/stb stb_image)
|
||||
endif()
|
||||
compile_igl_module("png" "")
|
||||
target_link_libraries(igl_png ${IGL_SCOPE} igl_stb_image igl_opengl)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the tetgen part ###
|
||||
if(LIBIGL_WITH_TETGEN)
|
||||
set(TETGEN_DIR "${LIBIGL_EXTERNAL}/tetgen")
|
||||
if(NOT TARGET tetgen)
|
||||
igl_download_tetgen()
|
||||
add_subdirectory("${TETGEN_DIR}" "tetgen")
|
||||
endif()
|
||||
compile_igl_module("tetgen")
|
||||
target_link_libraries(igl_tetgen ${IGL_SCOPE} tetgen)
|
||||
target_include_directories(igl_tetgen ${IGL_SCOPE} ${TETGEN_DIR})
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the triangle part ###
|
||||
if(LIBIGL_WITH_TRIANGLE)
|
||||
set(TRIANGLE_DIR "${LIBIGL_EXTERNAL}/triangle")
|
||||
if(NOT TARGET triangle)
|
||||
igl_download_triangle()
|
||||
add_subdirectory("${TRIANGLE_DIR}" "triangle")
|
||||
endif()
|
||||
compile_igl_module("triangle")
|
||||
target_link_libraries(igl_triangle ${IGL_SCOPE} triangle)
|
||||
target_include_directories(igl_triangle ${IGL_SCOPE} ${TRIANGLE_DIR})
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the predicates part ###
|
||||
if(LIBIGL_WITH_PREDICATES)
|
||||
set(PREDICATES_DIR "${LIBIGL_EXTERNAL}/predicates")
|
||||
if(NOT TARGET predicates)
|
||||
igl_download_predicates()
|
||||
add_subdirectory("${PREDICATES_DIR}" "predicates")
|
||||
endif()
|
||||
compile_igl_module("predicates")
|
||||
target_link_libraries(igl_predicates ${IGL_SCOPE} predicates)
|
||||
target_include_directories(igl_predicates ${IGL_SCOPE} ${PREDICATES_DIR})
|
||||
target_compile_definitions(igl_predicates ${IGL_SCOPE} -DLIBIGL_WITH_PREDICATES)
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the xml part ###
|
||||
if(LIBIGL_WITH_XML)
|
||||
set(TINYXML2_DIR "${LIBIGL_EXTERNAL}/tinyxml2")
|
||||
if(NOT TARGET tinyxml2)
|
||||
igl_download_tinyxml2()
|
||||
add_library(tinyxml2 STATIC ${TINYXML2_DIR}/tinyxml2.cpp ${TINYXML2_DIR}/tinyxml2.h)
|
||||
target_include_directories(tinyxml2 PUBLIC ${TINYXML2_DIR})
|
||||
set_target_properties(tinyxml2 PROPERTIES
|
||||
COMPILE_DEFINITIONS "TINYXML2_EXPORT"
|
||||
VERSION "3.0.0"
|
||||
SOVERSION "3")
|
||||
endif()
|
||||
compile_igl_module("xml")
|
||||
target_link_libraries(igl_xml ${IGL_SCOPE} tinyxml2)
|
||||
target_include_directories(igl_xml ${IGL_SCOPE} ${TINYXML2_DIR})
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Install and export all modules
|
||||
|
||||
if(NOT LIBIGL_EXPORT_TARGETS)
|
||||
return()
|
||||
endif()
|
||||
|
||||
function(install_dir_files dir_name)
|
||||
if (dir_name STREQUAL "core")
|
||||
set(subpath "")
|
||||
else()
|
||||
set(subpath "/${dir_name}")
|
||||
endif()
|
||||
|
||||
file(GLOB public_headers
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/igl${subpath}/*.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/igl${subpath}/*.hpp
|
||||
)
|
||||
|
||||
set(files_to_install ${public_headers})
|
||||
|
||||
if(NOT LIBIGL_USE_STATIC_LIBRARY)
|
||||
file(GLOB public_sources
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/igl${subpath}/*.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/igl${subpath}/*.c
|
||||
)
|
||||
endif()
|
||||
list(APPEND files_to_install ${public_sources})
|
||||
|
||||
install(
|
||||
FILES ${files_to_install}
|
||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/igl${subpath}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
|
||||
include(GNUInstallDirs)
|
||||
include(CMakePackageConfigHelpers)
|
||||
|
||||
if(TARGET igl_eigen)
|
||||
set(IGL_EIGEN igl_eigen)
|
||||
else()
|
||||
set(IGL_EIGEN)
|
||||
message(WARNING "Trying to export igl targets while using an imported target for Eigen.")
|
||||
endif()
|
||||
|
||||
# Install and export core library
|
||||
install(
|
||||
TARGETS
|
||||
igl
|
||||
igl_common
|
||||
${IGL_EIGEN}
|
||||
EXPORT igl-export
|
||||
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
)
|
||||
export(
|
||||
TARGETS
|
||||
igl
|
||||
igl_common
|
||||
${IGL_EIGEN}
|
||||
FILE libigl-export.cmake
|
||||
)
|
||||
|
||||
# Install headers for core library
|
||||
install_dir_files(core)
|
||||
install_dir_files(copyleft)
|
||||
|
||||
# Write package configuration file
|
||||
configure_package_config_file(
|
||||
${CMAKE_CURRENT_LIST_DIR}/libigl-config.cmake.in
|
||||
${CMAKE_BINARY_DIR}/libigl-config.cmake
|
||||
INSTALL_DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/libigl/cmake
|
||||
)
|
||||
install(
|
||||
FILES
|
||||
${CMAKE_BINARY_DIR}/libigl-config.cmake
|
||||
DESTINATION
|
||||
${CMAKE_INSTALL_DATADIR}/libigl/cmake
|
||||
)
|
||||
|
||||
# Write export file
|
||||
export(EXPORT igl-export
|
||||
FILE "${CMAKE_BINARY_DIR}/libigl-export.cmake"
|
||||
)
|
||||
install(EXPORT igl-export DESTINATION ${CMAKE_INSTALL_DATADIR}/libigl/cmake FILE libigl-export.cmake)
|
||||
|
||||
|
||||
export(PACKAGE libigl)
|
||||
|
||||
# Global options
|
||||
include(igl_windows)
|
||||
|
||||
# Libigl permissive modules
|
||||
igl_include(core)
|
||||
igl_include_optional(embree)
|
||||
igl_include_optional(opengl)
|
||||
igl_include_optional(glfw)
|
||||
igl_include_optional(imgui)
|
||||
igl_include_optional(predicates)
|
||||
igl_include_optional(stb)
|
||||
igl_include_optional(spectra)
|
||||
igl_include_optional(xml)
|
||||
|
||||
# Libigl copyleft modules
|
||||
igl_include_optional(copyleft core)
|
||||
igl_include_optional(copyleft cgal)
|
||||
igl_include_optional(copyleft tetgen)
|
||||
|
||||
# Libigl restricted modules
|
||||
igl_include_optional(restricted matlab)
|
||||
igl_include_optional(restricted mosek)
|
||||
igl_include_optional(restricted triangle)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (c) 2013-2018, Ruslan Baratov
|
||||
# Copyright (c) 2013-2019, Ruslan Baratov
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
@@ -59,8 +59,9 @@ include(CMakeParseArguments) # cmake_parse_arguments
|
||||
option(HUNTER_STATUS_PRINT "Print working status" ON)
|
||||
option(HUNTER_STATUS_DEBUG "Print a lot info" OFF)
|
||||
option(HUNTER_TLS_VERIFY "Enable/disable TLS certificate checking on downloads" ON)
|
||||
set(HUNTER_ROOT "" CACHE FILEPATH "Override the HUNTER_ROOT.")
|
||||
|
||||
set(HUNTER_WIKI "https://github.com/ruslo/hunter/wiki")
|
||||
set(HUNTER_ERROR_PAGE "https://hunter.readthedocs.io/en/latest/reference/errors")
|
||||
|
||||
function(hunter_gate_status_print)
|
||||
if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG)
|
||||
@@ -79,9 +80,9 @@ function(hunter_gate_status_debug)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_wiki wiki_page)
|
||||
message("------------------------------ WIKI -------------------------------")
|
||||
message(" ${HUNTER_WIKI}/${wiki_page}")
|
||||
function(hunter_gate_error_page error_page)
|
||||
message("------------------------------ ERROR ------------------------------")
|
||||
message(" ${HUNTER_ERROR_PAGE}/${error_page}.html")
|
||||
message("-------------------------------------------------------------------")
|
||||
message("")
|
||||
message(FATAL_ERROR "")
|
||||
@@ -94,14 +95,13 @@ function(hunter_gate_internal_error)
|
||||
endforeach()
|
||||
message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
|
||||
message("")
|
||||
hunter_gate_wiki("error.internal")
|
||||
hunter_gate_error_page("error.internal")
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_fatal_error)
|
||||
cmake_parse_arguments(hunter "" "WIKI" "" "${ARGV}")
|
||||
string(COMPARE EQUAL "${hunter_WIKI}" "" have_no_wiki)
|
||||
if(have_no_wiki)
|
||||
hunter_gate_internal_error("Expected wiki")
|
||||
cmake_parse_arguments(hunter "" "ERROR_PAGE" "" "${ARGV}")
|
||||
if("${hunter_ERROR_PAGE}" STREQUAL "")
|
||||
hunter_gate_internal_error("Expected ERROR_PAGE")
|
||||
endif()
|
||||
message("")
|
||||
foreach(x ${hunter_UNPARSED_ARGUMENTS})
|
||||
@@ -109,11 +109,11 @@ function(hunter_gate_fatal_error)
|
||||
endforeach()
|
||||
message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
|
||||
message("")
|
||||
hunter_gate_wiki("${hunter_WIKI}")
|
||||
hunter_gate_error_page("${hunter_ERROR_PAGE}")
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_user_error)
|
||||
hunter_gate_fatal_error(${ARGV} WIKI "error.incorrect.input.data")
|
||||
hunter_gate_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data")
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_self root version sha1 result)
|
||||
@@ -149,24 +149,21 @@ endfunction()
|
||||
# Set HUNTER_GATE_ROOT cmake variable to suitable value.
|
||||
function(hunter_gate_detect_root)
|
||||
# Check CMake variable
|
||||
string(COMPARE NOTEQUAL "${HUNTER_ROOT}" "" not_empty)
|
||||
if(not_empty)
|
||||
if(HUNTER_ROOT)
|
||||
set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE)
|
||||
hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable")
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Check environment variable
|
||||
string(COMPARE NOTEQUAL "$ENV{HUNTER_ROOT}" "" not_empty)
|
||||
if(not_empty)
|
||||
if(DEFINED ENV{HUNTER_ROOT})
|
||||
set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE)
|
||||
hunter_gate_status_debug("HUNTER_ROOT detected by environment variable")
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Check HOME environment variable
|
||||
string(COMPARE NOTEQUAL "$ENV{HOME}" "" result)
|
||||
if(result)
|
||||
if(DEFINED ENV{HOME})
|
||||
set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE)
|
||||
hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable")
|
||||
return()
|
||||
@@ -174,8 +171,7 @@ function(hunter_gate_detect_root)
|
||||
|
||||
# Check SYSTEMDRIVE and USERPROFILE environment variable (windows only)
|
||||
if(WIN32)
|
||||
string(COMPARE NOTEQUAL "$ENV{SYSTEMDRIVE}" "" result)
|
||||
if(result)
|
||||
if(DEFINED ENV{SYSTEMDRIVE})
|
||||
set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE)
|
||||
hunter_gate_status_debug(
|
||||
"HUNTER_ROOT set using SYSTEMDRIVE environment variable"
|
||||
@@ -183,8 +179,7 @@ function(hunter_gate_detect_root)
|
||||
return()
|
||||
endif()
|
||||
|
||||
string(COMPARE NOTEQUAL "$ENV{USERPROFILE}" "" result)
|
||||
if(result)
|
||||
if(DEFINED ENV{USERPROFILE})
|
||||
set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE)
|
||||
hunter_gate_status_debug(
|
||||
"HUNTER_ROOT set using USERPROFILE environment variable"
|
||||
@@ -195,7 +190,7 @@ function(hunter_gate_detect_root)
|
||||
|
||||
hunter_gate_fatal_error(
|
||||
"Can't detect HUNTER_ROOT"
|
||||
WIKI "error.detect.hunter.root"
|
||||
ERROR_PAGE "error.detect.hunter.root"
|
||||
)
|
||||
endfunction()
|
||||
|
||||
@@ -214,7 +209,7 @@ function(hunter_gate_download dir)
|
||||
"Settings:"
|
||||
" HUNTER_ROOT: ${HUNTER_GATE_ROOT}"
|
||||
" HUNTER_SHA1: ${HUNTER_GATE_SHA1}"
|
||||
WIKI "error.run.install"
|
||||
ERROR_PAGE "error.run.install"
|
||||
)
|
||||
endif()
|
||||
string(COMPARE EQUAL "${dir}" "" is_bad)
|
||||
@@ -400,7 +395,7 @@ macro(HunterGate)
|
||||
hunter_gate_fatal_error(
|
||||
"Please set HunterGate *before* 'project' command. "
|
||||
"Detected project: ${PROJECT_NAME}"
|
||||
WIKI "error.huntergate.before.project"
|
||||
ERROR_PAGE "error.huntergate.before.project"
|
||||
)
|
||||
endif()
|
||||
|
||||
@@ -470,7 +465,7 @@ macro(HunterGate)
|
||||
"HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces."
|
||||
"Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error"
|
||||
"(Use at your own risk!)"
|
||||
WIKI "error.spaces.in.hunter.root"
|
||||
ERROR_PAGE "error.spaces.in.hunter.root"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
@@ -518,7 +513,9 @@ macro(HunterGate)
|
||||
hunter_gate_internal_error("${_sha1_location} not found")
|
||||
endif()
|
||||
file(READ "${_sha1_location}" _sha1_value)
|
||||
string(COMPARE EQUAL "${_sha1_value}" "${HUNTER_GATE_SHA1}" _is_equal)
|
||||
string(TOLOWER "${_sha1_value}" _sha1_value_lower)
|
||||
string(TOLOWER "${HUNTER_GATE_SHA1}" _HUNTER_GATE_SHA1_lower)
|
||||
string(COMPARE EQUAL "${_sha1_value_lower}" "${_HUNTER_GATE_SHA1_lower}" _is_equal)
|
||||
if(NOT _is_equal)
|
||||
hunter_gate_internal_error(
|
||||
"Short SHA1 collision:"
|
||||
@@ -0,0 +1,151 @@
|
||||
# OS X requires a Mach-O dynamic library to have a baked "install name", that is used by other modules to link to it. Depending
|
||||
# on how the library is built, the install name is not always an absolute path, nor necessarily the same as the name of the
|
||||
# library file itself. This macro takes as input the name of a target, and a list of libraries that it links to (the output of
|
||||
# FIND_PACKAGE or FIND_LIBRARY calls), and generates a set of custom, post-build commands that, for each linked dylib, changes
|
||||
# the name the target uses to refer to it with a fully-qualified (absolute) version of the library's own install name. This
|
||||
# helps ensure that the target can be used from any location while still being able to locate the linked dynamic libraries.
|
||||
#
|
||||
# Note that this script does NOT handle the case when a linked library itself refers to another library using a non-absolute
|
||||
# name (Boost is a notorious example). To avoid such issues, it is recommended to use a static library instead of a shared one
|
||||
# in a non-standard location. Alternatively, set DYLD_LIBRARY_PATH to include these non-standard locations when running the
|
||||
# program (not recommended).
|
||||
#
|
||||
# Author: Siddhartha Chaudhuri, 2009.
|
||||
#
|
||||
|
||||
# Set the minimum required CMake version
|
||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||
|
||||
# See cmake --help-policy CMP0011 for details on this one
|
||||
IF(POLICY CMP0011)
|
||||
CMAKE_POLICY(SET CMP0011 NEW)
|
||||
ENDIF(POLICY CMP0011)
|
||||
|
||||
# See cmake --help-policy CMP0026 for details on this one
|
||||
IF(POLICY CMP0026)
|
||||
CMAKE_POLICY(SET CMP0026 NEW)
|
||||
ENDIF(POLICY CMP0026)
|
||||
|
||||
# See cmake --help-policy CMP0045 for details on this one
|
||||
IF(POLICY CMP0045)
|
||||
CMAKE_POLICY(SET CMP0045 NEW)
|
||||
ENDIF(POLICY CMP0045)
|
||||
|
||||
MACRO(OSX_FIX_DYLIB_REFERENCES target libraries)
|
||||
|
||||
IF(APPLE)
|
||||
SET(OFIN_${target}_RPATHS )
|
||||
|
||||
FOREACH(OFIN_${target}_Library ${libraries})
|
||||
IF(${OFIN_${target}_Library} MATCHES "[.]dylib$"
|
||||
OR ${OFIN_${target}_Library} MATCHES "[.]framework/.+")
|
||||
|
||||
# Resolve symlinks and get absolute location
|
||||
GET_FILENAME_COMPONENT(OFIN_${target}_LibraryAbsolute ${OFIN_${target}_Library} ABSOLUTE)
|
||||
|
||||
# Get the baked install name of the library
|
||||
EXECUTE_PROCESS(COMMAND otool -D ${OFIN_${target}_LibraryAbsolute}
|
||||
OUTPUT_VARIABLE OFIN_${target}_LibraryInstallNameOutput
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
STRING(REGEX REPLACE "[\r\n]" " " OFIN_${target}_LibraryInstallNameOutput ${OFIN_${target}_LibraryInstallNameOutput})
|
||||
SEPARATE_ARGUMENTS(OFIN_${target}_LibraryInstallNameOutput)
|
||||
LIST(GET OFIN_${target}_LibraryInstallNameOutput 1 OFIN_${target}_LibraryInstallName)
|
||||
|
||||
IF(${OFIN_${target}_LibraryInstallName} MATCHES "^[@]rpath/")
|
||||
|
||||
# Ideally, we want to eliminate the longest common suffix of the install name and the absolute path. Whatever's left
|
||||
# will be the desired rpath. But this is difficult to do (especially if there are naming variations, e.g.
|
||||
# "Versions/Current" vs "Versions/5" is a common culprit). So we'll add various candidate rpaths and hope at least one
|
||||
# is correct.
|
||||
|
||||
# Typically, the rpath to a library within a framework looks like this:
|
||||
# @rpath/A.framework/Versions/5/libFoo.dylib
|
||||
#
|
||||
# Hence, we'll extract for the path unit immediately following the @rpath (in this case A.framework) and then look for
|
||||
# it in the library's actual path. Everything before this location will be put in the rpath.
|
||||
SET(OFIN_${target}_PathPrefix ${OFIN_${target}_LibraryInstallName})
|
||||
SET(OFIN_${target}_RpathFirstChild )
|
||||
WHILE(NOT OFIN_${target}_PathPrefix STREQUAL "@rpath")
|
||||
GET_FILENAME_COMPONENT(OFIN_${target}_RpathFirstChild ${OFIN_${target}_PathPrefix} NAME)
|
||||
GET_FILENAME_COMPONENT(OFIN_${target}_PathPrefix ${OFIN_${target}_PathPrefix} PATH)
|
||||
|
||||
IF(NOT OFIN_${target}_PathPrefix) # should never happen but just in case
|
||||
BREAK()
|
||||
ENDIF(NOT OFIN_${target}_PathPrefix)
|
||||
|
||||
IF(OFIN_${target}_PathPrefix STREQUAL "/") # should never happen but just in case
|
||||
BREAK()
|
||||
ENDIF(OFIN_${target}_PathPrefix STREQUAL "/")
|
||||
ENDWHILE(NOT OFIN_${target}_PathPrefix STREQUAL "@rpath")
|
||||
|
||||
IF(OFIN_${target}_RpathFirstChild)
|
||||
SET(OFIN_${target}_PathPrefix ${OFIN_${target}_LibraryAbsolute})
|
||||
SET(OFIN_${target}_PathUnit )
|
||||
WHILE(NOT OFIN_${target}_PathUnit STREQUAL ${OFIN_${target}_RpathFirstChild})
|
||||
GET_FILENAME_COMPONENT(OFIN_${target}_PathUnit ${OFIN_${target}_PathPrefix} NAME)
|
||||
GET_FILENAME_COMPONENT(OFIN_${target}_PathPrefix ${OFIN_${target}_PathPrefix} PATH)
|
||||
|
||||
IF(NOT OFIN_${target}_PathPrefix)
|
||||
BREAK()
|
||||
ENDIF(NOT OFIN_${target}_PathPrefix)
|
||||
|
||||
IF(OFIN_${target}_PathPrefix STREQUAL "/")
|
||||
BREAK()
|
||||
ENDIF(OFIN_${target}_PathPrefix STREQUAL "/")
|
||||
ENDWHILE(NOT OFIN_${target}_PathUnit STREQUAL ${OFIN_${target}_RpathFirstChild})
|
||||
|
||||
IF(OFIN_${target}_PathPrefix)
|
||||
SET(OFIN_${target}_RPATHS ${OFIN_${target}_RPATHS} "${OFIN_${target}_PathPrefix}")
|
||||
ENDIF(OFIN_${target}_PathPrefix)
|
||||
ENDIF(OFIN_${target}_RpathFirstChild)
|
||||
|
||||
# Add the directory containing the library
|
||||
GET_FILENAME_COMPONENT(OFIN_${target}_LibraryAbsolutePath ${OFIN_${target}_LibraryAbsolute} PATH)
|
||||
SET(OFIN_${target}_RPATHS ${OFIN_${target}_RPATHS} "${OFIN_${target}_LibraryAbsolutePath}")
|
||||
|
||||
# Add paths specified as library search prefixes
|
||||
FOREACH(prefix ${CMAKE_PREFIX_PATH})
|
||||
SET(OFIN_${target}_RPATHS ${OFIN_${target}_RPATHS} "${CMAKE_PREFIX_PATH}")
|
||||
SET(OFIN_${target}_RPATHS ${OFIN_${target}_RPATHS} "${CMAKE_PREFIX_PATH}/lib")
|
||||
ENDFOREACH()
|
||||
|
||||
ELSEIF(NOT ${OFIN_${target}_LibraryInstallName} MATCHES "^[@/]") # just a relative path
|
||||
|
||||
# Replace the unqualified filename, if it appears, with the absolute location, either by directly changing the path or
|
||||
# by editing the rpath
|
||||
|
||||
# -- handle the case when the actual filename is baked in
|
||||
GET_FILENAME_COMPONENT(OFIN_${target}_LibraryFilename ${OFIN_${target}_LibraryAbsolute} NAME)
|
||||
ADD_CUSTOM_COMMAND(TARGET ${target} POST_BUILD
|
||||
COMMAND install_name_tool
|
||||
ARGS -change
|
||||
${OFIN_${target}_LibraryFilename}
|
||||
${OFIN_${target}_LibraryAbsolute}
|
||||
$<TARGET_FILE:${target}>)
|
||||
|
||||
# -- handle the case when the install name is baked in
|
||||
ADD_CUSTOM_COMMAND(TARGET ${target} POST_BUILD
|
||||
COMMAND install_name_tool
|
||||
ARGS -change
|
||||
${OFIN_${target}_LibraryInstallName}
|
||||
${OFIN_${target}_LibraryAbsolute}
|
||||
$<TARGET_FILE:${target}>)
|
||||
ENDIF()
|
||||
|
||||
ENDIF()
|
||||
ENDFOREACH(OFIN_${target}_Library)
|
||||
|
||||
# Add the collected rpaths
|
||||
IF(OFIN_${target}_RPATHS)
|
||||
LIST(REMOVE_DUPLICATES OFIN_${target}_RPATHS)
|
||||
|
||||
FOREACH(rpath ${OFIN_${target}_RPATHS})
|
||||
ADD_CUSTOM_COMMAND(TARGET ${target} POST_BUILD
|
||||
COMMAND bash
|
||||
ARGS -c "install_name_tool -add_rpath '${rpath}' '$<TARGET_FILE:${target}>' > /dev/null 2>&1 || true"
|
||||
VERBATIM)
|
||||
ENDFOREACH()
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
ENDMACRO(OSX_FIX_DYLIB_REFERENCES)
|
||||
Vendored
+60
@@ -0,0 +1,60 @@
|
||||
if(TARGET Boost::boost)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating targets 'Boost::boost'...")
|
||||
|
||||
cmake_minimum_required(VERSION 3.24) # Ensure modern FetchContent features
|
||||
project(BoostFetchExample)
|
||||
|
||||
include(FetchContent)
|
||||
|
||||
# Define the Boost library to fetch
|
||||
FetchContent_Declare(
|
||||
Boost
|
||||
URL https://archives.boost.io/release/1.86.0/source/boost_1_86_0.tar.gz
|
||||
URL_HASH MD5=ac857d73bb754b718a039830b07b9624
|
||||
)
|
||||
# Fetch Boost
|
||||
FetchContent_MakeAvailable(Boost)
|
||||
|
||||
|
||||
# Ensure Boost paths are set before CGAL
|
||||
set(Boost_INCLUDE_DIR ${boost_SOURCE_DIR})
|
||||
set(Boost_LIBRARY_DIR ${boost_BINARY_DIR})
|
||||
|
||||
# Add Boost libraries needed for your project
|
||||
set(BOOST_LIBRARIES
|
||||
container
|
||||
regex
|
||||
atomic
|
||||
exception
|
||||
chrono
|
||||
wave
|
||||
context
|
||||
coroutine
|
||||
date_time
|
||||
fiber
|
||||
filesystem
|
||||
graph
|
||||
iostreams
|
||||
locale
|
||||
log
|
||||
log_setup
|
||||
unit_test_framework
|
||||
math
|
||||
multiprecision
|
||||
program_options
|
||||
timer
|
||||
random
|
||||
serialization
|
||||
system
|
||||
thread
|
||||
type_erasure
|
||||
)
|
||||
|
||||
foreach(lib IN LISTS BOOST_LIBRARIES)
|
||||
add_library(boost_${lib} INTERFACE)
|
||||
target_include_directories(boost_${lib} INTERFACE ${Boost_SOURCE_DIR})
|
||||
target_link_libraries(boost_${lib} INTERFACE Boost::${lib})
|
||||
endforeach()
|
||||
Vendored
+14
@@ -0,0 +1,14 @@
|
||||
if(TARGET Catch2::Catch2)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'Catch2::Catch2'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
catch2
|
||||
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
|
||||
GIT_TAG v2.13.8
|
||||
GIT_SHALLOW TRUE
|
||||
)
|
||||
FetchContent_MakeAvailable(catch2)
|
||||
Vendored
+50
@@ -0,0 +1,50 @@
|
||||
if(TARGET CGAL::CGAL)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'CGAL::CGAL'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
cgal
|
||||
URL https://github.com/CGAL/cgal/releases/download/v6.0.1/CGAL-6.0.1-library.tar.xz
|
||||
URL_MD5 ea827f6778063e00554ae41f4c845492
|
||||
)
|
||||
FetchContent_GetProperties(cgal)
|
||||
if(cgal_POPULATED)
|
||||
return()
|
||||
endif()
|
||||
FetchContent_Populate(cgal)
|
||||
|
||||
function(cgal_import_target)
|
||||
macro(ignore_package NAME VERSION_NUM)
|
||||
include(CMakePackageConfigHelpers)
|
||||
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${NAME}/${NAME}Config.cmake "")
|
||||
write_basic_package_version_file(
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${NAME}/${NAME}ConfigVersion.cmake
|
||||
VERSION ${VERSION_NUM}
|
||||
COMPATIBILITY AnyNewerVersion
|
||||
)
|
||||
set(${NAME}_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NAME} CACHE PATH "")
|
||||
set(${NAME}_ROOT ${CMAKE_CURRENT_BINARY_DIR}/${NAME} CACHE PATH "")
|
||||
endmacro()
|
||||
|
||||
include(boost)
|
||||
|
||||
|
||||
ignore_package(Boost 1.71.0)
|
||||
set(Boost_INCLUDE_DIRS "")
|
||||
set(Boost_LIBRARIES Boost::thread Boost::system Boost::multiprecision)
|
||||
|
||||
# Prefer Config mode before Module mode to prevent CGAL from loading its own FindXXX.cmake
|
||||
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG TRUE)
|
||||
|
||||
# https://stackoverflow.com/a/71714947/148668
|
||||
set(CGAL_DATA_DIR "unspecified")
|
||||
|
||||
set(CGAL_CMAKE_EXACT_NT_BACKEND "BOOST_BACKEND" CACHE STRING "CGAL exact NT backend")
|
||||
set(CGAL_DISABLE_GMP ON CACHE BOOL "Disable GMP")
|
||||
find_package(CGAL CONFIG COMPONENTS Core PATHS ${cgal_SOURCE_DIR} NO_DEFAULT_PATH)
|
||||
endfunction()
|
||||
|
||||
cgal_import_target()
|
||||
Vendored
+43
@@ -0,0 +1,43 @@
|
||||
if(TARGET Eigen3::Eigen)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'Eigen3::Eigen'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
eigen
|
||||
GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git
|
||||
GIT_TAG tags/3.4.0
|
||||
GIT_SHALLOW TRUE
|
||||
)
|
||||
FetchContent_GetProperties(eigen)
|
||||
if(NOT eigen_POPULATED)
|
||||
FetchContent_Populate(eigen)
|
||||
endif()
|
||||
|
||||
add_library(Eigen3_Eigen INTERFACE)
|
||||
add_library(Eigen3::Eigen ALIAS Eigen3_Eigen)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(Eigen3_Eigen SYSTEM INTERFACE
|
||||
$<BUILD_INTERFACE:${eigen_SOURCE_DIR}>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
|
||||
option(EIGEN_MPL2_ONLY "Compile Eigen with MPL2 code only" OFF)
|
||||
if(EIGEN_MPL2_ONLY)
|
||||
target_compile_definitions(Eigen3_Eigen INTERFACE EIGEN_MPL2_ONLY)
|
||||
endif()
|
||||
|
||||
# On Windows, enable natvis files to improve debugging experience
|
||||
if(WIN32 AND eigen_SOURCE_DIR)
|
||||
target_sources(Eigen3_Eigen INTERFACE $<BUILD_INTERFACE:${eigen_SOURCE_DIR}/debug/msvc/eigen.natvis>)
|
||||
endif()
|
||||
|
||||
# Install rules
|
||||
set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME eigen)
|
||||
set_target_properties(Eigen3_Eigen PROPERTIES EXPORT_NAME Eigen)
|
||||
install(DIRECTORY ${eigen_SOURCE_DIR}/Eigen DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
install(TARGETS Eigen3_Eigen EXPORT EigenTargets)
|
||||
install(EXPORT EigenTargets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/eigen NAMESPACE Eigen3::)
|
||||
Vendored
+53
@@ -0,0 +1,53 @@
|
||||
if(TARGET embree::embree)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'embree::embree'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
embree
|
||||
GIT_REPOSITORY https://github.com/embree/embree.git
|
||||
GIT_TAG v4.4.0
|
||||
GIT_SHALLOW TRUE
|
||||
)
|
||||
|
||||
# Set Embree's default options
|
||||
option(EMBREE_ISPC_SUPPORT "Build Embree with support for ISPC applications." OFF)
|
||||
option(EMBREE_TUTORIALS "Enable to build Embree tutorials" OFF)
|
||||
option(EMBREE_STATIC_LIB "Build Embree as a static library." ON)
|
||||
set(EMBREE_TESTING_INTENSITY 0 CACHE STRING "Intensity of testing (0 = no testing, 1 = verify and tutorials, 2 = light testing, 3 = intensive testing.")
|
||||
set(EMBREE_TASKING_SYSTEM "INTERNAL" CACHE STRING "Selects tasking system")
|
||||
set(EMBREE_MAX_ISA "DEFAULT" CACHE STRING "Selects highest ISA to support.")
|
||||
|
||||
# Ready to include embree's atrocious CMake
|
||||
FetchContent_MakeAvailable(embree)
|
||||
|
||||
# Disable warnings
|
||||
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
||||
# Embree's subgrid.h is known for causing array subscript out of bound
|
||||
# warning. Embree dev claim the code is correct and it is a GCC bug
|
||||
# for misfiring warnings. See https://github.com/embree/embree/issues/271
|
||||
#
|
||||
# The issue should be fixed for gcc 9.2.1 and later.
|
||||
target_compile_options(embree PRIVATE "-Wno-array-bounds")
|
||||
endif()
|
||||
|
||||
# Now we need to do some juggling to propagate the include directory properties
|
||||
# along with the `embree` target
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(embree SYSTEM INTERFACE
|
||||
"$<BUILD_INTERFACE:${embree_SOURCE_DIR}/include>"
|
||||
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/>"
|
||||
)
|
||||
|
||||
add_library(embree::embree ALIAS embree)
|
||||
|
||||
# Some order for IDEs
|
||||
set_target_properties(embree PROPERTIES FOLDER "ThirdParty//Embree")
|
||||
set_target_properties(lexers PROPERTIES FOLDER "ThirdParty//Embree")
|
||||
set_target_properties(math PROPERTIES FOLDER "ThirdParty//Embree")
|
||||
set_target_properties(simd PROPERTIES FOLDER "ThirdParty//Embree")
|
||||
set_target_properties(sys PROPERTIES FOLDER "ThirdParty//Embree")
|
||||
set_target_properties(tasking PROPERTIES FOLDER "ThirdParty//Embree")
|
||||
set_target_properties(uninstall PROPERTIES FOLDER "ThirdParty//Embree")
|
||||
Vendored
+17
@@ -0,0 +1,17 @@
|
||||
if(TARGET glad::glad)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'glad::glad'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
glad
|
||||
GIT_REPOSITORY https://github.com/libigl/libigl-glad.git
|
||||
GIT_TAG 651a425101365aa6e8504988ef9bb363d066c5ee
|
||||
)
|
||||
|
||||
FetchContent_MakeAvailable(glad)
|
||||
add_library(glad::glad ALIAS glad)
|
||||
|
||||
set_target_properties(glad PROPERTIES FOLDER ThirdParty)
|
||||
Vendored
+42
@@ -0,0 +1,42 @@
|
||||
if(TARGET glfw::glfw)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'glfw::glfw'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
glfw
|
||||
GIT_REPOSITORY https://github.com/glfw/glfw.git
|
||||
GIT_TAG 3327050ca66ad34426a82c217c2d60ced61526b7
|
||||
)
|
||||
|
||||
option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" OFF)
|
||||
option(GLFW_BUILD_TESTS "Build the GLFW test programs" OFF)
|
||||
option(GLFW_BUILD_DOCS "Build the GLFW documentation" OFF)
|
||||
option(GLFW_INSTALL "Generate installation target" OFF)
|
||||
option(GLFW_VULKAN_STATIC "Use the Vulkan loader statically linked into application" OFF)
|
||||
FetchContent_MakeAvailable(glfw)
|
||||
|
||||
add_library(glfw::glfw ALIAS glfw)
|
||||
|
||||
set_target_properties(glfw PROPERTIES FOLDER ThirdParty)
|
||||
|
||||
# Warning config
|
||||
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
|
||||
target_compile_options(glfw PRIVATE
|
||||
"-Wno-missing-field-initializers"
|
||||
"-Wno-objc-multiple-method-names"
|
||||
)
|
||||
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
||||
target_compile_options(glfw PRIVATE
|
||||
"-Wno-missing-field-initializers"
|
||||
"-Wno-objc-multiple-method-names"
|
||||
)
|
||||
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
||||
target_compile_options(glfw PRIVATE
|
||||
"-Wno-missing-field-initializers"
|
||||
"-Wno-sign-compare"
|
||||
"-Wno-unused-parameter"
|
||||
)
|
||||
endif()
|
||||
Vendored
+53
@@ -0,0 +1,53 @@
|
||||
if(TARGET imgui::imgui)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'imgui::imgui'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
imgui
|
||||
GIT_REPOSITORY https://github.com/ocornut/imgui.git
|
||||
GIT_TAG v1.85
|
||||
GIT_SHALLOW TRUE
|
||||
)
|
||||
FetchContent_MakeAvailable(imgui)
|
||||
|
||||
set(IMGUI_SRC
|
||||
"${imgui_SOURCE_DIR}/imgui.h"
|
||||
"${imgui_SOURCE_DIR}/imconfig.h"
|
||||
"${imgui_SOURCE_DIR}/imgui_internal.h"
|
||||
"${imgui_SOURCE_DIR}/imgui.cpp"
|
||||
"${imgui_SOURCE_DIR}/imgui_demo.cpp"
|
||||
"${imgui_SOURCE_DIR}/imgui_draw.cpp"
|
||||
"${imgui_SOURCE_DIR}/imgui_widgets.cpp"
|
||||
"${imgui_SOURCE_DIR}/imgui_tables.cpp"
|
||||
"${imgui_SOURCE_DIR}/imstb_rectpack.h"
|
||||
"${imgui_SOURCE_DIR}/imstb_textedit.h"
|
||||
"${imgui_SOURCE_DIR}/imstb_truetype.h"
|
||||
"${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.h"
|
||||
"${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp"
|
||||
"${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.h"
|
||||
"${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.cpp"
|
||||
"${imgui_SOURCE_DIR}/misc/cpp/imgui_stdlib.h"
|
||||
"${imgui_SOURCE_DIR}/misc/cpp/imgui_stdlib.cpp"
|
||||
)
|
||||
|
||||
add_library(imgui ${IMGUI_SRC})
|
||||
add_library(imgui::imgui ALIAS imgui)
|
||||
|
||||
# Include headers
|
||||
target_include_directories(imgui PUBLIC "${imgui_SOURCE_DIR}")
|
||||
|
||||
# Compile definitions
|
||||
target_compile_definitions(imgui PUBLIC
|
||||
IMGUI_IMPL_OPENGL_LOADER_GLAD
|
||||
IMGUI_DISABLE_OBSOLETE_FUNCTIONS # to check for obsolete functions
|
||||
)
|
||||
|
||||
# Dependencies
|
||||
include(glfw)
|
||||
include(glad)
|
||||
target_link_libraries(imgui PUBLIC glfw::glfw glad::glad)
|
||||
|
||||
set_target_properties(imgui PROPERTIES FOLDER ThirdParty)
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
if(TARGET imguizmo::imguizmo)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'imguizmo::imguizmo'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
imguizmo
|
||||
GIT_REPOSITORY https://github.com/CedricGuillemet/ImGuizmo.git
|
||||
GIT_TAG a23567269f6617342bcc112394bdad937b54b2d7
|
||||
)
|
||||
FetchContent_MakeAvailable(imguizmo)
|
||||
|
||||
set(IMGUIZMO_SRC
|
||||
"${imguizmo_SOURCE_DIR}/ImGuizmo.h"
|
||||
"${imguizmo_SOURCE_DIR}/ImGuizmo.cpp"
|
||||
)
|
||||
|
||||
add_library(imguizmo ${IMGUIZMO_SRC})
|
||||
add_library(imguizmo::imguizmo ALIAS imguizmo)
|
||||
|
||||
target_compile_features(imguizmo PUBLIC cxx_std_11)
|
||||
|
||||
target_include_directories(imguizmo PUBLIC "${imguizmo_SOURCE_DIR}")
|
||||
|
||||
include(imgui)
|
||||
target_link_libraries(imguizmo PUBLIC imgui::imgui)
|
||||
|
||||
set_target_properties(imguizmo PROPERTIES FOLDER ThirdParty)
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
if(TARGET igl::imgui_fonts)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'igl::imgui_fonts'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
libigl_imgui_fonts
|
||||
GIT_REPOSITORY https://github.com/libigl/libigl-imgui.git
|
||||
GIT_TAG 7e1053e750b0f4c129b046f4e455243cb7f804f3
|
||||
)
|
||||
FetchContent_GetProperties(libigl_imgui_fonts)
|
||||
if(NOT libigl_imgui_fonts_POPULATED)
|
||||
FetchContent_Populate(libigl_imgui_fonts)
|
||||
endif()
|
||||
|
||||
add_library(igl_imgui_fonts INTERFACE)
|
||||
add_library(igl::imgui_fonts ALIAS igl_imgui_fonts)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
target_include_directories(igl_imgui_fonts SYSTEM INTERFACE
|
||||
$<BUILD_INTERFACE:${libigl_imgui_fonts_SOURCE_DIR}>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
)
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
if(TARGET igl::tests_data)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'igl::tests_data'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
libigl_tests_data
|
||||
GIT_REPOSITORY https://github.com/libigl/libigl-tests-data
|
||||
GIT_TAG 19cedf96d70702d8b3a83eb27934780c542356fe
|
||||
)
|
||||
FetchContent_MakeAvailable(libigl_tests_data)
|
||||
|
||||
add_library(igl_tests_data INTERFACE)
|
||||
add_library(igl::tests_data ALIAS igl_tests_data)
|
||||
|
||||
target_compile_definitions(igl_tests_data INTERFACE LIBIGL_DATA_DIR=\"${libigl_tests_data_SOURCE_DIR}\")
|
||||
@@ -0,0 +1,18 @@
|
||||
if(TARGET igl::tutorial_data)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'igl::tutorial_data'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
libigl_tutorial_data
|
||||
GIT_REPOSITORY https://github.com/libigl/libigl-tutorial-data
|
||||
GIT_TAG c1f9ede366d02e3531ecbaec5e3769312f31cccd
|
||||
)
|
||||
FetchContent_MakeAvailable(libigl_tutorial_data)
|
||||
|
||||
add_library(igl_tutorial_data INTERFACE)
|
||||
add_library(igl::tutorial_data ALIAS igl_tutorial_data)
|
||||
|
||||
target_compile_definitions(igl_tutorial_data INTERFACE "-DTUTORIAL_SHARED_PATH=\"${libigl_tutorial_data_SOURCE_DIR}\"")
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
if(TARGET predicates::predicates)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'predicates::predicates'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
predicates
|
||||
GIT_REPOSITORY https://github.com/libigl/libigl-predicates.git
|
||||
GIT_TAG decb7bc1260e689cbe008109e3cc5d3a5a433aea
|
||||
)
|
||||
|
||||
FetchContent_MakeAvailable(predicates)
|
||||
add_library(predicates::predicates ALIAS predicates)
|
||||
|
||||
set_target_properties(predicates PROPERTIES FOLDER ThirdParty)
|
||||
Vendored
+16
@@ -0,0 +1,16 @@
|
||||
if(TARGET spectra::spectra)
|
||||
return()
|
||||
endif()
|
||||
include(FetchContent)
|
||||
|
||||
message(STATUS "Third-party: creating target 'spectra::spectra'")
|
||||
|
||||
# Use fork because yixuan/spectra struggles to find Eigen3
|
||||
FetchContent_Declare(
|
||||
Spectra
|
||||
GIT_REPOSITORY https://github.com/alecjacobson/spectra/
|
||||
GIT_TAG bbdc521b70a733c52ebfc0ac1484c82e13c3d140
|
||||
)
|
||||
FetchContent_MakeAvailable(Spectra)
|
||||
|
||||
add_library(spectra::spectra ALIAS Spectra)
|
||||
Vendored
+32
@@ -0,0 +1,32 @@
|
||||
if(TARGET stb::stb)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'stb::stb'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
stb
|
||||
GIT_REPOSITORY https://github.com/nothings/stb.git
|
||||
GIT_TAG f67165c2bb2af3060ecae7d20d6f731173485ad0
|
||||
)
|
||||
FetchContent_MakeAvailable(stb)
|
||||
|
||||
# Generate implementation file
|
||||
file(WRITE "${stb_BINARY_DIR}/stb_image.cpp.in" [[
|
||||
#define STB_IMAGE_IMPLEMENTATION
|
||||
#include <stb_image.h>
|
||||
|
||||
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
||||
#include <stb_image_write.h>
|
||||
]])
|
||||
|
||||
configure_file(${stb_BINARY_DIR}/stb_image.cpp.in ${stb_BINARY_DIR}/stb_image.cpp COPYONLY)
|
||||
|
||||
# Define stb library
|
||||
add_library(stb ${stb_BINARY_DIR}/stb_image.cpp)
|
||||
add_library(stb::stb ALIAS stb)
|
||||
|
||||
target_include_directories(stb PUBLIC "${stb_SOURCE_DIR}")
|
||||
|
||||
set_target_properties(stb PROPERTIES FOLDER ThirdParty)
|
||||
Vendored
+19
@@ -0,0 +1,19 @@
|
||||
if(TARGET tetgen::tetgen)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'tetgen::tetgen'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
tetgen
|
||||
GIT_REPOSITORY https://github.com/libigl/tetgen.git
|
||||
GIT_TAG e05aca7df74e3f531bc35733ed87d36d437266c5
|
||||
)
|
||||
|
||||
FetchContent_MakeAvailable(tetgen)
|
||||
add_library(tetgen::tetgen ALIAS tetgen)
|
||||
|
||||
target_include_directories(tetgen INTERFACE "${tetgen_SOURCE_DIR}")
|
||||
|
||||
set_target_properties(tetgen PROPERTIES FOLDER ThirdParty)
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
if(TARGET tinyxml2::tinyxml2)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'tinyxml2::tinyxml2'")
|
||||
|
||||
# TODO: Update tinyxml2 version + use FetchContent_MakeAvailable with upstream CMake code
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
tinyxml2
|
||||
GIT_REPOSITORY https://github.com/leethomason/tinyxml2.git
|
||||
GIT_TAG d175e9de0be0d4db75d0a8cf065599a435a87eb6
|
||||
)
|
||||
FetchContent_GetProperties(tinyxml2)
|
||||
if(NOT tinyxml2_POPULATED)
|
||||
FetchContent_Populate(tinyxml2)
|
||||
endif()
|
||||
|
||||
add_library(tinyxml2 STATIC ${tinyxml2_SOURCE_DIR}/tinyxml2.cpp ${tinyxml2_SOURCE_DIR}/tinyxml2.h)
|
||||
add_library(tinyxml2::tinyxml2 ALIAS tinyxml2)
|
||||
target_include_directories(tinyxml2 PUBLIC ${tinyxml2_SOURCE_DIR})
|
||||
set_target_properties(tinyxml2 PROPERTIES DEFINE_SYMBOL "TINYXML2_EXPORT")
|
||||
|
||||
set_target_properties(tinyxml2 PROPERTIES FOLDER ThirdParty)
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
if(TARGET triangle::triangle)
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Third-party: creating target 'triangle::triangle'")
|
||||
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
triangle
|
||||
GIT_REPOSITORY https://github.com/libigl/triangle.git
|
||||
GIT_TAG 62f02db9ab4ff4b62d5ff82a77c8ea458c84c23a
|
||||
)
|
||||
|
||||
FetchContent_MakeAvailable(triangle)
|
||||
add_library(triangle::triangle ALIAS triangle)
|
||||
|
||||
target_include_directories(triangle INTERFACE "${triangle_SOURCE_DIR}")
|
||||
|
||||
set_target_properties(triangle PROPERTIES FOLDER ThirdParty)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1 @@
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/../external/catch2.cmake)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1,2 @@
|
||||
hunter_add_package(Eigen)
|
||||
find_package(Eigen3 CONFIG REQUIRED)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1 @@
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/../external/libigl_tests_data.cmake)
|
||||
@@ -0,0 +1 @@
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/../external/libigl_tutorial_data.cmake)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
get_filename_component(current_filename ${CMAKE_CURRENT_LIST_FILE} NAME_WLE)
|
||||
message(FATAL_ERROR
|
||||
"${current_filename} is not set up to be used with Hunter. "
|
||||
"Please disable the libigl modules depending on it, or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
File diff suppressed because it is too large
Load Diff
+2729
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,54 @@
|
||||
# libigl - A simple C++ geometry processing library
|
||||
|
||||
This detailed documentation browser is automatically generated from the comments
|
||||
in libigl header (.h) files.
|
||||
|
||||
In general, each [libigl function](./namespaceigl.html#func-members) (e.g., `igl::func`) will be defined in a
|
||||
correspondingly named header file (e.g., `#include <igl/func.h>`).
|
||||
|
||||
The _core_ library only depends on the standard template library (`std::`) and
|
||||
Eigen. These functions reside directly the [`igl::` namespace](./namespaceigl.html)
|
||||
|
||||
Functions with further dependencies reside in a corresonding sub-namespace. For
|
||||
example, the function `igl::spectra::lscm` depends on the Spectra library so it
|
||||
resides in the [`igl::spectra::` namespace](./namespaceigl_1_1spectra.html).
|
||||
|
||||
Functions which depend on external code under a copyleft license reside in the
|
||||
[`igl::copyleft::` namepsace](file:///Users/alecjacobson/Repos/libigl/dox/namespaceigl_1_1copyleft.html).
|
||||
|
||||
|
||||
Most libigl functions are templated over the Eigen matrix inputs and outputs.
|
||||
Callers can choose their own scalar types (e.g., `double`/`float`) and storage
|
||||
orders (`Eigen::ColMajor`/`Eigen::RowMajor`). Libigl can be used as a:
|
||||
|
||||
- **header only library** (via CMake, make sure
|
||||
`LIBIGL_USE_STATIC_LIBRARY=OFF`) and insure that `IGL_STATIC_LIBRARY` is
|
||||
_not_ defined_ when compiling --- easiest if you're new to libigl, or
|
||||
- **static library** (`LIBIGL_USE_STATIC_LIBRARY=ON` → `IGL_STATIC_LIBRARY` is
|
||||
defined) --- speeds up repeated compilation.
|
||||
|
||||
The libigl static library is filled with _explicit template instantiations_ for
|
||||
common Eigen inputs and outputs. If the library doesn't contain your types, you
|
||||
may get some form of linker error (e.g., `Undefined symbols for architecture`,
|
||||
`undefined reference to` or `unresolved external symbol`).
|
||||
|
||||
You can fix this by:
|
||||
|
||||
1. Switching to header only mode for your project,
|
||||
2. Making a file in your project to compile the missing templates. E.g., `my_templates.cpp`
|
||||
```cpp
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
#undef IGL_STATIC_LIBRARY
|
||||
#endif
|
||||
#include <igl/per_vertex_normals.h>
|
||||
template void igl::per_vertex_normals<Eigen::Matrix<float, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);
|
||||
```
|
||||
3. [Submit a PR](https://github.com/libigl/libigl/pulls) containing your missing template to the development branch of libigl
|
||||
4. Change your input/output types to match existing templates (e.g., `Eigen::MatrixXd`).
|
||||
|
||||
|
||||
|
||||
|
||||
https://libigl.github.io/
|
||||
|
||||
https://github.com/libigl/libigl/
|
||||
+1057
-368
File diff suppressed because it is too large
Load Diff
+636
-194
File diff suppressed because it is too large
Load Diff
@@ -9,27 +9,24 @@
|
||||
#define IGL_ARAPENERGYTYPE_H
|
||||
namespace igl
|
||||
{
|
||||
// ARAP_ENERGY_TYPE_SPOKES "As-rigid-as-possible Surface Modeling" by [Sorkine and
|
||||
// Alexa 2007], rotations defined at vertices affecting incident edges,
|
||||
// default
|
||||
// ARAP_ENERGY_TYPE_SPOKES-AND-RIMS Adapted version of "As-rigid-as-possible Surface
|
||||
// Modeling" by [Sorkine and Alexa 2007] presented in section 4.2 of or
|
||||
// "A simple geometric model for elastic deformation" by [Chao et al.
|
||||
// 2010], rotations defined at vertices affecting incident edges and
|
||||
// opposite edges
|
||||
// ARAP_ENERGY_TYPE_ELEMENTS "A local-global approach to mesh parameterization" by
|
||||
// [Liu et al. 2010] or "A simple geometric model for elastic
|
||||
// deformation" by [Chao et al. 2010], rotations defined at elements
|
||||
// (triangles or tets)
|
||||
// ARAP_ENERGY_TYPE_DEFAULT Choose one automatically: spokes and rims
|
||||
// for surfaces, elements for planar meshes and tets (not fully
|
||||
// supported)
|
||||
/// Enum for choosing ARAP energy type
|
||||
enum ARAPEnergyType
|
||||
{
|
||||
/// "As-rigid-as-possible Surface Modeling" by [Sorkine and Alexa 2007],
|
||||
/// rotations defined at vertices affecting incident edges, default
|
||||
ARAP_ENERGY_TYPE_SPOKES = 0,
|
||||
/// Adapted version of "As-rigid-as-possible Surface Modeling" by [Sorkine
|
||||
/// and Alexa 2007] presented in section 4.2 of or "A simple geometric model
|
||||
/// for elastic deformation" by [Chao et al.\ 2010], rotations defined at
|
||||
/// vertices affecting incident edges and opposite edges
|
||||
ARAP_ENERGY_TYPE_SPOKES_AND_RIMS = 1,
|
||||
/// "A local-global approach to mesh parameterization" by [Liu et al.\ 2010]
|
||||
/// or "A simple geometric model for elastic deformation" by [Chao et al.\ 2010], rotations defined at elements (triangles or tets)
|
||||
ARAP_ENERGY_TYPE_ELEMENTS = 2,
|
||||
/// Choose one automatically: spokes and rims for surfaces, elements for
|
||||
/// planar meshes and tets (not fully supported)
|
||||
ARAP_ENERGY_TYPE_DEFAULT = 3,
|
||||
/// Total number of types
|
||||
NUM_ARAP_ENERGY_TYPES = 4
|
||||
};
|
||||
}
|
||||
|
||||
+13
-12
@@ -6,6 +6,7 @@
|
||||
// v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
||||
// obtain one at http://mozilla.org/MPL/2.0/.
|
||||
#include "AtA_cached.h"
|
||||
#include "IGL_ASSERT.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
@@ -34,12 +35,12 @@ IGL_INLINE void igl::AtA_cached_precompute(
|
||||
int col = k;
|
||||
int row = *(A.innerIndexPtr()+l);
|
||||
int value_index = l;
|
||||
assert(col < A.cols());
|
||||
assert(col >= 0);
|
||||
assert(row < A.rows());
|
||||
assert(row >= 0);
|
||||
assert(value_index >= 0);
|
||||
assert(value_index < A.nonZeros());
|
||||
IGL_ASSERT(col < A.cols());
|
||||
IGL_ASSERT(col >= 0);
|
||||
IGL_ASSERT(row < A.rows());
|
||||
IGL_ASSERT(row >= 0);
|
||||
IGL_ASSERT(value_index >= 0);
|
||||
IGL_ASSERT(value_index < A.nonZeros());
|
||||
|
||||
Col_RowPtr[col].push_back(row);
|
||||
Col_IndexPtr[col].push_back(value_index);
|
||||
@@ -74,12 +75,12 @@ IGL_INLINE void igl::AtA_cached_precompute(
|
||||
int col = k;
|
||||
int row = *(AtA.innerIndexPtr()+l);
|
||||
int value_index = l;
|
||||
assert(col < AtA.cols());
|
||||
assert(col >= 0);
|
||||
assert(row < AtA.rows());
|
||||
assert(row >= 0);
|
||||
assert(value_index >= 0);
|
||||
assert(value_index < AtA.nonZeros());
|
||||
IGL_ASSERT(col < AtA.cols());
|
||||
IGL_ASSERT(col >= 0);
|
||||
IGL_ASSERT(row < AtA.rows());
|
||||
IGL_ASSERT(row >= 0);
|
||||
IGL_ASSERT(value_index >= 0);
|
||||
IGL_ASSERT(value_index < AtA.nonZeros());
|
||||
|
||||
data.I_outer.push_back(data.I_row.size());
|
||||
|
||||
|
||||
+32
-20
@@ -13,40 +13,47 @@
|
||||
#include <Eigen/Sparse>
|
||||
namespace igl
|
||||
{
|
||||
/// Hold precomputed data for AtA_cached
|
||||
struct AtA_cached_data
|
||||
{
|
||||
// Weights
|
||||
/// Weights (diagonal of W)
|
||||
Eigen::VectorXd W;
|
||||
|
||||
// Flatten composition rules
|
||||
/// @private
|
||||
std::vector<int> I_row;
|
||||
/// @private
|
||||
std::vector<int> I_col;
|
||||
/// @private
|
||||
std::vector<int> I_w;
|
||||
|
||||
// For each entry of AtA, points to the beginning
|
||||
// of the composition rules
|
||||
/// @private
|
||||
std::vector<int> I_outer;
|
||||
};
|
||||
|
||||
// Computes At * W * A, where A is sparse and W is diagonal. Divides the
|
||||
// construction in two phases, one
|
||||
// for fixing the sparsity pattern, and one to populate it with values. Compared to
|
||||
// evaluating it directly, this version is slower for the first time (since it requires a
|
||||
// precomputation), but faster to the subsequent evaluations.
|
||||
//
|
||||
// Input:
|
||||
// A m x n sparse matrix
|
||||
// data stores the precomputed sparsity pattern, data.W contains the optional diagonal weights (stored as a dense vector). If W is not provided, it is replaced by the identity.
|
||||
// Outputs:
|
||||
// AtA m by m matrix computed as AtA * W * A
|
||||
//
|
||||
// Example:
|
||||
// AtA_data = igl::AtA_cached_data();
|
||||
// AtA_data.W = W;
|
||||
// if (s.AtA.rows() == 0)
|
||||
// igl::AtA_cached_precompute(s.A,s.AtA_data,s.AtA);
|
||||
// else
|
||||
// igl::AtA_cached(s.A,s.AtA_data,s.AtA);
|
||||
/// Computes At * W * A, where A is sparse and W is diagonal.
|
||||
///
|
||||
/// Divides the construction in two phases, one for fixing the sparsity
|
||||
/// pattern, and one to populate it with values. Compared to evaluating it
|
||||
/// directly, this version is slower for the first time (since it requires a
|
||||
/// precomputation), but faster to the subsequent evaluations.
|
||||
///
|
||||
/// @param[in] A m x n sparse matrix
|
||||
/// @param[in,out] data stores the precomputed sparsity pattern, data.W contains the optional diagonal weights (stored as a dense vector). If W is not provided, it is replaced by the identity.
|
||||
/// @param[out] AtA m by m matrix computed as AtA * W * A
|
||||
///
|
||||
/// #### Example:
|
||||
///
|
||||
/// \code{cpp}
|
||||
/// AtA_data = igl::AtA_cached_data();
|
||||
/// AtA_data.W = W;
|
||||
/// if (s.AtA.rows() == 0)
|
||||
/// igl::AtA_cached_precompute(s.A,s.AtA_data,s.AtA);
|
||||
/// else
|
||||
/// igl::AtA_cached(s.A,s.AtA_data,s.AtA);
|
||||
/// \endcode
|
||||
template <typename Scalar>
|
||||
IGL_INLINE void AtA_cached_precompute(
|
||||
const Eigen::SparseMatrix<Scalar>& A,
|
||||
@@ -54,6 +61,11 @@ namespace igl
|
||||
Eigen::SparseMatrix<Scalar>& AtA
|
||||
);
|
||||
|
||||
/// Computes At * W * A, where A is sparse and W is diagonal precomputed into data.
|
||||
///
|
||||
/// @param[in] A m x n sparse matrix
|
||||
/// @param[in] data stores the precomputed sparsity pattern, data.W contains the optional diagonal weights (stored as a dense vector). If W is not provided, it is replaced by the identity.
|
||||
/// @param[out] AtA m by m matrix computed as AtA * W * A
|
||||
template <typename Scalar>
|
||||
IGL_INLINE void AtA_cached(
|
||||
const Eigen::SparseMatrix<Scalar>& A,
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2025 Alec Jacobson <alecjacobson@gmail.com>
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the Mozilla Public License
|
||||
// v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
||||
// obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
#ifndef IGL_COLLAPSE_EDGE_NULL_H
|
||||
#define IGL_COLLAPSE_EDGE_NULL_H
|
||||
namespace igl
|
||||
{
|
||||
#ifndef IGL_COLLAPSE_EDGE_NULL
|
||||
/// Special value for indicating a null vertex index as the result of a
|
||||
/// collapsed edge.
|
||||
#define IGL_COLLAPSE_EDGE_NULL 0
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
+16
-5
@@ -7,12 +7,23 @@
|
||||
// obtain one at http://mozilla.org/MPL/2.0/.
|
||||
#ifndef IGL_C_STR_H
|
||||
#define IGL_C_STR_H
|
||||
// http://stackoverflow.com/a/2433143/148668
|
||||
// Suppose you have a function:
|
||||
// void func(const char * c);
|
||||
// Then you can write:
|
||||
// func(C_STR("foo"<<1<<"bar"));
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
/// Convert a stream of things to a const char *.
|
||||
///
|
||||
/// Suppose you have a function:
|
||||
/// \code{cpp}
|
||||
/// void func(const char * c);
|
||||
/// \endcode
|
||||
/// Then you can write:
|
||||
/// \code{cpp}
|
||||
/// func(C_STR("foo"<<1<<"bar"));
|
||||
/// \endcode
|
||||
/// which is equivalent to:
|
||||
/// \code{cpp}
|
||||
/// func("foo1bar");
|
||||
/// \endcode
|
||||
///
|
||||
// http://stackoverflow.com/a/2433143/148668
|
||||
#define C_STR(X) static_cast<std::ostringstream&>(std::ostringstream().flush() << X).str().c_str()
|
||||
#endif
|
||||
|
||||
@@ -1,359 +0,0 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the Mozilla Public License
|
||||
// v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
||||
// obtain one at http://mozilla.org/MPL/2.0/.
|
||||
#ifndef IGL_CAMERA_H
|
||||
#define IGL_CAMERA_H
|
||||
|
||||
// you're idiot, M$!
|
||||
#if defined(_WIN32)
|
||||
#undef far
|
||||
#undef near
|
||||
#endif
|
||||
|
||||
#include <Eigen/Geometry>
|
||||
#include <Eigen/Core>
|
||||
#include "PI.h"
|
||||
|
||||
#define IGL_CAMERA_MIN_ANGLE 5.0
|
||||
namespace igl
|
||||
{
|
||||
|
||||
// A simple camera class. The camera stores projection parameters (field of
|
||||
// view angle, aspect ratio, near and far clips) as well as a rigid
|
||||
// transformation *of the camera as if it were also a scene object*. Thus, the
|
||||
// **inverse** of this rigid transformation is the modelview transformation.
|
||||
class Camera
|
||||
{
|
||||
public:
|
||||
// On windows you might need: -fno-delayed-template-parsing
|
||||
//static constexpr double IGL_CAMERA_MIN_ANGLE = 5.;
|
||||
// m_angle Field of view angle in degrees {45}
|
||||
// m_aspect Aspect ratio {1}
|
||||
// m_near near clipping plane {1e-2}
|
||||
// m_far far clipping plane {100}
|
||||
// m_at_dist distance of looking at point {1}
|
||||
// m_orthographic whether to use othrographic projection {false}
|
||||
// m_rotation_conj Conjugate of rotation part of rigid transformation of
|
||||
// camera {identity}. Note: we purposefully store the conjugate because
|
||||
// this is what TW_TYPE_QUAT4D is expecting.
|
||||
// m_translation Translation part of rigid transformation of camera
|
||||
// {(0,0,1)}
|
||||
double m_angle, m_aspect, m_near, m_far, m_at_dist;
|
||||
bool m_orthographic;
|
||||
Eigen::Quaterniond m_rotation_conj;
|
||||
Eigen::Vector3d m_translation;
|
||||
public:
|
||||
inline Camera();
|
||||
inline virtual ~Camera(){}
|
||||
// Return projection matrix that takes relative camera coordinates and
|
||||
// transforms it to viewport coordinates
|
||||
//
|
||||
// Note:
|
||||
//
|
||||
// if(m_angle > 0)
|
||||
// {
|
||||
// gluPerspective(m_angle,m_aspect,m_near,m_at_dist+m_far);
|
||||
// }else
|
||||
// {
|
||||
// gluOrtho(-0.5*aspect,0.5*aspect,-0.5,0.5,m_at_dist+m_near,m_far);
|
||||
// }
|
||||
//
|
||||
// Is equivalent to
|
||||
//
|
||||
// glMultMatrixd(projection().data());
|
||||
//
|
||||
inline Eigen::Matrix4d projection() const;
|
||||
// Return an Affine transformation (rigid actually) that
|
||||
// takes relative coordinates and tramsforms them into world 3d
|
||||
// coordinates: moves the camera into the scene.
|
||||
inline Eigen::Affine3d affine() const;
|
||||
// Return an Affine transformation (rigid actually) that puts the takes a
|
||||
// world 3d coordinate and transforms it into the relative camera
|
||||
// coordinates: moves the scene in front of the camera.
|
||||
//
|
||||
// Note:
|
||||
//
|
||||
// gluLookAt(
|
||||
// eye()(0), eye()(1), eye()(2),
|
||||
// at()(0), at()(1), at()(2),
|
||||
// up()(0), up()(1), up()(2));
|
||||
//
|
||||
// Is equivalent to
|
||||
//
|
||||
// glMultMatrixd(camera.inverse().matrix().data());
|
||||
//
|
||||
// See also: affine, eye, at, up
|
||||
inline Eigen::Affine3d inverse() const;
|
||||
// Returns world coordinates position of center or "eye" of camera.
|
||||
inline Eigen::Vector3d eye() const;
|
||||
// Returns world coordinate position of a point "eye" is looking at.
|
||||
inline Eigen::Vector3d at() const;
|
||||
// Returns world coordinate unit vector of "up" vector
|
||||
inline Eigen::Vector3d up() const;
|
||||
// Return top right corner of unit plane in relative coordinates, that is
|
||||
// (w/2,h/2,1)
|
||||
inline Eigen::Vector3d unit_plane() const;
|
||||
// Move dv in the relative coordinate frame of the camera (move the FPS)
|
||||
//
|
||||
// Inputs:
|
||||
// dv (x,y,z) displacement vector
|
||||
//
|
||||
inline void dolly(const Eigen::Vector3d & dv);
|
||||
// "Scale zoom": Move `eye`, but leave `at`
|
||||
//
|
||||
// Input:
|
||||
// s amount to scale distance to at
|
||||
inline void push_away(const double s);
|
||||
// Aka "Hitchcock", "Vertigo", "Spielberg" or "Trombone" zoom:
|
||||
// simultaneously dolly while changing angle so that `at` not only stays
|
||||
// put in relative coordinates but also projected coordinates. That is
|
||||
//
|
||||
// Inputs:
|
||||
// da change in angle in degrees
|
||||
inline void dolly_zoom(const double da);
|
||||
// Turn around eye so that rotation is now q
|
||||
//
|
||||
// Inputs:
|
||||
// q new rotation as quaternion
|
||||
inline void turn_eye(const Eigen::Quaterniond & q);
|
||||
// Orbit around at so that rotation is now q
|
||||
//
|
||||
// Inputs:
|
||||
// q new rotation as quaternion
|
||||
inline void orbit(const Eigen::Quaterniond & q);
|
||||
// Rotate and translate so that camera is situated at "eye" looking at "at"
|
||||
// with "up" pointing up.
|
||||
//
|
||||
// Inputs:
|
||||
// eye (x,y,z) coordinates of eye position
|
||||
// at (x,y,z) coordinates of at position
|
||||
// up (x,y,z) coordinates of up vector
|
||||
inline void look_at(
|
||||
const Eigen::Vector3d & eye,
|
||||
const Eigen::Vector3d & at,
|
||||
const Eigen::Vector3d & up);
|
||||
// Needed any time Eigen Structures are used as class members
|
||||
// http://eigen.tuxfamily.org/dox-devel/group__TopicStructHavingEigenMembers.html
|
||||
public:
|
||||
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
|
||||
};
|
||||
}
|
||||
|
||||
// Implementation
|
||||
#include "PI.h"
|
||||
#include "EPS.h"
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
#include <cassert>
|
||||
|
||||
inline igl::Camera::Camera():
|
||||
m_angle(45.0),m_aspect(1),m_near(1e-2),m_far(100),m_at_dist(1),
|
||||
m_orthographic(false),
|
||||
m_rotation_conj(1,0,0,0),
|
||||
m_translation(0,0,1)
|
||||
{
|
||||
}
|
||||
|
||||
inline Eigen::Matrix4d igl::Camera::projection() const
|
||||
{
|
||||
Eigen::Matrix4d P;
|
||||
using namespace std;
|
||||
const double far = m_at_dist + m_far;
|
||||
const double near = m_near;
|
||||
// http://stackoverflow.com/a/3738696/148668
|
||||
if(m_orthographic)
|
||||
{
|
||||
const double f = 0.5;
|
||||
const double left = -f*m_aspect;
|
||||
const double right = f*m_aspect;
|
||||
const double bottom = -f;
|
||||
const double top = f;
|
||||
const double tx = (right+left)/(right-left);
|
||||
const double ty = (top+bottom)/(top-bottom);
|
||||
const double tz = (far+near)/(far-near);
|
||||
const double z_fix = 0.5 /m_at_dist / tan(m_angle*0.5 * (igl::PI/180.) );
|
||||
P<<
|
||||
z_fix*2./(right-left), 0, 0, -tx,
|
||||
0, z_fix*2./(top-bottom), 0, -ty,
|
||||
0, 0, -z_fix*2./(far-near), -tz,
|
||||
0, 0, 0, 1;
|
||||
}else
|
||||
{
|
||||
const double yScale = tan(PI*0.5 - 0.5*m_angle*PI/180.);
|
||||
// http://stackoverflow.com/a/14975139/148668
|
||||
const double xScale = yScale/m_aspect;
|
||||
P<<
|
||||
xScale, 0, 0, 0,
|
||||
0, yScale, 0, 0,
|
||||
0, 0, -(far+near)/(far-near), -1,
|
||||
0, 0, -2.*near*far/(far-near), 0;
|
||||
P = P.transpose().eval();
|
||||
}
|
||||
return P;
|
||||
}
|
||||
|
||||
inline Eigen::Affine3d igl::Camera::affine() const
|
||||
{
|
||||
using namespace Eigen;
|
||||
Affine3d t = Affine3d::Identity();
|
||||
t.rotate(m_rotation_conj.conjugate());
|
||||
t.translate(m_translation);
|
||||
return t;
|
||||
}
|
||||
|
||||
inline Eigen::Affine3d igl::Camera::inverse() const
|
||||
{
|
||||
using namespace Eigen;
|
||||
Affine3d t = Affine3d::Identity();
|
||||
t.translate(-m_translation);
|
||||
t.rotate(m_rotation_conj);
|
||||
return t;
|
||||
}
|
||||
|
||||
inline Eigen::Vector3d igl::Camera::eye() const
|
||||
{
|
||||
using namespace Eigen;
|
||||
return affine() * Vector3d(0,0,0);
|
||||
}
|
||||
|
||||
inline Eigen::Vector3d igl::Camera::at() const
|
||||
{
|
||||
using namespace Eigen;
|
||||
return affine() * (Vector3d(0,0,-1)*m_at_dist);
|
||||
}
|
||||
|
||||
inline Eigen::Vector3d igl::Camera::up() const
|
||||
{
|
||||
using namespace Eigen;
|
||||
Affine3d t = Affine3d::Identity();
|
||||
t.rotate(m_rotation_conj.conjugate());
|
||||
return t * Vector3d(0,1,0);
|
||||
}
|
||||
|
||||
inline Eigen::Vector3d igl::Camera::unit_plane() const
|
||||
{
|
||||
// Distance of center pixel to eye
|
||||
const double d = 1.0;
|
||||
const double a = m_aspect;
|
||||
const double theta = m_angle*PI/180.;
|
||||
const double w =
|
||||
2.*sqrt(-d*d/(a*a*pow(tan(0.5*theta),2.)-1.))*a*tan(0.5*theta);
|
||||
const double h = w/a;
|
||||
return Eigen::Vector3d(w*0.5,h*0.5,-d);
|
||||
}
|
||||
|
||||
inline void igl::Camera::dolly(const Eigen::Vector3d & dv)
|
||||
{
|
||||
m_translation += dv;
|
||||
}
|
||||
|
||||
inline void igl::Camera::push_away(const double s)
|
||||
{
|
||||
using namespace Eigen;
|
||||
#ifndef NDEBUG
|
||||
Vector3d old_at = at();
|
||||
#endif
|
||||
const double old_at_dist = m_at_dist;
|
||||
m_at_dist = old_at_dist * s;
|
||||
dolly(Vector3d(0,0,1)*(m_at_dist - old_at_dist));
|
||||
assert((old_at-at()).squaredNorm() < DOUBLE_EPS);
|
||||
}
|
||||
|
||||
inline void igl::Camera::dolly_zoom(const double da)
|
||||
{
|
||||
using namespace std;
|
||||
using namespace Eigen;
|
||||
#ifndef NDEBUG
|
||||
Vector3d old_at = at();
|
||||
#endif
|
||||
const double old_angle = m_angle;
|
||||
if(old_angle + da < IGL_CAMERA_MIN_ANGLE)
|
||||
{
|
||||
m_orthographic = true;
|
||||
}else if(old_angle + da > IGL_CAMERA_MIN_ANGLE)
|
||||
{
|
||||
m_orthographic = false;
|
||||
}
|
||||
if(!m_orthographic)
|
||||
{
|
||||
m_angle += da;
|
||||
m_angle = min(89.,max(IGL_CAMERA_MIN_ANGLE,m_angle));
|
||||
// change in distance
|
||||
const double s =
|
||||
(2.*tan(old_angle/2./180.*igl::PI)) /
|
||||
(2.*tan(m_angle/2./180.*igl::PI)) ;
|
||||
const double old_at_dist = m_at_dist;
|
||||
m_at_dist = old_at_dist * s;
|
||||
dolly(Vector3d(0,0,1)*(m_at_dist - old_at_dist));
|
||||
assert((old_at-at()).squaredNorm() < DOUBLE_EPS);
|
||||
}
|
||||
}
|
||||
|
||||
inline void igl::Camera::turn_eye(const Eigen::Quaterniond & q)
|
||||
{
|
||||
using namespace Eigen;
|
||||
Vector3d old_eye = eye();
|
||||
// eye should be fixed
|
||||
//
|
||||
// eye_1 = R_1 * t_1 = eye_0
|
||||
// t_1 = R_1' * eye_0
|
||||
m_rotation_conj = q.conjugate();
|
||||
m_translation = m_rotation_conj * old_eye;
|
||||
assert((old_eye - eye()).squaredNorm() < DOUBLE_EPS);
|
||||
}
|
||||
|
||||
inline void igl::Camera::orbit(const Eigen::Quaterniond & q)
|
||||
{
|
||||
using namespace Eigen;
|
||||
Vector3d old_at = at();
|
||||
// at should be fixed
|
||||
//
|
||||
// at_1 = R_1 * t_1 - R_1 * z = at_0
|
||||
// t_1 = R_1' * (at_0 + R_1 * z)
|
||||
m_rotation_conj = q.conjugate();
|
||||
m_translation =
|
||||
m_rotation_conj *
|
||||
(old_at +
|
||||
m_rotation_conj.conjugate() * Vector3d(0,0,1) * m_at_dist);
|
||||
assert((old_at - at()).squaredNorm() < DOUBLE_EPS);
|
||||
}
|
||||
|
||||
inline void igl::Camera::look_at(
|
||||
const Eigen::Vector3d & eye,
|
||||
const Eigen::Vector3d & at,
|
||||
const Eigen::Vector3d & up)
|
||||
{
|
||||
using namespace Eigen;
|
||||
using namespace std;
|
||||
// http://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml
|
||||
// Normalize vector from at to eye
|
||||
Vector3d F = eye-at;
|
||||
m_at_dist = F.norm();
|
||||
F.normalize();
|
||||
// Project up onto plane orthogonal to F and normalize
|
||||
assert(up.cross(F).norm() > DOUBLE_EPS && "(eye-at) x up ≈ 0");
|
||||
const Vector3d proj_up = (up-(up.dot(F))*F).normalized();
|
||||
Quaterniond a,b;
|
||||
a.setFromTwoVectors(Vector3d(0,0,-1),-F);
|
||||
b.setFromTwoVectors(a*Vector3d(0,1,0),proj_up);
|
||||
m_rotation_conj = (b*a).conjugate();
|
||||
m_translation = m_rotation_conj * eye;
|
||||
//cout<<"m_at_dist: "<<m_at_dist<<endl;
|
||||
//cout<<"proj_up: "<<proj_up.transpose()<<endl;
|
||||
//cout<<"F: "<<F.transpose()<<endl;
|
||||
//cout<<"eye(): "<<this->eye().transpose()<<endl;
|
||||
//cout<<"at(): "<<this->at().transpose()<<endl;
|
||||
//cout<<"eye()-at(): "<<(this->eye()-this->at()).normalized().transpose()<<endl;
|
||||
//cout<<"eye-this->eye(): "<<(eye-this->eye()).squaredNorm()<<endl;
|
||||
assert( (eye-this->eye()).squaredNorm() < DOUBLE_EPS);
|
||||
//assert((F-(this->eye()-this->at()).normalized()).squaredNorm() <
|
||||
// DOUBLE_EPS);
|
||||
assert( (at-this->at()).squaredNorm() < DOUBLE_EPS);
|
||||
//assert( (proj_up-this->up()).squaredNorm() < DOUBLE_EPS);
|
||||
}
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user