Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc17178bed | ||
|
|
f4585a8ca9 | ||
|
|
c5e6f66748 | ||
|
|
780a5fbea5 | ||
|
|
61588efa78 | ||
|
|
cef9c6594f | ||
|
|
9de4b6640f | ||
|
|
7ebb86734a | ||
|
|
5b7b50c026 | ||
|
|
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 | ||
|
|
5c5eddcd55 | ||
|
|
e14a3bd0a1 | ||
|
|
72f0b5844b | ||
|
|
7e70dfbbff | ||
|
|
5b11835be1 | ||
|
|
829eaa54b6 | ||
|
|
d402d94959 | ||
|
|
60ea43092c | ||
|
|
03e65b95ca | ||
|
|
04457f1eae | ||
|
|
29b75796b2 | ||
|
|
6664ffef18 | ||
|
|
7ae4fb1fc1 | ||
|
|
2cd50a8bc8 | ||
|
|
78a212d4ca | ||
|
|
215994dc07 | ||
|
|
e88249f68d | ||
|
|
1f4a27e73c | ||
|
|
f2cc26f284 | ||
|
|
8e35d87991 | ||
|
|
4516d19268 | ||
|
|
80e763d372 | ||
|
|
7798748774 | ||
|
|
1aa35de249 | ||
|
|
5a6e3125f3 | ||
|
|
18c5a9ddf0 | ||
|
|
8f33348c29 | ||
|
|
c47f1dab9b | ||
|
|
6f5fadd154 | ||
|
|
a6ca070009 | ||
|
|
e8b2170dd3 | ||
|
|
b632972487 | ||
|
|
9fa54a0398 | ||
|
|
0c5bb13883 | ||
|
|
651fc234cd | ||
|
|
4ca4f8b341 | ||
|
|
4ab389d462 | ||
|
|
c16bc37fcb | ||
|
|
1ad57f019c | ||
|
|
698c316159 | ||
|
|
faaae91419 | ||
|
|
0f557400f9 | ||
|
|
df5b320f57 | ||
|
|
a90a67bdf2 | ||
|
|
a203de97aa | ||
|
|
4827b40640 | ||
|
|
f029832904 | ||
|
|
7576c3b8ad | ||
|
|
10dc1fd9f8 | ||
|
|
546452da5a | ||
|
|
c1c88fd78b | ||
|
|
c907add524 | ||
|
|
726cd540c3 | ||
|
|
b9093020ab | ||
|
|
021ec6f946 | ||
|
|
b550323ef0 | ||
|
|
5c7298c2fc | ||
|
|
5239d12eb3 | ||
|
|
01466e5bd6 | ||
|
|
3cb4894eaf | ||
|
|
62b3350271 | ||
|
|
52c6f14ca6 | ||
|
|
4ce917d424 | ||
|
|
26053f696c | ||
|
|
92b25d30a8 | ||
|
|
87bfaeeba8 | ||
|
|
79e7a05b16 | ||
|
|
56f129e440 | ||
|
|
5987ee483e | ||
|
|
87b54fc4dc | ||
|
|
d3052ef4c7 | ||
|
|
252017af44 | ||
|
|
ea0515088e | ||
|
|
03528b295e | ||
|
|
abdc6792d7 | ||
|
|
579385f107 | ||
|
|
5d9d9c8eff | ||
|
|
d9b218f1f8 | ||
|
|
77ed6247cb | ||
|
|
05812f73a6 | ||
|
|
1f796d4d27 | ||
|
|
b95646d268 | ||
|
|
d46d9c8ef5 | ||
|
|
37b087a275 | ||
|
|
0f73830f92 | ||
|
|
10ad76e11e | ||
|
|
3d05330b68 | ||
|
|
3a1eb5446a | ||
|
|
9e25fbbb0f | ||
|
|
8f17104fdc | ||
|
|
b38c6d7341 | ||
|
|
e84d628a1e | ||
|
|
1698dfb51a | ||
|
|
d47eeaa5ba | ||
|
|
105b57dd48 | ||
|
|
9207ee1502 | ||
|
|
5847741f3e | ||
|
|
6c50f857a9 | ||
|
|
880cfa9885 | ||
|
|
3637cf3ca9 | ||
|
|
8b96d8ca96 | ||
|
|
317379941f | ||
|
|
12f6b60147 | ||
|
|
46a8dd2fd4 | ||
|
|
6a7428694f | ||
|
|
472ee3e576 | ||
|
|
fabb4ae4ec | ||
|
|
9c18186640 | ||
|
|
bcbcabf9d3 | ||
|
|
9b4ffcc591 | ||
|
|
b29964ccbc | ||
|
|
00e749bf8c | ||
|
|
8507b929cd | ||
|
|
2c3c2b86f4 | ||
|
|
abe94567a8 | ||
|
|
a7e2fdd3ed | ||
|
|
017be56c49 | ||
|
|
f323a8ecb1 | ||
|
|
2ecb5fc85f | ||
|
|
6121d86961 | ||
|
|
88e3dd1e3e | ||
|
|
024785513b | ||
|
|
4b3a874276 | ||
|
|
4bc8ad5206 | ||
|
|
7ab7dc7394 | ||
|
|
9145faf782 | ||
|
|
911124a37b | ||
|
|
306b7c7c78 | ||
|
|
a26951b219 | ||
|
|
1af9b9707f | ||
|
|
1ac07a19a4 | ||
|
|
27aee6490b | ||
|
|
f2d7b0ccb0 | ||
|
|
a8f978a42b | ||
|
|
6d48149a10 | ||
|
|
bdcb2c34c1 | ||
|
|
8ddec02a01 | ||
|
|
b856e042e2 | ||
|
|
3b0cd79fde | ||
|
|
e470b2ea9e | ||
|
|
ea36b688e0 | ||
|
|
46f534515b | ||
|
|
f4d14cc7d1 | ||
|
|
b4faebf34e | ||
|
|
e2548f971c | ||
|
|
6983cfd1f4 | ||
|
|
72cc55c16e | ||
|
|
ca24107dda | ||
|
|
2f570a0e97 | ||
|
|
edb21bef2c | ||
|
|
48e3c72dfe | ||
|
|
d7dd3c2356 | ||
|
|
2746958a89 | ||
|
|
9c049ec9be | ||
|
|
f41aa6ea3d | ||
|
|
d4526d742f | ||
|
|
28f20cdc18 | ||
|
|
39dd969ce8 | ||
|
|
3eb0d1c670 | ||
|
|
bd8fc309e3 | ||
|
|
92f26006cd | ||
|
|
e8969c21a6 | ||
|
|
02936bb200 | ||
|
|
1445ad2a50 | ||
|
|
61878ade62 | ||
|
|
3404ee671b | ||
|
|
21d95881ed | ||
|
|
47da86a30d | ||
|
|
8cbc8da130 | ||
|
|
e27c51529a | ||
|
|
9bdb6a4554 | ||
|
|
83b8e45103 | ||
|
|
e4507bbe99 | ||
|
|
9294ba04c2 | ||
|
|
b29b067ff2 | ||
|
|
c9c2d3db79 | ||
|
|
b819252a49 | ||
|
|
1bd4a63b29 | ||
|
|
af2e58d313 | ||
|
|
3840f803f3 | ||
|
|
c645aac0c5 | ||
|
|
9b51e2225e | ||
|
|
a65d3d2bef | ||
|
|
b0d7740e0b | ||
|
|
bae71eb04b | ||
|
|
30c7b6b0e0 | ||
|
|
238c5a6226 | ||
|
|
4e5dfe1aae | ||
|
|
8e3b2d913d | ||
|
|
4c6d732a8b | ||
|
|
964beea9bf | ||
|
|
32e8366702 | ||
|
|
465ad7c9c4 | ||
|
|
7a31b0801c | ||
|
|
c74bfe9504 | ||
|
|
71d1553a01 | ||
|
|
6349d39893 | ||
|
|
8d1b2f9e87 | ||
|
|
243ab03cce | ||
|
|
ad5747423b | ||
|
|
c2a4fdc912 | ||
|
|
62a01167b6 | ||
|
|
a9e2ce5fc5 | ||
|
|
7f6f1670b4 | ||
|
|
0ba3e92274 | ||
|
|
894703eba8 | ||
|
|
3c5698acfa | ||
|
|
0bb49a9f77 | ||
|
|
f78ff3afe2 | ||
|
|
7435cce28c | ||
|
|
de91fdd9d0 | ||
|
|
a03d1a2d56 | ||
|
|
b79e8374a8 | ||
|
|
dd98677630 | ||
|
|
81c74cf300 | ||
|
|
1958f02fff | ||
|
|
80b2282f69 | ||
|
|
dc1a4bbd47 | ||
|
|
40079347cb | ||
|
|
4b45b79e64 | ||
|
|
d77c8d1647 | ||
|
|
9d2ed3d718 | ||
|
|
247dbcad52 | ||
|
|
91bdb81556 | ||
|
|
f008687ce4 | ||
|
|
46db744e3c | ||
|
|
e5cded34ff | ||
|
|
512cfd6830 | ||
|
|
3255d6d3d9 | ||
|
|
21da5574cd | ||
|
|
594ae9b64e | ||
|
|
8cee0a2d89 | ||
|
|
46c5349641 | ||
|
|
84b994b1cf | ||
|
|
302073a5f6 | ||
|
|
719d3f84c1 | ||
|
|
734ff706a9 | ||
|
|
f6ffa60ce8 | ||
|
|
f56d32d546 | ||
|
|
eb1466ef5f | ||
|
|
1e3cfb42c7 | ||
|
|
bc480bc59b | ||
|
|
ce432e4f11 | ||
|
|
c65eb586fe | ||
|
|
457d07b7bf | ||
|
|
6fb2fc37f4 | ||
|
|
b1394524b4 | ||
|
|
474862caaa | ||
|
|
7e115556af | ||
|
|
497308a3a8 | ||
|
|
cfc1123042 | ||
|
|
e6ecc66496 | ||
|
|
0dfaf2a32c | ||
|
|
84c886b482 | ||
|
|
ed98693ff8 | ||
|
|
40db7208d0 | ||
|
|
7361a30ecb | ||
|
|
31c4eb24d2 | ||
|
|
e9468f9f33 | ||
|
|
87a50b8a39 | ||
|
|
7c784ab905 | ||
|
|
287ae99d3d | ||
|
|
b856635ba7 | ||
|
|
263b29b021 | ||
|
|
d9e44e0907 | ||
|
|
cdd8971d1d | ||
|
|
091cb4b33b | ||
|
|
4dd39445ce | ||
|
|
1f7605ea7c | ||
|
|
4228447e3c | ||
|
|
119f3bdc41 | ||
|
|
53cf9756e0 | ||
|
|
03005f1909 | ||
|
|
bc2e4d6fb7 | ||
|
|
6fa0a15996 | ||
|
|
57b7c285e4 | ||
|
|
188167c446 | ||
|
|
d6b3f4578a | ||
|
|
57699054d3 | ||
|
|
5be49b74bc | ||
|
|
0866fc9aaf | ||
|
|
76ce8b64fe | ||
|
|
dd23189751 | ||
|
|
83af08a071 | ||
|
|
e94a8e98a1 | ||
|
|
4140c76dee | ||
|
|
dfaeac6092 | ||
|
|
67d202d6df | ||
|
|
3d8635fcfb | ||
|
|
487b008147 | ||
|
|
59c679f5f4 | ||
|
|
473c579420 | ||
|
|
60c783a736 | ||
|
|
6b72eff364 | ||
|
|
559f3971ba | ||
|
|
cf21681fa9 | ||
|
|
5ca256fb3a | ||
|
|
d5f443d7d4 | ||
|
|
1bea273f3c | ||
|
|
779af8fb48 | ||
|
|
8a448d4af4 | ||
|
|
473edba1d7 | ||
|
|
15b87c6e84 | ||
|
|
d56ab01cfb | ||
|
|
790dd4d3eb | ||
|
|
6787393cd1 | ||
|
|
7162dbe428 | ||
|
|
3bb73fbdd7 | ||
|
|
ea48d38056 | ||
|
|
f6b4064274 | ||
|
|
c8e57b600a | ||
|
|
16b8ab326c | ||
|
|
c27e57e85e | ||
|
|
67e99976f1 | ||
|
|
5b32edbddf | ||
|
|
3be6b6c4b4 | ||
|
|
241187bbe3 | ||
|
|
cfe80da6bc | ||
|
|
36eb913385 | ||
|
|
de74c292ee | ||
|
|
da7a3eb70b | ||
|
|
33cea64ae8 | ||
|
|
bbfc88926e | ||
|
|
19bfe1a203 | ||
|
|
7e0e6a87e0 | ||
|
|
ab6bfb7e9f | ||
|
|
9839ca1ffb | ||
|
|
b407970ecd | ||
|
|
1408bd36b0 | ||
|
|
d32e71784e | ||
|
|
49f4b7cfc8 | ||
|
|
d7925be2e4 | ||
|
|
fac1d57ee5 | ||
|
|
e33f534ffd | ||
|
|
10e04cbef5 | ||
|
|
b5f7891c7e | ||
|
|
aea868bd1f | ||
|
|
1a472aaccf | ||
|
|
0855c2ef8c | ||
|
|
d7aaf39710 | ||
|
|
ce07eb79f4 | ||
|
|
8d89982555 | ||
|
|
450935874f | ||
|
|
fbcb933c5b | ||
|
|
e38ee99766 | ||
|
|
c4813053b2 | ||
|
|
b15bafaed2 | ||
|
|
56bbda7827 | ||
|
|
bc657bc94b | ||
|
|
7677e66587 | ||
|
|
be2e69a35c | ||
|
|
05666a7e72 | ||
|
|
a7cf3ddc1f | ||
|
|
749b9c1c27 | ||
|
|
cefb0fa35f | ||
|
|
4959bc5f22 | ||
|
|
6ad790f846 | ||
|
|
832fdc2abb | ||
|
|
01a18ac2ed | ||
|
|
ccfe8b6843 | ||
|
|
86a4a8cb31 | ||
|
|
e2d80105ed | ||
|
|
21b9ce5eff | ||
|
|
43e043e0b6 | ||
|
|
72bad999b0 | ||
|
|
c9d0b35b6a | ||
|
|
60c375f84e | ||
|
|
2e04483a46 | ||
|
|
a1fc8f0cb4 | ||
|
|
1ab05f99e9 | ||
|
|
1d02b140d2 | ||
|
|
3b84f100b5 | ||
|
|
2842637d4c | ||
|
|
9230cc8b83 | ||
|
|
9478106d6a | ||
|
|
289148c069 | ||
|
|
deac455ab9 | ||
|
|
c1d4e3a728 | ||
|
|
42cbff3c64 | ||
|
|
16ce83c381 | ||
|
|
e3cfbc1541 | ||
|
|
daf7d0707c | ||
|
|
146a37b892 | ||
|
|
5a51832959 | ||
|
|
4c611d88f9 | ||
|
|
bb2d2188ef | ||
|
|
5e2d8ddebe | ||
|
|
8641870916 | ||
|
|
412f8c5def | ||
|
|
3c79ad18e7 | ||
|
|
07d68473d9 | ||
|
|
8b794aa9a6 | ||
|
|
c7c06e3735 | ||
|
|
f530a2a645 | ||
|
|
c85ee4ef79 | ||
|
|
9621a87edd | ||
|
|
eafa7266d4 | ||
|
|
a5590c6389 | ||
|
|
7a1e0435a8 | ||
|
|
c65e487996 | ||
|
|
843438eab9 | ||
|
|
4052eef33c | ||
|
|
c6a0e1cda5 | ||
|
|
cde3014e2c | ||
|
|
b2938a41d9 | ||
|
|
96bdfb64ba | ||
|
|
77eb3f88fd | ||
|
|
01729b533d | ||
|
|
52d6df75c8 | ||
|
|
4575cbd670 | ||
|
|
8b8a3f7def | ||
|
|
6992440c83 | ||
|
|
a022f3fcb8 | ||
|
|
7404dc98fa | ||
|
|
5065640657 | ||
|
|
63b5effada | ||
|
|
ae5af1be35 | ||
|
|
3a72136c4d | ||
|
|
b1058a4eb7 | ||
|
|
48ac6aa0b5 | ||
|
|
6b1870aea4 | ||
|
|
e7d4ec2599 | ||
|
|
f102334b7a | ||
|
|
0294540603 | ||
|
|
ad43734d8d | ||
|
|
b62b908d1d | ||
|
|
0920459a45 | ||
|
|
7895811be4 | ||
|
|
1deb471727 | ||
|
|
67257e8ed0 | ||
|
|
a87d62a78f | ||
|
|
a5cd601cb5 | ||
|
|
607148cf72 | ||
|
|
b9d547b2bd | ||
|
|
e8d0ffa43f | ||
|
|
44fc595bcb | ||
|
|
28d72d3b81 | ||
|
|
5ceedbff82 | ||
|
|
917158c851 | ||
|
|
652b4db6d3 | ||
|
|
2eef4a9b30 | ||
|
|
429745301a | ||
|
|
217b838df2 | ||
|
|
f186bed09c | ||
|
|
9f663dfdce | ||
|
|
72b6464f7e | ||
|
|
0751e904b0 | ||
|
|
f140e63649 | ||
|
|
418d48ead3 | ||
|
|
cec2f07c0b | ||
|
|
48c7fa98c1 | ||
|
|
70be34da08 | ||
|
|
b5875d5ea1 | ||
|
|
85b93826a2 | ||
|
|
0b1f0b2009 | ||
|
|
bce6685db0 | ||
|
|
8df183bc46 | ||
|
|
d5778fea4b | ||
|
|
d621a19859 | ||
|
|
e8d993dd73 | ||
|
|
7c66185d74 | ||
|
|
3934ce09d8 | ||
|
|
e699d257fe | ||
|
|
626aeba4bd | ||
|
|
987321eb1b | ||
|
|
86f5f170b3 | ||
|
|
8eac86c163 | ||
|
|
3c9cf28948 | ||
|
|
22b271aefc | ||
|
|
0295a6523f | ||
|
|
20d69977b1 | ||
|
|
2a2e5b74d5 | ||
|
|
b47c6b5472 | ||
|
|
485662856a | ||
|
|
a6e97d4df6 | ||
|
|
1a67e24a41 | ||
|
|
ac0f60903e | ||
|
|
1d12983ce2 | ||
|
|
724eda9174 | ||
|
|
e8305e944d | ||
|
|
90cad1cfda | ||
|
|
608fc010a5 | ||
|
|
b87a8b2743 | ||
|
|
bde427319f | ||
|
|
b2e4c75f9a | ||
|
|
15c84780f4 | ||
|
|
0caefd9dc8 | ||
|
|
b7d36697df | ||
|
|
fe382012fd | ||
|
|
6571c463e3 | ||
|
|
8a3c960eb9 | ||
|
|
0b6f488f28 | ||
|
|
e686604f4f | ||
|
|
32910f260e | ||
|
|
a5a501f3a7 | ||
|
|
173e77d755 | ||
|
|
7a56aaf0cc | ||
|
|
b1c29bcef5 | ||
|
|
d0ccc52e51 | ||
|
|
db6c89aa0a | ||
|
|
46c76ee772 | ||
|
|
fb63fbcdc7 | ||
|
|
9e5a72582e | ||
|
|
fc63f61f97 | ||
|
|
853240d83c | ||
|
|
c4a31599a5 | ||
|
|
47143c1f30 | ||
|
|
7d2a958ab3 | ||
|
|
b0c518a05f | ||
|
|
1225b8d5a9 | ||
|
|
230df4d30b | ||
|
|
f4eff4ea57 | ||
|
|
116d2bc1de | ||
|
|
de180a073f | ||
|
|
4190af313e | ||
|
|
70ec447489 | ||
|
|
1dce7f09b6 | ||
|
|
a3f240620a | ||
|
|
985ad5d623 | ||
|
|
6952f3f158 | ||
|
|
866a073a84 | ||
|
|
0eb685643b | ||
|
|
d696b54ba9 | ||
|
|
a5da5ca3dc | ||
|
|
b7db5a8ee0 | ||
|
|
1917b63220 | ||
|
|
9b9da70b8e | ||
|
|
d568485242 | ||
|
|
a1395f916a | ||
|
|
928045da6f | ||
|
|
8bebcf827e | ||
|
|
470f03dc41 | ||
|
|
ac8b269300 | ||
|
|
3dd8e3e0e6 | ||
|
|
67edc94c8a | ||
|
|
b580234968 | ||
|
|
80b95c0aad | ||
|
|
b7124f179f | ||
|
|
33510d9f1b | ||
|
|
1ca0e9bb3d | ||
|
|
fc7ecbb046 | ||
|
|
7cd05d594c | ||
|
|
475ddcd2e8 | ||
|
|
78a33cf870 | ||
|
|
7f7551af16 | ||
|
|
1c3c7c7b6f | ||
|
|
8338d9e6ee | ||
|
|
6f41773f47 | ||
|
|
64803e08c5 | ||
|
|
80a8e2df21 | ||
|
|
83553eb3bb | ||
|
|
c6e6f809da | ||
|
|
788f0bc2f2 | ||
|
|
1c6e530501 | ||
|
|
ce2eaf8fc9 | ||
|
|
3593e5ca8b | ||
|
|
894a51f132 | ||
|
|
ab730005e9 | ||
|
|
e032f31a92 | ||
|
|
7e976f3666 | ||
|
|
5864468596 | ||
|
|
44f93fa0d9 | ||
|
|
3c9ca8a0c1 | ||
|
|
b5a0619ae2 | ||
|
|
e5c78841a8 | ||
|
|
b94304fd75 | ||
|
|
49535abdad | ||
|
|
2c31834bab | ||
|
|
a103eb67fe | ||
|
|
840e762291 | ||
|
|
552da1fae0 | ||
|
|
9036259dc3 | ||
|
|
fbd4eb8457 | ||
|
|
918061f1dc | ||
|
|
3edbcc8662 | ||
|
|
ebdc43fd30 | ||
|
|
8692a04310 | ||
|
|
345f82245d | ||
|
|
688b137e8d | ||
|
|
f11eb36f47 | ||
|
|
f6af195656 | ||
|
|
c60f5f1297 | ||
|
|
ae257dd8a1 | ||
|
|
ab00135605 | ||
|
|
5fe542d003 | ||
|
|
5bee6c7f48 | ||
|
|
4180f4b778 | ||
|
|
4f6d98e504 | ||
|
|
beb304e729 | ||
|
|
07c44a392d | ||
|
|
c1de27fbf0 | ||
|
|
0e04d631b1 | ||
|
|
b97523348c | ||
|
|
7b7086162f | ||
|
|
d7cd36b42e | ||
|
|
9b5e48cfe6 | ||
|
|
fb55f764d7 | ||
|
|
a826bc5f33 | ||
|
|
4ff99273aa | ||
|
|
0c563d4bf6 | ||
|
|
75d60e40a8 | ||
|
|
cf3b31ce47 | ||
|
|
0f40780d5d | ||
|
|
67ad5eb9e5 | ||
|
|
f838c51c03 | ||
|
|
87a59c5fcd | ||
|
|
bb187b5b84 | ||
|
|
a6b6fe2a90 | ||
|
|
8d5533a308 | ||
|
|
6b13d5a70b | ||
|
|
8b34137a90 | ||
|
|
0e6a09026f | ||
|
|
b3681c14bd | ||
|
|
6f08784072 | ||
|
|
ffdcbb5114 | ||
|
|
4f5ba3ccdb | ||
|
|
49a74590d4 | ||
|
|
65c2cd3af4 | ||
|
|
fd27d213d8 | ||
|
|
e452f5c8c3 | ||
|
|
bd524580e6 | ||
|
|
f12cecd9d6 | ||
|
|
758a353e99 | ||
|
|
bd3a7c6b9c | ||
|
|
be75695e02 | ||
|
|
c29460666a | ||
|
|
e930df68d1 | ||
|
|
7c214ce04a | ||
|
|
aa0faffe9f | ||
|
|
53c46c8041 | ||
|
|
5251bce154 | ||
|
|
ca3868ca65 | ||
|
|
0eb3fa2acb | ||
|
|
ee3d3a373d | ||
|
|
2e91bb3a00 | ||
|
|
7401f5b650 | ||
|
|
56e0642fbb | ||
|
|
aa40b908c9 | ||
|
|
167599e4d2 | ||
|
|
7f6f93c424 | ||
|
|
79a1d67a7f | ||
|
|
3e203ac69e | ||
|
|
6bead806ee | ||
|
|
ac7fb9913a | ||
|
|
71508b1b30 | ||
|
|
ef73edafd1 | ||
|
|
d49c892643 | ||
|
|
eb3953d901 | ||
|
|
b367156df7 | ||
|
|
b02f622c39 | ||
|
|
0eb5ddfa40 | ||
|
|
e6116bf9dd | ||
|
|
ed363da1f6 | ||
|
|
15bd0e0996 | ||
|
|
8235ccb3d0 | ||
|
|
61639328f9 | ||
|
|
8ca734ee17 | ||
|
|
1bfaa60e32 | ||
|
|
67c8d6a141 | ||
|
|
971d190108 | ||
|
|
b2e8d0b3d3 | ||
|
|
ae3df06258 | ||
|
|
75577c62d7 | ||
|
|
8895c712b6 | ||
|
|
7f852d8aee | ||
|
|
d3dd83f11b | ||
|
|
5977205363 | ||
|
|
954cd99196 | ||
|
|
883d0a5028 | ||
|
|
036fc21668 | ||
|
|
8035584024 | ||
|
|
72f08a45b8 | ||
|
|
a1e026fbe6 | ||
|
|
b672900456 | ||
|
|
e9fc2a82eb | ||
|
|
0c831a3fe9 | ||
|
|
956c94dfad | ||
|
|
8825f6f94a | ||
|
|
e4d513a0b7 | ||
|
|
5066b5d253 | ||
|
|
99bc7bddb6 | ||
|
|
14da3a4a9a | ||
|
|
ee2599de1a | ||
|
|
ba47646bc5 | ||
|
|
8ce9abcfc6 | ||
|
|
0bfa95b9d9 | ||
|
|
10200efa2b | ||
|
|
af18599ef7 | ||
|
|
c722b46cbd | ||
|
|
2921ffaff6 | ||
|
|
76370d4525 | ||
|
|
0787113a1b | ||
|
|
3f7895d172 | ||
|
|
ef78023af4 | ||
|
|
242a4485af | ||
|
|
4ffc570482 | ||
|
|
4d66545557 | ||
|
|
628375d4d2 | ||
|
|
340521757c | ||
|
|
76b8ca17d8 | ||
|
|
1ef33b03a2 | ||
|
|
0d1d133330 | ||
|
|
1fe4eb190f | ||
|
|
65aa93e9ef | ||
|
|
7cb42ce972 | ||
|
|
c0c396c237 | ||
|
|
7dc2b11c2a | ||
|
|
3f442b54f3 | ||
|
|
96c8ea4931 | ||
|
|
928cbe67bb | ||
|
|
9a149ece72 | ||
|
|
76ae819489 | ||
|
|
66ec792368 | ||
|
|
2726464472 | ||
|
|
31d419e2c0 | ||
|
|
9e10c1b534 | ||
|
|
4e739bc528 | ||
|
|
d3510ceeba | ||
|
|
41b4a5e62e | ||
|
|
2de5e29fc9 | ||
|
|
93cba2e044 | ||
|
|
a38371d231 | ||
|
|
5e20808faa | ||
|
|
714658b8d7 | ||
|
|
414740aa38 | ||
|
|
0cdc451a80 | ||
|
|
56eee0e3a4 | ||
|
|
5b534bff4c | ||
|
|
12b904a5b8 | ||
|
|
bcddf01d77 | ||
|
|
b0eb3db0aa | ||
|
|
409aee509d | ||
|
|
0c2b5cec70 | ||
|
|
075e95bfd2 | ||
|
|
3e35dc3a76 | ||
|
|
7b6ebdc3ea | ||
|
|
c192e28084 | ||
|
|
59251ca327 | ||
|
|
2a47253152 | ||
|
|
ef42f203ad | ||
|
|
e0849c88da | ||
|
|
c415f21858 | ||
|
|
4125afe80f | ||
|
|
f16ee6d7c5 | ||
|
|
8847026227 | ||
|
|
a6423836aa | ||
|
|
03653319d1 | ||
|
|
f12ffbd24e | ||
|
|
28801efb8b | ||
|
|
4db3a4c521 | ||
|
|
85ffda7ef4 | ||
|
|
2e66247d99 | ||
|
|
5f428b210e | ||
|
|
7aed747cd7 | ||
|
|
3ef2e16408 | ||
|
|
45acb3a583 | ||
|
|
42883bb57a | ||
|
|
c7c906c204 | ||
|
|
dd44506bcc | ||
|
|
4f83e01386 | ||
|
|
e2a7dc74dd | ||
|
|
8c5e9bd9bd | ||
|
|
855f60f9f6 | ||
|
|
bb730dec7d | ||
|
|
cec9df42aa | ||
|
|
2b666475ec | ||
|
|
fd8ee231b1 | ||
|
|
66696c2222 | ||
|
|
c47b26d73a | ||
|
|
db2419a6e3 | ||
|
|
2ceac853c3 | ||
|
|
f6c1f0bea1 | ||
|
|
1a42b39c93 | ||
|
|
a54d558f82 | ||
|
|
ef81faeac2 | ||
|
|
7117af68b5 | ||
|
|
5b13a5c490 | ||
|
|
c314bf9182 | ||
|
|
58f16f00e7 | ||
|
|
621f31e10e | ||
|
|
209b81e56c | ||
|
|
92f2e20fa5 | ||
|
|
9cdf351f6b | ||
|
|
7fba338427 | ||
|
|
eb6ffec8d5 | ||
|
|
edf08926c5 | ||
|
|
b3fce1689c | ||
|
|
de3749fc55 | ||
|
|
a9c3b6d50a | ||
|
|
18a1eaf38c | ||
|
|
075f884f5f | ||
|
|
28f59dfe2f | ||
|
|
2256dd7264 | ||
|
|
eaa2d52f4e | ||
|
|
418d98b02e | ||
|
|
e8ca66fb7c | ||
|
|
90ed035285 | ||
|
|
7f305a8532 | ||
|
|
87d401b82b | ||
|
|
dc1d3bb46c | ||
|
|
da3bd928dd | ||
|
|
86128972f6 | ||
|
|
dfbc3ee1c1 | ||
|
|
576529d8d9 | ||
|
|
792c814200 | ||
|
|
4a3ce8d896 | ||
|
|
dde2f93dd7 | ||
|
|
83db1d2f19 | ||
|
|
94dac679eb | ||
|
|
e2e4926241 | ||
|
|
8571d5f3a2 | ||
|
|
7c249cb5e2 |
@@ -1,41 +0,0 @@
|
||||
version: 1.0.{build}
|
||||
os: Visual Studio 2017
|
||||
test: off
|
||||
clone_folder: C:\projects\libigl
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- alecjacobson
|
||||
- cmake
|
||||
- cgal
|
||||
environment:
|
||||
BOOST_ROOT: C:/Libraries/boost_1_65_1
|
||||
install:
|
||||
- git submodule update --init --recursive
|
||||
- cinstall: python
|
||||
build_script:
|
||||
- cd c:\projects\libigl
|
||||
# External libraries (boost)
|
||||
# - cd external
|
||||
# - mkdir build
|
||||
# - cd build
|
||||
# - cmake -G "Visual Studio 15 2017 Win64" -T "host=x64" ..
|
||||
# - msbuild %MSBuildOptions% libigl_external.sln
|
||||
# - cd ../..
|
||||
# Python bindings
|
||||
# - cd python
|
||||
# - mkdir build
|
||||
# - cd build
|
||||
# - cmake -DLIBIGL_WITH_EMBREE=OFF -DLIBIGL_USE_STATIC_LIBRARY=ON ../
|
||||
# - msbuild %MSBuildOptions% pyigl.sln
|
||||
# - cd ../tutorial
|
||||
# - ${PYTHON} 101_FileIO.py
|
||||
# - cd ../../
|
||||
# Tutorials
|
||||
- cd tutorial
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake -DLIBIGL_USE_STATIC_LIBRARY=ON -G "Visual Studio 15 2017 Win64" ../
|
||||
- set MSBuildLogger="C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
|
||||
- set MSBuildOptions=/v:m /p:Configuration=Debug /logger:%MSBuildLogger%
|
||||
- msbuild %MSBuildOptions% libigl_tutorials.sln
|
||||
@@ -0,0 +1,17 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: bug, pending verification
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
#### Describe the bug
|
||||
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
#### Check all that apply (change to `[x]`)
|
||||
- [ ] Windows
|
||||
- [ ] macOS
|
||||
- [ ] Linux
|
||||
@@ -0,0 +1,17 @@
|
||||
---
|
||||
name: Compilation issue
|
||||
about: Report a problem when compiling the code
|
||||
title: ''
|
||||
labels: 'compilation'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
#### Describe your question
|
||||
|
||||
...
|
||||
|
||||
#### Check all that apply (change to `[x]`)
|
||||
- [ ] Windows
|
||||
- [ ] macOS
|
||||
- [ ] Linux
|
||||
@@ -0,0 +1 @@
|
||||
blank_issues_enabled: false
|
||||
@@ -0,0 +1,17 @@
|
||||
---
|
||||
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
|
||||
@@ -0,0 +1,17 @@
|
||||
---
|
||||
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
|
||||
@@ -0,0 +1,10 @@
|
||||
Fixes # .
|
||||
|
||||
[Describe your changes and what you've already done to test it.]
|
||||
|
||||
|
||||
#### 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.
|
||||
- [ ] This is a minor change.
|
||||
@@ -0,0 +1,152 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- stable
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- stable
|
||||
|
||||
env:
|
||||
CTEST_OUTPUT_ON_FAILURE: ON
|
||||
CTEST_PARALLEL_LEVEL: 2
|
||||
|
||||
jobs:
|
||||
####################
|
||||
# Linux / macOS
|
||||
####################
|
||||
|
||||
Unix:
|
||||
name: ${{ matrix.name }} (${{ matrix.config }}, ${{ matrix.static }})
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-20.04, macos-latest]
|
||||
config: [Release]
|
||||
static: [ON, OFF]
|
||||
include:
|
||||
- os: macos-latest
|
||||
name: macOS
|
||||
- os: ubuntu-20.04
|
||||
name: Linux
|
||||
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: |
|
||||
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
|
||||
|
||||
- name: Dependencies (macOS)
|
||||
if: runner.os == 'macOS'
|
||||
run: brew install boost gmp mpfr ccache
|
||||
|
||||
- name: Cache Build
|
||||
id: cache-build
|
||||
uses: actions/cache@v1
|
||||
with:
|
||||
path: ~/.ccache
|
||||
key: ${{ runner.os }}-${{ matrix.config }}-${{ matrix.static }}-cache
|
||||
|
||||
- name: Prepare ccache
|
||||
run: |
|
||||
ccache --max-size=1.0G
|
||||
ccache -V && ccache --show-stats && ccache --zero-stats
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake .. \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_BUILD_TYPE=${{ matrix.config }} \
|
||||
-DLIBIGL_USE_STATIC_LIBRARY=${{ matrix.static }} \
|
||||
-DLIBIGL_WITH_CGAL=ON \
|
||||
-DLIBIGL_WITH_COMISO=ON
|
||||
|
||||
- name: Build
|
||||
run: cd build; make -j2; ccache --show-stats
|
||||
|
||||
- name: Tests
|
||||
run: cd build; ctest --verbose
|
||||
|
||||
####################
|
||||
# Windows
|
||||
####################
|
||||
|
||||
Windows:
|
||||
runs-on: windows-2019
|
||||
env:
|
||||
CC: cl.exe
|
||||
CXX: cl.exe
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config: [Release]
|
||||
static: [ON, OFF]
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v1
|
||||
with:
|
||||
fetch-depth: 10
|
||||
- uses: seanmiddleditch/gha-setup-ninja@master
|
||||
|
||||
- name: Set env
|
||||
run: |
|
||||
echo "BOOST_ROOT=$env:BOOST_ROOT_1_72_0" >> ${env:GITHUB_ENV}
|
||||
echo "appdata=$env:LOCALAPPDATA" >> ${env:GITHUB_ENV}
|
||||
|
||||
- name: Cache build
|
||||
id: cache-build
|
||||
uses: actions/cache@v1
|
||||
with:
|
||||
path: ${{ env.appdata }}\Mozilla\sccache
|
||||
key: ${{ runner.os }}-${{ matrix.config }}-${{ matrix.static }}-cache
|
||||
|
||||
- name: Prepare sccache
|
||||
run: |
|
||||
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
|
||||
scoop install sccache --global
|
||||
# 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
|
||||
cmake -G Ninja ^
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache ^
|
||||
-DCMAKE_BUILD_TYPE=${{ matrix.config }} ^
|
||||
-DLIBIGL_USE_STATIC_LIBRARY=${{ matrix.static }} ^
|
||||
-DLIBIGL_WITH_CGAL=ON ^
|
||||
-DLIBIGL_WITH_COMISO=OFF ^
|
||||
-DCMAKE_JOB_POOLS=pool-linking=1;pool-compilation=2 ^
|
||||
-DCMAKE_JOB_POOL_COMPILE:STRING=pool-compilation ^
|
||||
-DCMAKE_JOB_POOL_LINK:STRING=pool-linking ^
|
||||
-B build ^
|
||||
-S .
|
||||
cmake --build build
|
||||
|
||||
- name: Tests
|
||||
run: cd build; ctest --verbose
|
||||
@@ -0,0 +1,189 @@
|
||||
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-20.04-gcc-8,
|
||||
ubuntu-20.04-gcc-9,
|
||||
ubuntu-20.04-gcc-10,
|
||||
ubuntu-20.04-clang-8,
|
||||
ubuntu-20.04-clang-9,
|
||||
ubuntu-20.04-clang-10,
|
||||
macOS-latest,
|
||||
]
|
||||
config: [Debug, Release]
|
||||
static: [ON, OFF]
|
||||
include:
|
||||
- name: ubuntu-20.04-gcc-8
|
||||
os: ubuntu-20.04
|
||||
compiler: gcc
|
||||
version: "8"
|
||||
|
||||
- name: ubuntu-20.04-gcc-9
|
||||
os: ubuntu-20.04
|
||||
compiler: gcc
|
||||
version: "9"
|
||||
|
||||
- name: ubuntu-20.04-gcc-10
|
||||
os: ubuntu-20.04
|
||||
compiler: gcc
|
||||
version: "10"
|
||||
|
||||
- name: ubuntu-20.04-clang-8
|
||||
os: ubuntu-20.04
|
||||
compiler: clang
|
||||
version: "8"
|
||||
|
||||
- name: ubuntu-20.04-clang-9
|
||||
os: ubuntu-20.04
|
||||
compiler: clang
|
||||
version: "9"
|
||||
|
||||
- name: ubuntu-20.04-clang-10
|
||||
os: ubuntu-20.04
|
||||
compiler: clang
|
||||
version: "10"
|
||||
|
||||
- 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: |
|
||||
sudo apt-get update
|
||||
|
||||
if [ "${{ matrix.compiler }}" = "gcc" ]; then
|
||||
sudo apt-get install -y g++-${{ matrix.version }}
|
||||
echo "CC=gcc-${{ matrix.version }}" >> $GITHUB_ENV
|
||||
echo "CXX=g++-${{ matrix.version }}" >> $GITHUB_ENV
|
||||
else
|
||||
sudo apt-get install -y clang-${{ matrix.version }}
|
||||
echo "CC=clang-${{ matrix.version }}" >> $GITHUB_ENV
|
||||
echo "CXX=clang++-${{ matrix.version }}" >> $GITHUB_ENV
|
||||
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 "BOOST_ROOT=$env:BOOST_ROOT_1_72_0" >> ${env:GITHUB_ENV}
|
||||
|
||||
# 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 ^
|
||||
-DCMAKE_JOB_POOLS=pool-linking=1;pool-compilation=2 ^
|
||||
-DCMAKE_JOB_POOL_COMPILE:STRING=pool-compilation ^
|
||||
-DCMAKE_JOB_POOL_LINK:STRING=pool-linking ^
|
||||
-B build ^
|
||||
-S .
|
||||
cmake --build build -j 1
|
||||
|
||||
- name: Tests
|
||||
run: cd build; ctest --verbose
|
||||
+77
-87
@@ -1,110 +1,100 @@
|
||||
# use glob syntax.
|
||||
syntax: glob
|
||||
scripts/change_name.sh
|
||||
*.a
|
||||
*.dylib
|
||||
*.egg-info/
|
||||
*.exe
|
||||
*.ilk
|
||||
*.log
|
||||
*.o
|
||||
*.opensdf
|
||||
*.orig
|
||||
*.pdb
|
||||
*.psess
|
||||
*.pyc
|
||||
*.sdf
|
||||
*.so
|
||||
*.so.[0123456789]
|
||||
*.so.[0123456789].[0123456789]
|
||||
*.o
|
||||
*.a
|
||||
*.dylib
|
||||
*~
|
||||
*CMakeFiles*
|
||||
example
|
||||
examples/bbw/bbw_demo_selfcontained/*
|
||||
examples/bbw/bbw_demo_selfcontained.zip
|
||||
examples/quicklook-mesh/Mesh.qlgenerator/*
|
||||
examples/*/*.mexmaci64
|
||||
examples/*/*.rbr
|
||||
example_static
|
||||
example_header_only
|
||||
example1
|
||||
external/yimg/.git*
|
||||
external/tinyxml2/CMakeFiles*
|
||||
external/tinyxml2/CMakeCache.txt
|
||||
external/tinyxml2/cmake_install.cmake
|
||||
external/tinyxml2/Makefile
|
||||
external/embree/build/*
|
||||
external/embree/bin/*
|
||||
external/embree/bin
|
||||
external/embree/doc/html/*
|
||||
external/embree/doc/latex/*
|
||||
external/gmp
|
||||
external/mpfr
|
||||
external/boost
|
||||
external/.cache
|
||||
external/build
|
||||
.DS_Store
|
||||
libigl.zip
|
||||
*tags
|
||||
*.exe
|
||||
*.pdb
|
||||
*.sdf
|
||||
*.suo
|
||||
*.ilk
|
||||
*.log
|
||||
*.swo
|
||||
*.swp
|
||||
*.tlog
|
||||
Debug/
|
||||
Release/
|
||||
*.orig
|
||||
*.user
|
||||
*.vsp
|
||||
*.opensdf
|
||||
*.psess
|
||||
*.swp
|
||||
*.swo
|
||||
documentation/*.aux
|
||||
documentation/*.out
|
||||
documentation/*.log
|
||||
*CMakeFiles*
|
||||
*buildXcode*
|
||||
*tags
|
||||
*~
|
||||
.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
|
||||
external/medit/rebar.rbr
|
||||
examples/bbw/bbw_demo_selfcontained.zip
|
||||
examples/bbw/bbw_demo_selfcontained/*
|
||||
examples/bbw/examples/*-volume.dmat
|
||||
examples/bbw/examples/*-volume.mesh
|
||||
examples/upright/upright
|
||||
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
|
||||
README.html
|
||||
tutorial/readme.html
|
||||
tutorial/*/build/*
|
||||
tutorial/*/Makefile
|
||||
external/glew/build
|
||||
external/glfw/build
|
||||
*buildXcode*
|
||||
tutorial/build*
|
||||
tutorial/*/*.mexmaci64
|
||||
external/libpng/build
|
||||
external/tinyxml2/build
|
||||
optional/build
|
||||
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
|
||||
python/py_igl/todo
|
||||
python/build
|
||||
python/.idea
|
||||
untitled
|
||||
Untitled.ipynb
|
||||
python/.ipynb_checkpoints
|
||||
python/py_igl/todo
|
||||
python/__pycache__
|
||||
iglhelpers.pyc
|
||||
python/build2
|
||||
tests/build
|
||||
tests/bin
|
||||
python/build3
|
||||
*.pyc
|
||||
python/build4
|
||||
python/scripts/generated
|
||||
python/builddebug
|
||||
tutorial/.idea
|
||||
python/buildstatic
|
||||
tutorial/build
|
||||
tutorial/cmake-build-debug
|
||||
.vscode/
|
||||
.idea/
|
||||
site/
|
||||
*.egg-info/
|
||||
.vs/
|
||||
tutorial/data
|
||||
tutorial/readme.html
|
||||
untitled
|
||||
scripts
|
||||
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
[submodule "external/embree"]
|
||||
path = external/embree
|
||||
url = https://github.com/embree/embree.git
|
||||
[submodule "external/cgal"]
|
||||
path = external/cgal
|
||||
url = https://github.com/CGAL/cgal.git
|
||||
[submodule "external/tetgen"]
|
||||
path = external/tetgen
|
||||
url = https://github.com/libigl/tetgen.git
|
||||
[submodule "external/triangle"]
|
||||
path = external/triangle
|
||||
url = https://github.com/libigl/triangle.git
|
||||
[submodule "external/tinyxml2"]
|
||||
path = external/tinyxml2
|
||||
url = https://github.com/leethomason/tinyxml2.git
|
||||
[submodule "external/CoMISo"]
|
||||
path = external/CoMISo
|
||||
url = https://github.com/libigl/CoMISo.git
|
||||
[submodule "external/cork"]
|
||||
path = external/cork
|
||||
url = https://github.com/libigl/cork.git
|
||||
[submodule "external/imgui"]
|
||||
path = external/imgui/imgui
|
||||
url = https://github.com/ocornut/imgui.git
|
||||
[submodule "external/glfw"]
|
||||
path = external/glfw
|
||||
url = https://github.com/glfw/glfw.git
|
||||
[submodule "external/eigen"]
|
||||
path = external/eigen
|
||||
url = https://github.com/eigenteam/eigen-git-mirror.git
|
||||
[submodule "external/pybind11"]
|
||||
path = external/pybind11
|
||||
url = https://github.com/pybind/pybind11
|
||||
-73
@@ -1,73 +0,0 @@
|
||||
dist: trusty
|
||||
sudo: true
|
||||
language: cpp
|
||||
cache: ccache
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
compiler: gcc # 4.8.4 by default on Trusty
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- libmpfr-dev
|
||||
- libboost-filesystem-dev
|
||||
- libboost-system-dev
|
||||
- libboost-thread-dev
|
||||
- libblas-dev
|
||||
- liblapack-dev
|
||||
- xorg-dev
|
||||
- libglu1-mesa-dev
|
||||
- python3-setuptools
|
||||
- libpython3-dev
|
||||
env:
|
||||
- MATRIX_EVAL="export CONFIG=Debug && CHECK_UNDEFINED=ON && PYTHON=python3"
|
||||
- os: linux
|
||||
compiler: gcc-7
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- gcc-7
|
||||
- g++-7
|
||||
- libmpfr-dev
|
||||
- libboost-filesystem-dev
|
||||
- libboost-system-dev
|
||||
- libboost-thread-dev
|
||||
- libblas-dev
|
||||
- liblapack-dev
|
||||
- xorg-dev
|
||||
- libglu1-mesa-dev
|
||||
- python3-setuptools
|
||||
- libpython3-dev
|
||||
env:
|
||||
- MATRIX_EVAL="export CC=gcc-7 && CXX=g++-7 && CONFIG=Debug && CHECK_UNDEFINED=ON && PYTHON=python3"
|
||||
- os: osx
|
||||
compiler: clang
|
||||
env:
|
||||
- MATRIX_EVAL="export CONFIG=Debug && CHECK_UNDEFINED=ON && PYTHON=python3"
|
||||
|
||||
install:
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install ccache; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export PATH="/usr/local/opt/ccache/libexec:$PATH"; fi
|
||||
- eval "${MATRIX_EVAL}"
|
||||
- ccache --max-size=5.0G
|
||||
- ccache -V && ccache --show-stats && ccache --zero-stats
|
||||
|
||||
script:
|
||||
# Python bindings
|
||||
- cd python
|
||||
- ${PYTHON} setup.py develop --user -- -DCMAKE_BUILD_TYPE=${CONFIG} -DLIBIGL_WITH_EMBREE=OFF -DLIBIGL_USE_STATIC_LIBRARY=ON -DCHECK_UNDEFINED=${CHECK_UNDEFINED}
|
||||
- cd tutorial
|
||||
- ${PYTHON} 101_FileIO.py
|
||||
- cd ../../
|
||||
- rm -rf python/build
|
||||
# Tutorials
|
||||
- cd tutorial
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake -DCMAKE_BUILD_TYPE=$CONFIG -DLIBIGL_USE_STATIC_LIBRARY=ON ../
|
||||
- make -j 2
|
||||
- ccache --show-stats
|
||||
@@ -0,0 +1,74 @@
|
||||
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)
|
||||
else()
|
||||
set(LIBIGL_TOPLEVEL_PROJECT OFF)
|
||||
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})
|
||||
|
||||
# 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)
|
||||
|
||||
# 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
|
||||
|
||||
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.")
|
||||
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
|
||||
include(libigl)
|
||||
|
||||
if(LIBIGL_BUILD_TUTORIALS)
|
||||
add_subdirectory(tutorial)
|
||||
endif()
|
||||
|
||||
if(LIBIGL_BUILD_TESTS)
|
||||
include(CTest)
|
||||
enable_testing()
|
||||
add_subdirectory(tests)
|
||||
endif()
|
||||
|
||||
if(LIBIGL_TOPLEVEL_PROJECT)
|
||||
# Set folders for Visual Studio/Xcode
|
||||
igl_set_folders()
|
||||
endif()
|
||||
@@ -1,268 +1,8 @@
|
||||
# libigl - A simple C++ geometry processing library
|
||||
[](https://travis-ci.org/libigl/libigl)
|
||||
[](https://ci.appveyor.com/project/danielepanozzo/libigl-6hjk1/branch/master)
|
||||

|
||||
[](https://github.com/libigl/libigl/actions?query=workflow%3ABuild+branch%3Amaster+event%3Apush)
|
||||
[](https://github.com/libigl/libigl/actions?query=workflow%3ANightly+branch%3Amaster+event%3Aschedule)
|
||||
[](https://anaconda.org/conda-forge/igl)
|
||||
|
||||
<https://github.com/libigl/libigl/>
|
||||

|
||||
|
||||
> Get started with:
|
||||
>
|
||||
```bash
|
||||
git clone --recursive https://github.com/libigl/libigl.git
|
||||
```
|
||||
|
||||
libigl is a simple C++ geometry processing library. We have a wide
|
||||
functionality including construction of sparse discrete differential geometry
|
||||
operators and finite-elements matrices such as the cotangent Laplacian and
|
||||
diagonalized mass matrix, simple facet and edge-based topology data structures,
|
||||
mesh-viewing utilities for OpenGL and GLSL, and many core functions for matrix
|
||||
manipulation which make [Eigen](http://eigen.tuxfamily.org) feel a lot more
|
||||
like MATLAB.
|
||||
|
||||
It is **a header-only library**. You do not need to compile anything to use,
|
||||
just include igl headers (e.g. `#include <igl/cotmatrix.h>`) and run. Each
|
||||
header file contains a single function (e.g. `igl/cotmatrix.h` contains
|
||||
`igl::cotmatrix()`). Most are tailored to operate on a generic triangle mesh
|
||||
stored in an n-by-3 matrix of vertex positions `V` and an m-by-3 matrix of
|
||||
triangle indices `F`.
|
||||
|
||||
_Optionally_ the library may also be [pre-compiled](http://libigl.github.io/libigl/static-library/) into a statically
|
||||
linked library, for faster compile times with your projects. This only effects
|
||||
compile time (run-time performance and behavior is identical). If in doubt, use
|
||||
the header-only default mode: (i.e. just include the headers you want to use).
|
||||
|
||||
We use the [Eigen](http://eigen.tuxfamily.org) library heavily in our code. Our
|
||||
group prototypes a lot in MATLAB, and we have a useful [MATLAB to libigl+Eigen
|
||||
conversion table](matlab-to-eigen.html).
|
||||
|
||||
We regularly test compiling our library on Mac OS X with clang, Linux with gcc
|
||||
and Windows with Visual Studio 2015 Community Edition.
|
||||
|
||||
## Tutorial
|
||||
|
||||
As of version 1.0, libigl includes an introductory
|
||||
[tutorial](http://libigl.github.io/libigl/tutorial) that covers many functionalities.
|
||||
|
||||
## libigl Example Project
|
||||
|
||||
We provide a [blank project example](https://github.com/libigl/libigl-example-project) showing how to use libigl and cmake. Feel free and encouraged to copy or fork this project as a way of starting a new personal project using libigl.
|
||||
|
||||
## Coding Guidelines and Tips
|
||||
|
||||
libigl follows strict coding guidelines, please take a look [here](http://libigl.github.io/libigl/style-guidelines) before submitting your pull requests. We also have a set of [general coding tips](http://libigl.github.io/libigl/coding-guidelines) on how to code a geometry processing research project.
|
||||
|
||||
## Installation
|
||||
|
||||
Libigl is a **header-only** library. You do **not** need to build anything to
|
||||
install. Simply add `libigl/include` to your include path and include relevant
|
||||
headers. Here is a small "Hello, World" program:
|
||||
|
||||
```cpp
|
||||
#include <igl/cotmatrix.h>
|
||||
#include <Eigen/Dense>
|
||||
#include <Eigen/Sparse>
|
||||
#include <iostream>
|
||||
int main()
|
||||
{
|
||||
Eigen::MatrixXd V(4,2);
|
||||
V<<0,0,
|
||||
1,0,
|
||||
1,1,
|
||||
0,1;
|
||||
Eigen::MatrixXi F(2,3);
|
||||
F<<0,1,2,
|
||||
0,2,3;
|
||||
Eigen::SparseMatrix<double> L;
|
||||
igl::cotmatrix(V,F,L);
|
||||
std::cout<<"Hello, mesh: "<<std::endl<<L*V<<std::endl;
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
If you save this in `hello.cpp`, then you could compile this with (assuming
|
||||
Eigen is installed in `/usr/local/include/eigen3`):
|
||||
|
||||
```bash
|
||||
g++ -std=c++11 -I/usr/local/include/eigen3 -I./libigl/include/ hello.cpp -o hello
|
||||
```
|
||||
|
||||
Running `./hello` would then produce
|
||||
|
||||
```
|
||||
Hello, mesh:
|
||||
0.5 0.5
|
||||
-0.5 0.5
|
||||
-0.5 -0.5
|
||||
0.5 -0.5
|
||||
```
|
||||
|
||||
## Dependencies
|
||||
Dependencies are on a per-include basis and the majority of the functions in
|
||||
libigl depends only on the [Eigen](http://eigen.tuxfamily.org) library.
|
||||
|
||||
For more information see our [tutorial](http://libigl.github.io/libigl/tutorial).
|
||||
|
||||
### Optional Dependencies
|
||||
|
||||
Libigl compartmentalizes its **optional** dependences via its directory
|
||||
organization in the `include/` folder. All header files located _directly_ in
|
||||
the `include/igl/` folder have only stl and Eigen as dependencies. For example,
|
||||
all of the headers that depend on CGAL are located in `include/igl/copyleft/cgal`.
|
||||
For a full list of _optional_ dependencies check `optional/CMakeLists.txt`.
|
||||
|
||||
### GCC and the Optional CGAL Dependency
|
||||
The `include/igl/copyleft/cgal/*.h` headers depend on CGAL. It has come to
|
||||
our attention that CGAL does not work properly with GCC 4.8. To the best of
|
||||
our knowledge, GCC 4.7 and clang will work correctly.
|
||||
|
||||
### OpenMP and Windows
|
||||
Some of our functions will take advantage of OpenMP if available. However, it
|
||||
has come to our attention that Visual Studio + Eigen + OpenMP does not work
|
||||
properly. Since we use OpenMP only to improve performance, we recommend
|
||||
avoiding OpenMP on Windows or proceeding with caution.
|
||||
|
||||
## Download
|
||||
You can keep up to date by cloning a read-only copy of our GitHub
|
||||
[repository](https://github.com/libigl).
|
||||
|
||||
## Known Issues
|
||||
We rely heavily on Eigen. Nearly all inputs and outputs are Eigen matrices of
|
||||
some kind. However, we currently _only_ officially support Eigen's default
|
||||
column-major ordering. That means, we **do not** expect our code to work for
|
||||
matrices using the `Eigen::RowMajor` flag. If you can, change definitions like:
|
||||
|
||||
```cpp
|
||||
Eigen::Matrix<double, Eigen::Dynamic, 3, Eigen::RowMajor> A;
|
||||
```
|
||||
|
||||
to
|
||||
|
||||
```cpp
|
||||
Eigen::Matrix<double, Eigen::Dynamic, 3, Eigen::ColMajor> A;
|
||||
// or simply
|
||||
Eigen::Matrix<double, Eigen::Dynamic, 3> A;
|
||||
```
|
||||
|
||||
We hope to fix this, or at least identify which functions are safe (many of
|
||||
them probably work just fine). This requires setting up unit testing, which is
|
||||
a major _todo_ for our development.
|
||||
|
||||
## Git Submodules
|
||||
Libigl uses git submodules for its _optional_ dependencies,
|
||||
in particular, those needed by the OpenGL viewer to run the examples in the
|
||||
[tutorial](http://libigl.github.io/libigl/tutorial). Git submodules allow use to treat clones of
|
||||
other libraries as sub-directories within ours while separating our commits.
|
||||
Read the [documentation](http://git-scm.com/docs/git-submodule) for a detailed
|
||||
explanation, but essentially our libigl repo stores a hash for each of its
|
||||
subrepos containing which version to update to. When a change is introduced in
|
||||
a dependencies repo we can incorporate that change by pulling in our sub-repo
|
||||
and updating (i.e. committing) that change to the hash.
|
||||
|
||||
When pulling new changes to libigl it's also a good idea to update changes to
|
||||
subrepos:
|
||||
|
||||
```bash
|
||||
git pull
|
||||
git submodule update --recursive
|
||||
```
|
||||
|
||||
## Unit Testing
|
||||
|
||||
Libigl maintains [separate
|
||||
repository](https://github.com/libigl/libigl-unit-tests) for unit testing.
|
||||
|
||||
## How to Contribute
|
||||
|
||||
If you are interested in joining development, please fork the repository and
|
||||
submit a [pull request](https://help.github.com/articles/using-pull-requests/)
|
||||
with your changes. libigl follows strict coding guidelines, please take a look at our [style guidelines](http://libigl.github.io/libigl/style-guidelines) before submitting your pull requests.
|
||||
|
||||
## License
|
||||
libigl is primarily [MPL2](http://www.mozilla.org/MPL/2.0/) licensed
|
||||
([FAQ](http://www.mozilla.org/MPL/2.0/FAQ.html)). Some files contain
|
||||
third-party code under other licenses. We're currently in the processes of
|
||||
identifying these and marking appropriately.
|
||||
|
||||
## Attribution
|
||||
If you use libigl in your academic projects, please cite the papers we
|
||||
implement as appropriate. To cite the library in general, you could use this
|
||||
BibTeX entry:
|
||||
|
||||
```bibtex
|
||||
@misc{libigl,
|
||||
title = {{libigl}: A simple {C++} geometry processing library},
|
||||
author = {Alec Jacobson and Daniele Panozzo and others},
|
||||
note = {http://libigl.github.io/libigl/},
|
||||
year = {2017},
|
||||
}
|
||||
```
|
||||
|
||||
## Projects/Universities using libigl
|
||||
Libigl is used by many research groups around the world. In 2015, it won the
|
||||
Eurographics/ACM Symposium on Geometry Processing software award. Here are a
|
||||
few labs/companies/institutions using libigl:
|
||||
|
||||
- [Activision](http://www.activision.com)
|
||||
- [Adobe Research](http://www.adobe.com/technology/)
|
||||
- [Electronic Arts, Inc](http://www.ea.com)
|
||||
- [Epic Games](https://epicgames.com)
|
||||
- [Google Research](https://research.google.com)
|
||||
- [Industrial Light and Magic](http://ilm.com)
|
||||
- [Mesh consultants](http://meshconsultants.ca/), Canada
|
||||
- [Microsoft Research](https://www.microsoft.com/en-us/research/)
|
||||
- [Pixar](http://graphics.pixar.com/research/)
|
||||
- [Spine by Esoteric Software](http://esotericsoftware.com/) is an animation tool dedicated to 2D characters.
|
||||
- [vvvv toolkit](http://vvvv.org) a multipurpose tookit
|
||||
- Columbia University, [Columbia Computer Graphics Group](http://www.cs.columbia.edu/cg/), USA
|
||||
- [Cornell University](http://www.graphics.cornell.edu/), USA
|
||||
- [Czech Technical University in Prague](http://dcgi.felk.cvut.cz/), Czech
|
||||
- EPF Lausanne, [Computer Graphics and Geometry Laboratory](http://lgg.epfl.ch/people.php), Switzerland
|
||||
- ETH Zurich, [Interactive Geometry Lab](http://igl.ethz.ch/) and [Advanced Technologies Lab](http://ait.inf.ethz.ch/), Swizterland
|
||||
- George Mason University, [CraGL](http://cs.gmu.edu/~ygingold/), USA
|
||||
- [Hong Kong University of Science and Technology](http://www.ust.hk/), Hong Kong
|
||||
- [Inria, Université Grenoble Alpes](https://www.inria.fr/centre/grenoble/), France
|
||||
- [Jiangnan university](http://english.jiangnan.edu.cn), China
|
||||
- [National Institute of Informatics](http://www.nii.ac.jp/en/), Japan
|
||||
- New York University, [Media Research Lab](http://mrl.nyu.edu/), USA
|
||||
- NYUPoly, [Game Innovation Lab](http://game.engineering.nyu.edu/), USA
|
||||
- [TU Berlin](https://www.cg.tu-berlin.de), Germany
|
||||
- [TU Delft](http://www.tudelft.nl/en/), Netherlands
|
||||
- [TU Wien](https://www.tuwien.ac.at/en/tuwien_home/), Austria
|
||||
- [Telecom ParisTech](http://www.telecom-paristech.fr/en/formation-et-innovation-dans-le-numerique.html), Paris, France
|
||||
- [UBISOFT](https://www.ubisoft.com/en-us/), USA
|
||||
- [Utrecht University](http://www.staff.science.uu.nl/~vaxma001/), The Netherlands
|
||||
- [Universidade Federal de Santa Catarina](http://mtm.ufsc.br/~leo/), Brazil
|
||||
- [University College London](http://vecg.cs.ucl.ac.uk/), England
|
||||
- [University of California Berkeley](http://vis.berkeley.edu/), USA
|
||||
- [University of Cambridge](http://www.cam.ac.uk/), England
|
||||
- [University of Pennsylvania](http://cg.cis.upenn.edu/), USA
|
||||
- [University of Texas at Austin](http://www.cs.utexas.edu/users/evouga/), USA
|
||||
- [University of Toronto](http://dgp.toronto.edu), Canada
|
||||
- [University of Victoria](https://www.csc.uvic.ca/Research/graphics/), Canada
|
||||
- [University of Wisconsin-Eau Claire](http://www.uwec.edu/computer-science/), USA
|
||||
- [Università della Svizzera Italiana](http://www.usi.ch/en), Switzerland
|
||||
- [Université Toulouse III Paul Sabatier](http://www.univ-tlse3.fr/), France
|
||||
- [Zhejiang University](http://www.math.zju.edu.cn/cagd/), China
|
||||
|
||||
|
||||
## Contact
|
||||
|
||||
Libigl is a group endeavor led by [Alec
|
||||
Jacobson](http://www.cs.toronto.edu/~jacobson/) and [Daniele
|
||||
Panozzo](http://cs.nyu.edu/~panozzo/). Please [contact
|
||||
us](mailto:alecjacobson@gmail.com,daniele.panozzo@gmail.com) if you have
|
||||
questions or comments. For troubleshooting, please post an
|
||||
[issue](https://github.com/libigl/libigl/issues) on github.
|
||||
|
||||
If you're using libigl in your projects, quickly [drop us a
|
||||
note](mailto:alecjacobson@gmail.com,daniele.panozzo@gmail.com). Tell us who you
|
||||
are and what you're using it for. This helps us apply for funding and justify
|
||||
spending time maintaining this.
|
||||
|
||||
If you find bugs or have problems please use our [github issue tracking
|
||||
page](https://github.com/libigl/libigl/issues).
|
||||
|
||||
## Copyright
|
||||
2017 Alec Jacobson, Daniele Panozzo, Christian Schüller, Olga Diamanti, Qingnan Zhou, Sebastian Koch, Jeremie Dumas, Amir Vaxman, Nico Pietroni, Stefan Brugger, Kenshi Takayama, Wenzel Jakob, Nikolas De Giorgis, Luigi Rocca, Leonardo Sacht, Kevin Walliman, Olga Sorkine-Hornung, and others.
|
||||
|
||||
Please see individual files for appropriate copyright notices.
|
||||
Documentation, tutorial, and instructions at <https://libigl.github.io>.
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
# This file should contain the current version number of libigl
|
||||
# World.Major.Minor
|
||||
# Anyone may increment Minor to indicate a small change.
|
||||
# Major indicates a large change or large number of changes (upload to website)
|
||||
# World indicates a substantial change or release
|
||||
1.2.1
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
# 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)
|
||||
cmake_minimum_required(VERSION 3.1)
|
||||
|
||||
project(${DL_ARGS_PROJ}-download NONE)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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,540 @@
|
||||
# Copyright (c) 2013-2018, Ruslan Baratov
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice, this
|
||||
# list of conditions and the following disclaimer.
|
||||
#
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# This is a gate file to Hunter package manager.
|
||||
# Include this file using `include` command and add package you need, example:
|
||||
#
|
||||
# cmake_minimum_required(VERSION 3.2)
|
||||
#
|
||||
# include("cmake/HunterGate.cmake")
|
||||
# HunterGate(
|
||||
# URL "https://github.com/path/to/hunter/archive.tar.gz"
|
||||
# SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d"
|
||||
# )
|
||||
#
|
||||
# project(MyProject)
|
||||
#
|
||||
# hunter_add_package(Foo)
|
||||
# hunter_add_package(Boo COMPONENTS Bar Baz)
|
||||
#
|
||||
# Projects:
|
||||
# * https://github.com/hunter-packages/gate/
|
||||
# * https://github.com/ruslo/hunter
|
||||
|
||||
option(HUNTER_ENABLED "Enable Hunter package manager support" ON)
|
||||
|
||||
if(HUNTER_ENABLED)
|
||||
if(CMAKE_VERSION VERSION_LESS "3.2")
|
||||
message(
|
||||
FATAL_ERROR
|
||||
"At least CMake version 3.2 required for Hunter dependency management."
|
||||
" Update CMake or set HUNTER_ENABLED to OFF."
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
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_WIKI "https://github.com/ruslo/hunter/wiki")
|
||||
|
||||
function(hunter_gate_status_print)
|
||||
if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG)
|
||||
foreach(print_message ${ARGV})
|
||||
message(STATUS "[hunter] ${print_message}")
|
||||
endforeach()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_status_debug)
|
||||
if(HUNTER_STATUS_DEBUG)
|
||||
foreach(print_message ${ARGV})
|
||||
string(TIMESTAMP timestamp)
|
||||
message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}")
|
||||
endforeach()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_wiki wiki_page)
|
||||
message("------------------------------ WIKI -------------------------------")
|
||||
message(" ${HUNTER_WIKI}/${wiki_page}")
|
||||
message("-------------------------------------------------------------------")
|
||||
message("")
|
||||
message(FATAL_ERROR "")
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_internal_error)
|
||||
message("")
|
||||
foreach(print_message ${ARGV})
|
||||
message("[hunter ** INTERNAL **] ${print_message}")
|
||||
endforeach()
|
||||
message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
|
||||
message("")
|
||||
hunter_gate_wiki("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")
|
||||
endif()
|
||||
message("")
|
||||
foreach(x ${hunter_UNPARSED_ARGUMENTS})
|
||||
message("[hunter ** FATAL ERROR **] ${x}")
|
||||
endforeach()
|
||||
message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
|
||||
message("")
|
||||
hunter_gate_wiki("${hunter_WIKI}")
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_user_error)
|
||||
hunter_gate_fatal_error(${ARGV} WIKI "error.incorrect.input.data")
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_self root version sha1 result)
|
||||
string(COMPARE EQUAL "${root}" "" is_bad)
|
||||
if(is_bad)
|
||||
hunter_gate_internal_error("root is empty")
|
||||
endif()
|
||||
|
||||
string(COMPARE EQUAL "${version}" "" is_bad)
|
||||
if(is_bad)
|
||||
hunter_gate_internal_error("version is empty")
|
||||
endif()
|
||||
|
||||
string(COMPARE EQUAL "${sha1}" "" is_bad)
|
||||
if(is_bad)
|
||||
hunter_gate_internal_error("sha1 is empty")
|
||||
endif()
|
||||
|
||||
string(SUBSTRING "${sha1}" 0 7 archive_id)
|
||||
|
||||
if(EXISTS "${root}/cmake/Hunter")
|
||||
set(hunter_self "${root}")
|
||||
else()
|
||||
set(
|
||||
hunter_self
|
||||
"${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked"
|
||||
)
|
||||
endif()
|
||||
|
||||
set("${result}" "${hunter_self}" PARENT_SCOPE)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE)
|
||||
hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable")
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Check SYSTEMDRIVE and USERPROFILE environment variable (windows only)
|
||||
if(WIN32)
|
||||
string(COMPARE NOTEQUAL "$ENV{SYSTEMDRIVE}" "" result)
|
||||
if(result)
|
||||
set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE)
|
||||
hunter_gate_status_debug(
|
||||
"HUNTER_ROOT set using SYSTEMDRIVE environment variable"
|
||||
)
|
||||
return()
|
||||
endif()
|
||||
|
||||
string(COMPARE NOTEQUAL "$ENV{USERPROFILE}" "" result)
|
||||
if(result)
|
||||
set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE)
|
||||
hunter_gate_status_debug(
|
||||
"HUNTER_ROOT set using USERPROFILE environment variable"
|
||||
)
|
||||
return()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
hunter_gate_fatal_error(
|
||||
"Can't detect HUNTER_ROOT"
|
||||
WIKI "error.detect.hunter.root"
|
||||
)
|
||||
endfunction()
|
||||
|
||||
function(hunter_gate_download dir)
|
||||
string(
|
||||
COMPARE
|
||||
NOTEQUAL
|
||||
"$ENV{HUNTER_DISABLE_AUTOINSTALL}"
|
||||
""
|
||||
disable_autoinstall
|
||||
)
|
||||
if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL)
|
||||
hunter_gate_fatal_error(
|
||||
"Hunter not found in '${dir}'"
|
||||
"Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'"
|
||||
"Settings:"
|
||||
" HUNTER_ROOT: ${HUNTER_GATE_ROOT}"
|
||||
" HUNTER_SHA1: ${HUNTER_GATE_SHA1}"
|
||||
WIKI "error.run.install"
|
||||
)
|
||||
endif()
|
||||
string(COMPARE EQUAL "${dir}" "" is_bad)
|
||||
if(is_bad)
|
||||
hunter_gate_internal_error("Empty 'dir' argument")
|
||||
endif()
|
||||
|
||||
string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad)
|
||||
if(is_bad)
|
||||
hunter_gate_internal_error("HUNTER_GATE_SHA1 empty")
|
||||
endif()
|
||||
|
||||
string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad)
|
||||
if(is_bad)
|
||||
hunter_gate_internal_error("HUNTER_GATE_URL empty")
|
||||
endif()
|
||||
|
||||
set(done_location "${dir}/DONE")
|
||||
set(sha1_location "${dir}/SHA1")
|
||||
|
||||
set(build_dir "${dir}/Build")
|
||||
set(cmakelists "${dir}/CMakeLists.txt")
|
||||
|
||||
hunter_gate_status_debug("Locking directory: ${dir}")
|
||||
file(LOCK "${dir}" DIRECTORY GUARD FUNCTION)
|
||||
hunter_gate_status_debug("Lock done")
|
||||
|
||||
if(EXISTS "${done_location}")
|
||||
# while waiting for lock other instance can do all the job
|
||||
hunter_gate_status_debug("File '${done_location}' found, skip install")
|
||||
return()
|
||||
endif()
|
||||
|
||||
file(REMOVE_RECURSE "${build_dir}")
|
||||
file(REMOVE_RECURSE "${cmakelists}")
|
||||
|
||||
file(MAKE_DIRECTORY "${build_dir}") # check directory permissions
|
||||
|
||||
# Disabling languages speeds up a little bit, reduces noise in the output
|
||||
# and avoids path too long windows error
|
||||
file(
|
||||
WRITE
|
||||
"${cmakelists}"
|
||||
"cmake_minimum_required(VERSION 3.2)\n"
|
||||
"project(HunterDownload LANGUAGES NONE)\n"
|
||||
"include(ExternalProject)\n"
|
||||
"ExternalProject_Add(\n"
|
||||
" Hunter\n"
|
||||
" URL\n"
|
||||
" \"${HUNTER_GATE_URL}\"\n"
|
||||
" URL_HASH\n"
|
||||
" SHA1=${HUNTER_GATE_SHA1}\n"
|
||||
" DOWNLOAD_DIR\n"
|
||||
" \"${dir}\"\n"
|
||||
" TLS_VERIFY\n"
|
||||
" ${HUNTER_TLS_VERIFY}\n"
|
||||
" SOURCE_DIR\n"
|
||||
" \"${dir}/Unpacked\"\n"
|
||||
" CONFIGURE_COMMAND\n"
|
||||
" \"\"\n"
|
||||
" BUILD_COMMAND\n"
|
||||
" \"\"\n"
|
||||
" INSTALL_COMMAND\n"
|
||||
" \"\"\n"
|
||||
")\n"
|
||||
)
|
||||
|
||||
if(HUNTER_STATUS_DEBUG)
|
||||
set(logging_params "")
|
||||
else()
|
||||
set(logging_params OUTPUT_QUIET)
|
||||
endif()
|
||||
|
||||
hunter_gate_status_debug("Run generate")
|
||||
|
||||
# Need to add toolchain file too.
|
||||
# Otherwise on Visual Studio + MDD this will fail with error:
|
||||
# "Could not find an appropriate version of the Windows 10 SDK installed on this machine"
|
||||
if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
|
||||
get_filename_component(absolute_CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE)
|
||||
set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${absolute_CMAKE_TOOLCHAIN_FILE}")
|
||||
else()
|
||||
# 'toolchain_arg' can't be empty
|
||||
set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=")
|
||||
endif()
|
||||
|
||||
string(COMPARE EQUAL "${CMAKE_MAKE_PROGRAM}" "" no_make)
|
||||
if(no_make)
|
||||
set(make_arg "")
|
||||
else()
|
||||
# Test case: remove Ninja from PATH but set it via CMAKE_MAKE_PROGRAM
|
||||
set(make_arg "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}")
|
||||
endif()
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
"${CMAKE_COMMAND}"
|
||||
"-H${dir}"
|
||||
"-B${build_dir}"
|
||||
"-G${CMAKE_GENERATOR}"
|
||||
"${toolchain_arg}"
|
||||
${make_arg}
|
||||
WORKING_DIRECTORY "${dir}"
|
||||
RESULT_VARIABLE download_result
|
||||
${logging_params}
|
||||
)
|
||||
|
||||
if(NOT download_result EQUAL 0)
|
||||
hunter_gate_internal_error(
|
||||
"Configure project failed."
|
||||
"To reproduce the error run: ${CMAKE_COMMAND} -H${dir} -B${build_dir} -G${CMAKE_GENERATOR} ${toolchain_arg} ${make_arg}"
|
||||
"In directory ${dir}"
|
||||
)
|
||||
endif()
|
||||
|
||||
hunter_gate_status_print(
|
||||
"Initializing Hunter workspace (${HUNTER_GATE_SHA1})"
|
||||
" ${HUNTER_GATE_URL}"
|
||||
" -> ${dir}"
|
||||
)
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_COMMAND}" --build "${build_dir}"
|
||||
WORKING_DIRECTORY "${dir}"
|
||||
RESULT_VARIABLE download_result
|
||||
${logging_params}
|
||||
)
|
||||
|
||||
if(NOT download_result EQUAL 0)
|
||||
hunter_gate_internal_error("Build project failed")
|
||||
endif()
|
||||
|
||||
file(REMOVE_RECURSE "${build_dir}")
|
||||
file(REMOVE_RECURSE "${cmakelists}")
|
||||
|
||||
file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}")
|
||||
file(WRITE "${done_location}" "DONE")
|
||||
|
||||
hunter_gate_status_debug("Finished")
|
||||
endfunction()
|
||||
|
||||
# Must be a macro so master file 'cmake/Hunter' can
|
||||
# apply all variables easily just by 'include' command
|
||||
# (otherwise PARENT_SCOPE magic needed)
|
||||
macro(HunterGate)
|
||||
if(HUNTER_GATE_DONE)
|
||||
# variable HUNTER_GATE_DONE set explicitly for external project
|
||||
# (see `hunter_download`)
|
||||
set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
|
||||
endif()
|
||||
|
||||
# First HunterGate command will init Hunter, others will be ignored
|
||||
get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET)
|
||||
|
||||
if(NOT HUNTER_ENABLED)
|
||||
# Empty function to avoid error "unknown function"
|
||||
function(hunter_add_package)
|
||||
endfunction()
|
||||
|
||||
set(
|
||||
_hunter_gate_disabled_mode_dir
|
||||
"${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/disabled-mode"
|
||||
)
|
||||
if(EXISTS "${_hunter_gate_disabled_mode_dir}")
|
||||
hunter_gate_status_debug(
|
||||
"Adding \"disabled-mode\" modules: ${_hunter_gate_disabled_mode_dir}"
|
||||
)
|
||||
list(APPEND CMAKE_PREFIX_PATH "${_hunter_gate_disabled_mode_dir}")
|
||||
endif()
|
||||
elseif(_hunter_gate_done)
|
||||
hunter_gate_status_debug("Secondary HunterGate (use old settings)")
|
||||
hunter_gate_self(
|
||||
"${HUNTER_CACHED_ROOT}"
|
||||
"${HUNTER_VERSION}"
|
||||
"${HUNTER_SHA1}"
|
||||
_hunter_self
|
||||
)
|
||||
include("${_hunter_self}/cmake/Hunter")
|
||||
else()
|
||||
set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
|
||||
string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name)
|
||||
if(_have_project_name)
|
||||
hunter_gate_fatal_error(
|
||||
"Please set HunterGate *before* 'project' command. "
|
||||
"Detected project: ${PROJECT_NAME}"
|
||||
WIKI "error.huntergate.before.project"
|
||||
)
|
||||
endif()
|
||||
|
||||
cmake_parse_arguments(
|
||||
HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV}
|
||||
)
|
||||
|
||||
string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1)
|
||||
string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url)
|
||||
string(
|
||||
COMPARE
|
||||
NOTEQUAL
|
||||
"${HUNTER_GATE_UNPARSED_ARGUMENTS}"
|
||||
""
|
||||
_have_unparsed
|
||||
)
|
||||
string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global)
|
||||
string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath)
|
||||
|
||||
if(_have_unparsed)
|
||||
hunter_gate_user_error(
|
||||
"HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}"
|
||||
)
|
||||
endif()
|
||||
if(_empty_sha1)
|
||||
hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory")
|
||||
endif()
|
||||
if(_empty_url)
|
||||
hunter_gate_user_error("URL suboption of HunterGate is mandatory")
|
||||
endif()
|
||||
if(_have_global)
|
||||
if(HUNTER_GATE_LOCAL)
|
||||
hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)")
|
||||
endif()
|
||||
if(_have_filepath)
|
||||
hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)")
|
||||
endif()
|
||||
endif()
|
||||
if(HUNTER_GATE_LOCAL)
|
||||
if(_have_global)
|
||||
hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)")
|
||||
endif()
|
||||
if(_have_filepath)
|
||||
hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)")
|
||||
endif()
|
||||
endif()
|
||||
if(_have_filepath)
|
||||
if(_have_global)
|
||||
hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)")
|
||||
endif()
|
||||
if(HUNTER_GATE_LOCAL)
|
||||
hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
hunter_gate_detect_root() # set HUNTER_GATE_ROOT
|
||||
|
||||
# Beautify path, fix probable problems with windows path slashes
|
||||
get_filename_component(
|
||||
HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE
|
||||
)
|
||||
hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}")
|
||||
if(NOT HUNTER_ALLOW_SPACES_IN_PATH)
|
||||
string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces)
|
||||
if(NOT _contain_spaces EQUAL -1)
|
||||
hunter_gate_fatal_error(
|
||||
"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"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
string(
|
||||
REGEX
|
||||
MATCH
|
||||
"[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*"
|
||||
HUNTER_GATE_VERSION
|
||||
"${HUNTER_GATE_URL}"
|
||||
)
|
||||
string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty)
|
||||
if(_is_empty)
|
||||
set(HUNTER_GATE_VERSION "unknown")
|
||||
endif()
|
||||
|
||||
hunter_gate_self(
|
||||
"${HUNTER_GATE_ROOT}"
|
||||
"${HUNTER_GATE_VERSION}"
|
||||
"${HUNTER_GATE_SHA1}"
|
||||
_hunter_self
|
||||
)
|
||||
|
||||
set(_master_location "${_hunter_self}/cmake/Hunter")
|
||||
if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter")
|
||||
# Hunter downloaded manually (e.g. by 'git clone')
|
||||
set(_unused "xxxxxxxxxx")
|
||||
set(HUNTER_GATE_SHA1 "${_unused}")
|
||||
set(HUNTER_GATE_VERSION "${_unused}")
|
||||
else()
|
||||
get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE)
|
||||
set(_done_location "${_archive_id_location}/DONE")
|
||||
set(_sha1_location "${_archive_id_location}/SHA1")
|
||||
|
||||
# Check Hunter already downloaded by HunterGate
|
||||
if(NOT EXISTS "${_done_location}")
|
||||
hunter_gate_download("${_archive_id_location}")
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS "${_done_location}")
|
||||
hunter_gate_internal_error("hunter_gate_download failed")
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS "${_sha1_location}")
|
||||
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)
|
||||
if(NOT _is_equal)
|
||||
hunter_gate_internal_error(
|
||||
"Short SHA1 collision:"
|
||||
" ${_sha1_value} (from ${_sha1_location})"
|
||||
" ${HUNTER_GATE_SHA1} (HunterGate)"
|
||||
)
|
||||
endif()
|
||||
if(NOT EXISTS "${_master_location}")
|
||||
hunter_gate_user_error(
|
||||
"Master file not found:"
|
||||
" ${_master_location}"
|
||||
"try to update Hunter/HunterGate"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
include("${_master_location}")
|
||||
set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
|
||||
endif()
|
||||
endmacro()
|
||||
@@ -0,0 +1,198 @@
|
||||
################################################################################
|
||||
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 v5.2
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## CoMISo
|
||||
function(igl_download_comiso)
|
||||
igl_download_project(CoMISo
|
||||
GIT_REPOSITORY https://github.com/libigl/CoMISo.git
|
||||
GIT_TAG d60aa4759fba76b0b793b1efb090b7a771dd7c56
|
||||
)
|
||||
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://gitlab.com/libeigen/eigen.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.12.1
|
||||
${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 3327050ca66ad34426a82c217c2d60ced61526b7
|
||||
${LIBIGL_BRANCH_OPTIONS}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## ImGui
|
||||
function(igl_download_imgui)
|
||||
igl_download_project(imgui
|
||||
GIT_REPOSITORY https://github.com/ocornut/imgui.git
|
||||
GIT_TAG v1.76
|
||||
${LIBIGL_BRANCH_OPTIONS}
|
||||
)
|
||||
igl_download_project(libigl-imgui
|
||||
GIT_REPOSITORY https://github.com/libigl/libigl-imgui.git
|
||||
GIT_TAG 99f0643089b19f6daf5b3efd9544a65c9a851966
|
||||
)
|
||||
endfunction()
|
||||
|
||||
## ImGuizmo
|
||||
function(igl_download_imguizmo)
|
||||
igl_download_project(imguizmo
|
||||
GIT_REPOSITORY https://github.com/CedricGuillemet/ImGuizmo.git
|
||||
GIT_TAG a23567269f6617342bcc112394bdad937b54b2d7
|
||||
${LIBIGL_BRANCH_OPTIONS}
|
||||
)
|
||||
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 5a70326574b34d6a51d9eaf6a9f78813657ee108
|
||||
)
|
||||
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 488242fa2b1f98a9c5bd1441297fb4a99a6a9ae4
|
||||
)
|
||||
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 19cedf96d70702d8b3a83eb27934780c542356fe
|
||||
)
|
||||
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 c1f9ede366d02e3531ecbaec5e3769312f31cccd
|
||||
)
|
||||
endfunction()
|
||||
@@ -0,0 +1,118 @@
|
||||
# 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
|
||||
408_DirectDeltaMush_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
|
||||
719_ExplodedView_bin
|
||||
)
|
||||
|
||||
endfunction()
|
||||
@@ -0,0 +1,26 @@
|
||||
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()
|
||||
@@ -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)
|
||||
@@ -0,0 +1,8 @@
|
||||
# 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
|
||||
@@ -0,0 +1,31 @@
|
||||
@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)
|
||||
|
||||
@@ -11,48 +11,40 @@ if(APPLE)
|
||||
message(STATUS "Found libtool - ${CMAKE_LIBTOOL}")
|
||||
get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES)
|
||||
foreach(lang ${languages})
|
||||
# Added -c
|
||||
# Added -c
|
||||
set(CMAKE_${lang}_CREATE_STATIC_LIBRARY
|
||||
"${CMAKE_LIBTOOL} -c -static -o <TARGET> <LINK_FLAGS> <OBJECTS> ")
|
||||
endforeach()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
### Find packages to populate default options ###
|
||||
#
|
||||
# COMPONENTS should match subsequent calls
|
||||
find_package(Matlab COMPONENTS MEX_COMPILER MX_LIBRARY ENG_LIBRARY) # --> Matlab_FOUND
|
||||
find_package(MOSEK) # --> MOSEK_FOUND
|
||||
find_package(OpenGL) # --> OPENGL_FOUND
|
||||
|
||||
### Available options ###
|
||||
option(LIBIGL_USE_STATIC_LIBRARY "Use libigl as static library" ON)
|
||||
option(LIBIGL_WITH_ANTTWEAKBAR "Use AntTweakBar" OFF)
|
||||
option(LIBIGL_WITH_CGAL "Use CGAL" ON)
|
||||
option(LIBIGL_WITH_COMISO "Use CoMiso" ON)
|
||||
option(LIBIGL_WITH_CORK "Use Cork" OFF)
|
||||
option(LIBIGL_WITH_EMBREE "Use Embree" OFF)
|
||||
option(LIBIGL_WITH_LIM "Use LIM" ON)
|
||||
option(LIBIGL_WITH_MATLAB "Use Matlab" "${Matlab_FOUND}")
|
||||
option(LIBIGL_WITH_MOSEK "Use MOSEK" "${MOSEK_FOUND}")
|
||||
option(LIBIGL_WITH_OPENGL "Use OpenGL" "${OPENGL_FOUND}")
|
||||
option(LIBIGL_WITH_OPENGL_GLFW "Use GLFW" "${OPENGL_FOUND}")
|
||||
option(LIBIGL_WITH_OPENGL_GLFW_IMGUI "Use ImGui" OFF)
|
||||
option(LIBIGL_WITH_PNG "Use PNG" ON)
|
||||
option(LIBIGL_WITH_TETGEN "Use Tetgen" ON)
|
||||
option(LIBIGL_WITH_TRIANGLE "Use Triangle" ON)
|
||||
option(LIBIGL_WITH_VIEWER "Use OpenGL viewer" "${OPENGL_FOUND}")
|
||||
option(LIBIGL_WITH_XML "Use XML" ON)
|
||||
option(LIBIGL_WITH_PYTHON "Use Python" OFF)
|
||||
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_WITH_VIEWER AND (NOT LIBIGL_WITH_OPENGL_GLFW OR NOT LIBIGL_WITH_OPENGL) )
|
||||
message(FATAL_ERROR "LIBIGL_WITH_VIEWER=ON requires LIBIGL_WITH_OPENGL_GLFW=ON and LIBIGL_WITH_OPENGL=ON")
|
||||
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_ROOT "${CMAKE_CURRENT_LIST_DIR}/..")
|
||||
set(LIBIGL_SOURCE_DIR "${LIBIGL_ROOT}/include")
|
||||
set(LIBIGL_EXTERNAL "${LIBIGL_ROOT}/external")
|
||||
|
||||
@@ -63,12 +55,24 @@ 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 ${LIBIGL_SOURCE_DIR})
|
||||
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()
|
||||
@@ -81,41 +85,46 @@ target_compile_features(igl_common INTERFACE ${CXX11_FEATURES})
|
||||
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()
|
||||
|
||||
# Eigen
|
||||
if(TARGET Eigen3::Eigen)
|
||||
# If an imported target already exists, use it
|
||||
target_link_libraries(igl_common INTERFACE Eigen3::Eigen)
|
||||
else()
|
||||
target_include_directories(igl_common SYSTEM INTERFACE ${LIBIGL_EXTERNAL}/eigen)
|
||||
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})
|
||||
|
||||
################################################################################
|
||||
|
||||
include(DownloadProject)
|
||||
|
||||
# Shortcut function
|
||||
function(igl_download_project name)
|
||||
download_project(
|
||||
PROJ ${name}
|
||||
SOURCE_DIR ${LIBIGL_EXTERNAL}/${name}
|
||||
DOWNLOAD_DIR ${LIBIGL_EXTERNAL}/.cache/${name}
|
||||
${ARGN}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
|
||||
## CGAL dependencies on Windows: GMP & MPFR
|
||||
function(igl_download_cgal_deps)
|
||||
if(WIN32)
|
||||
@@ -144,12 +153,31 @@ function(compile_igl_module module_dir)
|
||||
if(LIBIGL_USE_STATIC_LIBRARY)
|
||||
file(GLOB SOURCES_IGL_${module_name}
|
||||
"${LIBIGL_SOURCE_DIR}/igl/${module_dir}/*.cpp"
|
||||
"${LIBIGL_SOURCE_DIR}/igl/copyleft/${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)
|
||||
target_compile_options(${module_libname} PRIVATE /w) # disable all warnings (not ideal but...)
|
||||
else()
|
||||
#target_compile_options(${module_libname} PRIVATE -w) # disable all warnings (not ideal but...)
|
||||
# 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)
|
||||
@@ -163,6 +191,8 @@ function(compile_igl_module module_dir)
|
||||
# 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()
|
||||
|
||||
################################################################################
|
||||
@@ -172,20 +202,16 @@ endfunction()
|
||||
if(LIBIGL_USE_STATIC_LIBRARY)
|
||||
file(GLOB SOURCES_IGL
|
||||
"${LIBIGL_SOURCE_DIR}/igl/*.cpp"
|
||||
"${LIBIGL_SOURCE_DIR}/igl/copyleft/*.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})
|
||||
|
||||
################################################################################
|
||||
## Compile the AntTweakBar part ###
|
||||
if(LIBIGL_WITH_ANTTWEAKBAR)
|
||||
set(ANTTWEAKBAR_DIR "${LIBIGL_EXTERNAL}/AntTweakBar")
|
||||
if(NOT TARGET AntTweakBar)
|
||||
add_subdirectory("${ANTTWEAKBAR_DIR}" AntTweakBar)
|
||||
endif()
|
||||
compile_igl_module("anttweakbar")
|
||||
target_link_libraries(igl_anttweakbar ${IGL_SCOPE} AntTweakBar)
|
||||
target_include_directories(igl_anttweakbar ${IGL_SCOPE} "${ANTTWEAKBAR_DIR}/include")
|
||||
### Download the python part ###
|
||||
if(LIBIGL_WITH_PYTHON)
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
@@ -196,11 +222,14 @@ if(LIBIGL_WITH_CGAL)
|
||||
# `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()
|
||||
set(CGAL_Boost_USE_STATIC_LIBS ON CACHE BOOL "" FORCE)
|
||||
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()
|
||||
|
||||
@@ -209,7 +238,7 @@ if(LIBIGL_WITH_CGAL)
|
||||
compile_igl_module("cgal")
|
||||
target_link_libraries(igl_cgal ${IGL_SCOPE} CGAL::CGAL CGAL::CGAL_Core)
|
||||
else()
|
||||
set(LIBIGL_WITH_CGAL OFF CACHE BOOL "" FORCE)
|
||||
message(FATAL_ERROR "Could not define CGAL::CGAL and CGAL::CGAL_Core.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -242,6 +271,7 @@ endfunction()
|
||||
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)
|
||||
@@ -254,6 +284,7 @@ if(LIBIGL_WITH_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")
|
||||
@@ -267,56 +298,33 @@ endif()
|
||||
if(LIBIGL_WITH_EMBREE)
|
||||
set(EMBREE_DIR "${LIBIGL_EXTERNAL}/embree")
|
||||
|
||||
set(EMBREE_ISPC_SUPPORT OFF CACHE BOOL " " FORCE)
|
||||
set(EMBREE_TASKING_SYSTEM "INTERNAL" CACHE BOOL " " FORCE)
|
||||
set(EMBREE_TUTORIALS OFF CACHE BOOL " " FORCE)
|
||||
set(EMBREE_MAX_ISA NONE CACHE STRINGS " " FORCE)
|
||||
set(BUILD_TESTING OFF CACHE BOOL " " FORCE)
|
||||
|
||||
# set(ENABLE_INSTALLER OFF CACHE BOOL " " FORCE)
|
||||
if(MSVC)
|
||||
# set(EMBREE_STATIC_RUNTIME OFF CACHE BOOL " " FORCE)
|
||||
set(EMBREE_STATIC_LIB OFF CACHE BOOL " " FORCE)
|
||||
else()
|
||||
set(EMBREE_STATIC_LIB ON CACHE BOOL " " FORCE)
|
||||
endif()
|
||||
|
||||
if(NOT TARGET embree)
|
||||
add_subdirectory("${EMBREE_DIR}" "embree")
|
||||
endif()
|
||||
igl_download_embree()
|
||||
|
||||
if(MSVC)
|
||||
add_custom_target(Copy-Embree-DLL ALL # Adds a post-build event
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different # which executes "cmake - E
|
||||
$<TARGET_FILE:embree> # <--this is in-file
|
||||
"${CMAKE_BINARY_DIR}" # <--this is out-file path
|
||||
DEPENDS embree) # Execute after embree target has been built
|
||||
# Note: On macOS, building embree as a static lib can only be done with a single ISA target.
|
||||
set(EMBREE_MAX_ISA "DEFAULT" CACHE STRING "Selects highest ISA to support.")
|
||||
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_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)
|
||||
if(NOT MSVC)
|
||||
target_compile_definitions(igl_embree ${IGL_SCOPE} -DENABLE_STATIC_LIB)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
### Compile the lim part ###
|
||||
if(LIBIGL_WITH_LIM)
|
||||
set(LIM_DIR "${LIBIGL_EXTERNAL}/lim")
|
||||
if(NOT TARGET lim)
|
||||
add_subdirectory("${LIM_DIR}" "lim")
|
||||
endif()
|
||||
compile_igl_module("lim")
|
||||
target_link_libraries(igl_lim ${IGL_SCOPE} lim)
|
||||
target_include_directories(igl_lim ${IGL_SCOPE} ${LIM_DIR})
|
||||
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)
|
||||
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})
|
||||
@@ -336,13 +344,23 @@ endif()
|
||||
### Compile the opengl part ###
|
||||
if(LIBIGL_WITH_OPENGL)
|
||||
# OpenGL module
|
||||
find_package(OpenGL REQUIRED)
|
||||
compile_igl_module("opengl")
|
||||
target_link_libraries(igl_opengl ${IGL_SCOPE} ${OPENGL_gl_LIBRARY})
|
||||
target_include_directories(igl_opengl SYSTEM ${IGL_SCOPE} ${OPENGL_INCLUDE_DIR})
|
||||
|
||||
# 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)
|
||||
@@ -355,10 +373,16 @@ if(LIBIGL_WITH_OPENGL_GLFW)
|
||||
# GLFW module
|
||||
compile_igl_module("opengl/glfw")
|
||||
if(NOT TARGET glfw)
|
||||
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL " " FORCE)
|
||||
set(GLFW_BUILD_TESTS OFF CACHE BOOL " " FORCE)
|
||||
set(GLFW_BUILD_DOCS OFF CACHE BOOL " " FORCE)
|
||||
set(GLFW_INSTALL OFF CACHE BOOL " " FORCE)
|
||||
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)
|
||||
@@ -372,9 +396,16 @@ if(LIBIGL_WITH_OPENGL_GLFW_IMGUI)
|
||||
# ImGui module
|
||||
compile_igl_module("opengl/glfw/imgui")
|
||||
if(NOT TARGET imgui)
|
||||
add_subdirectory(${LIBIGL_EXTERNAL}/imgui 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)
|
||||
if(NOT TARGET imguizmo)
|
||||
igl_download_imguizmo()
|
||||
add_library(imguizmo ${LIBIGL_EXTERNAL}/imguizmo/ImGuizmo.cpp ${LIBIGL_EXTERNAL}/imguizmo/ImGuizmo.h)
|
||||
target_compile_features(imguizmo PUBLIC cxx_std_11)
|
||||
target_link_libraries(imguizmo PUBLIC imgui)
|
||||
endif()
|
||||
target_link_libraries(igl_opengl_glfw_imgui ${IGL_SCOPE} igl_opengl_glfw imgui imguizmo)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -384,9 +415,9 @@ 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)
|
||||
set(STB_IMAGE_DIR "${LIBIGL_EXTERNAL}/stb_image")
|
||||
if(NOT TARGET stb_image)
|
||||
add_subdirectory("${STB_IMAGE_DIR}" "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)
|
||||
@@ -398,6 +429,7 @@ endif()
|
||||
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")
|
||||
@@ -410,6 +442,7 @@ endif()
|
||||
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")
|
||||
@@ -417,12 +450,28 @@ if(LIBIGL_WITH_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"
|
||||
@@ -432,3 +481,97 @@ if(LIBIGL_WITH_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)
|
||||
|
||||
+40
-45
@@ -1025,51 +1025,46 @@ namespace igl
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
// generated by autoexplicit.sh
|
||||
template double igl::AABB<Eigen::Matrix<double, -1, 3, 1, -1, 3>, 3>::squared_distance<Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, double, double, int&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, 3, 1, -1, 3>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> >&) const;
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, 3, 1, -1, 3>, 3>::init<Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&);
|
||||
// generated by autoexplicit.sh
|
||||
// generated by autoexplicit.sh
|
||||
template float igl::AABB<Eigen::Matrix<float, -1, 3, 0, -1, 3>, 3>::squared_distance<Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::Matrix<float, 1, 3, 1, 1, 3> const&, float, float, int&, Eigen::PlainObjectBase<Eigen::Matrix<float, 1, 3, 1, 1, 3> >&) const;
|
||||
// generated by autoexplicit.sh
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<float, -1, 3, 0, -1, 3>, 3>::init<Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::serialize<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, int) const;
|
||||
// generated by autoexplicit.sh
|
||||
template std::vector<int, std::allocator<int> > igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::find<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 1, -1, 1, 1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&, bool) const;
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::serialize<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, int) const;
|
||||
// generated by autoexplicit.sh
|
||||
template std::vector<int, std::allocator<int> > igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::find<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 1, -1, 1, 1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&, bool) const;
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::init<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::init<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int);
|
||||
// generated by autoexplicit.sh
|
||||
template float igl::AABB<Eigen::Matrix<float, -1, 3, 1, -1, 3>, 3>::squared_distance<Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::Matrix<float, 1, 3, 1, 1, 3> const&, int&, Eigen::PlainObjectBase<Eigen::Matrix<float, 1, 3, 1, 1, 3> >&) const;
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&) const;
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;
|
||||
// generated by autoexplicit.sh
|
||||
template double igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, int&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&) const;
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&) const;
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;
|
||||
// generated by autoexplicit.sh
|
||||
template double igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<double, 1, 2, 1, 1, 2> const&, int&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> >&) const;
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<float, -1, 3, 1, -1, 3>, 3>::init<Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::init<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::init<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);
|
||||
template double igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, double, int&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, 3, 1, -1, 3>, 3>::init<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);
|
||||
template bool igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::intersect_ray<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, igl::Hit&) const;
|
||||
template double igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<double, 1, 2, 1, 1, 2> const&, int&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> >&) const;
|
||||
template double igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, double, int&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&) const;
|
||||
template double igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, int&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&) const;
|
||||
template double igl::AABB<Eigen::Matrix<double, -1, 3, 1, -1, 3>, 3>::squared_distance<Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, double, double, int&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&) const;
|
||||
template float igl::AABB<Eigen::Matrix<float, -1, 3, 0, -1, 3>, 3>::squared_distance<Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::Matrix<float, 1, 3, 1, 1, 3> const&, float, float, int&, Eigen::PlainObjectBase<Eigen::Matrix<float, 1, 3, 1, 1, 3> >&) const;
|
||||
template float igl::AABB<Eigen::Matrix<float, -1, 3, 1, -1, 3>, 3>::squared_distance<Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::Matrix<float, 1, 3, 1, 1, 3> const&, int&, Eigen::PlainObjectBase<Eigen::Matrix<float, 1, 3, 1, 1, 3> >&) const;
|
||||
template std::vector<int, std::allocator<int> > igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::find<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 1, -1, 1, 1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&, bool) const;
|
||||
template std::vector<int, std::allocator<int> > igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::find<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 1, -1, false> > const&, bool) const;
|
||||
template std::vector<int, std::allocator<int> > igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::find<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 1, -1, 1, 1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> > const&, bool) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::init<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::init<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int);
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::init<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&);
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::serialize<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, int) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::init<Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::init<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, int);
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::init<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&);
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::serialize<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, int) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<long, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<long, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 2, 3, 0, 2, 3>, Eigen::Matrix<double, 2, 1, 0, 2, 1>, Eigen::Matrix<int, 2, 1, 0, 2, 1>, Eigen::Matrix<double, 2, 3, 0, 2, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 2, 3, 0, 2, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 1, 0, 2, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, 2, 1, 0, 2, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 3, 0, 2, 3> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&) const;
|
||||
template void igl::AABB<Eigen::Matrix<double, -1, 3, 1, -1, 3>, 3>::init<Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&);
|
||||
template void igl::AABB<Eigen::Matrix<float, -1, 3, 0, -1, 3>, 3>::init<Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&);
|
||||
template void igl::AABB<Eigen::Matrix<float, -1, 3, 1, -1, 3>, 3>::init<Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&);
|
||||
template double igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 3>::squared_distance<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::Matrix<double, 1, 3, 1, 1, 3> const&, int&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&) const;
|
||||
template double igl::AABB<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 2>::squared_distance<Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::Matrix<double, 1, 2, 1, 1, 2> const&, int&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 2, 1, 1, 2> >&) const;
|
||||
#ifdef WIN32
|
||||
template void igl::AABB<class Eigen::Matrix<double,-1,-1,0,-1,-1>,2>::squared_distance<class Eigen::Matrix<int,-1,-1,0,-1,-1>,class Eigen::Matrix<double,-1,-1,0,-1,-1>,class Eigen::Matrix<double,-1,1,0,-1,1>,class Eigen::Matrix<__int64,-1,1,0,-1,1>,class Eigen::Matrix<double,-1,3,0,-1,3> >(class Eigen::MatrixBase<class Eigen::Matrix<double,-1,-1,0,-1,-1> > const &,class Eigen::MatrixBase<class Eigen::Matrix<int,-1,-1,0,-1,-1> > const &,class Eigen::MatrixBase<class Eigen::Matrix<double,-1,-1,0,-1,-1> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<double,-1,1,0,-1,1> > &,class Eigen::PlainObjectBase<class Eigen::Matrix<__int64,-1,1,0,-1,1> > &,class Eigen::PlainObjectBase<class Eigen::Matrix<double,-1,3,0,-1,3> > &)const;
|
||||
template void igl::AABB<class Eigen::Matrix<double,-1,-1,0,-1,-1>,3>::squared_distance<class Eigen::Matrix<int,-1,-1,0,-1,-1>,class Eigen::Matrix<double,-1,-1,0,-1,-1>,class Eigen::Matrix<double,-1,1,0,-1,1>,class Eigen::Matrix<__int64,-1,1,0,-1,1>,class Eigen::Matrix<double,-1,3,0,-1,3> >(class Eigen::MatrixBase<class Eigen::Matrix<double,-1,-1,0,-1,-1> > const &,class Eigen::MatrixBase<class Eigen::Matrix<int,-1,-1,0,-1,-1> > const &,class Eigen::MatrixBase<class Eigen::Matrix<double,-1,-1,0,-1,-1> > const &,class Eigen::PlainObjectBase<class Eigen::Matrix<double,-1,1,0,-1,1> > &,class Eigen::PlainObjectBase<class Eigen::Matrix<__int64,-1,1,0,-1,1> > &,class Eigen::PlainObjectBase<class Eigen::Matrix<double,-1,3,0,-1,3> > &)const;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
+2
-2
@@ -13,8 +13,8 @@ namespace igl
|
||||
// Define a standard value for double epsilon
|
||||
const double DOUBLE_EPS = 1.0e-14;
|
||||
const double DOUBLE_EPS_SQ = 1.0e-28;
|
||||
const float FLOAT_EPS = 1.0e-7;
|
||||
const float FLOAT_EPS_SQ = 1.0e-14;
|
||||
const float FLOAT_EPS = 1.0e-7f;
|
||||
const float FLOAT_EPS_SQ = 1.0e-14f;
|
||||
// Function returning EPS for corresponding type
|
||||
template <typename S_type> IGL_INLINE S_type EPS();
|
||||
template <typename S_type> IGL_INLINE S_type EPS_SQ();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,13 +1,21 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
|
||||
// Copyright (C) 2020 Jérémie Dumas <jeremie.dumas@ens-lyon.org>
|
||||
//
|
||||
// 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/.
|
||||
m.def("get_seconds", []
|
||||
()
|
||||
{
|
||||
return igl::get_seconds();
|
||||
}, __doc_igl_get_seconds);
|
||||
#ifndef IGL_FILEENCODING_H
|
||||
#define IGL_FILEENCODING_H
|
||||
|
||||
namespace igl
|
||||
{
|
||||
|
||||
enum class FileEncoding {
|
||||
Binary,
|
||||
Ascii
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -10,9 +10,9 @@
|
||||
|
||||
template <typename DerivedF, typename DerivedFF, typename DerivedFFi>
|
||||
IGL_INLINE igl::HalfEdgeIterator<DerivedF,DerivedFF,DerivedFFi>::HalfEdgeIterator(
|
||||
const Eigen::PlainObjectBase<DerivedF>& _F,
|
||||
const Eigen::PlainObjectBase<DerivedFF>& _FF,
|
||||
const Eigen::PlainObjectBase<DerivedFFi>& _FFi,
|
||||
const Eigen::MatrixBase<DerivedF>& _F,
|
||||
const Eigen::MatrixBase<DerivedFF>& _FF,
|
||||
const Eigen::MatrixBase<DerivedFFi>& _FFi,
|
||||
int _fi,
|
||||
int _ei,
|
||||
bool _reverse
|
||||
@@ -138,8 +138,8 @@ IGL_INLINE bool igl::HalfEdgeIterator<DerivedF,DerivedFF,DerivedFFi>::operator==
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
template igl::HalfEdgeIterator<Eigen::Matrix<int, -1, 3, 0, -1, 3> ,Eigen::Matrix<int, -1, 3, 0, -1, 3> ,Eigen::Matrix<int, -1, 3, 0, -1, 3> >::HalfEdgeIterator(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, int, int, bool);
|
||||
template igl::HalfEdgeIterator<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >::HalfEdgeIterator(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, int, bool);
|
||||
template igl::HalfEdgeIterator<Eigen::Matrix<int, -1, 3, 0, -1, 3> ,Eigen::Matrix<int, -1, 3, 0, -1, 3> ,Eigen::Matrix<int, -1, 3, 0, -1, 3> >::HalfEdgeIterator(Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, int, int, bool);
|
||||
template igl::HalfEdgeIterator<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >::HalfEdgeIterator(Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, int, bool);
|
||||
template bool igl::HalfEdgeIterator<Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1> >::NextFE();
|
||||
template int igl::HalfEdgeIterator<Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1> >::Ei();
|
||||
template int igl::HalfEdgeIterator<Eigen::Matrix<int, -1, 3, 0, -1, 3> ,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1> >::Ei();
|
||||
@@ -147,12 +147,16 @@ template int igl::HalfEdgeIterator<Eigen::Matrix<int, -1, 3, 0, -1, 3> ,Eigen:
|
||||
template int igl::HalfEdgeIterator<Eigen::Matrix<int, -1, 3, 0, -1, 3> ,Eigen::Matrix<int, -1, 3, 0, -1, 3> ,Eigen::Matrix<int, -1, 3, 0, -1, 3> >::Fi();
|
||||
template bool igl::HalfEdgeIterator<Eigen::Matrix<int, -1, 3, 0, -1, 3> ,Eigen::Matrix<int, -1, 3, 0, -1, 3> ,Eigen::Matrix<int, -1, 3, 0, -1, 3> >::NextFE();
|
||||
template int igl::HalfEdgeIterator<Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1> >::Vi();
|
||||
template igl::HalfEdgeIterator<Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1> >::HalfEdgeIterator(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, int, bool);
|
||||
template igl::HalfEdgeIterator<Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1> >::HalfEdgeIterator(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, int, bool);
|
||||
template int igl::HalfEdgeIterator<Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1> >::Fi();
|
||||
template void igl::HalfEdgeIterator<Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1> >::flipE();
|
||||
template void igl::HalfEdgeIterator<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >::flipE();
|
||||
template void igl::HalfEdgeIterator<Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1> >::flipF();
|
||||
template void igl::HalfEdgeIterator<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >::flipF();
|
||||
template void igl::HalfEdgeIterator<Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1> >::flipV();
|
||||
template bool igl::HalfEdgeIterator<Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1> >::operator==(igl::HalfEdgeIterator<Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1>,Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
|
||||
template int igl::HalfEdgeIterator<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >::Fi();
|
||||
template bool igl::HalfEdgeIterator<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >::NextFE();
|
||||
template bool igl::HalfEdgeIterator<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >::isBorder();
|
||||
template bool igl::HalfEdgeIterator<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >::isBorder();
|
||||
#endif
|
||||
|
||||
@@ -49,9 +49,9 @@ namespace igl
|
||||
public:
|
||||
// Init the HalfEdgeIterator by specifying Face,Edge Index and Orientation
|
||||
IGL_INLINE HalfEdgeIterator(
|
||||
const Eigen::PlainObjectBase<DerivedF>& _F,
|
||||
const Eigen::PlainObjectBase<DerivedFF>& _FF,
|
||||
const Eigen::PlainObjectBase<DerivedFFi>& _FFi,
|
||||
const Eigen::MatrixBase<DerivedF>& _F,
|
||||
const Eigen::MatrixBase<DerivedFF>& _FF,
|
||||
const Eigen::MatrixBase<DerivedFFi>& _FFi,
|
||||
int _fi,
|
||||
int _ei,
|
||||
bool _reverse = false
|
||||
@@ -100,9 +100,9 @@ namespace igl
|
||||
bool reverse;
|
||||
|
||||
// All the same type? This is likely to break.
|
||||
const Eigen::PlainObjectBase<DerivedF> & F;
|
||||
const Eigen::PlainObjectBase<DerivedFF> & FF;
|
||||
const Eigen::PlainObjectBase<DerivedFFi> & FFi;
|
||||
const Eigen::MatrixBase<DerivedF> & F;
|
||||
const Eigen::MatrixBase<DerivedFF> & FF;
|
||||
const Eigen::MatrixBase<DerivedFFi> & FFi;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+7
-3
@@ -17,9 +17,13 @@ namespace igl
|
||||
struct Hit
|
||||
{
|
||||
int id; // primitive id
|
||||
int gid; // geometry id
|
||||
float u,v; // barycentric coordinates
|
||||
float t; // distance = direction*t to intersection
|
||||
int gid; // geometry id (not used)
|
||||
// barycentric coordinates so that
|
||||
// pos = V.row(F(id,0))*(1-u-v)+V.row(F(id,1))*u+V.row(F(id,2))*v;
|
||||
float u,v;
|
||||
// parametric distance so that
|
||||
// pos = origin + t * dir
|
||||
float t;
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2018 Zhongshi Jiang <jiangzs@nyu.edu>
|
||||
//
|
||||
// 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_MAPPINGENERGYTYPE_H
|
||||
#define IGL_MAPPINGENERGYTYPE_H
|
||||
namespace igl
|
||||
{
|
||||
// Energy Types used for Parameterization/Mapping.
|
||||
// Refer to SLIM [Rabinovich et al. 2017] for more details
|
||||
// Todo: Integrate with ARAPEnergyType
|
||||
|
||||
enum MappingEnergyType
|
||||
{
|
||||
ARAP = 0,
|
||||
LOG_ARAP = 1,
|
||||
SYMMETRIC_DIRICHLET = 2,
|
||||
CONFORMAL = 3,
|
||||
EXP_CONFORMAL = 4,
|
||||
EXP_SYMMETRIC_DIRICHLET = 5,
|
||||
NUM_SLIM_ENERGY_TYPES = 6
|
||||
};
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,497 @@
|
||||
// based on MSH reader from PyMesh
|
||||
|
||||
// Copyright (c) 2015 Qingnan Zhou <qzhou@adobe.com>
|
||||
// Copyright (C) 2020 Vladimir Fonov <vladimir.fonov@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/.
|
||||
|
||||
#include "MshLoader.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
namespace igl {
|
||||
// helper function
|
||||
void inline _msh_eat_white_space(std::ifstream& fin) {
|
||||
char next = fin.peek();
|
||||
while (next == '\n' || next == ' ' || next == '\t' || next == '\r') {
|
||||
fin.get();
|
||||
next = fin.peek();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IGL_INLINE igl::MshLoader::MshLoader(const std::string &filename) {
|
||||
std::ifstream fin(filename, std::ios::in | std::ios::binary);
|
||||
|
||||
if (!fin.is_open()) {
|
||||
std::stringstream err_msg;
|
||||
err_msg << "failed to open file \"" << filename << "\"";
|
||||
throw std::ios_base::failure(err_msg.str());
|
||||
}
|
||||
// Parse header
|
||||
std::string buf;
|
||||
double version;
|
||||
int type;
|
||||
fin >> buf;
|
||||
if (buf != "$MeshFormat") { throw std::runtime_error("Unexpected .msh format"); }
|
||||
|
||||
fin >> version >> type >> m_data_size;
|
||||
m_binary = (type == 1);
|
||||
if(version>2.2 || version<2.0)
|
||||
{
|
||||
// probably unsupported version
|
||||
std::stringstream err_msg;
|
||||
err_msg << "Error: Unsupported file version:" << version << std::endl;
|
||||
throw std::runtime_error(err_msg.str());
|
||||
|
||||
}
|
||||
// Some sanity check.
|
||||
if (m_data_size != 8) {
|
||||
std::stringstream err_msg;
|
||||
err_msg << "Error: data size must be 8 bytes." << std::endl;
|
||||
throw std::runtime_error(err_msg.str());
|
||||
}
|
||||
if (sizeof(int) != 4) {
|
||||
std::stringstream err_msg;
|
||||
err_msg << "Error: code must be compiled with int size 4 bytes." << std::endl;
|
||||
throw std::runtime_error(err_msg.str());
|
||||
}
|
||||
|
||||
// Read in extra info from binary header.
|
||||
if (m_binary) {
|
||||
int one;
|
||||
igl::_msh_eat_white_space(fin);
|
||||
fin.read(reinterpret_cast<char*>(&one), sizeof(int));
|
||||
if (one != 1) {
|
||||
std::stringstream err_msg;
|
||||
err_msg << "Binary msh file " << filename
|
||||
<< " is saved with different endianness than this machine."
|
||||
<< std::endl;
|
||||
throw std::runtime_error(err_msg.str());
|
||||
}
|
||||
}
|
||||
|
||||
fin >> buf;
|
||||
if (buf != "$EndMeshFormat")
|
||||
{
|
||||
std::stringstream err_msg;
|
||||
err_msg << "Unexpected contents in the file header." << std::endl;
|
||||
throw std::runtime_error(err_msg.str());
|
||||
}
|
||||
|
||||
while (!fin.eof()) {
|
||||
buf.clear();
|
||||
fin >> buf;
|
||||
if (buf == "$Nodes") {
|
||||
parse_nodes(fin);
|
||||
fin >> buf;
|
||||
if (buf != "$EndNodes") { throw std::runtime_error("Unexpected tag"); }
|
||||
} else if (buf == "$Elements") {
|
||||
parse_elements(fin);
|
||||
fin >> buf;
|
||||
if (buf != "$EndElements") { throw std::runtime_error("Unexpected tag"); }
|
||||
} else if (buf == "$NodeData") {
|
||||
parse_node_field(fin);
|
||||
fin >> buf;
|
||||
if (buf != "$EndNodeData") { throw std::runtime_error("Unexpected tag"); }
|
||||
} else if (buf == "$ElementData") {
|
||||
parse_element_field(fin);
|
||||
fin >> buf;
|
||||
if (buf != "$EndElementData") { throw std::runtime_error("Unexpected tag"); }
|
||||
} else if (fin.eof()) {
|
||||
break;
|
||||
} else {
|
||||
parse_unknown_field(fin, buf);
|
||||
}
|
||||
}
|
||||
fin.close();
|
||||
}
|
||||
|
||||
IGL_INLINE void igl::MshLoader::parse_nodes(std::ifstream& fin) {
|
||||
size_t num_nodes;
|
||||
fin >> num_nodes;
|
||||
m_nodes.resize(num_nodes*3);
|
||||
|
||||
if (m_binary) {
|
||||
size_t stride = (4+3*m_data_size);
|
||||
size_t num_bytes = stride * num_nodes;
|
||||
char* data = new char[num_bytes];
|
||||
igl::_msh_eat_white_space(fin);
|
||||
fin.read(data, num_bytes);
|
||||
|
||||
for (size_t i=0; i<num_nodes; i++) {
|
||||
int node_idx;
|
||||
memcpy(&node_idx, data+i*stride, sizeof(int));
|
||||
node_idx-=1;
|
||||
// directly move into vector storage
|
||||
// this works only when m_data_size==sizeof(Float)==sizeof(double)
|
||||
memcpy(&m_nodes[node_idx*3], data+i*stride + 4, m_data_size*3);
|
||||
}
|
||||
delete [] data;
|
||||
} else {
|
||||
int node_idx;
|
||||
for (size_t i=0; i<num_nodes; i++) {
|
||||
fin >> node_idx;
|
||||
node_idx -= 1;
|
||||
// here it's 3D node explicitly
|
||||
fin >> m_nodes[node_idx*3]
|
||||
>> m_nodes[node_idx*3+1]
|
||||
>> m_nodes[node_idx*3+2];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IGL_INLINE void igl::MshLoader::parse_elements(std::ifstream& fin) {
|
||||
m_elements_tags.resize(2); //hardcoded to have 2 tags
|
||||
size_t num_elements;
|
||||
fin >> num_elements;
|
||||
|
||||
size_t nodes_per_element;
|
||||
|
||||
if (m_binary) {
|
||||
igl::_msh_eat_white_space(fin);
|
||||
int elem_read = 0;
|
||||
while (elem_read < num_elements) {
|
||||
// Parse element header.
|
||||
int elem_type, num_elems, num_tags;
|
||||
fin.read((char*)&elem_type, sizeof(int));
|
||||
fin.read((char*)&num_elems, sizeof(int));
|
||||
fin.read((char*)&num_tags, sizeof(int));
|
||||
nodes_per_element = num_nodes_per_elem_type(elem_type);
|
||||
|
||||
// store node info
|
||||
for (size_t i=0; i<num_elems; i++) {
|
||||
int elem_idx;
|
||||
|
||||
// all elements in the segment share the same elem_type and number of nodes per element
|
||||
m_elements_types.push_back(elem_type);
|
||||
m_elements_lengths.push_back(nodes_per_element);
|
||||
|
||||
fin.read((char*)&elem_idx, sizeof(int));
|
||||
elem_idx -= 1;
|
||||
m_elements_ids.push_back(elem_idx);
|
||||
|
||||
// read first two tags
|
||||
for (size_t j=0; j<num_tags; j++) {
|
||||
int tag;
|
||||
fin.read((char*)&tag, sizeof(int));
|
||||
if(j<2) m_elements_tags[j].push_back(tag);
|
||||
}
|
||||
|
||||
for (size_t j=num_tags; j<2; j++)
|
||||
m_elements_tags[j].push_back(-1); // fill up tags if less then 2
|
||||
|
||||
m_elements_nodes_idx.push_back(m_elements.size());
|
||||
// Element values.
|
||||
for (size_t j=0; j<nodes_per_element; j++) {
|
||||
int idx;
|
||||
fin.read((char*)&idx, sizeof(int));
|
||||
|
||||
m_elements.push_back(idx-1);
|
||||
}
|
||||
}
|
||||
elem_read += num_elems;
|
||||
}
|
||||
} else {
|
||||
for (size_t i=0; i<num_elements; i++) {
|
||||
// Parse per element header
|
||||
int elem_num, elem_type, num_tags;
|
||||
fin >> elem_num >> elem_type >> num_tags;
|
||||
|
||||
// read tags.
|
||||
for (size_t j=0; j<num_tags; j++) {
|
||||
int tag;
|
||||
fin >> tag;
|
||||
if(j<2) m_elements_tags[j].push_back(tag);
|
||||
}
|
||||
for (size_t j=num_tags; j<2; j++)
|
||||
m_elements_tags[j].push_back(-1); // fill up tags if less then 2
|
||||
|
||||
nodes_per_element = num_nodes_per_elem_type(elem_type);
|
||||
m_elements_types.push_back(elem_type);
|
||||
m_elements_lengths.push_back(nodes_per_element);
|
||||
|
||||
elem_num -= 1;
|
||||
m_elements_ids.push_back(elem_num);
|
||||
m_elements_nodes_idx.push_back(m_elements.size());
|
||||
// Parse node idx.
|
||||
for (size_t j=0; j<nodes_per_element; j++) {
|
||||
int idx;
|
||||
fin >> idx;
|
||||
m_elements.push_back(idx-1); // msh index starts from 1.
|
||||
}
|
||||
}
|
||||
}
|
||||
// debug
|
||||
assert(m_elements_types.size() == m_elements_ids.size());
|
||||
assert(m_elements_tags[0].size() == m_elements_ids.size());
|
||||
assert(m_elements_tags[1].size() == m_elements_ids.size());
|
||||
assert(m_elements_lengths.size() == m_elements_ids.size());
|
||||
}
|
||||
|
||||
IGL_INLINE void igl::MshLoader::parse_node_field( std::ifstream& fin ) {
|
||||
size_t num_string_tags;
|
||||
size_t num_real_tags;
|
||||
size_t num_int_tags;
|
||||
|
||||
fin >> num_string_tags;
|
||||
std::vector<std::string> str_tags(num_string_tags);
|
||||
|
||||
for (size_t i=0; i<num_string_tags; i++) {
|
||||
igl::_msh_eat_white_space(fin);
|
||||
if (fin.peek() == '\"') {
|
||||
// Handle field name between quotes.
|
||||
char buf[128];
|
||||
fin.get(); // remove the quote at the beginning.
|
||||
fin.getline(buf, 128, '\"');
|
||||
str_tags[i] = std::string(buf);
|
||||
} else {
|
||||
fin >> str_tags[i];
|
||||
}
|
||||
}
|
||||
|
||||
fin >> num_real_tags;
|
||||
std::vector<Float> real_tags(num_real_tags);
|
||||
for (size_t i=0; i<num_real_tags; i++)
|
||||
fin >> real_tags[i];
|
||||
|
||||
fin >> num_int_tags;
|
||||
std::vector<int> int_tags(num_int_tags);
|
||||
for (size_t i=0; i<num_int_tags; i++)
|
||||
fin >> int_tags[i];
|
||||
|
||||
if (num_string_tags <= 0 || num_int_tags <= 2) {
|
||||
throw std::runtime_error("Unexpected number of field tags");
|
||||
}
|
||||
std::string fieldname = str_tags[0];
|
||||
int num_components = int_tags[1];
|
||||
int num_entries = int_tags[2];
|
||||
|
||||
std::vector<Float> field( num_entries*num_components );
|
||||
|
||||
if (m_binary) {
|
||||
size_t num_bytes = (num_components * m_data_size + 4) * num_entries;
|
||||
char* data = new char[num_bytes];
|
||||
igl::_msh_eat_white_space(fin);
|
||||
fin.read(data, num_bytes);
|
||||
for (size_t i=0; i<num_entries; i++) {
|
||||
int node_idx;
|
||||
memcpy(&node_idx,&data[i*(4+num_components*m_data_size)],4);
|
||||
|
||||
if(node_idx<1) throw std::runtime_error("Negative or zero index");
|
||||
node_idx -= 1;
|
||||
|
||||
if(node_idx>=num_entries) throw std::runtime_error("Index too big");
|
||||
size_t base_idx = i*(4+num_components*m_data_size) + 4;
|
||||
// TODO: make this work when m_data_size != sizeof(double) ?
|
||||
memcpy(&field[node_idx*num_components], &data[base_idx], num_components*m_data_size);
|
||||
}
|
||||
delete [] data;
|
||||
} else {
|
||||
int node_idx;
|
||||
for (size_t i=0; i<num_entries; i++) {
|
||||
fin >> node_idx;
|
||||
node_idx -= 1;
|
||||
for (size_t j=0; j<num_components; j++) {
|
||||
fin >> field[node_idx*num_components+j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_node_fields_names.push_back(fieldname);
|
||||
m_node_fields.push_back(field);
|
||||
m_node_fields_components.push_back(num_components);
|
||||
}
|
||||
|
||||
IGL_INLINE void igl::MshLoader::parse_element_field(std::ifstream& fin) {
|
||||
size_t num_string_tags;
|
||||
size_t num_real_tags;
|
||||
size_t num_int_tags;
|
||||
|
||||
fin >> num_string_tags;
|
||||
std::vector<std::string> str_tags(num_string_tags);
|
||||
for (size_t i=0; i<num_string_tags; i++) {
|
||||
igl::_msh_eat_white_space(fin);
|
||||
if (fin.peek() == '\"') {
|
||||
// Handle field name between quoates.
|
||||
char buf[128];
|
||||
fin.get(); // remove the quote at the beginning.
|
||||
fin.getline(buf, 128, '\"');
|
||||
str_tags[i] = buf;
|
||||
} else {
|
||||
fin >> str_tags[i];
|
||||
}
|
||||
}
|
||||
|
||||
fin >> num_real_tags;
|
||||
std::vector<Float> real_tags(num_real_tags);
|
||||
for (size_t i=0; i<num_real_tags; i++)
|
||||
fin >> real_tags[i];
|
||||
|
||||
fin >> num_int_tags;
|
||||
std::vector<int> int_tags(num_int_tags);
|
||||
for (size_t i=0; i<num_int_tags; i++)
|
||||
fin >> int_tags[i];
|
||||
|
||||
if (num_string_tags <= 0 || num_int_tags <= 2) {
|
||||
throw std::runtime_error("Invalid file format");
|
||||
}
|
||||
std::string fieldname = str_tags[0];
|
||||
int num_components = int_tags[1];
|
||||
int num_entries = int_tags[2];
|
||||
std::vector<Float> field(num_entries*num_components);
|
||||
|
||||
if (m_binary) {
|
||||
size_t num_bytes = (num_components * m_data_size + 4) * num_entries;
|
||||
char* data = new char[num_bytes];
|
||||
igl::_msh_eat_white_space(fin);
|
||||
fin.read(data, num_bytes);
|
||||
for (int i=0; i<num_entries; i++) {
|
||||
int elem_idx;
|
||||
// works with sizeof(int)==4
|
||||
memcpy(&elem_idx, &data[i*(4+num_components*m_data_size)],4);
|
||||
elem_idx -= 1;
|
||||
|
||||
// directly copy data into vector storage space
|
||||
memcpy(&field[elem_idx*num_components], &data[i*(4+num_components*m_data_size) + 4], m_data_size*num_components);
|
||||
}
|
||||
delete [] data;
|
||||
} else {
|
||||
int elem_idx;
|
||||
for (size_t i=0; i<num_entries; i++) {
|
||||
fin >> elem_idx;
|
||||
elem_idx -= 1;
|
||||
for (size_t j=0; j<num_components; j++) {
|
||||
fin >> field[elem_idx*num_components+j];
|
||||
}
|
||||
}
|
||||
}
|
||||
m_element_fields_names.push_back(fieldname);
|
||||
m_element_fields.push_back(field);
|
||||
m_element_fields_components.push_back(num_components);
|
||||
}
|
||||
|
||||
IGL_INLINE void igl::MshLoader::parse_unknown_field(std::ifstream& fin,
|
||||
const std::string& fieldname) {
|
||||
std::cerr << "Warning: \"" << fieldname << "\" not supported yet. Ignored." << std::endl;
|
||||
std::string endmark = fieldname.substr(0,1) + "End"
|
||||
+ fieldname.substr(1,fieldname.size()-1);
|
||||
|
||||
std::string buf("");
|
||||
while (buf != endmark && !fin.eof()) {
|
||||
fin >> buf;
|
||||
}
|
||||
}
|
||||
|
||||
IGL_INLINE int igl::MshLoader::num_nodes_per_elem_type(int elem_type) {
|
||||
int nodes_per_element = 0;
|
||||
switch (elem_type) {
|
||||
case ELEMENT_LINE: // 2-node line
|
||||
nodes_per_element = 2;
|
||||
break;
|
||||
case ELEMENT_TRI:
|
||||
nodes_per_element = 3; // 3-node triangle
|
||||
break;
|
||||
case ELEMENT_QUAD:
|
||||
nodes_per_element = 4; // 5-node quad
|
||||
break;
|
||||
case ELEMENT_TET:
|
||||
nodes_per_element = 4; // 4-node tetrahedra
|
||||
break;
|
||||
case ELEMENT_HEX: // 8-node hexahedron
|
||||
nodes_per_element = 8;
|
||||
break;
|
||||
case ELEMENT_PRISM: // 6-node prism
|
||||
nodes_per_element = 6;
|
||||
break;
|
||||
case ELEMENT_LINE_2ND_ORDER:
|
||||
nodes_per_element = 3;
|
||||
break;
|
||||
case ELEMENT_TRI_2ND_ORDER:
|
||||
nodes_per_element = 6;
|
||||
break;
|
||||
case ELEMENT_QUAD_2ND_ORDER:
|
||||
nodes_per_element = 9;
|
||||
break;
|
||||
case ELEMENT_TET_2ND_ORDER:
|
||||
nodes_per_element = 10;
|
||||
break;
|
||||
case ELEMENT_HEX_2ND_ORDER:
|
||||
nodes_per_element = 27;
|
||||
break;
|
||||
case ELEMENT_PRISM_2ND_ORDER:
|
||||
nodes_per_element = 18;
|
||||
break;
|
||||
case ELEMENT_PYRAMID_2ND_ORDER:
|
||||
nodes_per_element = 14;
|
||||
break;
|
||||
case ELEMENT_POINT: // 1-node point
|
||||
nodes_per_element = 1;
|
||||
break;
|
||||
default:
|
||||
std::stringstream err_msg;
|
||||
err_msg << "Element type (" << elem_type << ") is not supported yet."
|
||||
<< std::endl;
|
||||
throw std::runtime_error(err_msg.str());
|
||||
}
|
||||
return nodes_per_element;
|
||||
}
|
||||
|
||||
|
||||
IGL_INLINE bool igl::MshLoader::is_element_map_identity() const
|
||||
{
|
||||
for(int i=0;i<m_elements_ids.size();i++) {
|
||||
int id=m_elements_ids[i];
|
||||
if (id!=i) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
IGL_INLINE void igl::MshLoader::index_structures(int tag_column)
|
||||
{
|
||||
//cleanup
|
||||
m_structure_index.clear();
|
||||
m_structures.clear();
|
||||
m_structure_length.clear();
|
||||
|
||||
//index structure tags
|
||||
for(auto i=0; i != m_elements_tags[tag_column].size(); ++i )
|
||||
{
|
||||
m_structure_index.insert(
|
||||
std::pair<msh_struct,int>(
|
||||
msh_struct( m_elements_tags[tag_column][i],
|
||||
m_elements_types[i]), i)
|
||||
);
|
||||
}
|
||||
|
||||
// identify unique structures
|
||||
std::vector<StructIndex::value_type> _unique_structs;
|
||||
std::unique_copy(std::begin(m_structure_index),
|
||||
std::end(m_structure_index),
|
||||
std::back_inserter(_unique_structs),
|
||||
[](const StructIndex::value_type &c1, const StructIndex::value_type &c2)
|
||||
{ return c1.first == c2.first; });
|
||||
|
||||
std::for_each( _unique_structs.begin(), _unique_structs.end(),
|
||||
[this](const StructIndex::value_type &n){ this->m_structures.push_back(n.first); });
|
||||
|
||||
for(auto t = m_structures.begin(); t != m_structures.end(); ++t)
|
||||
{
|
||||
// identify all elements corresponding to this tag
|
||||
auto structure_range = m_structure_index.equal_range( *t );
|
||||
int cnt=0;
|
||||
|
||||
for(auto i=structure_range.first; i!=structure_range.second; i++)
|
||||
cnt++;
|
||||
|
||||
m_structure_length.insert( std::pair<msh_struct,int>( *t, cnt));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,190 @@
|
||||
// based on MSH reader from PyMesh
|
||||
|
||||
// Copyright (c) 2015 Qingnan Zhou <qzhou@adobe.com>
|
||||
// Copyright (C) 2020 Vladimir Fonov <vladimir.fonov@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_MSH_LOADER_H
|
||||
#define IGL_MSH_LOADER_H
|
||||
#include "igl_inline.h"
|
||||
|
||||
#include <fstream>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
namespace igl {
|
||||
|
||||
// Class for loading information from .msh file
|
||||
// depends only on c++stl library
|
||||
class MshLoader {
|
||||
public:
|
||||
|
||||
struct msh_struct {
|
||||
int tag,el_type;
|
||||
msh_struct(int _tag=0,int _type=0):
|
||||
tag(_tag),el_type(_type){}
|
||||
bool operator== (const msh_struct& a) const {
|
||||
return this->tag==a.tag &&
|
||||
this->el_type==a.el_type;
|
||||
}
|
||||
|
||||
bool operator< (const msh_struct& a) const {
|
||||
return (this->tag*100+this->el_type) <
|
||||
(a.tag*100+a.el_type);
|
||||
}
|
||||
};
|
||||
|
||||
typedef double Float;
|
||||
|
||||
typedef std::vector<int> IndexVector;
|
||||
typedef std::vector<int> IntVector;
|
||||
typedef std::vector<Float> FloatVector;
|
||||
typedef std::vector<FloatVector> FloatField;
|
||||
typedef std::vector<IntVector> IntField;
|
||||
typedef std::vector<std::string> FieldNames;
|
||||
typedef std::multimap<msh_struct,int> StructIndex;
|
||||
typedef std::vector<msh_struct> StructVector;
|
||||
|
||||
enum {ELEMENT_LINE=1, ELEMENT_TRI=2, ELEMENT_QUAD=3,
|
||||
ELEMENT_TET=4, ELEMENT_HEX=5, ELEMENT_PRISM=6,
|
||||
ELEMENT_PYRAMID=7,
|
||||
// 2nd order elements
|
||||
ELEMENT_LINE_2ND_ORDER=8, ELEMENT_TRI_2ND_ORDER=9,
|
||||
ELEMENT_QUAD_2ND_ORDER=10,ELEMENT_TET_2ND_ORDER=11,
|
||||
ELEMENT_HEX_2ND_ORDER=12, ELEMENT_PRISM_2ND_ORDER=13,
|
||||
ELEMENT_PYRAMID_2ND_ORDER=14,
|
||||
// other elements
|
||||
ELEMENT_POINT=15 };
|
||||
public:
|
||||
MshLoader(const std::string &filename);
|
||||
|
||||
public:
|
||||
|
||||
// get nodes , x,y,z sequentially
|
||||
const FloatVector& get_nodes() const { return m_nodes; }
|
||||
// get elements , identifying nodes that create an element
|
||||
// variable length per element
|
||||
const IndexVector& get_elements() const { return m_elements; }
|
||||
|
||||
// get element types
|
||||
const IntVector& get_elements_types() const { return m_elements_types; }
|
||||
// get element lengths
|
||||
const IntVector& get_elements_lengths() const { return m_elements_lengths; }
|
||||
// get element tags ( physical (0) and elementary (1) )
|
||||
const IntField& get_elements_tags() const { return m_elements_tags; }
|
||||
// get element IDs
|
||||
const IntVector& get_elements_ids() const { return m_elements_ids; }
|
||||
|
||||
// get reverse index from node to element
|
||||
const IndexVector& get_elements_nodes_idx() const { return m_elements_nodes_idx; }
|
||||
|
||||
// get fields assigned per node, all fields and components sequentially
|
||||
const FloatField& get_node_fields() const { return m_node_fields;}
|
||||
// get node field names,
|
||||
const FieldNames& get_node_fields_names() const { return m_node_fields_names;}
|
||||
// get number of node field components
|
||||
const IntVector& get_node_fields_components() const {return m_node_fields_components;}
|
||||
|
||||
int get_node_field_components(size_t c) const
|
||||
{
|
||||
return m_node_fields_components[c];
|
||||
}
|
||||
|
||||
// get fields assigned per element, all fields and components sequentially
|
||||
const FloatField& get_element_fields() const { return m_element_fields;}
|
||||
// get element field names
|
||||
const FieldNames& get_element_fields_names() const { return m_element_fields_names;}
|
||||
// get number of element field components
|
||||
const IntVector& get_element_fields_components() const {return m_element_fields_components;}
|
||||
|
||||
int get_element_field_components(size_t c) const {
|
||||
return m_element_fields_components[c];
|
||||
}
|
||||
// check if field is present at node level
|
||||
bool is_node_field(const std::string& fieldname) const {
|
||||
return (std::find(std::begin(m_node_fields_names),
|
||||
std::end(m_node_fields_names),
|
||||
fieldname) != std::end(m_node_fields_names) );
|
||||
}
|
||||
// check if field is present at element level
|
||||
bool is_element_field(const std::string& fieldname) const {
|
||||
return (std::find(std::begin(m_element_fields_names),
|
||||
std::end(m_element_fields_names),
|
||||
fieldname) != std::end(m_node_fields_names) );
|
||||
}
|
||||
|
||||
// check if all elements have ids assigned sequentially
|
||||
bool is_element_map_identity() const ;
|
||||
|
||||
// create tag index
|
||||
// tag_column: ( physical (0) or elementary (1) ) specifying which tag to use
|
||||
void index_structures(int tag_column);
|
||||
|
||||
// get tag index, call index_structure_tags first
|
||||
const StructIndex& get_structure_index() const
|
||||
{
|
||||
return m_structure_index;
|
||||
}
|
||||
|
||||
// get size of a structure identified by tag and element type
|
||||
const StructIndex& get_structure_length() const
|
||||
{
|
||||
return m_structure_length;
|
||||
}
|
||||
|
||||
//! get list of structures
|
||||
const StructVector& get_structures() const
|
||||
{
|
||||
return m_structures;
|
||||
}
|
||||
|
||||
public:
|
||||
// helper function, calculate number of nodes associated with an element
|
||||
static int num_nodes_per_elem_type(int elem_type);
|
||||
|
||||
private:
|
||||
void parse_nodes(std::ifstream& fin);
|
||||
void parse_elements(std::ifstream& fin);
|
||||
void parse_node_field(std::ifstream& fin);
|
||||
void parse_element_field(std::ifstream& fin);
|
||||
void parse_unknown_field(std::ifstream& fin,
|
||||
const std::string& fieldname);
|
||||
|
||||
private:
|
||||
bool m_binary;
|
||||
size_t m_data_size;
|
||||
|
||||
FloatVector m_nodes; // len x 3 vector
|
||||
|
||||
IndexVector m_elements; // linear array for nodes corresponding to each element
|
||||
IndexVector m_elements_nodes_idx; // element indexes
|
||||
|
||||
IntVector m_elements_ids; // element id's
|
||||
IntVector m_elements_types; // Element types
|
||||
IntVector m_elements_lengths; // Element lengths
|
||||
IntField m_elements_tags; // Element tags, currently 2xtags per element
|
||||
|
||||
FloatField m_node_fields; // Float field defined at each node
|
||||
IntVector m_node_fields_components; // Number of components for node field
|
||||
FieldNames m_node_fields_names; // Node field name
|
||||
|
||||
FloatField m_element_fields; // Float field defined at each element
|
||||
IntVector m_element_fields_components; // Number of components for element field
|
||||
FieldNames m_element_fields_names; // Element field name
|
||||
|
||||
StructIndex m_structure_index; // index tag ids
|
||||
StructVector m_structures; // unique structures
|
||||
StructIndex m_structure_length; // length of structures with consistent element type
|
||||
};
|
||||
|
||||
} //igl
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
# include "MshLoader.cpp"
|
||||
#endif
|
||||
|
||||
#endif //IGL_MSH_LOADER_H
|
||||
@@ -0,0 +1,347 @@
|
||||
// based on MSH writer from PyMesh
|
||||
|
||||
// Copyright (c) 2015 Qingnan Zhou <qzhou@adobe.com>
|
||||
// Copyright (C) 2020 Vladimir Fonov <vladimir.fonov@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/.
|
||||
|
||||
#include "MshSaver.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <exception>
|
||||
|
||||
|
||||
IGL_INLINE igl::MshSaver::MshSaver(const std::string& filename, bool binary) :
|
||||
m_binary(binary), m_num_nodes(0), m_num_elements(0) {
|
||||
if (!m_binary) {
|
||||
fout.open(filename.c_str(), std::fstream::out);
|
||||
} else {
|
||||
fout.open(filename.c_str(), std::fstream::binary);
|
||||
}
|
||||
if (!fout) {
|
||||
std::stringstream err_msg;
|
||||
err_msg << "Error opening " << filename << " to write msh file." << std::endl;
|
||||
throw std::ios_base::failure(err_msg.str());
|
||||
}
|
||||
}
|
||||
|
||||
IGL_INLINE igl::MshSaver::~MshSaver() {
|
||||
fout.close();
|
||||
}
|
||||
|
||||
IGL_INLINE void igl::MshSaver::save_mesh(
|
||||
const FloatVector& nodes,
|
||||
const IndexVector& elements,
|
||||
const IntVector& element_lengths,
|
||||
const IntVector& element_types,
|
||||
const IntVector& element_tags
|
||||
) {
|
||||
|
||||
save_header();
|
||||
|
||||
save_nodes(nodes);
|
||||
|
||||
save_elements(elements, element_lengths, element_types, element_tags );
|
||||
}
|
||||
|
||||
IGL_INLINE void igl::MshSaver::save_header() {
|
||||
if (!m_binary) {
|
||||
fout << "$MeshFormat" << std::endl;
|
||||
fout << "2.2 0 " << sizeof(double) << std::endl;
|
||||
fout << "$EndMeshFormat" << std::endl;
|
||||
fout.precision(17);
|
||||
} else {
|
||||
fout << "$MeshFormat" << std::endl;
|
||||
fout << "2.2 1 " << sizeof(double) << std::endl;
|
||||
int one = 1;
|
||||
fout.write((char*)&one, sizeof(int));
|
||||
fout << "\n$EndMeshFormat" << std::endl;
|
||||
}
|
||||
fout.flush();
|
||||
}
|
||||
|
||||
IGL_INLINE void igl::MshSaver::save_nodes(const FloatVector& nodes) {
|
||||
// Save nodes.
|
||||
// 3D hadrcoded
|
||||
m_num_nodes = nodes.size() / 3;
|
||||
fout << "$Nodes" << std::endl;
|
||||
fout << m_num_nodes << std::endl;
|
||||
if (!m_binary) {
|
||||
for (size_t i=0; i<nodes.size(); i+=3) {
|
||||
//const VectorF& v = nodes.segment(i,m_dim);
|
||||
int node_idx = i/3 + 1;
|
||||
fout << node_idx << " " << nodes[i] << " " << nodes[i+1] << " " << nodes[i+2] << std::endl;
|
||||
}
|
||||
} else {
|
||||
for (size_t i=0; i<nodes.size(); i+=3) {
|
||||
//const VectorF& v = nodes.segment(i,m_dim);
|
||||
int node_idx = i/3 + 1;
|
||||
fout.write((const char*)&node_idx, sizeof(int));
|
||||
fout.write((const char*)&nodes[i], sizeof(Float)*3);
|
||||
}
|
||||
}
|
||||
fout << "$EndNodes" << std::endl;
|
||||
fout.flush();
|
||||
}
|
||||
|
||||
IGL_INLINE void igl::MshSaver::save_elements(const IndexVector& elements,
|
||||
const IntVector& element_lengths,
|
||||
const IntVector& element_types,
|
||||
const IntVector& element_tags)
|
||||
{
|
||||
|
||||
m_num_elements = element_tags.size();
|
||||
assert(element_lengths.size() == element_types.size() );
|
||||
assert(element_lengths.size() == element_tags.size() );
|
||||
// TODO: sum up all lengths
|
||||
// Save elements.
|
||||
// node inxes are 1-based
|
||||
fout << "$Elements" << std::endl;
|
||||
fout << m_num_elements << std::endl;
|
||||
|
||||
if (m_num_elements > 0) {
|
||||
//int elem_type = el_type;
|
||||
int num_elems = m_num_elements;
|
||||
//int tags = 0;
|
||||
if (!m_binary) {
|
||||
size_t el_ptr=0;
|
||||
for (size_t i=0;i<m_num_elements;++i) {
|
||||
|
||||
int elem_num = (int) i + 1;
|
||||
///VectorI elem = elements.segment(i, nodes_per_element) + VectorI::Ones(nodes_per_element);
|
||||
// hardcoded: duplicate tags (I don't know why)
|
||||
fout << elem_num << " " << element_types[i] << " " << 2 << " "<< element_tags[i] << " "<< element_tags[i] << " ";
|
||||
for (size_t j=0; j<element_lengths[i]; j++) {
|
||||
fout << elements[el_ptr + j] + 1 << " ";
|
||||
}
|
||||
fout << std::endl;
|
||||
el_ptr+=element_lengths[i];
|
||||
}
|
||||
} else {
|
||||
size_t el_ptr=0,i=0;
|
||||
while(i<m_num_elements) {
|
||||
|
||||
// write elements in consistent chunks
|
||||
// TODO: refactor this code to be able to specify different elements
|
||||
// more effeciently
|
||||
|
||||
int elem_type=-1;
|
||||
int elem_len=-1;
|
||||
size_t j=i;
|
||||
for(;j<m_num_elements;++j)
|
||||
{
|
||||
if( elem_type==-1 )
|
||||
{
|
||||
elem_type=element_types[j];
|
||||
elem_len=element_lengths[j];
|
||||
} else if( elem_type!=element_types[j] ||
|
||||
elem_len!=element_lengths[j]) {
|
||||
break; // found the edge of the segment
|
||||
}
|
||||
}
|
||||
|
||||
//hardcoded: 2 tags
|
||||
int num_elems=j-i, num_tags=2;
|
||||
|
||||
fout.write((const char*)& elem_type, sizeof(int));
|
||||
fout.write((const char*)& num_elems, sizeof(int));
|
||||
fout.write((const char*)& num_tags, sizeof(int));
|
||||
|
||||
for(int k=0;k<num_elems; ++k,++i){
|
||||
int elem_num = (int )i + 1;
|
||||
fout.write((const char*)&elem_num, sizeof(int));
|
||||
|
||||
// HACK: hardcoded 2 tags
|
||||
fout.write((const char*)& element_tags[i], sizeof(int));
|
||||
fout.write((const char*)& element_tags[i], sizeof(int));
|
||||
|
||||
for (size_t e=0; e<elem_len; e++) {
|
||||
int _elem = static_cast<int>( elements[el_ptr + e] )+1;
|
||||
fout.write((const char*)&_elem, sizeof(int));
|
||||
}
|
||||
el_ptr+=elem_len;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
fout << "$EndElements" << std::endl;
|
||||
fout.flush();
|
||||
}
|
||||
|
||||
IGL_INLINE void igl::MshSaver::save_scalar_field(const std::string& fieldname, const FloatVector& field) {
|
||||
assert(field.size() == m_num_nodes);
|
||||
fout << "$NodeData" << std::endl;
|
||||
fout << "1" << std::endl; // num string tags.
|
||||
fout << "\"" << fieldname << "\"" << std::endl;
|
||||
fout << "1" << std::endl; // num real tags.
|
||||
fout << "0.0" << std::endl; // time value.
|
||||
fout << "3" << std::endl; // num int tags.
|
||||
fout << "0" << std::endl; // the time step
|
||||
fout << "1" << std::endl; // 1-component scalar field.
|
||||
fout << m_num_nodes << std::endl; // number of nodes
|
||||
|
||||
if (m_binary) {
|
||||
for (size_t i=0; i<m_num_nodes; i++) {
|
||||
int node_idx = i+1;
|
||||
fout.write((char*)&node_idx, sizeof(int));
|
||||
fout.write((char*)&field[i], sizeof(Float));
|
||||
}
|
||||
} else {
|
||||
for (size_t i=0; i<m_num_nodes; i++) {
|
||||
int node_idx = i+1;
|
||||
fout << node_idx << " " << field[i] << std::endl;
|
||||
}
|
||||
}
|
||||
fout << "$EndNodeData" << std::endl;
|
||||
fout.flush();
|
||||
}
|
||||
|
||||
IGL_INLINE void igl::MshSaver::save_vector_field(const std::string& fieldname, const FloatVector& field) {
|
||||
assert(field.size() == 3 * m_num_nodes);
|
||||
|
||||
fout << "$NodeData" << std::endl;
|
||||
fout << "1" << std::endl; // num string tags.
|
||||
fout << "\"" << fieldname << "\"" << std::endl;
|
||||
fout << "1" << std::endl; // num real tags.
|
||||
fout << "0.0" << std::endl; // time value.
|
||||
fout << "3" << std::endl; // num int tags.
|
||||
fout << "0" << std::endl; // the time step
|
||||
fout << "3" << std::endl; // 3-component vector field.
|
||||
fout << m_num_nodes << std::endl; // number of nodes
|
||||
|
||||
const Float zero = 0.0;
|
||||
if (m_binary) {
|
||||
for (size_t i=0; i<m_num_nodes; i++) {
|
||||
int node_idx = i+1;
|
||||
fout.write((const char*)&node_idx, sizeof(int));
|
||||
fout.write((const char*)&field[i*3], sizeof(Float)*3);
|
||||
}
|
||||
} else {
|
||||
for (size_t i=0; i<m_num_nodes; i++) {
|
||||
int node_idx = i+1;
|
||||
fout << node_idx
|
||||
<< " " << field[i*3]
|
||||
<< " " << field[i*3+1]
|
||||
<< " " << field[i*3+2]
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
fout << "$EndNodeData" << std::endl;
|
||||
fout.flush();
|
||||
}
|
||||
|
||||
IGL_INLINE void igl::MshSaver::save_elem_scalar_field(const std::string& fieldname, const FloatVector& field) {
|
||||
assert(field.size() == m_num_elements);
|
||||
fout << "$ElementData" << std::endl;
|
||||
fout << 1 << std::endl; // num string tags.
|
||||
fout << "\"" << fieldname << "\"" << std::endl;
|
||||
fout << "1" << std::endl; // num real tags.
|
||||
fout << "0.0" << std::endl; // time value.
|
||||
fout << "3" << std::endl; // num int tags.
|
||||
fout << "0" << std::endl; // the time step
|
||||
fout << "1" << std::endl; // 1-component scalar field.
|
||||
fout << m_num_elements << std::endl; // number of elements
|
||||
|
||||
if (m_binary) {
|
||||
for (size_t i=0; i<m_num_elements; i++) {
|
||||
int elem_idx = i+1;
|
||||
fout.write((const char*)&elem_idx, sizeof(int));
|
||||
fout.write((const char*)&field[i], sizeof(Float));
|
||||
}
|
||||
} else {
|
||||
for (size_t i=0; i<m_num_elements; i++) {
|
||||
int elem_idx = i+1;
|
||||
fout << elem_idx << " " << field[i] << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
fout << "$EndElementData" << std::endl;
|
||||
fout.flush();
|
||||
}
|
||||
|
||||
IGL_INLINE void igl::MshSaver::save_elem_vector_field(const std::string& fieldname, const FloatVector& field) {
|
||||
assert(field.size() == m_num_elements * 3);
|
||||
fout << "$ElementData" << std::endl;
|
||||
fout << 1 << std::endl; // num string tags.
|
||||
fout << "\"" << fieldname << "\"" << std::endl;
|
||||
fout << "1" << std::endl; // num real tags.
|
||||
fout << "0.0" << std::endl; // time value.
|
||||
fout << "3" << std::endl; // num int tags.
|
||||
fout << "0" << std::endl; // the time step
|
||||
fout << "3" << std::endl; // 3-component vector field.
|
||||
fout << m_num_elements << std::endl; // number of elements
|
||||
|
||||
const Float zero = 0.0;
|
||||
if (m_binary) {
|
||||
for (size_t i=0; i<m_num_elements; ++i) {
|
||||
int elem_idx = i+1;
|
||||
fout.write((const char*)&elem_idx, sizeof(int));
|
||||
fout.write((const char*)&field[i*3], sizeof(Float) * 3);
|
||||
}
|
||||
} else {
|
||||
for (size_t i=0; i<m_num_elements; ++i) {
|
||||
int elem_idx = i+1;
|
||||
fout << elem_idx
|
||||
<< " " << field[i*3]
|
||||
<< " " << field[i*3+1]
|
||||
<< " " << field[i*3+2]
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
fout << "$EndElementData" << std::endl;
|
||||
fout.flush();
|
||||
}
|
||||
|
||||
|
||||
IGL_INLINE void igl::MshSaver::save_elem_tensor_field(const std::string& fieldname, const FloatVector& field) {
|
||||
assert(field.size() == m_num_elements * 3 * (3 + 1) / 2);
|
||||
fout << "$ElementData" << std::endl;
|
||||
fout << 1 << std::endl; // num string tags.
|
||||
fout << "\"" << fieldname << "\"" << std::endl;
|
||||
fout << "1" << std::endl; // num real tags.
|
||||
fout << "0.0" << std::endl; // time value.
|
||||
fout << "3" << std::endl; // num int tags.
|
||||
fout << "0" << std::endl; // the time step
|
||||
fout << "9" << std::endl; // 9-component tensor field.
|
||||
fout << m_num_elements << std::endl; // number of elements
|
||||
|
||||
const Float zero = 0.0;
|
||||
|
||||
if (m_binary) {
|
||||
for (size_t i=0; i<m_num_elements; i++) {
|
||||
int elem_idx = i+1;
|
||||
fout.write((char*)&elem_idx, sizeof(int));
|
||||
//const VectorF& val = field.segment(i*6, 6);
|
||||
const Float* val = &field[i*6];
|
||||
Float tensor[9] = {
|
||||
val[0], val[5], val[4],
|
||||
val[5], val[1], val[3],
|
||||
val[4], val[3], val[2] };
|
||||
fout.write((char*)tensor, sizeof(Float) * 9);
|
||||
}
|
||||
} else {
|
||||
for (size_t i=0; i<m_num_elements; i++) {
|
||||
int elem_idx = i+1;
|
||||
const Float* val = &field[i*6];
|
||||
fout << elem_idx
|
||||
<< " " << val[0]
|
||||
<< " " << val[5]
|
||||
<< " " << val[4]
|
||||
<< " " << val[5]
|
||||
<< " " << val[1]
|
||||
<< " " << val[3]
|
||||
<< " " << val[4]
|
||||
<< " " << val[3]
|
||||
<< " " << val[2]
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
fout << "$EndElementData" << std::endl;
|
||||
fout.flush();
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
// based on MSH writer from PyMesh
|
||||
|
||||
// Copyright (c) 2015 Qingnan Zhou <qzhou@adobe.com>
|
||||
// Copyright (C) 2020 Vladimir Fonov <vladimir.fonov@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_MSH_SAVER_H
|
||||
#define IGL_MSH_SAVER_H
|
||||
#include "igl_inline.h"
|
||||
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace igl {
|
||||
|
||||
// Class for dumping information to .msh file
|
||||
// depends only on c++stl library
|
||||
// current implementation works only with 3D information
|
||||
class MshSaver {
|
||||
public:
|
||||
typedef double Float;
|
||||
|
||||
typedef std::vector<int> IndexVector;
|
||||
typedef std::vector<int> IntVector;
|
||||
typedef std::vector<Float> FloatVector;
|
||||
typedef std::vector<FloatVector> FloatField;
|
||||
typedef std::vector<IntVector> IntField;
|
||||
typedef std::vector<std::string> FieldNames;
|
||||
|
||||
MshSaver(const std::string& filename, bool binary=true);
|
||||
~MshSaver();
|
||||
|
||||
public:
|
||||
// Only these element types are supported right now
|
||||
enum {ELEMENT_LINE=1, ELEMENT_TRI=2, ELEMENT_QUAD=3,
|
||||
ELEMENT_TET=4, ELEMENT_HEX=5, ELEMENT_PRISM=6 };
|
||||
|
||||
public:
|
||||
// save mesh geometry
|
||||
void save_mesh(
|
||||
const FloatVector& nodes,
|
||||
const IndexVector& elements,
|
||||
const IntVector& element_lengths,
|
||||
const IntVector& element_type,
|
||||
const IntVector& element_tags );
|
||||
|
||||
// save additional fields associated with the mesh
|
||||
|
||||
// add node scalar field
|
||||
void save_scalar_field(const std::string& fieldname, const FloatVector& field);
|
||||
// add node vectot field
|
||||
void save_vector_field(const std::string& fieldname, const FloatVector& field);
|
||||
// add element scalar field
|
||||
void save_elem_scalar_field(const std::string& fieldname, const FloatVector& field);
|
||||
// add element vector field
|
||||
void save_elem_vector_field(const std::string& fieldname, const FloatVector& field);
|
||||
// add element tensor field
|
||||
void save_elem_tensor_field(const std::string& fieldname, const FloatVector& field);
|
||||
|
||||
protected:
|
||||
void save_header();
|
||||
void save_nodes(const FloatVector& nodes);
|
||||
void save_elements(const IndexVector& elements,
|
||||
const IntVector& element_lengths,
|
||||
const IntVector& element_type,
|
||||
const IntVector& element_tags);
|
||||
|
||||
private:
|
||||
bool m_binary;
|
||||
size_t m_num_nodes;
|
||||
size_t m_num_elements;
|
||||
|
||||
std::ofstream fout;
|
||||
};
|
||||
} //igl
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
# include "MshSaver.cpp"
|
||||
#endif
|
||||
|
||||
#endif //MSH_SAVER_H
|
||||
+2
-2
@@ -11,9 +11,9 @@ namespace igl
|
||||
{
|
||||
// Use standard mathematical constants' M_PI if available
|
||||
#ifdef M_PI
|
||||
const double PI = M_PI;
|
||||
constexpr double PI = M_PI;
|
||||
#else
|
||||
const double PI = 3.1415926535897932384626433832795;
|
||||
constexpr double PI = 3.1415926535897932384626433832795;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
||||
e8898a8aa8e920ab7c2cd0bfaac5acc2e4991daf
|
||||
@@ -1,5 +1,5 @@
|
||||
// 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
|
||||
@@ -26,34 +26,30 @@ namespace igl
|
||||
SortableRow(const T & data):data(data){};
|
||||
bool operator<(const SortableRow & that) const
|
||||
{
|
||||
// Get reference so that I can use parenthesis
|
||||
const SortableRow<T> & THIS = *this;
|
||||
// Lexicographical
|
||||
int minc = (THIS.data.size() < that.data.size()?
|
||||
THIS.data.size() : that.data.size());
|
||||
int minc = (this->data.size() < that.data.size()?
|
||||
this->data.size() : that.data.size());
|
||||
// loop over columns
|
||||
for(int i = 0;i<minc;i++)
|
||||
{
|
||||
if(THIS.data(i) == that.data(i))
|
||||
if(this->data(i) == that.data(i))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
return THIS.data(i) < that.data(i);
|
||||
return this->data(i) < that.data(i);
|
||||
}
|
||||
// All characters the same, comes done to length
|
||||
return THIS.data.size()<that.data.size();
|
||||
return this->data.size()<that.data.size();
|
||||
};
|
||||
bool operator==(const SortableRow & that) const
|
||||
{
|
||||
// Get reference so that I can use parenthesis
|
||||
const SortableRow<T> & THIS = *this;
|
||||
if(THIS.data.size() != that.data.size())
|
||||
if(this->data.size() != that.data.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
for(int i = 0;i<THIS.data.size();i++)
|
||||
for(int i = 0;i<this->data.size();i++)
|
||||
{
|
||||
if(THIS.data(i) != that.data(i))
|
||||
if(this->data(i) != that.data(i))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -374,4 +374,16 @@ inline typename DerivedV::Scalar
|
||||
return igl::winding_number(BV,PBF,p);
|
||||
}
|
||||
|
||||
// This is a bullshit template because AABB annoyingly needs templates for bad
|
||||
// combinations of 3D V with DIM=2 AABB
|
||||
//
|
||||
// _Define_ as a no-op rather than monkeying around with the proper code above
|
||||
namespace igl
|
||||
{
|
||||
template <> inline igl::WindingNumberAABB<Eigen::Matrix<double, 1, 3, 1, 1, 3>,Eigen::Matrix<double, -1, 2, 0, -1, 2>,Eigen::Matrix<int, -1, 2, 0, -1, 2>>::WindingNumberAABB(const Eigen::MatrixBase<Eigen::Matrix<double, -1, 2, 0, -1, 2>> & V, const Eigen::MatrixBase<Eigen::Matrix<int, -1, 2, 0, -1, 2>> & F){};
|
||||
template <> inline void igl::WindingNumberAABB<Eigen::Matrix<double, 1, 3, 1, 1, 3>,Eigen::Matrix<double, -1, 2, 0, -1, 2>,Eigen::Matrix<int, -1, 2, 0, -1, 2>>::grow(){};
|
||||
template <> inline void igl::WindingNumberAABB<Eigen::Matrix<double, 1, 3, 1, 1, 3>,Eigen::Matrix<double, -1, 2, 0, -1, 2>,Eigen::Matrix<int, -1, 2, 0, -1, 2>>::init(){};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -164,7 +164,6 @@ inline igl::WindingNumberTree<Point,DerivedV,DerivedF>::WindingNumberTree():
|
||||
V(dummyV),
|
||||
SV(),
|
||||
F(),
|
||||
//boundary(igl::boundary_facets<Eigen::MatrixXi,Eigen::MatrixXi>(F))
|
||||
cap(),
|
||||
radius(std::numeric_limits<typename DerivedV::Scalar>::infinity()),
|
||||
center(0,0,0)
|
||||
@@ -180,7 +179,6 @@ inline igl::WindingNumberTree<Point,DerivedV,DerivedF>::WindingNumberTree(
|
||||
V(dummyV),
|
||||
SV(),
|
||||
F(),
|
||||
//boundary(igl::boundary_facets<Eigen::MatrixXi,Eigen::MatrixXi>(F))
|
||||
cap(),
|
||||
radius(std::numeric_limits<typename DerivedV::Scalar>::infinity()),
|
||||
center(0,0,0)
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2018 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/.
|
||||
#include "accumarray.h"
|
||||
#include <cassert>
|
||||
|
||||
template <
|
||||
typename DerivedS,
|
||||
typename DerivedV,
|
||||
typename DerivedA
|
||||
>
|
||||
void igl::accumarray(
|
||||
const Eigen::MatrixBase<DerivedS> & S,
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
Eigen::PlainObjectBase<DerivedA> & A)
|
||||
{
|
||||
assert(V.size() == S.size() && "S and V should be same size");
|
||||
if(S.size() == 0) { A.resize(0,1); return; }
|
||||
A.setZero(S.maxCoeff()+1,1);
|
||||
for(int s = 0;s<S.size();s++)
|
||||
{
|
||||
A(S(s)) += V(s);
|
||||
}
|
||||
}
|
||||
|
||||
template <
|
||||
typename DerivedS,
|
||||
typename DerivedA
|
||||
>
|
||||
void igl::accumarray(
|
||||
const Eigen::MatrixBase<DerivedS> & S,
|
||||
const typename DerivedA::Scalar V,
|
||||
Eigen::PlainObjectBase<DerivedA> & A)
|
||||
{
|
||||
if(S.size() == 0) { A.resize(0,1); return; }
|
||||
A.setZero(S.maxCoeff()+1,1);
|
||||
for(int s = 0;s<S.size();s++)
|
||||
{
|
||||
A(S(s)) += V;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::accumarray<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::Matrix<int, -1, 1, 0, -1, 1>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::accumarray<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
|
||||
#endif
|
||||
@@ -0,0 +1,50 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2018 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 ACCUMARRY_H
|
||||
#define ACCUMARRY_H
|
||||
#include "igl_inline.h"
|
||||
#include <Eigen/Core>
|
||||
namespace igl
|
||||
{
|
||||
// ACCUMARRY Like Matlab's accumarray. Accumulate values in V using subscripts
|
||||
// in S.
|
||||
//
|
||||
// Inputs:
|
||||
// S #S list of subscripts
|
||||
// V #V list of values
|
||||
// Outputs:
|
||||
// A max(subs)+1 list of accumulated values
|
||||
template <
|
||||
typename DerivedS,
|
||||
typename DerivedV,
|
||||
typename DerivedA
|
||||
>
|
||||
void accumarray(
|
||||
const Eigen::MatrixBase<DerivedS> & S,
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
Eigen::PlainObjectBase<DerivedA> & A);
|
||||
// Inputs:
|
||||
// S #S list of subscripts
|
||||
// V single value used for all
|
||||
// Outputs:
|
||||
// A max(subs)+1 list of accumulated values
|
||||
template <
|
||||
typename DerivedS,
|
||||
typename DerivedA
|
||||
>
|
||||
void accumarray(
|
||||
const Eigen::MatrixBase<DerivedS> & S,
|
||||
const typename DerivedA::Scalar V,
|
||||
Eigen::PlainObjectBase<DerivedA> & A);
|
||||
}
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
# include "accumarray.cpp"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -223,7 +223,7 @@ IGL_INLINE igl::SolverStatus igl::active_set(
|
||||
}
|
||||
//cout<<matlab_format((known_i.array()+1).eval(),"known_i")<<endl;
|
||||
// PREPARE EQUALITY CONSTRAINTS
|
||||
VectorXi as_ieq_list(as_ieq_count,1);
|
||||
Eigen::Matrix<typename DerivedY::Scalar, Eigen::Dynamic, 1> as_ieq_list(as_ieq_count,1);
|
||||
// Gather active constraints and resp. rhss
|
||||
DerivedBeq Beq_i;
|
||||
Beq_i.resize(Beq.rows()+as_ieq_count,1);
|
||||
@@ -345,7 +345,7 @@ IGL_INLINE igl::SolverStatus igl::active_set(
|
||||
{
|
||||
if(Lambda_Aieq_i(a) < params.inactive_threshold)
|
||||
{
|
||||
as_ieq(as_ieq_list(a)) = FALSE;
|
||||
as_ieq(int(as_ieq_list(a))) = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace igl
|
||||
struct active_set_params;
|
||||
// Known Bugs: rows of [Aeq;Aieq] **must** be linearly independent. Should be
|
||||
// using QR decomposition otherwise:
|
||||
// http://www.okstate.edu/sas/v8/sashtml/ormp/chap5/sect32.htm
|
||||
// https://v8doc.sas.com/sashtml/ormp/chap5/sect32.htm
|
||||
//
|
||||
// ACTIVE_SET Minimize quadratic energy
|
||||
//
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
template <typename Index, typename IndexVector>
|
||||
IGL_INLINE void igl::adjacency_list(
|
||||
const Eigen::PlainObjectBase<Index> & F,
|
||||
const Eigen::MatrixBase<Index> & F,
|
||||
std::vector<std::vector<IndexVector> >& A,
|
||||
bool sorted)
|
||||
{
|
||||
@@ -132,8 +132,18 @@ IGL_INLINE void igl::adjacency_list(
|
||||
const std::vector<std::vector<Index> > & F,
|
||||
std::vector<std::vector<Index> >& A)
|
||||
{
|
||||
A.clear();
|
||||
A.resize(F.maxCoeff()+1);
|
||||
A.clear();
|
||||
|
||||
// Find maxCoeff
|
||||
Index maxCoeff = 0;
|
||||
for(const auto &vec : F)
|
||||
{
|
||||
for(int coeff : vec)
|
||||
{
|
||||
maxCoeff = std::max(coeff, maxCoeff);
|
||||
}
|
||||
}
|
||||
A.resize(maxCoeff + 1);
|
||||
|
||||
// Loop over faces
|
||||
for(int i = 0;i<F.size();i++)
|
||||
@@ -142,8 +152,8 @@ IGL_INLINE void igl::adjacency_list(
|
||||
for(int j = 0;j<F[i].size();j++)
|
||||
{
|
||||
// Get indices of edge: s --> d
|
||||
int s = F(i,j);
|
||||
int d = F(i,(j+1)%F[i].size());
|
||||
int s = F[i][j];
|
||||
int d = F[i][(j+1)%F[i].size()];
|
||||
A.at(s).push_back(d);
|
||||
A.at(d).push_back(s);
|
||||
}
|
||||
@@ -161,8 +171,10 @@ IGL_INLINE void igl::adjacency_list(
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::adjacency_list<Eigen::Matrix<int, -1, 2, 0, -1, 2>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, bool);
|
||||
template void igl::adjacency_list<Eigen::Matrix<int, -1, 2, 0, -1, 2>, int>(Eigen::MatrixBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, bool);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::adjacency_list<Eigen::Matrix<int, -1, -1, 0, -1, -1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, bool);
|
||||
template void igl::adjacency_list<Eigen::Matrix<int, -1, 3, 0, -1, 3>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, bool);
|
||||
template void igl::adjacency_list<Eigen::Matrix<int, -1, -1, 0, -1, -1>, int>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, bool);
|
||||
template void igl::adjacency_list<Eigen::Matrix<int, -1, 3, 0, -1, 3>, int>(Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, bool);
|
||||
template void igl::adjacency_list<class Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned int>(class Eigen::MatrixBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1> > const &, class std::vector<class std::vector<unsigned int, class std::allocator<unsigned int> >, class std::allocator<class std::vector<unsigned int, class std::allocator<unsigned int> > > > &, bool);
|
||||
template void igl::adjacency_list<int>(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);
|
||||
#endif
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace igl
|
||||
// See also: edges, cotmatrix, diag
|
||||
template <typename Index, typename IndexVector>
|
||||
IGL_INLINE void adjacency_list(
|
||||
const Eigen::PlainObjectBase<Index> & F,
|
||||
const Eigen::MatrixBase<Index> & F,
|
||||
std::vector<std::vector<IndexVector> >& A,
|
||||
bool sorted = false);
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// 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
|
||||
//
|
||||
// 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/.
|
||||
#include "adjacency_matrix.h"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
template <typename DerivedF, typename T>
|
||||
IGL_INLINE void igl::adjacency_matrix(
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
Eigen::SparseMatrix<T>& A)
|
||||
{
|
||||
using namespace std;
|
||||
@@ -65,10 +65,61 @@ IGL_INLINE void igl::adjacency_matrix(
|
||||
}
|
||||
}
|
||||
|
||||
template <typename DerivedI, typename DerivedC, typename T>
|
||||
IGL_INLINE void igl::adjacency_matrix(
|
||||
const Eigen::MatrixBase<DerivedI> & I,
|
||||
const Eigen::MatrixBase<DerivedC> & C,
|
||||
Eigen::SparseMatrix<T>& A)
|
||||
{
|
||||
using namespace std;
|
||||
using namespace Eigen;
|
||||
|
||||
typedef Triplet<T> IJV;
|
||||
vector<IJV > ijv;
|
||||
ijv.reserve(C(C.size()-1)*2);
|
||||
typedef typename DerivedI::Scalar Index;
|
||||
const Index n = I.maxCoeff()+1;
|
||||
{
|
||||
// loop over polygons
|
||||
for(Index p = 0;p<C.size()-1;p++)
|
||||
{
|
||||
// number of edges
|
||||
const Index np = C(p+1)-C(p);
|
||||
// loop over edges
|
||||
for(Index c = 0;c<np;c++)
|
||||
{
|
||||
const Index i = I(C(p)+c);
|
||||
const Index j = I(C(p)+((c+1)%np));
|
||||
ijv.emplace_back(i,j,1);
|
||||
ijv.emplace_back(j,i,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
A.resize(n,n);
|
||||
A.reserve(6*n);
|
||||
A.setFromTriplets(ijv.begin(),ijv.end());
|
||||
|
||||
// Force all non-zeros to be one
|
||||
|
||||
// Iterate over outside
|
||||
for(int k=0; k<A.outerSize(); ++k)
|
||||
{
|
||||
// Iterate over inside
|
||||
for(typename Eigen::SparseMatrix<T>::InnerIterator it (A,k); it; ++it)
|
||||
{
|
||||
assert(it.value() != 0);
|
||||
A.coeffRef(it.row(),it.col()) = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
template void igl::adjacency_matrix<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, int>(Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::SparseMatrix<int, 0, int>& );
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::adjacency_matrix<Eigen::Matrix<int, -1, -1, 0, -1, -1>, bool>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<bool, 0, int>&);
|
||||
template void igl::adjacency_matrix<Eigen::Matrix<int, -1, -1, 0, -1, -1>, double>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int>&);
|
||||
template void igl::adjacency_matrix<Eigen::Matrix<int, -1, -1, 0, -1, -1>, int>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<int, 0, int>&);
|
||||
template void igl::adjacency_matrix<Eigen::Matrix<int, -1, 3, 0, -1, 3>, int>(Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::SparseMatrix<int, 0, int>&);
|
||||
#endif
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace igl
|
||||
// Inputs:
|
||||
// F #F by dim list of mesh simplices
|
||||
// Outputs:
|
||||
// A max(F) by max(F) cotangent matrix, each row i corresponding to V(i,:)
|
||||
// A max(F)+1 by max(F)+1 adjacency matrix, each row i corresponding to V(i,:)
|
||||
//
|
||||
// Example:
|
||||
// // Mesh in (V,F)
|
||||
@@ -42,6 +42,21 @@ namespace igl
|
||||
IGL_INLINE void adjacency_matrix(
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
Eigen::SparseMatrix<T>& A);
|
||||
// Constructs an vertex adjacency for a polygon mesh.
|
||||
//
|
||||
// Inputs:
|
||||
// I #I vectorized list of polygon corner indices into rows of some matrix V
|
||||
// C #polygons+1 list of cumulative polygon sizes so that C(i+1)-C(i) =
|
||||
// size of the ith polygon, and so I(C(i)) through I(C(i+1)-1) are the
|
||||
// indices of the ith polygon
|
||||
// Outputs:
|
||||
// A max(I)+1 by max(I)+1 adjacency matrix, each row i corresponding to V(i,:)
|
||||
//
|
||||
template <typename DerivedI, typename DerivedC, typename T>
|
||||
IGL_INLINE void adjacency_matrix(
|
||||
const Eigen::MatrixBase<DerivedI> & I,
|
||||
const Eigen::MatrixBase<DerivedC> & C,
|
||||
Eigen::SparseMatrix<T>& A);
|
||||
}
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
|
||||
@@ -1,26 +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/.
|
||||
#include "all_edges.h"
|
||||
#include "oriented_facets.h"
|
||||
|
||||
template <typename DerivedF, typename DerivedE>
|
||||
IGL_INLINE void igl::all_edges(
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
Eigen::PlainObjectBase<DerivedE> & E)
|
||||
{
|
||||
return oriented_facets(F,E);
|
||||
}
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
template void igl::all_edges<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
|
||||
template void igl::all_edges<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&);
|
||||
template void igl::all_edges<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 2, 0, -1, 2> >&);
|
||||
template void igl::all_edges<Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
|
||||
template void igl::all_edges<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&);
|
||||
#endif
|
||||
@@ -1,38 +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_ALL_EDGES_H
|
||||
#define IGL_ALL_EDGES_H
|
||||
#include "igl_inline.h"
|
||||
#include <Eigen/Dense>
|
||||
namespace igl
|
||||
{
|
||||
// Deprecated: call oriented_facets instead.
|
||||
//
|
||||
// ALL_EDGES Determines all "directed edges" of a given set of simplices. For
|
||||
// a manifold mesh, this computes all of the half-edges
|
||||
//
|
||||
// Inputs:
|
||||
// F #F by simplex_size list of "faces"
|
||||
// Outputs:
|
||||
// E #E by simplex_size-1 list of edges
|
||||
//
|
||||
// Note: this is not the same as igl::edges because this includes every
|
||||
// directed edge including repeats (meaning interior edges on a surface will
|
||||
// show up once for each direction and non-manifold edges may appear more than
|
||||
// once for each direction).
|
||||
template <typename DerivedF, typename DerivedE>
|
||||
IGL_INLINE void all_edges(
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
Eigen::PlainObjectBase<DerivedE> & E);
|
||||
}
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
# include "all_edges.cpp"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -25,8 +25,8 @@ IGL_INLINE void igl::ambient_occlusion(
|
||||
const Eigen::Vector3f&,
|
||||
const Eigen::Vector3f&)
|
||||
> & shoot_ray,
|
||||
const Eigen::PlainObjectBase<DerivedP> & P,
|
||||
const Eigen::PlainObjectBase<DerivedN> & N,
|
||||
const Eigen::MatrixBase<DerivedP> & P,
|
||||
const Eigen::MatrixBase<DerivedN> & N,
|
||||
const int num_samples,
|
||||
Eigen::PlainObjectBase<DerivedS> & S)
|
||||
{
|
||||
@@ -69,10 +69,10 @@ template <
|
||||
typename DerivedS >
|
||||
IGL_INLINE void igl::ambient_occlusion(
|
||||
const igl::AABB<DerivedV,DIM> & aabb,
|
||||
const Eigen::PlainObjectBase<DerivedV> & V,
|
||||
const Eigen::PlainObjectBase<DerivedF> & F,
|
||||
const Eigen::PlainObjectBase<DerivedP> & P,
|
||||
const Eigen::PlainObjectBase<DerivedN> & N,
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
const Eigen::MatrixBase<DerivedP> & P,
|
||||
const Eigen::MatrixBase<DerivedN> & N,
|
||||
const int num_samples,
|
||||
Eigen::PlainObjectBase<DerivedS> & S)
|
||||
{
|
||||
@@ -100,10 +100,10 @@ template <
|
||||
typename DerivedN,
|
||||
typename DerivedS >
|
||||
IGL_INLINE void igl::ambient_occlusion(
|
||||
const Eigen::PlainObjectBase<DerivedV> & V,
|
||||
const Eigen::PlainObjectBase<DerivedF> & F,
|
||||
const Eigen::PlainObjectBase<DerivedP> & P,
|
||||
const Eigen::PlainObjectBase<DerivedN> & N,
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
const Eigen::MatrixBase<DerivedP> & P,
|
||||
const Eigen::MatrixBase<DerivedN> & N,
|
||||
const int num_samples,
|
||||
Eigen::PlainObjectBase<DerivedS> & S)
|
||||
{
|
||||
@@ -128,10 +128,12 @@ IGL_INLINE void igl::ambient_occlusion(
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::ambient_occlusion<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(std::function<bool (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::ambient_occlusion<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::ambient_occlusion<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(std::function<bool (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::ambient_occlusion<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(std::function<bool (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)> const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::ambient_occlusion<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(std::function<bool (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::ambient_occlusion<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::function<bool (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)> const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
template void igl::ambient_occlusion<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(std::function<bool (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)> const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::ambient_occlusion<Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, 1, 3, 1, 1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(std::function<bool (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)> const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::ambient_occlusion<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::function<bool (Eigen::Matrix<float, 3, 1, 0, 3, 1> const&, Eigen::Matrix<float, 3, 1, 0, 3, 1> const&)> const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
#endif
|
||||
|
||||
@@ -34,8 +34,8 @@ namespace igl
|
||||
const Eigen::Vector3f&,
|
||||
const Eigen::Vector3f&)
|
||||
> & shoot_ray,
|
||||
const Eigen::PlainObjectBase<DerivedP> & P,
|
||||
const Eigen::PlainObjectBase<DerivedN> & N,
|
||||
const Eigen::MatrixBase<DerivedP> & P,
|
||||
const Eigen::MatrixBase<DerivedN> & N,
|
||||
const int num_samples,
|
||||
Eigen::PlainObjectBase<DerivedS> & S);
|
||||
// Inputs:
|
||||
@@ -49,10 +49,10 @@ namespace igl
|
||||
typename DerivedS >
|
||||
IGL_INLINE void ambient_occlusion(
|
||||
const igl::AABB<DerivedV,DIM> & aabb,
|
||||
const Eigen::PlainObjectBase<DerivedV> & V,
|
||||
const Eigen::PlainObjectBase<DerivedF> & F,
|
||||
const Eigen::PlainObjectBase<DerivedP> & P,
|
||||
const Eigen::PlainObjectBase<DerivedN> & N,
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
const Eigen::MatrixBase<DerivedP> & P,
|
||||
const Eigen::MatrixBase<DerivedN> & N,
|
||||
const int num_samples,
|
||||
Eigen::PlainObjectBase<DerivedS> & S);
|
||||
// Inputs:
|
||||
@@ -65,10 +65,10 @@ namespace igl
|
||||
typename DerivedN,
|
||||
typename DerivedS >
|
||||
IGL_INLINE void ambient_occlusion(
|
||||
const Eigen::PlainObjectBase<DerivedV> & V,
|
||||
const Eigen::PlainObjectBase<DerivedF> & F,
|
||||
const Eigen::PlainObjectBase<DerivedP> & P,
|
||||
const Eigen::PlainObjectBase<DerivedN> & N,
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
const Eigen::MatrixBase<DerivedP> & P,
|
||||
const Eigen::MatrixBase<DerivedN> & N,
|
||||
const int num_samples,
|
||||
Eigen::PlainObjectBase<DerivedS> & S);
|
||||
|
||||
|
||||
@@ -1,934 +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/.
|
||||
#include "ReAntTweakBar.h"
|
||||
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <sstream>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <map>
|
||||
|
||||
// GLOBAL WRAPPERS
|
||||
namespace
|
||||
{
|
||||
std::map<
|
||||
TwType,std::pair<const char *,std::vector<TwEnumVal> >
|
||||
> ReTw_custom_types;
|
||||
}
|
||||
|
||||
IGL_INLINE TwType igl::anttweakbar::ReTwDefineEnum(
|
||||
const char *name,
|
||||
const TwEnumVal *enumValues,
|
||||
unsigned int nbValues)
|
||||
{
|
||||
using namespace std;
|
||||
// copy enum valus into vector
|
||||
std::vector<TwEnumVal> enum_vals;
|
||||
enum_vals.resize(nbValues);
|
||||
for(unsigned int j = 0; j<nbValues;j++)
|
||||
{
|
||||
enum_vals[j] = enumValues[j];
|
||||
}
|
||||
TwType type = TwDefineEnum(name,enumValues,nbValues);
|
||||
|
||||
ReTw_custom_types[type] =
|
||||
std::pair<const char *,std::vector<TwEnumVal> >(name,enum_vals);
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
IGL_INLINE TwType igl::anttweakbar::ReTwDefineEnumFromString(
|
||||
const char * _Name,
|
||||
const char * _EnumString)
|
||||
{
|
||||
// Taken directly from TwMgr.cpp, just replace TwDefineEnum with
|
||||
// ReTwDefineEnum
|
||||
using namespace std;
|
||||
{
|
||||
if (_EnumString == NULL)
|
||||
return ReTwDefineEnum(_Name, NULL, 0);
|
||||
|
||||
// split enumString
|
||||
stringstream EnumStream(_EnumString);
|
||||
string Label;
|
||||
vector<string> Labels;
|
||||
while( getline(EnumStream, Label, ',') ) {
|
||||
// trim Label
|
||||
size_t Start = Label.find_first_not_of(" \n\r\t");
|
||||
size_t End = Label.find_last_not_of(" \n\r\t");
|
||||
if( Start==string::npos || End==string::npos )
|
||||
Label = "";
|
||||
else
|
||||
Label = Label.substr(Start, (End-Start)+1);
|
||||
// store Label
|
||||
Labels.push_back(Label);
|
||||
}
|
||||
// create TwEnumVal array
|
||||
vector<TwEnumVal> Vals(Labels.size());
|
||||
for( int i=0; i<(int)Labels.size(); i++ )
|
||||
{
|
||||
Vals[i].Value = i;
|
||||
// Wrong:
|
||||
//Vals[i].Label = Labels[i].c_str();
|
||||
// Allocate char on heap
|
||||
// http://stackoverflow.com/a/10050258/148668
|
||||
char * c_label = new char[Labels[i].length()+1];
|
||||
std::strcpy(c_label, Labels[i].c_str());
|
||||
Vals[i].Label = c_label;
|
||||
}
|
||||
|
||||
const TwType type =
|
||||
ReTwDefineEnum(_Name, Vals.empty() ?
|
||||
NULL :
|
||||
&(Vals[0]), (unsigned int)Vals.size());
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
struct ReTwTypeString
|
||||
{
|
||||
TwType type;
|
||||
const char * type_str;
|
||||
};
|
||||
|
||||
#define RETW_NUM_DEFAULT_TYPE_STRINGS 23
|
||||
ReTwTypeString ReTwDefaultTypeStrings[RETW_NUM_DEFAULT_TYPE_STRINGS] =
|
||||
{
|
||||
{TW_TYPE_UNDEF,"TW_TYPE_UNDEF"},
|
||||
{TW_TYPE_BOOLCPP,"TW_TYPE_BOOLCPP"},
|
||||
{TW_TYPE_BOOL8,"TW_TYPE_BOOL8"},
|
||||
{TW_TYPE_BOOL16,"TW_TYPE_BOOL16"},
|
||||
{TW_TYPE_BOOL32,"TW_TYPE_BOOL32"},
|
||||
{TW_TYPE_CHAR,"TW_TYPE_CHAR"},
|
||||
{TW_TYPE_INT8,"TW_TYPE_INT8"},
|
||||
{TW_TYPE_UINT8,"TW_TYPE_UINT8"},
|
||||
{TW_TYPE_INT16,"TW_TYPE_INT16"},
|
||||
{TW_TYPE_UINT16,"TW_TYPE_UINT16"},
|
||||
{TW_TYPE_INT32,"TW_TYPE_INT32"},
|
||||
{TW_TYPE_UINT32,"TW_TYPE_UINT32"},
|
||||
{TW_TYPE_FLOAT,"TW_TYPE_FLOAT"},
|
||||
{TW_TYPE_DOUBLE,"TW_TYPE_DOUBLE"},
|
||||
{TW_TYPE_COLOR32,"TW_TYPE_COLOR32"},
|
||||
{TW_TYPE_COLOR3F,"TW_TYPE_COLOR3F"},
|
||||
{TW_TYPE_COLOR4F,"TW_TYPE_COLOR4F"},
|
||||
{TW_TYPE_CDSTRING,"TW_TYPE_CDSTRING"},
|
||||
{TW_TYPE_STDSTRING,"TW_TYPE_STDSTRING"},
|
||||
{TW_TYPE_QUAT4F,"TW_TYPE_QUAT4F"},
|
||||
{TW_TYPE_QUAT4D,"TW_TYPE_QUAT4D"},
|
||||
{TW_TYPE_DIR3F,"TW_TYPE_DIR3F"},
|
||||
{TW_TYPE_DIR3D,"TW_TYPE_DIR3D"}
|
||||
};
|
||||
}
|
||||
|
||||
IGL_INLINE igl::anttweakbar::ReTwBar::ReTwBar():
|
||||
bar(NULL),
|
||||
name(),
|
||||
rw_items(),cb_items()
|
||||
{
|
||||
}
|
||||
|
||||
IGL_INLINE igl::anttweakbar::ReTwBar::ReTwBar(
|
||||
const igl::anttweakbar::ReTwBar & that):
|
||||
bar(that.bar),
|
||||
name(that.name),
|
||||
rw_items(that.rw_items),
|
||||
cb_items(that.cb_items)
|
||||
{
|
||||
}
|
||||
|
||||
IGL_INLINE igl::anttweakbar::ReTwBar &
|
||||
igl::anttweakbar::ReTwBar::operator=(const igl::anttweakbar::ReTwBar & that)
|
||||
{
|
||||
// check for self assignment
|
||||
if(this != &that)
|
||||
{
|
||||
bar = that.bar;
|
||||
rw_items = that.rw_items;
|
||||
cb_items = that.cb_items;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// BAR WRAPPERS
|
||||
IGL_INLINE void igl::anttweakbar::ReTwBar::TwNewBar(const char * _name)
|
||||
{
|
||||
this->bar = ::TwNewBar(_name);
|
||||
// Alec: This causes trouble (not sure why) in multiple applications
|
||||
// (medit, puppet) Probably there is some sort of memory corrpution.
|
||||
// this->name = _name;
|
||||
// Suspiciously this also fails:
|
||||
//this->name = "foobar";
|
||||
}
|
||||
|
||||
IGL_INLINE int igl::anttweakbar::ReTwBar::TwAddVarRW(
|
||||
const char *name,
|
||||
TwType type,
|
||||
void *var,
|
||||
const char *def,
|
||||
const bool record)
|
||||
{
|
||||
int ret = ::TwAddVarRW(this->bar,name,type,var,def);
|
||||
if(ret && record)
|
||||
{
|
||||
rw_items.push_back(ReTwRWItem(name,type,var));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
IGL_INLINE int igl::anttweakbar::ReTwBar::TwAddVarCB(
|
||||
const char *name,
|
||||
TwType type,
|
||||
TwSetVarCallback setCallback,
|
||||
TwGetVarCallback getCallback,
|
||||
void *clientData,
|
||||
const char *def,
|
||||
const bool record)
|
||||
{
|
||||
int ret =
|
||||
::TwAddVarCB(this->bar,name,type,setCallback,getCallback,clientData,def);
|
||||
if(ret && record)
|
||||
{
|
||||
cb_items.push_back(ReTwCBItem(name,type,setCallback,getCallback,clientData));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
IGL_INLINE int igl::anttweakbar::ReTwBar::TwAddVarRO(
|
||||
const char *name,
|
||||
TwType type,
|
||||
void *var,
|
||||
const char *def)
|
||||
{
|
||||
int ret = ::TwAddVarRO(this->bar,name,type,var,def);
|
||||
// Read only variables are not recorded
|
||||
//if(ret)
|
||||
//{
|
||||
// rw_items.push_back(ReTwRWItem(name,type,var));
|
||||
//}
|
||||
return ret;
|
||||
}
|
||||
|
||||
IGL_INLINE int igl::anttweakbar::ReTwBar::TwAddButton(
|
||||
const char *name,
|
||||
TwButtonCallback buttonCallback,
|
||||
void *clientData,
|
||||
const char *def)
|
||||
{
|
||||
int ret =
|
||||
::TwAddButton(this->bar,name,buttonCallback,clientData,def);
|
||||
// buttons are not recorded
|
||||
//if(ret)
|
||||
//{
|
||||
// cb_items.push_back(ReTwCBItem(name,type,setCallback,getCallback,clientData));
|
||||
//}
|
||||
return ret;
|
||||
}
|
||||
|
||||
IGL_INLINE int igl::anttweakbar::ReTwBar::TwSetParam(
|
||||
const char *varName,
|
||||
const char *paramName,
|
||||
TwParamValueType paramValueType,
|
||||
unsigned int inValueCount,
|
||||
const void *inValues)
|
||||
{
|
||||
// For now just pass these along
|
||||
return
|
||||
::TwSetParam(
|
||||
this->bar,
|
||||
varName,
|
||||
paramName,
|
||||
paramValueType,
|
||||
inValueCount,
|
||||
inValues);
|
||||
}
|
||||
|
||||
IGL_INLINE int igl::anttweakbar::ReTwBar::TwGetParam(
|
||||
const char *varName,
|
||||
const char *paramName,
|
||||
TwParamValueType paramValueType,
|
||||
unsigned int outValueMaxCount,
|
||||
void *outValues)
|
||||
{
|
||||
return
|
||||
::TwGetParam(
|
||||
this->bar,
|
||||
varName,
|
||||
paramName,
|
||||
paramValueType,
|
||||
outValueMaxCount,
|
||||
outValues);
|
||||
}
|
||||
|
||||
IGL_INLINE int igl::anttweakbar::ReTwBar::TwRefreshBar()
|
||||
{
|
||||
return ::TwRefreshBar(this->bar);
|
||||
}
|
||||
|
||||
IGL_INLINE int igl::anttweakbar::ReTwBar::TwTerminate()
|
||||
{
|
||||
//std::cout<<"TwTerminate"<<std::endl;
|
||||
int r = ::TwTerminate();
|
||||
//std::cout<<" "<<r<<std::endl;
|
||||
return r;
|
||||
}
|
||||
|
||||
IGL_INLINE bool igl::anttweakbar::ReTwBar::save(const char *file_name)
|
||||
{
|
||||
FILE * fp;
|
||||
if(file_name == NULL)
|
||||
{
|
||||
fp = stdout;
|
||||
}else
|
||||
{
|
||||
fp = fopen(file_name,"w");
|
||||
}
|
||||
|
||||
if(fp == NULL)
|
||||
{
|
||||
printf("ERROR: not able to open %s for writing...\n",file_name);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Print all RW variables
|
||||
for(
|
||||
std::vector<ReTwRWItem>::iterator it = rw_items.begin();
|
||||
it != rw_items.end();
|
||||
it++)
|
||||
{
|
||||
std::string s = (*it).name;
|
||||
const char * name = s.c_str();
|
||||
TwType type = (*it).type;
|
||||
void * var = (*it).var;
|
||||
fprintf(fp,"%s: %s\n",
|
||||
name,
|
||||
get_value_as_string(var,type).c_str());
|
||||
}
|
||||
|
||||
char var[REANTTWEAKBAR_MAX_CB_VAR_SIZE];
|
||||
// Print all CB variables
|
||||
for(
|
||||
std::vector<ReTwCBItem>::iterator it = cb_items.begin();
|
||||
it != cb_items.end();
|
||||
it++)
|
||||
{
|
||||
const char * name = it->name.c_str();
|
||||
TwType type = it->type;
|
||||
//TwSetVarCallback setCallback = it->setCallback;
|
||||
TwGetVarCallback getCallback = it->getCallback;
|
||||
void * clientData = it->clientData;
|
||||
// I'm not sure how to do what I want to do. getCallback needs to be sure
|
||||
// that it can write to var. So var needs to point to a valid and big
|
||||
// enough chunk of memory
|
||||
getCallback(var,clientData);
|
||||
fprintf(fp,"%s: %s\n",
|
||||
name,
|
||||
get_value_as_string(var,type).c_str());
|
||||
}
|
||||
|
||||
fprintf(fp,"\n");
|
||||
|
||||
if(file_name != NULL)
|
||||
{
|
||||
fclose(fp);
|
||||
}
|
||||
// everything succeeded
|
||||
return true;
|
||||
}
|
||||
|
||||
IGL_INLINE std::string igl::anttweakbar::ReTwBar::get_value_as_string(
|
||||
void * var,
|
||||
TwType type)
|
||||
{
|
||||
std::stringstream sstr;
|
||||
switch(type)
|
||||
{
|
||||
case TW_TYPE_BOOLCPP:
|
||||
{
|
||||
sstr << "TW_TYPE_BOOLCPP" << " ";
|
||||
sstr << *(static_cast<bool*>(var));
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_QUAT4D:
|
||||
{
|
||||
sstr << "TW_TYPE_QUAT4D" << " ";
|
||||
// Q: Why does casting to double* work? shouldn't I have to cast to
|
||||
// double**?
|
||||
double * q = static_cast<double*>(var);
|
||||
sstr << std::setprecision(15) << q[0] << " " << q[1] << " " << q[2] << " " << q[3];
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_QUAT4F:
|
||||
{
|
||||
sstr << "TW_TYPE_QUAT4F" << " ";
|
||||
// Q: Why does casting to float* work? shouldn't I have to cast to
|
||||
// float**?
|
||||
float * q = static_cast<float*>(var);
|
||||
sstr << q[0] << " " << q[1] << " " << q[2] << " " << q[3];
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_COLOR4F:
|
||||
{
|
||||
sstr << "TW_TYPE_COLOR4F" << " ";
|
||||
float * c = static_cast<float*>(var);
|
||||
sstr << c[0] << " " << c[1] << " " << c[2] << " " << c[3];
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_COLOR3F:
|
||||
{
|
||||
sstr << "TW_TYPE_COLOR3F" << " ";
|
||||
float * c = static_cast<float*>(var);
|
||||
sstr << c[0] << " " << c[1] << " " << c[2];
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_DIR3D:
|
||||
{
|
||||
sstr << "TW_TYPE_DIR3D" << " ";
|
||||
double * d = static_cast<double*>(var);
|
||||
sstr << std::setprecision(15) << d[0] << " " << d[1] << " " << d[2];
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_DIR3F:
|
||||
{
|
||||
sstr << "TW_TYPE_DIR3F" << " ";
|
||||
float * d = static_cast<float*>(var);
|
||||
sstr << d[0] << " " << d[1] << " " << d[2];
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_BOOL32:
|
||||
{
|
||||
sstr << "TW_TYPE_BOOL32" << " ";
|
||||
sstr << *(static_cast<int*>(var));
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_UINT8:
|
||||
{
|
||||
sstr << "TW_TYPE_UINT8" << " ";
|
||||
// Cast to int so that it's human readable
|
||||
sstr << (int)*(static_cast<unsigned char*>(var));
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_INT32:
|
||||
{
|
||||
sstr << "TW_TYPE_INT32" << " ";
|
||||
sstr << *(static_cast<int*>(var));
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_UINT32:
|
||||
{
|
||||
sstr << "TW_TYPE_UINT32" << " ";
|
||||
sstr << *(static_cast<unsigned int*>(var));
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_FLOAT:
|
||||
{
|
||||
sstr << "TW_TYPE_FLOAT" << " ";
|
||||
sstr << *(static_cast<float*>(var));
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_DOUBLE:
|
||||
{
|
||||
sstr << "TW_TYPE_DOUBLE" << " ";
|
||||
sstr << std::setprecision(15) << *(static_cast<double*>(var));
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_STDSTRING:
|
||||
{
|
||||
sstr << "TW_TYPE_STDSTRING" << " ";
|
||||
std::string *destPtr = static_cast<std::string *>(var);
|
||||
sstr << destPtr->c_str();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
using namespace std;
|
||||
std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > >::const_iterator iter =
|
||||
ReTw_custom_types.find(type);
|
||||
if(iter != ReTw_custom_types.end())
|
||||
{
|
||||
sstr << (*iter).second.first << " ";
|
||||
int enum_val = *(static_cast<int*>(var));
|
||||
// try find display name for enum value
|
||||
std::vector<TwEnumVal>::const_iterator eit = (*iter).second.second.begin();
|
||||
bool found = false;
|
||||
for(;eit<(*iter).second.second.end();eit++)
|
||||
{
|
||||
if(enum_val == eit->Value)
|
||||
{
|
||||
sstr << eit->Label;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!found)
|
||||
{
|
||||
sstr << "ERROR_ENUM_VALUE_NOT_DEFINED";
|
||||
}
|
||||
}else
|
||||
{
|
||||
sstr << "ERROR_TYPE_NOT_SUPPORTED";
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return sstr.str();
|
||||
}
|
||||
|
||||
IGL_INLINE bool igl::anttweakbar::ReTwBar::load(const char *file_name)
|
||||
{
|
||||
FILE * fp;
|
||||
fp = fopen(file_name,"r");
|
||||
|
||||
if(fp == NULL)
|
||||
{
|
||||
printf("ERROR: not able to open %s for reading...\n",file_name);
|
||||
return false;
|
||||
}
|
||||
|
||||
// go through file line by line
|
||||
char line[REANTTWEAKBAR_MAX_LINE];
|
||||
bool still_comments;
|
||||
char name[REANTTWEAKBAR_MAX_WORD];
|
||||
char type_str[REANTTWEAKBAR_MAX_WORD];
|
||||
char value_str[REANTTWEAKBAR_MAX_WORD];
|
||||
|
||||
|
||||
// line number
|
||||
int j = 0;
|
||||
bool finished = false;
|
||||
while(true)
|
||||
{
|
||||
// Eat comments
|
||||
still_comments = true;
|
||||
while(still_comments)
|
||||
{
|
||||
if(fgets(line,REANTTWEAKBAR_MAX_LINE,fp) == NULL)
|
||||
{
|
||||
finished = true;
|
||||
break;
|
||||
}
|
||||
// Blank lines and lines that begin with # are comments
|
||||
still_comments = (line[0] == '#' || line[0] == '\n');
|
||||
j++;
|
||||
}
|
||||
if(finished)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
sscanf(line,"%[^:]: %s %[^\n]",name,type_str,value_str);
|
||||
//printf("%s: %s %s\n",name, type_str,value_str);
|
||||
|
||||
TwType type;
|
||||
if(!type_from_string(type_str,type))
|
||||
{
|
||||
printf("ERROR: %s type not found... Skipping...\n",type_str);
|
||||
continue;
|
||||
}
|
||||
set_value_from_string(name,type,value_str);
|
||||
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
// everything succeeded
|
||||
return true;
|
||||
}
|
||||
|
||||
IGL_INLINE bool igl::anttweakbar::ReTwBar::type_from_string(
|
||||
const char *type_str, TwType & type)
|
||||
{
|
||||
// first check default types
|
||||
for(int j = 0; j < RETW_NUM_DEFAULT_TYPE_STRINGS; j++)
|
||||
{
|
||||
if(strcmp(type_str,ReTwDefaultTypeStrings[j].type_str) == 0)
|
||||
{
|
||||
type = ReTwDefaultTypeStrings[j].type;
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// then check custom types
|
||||
std::map<
|
||||
TwType,std::pair<const char *,std::vector<TwEnumVal> >
|
||||
>::const_iterator iter =
|
||||
ReTw_custom_types.begin();
|
||||
for(;iter != ReTw_custom_types.end(); iter++)
|
||||
{
|
||||
if(strcmp((*iter).second.first,type_str)==0)
|
||||
{
|
||||
type = (*iter).first;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool igl::anttweakbar::ReTwBar::set_value_from_string(
|
||||
const char * name,
|
||||
TwType type,
|
||||
const char * value_str)
|
||||
{
|
||||
void * value = NULL;
|
||||
// possible value slots
|
||||
int i;
|
||||
float v;
|
||||
double dv;
|
||||
float f[4];
|
||||
double d[4];
|
||||
bool b;
|
||||
unsigned int u;
|
||||
unsigned char uc;
|
||||
std::string s;
|
||||
|
||||
// First try to get value from default types
|
||||
switch(type)
|
||||
{
|
||||
case TW_TYPE_BOOLCPP:
|
||||
{
|
||||
int ib;
|
||||
if(sscanf(value_str," %d",&ib) == 1)
|
||||
{
|
||||
b = ib!=0;
|
||||
value = &b;
|
||||
}else
|
||||
{
|
||||
printf("ERROR: Bad value format...\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_QUAT4D:
|
||||
//case TW_TYPE_COLOR4D:
|
||||
{
|
||||
if(sscanf(value_str," %lf %lf %lf %lf",&d[0],&d[1],&d[2],&d[3]) == 4)
|
||||
{
|
||||
value = &d;
|
||||
}else
|
||||
{
|
||||
printf("ERROR: Bad value format...\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_QUAT4F:
|
||||
case TW_TYPE_COLOR4F:
|
||||
{
|
||||
if(sscanf(value_str," %f %f %f %f",&f[0],&f[1],&f[2],&f[3]) == 4)
|
||||
{
|
||||
value = &f;
|
||||
}else
|
||||
{
|
||||
printf("ERROR: Bad value format...\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
//case TW_TYPE_COLOR3D:
|
||||
case TW_TYPE_DIR3D:
|
||||
{
|
||||
if(sscanf(value_str," %lf %lf %lf",&d[0],&d[1],&d[2]) == 3)
|
||||
{
|
||||
value = &d;
|
||||
}else
|
||||
{
|
||||
printf("ERROR: Bad value format...\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_COLOR3F:
|
||||
case TW_TYPE_DIR3F:
|
||||
{
|
||||
if(sscanf(value_str," %f %f %f",&f[0],&f[1],&f[2]) == 3)
|
||||
{
|
||||
value = &f;
|
||||
}else
|
||||
{
|
||||
printf("ERROR: Bad value format...\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_UINT8:
|
||||
{
|
||||
if(sscanf(value_str," %d",&i) == 1)
|
||||
{
|
||||
// Cast to unsigned char
|
||||
uc = (unsigned char) i;
|
||||
value = &uc;
|
||||
}else
|
||||
{
|
||||
printf("ERROR: Bad value format...\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_BOOL32:
|
||||
case TW_TYPE_INT32:
|
||||
{
|
||||
if(sscanf(value_str," %d",&i) == 1)
|
||||
{
|
||||
value = &i;
|
||||
}else
|
||||
{
|
||||
printf("ERROR: Bad value format...\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_UINT32:
|
||||
{
|
||||
if(sscanf(value_str," %u",&u) == 1)
|
||||
{
|
||||
value = &u;
|
||||
}else
|
||||
{
|
||||
printf("ERROR: Bad value format...\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_FLOAT:
|
||||
{
|
||||
if(sscanf(value_str," %f",&v) == 1)
|
||||
{
|
||||
value = &v;
|
||||
}else
|
||||
{
|
||||
printf("ERROR: Bad value format...\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_DOUBLE:
|
||||
{
|
||||
if(sscanf(value_str," %lf",&dv) == 1)
|
||||
{
|
||||
value = &dv;
|
||||
}else
|
||||
{
|
||||
printf("ERROR: Bad value format...\n");
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_STDSTRING:
|
||||
{
|
||||
s = value_str;
|
||||
value = &s;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
// Try to find type in custom enum types
|
||||
std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > >::const_iterator iter =
|
||||
ReTw_custom_types.find(type);
|
||||
if(iter != ReTw_custom_types.end())
|
||||
{
|
||||
std::vector<TwEnumVal>::const_iterator eit = (*iter).second.second.begin();
|
||||
bool found = false;
|
||||
for(;eit<(*iter).second.second.end();eit++)
|
||||
{
|
||||
if(strcmp(value_str,eit->Label) == 0)
|
||||
{
|
||||
i = eit->Value;
|
||||
value = &i;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!found)
|
||||
{
|
||||
printf("ERROR_ENUM_VALUE_NOT_DEFINED");
|
||||
}
|
||||
}else
|
||||
{
|
||||
printf("ERROR_TYPE_NOT_SUPPORTED\n");
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// Find variable based on name
|
||||
// First look in RW items
|
||||
bool item_found = false;
|
||||
for(
|
||||
std::vector<ReTwRWItem>::iterator it = rw_items.begin();
|
||||
it != rw_items.end();
|
||||
it++)
|
||||
{
|
||||
if(it->name == name)
|
||||
{
|
||||
void * var = it->var;
|
||||
switch(type)
|
||||
{
|
||||
case TW_TYPE_BOOLCPP:
|
||||
{
|
||||
bool * bvar = static_cast<bool*>(var);
|
||||
bool * bvalue = static_cast<bool*>(value);
|
||||
*bvar = *bvalue;
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_QUAT4D:
|
||||
//case TW_TYPE_COLOR4D:
|
||||
{
|
||||
double * dvar = static_cast<double*>(var);
|
||||
double * dvalue = static_cast<double*>(value);
|
||||
dvar[0] = dvalue[0];
|
||||
dvar[1] = dvalue[1];
|
||||
dvar[2] = dvalue[2];
|
||||
dvar[3] = dvalue[3];
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_QUAT4F:
|
||||
case TW_TYPE_COLOR4F:
|
||||
{
|
||||
float * fvar = static_cast<float*>(var);
|
||||
float * fvalue = static_cast<float*>(value);
|
||||
fvar[0] = fvalue[0];
|
||||
fvar[1] = fvalue[1];
|
||||
fvar[2] = fvalue[2];
|
||||
fvar[3] = fvalue[3];
|
||||
break;
|
||||
}
|
||||
//case TW_TYPE_COLOR3D:
|
||||
case TW_TYPE_DIR3D:
|
||||
{
|
||||
double * dvar = static_cast<double*>(var);
|
||||
double * dvalue = static_cast<double*>(value);
|
||||
dvar[0] = dvalue[0];
|
||||
dvar[1] = dvalue[1];
|
||||
dvar[2] = dvalue[2];
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_COLOR3F:
|
||||
case TW_TYPE_DIR3F:
|
||||
{
|
||||
float * fvar = static_cast<float*>(var);
|
||||
float * fvalue = static_cast<float*>(value);
|
||||
fvar[0] = fvalue[0];
|
||||
fvar[1] = fvalue[1];
|
||||
fvar[2] = fvalue[2];
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_UINT8:
|
||||
{
|
||||
unsigned char * ucvar = static_cast<unsigned char*>(var);
|
||||
unsigned char * ucvalue = static_cast<unsigned char*>(value);
|
||||
*ucvar = *ucvalue;
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_BOOL32:
|
||||
case TW_TYPE_INT32:
|
||||
{
|
||||
int * ivar = static_cast<int*>(var);
|
||||
int * ivalue = static_cast<int*>(value);
|
||||
*ivar = *ivalue;
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_UINT32:
|
||||
{
|
||||
unsigned int * uvar = static_cast<unsigned int*>(var);
|
||||
unsigned int * uvalue = static_cast<unsigned int*>(value);
|
||||
*uvar = *uvalue;
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_FLOAT:
|
||||
{
|
||||
float * fvar = static_cast<float*>(var);
|
||||
float * fvalue = static_cast<float*>(value);
|
||||
*fvar = *fvalue;
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_DOUBLE:
|
||||
{
|
||||
double * dvar = static_cast<double*>(var);
|
||||
double * fvalue = static_cast<double*>(value);
|
||||
*dvar = *fvalue;
|
||||
break;
|
||||
}
|
||||
case TW_TYPE_STDSTRING:
|
||||
{
|
||||
std::string * svar = static_cast<std::string*>(var);
|
||||
std::string * svalue = static_cast<std::string*>(value);
|
||||
*svar = *svalue;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
// Try to find type in custom enum types
|
||||
std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > >::iterator iter =
|
||||
ReTw_custom_types.find(type);
|
||||
if(iter != ReTw_custom_types.end())
|
||||
{
|
||||
int * ivar = static_cast<int*>(var);
|
||||
std::vector<TwEnumVal>::iterator eit = (*iter).second.second.begin();
|
||||
bool found = false;
|
||||
for(;eit<(*iter).second.second.end();eit++)
|
||||
{
|
||||
if(strcmp(value_str,eit->Label) == 0)
|
||||
{
|
||||
*ivar = eit->Value;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!found)
|
||||
{
|
||||
printf("ERROR_ENUM_VALUE_NOT_DEFINED");
|
||||
}
|
||||
}else
|
||||
{
|
||||
printf("ERROR_TYPE_NOT_SUPPORTED\n");
|
||||
}
|
||||
break;
|
||||
}
|
||||
item_found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Try looking in CB items
|
||||
if(!item_found)
|
||||
{
|
||||
for(
|
||||
std::vector<ReTwCBItem>::iterator it = cb_items.begin();
|
||||
it != cb_items.end();
|
||||
it++)
|
||||
{
|
||||
if(it->name==name)
|
||||
{
|
||||
it->setCallback(value,it->clientData);
|
||||
item_found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!item_found)
|
||||
{
|
||||
printf("ERROR: item '%s' not found\n",name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
IGL_INLINE const std::vector<igl::anttweakbar::ReTwRWItem> &
|
||||
igl::anttweakbar::ReTwBar::get_rw_items()
|
||||
{
|
||||
return rw_items;
|
||||
}
|
||||
|
||||
IGL_INLINE const std::vector<igl::anttweakbar::ReTwCBItem> &
|
||||
igl::anttweakbar::ReTwBar::get_cb_items()
|
||||
{
|
||||
return cb_items;
|
||||
}
|
||||
@@ -1,286 +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_ANTTWEAKBAR_REANTTWEAKBAR_H
|
||||
#define IGL_ANTTWEAKBAR_REANTTWEAKBAR_H
|
||||
#include "../igl_inline.h"
|
||||
// ReAntTweakBar is a minimal wrapper for the AntTweakBar library that allows
|
||||
// "bars" to be saved and load from disk. Changing your existing app that uses
|
||||
// AntTweakBar to use ReAntTweakBar is trivial.
|
||||
//
|
||||
// Many (but not all) variable types are supported. I'll try to keep track them
|
||||
// here:
|
||||
// TW_TYPE_BOOLCPP
|
||||
// TW_TYPE_QUAT4F
|
||||
// TW_TYPE_QUAT4D
|
||||
// TW_TYPE_COLOR4F
|
||||
// TW_TYPE_COLOR4D
|
||||
// TW_TYPE_COLOR3F
|
||||
// TW_TYPE_DIR3F
|
||||
// TW_TYPE_DIR3D
|
||||
// TW_TYPE_BOOL32
|
||||
// TW_TYPE_INT32
|
||||
// TW_TYPE_UINT32
|
||||
// TW_TYPE_FLOAT
|
||||
// TW_TYPE_DOUBLE
|
||||
// TW_TYPE_UINT8
|
||||
// and
|
||||
// custom TwTypes made with TwDefineEnum
|
||||
//
|
||||
// I'm working on adding the rest on an as-needed basis. Adding a new type only
|
||||
// requires changes in a few places...
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
// This allows the user to have a non-global, static installation of
|
||||
// AntTweakBar
|
||||
#include <AntTweakBar.h>
|
||||
// Instead of including AntTweakBar.h, just define the necessary types
|
||||
// Types used:
|
||||
// - TwType
|
||||
// - TwEnumVal
|
||||
// - TwSetVarCallback
|
||||
// - TwGetVarCallback
|
||||
// - TwBar
|
||||
// - TwButtonCallback
|
||||
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
#define REANTTWEAKBAR_MAX_CB_VAR_SIZE 1000
|
||||
// Max line size for reading files
|
||||
#define REANTTWEAKBAR_MAX_LINE 1000
|
||||
#define REANTTWEAKBAR_MAX_WORD 100
|
||||
|
||||
namespace igl
|
||||
{
|
||||
namespace anttweakbar
|
||||
{
|
||||
TwType ReTwDefineEnum(
|
||||
const char *name,
|
||||
const TwEnumVal *enumValues,
|
||||
unsigned int nbValues);
|
||||
TwType ReTwDefineEnumFromString(const char * name,const char * enumString);
|
||||
|
||||
struct ReTwRWItem
|
||||
{
|
||||
//const char * name;
|
||||
std::string name;
|
||||
TwType type;
|
||||
void * var;
|
||||
// Default constructor
|
||||
IGL_INLINE ReTwRWItem(
|
||||
const std::string _name,
|
||||
TwType _type,
|
||||
void *_var):
|
||||
name(_name),
|
||||
type(_type),
|
||||
var(_var)
|
||||
{
|
||||
}
|
||||
// Shallow copy constructor
|
||||
// I solemnly swear it's OK to copy var this way
|
||||
// Q: Is it really?
|
||||
IGL_INLINE ReTwRWItem(const ReTwRWItem & that):
|
||||
name(that.name),
|
||||
type(that.type),
|
||||
var(that.var)
|
||||
{
|
||||
}
|
||||
// Shallow assignment
|
||||
// I solemnly swear it's OK to copy var this way
|
||||
IGL_INLINE ReTwRWItem & operator=(const ReTwRWItem & that)
|
||||
{
|
||||
if(this != &that)
|
||||
{
|
||||
this->name = that.name;
|
||||
this->type = that.type;
|
||||
this->var = that.var;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
struct ReTwCBItem
|
||||
{
|
||||
//const char * name;
|
||||
std::string name;
|
||||
TwType type;
|
||||
TwSetVarCallback setCallback;
|
||||
TwGetVarCallback getCallback;
|
||||
void * clientData;
|
||||
// Default constructor
|
||||
IGL_INLINE ReTwCBItem(
|
||||
const std::string _name,
|
||||
TwType _type,
|
||||
TwSetVarCallback _setCallback,
|
||||
TwGetVarCallback _getCallback,
|
||||
void * _clientData):
|
||||
name(_name),
|
||||
type(_type),
|
||||
setCallback(_setCallback),
|
||||
getCallback(_getCallback),
|
||||
clientData(_clientData)
|
||||
{
|
||||
}
|
||||
// Shallow copy
|
||||
// I solemnly swear it's OK to copy clientData this way
|
||||
IGL_INLINE ReTwCBItem(const ReTwCBItem & that):
|
||||
name(that.name),
|
||||
type(that.type),
|
||||
setCallback(that.setCallback),
|
||||
getCallback(that.getCallback),
|
||||
clientData(that.clientData)
|
||||
{
|
||||
}
|
||||
// Shallow assignment
|
||||
// I solemnly swear it's OK to copy clientData this way
|
||||
IGL_INLINE ReTwCBItem & operator=(const ReTwCBItem & that)
|
||||
{
|
||||
if(this != &that)
|
||||
{
|
||||
name = that.name;
|
||||
type = that.type;
|
||||
setCallback = that.setCallback;
|
||||
getCallback = that.getCallback;
|
||||
clientData = that.clientData;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class ReTwBar
|
||||
{
|
||||
// VARIABLES
|
||||
// Should be private, but seeing as I'm not going to implement all of the
|
||||
// AntTweakBar public functions right away, I'll expose this so that at
|
||||
// anytime AntTweakBar functions can be called directly on the bar
|
||||
public:
|
||||
TwBar * bar;
|
||||
std::string name;
|
||||
protected:
|
||||
std::vector<ReTwRWItem> rw_items;
|
||||
std::vector<ReTwCBItem> cb_items;
|
||||
public:
|
||||
// Default constructor with explicit initialization
|
||||
IGL_INLINE ReTwBar();
|
||||
private:
|
||||
// Copy constructor does shallow copy
|
||||
IGL_INLINE ReTwBar(const ReTwBar & that);
|
||||
// Assignment operator does shallow assignment
|
||||
IGL_INLINE ReTwBar &operator=(const ReTwBar & that);
|
||||
|
||||
// WRAPPERS FOR ANTTWEAKBAR FUNCTIONS
|
||||
public:
|
||||
IGL_INLINE void TwNewBar(const char *_name);
|
||||
IGL_INLINE int TwAddVarRW(
|
||||
const char *name,
|
||||
TwType type,
|
||||
void *var,
|
||||
const char *def,
|
||||
const bool record=true);
|
||||
IGL_INLINE int TwAddVarCB(
|
||||
const char *name,
|
||||
TwType type,
|
||||
TwSetVarCallback setCallback,
|
||||
TwGetVarCallback getCallback,
|
||||
void *clientData,
|
||||
const char *def,
|
||||
const bool record=true);
|
||||
// Wrappers for convenience (not recorded, just passed on)
|
||||
IGL_INLINE int TwAddVarRO(const char *name, TwType type, void *var, const char *def);
|
||||
IGL_INLINE int TwAddButton(
|
||||
const char *name,
|
||||
TwButtonCallback buttonCallback,
|
||||
void *clientData,
|
||||
const char *def);
|
||||
IGL_INLINE int TwSetParam(
|
||||
const char *varName,
|
||||
const char *paramName,
|
||||
TwParamValueType paramValueType,
|
||||
unsigned int inValueCount,
|
||||
const void *inValues);
|
||||
IGL_INLINE int TwGetParam(
|
||||
const char *varName,
|
||||
const char *paramName,
|
||||
TwParamValueType paramValueType,
|
||||
unsigned int outValueMaxCount,
|
||||
void *outValues);
|
||||
IGL_INLINE int TwRefreshBar();
|
||||
IGL_INLINE int TwTerminate();
|
||||
|
||||
|
||||
// IO FUNCTIONS
|
||||
public:
|
||||
// Save current items to file
|
||||
// Input:
|
||||
// file_name name of file to save data to, can be null which means print
|
||||
// to stdout
|
||||
// Return:
|
||||
// true only if there were no (fatal) errors
|
||||
IGL_INLINE bool save(const char *file_name);
|
||||
std::string get_value_as_string(
|
||||
void * var,
|
||||
TwType type);
|
||||
// Load into current items from file
|
||||
// Input:
|
||||
// file_name name of input file to load
|
||||
// Return:
|
||||
// true only if there were no (fatal) errors
|
||||
IGL_INLINE bool load(const char *file_name);
|
||||
// Get TwType from string
|
||||
// Input
|
||||
// type_str string of type
|
||||
// Output
|
||||
// type TwType converted from string
|
||||
// Returns
|
||||
// true only if string matched a valid type
|
||||
IGL_INLINE bool type_from_string(const char *type_str, TwType & type);
|
||||
// I realize that I mix std::string and const char * all over the place.
|
||||
// What can you do...
|
||||
IGL_INLINE bool set_value_from_string(
|
||||
const char * name,
|
||||
TwType type,
|
||||
const char * value_str);
|
||||
IGL_INLINE const std::vector<ReTwRWItem> & get_rw_items();
|
||||
IGL_INLINE const std::vector<ReTwCBItem> & get_cb_items();
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// List of TwBar functions
|
||||
//TW_API TwBar * TW_CALL TwNewBar(const char *barName);
|
||||
//TW_API int TW_CALL TwDeleteBar(TwBar *bar);
|
||||
//TW_API int TW_CALL TwDeleteAllBars();
|
||||
//TW_API int TW_CALL TwSetTopBar(const TwBar *bar);
|
||||
//TW_API TwBar * TW_CALL TwGetTopBar();
|
||||
//TW_API int TW_CALL TwSetBottomBar(const TwBar *bar);
|
||||
//TW_API TwBar * TW_CALL TwGetBottomBar();
|
||||
//TW_API const char * TW_CALL TwGetBarName(TwBar *bar);
|
||||
//TW_API int TW_CALL TwGetBarCount();
|
||||
//TW_API TwBar * TW_CALL TwGetBarByIndex(int barIndex);
|
||||
//TW_API TwBar * TW_CALL TwGetBarByName(const char *barName);
|
||||
//TW_API int TW_CALL TwRefreshBar(TwBar *bar);
|
||||
//TW_API int TW_CALL TwTerminate();
|
||||
//
|
||||
//TW_API int TW_CALL TwAddVarRW(TwBar *bar, const char *name, TwType type, void *var, const char *def);
|
||||
//TW_API int TW_CALL TwAddVarRO(TwBar *bar, const char *name, TwType type, const void *var, const char *def);
|
||||
//TW_API int TW_CALL TwAddVarCB(TwBar *bar, const char *name, TwType type, TwSetVarCallback setCallback, TwGetVarCallback getCallback, void *clientData, const char *def);
|
||||
//TW_API int TW_CALL TwAddButton(TwBar *bar, const char *name, TwButtonCallback callback, void *clientData, const char *def);
|
||||
//TW_API int TW_CALL TwAddSeparator(TwBar *bar, const char *name, const char *def);
|
||||
//TW_API int TW_CALL TwRemoveVar(TwBar *bar, const char *name);
|
||||
//TW_API int TW_CALL TwRemoveAllVars(TwBar *bar);
|
||||
|
||||
// Until AntTweakBar dependency folder exists, this is header-only
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
# include "ReAntTweakBar.cpp"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,81 +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/.
|
||||
#include "cocoa_key_to_anttweakbar_key.h"
|
||||
|
||||
#include <AntTweakBar.h>
|
||||
|
||||
IGL_INLINE int igl::anttweakbar::cocoa_key_to_anttweakbar_key(int key)
|
||||
{
|
||||
// I've left commented the AntTweakBar key codes that correspond to keys I
|
||||
// don't have on my keyboard. Please fill this in if you have those keys
|
||||
switch(key)
|
||||
{
|
||||
case 127:
|
||||
return TW_KEY_BACKSPACE;
|
||||
case 9:
|
||||
return TW_KEY_TAB;
|
||||
//TW_KEY_CLEAR = 0x0c,
|
||||
case 3://ENTER
|
||||
case 13:
|
||||
return TW_KEY_RETURN;
|
||||
case 27:
|
||||
return TW_KEY_ESCAPE;
|
||||
case 32:
|
||||
return TW_KEY_SPACE;
|
||||
// IN A GLUT APP 40 is (
|
||||
//case 40:
|
||||
case 63272:
|
||||
return TW_KEY_DELETE;
|
||||
case 63232:
|
||||
return TW_KEY_UP;
|
||||
case 63233:
|
||||
return TW_KEY_DOWN;
|
||||
case 63235:
|
||||
return TW_KEY_RIGHT;
|
||||
case 63234:
|
||||
return TW_KEY_LEFT;
|
||||
//TW_KEY_INSERT,
|
||||
//TW_KEY_HOME,
|
||||
//TW_KEY_END,
|
||||
//TW_KEY_PAGE_UP,
|
||||
//TW_KEY_PAGE_DOWN,
|
||||
case 63236:
|
||||
return TW_KEY_F1;
|
||||
case 63237:
|
||||
return TW_KEY_F2;
|
||||
case 63238:
|
||||
return TW_KEY_F3;
|
||||
case 63239:
|
||||
return TW_KEY_F4;
|
||||
case 63240:
|
||||
return TW_KEY_F5;
|
||||
case 63241:
|
||||
return TW_KEY_F6;
|
||||
case 63242:
|
||||
return TW_KEY_F7;
|
||||
case 63243:
|
||||
return TW_KEY_F8;
|
||||
case 63244:
|
||||
return TW_KEY_F9;
|
||||
case 63245:
|
||||
return TW_KEY_F10;
|
||||
case 63246:
|
||||
return TW_KEY_F11;
|
||||
case 63247:
|
||||
return TW_KEY_F12;
|
||||
case 63248:
|
||||
return TW_KEY_F13;
|
||||
case 63249:
|
||||
return TW_KEY_F14;
|
||||
case 63250:
|
||||
return TW_KEY_F15;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return key;
|
||||
}
|
||||
@@ -1,31 +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_ANTTWEAKBAR_COCOA_KEY_TO_ANTTWEAKBAR_KEY_H
|
||||
#define IGL_ANTTWEAKBAR_COCOA_KEY_TO_ANTTWEAKBAR_KEY_H
|
||||
#include "../igl_inline.h"
|
||||
|
||||
|
||||
namespace igl
|
||||
{
|
||||
namespace anttweakbar
|
||||
{
|
||||
// Convert an unsigned char (like that from Cocoa apps) to AntTweakBar key
|
||||
// code.
|
||||
// See also: TranslateKey() in TwMgr.cpp in AntTweakBar source
|
||||
// Inputs:
|
||||
// key unsigned char key from keyboard
|
||||
// Returns int of new key code
|
||||
IGL_INLINE int cocoa_key_to_anttweakbar_key(int key);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
# include "cocoa_key_to_anttweakbar_key.cpp"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
#include "get_seconds_hires.h"
|
||||
//#include "MKLEigenInterface.h"
|
||||
#include "min_quad_dense.h"
|
||||
#include "kkt_inverse.h"
|
||||
#include "get_seconds.h"
|
||||
#include "columnize.h"
|
||||
|
||||
@@ -543,7 +543,7 @@ IGL_INLINE bool igl::arap_dof_recomputation(
|
||||
#endif
|
||||
|
||||
// Compute dense solve matrix (alternative of matrix factorization)
|
||||
//printf("min_quad_dense_precompute()\n");
|
||||
//printf("kkt_inverse()\n");
|
||||
MatrixXd Qfull(*Q);
|
||||
MatrixXd A_eqfull(A_eq);
|
||||
MatrixXd M_Solve;
|
||||
@@ -552,7 +552,7 @@ IGL_INLINE bool igl::arap_dof_recomputation(
|
||||
bool use_lu = data.effective_dim != 2;
|
||||
//use_lu = false;
|
||||
//printf("use_lu: %s\n",(use_lu?"TRUE":"FALSE"));
|
||||
min_quad_dense_precompute(Qfull, A_eqfull, use_lu,M_Solve);
|
||||
kkt_inverse(Qfull, A_eqfull, use_lu,M_Solve);
|
||||
double timer0_end = get_seconds_hires();
|
||||
verbose("Bob timing: %.20f\n", (timer0_end - timer0_start)*1000.0);
|
||||
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
#include "cotmatrix_entries.h"
|
||||
#include <Eigen/Dense>
|
||||
|
||||
template <typename MatV, typename MatF, typename Scalar>
|
||||
template <typename MatV, typename MatF, typename MatK>
|
||||
IGL_INLINE void igl::arap_linear_block(
|
||||
const MatV & V,
|
||||
const MatF & F,
|
||||
const int d,
|
||||
const igl::ARAPEnergyType energy,
|
||||
Eigen::SparseMatrix<Scalar> & Kd)
|
||||
MatK & Kd)
|
||||
{
|
||||
switch(energy)
|
||||
{
|
||||
@@ -36,13 +36,15 @@ IGL_INLINE void igl::arap_linear_block(
|
||||
}
|
||||
|
||||
|
||||
template <typename MatV, typename MatF, typename Scalar>
|
||||
template <typename MatV, typename MatF, typename MatK>
|
||||
IGL_INLINE void igl::arap_linear_block_spokes(
|
||||
const MatV & V,
|
||||
const MatF & F,
|
||||
const int d,
|
||||
Eigen::SparseMatrix<Scalar> & Kd)
|
||||
MatK & Kd)
|
||||
{
|
||||
typedef typename MatK::Scalar Scalar;
|
||||
|
||||
using namespace std;
|
||||
using namespace Eigen;
|
||||
// simplex size (3: triangles, 4: tetrahedra)
|
||||
@@ -101,13 +103,15 @@ IGL_INLINE void igl::arap_linear_block_spokes(
|
||||
Kd.makeCompressed();
|
||||
}
|
||||
|
||||
template <typename MatV, typename MatF, typename Scalar>
|
||||
template <typename MatV, typename MatF, typename MatK>
|
||||
IGL_INLINE void igl::arap_linear_block_spokes_and_rims(
|
||||
const MatV & V,
|
||||
const MatF & F,
|
||||
const int d,
|
||||
Eigen::SparseMatrix<Scalar> & Kd)
|
||||
MatK & Kd)
|
||||
{
|
||||
typedef typename MatK::Scalar Scalar;
|
||||
|
||||
using namespace std;
|
||||
using namespace Eigen;
|
||||
// simplex size (3: triangles, 4: tetrahedra)
|
||||
@@ -183,13 +187,14 @@ IGL_INLINE void igl::arap_linear_block_spokes_and_rims(
|
||||
Kd.makeCompressed();
|
||||
}
|
||||
|
||||
template <typename MatV, typename MatF, typename Scalar>
|
||||
template <typename MatV, typename MatF, typename MatK>
|
||||
IGL_INLINE void igl::arap_linear_block_elements(
|
||||
const MatV & V,
|
||||
const MatF & F,
|
||||
const int d,
|
||||
Eigen::SparseMatrix<Scalar> & Kd)
|
||||
MatK & Kd)
|
||||
{
|
||||
typedef typename MatK::Scalar Scalar;
|
||||
using namespace std;
|
||||
using namespace Eigen;
|
||||
// simplex size (3: triangles, 4: tetrahedra)
|
||||
@@ -249,5 +254,6 @@ IGL_INLINE void igl::arap_linear_block_elements(
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
template IGL_INLINE void igl::arap_linear_block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, int, igl::ARAPEnergyType, Eigen::SparseMatrix<double, 0, int>&);
|
||||
template void igl::arap_linear_block<Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >, Eigen::SparseMatrix<double, 0, int> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, int, igl::ARAPEnergyType, Eigen::SparseMatrix<double, 0, int>&);
|
||||
template void igl::arap_linear_block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::SparseMatrix<double, 0, int> >(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, int, igl::ARAPEnergyType, Eigen::SparseMatrix<double, 0, int>&);
|
||||
#endif
|
||||
|
||||
@@ -43,32 +43,32 @@ namespace igl
|
||||
// Kd #V by #V/#F block of the linear constructor matrix corresponding to
|
||||
// coordinate d
|
||||
//
|
||||
template <typename MatV, typename MatF, typename Scalar>
|
||||
template <typename MatV, typename MatF, typename MatK>
|
||||
IGL_INLINE void arap_linear_block(
|
||||
const MatV & V,
|
||||
const MatF & F,
|
||||
const int d,
|
||||
const igl::ARAPEnergyType energy,
|
||||
Eigen::SparseMatrix<Scalar> & Kd);
|
||||
MatK & Kd);
|
||||
// Helper functions for each energy type
|
||||
template <typename MatV, typename MatF, typename Scalar>
|
||||
template <typename MatV, typename MatF, typename MatK>
|
||||
IGL_INLINE void arap_linear_block_spokes(
|
||||
const MatV & V,
|
||||
const MatF & F,
|
||||
const int d,
|
||||
Eigen::SparseMatrix<Scalar> & Kd);
|
||||
template <typename MatV, typename MatF, typename Scalar>
|
||||
MatK & Kd);
|
||||
template <typename MatV, typename MatF, typename MatK>
|
||||
IGL_INLINE void arap_linear_block_spokes_and_rims(
|
||||
const MatV & V,
|
||||
const MatF & F,
|
||||
const int d,
|
||||
Eigen::SparseMatrix<Scalar> & Kd);
|
||||
template <typename MatV, typename MatF, typename Scalar>
|
||||
MatK & Kd);
|
||||
template <typename MatV, typename MatF, typename MatK>
|
||||
IGL_INLINE void arap_linear_block_elements(
|
||||
const MatV & V,
|
||||
const MatF & F,
|
||||
const int d,
|
||||
Eigen::SparseMatrix<Scalar> & Kd);
|
||||
MatK & Kd);
|
||||
}
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
|
||||
+18
-12
@@ -1,9 +1,9 @@
|
||||
// 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
|
||||
//
|
||||
// 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/.
|
||||
#include "arap_rhs.h"
|
||||
#include "arap_linear_block.h"
|
||||
@@ -12,12 +12,13 @@
|
||||
#include "cat.h"
|
||||
#include <iostream>
|
||||
|
||||
template<typename DerivedV, typename DerivedF, typename DerivedK>
|
||||
IGL_INLINE void igl::arap_rhs(
|
||||
const Eigen::MatrixXd & V,
|
||||
const Eigen::MatrixXi & F,
|
||||
const int dim,
|
||||
const igl::ARAPEnergyType energy,
|
||||
Eigen::SparseMatrix<double>& K)
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
const int dim,
|
||||
const igl::ARAPEnergyType energy,
|
||||
Eigen::SparseCompressedBase<DerivedK>& K)
|
||||
{
|
||||
using namespace std;
|
||||
using namespace Eigen;
|
||||
@@ -48,7 +49,7 @@ IGL_INLINE void igl::arap_rhs(
|
||||
return;
|
||||
}
|
||||
|
||||
SparseMatrix<double> KX,KY,KZ;
|
||||
DerivedK KX,KY,KZ;
|
||||
arap_linear_block(V,F,0,energy,KX);
|
||||
arap_linear_block(V,F,1,energy,KY);
|
||||
if(Vdim == 2)
|
||||
@@ -62,7 +63,7 @@ IGL_INLINE void igl::arap_rhs(
|
||||
K = cat(2,cat(2,repdiag(KX,dim),repdiag(KY,dim)),repdiag(KZ,dim));
|
||||
}else if(dim ==2)
|
||||
{
|
||||
SparseMatrix<double> ZZ(KX.rows()*2,KX.cols());
|
||||
DerivedK ZZ(KX.rows()*2,KX.cols());
|
||||
K = cat(2,cat(2,
|
||||
cat(2,repdiag(KX,dim),ZZ),
|
||||
cat(2,repdiag(KY,dim),ZZ)),
|
||||
@@ -84,6 +85,11 @@ IGL_INLINE void igl::arap_rhs(
|
||||
Vdim);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
template void igl::arap_rhs(const Eigen::MatrixBase<Eigen::MatrixXd> & V, const Eigen::MatrixBase<Eigen::MatrixXi> & F,const int dim, const igl::ARAPEnergyType energy,Eigen::SparseCompressedBase<Eigen::SparseMatrix<double>>& K);
|
||||
#endif
|
||||
+10
-9
@@ -1,9 +1,9 @@
|
||||
// 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
|
||||
//
|
||||
// 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_ARAP_RHS_H
|
||||
#define IGL_ARAP_RHS_H
|
||||
@@ -25,16 +25,17 @@ namespace igl
|
||||
// energy igl::ARAPEnergyType enum value defining which energy is being
|
||||
// used. See igl::ARAPEnergyType.h for valid options and explanations.
|
||||
// Outputs:
|
||||
// K #V*dim by #(F|V)*dim*dim matrix such that:
|
||||
// K #V*dim by #(F|V)*dim*dim matrix such that:
|
||||
// b = K * reshape(permute(R,[3 1 2]),size(V|F,1)*size(V,2)*size(V,2),1);
|
||||
//
|
||||
//
|
||||
// See also: arap_linear_block
|
||||
template<typename DerivedV, typename DerivedF, typename DerivedK>
|
||||
IGL_INLINE void arap_rhs(
|
||||
const Eigen::MatrixXd & V,
|
||||
const Eigen::MatrixXi & F,
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
const int dim,
|
||||
const igl::ARAPEnergyType energy,
|
||||
Eigen::SparseMatrix<double>& K);
|
||||
Eigen::SparseCompressedBase<DerivedK>& K);
|
||||
}
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
#include "arap_rhs.cpp"
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2020 Oded Stein <oded.stein@columbia.edu>
|
||||
//
|
||||
// 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/.
|
||||
#include "average_from_edges_onto_vertices.h"
|
||||
|
||||
template<typename DerivedF,typename DerivedE,typename DerivedoE,
|
||||
typename DeriveduE,typename DeriveduV>
|
||||
IGL_INLINE void
|
||||
igl::average_from_edges_onto_vertices(
|
||||
const Eigen::MatrixBase<DerivedF> &F,
|
||||
const Eigen::MatrixBase<DerivedE> &E,
|
||||
const Eigen::MatrixBase<DerivedoE> &oE,
|
||||
const Eigen::MatrixBase<DeriveduE> &uE,
|
||||
Eigen::PlainObjectBase<DeriveduV> &uV)
|
||||
{
|
||||
using Scalar = typename DeriveduE::Scalar;
|
||||
using VecX = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>;
|
||||
using Int = typename DerivedF::Scalar;
|
||||
|
||||
assert(E.rows()==F.rows() && "E does not match dimensions of F.");
|
||||
assert(oE.rows()==F.rows() && "oE does not match dimensions of F.");
|
||||
assert(E.cols()==3 && F.cols()==3 && oE.cols()==3 &&
|
||||
"This method is for triangle meshes.");
|
||||
|
||||
const Int n = F.maxCoeff()+1;
|
||||
|
||||
VecX edgesPerVertex(n);
|
||||
edgesPerVertex.setZero();
|
||||
uV.resize(n,1);
|
||||
uV.setZero();
|
||||
|
||||
for(Eigen::Index i=0; i<F.rows(); ++i) {
|
||||
for(int j=0; j<3; ++j) {
|
||||
if(oE(i,j)<0) {
|
||||
continue;
|
||||
}
|
||||
const Int e = E(i,j);
|
||||
const Int vi=F(i,(j+1)%3), vj=F(i,(j+2)%3);
|
||||
|
||||
//Count vertex valence
|
||||
++edgesPerVertex(vi);
|
||||
++edgesPerVertex(vj);
|
||||
|
||||
//Average uE value onto vertices
|
||||
uV(vi) += uE(e);
|
||||
uV(vj) += uE(e);
|
||||
}
|
||||
}
|
||||
|
||||
//Divide by valence
|
||||
for(Int i=0; i<n; ++i) {
|
||||
const Scalar valence = edgesPerVertex(i);
|
||||
if(valence>0) {
|
||||
uV(i) /= valence;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
template void igl::average_from_edges_onto_vertices<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::PartialReduxExpr<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::internal::member_norm<double>, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::PartialReduxExpr<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::internal::member_norm<double>, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
template void igl::average_from_edges_onto_vertices<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
template void igl::average_from_edges_onto_vertices<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
|
||||
#endif
|
||||
@@ -0,0 +1,39 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2020 Oded Stein <oded.stein@columbia.edu>
|
||||
//
|
||||
// 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_AVERAGE_FROM_EDGES_ONTO_VERTICES_H
|
||||
#define IGL_AVERAGE_FROM_EDGES_ONTO_VERTICES_H
|
||||
#include "igl_inline.h"
|
||||
|
||||
#include <Eigen/Dense>
|
||||
namespace igl
|
||||
{
|
||||
// Move a scalar field defined on edges to vertices by averaging
|
||||
//
|
||||
// Input:
|
||||
// F: triangle mesh connectivity
|
||||
// E, oE: mapping from halfedges to edges and orientation as generated by
|
||||
// orient_halfedges
|
||||
// uE: scalar field defined on edges, one per edge
|
||||
//
|
||||
// Output:
|
||||
// uV: scalar field defined on vertices
|
||||
template<typename DerivedF,typename DerivedE,typename DerivedoE,
|
||||
typename DeriveduE,typename DeriveduV>
|
||||
IGL_INLINE void average_from_edges_onto_vertices(
|
||||
const Eigen::MatrixBase<DerivedF> &F,
|
||||
const Eigen::MatrixBase<DerivedE> &E,
|
||||
const Eigen::MatrixBase<DerivedoE> &oE,
|
||||
const Eigen::MatrixBase<DeriveduE> &uE,
|
||||
Eigen::PlainObjectBase<DeriveduV> &uV);
|
||||
}
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
# include "average_from_edges_onto_vertices.cpp"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "average_onto_faces.h"
|
||||
|
||||
template <typename DerivedF, typename DerivedS, typename DerivedSF>
|
||||
IGL_INLINE void average_onto_faces(
|
||||
IGL_INLINE void igl::average_onto_faces(
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
const Eigen::MatrixBase<DerivedS> & S,
|
||||
Eigen::PlainObjectBase<DerivedSF> & SF)
|
||||
@@ -22,4 +22,6 @@ IGL_INLINE void average_onto_faces(
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::average_onto_faces<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&);
|
||||
#endif
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
// obtain one at http://mozilla.org/MPL/2.0/.
|
||||
#include "average_onto_vertices.h"
|
||||
|
||||
template<typename DerivedV,typename DerivedF,typename DerivedS>
|
||||
template<typename DerivedV,typename DerivedF,typename DerivedS,typename DerivedSV >
|
||||
IGL_INLINE void igl::average_onto_vertices(const Eigen::MatrixBase<DerivedV> &V,
|
||||
const Eigen::MatrixBase<DerivedF> &F,
|
||||
const Eigen::MatrixBase<DerivedS> &S,
|
||||
Eigen::MatrixBase<DerivedS> &SV)
|
||||
Eigen::PlainObjectBase<DerivedSV> &SV)
|
||||
{
|
||||
SV = DerivedS::Zero(V.rows(),S.cols());
|
||||
Eigen::Matrix<typename DerivedF::Scalar,Eigen::Dynamic,1> COUNT(V.rows());
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
// 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
|
||||
//
|
||||
// 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_AVERAGE_ONTO_VERTICES_H
|
||||
#define IGL_AVERAGE_ONTO_VERTICES_H
|
||||
#include "igl_inline.h"
|
||||
|
||||
#include <Eigen/Dense>
|
||||
namespace igl
|
||||
namespace igl
|
||||
{
|
||||
// average_onto_vertices
|
||||
// average_onto_vertices
|
||||
// Move a scalar field defined on faces to vertices by averaging
|
||||
//
|
||||
// Input:
|
||||
// V,F: mesh
|
||||
// S: scalar field defined on faces, Fx1
|
||||
//
|
||||
//
|
||||
// Output:
|
||||
// SV: scalar field defined on vertices
|
||||
template<typename DerivedV,typename DerivedF,typename DerivedS>
|
||||
template<typename DerivedV,typename DerivedF,typename DerivedS,typename DerivedSV>
|
||||
IGL_INLINE void average_onto_vertices(const Eigen::MatrixBase<DerivedV> &V,
|
||||
const Eigen::MatrixBase<DerivedF> &F,
|
||||
const Eigen::MatrixBase<DerivedS> &S,
|
||||
Eigen::MatrixBase<DerivedS> &SV);
|
||||
Eigen::PlainObjectBase<DerivedSV> &SV);
|
||||
}
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
// 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
|
||||
//
|
||||
// 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/.
|
||||
#include "avg_edge_length.h"
|
||||
#include "edges.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
@@ -14,20 +15,19 @@ IGL_INLINE double igl::avg_edge_length(
|
||||
const Eigen::MatrixBase<DerivedV>& V,
|
||||
const Eigen::MatrixBase<DerivedF>& F)
|
||||
{
|
||||
double avg = 0;
|
||||
long int count = 0;
|
||||
typedef typename DerivedF::Scalar Index;
|
||||
Eigen::Matrix<Index, Eigen::Dynamic, 2> E;
|
||||
|
||||
// Augh. Technically this is double counting interior edges...
|
||||
for (unsigned i=0;i<F.rows();++i)
|
||||
igl::edges(F, E);
|
||||
|
||||
double avg = 0;
|
||||
|
||||
for (unsigned i=0;i<E.rows();++i)
|
||||
{
|
||||
for (unsigned j=0;j<F.cols();++j)
|
||||
{
|
||||
++count;
|
||||
avg += (V.row(F(i,j)) - V.row(F(i,(j+1)%F.cols()))).norm();
|
||||
}
|
||||
avg += (V.row(E(i,0)) - V.row(E(i,1))).norm();
|
||||
}
|
||||
|
||||
return avg / (double) count;
|
||||
return avg / (double) E.rows();
|
||||
}
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// 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
|
||||
//
|
||||
// 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_AVERAGEEDGELENGTH_H
|
||||
#define IGL_AVERAGEEDGELENGTH_H
|
||||
@@ -13,7 +13,7 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace igl
|
||||
namespace igl
|
||||
{
|
||||
// Compute the average edge length for the given triangle mesh
|
||||
// Templates:
|
||||
|
||||
@@ -34,18 +34,13 @@ IGL_INLINE void igl::barycenter(
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::barycenter<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);
|
||||
template void igl::barycenter<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::barycenter<Eigen::Matrix<double, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::barycenter<Eigen::Matrix<float, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<float, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::barycenter<Eigen::Matrix<float, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::barycenter<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<float, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::barycenter<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 3, 0, -1, 3> >&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::barycenter<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<float, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, -1, -1, 0, -1, -1> >&);
|
||||
template void igl::barycenter<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 4, 0, -1, 4> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 4, 0, -1, 4> >&);
|
||||
template void igl::barycenter<Eigen::Matrix<double, -1, 4, 0, -1, 4>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 4, 0, -1, 4> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 4, 0, -1, 4> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 4, 0, -1, 4> >&);
|
||||
@@ -54,4 +49,8 @@ template void igl::barycenter<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::M
|
||||
template void igl::barycenter<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);
|
||||
template void igl::barycenter<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
template void igl::barycenter<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&);
|
||||
template void igl::barycenter<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 2, 3, 0, 2, 3>, Eigen::Matrix<double, 2, 3, 0, 2, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, 2, 3, 0, 2, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 3, 0, 2, 3> >&);
|
||||
template void igl::barycenter<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, 2, 3, 0, 2, 3>, Eigen::Matrix<double, 2, 3, 0, 2, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, 2, 3, 0, 2, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 2, 3, 0, 2, 3> >&);
|
||||
template void igl::barycenter<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> >&);
|
||||
template void igl::barycenter<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> >&);
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2020 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/.
|
||||
#include "barycentric_interpolation.h"
|
||||
#include "parallel_for.h"
|
||||
|
||||
template <
|
||||
typename DerivedD,
|
||||
typename DerivedF,
|
||||
typename DerivedB,
|
||||
typename DerivedI,
|
||||
typename DerivedX>
|
||||
IGL_INLINE void igl::barycentric_interpolation(
|
||||
const Eigen::MatrixBase<DerivedD> & D,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
const Eigen::MatrixBase<DerivedB> & B,
|
||||
const Eigen::MatrixBase<DerivedI> & I,
|
||||
Eigen::PlainObjectBase<DerivedX> & X)
|
||||
{
|
||||
assert(B.rows() == I.size());
|
||||
assert(F.cols() == B.cols());
|
||||
X.setZero(B.rows(),D.cols());
|
||||
// should use parallel_for
|
||||
//for(int i = 0;i<X.rows();i++)
|
||||
parallel_for(X.rows(),[&X,&B,&D,&F,&I](const int i)
|
||||
{
|
||||
for(int j = 0;j<F.cols();j++)
|
||||
{
|
||||
X.row(i) += B(i,j) * D.row(F(I(i),j));
|
||||
}
|
||||
},1000);
|
||||
}
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::barycentric_interpolation<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2020 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_BARYCENTRIC_INTERPOLATION_H
|
||||
#define IGL_BARYCENTRIC_INTERPOLATION_H
|
||||
#include "igl_inline.h"
|
||||
#include <Eigen/Core>
|
||||
namespace igl
|
||||
{
|
||||
// Interpolate data on a triangle mesh using barycentric coordinates
|
||||
//
|
||||
// Inputs:
|
||||
// D #D by dim list of per-vertex data
|
||||
// F #F by 3 list of triangle indices
|
||||
// B #X by 3 list of barycentric corodinates
|
||||
// I #X list of triangle indices
|
||||
// Outputs:
|
||||
// X #X by dim list of interpolated data
|
||||
template <
|
||||
typename DerivedD,
|
||||
typename DerivedF,
|
||||
typename DerivedB,
|
||||
typename DerivedI,
|
||||
typename DerivedX>
|
||||
IGL_INLINE void barycentric_interpolation(
|
||||
const Eigen::MatrixBase<DerivedD> & D,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
const Eigen::MatrixBase<DerivedB> & B,
|
||||
const Eigen::MatrixBase<DerivedI> & I,
|
||||
Eigen::PlainObjectBase<DerivedX> & X);
|
||||
}
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
# include "barycentric_interpolation.cpp"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2013 Daniele Panozzo <daniele.panozzo@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/.
|
||||
#include "barycentric_to_global.h"
|
||||
|
||||
// For error printing
|
||||
#include <cstdio>
|
||||
#include <vector>
|
||||
|
||||
namespace igl
|
||||
{
|
||||
template <typename Scalar, typename Index>
|
||||
IGL_INLINE Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> barycentric_to_global(
|
||||
const Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> & V,
|
||||
const Eigen::Matrix<Index,Eigen::Dynamic,Eigen::Dynamic> & F,
|
||||
const Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> & bc)
|
||||
{
|
||||
Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> R;
|
||||
R.resize(bc.rows(),3);
|
||||
|
||||
for (unsigned i=0; i<R.rows(); ++i)
|
||||
{
|
||||
unsigned id = round(bc(i,0));
|
||||
double u = bc(i,1);
|
||||
double v = bc(i,2);
|
||||
|
||||
if (id != -1)
|
||||
R.row(i) = V.row(F(id,0)) +
|
||||
((V.row(F(id,1)) - V.row(F(id,0))) * u +
|
||||
(V.row(F(id,2)) - V.row(F(id,0))) * v );
|
||||
else
|
||||
R.row(i) << 0,0,0;
|
||||
}
|
||||
return R;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
template Eigen::Matrix<double, -1, -1, 0, -1, -1> igl::barycentric_to_global<double, int>(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&);
|
||||
#endif
|
||||
@@ -1,42 +0,0 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2013 Daniele Panozzo <daniele.panozzo@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_BARYCENTRIC2GLOBAL_H
|
||||
#define IGL_BARYCENTRIC2GLOBAL_H
|
||||
#include <igl/igl_inline.h>
|
||||
|
||||
#include <Eigen/Dense>
|
||||
#include <Eigen/Sparse>
|
||||
|
||||
namespace igl
|
||||
{
|
||||
// Converts barycentric coordinates in the embree form to 3D coordinates
|
||||
// Embree stores barycentric coordinates as triples: fid, bc1, bc2
|
||||
// fid is the id of a face, bc1 is the displacement of the point wrt the
|
||||
// first vertex v0 and the edge v1-v0. Similarly, bc2 is the displacement
|
||||
// wrt v2-v0.
|
||||
//
|
||||
// Input:
|
||||
// V: #Vx3 Vertices of the mesh
|
||||
// F: #Fxe Faces of the mesh
|
||||
// bc: #Xx3 Barycentric coordinates, one row per point
|
||||
//
|
||||
// Output:
|
||||
// #X: #Xx3 3D coordinates of all points in bc
|
||||
template <typename Scalar, typename Index>
|
||||
IGL_INLINE Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>
|
||||
barycentric_to_global(
|
||||
const Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> & V,
|
||||
const Eigen::Matrix<Index,Eigen::Dynamic,Eigen::Dynamic> & F,
|
||||
const Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> & bc);
|
||||
}
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
# include "barycentric_to_global.cpp"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -118,7 +118,12 @@ IGL_INLINE bool igl::bbw(
|
||||
}
|
||||
W.col(i) = Wi;
|
||||
};
|
||||
#ifdef WIN32
|
||||
for (int i = 0; i < m; ++i)
|
||||
optimize_weight(i);
|
||||
#else
|
||||
parallel_for(m,optimize_weight,2);
|
||||
#endif
|
||||
if(error)
|
||||
{
|
||||
return false;
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2020 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/.
|
||||
#include "bezier.h"
|
||||
#include <cassert>
|
||||
|
||||
// Adapted from main.c accompanying
|
||||
// An Algorithm for Automatically Fitting Digitized Curves
|
||||
// by Philip J. Schneider
|
||||
// from "Graphics Gems", Academic Press, 1990
|
||||
template <typename DerivedV, typename DerivedP>
|
||||
IGL_INLINE void igl::bezier(
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const typename DerivedV::Scalar t,
|
||||
Eigen::PlainObjectBase<DerivedP> & P)
|
||||
{
|
||||
// working local copy
|
||||
DerivedV Vtemp = V;
|
||||
int degree = Vtemp.rows()-1;
|
||||
/* Triangle computation */
|
||||
for (int i = 1; i <= degree; i++)
|
||||
{
|
||||
for (int j = 0; j <= degree-i; j++)
|
||||
{
|
||||
Vtemp.row(j) = ((1.0 - t) * Vtemp.row(j) + t * Vtemp.row(j+1)).eval();
|
||||
}
|
||||
}
|
||||
P = Vtemp.row(0);
|
||||
}
|
||||
|
||||
template <typename DerivedV, typename DerivedT, typename DerivedP>
|
||||
IGL_INLINE void igl::bezier(
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedT> & T,
|
||||
Eigen::PlainObjectBase<DerivedP> & P)
|
||||
{
|
||||
P.resize(T.size(),V.cols());
|
||||
for(int i = 0;i<T.size();i++)
|
||||
{
|
||||
Eigen::Matrix<typename DerivedV::Scalar,1,DerivedV::ColsAtCompileTime> Pi;
|
||||
bezier(V,T(i),Pi);
|
||||
P.row(i) = Pi;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename VMat, typename DerivedT, typename DerivedP>
|
||||
IGL_INLINE void igl::bezier(
|
||||
const std::vector<VMat> & spline,
|
||||
const Eigen::MatrixBase<DerivedT> & T,
|
||||
Eigen::PlainObjectBase<DerivedP> & P)
|
||||
{
|
||||
if(spline.size() == 0) return;
|
||||
const int m = T.rows();
|
||||
const int dim = spline[0].cols();
|
||||
P.resize(m*spline.size(),dim);
|
||||
for(int c = 0;c<spline.size();c++)
|
||||
{
|
||||
assert(dim == spline[c].cols() && "All curves must have same dimension");
|
||||
DerivedP Pc;
|
||||
bezier(spline[c],T,Pc);
|
||||
P.block(m*c,0,m,dim) = Pc;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
template void igl::bezier<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
template void igl::bezier<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
template void igl::bezier<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 1, -1, 1, 1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, -1, 1, 1, -1> >&);
|
||||
#endif
|
||||
@@ -0,0 +1,51 @@
|
||||
#ifndef BEZIER_H
|
||||
#define BEZIER_H
|
||||
#include "igl_inline.h"
|
||||
#include <Eigen/Core>
|
||||
#include <vector>
|
||||
namespace igl
|
||||
{
|
||||
// Evaluate a polynomial Bezier Curve.
|
||||
//
|
||||
// Inputs:
|
||||
// V #V by dim list of Bezier control points
|
||||
// t evaluation parameter within [0,1]
|
||||
// Outputs:
|
||||
// P 1 by dim output point
|
||||
template <typename DerivedV, typename DerivedP>
|
||||
IGL_INLINE void bezier(
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const typename DerivedV::Scalar t,
|
||||
Eigen::PlainObjectBase<DerivedP> & P);
|
||||
// Evaluate a polynomial Bezier Curve.
|
||||
//
|
||||
// Inputs:
|
||||
// V #V by dim list of Bezier control points
|
||||
// T #T evaluation parameters within [0,1]
|
||||
// Outputs:
|
||||
// P #T by dim output points
|
||||
template <typename DerivedV, typename DerivedT, typename DerivedP>
|
||||
IGL_INLINE void bezier(
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedT> & T,
|
||||
Eigen::PlainObjectBase<DerivedP> & P);
|
||||
// Evaluate a polynomial Bezier spline with a fixed parameter set for each
|
||||
// sub-curve
|
||||
//
|
||||
// Inputs:
|
||||
// spline #curves list of lists of Bezier control points
|
||||
// T #T evaluation parameters within [0,1] to use for each spline
|
||||
// Outputs:
|
||||
// P #curves*#T by dim output points
|
||||
template <typename VMat, typename DerivedT, typename DerivedP>
|
||||
IGL_INLINE void bezier(
|
||||
const std::vector<VMat> & spline,
|
||||
const Eigen::MatrixBase<DerivedT> & T,
|
||||
Eigen::PlainObjectBase<DerivedP> & P);
|
||||
}
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
# include "bezier.cpp"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+2
-2
@@ -59,7 +59,7 @@ template <
|
||||
typename DType,
|
||||
typename PType>
|
||||
IGL_INLINE void igl::bfs(
|
||||
const Eigen::SparseMatrix<AType> & A,
|
||||
const Eigen::SparseCompressedBase<AType> & A,
|
||||
const size_t s,
|
||||
std::vector<DType> & D,
|
||||
std::vector<PType> & P)
|
||||
@@ -83,7 +83,7 @@ IGL_INLINE void igl::bfs(
|
||||
D.push_back(f);
|
||||
P[f] = p;
|
||||
seen[f] = true;
|
||||
for(typename Eigen::SparseMatrix<AType>::InnerIterator it (A,f); it; ++it)
|
||||
for(typename AType::InnerIterator it (A,f); it; ++it)
|
||||
{
|
||||
if(it.value()) Q.push({it.index(),f});
|
||||
}
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ namespace igl
|
||||
typename DType,
|
||||
typename PType>
|
||||
IGL_INLINE void bfs(
|
||||
const Eigen::SparseMatrix<AType> & A,
|
||||
const Eigen::SparseCompressedBase<AType> & A,
|
||||
const size_t s,
|
||||
std::vector<DType> & D,
|
||||
std::vector<PType> & P);
|
||||
|
||||
@@ -12,13 +12,13 @@
|
||||
|
||||
template <typename DerivedF, typename DerivedFF, typename DerivedC>
|
||||
IGL_INLINE void igl::bfs_orient(
|
||||
const Eigen::PlainObjectBase<DerivedF> & F,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
Eigen::PlainObjectBase<DerivedFF> & FF,
|
||||
Eigen::PlainObjectBase<DerivedC> & C)
|
||||
{
|
||||
using namespace Eigen;
|
||||
using namespace std;
|
||||
SparseMatrix<int> A;
|
||||
SparseMatrix<typename DerivedF::Scalar> A;
|
||||
orientable_patches(F,C,A);
|
||||
|
||||
// number of faces
|
||||
@@ -30,7 +30,7 @@ IGL_INLINE void igl::bfs_orient(
|
||||
// Edge sets
|
||||
const int ES[3][2] = {{1,2},{2,0},{0,1}};
|
||||
|
||||
if(&FF != &F)
|
||||
if(((void*)&FF) != ((void*)&F))
|
||||
{
|
||||
FF = F;
|
||||
}
|
||||
@@ -38,7 +38,7 @@ IGL_INLINE void igl::bfs_orient(
|
||||
#pragma omp parallel for
|
||||
for(int c = 0;c<num_cc;c++)
|
||||
{
|
||||
queue<int> Q;
|
||||
queue<typename DerivedF::Scalar> Q;
|
||||
// find first member of patch c
|
||||
for(int f = 0;f<FF.rows();f++)
|
||||
{
|
||||
@@ -51,7 +51,7 @@ IGL_INLINE void igl::bfs_orient(
|
||||
assert(!Q.empty());
|
||||
while(!Q.empty())
|
||||
{
|
||||
const int f = Q.front();
|
||||
const typename DerivedF::Scalar f = Q.front();
|
||||
Q.pop();
|
||||
if(seen(f) > 0)
|
||||
{
|
||||
@@ -59,7 +59,7 @@ IGL_INLINE void igl::bfs_orient(
|
||||
}
|
||||
seen(f)++;
|
||||
// loop over neighbors of f
|
||||
for(typename SparseMatrix<int>::InnerIterator it (A,f); it; ++it)
|
||||
for(typename SparseMatrix<typename DerivedF::Scalar>::InnerIterator it (A,f); it; ++it)
|
||||
{
|
||||
// might be some lingering zeros, and skip self-adjacency
|
||||
if(it.value() != 0 && it.row() != f)
|
||||
@@ -96,5 +96,5 @@ IGL_INLINE void igl::bfs_orient(
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
template void igl::bfs_orient<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::bfs_orient<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
|
||||
#endif
|
||||
|
||||
@@ -25,10 +25,10 @@ namespace igl
|
||||
//
|
||||
template <typename DerivedF, typename DerivedFF, typename DerivedC>
|
||||
IGL_INLINE void bfs_orient(
|
||||
const Eigen::PlainObjectBase<DerivedF> & F,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
Eigen::PlainObjectBase<DerivedFF> & FF,
|
||||
Eigen::PlainObjectBase<DerivedC> & C);
|
||||
};
|
||||
}
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
# include "bfs_orient.cpp"
|
||||
#endif
|
||||
|
||||
@@ -22,8 +22,8 @@ template <
|
||||
typename SType,
|
||||
typename DerivedW>
|
||||
IGL_INLINE bool igl::biharmonic_coordinates(
|
||||
const Eigen::PlainObjectBase<DerivedV> & V,
|
||||
const Eigen::PlainObjectBase<DerivedT> & T,
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedT> & T,
|
||||
const std::vector<std::vector<SType> > & S,
|
||||
Eigen::PlainObjectBase<DerivedW> & W)
|
||||
{
|
||||
@@ -36,32 +36,36 @@ template <
|
||||
typename SType,
|
||||
typename DerivedW>
|
||||
IGL_INLINE bool igl::biharmonic_coordinates(
|
||||
const Eigen::PlainObjectBase<DerivedV> & V,
|
||||
const Eigen::PlainObjectBase<DerivedT> & T,
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedT> & T,
|
||||
const std::vector<std::vector<SType> > & S,
|
||||
const int k,
|
||||
Eigen::PlainObjectBase<DerivedW> & W)
|
||||
{
|
||||
using namespace Eigen;
|
||||
using namespace std;
|
||||
|
||||
typedef typename DerivedV::Scalar Scalar;
|
||||
typedef typename DerivedT::Scalar Integer;
|
||||
|
||||
// This is not the most efficient way to build A, but follows "Linear
|
||||
// Subspace Design for Real-Time Shape Deformation" [Wang et al. 2015].
|
||||
SparseMatrix<double> A;
|
||||
SparseMatrix<Scalar> A;
|
||||
{
|
||||
DiagonalMatrix<double,Dynamic> Minv;
|
||||
SparseMatrix<double> L,K;
|
||||
DiagonalMatrix<Scalar, Dynamic> Minv;
|
||||
SparseMatrix<Scalar> L, K;
|
||||
Array<bool,Dynamic,Dynamic> C;
|
||||
{
|
||||
Array<bool,Dynamic,1> I;
|
||||
on_boundary(T,I,C);
|
||||
}
|
||||
#ifdef false
|
||||
#ifdef false
|
||||
// Version described in paper is "wrong"
|
||||
// http://www.cs.toronto.edu/~jacobson/images/error-in-linear-subspace-design-for-real-time-shape-deformation-2017-wang-et-al.pdf
|
||||
SparseMatrix<double> N,Z,M;
|
||||
SparseMatrix<Scalar> N, Z, M;
|
||||
normal_derivative(V,T,N);
|
||||
{
|
||||
std::vector<Triplet<double> >ZIJV;
|
||||
std::vector<Triplet<Scalar>> ZIJV;
|
||||
for(int t =0;t<T.rows();t++)
|
||||
{
|
||||
for(int f =0;f<T.cols();f++)
|
||||
@@ -84,37 +88,37 @@ IGL_INLINE bool igl::biharmonic_coordinates(
|
||||
K = N+L;
|
||||
massmatrix(V,T,MASSMATRIX_TYPE_DEFAULT,M);
|
||||
// normalize
|
||||
M /= ((VectorXd)M.diagonal()).array().abs().maxCoeff();
|
||||
M /= ((Matrix<Scalar, Dynamic, 1>)M.diagonal()).array().abs().maxCoeff();
|
||||
Minv =
|
||||
((VectorXd)M.diagonal().array().inverse()).asDiagonal();
|
||||
((Matrix<Scalar, Dynamic, 1>)M.diagonal().array().inverse()).asDiagonal();
|
||||
#else
|
||||
Eigen::SparseMatrix<double> M;
|
||||
Eigen::MatrixXi E;
|
||||
Eigen::VectorXi EMAP;
|
||||
Eigen::SparseMatrix<Scalar> M;
|
||||
Eigen::Matrix<Integer, Dynamic, Dynamic> E;
|
||||
Eigen::Matrix<Integer, Dynamic, 1> EMAP;
|
||||
crouzeix_raviart_massmatrix(V,T,M,E,EMAP);
|
||||
crouzeix_raviart_cotmatrix(V,T,E,EMAP,L);
|
||||
// Ad #E by #V facet-vertex incidence matrix
|
||||
Eigen::SparseMatrix<double> Ad(E.rows(),V.rows());
|
||||
Eigen::SparseMatrix<Scalar> Ad(E.rows(),V.rows());
|
||||
{
|
||||
std::vector<Eigen::Triplet<double> > AIJV(E.size());
|
||||
std::vector<Eigen::Triplet<Scalar>> AIJV(E.size());
|
||||
for(int e = 0;e<E.rows();e++)
|
||||
{
|
||||
for(int c = 0;c<E.cols();c++)
|
||||
{
|
||||
AIJV[e+c*E.rows()] = Eigen::Triplet<double>(e,E(e,c),1);
|
||||
AIJV[e + c * E.rows()] = Eigen::Triplet<Scalar>(e, E(e, c), 1);
|
||||
}
|
||||
}
|
||||
Ad.setFromTriplets(AIJV.begin(),AIJV.end());
|
||||
}
|
||||
// Degrees
|
||||
Eigen::VectorXd De;
|
||||
Eigen::Matrix<Scalar, Dynamic, 1> De;
|
||||
sum(Ad,2,De);
|
||||
Eigen::DiagonalMatrix<double,Eigen::Dynamic> De_diag =
|
||||
Eigen::DiagonalMatrix<Scalar,Eigen::Dynamic> De_diag =
|
||||
De.array().inverse().matrix().asDiagonal();
|
||||
K = L*(De_diag*Ad);
|
||||
// normalize
|
||||
M /= ((VectorXd)M.diagonal()).array().abs().maxCoeff();
|
||||
Minv = ((VectorXd)M.diagonal().array().inverse()).asDiagonal();
|
||||
M /= ((Matrix<Scalar, Dynamic, 1>)M.diagonal()).array().abs().maxCoeff();
|
||||
Minv = ((Matrix<Scalar, Dynamic, 1>)M.diagonal().array().inverse()).asDiagonal();
|
||||
// kill boundary edges
|
||||
for(int f = 0;f<T.rows();f++)
|
||||
{
|
||||
@@ -159,9 +163,9 @@ IGL_INLINE bool igl::biharmonic_coordinates(
|
||||
}
|
||||
const size_t dim = T.cols()-1;
|
||||
// Might as well be dense... I think...
|
||||
MatrixXd J = MatrixXd::Zero(mp+mr,mp+r*(dim+1));
|
||||
VectorXi b(mp+mr);
|
||||
MatrixXd H(mp+r*(dim+1),dim);
|
||||
Matrix<Scalar, Dynamic, Dynamic> J = Matrix<Scalar, Dynamic, Dynamic>::Zero(mp+mr,mp+r*(dim+1));
|
||||
Matrix<Integer, Dynamic, 1> b(mp+mr);
|
||||
Matrix<Scalar, Dynamic, Dynamic> H(mp+r*(dim+1),dim);
|
||||
{
|
||||
int v = 0;
|
||||
int c = 0;
|
||||
@@ -194,10 +198,10 @@ IGL_INLINE bool igl::biharmonic_coordinates(
|
||||
// minimize ½ W' A W'
|
||||
// subject to W(b,:) = J
|
||||
return min_quad_with_fixed(
|
||||
A,VectorXd::Zero(A.rows()).eval(),b,J,SparseMatrix<double>(),VectorXd(),true,W);
|
||||
A,Matrix<Scalar, Dynamic, 1>::Zero(A.rows()).eval(),b,J,SparseMatrix<Scalar>(),Matrix<Scalar, Dynamic, 1>(),true,W);
|
||||
}
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
template bool igl::biharmonic_coordinates<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
template bool igl::biharmonic_coordinates<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, int, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
#endif
|
||||
|
||||
@@ -66,8 +66,8 @@ namespace igl
|
||||
typename SType,
|
||||
typename DerivedW>
|
||||
IGL_INLINE bool biharmonic_coordinates(
|
||||
const Eigen::PlainObjectBase<DerivedV> & V,
|
||||
const Eigen::PlainObjectBase<DerivedT> & T,
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedT> & T,
|
||||
const std::vector<std::vector<SType> > & S,
|
||||
Eigen::PlainObjectBase<DerivedW> & W);
|
||||
// k 2-->biharmonic, 3-->triharmonic
|
||||
@@ -77,8 +77,8 @@ namespace igl
|
||||
typename SType,
|
||||
typename DerivedW>
|
||||
IGL_INLINE bool biharmonic_coordinates(
|
||||
const Eigen::PlainObjectBase<DerivedV> & V,
|
||||
const Eigen::PlainObjectBase<DerivedT> & T,
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedT> & T,
|
||||
const std::vector<std::vector<SType> > & S,
|
||||
const int k,
|
||||
Eigen::PlainObjectBase<DerivedW> & W);
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
//
|
||||
// Copyright (C) 2017 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
|
||||
//
|
||||
// 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/.
|
||||
#include "bijective_composite_harmonic_mapping.h"
|
||||
|
||||
@@ -51,11 +51,11 @@ IGL_INLINE bool igl::bijective_composite_harmonic_mapping(
|
||||
assert(F.cols() == 3 && "F should contain triangles");
|
||||
int tries = 0;
|
||||
int nsteps = min_steps;
|
||||
Derivedbc bc0;
|
||||
Eigen::Matrix<typename Derivedbc::Scalar, Eigen::Dynamic, Eigen::Dynamic> bc0;
|
||||
slice(V,b,1,bc0);
|
||||
|
||||
// It's difficult to check for flips "robustly" in the sense that the input
|
||||
// mesh might not have positive/consistent sign to begin with.
|
||||
// mesh might not have positive/consistent sign to begin with.
|
||||
|
||||
while(nsteps<=max_steps)
|
||||
{
|
||||
@@ -71,7 +71,7 @@ IGL_INLINE bool igl::bijective_composite_harmonic_mapping(
|
||||
// of the boundary conditions. Something like "Homotopic Morphing of
|
||||
// Planar Curves" [Dym et al. 2015] but also handling multiple connected
|
||||
// components.
|
||||
Derivedbc bct = bc0 + t*(bc - bc0);
|
||||
Eigen::Matrix<typename Derivedbc::Scalar, Eigen::Dynamic, Eigen::Dynamic> bct = bc0 + t * (bc - bc0);
|
||||
// Compute dsicrete harmonic map using metric of previous step
|
||||
for(int iter = 0;iter<num_inner_iters;iter++)
|
||||
{
|
||||
@@ -82,7 +82,7 @@ IGL_INLINE bool igl::bijective_composite_harmonic_mapping(
|
||||
//mw.save_index(b,"b");
|
||||
//mw.save(bct,"bct");
|
||||
//mw.write("numerical.mat");
|
||||
harmonic(DerivedU(U),F,b,bct,1,U);
|
||||
harmonic(Eigen::Matrix<typename DerivedU::Scalar, Eigen::Dynamic, Eigen::Dynamic>(U), F, b, bct, 1, U);
|
||||
igl::slice(U,b,1,bct);
|
||||
nans = (U.array() != U.array()).count();
|
||||
if(test_for_flips)
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2020 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/.
|
||||
#include "blkdiag.h"
|
||||
|
||||
template <typename Scalar>
|
||||
IGL_INLINE void igl::blkdiag(
|
||||
const std::vector<Eigen::SparseMatrix<Scalar>> & L,
|
||||
Eigen::SparseMatrix<Scalar> & Y)
|
||||
{
|
||||
int nr = 0;
|
||||
int nc = 0;
|
||||
int nnz = 0;
|
||||
for(const auto & A : L)
|
||||
{
|
||||
nr += A.rows();
|
||||
nc += A.cols();
|
||||
}
|
||||
Y.resize(nr,nc);
|
||||
{
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
for(const auto & A : L)
|
||||
{
|
||||
for(int k = 0;k<A.outerSize();++k)
|
||||
{
|
||||
for(typename Eigen::SparseMatrix<Scalar>::InnerIterator it(A,k);it;++it)
|
||||
{
|
||||
Y.insert(i+it.row(),j+k) = it.value();
|
||||
}
|
||||
}
|
||||
i += A.rows();
|
||||
j += A.cols();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <typename DerivedY>
|
||||
IGL_INLINE void igl::blkdiag(
|
||||
const std::vector<DerivedY> & L,
|
||||
Eigen::PlainObjectBase<DerivedY> & Y)
|
||||
{
|
||||
int nr = 0;
|
||||
int nc = 0;
|
||||
for(const auto & A : L)
|
||||
{
|
||||
nr += A.rows();
|
||||
nc += A.cols();
|
||||
}
|
||||
Y.setZero(nr,nc);
|
||||
{
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
for(const auto & A : L)
|
||||
{
|
||||
Y.block(i,j,A.rows(),A.cols()) = A;
|
||||
i += A.rows();
|
||||
j += A.cols();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// explicit template instantiations
|
||||
template void igl::blkdiag<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::vector<Eigen::Matrix<double, -1, -1, 0, -1, -1>, std::allocator<Eigen::Matrix<double, -1, -1, 0, -1, -1> > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
template void igl::blkdiag<double>(std::vector<Eigen::SparseMatrix<double, 0, int>, std::allocator<Eigen::SparseMatrix<double, 0, int> > > const&, Eigen::SparseMatrix<double, 0, int>&);
|
||||
#endif
|
||||
@@ -0,0 +1,40 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2020 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_BLKDIAG_H
|
||||
#define IGL_BLKDIAG_H
|
||||
#include "igl_inline.h"
|
||||
#include <Eigen/Core>
|
||||
#include <Eigen/Sparse>
|
||||
#include <vector>
|
||||
|
||||
namespace igl
|
||||
{
|
||||
// Given a list of matrices place them along the diagonal as blocks of the
|
||||
// output matrix. Like matlab's blkdiag.
|
||||
//
|
||||
// Inputs:
|
||||
// L list of matrices {A,B, ...}
|
||||
// Outputs:
|
||||
// Y A.rows()+B.rows()+... by A.cols()+B.cols()+... block diagonal
|
||||
//
|
||||
// See also: cat, repdiag
|
||||
template <typename Scalar>
|
||||
IGL_INLINE void blkdiag(
|
||||
const std::vector<Eigen::SparseMatrix<Scalar>> & L,
|
||||
Eigen::SparseMatrix<Scalar> & Y);
|
||||
template <typename DerivedY>
|
||||
IGL_INLINE void blkdiag(
|
||||
const std::vector<DerivedY> & L,
|
||||
Eigen::PlainObjectBase<DerivedY> & Y);
|
||||
}
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
# include "blkdiag.cpp"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,372 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2020 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/.
|
||||
#include "blue_noise.h"
|
||||
#include "doublearea.h"
|
||||
#include "random_points_on_mesh.h"
|
||||
#include "slice.h"
|
||||
#include "sortrows.h"
|
||||
#include "PI.h"
|
||||
#include "get_seconds.h"
|
||||
#include <unordered_map>
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
namespace igl
|
||||
{
|
||||
// It is very important that we use 64bit keys to avoid out of bounds (easy to
|
||||
// get to happen with dense samplings (e.g., r = 0.0005*bbd)
|
||||
typedef int64_t BlueNoiseKeyType;
|
||||
}
|
||||
|
||||
// Helper functions
|
||||
namespace igl
|
||||
{
|
||||
// Should probably find and replace with less generic name
|
||||
//
|
||||
// Map 3D subscripts (x,y,z) to unique index (return value)
|
||||
//
|
||||
// Inputs:
|
||||
// w side length of w×w×w integer cube lattice
|
||||
// x subscript along x direction
|
||||
// y subscript along y direction
|
||||
// z subscript along z direction
|
||||
// Returns index value
|
||||
//
|
||||
inline BlueNoiseKeyType blue_noise_key(
|
||||
const BlueNoiseKeyType w, // pass by copy --> int64_t so that multiplication is OK
|
||||
const BlueNoiseKeyType x, // pass by copy --> int64_t so that multiplication is OK
|
||||
const BlueNoiseKeyType y, // pass by copy --> int64_t so that multiplication is OK
|
||||
const BlueNoiseKeyType z) // pass by copy --> int64_t so that multiplication is OK
|
||||
{
|
||||
return x+w*(y+w*z);
|
||||
}
|
||||
// Determine if a query candidate at position X.row(i) is too close to already
|
||||
// selected sites (stored in S).
|
||||
//
|
||||
// Inputs:
|
||||
// X #X by 3 list of raw candidate positions
|
||||
// Xs #Xs by 3 list of corresponding integer cell subscripts
|
||||
// i index of candidate in question
|
||||
// S map from cell index to index into X of selected candidate (or -1 if
|
||||
// cell is currently empty)
|
||||
// rr Poisson disk radius squared
|
||||
// w side length of w×w×w integer cube lattice (into which Xs subscripts)
|
||||
template <
|
||||
typename DerivedX,
|
||||
typename DerivedXs>
|
||||
inline bool blue_noise_far_enough(
|
||||
const Eigen::MatrixBase<DerivedX> & X,
|
||||
const Eigen::MatrixBase<DerivedXs> & Xs,
|
||||
const std::unordered_map<BlueNoiseKeyType,int> & S,
|
||||
const double & rr,
|
||||
const int & w,
|
||||
const int i)
|
||||
{
|
||||
const int xi = Xs(i,0);
|
||||
const int yi = Xs(i,1);
|
||||
const int zi = Xs(i,2);
|
||||
BlueNoiseKeyType k = blue_noise_key(w,xi,yi,zi);
|
||||
int g = 2; // ceil(r/s)
|
||||
for(int x = std::max(xi-g,0);x<=std::min(xi+g,w-1);x++)
|
||||
for(int y = std::max(yi-g,0);y<=std::min(yi+g,w-1);y++)
|
||||
for(int z = std::max(zi-g,0);z<=std::min(zi+g,w-1);z++)
|
||||
{
|
||||
if(x!=xi || y!=yi || z!=zi)
|
||||
{
|
||||
const BlueNoiseKeyType nk = blue_noise_key(w,x,y,z);
|
||||
// have already selected from this cell
|
||||
const auto Siter = S.find(nk);
|
||||
if(Siter !=S.end() && Siter->second >= 0)
|
||||
{
|
||||
const int ni = Siter->second;
|
||||
// too close
|
||||
if( (X.row(i)-X.row(ni)).squaredNorm() < rr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
// Try to activate a candidate in a given cell
|
||||
//
|
||||
// Inputs:
|
||||
// X #X by 3 list of raw candidate positions
|
||||
// Xs #Xs by 3 list of corresponding integer cell subscripts
|
||||
// rr Poisson disk radius squared
|
||||
// w side length of w×w×w integer cube lattice (into which Xs subscripts)
|
||||
// nk index of cell in which we'd like to activate a candidate
|
||||
// M map from cell index to list of candidates
|
||||
// S map from cell index to index into X of selected candidate (or -1 if
|
||||
// cell is currently empty)
|
||||
// active list of indices into X of active candidates
|
||||
// Outputs:
|
||||
// M visited candidates deemed too close to already selected points are
|
||||
// removed
|
||||
// S updated to reflect activated point (if successful)
|
||||
// active updated to reflect activated point (if successful)
|
||||
// Returns true iff activation was successful
|
||||
template <
|
||||
typename DerivedX,
|
||||
typename DerivedXs>
|
||||
inline bool activate(
|
||||
const Eigen::MatrixBase<DerivedX> & X,
|
||||
const Eigen::MatrixBase<DerivedXs> & Xs,
|
||||
const double & rr,
|
||||
const int & i,
|
||||
const int & w,
|
||||
const BlueNoiseKeyType & nk,
|
||||
std::unordered_map<BlueNoiseKeyType,std::vector<int> > & M,
|
||||
std::unordered_map<BlueNoiseKeyType,int> & S,
|
||||
std::vector<int> & active)
|
||||
{
|
||||
assert(M.count(nk));
|
||||
auto & Mvec = M.find(nk)->second;
|
||||
auto miter = Mvec.begin();
|
||||
while(miter != Mvec.end())
|
||||
{
|
||||
const int mi = *miter;
|
||||
// mi is our candidate sample. Is it far enough from all existing
|
||||
// samples?
|
||||
if(i>=0 && (X.row(i)-X.row(mi)).squaredNorm() > 4.*rr)
|
||||
{
|
||||
// too far skip (reject)
|
||||
miter++;
|
||||
} else if(blue_noise_far_enough(X,Xs,S,rr,w,mi))
|
||||
{
|
||||
active.push_back(mi);
|
||||
S.find(nk)->second = mi;
|
||||
//printf(" found %d\n",mi);
|
||||
return true;
|
||||
}else
|
||||
{
|
||||
// remove forever (instead of incrementing we swap and eat from the
|
||||
// back)
|
||||
//std::swap(*miter,Mvec.back());
|
||||
*miter = Mvec.back();
|
||||
bool was_last = (std::next(miter) == Mvec.end());
|
||||
Mvec.pop_back();
|
||||
if (was_last) {
|
||||
// popping from the vector can invalidate the iterator, if it was
|
||||
// pointing to the last element that was popped. Alternatively,
|
||||
// one could use indices directly...
|
||||
miter = Mvec.end();
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
template <
|
||||
typename DerivedX,
|
||||
typename DerivedXs>
|
||||
inline bool step(
|
||||
const Eigen::MatrixBase<DerivedX> & X,
|
||||
const Eigen::MatrixBase<DerivedXs> & Xs,
|
||||
const double & rr,
|
||||
const int & w,
|
||||
std::unordered_map<BlueNoiseKeyType,std::vector<int> > & M,
|
||||
std::unordered_map<BlueNoiseKeyType,int> & S,
|
||||
std::vector<int> & active,
|
||||
std::vector<int> & collected
|
||||
)
|
||||
{
|
||||
//considered.clear();
|
||||
if(active.size() == 0) return false;
|
||||
// random entry
|
||||
const int e = rand() % active.size();
|
||||
const int i = active[e];
|
||||
//printf("%d\n",i);
|
||||
const int xi = Xs(i,0);
|
||||
const int yi = Xs(i,1);
|
||||
const int zi = Xs(i,2);
|
||||
//printf("%d %d %d - %g %g %g\n",xi,yi,zi,X(i,0),X(i,1),X(i,2));
|
||||
// cell indices of neighbors
|
||||
int g = 4;
|
||||
std::vector<BlueNoiseKeyType> N;N.reserve((1+g*1)^3-1);
|
||||
for(int x = std::max(xi-g,0);x<=std::min(xi+g,w-1);x++)
|
||||
for(int y = std::max(yi-g,0);y<=std::min(yi+g,w-1);y++)
|
||||
for(int z = std::max(zi-g,0);z<=std::min(zi+g,w-1);z++)
|
||||
{
|
||||
if(x!=xi || y!=yi || z!=zi)
|
||||
{
|
||||
//printf(" %d %d %d\n",x,y,z);
|
||||
const BlueNoiseKeyType nk = blue_noise_key(w,x,y,z);
|
||||
// haven't yet selected from this cell?
|
||||
const auto Siter = S.find(nk);
|
||||
if(Siter !=S.end() && Siter->second < 0)
|
||||
{
|
||||
assert(M.find(nk) != M.end());
|
||||
N.emplace_back(nk);
|
||||
}
|
||||
}
|
||||
}
|
||||
//printf(" --------\n");
|
||||
// randomize order: this might be a little paranoid...
|
||||
std::random_shuffle(std::begin(N), std::end(N));
|
||||
bool found = false;
|
||||
for(const BlueNoiseKeyType & nk : N)
|
||||
{
|
||||
assert(M.find(nk) != M.end());
|
||||
if(activate(X,Xs,rr,i,w,nk,M,S,active))
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!found)
|
||||
{
|
||||
// remove i from active list
|
||||
// https://stackoverflow.com/a/60765833/148668
|
||||
collected.push_back(i);
|
||||
//printf(" before: "); for(const int j : active) { printf("%d ",j); } printf("\n");
|
||||
std::swap(active[e], active.back());
|
||||
//printf(" after : "); for(const int j : active) { printf("%d ",j); } printf("\n");
|
||||
active.pop_back();
|
||||
//printf(" removed %d\n",i);
|
||||
}
|
||||
//printf(" active: "); for(const int j : active) { printf("%d ",j); } printf("\n");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
template <
|
||||
typename DerivedV,
|
||||
typename DerivedF,
|
||||
typename DerivedB,
|
||||
typename DerivedFI,
|
||||
typename DerivedP>
|
||||
IGL_INLINE void igl::blue_noise(
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
const typename DerivedV::Scalar r,
|
||||
Eigen::PlainObjectBase<DerivedB> & B,
|
||||
Eigen::PlainObjectBase<DerivedFI> & FI,
|
||||
Eigen::PlainObjectBase<DerivedP> & P)
|
||||
{
|
||||
typedef typename DerivedV::Scalar Scalar;
|
||||
typedef Eigen::Matrix<Scalar,Eigen::Dynamic,1> VectorXS;
|
||||
// float+RowMajor is faster...
|
||||
typedef Eigen::Matrix<Scalar,Eigen::Dynamic,3,Eigen::RowMajor> MatrixX3S;
|
||||
assert(V.cols() == 3 && "Only 3D embeddings allowed");
|
||||
// minimum radius
|
||||
const Scalar min_r = r;
|
||||
// cell size based on 3D distance
|
||||
// It works reasonably well (but is probably biased to use s=2*r/√3 here and
|
||||
// g=1 in the outer loop below.
|
||||
//
|
||||
// One thing to try would be to store a list in S (rather than a single point)
|
||||
// or equivalently a mask over M and just use M as a generic spatial hash
|
||||
// (with arbitrary size) and then tune its size (being careful to make g a
|
||||
// function of r and s; and removing the `if S=-1 checks`)
|
||||
const Scalar s = r/sqrt(3.0);
|
||||
|
||||
const double area =
|
||||
[&](){Eigen::VectorXd A;igl::doublearea(V,F,A);return A.array().sum()/2;}();
|
||||
// Circle packing in the plane has igl::PI*sqrt(3)/6 efficiency
|
||||
const double expected_number_of_points =
|
||||
area * (igl::PI * sqrt(3.0) / 6.0) / (igl::PI * min_r * min_r / 4.0);
|
||||
|
||||
// Make a uniform random sampling with 30*expected_number_of_points.
|
||||
const int nx = 30.0*expected_number_of_points;
|
||||
MatrixX3S X,XB;
|
||||
Eigen::VectorXi XFI;
|
||||
igl::random_points_on_mesh(nx,V,F,XB,XFI,X);
|
||||
|
||||
// Rescale so that s = 1
|
||||
Eigen::Matrix<int,Eigen::Dynamic,3,Eigen::RowMajor> Xs =
|
||||
((X.rowwise()-X.colwise().minCoeff())/s).template cast<int>();
|
||||
const int w = Xs.maxCoeff()+1;
|
||||
{
|
||||
Eigen::VectorXi I;
|
||||
igl::sortrows(decltype(Xs)(Xs),true,Xs,I);
|
||||
igl::slice(decltype(X)(X),I,1,X);
|
||||
// These two could be spun off in their own thread.
|
||||
igl::slice(decltype(XB)(XB),I,1,XB);
|
||||
igl::slice(decltype(XFI)(XFI),I,1,XFI);
|
||||
}
|
||||
// Initialization
|
||||
std::unordered_map<BlueNoiseKeyType,std::vector<int> > M;
|
||||
std::unordered_map<BlueNoiseKeyType, int > S;
|
||||
// attempted to seed
|
||||
std::unordered_map<BlueNoiseKeyType, int > A;
|
||||
// Q: Too many?
|
||||
// A: Seems to help though.
|
||||
M.reserve(Xs.rows());
|
||||
S.reserve(Xs.rows());
|
||||
for(int i = 0;i<Xs.rows();i++)
|
||||
{
|
||||
BlueNoiseKeyType k = blue_noise_key(w,Xs(i,0),Xs(i,1),Xs(i,2));
|
||||
const auto Miter = M.find(k);
|
||||
if(Miter == M.end())
|
||||
{
|
||||
M.insert({k,{i}});
|
||||
}else
|
||||
{
|
||||
Miter->second.push_back(i);
|
||||
}
|
||||
S.emplace(k,-1);
|
||||
A.emplace(k,false);
|
||||
}
|
||||
|
||||
std::vector<int> active;
|
||||
// precompute r²
|
||||
// Q: is this necessary?
|
||||
const double rr = r*r;
|
||||
std::vector<int> collected;
|
||||
collected.reserve(2.0*expected_number_of_points);
|
||||
|
||||
auto Mouter = M.begin();
|
||||
// Just take the first point as the initial seed
|
||||
const auto initialize = [&]()->bool
|
||||
{
|
||||
while(true)
|
||||
{
|
||||
if(Mouter == M.end())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
const BlueNoiseKeyType k = Mouter->first;
|
||||
// Haven't placed in this cell yet
|
||||
if(S[k]<0)
|
||||
{
|
||||
if(activate(X,Xs,rr,-1,w,k,M,S,active)) return true;
|
||||
}
|
||||
Mouter++;
|
||||
}
|
||||
assert(false && "should not be reachable.");
|
||||
};
|
||||
|
||||
// important if mesh contains many connected components
|
||||
while(initialize())
|
||||
{
|
||||
while(active.size()>0)
|
||||
{
|
||||
step(X,Xs,rr,w,M,S,active,collected);
|
||||
}
|
||||
}
|
||||
{
|
||||
const int n = collected.size();
|
||||
P.resize(n,3);
|
||||
B.resize(n,3);
|
||||
FI.resize(n);
|
||||
for(int i = 0;i<n;i++)
|
||||
{
|
||||
const int c = collected[i];
|
||||
P.row(i) = X.row(c).template cast<typename DerivedP::Scalar>();
|
||||
B.row(i) = XB.row(c).template cast<typename DerivedB::Scalar>();
|
||||
FI(i) = XFI(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
template void igl::blue_noise<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<float, -1, 3, 1, -1, 3>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
template void igl::blue_noise<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
||||
#endif
|
||||
@@ -0,0 +1,49 @@
|
||||
// This file is part of libigl, a simple c++ geometry processing library.
|
||||
//
|
||||
// Copyright (C) 2020 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_BLUE_NOISE_H
|
||||
#define IGL_BLUE_NOISE_H
|
||||
#include "igl_inline.h"
|
||||
#include <Eigen/Core>
|
||||
namespace igl
|
||||
{
|
||||
// "Fast Poisson Disk Sampling in Arbitrary Dimensions" [Bridson 2007]
|
||||
//
|
||||
// For very dense samplings this is faster than (up to 2x) cyCodeBase's
|
||||
// implementation of "Sample Elimination for Generating Poisson Disk Sample
|
||||
// Sets" [Yuksel 2015]. YMMV
|
||||
//
|
||||
// Inputs:
|
||||
// V #V by dim list of mesh vertex positions
|
||||
// F #F by 3 list of mesh triangle indices into rows of V
|
||||
// r Poisson disk radius (evaluated according to Euclidean distance on V)
|
||||
// Outputs:
|
||||
// B #P by 3 list of barycentric coordinates, ith row are coordinates of
|
||||
// ith sampled point in face FI(i)
|
||||
// FI #P list of indices into F
|
||||
// P #P by dim list of sample positions.
|
||||
// See also: random_points_on_mesh
|
||||
template <
|
||||
typename DerivedV,
|
||||
typename DerivedF,
|
||||
typename DerivedB,
|
||||
typename DerivedFI,
|
||||
typename DerivedP>
|
||||
IGL_INLINE void blue_noise(
|
||||
const Eigen::MatrixBase<DerivedV> & V,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
const typename DerivedV::Scalar r,
|
||||
Eigen::PlainObjectBase<DerivedB> & B,
|
||||
Eigen::PlainObjectBase<DerivedFI> & FI,
|
||||
Eigen::PlainObjectBase<DerivedP> & P);
|
||||
}
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
# include "blue_noise.cpp"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
template <typename DerivedBE, typename DerivedP>
|
||||
IGL_INLINE void igl::bone_parents(
|
||||
const Eigen::PlainObjectBase<DerivedBE>& BE,
|
||||
const Eigen::MatrixBase<DerivedBE>& BE,
|
||||
Eigen::PlainObjectBase<DerivedP>& P)
|
||||
{
|
||||
P.resize(BE.rows(),1);
|
||||
@@ -28,5 +28,5 @@ IGL_INLINE void igl::bone_parents(
|
||||
}
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
template void igl::bone_parents<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::bone_parents<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
|
||||
#endif
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace igl
|
||||
//
|
||||
template <typename DerivedBE, typename DerivedP>
|
||||
IGL_INLINE void bone_parents(
|
||||
const Eigen::PlainObjectBase<DerivedBE>& BE,
|
||||
const Eigen::MatrixBase<DerivedBE>& BE,
|
||||
Eigen::PlainObjectBase<DerivedP>& P);
|
||||
}
|
||||
|
||||
|
||||
+118
-37
@@ -7,19 +7,127 @@
|
||||
// obtain one at http://mozilla.org/MPL/2.0/.
|
||||
#include "boundary_facets.h"
|
||||
#include "face_occurrences.h"
|
||||
|
||||
// IGL includes
|
||||
#include "list_to_matrix.h"
|
||||
#include "matrix_to_list.h"
|
||||
#include "sort.h"
|
||||
#include "unique_rows.h"
|
||||
#include "accumarray.h"
|
||||
#include "slice_mask.h"
|
||||
|
||||
#include <Eigen/Core>
|
||||
|
||||
// STL includes
|
||||
#include <map>
|
||||
#include <iostream>
|
||||
|
||||
template <
|
||||
typename DerivedT,
|
||||
typename DerivedF,
|
||||
typename DerivedJ,
|
||||
typename DerivedK>
|
||||
IGL_INLINE void igl::boundary_facets(
|
||||
const Eigen::MatrixBase<DerivedT>& T,
|
||||
Eigen::PlainObjectBase<DerivedF>& F,
|
||||
Eigen::PlainObjectBase<DerivedJ>& J,
|
||||
Eigen::PlainObjectBase<DerivedK>& K)
|
||||
{
|
||||
const int simplex_size = T.cols();
|
||||
// Handle boring base case
|
||||
if(T.rows() == 0)
|
||||
{
|
||||
F.resize(0,simplex_size-1);
|
||||
J.resize(0,1);
|
||||
K.resize(0,1);
|
||||
return;
|
||||
}
|
||||
// Get a list of all facets
|
||||
DerivedF allF(T.rows()*simplex_size,simplex_size-1);
|
||||
// Gather faces (e.g., loop over tets)
|
||||
for(int i = 0; i< (int)T.rows();i++)
|
||||
{
|
||||
switch(simplex_size)
|
||||
{
|
||||
case 4:
|
||||
// get face in correct order
|
||||
allF(i*simplex_size+0,0) = T(i,1);
|
||||
allF(i*simplex_size+0,1) = T(i,3);
|
||||
allF(i*simplex_size+0,2) = T(i,2);
|
||||
// get face in correct order
|
||||
allF(i*simplex_size+1,0) = T(i,0);
|
||||
allF(i*simplex_size+1,1) = T(i,2);
|
||||
allF(i*simplex_size+1,2) = T(i,3);
|
||||
// get face in correct order
|
||||
allF(i*simplex_size+2,0) = T(i,0);
|
||||
allF(i*simplex_size+2,1) = T(i,3);
|
||||
allF(i*simplex_size+2,2) = T(i,1);
|
||||
// get face in correct order
|
||||
allF(i*simplex_size+3,0) = T(i,0);
|
||||
allF(i*simplex_size+3,1) = T(i,1);
|
||||
allF(i*simplex_size+3,2) = T(i,2);
|
||||
break;
|
||||
case 3:
|
||||
allF(i*simplex_size+0,0) = T(i,1);
|
||||
allF(i*simplex_size+0,1) = T(i,2);
|
||||
allF(i*simplex_size+1,0) = T(i,2);
|
||||
allF(i*simplex_size+1,1) = T(i,0);
|
||||
allF(i*simplex_size+2,0) = T(i,0);
|
||||
allF(i*simplex_size+2,1) = T(i,1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DerivedF sortedF;
|
||||
igl::sort(allF,2,true,sortedF);
|
||||
Eigen::VectorXi m,n;
|
||||
{
|
||||
DerivedF _1;
|
||||
igl::unique_rows(sortedF,_1,m,n);
|
||||
}
|
||||
Eigen::VectorXi C;
|
||||
igl::accumarray(n,1,C);
|
||||
const int ones = (C.array()==1).count();
|
||||
// Resize output to fit number of non-twos
|
||||
F.resize(ones, allF.cols());
|
||||
J.resize(F.rows(),1);
|
||||
K.resize(F.rows(),1);
|
||||
int k = 0;
|
||||
for(int c = 0;c< (int)C.size();c++)
|
||||
{
|
||||
if(C(c) == 1)
|
||||
{
|
||||
const int i = m(c);
|
||||
assert(k<(int)F.rows());
|
||||
F.row(k) = allF.row(i);
|
||||
J(k) = i/simplex_size;
|
||||
K(k) = i%simplex_size;
|
||||
k++;
|
||||
}
|
||||
}
|
||||
assert(k==(int)F.rows());
|
||||
}
|
||||
|
||||
template <typename DerivedT, typename DerivedF>
|
||||
IGL_INLINE void igl::boundary_facets(
|
||||
const Eigen::MatrixBase<DerivedT>& T,
|
||||
Eigen::PlainObjectBase<DerivedF>& F)
|
||||
{
|
||||
Eigen::VectorXi J,K;
|
||||
return boundary_facets(T,F,J,K);
|
||||
}
|
||||
|
||||
template <typename DerivedT, typename Ret>
|
||||
Ret igl::boundary_facets(
|
||||
const Eigen::MatrixBase<DerivedT>& T)
|
||||
{
|
||||
Ret F;
|
||||
igl::boundary_facets(T,F);
|
||||
return F;
|
||||
}
|
||||
|
||||
template <typename IntegerT, typename IntegerF>
|
||||
IGL_INLINE void igl::boundary_facets(
|
||||
const std::vector<std::vector<IntegerT> > & T,
|
||||
std::vector<std::vector<IntegerF> > & F)
|
||||
{
|
||||
// Kept for legacy reasons. Could probably just delete.
|
||||
using namespace std;
|
||||
|
||||
if(T.size() == 0)
|
||||
@@ -98,44 +206,17 @@ IGL_INLINE void igl::boundary_facets(
|
||||
|
||||
}
|
||||
|
||||
#include "list_to_matrix.h"
|
||||
#include "matrix_to_list.h"
|
||||
|
||||
template <typename DerivedT, typename DerivedF>
|
||||
IGL_INLINE void igl::boundary_facets(
|
||||
const Eigen::PlainObjectBase<DerivedT>& T,
|
||||
Eigen::PlainObjectBase<DerivedF>& F)
|
||||
{
|
||||
assert(T.cols() == 0 || T.cols() == 4 || T.cols() == 3);
|
||||
using namespace std;
|
||||
using namespace Eigen;
|
||||
// Cop out: use vector of vectors version
|
||||
vector<vector<typename DerivedT::Scalar> > vT;
|
||||
matrix_to_list(T,vT);
|
||||
vector<vector<typename DerivedF::Scalar> > vF;
|
||||
boundary_facets(vT,vF);
|
||||
list_to_matrix(vF,F);
|
||||
}
|
||||
|
||||
template <typename DerivedT, typename Ret>
|
||||
Ret igl::boundary_facets(
|
||||
const Eigen::PlainObjectBase<DerivedT>& T)
|
||||
{
|
||||
Ret F;
|
||||
igl::boundary_facets(T,F);
|
||||
return F;
|
||||
}
|
||||
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >&);
|
||||
template void igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);
|
||||
template void igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
|
||||
template void igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<unsigned int, -1, 3, 1, -1, 3> >&);
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);
|
||||
template void igl::boundary_facets<int, int>(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);
|
||||
//template Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > igl::boundary_facets(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);
|
||||
template Eigen::Matrix<int, -1, -1, 0, -1, -1> igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);
|
||||
template void igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&);
|
||||
//template Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > igl::boundary_facets(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);
|
||||
template Eigen::Matrix<int, -1, -1, 0, -1, -1> igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);
|
||||
template void igl::boundary_facets<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&);
|
||||
#endif
|
||||
|
||||
@@ -18,31 +18,36 @@ namespace igl
|
||||
// BOUNDARY_FACETS Determine boundary faces (edges) of tetrahedra (triangles)
|
||||
// stored in T (analogous to qptoolbox's `outline` and `boundary_faces`).
|
||||
//
|
||||
// Templates:
|
||||
// IntegerT integer-value: e.g. int
|
||||
// IntegerF integer-value: e.g. int
|
||||
// Input:
|
||||
// T tetrahedron (triangle) index list, m by 4 (3), where m is the number of tetrahedra
|
||||
// Output:
|
||||
// F list of boundary faces, n by 3 (2), where n is the number of boundary faces
|
||||
// J list of indices into T, n by 1
|
||||
// K list of indices revealing across from which vertex is this facet
|
||||
//
|
||||
//
|
||||
template <typename IntegerT, typename IntegerF>
|
||||
template <
|
||||
typename DerivedT,
|
||||
typename DerivedF,
|
||||
typename DerivedJ,
|
||||
typename DerivedK>
|
||||
IGL_INLINE void boundary_facets(
|
||||
const std::vector<std::vector<IntegerT> > & T,
|
||||
std::vector<std::vector<IntegerF> > & F);
|
||||
|
||||
// Templates:
|
||||
// DerivedT integer-value: i.e. from MatrixXi
|
||||
// DerivedF integer-value: i.e. from MatrixXi
|
||||
const Eigen::MatrixBase<DerivedT>& T,
|
||||
Eigen::PlainObjectBase<DerivedF>& F,
|
||||
Eigen::PlainObjectBase<DerivedJ>& J,
|
||||
Eigen::PlainObjectBase<DerivedK>& K);
|
||||
template <typename DerivedT, typename DerivedF>
|
||||
IGL_INLINE void boundary_facets(
|
||||
const Eigen::PlainObjectBase<DerivedT>& T,
|
||||
const Eigen::MatrixBase<DerivedT>& T,
|
||||
Eigen::PlainObjectBase<DerivedF>& F);
|
||||
// Same as above but returns F
|
||||
template <typename DerivedT, typename Ret>
|
||||
Ret boundary_facets(
|
||||
const Eigen::PlainObjectBase<DerivedT>& T);
|
||||
const Eigen::MatrixBase<DerivedT>& T);
|
||||
template <typename IntegerT, typename IntegerF>
|
||||
IGL_INLINE void boundary_facets(
|
||||
const std::vector<std::vector<IntegerT> > & T,
|
||||
std::vector<std::vector<IntegerF> > & F);
|
||||
}
|
||||
|
||||
#ifndef IGL_STATIC_LIBRARY
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
template <typename DerivedF, typename Index>
|
||||
IGL_INLINE void igl::boundary_loop(
|
||||
const Eigen::PlainObjectBase<DerivedF> & F,
|
||||
const Eigen::MatrixBase<DerivedF> & F,
|
||||
std::vector<std::vector<Index> >& L)
|
||||
{
|
||||
using namespace std;
|
||||
@@ -24,12 +24,12 @@ IGL_INLINE void igl::boundary_loop(
|
||||
return;
|
||||
|
||||
VectorXd Vdummy(F.maxCoeff()+1,1);
|
||||
DerivedF TT,TTi;
|
||||
Eigen::Matrix<typename DerivedF::Scalar, Eigen::Dynamic, Eigen::Dynamic> TT,TTi;
|
||||
vector<std::vector<int> > VF, VFi;
|
||||
triangle_triangle_adjacency(F,TT,TTi);
|
||||
vertex_triangle_adjacency(Vdummy,F,VF,VFi);
|
||||
|
||||
vector<bool> unvisited = is_border_vertex(Vdummy,F);
|
||||
vector<bool> unvisited = is_border_vertex(F);
|
||||
set<int> unseen;
|
||||
for (size_t i = 0; i < unvisited.size(); ++i)
|
||||
{
|
||||
@@ -91,7 +91,7 @@ IGL_INLINE void igl::boundary_loop(
|
||||
|
||||
template <typename DerivedF, typename Index>
|
||||
IGL_INLINE void igl::boundary_loop(
|
||||
const Eigen::PlainObjectBase<DerivedF>& F,
|
||||
const Eigen::MatrixBase<DerivedF>& F,
|
||||
std::vector<Index>& L)
|
||||
{
|
||||
using namespace Eigen;
|
||||
@@ -130,7 +130,7 @@ IGL_INLINE void igl::boundary_loop(
|
||||
|
||||
template <typename DerivedF, typename DerivedL>
|
||||
IGL_INLINE void igl::boundary_loop(
|
||||
const Eigen::PlainObjectBase<DerivedF>& F,
|
||||
const Eigen::MatrixBase<DerivedF>& F,
|
||||
Eigen::PlainObjectBase<DerivedL>& L)
|
||||
{
|
||||
using namespace Eigen;
|
||||
@@ -142,12 +142,13 @@ IGL_INLINE void igl::boundary_loop(
|
||||
vector<int> Lvec;
|
||||
boundary_loop(F,Lvec);
|
||||
|
||||
L.resize(Lvec.size());
|
||||
L.resize(Lvec.size(), 1);
|
||||
for (size_t i = 0; i < Lvec.size(); ++i)
|
||||
L(i) = Lvec[i];
|
||||
}
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
template void igl::boundary_loop<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::boundary_loop<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::boundary_loop<Eigen::Matrix<int, -1, -1, 0, -1, -1>, int>(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&);
|
||||
#endif
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace igl
|
||||
//
|
||||
template <typename DerivedF, typename Index>
|
||||
IGL_INLINE void boundary_loop(
|
||||
const Eigen::PlainObjectBase<DerivedF>& F,
|
||||
const Eigen::MatrixBase<DerivedF>& F,
|
||||
std::vector<std::vector<Index> >& L);
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace igl
|
||||
//
|
||||
template <typename DerivedF, typename Index>
|
||||
IGL_INLINE void boundary_loop(
|
||||
const Eigen::PlainObjectBase<DerivedF>& F,
|
||||
const Eigen::MatrixBase<DerivedF>& F,
|
||||
std::vector<Index>& L);
|
||||
|
||||
// Compute ordered boundary loops for a manifold mesh and return the
|
||||
@@ -56,7 +56,7 @@ namespace igl
|
||||
//
|
||||
template <typename DerivedF, typename DerivedL>
|
||||
IGL_INLINE void boundary_loop(
|
||||
const Eigen::PlainObjectBase<DerivedF>& F,
|
||||
const Eigen::MatrixBase<DerivedF>& F,
|
||||
Eigen::PlainObjectBase<DerivedL>& L);
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user